ZGlmZiAtLWdpdCBhL21hdmVuMi1hcmNoZXR5cGVzL0xJQ0VOU0UudHh0IGIvTElDRU5TRS50eHQKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1hdmVuMi1hcmNoZXR5cGVzL0xJQ0VOU0UudHh0CnJlbmFtZSB0byBMSUNFTlNFLnR4dApkaWZmIC0tZ2l0IGEvbWF2ZW4yLWFyY2hldHlwZXMvTk9USUNFLnR4dCBiL05PVElDRS50eHQKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1hdmVuMi1hcmNoZXR5cGVzL05PVElDRS50eHQKcmVuYW1lIHRvIE5PVElDRS50eHQKZGlmZiAtLWdpdCBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWNvZGktanNmMTIvcG9tLnhtbCBiL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWNvZGktanNmMTIvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTEwMjgyMy4uMDAwMDAwMAotLS0gYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1jb2RpLWpzZjEyL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICAgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gICAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICAgIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICAgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gICAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gICAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gICAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICAgIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLQotICAgIDxwYXJlbnQ+Ci0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzPC9ncm91cElkPgotICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWFyY2hldHlwZS1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDx2ZXJzaW9uPjEuMC40LVNOQVBTSE9UPC92ZXJzaW9uPgotICAgIDwvcGFyZW50PgotCi0gICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzPC9ncm91cElkPgotICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtYXJjaGV0eXBlLWNvZGktanNmMTI8L2FydGlmYWN0SWQ+Ci0gICAgPHBhY2thZ2luZz5qYXI8L3BhY2thZ2luZz4KLSAgICA8bmFtZT5NeUZhY2VzIENPREkgQXJjaGV0eXBlIGZvciBKU0YgMS4yPC9uYW1lPgotICAgIDxkZXNjcmlwdGlvbj5BcmNoZXR5cGUgdG8gY3JlYXRlIGEgbmV3IEpTRiAxLjIgd2ViYXBwIGJhc2VkIG9uIE15RmFjZXMgQ09ESTwvZGVzY3JpcHRpb24+Ci0KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWNvZGktanNmMTIvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL0xJQ0VOU0UudHh0IGIvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtY29kaS1qc2YxMi9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvTElDRU5TRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2NDU2OTUuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtY29kaS1qc2YxMi9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvTElDRU5TRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwyMDIgKzAsMCBAQAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNAotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLwotCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04KLQotICAgMS4gRGVmaW5pdGlvbnMuCi0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4KLQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4KLQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbgotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwKLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3IKLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KLQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KLQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLgotCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dAotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLAotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgotCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcgotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLgotCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0Ci0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3NlcwotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLgotCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZwotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucwotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5Ci0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIgotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0Ci0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCi0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLgotCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4KLQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywKLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcgotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcwotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCi0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91Ci0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3IKLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZAotCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kCi0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3JrcwotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQKLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YKLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kCi0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cwotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QKLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QKLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUKLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3IKLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwKLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZAotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUKLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQKLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuCi0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucwotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcgotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgKLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuCi0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwKLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yawotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLgotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4KLQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLAotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KLQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEEKLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55Ci0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuCi0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLAotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwKLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KLQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZwotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwKLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcwotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkKLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkKLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgotCi0gICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKLQotICAgQVBQRU5ESVg6IEhvdyB0byBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLgotCi0gICAgICBUbyBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLCBhdHRhY2ggdGhlIGZvbGxvd2luZwotICAgICAgYm9pbGVycGxhdGUgbm90aWNlLCB3aXRoIHRoZSBmaWVsZHMgZW5jbG9zZWQgYnkgYnJhY2tldHMgIltdIgotICAgICAgcmVwbGFjZWQgd2l0aCB5b3VyIG93biBpZGVudGlmeWluZyBpbmZvcm1hdGlvbi4gKERvbid0IGluY2x1ZGUKLSAgICAgIHRoZSBicmFja2V0cyEpICBUaGUgdGV4dCBzaG91bGQgYmUgZW5jbG9zZWQgaW4gdGhlIGFwcHJvcHJpYXRlCi0gICAgICBjb21tZW50IHN5bnRheCBmb3IgdGhlIGZpbGUgZm9ybWF0LiBXZSBhbHNvIHJlY29tbWVuZCB0aGF0IGEKLSAgICAgIGZpbGUgb3IgY2xhc3MgbmFtZSBhbmQgZGVzY3JpcHRpb24gb2YgcHVycG9zZSBiZSBpbmNsdWRlZCBvbiB0aGUKLSAgICAgIHNhbWUgInByaW50ZWQgcGFnZSIgYXMgdGhlIGNvcHlyaWdodCBub3RpY2UgZm9yIGVhc2llcgotICAgICAgaWRlbnRpZmljYXRpb24gd2l0aGluIHRoaXJkLXBhcnR5IGFyY2hpdmVzLgotCi0gICBDb3B5cmlnaHQgW3l5eXldIFtuYW1lIG9mIGNvcHlyaWdodCBvd25lcl0KLQotICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KZGlmZiAtLWdpdCBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWNvZGktanNmMTIvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL05PVElDRS50eHQgYi9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1jb2RpLWpzZjEyL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9OT1RJQ0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYTNkYmQ2Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWNvZGktanNmMTIvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL05PVElDRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci09PSAgTk9USUNFIGZpbGUgY29ycmVzcG9uZGluZyB0byBzZWN0aW9uIDQoZCkgb2YgdGhlIEFwYWNoZSBMaWNlbnNlLCAgID09Ci09PSAgVmVyc2lvbiAyLjAsIGluIHRoaXMgY2FzZSBmb3IgdGhlIEFwYWNoZSBNeUZhY2VzIE1hdmVuIFBsdWdpbnMgICAgID09Ci09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgCi1UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLgotCi1Qb3J0aW9ucyBvZiB0aGlzIHNvZnR3YXJlIHdlcmUgb3JpZ2luYWxseSBiYXNlZCBvbiB0aGUgZm9sbG93aW5nOgotCi0gLSBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwNiwgT3JhY2xlIENvcnAsIDxodHRwOi8vd3d3Lm9yYWNsZS5jb20vPi4KLWFuZCBhcmUgbGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIHVuZGVyIHRoZSAKLSJTb2Z0d2FyZSBHcmFudCBhbmQgQ29ycG9yYXRlIENvbnRyaWJ1dGlvbiBMaWNlbnNlIEFncmVlbWVudCIKLQotU2VlIHRoZSBMSUNFTlNFLnR4dCBmaWxlIGZvciBpbmZvcm1hdGlvbiBvbiBhbGwgbGljZW5zZXMgCi1hc3NvY2lhdGVkIHdpdGggdGhpcyBzb2Z0d2FyZS4KZGlmZiAtLWdpdCBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWNvZGktanNmMTIvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL21hdmVuL2FyY2hldHlwZS1tZXRhZGF0YS54bWwgYi9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1jb2RpLWpzZjEyL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9tYXZlbi9hcmNoZXR5cGUtbWV0YWRhdGEueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNzhiMjA2Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWNvZGktanNmMTIvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL21hdmVuL2FyY2hldHlwZS1tZXRhZGF0YS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICAgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gICAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICAgIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICAgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gICAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gICAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gICAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICAgIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08YXJjaGV0eXBlLWRlc2NyaXB0b3IgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3BsdWdpbnMvbWF2ZW4tYXJjaGV0eXBlLXBsdWdpbi9hcmNoZXR5cGUtZGVzY3JpcHRvci8xLjAuMCIKLSAgICAgICAgICAgICAgICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgICAgICAgICAgICAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvcGx1Z2lucy9tYXZlbi1hcmNoZXR5cGUtcGx1Z2luL2FyY2hldHlwZS1kZXNjcmlwdG9yLzEuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9hcmNoZXR5cGUtZGVzY3JpcHRvci0xLjAuMC54c2QiCi0KLSAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJteWZhY2VzLWFyY2hldHlwZS1jb2RpLWpzZjEyIiBwYXJ0aWFsPSJmYWxzZSI+Ci0KLSAgPHJlcXVpcmVkUHJvcGVydGllcy8+Ci0KLSAgPGZpbGVTZXRzPgotICAgICAgPGZpbGVTZXQgZmlsdGVyZWQ9InRydWUiIHBhY2thZ2VkPSJ0cnVlIj4KLSAgICAgICAgICA8ZGlyZWN0b3J5PnNyYy9tYWluL2phdmEvPC9kaXJlY3Rvcnk+Ci0gICAgICA8L2ZpbGVTZXQ+Ci0gICAgICA8ZmlsZVNldCBmaWx0ZXJlZD0iZmFsc2UiIHBhY2thZ2VkPSJmYWxzZSI+Ci0gICAgICAgICAgPGRpcmVjdG9yeT5zcmMvbWFpbi93ZWJhcHAvPC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgPGV4Y2x1ZGVzPgotICAgICAgICAgICAgICA8ZXhjbHVkZT5XRUItSU5GL2ZhY2VzLWNvbmZpZy54bWw8L2V4Y2x1ZGU+Ci0gICAgICAgICAgPC9leGNsdWRlcz4KLSAgICAgIDwvZmlsZVNldD4KLSAgICAgIDxmaWxlU2V0IGZpbHRlcmVkPSJ0cnVlIiBwYWNrYWdlZD0iZmFsc2UiPgotICAgICAgICAgIDxkaXJlY3Rvcnk+c3JjL21haW4vd2ViYXBwLzwvZGlyZWN0b3J5PgotICAgICAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgICAgICAgPCEtLSBmYWNlcy1jb25maWcgbmVlZHMgdG8gYmUgZmlsdGVyZWQgLS0+Ci0gICAgICAgICAgICAgIDxpbmNsdWRlPldFQi1JTkYvZmFjZXMtY29uZmlnLnhtbDwvaW5jbHVkZT4KLSAgICAgICAgICA8L2luY2x1ZGVzPgotICAgICAgPC9maWxlU2V0PgotICA8L2ZpbGVTZXRzPgotCi0gIDxtb2R1bGVzLz4KLQotPC9hcmNoZXR5cGUtZGVzY3JpcHRvcj4KZGlmZiAtLWdpdCBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWNvZGktanNmMTIvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvcG9tLnhtbCBiL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWNvZGktanNmMTIvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmQzNjZiYi4uMDAwMDAwMAotLS0gYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1jb2RpLWpzZjEyL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMzIgKzAsMCBAQAotI3NldCggJHN5bWJvbF9wb3VuZCA9ICcjJyApCi0jc2V0KCAkc3ltYm9sX2RvbGxhciA9ICckJyApCi0jc2V0KCAkc3ltYm9sX2VzY2FwZSA9ICdcJyApCi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIgotICAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgotICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLSAgICA8Z3JvdXBJZD4ke2dyb3VwSWR9PC9ncm91cElkPgotICAgIDxhcnRpZmFjdElkPiR7YXJ0aWZhY3RJZH08L2FydGlmYWN0SWQ+Ci0gICAgPHBhY2thZ2luZz53YXI8L3BhY2thZ2luZz4KLSAgICA8dmVyc2lvbj4ke3ZlcnNpb259PC92ZXJzaW9uPgotICAgIDxuYW1lPkEgY3VzdG9tIHByb2plY3QgdXNpbmcgTXlGYWNlcyAxLjIsIE9wZW5XZWJCZWFucyBhbmQgTXlGYWNlcyBDT0RJPC9uYW1lPgotICAgIDx1cmw+aHR0cDovL3d3dy5teW9yZ2FuaXphdGlvbi5vcmc8L3VybD4KLQotICAgIDxwcm9wZXJ0aWVzPgotICAgICAgICA8anNmLW15ZmFjZXMudmVyc2lvbj4xLjIuMTA8L2pzZi1teWZhY2VzLnZlcnNpb24+Ci0gICAgICAgIDxqc2YtbW9qYXJyYS52ZXJzaW9uPjEuMl8xNTwvanNmLW1vamFycmEudmVyc2lvbj4KLSAgICAgICAgPG9wZW53ZWJiZWFucy52ZXJzaW9uPjEuMS4wPC9vcGVud2ViYmVhbnMudmVyc2lvbj4KLSAgICAgICAgPGNvZGkudmVyc2lvbj4xLjAuMTwvY29kaS52ZXJzaW9uPgotICAgICAgICA8bWF2ZW4uamV0dHkucGx1Z2luLnZlcnNpb24+Ni4xLjIyPC9tYXZlbi5qZXR0eS5wbHVnaW4udmVyc2lvbj4KLSAgICA8L3Byb3BlcnRpZXM+Ci0KLSAgICA8YnVpbGQ+Ci0gICAgICAgIDxmaW5hbE5hbWU+JHthcnRpZmFjdElkfTwvZmluYWxOYW1lPgotICAgICAgICA8cGx1Z2lucz4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWNvbXBpbGVyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHNvdXJjZT4xLjU8L3NvdXJjZT4KLSAgICAgICAgICAgICAgICAgICAgPHRhcmdldD4xLjU8L3RhcmdldD4KLSAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgPC9wbHVnaW5zPgotICAgIDwvYnVpbGQ+Ci0KLSAgICA8cHJvZmlsZXM+Ci0gICAgICAgIDxwcm9maWxlPgotICAgICAgICAgICAgPGlkPm15ZmFjZXM8L2lkPgotICAgICAgICAgICAgPGFjdGl2YXRpb24+Ci0gICAgICAgICAgICAgICAgPHByb3BlcnR5PgotICAgICAgICAgICAgICAgICAgICA8bmFtZT4hanNmPC9uYW1lPgotICAgICAgICAgICAgICAgIDwvcHJvcGVydHk+Ci0gICAgICAgICAgICA8L2FjdGl2YXRpb24+Ci0gICAgICAgICAgICA8ZGVwZW5kZW5jaWVzPgotICAgICAgICAgICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuY29yZTwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1hcGk8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7c3ltYm9sX2RvbGxhcn17anNmLW15ZmFjZXMudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4KLSAgICAgICAgICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgICAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5jb3JlPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWltcGw8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7c3ltYm9sX2RvbGxhcn17anNmLW15ZmFjZXMudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxzY29wZT5ydW50aW1lPC9zY29wZT4KLSAgICAgICAgICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8L2RlcGVuZGVuY2llcz4KLSAgICAgICAgPC9wcm9maWxlPgotCi0gICAgICAgIDxwcm9maWxlPgotICAgICAgICAgICAgPCEtLSBBY3RpdmUgYWRkaW5nIC1EanNmPW1vamFycmEgd2hlbiBleGVjdXRlIG1hdmVuIGdvYWxzLiAtLT4KLSAgICAgICAgICAgIDxpZD5tb2phcnJhPC9pZD4KLSAgICAgICAgICAgIDxhY3RpdmF0aW9uPgotICAgICAgICAgICAgICAgIDxwcm9wZXJ0eT4KLSAgICAgICAgICAgICAgICAgICAgPG5hbWU+anNmPC9uYW1lPgotICAgICAgICAgICAgICAgICAgICA8dmFsdWU+bW9qYXJyYTwvdmFsdWU+Ci0gICAgICAgICAgICAgICAgPC9wcm9wZXJ0eT4KLSAgICAgICAgICAgIDwvYWN0aXZhdGlvbj4KLSAgICAgICAgICAgIDxkZXBlbmRlbmNpZXM+Ci0gICAgICAgICAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPmphdmF4LmZhY2VzPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qc2YtYXBpPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3N5bWJvbF9kb2xsYXJ9e2pzZi1yaS52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgotICAgICAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXguZmFjZXM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmpzZi1pbXBsPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3N5bWJvbF9kb2xsYXJ9e2pzZi1yaS52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPHNjb3BlPnJ1bnRpbWU8L3Njb3BlPgotICAgICAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDwvZGVwZW5kZW5jaWVzPgotICAgICAgICAgICAgPHJlcG9zaXRvcmllcz4KLSAgICAgICAgICAgICAgICA8cmVwb3NpdG9yeT4KLSAgICAgICAgICAgICAgICAgICAgPGlkPmphdmEubmV0PC9pZD4KLSAgICAgICAgICAgICAgICAgICAgPHVybD5odHRwOi8vZG93bmxvYWQuamF2YS5uZXQvbWF2ZW4vMTwvdXJsPgotICAgICAgICAgICAgICAgICAgICA8bGF5b3V0PmxlZ2FjeTwvbGF5b3V0PgotICAgICAgICAgICAgICAgIDwvcmVwb3NpdG9yeT4KLSAgICAgICAgICAgIDwvcmVwb3NpdG9yaWVzPgotICAgICAgICA8L3Byb2ZpbGU+Ci0KLSAgICAgICAgPHByb2ZpbGU+Ci0gICAgICAgICAgICA8IS0tIFVzZSBtdm4gY2xlYW4gamV0dHk6cnVuLWV4cGxvZGVkIC1QamV0dHlDb25maWcgdG8gcnVuIHdpdGggamV0dHkgLS0+Ci0gICAgICAgICAgICA8aWQ+amV0dHlDb25maWc8L2lkPgotICAgICAgICAgICAgPGJ1aWxkPgotICAgICAgICAgICAgICAgIDxwbHVnaW5zPgotICAgICAgICAgICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgICAgICAgICAgPCEtLVRoaXMgcGx1Z2luIGFsbG93cyB0byBydW4gdGhlIHdhciB1c2luZyBtdm4gamV0dHk6cnVuIC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLm1vcnRiYXkuamV0dHk8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1qZXR0eS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3N5bWJvbF9kb2xsYXJ9e21hdmVuLmpldHR5LnBsdWdpbi52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzY2FuSW50ZXJ2YWxTZWNvbmRzPjEwPC9zY2FuSW50ZXJ2YWxTZWNvbmRzPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgICAgICAgICA8L3BsdWdpbnM+Ci0gICAgICAgICAgICA8L2J1aWxkPgotICAgICAgICA8L3Byb2ZpbGU+Ci0gICAgPC9wcm9maWxlcz4KLQotICAgIDwhLS0gUHJvamVjdCBkZXBlbmRlbmNpZXMgLS0+Ci0gICAgPGRlcGVuZGVuY2llcz4KLQotICAgICAgICA8IS0tIFNwZWNpZmljYXRpb25zIC0tPgotICAgICAgICA8IS0tIEpTUi0zMzAgLS0+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5nZXJvbmltby5zcGVjczwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmdlcm9uaW1vLWF0aW5qZWN0XzEuMF9zcGVjPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+MS4wPC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0KLSAgICAgICAgPCEtLSBKU1ItMjk5IC0tPgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZ2Vyb25pbW8uc3BlY3M8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5nZXJvbmltby1qY2RpXzEuMF9zcGVjPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+MS4wPC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmdlcm9uaW1vLnNwZWNzPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+Z2Vyb25pbW8tanRhXzEuMV9zcGVjPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+MS4xLjE8L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLQotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZ2Vyb25pbW8uc3BlY3M8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5nZXJvbmltby1pbnRlcmNlcHRvcl8xLjFfc3BlYzwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuMDwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotCi0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5nZXJvbmltby5zcGVjczwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmdlcm9uaW1vLXZhbGlkYXRpb25fMS4wX3NwZWM8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4xLjE8L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLQotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZ2Vyb25pbW8uc3BlY3M8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5nZXJvbmltby1qcGFfMS4wX3NwZWM8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4xLjEuMjwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotCi0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5nZXJvbmltby5zcGVjczwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmdlcm9uaW1vLXNlcnZsZXRfMi41X3NwZWM8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4xLjI8L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmdlcm9uaW1vLnNwZWNzPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+Z2Vyb25pbW8tZWxfMS4wX3NwZWM8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4xLjAuMjwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLQotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPmRvbTRqPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+ZG9tNGo8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4xLjYuMTwvdmVyc2lvbj4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotCi0gICAgICAgIDwhLS0gT3BlbldlYkJlYW5zIC0tPgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUub3BlbndlYmJlYW5zPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+b3BlbndlYmJlYW5zLWltcGw8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke3N5bWJvbF9kb2xsYXJ9e29wZW53ZWJiZWFucy52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxzY29wZT5ydW50aW1lPC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotCi0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5vcGVud2ViYmVhbnM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5vcGVud2ViYmVhbnMtanNmMTI8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke3N5bWJvbF9kb2xsYXJ9e29wZW53ZWJiZWFucy52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxzY29wZT5ydW50aW1lPC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotCi0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5vcGVud2ViYmVhbnM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5vcGVud2ViYmVhbnMtd2ViPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHtzeW1ib2xfZG9sbGFyfXtvcGVud2ViYmVhbnMudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+cnVudGltZTwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLQotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUub3BlbndlYmJlYW5zPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+b3BlbndlYmJlYW5zLXNwaTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7c3ltYm9sX2RvbGxhcn17b3BlbndlYmJlYW5zLnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPnJ1bnRpbWU8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm9wZW53ZWJiZWFuczwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm9wZW53ZWJiZWFucy1yZXNvdXJjZTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7c3ltYm9sX2RvbGxhcn17b3BlbndlYmJlYW5zLnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPnJ1bnRpbWU8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0KLQotICAgICAgICA8IS0tIE15RmFjZXMgQ09ESSAtLT4KLSAgICAgICAgPCEtLSB0aGUgSlNGIGluZGVwZW5kZW50IGNvcmUgLS0+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMuY2RpLmNvcmU8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dGNkaS1jb3JlLWFwaTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7c3ltYm9sX2RvbGxhcn17Y29kaS52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLmNkaS5jb3JlPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHRjZGktY29yZS1pbXBsPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHtzeW1ib2xfZG9sbGFyfXtjb2RpLnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPnJ1bnRpbWU8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0KLSAgICAgICAgPCEtLSB0aGUgSlNGLTEuMiBzcGVjaWZpYyBsaWJyYXJ5IC0tPgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLmNkaS5tb2R1bGVzPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHRjZGktanNmMTItbW9kdWxlLWFwaTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7c3ltYm9sX2RvbGxhcn17Y29kaS52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLmNkaS5tb2R1bGVzPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHRjZGktanNmMTItbW9kdWxlLWltcGw8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke3N5bWJvbF9kb2xsYXJ9e2NvZGkudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+cnVudGltZTwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLQotICAgICAgICA8IS0tIHRoZSBCVi0xLjAgc3BlY2lmaWMgbGlicmFyeSAtLT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy5jZGkubW9kdWxlczwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0Y2RpLWJ2MS1tb2R1bGUtYXBpPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHtzeW1ib2xfZG9sbGFyfXtjb2RpLnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMuY2RpLm1vZHVsZXM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dGNkaS1idjEtbW9kdWxlLWltcGw8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke3N5bWJvbF9kb2xsYXJ9e2NvZGkudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+cnVudGltZTwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLQotICAgICAgICA8IS0tIENPREkgSlBBLTEuMCBNb2R1bGUgLS0+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMuY2RpLm1vZHVsZXM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dGNkaS1qcGExLW1vZHVsZS1hcGk8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke3N5bWJvbF9kb2xsYXJ9e2NvZGkudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy5jZGkubW9kdWxlczwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0Y2RpLWpwYTEtbW9kdWxlLWltcGw8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke3N5bWJvbF9kb2xsYXJ9e2NvZGkudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+cnVudGltZTwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLQotICAgICAgICA8IS0tIENPREktSTE4TiBNZXNzYWdlIE1vZHVsZSAtLT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy5jZGkubW9kdWxlczwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0Y2RpLW1lc3NhZ2UtbW9kdWxlLWFwaTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7c3ltYm9sX2RvbGxhcn17Y29kaS52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLmNkaS5tb2R1bGVzPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHRjZGktbWVzc2FnZS1tb2R1bGUtaW1wbDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7c3ltYm9sX2RvbGxhcn17Y29kaS52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxzY29wZT5ydW50aW1lPC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotCi0gICAgICAgIDwhLS0gQ09ESS1TY3JpcHRpbmcgTW9kdWxlIC0tPgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLmNkaS5tb2R1bGVzPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHRjZGktc2NyaXB0aW5nLW1vZHVsZS1hcGk8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke3N5bWJvbF9kb2xsYXJ9e2NvZGkudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy5jZGkubW9kdWxlczwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0Y2RpLXNjcmlwdGluZy1tb2R1bGUtaW1wbDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7c3ltYm9sX2RvbGxhcn17Y29kaS52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxzY29wZT5ydW50aW1lPC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotCi0gICAgICAgIDwhLS0gT1BUSU9OQUw6IHVzZSB0aGUgYWxsLWluLW9uZSBqYXIgaW5zdGVhZCBvZiB0aGUgaW5kaXZpZHVhbCBDT0RJIG1vZHVsZSBkZXBlbmRlbmNpZXMgLS0+Ci0gICAgICAgIDwhLS1kZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMuY2RpLmJ1bmRsZXM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dGNkaS1idW5kbGUtanNmMTI8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke3N5bWJvbF9kb2xsYXJ9e2NvZGkudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeS0tPgotCi0gICAgICAgIDwhLS0gdGVzdCBkZXBlbmRlbmNpZXMgLS0+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+anVuaXQ8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5qdW5pdDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPjQuOC4xPC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPC9kZXBlbmRlbmNpZXM+Ci0KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWNvZGktanNmMTIvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc3JjL21haW4vamF2YS9HcmVldGluZ1NlcnZpY2UuamF2YSBiL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWNvZGktanNmMTIvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc3JjL21haW4vamF2YS9HcmVldGluZ1NlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQwMjc1OS4uMDAwMDAwMAotLS0gYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1jb2RpLWpzZjEyL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL2phdmEvR3JlZXRpbmdTZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0jc2V0KCAkc3ltYm9sX3BvdW5kID0gJyMnICkKLSNzZXQoICRzeW1ib2xfZG9sbGFyID0gJyQnICkKLSNzZXQoICRzeW1ib2xfZXNjYXBlID0gJ1wnICkKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotKi8KLXBhY2thZ2UgJHtwYWNrYWdlfTsKLQotaW1wb3J0IGphdmF4LmluamVjdC5OYW1lZDsKLWltcG9ydCBqYXZheC5lbnRlcnByaXNlLmNvbnRleHQuQXBwbGljYXRpb25TY29wZWQ7Ci0KLUBOYW1lZAotQEFwcGxpY2F0aW9uU2NvcGVkCi1wdWJsaWMgY2xhc3MgR3JlZXRpbmdTZXJ2aWNlCi17Ci0gICAgcHVibGljIFN0cmluZyBjcmVhdGVHcmVldGluZyhTdHJpbmcgbmFtZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiAiSGVsbG8gIiArIG5hbWUgKyAiLiBXZSBob3BlIHlvdSBlbmpveSBBcGFjaGUgTXlGYWNlcyEiOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtY29kaS1qc2YxMi9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zcmMvbWFpbi9qYXZhL0hlbGxvV29ybGRDb250cm9sbGVyLmphdmEgYi9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1jb2RpLWpzZjEyL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL2phdmEvSGVsbG9Xb3JsZENvbnRyb2xsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmRiY2FlZC4uMDAwMDAwMAotLS0gYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1jb2RpLWpzZjEyL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL2phdmEvSGVsbG9Xb3JsZENvbnRyb2xsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLSNzZXQoICRzeW1ib2xfcG91bmQgPSAnIycgKQotI3NldCggJHN5bWJvbF9kb2xsYXIgPSAnJCcgKQotI3NldCggJHN5bWJvbF9lc2NhcGUgPSAnXCcgKQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0qLwotcGFja2FnZSAke3BhY2thZ2V9OwotCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci0KLWltcG9ydCBqYXZheC5pbmplY3QuTmFtZWQ7Ci1pbXBvcnQgamF2YXguaW5qZWN0LkluamVjdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLmNkaS5jb3JlLmFwaS5zY29wZS5jb252ZXJzYXRpb24uV2luZG93U2NvcGVkOwotCi0vKioKLSAqIEEgdHlwaWNhbCBzaW1wbGUgYmFja2luZyBiZWFuLCB0aGF0IGlzIGJhY2tlZCB0byA8Y29kZT5oZWxsb1dvcmxkLnhodG1sPC9jb2RlPgotICovCi1ATmFtZWQoImhlbGxvV29ybGQiKQotQFdpbmRvd1Njb3BlZAotcHVibGljIGNsYXNzIEhlbGxvV29ybGRDb250cm9sbGVyIGltcGxlbWVudHMgU2VyaWFsaXphYmxlCi17Ci0KLSAgICAvL3Byb3BlcnRpZXMKLSAgICBwcml2YXRlIFN0cmluZyBuYW1lOwotICAgIEBJbmplY3QgcHJpdmF0ZSBHcmVldGluZ1NlcnZpY2UgZ3JlZXRpbmdTZXJ2aWNlOwotCi0gICAgLyoqCi0gICAgICogZGVmYXVsdCBlbXB0eSBjb25zdHJ1Y3RvcgotICAgICAqLwotICAgIHB1YmxpYyBIZWxsb1dvcmxkQ29udHJvbGxlcigpCi0gICAgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIE1ldGhvZCB0aGF0IGlzIGJhY2tlZCB0byBhIHN1Ym1pdCBidXR0b24gb2YgYSBmb3JtLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgc2VuZCgpCi0gICAgewotICAgICAgICAvL2RvIHJlYWwgbG9naWMsIHJldHVybiBhIHN0cmluZyB3aGljaCB3aWxsIGJlIHVzZWQgZm9yIHRoZSBuYXZpZ2F0aW9uIHN5c3RlbSBvZiBKU0YKLSAgICAgICAgcmV0dXJuICJwYWdlMiI7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRHcmVldGluZygpCi0gICAgewotICAgICAgICByZXR1cm4gZ3JlZXRpbmdTZXJ2aWNlLmNyZWF0ZUdyZWV0aW5nKG5hbWUpOwotICAgIH0KLQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLWdldHRlciAmIHNldHRlcgotCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBuYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpCi0gICAgewotICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtY29kaS1qc2YxMi9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9iZWFucy54bWwgYi9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1jb2RpLWpzZjEyL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL2JlYW5zLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjFlZTAyYS4uMDAwMDAwMAotLS0gYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1jb2RpLWpzZjEyL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL2JlYW5zLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPGJlYW5zLz4KLQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtY29kaS1qc2YxMi9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9mYWNlcy1jb25maWcueG1sIGIvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtY29kaS1qc2YxMi9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9mYWNlcy1jb25maWcueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZTc2MGU2Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWNvZGktanNmMTIvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvZmFjZXMtY29uZmlnLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCEtLQotICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICAgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gICAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICAgIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICAgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gICAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gICAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gICAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICAgIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08ZmFjZXMtY29uZmlnIHZlcnNpb249IjEuMiIKLSAgICB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIgotICAgIHhtbG5zOnhpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hJbmNsdWRlIgotICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL3dlYi1mYWNlc2NvbmZpZ18xXzIueHNkIj4KLQotCi0gICAgPG5hdmlnYXRpb24tcnVsZT4KLSAgICAgICAgPG5hdmlnYXRpb24tY2FzZT4KLSAgICAgICAgICAgIDxmcm9tLW91dGNvbWU+cGFnZTI8L2Zyb20tb3V0Y29tZT4KLSAgICAgICAgICAgIDx0by12aWV3LWlkPi9wYWdlMi5qc3A8L3RvLXZpZXctaWQ+Ci0gICAgICAgIDwvbmF2aWdhdGlvbi1jYXNlPgotICAgICAgICA8bmF2aWdhdGlvbi1jYXNlPgotICAgICAgICAgICAgPGZyb20tb3V0Y29tZT5oZWxsb1dvcmxkPC9mcm9tLW91dGNvbWU+Ci0gICAgICAgICAgICA8dG8tdmlldy1pZD4vaGVsbG9Xb3JsZC5qc3A8L3RvLXZpZXctaWQ+Ci0gICAgICAgIDwvbmF2aWdhdGlvbi1jYXNlPgotICAgIDwvbmF2aWdhdGlvbi1ydWxlPgotCQotPC9mYWNlcy1jb25maWc+CmRpZmYgLS1naXQgYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1jb2RpLWpzZjEyL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwgYi9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1jb2RpLWpzZjEyL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhYzJkMDIuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtY29kaS1qc2YxMi9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTI0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCEtLQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPHdlYi1hcHAgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIKLSAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL3dlYi1hcHBfMl81LnhzZCIKLSAgICAgICAgdmVyc2lvbj0iMi41Ij4KLQotICAgIDxkZXNjcmlwdGlvbj5NeVByb2plY3Qgd2ViLnhtbDwvZGVzY3JpcHRpb24+Ci0KLSAgICA8IS0tIEpTRiBzdGFuZGFyZCBwYXJhbWV0ZXJzIC0tPgotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+U3RhdGUgc2F2aW5nIG1ldGhvZDogImNsaWVudCIgb3IgInNlcnZlciIgKD0gZGVmYXVsdCkKLSAgICAgICAgICAgIFNlZSBKU0YgU3BlY2lmaWNhdGlvbiAyLjUuMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPmphdmF4LmZhY2VzLlNUQVRFX1NBVklOR19NRVRIT0Q8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT5jbGllbnQ8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLQotICAgIDwhLS0gTXlGYWNlcyBzcGVjaWZpYyBwYXJhbWV0ZXJzIC0tPgotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+T25seSBhcHBsaWNhYmxlIGlmIHN0YXRlIHNhdmluZyBtZXRob2QgaXMgInNlcnZlciIgKD0gZGVmYXVsdCkuCi0gICAgICAgICAgICBEZWZpbmVzIHRoZSBhbW91bnQgKGRlZmF1bHQgPSAyMCkgb2YgdGhlIGxhdGVzdCB2aWV3cyBhcmUgc3RvcmVkIGluIHNlc3Npb24uPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLk5VTUJFUl9PRl9WSUVXU19JTl9TRVNTSU9OPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+MjA8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPk9ubHkgYXBwbGljYWJsZSBpZiBzdGF0ZSBzYXZpbmcgbWV0aG9kIGlzICJzZXJ2ZXIiICg9IGRlZmF1bHQpLgotICAgICAgICAgICAgSWYgdHJ1ZSAoZGVmYXVsdCkgdGhlIHN0YXRlIHdpbGwgYmUgc2VyaWFsaXplZCB0byBhIGJ5dGUgc3RyZWFtIGJlZm9yZSBpdAotICAgICAgICAgICAgaXMgd3JpdHRlbiB0byB0aGUgc2Vzc2lvbi4KLSAgICAgICAgICAgIElmIGZhbHNlIHRoZSBzdGF0ZSB3aWxsIG5vdCBiZSBzZXJpYWxpemVkIHRvIGEgYnl0ZSBzdHJlYW0uPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLlNFUklBTElaRV9TVEFURV9JTl9TRVNTSU9OPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+T25seSBhcHBsaWNhYmxlIGlmIHN0YXRlIHNhdmluZyBtZXRob2QgaXMgInNlcnZlciIgKD0gZGVmYXVsdCkgYW5kIGlmCi0gICAgICAgICAgICBvcmcuYXBhY2hlLm15ZmFjZXMuU0VSSUFMSVpFX1NUQVRFX0lOX1NFU1NJT04gaXMgdHJ1ZSAoPSBkZWZhdWx0KQotICAgICAgICAgICAgSWYgdHJ1ZSAoZGVmYXVsdCkgdGhlIHNlcmlhbGl6ZWQgc3RhdGUgd2lsbCBiZSBjb21wcmVzc2VkIGJlZm9yZSBpdAotICAgICAgICAgICAgaXMgd3JpdHRlbiB0byB0aGUgc2Vzc2lvbi4gSWYgZmFsc2UgdGhlIHN0YXRlIHdpbGwgbm90IGJlIGNvbXByZXNzZWQuPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLkNPTVBSRVNTX1NUQVRFX0lOX1NFU1NJT048L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT50cnVlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5UaGlzIHBhcmFtZXRlciB0ZWxscyBNeUZhY2VzIGlmIGphdmFzY3JpcHQgY29kZSBzaG91bGQgYmUgYWxsb3dlZCBpbiB0aGUKLSAgICAgICAgICAgIHJlbmRlcmVkIEhUTUwgb3V0cHV0LgotICAgICAgICAgICAgSWYgamF2YXNjcmlwdCBpcyBhbGxvd2VkLCBjb21tYW5kX2xpbmsgYW5jaG9ycyB3aWxsIGhhdmUgamF2YXNjcmlwdCBjb2RlCi0gICAgICAgICAgICB0aGF0IHN1Ym1pdHMgdGhlIGNvcnJlc3BvbmRpbmcgZm9ybS4KLSAgICAgICAgICAgIElmIGphdmFzY3JpcHQgaXMgbm90IGFsbG93ZWQsIHRoZSBzdGF0ZSBzYXZpbmcgaW5mbyBhbmQgbmVzdGVkIHBhcmFtZXRlcnMKLSAgICAgICAgICAgIHdpbGwgYmUgYWRkZWQgYXMgdXJsIHBhcmFtZXRlcnMuCi0gICAgICAgICAgICBEZWZhdWx0OiAidHJ1ZSI8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuQUxMT1dfSkFWQVNDUklQVDwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPnRydWU8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLkRFVEVDVF9KQVZBU0NSSVBUPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+ZmFsc2U8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPklmIHRydWUsIHJlbmRlcmVkIEhUTUwgY29kZSB3aWxsIGJlIGZvcm1hdHRlZCwgc28gdGhhdCBpdCBpcyAiaHVtYW4gcmVhZGFibGUiLgotICAgICAgICAgICAgaS5lLiBhZGRpdGlvbmFsIGxpbmUgc2VwYXJhdG9ycyBhbmQgd2hpdGVzcGFjZSB3aWxsIGJlIHdyaXR0ZW4sIHRoYXQgZG8gbm90Ci0gICAgICAgICAgICBpbmZsdWVuY2UgdGhlIEhUTUwgY29kZS4KLSAgICAgICAgICAgIERlZmF1bHQ6ICJ0cnVlIjwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5QUkVUVFlfSFRNTDwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPnRydWU8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPklmIHRydWUsIGEgamF2YXNjcmlwdCBmdW5jdGlvbiB3aWxsIGJlIHJlbmRlcmVkIHRoYXQgaXMgYWJsZSB0byByZXN0b3JlIHRoZQotICAgICAgICAgICAgZm9ybWVyIHZlcnRpY2FsIHNjcm9sbCBvbiBldmVyeSByZXF1ZXN0LiBDb252ZW5pZW50IGZlYXR1cmUgaWYgeW91IGhhdmUgcGFnZXMKLSAgICAgICAgICAgIHdpdGggbG9uZyBsaXN0cyBhbmQgeW91IGRvIG5vdCB3YW50IHRoZSBicm93c2VyIHBhZ2UgdG8gYWx3YXlzIGp1bXAgdG8gdGhlIHRvcAotICAgICAgICAgICAgaWYgeW91IHRyaWdnZXIgYSBsaW5rIG9yIGJ1dHRvbiBhY3Rpb24gdGhhdCBzdGF5cyBvbiB0aGUgc2FtZSBwYWdlLgotICAgICAgICAgICAgRGVmYXVsdDogImZhbHNlIjwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5BVVRPX1NDUk9MTDwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPnRydWU8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPlVzZWQgZm9yIGVuY3J5cHRpbmcgdmlldyBzdGF0ZS4gT25seSByZWxldmFudCBmb3IgY2xpZW50IHNpZGUKLSAgICAgICAgICAgIHN0YXRlIHNhdmluZy4gU2VlIE15RmFjZXMgd2lraS93ZWIgc2l0ZSBkb2N1bWVudGF0aW9uIGZvciBpbnN0cnVjdGlvbnMKLSAgICAgICAgICAgIG9uIGhvdyB0byBjb25maWd1cmUgYW4gYXBwbGljYXRpb24gZm9yIGRpZmZlbmVudCBlbmNyeXB0aW9uIHN0cmVuZ3Rocy4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLlNFQ1JFVDwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPk56WTFORE15TVRBPTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotCi0gICAgPCEtLSBGYWNlcyBTZXJ2bGV0IC0tPgotICAgIDxzZXJ2bGV0PgotICAgICAgICA8c2VydmxldC1uYW1lPkZhY2VzIFNlcnZsZXQ8L3NlcnZsZXQtbmFtZT4KLSAgICAgICAgPHNlcnZsZXQtY2xhc3M+amF2YXguZmFjZXMud2ViYXBwLkZhY2VzU2VydmxldDwvc2VydmxldC1jbGFzcz4KLSAgICAgICAgPGxvYWQtb24tc3RhcnR1cD4xPC9sb2FkLW9uLXN0YXJ0dXA+Ci0gICAgPC9zZXJ2bGV0PgotCi0gICAgPCEtLSBGYWNlcyBTZXJ2bGV0IE1hcHBpbmcgLS0+Ci0gICAgPHNlcnZsZXQtbWFwcGluZz4KLSAgICAgICAgPHNlcnZsZXQtbmFtZT5GYWNlcyBTZXJ2bGV0PC9zZXJ2bGV0LW5hbWU+Ci0gICAgICAgIDx1cmwtcGF0dGVybj4qLmpzZjwvdXJsLXBhdHRlcm4+Ci0gICAgPC9zZXJ2bGV0LW1hcHBpbmc+Ci0KLSAgICA8IS0tIFdlbGNvbWUgZmlsZXMgLS0+Ci0gICAgPHdlbGNvbWUtZmlsZS1saXN0PgotICAgICAgICA8d2VsY29tZS1maWxlPmluZGV4Lmh0bWw8L3dlbGNvbWUtZmlsZT4KLSAgICA8L3dlbGNvbWUtZmlsZS1saXN0PgotCi0gICAgPCEtLSBMaXN0ZW5lciBmb3IgT3BlbldlYkJlYW5zIGNvbmZpZ3VyYXRpb24gLS0+Ci0gICAgPGxpc3RlbmVyPgotICAgICAgICA8bGlzdGVuZXItY2xhc3M+Ci0gICAgICAgICAgICBvcmcuYXBhY2hlLndlYmJlYW5zLnNlcnZsZXQuV2ViQmVhbnNDb25maWd1cmF0aW9uTGlzdGVuZXIKLSAgICAgICAgPC9saXN0ZW5lci1jbGFzcz4KLSAgICA8L2xpc3RlbmVyPgotCi08L3dlYi1hcHA+CmRpZmYgLS1naXQgYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1jb2RpLWpzZjEyL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL3dlYmFwcC9oZWxsb1dvcmxkLmpzcCBiL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWNvZGktanNmMTIvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc3JjL21haW4vd2ViYXBwL2hlbGxvV29ybGQuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhN2RhNWQyLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWNvZGktanNmMTIvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc3JjL21haW4vd2ViYXBwL2hlbGxvV29ybGQuanNwCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotPCUtLQotICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICAgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gICAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICAgIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICAgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gICAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gICAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gICAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICAgIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0lPgotCi08JUAgdGFnbGliIHVyaT0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvaHRtbCIgcHJlZml4PSJoIiAlPgotPCVAIHRhZ2xpYiB1cmk9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2NvcmUiIHByZWZpeD0iZiIlPgotPGh0bWw+Ci0gICAgPGhlYWQ+Ci0gICAgICAgIDx0aXRsZT5IZWxsbyBXb3JsZDwvdGl0bGU+Ci0gICAgICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9InJlc291cmNlcy9jc3Mvc3R5bGUuY3NzIiAvPgotICAgIDwvaGVhZD4KLSAgICA8Ym9keT4KLSAgICAgICAgPGY6dmlldz4KLSAgICAgICAgICAgIDxkaXYgaWQ9ImNvbnRhaW5lciI+Ci0gICAgICAgICAgICAgICAgPGgxPk15RmFjZXMgSGVsbG8gV29ybGQ8L2gxPgotICAgICAgICAgICAgICAgIDxoOmZvcm0gaWQ9Im1haW5Gb3JtIj4KLSAgICAgICAgICAgICAgICAgICAgPGg6cGFuZWxHcmlkIGNvbHVtbnM9IjIiPgotICAgICAgICAgICAgICAgICAgICAgICAgPGg6b3V0cHV0TGFiZWwgZm9yPSJuYW1lIiB2YWx1ZT0iUGxlYXNlIGVudGVyIHlvdXIgbmFtZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGg6aW5wdXRUZXh0IGlkPSJuYW1lIiB2YWx1ZT0iI3toZWxsb1dvcmxkLm5hbWV9IiByZXF1aXJlZD0idHJ1ZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGg6Y29tbWFuZEJ1dHRvbiB2YWx1ZT0iUHJlc3MgbWUiIGFjdGlvbj0iI3toZWxsb1dvcmxkLnNlbmR9Ii8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8aDptZXNzYWdlcyBzaG93RGV0YWlsPSJ0cnVlIiBzaG93U3VtbWFyeT0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICAgICAgPC9oOnBhbmVsR3JpZD4KLSAgICAgICAgICAgICAgICA8L2g6Zm9ybT4KLSAgICAgICAgICAgIDwvZGl2PgotICAgICAgICA8L2Y6dmlldz4KLSAgICA8L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1jb2RpLWpzZjEyL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL3dlYmFwcC9pbmRleC5odG1sIGIvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtY29kaS1qc2YxMi9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zcmMvbWFpbi93ZWJhcHAvaW5kZXguaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTlkMjJmZC4uMDAwMDAwMAotLS0gYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1jb2RpLWpzZjEyL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL3dlYmFwcC9pbmRleC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotPCEtLQotICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICAgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gICAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICAgIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICAgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gICAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gICAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gICAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICAgIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08aHRtbD4KLTxoZWFkPgotICAgIDxtZXRhIGh0dHAtZXF1aXY9InJlZnJlc2giIGNvbnRlbnQ9IjA7IFVSTD1oZWxsb1dvcmxkLmpzZiI+Ci08L2hlYWQ+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1jb2RpLWpzZjEyL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL3dlYmFwcC9wYWdlMi5qc3AgYi9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1jb2RpLWpzZjEyL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL3dlYmFwcC9wYWdlMi5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyZDIzMGIuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtY29kaS1qc2YxMi9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zcmMvbWFpbi93ZWJhcHAvcGFnZTIuanNwCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotPCUtLQotICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICAgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gICAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICAgIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICAgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gICAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gICAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gICAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICAgIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0lPgotCi08JUAgdGFnbGliIHVyaT0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvaHRtbCIgcHJlZml4PSJoIiAlPgotPCVAIHRhZ2xpYiB1cmk9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2NvcmUiIHByZWZpeD0iZiIlPgotPGh0bWw+Ci0gICAgPGhlYWQ+Ci0gICAgICAgIDx0aXRsZT5IZWxsbyBXb3JsZDwvdGl0bGU+Ci0gICAgICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9InJlc291cmNlcy9jc3Mvc3R5bGUuY3NzIiAvPgotICAgIDwvaGVhZD4KLSAgICA8Ym9keT4KLSAgICAgICAgPGY6dmlldz4KLSAgICAgICAgICAgIDxkaXYgaWQ9ImNvbnRhaW5lciI+Ci0gICAgICAgICAgICAgICAgPGgxPk15RmFjZXMgSGVsbG8gV29ybGQ8L2gxPgotICAgICAgICAgICAgICAgIDxoOm91dHB1dFRleHQgdmFsdWU9IiN7aGVsbG9Xb3JsZC5ncmVldGluZ30iLz4KLSAgICAgICAgICAgICAgICA8YnIvPgotICAgICAgICAgICAgICAgIDxoOmZvcm0+Ci0gICAgICAgICAgICAgICAgICAgIDxoOmNvbW1hbmRMaW5rIHZhbHVlPSJIb21lIiBhY3Rpb249ImhlbGxvV29ybGQiLz4KLSAgICAgICAgICAgICAgICA8L2g6Zm9ybT4KLSAgICAgICAgICAgIDwvZGl2PgotICAgICAgICA8L2Y6dmlldz4KLSAgICA8L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1jb2RpLWpzZjEyL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL3dlYmFwcC9yZXNvdXJjZXMvY3NzL3N0eWxlLmNzcyBiL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWNvZGktanNmMTIvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc3JjL21haW4vd2ViYXBwL3Jlc291cmNlcy9jc3Mvc3R5bGUuY3NzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZmI5OTQxLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWNvZGktanNmMTIvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc3JjL21haW4vd2ViYXBwL3Jlc291cmNlcy9jc3Mvc3R5bGUuY3NzCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLWJvZHkgewotICAgIGJhY2tncm91bmQtY29sb3I6IHJnYigwLCAzNSwgNzUpOwotICAgIGZvbnQtZmFtaWx5OiB0YWhvbWEsIGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0gICAgZm9udC1zaXplOiAxMnB4OwotfQotCi0jY29udGFpbmVyIHsKLSAgICBtYXJnaW46IDEwcHggYXV0bzsKLSAgICB3aWR0aDogOTAwcHg7Ci0gICAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7Ci0gICAgcGFkZGluZzogM3B4OwotfQotCi1oMSB7Ci0gICAgZm9udC1zaXplOiAyMHB4OwotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtY29kaS1qc2YxMi9zcmMvc2l0ZS9hcHQvaW5kZXguYXB0IGIvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtY29kaS1qc2YxMi9zcmMvc2l0ZS9hcHQvaW5kZXguYXB0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MGI1MzNkLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWNvZGktanNmMTIvc3JjL3NpdGUvYXB0L2luZGV4LmFwdAorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLSAtLS0tLS0KLSBNeUZhY2VzIENPREkgSlNGIDEuMiBBcmNoZXR5cGUKLSAtLS0tLS0KLQotT3ZlcnZpZXcKLQotICBUaGlzIHByb2plY3QgZGVmaW5lcyBhIE1hdmVuIGFyY2hldHlwZS4gUnVubmluZyB0aGUgYXJjaGV0eXBlIHBsdWdpbiB3aXRoIHRoaXMgYXJjaGV0eXBlIHdpbGwKLSAgY3JlYXRlIGEgZGlyZWN0b3J5IHRyZWUgY29udGFpbmluZyB0aGUgZmlsZXMgbmVlZGVkIHRvIHF1aWNrbHkgZ2V0IHN0YXJ0ZWQgb24gYSBuZXcgSlNGIDEuMgotICBwcm9qZWN0IHVzaW5nIE15RmFjZXMgQ09ESSBhbmQgQXBhY2hlIE9wZW5XZWJCZWFucy4KLQotVXNhZ2UKLQotICBVc2UgdGhlIGZvbGxvd2luZyBtYXZlbiBjb21tYW5kIGFuZCB0aGVuIHNlbGVjdCBteWZhY2VzLWFyY2hldHlwZS1jb2RpLWpzZjEyIGZyb20gdGhlIG9wdGlvbnMuCi0KLQotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLW12biBhcmNoZXR5cGU6Z2VuZXJhdGUgLURhcmNoZXR5cGVDYXRhbG9nPWh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcKLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCmRpZmYgLS1naXQgYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1jb2RpLWpzZjIwL3BvbS54bWwgYi9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1jb2RpLWpzZjIwL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1ZDRmMDcuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtY29kaS1qc2YyMC9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLSAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gICAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gICAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gICAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICAgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICAgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICAgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgICB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+Ci0KLSAgICA8cGFyZW50PgotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29sczwvZ3JvdXBJZD4KLSAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1hcmNoZXR5cGUtcGFyZW50PC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj4xLjAuNC1TTkFQU0hPVDwvdmVyc2lvbj4KLSAgICA8L3BhcmVudD4KLQotICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29sczwvZ3JvdXBJZD4KLSAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWFyY2hldHlwZS1jb2RpLWpzZjIwPC9hcnRpZmFjdElkPgotICAgIDxwYWNrYWdpbmc+amFyPC9wYWNrYWdpbmc+Ci0gICAgPG5hbWU+TXlGYWNlcyBDT0RJIEFyY2hldHlwZSBmb3IgSlNGIDIuMDwvbmFtZT4KLSAgICA8ZGVzY3JpcHRpb24+QXJjaGV0eXBlIHRvIGNyZWF0ZSBhIG5ldyBKU0YgMi4wIHdlYmFwcCBiYXNlZCBvbiBNeUZhY2VzIENPREk8L2Rlc2NyaXB0aW9uPgotCi08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1jb2RpLWpzZjIwL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9MSUNFTlNFLnR4dCBiL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWNvZGktanNmMjAvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL0xJQ0VOU0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjQ1Njk1Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWNvZGktanNmMjAvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL0xJQ0VOU0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMjAyICswLDAgQEAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKLSAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8KLQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCi0KLSAgIDEuIERlZmluaXRpb25zLgotCi0gICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLAotICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuCi0KLSAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5Ci0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuCi0KLSAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwKLSAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24KLSAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCi0gICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUKLSAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yCi0gICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKLSAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuCi0KLSAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKLSAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuCi0KLSAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAotICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbgotICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4KLQotICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwKLSAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQKLSAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKLSAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4KLQotICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKLSAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGEKLSAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yawotICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KLQotICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdAotICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQotICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucwotICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMKLSAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgotICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLAotICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4KLQotICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcKLSAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMKLSAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQotICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcgotICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIKLSAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQKLSAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvCi0gICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAotICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUKLSAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dAotICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKLSAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIgotCi0gICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kCi0gICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4KLQotICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsCi0gICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUKLSAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCi0KLSAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKLSAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLAotICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCi0gICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQotICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXIKLSAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKLSAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91Ci0gICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQotICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yawotICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QKLSAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMKLSAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQotICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLgotCi0gICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQotICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0Ci0gICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQotICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0KLSAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yCi0gICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKLQotICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcwotICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAotCi0gICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MKLSAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCi0gICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywKLSAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mCi0gICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAotCi0gICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMKLSAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0Ci0gICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkCi0gICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90Ci0gICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCi0gICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQKLSAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yCi0gICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCi0gICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZAotICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cwotICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKLSAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbgotICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlCi0gICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCi0gICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkCi0gICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLgotCi0gICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQKLSAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMKLSAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKLSAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLAotICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoCi0gICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgotCi0gICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsCi0gICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKLSAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4KLSAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKLSAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkCi0gICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuCi0KLSAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUKLSAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwKLSAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQotICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuCi0KLSAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgotICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaAotICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zCi0gICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBCi0gICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKLSAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQotICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLgotCi0gICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwKLSAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLAotICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKLSAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlCi0gICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsCi0gICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKLSAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUKLSAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwKLSAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCi0gICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yCi0gICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCi0KLSAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcKLSAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsCi0gICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAotICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMKLSAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5Ci0gICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgotICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LAotICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5Ci0gICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCi0gICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4KLQotICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCi0KLSAgIEFQUEVORElYOiBIb3cgdG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yay4KLQotICAgICAgVG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yaywgYXR0YWNoIHRoZSBmb2xsb3dpbmcKLSAgICAgIGJvaWxlcnBsYXRlIG5vdGljZSwgd2l0aCB0aGUgZmllbGRzIGVuY2xvc2VkIGJ5IGJyYWNrZXRzICJbXSIKLSAgICAgIHJlcGxhY2VkIHdpdGggeW91ciBvd24gaWRlbnRpZnlpbmcgaW5mb3JtYXRpb24uIChEb24ndCBpbmNsdWRlCi0gICAgICB0aGUgYnJhY2tldHMhKSAgVGhlIHRleHQgc2hvdWxkIGJlIGVuY2xvc2VkIGluIHRoZSBhcHByb3ByaWF0ZQotICAgICAgY29tbWVudCBzeW50YXggZm9yIHRoZSBmaWxlIGZvcm1hdC4gV2UgYWxzbyByZWNvbW1lbmQgdGhhdCBhCi0gICAgICBmaWxlIG9yIGNsYXNzIG5hbWUgYW5kIGRlc2NyaXB0aW9uIG9mIHB1cnBvc2UgYmUgaW5jbHVkZWQgb24gdGhlCi0gICAgICBzYW1lICJwcmludGVkIHBhZ2UiIGFzIHRoZSBjb3B5cmlnaHQgbm90aWNlIGZvciBlYXNpZXIKLSAgICAgIGlkZW50aWZpY2F0aW9uIHdpdGhpbiB0aGlyZC1wYXJ0eSBhcmNoaXZlcy4KLQotICAgQ29weXJpZ2h0IFt5eXl5XSBbbmFtZSBvZiBjb3B5cmlnaHQgb3duZXJdCi0KLSAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCmRpZmYgLS1naXQgYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1jb2RpLWpzZjIwL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9OT1RJQ0UudHh0IGIvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtY29kaS1qc2YyMC9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvTk9USUNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmEzZGJkNi4uMDAwMDAwMAotLS0gYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1jb2RpLWpzZjIwL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9OT1RJQ0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotPT0gIE5PVElDRSBmaWxlIGNvcnJlc3BvbmRpbmcgdG8gc2VjdGlvbiA0KGQpIG9mIHRoZSBBcGFjaGUgTGljZW5zZSwgICA9PQotPT0gIFZlcnNpb24gMi4wLCBpbiB0aGlzIGNhc2UgZm9yIHRoZSBBcGFjaGUgTXlGYWNlcyBNYXZlbiBQbHVnaW5zICAgICA9PQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1UaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IAotVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4KLQotUG9ydGlvbnMgb2YgdGhpcyBzb2Z0d2FyZSB3ZXJlIG9yaWdpbmFsbHkgYmFzZWQgb24gdGhlIGZvbGxvd2luZzoKLQotIC0gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDYsIE9yYWNsZSBDb3JwLCA8aHR0cDovL3d3dy5vcmFjbGUuY29tLz4uCi1hbmQgYXJlIGxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiB1bmRlciB0aGUgCi0iU29mdHdhcmUgR3JhbnQgYW5kIENvcnBvcmF0ZSBDb250cmlidXRpb24gTGljZW5zZSBBZ3JlZW1lbnQiCi0KLVNlZSB0aGUgTElDRU5TRS50eHQgZmlsZSBmb3IgaW5mb3JtYXRpb24gb24gYWxsIGxpY2Vuc2VzIAotYXNzb2NpYXRlZCB3aXRoIHRoaXMgc29mdHdhcmUuCmRpZmYgLS1naXQgYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1jb2RpLWpzZjIwL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9tYXZlbi9hcmNoZXR5cGUtbWV0YWRhdGEueG1sIGIvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtY29kaS1qc2YyMC9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvbWF2ZW4vYXJjaGV0eXBlLW1ldGFkYXRhLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmE1YjRiOC4uMDAwMDAwMAotLS0gYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1jb2RpLWpzZjIwL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9tYXZlbi9hcmNoZXR5cGUtbWV0YWRhdGEueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLSAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gICAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gICAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gICAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICAgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICAgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICAgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgICB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPGFyY2hldHlwZS1kZXNjcmlwdG9yIHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9wbHVnaW5zL21hdmVuLWFyY2hldHlwZS1wbHVnaW4vYXJjaGV0eXBlLWRlc2NyaXB0b3IvMS4wLjAiCi0gICAgICAgICAgICAgICAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICAgICAgICAgICAgICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3BsdWdpbnMvbWF2ZW4tYXJjaGV0eXBlLXBsdWdpbi9hcmNoZXR5cGUtZGVzY3JpcHRvci8xLjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvYXJjaGV0eXBlLWRlc2NyaXB0b3ItMS4wLjAueHNkIgotCi0gICAgICAgICAgICAgICAgICAgICAgbmFtZT0ibXlmYWNlcy1hcmNoZXR5cGUtY29kaS1qc2YyMCIgcGFydGlhbD0iZmFsc2UiPgotCi0gIDxyZXF1aXJlZFByb3BlcnRpZXMvPgotCi0gIDxmaWxlU2V0cz4KLSAgICAgIDxmaWxlU2V0IGZpbHRlcmVkPSJ0cnVlIiBwYWNrYWdlZD0idHJ1ZSI+Ci0gICAgICAgICAgPGRpcmVjdG9yeT5zcmMvbWFpbi9qYXZhLzwvZGlyZWN0b3J5PgotICAgICAgPC9maWxlU2V0PgotICAgICAgPGZpbGVTZXQgZmlsdGVyZWQ9ImZhbHNlIiBwYWNrYWdlZD0iZmFsc2UiPgotICAgICAgICAgIDxkaXJlY3Rvcnk+c3JjL21haW4vd2ViYXBwLzwvZGlyZWN0b3J5PgotICAgICAgPC9maWxlU2V0PgotICA8L2ZpbGVTZXRzPgotCi0gIDxtb2R1bGVzLz4KLQotPC9hcmNoZXR5cGUtZGVzY3JpcHRvcj4KZGlmZiAtLWdpdCBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWNvZGktanNmMjAvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvcG9tLnhtbCBiL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWNvZGktanNmMjAvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGZkMjJlNi4uMDAwMDAwMAotLS0gYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1jb2RpLWpzZjIwL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMzEgKzAsMCBAQAotI3NldCggJHN5bWJvbF9wb3VuZCA9ICcjJyApCi0jc2V0KCAkc3ltYm9sX2RvbGxhciA9ICckJyApCi0jc2V0KCAkc3ltYm9sX2VzY2FwZSA9ICdcJyApCi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIgotICAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgotICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLSAgICA8Z3JvdXBJZD4ke2dyb3VwSWR9PC9ncm91cElkPgotICAgIDxhcnRpZmFjdElkPiR7YXJ0aWZhY3RJZH08L2FydGlmYWN0SWQ+Ci0gICAgPHBhY2thZ2luZz53YXI8L3BhY2thZ2luZz4KLSAgICA8dmVyc2lvbj4ke3ZlcnNpb259PC92ZXJzaW9uPgotICAgIDxuYW1lPkEgY3VzdG9tIHByb2plY3QgdXNpbmcgTXlGYWNlcyAyLjAsIE9wZW5XZWJCZWFucyBhbmQgTXlGYWNlcyBDT0RJPC9uYW1lPgotICAgIDx1cmw+aHR0cDovL3d3dy5teW9yZ2FuaXphdGlvbi5vcmc8L3VybD4KLQotICAgIDxwcm9wZXJ0aWVzPgotICAgICAgICA8anNmLW15ZmFjZXMudmVyc2lvbj4yLjAuNzwvanNmLW15ZmFjZXMudmVyc2lvbj4KLSAgICAgICAgPGpzZi1tb2phcnJhLnZlcnNpb24+Mi4wLjY8L2pzZi1tb2phcnJhLnZlcnNpb24+Ci0gICAgICAgIDxvcGVud2ViYmVhbnMudmVyc2lvbj4xLjEuMDwvb3BlbndlYmJlYW5zLnZlcnNpb24+Ci0gICAgICAgIDxjb2RpLnZlcnNpb24+MS4wLjE8L2NvZGkudmVyc2lvbj4KLSAgICAgICAgPG1hdmVuLmpldHR5LnBsdWdpbi52ZXJzaW9uPjYuMS4yMjwvbWF2ZW4uamV0dHkucGx1Z2luLnZlcnNpb24+Ci0gICAgPC9wcm9wZXJ0aWVzPgotCi0gICAgPGJ1aWxkPgotICAgICAgICA8ZmluYWxOYW1lPiR7YXJ0aWZhY3RJZH08L2ZpbmFsTmFtZT4KLSAgICAgICAgPHBsdWdpbnM+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1jb21waWxlci1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxzb3VyY2U+MS41PC9zb3VyY2U+Ci0gICAgICAgICAgICAgICAgICAgIDx0YXJnZXQ+MS41PC90YXJnZXQ+Ci0gICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgIDwvcGx1Z2lucz4KLSAgICA8L2J1aWxkPgotCi0gICAgPHByb2ZpbGVzPgotICAgICAgICA8cHJvZmlsZT4KLSAgICAgICAgICAgIDxpZD5teWZhY2VzPC9pZD4KLSAgICAgICAgICAgIDxhY3RpdmF0aW9uPgotICAgICAgICAgICAgICAgIDxwcm9wZXJ0eT4KLSAgICAgICAgICAgICAgICAgICAgPG5hbWU+IWpzZjwvbmFtZT4KLSAgICAgICAgICAgICAgICA8L3Byb3BlcnR5PgotICAgICAgICAgICAgPC9hY3RpdmF0aW9uPgotICAgICAgICAgICAgPGRlcGVuZGVuY2llcz4KLSAgICAgICAgICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmNvcmU8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtYXBpPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3N5bWJvbF9kb2xsYXJ9e2pzZi1teWZhY2VzLnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+Ci0gICAgICAgICAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICAgICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuY29yZTwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1pbXBsPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3N5bWJvbF9kb2xsYXJ9e2pzZi1teWZhY2VzLnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgICAgICAgICA8c2NvcGU+cnVudGltZTwvc2NvcGU+Ci0gICAgICAgICAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICAgICAgPC9kZXBlbmRlbmNpZXM+Ci0gICAgICAgIDwvcHJvZmlsZT4KLQotICAgICAgICA8cHJvZmlsZT4KLSAgICAgICAgICAgIDwhLS0gQWN0aXZhdGUgYnkgYWRkaW5nIC1EanNmPW1vamFycmEgLS0+Ci0gICAgICAgICAgICA8aWQ+bW9qYXJyYTwvaWQ+Ci0gICAgICAgICAgICA8YWN0aXZhdGlvbj4KLSAgICAgICAgICAgICAgICA8cHJvcGVydHk+Ci0gICAgICAgICAgICAgICAgICAgIDxuYW1lPmpzZjwvbmFtZT4KLSAgICAgICAgICAgICAgICAgICAgPHZhbHVlPm1vamFycmE8L3ZhbHVlPgotICAgICAgICAgICAgICAgIDwvcHJvcGVydHk+Ci0gICAgICAgICAgICA8L2FjdGl2YXRpb24+Ci0gICAgICAgICAgICA8ZGVwZW5kZW5jaWVzPgotICAgICAgICAgICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5jb20uc3VuLmZhY2VzPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qc2YtYXBpPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3N5bWJvbF9kb2xsYXJ9e2pzZi1tb2phcnJhLnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+Ci0gICAgICAgICAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICAgICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5jb20uc3VuLmZhY2VzPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qc2YtaW1wbDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtzeW1ib2xfZG9sbGFyfXtqc2YtbW9qYXJyYS52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPHNjb3BlPnJ1bnRpbWU8L3Njb3BlPgotICAgICAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDwvZGVwZW5kZW5jaWVzPgotICAgICAgICAgICAgPHJlcG9zaXRvcmllcz4KLSAgICAgICAgICAgICAgICA8cmVwb3NpdG9yeT4KLSAgICAgICAgICAgICAgICAgICAgPGlkPmphdmEubmV0PC9pZD4KLSAgICAgICAgICAgICAgICAgICAgPHVybD5odHRwOi8vZG93bmxvYWQuamF2YS5uZXQvbWF2ZW4vMjwvdXJsPgotICAgICAgICAgICAgICAgIDwvcmVwb3NpdG9yeT4KLSAgICAgICAgICAgIDwvcmVwb3NpdG9yaWVzPgotICAgICAgICA8L3Byb2ZpbGU+Ci0KLSAgICAgICAgPHByb2ZpbGU+Ci0gICAgICAgICAgICA8IS0tIFVzZSBtdm4gY2xlYW4gamV0dHk6cnVuLWV4cGxvZGVkIC1QamV0dHlDb25maWcgdG8gcnVuIHdpdGggamV0dHkgLS0+Ci0gICAgICAgICAgICA8aWQ+amV0dHlDb25maWc8L2lkPgotICAgICAgICAgICAgPGJ1aWxkPgotICAgICAgICAgICAgICAgIDxwbHVnaW5zPgotICAgICAgICAgICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgICAgICAgICAgPCEtLVRoaXMgcGx1Z2luIGFsbG93cyB0byBydW4gdGhlIHdhciB1c2luZyBtdm4gamV0dHk6cnVuIC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLm1vcnRiYXkuamV0dHk8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1qZXR0eS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3N5bWJvbF9kb2xsYXJ9e21hdmVuLmpldHR5LnBsdWdpbi52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzY2FuSW50ZXJ2YWxTZWNvbmRzPjEwPC9zY2FuSW50ZXJ2YWxTZWNvbmRzPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgICAgICAgICA8L3BsdWdpbnM+Ci0gICAgICAgICAgICA8L2J1aWxkPgotICAgICAgICA8L3Byb2ZpbGU+Ci0gICAgPC9wcm9maWxlcz4KLQotICAgIDwhLS0gUHJvamVjdCBkZXBlbmRlbmNpZXMgLS0+Ci0gICAgPGRlcGVuZGVuY2llcz4KLQotICAgICAgICA8IS0tIFNwZWNpZmljYXRpb25zIC0tPgotICAgICAgICA8IS0tIEpTUi0zMzAgLS0+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5nZXJvbmltby5zcGVjczwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmdlcm9uaW1vLWF0aW5qZWN0XzEuMF9zcGVjPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+MS4wPC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0KLSAgICAgICAgPCEtLSBKU1ItMjk5IC0tPgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZ2Vyb25pbW8uc3BlY3M8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5nZXJvbmltby1qY2RpXzEuMF9zcGVjPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+MS4wPC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIAotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZ2Vyb25pbW8uc3BlY3M8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5nZXJvbmltby1qdGFfMS4xX3NwZWM8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4xLjEuMTwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotCi0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5nZXJvbmltby5zcGVjczwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmdlcm9uaW1vLWludGVyY2VwdG9yXzEuMV9zcGVjPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+MS4wPC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmdlcm9uaW1vLnNwZWNzPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+Z2Vyb25pbW8tdmFsaWRhdGlvbl8xLjBfc3BlYzwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuMTwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotCi0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5nZXJvbmltby5zcGVjczwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmdlcm9uaW1vLWpwYV8xLjBfc3BlYzwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuMS4yPC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmdlcm9uaW1vLnNwZWNzPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+Z2Vyb25pbW8tc2VydmxldF8yLjVfc3BlYzwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuMjwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLQotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZ2Vyb25pbW8uc3BlY3M8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5nZXJvbmltby1lbF8xLjBfc3BlYzwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuMC4yPC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotCi0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+ZG9tNGo8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5kb200ajwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuNi4xPC92ZXJzaW9uPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0KLSAgICAgICAgPCEtLSBPcGVuV2ViQmVhbnMgLS0+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5vcGVud2ViYmVhbnM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5vcGVud2ViYmVhbnMtaW1wbDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7c3ltYm9sX2RvbGxhcn17b3BlbndlYmJlYW5zLnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPnJ1bnRpbWU8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm9wZW53ZWJiZWFuczwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm9wZW53ZWJiZWFucy1qc2Y8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke3N5bWJvbF9kb2xsYXJ9e29wZW53ZWJiZWFucy52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxzY29wZT5ydW50aW1lPC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotCi0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5vcGVud2ViYmVhbnM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5vcGVud2ViYmVhbnMtd2ViPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHtzeW1ib2xfZG9sbGFyfXtvcGVud2ViYmVhbnMudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+cnVudGltZTwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLQotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUub3BlbndlYmJlYW5zPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+b3BlbndlYmJlYW5zLXNwaTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7c3ltYm9sX2RvbGxhcn17b3BlbndlYmJlYW5zLnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPnJ1bnRpbWU8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm9wZW53ZWJiZWFuczwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm9wZW53ZWJiZWFucy1yZXNvdXJjZTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7c3ltYm9sX2RvbGxhcn17b3BlbndlYmJlYW5zLnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPnJ1bnRpbWU8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0KLSAgICAgICAgCi0gICAgICAgIDwhLS0gTXlGYWNlcyBDT0RJIC0tPgotICAgICAgICA8IS0tIHRoZSBKU0YgaW5kZXBlbmRlbnQgY29yZSAtLT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy5jZGkuY29yZTwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0Y2RpLWNvcmUtYXBpPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHtzeW1ib2xfZG9sbGFyfXtjb2RpLnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMuY2RpLmNvcmU8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dGNkaS1jb3JlLWltcGw8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke3N5bWJvbF9kb2xsYXJ9e2NvZGkudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+cnVudGltZTwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLQotICAgICAgICA8IS0tIHRoZSBKU0YtMi4wIHNwZWNpZmljIGxpYnJhcnksIHdoaWNoIGluY2x1ZGVzIHRoZSBKU0YtMS4yIHBhcnRzIC0tPgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLmNkaS5tb2R1bGVzPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHRjZGktanNmMjAtbW9kdWxlLWFwaTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7c3ltYm9sX2RvbGxhcn17Y29kaS52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLmNkaS5tb2R1bGVzPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHRjZGktanNmMjAtbW9kdWxlLWltcGw8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke3N5bWJvbF9kb2xsYXJ9e2NvZGkudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+cnVudGltZTwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLQotICAgICAgICA8IS0tIHRoZSBCVi0xLjAgc3BlY2lmaWMgbGlicmFyeSAtLT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy5jZGkubW9kdWxlczwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0Y2RpLWJ2MS1tb2R1bGUtYXBpPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHtzeW1ib2xfZG9sbGFyfXtjb2RpLnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMuY2RpLm1vZHVsZXM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dGNkaS1idjEtbW9kdWxlLWltcGw8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke3N5bWJvbF9kb2xsYXJ9e2NvZGkudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+cnVudGltZTwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLQotICAgICAgICA8IS0tIENPREkgSlBBLTEuMCBNb2R1bGUgLS0+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMuY2RpLm1vZHVsZXM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dGNkaS1qcGExLW1vZHVsZS1hcGk8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke3N5bWJvbF9kb2xsYXJ9e2NvZGkudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy5jZGkubW9kdWxlczwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0Y2RpLWpwYTEtbW9kdWxlLWltcGw8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke3N5bWJvbF9kb2xsYXJ9e2NvZGkudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+cnVudGltZTwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLQotICAgICAgICA8IS0tIENPREktSTE4TiBNZXNzYWdlIE1vZHVsZSAtLT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy5jZGkubW9kdWxlczwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0Y2RpLW1lc3NhZ2UtbW9kdWxlLWFwaTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7c3ltYm9sX2RvbGxhcn17Y29kaS52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLmNkaS5tb2R1bGVzPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHRjZGktbWVzc2FnZS1tb2R1bGUtaW1wbDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7c3ltYm9sX2RvbGxhcn17Y29kaS52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxzY29wZT5ydW50aW1lPC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotCi0gICAgICAgIDwhLS0gQ09ESS1TY3JpcHRpbmcgTW9kdWxlIC0tPgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLmNkaS5tb2R1bGVzPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHRjZGktc2NyaXB0aW5nLW1vZHVsZS1hcGk8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke3N5bWJvbF9kb2xsYXJ9e2NvZGkudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy5jZGkubW9kdWxlczwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0Y2RpLXNjcmlwdGluZy1tb2R1bGUtaW1wbDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7c3ltYm9sX2RvbGxhcn17Y29kaS52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxzY29wZT5ydW50aW1lPC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotCi0gICAgICAgIDwhLS0gT1BUSU9OQUw6IHVzZSB0aGUgYWxsLWluLW9uZSBqYXIgaW5zdGVhZCBvZiB0aGUgaW5kaXZpZHVhbCBDT0RJIG1vZHVsZSBkZXBlbmRlbmNpZXMgLS0+Ci0gICAgICAgIDwhLS1kZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMuY2RpLmJ1bmRsZXM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dGNkaS1idW5kbGUtanNmMjA8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke3N5bWJvbF9kb2xsYXJ9e2NvZGkudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeS0tPgotCi0gICAgICAgIDwhLS0gdGVzdCBkZXBlbmRlbmNpZXMgLS0+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+anVuaXQ8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5qdW5pdDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPjQuOC4xPC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPC9kZXBlbmRlbmNpZXM+Ci0KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWNvZGktanNmMjAvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc3JjL21haW4vamF2YS9HcmVldGluZ1NlcnZpY2UuamF2YSBiL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWNvZGktanNmMjAvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc3JjL21haW4vamF2YS9HcmVldGluZ1NlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQwMjc1OS4uMDAwMDAwMAotLS0gYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1jb2RpLWpzZjIwL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL2phdmEvR3JlZXRpbmdTZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0jc2V0KCAkc3ltYm9sX3BvdW5kID0gJyMnICkKLSNzZXQoICRzeW1ib2xfZG9sbGFyID0gJyQnICkKLSNzZXQoICRzeW1ib2xfZXNjYXBlID0gJ1wnICkKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotKi8KLXBhY2thZ2UgJHtwYWNrYWdlfTsKLQotaW1wb3J0IGphdmF4LmluamVjdC5OYW1lZDsKLWltcG9ydCBqYXZheC5lbnRlcnByaXNlLmNvbnRleHQuQXBwbGljYXRpb25TY29wZWQ7Ci0KLUBOYW1lZAotQEFwcGxpY2F0aW9uU2NvcGVkCi1wdWJsaWMgY2xhc3MgR3JlZXRpbmdTZXJ2aWNlCi17Ci0gICAgcHVibGljIFN0cmluZyBjcmVhdGVHcmVldGluZyhTdHJpbmcgbmFtZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiAiSGVsbG8gIiArIG5hbWUgKyAiLiBXZSBob3BlIHlvdSBlbmpveSBBcGFjaGUgTXlGYWNlcyEiOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtY29kaS1qc2YyMC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zcmMvbWFpbi9qYXZhL0hlbGxvV29ybGRDb250cm9sbGVyLmphdmEgYi9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1jb2RpLWpzZjIwL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL2phdmEvSGVsbG9Xb3JsZENvbnRyb2xsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDM4N2ZlZi4uMDAwMDAwMAotLS0gYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1jb2RpLWpzZjIwL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL2phdmEvSGVsbG9Xb3JsZENvbnRyb2xsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLSNzZXQoICRzeW1ib2xfcG91bmQgPSAnIycgKQotI3NldCggJHN5bWJvbF9kb2xsYXIgPSAnJCcgKQotI3NldCggJHN5bWJvbF9lc2NhcGUgPSAnXCcgKQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0qLwotcGFja2FnZSAke3BhY2thZ2V9OwotCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci0KLWltcG9ydCBqYXZheC5pbmplY3QuTmFtZWQ7Ci1pbXBvcnQgamF2YXguaW5qZWN0LkluamVjdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLmNkaS5jb3JlLmFwaS5zY29wZS5jb252ZXJzYXRpb24uV2luZG93U2NvcGVkOwotCi0vKioKLSAqIEEgdHlwaWNhbCBzaW1wbGUgYmFja2luZyBiZWFuLCB0aGF0IGlzIGJhY2tlZCB0byA8Y29kZT5oZWxsb1dvcmxkLnhodG1sPC9jb2RlPgotICovCi1ATmFtZWQoImhlbGxvV29ybGQiKQotQFdpbmRvd1Njb3BlZAotcHVibGljIGNsYXNzIEhlbGxvV29ybGRDb250cm9sbGVyIGltcGxlbWVudHMgU2VyaWFsaXphYmxlCi17Ci0KLSAgICAvL3Byb3BlcnRpZXMKLSAgICBwcml2YXRlIFN0cmluZyBuYW1lOwotICAgIEBJbmplY3QgcHJpdmF0ZSBHcmVldGluZ1NlcnZpY2UgZ3JlZXRpbmdTZXJ2aWNlOwotCi0gICAgLyoqCi0gICAgICogZGVmYXVsdCBlbXB0eSBjb25zdHJ1Y3RvcgotICAgICAqLwotICAgIHB1YmxpYyBIZWxsb1dvcmxkQ29udHJvbGxlcigpCi0gICAgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIE1ldGhvZCB0aGF0IGlzIGJhY2tlZCB0byBhIHN1Ym1pdCBidXR0b24gb2YgYSBmb3JtLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgc2VuZCgpCi0gICAgewotICAgICAgICAvL2RvIHJlYWwgbG9naWMsIHJldHVybiBhIHN0cmluZyB3aGljaCB3aWxsIGJlIHVzZWQgZm9yIHRoZSBuYXZpZ2F0aW9uIHN5c3RlbSBvZiBKU0YKLSAgICAgICAgcmV0dXJuICJwYWdlMi54aHRtbCI7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRHcmVldGluZygpCi0gICAgewotICAgICAgICByZXR1cm4gZ3JlZXRpbmdTZXJ2aWNlLmNyZWF0ZUdyZWV0aW5nKG5hbWUpOwotICAgIH0KLQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLWdldHRlciAmIHNldHRlcgotCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBuYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpCi0gICAgewotICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtY29kaS1qc2YyMC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9iZWFucy54bWwgYi9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1jb2RpLWpzZjIwL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL2JlYW5zLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjFlZTAyYS4uMDAwMDAwMAotLS0gYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1jb2RpLWpzZjIwL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL2JlYW5zLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPGJlYW5zLz4KLQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtY29kaS1qc2YyMC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9mYWNlcy1jb25maWcueG1sIGIvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtY29kaS1qc2YyMC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9mYWNlcy1jb25maWcueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MGVlYmFiLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWNvZGktanNmMjAvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvZmFjZXMtY29uZmlnLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCEtLQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPGZhY2VzLWNvbmZpZyB2ZXJzaW9uPSIyLjAiCi0gICAgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIKLSAgICB4bWxuczp4aT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YSW5jbHVkZSIKLSAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS93ZWItZmFjZXNjb25maWdfMl8wLnhzZCI+Ci0KLTwvZmFjZXMtY29uZmlnPgpkaWZmIC0tZ2l0IGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtY29kaS1qc2YyMC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sIGIvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtY29kaS1qc2YyMC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjc2ZmFkLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWNvZGktanNmMjAvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEzOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhLS0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTx3ZWItYXBwIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiCi0gICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS93ZWItYXBwXzJfNS54c2QiCi0gICAgICAgIHZlcnNpb249IjIuNSI+Ci0KLSAgICA8ZGVzY3JpcHRpb24+TXlQcm9qZWN0IHdlYi54bWw8L2Rlc2NyaXB0aW9uPgotCi0gICAgPCEtLSBKU0Ygc3RhbmRhcmQgcGFyYW1ldGVycyAtLT4KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPlByb2plY3Qgc3RhZ2UgZm9yIHRoZSBhcHBsaWNhdGlvbiAobmV3IGluIDIuMCkuIEV4cGVjdHMgb25lIG9mCi0gICAgICAgICAgICB0aGUgZm9sbG93aW5nIHZhbHVlczogRGV2ZWxvcG1lbnQsIFByb2R1Y3Rpb24sIFN5c3RlbVRlc3QsIFVuaXRUZXN0Ci0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPmphdmF4LmZhY2VzLlBST0pFQ1RfU1RBR0U8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT5EZXZlbG9wbWVudDwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICBJZiB0aGlzIHBhcmFtZXRlciBpcyBzZXQgdG8gdHJ1ZSBhbmQgdGhlIHN1Ym1pdHRlZCB2YWx1ZSBvZiBhIGNvbXBvbmVudCBpcwotICAgICAgICAgICAgdGhlIGVtcHR5IHN0cmluZywgdGhlIHN1Ym1pdHRlZCB2YWx1ZSB3aWxsIGJlIHNldCB0byBudWxsCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPmphdmF4LmZhY2VzLklOVEVSUFJFVF9FTVBUWV9TVFJJTkdfU1VCTUlUVEVEX1ZBTFVFU19BU19OVUxMPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+U3RhdGUgc2F2aW5nIG1ldGhvZDogImNsaWVudCIgb3IgInNlcnZlciIgKD0gZGVmYXVsdCkKLSAgICAgICAgICAgIFNlZSBKU0YgU3BlY2lmaWNhdGlvbiAyLjUuMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPmphdmF4LmZhY2VzLlNUQVRFX1NBVklOR19NRVRIT0Q8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT5jbGllbnQ8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLQotICAgIDwhLS0gTXlGYWNlcyBzcGVjaWZpYyBwYXJhbWV0ZXJzIC0tPgotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+T25seSBhcHBsaWNhYmxlIGlmIHN0YXRlIHNhdmluZyBtZXRob2QgaXMgInNlcnZlciIgKD0gZGVmYXVsdCkuCi0gICAgICAgICAgICBEZWZpbmVzIHRoZSBhbW91bnQgKGRlZmF1bHQgPSAyMCkgb2YgdGhlIGxhdGVzdCB2aWV3cyBhcmUgc3RvcmVkIGluIHNlc3Npb24uPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLk5VTUJFUl9PRl9WSUVXU19JTl9TRVNTSU9OPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+MjA8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPk9ubHkgYXBwbGljYWJsZSBpZiBzdGF0ZSBzYXZpbmcgbWV0aG9kIGlzICJzZXJ2ZXIiICg9IGRlZmF1bHQpLgotICAgICAgICAgICAgSWYgdHJ1ZSAoZGVmYXVsdCkgdGhlIHN0YXRlIHdpbGwgYmUgc2VyaWFsaXplZCB0byBhIGJ5dGUgc3RyZWFtIGJlZm9yZSBpdAotICAgICAgICAgICAgaXMgd3JpdHRlbiB0byB0aGUgc2Vzc2lvbi4KLSAgICAgICAgICAgIElmIGZhbHNlIHRoZSBzdGF0ZSB3aWxsIG5vdCBiZSBzZXJpYWxpemVkIHRvIGEgYnl0ZSBzdHJlYW0uPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLlNFUklBTElaRV9TVEFURV9JTl9TRVNTSU9OPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+T25seSBhcHBsaWNhYmxlIGlmIHN0YXRlIHNhdmluZyBtZXRob2QgaXMgInNlcnZlciIgKD0gZGVmYXVsdCkgYW5kIGlmCi0gICAgICAgICAgICBvcmcuYXBhY2hlLm15ZmFjZXMuU0VSSUFMSVpFX1NUQVRFX0lOX1NFU1NJT04gaXMgdHJ1ZSAoPSBkZWZhdWx0KQotICAgICAgICAgICAgSWYgdHJ1ZSAoZGVmYXVsdCkgdGhlIHNlcmlhbGl6ZWQgc3RhdGUgd2lsbCBiZSBjb21wcmVzc2VkIGJlZm9yZSBpdAotICAgICAgICAgICAgaXMgd3JpdHRlbiB0byB0aGUgc2Vzc2lvbi4gSWYgZmFsc2UgdGhlIHN0YXRlIHdpbGwgbm90IGJlIGNvbXByZXNzZWQuPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLkNPTVBSRVNTX1NUQVRFX0lOX1NFU1NJT048L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT50cnVlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5UaGlzIHBhcmFtZXRlciB0ZWxscyBNeUZhY2VzIGlmIGphdmFzY3JpcHQgY29kZSBzaG91bGQgYmUgYWxsb3dlZCBpbiB0aGUKLSAgICAgICAgICAgIHJlbmRlcmVkIEhUTUwgb3V0cHV0LgotICAgICAgICAgICAgSWYgamF2YXNjcmlwdCBpcyBhbGxvd2VkLCBjb21tYW5kX2xpbmsgYW5jaG9ycyB3aWxsIGhhdmUgamF2YXNjcmlwdCBjb2RlCi0gICAgICAgICAgICB0aGF0IHN1Ym1pdHMgdGhlIGNvcnJlc3BvbmRpbmcgZm9ybS4KLSAgICAgICAgICAgIElmIGphdmFzY3JpcHQgaXMgbm90IGFsbG93ZWQsIHRoZSBzdGF0ZSBzYXZpbmcgaW5mbyBhbmQgbmVzdGVkIHBhcmFtZXRlcnMKLSAgICAgICAgICAgIHdpbGwgYmUgYWRkZWQgYXMgdXJsIHBhcmFtZXRlcnMuCi0gICAgICAgICAgICBEZWZhdWx0OiAidHJ1ZSI8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuQUxMT1dfSkFWQVNDUklQVDwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPnRydWU8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLkRFVEVDVF9KQVZBU0NSSVBUPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+ZmFsc2U8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPklmIHRydWUsIHJlbmRlcmVkIEhUTUwgY29kZSB3aWxsIGJlIGZvcm1hdHRlZCwgc28gdGhhdCBpdCBpcyAiaHVtYW4gcmVhZGFibGUiLgotICAgICAgICAgICAgaS5lLiBhZGRpdGlvbmFsIGxpbmUgc2VwYXJhdG9ycyBhbmQgd2hpdGVzcGFjZSB3aWxsIGJlIHdyaXR0ZW4sIHRoYXQgZG8gbm90Ci0gICAgICAgICAgICBpbmZsdWVuY2UgdGhlIEhUTUwgY29kZS4KLSAgICAgICAgICAgIERlZmF1bHQ6ICJ0cnVlIjwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5QUkVUVFlfSFRNTDwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPnRydWU8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPklmIHRydWUsIGEgamF2YXNjcmlwdCBmdW5jdGlvbiB3aWxsIGJlIHJlbmRlcmVkIHRoYXQgaXMgYWJsZSB0byByZXN0b3JlIHRoZQotICAgICAgICAgICAgZm9ybWVyIHZlcnRpY2FsIHNjcm9sbCBvbiBldmVyeSByZXF1ZXN0LiBDb252ZW5pZW50IGZlYXR1cmUgaWYgeW91IGhhdmUgcGFnZXMKLSAgICAgICAgICAgIHdpdGggbG9uZyBsaXN0cyBhbmQgeW91IGRvIG5vdCB3YW50IHRoZSBicm93c2VyIHBhZ2UgdG8gYWx3YXlzIGp1bXAgdG8gdGhlIHRvcAotICAgICAgICAgICAgaWYgeW91IHRyaWdnZXIgYSBsaW5rIG9yIGJ1dHRvbiBhY3Rpb24gdGhhdCBzdGF5cyBvbiB0aGUgc2FtZSBwYWdlLgotICAgICAgICAgICAgRGVmYXVsdDogImZhbHNlIjwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5BVVRPX1NDUk9MTDwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPnRydWU8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPlVzZWQgZm9yIGVuY3J5cHRpbmcgdmlldyBzdGF0ZS4gT25seSByZWxldmFudCBmb3IgY2xpZW50IHNpZGUKLSAgICAgICAgICAgIHN0YXRlIHNhdmluZy4gU2VlIE15RmFjZXMgd2lraS93ZWIgc2l0ZSBkb2N1bWVudGF0aW9uIGZvciBpbnN0cnVjdGlvbnMKLSAgICAgICAgICAgIG9uIGhvdyB0byBjb25maWd1cmUgYW4gYXBwbGljYXRpb24gZm9yIGRpZmZlbmVudCBlbmNyeXB0aW9uIHN0cmVuZ3Rocy4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLlNFQ1JFVDwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPk56WTFORE15TVRBPTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotCi0gICAgPCEtLSBGYWNlcyBTZXJ2bGV0IC0tPgotICAgIDxzZXJ2bGV0PgotICAgICAgICA8c2VydmxldC1uYW1lPkZhY2VzIFNlcnZsZXQ8L3NlcnZsZXQtbmFtZT4KLSAgICAgICAgPHNlcnZsZXQtY2xhc3M+amF2YXguZmFjZXMud2ViYXBwLkZhY2VzU2VydmxldDwvc2VydmxldC1jbGFzcz4KLSAgICAgICAgPGxvYWQtb24tc3RhcnR1cD4xPC9sb2FkLW9uLXN0YXJ0dXA+Ci0gICAgPC9zZXJ2bGV0PgotCi0gICAgPCEtLSBGYWNlcyBTZXJ2bGV0IE1hcHBpbmcgLS0+Ci0gICAgPHNlcnZsZXQtbWFwcGluZz4KLSAgICAgICAgPHNlcnZsZXQtbmFtZT5GYWNlcyBTZXJ2bGV0PC9zZXJ2bGV0LW5hbWU+Ci0gICAgICAgIDx1cmwtcGF0dGVybj4qLnhodG1sPC91cmwtcGF0dGVybj4KLSAgICA8L3NlcnZsZXQtbWFwcGluZz4KLQotICAgIDwhLS0gV2VsY29tZSBmaWxlcyAtLT4KLSAgICA8d2VsY29tZS1maWxlLWxpc3Q+Ci0gICAgICAgIDx3ZWxjb21lLWZpbGU+aW5kZXguaHRtbDwvd2VsY29tZS1maWxlPgotICAgIDwvd2VsY29tZS1maWxlLWxpc3Q+Ci0KLSAgICA8IS0tIExpc3RlbmVyIGZvciBPcGVuV2ViQmVhbnMgY29uZmlndXJhdGlvbiAtLT4KLSAgICA8bGlzdGVuZXI+Ci0gICAgICAgIDxsaXN0ZW5lci1jbGFzcz4KLSAgICAgICAgICAgIG9yZy5hcGFjaGUud2ViYmVhbnMuc2VydmxldC5XZWJCZWFuc0NvbmZpZ3VyYXRpb25MaXN0ZW5lcgotICAgICAgICA8L2xpc3RlbmVyLWNsYXNzPgotICAgIDwvbGlzdGVuZXI+Ci0KLTwvd2ViLWFwcD4KZGlmZiAtLWdpdCBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWNvZGktanNmMjAvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc3JjL21haW4vd2ViYXBwL2hlbGxvV29ybGQueGh0bWwgYi9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1jb2RpLWpzZjIwL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL3dlYmFwcC9oZWxsb1dvcmxkLnhodG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YmEyZjk1Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWNvZGktanNmMjAvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc3JjL21haW4vd2ViYXBwL2hlbGxvV29ybGQueGh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICAgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gICAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICAgIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICAgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gICAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gICAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gICAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICAgIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIKLSAgICAgIHhtbG5zOmg9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2h0bWwiCi0gICAgICB4bWxuczpmPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9jb3JlIj4KLTxoOmhlYWQ+Ci0gICAgPHRpdGxlPkhlbGxvIFdvcmxkPC90aXRsZT4KLTwvaDpoZWFkPgotPGg6Ym9keT4KLSAgICA8aDpvdXRwdXRTdHlsZXNoZWV0IG5hbWU9InN0eWxlLmNzcyIgbGlicmFyeT0iY3NzIi8+Ci0gICAgPGRpdiBpZD0iY29udGFpbmVyIj4KLSAgICAgICAgPGgxPk15RmFjZXMgSGVsbG8gV29ybGQ8L2gxPgotICAgICAgICA8aDpmb3JtIGlkPSJtYWluRm9ybSI+Ci0gICAgICAgICAgICA8aDpwYW5lbEdyaWQgY29sdW1ucz0iMiI+Ci0gICAgICAgICAgICAgICAgPGg6b3V0cHV0TGFiZWwgZm9yPSJuYW1lIiB2YWx1ZT0iUGxlYXNlIGVudGVyIHlvdXIgbmFtZSIvPgotICAgICAgICAgICAgICAgIDxoOmlucHV0VGV4dCBpZD0ibmFtZSIgdmFsdWU9IiN7aGVsbG9Xb3JsZC5uYW1lfSIgcmVxdWlyZWQ9InRydWUiLz4KLSAgICAgICAgICAgICAgICA8aDpjb21tYW5kQnV0dG9uIHZhbHVlPSJQcmVzcyBtZSIgYWN0aW9uPSIje2hlbGxvV29ybGQuc2VuZH0iLz4KLSAgICAgICAgICAgICAgICA8aDptZXNzYWdlcyBzaG93RGV0YWlsPSJ0cnVlIiBzaG93U3VtbWFyeT0iZmFsc2UiLz4KLSAgICAgICAgICAgIDwvaDpwYW5lbEdyaWQ+Ci0gICAgICAgIDwvaDpmb3JtPgotICAgIDwvZGl2PgotPC9oOmJvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1jb2RpLWpzZjIwL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL3dlYmFwcC9pbmRleC5odG1sIGIvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtY29kaS1qc2YyMC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zcmMvbWFpbi93ZWJhcHAvaW5kZXguaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjRmMmIzMi4uMDAwMDAwMAotLS0gYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1jb2RpLWpzZjIwL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL3dlYmFwcC9pbmRleC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotPCEtLQotICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICAgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gICAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICAgIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICAgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gICAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gICAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gICAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICAgIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08aHRtbD4KLTxoZWFkPgotICAgIDxtZXRhIGh0dHAtZXF1aXY9InJlZnJlc2giIGNvbnRlbnQ9IjA7IFVSTD1oZWxsb1dvcmxkLnhodG1sIj4KLTwvaGVhZD4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWNvZGktanNmMjAvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc3JjL21haW4vd2ViYXBwL3BhZ2UyLnhodG1sIGIvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtY29kaS1qc2YyMC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zcmMvbWFpbi93ZWJhcHAvcGFnZTIueGh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmMmRmNmQuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtY29kaS1qc2YyMC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zcmMvbWFpbi93ZWJhcHAvcGFnZTIueGh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICAgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gICAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICAgIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICAgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gICAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gICAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gICAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICAgIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIKLSAgICAgIHhtbG5zOmg9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2h0bWwiCi0gICAgICB4bWxuczpmPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9jb3JlIj4KLTxoOmhlYWQ+Ci0gICAgPHRpdGxlPkhlbGxvIFdvcmxkPC90aXRsZT4KLTwvaDpoZWFkPgotPGg6Ym9keT4KLSAgICA8aDpvdXRwdXRTdHlsZXNoZWV0IG5hbWU9InN0eWxlLmNzcyIgbGlicmFyeT0iY3NzIi8+Ci0gICAgPGRpdiBpZD0iY29udGFpbmVyIj4KLSAgICAgICAgPGgxPk15RmFjZXMgSGVsbG8gV29ybGQ8L2gxPgotICAgICAgICA8aDpvdXRwdXRUZXh0IHZhbHVlPSIje2hlbGxvV29ybGQuZ3JlZXRpbmd9Ii8+Ci0gICAgICAgIDxici8+Ci0gICAgICAgIDxoOmxpbmsgdmFsdWU9IkhvbWUiIG91dGNvbWU9ImhlbGxvV29ybGQiLz4KLSAgICA8L2Rpdj4KLTwvaDpib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtY29kaS1qc2YyMC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zcmMvbWFpbi93ZWJhcHAvcmVzb3VyY2VzL2Nzcy9zdHlsZS5jc3MgYi9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1jb2RpLWpzZjIwL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL3dlYmFwcC9yZXNvdXJjZXMvY3NzL3N0eWxlLmNzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWZiOTk0MS4uMDAwMDAwMAotLS0gYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1jb2RpLWpzZjIwL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL3dlYmFwcC9yZXNvdXJjZXMvY3NzL3N0eWxlLmNzcworKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1ib2R5IHsKLSAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMCwgMzUsIDc1KTsKLSAgICBmb250LWZhbWlseTogdGFob21hLCBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotICAgIGZvbnQtc2l6ZTogMTJweDsKLX0KLQotI2NvbnRhaW5lciB7Ci0gICAgbWFyZ2luOiAxMHB4IGF1dG87Ci0gICAgd2lkdGg6IDkwMHB4OwotICAgIGJhY2tncm91bmQtY29sb3I6IHdoaXRlOwotICAgIHBhZGRpbmc6IDNweDsKLX0KLQotaDEgewotICAgIGZvbnQtc2l6ZTogMjBweDsKLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWNvZGktanNmMjAvc3JjL3NpdGUvYXB0L2luZGV4LmFwdCBiL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWNvZGktanNmMjAvc3JjL3NpdGUvYXB0L2luZGV4LmFwdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjI3YTAwMi4uMDAwMDAwMAotLS0gYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1jb2RpLWpzZjIwL3NyYy9zaXRlL2FwdC9pbmRleC5hcHQKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0gLS0tLS0tCi0gTXlGYWNlcyBDT0RJIEpTRiAyLjAgQXJjaGV0eXBlCi0gLS0tLS0tCi0KLU92ZXJ2aWV3Ci0KLSAgVGhpcyBwcm9qZWN0IGRlZmluZXMgYSBNYXZlbiBhcmNoZXR5cGUuIFJ1bm5pbmcgdGhlIGFyY2hldHlwZSBwbHVnaW4gd2l0aCB0aGlzIGFyY2hldHlwZSB3aWxsCi0gIGNyZWF0ZSBhIGRpcmVjdG9yeSB0cmVlIGNvbnRhaW5pbmcgdGhlIGZpbGVzIG5lZWRlZCB0byBxdWlja2x5IGdldCBzdGFydGVkIG9uIGEgbmV3IEpTRiAyLjAKLSAgcHJvamVjdCB1c2luZyBNeUZhY2VzIENPREkgYW5kIEFwYWNoZSBPcGVuV2ViQmVhbnMuCi0KLVVzYWdlCi0KLSAgVXNlIHRoZSBmb2xsb3dpbmcgbWF2ZW4gY29tbWFuZCBhbmQgdGhlbiBzZWxlY3QgbXlmYWNlcy1hcmNoZXR5cGUtY29kaS1qc2YyMCBmcm9tIHRoZSBvcHRpb25zLgotCi0KLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi1tdm4gYXJjaGV0eXBlOmdlbmVyYXRlIC1EYXJjaGV0eXBlQ2F0YWxvZz1odHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnCi0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwpkaWZmIC0tZ2l0IGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtY29yZS1pbnRlZ3JhdGlvbi10ZXN0L3BvbS54bWwgYi9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1jb3JlLWludGVncmF0aW9uLXRlc3QvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Q5NjM3Ni4uMDAwMDAwMAotLS0gYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1jb3JlLWludGVncmF0aW9uLXRlc3QvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICAgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICAgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gICAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICAgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gICAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gICAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gICAgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgotCi0gICAgPHBhcmVudD4KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHM8L2dyb3VwSWQ+Ci0gICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtYXJjaGV0eXBlLXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPHZlcnNpb24+MS4wLjQtU05BUFNIT1Q8L3ZlcnNpb24+Ci0gICAgPC9wYXJlbnQ+Ci0KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHM8L2dyb3VwSWQ+Ci0gICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1hcmNoZXR5cGUtY29yZS1pbnRlZ3JhdGlvbi10ZXN0PC9hcnRpZmFjdElkPgotICAgIDxwYWNrYWdpbmc+amFyPC9wYWNrYWdpbmc+IDwhLS0gbWF2ZW4tYXJjaGV0eXBlIC0tPgotICAgIDxuYW1lPk15RmFjZXMgQ29yZSBJbnRlZ3JhdGlvbiBUZXN0IEFyY2hldHlwZTwvbmFtZT4KLQotICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgQXJjaGV0eXBlIHRvIGNyZWF0ZSBhIG5ldyBNeUZhY2VzIGNvcmUgcHJvamVjdCB1c2VkIGZvciBpbnRlZ3JhdGlvbiB0ZXN0cyB2aWEgY2FyZ28gYW5kIEh0bWxVbml0LgotICAgICAgICBQcm9qZWN0cyBjcmVhdGVkIHZpYSB0aGlzIGFyY2hldHlwZSBhaW0gdG8gdGVzdCBzcGVjaWZpYyBpc3N1ZXMgZnJvbSB0aGUgTXlGYWNlcyBjb3JlIEpJUkEgaXNzdWUKLSAgICAgICAgdHJhY2tlciBhbmQgY2FuIGJlIGRpcmVjdGx5IGFkZGVkIHRvIHRoZSBNeUZhY2VzIGNvcmUgaW50ZWdyYXRpb24tdGVzdHMgbW9kdWxlLgotICAgIDwvZGVzY3JpcHRpb24+Ci0KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWNvcmUtaW50ZWdyYXRpb24tdGVzdC9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvTElDRU5TRS50eHQgYi9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1jb3JlLWludGVncmF0aW9uLXRlc3Qvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL0xJQ0VOU0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjQ1Njk1Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWNvcmUtaW50ZWdyYXRpb24tdGVzdC9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvTElDRU5TRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwyMDIgKzAsMCBAQAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNAotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLwotCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04KLQotICAgMS4gRGVmaW5pdGlvbnMuCi0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4KLQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4KLQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbgotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwKLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3IKLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KLQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KLQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLgotCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dAotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLAotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgotCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcgotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLgotCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0Ci0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3NlcwotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLgotCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZwotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucwotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5Ci0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIgotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0Ci0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCi0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLgotCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4KLQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywKLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcgotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcwotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCi0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91Ci0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3IKLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZAotCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kCi0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3JrcwotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQKLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YKLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kCi0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cwotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QKLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QKLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUKLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3IKLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwKLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZAotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUKLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQKLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuCi0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucwotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcgotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgKLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuCi0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwKLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yawotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLgotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4KLQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLAotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KLQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEEKLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55Ci0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuCi0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLAotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwKLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KLQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZwotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwKLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcwotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkKLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkKLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgotCi0gICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKLQotICAgQVBQRU5ESVg6IEhvdyB0byBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLgotCi0gICAgICBUbyBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLCBhdHRhY2ggdGhlIGZvbGxvd2luZwotICAgICAgYm9pbGVycGxhdGUgbm90aWNlLCB3aXRoIHRoZSBmaWVsZHMgZW5jbG9zZWQgYnkgYnJhY2tldHMgIltdIgotICAgICAgcmVwbGFjZWQgd2l0aCB5b3VyIG93biBpZGVudGlmeWluZyBpbmZvcm1hdGlvbi4gKERvbid0IGluY2x1ZGUKLSAgICAgIHRoZSBicmFja2V0cyEpICBUaGUgdGV4dCBzaG91bGQgYmUgZW5jbG9zZWQgaW4gdGhlIGFwcHJvcHJpYXRlCi0gICAgICBjb21tZW50IHN5bnRheCBmb3IgdGhlIGZpbGUgZm9ybWF0LiBXZSBhbHNvIHJlY29tbWVuZCB0aGF0IGEKLSAgICAgIGZpbGUgb3IgY2xhc3MgbmFtZSBhbmQgZGVzY3JpcHRpb24gb2YgcHVycG9zZSBiZSBpbmNsdWRlZCBvbiB0aGUKLSAgICAgIHNhbWUgInByaW50ZWQgcGFnZSIgYXMgdGhlIGNvcHlyaWdodCBub3RpY2UgZm9yIGVhc2llcgotICAgICAgaWRlbnRpZmljYXRpb24gd2l0aGluIHRoaXJkLXBhcnR5IGFyY2hpdmVzLgotCi0gICBDb3B5cmlnaHQgW3l5eXldIFtuYW1lIG9mIGNvcHlyaWdodCBvd25lcl0KLQotICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KZGlmZiAtLWdpdCBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWNvcmUtaW50ZWdyYXRpb24tdGVzdC9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvTk9USUNFLnR4dCBiL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWNvcmUtaW50ZWdyYXRpb24tdGVzdC9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvTk9USUNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmEzZGJkNi4uMDAwMDAwMAotLS0gYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1jb3JlLWludGVncmF0aW9uLXRlc3Qvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL05PVElDRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci09PSAgTk9USUNFIGZpbGUgY29ycmVzcG9uZGluZyB0byBzZWN0aW9uIDQoZCkgb2YgdGhlIEFwYWNoZSBMaWNlbnNlLCAgID09Ci09PSAgVmVyc2lvbiAyLjAsIGluIHRoaXMgY2FzZSBmb3IgdGhlIEFwYWNoZSBNeUZhY2VzIE1hdmVuIFBsdWdpbnMgICAgID09Ci09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgCi1UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLgotCi1Qb3J0aW9ucyBvZiB0aGlzIHNvZnR3YXJlIHdlcmUgb3JpZ2luYWxseSBiYXNlZCBvbiB0aGUgZm9sbG93aW5nOgotCi0gLSBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwNiwgT3JhY2xlIENvcnAsIDxodHRwOi8vd3d3Lm9yYWNsZS5jb20vPi4KLWFuZCBhcmUgbGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIHVuZGVyIHRoZSAKLSJTb2Z0d2FyZSBHcmFudCBhbmQgQ29ycG9yYXRlIENvbnRyaWJ1dGlvbiBMaWNlbnNlIEFncmVlbWVudCIKLQotU2VlIHRoZSBMSUNFTlNFLnR4dCBmaWxlIGZvciBpbmZvcm1hdGlvbiBvbiBhbGwgbGljZW5zZXMgCi1hc3NvY2lhdGVkIHdpdGggdGhpcyBzb2Z0d2FyZS4KZGlmZiAtLWdpdCBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWNvcmUtaW50ZWdyYXRpb24tdGVzdC9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvbWF2ZW4vYXJjaGV0eXBlLW1ldGFkYXRhLnhtbCBiL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWNvcmUtaW50ZWdyYXRpb24tdGVzdC9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvbWF2ZW4vYXJjaGV0eXBlLW1ldGFkYXRhLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGNiN2QyZC4uMDAwMDAwMAotLS0gYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1jb3JlLWludGVncmF0aW9uLXRlc3Qvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL21hdmVuL2FyY2hldHlwZS1tZXRhZGF0YS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICAgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gICAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICAgIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICAgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gICAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gICAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gICAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICAgIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08YXJjaGV0eXBlLWRlc2NyaXB0b3IgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3BsdWdpbnMvbWF2ZW4tYXJjaGV0eXBlLXBsdWdpbi9hcmNoZXR5cGUtZGVzY3JpcHRvci8xLjAuMCIKLSAgICAgICAgICAgICAgICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgICAgICAgICAgICAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvcGx1Z2lucy9tYXZlbi1hcmNoZXR5cGUtcGx1Z2luL2FyY2hldHlwZS1kZXNjcmlwdG9yLzEuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9hcmNoZXR5cGUtZGVzY3JpcHRvci0xLjAuMC54c2QiCi0gICAgICAgICAgICAgICAgICAgICAgbmFtZT0ibXlmYWNlcy1hcmNoZXR5cGUtY29yZS1pbnRlZ3JhdGlvbi10ZXN0IiBwYXJ0aWFsPSJmYWxzZSI+Ci0KLSAgICA8cmVxdWlyZWRQcm9wZXJ0aWVzPgotICAgICAgICA8cmVxdWlyZWRQcm9wZXJ0eSBrZXk9Imdyb3VwSWQiPgotICAgICAgICAgICAgPGRlZmF1bHRWYWx1ZT5vcmcuYXBhY2hlLm15ZmFjZXMuY29yZS5pbnRlZ3JhdGlvbnRlc3Q8L2RlZmF1bHRWYWx1ZT4KLSAgICAgICAgPC9yZXF1aXJlZFByb3BlcnR5PgotCi0gICAgICAgIDxyZXF1aXJlZFByb3BlcnR5IGtleT0icGFja2FnZSI+Ci0gICAgICAgICAgICA8ZGVmYXVsdFZhbHVlPm9yZy5hcGFjaGUubXlmYWNlcy5pbnRlZ3JhdGlvbnRlc3Q8L2RlZmF1bHRWYWx1ZT4KLSAgICAgICAgPC9yZXF1aXJlZFByb3BlcnR5PgotCi0gICAgICAgIDxyZXF1aXJlZFByb3BlcnR5IGtleT0idmVyc2lvbiI+Ci0gICAgICAgICAgICA8ZGVmYXVsdFZhbHVlPjIuMC45LVNOQVBTSE9UPC9kZWZhdWx0VmFsdWU+Ci0gICAgICAgIDwvcmVxdWlyZWRQcm9wZXJ0eT4KLQotICAgICAgICA8IS0tCi0gICAgICAgICAgICBUaGUgaXNzdWVJZCBmcm9tIHRoZSBNeUZhY2VzIGNvcmUgSklSQSBpc3N1ZSBmb3Igd2hpY2gKLSAgICAgICAgICAgIHRoaXMgaW50ZWdyYXRpb24gdGVzdCBpcyBjcmVhdGVkIChlLmcgTVlGQUNFUy0xMjM0KQotICAgICAgICAtLT4KLSAgICAgICAgPHJlcXVpcmVkUHJvcGVydHkga2V5PSJpc3N1ZUlkIiAvPgotCi0gICAgICAgIDwhLS0KLSAgICAgICAgICAgIHR5cGUgb2YgZW52aXJvbm1lbnQ6Ci0gICAgICAgICAgICAgICAgMCAtIHNlcnZsZXQgMi41ICsgZWwgMS4wIChkZWZhdWx0KQotICAgICAgICAgICAgICAgIDEgLSBzZXJ2bGV0IDIuNSArIGVsIDIuMgotICAgICAgICAgICAgICAgIDIgLSBzZXJ2bGV0IDMuMCArIGVsIDIuMgotICAgICAgICAtLT4KLSAgICAgICAgPHJlcXVpcmVkUHJvcGVydHkga2V5PSJlbnZpcm9ubWVudFR5cGUiIC8+Ci0gICAgPC9yZXF1aXJlZFByb3BlcnRpZXM+Ci0KLSAgICA8ZmlsZVNldHM+Ci0gICAgICAgIDxmaWxlU2V0IGZpbHRlcmVkPSJ0cnVlIiBwYWNrYWdlZD0idHJ1ZSI+Ci0gICAgICAgICAgICA8ZGlyZWN0b3J5PnNyYy9tYWluL2phdmEvPC9kaXJlY3Rvcnk+Ci0gICAgICAgIDwvZmlsZVNldD4KLSAgICAgICAgPGZpbGVTZXQgZmlsdGVyZWQ9InRydWUiIHBhY2thZ2VkPSJ0cnVlIj4KLSAgICAgICAgICAgIDxkaXJlY3Rvcnk+c3JjL3Rlc3QvamF2YS88L2RpcmVjdG9yeT4KLSAgICAgICAgPC9maWxlU2V0PgotICAgICAgICA8ZmlsZVNldCBmaWx0ZXJlZD0idHJ1ZSIgcGFja2FnZWQ9ImZhbHNlIj4KLSAgICAgICAgICAgIDxkaXJlY3Rvcnk+c3JjL21haW4vd2ViYXBwLzwvZGlyZWN0b3J5PgotICAgICAgICA8L2ZpbGVTZXQ+Ci0gICAgPC9maWxlU2V0cz4KLQotICAgIDxtb2R1bGVzLz4KLQotPC9hcmNoZXR5cGUtZGVzY3JpcHRvcj4KZGlmZiAtLWdpdCBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWNvcmUtaW50ZWdyYXRpb24tdGVzdC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9wb20ueG1sIGIvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtY29yZS1pbnRlZ3JhdGlvbi10ZXN0L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0YzdjNGEuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtY29yZS1pbnRlZ3JhdGlvbi10ZXN0L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMTYgKzAsMCBAQAotI3NldCggJHN5bWJvbF9wb3VuZCA9ICcjJyApCi0jc2V0KCAkc3ltYm9sX2RvbGxhciA9ICckJyApCi0jc2V0KCAkc3ltYm9sX2VzY2FwZSA9ICdcJyApCi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLQotICAgIDxwYXJlbnQ+Ci0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5jb3JlLmludGVncmF0aW9udGVzdDwvZ3JvdXBJZD4KLSAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1pbnRlZ3JhdGlvbi10ZXN0czwvYXJ0aWZhY3RJZD4KLQotICAgICAgICA8IS0tIE5PVEU6IHNldCBhcHByb3ByaWF0ZSB2ZXJzaW9uLCBlLmcuIDIuMC54LVNOQVBTSE9UIG9yIDIuMS54LVNOQVBTSE9UIC0tPgotICAgICAgICA8dmVyc2lvbj4ke3ZlcnNpb259PC92ZXJzaW9uPgotICAgIDwvcGFyZW50PgotCi0gICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotCi0gICAgPGdyb3VwSWQ+JHtncm91cElkfTwvZ3JvdXBJZD4KLSAgICA8YXJ0aWZhY3RJZD4ke2FydGlmYWN0SWR9PC9hcnRpZmFjdElkPgotICAgIDxwYWNrYWdpbmc+d2FyPC9wYWNrYWdpbmc+Ci0gICAgPG5hbWU+QXBhY2hlIE15RmFjZXMgSlNGLTIuMCBDb3JlIEludGVncmF0aW9uIFRlc3RzIC0gJHtpc3N1ZUlkfTwvbmFtZT4KLQotCi0gICAgPGJ1aWxkPgotICAgICAgICA8cGx1Z2lucz4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPCEtLSB0byBzdGFydCB0aGUgY29udGFpbmVyIGZvciBtYW51YWwgdGVzdHMgdXNlICJtdm4gY2xlYW4gcGFja2FnZSBjYXJnbzpydW4iIC0tPgotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy5jYXJnbzwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5jYXJnby1tYXZlbjItcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8Y29udGFpbmVyPgotIyMgc2VydmxldCAyLjUgKyBlbCAyLjIKLSNpZiAoJGVudmlyb25tZW50VHlwZSA9PSAxKQotICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSB1c2luZyBqZXR0eTZ4IGhlcmUsIGIvYyBqZXR0eTd4IGRvZXMgbm90IHBsYXkgd2VsbCB3aXRoIGVsLTIuMiBpbnRlZ3JhdGlvbiAtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxjb250YWluZXJJZD5qZXR0eTZ4PC9jb250YWluZXJJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx0eXBlPmVtYmVkZGVkPC90eXBlPgotCi0gICAgICAgICAgICAgICAgICAgICAgICA8ZGVwZW5kZW5jaWVzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gdXNlIGVsIDIuMiBhcGkraW1wbCBmcm9tIGdsYXNzZmlzaCAtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXguZWw8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmphdmF4LmVsLWFwaTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2gud2ViPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qYXZheC5lbDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2RlcGVuZGVuY2llcz4KLSMjIHNlcnZsZXQgMy4wICsgZWwgMi4yCi0jZWxzZWlmICgkZW52aXJvbm1lbnRUeXBlID09IDIpCi0gICAgICAgICAgICAgICAgICAgICAgICA8Y29udGFpbmVySWQ+dG9tY2F0N3g8L2NvbnRhaW5lcklkPgotICAgICAgICAgICAgICAgICAgICAgICAgPHppcFVybEluc3RhbGxlcj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dXJsPmh0dHA6Ly9hcmNoaXZlLmFwYWNoZS5vcmcvZGlzdC90b21jYXQvdG9tY2F0LTcvdjcuMC4xNi9iaW4vYXBhY2hlLXRvbWNhdC03LjAuMTYuemlwPC91cmw+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3ppcFVybEluc3RhbGxlcj4KLSMjIHNlcnZsZXQgMi41ICsgZWwgMS4wIChkZWZhdWx0KQotI2Vsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIDxjb250YWluZXJJZD50b21jYXQ2eDwvY29udGFpbmVySWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8emlwVXJsSW5zdGFsbGVyPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx1cmw+aHR0cDovL2FyY2hpdmUuYXBhY2hlLm9yZy9kaXN0L3RvbWNhdC90b21jYXQtNi92Ni4wLjMyL2Jpbi9hcGFjaGUtdG9tY2F0LTYuMC4zMi56aXA8L3VybD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvemlwVXJsSW5zdGFsbGVyPgotI2VuZAotICAgICAgICAgICAgICAgICAgICA8L2NvbnRhaW5lcj4KLQotICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxwcm9wZXJ0aWVzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjYXJnby5zZXJ2bGV0LnBvcnQ+JHtzeW1ib2xfZG9sbGFyfXtjYXJnby5wb3J0fTwvY2FyZ28uc2VydmxldC5wb3J0PgotICAgICAgICAgICAgICAgICAgICAgICAgPC9wcm9wZXJ0aWVzPgotCi0gICAgICAgICAgICAgICAgICAgICAgICA8ZGVwbG95YWJsZXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRlcGxveWFibGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPiR7c3ltYm9sX2RvbGxhcn17cHJvamVjdC5ncm91cElkfTwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+JHtzeW1ib2xfZG9sbGFyfXtwcm9qZWN0LmFydGlmYWN0SWR9PC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHlwZT53YXI8L3R5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwcm9wZXJ0aWVzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvbnRleHQ+JHtzeW1ib2xfZG9sbGFyfXtjYXJnby5jb250ZXh0fTwvY29udGV4dD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wcm9wZXJ0aWVzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGVwbG95YWJsZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZGVwbG95YWJsZXM+Ci0gICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8aWQ+c3RhcnQtY29udGFpbmVyPC9pZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT5wcmUtaW50ZWdyYXRpb24tdGVzdDwvcGhhc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+c3RhcnQ8L2dvYWw+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5zdG9wLWNvbnRhaW5lcjwvaWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+cG9zdC1pbnRlZ3JhdGlvbi10ZXN0PC9waGFzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5zdG9wPC9nb2FsPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPCEtLSB1c2luZyBmYWlsc2FmZSBpbnN0ZWFkIG9mIHN1cmVmaXJlIHBsdWdpbiBlbnN1cmVzIGV4ZWN1dGlvbiBvZiBwaGFzZSBwb3N0LWludGVncmF0aW9uLXRlc3QgLS0+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tZmFpbHNhZmUtcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGlkPmh0bWx1bml0LWludGVncmF0aW9uLXRlc3RzPC9pZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT5pbnRlZ3JhdGlvbi10ZXN0PC9waGFzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5pbnRlZ3JhdGlvbi10ZXN0PC9nb2FsPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+KiovKlRlc3QqLmphdmE8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9pbmNsdWRlcz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2tpcD5mYWxzZTwvc2tpcD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVzdE5HQXJ0aWZhY3ROYW1lPm5vbmU6bm9uZTwvdGVzdE5HQXJ0aWZhY3ROYW1lPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzeXN0ZW1Qcm9wZXJ0eVZhcmlhYmxlcz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBwYXNzIHByb3BlcnRpZXMgdG8gSlVuaXQgLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjYXJnby5jb250ZXh0PiR7c3ltYm9sX2RvbGxhcn17Y2FyZ28uY29udGV4dH08L2NhcmdvLmNvbnRleHQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjYXJnby5wb3J0PiR7c3ltYm9sX2RvbGxhcn17Y2FyZ28ucG9ydH08L2NhcmdvLnBvcnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zeXN0ZW1Qcm9wZXJ0eVZhcmlhYmxlcz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8aWQ+dmVyaWZ5PC9pZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT52ZXJpZnk8L3BoYXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPnZlcmlmeTwvZ29hbD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotCi0gICAgICAgIDwvcGx1Z2lucz4KLSAgICA8L2J1aWxkPgotCi0KLSAgICA8ZGVwZW5kZW5jaWVzPgotCi0jIyBzZXJ2bGV0IDIuNSArIGVsIDIuMgotI2lmICgkZW52aXJvbm1lbnRUeXBlID09IDEpCi0gICAgICAgIDwhLS0gc2VydmxldCAyLjUgLS0+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5nZXJvbmltby5zcGVjczwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmdlcm9uaW1vLXNlcnZsZXRfMi41X3NwZWM8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0KLSAgICAgICAgPCEtLSBlbCAyLjIgYXBpK2ltcGwgZnJvbSBnbGFzc2Zpc2ggKG5lZWQgYm90aCBkZXBlbmRlbmNpZXMgaGVyZSBmb3IgY2FyZ28tcGx1Z2luLCBzZWUgYWJvdmUpIC0tPgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPmphdmF4LmVsPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+amF2YXguZWwtYXBpPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+Mi4yLjE8L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC53ZWI8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5qYXZheC5lbDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPjIuMi4xPC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotIyMgc2VydmxldCAzLjAgKyBlbCAyLjIKLSNlbHNlaWYgKCRlbnZpcm9ubWVudFR5cGUgPT0gMikKLSAgICAgICAgPCEtLSBzZXJ2bGV0IDMuMCAtLT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmdlcm9uaW1vLnNwZWNzPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+Z2Vyb25pbW8tc2VydmxldF8zLjBfc3BlYzwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLQotICAgICAgICA8IS0tIGVsIDIuMiAtLT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmdlcm9uaW1vLnNwZWNzPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+Z2Vyb25pbW8tZWxfMi4yX3NwZWM8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0jIyBzZXJ2bGV0IDIuNSArIGVsIDEuMCAoZGVmYXVsdCkKLSNlbHNlCi0gICAgICAgIDwhLS0gc2VydmxldCAyLjUgLS0+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5nZXJvbmltby5zcGVjczwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmdlcm9uaW1vLXNlcnZsZXRfMi41X3NwZWM8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0KLSAgICAgICAgPCEtLSBlbCAxLjAgLS0+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5nZXJvbmltby5zcGVjczwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmdlcm9uaW1vLWVsXzEuMF9zcGVjPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotI2VuZAotCi0gICAgICAgIDwhLS0gdGVzdCBzdXBwb3J0IG1vZHVsZSAtLT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuY29yZS5pbnRlZ3JhdGlvbnRlc3Q8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWludGVncmF0aW9uLXRlc3Qtc3VwcG9ydDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotCi0gICAgPC9kZXBlbmRlbmNpZXM+Ci0KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWNvcmUtaW50ZWdyYXRpb24tdGVzdC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zcmMvbWFpbi9qYXZhL1Rlc3RCZWFuLmphdmEgYi9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1jb3JlLWludGVncmF0aW9uLXRlc3Qvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc3JjL21haW4vamF2YS9UZXN0QmVhbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNjAzMDE0Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWNvcmUtaW50ZWdyYXRpb24tdGVzdC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zcmMvbWFpbi9qYXZhL1Rlc3RCZWFuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0jc2V0KCAkc3ltYm9sX3BvdW5kID0gJyMnICkKLSNzZXQoICRzeW1ib2xfZG9sbGFyID0gJyQnICkKLSNzZXQoICRzeW1ib2xfZXNjYXBlID0gJ1wnICkKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlICR7cGFja2FnZX07Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5iZWFuLk1hbmFnZWRCZWFuOwotaW1wb3J0IGphdmF4LmZhY2VzLmJlYW4uUmVxdWVzdFNjb3BlZDsKLQotLyoqCi0gKiBCZWFuIGZvciBpbnRlZ3JhdGlvbiB0ZXN0cyBvZiAke2lzc3VlSWR9LgotICovCi1ATWFuYWdlZEJlYW4KLUBSZXF1ZXN0U2NvcGVkCi1wdWJsaWMgY2xhc3MgVGVzdEJlYW4KLXsKLQotICAgIC8vIFRPRE8KLQotICAgIHB1YmxpYyBTdHJpbmcgYWN0aW9uKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtY29yZS1pbnRlZ3JhdGlvbi10ZXN0L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwgYi9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1jb3JlLWludGVncmF0aW9uLXRlc3Qvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmJlZWIwMi4uMDAwMDAwMAotLS0gYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1jb3JlLWludGVncmF0aW9uLXRlc3Qvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLSNzZXQoICRzeW1ib2xfcG91bmQgPSAnIycgKQotI3NldCggJHN5bWJvbF9kb2xsYXIgPSAnJCcgKQotI3NldCggJHN5bWJvbF9lc2NhcGUgPSAnXCcgKQotPD94bWwgdmVyc2lvbiA9ICcxLjAnIGVuY29kaW5nID0gJ0lTTy04ODU5LTEnPz4KLTwhLS0KLSAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gICAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gICAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gICAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICAgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICAgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICAgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgICB1bmRlciB0aGUgTGljZW5zZS4KLQotLS0+Ci08d2ViLWFwcCB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIgotICAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS93ZWItYXBwXzJfNS54c2QiCi0gICAgICAgICB2ZXJzaW9uPSIyLjUiPgotCi0gICAgPHNlcnZsZXQ+Ci0gICAgICAgIDxzZXJ2bGV0LW5hbWU+RmFjZXMgU2VydmxldDwvc2VydmxldC1uYW1lPgotICAgICAgICA8c2VydmxldC1jbGFzcz5qYXZheC5mYWNlcy53ZWJhcHAuRmFjZXNTZXJ2bGV0PC9zZXJ2bGV0LWNsYXNzPgotICAgICAgICA8bG9hZC1vbi1zdGFydHVwPjE8L2xvYWQtb24tc3RhcnR1cD4KLSAgICA8L3NlcnZsZXQ+Ci0KLSAgICA8c2VydmxldC1tYXBwaW5nPgotICAgICAgICA8c2VydmxldC1uYW1lPkZhY2VzIFNlcnZsZXQ8L3NlcnZsZXQtbmFtZT4KLSAgICAgICAgPHVybC1wYXR0ZXJuPioueGh0bWw8L3VybC1wYXR0ZXJuPgotICAgIDwvc2VydmxldC1tYXBwaW5nPgotCi0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxwYXJhbS1uYW1lPmphdmF4LmZhY2VzLlBST0pFQ1RfU1RBR0U8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT5Qcm9kdWN0aW9uPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPHBhcmFtLW5hbWU+amF2YXguZmFjZXMuREVGQVVMVF9TVUZGSVg8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT4ueGh0bWw8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLQotICAgIDx3ZWxjb21lLWZpbGUtbGlzdD4KLSAgICAgICAgPHdlbGNvbWUtZmlsZT5pbmRleC54aHRtbDwvd2VsY29tZS1maWxlPgotICAgIDwvd2VsY29tZS1maWxlLWxpc3Q+Ci0KLSMjIHNlcnZsZXQgMi41ICsgZWwgMi4yCi0jaWYgKCRlbnZpcm9ubWVudFR5cGUgPT0gMSkKLSAgICA8IS0tCi0gICAgICAgIHdlIGhhdmUgdG8gZXhwbGljaXRseSBjb25maWd1cmUgZ2xhc3NmaXNoJ3MgZWwgMi4yIGltcGxlbWVudGF0aW9uLAotICAgICAgICBiZWNhdXNlIGl0IGlzIG5vdCB0aGUgc3RhbmRhcmQgb25lIG9uIHRoaXMgc2VydmVyCi0gICAgLS0+Ci0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5FWFBSRVNTSU9OX0ZBQ1RPUlk8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT5jb20uc3VuLmVsLkV4cHJlc3Npb25GYWN0b3J5SW1wbDwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotI2VuZAotCi08L3dlYi1hcHA+CmRpZmYgLS1naXQgYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1jb3JlLWludGVncmF0aW9uLXRlc3Qvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc3JjL21haW4vd2ViYXBwL3BhZ2VzL2luZGV4LnhodG1sIGIvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtY29yZS1pbnRlZ3JhdGlvbi10ZXN0L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL3dlYmFwcC9wYWdlcy9pbmRleC54aHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2I2NDE3Yy4uMDAwMDAwMAotLS0gYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1jb3JlLWludGVncmF0aW9uLXRlc3Qvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc3JjL21haW4vd2ViYXBwL3BhZ2VzL2luZGV4LnhodG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotI3NldCggJHN5bWJvbF9wb3VuZCA9ICcjJyApCi0jc2V0KCAkc3ltYm9sX2RvbGxhciA9ICckJyApCi0jc2V0KCAkc3ltYm9sX2VzY2FwZSA9ICdcJyApCi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICAgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gICAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICAgIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICAgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gICAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gICAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gICAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICAgIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0tLT4KLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIgotICAgICAgeG1sbnM6Zj0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvY29yZSIKLSAgICAgIHhtbG5zOmg9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2h0bWwiCi0gICAgICB4bWxuczp1aT0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvZmFjZWxldHMiCi0gICAgICB4bWxuczpjPSJodHRwOi8vamF2YS5zdW4uY29tL2pzcC9qc3RsL2NvcmUiPgotPGg6aGVhZD4KLSAgICA8dGl0bGU+QXBhY2hlIE15RmFjZXMgQ29yZSAtIEludGVncmF0aW9uIHRlc3QgZm9yICR7aXNzdWVJZH08L3RpdGxlPgotPC9oOmhlYWQ+Ci08aDpib2R5PgotCi0gICAgPGgxPkFwYWNoZSBNeUZhY2VzIENvcmUgLSBJbnRlZ3JhdGlvbiB0ZXN0IGZvciAke2lzc3VlSWR9PC9oMT4KLQotICAgIDxoOm1lc3NhZ2VzIC8+Ci0KLSAgICA8aDpmb3JtIGlkPSJmb3JtIj4KLQotICAgICAgICA8IS0tIFRPRE8gLS0+Ci0KLSAgICAgICAgPGg6Y29tbWFuZEJ1dHRvbiBpZD0ic3VibWl0IiB2YWx1ZT0iU3VibWl0IiBhY3Rpb249IiR7c3ltYm9sX3BvdW5kfXt0ZXN0QmVhbi5hY3Rpb259IiAvPgotICAgIDwvaDpmb3JtPgotCi08L2g6Ym9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWNvcmUtaW50ZWdyYXRpb24tdGVzdC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zcmMvdGVzdC9qYXZhL0ludGVncmF0aW9uVGVzdC5qYXZhIGIvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtY29yZS1pbnRlZ3JhdGlvbi10ZXN0L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy90ZXN0L2phdmEvSW50ZWdyYXRpb25UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0MGEwODMuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtY29yZS1pbnRlZ3JhdGlvbi10ZXN0L3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy90ZXN0L2phdmEvSW50ZWdyYXRpb25UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0jc2V0KCAkc3ltYm9sX3BvdW5kID0gJyMnICkKLSNzZXQoICRzeW1ib2xfZG9sbGFyID0gJyQnICkKLSNzZXQoICRzeW1ib2xfZXNjYXBlID0gJ1wnICkKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlICR7cGFja2FnZX07Ci0KLWltcG9ydCBjb20uZ2FyZ295bGVzb2Z0d2FyZS5odG1sdW5pdC5odG1sLkh0bWxQYWdlOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5pbnRlZ3JhdGlvbnRlc3Quc3VwcG9ydC5NeUZhY2VzSW50ZWdyYXRpb25UZXN0OwotaW1wb3J0IG9yZy5qdW5pdC5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmp1bml0LlRlc3Q7Ci1pbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwotaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLkpVbml0NDsKLQotLyoqCi0gKiBUZXN0IGNhc2VzIGZvciAke2lzc3VlSWR9LgotICovCi1AUnVuV2l0aChKVW5pdDQuY2xhc3MpCi1wdWJsaWMgY2xhc3MgSW50ZWdyYXRpb25UZXN0IGV4dGVuZHMgTXlGYWNlc0ludGVncmF0aW9uVGVzdAotewotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0QWN0aW9uX3Nob3VsZEV4cGVjdGVkUmVzdWx0KCkgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgSHRtbFBhZ2UgcGFnZSA9IHdlYkNsaWVudC5nZXRQYWdlKGdldEJhc2VVUkwoKSArICJwYWdlcy9pbmRleC54aHRtbCIpOwotCi0gICAgICAgIC8vIFRPRE8KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWNvcmUtaW50ZWdyYXRpb24tdGVzdC9zcmMvc2l0ZS9hcHQvaW5kZXguYXB0IGIvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtY29yZS1pbnRlZ3JhdGlvbi10ZXN0L3NyYy9zaXRlL2FwdC9pbmRleC5hcHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2YzQ1MDcuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtY29yZS1pbnRlZ3JhdGlvbi10ZXN0L3NyYy9zaXRlL2FwdC9pbmRleC5hcHQKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0gLS0tLS0tCi0gTXlGYWNlcyBDb3JlIEludGVncmF0aW9uLVRlc3QgQXJjaGV0eXBlCi0gLS0tLS0tCi0KLU92ZXJ2aWV3Ci0KLSAgVGhpcyBwcm9qZWN0IGRlZmluZXMgYSBNYXZlbiBhcmNoZXR5cGUuIFJ1bm5pbmcgdGhlIGFyY2hldHlwZSBwbHVnaW4gd2l0aCB0aGlzIGFyY2hldHlwZSB3aWxsCi0gIGNyZWF0ZSBhIGRpcmVjdG9yeSB0cmVlIGNvbnRhaW5pbmcgdGhlIGZpbGVzIG5lZWRlZCB0byBxdWlja2x5IGdldCBzdGFydGVkIG9uIGEgbmV3IGludGVncmF0aW9uCi0gIHRlc3QgZm9yIE15RmFjZXMgY29yZSAyLnguCi0KLVVzYWdlCi0KLSAgVXNlIHRoZSBmb2xsb3dpbmcgbWF2ZW4gY29tbWFuZCBhbmQgdGhlbiBzZWxlY3QgbXlmYWNlcy1hcmNoZXR5cGUtY29yZS1pbnRlZ3JhdGlvbi10ZXN0IGZyb20gdGhlIG9wdGlvbnMuCi0KLQotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLW12biBhcmNoZXR5cGU6Z2VuZXJhdGUgLURhcmNoZXR5cGVDYXRhbG9nPWh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcKLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0KLSAgWW91IHdpbGwgdGhlbiBiZSBwcm9tcHRlZCBmb3Igc29tZSBhcmNoZXR5cGUgc3BlY2lmaWMgcHJvcGVydGllcywgd2hpY2ggd2lsbCBsb29rIGxpa2UgdGhpczoKLQotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLURlZmluZSB2YWx1ZSBmb3IgcHJvcGVydHkgJ2FydGlmYWN0SWQnOiA6IG15ZmFjZXMtMTIzNC10ZXN0cwotRGVmaW5lIHZhbHVlIGZvciBwcm9wZXJ0eSAnZW52aXJvbm1lbnRUeXBlJzogOiAwCi1EZWZpbmUgdmFsdWUgZm9yIHByb3BlcnR5ICdpc3N1ZUlkJzogOiBNWUZBQ0VTLTEyMzQKLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0KLSAgQWxsIG90aGVyIHByb3BlcnRpZXMgKGxpa2UgZS5nLiBncm91cElkKSB3aWxsIGF1dG9tYXRpY2FsbHkgYmUgY29uZmlndXJlZC4gQXMgc2hvd24gYWJvdmUsIHlvdSBuZWVkCi0gIHRvIHByb3ZpZGUgMyBwcm9wZXJ0aWVzOgotCi0gICogYXJ0aWZhY3RJZCBpcyB0aGUgYXJ0aWZhY3RJZCBmb3IgdGhlIG1hdmVuIHByb2plY3QsIHlvdSBzaG91bGQgdXNlICNce2lzc3VlSWRcfS10ZXN0cyBhcyBzaG93biBhYm92ZS4KLQotICAqIGVudmlyb25tZW50VHlwZSBkZWZpbmVzIHdoaWNoIHR5cGUgb2YgZW52aXJvbm1lbnQgc2hvdWxkIGJlIHVzZWQuCi0KLSAgICAqIDA6IHNlcnZsZXQgMi41IGFuZCBlbCAxLjAKLQotICAgICogMTogc2VydmxldCAyLjUgYW5kIGVsIDIuMgotCi0gICAgKiAyOiBzZXJ2bGV0IDMuMCBhbmQgZWwgMi4yCi0KLSAgKiBpc3N1ZUlkIGlzIHRoZSBpc3N1ZS1pZCBvZiB0aGUgSklSQSBpc3N1ZSB3aGljaCB0aGlzIGludGVncmF0aW9uIHRlc3QgYWRkcmVzc2VzCi0KLSAgW10KLQotICBUaGUgdmVyc2lvbiBvZiB0aGUgcHJvamVjdCBpcyBhdXRvbWF0aWNhbGx5IHNldCB0byBhIGRlZmF1bHQgdmFsdWUgKGUuZy4gMi4wLjktU05BUFNIT1QpLiBJZiB5b3UKLSAgd2FudCB0byB0ZXN0IGEgZGlmZmVyZW50IHZlcnNpb24sIHlvdSBoYXZlIHRvIGNoYW5nZSB0aGlzIG1hbnVhbGx5IGluIHRoZSBwb20ueG1sLgpkaWZmIC0tZ2l0IGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtaGVsbG93b3JsZC1mYWNlbGV0cy9wb20ueG1sIGIvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtaGVsbG93b3JsZC1mYWNlbGV0cy9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOWZhMGFmLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWhlbGxvd29ybGQtZmFjZWxldHMvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICAgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICAgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gICAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICAgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gICAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gICAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gICAgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgotCi0gIDxwYXJlbnQ+Ci0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHM8L2dyb3VwSWQ+Ci0gICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1hcmNoZXR5cGUtcGFyZW50PC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjEuMC40LVNOQVBTSE9UPC92ZXJzaW9uPgotICA8L3BhcmVudD4KLQotICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0gIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzPC9ncm91cElkPgotICA8YXJ0aWZhY3RJZD5teWZhY2VzLWFyY2hldHlwZS1oZWxsb3dvcmxkLWZhY2VsZXRzPC9hcnRpZmFjdElkPgotICA8cGFja2FnaW5nPmphcjwvcGFja2FnaW5nPgotICA8bmFtZT5NeUZhY2VzIEZhY2VsZXRzIEFyY2hldHlwZTwvbmFtZT4KLSAgPGRlc2NyaXB0aW9uPkFyY2hldHlwZSB0byBjcmVhdGUgYSBuZXcgd2ViYXBwIGJhc2VkIG9uIE15RmFjZXMgYW5kIEZhY2VsZXRzPC9kZXNjcmlwdGlvbj4KLQotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtaGVsbG93b3JsZC1mYWNlbGV0cy9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvTElDRU5TRS50eHQgYi9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1oZWxsb3dvcmxkLWZhY2VsZXRzL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9MSUNFTlNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDY0NTY5NS4uMDAwMDAwMAotLS0gYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1oZWxsb3dvcmxkLWZhY2VsZXRzL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9MSUNFTlNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDIwMiArMCwwIEBACi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0Ci0gICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvCi0KLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTgotCi0gICAxLiBEZWZpbml0aW9ucy4KLQotICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwKLSAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgotCi0gICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgotCi0gICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsCi0gICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCi0gICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLAotICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlCi0gICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgotICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlCi0gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5LgotCi0gICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLgotCi0gICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywKLSAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24KLSAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCi0KLSAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsCi0gICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0Ci0gICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sCi0gICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuCi0KLSAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yCi0gICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhCi0gICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKLSAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuCi0KLSAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKLSAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUKLSAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMKLSAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCi0gICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4KLSAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwKLSAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCi0KLSAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nCi0gICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCi0gICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkKLSAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIKLSAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgotICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiCi0gICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50Ci0gICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bwotICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywKLSAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlCi0gICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKLSAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlCi0gICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiIKLQotICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKLSAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZAotICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCi0KLSAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKLSAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLAotICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCi0gICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLgotCi0gICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKLSAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLAotICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUKLSAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCi0gICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpCi0gICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQotICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKLSAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsKLSAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0Ci0gICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCi0gICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUKLSAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4KLQotICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUKLSAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dAotICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKLSAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotCi0gICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgotICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kCi0KLSAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKLSAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQKLQotICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCi0gICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZAotICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssCi0gICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgotICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQKLQotICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCi0gICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdAotICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZAotICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAotICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQotICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkCi0gICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgotICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLAotICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQKLSAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKLSAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kCi0gICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24KLSAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQotICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZAotICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZAotICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KLQotICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kCi0gICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCi0gICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yCi0gICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwKLSAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAotICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4KLQotICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAotICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrCi0gICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCi0gICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5Ci0gICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZAotICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgotCi0gICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlCi0gICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCi0gICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUKLSAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLgotCi0gICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IKLSAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gKLSAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucwotICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQotICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlCi0gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkKLSAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KLQotICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksCi0gICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKLSAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5Ci0gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQotICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAotICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhCi0gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlCi0gICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCi0gICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbAotICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcgotICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgotCi0gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nCi0gICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAotICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwKLSAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzCi0gICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQotICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYKLSAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwKLSAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQotICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbgotICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuCi0KLSAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUwotCi0gICBBUFBFTkRJWDogSG93IHRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmsuCi0KLSAgICAgIFRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmssIGF0dGFjaCB0aGUgZm9sbG93aW5nCi0gICAgICBib2lsZXJwbGF0ZSBub3RpY2UsIHdpdGggdGhlIGZpZWxkcyBlbmNsb3NlZCBieSBicmFja2V0cyAiW10iCi0gICAgICByZXBsYWNlZCB3aXRoIHlvdXIgb3duIGlkZW50aWZ5aW5nIGluZm9ybWF0aW9uLiAoRG9uJ3QgaW5jbHVkZQotICAgICAgdGhlIGJyYWNrZXRzISkgIFRoZSB0ZXh0IHNob3VsZCBiZSBlbmNsb3NlZCBpbiB0aGUgYXBwcm9wcmlhdGUKLSAgICAgIGNvbW1lbnQgc3ludGF4IGZvciB0aGUgZmlsZSBmb3JtYXQuIFdlIGFsc28gcmVjb21tZW5kIHRoYXQgYQotICAgICAgZmlsZSBvciBjbGFzcyBuYW1lIGFuZCBkZXNjcmlwdGlvbiBvZiBwdXJwb3NlIGJlIGluY2x1ZGVkIG9uIHRoZQotICAgICAgc2FtZSAicHJpbnRlZCBwYWdlIiBhcyB0aGUgY29weXJpZ2h0IG5vdGljZSBmb3IgZWFzaWVyCi0gICAgICBpZGVudGlmaWNhdGlvbiB3aXRoaW4gdGhpcmQtcGFydHkgYXJjaGl2ZXMuCi0KLSAgIENvcHlyaWdodCBbeXl5eV0gW25hbWUgb2YgY29weXJpZ2h0IG93bmVyXQotCi0gICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgpkaWZmIC0tZ2l0IGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtaGVsbG93b3JsZC1mYWNlbGV0cy9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvTk9USUNFLnR4dCBiL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWhlbGxvd29ybGQtZmFjZWxldHMvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL05PVElDRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhM2RiZDYuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtaGVsbG93b3JsZC1mYWNlbGV0cy9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvTk9USUNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLT09ICBOT1RJQ0UgZmlsZSBjb3JyZXNwb25kaW5nIHRvIHNlY3Rpb24gNChkKSBvZiB0aGUgQXBhY2hlIExpY2Vuc2UsICAgPT0KLT09ICBWZXJzaW9uIDIuMCwgaW4gdGhpcyBjYXNlIGZvciB0aGUgQXBhY2hlIE15RmFjZXMgTWF2ZW4gUGx1Z2lucyAgICAgPT0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSAKLVRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuCi0KLVBvcnRpb25zIG9mIHRoaXMgc29mdHdhcmUgd2VyZSBvcmlnaW5hbGx5IGJhc2VkIG9uIHRoZSBmb2xsb3dpbmc6Ci0KLSAtIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDA2LCBPcmFjbGUgQ29ycCwgPGh0dHA6Ly93d3cub3JhY2xlLmNvbS8+LgotYW5kIGFyZSBsaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gdW5kZXIgdGhlIAotIlNvZnR3YXJlIEdyYW50IGFuZCBDb3Jwb3JhdGUgQ29udHJpYnV0aW9uIExpY2Vuc2UgQWdyZWVtZW50IgotCi1TZWUgdGhlIExJQ0VOU0UudHh0IGZpbGUgZm9yIGluZm9ybWF0aW9uIG9uIGFsbCBsaWNlbnNlcyAKLWFzc29jaWF0ZWQgd2l0aCB0aGlzIHNvZnR3YXJlLgpkaWZmIC0tZ2l0IGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtaGVsbG93b3JsZC1mYWNlbGV0cy9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvbWF2ZW4vYXJjaGV0eXBlLW1ldGFkYXRhLnhtbCBiL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWhlbGxvd29ybGQtZmFjZWxldHMvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL21hdmVuL2FyY2hldHlwZS1tZXRhZGF0YS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2NTVlYzEuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtaGVsbG93b3JsZC1mYWNlbGV0cy9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvbWF2ZW4vYXJjaGV0eXBlLW1ldGFkYXRhLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICAgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICAgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gICAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICAgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gICAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gICAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gICAgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTxhcmNoZXR5cGUtZGVzY3JpcHRvciB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvcGx1Z2lucy9tYXZlbi1hcmNoZXR5cGUtcGx1Z2luL2FyY2hldHlwZS1kZXNjcmlwdG9yLzEuMC4wIgotICAgICAgICAgICAgICAgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgICAgICAgICAgICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9wbHVnaW5zL21hdmVuLWFyY2hldHlwZS1wbHVnaW4vYXJjaGV0eXBlLWRlc2NyaXB0b3IvMS4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL2FyY2hldHlwZS1kZXNjcmlwdG9yLTEuMC4wLnhzZCIKLQotICAgICAgICAgICAgICAgICAgICAgIG5hbWU9Im15ZmFjZXMtYXJjaGV0eXBlLWhlbGxvd29ybGQtZmFjZWxldHMiIHBhcnRpYWw9ImZhbHNlIj4KLQotICA8cmVxdWlyZWRQcm9wZXJ0aWVzLz4KLQotICA8ZmlsZVNldHM+Ci0gICAgICA8ZmlsZVNldCBmaWx0ZXJlZD0idHJ1ZSIgcGFja2FnZWQ9InRydWUiPgotICAgICAgICAgIDxkaXJlY3Rvcnk+c3JjL21haW4vamF2YS88L2RpcmVjdG9yeT4KLSAgICAgIDwvZmlsZVNldD4KLSAgICAgIDxmaWxlU2V0IGZpbHRlcmVkPSJmYWxzZSIgcGFja2FnZWQ9ImZhbHNlIj4KLSAgICAgICAgICA8ZGlyZWN0b3J5PnNyYy9tYWluL3dlYmFwcC88L2RpcmVjdG9yeT4KLSAgICAgICAgICA8ZXhjbHVkZXM+Ci0gICAgICAgICAgICAgIDxleGNsdWRlPldFQi1JTkYvZXhhbXBsZXMtY29uZmlnLnhtbDwvZXhjbHVkZT4KLSAgICAgICAgICA8L2V4Y2x1ZGVzPgotICAgICAgPC9maWxlU2V0PgotICAgICAgPGZpbGVTZXQgZmlsdGVyZWQ9InRydWUiIHBhY2thZ2VkPSJmYWxzZSI+Ci0gICAgICAgICAgPGRpcmVjdG9yeT5zcmMvbWFpbi93ZWJhcHAvPC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgPGluY2x1ZGVzPgotICAgICAgICAgICAgICA8IS0tIGV4YW1wbGVzLWNvbmZpZyBuZWVkcyB0byBiZSBmaWx0ZXJlZCAtLT4KLSAgICAgICAgICAgICAgPGluY2x1ZGU+V0VCLUlORi9leGFtcGxlcy1jb25maWcueG1sPC9pbmNsdWRlPgotICAgICAgICAgIDwvaW5jbHVkZXM+Ci0gICAgICA8L2ZpbGVTZXQ+Ci0gICAgICA8ZmlsZVNldCBmaWx0ZXJlZD0iZmFsc2UiIHBhY2thZ2VkPSJmYWxzZSI+Ci0gICAgICAgICAgPGRpcmVjdG9yeT5zcmMvbWFpbi9sb2c0ai88L2RpcmVjdG9yeT4KLSAgICAgIDwvZmlsZVNldD4KLSAgPC9maWxlU2V0cz4KLQotICA8bW9kdWxlcy8+Ci0KLTwvYXJjaGV0eXBlLWRlc2NyaXB0b3I+CmRpZmYgLS1naXQgYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1oZWxsb3dvcmxkLWZhY2VsZXRzL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3BvbS54bWwgYi9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1oZWxsb3dvcmxkLWZhY2VsZXRzL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjMGE1NDkuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtaGVsbG93b3JsZC1mYWNlbGV0cy9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTg1ICswLDAgQEAKLSNzZXQoICRzeW1ib2xfcG91bmQgPSAnIycgKQotI3NldCggJHN5bWJvbF9kb2xsYXIgPSAnJCcgKQotI3NldCggJHN5bWJvbF9lc2NhcGUgPSAnXCcgKQotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIKLSAgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0gICAgPGdyb3VwSWQ+JHtncm91cElkfTwvZ3JvdXBJZD4KLSAgICA8YXJ0aWZhY3RJZD4ke2FydGlmYWN0SWR9PC9hcnRpZmFjdElkPgotICAgIDxwYWNrYWdpbmc+d2FyPC9wYWNrYWdpbmc+Ci0gICAgPHZlcnNpb24+JHt2ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICA8bmFtZT5BIGN1c3RvbSBwcm9qZWN0IHVzaW5nIG15ZmFjZXMgMS4yIGFuZCBmYWNlbGV0czwvbmFtZT4KLSAgICA8dXJsPmh0dHA6Ly93d3cubXlvcmdhbml6YXRpb24ub3JnPC91cmw+Ci0KLSAgICA8cHJvcGVydGllcz4KLSAgICAgICAgPGpzZi1teWZhY2VzLnZlcnNpb24+MS4yLjEwPC9qc2YtbXlmYWNlcy52ZXJzaW9uPgotICAgICAgICA8anNmLXJpLnZlcnNpb24+MS4yXzE1PC9qc2YtcmkudmVyc2lvbj4gICAgICAgIAotICAgICAgICA8bWF2ZW4uamV0dHkucGx1Z2luLnZlcnNpb24+Ni4xLjIyPC9tYXZlbi5qZXR0eS5wbHVnaW4udmVyc2lvbj4KLSAgICAgICAgPGxvZzRqLnZlcnNpb24+MS4yLjEzPC9sb2c0ai52ZXJzaW9uPgotICAgIDwvcHJvcGVydGllcz4KLQotICAgIDxidWlsZD4KLSAgICAgICAgPGZpbmFsTmFtZT4ke2FydGlmYWN0SWR9PC9maW5hbE5hbWU+Ci0gICAgICAgIDxwbHVnaW5zPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8IS0tVGhpcyBwbHVnaW4gYWxsb3dzIHRvIHJ1biB0aGUgZXhhbXBsZSB1c2luZyBtdm4gamV0dHk6cnVuIC0tPgotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5tb3J0YmF5LmpldHR5PC9ncm91cElkPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWpldHR5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3N5bWJvbF9kb2xsYXJ9e21hdmVuLmpldHR5LnBsdWdpbi52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHNjYW5JbnRlcnZhbFNlY29uZHM+MTA8L3NjYW5JbnRlcnZhbFNlY29uZHM+Ci0gICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgIDwvcGx1Z2lucz4KLSAgICA8L2J1aWxkPgotICAgIAotICAgIDxwcm9maWxlcz4KLSAgICAgICAgPHByb2ZpbGU+Ci0gICAgICAgICAgICA8aWQ+bXlmYWNlczwvaWQ+Ci0gICAgICAgICAgICA8YWN0aXZhdGlvbj4KLSAgICAgICAgICAgICAgICA8cHJvcGVydHk+Ci0gICAgICAgICAgICAgICAgICAgIDxuYW1lPiFqc2Y8L25hbWU+Ci0gICAgICAgICAgICAgICAgPC9wcm9wZXJ0eT4KLSAgICAgICAgICAgIDwvYWN0aXZhdGlvbj4KLSAgICAgICAgICAgIDxkZXBlbmRlbmNpZXM+Ci0gICAgICAgICAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5jb3JlPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWFwaTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtzeW1ib2xfZG9sbGFyfXtqc2YtbXlmYWNlcy52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgotICAgICAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmNvcmU8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtaW1wbDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtzeW1ib2xfZG9sbGFyfXtqc2YtbXlmYWNlcy52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPHNjb3BlPnJ1bnRpbWU8L3Njb3BlPgotICAgICAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDwvZGVwZW5kZW5jaWVzPgotICAgICAgICA8L3Byb2ZpbGU+Ci0gICAgICAgIDxwcm9maWxlPgotICAgICAgICAgICAgPCEtLSBBY3RpdmUgYWRkaW5nIC1EanNmPXJpIHdoZW4gZXhlY3V0ZSBtYXZlbiBnb2Fscy4gLS0+Ci0gICAgICAgICAgICA8aWQ+anNmLXJpPC9pZD4KLSAgICAgICAgICAgIDxhY3RpdmF0aW9uPgotICAgICAgICAgICAgICAgIDxwcm9wZXJ0eT4KLSAgICAgICAgICAgICAgICAgICAgPG5hbWU+anNmPC9uYW1lPgotICAgICAgICAgICAgICAgICAgICA8dmFsdWU+cmk8L3ZhbHVlPgotICAgICAgICAgICAgICAgIDwvcHJvcGVydHk+Ci0gICAgICAgICAgICA8L2FjdGl2YXRpb24+Ci0gICAgICAgICAgICA8ZGVwZW5kZW5jaWVzPgotICAgICAgICAgICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC5mYWNlczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+anNmLWFwaTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtzeW1ib2xfZG9sbGFyfXtqc2YtcmkudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4KLSAgICAgICAgICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgICAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPmphdmF4LmZhY2VzPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qc2YtaW1wbDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtzeW1ib2xfZG9sbGFyfXtqc2YtcmkudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxzY29wZT5ydW50aW1lPC9zY29wZT4KLSAgICAgICAgICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8L2RlcGVuZGVuY2llcz4KLSAgICAgICAgICAgIDxyZXBvc2l0b3JpZXM+Ci0gICAgICAgICAgICAgICAgPHJlcG9zaXRvcnk+Ci0gICAgICAgICAgICAgICAgICAgIDxpZD5qYXZhLm5ldDwvaWQ+Ci0gICAgICAgICAgICAgICAgICAgIDx1cmw+aHR0cDovL2Rvd25sb2FkLmphdmEubmV0L21hdmVuLzE8L3VybD4KLSAgICAgICAgICAgICAgICAgICAgPGxheW91dD5sZWdhY3k8L2xheW91dD4KLSAgICAgICAgICAgICAgICA8L3JlcG9zaXRvcnk+Ci0gICAgICAgICAgICA8L3JlcG9zaXRvcmllcz4KLSAgICAgICAgPC9wcm9maWxlPgotICAgICAgICAKLSAgICAgICAgPHByb2ZpbGU+Ci0gICAgICAgICAgICA8IS0tIERlYnVnIHByb2ZpbGUgZm9yIG15ZmFjZXMgYW5kIGpldHR5LgotICAgICAgICAgICAgICAgIEl0IGFsbG93cyB0byBzZWUgZGVidWcgbWVzc2FnZXMgdXNpbmcgLVBqZXR0eUNvbmZpZyAtLT4KLSAgICAgICAgICAgIDxpZD5qZXR0eUNvbmZpZzwvaWQ+Ci0gICAgICAgICAgICA8YnVpbGQ+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlcz4KLSAgICAgICAgICAgICAgICAgICAgPHJlc291cmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGRpcmVjdG9yeT5zcmMvbWFpbi9yZXNvdXJjZXM8L2RpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICAgICAgPC9yZXNvdXJjZT4KLSAgICAgICAgICAgICAgICAgICAgPHJlc291cmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGRpcmVjdG9yeT5zcmMvbWFpbi9sb2c0ajwvZGlyZWN0b3J5PgotICAgICAgICAgICAgICAgICAgICA8L3Jlc291cmNlPgotICAgICAgICAgICAgICAgIDwvcmVzb3VyY2VzPgotICAgICAgICAgICAgICAgIDxwbHVnaW5zPgotICAgICAgICAgICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgICAgICAgICAgPCEtLVRoaXMgcGx1Z2luIGFsbG93cyB0byBydW4gdGhlIGV4YW1wbGUgdXNpbmcgbXZuIGpldHR5OnJ1biAtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5tb3J0YmF5LmpldHR5PC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tamV0dHktcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtzeW1ib2xfZG9sbGFyfXttYXZlbi5qZXR0eS5wbHVnaW4udmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2NhbkludGVydmFsU2Vjb25kcz4xMDwvc2NhbkludGVydmFsU2Vjb25kcz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3lzdGVtUHJvcGVydGllcz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN5c3RlbVByb3BlcnR5PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+b3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nPC9uYW1lPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZhbHVlPm9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLmltcGwuTG9nNEpMb2dnZXI8L3ZhbHVlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N5c3RlbVByb3BlcnR5PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3lzdGVtUHJvcGVydGllcz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgICAgICAgICAgPC9wbHVnaW5zPgotICAgICAgICAgICAgPC9idWlsZD4KLSAgICAgICAgICAgIDxkZXBlbmRlbmNpZXM+Ci0gICAgICAgICAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPmxvZzRqPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5sb2c0ajwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtzeW1ib2xfZG9sbGFyfXtsb2c0ai52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPHR5cGU+amFyPC90eXBlPgotICAgICAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDwvZGVwZW5kZW5jaWVzPgotICAgICAgICA8L3Byb2ZpbGU+Ci0gICAgPC9wcm9maWxlcz4KLQotICAgIDwhLS0gUHJvamVjdCBkZXBlbmRlbmNpZXMgLS0+Ci0gICAgPGRlcGVuZGVuY2llcz4KLSAgICAgICAgCi0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLnRvbWFoYXdrPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+dG9tYWhhd2sxMjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuMS45PC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPnJ1bnRpbWU8L3Njb3BlPiAgICAKLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICAKLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC5zZXJ2bGV0PC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+anN0bDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuMjwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxzY29wZT5ydW50aW1lPC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PiAgIAotICAgIAotICAgICAJPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5jb20uc3VuLmZhY2VsZXRzPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+anNmLWZhY2VsZXRzPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+MS4xLjE0PC92ZXJzaW9uPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5qdW5pdDwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmp1bml0PC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+NC4wPC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0KLSAgICA8L2RlcGVuZGVuY2llcz4KLQotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtaGVsbG93b3JsZC1mYWNlbGV0cy9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zcmMvbWFpbi9qYXZhL0hlbGxvV29ybGRCYWNraW5nLmphdmEgYi9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1oZWxsb3dvcmxkLWZhY2VsZXRzL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL2phdmEvSGVsbG9Xb3JsZEJhY2tpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTk0NzFiNS4uMDAwMDAwMAotLS0gYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1oZWxsb3dvcmxkLWZhY2VsZXRzL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL2phdmEvSGVsbG9Xb3JsZEJhY2tpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlICR7cGFja2FnZX07Ci0KLS8qKgotICogQSB0eXBpY2FsIHNpbXBsZSBiYWNraW5nIGJlYW4sIHRoYXQgaXMgYmFja2VkIHRvIDxjb2RlPmhlbGxvd29ybGQuanNwPC9jb2RlPgotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOm1hdHpld0BhcGFjaGUub3JnIj5NYXR0aGlhcyBXZd9lbmRvcmY8L2E+Ci0gKi8KLXB1YmxpYyBjbGFzcyBIZWxsb1dvcmxkQmFja2luZwotewotCi0gICAgLy9wcm9wZXJ0aWVzCi0gICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQotICAgIC8qKgotICAgICAqIGRlZmF1bHQgZW1wdHkgY29uc3RydWN0b3IKLSAgICAgKi8KLSAgICBwdWJsaWMgSGVsbG9Xb3JsZEJhY2tpbmcoKQotICAgIHsKLSAgICB9Ci0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS1nZXR0ZXIgJiBzZXR0ZXIKLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkKLSAgICB7Ci0gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTWV0aG9kIHRoYXQgaXMgYmFja2VkIHRvIGEgc3VibWl0IGJ1dHRvbiBvZiBhIGZvcm0uCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBzZW5kKCkKLSAgICB7Ci0gICAgICAgIC8vZG8gcmVhbCBsb2dpYwotICAgICAgICByZXR1cm4gKCJzdWNjZXNzIik7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWhlbGxvd29ybGQtZmFjZWxldHMvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc3JjL21haW4vbG9nNGovbG9nNGoucHJvcGVydGllcyBiL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWhlbGxvd29ybGQtZmFjZWxldHMvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc3JjL21haW4vbG9nNGovbG9nNGoucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzgzNTJlNC4uMDAwMDAwMAotLS0gYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1oZWxsb3dvcmxkLWZhY2VsZXRzL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL2xvZzRqL2xvZzRqLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotIyBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSMgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotIyBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotIyAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotIyB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1sb2c0ai5yb290TG9nZ2VyPUlORk8sIEExLCBBMgotbG9nNGouYXBwZW5kZXIuQTE9b3JnLmFwYWNoZS5sb2c0ai5Db25zb2xlQXBwZW5kZXIKLWxvZzRqLmFwcGVuZGVyLkExLmxheW91dD1vcmcuYXBhY2hlLmxvZzRqLlBhdHRlcm5MYXlvdXQKLQotI2xvZyBvbiBhIGZpbGUgb24gdGFyZ2V0IHRvbywgdG8gbWFrZSBlYXNpZXIgY2hlY2sgaXQKLWxvZzRqLmFwcGVuZGVyLkEyPW9yZy5hcGFjaGUubG9nNGouUm9sbGluZ0ZpbGVBcHBlbmRlcgotbG9nNGouYXBwZW5kZXIuQTIuRmlsZT10YXJnZXQvbG9nNGoubG9nCi1sb2c0ai5hcHBlbmRlci5BMi5NYXhGaWxlU2l6ZT0xMDAwS0IKLSMgS2VlcCBvbmUgYmFja3VwIGZpbGUKLWxvZzRqLmFwcGVuZGVyLkEyLk1heEJhY2t1cEluZGV4PTEKLWxvZzRqLmFwcGVuZGVyLkEyLmxheW91dD1vcmcuYXBhY2hlLmxvZzRqLlBhdHRlcm5MYXlvdXQKLWxvZzRqLmFwcGVuZGVyLkEyLmxheW91dC5Db252ZXJzaW9uUGF0dGVybj0lcCAldCAlYyAtICVtJW4KLQotIyBMb2cgbGV2ZWwgZm9yIG15ZmFjZXMgbGlicmFyaWVzCi1sb2c0ai5sb2dnZXIub3JnLmFwYWNoZS5jb21tb25zPUlORk8KLWxvZzRqLmxvZ2dlci5vcmcuYXBhY2hlLm15ZmFjZXM9VFJBQ0UKLWxvZzRqLmxvZ2dlci5qYXZheC5mYWNlcz1UUkFDRQotCi0jIFByaW50IHRoZSBkYXRlIGluIElTTyA4NjAxIGZvcm1hdAotbG9nNGouYXBwZW5kZXIuQTEubGF5b3V0LkNvbnZlcnNpb25QYXR0ZXJuPSU1cCBbJXRdICglRlw6JUwpIC0gJW0lbgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWhlbGxvd29ybGQtZmFjZWxldHMvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvZXhhbXBsZXMtY29uZmlnLnhtbCBiL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWhlbGxvd29ybGQtZmFjZWxldHMvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvZXhhbXBsZXMtY29uZmlnLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTM1NTFlNS4uMDAwMDAwMAotLS0gYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1oZWxsb3dvcmxkLWZhY2VsZXRzL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL2V4YW1wbGVzLWNvbmZpZy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhLS0KLSAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gICAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gICAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gICAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICAgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICAgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICAgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgICB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPCFET0NUWVBFIGZhY2VzLWNvbmZpZyBQVUJMSUMKLSAgIi0vL1N1biBNaWNyb3N5c3RlbXMsIEluYy4vL0RURCBKYXZhU2VydmVyIEZhY2VzIENvbmZpZyAxLjAvL0VOIgotICAiaHR0cDovL2phdmEuc3VuLmNvbS9kdGQvd2ViLWZhY2VzY29uZmlnXzFfMS5kdGQiID4KLQotPGZhY2VzLWNvbmZpZz4KLQotCTxhcHBsaWNhdGlvbj4KLQkJPHZpZXctaGFuZGxlcj5jb20uc3VuLmZhY2VsZXRzLkZhY2VsZXRWaWV3SGFuZGxlcjwvdmlldy1oYW5kbGVyPgotCTwvYXBwbGljYXRpb24+Ci0KLQk8IS0tIG1hbmFnZWQgYmVhbnMgb2YgdGhlIHNpbXBsZSBoZWxsbyB3b3JsZCBhcHAgLS0+Ci0JPG1hbmFnZWQtYmVhbj4KLQkJPG1hbmFnZWQtYmVhbi1uYW1lPmhlbGxvV29ybGRCYWNraW5nPC9tYW5hZ2VkLWJlYW4tbmFtZT4KLQkJPG1hbmFnZWQtYmVhbi1jbGFzcz4KLQkJCSR7cGFja2FnZX0uSGVsbG9Xb3JsZEJhY2tpbmcKLQkJPC9tYW5hZ2VkLWJlYW4tY2xhc3M+Ci0JCTxtYW5hZ2VkLWJlYW4tc2NvcGU+cmVxdWVzdDwvbWFuYWdlZC1iZWFuLXNjb3BlPgotCTwvbWFuYWdlZC1iZWFuPgotCi0JPCEtLSBuYXZpZ2F0aW9uIHJ1bGVzIGZvciBoZWxsb1dvcmxkLmpzcCAtLT4KLQk8bmF2aWdhdGlvbi1ydWxlPgotCQk8ZnJvbS12aWV3LWlkPi9oZWxsb1dvcmxkLnhodG1sPC9mcm9tLXZpZXctaWQ+Ci0JCTxuYXZpZ2F0aW9uLWNhc2U+Ci0JCQk8ZnJvbS1vdXRjb21lPnN1Y2Nlc3M8L2Zyb20tb3V0Y29tZT4KLQkJCTx0by12aWV3LWlkPi9wYWdlMi54aHRtbDwvdG8tdmlldy1pZD4KLQkJPC9uYXZpZ2F0aW9uLWNhc2U+Ci0JPC9uYXZpZ2F0aW9uLXJ1bGU+Ci0KLQk8IS0tIG5hdmlnYXRpb24gcnVsZXMgZm9yIHBhZ2UyLmpzcCAtLT4KLQk8bmF2aWdhdGlvbi1ydWxlPgotCQk8ZnJvbS12aWV3LWlkPi9wYWdlMi54aHRtbDwvZnJvbS12aWV3LWlkPgotCQk8bmF2aWdhdGlvbi1jYXNlPgotCQkJPGZyb20tb3V0Y29tZT5iYWNrPC9mcm9tLW91dGNvbWU+Ci0JCQk8dG8tdmlldy1pZD4vaGVsbG9Xb3JsZC54aHRtbDwvdG8tdmlldy1pZD4KLQkJPC9uYXZpZ2F0aW9uLWNhc2U+Ci0JPC9uYXZpZ2F0aW9uLXJ1bGU+Ci08L2ZhY2VzLWNvbmZpZz4KZGlmZiAtLWdpdCBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWhlbGxvd29ybGQtZmFjZWxldHMvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbCBiL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWhlbGxvd29ybGQtZmFjZWxldHMvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODgxMzg1Yi4uMDAwMDAwMAotLS0gYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1oZWxsb3dvcmxkLWZhY2VsZXRzL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNzAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tCi0gICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICAgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICAgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gICAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICAgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gICAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gICAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gICAgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTx3ZWItYXBwIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlIgotCXhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0JeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUvd2ViLWFwcF8yXzQueHNkIgotCXZlcnNpb249IjIuNCI+Ci0KLQk8ZGVzY3JpcHRpb24+TXlQcm9qZWN0IHdlYi54bWw8L2Rlc2NyaXB0aW9uPgotCi0JPGNvbnRleHQtcGFyYW0+Ci0JCTxwYXJhbS1uYW1lPgotCQkJb3JnLmpib3NzLmpib3NzZmFjZXMuV0FSX0JVTkRMRVNfSlNGX0lNUEwKLQkJPC9wYXJhbS1uYW1lPgotCQk8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+Ci0JPC9jb250ZXh0LXBhcmFtPgotCi0JPCEtLSBVc2UgRG9jdW1lbnRzIFNhdmVkIGFzICoueGh0bWwgLS0+Ci0JPGNvbnRleHQtcGFyYW0+Ci0JCTxwYXJhbS1uYW1lPmphdmF4LmZhY2VzLkRFRkFVTFRfU1VGRklYPC9wYXJhbS1uYW1lPgotCQk8cGFyYW0tdmFsdWU+LnhodG1sPC9wYXJhbS12YWx1ZT4KLQk8L2NvbnRleHQtcGFyYW0+Ci0KLQk8IS0tIFNwZWNpYWwgRGVidWcgT3V0cHV0IGZvciBEZXZlbG9wbWVudCAtLT4KLQk8Y29udGV4dC1wYXJhbT4KLQkJPHBhcmFtLW5hbWU+ZmFjZWxldHMuREVWRUxPUE1FTlQ8L3BhcmFtLW5hbWU+Ci0JCTxwYXJhbS12YWx1ZT50cnVlPC9wYXJhbS12YWx1ZT4KLQk8L2NvbnRleHQtcGFyYW0+Ci0KLQk8Y29udGV4dC1wYXJhbT4KLQkJPGRlc2NyaXB0aW9uPgotCQkJQ29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgVVJJcyBvZiAoYWRkaXRpb25hbCkgZmFjZXMgY29uZmlnCi0JCQlmaWxlcy4gKGUuZy4gL1dFQi1JTkYvbXktY29uZmlnLnhtbCkgU2VlIEpTRiAxLjAgUFJEMiwKLQkJCTEwLjMuMiBBdHRlbnRpb246IFlvdSBkbyBub3QgbmVlZCB0byBwdXQKLQkJCS9XRUItSU5GL2ZhY2VzLWNvbmZpZy54bWwgaW4gaGVyZS4KLQkJPC9kZXNjcmlwdGlvbj4KLQkJPHBhcmFtLW5hbWU+amF2YXguZmFjZXMuQ09ORklHX0ZJTEVTPC9wYXJhbS1uYW1lPgotCQk8cGFyYW0tdmFsdWU+L1dFQi1JTkYvZXhhbXBsZXMtY29uZmlnLnhtbDwvcGFyYW0tdmFsdWU+Ci0JPC9jb250ZXh0LXBhcmFtPgotCTxjb250ZXh0LXBhcmFtPgotCQk8ZGVzY3JpcHRpb24+Ci0JCQlTdGF0ZSBzYXZpbmcgbWV0aG9kOiAiY2xpZW50IiBvciAic2VydmVyIiAoPSBkZWZhdWx0KSBTZWUKLQkJCUpTRiBTcGVjaWZpY2F0aW9uIDIuNS4zCi0JCTwvZGVzY3JpcHRpb24+Ci0JCTxwYXJhbS1uYW1lPmphdmF4LmZhY2VzLlNUQVRFX1NBVklOR19NRVRIT0Q8L3BhcmFtLW5hbWU+Ci0JCTxwYXJhbS12YWx1ZT5jbGllbnQ8L3BhcmFtLXZhbHVlPgotCTwvY29udGV4dC1wYXJhbT4KLQk8Y29udGV4dC1wYXJhbT4KLQkJPGRlc2NyaXB0aW9uPgotCQkJT25seSBhcHBsaWNhYmxlIGlmIHN0YXRlIHNhdmluZyBtZXRob2QgaXMgInNlcnZlciIgKD0KLQkJCWRlZmF1bHQpLiBEZWZpbmVzIHRoZSBhbW91bnQgKGRlZmF1bHQgPSAyMCkgb2YgdGhlIGxhdGVzdAotCQkJdmlld3MgYXJlIHN0b3JlZCBpbiBzZXNzaW9uLgotCQk8L2Rlc2NyaXB0aW9uPgotCQk8cGFyYW0tbmFtZT4KLQkJCW9yZy5hcGFjaGUubXlmYWNlcy5OVU1CRVJfT0ZfVklFV1NfSU5fU0VTU0lPTgotCQk8L3BhcmFtLW5hbWU+Ci0JCTxwYXJhbS12YWx1ZT4yMDwvcGFyYW0tdmFsdWU+Ci0JPC9jb250ZXh0LXBhcmFtPgotCTxjb250ZXh0LXBhcmFtPgotCQk8ZGVzY3JpcHRpb24+Ci0JCQlPbmx5IGFwcGxpY2FibGUgaWYgc3RhdGUgc2F2aW5nIG1ldGhvZCBpcyAic2VydmVyIiAoPQotCQkJZGVmYXVsdCkuIElmIHRydWUgKGRlZmF1bHQpIHRoZSBzdGF0ZSB3aWxsIGJlIHNlcmlhbGl6ZWQgdG8KLQkJCWEgYnl0ZSBzdHJlYW0gYmVmb3JlIGl0IGlzIHdyaXR0ZW4gdG8gdGhlIHNlc3Npb24uIElmIGZhbHNlCi0JCQl0aGUgc3RhdGUgd2lsbCBub3QgYmUgc2VyaWFsaXplZCB0byBhIGJ5dGUgc3RyZWFtLgotCQk8L2Rlc2NyaXB0aW9uPgotCQk8cGFyYW0tbmFtZT4KLQkJCW9yZy5hcGFjaGUubXlmYWNlcy5TRVJJQUxJWkVfU1RBVEVfSU5fU0VTU0lPTgotCQk8L3BhcmFtLW5hbWU+Ci0JCTxwYXJhbS12YWx1ZT50cnVlPC9wYXJhbS12YWx1ZT4KLQk8L2NvbnRleHQtcGFyYW0+Ci0JPGNvbnRleHQtcGFyYW0+Ci0JCTxkZXNjcmlwdGlvbj4KLQkJCU9ubHkgYXBwbGljYWJsZSBpZiBzdGF0ZSBzYXZpbmcgbWV0aG9kIGlzICJzZXJ2ZXIiICg9Ci0JCQlkZWZhdWx0KSBhbmQgaWYKLQkJCW9yZy5hcGFjaGUubXlmYWNlcy5TRVJJQUxJWkVfU1RBVEVfSU5fU0VTU0lPTiBpcyB0cnVlICg9Ci0JCQlkZWZhdWx0KSBJZiB0cnVlIChkZWZhdWx0KSB0aGUgc2VyaWFsaXplZCBzdGF0ZSB3aWxsIGJlCi0JCQljb21wcmVzc2VkIGJlZm9yZSBpdCBpcyB3cml0dGVuIHRvIHRoZSBzZXNzaW9uLiBJZiBmYWxzZSB0aGUKLQkJCXN0YXRlIHdpbGwgbm90IGJlIGNvbXByZXNzZWQuCi0JCTwvZGVzY3JpcHRpb24+Ci0JCTxwYXJhbS1uYW1lPgotCQkJb3JnLmFwYWNoZS5teWZhY2VzLkNPTVBSRVNTX1NUQVRFX0lOX1NFU1NJT04KLQkJPC9wYXJhbS1uYW1lPgotCQk8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+Ci0JPC9jb250ZXh0LXBhcmFtPgotCTxjb250ZXh0LXBhcmFtPgotCQk8ZGVzY3JpcHRpb24+Ci0JCQlUaGlzIHBhcmFtZXRlciB0ZWxscyBNeUZhY2VzIGlmIGphdmFzY3JpcHQgY29kZSBzaG91bGQgYmUKLQkJCWFsbG93ZWQgaW4gdGhlIHJlbmRlcmVkIEhUTUwgb3V0cHV0LiBJZiBqYXZhc2NyaXB0IGlzCi0JCQlhbGxvd2VkLCBjb21tYW5kX2xpbmsgYW5jaG9ycyB3aWxsIGhhdmUgamF2YXNjcmlwdCBjb2RlIHRoYXQKLQkJCXN1Ym1pdHMgdGhlIGNvcnJlc3BvbmRpbmcgZm9ybS4gSWYgamF2YXNjcmlwdCBpcyBub3QKLQkJCWFsbG93ZWQsIHRoZSBzdGF0ZSBzYXZpbmcgaW5mbyBhbmQgbmVzdGVkIHBhcmFtZXRlcnMgd2lsbCBiZQotCQkJYWRkZWQgYXMgdXJsIHBhcmFtZXRlcnMuIERlZmF1bHQ6ICJ0cnVlIgotCQk8L2Rlc2NyaXB0aW9uPgotCQk8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuQUxMT1dfSkFWQVNDUklQVDwvcGFyYW0tbmFtZT4KLQkJPHBhcmFtLXZhbHVlPnRydWU8L3BhcmFtLXZhbHVlPgotCTwvY29udGV4dC1wYXJhbT4KLQk8Y29udGV4dC1wYXJhbT4KLQkJPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLkRFVEVDVF9KQVZBU0NSSVBUPC9wYXJhbS1uYW1lPgotCQk8cGFyYW0tdmFsdWU+ZmFsc2U8L3BhcmFtLXZhbHVlPgotCTwvY29udGV4dC1wYXJhbT4KLQk8Y29udGV4dC1wYXJhbT4KLQkJPGRlc2NyaXB0aW9uPgotCQkJSWYgdHJ1ZSwgcmVuZGVyZWQgSFRNTCBjb2RlIHdpbGwgYmUgZm9ybWF0dGVkLCBzbyB0aGF0IGl0IGlzCi0JCQkiaHVtYW4gcmVhZGFibGUiLiBpLmUuIGFkZGl0aW9uYWwgbGluZSBzZXBhcmF0b3JzIGFuZAotCQkJd2hpdGVzcGFjZSB3aWxsIGJlIHdyaXR0ZW4sIHRoYXQgZG8gbm90IGluZmx1ZW5jZSB0aGUgSFRNTAotCQkJY29kZS4gRGVmYXVsdDogInRydWUiCi0JCTwvZGVzY3JpcHRpb24+Ci0JCTxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5QUkVUVFlfSFRNTDwvcGFyYW0tbmFtZT4KLQkJPHBhcmFtLXZhbHVlPnRydWU8L3BhcmFtLXZhbHVlPgotCTwvY29udGV4dC1wYXJhbT4KLQk8Y29udGV4dC1wYXJhbT4KLQkJPGRlc2NyaXB0aW9uPgotCQkJSWYgdHJ1ZSwgYSBqYXZhc2NyaXB0IGZ1bmN0aW9uIHdpbGwgYmUgcmVuZGVyZWQgdGhhdCBpcyBhYmxlCi0JCQl0byByZXN0b3JlIHRoZSBmb3JtZXIgdmVydGljYWwgc2Nyb2xsIG9uIGV2ZXJ5IHJlcXVlc3QuCi0JCQlDb252ZW5pZW50IGZlYXR1cmUgaWYgeW91IGhhdmUgcGFnZXMgd2l0aCBsb25nIGxpc3RzIGFuZCB5b3UKLQkJCWRvIG5vdCB3YW50IHRoZSBicm93c2VyIHBhZ2UgdG8gYWx3YXlzIGp1bXAgdG8gdGhlIHRvcCBpZgotCQkJeW91IHRyaWdnZXIgYSBsaW5rIG9yIGJ1dHRvbiBhY3Rpb24gdGhhdCBzdGF5cyBvbiB0aGUgc2FtZQotCQkJcGFnZS4gRGVmYXVsdDogImZhbHNlIgotCQk8L2Rlc2NyaXB0aW9uPgotCQk8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuQVVUT19TQ1JPTEw8L3BhcmFtLW5hbWU+Ci0JCTxwYXJhbS12YWx1ZT50cnVlPC9wYXJhbS12YWx1ZT4KLQk8L2NvbnRleHQtcGFyYW0+Ci0KLQk8Y29udGV4dC1wYXJhbT4KLQkJPGRlc2NyaXB0aW9uPgotCQkJVXNlZCBmb3IgZW5jcnlwdGluZyB2aWV3IHN0YXRlLiBPbmx5IHJlbGV2YW50IGZvciBjbGllbnQKLQkJCXNpZGUgc3RhdGUgc2F2aW5nLiBTZWUgTXlGYWNlcyB3aWtpL3dlYiBzaXRlIGRvY3VtZW50YXRpb24KLQkJCWZvciBpbnN0cnVjdGlvbnMgb24gaG93IHRvIGNvbmZpZ3VyZSBhbiBhcHBsaWNhdGlvbiBmb3IKLQkJCWRpZmZlbmVudCBlbmNyeXB0aW9uIHN0cmVuZ3Rocy4KLQkJPC9kZXNjcmlwdGlvbj4KLQkJPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLlNFQ1JFVDwvcGFyYW0tbmFtZT4KLQkJPHBhcmFtLXZhbHVlPk56WTFORE15TVRBPTwvcGFyYW0tdmFsdWU+Ci0JPC9jb250ZXh0LXBhcmFtPgotCi0JPGNvbnRleHQtcGFyYW0+Ci0JCTxkZXNjcmlwdGlvbj4KLQkJCVZhbGlkYXRlIG1hbmFnZWQgYmVhbnMsIG5hdmlnYXRpb24gcnVsZXMgYW5kIGVuc3VyZSB0aGF0Ci0JCQlmb3JtcyBhcmUgbm90IG5lc3RlZC4KLQkJPC9kZXNjcmlwdGlvbj4KLQkJPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLlZBTElEQVRFPC9wYXJhbS1uYW1lPgotCQk8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+Ci0JPC9jb250ZXh0LXBhcmFtPgotCi0JPGNvbnRleHQtcGFyYW0+Ci0JCTxkZXNjcmlwdGlvbj4KLQkJCVRyZWF0IHJlYWRvbmx5IHNhbWUgYXMgaWYgZGlzYWJsZWQgYXR0cmlidXRlIHdhcyBzZXQgZm9yCi0JCQlzZWxlY3QgZWxlbWVudHMuCi0JCTwvZGVzY3JpcHRpb24+Ci0JCTxwYXJhbS1uYW1lPgotCQkJb3JnLmFwYWNoZS5teWZhY2VzLlJFQURPTkxZX0FTX0RJU0FCTEVEX0ZPUl9TRUxFQ1RTCi0JCTwvcGFyYW0tbmFtZT4KLQkJPHBhcmFtLXZhbHVlPnRydWU8L3BhcmFtLXZhbHVlPgotCTwvY29udGV4dC1wYXJhbT4KLQotCTxjb250ZXh0LXBhcmFtPgotCQk8ZGVzY3JpcHRpb24+Ci0JCQlVc2UgdGhlIGRlZmluZWQgY2xhc3MgYXMgdGhlIGNsYXNzIHdoaWNoIHdpbGwgYmUgY2FsbGVkIHdoZW4KLQkJCWEgcmVzb3VyY2UgaXMgYWRkZWQgdG8gdGhlIEV4dGVuc2lvbkZpbHRlciBoYW5kbGluZy4gVXNpbmcKLQkJCVN0cmVhbWluZ0FkZFJlc291cmNlIGhlcmUgaGVscHMgd2l0aCBwZXJmb3JtYW5jZS4gSWYgeW91Ci0JCQl3YW50IHRvIGFkZCBjdXN0b20gY29tcG9uZW50cyBhbmQgd2FudCB0byB1c2UgdGhlCi0JCQlFeHRlbnNpb25GaWx0ZXIsIHlvdSBuZWVkIHRvIHByb3ZpZGUgeW91ciBjdXN0b20KLQkJCWltcGxlbWVudGF0aW9uIGhlcmUuCi0JCTwvZGVzY3JpcHRpb24+Ci0JCTxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5BRERfUkVTT1VSQ0VfQ0xBU1M8L3BhcmFtLW5hbWU+Ci0JCTxwYXJhbS12YWx1ZT4KLQkJCW9yZy5hcGFjaGUubXlmYWNlcy5yZW5kZXJraXQuaHRtbC51dGlsLkRlZmF1bHRBZGRSZXNvdXJjZQotCQk8L3BhcmFtLXZhbHVlPgotCTwvY29udGV4dC1wYXJhbT4KLQotCTxjb250ZXh0LXBhcmFtPgotCQk8ZGVzY3JpcHRpb24+Ci0JCQlWaXJ0dWFsIHBhdGggaW4gdGhlIFVSTCB3aGljaCB0cmlnZ2VycyBsb2FkaW5nIG9mIHJlc291cmNlcwotCQkJZm9yIHRoZSBNeUZhY2VzIGV4dGVuZGVkIGNvbXBvbmVudHMgaW4gdGhlIEV4dGVuc2lvbkZpbHRlci4KLQkJPC9kZXNjcmlwdGlvbj4KLQkJPHBhcmFtLW5hbWU+Ci0JCQlvcmcuYXBhY2hlLm15ZmFjZXMuUkVTT1VSQ0VfVklSVFVBTF9QQVRICi0JCTwvcGFyYW0tbmFtZT4KLQkJPHBhcmFtLXZhbHVlPi9mYWNlcy9teUZhY2VzRXh0ZW5zaW9uUmVzb3VyY2U8L3BhcmFtLXZhbHVlPgotCTwvY29udGV4dC1wYXJhbT4KLQotCTxjb250ZXh0LXBhcmFtPgotCQk8ZGVzY3JpcHRpb24+Ci0JCQlDaGVjayBpZiB0aGUgZXh0ZW5zaW9ucy1maWx0ZXIgaGFzIGJlZW4gcHJvcGVybHkgY29uZmlndXJlZC4KLQkJPC9kZXNjcmlwdGlvbj4KLQkJPHBhcmFtLW5hbWU+Ci0JCQlvcmcuYXBhY2hlLm15ZmFjZXMuQ0hFQ0tfRVhURU5TSU9OU19GSUxURVIKLQkJPC9wYXJhbS1uYW1lPgotCQk8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+Ci0JPC9jb250ZXh0LXBhcmFtPgotCi0JPGNvbnRleHQtcGFyYW0+Ci0JCTxkZXNjcmlwdGlvbj4KLQkJCURlZmluZSBwYXJ0aWFsIHN0YXRlIHNhdmluZyBhcyB0cnVlL2ZhbHNlLgotCQk8L2Rlc2NyaXB0aW9uPgotCQk8cGFyYW0tbmFtZT5qYXZheC5mYWNlcy5QQVJUSUFMX1NUQVRFX1NBVklOR19NRVRIT0Q8L3BhcmFtLW5hbWU+Ci0JCTxwYXJhbS12YWx1ZT5mYWxzZTwvcGFyYW0tdmFsdWU+Ci0JPC9jb250ZXh0LXBhcmFtPgotCi0JPCEtLSBFeHRlbnNpb25zIEZpbHRlciAtLT4KLQk8ZmlsdGVyPgotCQk8ZmlsdGVyLW5hbWU+ZXh0ZW5zaW9uc0ZpbHRlcjwvZmlsdGVyLW5hbWU+Ci0JCTxmaWx0ZXItY2xhc3M+Ci0JCQlvcmcuYXBhY2hlLm15ZmFjZXMud2ViYXBwLmZpbHRlci5FeHRlbnNpb25zRmlsdGVyCi0JCTwvZmlsdGVyLWNsYXNzPgotCQk8aW5pdC1wYXJhbT4KLQkJCTxkZXNjcmlwdGlvbj4KLQkJCQlTZXQgdGhlIHNpemUgbGltaXQgZm9yIHVwbG9hZGVkIGZpbGVzLiBGb3JtYXQ6IDEwIC0gMTAKLQkJCQlieXRlcyAxMGsgLSAxMCBLQiAxMG0gLSAxMCBNQiAxZyAtIDEgR0IKLQkJCTwvZGVzY3JpcHRpb24+Ci0JCQk8cGFyYW0tbmFtZT51cGxvYWRNYXhGaWxlU2l6ZTwvcGFyYW0tbmFtZT4KLQkJCTxwYXJhbS12YWx1ZT4xMDBtPC9wYXJhbS12YWx1ZT4KLQkJPC9pbml0LXBhcmFtPgotCQk8aW5pdC1wYXJhbT4KLQkJCTxkZXNjcmlwdGlvbj4KLQkJCQlTZXQgdGhlIHRocmVzaG9sZCBzaXplIC0gZmlsZXMgYmVsb3cgdGhpcyBsaW1pdCBhcmUKLQkJCQlzdG9yZWQgaW4gbWVtb3J5LCBmaWxlcyBhYm92ZSB0aGlzIGxpbWl0IGFyZSBzdG9yZWQgb24KLQkJCQlkaXNrLgotCi0JCQkJRm9ybWF0OiAxMCAtIDEwIGJ5dGVzIDEwayAtIDEwIEtCIDEwbSAtIDEwIE1CIDFnIC0gMSBHQgotCQkJPC9kZXNjcmlwdGlvbj4KLQkJCTxwYXJhbS1uYW1lPnVwbG9hZFRocmVzaG9sZFNpemU8L3BhcmFtLW5hbWU+Ci0JCQk8cGFyYW0tdmFsdWU+MTAwazwvcGFyYW0tdmFsdWU+Ci0JCTwvaW5pdC1wYXJhbT4KLQk8L2ZpbHRlcj4KLQotCTxmaWx0ZXItbWFwcGluZz4KLQkJPGZpbHRlci1uYW1lPmV4dGVuc2lvbnNGaWx0ZXI8L2ZpbHRlci1uYW1lPgotCQk8dXJsLXBhdHRlcm4+Ki5qc2Y8L3VybC1wYXR0ZXJuPgotCTwvZmlsdGVyLW1hcHBpbmc+Ci0JPGZpbHRlci1tYXBwaW5nPgotCQk8ZmlsdGVyLW5hbWU+ZXh0ZW5zaW9uc0ZpbHRlcjwvZmlsdGVyLW5hbWU+Ci0JCTx1cmwtcGF0dGVybj4vZmFjZXMvKjwvdXJsLXBhdHRlcm4+Ci0JPC9maWx0ZXItbWFwcGluZz4KLQotCTwhLS0gRmFjZXMgU2VydmxldCAtLT4KLQk8c2VydmxldD4KLQkJPHNlcnZsZXQtbmFtZT5GYWNlcyBTZXJ2bGV0PC9zZXJ2bGV0LW5hbWU+Ci0JCTxzZXJ2bGV0LWNsYXNzPmphdmF4LmZhY2VzLndlYmFwcC5GYWNlc1NlcnZsZXQ8L3NlcnZsZXQtY2xhc3M+Ci0JCTxsb2FkLW9uLXN0YXJ0dXA+MTwvbG9hZC1vbi1zdGFydHVwPgotCTwvc2VydmxldD4KLQotCTwhLS0gRmFjZXMgU2VydmxldCBNYXBwaW5nIC0tPgotCTxzZXJ2bGV0LW1hcHBpbmc+Ci0JCTxzZXJ2bGV0LW5hbWU+RmFjZXMgU2VydmxldDwvc2VydmxldC1uYW1lPgotCQk8dXJsLXBhdHRlcm4+Ki5qc2Y8L3VybC1wYXR0ZXJuPgotCTwvc2VydmxldC1tYXBwaW5nPgotCi0JPCEtLSBXZWxjb21lIGZpbGVzIC0tPgotCTx3ZWxjb21lLWZpbGUtbGlzdD4KLQkJPHdlbGNvbWUtZmlsZT5pbmRleC5qc3A8L3dlbGNvbWUtZmlsZT4KLQkJPHdlbGNvbWUtZmlsZT5pbmRleC5odG1sPC93ZWxjb21lLWZpbGU+Ci0JPC93ZWxjb21lLWZpbGUtbGlzdD4KLQotPC93ZWItYXBwPgpkaWZmIC0tZ2l0IGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtaGVsbG93b3JsZC1mYWNlbGV0cy9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zcmMvbWFpbi93ZWJhcHAvaGVsbG9Xb3JsZC54aHRtbCBiL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWhlbGxvd29ybGQtZmFjZWxldHMvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc3JjL21haW4vd2ViYXBwL2hlbGxvV29ybGQueGh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3NzBlYjYuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtaGVsbG93b3JsZC1mYWNlbGV0cy9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zcmMvbWFpbi93ZWJhcHAvaGVsbG9Xb3JsZC54aHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/Pg0KLTwhLS0NCi0gICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gICAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gICAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICAgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gICAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi0gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gICAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gICAgdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPg0KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIg0KLQl4bWxuczp1aT0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvZmFjZWxldHMiDQotCXhtbG5zOmY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2NvcmUiDQotCXhtbG5zOmg9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2h0bWwiPg0KLTxoZWFkPg0KLTx0aXRsZT5IZWxsbyBXb3JsZDwvdGl0bGU+DQotPC9oZWFkPg0KLTxib2R5Pg0KLTx1aTpjb21wb3NpdGlvbiB0ZW1wbGF0ZT0iL3RlbXBsYXRlLnhodG1sIj4NCi0NCi0JPHVpOmRlZmluZSBuYW1lPSJib2R5Ij4NCi0JCTxoOmZvcm0gaWQ9ImZvcm0iPg0KLQkJCTxoOnBhbmVsR3JpZCBpZD0iZ3JpZCIgY29sdW1ucz0iMiI+DQotCQkJCTxoOm91dHB1dFRleHQgaWQ9Im91dHB1dDEiIHZhbHVlPSJQbGVhc2UgZW50ZXIgeW91ciBuYW1lIiAvPg0KLQkJCQk8aDppbnB1dFRleHQgaWQ9ImlucHV0MSIgdmFsdWU9IiN7aGVsbG9Xb3JsZEJhY2tpbmcubmFtZX0iDQotCQkJCQlyZXF1aXJlZD0idHJ1ZSIgLz4NCi0JCQkJPGg6Y29tbWFuZEJ1dHRvbiBpZD0iYnV0dG9uMSIgdmFsdWU9InByZXNzIG1lIg0KLQkJCQkJYWN0aW9uPSIje2hlbGxvV29ybGRCYWNraW5nLnNlbmR9IiAvPg0KLQkJCQk8aDptZXNzYWdlIGlkPSJtZXNzYWdlMSIgZm9yPSJpbnB1dDEiIC8+DQotCQkJPC9oOnBhbmVsR3JpZD4NCi0JCTwvaDpmb3JtPg0KLQk8L3VpOmRlZmluZT4NCi08L3VpOmNvbXBvc2l0aW9uPg0KLTwvYm9keT4NCi08L2h0bWw+DQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtaGVsbG93b3JsZC1mYWNlbGV0cy9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zcmMvbWFpbi93ZWJhcHAvaW5kZXguanNwIGIvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtaGVsbG93b3JsZC1mYWNlbGV0cy9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zcmMvbWFpbi93ZWJhcHAvaW5kZXguanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YWFjYTU1Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWhlbGxvd29ybGQtZmFjZWxldHMvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc3JjL21haW4vd2ViYXBwL2luZGV4LmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTwlLS0KLSAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gICAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gICAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gICAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICAgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICAgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICAgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgICB1bmRlciB0aGUgTGljZW5zZS4KLS0tJT4KLTwlQCBwYWdlIHNlc3Npb249ImZhbHNlIiU+Ci08JQotcmVzcG9uc2Uuc2VuZFJlZGlyZWN0KCJoZWxsb1dvcmxkLmpzZiIpOwotJT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1oZWxsb3dvcmxkLWZhY2VsZXRzL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL3dlYmFwcC9wYWdlMi54aHRtbCBiL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWhlbGxvd29ybGQtZmFjZWxldHMvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc3JjL21haW4vd2ViYXBwL3BhZ2UyLnhodG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTc4ZTExLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWhlbGxvd29ybGQtZmFjZWxldHMvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc3JjL21haW4vd2ViYXBwL3BhZ2UyLnhodG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+DQotPCEtLQ0KLSAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICAgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICAgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gICAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICAgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICAgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gICAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgICB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+DQotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiDQotCXhtbG5zOnVpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9mYWNlbGV0cyINCi0JeG1sbnM6Zj0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvY29yZSINCi0JeG1sbnM6aD0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvaHRtbCI+DQotPGhlYWQ+DQotPHRpdGxlPkhlbGxvIFdvcmxkPC90aXRsZT4NCi08L2hlYWQ+DQotPGJvZHk+DQotDQotPGY6dmlldz4NCi0JPGg6b3V0cHV0VGV4dA0KLQkJdmFsdWU9IkhlbGxvICN7aGVsbG9Xb3JsZEJhY2tpbmcubmFtZX0uIFdlIGhvcGUgeW91IGVuam95IEFwYWNoZSBNeUZhY2VzIiAvPg0KLQk8aDpmb3JtIGlkPSJmb3JtMiI+DQotCQk8aDpjb21tYW5kTGluayBpZD0ibGluazEiIGFjdGlvbj0iYmFjayI+DQotCQkJPGg6b3V0cHV0VGV4dCBpZD0ibGlua1RleHQiIHZhbHVlPSJHTyBIT01FIiAvPg0KLQkJPC9oOmNvbW1hbmRMaW5rPg0KLQk8L2g6Zm9ybT4NCi08L2Y6dmlldz4NCi08L2JvZHk+DQotPC9odG1sPg0KZGlmZiAtLWdpdCBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWhlbGxvd29ybGQtZmFjZWxldHMvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc3JjL21haW4vd2ViYXBwL3RlbXBsYXRlLnhodG1sIGIvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtaGVsbG93b3JsZC1mYWNlbGV0cy9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zcmMvbWFpbi93ZWJhcHAvdGVtcGxhdGUueGh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhMzE2Y2YuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtaGVsbG93b3JsZC1mYWNlbGV0cy9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zcmMvbWFpbi93ZWJhcHAvdGVtcGxhdGUueGh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4NCi08IS0tDQotICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gICAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICAgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICAgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gICAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICAgIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gICAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gICAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICAgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICAgIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4NCi08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCINCi0JeG1sbnM6dWk9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2ZhY2VsZXRzIg0KLQl4bWxuczpmPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9jb3JlIg0KLQl4bWxuczpoPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9odG1sIj4NCi08aGVhZD4NCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIiAvPg0KLTx0aXRsZT5NeWZhY2VzIEV4YW1wbGUgRmFjZWxldHM8L3RpdGxlPg0KLTwvaGVhZD4NCi0NCi08Ym9keT4NCi08aDE+PHVpOmluc2VydCBuYW1lPSJ0aXRsZSI+TXlmYWNlcyBFeGFtcGxlIEZhY2VsZXRzPC91aTppbnNlcnQ+PC9oMT4NCi08cD48dWk6aW5zZXJ0IG5hbWU9ImJvZHkiPkhlbGxvIFdvcmxkIEV4YW1wbGUhPC91aTppbnNlcnQ+PC9wPg0KLTwvYm9keT4NCi0NCi08L2h0bWw+DQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtaGVsbG93b3JsZC1mYWNlbGV0cy9zcmMvc2l0ZS9hcHQvaW5kZXguYXB0IGIvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtaGVsbG93b3JsZC1mYWNlbGV0cy9zcmMvc2l0ZS9hcHQvaW5kZXguYXB0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NjNmOGFlLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWhlbGxvd29ybGQtZmFjZWxldHMvc3JjL3NpdGUvYXB0L2luZGV4LmFwdAorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLSAtLS0tLS0NCi0gTXlmYWNlcyBIZWxsb1dvcmxkIEZhY2VsZXRzIEFyY2hldHlwZQ0KLSAtLS0tLS0NCi0NCi1PdmVydmlldw0KLQ0KLSAgVGhpcyBwcm9qZWN0IGRlZmluZXMgYSBNYXZlbiBhcmNoZXR5cGUuIFJ1bm5pbmcgdGhlIGFyY2hldHlwZSBwbHVnaW4gd2l0aCB0aGlzIGFyY2hldHlwZSB3aWxsDQotICBjcmVhdGUgYSBkaXJlY3RvcnkgdHJlZSBjb250YWluaW5nIHRoZSBmaWxlcyBuZWVkZWQgdG8gcXVpY2tseSBnZXQgc3RhcnRlZCBvbiBhIG5ldyBKU0YgMS4yDQotICBwcm9qZWN0IHdoaWNoIHVzZXMgRmFjZWxldHMgYXMgdGhlIHRlbXBsYXRpbmcgbGFuZ3VhZ2UuDQotDQotVXNhZ2UNCi0NCi0gIFVzZSB0aGUgZm9sbG93aW5nIG1hdmVuIGNvbW1hbmQgYW5kIHRoZW4gc2VsZWN0IG15ZmFjZXMtYXJjaGV0eXBlLWhlbGxvd29ybGQtZmFjZWxldHMgZnJvbSB0aGUgb3B0aW9ucy4NCi0NCi0NCi0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKw0KLW12biBhcmNoZXR5cGU6Z2VuZXJhdGUgLURhcmNoZXR5cGVDYXRhbG9nPWh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcNCi0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKw0KZGlmZiAtLWdpdCBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWhlbGxvd29ybGQtcG9ydGxldHMvcG9tLnhtbCBiL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWhlbGxvd29ybGQtcG9ydGxldHMvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQ3MzY1ZS4uMDAwMDAwMAotLS0gYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1oZWxsb3dvcmxkLXBvcnRsZXRzL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICAgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gICAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICAgIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICAgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gICAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gICAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gICAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICAgIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLQotICAgIDxwYXJlbnQ+Ci0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzPC9ncm91cElkPgotICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWFyY2hldHlwZS1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDx2ZXJzaW9uPjEuMC40LVNOQVBTSE9UPC92ZXJzaW9uPgotICAgIDwvcGFyZW50PgotCi0gICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzPC9ncm91cElkPgotICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtYXJjaGV0eXBlLWhlbGxvd29ybGQtcG9ydGxldHM8L2FydGlmYWN0SWQ+Ci0gICAgPHBhY2thZ2luZz5qYXI8L3BhY2thZ2luZz4KLSAgICA8bmFtZT5NeUZhY2VzIFBvcnRsZXQgQXJjaGV0eXBlPC9uYW1lPgotICAgIDxkZXNjcmlwdGlvbj5BcmNoZXR5cGUgdG8gY3JlYXRlIGEgbmV3IHBvcnRsZXQgd2ViYXBwIGJhc2VkIG9uIG15ZmFjZXM8L2Rlc2NyaXB0aW9uPgotCi08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1oZWxsb3dvcmxkLXBvcnRsZXRzL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9MSUNFTlNFLnR4dCBiL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWhlbGxvd29ybGQtcG9ydGxldHMvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL0xJQ0VOU0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjQ1Njk1Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWhlbGxvd29ybGQtcG9ydGxldHMvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL0xJQ0VOU0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMjAyICswLDAgQEAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKLSAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8KLQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCi0KLSAgIDEuIERlZmluaXRpb25zLgotCi0gICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLAotICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuCi0KLSAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5Ci0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuCi0KLSAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwKLSAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24KLSAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCi0gICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUKLSAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yCi0gICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKLSAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuCi0KLSAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKLSAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuCi0KLSAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAotICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbgotICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4KLQotICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwKLSAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQKLSAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKLSAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4KLQotICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKLSAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGEKLSAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yawotICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KLQotICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdAotICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQotICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucwotICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMKLSAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgotICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLAotICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4KLQotICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcKLSAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMKLSAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQotICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcgotICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIKLSAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQKLSAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvCi0gICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAotICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUKLSAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dAotICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKLSAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIgotCi0gICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kCi0gICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4KLQotICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsCi0gICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUKLSAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCi0KLSAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKLSAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLAotICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCi0gICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQotICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXIKLSAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKLSAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91Ci0gICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQotICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yawotICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QKLSAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMKLSAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQotICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLgotCi0gICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQotICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0Ci0gICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQotICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0KLSAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yCi0gICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKLQotICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcwotICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAotCi0gICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MKLSAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCi0gICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywKLSAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mCi0gICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAotCi0gICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMKLSAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0Ci0gICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkCi0gICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90Ci0gICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCi0gICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQKLSAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yCi0gICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCi0gICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZAotICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cwotICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKLSAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbgotICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlCi0gICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCi0gICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkCi0gICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLgotCi0gICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQKLSAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMKLSAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKLSAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLAotICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoCi0gICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgotCi0gICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsCi0gICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKLSAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4KLSAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKLSAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkCi0gICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuCi0KLSAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUKLSAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwKLSAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQotICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuCi0KLSAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgotICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaAotICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zCi0gICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBCi0gICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKLSAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQotICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLgotCi0gICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwKLSAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLAotICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKLSAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlCi0gICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsCi0gICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKLSAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUKLSAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwKLSAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCi0gICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yCi0gICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCi0KLSAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcKLSAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsCi0gICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAotICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMKLSAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5Ci0gICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgotICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LAotICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5Ci0gICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCi0gICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4KLQotICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCi0KLSAgIEFQUEVORElYOiBIb3cgdG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yay4KLQotICAgICAgVG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yaywgYXR0YWNoIHRoZSBmb2xsb3dpbmcKLSAgICAgIGJvaWxlcnBsYXRlIG5vdGljZSwgd2l0aCB0aGUgZmllbGRzIGVuY2xvc2VkIGJ5IGJyYWNrZXRzICJbXSIKLSAgICAgIHJlcGxhY2VkIHdpdGggeW91ciBvd24gaWRlbnRpZnlpbmcgaW5mb3JtYXRpb24uIChEb24ndCBpbmNsdWRlCi0gICAgICB0aGUgYnJhY2tldHMhKSAgVGhlIHRleHQgc2hvdWxkIGJlIGVuY2xvc2VkIGluIHRoZSBhcHByb3ByaWF0ZQotICAgICAgY29tbWVudCBzeW50YXggZm9yIHRoZSBmaWxlIGZvcm1hdC4gV2UgYWxzbyByZWNvbW1lbmQgdGhhdCBhCi0gICAgICBmaWxlIG9yIGNsYXNzIG5hbWUgYW5kIGRlc2NyaXB0aW9uIG9mIHB1cnBvc2UgYmUgaW5jbHVkZWQgb24gdGhlCi0gICAgICBzYW1lICJwcmludGVkIHBhZ2UiIGFzIHRoZSBjb3B5cmlnaHQgbm90aWNlIGZvciBlYXNpZXIKLSAgICAgIGlkZW50aWZpY2F0aW9uIHdpdGhpbiB0aGlyZC1wYXJ0eSBhcmNoaXZlcy4KLQotICAgQ29weXJpZ2h0IFt5eXl5XSBbbmFtZSBvZiBjb3B5cmlnaHQgb3duZXJdCi0KLSAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCmRpZmYgLS1naXQgYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1oZWxsb3dvcmxkLXBvcnRsZXRzL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9OT1RJQ0UudHh0IGIvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtaGVsbG93b3JsZC1wb3J0bGV0cy9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvTk9USUNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmEzZGJkNi4uMDAwMDAwMAotLS0gYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1oZWxsb3dvcmxkLXBvcnRsZXRzL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9OT1RJQ0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotPT0gIE5PVElDRSBmaWxlIGNvcnJlc3BvbmRpbmcgdG8gc2VjdGlvbiA0KGQpIG9mIHRoZSBBcGFjaGUgTGljZW5zZSwgICA9PQotPT0gIFZlcnNpb24gMi4wLCBpbiB0aGlzIGNhc2UgZm9yIHRoZSBBcGFjaGUgTXlGYWNlcyBNYXZlbiBQbHVnaW5zICAgICA9PQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1UaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IAotVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4KLQotUG9ydGlvbnMgb2YgdGhpcyBzb2Z0d2FyZSB3ZXJlIG9yaWdpbmFsbHkgYmFzZWQgb24gdGhlIGZvbGxvd2luZzoKLQotIC0gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDYsIE9yYWNsZSBDb3JwLCA8aHR0cDovL3d3dy5vcmFjbGUuY29tLz4uCi1hbmQgYXJlIGxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiB1bmRlciB0aGUgCi0iU29mdHdhcmUgR3JhbnQgYW5kIENvcnBvcmF0ZSBDb250cmlidXRpb24gTGljZW5zZSBBZ3JlZW1lbnQiCi0KLVNlZSB0aGUgTElDRU5TRS50eHQgZmlsZSBmb3IgaW5mb3JtYXRpb24gb24gYWxsIGxpY2Vuc2VzIAotYXNzb2NpYXRlZCB3aXRoIHRoaXMgc29mdHdhcmUuCmRpZmYgLS1naXQgYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1oZWxsb3dvcmxkLXBvcnRsZXRzL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9tYXZlbi9hcmNoZXR5cGUtbWV0YWRhdGEueG1sIGIvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtaGVsbG93b3JsZC1wb3J0bGV0cy9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvbWF2ZW4vYXJjaGV0eXBlLW1ldGFkYXRhLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGZiNDE2OS4uMDAwMDAwMAotLS0gYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1oZWxsb3dvcmxkLXBvcnRsZXRzL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9tYXZlbi9hcmNoZXR5cGUtbWV0YWRhdGEueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLSAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gICAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gICAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gICAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICAgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICAgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICAgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgICB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPGFyY2hldHlwZS1kZXNjcmlwdG9yIHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9wbHVnaW5zL21hdmVuLWFyY2hldHlwZS1wbHVnaW4vYXJjaGV0eXBlLWRlc2NyaXB0b3IvMS4wLjAiCi0gICAgICAgICAgICAgICAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICAgICAgICAgICAgICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3BsdWdpbnMvbWF2ZW4tYXJjaGV0eXBlLXBsdWdpbi9hcmNoZXR5cGUtZGVzY3JpcHRvci8xLjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvYXJjaGV0eXBlLWRlc2NyaXB0b3ItMS4wLjAueHNkIgotCi0gICAgICAgICAgICAgICAgICAgICAgbmFtZT0ibXlmYWNlcy1hcmNoZXR5cGUtaGVsbG93b3JsZC1wb3J0bGV0cyIgcGFydGlhbD0iZmFsc2UiPgotCi0gIDxyZXF1aXJlZFByb3BlcnRpZXMvPgotCi0gIDxmaWxlU2V0cz4KLSAgICAgIDxmaWxlU2V0IGZpbHRlcmVkPSJ0cnVlIiBwYWNrYWdlZD0idHJ1ZSI+Ci0gICAgICAgICAgPGRpcmVjdG9yeT5zcmMvbWFpbi9qYXZhLzwvZGlyZWN0b3J5PgotICAgICAgPC9maWxlU2V0PgotICAgICAgPGZpbGVTZXQgZmlsdGVyZWQ9ImZhbHNlIiBwYWNrYWdlZD0iZmFsc2UiPgotICAgICAgICAgIDxkaXJlY3Rvcnk+c3JjL21haW4vd2ViYXBwLzwvZGlyZWN0b3J5PgotICAgICAgICAgIDxleGNsdWRlcz4KLSAgICAgICAgICAgICAgPGV4Y2x1ZGU+V0VCLUlORi9mYWNlcy1jb25maWcueG1sPC9leGNsdWRlPgotICAgICAgICAgICAgICA8ZXhjbHVkZT5XRUItSU5GL3BvcnRsZXQueG1sPC9leGNsdWRlPgotICAgICAgICAgIDwvZXhjbHVkZXM+Ci0gICAgICA8L2ZpbGVTZXQ+Ci0gICAgICA8ZmlsZVNldCBmaWx0ZXJlZD0idHJ1ZSIgcGFja2FnZWQ9ImZhbHNlIj4KLSAgICAgICAgICA8ZGlyZWN0b3J5PnNyYy9tYWluL3dlYmFwcC88L2RpcmVjdG9yeT4KLSAgICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgICAgIDwhLS0gZmFjZXMtY29uZmlnIGFuZCBwb3J0bGV0LnhtbCBuZWVkIHRvIGJlIGZpbHRlcmVkIC0tPgotICAgICAgICAgICAgICA8aW5jbHVkZT5XRUItSU5GL2ZhY2VzLWNvbmZpZy54bWw8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgIDxpbmNsdWRlPldFQi1JTkYvcG9ydGxldC54bWw8L2luY2x1ZGU+Ci0gICAgICAgICAgPC9pbmNsdWRlcz4KLSAgICAgIDwvZmlsZVNldD4KLSAgICAgIDxmaWxlU2V0IGZpbHRlcmVkPSJmYWxzZSIgcGFja2FnZWQ9ImZhbHNlIj4KLSAgICAgICAgICA8ZGlyZWN0b3J5PnNyYy9tYWluL2xvZzRqLzwvZGlyZWN0b3J5PgotICAgICAgPC9maWxlU2V0PgotICA8L2ZpbGVTZXRzPgotCi0gIDxtb2R1bGVzLz4KLQotPC9hcmNoZXR5cGUtZGVzY3JpcHRvcj4KZGlmZiAtLWdpdCBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWhlbGxvd29ybGQtcG9ydGxldHMvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvcG9tLnhtbCBiL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWhlbGxvd29ybGQtcG9ydGxldHMvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzgxNTJhZC4uMDAwMDAwMAotLS0gYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1oZWxsb3dvcmxkLXBvcnRsZXRzL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNDggKzAsMCBAQAotI3NldCggJHN5bWJvbF9wb3VuZCA9ICcjJyApCi0jc2V0KCAkc3ltYm9sX2RvbGxhciA9ICckJyApCi0jc2V0KCAkc3ltYm9sX2VzY2FwZSA9ICdcJyApCi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIgotICAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgotICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLSAgICA8Z3JvdXBJZD4ke2dyb3VwSWR9PC9ncm91cElkPgotICAgIDxhcnRpZmFjdElkPiR7YXJ0aWZhY3RJZH08L2FydGlmYWN0SWQ+Ci0gICAgPHBhY2thZ2luZz53YXI8L3BhY2thZ2luZz4KLSAgICA8dmVyc2lvbj4ke3ZlcnNpb259PC92ZXJzaW9uPgotICAgIDxuYW1lPkEgY3VzdG9tIHByb2plY3QgdXNpbmcgbXlmYWNlcyAxLjIgd2l0aCB0aGUgcG9ydGxldCBicmlkZ2U8L25hbWU+Ci0gICAgPHVybD5odHRwOi8vd3d3Lm15b3JnYW5pemF0aW9uLm9yZzwvdXJsPgotCi0gICAgPHByb3BlcnRpZXM+Ci0gICAgICAgIDxqc2YtbXlmYWNlcy52ZXJzaW9uPjEuMi4xMDwvanNmLW15ZmFjZXMudmVyc2lvbj4KLSAgICAgICAgPGpzZi1yaS52ZXJzaW9uPjEuMl8xNTwvanNmLXJpLnZlcnNpb24+Ci0gICAgICAgIDxtYXZlbi5qZXR0eS5wbHVnaW4udmVyc2lvbj42LjEuMjI8L21hdmVuLmpldHR5LnBsdWdpbi52ZXJzaW9uPgotICAgICAgICA8bG9nNGoudmVyc2lvbj4xLjIuMTM8L2xvZzRqLnZlcnNpb24+Ci0gICAgICAgIDxwb3J0bGV0LWJyaWRnZS52ZXJzaW9uPjEuMC4wPC9wb3J0bGV0LWJyaWRnZS52ZXJzaW9uPgotICAgIDwvcHJvcGVydGllcz4KLSAgICAKLSAgICA8ZGVwZW5kZW5jaWVzPgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICA8Z3JvdXBJZD5qYXZheC5zZXJ2bGV0PC9ncm91cElkPgotICAgICAgICAgIDxhcnRpZmFjdElkPnNlcnZsZXQtYXBpPC9hcnRpZmFjdElkPgotICAgICAgICAgIDx2ZXJzaW9uPjIuNDwvdmVyc2lvbj4KLSAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIAotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICA8Z3JvdXBJZD5qYXZheC5zZXJ2bGV0LmpzcDwvZ3JvdXBJZD4KLSAgICAgICAgICA8YXJ0aWZhY3RJZD5qc3AtYXBpPC9hcnRpZmFjdElkPgotICAgICAgICAgIDx2ZXJzaW9uPjIuMTwvdmVyc2lvbj4KLSAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIAotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICA8Z3JvdXBJZD5qYXZheC5zZXJ2bGV0PC9ncm91cElkPgotICAgICAgICAgIDxhcnRpZmFjdElkPmpzdGw8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgPHZlcnNpb24+MS4yPC92ZXJzaW9uPiAgICAKLSAgICAgICAgICA8c2NvcGU+cnVudGltZTwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgCi0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgIDxncm91cElkPnBvcnRsZXQtYXBpPC9ncm91cElkPgotICAgICAgICAgIDxhcnRpZmFjdElkPnBvcnRsZXQtYXBpPC9hcnRpZmFjdElkPgotICAgICAgICAgIDx2ZXJzaW9uPjEuMDwvdmVyc2lvbj4KLSAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgICAgICAKLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLnBvcnRsZXQtYnJpZGdlPC9ncm91cElkPgotICAgICAgICAgIDxhcnRpZmFjdElkPnBvcnRsZXQtYnJpZGdlLWFwaTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICA8dmVyc2lvbj4ke3N5bWJvbF9kb2xsYXJ9e3BvcnRsZXQtYnJpZGdlLnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIAotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMucG9ydGxldC1icmlkZ2U8L2dyb3VwSWQ+Ci0gICAgICAgICAgPGFydGlmYWN0SWQ+cG9ydGxldC1icmlkZ2UtaW1wbDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICA8dmVyc2lvbj4ke3N5bWJvbF9kb2xsYXJ9e3BvcnRsZXQtYnJpZGdlLnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPC9kZXBlbmRlbmNpZXM+Ci0gICAgICAgIAotICAgIDxidWlsZD4KLSAgICAgICAgPHBsdWdpbnM+Ci0gICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWpkZXYtcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkYnVpbGQ8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgPGxpYnJhcmllcz4KLSAgICAgICAgICAgICAgICA8bGlicmFyeT5KU1AgUnVudGltZTwvbGlicmFyeT4KLSAgICAgICAgICAgICAgPC9saWJyYXJpZXM+Ci0gICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgIDwvcGx1Z2lucz4KLSAgICA8L2J1aWxkPgotICAgICAKLSAgICA8cHJvZmlsZXM+Ci0gICAgICAgIDwhLS0gc2V0cyB1cCB0aGUgd2ViYXBwIGZvciBkZXBsb3ltZW50IHRvIHBsdXRvICAibXZuIGNsZWFuIGluc3RhbGwgLVBwbHV0byIgLS0+ICAgIAotICAgICAgICA8cHJvZmlsZT4KLSAgICAgICAgICA8aWQ+cGx1dG88L2lkPgotICAgICAgICAgIDxidWlsZD4KLSAgICAgICAgICAgIDxwbHVnaW5zPgotICAgICAgICAgICAgICA8IS0tIGNvbmZpZ3VyZSBtYXZlbi13YXItcGx1Z2luIHRvIHVzZSB1cGRhdGVkIHdlYi54bWwgLS0+Ci0gICAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4td2FyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgIDx3ZWJYbWw+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJHtzeW1ib2xfZG9sbGFyfXtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vcGx1dG8tcmVzb3VyY2VzL3dlYi54bWwKLSAgICAgICAgICAgICAgICAgICAgPC93ZWJYbWw+Ci0gICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgICAgIAotICAgICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUucGx1dG88L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tcGx1dG8tcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjEuMS40PC92ZXJzaW9uPgotICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPiAgCi0gICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPiAgCi0gICAgICAgICAgICAgICAgICAgIDxwaGFzZT5nZW5lcmF0ZS1yZXNvdXJjZXM8L3BoYXNlPiAgCi0gICAgICAgICAgICAgICAgICAgIDxnb2Fscz4gIAotICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPmFzc2VtYmxlPC9nb2FsPiAgCi0gICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+ICAKLSAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPiAgCi0gICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPiAgCi0gICAgICAgICAgICAgIDwvcGx1Z2luPiAgCi0gICAgICAgICAgICA8L3BsdWdpbnM+Ci0gICAgICAgICAgPC9idWlsZD4KLSAgICAgICAgPC9wcm9maWxlPgotICAgICAgICAKLSAgICAgICAgPCEtLSBUbyBydW4gamV0dHksIGlzc3VlICJtdm4gY2xlYW4gLVBqZXR0eUNvbmZpZyBqZXR0eTpydW4iIC0tPgotICAgICAgICA8cHJvZmlsZT4KLSAgICAgICAgICAgIDxpZD5qZXR0eUNvbmZpZzwvaWQ+Ci0gICAgICAgICAgICA8ZGVwZW5kZW5jaWVzPgotICAgICAgICAgICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+Y29tLmJla2suYm9zczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWpldHR5LXBsdXRvLWVtYmVkZGVkPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgPHZlcnNpb24+MS4wPC92ZXJzaW9uPgotICAgICAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+bG9nNGo8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmxvZzRqPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3N5bWJvbF9kb2xsYXJ9e2xvZzRqLnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgICAgICAgICA8dHlwZT5qYXI8L3R5cGU+Ci0gICAgICAgICAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICAgICAgPC9kZXBlbmRlbmNpZXM+Ci0gICAgICAgICAgICA8YnVpbGQ+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlcz4KLSAgICAgICAgICAgICAgICAgICAgPHJlc291cmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGRpcmVjdG9yeT5zcmMvbWFpbi9yZXNvdXJjZXM8L2RpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICAgICAgPC9yZXNvdXJjZT4KLSAgICAgICAgICAgICAgICAgICAgPHJlc291cmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGRpcmVjdG9yeT5zcmMvbWFpbi9sb2c0ajwvZGlyZWN0b3J5PgotICAgICAgICAgICAgICAgICAgICA8L3Jlc291cmNlPgotICAgICAgICAgICAgICAgIDwvcmVzb3VyY2VzPiAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIDxwbHVnaW5zPgotICAgICAgICAgICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5tb3J0YmF5LmpldHR5PC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWpldHR5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3N5bWJvbF9kb2xsYXJ9e21hdmVuLmpldHR5LnBsdWdpbi52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx3ZWJYbWw+JHtzeW1ib2xfZG9sbGFyfXtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vcGx1dG8tcmVzb3VyY2VzL3dlYi54bWw8L3dlYlhtbD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx3ZWJEZWZhdWx0WG1sPnNyYy9tYWluL3dlYmFwcC9XRUItSU5GL2pldHR5LXBsdXRvLXdlYi1kZWZhdWx0LnhtbDwvd2ViRGVmYXVsdFhtbD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxzeXN0ZW1Qcm9wZXJ0aWVzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzeXN0ZW1Qcm9wZXJ0eT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+b3JnLmFwYWNoZS5wbHV0by5lbWJlZGRlZC5wb3J0bGV0SWQ8L25hbWU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2YWx1ZT4ke2FydGlmYWN0SWR9PC92YWx1ZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N5c3RlbVByb3BlcnR5PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzeXN0ZW1Qcm9wZXJ0eT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+b3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nPC9uYW1lPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmFsdWU+b3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuaW1wbC5Mb2c0SkxvZ2dlcjwvdmFsdWU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zeXN0ZW1Qcm9wZXJ0eT4gICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICA8L3N5c3RlbVByb3BlcnRpZXM+Ci0gICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLnBsdXRvPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXBsdXRvLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4xLjEuNDwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4gIAotICAgICAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4gIAotICAgICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+Z2VuZXJhdGUtcmVzb3VyY2VzPC9waGFzZT4gIAotICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+ICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5hc3NlbWJsZTwvZ29hbD4gIAotICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPiAgCi0gICAgICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4gIAotICAgICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4gIAotICAgICAgICAgICAgICAgICAgICA8L3BsdWdpbj4gIAotICAgICAgICAgICAgICAgIDwvcGx1Z2lucz4KLSAgICAgICAgICAgIDwvYnVpbGQ+Ci0gICAgICAgIDwvcHJvZmlsZT4KLSAgICAgICAgCi0gICAgICAgIDwhLS0gQnkgZGVmYXVsdCB0aGUgd2FyIGV4YW1wbGVzIHVzZSBteWZhY2VzISA6KSAtLT4KLSAgICAgICAgPHByb2ZpbGU+Ci0gICAgICAgICAgICA8aWQ+bXlmYWNlczwvaWQ+Ci0gICAgICAgICAgICA8YWN0aXZhdGlvbj4KLSAgICAgICAgICAgICAgICA8cHJvcGVydHk+Ci0gICAgICAgICAgICAgICAgICAgIDxuYW1lPiFqc2Y8L25hbWU+Ci0gICAgICAgICAgICAgICAgPC9wcm9wZXJ0eT4KLSAgICAgICAgICAgIDwvYWN0aXZhdGlvbj4KLSAgICAgICAgICAgIDxkZXBlbmRlbmNpZXM+Ci0gICAgICAgICAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5jb3JlPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWFwaTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtzeW1ib2xfZG9sbGFyfXtqc2YtbXlmYWNlcy52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgotICAgICAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmNvcmU8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtaW1wbDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtzeW1ib2xfZG9sbGFyfXtqc2YtbXlmYWNlcy52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPHNjb3BlPnJ1bnRpbWU8L3Njb3BlPgotICAgICAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDwvZGVwZW5kZW5jaWVzPgotICAgICAgICA8L3Byb2ZpbGU+Ci0gICAgICAgIDxwcm9maWxlPgotICAgICAgICAgICAgPCEtLSBBY3RpdmUgYWRkaW5nIC1EanNmPXJpIHdoZW4gZXhlY3V0ZSBtYXZlbiBnb2Fscy4gLS0+Ci0gICAgICAgICAgICA8aWQ+anNmLXJpPC9pZD4KLSAgICAgICAgICAgIDxhY3RpdmF0aW9uPgotICAgICAgICAgICAgICAgIDxwcm9wZXJ0eT4KLSAgICAgICAgICAgICAgICAgICAgPG5hbWU+anNmPC9uYW1lPgotICAgICAgICAgICAgICAgICAgICA8dmFsdWU+cmk8L3ZhbHVlPgotICAgICAgICAgICAgICAgIDwvcHJvcGVydHk+Ci0gICAgICAgICAgICA8L2FjdGl2YXRpb24+Ci0gICAgICAgICAgICA8ZGVwZW5kZW5jaWVzPgotICAgICAgICAgICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC5mYWNlczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+anNmLWFwaTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtzeW1ib2xfZG9sbGFyfXtqc2YtcmkudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4KLSAgICAgICAgICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgICAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPmphdmF4LmZhY2VzPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qc2YtaW1wbDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtzeW1ib2xfZG9sbGFyfXtqc2YtcmkudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxzY29wZT5ydW50aW1lPC9zY29wZT4KLSAgICAgICAgICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8L2RlcGVuZGVuY2llcz4KLSAgICAgICAgICAgIDxyZXBvc2l0b3JpZXM+Ci0gICAgICAgICAgICAgICAgPHJlcG9zaXRvcnk+Ci0gICAgICAgICAgICAgICAgICAgIDxpZD5qYXZhLm5ldDwvaWQ+Ci0gICAgICAgICAgICAgICAgICAgIDx1cmw+aHR0cDovL2Rvd25sb2FkLmphdmEubmV0L21hdmVuLzE8L3VybD4KLSAgICAgICAgICAgICAgICAgICAgPGxheW91dD5sZWdhY3k8L2xheW91dD4KLSAgICAgICAgICAgICAgICA8L3JlcG9zaXRvcnk+Ci0gICAgICAgICAgICA8L3JlcG9zaXRvcmllcz4KLSAgICAgICAgPC9wcm9maWxlPgotICAgIDwvcHJvZmlsZXM+ICAKLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWhlbGxvd29ybGQtcG9ydGxldHMvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc3JjL21haW4vamF2YS9OYW1lQmVhbi5qYXZhIGIvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtaGVsbG93b3JsZC1wb3J0bGV0cy9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zcmMvbWFpbi9qYXZhL05hbWVCZWFuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3OTc3ZDMuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtaGVsbG93b3JsZC1wb3J0bGV0cy9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zcmMvbWFpbi9qYXZhL05hbWVCZWFuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSAke3BhY2thZ2V9OwotCi1wdWJsaWMgY2xhc3MgTmFtZUJlYW4KLXsKLSAgcHVibGljIFN0cmluZyBfbmFtZTsKLSAgCi0gIHB1YmxpYyBOYW1lQmVhbigpCi0gIHsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIF9uYW1lKQotICB7Ci0gICAgdGhpcy5fbmFtZSA9IF9uYW1lOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXROYW1lKCkKLSAgewotICAgIHJldHVybiBfbmFtZTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtaGVsbG93b3JsZC1wb3J0bGV0cy9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zcmMvbWFpbi9sb2c0ai9sb2c0ai5wcm9wZXJ0aWVzIGIvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtaGVsbG93b3JsZC1wb3J0bGV0cy9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zcmMvbWFpbi9sb2c0ai9sb2c0ai5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ODM1MmU0Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWhlbGxvd29ybGQtcG9ydGxldHMvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc3JjL21haW4vbG9nNGovbG9nNGoucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0jIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotIyB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0jIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0jICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0jIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLWxvZzRqLnJvb3RMb2dnZXI9SU5GTywgQTEsIEEyCi1sb2c0ai5hcHBlbmRlci5BMT1vcmcuYXBhY2hlLmxvZzRqLkNvbnNvbGVBcHBlbmRlcgotbG9nNGouYXBwZW5kZXIuQTEubGF5b3V0PW9yZy5hcGFjaGUubG9nNGouUGF0dGVybkxheW91dAotCi0jbG9nIG9uIGEgZmlsZSBvbiB0YXJnZXQgdG9vLCB0byBtYWtlIGVhc2llciBjaGVjayBpdAotbG9nNGouYXBwZW5kZXIuQTI9b3JnLmFwYWNoZS5sb2c0ai5Sb2xsaW5nRmlsZUFwcGVuZGVyCi1sb2c0ai5hcHBlbmRlci5BMi5GaWxlPXRhcmdldC9sb2c0ai5sb2cKLWxvZzRqLmFwcGVuZGVyLkEyLk1heEZpbGVTaXplPTEwMDBLQgotIyBLZWVwIG9uZSBiYWNrdXAgZmlsZQotbG9nNGouYXBwZW5kZXIuQTIuTWF4QmFja3VwSW5kZXg9MQotbG9nNGouYXBwZW5kZXIuQTIubGF5b3V0PW9yZy5hcGFjaGUubG9nNGouUGF0dGVybkxheW91dAotbG9nNGouYXBwZW5kZXIuQTIubGF5b3V0LkNvbnZlcnNpb25QYXR0ZXJuPSVwICV0ICVjIC0gJW0lbgotCi0jIExvZyBsZXZlbCBmb3IgbXlmYWNlcyBsaWJyYXJpZXMKLWxvZzRqLmxvZ2dlci5vcmcuYXBhY2hlLmNvbW1vbnM9SU5GTwotbG9nNGoubG9nZ2VyLm9yZy5hcGFjaGUubXlmYWNlcz1UUkFDRQotbG9nNGoubG9nZ2VyLmphdmF4LmZhY2VzPVRSQUNFCi0KLSMgUHJpbnQgdGhlIGRhdGUgaW4gSVNPIDg2MDEgZm9ybWF0Ci1sb2c0ai5hcHBlbmRlci5BMS5sYXlvdXQuQ29udmVyc2lvblBhdHRlcm49JTVwIFsldF0gKCVGXDolTCkgLSAlbSVuClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtaGVsbG93b3JsZC1wb3J0bGV0cy9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9mYWNlcy1jb25maWcueG1sIGIvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtaGVsbG93b3JsZC1wb3J0bGV0cy9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9mYWNlcy1jb25maWcueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOGIyZWYwLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWhlbGxvd29ybGQtcG9ydGxldHMvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvZmFjZXMtY29uZmlnLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPCEtLQ0KLSAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICAgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICAgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gICAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICAgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICAgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gICAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgICB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi08IURPQ1RZUEUgZmFjZXMtY29uZmlnIFBVQkxJQw0KLSAgIi0vL1N1biBNaWNyb3N5c3RlbXMsIEluYy4vL0RURCBKYXZhU2VydmVyIEZhY2VzIENvbmZpZyAxLjAvL0VOIg0KLSAgImh0dHA6Ly9qYXZhLnN1bi5jb20vZHRkL3dlYi1mYWNlc2NvbmZpZ18xXzAuZHRkIj4NCi08ZmFjZXMtY29uZmlnIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL0pTRi9Db25maWd1cmF0aW9uIj4NCi0gIDxuYXZpZ2F0aW9uLXJ1bGU+DQotICAgIDxmcm9tLXZpZXctaWQ+KjwvZnJvbS12aWV3LWlkPg0KLSAgICA8bmF2aWdhdGlvbi1jYXNlPg0KLSAgICAgIDxmcm9tLW91dGNvbWU+aGVsbG9Xb3JsZDwvZnJvbS1vdXRjb21lPg0KLSAgICAgIDx0by12aWV3LWlkPi9oZWxsb3dvcmxkL2luZGV4LmpzcDwvdG8tdmlldy1pZD4NCi0gICAgPC9uYXZpZ2F0aW9uLWNhc2U+DQotICA8L25hdmlnYXRpb24tcnVsZT4NCi0gIDxuYXZpZ2F0aW9uLXJ1bGU+DQotICAgIDxmcm9tLXZpZXctaWQ+L2hlbGxvd29ybGQvaW5kZXguanNwPC9mcm9tLXZpZXctaWQ+DQotICAgIDxuYXZpZ2F0aW9uLWNhc2U+DQotICAgICAgPGZyb20tb3V0Y29tZT5zYXloZWxsbzwvZnJvbS1vdXRjb21lPg0KLSAgICAgIDx0by12aWV3LWlkPi9oZWxsb3dvcmxkL2hlbGxvLmpzcDwvdG8tdmlldy1pZD4NCi0gICAgPC9uYXZpZ2F0aW9uLWNhc2U+DQotICA8L25hdmlnYXRpb24tcnVsZT4NCi0gIDxtYW5hZ2VkLWJlYW4+DQotICAgIDxtYW5hZ2VkLWJlYW4tbmFtZT5uYW1lYmVhbjwvbWFuYWdlZC1iZWFuLW5hbWU+DQotICAgIDxtYW5hZ2VkLWJlYW4tY2xhc3M+JHtwYWNrYWdlfS5OYW1lQmVhbjwvbWFuYWdlZC1iZWFuLWNsYXNzPg0KLSAgICA8bWFuYWdlZC1iZWFuLXNjb3BlPnJlcXVlc3Q8L21hbmFnZWQtYmVhbi1zY29wZT4NCi0gIDwvbWFuYWdlZC1iZWFuPg0KLTwvZmFjZXMtY29uZmlnPg0KLSAgICAgICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtaGVsbG93b3JsZC1wb3J0bGV0cy9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9qZXR0eS1wbHV0by13ZWItZGVmYXVsdC54bWwgYi9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1oZWxsb3dvcmxkLXBvcnRsZXRzL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL2pldHR5LXBsdXRvLXdlYi1kZWZhdWx0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODBhYjgzZi4uMDAwMDAwMAotLS0gYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1oZWxsb3dvcmxkLXBvcnRsZXRzL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL2pldHR5LXBsdXRvLXdlYi1kZWZhdWx0LnhtbAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWhlbGxvd29ybGQtcG9ydGxldHMvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvcG9ydGxldC54bWwgYi9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1oZWxsb3dvcmxkLXBvcnRsZXRzL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3BvcnRsZXQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ODMwYzZkLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWhlbGxvd29ybGQtcG9ydGxldHMvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvcG9ydGxldC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJJU08tODg1OS0xIj8+Ci08IS0tCi0gICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICAgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICAgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gICAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICAgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gICAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gICAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gICAgdW5kZXIgdGhlIExpY2Vuc2UuCSAgIAotLS0+Ci08cG9ydGxldC1hcHAgdmVyc2lvbj0iMS4wIgotICAgICAgICAgICAgIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9wb3J0bGV0L3BvcnRsZXQtYXBwXzFfMC54c2QiCi0gICAgICAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICAgICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL3BvcnRsZXQvcG9ydGxldC1hcHBfMV8wLnhzZCBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9wb3J0bGV0L3BvcnRsZXQtYXBwXzFfMC54c2QiPgotCi0gIDxwb3J0bGV0PgotICAgIDxkZXNjcmlwdGlvbiBsYW5nPSJFTiI+TXlGYWNlcyBQb3J0bGV0IEJyaWRnZSBEZW1vIFBvcnRsZXQ8L2Rlc2NyaXB0aW9uPgotICAgIDxwb3J0bGV0LW5hbWU+JHthcnRpZmFjdElkfTwvcG9ydGxldC1uYW1lPgotICAgIDxkaXNwbGF5LW5hbWUgbGFuZz0iRU4iPk15RmFjZXMgUG9ydGxldCBCcmlkZ2UgRGVtbzwvZGlzcGxheS1uYW1lPgotICAgIDxwb3J0bGV0LWNsYXNzPmphdmF4LnBvcnRsZXQuZmFjZXMuR2VuZXJpY0ZhY2VzUG9ydGxldDwvcG9ydGxldC1jbGFzcz4KLQotICAgIDxpbml0LXBhcmFtPgotICAgICAgPG5hbWU+amF2YXgucG9ydGxldC5mYWNlcy5kZWZhdWx0Vmlld0lkLnZpZXc8L25hbWU+Ci0gICAgICA8dmFsdWU+L2luZGV4LmpzcDwvdmFsdWU+Ci0gICAgPC9pbml0LXBhcmFtPgotCi0gICAgPGluaXQtcGFyYW0+Ci0gICAgICA8bmFtZT5qYXZheC5wb3J0bGV0LmZhY2VzLmRlZmFsdFZpZXdJZC5lZGl0PC9uYW1lPgotICAgICAgPHZhbHVlPi9lZGl0LmpzcDwvdmFsdWU+Ci0gICAgPC9pbml0LXBhcmFtPgotCi0gICAgPGluaXQtcGFyYW0+Ci0gICAgICA8bmFtZT5qYXZheC5wb3J0bGV0LmZhY2VzLmRlZmF1bHRWaWV3SWQuaGVscDwvbmFtZT4KLSAgICAgIDx2YWx1ZT4vaGVscC5qc3A8L3ZhbHVlPgotICAgIDwvaW5pdC1wYXJhbT4KLQotICAgIDxzdXBwb3J0cz4KLSAgICAgIDxtaW1lLXR5cGU+dGV4dC9odG1sPC9taW1lLXR5cGU+Ci0gICAgICA8cG9ydGxldC1tb2RlPmVkaXQ8L3BvcnRsZXQtbW9kZT4KLSAgICAgIDxwb3J0bGV0LW1vZGU+dmlldzwvcG9ydGxldC1tb2RlPgotICAgICAgPHBvcnRsZXQtbW9kZT5oZWxwPC9wb3J0bGV0LW1vZGU+Ci0gICAgPC9zdXBwb3J0cz4KLQotICAgIDxzdXBwb3J0ZWQtbG9jYWxlPmVuPC9zdXBwb3J0ZWQtbG9jYWxlPgotCi0gICAgPHBvcnRsZXQtaW5mbz4KLSAgICAgIDx0aXRsZT5NeUZhY2VzIFBvcnRsZXQgQnJpZGdlIERlbW88L3RpdGxlPgotICAgICAgPHNob3J0LXRpdGxlPkJyaWRnZSBEZW1vPC9zaG9ydC10aXRsZT4KLSAgICA8L3BvcnRsZXQtaW5mbz4KLSAgPC9wb3J0bGV0Pg0KLSAgICAKLTwvcG9ydGxldC1hcHA+CmRpZmYgLS1naXQgYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1oZWxsb3dvcmxkLXBvcnRsZXRzL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwgYi9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1oZWxsb3dvcmxkLXBvcnRsZXRzL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwYjQ5MTguLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtaGVsbG93b3JsZC1wb3J0bGV0cy9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotPD94bWwgdmVyc2lvbiA9ICcxLjAnIGVuY29kaW5nID0gJ0lTTy04ODU5LTEnPz4KLTwhRE9DVFlQRSB3ZWItYXBwIFBVQkxJQyAnLS8vU3VuIE1pY3Jvc3lzdGVtcywgSW5jLi8vRFREIFdlYiBBcHBsaWNhdGlvbiAyLjMvL0VOJyAnaHR0cDovL2phdmEuc3VuLmNvbS9kdGQvd2ViLWFwcF8yXzMuZHRkJz4KLTwhLS0KLSAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gICAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gICAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gICAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICAgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICAgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICAgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgICB1bmRlciB0aGUgTGljZW5zZS4KLQkgICAKLS0tPgotPCEtLSBUaGUgSmV0dHkgUGx1dG8gUGx1Z2luIG5lZWRzIHRvIGhhdmUgYSBXZWJhcHAgMi4zIHdlYi14bWwuICBEb24ndCBrbm93IHdoeS4gLS0+Ci08d2ViLWFwcD4KLSAKLSAgPGNvbnRleHQtcGFyYW0+Ci0gICAgPHBhcmFtLW5hbWU+amF2YXguZmFjZXMuREVGQVVMVF9TVUZGSVg8L3BhcmFtLW5hbWU+Ci0gICAgPHBhcmFtLXZhbHVlPi5qc3A8L3BhcmFtLXZhbHVlPgotICA8L2NvbnRleHQtcGFyYW0+Ci0gIAotICA8IS0tIEZhY2VzIFNlcnZsZXQgLS0+Ci0gIDxzZXJ2bGV0PgotICAgIDxzZXJ2bGV0LW5hbWU+ZmFjZXM8L3NlcnZsZXQtbmFtZT4KLSAgICA8c2VydmxldC1jbGFzcz5qYXZheC5mYWNlcy53ZWJhcHAuRmFjZXNTZXJ2bGV0PC9zZXJ2bGV0LWNsYXNzPgotICAgIDxsb2FkLW9uLXN0YXJ0dXA+MTwvbG9hZC1vbi1zdGFydHVwPgotICA8L3NlcnZsZXQ+Ci0KLSAgPCEtLSBGYWNlcyBTZXJ2bGV0IE1hcHBpbmdzIC0tPgotICA8IS0tIAotICAgIEluIHRoaXMgZGVtbyBhcHBsaWNhdGlvbiwgSSBjaG9zZSB0byB1c2Ugc3VmZml4IG1hcHBpbmcuICBJIGRpZCB0aGlzIGJlY2F1c2UgaXQgbWFrZXMgdXJscwotICAgIGluIHRoZSBwb3J0bGV0IHdvcmxkIGxvb2sgbmljZXIgaW4gdGhlIHNvdXJjZS4gIFRoZSBwb3J0bGV0IHVybCBzaG91bGQgYmUgdGhlIHNhbWUgCi0gICAgcmVndWFyZGxlc3MuCi0gIC0tPgotICA8c2VydmxldC1tYXBwaW5nPgotICAgIDxzZXJ2bGV0LW5hbWU+ZmFjZXM8L3NlcnZsZXQtbmFtZT4KLSAgICA8dXJsLXBhdHRlcm4+Ki5qc2Y8L3VybC1wYXR0ZXJuPgotICA8L3NlcnZsZXQtbWFwcGluZz4KLSAgCi08L3dlYi1hcHA+CmRpZmYgLS1naXQgYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1oZWxsb3dvcmxkLXBvcnRsZXRzL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL3dlYmFwcC9lZGl0LmpzcCBiL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWhlbGxvd29ybGQtcG9ydGxldHMvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc3JjL21haW4vd2ViYXBwL2VkaXQuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Yzg0NmY0Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWhlbGxvd29ybGQtcG9ydGxldHMvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc3JjL21haW4vd2ViYXBwL2VkaXQuanNwCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotPCUtLQotICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICAgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gICAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICAgIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICAgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gICAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gICAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gICAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICAgIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0lPgotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIKLSJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDtjaGFyc2V0PVVURi04IiU+Ci08JUAgdGFnbGliIHVyaT0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvaHRtbCIgcHJlZml4PSJoIiU+Ci08JUAgdGFnbGliIHVyaT0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvY29yZSIgcHJlZml4PSJmIiU+Ci08Zjp2aWV3PgotICA8aHRtbD4KLSAgICA8aGVhZD4KLSAgICAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ii8+Ci0gICAgICA8dGl0bGU+aW5kZXg8L3RpdGxlPgotICAgIDwvaGVhZD4KLSAgICA8Ym9keT4KLSAgICAgIDxoOmZvcm0+Ci0gICAgICAgIDxoOnBhbmVsR3JpZCBjb2x1bW5zPSIxIj4KLSAgICAgICAgICA8aDpvdXRwdXRUZXh0IHZhbHVlPSJUaGlzIGlzIHRoZSBwb3J0bGV0IGVkaXQgc2NyZWVuLiIvPgotICAgICAgICA8L2g6cGFuZWxHcmlkPgotICAgICAgPC9oOmZvcm0+Ci0gICAgPC9ib2R5PgotICA8L2h0bWw+Ci08L2Y6dmlldz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1oZWxsb3dvcmxkLXBvcnRsZXRzL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL3dlYmFwcC9oZWxsb3dvcmxkL2hlbGxvLmpzcCBiL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWhlbGxvd29ybGQtcG9ydGxldHMvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc3JjL21haW4vd2ViYXBwL2hlbGxvd29ybGQvaGVsbG8uanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NGVhOThkLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWhlbGxvd29ybGQtcG9ydGxldHMvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc3JjL21haW4vd2ViYXBwL2hlbGxvd29ybGQvaGVsbG8uanNwCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotPCUtLQotICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICAgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gICAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICAgIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICAgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gICAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gICAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gICAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICAgIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0lPgotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIKLSJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDtjaGFyc2V0PVVURi04IiU+Ci08JUAgdGFnbGliIHVyaT0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvaHRtbCIgcHJlZml4PSJoIiU+Ci08JUAgdGFnbGliIHVyaT0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvY29yZSIgcHJlZml4PSJmIiU+Ci08Zjp2aWV3PgotICA8aHRtbD4KLSAgICA8aGVhZD4KLSAgICAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ii8+Ci0gICAgICA8dGl0bGU+aGVsbG88L3RpdGxlPgotICAgIDwvaGVhZD4KLSAgICA8Ym9keT4KLSAgICAgIDxoOmZvcm0+Ci0gICAgICAgIDxoOnBhbmVsR3JpZCBjb2x1bW5zPSIxIj4KLSAgICAgICAgICA8aDpvdXRwdXRUZXh0IHZhbHVlPSJIZWxsbyAje25hbWViZWFuLm5hbWV9Ii8+Ci0gICAgICAgICAgPGg6Y29tbWFuZEJ1dHRvbiB2YWx1ZT0icmV0dXJuIiBhY3Rpb249ImhlbGxvV29ybGQiLz4KLSAgICAgICAgPC9oOnBhbmVsR3JpZD4KLSAgICAgIDwvaDpmb3JtPgotICAgIDwvYm9keT4KLSAgPC9odG1sPgotPC9mOnZpZXc+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtaGVsbG93b3JsZC1wb3J0bGV0cy9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zcmMvbWFpbi93ZWJhcHAvaGVsbG93b3JsZC9pbmRleC5qc3AgYi9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1oZWxsb3dvcmxkLXBvcnRsZXRzL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL3dlYmFwcC9oZWxsb3dvcmxkL2luZGV4LmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzdlZTE3OC4uMDAwMDAwMAotLS0gYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1oZWxsb3dvcmxkLXBvcnRsZXRzL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL3dlYmFwcC9oZWxsb3dvcmxkL2luZGV4LmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLTwlLS0KLSAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gICAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gICAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gICAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICAgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICAgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICAgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgICB1bmRlciB0aGUgTGljZW5zZS4KLS0tJT4KLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iCi0iaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7Y2hhcnNldD1VVEYtOCIlPgotPCVAIHRhZ2xpYiB1cmk9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2h0bWwiIHByZWZpeD0iaCIlPgotPCVAIHRhZ2xpYiB1cmk9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2NvcmUiIHByZWZpeD0iZiIlPgotPGY6dmlldz4KLSAgPGh0bWw+Ci0gICAgPGhlYWQ+Ci0gICAgICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIvPgotICAgICAgPHRpdGxlPmluZGV4PC90aXRsZT4KLSAgICA8L2hlYWQ+Ci0gICAgPGJvZHk+Ci0gICAgICA8aDpmb3JtPgotICAgICAgICA8aDpwYW5lbEdyaWQgY29sdW1ucz0iMSI+Ci0gICAgICAgICAgPGg6cGFuZWxHcmlkIGNvbHVtbnM9IjIiPgotICAgICAgICAgICAgPGg6b3V0cHV0VGV4dCB2YWx1ZT0iUGxlYXNlIGVudGVyIHlvdXIgbmFtZTogIi8+Ci0gICAgICAgICAgICA8aDppbnB1dFRleHQgdmFsdWU9IiN7bmFtZWJlYW4ubmFtZX0iLz4KLSAgICAgICAgICA8L2g6cGFuZWxHcmlkPgotICAgICAgICAgIDxoOmNvbW1hbmRCdXR0b24gdmFsdWU9IkNsaWNrIEhlcmUiIGFjdGlvbj0ic2F5aGVsbG8iLz4KLSAgICAgICAgPC9oOnBhbmVsR3JpZD4KLSAgICAgIDwvaDpmb3JtPgotICAgIDwvYm9keT4KLSAgPC9odG1sPgotPC9mOnZpZXc+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtaGVsbG93b3JsZC1wb3J0bGV0cy9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zcmMvbWFpbi93ZWJhcHAvaGVscC5qc3AgYi9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1oZWxsb3dvcmxkLXBvcnRsZXRzL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL3dlYmFwcC9oZWxwLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2UzYjc3OC4uMDAwMDAwMAotLS0gYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1oZWxsb3dvcmxkLXBvcnRsZXRzL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL3dlYmFwcC9oZWxwLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLTwlLS0KLSAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gICAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gICAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gICAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICAgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICAgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICAgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgICB1bmRlciB0aGUgTGljZW5zZS4KLS0tJT4KLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iCi0iaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7Y2hhcnNldD1VVEYtOCIlPgotPCVAIHRhZ2xpYiB1cmk9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2h0bWwiIHByZWZpeD0iaCIlPgotPCVAIHRhZ2xpYiB1cmk9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2NvcmUiIHByZWZpeD0iZiIlPgotPGY6dmlldz4KLSAgPGh0bWw+Ci0gICAgPGhlYWQ+Ci0gICAgICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIvPgotICAgICAgPHRpdGxlPmluZGV4PC90aXRsZT4KLSAgICA8L2hlYWQ+Ci0gICAgPGJvZHk+Ci0gICAgICA8aDpmb3JtPgotICAgICAgICA8aDpwYW5lbEdyaWQgY29sdW1ucz0iMSI+Ci0gICAgICAgICAgPGg6b3V0cHV0VGV4dCB2YWx1ZT0iVGhpcyBpcyB0aGUgcG9ydGxldCBoZWxwIHNjcmVlbi4iLz4KLSAgICAgICAgPC9oOnBhbmVsR3JpZD4KLSAgICAgIDwvaDpmb3JtPgotICAgIDwvYm9keT4KLSAgPC9odG1sPgotPC9mOnZpZXc+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtaGVsbG93b3JsZC1wb3J0bGV0cy9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zcmMvbWFpbi93ZWJhcHAvaW5kZXguanNwIGIvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtaGVsbG93b3JsZC1wb3J0bGV0cy9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zcmMvbWFpbi93ZWJhcHAvaW5kZXguanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMjE5ZTI4Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWhlbGxvd29ybGQtcG9ydGxldHMvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc3JjL21haW4vd2ViYXBwL2luZGV4LmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLTwlLS0KLSAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gICAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gICAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gICAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICAgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICAgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICAgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgICB1bmRlciB0aGUgTGljZW5zZS4KLS0tJT4KLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iCi0iaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7Y2hhcnNldD1VVEYtOCIlPgotPCVAIHRhZ2xpYiB1cmk9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2h0bWwiIHByZWZpeD0iaCIlPgotPCVAIHRhZ2xpYiB1cmk9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2NvcmUiIHByZWZpeD0iZiIlPgotPGY6dmlldz4KLSAgPGh0bWw+Ci0gICAgPGhlYWQ+Ci0gICAgICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIvPgotICAgICAgPHRpdGxlPmluZGV4PC90aXRsZT4KLSAgICA8L2hlYWQ+Ci0gICAgPGJvZHk+Ci0gICAgICA8aDpmb3JtPgotICAgICAgICA8aDpwYW5lbEdyaWQgY29sdW1ucz0iMSI+Ci0gICAgICAgICAgPGg6b3V0cHV0VGV4dCB2YWx1ZT0iUGxlYXNlIHNlbGVjdDoiLz4KLSAgICAgICAgICA8aDpwYW5lbEdyb3VwPgotICAgICAgICAgICAgPHVsPgotICAgICAgICAgICAgICA8bGk+Ci0gICAgICAgICAgICAgICAgPGg6Y29tbWFuZExpbmsgdmFsdWU9IkhlbGxvV29ybGQgZXhhbXBsZSIgYWN0aW9uPSJoZWxsb1dvcmxkIi8+Ci0gICAgICAgICAgICAgIDwvbGk+Ci0gICAgICAgICAgICA8L3VsPgotICAgICAgICAgIDwvaDpwYW5lbEdyb3VwPgotICAgICAgICA8L2g6cGFuZWxHcmlkPgotICAgICAgPC9oOmZvcm0+Ci0gICAgPC9ib2R5PgotICA8L2h0bWw+Ci08L2Y6dmlldz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1oZWxsb3dvcmxkLXBvcnRsZXRzL3NyYy9zaXRlL2FwdC9pbmRleC5hcHQgYi9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1oZWxsb3dvcmxkLXBvcnRsZXRzL3NyYy9zaXRlL2FwdC9pbmRleC5hcHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyZjhiOWEuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtaGVsbG93b3JsZC1wb3J0bGV0cy9zcmMvc2l0ZS9hcHQvaW5kZXguYXB0CisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotIC0tLS0tLQ0KLSBNeWZhY2VzIEhlbGxvV29ybGQgUG9ydGxldHMgQXJjaGV0eXBlDQotIC0tLS0tLQ0KLQ0KLU92ZXJ2aWV3DQotDQotICBUaGlzIHByb2plY3QgZGVmaW5lcyBhIE1hdmVuIGFyY2hldHlwZS4gUnVubmluZyB0aGUgYXJjaGV0eXBlIHBsdWdpbiB3aXRoIHRoaXMgYXJjaGV0eXBlIHdpbGwNCi0gIGNyZWF0ZSBhIGRpcmVjdG9yeSB0cmVlIGNvbnRhaW5pbmcgdGhlIGZpbGVzIG5lZWRlZCB0byBxdWlja2x5IGdldCBzdGFydGVkIG9uIGEgbmV3IEpTRiAxLjINCi0gIHByb2plY3Qgd2hpY2ggdXNlcyBQb3J0bGV0cy4NCi0NCi1Vc2FnZQ0KLQ0KLSAgVXNlIHRoZSBmb2xsb3dpbmcgbWF2ZW4gY29tbWFuZCBhbmQgdGhlbiBzZWxlY3QgbXlmYWNlcy1hcmNoZXR5cGUtaGVsbG93b3JsZC1wb3J0bGV0cyBmcm9tIHRoZSBvcHRpb25zLg0KLQ0KLQ0KLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rDQotbXZuIGFyY2hldHlwZTpnZW5lcmF0ZSAtRGFyY2hldHlwZUNhdGFsb2c9aHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZw0KLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rDQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtaGVsbG93b3JsZC9wb20ueG1sIGIvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtaGVsbG93b3JsZC9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NzIzNDhhLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWhlbGxvd29ybGQvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICAgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICAgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gICAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICAgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gICAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gICAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gICAgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgotCi0gICAgPHBhcmVudD4KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHM8L2dyb3VwSWQ+Ci0gICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtYXJjaGV0eXBlLXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPHZlcnNpb24+MS4wLjQtU05BUFNIT1Q8L3ZlcnNpb24+Ci0gICAgPC9wYXJlbnQ+Ci0KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHM8L2dyb3VwSWQ+Ci0gICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1hcmNoZXR5cGUtaGVsbG93b3JsZDwvYXJ0aWZhY3RJZD4KLSAgICA8cGFja2FnaW5nPmphcjwvcGFja2FnaW5nPgotICAgIDxuYW1lPk15RmFjZXMgQmFzaWMgQXJjaGV0eXBlPC9uYW1lPgotICAgIDxkZXNjcmlwdGlvbj5BcmNoZXR5cGUgdG8gY3JlYXRlIGEgbmV3IHdlYmFwcCBiYXNlZCBvbiBteWZhY2VzPC9kZXNjcmlwdGlvbj4KLQotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtaGVsbG93b3JsZC9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvTElDRU5TRS50eHQgYi9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1oZWxsb3dvcmxkL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9MSUNFTlNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDY0NTY5NS4uMDAwMDAwMAotLS0gYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1oZWxsb3dvcmxkL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9MSUNFTlNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDIwMiArMCwwIEBACi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0Ci0gICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvCi0KLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTgotCi0gICAxLiBEZWZpbml0aW9ucy4KLQotICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwKLSAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgotCi0gICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgotCi0gICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsCi0gICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCi0gICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLAotICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlCi0gICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgotICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlCi0gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5LgotCi0gICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLgotCi0gICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywKLSAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24KLSAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCi0KLSAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsCi0gICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0Ci0gICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sCi0gICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuCi0KLSAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yCi0gICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhCi0gICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKLSAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuCi0KLSAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKLSAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUKLSAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMKLSAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCi0gICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4KLSAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwKLSAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCi0KLSAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nCi0gICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCi0gICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkKLSAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIKLSAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgotICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiCi0gICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50Ci0gICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bwotICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywKLSAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlCi0gICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKLSAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlCi0gICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiIKLQotICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKLSAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZAotICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCi0KLSAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKLSAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLAotICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCi0gICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLgotCi0gICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKLSAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLAotICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUKLSAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCi0gICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpCi0gICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQotICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKLSAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsKLSAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0Ci0gICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCi0gICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUKLSAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4KLQotICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUKLSAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dAotICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKLSAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotCi0gICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgotICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kCi0KLSAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKLSAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQKLQotICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCi0gICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZAotICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssCi0gICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgotICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQKLQotICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCi0gICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdAotICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZAotICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAotICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQotICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkCi0gICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgotICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLAotICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQKLSAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKLSAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kCi0gICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24KLSAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQotICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZAotICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZAotICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KLQotICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kCi0gICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCi0gICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yCi0gICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwKLSAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAotICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4KLQotICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAotICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrCi0gICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCi0gICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5Ci0gICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZAotICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgotCi0gICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlCi0gICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCi0gICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUKLSAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLgotCi0gICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IKLSAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gKLSAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucwotICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQotICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlCi0gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkKLSAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KLQotICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksCi0gICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKLSAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5Ci0gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQotICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAotICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhCi0gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlCi0gICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCi0gICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbAotICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcgotICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgotCi0gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nCi0gICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAotICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwKLSAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzCi0gICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQotICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYKLSAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwKLSAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQotICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbgotICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuCi0KLSAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUwotCi0gICBBUFBFTkRJWDogSG93IHRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmsuCi0KLSAgICAgIFRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmssIGF0dGFjaCB0aGUgZm9sbG93aW5nCi0gICAgICBib2lsZXJwbGF0ZSBub3RpY2UsIHdpdGggdGhlIGZpZWxkcyBlbmNsb3NlZCBieSBicmFja2V0cyAiW10iCi0gICAgICByZXBsYWNlZCB3aXRoIHlvdXIgb3duIGlkZW50aWZ5aW5nIGluZm9ybWF0aW9uLiAoRG9uJ3QgaW5jbHVkZQotICAgICAgdGhlIGJyYWNrZXRzISkgIFRoZSB0ZXh0IHNob3VsZCBiZSBlbmNsb3NlZCBpbiB0aGUgYXBwcm9wcmlhdGUKLSAgICAgIGNvbW1lbnQgc3ludGF4IGZvciB0aGUgZmlsZSBmb3JtYXQuIFdlIGFsc28gcmVjb21tZW5kIHRoYXQgYQotICAgICAgZmlsZSBvciBjbGFzcyBuYW1lIGFuZCBkZXNjcmlwdGlvbiBvZiBwdXJwb3NlIGJlIGluY2x1ZGVkIG9uIHRoZQotICAgICAgc2FtZSAicHJpbnRlZCBwYWdlIiBhcyB0aGUgY29weXJpZ2h0IG5vdGljZSBmb3IgZWFzaWVyCi0gICAgICBpZGVudGlmaWNhdGlvbiB3aXRoaW4gdGhpcmQtcGFydHkgYXJjaGl2ZXMuCi0KLSAgIENvcHlyaWdodCBbeXl5eV0gW25hbWUgb2YgY29weXJpZ2h0IG93bmVyXQotCi0gICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgpkaWZmIC0tZ2l0IGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtaGVsbG93b3JsZC9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvTk9USUNFLnR4dCBiL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWhlbGxvd29ybGQvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL05PVElDRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhM2RiZDYuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtaGVsbG93b3JsZC9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvTk9USUNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLT09ICBOT1RJQ0UgZmlsZSBjb3JyZXNwb25kaW5nIHRvIHNlY3Rpb24gNChkKSBvZiB0aGUgQXBhY2hlIExpY2Vuc2UsICAgPT0KLT09ICBWZXJzaW9uIDIuMCwgaW4gdGhpcyBjYXNlIGZvciB0aGUgQXBhY2hlIE15RmFjZXMgTWF2ZW4gUGx1Z2lucyAgICAgPT0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSAKLVRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuCi0KLVBvcnRpb25zIG9mIHRoaXMgc29mdHdhcmUgd2VyZSBvcmlnaW5hbGx5IGJhc2VkIG9uIHRoZSBmb2xsb3dpbmc6Ci0KLSAtIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDA2LCBPcmFjbGUgQ29ycCwgPGh0dHA6Ly93d3cub3JhY2xlLmNvbS8+LgotYW5kIGFyZSBsaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gdW5kZXIgdGhlIAotIlNvZnR3YXJlIEdyYW50IGFuZCBDb3Jwb3JhdGUgQ29udHJpYnV0aW9uIExpY2Vuc2UgQWdyZWVtZW50IgotCi1TZWUgdGhlIExJQ0VOU0UudHh0IGZpbGUgZm9yIGluZm9ybWF0aW9uIG9uIGFsbCBsaWNlbnNlcyAKLWFzc29jaWF0ZWQgd2l0aCB0aGlzIHNvZnR3YXJlLgpkaWZmIC0tZ2l0IGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtaGVsbG93b3JsZC9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvbWF2ZW4vYXJjaGV0eXBlLW1ldGFkYXRhLnhtbCBiL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWhlbGxvd29ybGQvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL21hdmVuL2FyY2hldHlwZS1tZXRhZGF0YS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmYjg1YWMuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtaGVsbG93b3JsZC9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvbWF2ZW4vYXJjaGV0eXBlLW1ldGFkYXRhLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICAgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICAgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gICAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICAgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gICAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gICAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gICAgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTxhcmNoZXR5cGUtZGVzY3JpcHRvciB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvcGx1Z2lucy9tYXZlbi1hcmNoZXR5cGUtcGx1Z2luL2FyY2hldHlwZS1kZXNjcmlwdG9yLzEuMC4wIgotICAgICAgICAgICAgICAgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgICAgICAgICAgICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9wbHVnaW5zL21hdmVuLWFyY2hldHlwZS1wbHVnaW4vYXJjaGV0eXBlLWRlc2NyaXB0b3IvMS4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL2FyY2hldHlwZS1kZXNjcmlwdG9yLTEuMC4wLnhzZCIKLQotICAgICAgICAgICAgICAgICAgICAgIG5hbWU9Im15ZmFjZXMtYXJjaGV0eXBlLWhlbGxvd29ybGQiIHBhcnRpYWw9ImZhbHNlIj4KLQotICA8cmVxdWlyZWRQcm9wZXJ0aWVzLz4KLQotICA8ZmlsZVNldHM+Ci0gICAgICA8ZmlsZVNldCBmaWx0ZXJlZD0idHJ1ZSIgcGFja2FnZWQ9InRydWUiPgotICAgICAgICAgIDxkaXJlY3Rvcnk+c3JjL21haW4vamF2YS88L2RpcmVjdG9yeT4KLSAgICAgIDwvZmlsZVNldD4KLSAgICAgIDxmaWxlU2V0IGZpbHRlcmVkPSJmYWxzZSIgcGFja2FnZWQ9ImZhbHNlIj4KLSAgICAgICAgICA8ZGlyZWN0b3J5PnNyYy9tYWluL3dlYmFwcC88L2RpcmVjdG9yeT4KLSAgICAgICAgICA8ZXhjbHVkZXM+Ci0gICAgICAgICAgICAgIDxleGNsdWRlPldFQi1JTkYvZmFjZXMtY29uZmlnLnhtbDwvZXhjbHVkZT4KLSAgICAgICAgICA8L2V4Y2x1ZGVzPgotICAgICAgPC9maWxlU2V0PgotICAgICAgPGZpbGVTZXQgZmlsdGVyZWQ9InRydWUiIHBhY2thZ2VkPSJmYWxzZSI+Ci0gICAgICAgICAgPGRpcmVjdG9yeT5zcmMvbWFpbi93ZWJhcHAvPC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgPGluY2x1ZGVzPgotICAgICAgICAgICAgICA8IS0tIGZhY2VzLWNvbmZpZyBuZWVkcyB0byBiZSBmaWx0ZXJlZCAtLT4KLSAgICAgICAgICAgICAgPGluY2x1ZGU+V0VCLUlORi9mYWNlcy1jb25maWcueG1sPC9pbmNsdWRlPgotICAgICAgICAgIDwvaW5jbHVkZXM+Ci0gICAgICA8L2ZpbGVTZXQ+Ci0gICAgICA8ZmlsZVNldCBmaWx0ZXJlZD0iZmFsc2UiIHBhY2thZ2VkPSJmYWxzZSI+Ci0gICAgICAgICAgPGRpcmVjdG9yeT5zcmMvbWFpbi9sb2c0ai88L2RpcmVjdG9yeT4KLSAgICAgIDwvZmlsZVNldD4KLSAgPC9maWxlU2V0cz4KLQotICA8bW9kdWxlcy8+Ci0KLTwvYXJjaGV0eXBlLWRlc2NyaXB0b3I+CmRpZmYgLS1naXQgYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1oZWxsb3dvcmxkL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3BvbS54bWwgYi9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1oZWxsb3dvcmxkL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiNDdmYWUuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtaGVsbG93b3JsZC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTc5ICswLDAgQEAKLSNzZXQoICRzeW1ib2xfcG91bmQgPSAnIycgKQotI3NldCggJHN5bWJvbF9kb2xsYXIgPSAnJCcgKQotI3NldCggJHN5bWJvbF9lc2NhcGUgPSAnXCcgKQotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIKLSAgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0gICAgPGdyb3VwSWQ+JHtncm91cElkfTwvZ3JvdXBJZD4KLSAgICA8YXJ0aWZhY3RJZD4ke2FydGlmYWN0SWR9PC9hcnRpZmFjdElkPgotICAgIDxwYWNrYWdpbmc+d2FyPC9wYWNrYWdpbmc+Ci0gICAgPHZlcnNpb24+JHt2ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICA8bmFtZT5BIGN1c3RvbSBwcm9qZWN0IHVzaW5nIG15ZmFjZXMgMS4yPC9uYW1lPgotICAgIDx1cmw+aHR0cDovL3d3dy5teW9yZ2FuaXphdGlvbi5vcmc8L3VybD4KLQotICAgIDxwcm9wZXJ0aWVzPgotICAgICAgICA8anNmLW15ZmFjZXMudmVyc2lvbj4xLjIuMTA8L2pzZi1teWZhY2VzLnZlcnNpb24+Ci0gICAgICAgIDxqc2YtcmkudmVyc2lvbj4xLjJfMTU8L2pzZi1yaS52ZXJzaW9uPiAgICAgICAgCi0gICAgICAgIDxtYXZlbi5qZXR0eS5wbHVnaW4udmVyc2lvbj42LjEuMjI8L21hdmVuLmpldHR5LnBsdWdpbi52ZXJzaW9uPgotICAgICAgICA8bG9nNGoudmVyc2lvbj4xLjIuMTM8L2xvZzRqLnZlcnNpb24+Ci0gICAgPC9wcm9wZXJ0aWVzPgotCi0gICAgPGJ1aWxkPgotICAgICAgICA8ZmluYWxOYW1lPiR7YXJ0aWZhY3RJZH08L2ZpbmFsTmFtZT4KLSAgICAgICAgPHBsdWdpbnM+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDwhLS1UaGlzIHBsdWdpbiBhbGxvd3MgdG8gcnVuIHRoZSBleGFtcGxlIHVzaW5nIG12biBqZXR0eTpydW4gLS0+Ci0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLm1vcnRiYXkuamV0dHk8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tamV0dHktcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7c3ltYm9sX2RvbGxhcn17bWF2ZW4uamV0dHkucGx1Z2luLnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8c2NhbkludGVydmFsU2Vjb25kcz4xMDwvc2NhbkludGVydmFsU2Vjb25kcz4KLSAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgPC9wbHVnaW5zPgotICAgIDwvYnVpbGQ+Ci0gICAgCi0gICAgPHByb2ZpbGVzPgotICAgICAgICA8cHJvZmlsZT4KLSAgICAgICAgICAgIDxpZD5teWZhY2VzPC9pZD4KLSAgICAgICAgICAgIDxhY3RpdmF0aW9uPgotICAgICAgICAgICAgICAgIDxwcm9wZXJ0eT4KLSAgICAgICAgICAgICAgICAgICAgPG5hbWU+IWpzZjwvbmFtZT4KLSAgICAgICAgICAgICAgICA8L3Byb3BlcnR5PgotICAgICAgICAgICAgPC9hY3RpdmF0aW9uPgotICAgICAgICAgICAgPGRlcGVuZGVuY2llcz4KLSAgICAgICAgICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmNvcmU8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtYXBpPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3N5bWJvbF9kb2xsYXJ9e2pzZi1teWZhY2VzLnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+Ci0gICAgICAgICAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICAgICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuY29yZTwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1pbXBsPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3N5bWJvbF9kb2xsYXJ9e2pzZi1teWZhY2VzLnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgICAgICAgICA8c2NvcGU+cnVudGltZTwvc2NvcGU+Ci0gICAgICAgICAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICAgICAgPC9kZXBlbmRlbmNpZXM+Ci0gICAgICAgIDwvcHJvZmlsZT4KLSAgICAgICAgPHByb2ZpbGU+Ci0gICAgICAgICAgICA8IS0tIEFjdGl2ZSBhZGRpbmcgLURqc2Y9cmkgd2hlbiBleGVjdXRlIG1hdmVuIGdvYWxzLiAtLT4KLSAgICAgICAgICAgIDxpZD5qc2Ytcmk8L2lkPgotICAgICAgICAgICAgPGFjdGl2YXRpb24+Ci0gICAgICAgICAgICAgICAgPHByb3BlcnR5PgotICAgICAgICAgICAgICAgICAgICA8bmFtZT5qc2Y8L25hbWU+Ci0gICAgICAgICAgICAgICAgICAgIDx2YWx1ZT5yaTwvdmFsdWU+Ci0gICAgICAgICAgICAgICAgPC9wcm9wZXJ0eT4KLSAgICAgICAgICAgIDwvYWN0aXZhdGlvbj4KLSAgICAgICAgICAgIDxkZXBlbmRlbmNpZXM+Ci0gICAgICAgICAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPmphdmF4LmZhY2VzPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qc2YtYXBpPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3N5bWJvbF9kb2xsYXJ9e2pzZi1yaS52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgotICAgICAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXguZmFjZXM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmpzZi1pbXBsPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3N5bWJvbF9kb2xsYXJ9e2pzZi1yaS52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPHNjb3BlPnJ1bnRpbWU8L3Njb3BlPgotICAgICAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDwvZGVwZW5kZW5jaWVzPgotICAgICAgICAgICAgPHJlcG9zaXRvcmllcz4KLSAgICAgICAgICAgICAgICA8cmVwb3NpdG9yeT4KLSAgICAgICAgICAgICAgICAgICAgPGlkPmphdmEubmV0PC9pZD4KLSAgICAgICAgICAgICAgICAgICAgPHVybD5odHRwOi8vZG93bmxvYWQuamF2YS5uZXQvbWF2ZW4vMTwvdXJsPgotICAgICAgICAgICAgICAgICAgICA8bGF5b3V0PmxlZ2FjeTwvbGF5b3V0PgotICAgICAgICAgICAgICAgIDwvcmVwb3NpdG9yeT4KLSAgICAgICAgICAgIDwvcmVwb3NpdG9yaWVzPgotICAgICAgICA8L3Byb2ZpbGU+Ci0gICAgICAgIAotICAgICAgICA8cHJvZmlsZT4KLSAgICAgICAgICAgIDwhLS0gRGVidWcgcHJvZmlsZSBmb3IgbXlmYWNlcyBhbmQgamV0dHkuCi0gICAgICAgICAgICAgICAgSXQgYWxsb3dzIHRvIHNlZSBkZWJ1ZyBtZXNzYWdlcyB1c2luZyAtUGpldHR5Q29uZmlnIC0tPgotICAgICAgICAgICAgPGlkPmpldHR5Q29uZmlnPC9pZD4KLSAgICAgICAgICAgIDxidWlsZD4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2VzPgotICAgICAgICAgICAgICAgICAgICA8cmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PnNyYy9tYWluL3Jlc291cmNlczwvZGlyZWN0b3J5PgotICAgICAgICAgICAgICAgICAgICA8L3Jlc291cmNlPgotICAgICAgICAgICAgICAgICAgICA8cmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PnNyYy9tYWluL2xvZzRqPC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgICAgIDwvcmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgPC9yZXNvdXJjZXM+Ci0gICAgICAgICAgICAgICAgPHBsdWdpbnM+Ci0gICAgICAgICAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8IS0tVGhpcyBwbHVnaW4gYWxsb3dzIHRvIHJ1biB0aGUgZXhhbXBsZSB1c2luZyBtdm4gamV0dHk6cnVuIC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLm1vcnRiYXkuamV0dHk8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1qZXR0eS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3N5bWJvbF9kb2xsYXJ9e21hdmVuLmpldHR5LnBsdWdpbi52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzY2FuSW50ZXJ2YWxTZWNvbmRzPjEwPC9zY2FuSW50ZXJ2YWxTZWNvbmRzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzeXN0ZW1Qcm9wZXJ0aWVzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3lzdGVtUHJvcGVydHk+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5vcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c8L25hbWU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmFsdWU+b3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuaW1wbC5Mb2c0SkxvZ2dlcjwvdmFsdWU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3lzdGVtUHJvcGVydHk+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zeXN0ZW1Qcm9wZXJ0aWVzPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgICAgICAgICA8L3BsdWdpbnM+Ci0gICAgICAgICAgICA8L2J1aWxkPgotICAgICAgICAgICAgPGRlcGVuZGVuY2llcz4KLSAgICAgICAgICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+bG9nNGo8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmxvZzRqPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3N5bWJvbF9kb2xsYXJ9e2xvZzRqLnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgICAgICAgICA8dHlwZT5qYXI8L3R5cGU+Ci0gICAgICAgICAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICAgICAgPC9kZXBlbmRlbmNpZXM+Ci0gICAgICAgIDwvcHJvZmlsZT4KLSAgICA8L3Byb2ZpbGVzPgotCi0gICAgPCEtLSBQcm9qZWN0IGRlcGVuZGVuY2llcyAtLT4KLSAgICA8ZGVwZW5kZW5jaWVzPgotICAgICAgICAKLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMudG9tYWhhd2s8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD50b21haGF3azEyPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+MS4xLjk8L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+cnVudGltZTwvc2NvcGU+ICAgIAotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIAotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPmphdmF4LnNlcnZsZXQ8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5qc3RsPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+MS4yPC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPnJ1bnRpbWU8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+ICAgICAgICAKLQotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPmp1bml0PC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+anVuaXQ8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj40LjA8L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLQotICAgIDwvZGVwZW5kZW5jaWVzPgotCi08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1oZWxsb3dvcmxkL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL2phdmEvSGVsbG9Xb3JsZENvbnRyb2xsZXIuamF2YSBiL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWhlbGxvd29ybGQvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc3JjL21haW4vamF2YS9IZWxsb1dvcmxkQ29udHJvbGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZTMxMzY3Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWhlbGxvd29ybGQvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc3JjL21haW4vamF2YS9IZWxsb1dvcmxkQ29udHJvbGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgJHtwYWNrYWdlfTsKLQotLyoqCi0gKiBBIHR5cGljYWwgc2ltcGxlIGJhY2tpbmcgYmVhbiwgdGhhdCBpcyBiYWNrZWQgdG8gPGNvZGU+aGVsbG93b3JsZC5qc3A8L2NvZGU+Ci0gKiAKLSAqLwotcHVibGljIGNsYXNzIEhlbGxvV29ybGRDb250cm9sbGVyIHsKLQotICAgIAotICAgIC8vcHJvcGVydGllcwotICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7Ci0gICAgCi0gICAgLyoqCi0gICAgICogZGVmYXVsdCBlbXB0eSBjb25zdHJ1Y3RvcgotICAgICAqLwotICAgIHB1YmxpYyBIZWxsb1dvcmxkQ29udHJvbGxlcigpewotICAgIH0KLSAgICAKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS1nZXR0ZXIgJiBzZXR0ZXIKLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBuYW1lOwotICAgIH0KLSAgICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIE1ldGhvZCB0aGF0IGlzIGJhY2tlZCB0byBhIHN1Ym1pdCBidXR0b24gb2YgYSBmb3JtLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgc2VuZCgpewotICAgICAgICAvL2RvIHJlYWwgbG9naWMsIHJldHVybiBhIHN0cmluZyB3aGljaCB3aWxsIGJlIHVzZWQgZm9yIHRoZSBuYXZpZ2F0aW9uIHN5c3RlbSBvZiBKU0YKLSAgICAgICAgcmV0dXJuICJzdWNjZXNzIjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1oZWxsb3dvcmxkL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL2xvZzRqL2xvZzRqLnByb3BlcnRpZXMgYi9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1oZWxsb3dvcmxkL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL2xvZzRqL2xvZzRqLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4MzUyZTQuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtaGVsbG93b3JsZC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zcmMvbWFpbi9sb2c0ai9sb2c0ai5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSMgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0jIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSMgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSMgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSMgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotbG9nNGoucm9vdExvZ2dlcj1JTkZPLCBBMSwgQTIKLWxvZzRqLmFwcGVuZGVyLkExPW9yZy5hcGFjaGUubG9nNGouQ29uc29sZUFwcGVuZGVyCi1sb2c0ai5hcHBlbmRlci5BMS5sYXlvdXQ9b3JnLmFwYWNoZS5sb2c0ai5QYXR0ZXJuTGF5b3V0Ci0KLSNsb2cgb24gYSBmaWxlIG9uIHRhcmdldCB0b28sIHRvIG1ha2UgZWFzaWVyIGNoZWNrIGl0Ci1sb2c0ai5hcHBlbmRlci5BMj1vcmcuYXBhY2hlLmxvZzRqLlJvbGxpbmdGaWxlQXBwZW5kZXIKLWxvZzRqLmFwcGVuZGVyLkEyLkZpbGU9dGFyZ2V0L2xvZzRqLmxvZwotbG9nNGouYXBwZW5kZXIuQTIuTWF4RmlsZVNpemU9MTAwMEtCCi0jIEtlZXAgb25lIGJhY2t1cCBmaWxlCi1sb2c0ai5hcHBlbmRlci5BMi5NYXhCYWNrdXBJbmRleD0xCi1sb2c0ai5hcHBlbmRlci5BMi5sYXlvdXQ9b3JnLmFwYWNoZS5sb2c0ai5QYXR0ZXJuTGF5b3V0Ci1sb2c0ai5hcHBlbmRlci5BMi5sYXlvdXQuQ29udmVyc2lvblBhdHRlcm49JXAgJXQgJWMgLSAlbSVuCi0KLSMgTG9nIGxldmVsIGZvciBteWZhY2VzIGxpYnJhcmllcwotbG9nNGoubG9nZ2VyLm9yZy5hcGFjaGUuY29tbW9ucz1JTkZPCi1sb2c0ai5sb2dnZXIub3JnLmFwYWNoZS5teWZhY2VzPVRSQUNFCi1sb2c0ai5sb2dnZXIuamF2YXguZmFjZXM9VFJBQ0UKLQotIyBQcmludCB0aGUgZGF0ZSBpbiBJU08gODYwMSBmb3JtYXQKLWxvZzRqLmFwcGVuZGVyLkExLmxheW91dC5Db252ZXJzaW9uUGF0dGVybj0lNXAgWyV0XSAoJUZcOiVMKSAtICVtJW4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1oZWxsb3dvcmxkL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL2ZhY2VzLWNvbmZpZy54bWwgYi9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1oZWxsb3dvcmxkL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL2ZhY2VzLWNvbmZpZy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhMzZmZDYuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtaGVsbG93b3JsZC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9mYWNlcy1jb25maWcueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tCi0gICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICAgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICAgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gICAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICAgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gICAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gICAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gICAgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTxmYWNlcy1jb25maWcgdmVyc2lvbj0iMS4yIiAKLSAgICB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIgotICAgIHhtbG5zOnhpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hJbmNsdWRlIgotICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIAotICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS93ZWItZmFjZXNjb25maWdfMV8yLnhzZCI+Ci0JCi0JPCEtLSBtYW5hZ2VkIGJlYW5zIG9mIHRoZSBzaW1wbGUgaGVsbG8gd29ybGQgYXBwIC0tPgotCTxtYW5hZ2VkLWJlYW4+Ci0JCTxtYW5hZ2VkLWJlYW4tbmFtZT5oZWxsb1dvcmxkPC9tYW5hZ2VkLWJlYW4tbmFtZT4KLQkJPG1hbmFnZWQtYmVhbi1jbGFzcz4ke3BhY2thZ2V9LkhlbGxvV29ybGRDb250cm9sbGVyPC9tYW5hZ2VkLWJlYW4tY2xhc3M+Ci0JCTxtYW5hZ2VkLWJlYW4tc2NvcGU+cmVxdWVzdDwvbWFuYWdlZC1iZWFuLXNjb3BlPgotCTwvbWFuYWdlZC1iZWFuPgotCQotCTwhLS0gbmF2aWdhdGlvbiBydWxlcyBmb3IgaGVsbG9Xb3JsZC5qc3AgLS0+Ci0JPG5hdmlnYXRpb24tcnVsZT4KLQkJPGZyb20tdmlldy1pZD4vaGVsbG9Xb3JsZC5qc3A8L2Zyb20tdmlldy1pZD4KLQkJPG5hdmlnYXRpb24tY2FzZT4KLQkJCTxmcm9tLW91dGNvbWU+c3VjY2VzczwvZnJvbS1vdXRjb21lPgotCQkJPHRvLXZpZXctaWQ+L3BhZ2UyLmpzcDwvdG8tdmlldy1pZD4KLQkJPC9uYXZpZ2F0aW9uLWNhc2U+Ci0JPC9uYXZpZ2F0aW9uLXJ1bGU+Ci0JCi0JPCEtLSBuYXZpZ2F0aW9uIHJ1bGVzIGZvciBwYWdlMi5qc3AgLS0+Ci0JPG5hdmlnYXRpb24tcnVsZT4KLQkJPGZyb20tdmlldy1pZD4vcGFnZTIuanNwPC9mcm9tLXZpZXctaWQ+Ci0JCTxuYXZpZ2F0aW9uLWNhc2U+Ci0JCQk8ZnJvbS1vdXRjb21lPmJhY2s8L2Zyb20tb3V0Y29tZT4KLQkJCTx0by12aWV3LWlkPi9oZWxsb1dvcmxkLmpzcDwvdG8tdmlldy1pZD4KLQkJPC9uYXZpZ2F0aW9uLWNhc2U+Ci0JPC9uYXZpZ2F0aW9uLXJ1bGU+Ci08L2ZhY2VzLWNvbmZpZz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1oZWxsb3dvcmxkL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwgYi9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1oZWxsb3dvcmxkL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3ZTk2YjguLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtaGVsbG93b3JsZC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjEyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCEtLQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPHdlYi1hcHAgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUiCi0gICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUvd2ViLWFwcF8yXzQueHNkIgotICAgICAgICAgdmVyc2lvbj0iMi40Ij4KLQotICAgIDxkZXNjcmlwdGlvbj5NeVByb2plY3Qgd2ViLnhtbDwvZGVzY3JpcHRpb24+Ci0KLSAgICA8IS0tb3B0aW9uYWw6IGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5Db21tYSBzZXBhcmF0ZWQgbGlzdCBvZiBVUklzIG9mIChhZGRpdGlvbmFsKSBmYWNlcyBjb25maWcgZmlsZXMuCi0gICAgICAgICAgICAoZS5nLiAvV0VCLUlORi9teS1jb25maWcueG1sKQotICAgICAgICAgICAgU2VlIEpTRiAxLjAgUFJEMiwgMTAuMy4yCi0gICAgICAgICAgICBBdHRlbnRpb246IFlvdSBkbyBub3QgbmVlZCB0byBwdXQgL1dFQi1JTkYvZmFjZXMtY29uZmlnLnhtbCBpbiBoZXJlLgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5qYXZheC5mYWNlcy5DT05GSUdfRklMRVM8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT4vV0VCLUlORi9leGFtcGxlcy1jb25maWcueG1sPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0tLT4KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPlN0YXRlIHNhdmluZyBtZXRob2Q6ICJjbGllbnQiIG9yICJzZXJ2ZXIiICg9IGRlZmF1bHQpCi0gICAgICAgICAgICBTZWUgSlNGIFNwZWNpZmljYXRpb24gMi41LjM8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5qYXZheC5mYWNlcy5TVEFURV9TQVZJTkdfTUVUSE9EPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+Y2xpZW50PC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5Pbmx5IGFwcGxpY2FibGUgaWYgc3RhdGUgc2F2aW5nIG1ldGhvZCBpcyAic2VydmVyIiAoPSBkZWZhdWx0KS4KLSAgICAgICAgICAgIERlZmluZXMgdGhlIGFtb3VudCAoZGVmYXVsdCA9IDIwKSBvZiB0aGUgbGF0ZXN0IHZpZXdzIGFyZSBzdG9yZWQgaW4gc2Vzc2lvbi48L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuTlVNQkVSX09GX1ZJRVdTX0lOX1NFU1NJT048L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT4yMDwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+T25seSBhcHBsaWNhYmxlIGlmIHN0YXRlIHNhdmluZyBtZXRob2QgaXMgInNlcnZlciIgKD0gZGVmYXVsdCkuCi0gICAgICAgICAgICBJZiB0cnVlIChkZWZhdWx0KSB0aGUgc3RhdGUgd2lsbCBiZSBzZXJpYWxpemVkIHRvIGEgYnl0ZSBzdHJlYW0gYmVmb3JlIGl0Ci0gICAgICAgICAgICBpcyB3cml0dGVuIHRvIHRoZSBzZXNzaW9uLgotICAgICAgICAgICAgSWYgZmFsc2UgdGhlIHN0YXRlIHdpbGwgbm90IGJlIHNlcmlhbGl6ZWQgdG8gYSBieXRlIHN0cmVhbS48L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuU0VSSUFMSVpFX1NUQVRFX0lOX1NFU1NJT048L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT50cnVlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5Pbmx5IGFwcGxpY2FibGUgaWYgc3RhdGUgc2F2aW5nIG1ldGhvZCBpcyAic2VydmVyIiAoPSBkZWZhdWx0KSBhbmQgaWYKLSAgICAgICAgICAgIG9yZy5hcGFjaGUubXlmYWNlcy5TRVJJQUxJWkVfU1RBVEVfSU5fU0VTU0lPTiBpcyB0cnVlICg9IGRlZmF1bHQpCi0gICAgICAgICAgICBJZiB0cnVlIChkZWZhdWx0KSB0aGUgc2VyaWFsaXplZCBzdGF0ZSB3aWxsIGJlIGNvbXByZXNzZWQgYmVmb3JlIGl0Ci0gICAgICAgICAgICBpcyB3cml0dGVuIHRvIHRoZSBzZXNzaW9uLiBJZiBmYWxzZSB0aGUgc3RhdGUgd2lsbCBub3QgYmUgY29tcHJlc3NlZC48L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuQ09NUFJFU1NfU1RBVEVfSU5fU0VTU0lPTjwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPnRydWU8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPlRoaXMgcGFyYW1ldGVyIHRlbGxzIE15RmFjZXMgaWYgamF2YXNjcmlwdCBjb2RlIHNob3VsZCBiZSBhbGxvd2VkIGluIHRoZQotICAgICAgICAgICAgcmVuZGVyZWQgSFRNTCBvdXRwdXQuCi0gICAgICAgICAgICBJZiBqYXZhc2NyaXB0IGlzIGFsbG93ZWQsIGNvbW1hbmRfbGluayBhbmNob3JzIHdpbGwgaGF2ZSBqYXZhc2NyaXB0IGNvZGUKLSAgICAgICAgICAgIHRoYXQgc3VibWl0cyB0aGUgY29ycmVzcG9uZGluZyBmb3JtLgotICAgICAgICAgICAgSWYgamF2YXNjcmlwdCBpcyBub3QgYWxsb3dlZCwgdGhlIHN0YXRlIHNhdmluZyBpbmZvIGFuZCBuZXN0ZWQgcGFyYW1ldGVycwotICAgICAgICAgICAgd2lsbCBiZSBhZGRlZCBhcyB1cmwgcGFyYW1ldGVycy4KLSAgICAgICAgICAgIERlZmF1bHQ6ICJ0cnVlIjwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5BTExPV19KQVZBU0NSSVBUPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuREVURUNUX0pBVkFTQ1JJUFQ8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT5mYWxzZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+SWYgdHJ1ZSwgcmVuZGVyZWQgSFRNTCBjb2RlIHdpbGwgYmUgZm9ybWF0dGVkLCBzbyB0aGF0IGl0IGlzICJodW1hbiByZWFkYWJsZSIuCi0gICAgICAgICAgICBpLmUuIGFkZGl0aW9uYWwgbGluZSBzZXBhcmF0b3JzIGFuZCB3aGl0ZXNwYWNlIHdpbGwgYmUgd3JpdHRlbiwgdGhhdCBkbyBub3QKLSAgICAgICAgICAgIGluZmx1ZW5jZSB0aGUgSFRNTCBjb2RlLgotICAgICAgICAgICAgRGVmYXVsdDogInRydWUiPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLlBSRVRUWV9IVE1MPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+SWYgdHJ1ZSwgYSBqYXZhc2NyaXB0IGZ1bmN0aW9uIHdpbGwgYmUgcmVuZGVyZWQgdGhhdCBpcyBhYmxlIHRvIHJlc3RvcmUgdGhlCi0gICAgICAgICAgICBmb3JtZXIgdmVydGljYWwgc2Nyb2xsIG9uIGV2ZXJ5IHJlcXVlc3QuIENvbnZlbmllbnQgZmVhdHVyZSBpZiB5b3UgaGF2ZSBwYWdlcwotICAgICAgICAgICAgd2l0aCBsb25nIGxpc3RzIGFuZCB5b3UgZG8gbm90IHdhbnQgdGhlIGJyb3dzZXIgcGFnZSB0byBhbHdheXMganVtcCB0byB0aGUgdG9wCi0gICAgICAgICAgICBpZiB5b3UgdHJpZ2dlciBhIGxpbmsgb3IgYnV0dG9uIGFjdGlvbiB0aGF0IHN0YXlzIG9uIHRoZSBzYW1lIHBhZ2UuCi0gICAgICAgICAgICBEZWZhdWx0OiAiZmFsc2UiPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLkFVVE9fU0NST0xMPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotCi0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5Vc2VkIGZvciBlbmNyeXB0aW5nIHZpZXcgc3RhdGUuIE9ubHkgcmVsZXZhbnQgZm9yIGNsaWVudCBzaWRlCi0gICAgICAgICAgICBzdGF0ZSBzYXZpbmcuIFNlZSBNeUZhY2VzIHdpa2kvd2ViIHNpdGUgZG9jdW1lbnRhdGlvbiBmb3IgaW5zdHJ1Y3Rpb25zCi0gICAgICAgICAgICBvbiBob3cgdG8gY29uZmlndXJlIGFuIGFwcGxpY2F0aW9uIGZvciBkaWZmZW5lbnQgZW5jcnlwdGlvbiBzdHJlbmd0aHMuCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5TRUNSRVQ8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT5OelkxTkRNeU1UQT08L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLQotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICBWYWxpZGF0ZSBtYW5hZ2VkIGJlYW5zLCBuYXZpZ2F0aW9uIHJ1bGVzIGFuZCBlbnN1cmUgdGhhdCBmb3JtcyBhcmUgbm90IG5lc3RlZC4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLlZBTElEQVRFPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotICAgIAotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICBUcmVhdCByZWFkb25seSBzYW1lIGFzIGlmIGRpc2FibGVkIGF0dHJpYnV0ZSB3YXMgc2V0IGZvciBzZWxlY3QgZWxlbWVudHMuCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5SRUFET05MWV9BU19ESVNBQkxFRF9GT1JfU0VMRUNUUzwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPnRydWU8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4gICAgCi0gICAgCi0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIFVzZSB0aGUgZGVmaW5lZCBjbGFzcyBhcyB0aGUgY2xhc3Mgd2hpY2ggd2lsbCBiZSBjYWxsZWQgd2hlbiBhIHJlc291cmNlIGlzIGFkZGVkIHRvIHRoZQotICAgICAgICAgICAgRXh0ZW5zaW9uRmlsdGVyIGhhbmRsaW5nLiBVc2luZyBTdHJlYW1pbmdBZGRSZXNvdXJjZSBoZXJlIGhlbHBzIHdpdGggcGVyZm9ybWFuY2UuIElmIHlvdSB3YW50IHRvIGFkZAotICAgICAgICAgICAgY3VzdG9tIGNvbXBvbmVudHMgYW5kIHdhbnQgdG8gdXNlIHRoZSBFeHRlbnNpb25GaWx0ZXIsIHlvdSBuZWVkIHRvIHByb3ZpZGUgeW91ciBjdXN0b20gaW1wbGVtZW50YXRpb24gaGVyZS4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLkFERF9SRVNPVVJDRV9DTEFTUzwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPm9yZy5hcGFjaGUubXlmYWNlcy5yZW5kZXJraXQuaHRtbC51dGlsLkRlZmF1bHRBZGRSZXNvdXJjZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPiAgICAgICAgCi0KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgVmlydHVhbCBwYXRoIGluIHRoZSBVUkwgd2hpY2ggdHJpZ2dlcnMgbG9hZGluZyBvZiByZXNvdXJjZXMgZm9yIHRoZSBNeUZhY2VzIGV4dGVuZGVkIGNvbXBvbmVudHMKLSAgICAgICAgICAgIGluIHRoZSBFeHRlbnNpb25GaWx0ZXIuCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5SRVNPVVJDRV9WSVJUVUFMX1BBVEg8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT4vZmFjZXMvbXlGYWNlc0V4dGVuc2lvblJlc291cmNlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0gICAgCi0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIENoZWNrIGlmIHRoZSBleHRlbnNpb25zLWZpbHRlciBoYXMgYmVlbiBwcm9wZXJseSBjb25maWd1cmVkLgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuQ0hFQ0tfRVhURU5TSU9OU19GSUxURVI8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT50cnVlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+ICAgIAotCi0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIERlZmluZSBwYXJ0aWFsIHN0YXRlIHNhdmluZyBhcyB0cnVlL2ZhbHNlLgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5qYXZheC5mYWNlcy5QQVJUSUFMX1NUQVRFX1NBVklOR19NRVRIT0Q8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT5mYWxzZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPiAgICAKLQotICAgIDwhLS0gRXh0ZW5zaW9ucyBGaWx0ZXIgLS0+Ci0gICAgPGZpbHRlcj4KLSAgICAgICAgPGZpbHRlci1uYW1lPmV4dGVuc2lvbnNGaWx0ZXI8L2ZpbHRlci1uYW1lPgotICAgICAgICA8ZmlsdGVyLWNsYXNzPm9yZy5hcGFjaGUubXlmYWNlcy53ZWJhcHAuZmlsdGVyLkV4dGVuc2lvbnNGaWx0ZXI8L2ZpbHRlci1jbGFzcz4KLSAgICAgICAgPGluaXQtcGFyYW0+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+U2V0IHRoZSBzaXplIGxpbWl0IGZvciB1cGxvYWRlZCBmaWxlcy4KLSAgICAgICAgICAgICAgICBGb3JtYXQ6IDEwIC0gMTAgYnl0ZXMKLSAgICAgICAgICAgICAgICAxMGsgLSAxMCBLQgotICAgICAgICAgICAgICAgIDEwbSAtIDEwIE1CCi0gICAgICAgICAgICAgICAgMWcgLSAxIEdCPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxwYXJhbS1uYW1lPnVwbG9hZE1heEZpbGVTaXplPC9wYXJhbS1uYW1lPgotICAgICAgICAgICAgPHBhcmFtLXZhbHVlPjEwMG08L3BhcmFtLXZhbHVlPgotICAgICAgICA8L2luaXQtcGFyYW0+Ci0gICAgICAgIDxpbml0LXBhcmFtPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPlNldCB0aGUgdGhyZXNob2xkIHNpemUgLSBmaWxlcwotICAgICAgICAgICAgICAgIGJlbG93IHRoaXMgbGltaXQgYXJlIHN0b3JlZCBpbiBtZW1vcnksIGZpbGVzIGFib3ZlCi0gICAgICAgICAgICAgICAgdGhpcyBsaW1pdCBhcmUgc3RvcmVkIG9uIGRpc2suCi0KLSAgICAgICAgICAgICAgICBGb3JtYXQ6IDEwIC0gMTAgYnl0ZXMKLSAgICAgICAgICAgICAgICAxMGsgLSAxMCBLQgotICAgICAgICAgICAgICAgIDEwbSAtIDEwIE1CCi0gICAgICAgICAgICAgICAgMWcgLSAxIEdCPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxwYXJhbS1uYW1lPnVwbG9hZFRocmVzaG9sZFNpemU8L3BhcmFtLW5hbWU+Ci0gICAgICAgICAgICA8cGFyYW0tdmFsdWU+MTAwazwvcGFyYW0tdmFsdWU+Ci0gICAgICAgIDwvaW5pdC1wYXJhbT4KLSAgICA8L2ZpbHRlcj4KLQotICAgIDxmaWx0ZXItbWFwcGluZz4KLSAgICAgICAgPGZpbHRlci1uYW1lPmV4dGVuc2lvbnNGaWx0ZXI8L2ZpbHRlci1uYW1lPgotICAgICAgICA8dXJsLXBhdHRlcm4+Ki5qc2Y8L3VybC1wYXR0ZXJuPgotICAgIDwvZmlsdGVyLW1hcHBpbmc+Ci0gICAgPGZpbHRlci1tYXBwaW5nPgotICAgICAgICA8ZmlsdGVyLW5hbWU+ZXh0ZW5zaW9uc0ZpbHRlcjwvZmlsdGVyLW5hbWU+Ci0gICAgICAgIDx1cmwtcGF0dGVybj4vZmFjZXMvKjwvdXJsLXBhdHRlcm4+Ci0gICAgPC9maWx0ZXItbWFwcGluZz4KLQotICAgIDwhLS0gRmFjZXMgU2VydmxldCAtLT4KLSAgICA8c2VydmxldD4KLSAgICAgICAgPHNlcnZsZXQtbmFtZT5GYWNlcyBTZXJ2bGV0PC9zZXJ2bGV0LW5hbWU+Ci0gICAgICAgIDxzZXJ2bGV0LWNsYXNzPmphdmF4LmZhY2VzLndlYmFwcC5GYWNlc1NlcnZsZXQ8L3NlcnZsZXQtY2xhc3M+Ci0gICAgICAgIDxsb2FkLW9uLXN0YXJ0dXA+MTwvbG9hZC1vbi1zdGFydHVwPgotICAgIDwvc2VydmxldD4KLQotICAgIDwhLS0gRmFjZXMgU2VydmxldCBNYXBwaW5nIC0tPgotICAgIDxzZXJ2bGV0LW1hcHBpbmc+Ci0gICAgICAgIDxzZXJ2bGV0LW5hbWU+RmFjZXMgU2VydmxldDwvc2VydmxldC1uYW1lPgotICAgICAgICA8dXJsLXBhdHRlcm4+Ki5qc2Y8L3VybC1wYXR0ZXJuPgotICAgIDwvc2VydmxldC1tYXBwaW5nPgotCi0gICAgPCEtLSBXZWxjb21lIGZpbGVzIC0tPgotICAgIDx3ZWxjb21lLWZpbGUtbGlzdD4KLSAgICAgICAgPHdlbGNvbWUtZmlsZT5pbmRleC5qc3A8L3dlbGNvbWUtZmlsZT4KLSAgICAgICAgPHdlbGNvbWUtZmlsZT5pbmRleC5odG1sPC93ZWxjb21lLWZpbGU+Ci0gICAgPC93ZWxjb21lLWZpbGUtbGlzdD4KLQotPC93ZWItYXBwPgpkaWZmIC0tZ2l0IGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtaGVsbG93b3JsZC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zcmMvbWFpbi93ZWJhcHAvaGVsbG9Xb3JsZC5qc3AgYi9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1oZWxsb3dvcmxkL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL3dlYmFwcC9oZWxsb1dvcmxkLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjYwOGZkZC4uMDAwMDAwMAotLS0gYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1oZWxsb3dvcmxkL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL3dlYmFwcC9oZWxsb1dvcmxkLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLTwlLS0KLSAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gICAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gICAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gICAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICAgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICAgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICAgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgICB1bmRlciB0aGUgTGljZW5zZS4KLS0tJT4KLQotPCVAIHRhZ2xpYiB1cmk9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2h0bWwiIHByZWZpeD0iaCIgJT4KLTwlQCB0YWdsaWIgdXJpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9jb3JlIiBwcmVmaXg9ImYiJT4KLTxodG1sPgotICAgIDxoZWFkPgotICAgICAgICA8dGl0bGU+SGVsbG8gV29ybGQ8L3RpdGxlPgotICAgIDwvaGVhZD4KLSAgICA8Ym9keT4KLSAgICAgICAgPGY6dmlldz4KLSAgICAgICAgICAgIDxoOmZvcm0gaWQ9Im1haW5Gb3JtIj4KLSAgICAgICAgICAgICAgPGg6cGFuZWxHcmlkIGNvbHVtbnM9IjIiPgotICAgICAgICAgICAgICAgIDxoOm91dHB1dExhYmVsIGZvcj0ibmFtZSIgdmFsdWU9IlBsZWFzZSBlbnRlciB5b3VyIG5hbWUiIC8+Ci0gICAgICAgICAgICAgICAgPGg6aW5wdXRUZXh0IGlkPSJuYW1lIiB2YWx1ZT0iI3toZWxsb1dvcmxkLm5hbWV9IiByZXF1aXJlZD0idHJ1ZSIvPgotICAgICAgICAgICAgICAgIDxoOmNvbW1hbmRCdXR0b24gdmFsdWU9IlByZXNzIG1lIiBhY3Rpb249IiN7aGVsbG9Xb3JsZC5zZW5kfSIvPgotICAgICAgICAgICAgICAgIDxoOm1lc3NhZ2VzIHNob3dEZXRhaWw9InRydWUiIHNob3dTdW1tYXJ5PSJmYWxzZSIvPgotICAgICAgICAgICAgICA8L2g6cGFuZWxHcmlkPgotICAgICAgICAgICAgPC9oOmZvcm0+Ci0gICAgICAgIDwvZjp2aWV3PgotICAgIDwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWhlbGxvd29ybGQvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc3JjL21haW4vd2ViYXBwL2luZGV4LmpzcCBiL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWhlbGxvd29ybGQvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc3JjL21haW4vd2ViYXBwL2luZGV4LmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmFhY2E1NS4uMDAwMDAwMAotLS0gYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1oZWxsb3dvcmxkL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL3dlYmFwcC9pbmRleC5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08JS0tCi0gICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICAgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICAgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gICAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICAgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gICAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gICAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gICAgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLSU+Ci08JUAgcGFnZSBzZXNzaW9uPSJmYWxzZSIlPgotPCUKLXJlc3BvbnNlLnNlbmRSZWRpcmVjdCgiaGVsbG9Xb3JsZC5qc2YiKTsKLSU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtaGVsbG93b3JsZC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zcmMvbWFpbi93ZWJhcHAvcGFnZTIuanNwIGIvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtaGVsbG93b3JsZC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zcmMvbWFpbi93ZWJhcHAvcGFnZTIuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZjM2MzM3Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWhlbGxvd29ybGQvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc3JjL21haW4vd2ViYXBwL3BhZ2UyLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLTwlLS0KLSAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gICAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gICAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gICAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICAgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICAgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICAgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgICB1bmRlciB0aGUgTGljZW5zZS4KLS0tJT4KLQotPCVAIHRhZ2xpYiB1cmk9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2h0bWwiIHByZWZpeD0iaCIgJT4KLTwlQCB0YWdsaWIgdXJpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9jb3JlIiBwcmVmaXg9ImYiJT4KLTxodG1sPgotICAgIDxoZWFkPgotICAgICAgICA8dGl0bGU+SGVsbG8gV29ybGQ8L3RpdGxlPgotICAgIDwvaGVhZD4KLSAgICA8Ym9keT4KLSAgICAgICAgPGY6dmlldz4KLSAgICAgICAgICAgIDxoOmZvcm0gaWQ9Im1haW5Gb3JtIj4KLSAgICAgICAgICAgICAgICA8aDI+PGg6b3V0cHV0VGV4dCB2YWx1ZT0iSGVsbG8gI3toZWxsb1dvcmxkLm5hbWV9LiBXZSBob3BlIHlvdSBlbmpveSBBcGFjaGUgTXlGYWNlcyIvPjwvaDI+Ci0gICAgICAgICAgICAgICAgPGg6Y29tbWFuZExpbmsgYWN0aW9uPSJiYWNrIj4KLSAgICAgICAgICAgICAgICAgICAgPGg6b3V0cHV0VGV4dCB2YWx1ZT0iSG9tZSIvPgotICAgICAgICAgICAgICAgIDwvaDpjb21tYW5kTGluaz4KLSAgICAgICAgICAgIDwvaDpmb3JtPgotICAgICAgICA8L2Y6dmlldz4KLSAgICA8L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1oZWxsb3dvcmxkL3NyYy9zaXRlL2FwdC9pbmRleC5hcHQgYi9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1oZWxsb3dvcmxkL3NyYy9zaXRlL2FwdC9pbmRleC5hcHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0ZjUwOGIuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtaGVsbG93b3JsZC9zcmMvc2l0ZS9hcHQvaW5kZXguYXB0CisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotIC0tLS0tLQ0KLSBNeWZhY2VzIEhlbGxvV29ybGQgQXJjaGV0eXBlDQotIC0tLS0tLQ0KLQ0KLU92ZXJ2aWV3DQotDQotICBUaGlzIHByb2plY3QgZGVmaW5lcyBhIE1hdmVuIGFyY2hldHlwZS4gUnVubmluZyB0aGUgYXJjaGV0eXBlIHBsdWdpbiB3aXRoIHRoaXMgYXJjaGV0eXBlIHdpbGwNCi0gIGNyZWF0ZSBhIGRpcmVjdG9yeSB0cmVlIGNvbnRhaW5pbmcgdGhlIGZpbGVzIG5lZWRlZCB0byBxdWlja2x5IGdldCBzdGFydGVkIG9uIGEgbmV3IEpTRiAxLjINCi0gIHByb2plY3Qgd2hpY2ggdXNlcyBKU1AgYXMgdGhlIHRlbXBsYXRpbmcgbGFuZ3VhZ2UuDQotDQotVXNhZ2UNCi0NCi0gIFVzZSB0aGUgZm9sbG93aW5nIG1hdmVuIGNvbW1hbmQgYW5kIHRoZW4gc2VsZWN0IG15ZmFjZXMtYXJjaGV0eXBlLWhlbGxvd29ybGQgZnJvbSB0aGUgb3B0aW9ucy4NCi0NCi0NCi0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKw0KLW12biBhcmNoZXR5cGU6Z2VuZXJhdGUgLURhcmNoZXR5cGVDYXRhbG9nPWh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcNCi0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKw0KZGlmZiAtLWdpdCBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWhlbGxvd29ybGQyMC1vd2IvcG9tLnhtbCBiL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWhlbGxvd29ybGQyMC1vd2IvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWZiNzUxOC4uMDAwMDAwMAotLS0gYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1oZWxsb3dvcmxkMjAtb3diL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICAgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gICAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICAgIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICAgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gICAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gICAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gICAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICAgIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLQotICAgIDxwYXJlbnQ+Ci0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzPC9ncm91cElkPgotICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWFyY2hldHlwZS1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDx2ZXJzaW9uPjEuMC40LVNOQVBTSE9UPC92ZXJzaW9uPgotICAgIDwvcGFyZW50PgotCi0gICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzPC9ncm91cElkPgotICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtYXJjaGV0eXBlLWhlbGxvd29ybGQyMC1vd2I8L2FydGlmYWN0SWQ+Ci0gICAgPHBhY2thZ2luZz5qYXI8L3BhY2thZ2luZz4KLSAgICA8bmFtZT5NeUZhY2VzIDIuMCBhbmQgT1dCIEJhc2ljIEFyY2hldHlwZTwvbmFtZT4KLSAgICA8ZGVzY3JpcHRpb24+QXJjaGV0eXBlIHRvIGNyZWF0ZSBhIG5ldyB3ZWJhcHAgYmFzZWQgb24gTXlGYWNlcyAyLjAgd2l0aCBPcGVuV2ViQmVhbnM8L2Rlc2NyaXB0aW9uPgotCi08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1oZWxsb3dvcmxkMjAtb3diL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9MSUNFTlNFLnR4dCBiL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWhlbGxvd29ybGQyMC1vd2Ivc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL0xJQ0VOU0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjQ1Njk1Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWhlbGxvd29ybGQyMC1vd2Ivc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL0xJQ0VOU0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMjAyICswLDAgQEAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKLSAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8KLQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCi0KLSAgIDEuIERlZmluaXRpb25zLgotCi0gICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLAotICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuCi0KLSAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5Ci0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuCi0KLSAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwKLSAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24KLSAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCi0gICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUKLSAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yCi0gICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKLSAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuCi0KLSAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKLSAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuCi0KLSAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAotICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbgotICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4KLQotICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwKLSAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQKLSAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKLSAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4KLQotICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKLSAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGEKLSAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yawotICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KLQotICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdAotICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQotICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucwotICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMKLSAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgotICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLAotICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4KLQotICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcKLSAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMKLSAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQotICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcgotICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIKLSAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQKLSAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvCi0gICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAotICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUKLSAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dAotICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKLSAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIgotCi0gICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kCi0gICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4KLQotICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsCi0gICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUKLSAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCi0KLSAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKLSAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLAotICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCi0gICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQotICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXIKLSAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKLSAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91Ci0gICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQotICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yawotICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QKLSAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMKLSAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQotICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLgotCi0gICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQotICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0Ci0gICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQotICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0KLSAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yCi0gICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKLQotICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcwotICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAotCi0gICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MKLSAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCi0gICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywKLSAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mCi0gICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAotCi0gICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMKLSAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0Ci0gICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkCi0gICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90Ci0gICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCi0gICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQKLSAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yCi0gICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCi0gICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZAotICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cwotICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKLSAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbgotICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlCi0gICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCi0gICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkCi0gICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLgotCi0gICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQKLSAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMKLSAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKLSAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLAotICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoCi0gICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgotCi0gICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsCi0gICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKLSAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4KLSAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKLSAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkCi0gICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuCi0KLSAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUKLSAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwKLSAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQotICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuCi0KLSAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgotICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaAotICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zCi0gICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBCi0gICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKLSAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQotICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLgotCi0gICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwKLSAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLAotICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKLSAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlCi0gICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsCi0gICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKLSAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUKLSAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwKLSAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCi0gICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yCi0gICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCi0KLSAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcKLSAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsCi0gICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAotICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMKLSAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5Ci0gICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgotICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LAotICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5Ci0gICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCi0gICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4KLQotICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCi0KLSAgIEFQUEVORElYOiBIb3cgdG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yay4KLQotICAgICAgVG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yaywgYXR0YWNoIHRoZSBmb2xsb3dpbmcKLSAgICAgIGJvaWxlcnBsYXRlIG5vdGljZSwgd2l0aCB0aGUgZmllbGRzIGVuY2xvc2VkIGJ5IGJyYWNrZXRzICJbXSIKLSAgICAgIHJlcGxhY2VkIHdpdGggeW91ciBvd24gaWRlbnRpZnlpbmcgaW5mb3JtYXRpb24uIChEb24ndCBpbmNsdWRlCi0gICAgICB0aGUgYnJhY2tldHMhKSAgVGhlIHRleHQgc2hvdWxkIGJlIGVuY2xvc2VkIGluIHRoZSBhcHByb3ByaWF0ZQotICAgICAgY29tbWVudCBzeW50YXggZm9yIHRoZSBmaWxlIGZvcm1hdC4gV2UgYWxzbyByZWNvbW1lbmQgdGhhdCBhCi0gICAgICBmaWxlIG9yIGNsYXNzIG5hbWUgYW5kIGRlc2NyaXB0aW9uIG9mIHB1cnBvc2UgYmUgaW5jbHVkZWQgb24gdGhlCi0gICAgICBzYW1lICJwcmludGVkIHBhZ2UiIGFzIHRoZSBjb3B5cmlnaHQgbm90aWNlIGZvciBlYXNpZXIKLSAgICAgIGlkZW50aWZpY2F0aW9uIHdpdGhpbiB0aGlyZC1wYXJ0eSBhcmNoaXZlcy4KLQotICAgQ29weXJpZ2h0IFt5eXl5XSBbbmFtZSBvZiBjb3B5cmlnaHQgb3duZXJdCi0KLSAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCmRpZmYgLS1naXQgYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1oZWxsb3dvcmxkMjAtb3diL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9OT1RJQ0UudHh0IGIvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtaGVsbG93b3JsZDIwLW93Yi9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvTk9USUNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmEzZGJkNi4uMDAwMDAwMAotLS0gYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1oZWxsb3dvcmxkMjAtb3diL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9OT1RJQ0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotPT0gIE5PVElDRSBmaWxlIGNvcnJlc3BvbmRpbmcgdG8gc2VjdGlvbiA0KGQpIG9mIHRoZSBBcGFjaGUgTGljZW5zZSwgICA9PQotPT0gIFZlcnNpb24gMi4wLCBpbiB0aGlzIGNhc2UgZm9yIHRoZSBBcGFjaGUgTXlGYWNlcyBNYXZlbiBQbHVnaW5zICAgICA9PQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1UaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IAotVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4KLQotUG9ydGlvbnMgb2YgdGhpcyBzb2Z0d2FyZSB3ZXJlIG9yaWdpbmFsbHkgYmFzZWQgb24gdGhlIGZvbGxvd2luZzoKLQotIC0gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDYsIE9yYWNsZSBDb3JwLCA8aHR0cDovL3d3dy5vcmFjbGUuY29tLz4uCi1hbmQgYXJlIGxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiB1bmRlciB0aGUgCi0iU29mdHdhcmUgR3JhbnQgYW5kIENvcnBvcmF0ZSBDb250cmlidXRpb24gTGljZW5zZSBBZ3JlZW1lbnQiCi0KLVNlZSB0aGUgTElDRU5TRS50eHQgZmlsZSBmb3IgaW5mb3JtYXRpb24gb24gYWxsIGxpY2Vuc2VzIAotYXNzb2NpYXRlZCB3aXRoIHRoaXMgc29mdHdhcmUuCmRpZmYgLS1naXQgYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1oZWxsb3dvcmxkMjAtb3diL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9tYXZlbi9hcmNoZXR5cGUtbWV0YWRhdGEueG1sIGIvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtaGVsbG93b3JsZDIwLW93Yi9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvbWF2ZW4vYXJjaGV0eXBlLW1ldGFkYXRhLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTczZmU3Mi4uMDAwMDAwMAotLS0gYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1oZWxsb3dvcmxkMjAtb3diL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9tYXZlbi9hcmNoZXR5cGUtbWV0YWRhdGEueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLSAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gICAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gICAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gICAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICAgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICAgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICAgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgICB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPGFyY2hldHlwZS1kZXNjcmlwdG9yIHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9wbHVnaW5zL21hdmVuLWFyY2hldHlwZS1wbHVnaW4vYXJjaGV0eXBlLWRlc2NyaXB0b3IvMS4wLjAiCi0gICAgICAgICAgICAgICAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICAgICAgICAgICAgICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3BsdWdpbnMvbWF2ZW4tYXJjaGV0eXBlLXBsdWdpbi9hcmNoZXR5cGUtZGVzY3JpcHRvci8xLjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvYXJjaGV0eXBlLWRlc2NyaXB0b3ItMS4wLjAueHNkIgotCi0gICAgICAgICAgICAgICAgICAgICAgbmFtZT0ibXlmYWNlcy1hcmNoZXR5cGUtaGVsbG93b3JsZDIwLW93YiIgcGFydGlhbD0iZmFsc2UiPgotCi0gIDxyZXF1aXJlZFByb3BlcnRpZXMvPgotCi0gIDxmaWxlU2V0cz4KLSAgICAgIDxmaWxlU2V0IGZpbHRlcmVkPSJ0cnVlIiBwYWNrYWdlZD0idHJ1ZSI+Ci0gICAgICAgICAgPGRpcmVjdG9yeT5zcmMvbWFpbi9qYXZhLzwvZGlyZWN0b3J5PgotICAgICAgPC9maWxlU2V0PgotICAgICAgPGZpbGVTZXQgZmlsdGVyZWQ9ImZhbHNlIiBwYWNrYWdlZD0iZmFsc2UiPgotICAgICAgICAgIDxkaXJlY3Rvcnk+c3JjL21haW4vd2ViYXBwLzwvZGlyZWN0b3J5PgotICAgICAgPC9maWxlU2V0PgotICAgICAgPGZpbGVTZXQgZmlsdGVyZWQ9ImZhbHNlIiBwYWNrYWdlZD0iZmFsc2UiPgotICAgICAgICAgIDxkaXJlY3Rvcnk+c3JjL21haW4vcmVzb3VyY2VzLzwvZGlyZWN0b3J5PgotICAgICAgPC9maWxlU2V0PgotICA8L2ZpbGVTZXRzPgotCi0gIDxtb2R1bGVzLz4KLQotPC9hcmNoZXR5cGUtZGVzY3JpcHRvcj4KZGlmZiAtLWdpdCBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWhlbGxvd29ybGQyMC1vd2Ivc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvcG9tLnhtbCBiL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWhlbGxvd29ybGQyMC1vd2Ivc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDA5YzVlZS4uMDAwMDAwMAotLS0gYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1oZWxsb3dvcmxkMjAtb3diL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMTYgKzAsMCBAQAotI3NldCggJHN5bWJvbF9wb3VuZCA9ICcjJyApCi0jc2V0KCAkc3ltYm9sX2RvbGxhciA9ICckJyApCi0jc2V0KCAkc3ltYm9sX2VzY2FwZSA9ICdcJyApCi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIKLSAgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0gICAgPGdyb3VwSWQ+JHtncm91cElkfTwvZ3JvdXBJZD4KLSAgICA8YXJ0aWZhY3RJZD4ke2FydGlmYWN0SWR9PC9hcnRpZmFjdElkPgotICAgIDxwYWNrYWdpbmc+d2FyPC9wYWNrYWdpbmc+Ci0gICAgPHZlcnNpb24+JHt2ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICA8bmFtZT5BIGN1c3RvbSBwcm9qZWN0IHVzaW5nIE15RmFjZXMgMi4wIGFuZCBPcGVuV2ViQmVhbnM8L25hbWU+Ci0gICAgPHVybD5odHRwOi8vd3d3Lm15b3JnYW5pemF0aW9uLm9yZzwvdXJsPgotCi0gICAgPHByb3BlcnRpZXM+Ci0gICAgICAgIDxqc2YtbXlmYWNlcy52ZXJzaW9uPjIuMC41PC9qc2YtbXlmYWNlcy52ZXJzaW9uPgotICAgICAgICA8anNmLW1vamFycmEudmVyc2lvbj4yLjAuNS1iMDI8L2pzZi1tb2phcnJhLnZlcnNpb24+Ci0gICAgICAgIDxvcGVud2ViYmVhbnMudmVyc2lvbj4xLjEuMDwvb3BlbndlYmJlYW5zLnZlcnNpb24+Ci0gICAgICAgIDxtYXZlbi5qZXR0eS5wbHVnaW4udmVyc2lvbj42LjEuMjI8L21hdmVuLmpldHR5LnBsdWdpbi52ZXJzaW9uPgotICAgIDwvcHJvcGVydGllcz4KLQotICAgIDxidWlsZD4KLSAgICAgICAgPGZpbmFsTmFtZT4ke2FydGlmYWN0SWR9PC9maW5hbE5hbWU+Ci0gICAgICAgIDxwbHVnaW5zPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY29tcGlsZXItcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8c291cmNlPjEuNTwvc291cmNlPgotICAgICAgICAgICAgICAgICAgICA8dGFyZ2V0PjEuNTwvdGFyZ2V0PgotICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICA8L3BsdWdpbnM+Ci0gICAgPC9idWlsZD4KLSAgICAKLSAgICA8cHJvZmlsZXM+Ci0gICAgICAgIDxwcm9maWxlPgotICAgICAgICAgICAgPGlkPm15ZmFjZXM8L2lkPgotICAgICAgICAgICAgPGFjdGl2YXRpb24+Ci0gICAgICAgICAgICAgICAgPHByb3BlcnR5PgotICAgICAgICAgICAgICAgICAgICA8bmFtZT4hanNmPC9uYW1lPgotICAgICAgICAgICAgICAgIDwvcHJvcGVydHk+Ci0gICAgICAgICAgICA8L2FjdGl2YXRpb24+Ci0gICAgICAgICAgICA8ZGVwZW5kZW5jaWVzPgotICAgICAgICAgICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuY29yZTwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1hcGk8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7c3ltYm9sX2RvbGxhcn17anNmLW15ZmFjZXMudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4KLSAgICAgICAgICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgICAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5jb3JlPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWltcGw8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7c3ltYm9sX2RvbGxhcn17anNmLW15ZmFjZXMudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxzY29wZT5ydW50aW1lPC9zY29wZT4KLSAgICAgICAgICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8L2RlcGVuZGVuY2llcz4KLSAgICAgICAgPC9wcm9maWxlPgotICAgICAgICAKLSAgICAgICAgPHByb2ZpbGU+Ci0gICAgICAgICAgICA8IS0tIEFjdGl2YXRlIGJ5IGFkZGluZyAtRGpzZj1tb2phcnJhIC0tPgotICAgICAgICAgICAgPGlkPm1vamFycmE8L2lkPgotICAgICAgICAgICAgPGFjdGl2YXRpb24+Ci0gICAgICAgICAgICAgICAgPHByb3BlcnR5PgotICAgICAgICAgICAgICAgICAgICA8bmFtZT5qc2Y8L25hbWU+Ci0gICAgICAgICAgICAgICAgICAgIDx2YWx1ZT5tb2phcnJhPC92YWx1ZT4KLSAgICAgICAgICAgICAgICA8L3Byb3BlcnR5PgotICAgICAgICAgICAgPC9hY3RpdmF0aW9uPgotICAgICAgICAgICAgPGRlcGVuZGVuY2llcz4KLSAgICAgICAgICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+Y29tLnN1bi5mYWNlczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+anNmLWFwaTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtzeW1ib2xfZG9sbGFyfXtqc2YtbW9qYXJyYS52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgotICAgICAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+Y29tLnN1bi5mYWNlczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+anNmLWltcGw8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7c3ltYm9sX2RvbGxhcn17anNmLW1vamFycmEudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxzY29wZT5ydW50aW1lPC9zY29wZT4KLSAgICAgICAgICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8L2RlcGVuZGVuY2llcz4KLSAgICAgICAgICAgIDxyZXBvc2l0b3JpZXM+Ci0gICAgICAgICAgICAgICAgPHJlcG9zaXRvcnk+Ci0gICAgICAgICAgICAgICAgICAgIDxpZD5qYXZhLm5ldDwvaWQ+Ci0gICAgICAgICAgICAgICAgICAgIDx1cmw+aHR0cDovL2Rvd25sb2FkLmphdmEubmV0L21hdmVuLzI8L3VybD4KLSAgICAgICAgICAgICAgICA8L3JlcG9zaXRvcnk+Ci0gICAgICAgICAgICA8L3JlcG9zaXRvcmllcz4KLSAgICAgICAgPC9wcm9maWxlPgotICAgICAgICAKLSAgICAgICAgPHByb2ZpbGU+Ci0gICAgICAgICAgICA8IS0tIFVzZSBtdm4gY2xlYW4gamV0dHk6cnVuLWV4cGxvZGVkIC1QamV0dHlDb25maWcgdG8gcnVuIHdpdGggamV0dHkgLS0+Ci0gICAgICAgICAgICA8aWQ+amV0dHlDb25maWc8L2lkPgotICAgICAgICAgICAgPGJ1aWxkPgotICAgICAgICAgICAgICAgIDxwbHVnaW5zPgotICAgICAgICAgICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgICAgICAgICAgPCEtLVRoaXMgcGx1Z2luIGFsbG93cyB0byBydW4gdGhlIHdhciB1c2luZyBtdm4gamV0dHk6cnVuIC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLm1vcnRiYXkuamV0dHk8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1qZXR0eS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3N5bWJvbF9kb2xsYXJ9e21hdmVuLmpldHR5LnBsdWdpbi52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzY2FuSW50ZXJ2YWxTZWNvbmRzPjEwPC9zY2FuSW50ZXJ2YWxTZWNvbmRzPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgICAgICAgICA8L3BsdWdpbnM+Ci0gICAgICAgICAgICA8L2J1aWxkPgotICAgICAgICA8L3Byb2ZpbGU+Ci0gICAgPC9wcm9maWxlcz4KLQotICAgIDwhLS0gUHJvamVjdCBkZXBlbmRlbmNpZXMgLS0+Ci0gICAgPGRlcGVuZGVuY2llcz4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm9wZW53ZWJiZWFuczwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm9wZW53ZWJiZWFucy1pbXBsPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHtzeW1ib2xfZG9sbGFyfXtvcGVud2ViYmVhbnMudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+cnVudGltZTwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLQotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUub3BlbndlYmJlYW5zPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+b3BlbndlYmJlYW5zLWpzZjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7c3ltYm9sX2RvbGxhcn17b3BlbndlYmJlYW5zLnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPnJ1bnRpbWU8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm9wZW53ZWJiZWFuczwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm9wZW53ZWJiZWFucy13ZWI8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke3N5bWJvbF9kb2xsYXJ9e29wZW53ZWJiZWFucy52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxzY29wZT5ydW50aW1lPC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotCi0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5vcGVud2ViYmVhbnM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5vcGVud2ViYmVhbnMtc3BpPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHtzeW1ib2xfZG9sbGFyfXtvcGVud2ViYmVhbnMudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+cnVudGltZTwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLQotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUub3BlbndlYmJlYW5zPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+b3BlbndlYmJlYW5zLXJlc291cmNlPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHtzeW1ib2xfZG9sbGFyfXtvcGVud2ViYmVhbnMudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+cnVudGltZTwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLQotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZ2Vyb25pbW8uc3BlY3M8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5nZXJvbmltby1qdGFfMS4xX3NwZWM8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4xLjEuMTwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotCi0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5nZXJvbmltby5zcGVjczwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmdlcm9uaW1vLWludGVyY2VwdG9yXzEuMV9zcGVjPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+MS4wPC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmdlcm9uaW1vLnNwZWNzPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+Z2Vyb25pbW8tYXRpbmplY3RfMS4wX3NwZWM8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4xLjA8L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLQotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZ2Vyb25pbW8uc3BlY3M8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5nZXJvbmltby1qY2RpXzEuMF9zcGVjPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+MS4wPC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmdlcm9uaW1vLnNwZWNzPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+Z2Vyb25pbW8tc2VydmxldF8yLjVfc3BlYzwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuMjwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLQotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZ2Vyb25pbW8uc3BlY3M8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5nZXJvbmltby1lbF8xLjBfc3BlYzwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuMC4yPC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICAKLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5qdW5pdDwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmp1bml0PC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+NC44LjE8L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICA8L2RlcGVuZGVuY2llcz4KLQotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtaGVsbG93b3JsZDIwLW93Yi9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zcmMvbWFpbi9qYXZhL0dyZWV0aW5nU2VydmljZS5qYXZhIGIvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtaGVsbG93b3JsZDIwLW93Yi9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zcmMvbWFpbi9qYXZhL0dyZWV0aW5nU2VydmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDAyNzU5Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWhlbGxvd29ybGQyMC1vd2Ivc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc3JjL21haW4vamF2YS9HcmVldGluZ1NlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLSNzZXQoICRzeW1ib2xfcG91bmQgPSAnIycgKQotI3NldCggJHN5bWJvbF9kb2xsYXIgPSAnJCcgKQotI3NldCggJHN5bWJvbF9lc2NhcGUgPSAnXCcgKQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0qLwotcGFja2FnZSAke3BhY2thZ2V9OwotCi1pbXBvcnQgamF2YXguaW5qZWN0Lk5hbWVkOwotaW1wb3J0IGphdmF4LmVudGVycHJpc2UuY29udGV4dC5BcHBsaWNhdGlvblNjb3BlZDsKLQotQE5hbWVkCi1AQXBwbGljYXRpb25TY29wZWQKLXB1YmxpYyBjbGFzcyBHcmVldGluZ1NlcnZpY2UKLXsKLSAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZUdyZWV0aW5nKFN0cmluZyBuYW1lKQotICAgIHsKLSAgICAgICAgcmV0dXJuICJIZWxsbyAiICsgbmFtZSArICIuIFdlIGhvcGUgeW91IGVuam95IEFwYWNoZSBNeUZhY2VzISI7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1oZWxsb3dvcmxkMjAtb3diL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL2phdmEvSGVsbG9Xb3JsZENvbnRyb2xsZXIuamF2YSBiL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWhlbGxvd29ybGQyMC1vd2Ivc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc3JjL21haW4vamF2YS9IZWxsb1dvcmxkQ29udHJvbGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNmQyZGE2Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWhlbGxvd29ybGQyMC1vd2Ivc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc3JjL21haW4vamF2YS9IZWxsb1dvcmxkQ29udHJvbGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotI3NldCggJHN5bWJvbF9wb3VuZCA9ICcjJyApCi0jc2V0KCAkc3ltYm9sX2RvbGxhciA9ICckJyApCi0jc2V0KCAkc3ltYm9sX2VzY2FwZSA9ICdcJyApCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSovCi1wYWNrYWdlICR7cGFja2FnZX07Ci0KLWltcG9ydCBqYXZheC5pbmplY3QuTmFtZWQ7Ci1pbXBvcnQgamF2YXguaW5qZWN0LkluamVjdDsKLWltcG9ydCBqYXZheC5lbnRlcnByaXNlLmNvbnRleHQuUmVxdWVzdFNjb3BlZDsKLQotLyoqCi0gKiBBIHR5cGljYWwgc2ltcGxlIGJhY2tpbmcgYmVhbiwgdGhhdCBpcyBiYWNrZWQgdG8gPGNvZGU+aGVsbG9Xb3JsZC54aHRtbDwvY29kZT4KLSAqLwotQE5hbWVkKCJoZWxsb1dvcmxkIikKLUBSZXF1ZXN0U2NvcGVkCi1wdWJsaWMgY2xhc3MgSGVsbG9Xb3JsZENvbnRyb2xsZXIKLXsKLQotICAgIC8vcHJvcGVydGllcwotICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7Ci0gICAgQEluamVjdCBwcml2YXRlIEdyZWV0aW5nU2VydmljZSBncmVldGluZ1NlcnZpY2U7Ci0KLSAgICAvKioKLSAgICAgKiBkZWZhdWx0IGVtcHR5IGNvbnN0cnVjdG9yCi0gICAgICovCi0gICAgcHVibGljIEhlbGxvV29ybGRDb250cm9sbGVyKCkKLSAgICB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTWV0aG9kIHRoYXQgaXMgYmFja2VkIHRvIGEgc3VibWl0IGJ1dHRvbiBvZiBhIGZvcm0uCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBzZW5kKCkKLSAgICB7Ci0gICAgICAgIC8vZG8gcmVhbCBsb2dpYywgcmV0dXJuIGEgc3RyaW5nIHdoaWNoIHdpbGwgYmUgdXNlZCBmb3IgdGhlIG5hdmlnYXRpb24gc3lzdGVtIG9mIEpTRgotICAgICAgICByZXR1cm4gInBhZ2UyLnhodG1sIjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEdyZWV0aW5nKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBncmVldGluZ1NlcnZpY2UuY3JlYXRlR3JlZXRpbmcobmFtZSk7Ci0gICAgfQotCQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLWdldHRlciAmIHNldHRlcgotCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBuYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpCi0gICAgewotICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtaGVsbG93b3JsZDIwLW93Yi9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvYmVhbnMueG1sIGIvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtaGVsbG93b3JsZDIwLW93Yi9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvYmVhbnMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMWVlMDJhLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWhlbGxvd29ybGQyMC1vd2Ivc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL2JlYW5zLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPGJlYW5zLz4KLQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtaGVsbG93b3JsZDIwLW93Yi9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9mYWNlcy1jb25maWcueG1sIGIvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtaGVsbG93b3JsZDIwLW93Yi9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9mYWNlcy1jb25maWcueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjM2OWM3Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWhlbGxvd29ybGQyMC1vd2Ivc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvZmFjZXMtY29uZmlnLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCEtLQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPGZhY2VzLWNvbmZpZyB2ZXJzaW9uPSIyLjAiIAotICAgIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiCi0gICAgeG1sbnM6eGk9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWEluY2x1ZGUiCi0gICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgCi0gICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL3dlYi1mYWNlc2NvbmZpZ18yXzAueHNkIj4KLQkKLTwvZmFjZXMtY29uZmlnPgotICAgICAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1oZWxsb3dvcmxkMjAtb3diL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwgYi9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1oZWxsb3dvcmxkMjAtb3diL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0NmExMjUuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtaGVsbG93b3JsZDIwLW93Yi9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTM5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCEtLQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPHdlYi1hcHAgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIKLSAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL3dlYi1hcHBfMl81LnhzZCIKLSAgICAgICAgdmVyc2lvbj0iMi41Ij4KLQotICAgIDxkZXNjcmlwdGlvbj5NeVByb2plY3Qgd2ViLnhtbDwvZGVzY3JpcHRpb24+Ci0KLSAgICA8IS0tIEpTRiBzdGFuZGFyZCBwYXJhbWV0ZXJzIC0tPgotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+UHJvamVjdCBzdGFnZSBmb3IgdGhlIGFwcGxpY2F0aW9uIChuZXcgaW4gMi4wKS4gRXhwZWN0cyBvbmUgb2YKLSAgICAgICAgICAgIHRoZSBmb2xsb3dpbmcgdmFsdWVzOiBEZXZlbG9wbWVudCwgUHJvZHVjdGlvbiwgU3lzdGVtVGVzdCwgVW5pdFRlc3QKLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+amF2YXguZmFjZXMuUFJPSkVDVF9TVEFHRTwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPkRldmVsb3BtZW50PC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIElmIHRoaXMgcGFyYW1ldGVyIGlzIHNldCB0byB0cnVlIGFuZCB0aGUgc3VibWl0dGVkIHZhbHVlIG9mIGEgY29tcG9uZW50IGlzCi0gICAgICAgICAgICB0aGUgZW1wdHkgc3RyaW5nLCB0aGUgc3VibWl0dGVkIHZhbHVlIHdpbGwgYmUgc2V0IHRvIG51bGwKLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+amF2YXguZmFjZXMuSU5URVJQUkVUX0VNUFRZX1NUUklOR19TVUJNSVRURURfVkFMVUVTX0FTX05VTEw8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT50cnVlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5TdGF0ZSBzYXZpbmcgbWV0aG9kOiAiY2xpZW50IiBvciAic2VydmVyIiAoPSBkZWZhdWx0KQotICAgICAgICAgICAgU2VlIEpTRiBTcGVjaWZpY2F0aW9uIDIuNS4zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+amF2YXguZmFjZXMuU1RBVEVfU0FWSU5HX01FVEhPRDwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPmNsaWVudDwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotCi0gICAgPCEtLSBNeUZhY2VzIHNwZWNpZmljIHBhcmFtZXRlcnMgLS0+Ci0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5Pbmx5IGFwcGxpY2FibGUgaWYgc3RhdGUgc2F2aW5nIG1ldGhvZCBpcyAic2VydmVyIiAoPSBkZWZhdWx0KS4KLSAgICAgICAgICAgIERlZmluZXMgdGhlIGFtb3VudCAoZGVmYXVsdCA9IDIwKSBvZiB0aGUgbGF0ZXN0IHZpZXdzIGFyZSBzdG9yZWQgaW4gc2Vzc2lvbi48L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuTlVNQkVSX09GX1ZJRVdTX0lOX1NFU1NJT048L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT4yMDwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+T25seSBhcHBsaWNhYmxlIGlmIHN0YXRlIHNhdmluZyBtZXRob2QgaXMgInNlcnZlciIgKD0gZGVmYXVsdCkuCi0gICAgICAgICAgICBJZiB0cnVlIChkZWZhdWx0KSB0aGUgc3RhdGUgd2lsbCBiZSBzZXJpYWxpemVkIHRvIGEgYnl0ZSBzdHJlYW0gYmVmb3JlIGl0Ci0gICAgICAgICAgICBpcyB3cml0dGVuIHRvIHRoZSBzZXNzaW9uLgotICAgICAgICAgICAgSWYgZmFsc2UgdGhlIHN0YXRlIHdpbGwgbm90IGJlIHNlcmlhbGl6ZWQgdG8gYSBieXRlIHN0cmVhbS48L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuU0VSSUFMSVpFX1NUQVRFX0lOX1NFU1NJT048L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT50cnVlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5Pbmx5IGFwcGxpY2FibGUgaWYgc3RhdGUgc2F2aW5nIG1ldGhvZCBpcyAic2VydmVyIiAoPSBkZWZhdWx0KSBhbmQgaWYKLSAgICAgICAgICAgIG9yZy5hcGFjaGUubXlmYWNlcy5TRVJJQUxJWkVfU1RBVEVfSU5fU0VTU0lPTiBpcyB0cnVlICg9IGRlZmF1bHQpCi0gICAgICAgICAgICBJZiB0cnVlIChkZWZhdWx0KSB0aGUgc2VyaWFsaXplZCBzdGF0ZSB3aWxsIGJlIGNvbXByZXNzZWQgYmVmb3JlIGl0Ci0gICAgICAgICAgICBpcyB3cml0dGVuIHRvIHRoZSBzZXNzaW9uLiBJZiBmYWxzZSB0aGUgc3RhdGUgd2lsbCBub3QgYmUgY29tcHJlc3NlZC48L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuQ09NUFJFU1NfU1RBVEVfSU5fU0VTU0lPTjwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPnRydWU8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPlRoaXMgcGFyYW1ldGVyIHRlbGxzIE15RmFjZXMgaWYgamF2YXNjcmlwdCBjb2RlIHNob3VsZCBiZSBhbGxvd2VkIGluIHRoZQotICAgICAgICAgICAgcmVuZGVyZWQgSFRNTCBvdXRwdXQuCi0gICAgICAgICAgICBJZiBqYXZhc2NyaXB0IGlzIGFsbG93ZWQsIGNvbW1hbmRfbGluayBhbmNob3JzIHdpbGwgaGF2ZSBqYXZhc2NyaXB0IGNvZGUKLSAgICAgICAgICAgIHRoYXQgc3VibWl0cyB0aGUgY29ycmVzcG9uZGluZyBmb3JtLgotICAgICAgICAgICAgSWYgamF2YXNjcmlwdCBpcyBub3QgYWxsb3dlZCwgdGhlIHN0YXRlIHNhdmluZyBpbmZvIGFuZCBuZXN0ZWQgcGFyYW1ldGVycwotICAgICAgICAgICAgd2lsbCBiZSBhZGRlZCBhcyB1cmwgcGFyYW1ldGVycy4KLSAgICAgICAgICAgIERlZmF1bHQ6ICJ0cnVlIjwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5BTExPV19KQVZBU0NSSVBUPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuREVURUNUX0pBVkFTQ1JJUFQ8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT5mYWxzZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+SWYgdHJ1ZSwgcmVuZGVyZWQgSFRNTCBjb2RlIHdpbGwgYmUgZm9ybWF0dGVkLCBzbyB0aGF0IGl0IGlzICJodW1hbiByZWFkYWJsZSIuCi0gICAgICAgICAgICBpLmUuIGFkZGl0aW9uYWwgbGluZSBzZXBhcmF0b3JzIGFuZCB3aGl0ZXNwYWNlIHdpbGwgYmUgd3JpdHRlbiwgdGhhdCBkbyBub3QKLSAgICAgICAgICAgIGluZmx1ZW5jZSB0aGUgSFRNTCBjb2RlLgotICAgICAgICAgICAgRGVmYXVsdDogInRydWUiPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLlBSRVRUWV9IVE1MPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+SWYgdHJ1ZSwgYSBqYXZhc2NyaXB0IGZ1bmN0aW9uIHdpbGwgYmUgcmVuZGVyZWQgdGhhdCBpcyBhYmxlIHRvIHJlc3RvcmUgdGhlCi0gICAgICAgICAgICBmb3JtZXIgdmVydGljYWwgc2Nyb2xsIG9uIGV2ZXJ5IHJlcXVlc3QuIENvbnZlbmllbnQgZmVhdHVyZSBpZiB5b3UgaGF2ZSBwYWdlcwotICAgICAgICAgICAgd2l0aCBsb25nIGxpc3RzIGFuZCB5b3UgZG8gbm90IHdhbnQgdGhlIGJyb3dzZXIgcGFnZSB0byBhbHdheXMganVtcCB0byB0aGUgdG9wCi0gICAgICAgICAgICBpZiB5b3UgdHJpZ2dlciBhIGxpbmsgb3IgYnV0dG9uIGFjdGlvbiB0aGF0IHN0YXlzIG9uIHRoZSBzYW1lIHBhZ2UuCi0gICAgICAgICAgICBEZWZhdWx0OiAiZmFsc2UiPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLkFVVE9fU0NST0xMPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+VXNlZCBmb3IgZW5jcnlwdGluZyB2aWV3IHN0YXRlLiBPbmx5IHJlbGV2YW50IGZvciBjbGllbnQgc2lkZQotICAgICAgICAgICAgc3RhdGUgc2F2aW5nLiBTZWUgTXlGYWNlcyB3aWtpL3dlYiBzaXRlIGRvY3VtZW50YXRpb24gZm9yIGluc3RydWN0aW9ucwotICAgICAgICAgICAgb24gaG93IHRvIGNvbmZpZ3VyZSBhbiBhcHBsaWNhdGlvbiBmb3IgZGlmZmVuZW50IGVuY3J5cHRpb24gc3RyZW5ndGhzLgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuU0VDUkVUPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+TnpZMU5ETXlNVEE9PC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0KLQk8IS0tIExpc3RlbmVyIGZvciBPcGVuV2ViQmVhbnMgY29uZmlndXJhdGlvbiAtLT4KLSAgICA8bGlzdGVuZXI+Ci0gICAgICAgIDxsaXN0ZW5lci1jbGFzcz4KLSAgICAgICAgICAgIG9yZy5hcGFjaGUud2ViYmVhbnMuc2VydmxldC5XZWJCZWFuc0NvbmZpZ3VyYXRpb25MaXN0ZW5lcgotICAgICAgICA8L2xpc3RlbmVyLWNsYXNzPgotICAgIDwvbGlzdGVuZXI+Ci0KLSAgICA8IS0tIEZhY2VzIFNlcnZsZXQgLS0+Ci0gICAgPHNlcnZsZXQ+Ci0gICAgICAgIDxzZXJ2bGV0LW5hbWU+RmFjZXMgU2VydmxldDwvc2VydmxldC1uYW1lPgotICAgICAgICA8c2VydmxldC1jbGFzcz5qYXZheC5mYWNlcy53ZWJhcHAuRmFjZXNTZXJ2bGV0PC9zZXJ2bGV0LWNsYXNzPgotICAgICAgICA8bG9hZC1vbi1zdGFydHVwPjE8L2xvYWQtb24tc3RhcnR1cD4KLSAgICA8L3NlcnZsZXQ+Ci0KLSAgICA8IS0tIEZhY2VzIFNlcnZsZXQgTWFwcGluZyAtLT4KLSAgICA8c2VydmxldC1tYXBwaW5nPgotICAgICAgICA8c2VydmxldC1uYW1lPkZhY2VzIFNlcnZsZXQ8L3NlcnZsZXQtbmFtZT4KLSAgICAgICAgPHVybC1wYXR0ZXJuPiouanNmPC91cmwtcGF0dGVybj4KLSAgICA8L3NlcnZsZXQtbWFwcGluZz4KLQotICAgIDwhLS0gV2VsY29tZSBmaWxlcyAtLT4KLSAgICA8d2VsY29tZS1maWxlLWxpc3Q+Ci0gICAgICAgIDx3ZWxjb21lLWZpbGU+aW5kZXguaHRtbDwvd2VsY29tZS1maWxlPgotICAgIDwvd2VsY29tZS1maWxlLWxpc3Q+Ci0KLTwvd2ViLWFwcD4KZGlmZiAtLWdpdCBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWhlbGxvd29ybGQyMC1vd2Ivc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc3JjL21haW4vd2ViYXBwL2hlbGxvV29ybGQueGh0bWwgYi9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1oZWxsb3dvcmxkMjAtb3diL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL3dlYmFwcC9oZWxsb1dvcmxkLnhodG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YmEyZjk1Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWhlbGxvd29ybGQyMC1vd2Ivc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc3JjL21haW4vd2ViYXBwL2hlbGxvV29ybGQueGh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICAgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gICAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICAgIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICAgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gICAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gICAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gICAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICAgIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIKLSAgICAgIHhtbG5zOmg9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2h0bWwiCi0gICAgICB4bWxuczpmPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9jb3JlIj4KLTxoOmhlYWQ+Ci0gICAgPHRpdGxlPkhlbGxvIFdvcmxkPC90aXRsZT4KLTwvaDpoZWFkPgotPGg6Ym9keT4KLSAgICA8aDpvdXRwdXRTdHlsZXNoZWV0IG5hbWU9InN0eWxlLmNzcyIgbGlicmFyeT0iY3NzIi8+Ci0gICAgPGRpdiBpZD0iY29udGFpbmVyIj4KLSAgICAgICAgPGgxPk15RmFjZXMgSGVsbG8gV29ybGQ8L2gxPgotICAgICAgICA8aDpmb3JtIGlkPSJtYWluRm9ybSI+Ci0gICAgICAgICAgICA8aDpwYW5lbEdyaWQgY29sdW1ucz0iMiI+Ci0gICAgICAgICAgICAgICAgPGg6b3V0cHV0TGFiZWwgZm9yPSJuYW1lIiB2YWx1ZT0iUGxlYXNlIGVudGVyIHlvdXIgbmFtZSIvPgotICAgICAgICAgICAgICAgIDxoOmlucHV0VGV4dCBpZD0ibmFtZSIgdmFsdWU9IiN7aGVsbG9Xb3JsZC5uYW1lfSIgcmVxdWlyZWQ9InRydWUiLz4KLSAgICAgICAgICAgICAgICA8aDpjb21tYW5kQnV0dG9uIHZhbHVlPSJQcmVzcyBtZSIgYWN0aW9uPSIje2hlbGxvV29ybGQuc2VuZH0iLz4KLSAgICAgICAgICAgICAgICA8aDptZXNzYWdlcyBzaG93RGV0YWlsPSJ0cnVlIiBzaG93U3VtbWFyeT0iZmFsc2UiLz4KLSAgICAgICAgICAgIDwvaDpwYW5lbEdyaWQ+Ci0gICAgICAgIDwvaDpmb3JtPgotICAgIDwvZGl2PgotPC9oOmJvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1oZWxsb3dvcmxkMjAtb3diL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL3dlYmFwcC9pbmRleC5odG1sIGIvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtaGVsbG93b3JsZDIwLW93Yi9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zcmMvbWFpbi93ZWJhcHAvaW5kZXguaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2EwNGIxZi4uMDAwMDAwMAotLS0gYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1oZWxsb3dvcmxkMjAtb3diL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL3dlYmFwcC9pbmRleC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotPCEtLQotICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICAgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gICAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICAgIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICAgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gICAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gICAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gICAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICAgIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08aHRtbD4KLTxoZWFkPgotICAgIDxtZXRhIGh0dHAtZXF1aXY9InJlZnJlc2giIGNvbnRlbnQ9IjA7IFVSTD1oZWxsb1dvcmxkLmpzZiI+Ci08L2hlYWQ+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtaGVsbG93b3JsZDIwLW93Yi9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zcmMvbWFpbi93ZWJhcHAvcGFnZTIueGh0bWwgYi9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1oZWxsb3dvcmxkMjAtb3diL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL3dlYmFwcC9wYWdlMi54aHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTgxZjMwYi4uMDAwMDAwMAotLS0gYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1oZWxsb3dvcmxkMjAtb3diL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL3dlYmFwcC9wYWdlMi54aHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICAgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICAgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gICAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICAgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gICAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gICAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gICAgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIgotICAgICAgeG1sbnM6aD0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvaHRtbCIKLSAgICAgIHhtbG5zOmY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2NvcmUiPgotPGg6aGVhZD4KLSAgICA8dGl0bGU+SGVsbG8gV29ybGQ8L3RpdGxlPgotPC9oOmhlYWQ+Ci08aDpib2R5PgotICAgIDxoOm91dHB1dFN0eWxlc2hlZXQgbmFtZT0ic3R5bGUuY3NzIiBsaWJyYXJ5PSJjc3MiLz4KLSAgICA8ZGl2IGlkPSJjb250YWluZXIiPgotICAgICAgICA8aDE+TXlGYWNlcyBIZWxsbyBXb3JsZDwvaDE+Ci0gICAgICAgIDxoOm91dHB1dFRleHQgdmFsdWU9IiN7aGVsbG9Xb3JsZC5ncmVldGluZ30iLz4KLSAgICAgICAgPGJyLz4KLSAgICAgICAgPGg6bGluayB2YWx1ZT0iSG9tZSIgb3V0Y29tZT0iaGVsbG9Xb3JsZCIvPgotICAgIDwvZGl2PgotPC9oOmJvZHk+Ci08L2h0bWw+Ci0gICAgICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWhlbGxvd29ybGQyMC1vd2Ivc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc3JjL21haW4vd2ViYXBwL3Jlc291cmNlcy9jc3Mvc3R5bGUuY3NzIGIvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtaGVsbG93b3JsZDIwLW93Yi9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zcmMvbWFpbi93ZWJhcHAvcmVzb3VyY2VzL2Nzcy9zdHlsZS5jc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlYzM0ODEuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtaGVsbG93b3JsZDIwLW93Yi9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zcmMvbWFpbi93ZWJhcHAvcmVzb3VyY2VzL2Nzcy9zdHlsZS5jc3MKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotYm9keSB7Ci0gICAgYmFja2dyb3VuZC1jb2xvcjogcmdiKDAsIDM1LCA3NSk7Ci0gICAgZm9udC1mYW1pbHk6IHRhaG9tYSwgYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLSAgICBmb250LXNpemU6IDEycHg7Ci19Ci0KLSNjb250YWluZXIgewotICAgIG1hcmdpbjogMTBweCBhdXRvOwotICAgIHdpZHRoOiA5MDBweDsKLSAgICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTsKLSAgICBwYWRkaW5nOiAzcHg7Ci19Ci0KLWgxIHsKLSAgICBmb250LXNpemU6IDIwcHg7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtaGVsbG93b3JsZDIwLW93Yi9zcmMvc2l0ZS9hcHQvaW5kZXguYXB0IGIvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtaGVsbG93b3JsZDIwLW93Yi9zcmMvc2l0ZS9hcHQvaW5kZXguYXB0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDhjNjE1Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWhlbGxvd29ybGQyMC1vd2Ivc3JjL3NpdGUvYXB0L2luZGV4LmFwdAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSAtLS0tLS0KLSBNeWZhY2VzIEhlbGxvV29ybGQgMi4wIE9wZW5XZWJCZWFucyBBcmNoZXR5cGUKLSAtLS0tLS0KLQotT3ZlcnZpZXcKLQotICBUaGlzIHByb2plY3QgZGVmaW5lcyBhIE1hdmVuIGFyY2hldHlwZS4gUnVubmluZyB0aGUgYXJjaGV0eXBlIHBsdWdpbiB3aXRoIHRoaXMgYXJjaGV0eXBlIHdpbGwKLSAgY3JlYXRlIGEgZGlyZWN0b3J5IHRyZWUgY29udGFpbmluZyB0aGUgZmlsZXMgbmVlZGVkIHRvIHF1aWNrbHkgZ2V0IHN0YXJ0ZWQgb24gYSBuZXcgSlNGIDIuMAotICBwcm9qZWN0LiBNYW5hZ2VkIGJlYW5zIGFyZSBkZWZpbmVkIHdpdGggSlNSLTI5OS9KU1ItMzMwIGFubm90YXRpb25zIHdpdGggQXBhY2hlIE9wZW5XZWJCZWFucwotICBhcyB0aGUgQ0RJIGltcGxlbWVudGF0aW9uLgotCi1Vc2FnZQotCi0gIFVzZSB0aGUgZm9sbG93aW5nIG1hdmVuIGNvbW1hbmQgYW5kIHRoZW4gc2VsZWN0IG15ZmFjZXMtYXJjaGV0eXBlLWhlbGxvd29ybGQyMC1vd2IgZnJvbSB0aGUgb3B0aW9ucy4KLQotCi0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotbXZuIGFyY2hldHlwZTpnZW5lcmF0ZSAtRGFyY2hldHlwZUNhdGFsb2c9aHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZwotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKZGlmZiAtLWdpdCBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWhlbGxvd29ybGQyMC9wb20ueG1sIGIvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtaGVsbG93b3JsZDIwL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyMTI3ZmIuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtaGVsbG93b3JsZDIwL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICAgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gICAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICAgIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICAgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gICAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gICAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gICAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICAgIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLQotICAgIDxwYXJlbnQ+Ci0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzPC9ncm91cElkPgotICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWFyY2hldHlwZS1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDx2ZXJzaW9uPjEuMC40LVNOQVBTSE9UPC92ZXJzaW9uPgotICAgIDwvcGFyZW50PgotCi0gICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzPC9ncm91cElkPgotICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtYXJjaGV0eXBlLWhlbGxvd29ybGQyMDwvYXJ0aWZhY3RJZD4KLSAgICA8cGFja2FnaW5nPmphcjwvcGFja2FnaW5nPgotICAgIDxuYW1lPk15RmFjZXMgMi4wIEJhc2ljIEFyY2hldHlwZTwvbmFtZT4KLSAgICA8ZGVzY3JpcHRpb24+QXJjaGV0eXBlIHRvIGNyZWF0ZSBhIG5ldyB3ZWJhcHAgYmFzZWQgb24gTXlGYWNlcyAyLjA8L2Rlc2NyaXB0aW9uPgotCi08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1oZWxsb3dvcmxkMjAvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL0xJQ0VOU0UudHh0IGIvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtaGVsbG93b3JsZDIwL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9MSUNFTlNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDY0NTY5NS4uMDAwMDAwMAotLS0gYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1oZWxsb3dvcmxkMjAvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL0xJQ0VOU0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMjAyICswLDAgQEAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKLSAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8KLQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCi0KLSAgIDEuIERlZmluaXRpb25zLgotCi0gICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLAotICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuCi0KLSAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5Ci0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuCi0KLSAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwKLSAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24KLSAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCi0gICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUKLSAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yCi0gICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKLSAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuCi0KLSAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKLSAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuCi0KLSAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAotICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbgotICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4KLQotICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwKLSAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQKLSAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKLSAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4KLQotICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKLSAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGEKLSAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yawotICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KLQotICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdAotICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQotICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucwotICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMKLSAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgotICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLAotICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4KLQotICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcKLSAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMKLSAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQotICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcgotICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIKLSAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQKLSAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvCi0gICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAotICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUKLSAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dAotICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKLSAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIgotCi0gICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kCi0gICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4KLQotICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsCi0gICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUKLSAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCi0KLSAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKLSAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLAotICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCi0gICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQotICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXIKLSAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKLSAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91Ci0gICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQotICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yawotICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QKLSAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMKLSAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQotICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLgotCi0gICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQotICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0Ci0gICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQotICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0KLSAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yCi0gICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKLQotICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcwotICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAotCi0gICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MKLSAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCi0gICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywKLSAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mCi0gICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAotCi0gICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMKLSAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0Ci0gICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkCi0gICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90Ci0gICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCi0gICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQKLSAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yCi0gICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCi0gICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZAotICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cwotICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKLSAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbgotICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlCi0gICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCi0gICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkCi0gICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLgotCi0gICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQKLSAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMKLSAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKLSAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLAotICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoCi0gICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgotCi0gICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsCi0gICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKLSAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4KLSAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKLSAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkCi0gICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuCi0KLSAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUKLSAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwKLSAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQotICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuCi0KLSAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgotICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaAotICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zCi0gICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBCi0gICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKLSAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQotICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLgotCi0gICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwKLSAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLAotICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKLSAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlCi0gICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsCi0gICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKLSAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUKLSAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwKLSAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCi0gICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yCi0gICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCi0KLSAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcKLSAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsCi0gICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAotICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMKLSAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5Ci0gICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgotICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LAotICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5Ci0gICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCi0gICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4KLQotICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCi0KLSAgIEFQUEVORElYOiBIb3cgdG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yay4KLQotICAgICAgVG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yaywgYXR0YWNoIHRoZSBmb2xsb3dpbmcKLSAgICAgIGJvaWxlcnBsYXRlIG5vdGljZSwgd2l0aCB0aGUgZmllbGRzIGVuY2xvc2VkIGJ5IGJyYWNrZXRzICJbXSIKLSAgICAgIHJlcGxhY2VkIHdpdGggeW91ciBvd24gaWRlbnRpZnlpbmcgaW5mb3JtYXRpb24uIChEb24ndCBpbmNsdWRlCi0gICAgICB0aGUgYnJhY2tldHMhKSAgVGhlIHRleHQgc2hvdWxkIGJlIGVuY2xvc2VkIGluIHRoZSBhcHByb3ByaWF0ZQotICAgICAgY29tbWVudCBzeW50YXggZm9yIHRoZSBmaWxlIGZvcm1hdC4gV2UgYWxzbyByZWNvbW1lbmQgdGhhdCBhCi0gICAgICBmaWxlIG9yIGNsYXNzIG5hbWUgYW5kIGRlc2NyaXB0aW9uIG9mIHB1cnBvc2UgYmUgaW5jbHVkZWQgb24gdGhlCi0gICAgICBzYW1lICJwcmludGVkIHBhZ2UiIGFzIHRoZSBjb3B5cmlnaHQgbm90aWNlIGZvciBlYXNpZXIKLSAgICAgIGlkZW50aWZpY2F0aW9uIHdpdGhpbiB0aGlyZC1wYXJ0eSBhcmNoaXZlcy4KLQotICAgQ29weXJpZ2h0IFt5eXl5XSBbbmFtZSBvZiBjb3B5cmlnaHQgb3duZXJdCi0KLSAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCmRpZmYgLS1naXQgYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1oZWxsb3dvcmxkMjAvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL05PVElDRS50eHQgYi9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1oZWxsb3dvcmxkMjAvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL05PVElDRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhM2RiZDYuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtaGVsbG93b3JsZDIwL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9OT1RJQ0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotPT0gIE5PVElDRSBmaWxlIGNvcnJlc3BvbmRpbmcgdG8gc2VjdGlvbiA0KGQpIG9mIHRoZSBBcGFjaGUgTGljZW5zZSwgICA9PQotPT0gIFZlcnNpb24gMi4wLCBpbiB0aGlzIGNhc2UgZm9yIHRoZSBBcGFjaGUgTXlGYWNlcyBNYXZlbiBQbHVnaW5zICAgICA9PQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1UaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IAotVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4KLQotUG9ydGlvbnMgb2YgdGhpcyBzb2Z0d2FyZSB3ZXJlIG9yaWdpbmFsbHkgYmFzZWQgb24gdGhlIGZvbGxvd2luZzoKLQotIC0gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDYsIE9yYWNsZSBDb3JwLCA8aHR0cDovL3d3dy5vcmFjbGUuY29tLz4uCi1hbmQgYXJlIGxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiB1bmRlciB0aGUgCi0iU29mdHdhcmUgR3JhbnQgYW5kIENvcnBvcmF0ZSBDb250cmlidXRpb24gTGljZW5zZSBBZ3JlZW1lbnQiCi0KLVNlZSB0aGUgTElDRU5TRS50eHQgZmlsZSBmb3IgaW5mb3JtYXRpb24gb24gYWxsIGxpY2Vuc2VzIAotYXNzb2NpYXRlZCB3aXRoIHRoaXMgc29mdHdhcmUuCmRpZmYgLS1naXQgYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1oZWxsb3dvcmxkMjAvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL21hdmVuL2FyY2hldHlwZS1tZXRhZGF0YS54bWwgYi9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1oZWxsb3dvcmxkMjAvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL21hdmVuL2FyY2hldHlwZS1tZXRhZGF0YS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzYTEwOTYuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtaGVsbG93b3JsZDIwL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9tYXZlbi9hcmNoZXR5cGUtbWV0YWRhdGEueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLSAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gICAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gICAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gICAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICAgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICAgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICAgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgICB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPGFyY2hldHlwZS1kZXNjcmlwdG9yIHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9wbHVnaW5zL21hdmVuLWFyY2hldHlwZS1wbHVnaW4vYXJjaGV0eXBlLWRlc2NyaXB0b3IvMS4wLjAiCi0gICAgICAgICAgICAgICAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICAgICAgICAgICAgICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3BsdWdpbnMvbWF2ZW4tYXJjaGV0eXBlLXBsdWdpbi9hcmNoZXR5cGUtZGVzY3JpcHRvci8xLjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvYXJjaGV0eXBlLWRlc2NyaXB0b3ItMS4wLjAueHNkIgotCi0gICAgICAgICAgICAgICAgICAgICAgbmFtZT0ibXlmYWNlcy1hcmNoZXR5cGUtaGVsbG93b3JsZDIwIiBwYXJ0aWFsPSJmYWxzZSI+Ci0KLSAgPHJlcXVpcmVkUHJvcGVydGllcy8+Ci0KLSAgPGZpbGVTZXRzPgotICAgICAgPGZpbGVTZXQgZmlsdGVyZWQ9InRydWUiIHBhY2thZ2VkPSJ0cnVlIj4KLSAgICAgICAgICA8ZGlyZWN0b3J5PnNyYy9tYWluL2phdmEvPC9kaXJlY3Rvcnk+Ci0gICAgICA8L2ZpbGVTZXQ+Ci0gICAgICA8ZmlsZVNldCBmaWx0ZXJlZD0iZmFsc2UiIHBhY2thZ2VkPSJmYWxzZSI+Ci0gICAgICAgICAgPGRpcmVjdG9yeT5zcmMvbWFpbi93ZWJhcHAvPC9kaXJlY3Rvcnk+Ci0gICAgICA8L2ZpbGVTZXQ+Ci0gIDwvZmlsZVNldHM+Ci0KLSAgPG1vZHVsZXMvPgotCi08L2FyY2hldHlwZS1kZXNjcmlwdG9yPgpkaWZmIC0tZ2l0IGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtaGVsbG93b3JsZDIwL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3BvbS54bWwgYi9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1oZWxsb3dvcmxkMjAvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzVlMGIxMy4uMDAwMDAwMAotLS0gYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1oZWxsb3dvcmxkMjAvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE0OSArMCwwIEBACi0jc2V0KCAkc3ltYm9sX3BvdW5kID0gJyMnICkKLSNzZXQoICRzeW1ib2xfZG9sbGFyID0gJyQnICkKLSNzZXQoICRzeW1ib2xfZXNjYXBlID0gJ1wnICkKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTwhLS0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIKLSAgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0gICAgPGdyb3VwSWQ+JHtncm91cElkfTwvZ3JvdXBJZD4KLSAgICA8YXJ0aWZhY3RJZD4ke2FydGlmYWN0SWR9PC9hcnRpZmFjdElkPgotICAgIDxwYWNrYWdpbmc+d2FyPC9wYWNrYWdpbmc+Ci0gICAgPHZlcnNpb24+JHt2ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICA8bmFtZT5BIGN1c3RvbSBwcm9qZWN0IHVzaW5nIE15RmFjZXMgMi4wPC9uYW1lPgotICAgIDx1cmw+aHR0cDovL3d3dy5teW9yZ2FuaXphdGlvbi5vcmc8L3VybD4KLQotICAgIDxwcm9wZXJ0aWVzPgotICAgICAgICA8anNmLW15ZmFjZXMudmVyc2lvbj4yLjAuNTwvanNmLW15ZmFjZXMudmVyc2lvbj4KLSAgICAgICAgPGpzZi1tb2phcnJhLnZlcnNpb24+Mi4wLjUtYjAyPC9qc2YtbW9qYXJyYS52ZXJzaW9uPiAgICAgICAgCi0gICAgICAgIDxtYXZlbi5qZXR0eS5wbHVnaW4udmVyc2lvbj42LjEuMjI8L21hdmVuLmpldHR5LnBsdWdpbi52ZXJzaW9uPgotICAgIDwvcHJvcGVydGllcz4KLQotICAgIDxidWlsZD4KLSAgICAgICAgPGZpbmFsTmFtZT4ke2FydGlmYWN0SWR9PC9maW5hbE5hbWU+Ci0gICAgICAgIDxwbHVnaW5zPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY29tcGlsZXItcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8c291cmNlPjEuNTwvc291cmNlPgotICAgICAgICAgICAgICAgICAgICA8dGFyZ2V0PjEuNTwvdGFyZ2V0PgotICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICA8L3BsdWdpbnM+Ci0gICAgPC9idWlsZD4KLQotICAgIDxwcm9maWxlcz4KLSAgICAgICAgPHByb2ZpbGU+Ci0gICAgICAgICAgICA8aWQ+bXlmYWNlczwvaWQ+Ci0gICAgICAgICAgICA8YWN0aXZhdGlvbj4KLSAgICAgICAgICAgICAgICA8cHJvcGVydHk+Ci0gICAgICAgICAgICAgICAgICAgIDxuYW1lPiFqc2Y8L25hbWU+Ci0gICAgICAgICAgICAgICAgPC9wcm9wZXJ0eT4KLSAgICAgICAgICAgIDwvYWN0aXZhdGlvbj4KLSAgICAgICAgICAgIDxkZXBlbmRlbmNpZXM+Ci0gICAgICAgICAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5jb3JlPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWFwaTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtzeW1ib2xfZG9sbGFyfXtqc2YtbXlmYWNlcy52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgotICAgICAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmNvcmU8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtaW1wbDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtzeW1ib2xfZG9sbGFyfXtqc2YtbXlmYWNlcy52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPHNjb3BlPnJ1bnRpbWU8L3Njb3BlPgotICAgICAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDwvZGVwZW5kZW5jaWVzPgotICAgICAgICA8L3Byb2ZpbGU+Ci0KLSAgICAgICAgPHByb2ZpbGU+Ci0gICAgICAgICAgICA8IS0tIEFjdGl2YXRlIGJ5IGFkZGluZyAtRGpzZj1tb2phcnJhIC0tPgotICAgICAgICAgICAgPGlkPm1vamFycmE8L2lkPgotICAgICAgICAgICAgPGFjdGl2YXRpb24+Ci0gICAgICAgICAgICAgICAgPHByb3BlcnR5PgotICAgICAgICAgICAgICAgICAgICA8bmFtZT5qc2Y8L25hbWU+Ci0gICAgICAgICAgICAgICAgICAgIDx2YWx1ZT5tb2phcnJhPC92YWx1ZT4KLSAgICAgICAgICAgICAgICA8L3Byb3BlcnR5PgotICAgICAgICAgICAgPC9hY3RpdmF0aW9uPgotICAgICAgICAgICAgPGRlcGVuZGVuY2llcz4KLSAgICAgICAgICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+Y29tLnN1bi5mYWNlczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+anNmLWFwaTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtzeW1ib2xfZG9sbGFyfXtqc2YtbW9qYXJyYS52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgotICAgICAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+Y29tLnN1bi5mYWNlczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+anNmLWltcGw8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7c3ltYm9sX2RvbGxhcn17anNmLW1vamFycmEudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxzY29wZT5ydW50aW1lPC9zY29wZT4KLSAgICAgICAgICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8L2RlcGVuZGVuY2llcz4KLSAgICAgICAgICAgIDxyZXBvc2l0b3JpZXM+Ci0gICAgICAgICAgICAgICAgPHJlcG9zaXRvcnk+Ci0gICAgICAgICAgICAgICAgICAgIDxpZD5qYXZhLm5ldDwvaWQ+Ci0gICAgICAgICAgICAgICAgICAgIDx1cmw+aHR0cDovL2Rvd25sb2FkLmphdmEubmV0L21hdmVuLzI8L3VybD4KLSAgICAgICAgICAgICAgICA8L3JlcG9zaXRvcnk+Ci0gICAgICAgICAgICA8L3JlcG9zaXRvcmllcz4KLSAgICAgICAgPC9wcm9maWxlPgotCi0gICAgICAgIDxwcm9maWxlPgotICAgICAgICAgICAgPCEtLSBVc2UgbXZuIGNsZWFuIGpldHR5OnJ1bi1leHBsb2RlZCAtUGpldHR5Q29uZmlnIHRvIHJ1biB3aXRoIGpldHR5IC0tPgotICAgICAgICAgICAgPGlkPmpldHR5Q29uZmlnPC9pZD4KLSAgICAgICAgICAgIDxidWlsZD4KLSAgICAgICAgICAgICAgICA8cGx1Z2lucz4KLSAgICAgICAgICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwhLS1UaGlzIHBsdWdpbiBhbGxvd3MgdG8gcnVuIHRoZSB3YXIgdXNpbmcgbXZuIGpldHR5OnJ1biAtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5tb3J0YmF5LmpldHR5PC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tamV0dHktcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtzeW1ib2xfZG9sbGFyfXttYXZlbi5qZXR0eS5wbHVnaW4udmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2NhbkludGVydmFsU2Vjb25kcz4xMDwvc2NhbkludGVydmFsU2Vjb25kcz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgICAgICAgICAgPC9wbHVnaW5zPgotICAgICAgICAgICAgPC9idWlsZD4KLSAgICAgICAgPC9wcm9maWxlPgotICAgIDwvcHJvZmlsZXM+Ci0KLSAgICA8IS0tIFByb2plY3QgZGVwZW5kZW5jaWVzIC0tPgotICAgIDxkZXBlbmRlbmNpZXM+Ci0gICAgICAgIAotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPmphdmF4LmVsPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+ZWwtYXBpPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+MS4wPC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotCi0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+anVuaXQ8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5qdW5pdDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPjQuMDwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotCi0gICAgPC9kZXBlbmRlbmNpZXM+Ci0KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWhlbGxvd29ybGQyMC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zcmMvbWFpbi9qYXZhL0hlbGxvV29ybGRDb250cm9sbGVyLmphdmEgYi9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1oZWxsb3dvcmxkMjAvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc3JjL21haW4vamF2YS9IZWxsb1dvcmxkQ29udHJvbGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZDYzOTdiLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWhlbGxvd29ybGQyMC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zcmMvbWFpbi9qYXZhL0hlbGxvV29ybGRDb250cm9sbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSAke3BhY2thZ2V9OwotCi1pbXBvcnQgamF2YXguZmFjZXMuYmVhbi5NYW5hZ2VkQmVhbjsKLWltcG9ydCBqYXZheC5mYWNlcy5iZWFuLlJlcXVlc3RTY29wZWQ7Ci0KLS8qKgotICogQSB0eXBpY2FsIHNpbXBsZSBiYWNraW5nIGJlYW4sIHRoYXQgaXMgYmFja2VkIHRvIDxjb2RlPmhlbGxvV29ybGQueGh0bWw8L2NvZGU+Ci0gKi8KLUBNYW5hZ2VkQmVhbihuYW1lID0gImhlbGxvV29ybGQiKQotQFJlcXVlc3RTY29wZWQKLXB1YmxpYyBjbGFzcyBIZWxsb1dvcmxkQ29udHJvbGxlcgotewotCi0gICAgLy9wcm9wZXJ0aWVzCi0gICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQotICAgIC8qKgotICAgICAqIGRlZmF1bHQgZW1wdHkgY29uc3RydWN0b3IKLSAgICAgKi8KLSAgICBwdWJsaWMgSGVsbG9Xb3JsZENvbnRyb2xsZXIoKQotICAgIHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNZXRob2QgdGhhdCBpcyBiYWNrZWQgdG8gYSBzdWJtaXQgYnV0dG9uIG9mIGEgZm9ybS4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIHNlbmQoKQotICAgIHsKLSAgICAgICAgLy9kbyByZWFsIGxvZ2ljLCByZXR1cm4gYSBzdHJpbmcgd2hpY2ggd2lsbCBiZSB1c2VkIGZvciB0aGUgbmF2aWdhdGlvbiBzeXN0ZW0gb2YgSlNGCi0gICAgICAgIHJldHVybiAicGFnZTIueGh0bWwiOwotICAgIH0KLQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLWdldHRlciAmIHNldHRlcgotCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBuYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpCi0gICAgewotICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtaGVsbG93b3JsZDIwL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL2ZhY2VzLWNvbmZpZy54bWwgYi9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1oZWxsb3dvcmxkMjAvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvZmFjZXMtY29uZmlnLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTkyMmYwMy4uMDAwMDAwMAotLS0gYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1oZWxsb3dvcmxkMjAvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvZmFjZXMtY29uZmlnLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCEtLQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPGZhY2VzLWNvbmZpZyB2ZXJzaW9uPSIyLjAiCi0gICAgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIKLSAgICB4bWxuczp4aT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YSW5jbHVkZSIKLSAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiAKLSAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvd2ViLWZhY2VzY29uZmlnXzJfMC54c2QiPgotCQotPC9mYWNlcy1jb25maWc+Ci0gICAgICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWhlbGxvd29ybGQyMC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sIGIvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtaGVsbG93b3JsZDIwL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4Zjg3YWIuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtaGVsbG93b3JsZDIwL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMzIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08d2ViLWFwcCB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIgotICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvd2ViLWFwcF8yXzUueHNkIgotICAgICAgICB2ZXJzaW9uPSIyLjUiPgotCi0gICAgPGRlc2NyaXB0aW9uPk15UHJvamVjdCB3ZWIueG1sPC9kZXNjcmlwdGlvbj4KLQotICAgIDwhLS0gSlNGIHN0YW5kYXJkIHBhcmFtZXRlcnMgLS0+Ci0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5Qcm9qZWN0IHN0YWdlIGZvciB0aGUgYXBwbGljYXRpb24gKG5ldyBpbiAyLjApLiBFeHBlY3RzIG9uZSBvZgotICAgICAgICAgICAgdGhlIGZvbGxvd2luZyB2YWx1ZXM6IERldmVsb3BtZW50LCBQcm9kdWN0aW9uLCBTeXN0ZW1UZXN0LCBVbml0VGVzdAotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5qYXZheC5mYWNlcy5QUk9KRUNUX1NUQUdFPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+RGV2ZWxvcG1lbnQ8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgSWYgdGhpcyBwYXJhbWV0ZXIgaXMgc2V0IHRvIHRydWUgYW5kIHRoZSBzdWJtaXR0ZWQgdmFsdWUgb2YgYSBjb21wb25lbnQgaXMKLSAgICAgICAgICAgIHRoZSBlbXB0eSBzdHJpbmcsIHRoZSBzdWJtaXR0ZWQgdmFsdWUgd2lsbCBiZSBzZXQgdG8gbnVsbAotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5qYXZheC5mYWNlcy5JTlRFUlBSRVRfRU1QVFlfU1RSSU5HX1NVQk1JVFRFRF9WQUxVRVNfQVNfTlVMTDwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPnRydWU8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPlN0YXRlIHNhdmluZyBtZXRob2Q6ICJjbGllbnQiIG9yICJzZXJ2ZXIiICg9IGRlZmF1bHQpCi0gICAgICAgICAgICBTZWUgSlNGIFNwZWNpZmljYXRpb24gMi41LjM8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5qYXZheC5mYWNlcy5TVEFURV9TQVZJTkdfTUVUSE9EPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+Y2xpZW50PC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0KLSAgICA8IS0tIE15RmFjZXMgc3BlY2lmaWMgcGFyYW1ldGVycyAtLT4KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPk9ubHkgYXBwbGljYWJsZSBpZiBzdGF0ZSBzYXZpbmcgbWV0aG9kIGlzICJzZXJ2ZXIiICg9IGRlZmF1bHQpLgotICAgICAgICAgICAgRGVmaW5lcyB0aGUgYW1vdW50IChkZWZhdWx0ID0gMjApIG9mIHRoZSBsYXRlc3Qgdmlld3MgYXJlIHN0b3JlZCBpbiBzZXNzaW9uLjwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5OVU1CRVJfT0ZfVklFV1NfSU5fU0VTU0lPTjwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPjIwPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5Pbmx5IGFwcGxpY2FibGUgaWYgc3RhdGUgc2F2aW5nIG1ldGhvZCBpcyAic2VydmVyIiAoPSBkZWZhdWx0KS4KLSAgICAgICAgICAgIElmIHRydWUgKGRlZmF1bHQpIHRoZSBzdGF0ZSB3aWxsIGJlIHNlcmlhbGl6ZWQgdG8gYSBieXRlIHN0cmVhbSBiZWZvcmUgaXQKLSAgICAgICAgICAgIGlzIHdyaXR0ZW4gdG8gdGhlIHNlc3Npb24uCi0gICAgICAgICAgICBJZiBmYWxzZSB0aGUgc3RhdGUgd2lsbCBub3QgYmUgc2VyaWFsaXplZCB0byBhIGJ5dGUgc3RyZWFtLjwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5TRVJJQUxJWkVfU1RBVEVfSU5fU0VTU0lPTjwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPnRydWU8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPk9ubHkgYXBwbGljYWJsZSBpZiBzdGF0ZSBzYXZpbmcgbWV0aG9kIGlzICJzZXJ2ZXIiICg9IGRlZmF1bHQpIGFuZCBpZgotICAgICAgICAgICAgb3JnLmFwYWNoZS5teWZhY2VzLlNFUklBTElaRV9TVEFURV9JTl9TRVNTSU9OIGlzIHRydWUgKD0gZGVmYXVsdCkKLSAgICAgICAgICAgIElmIHRydWUgKGRlZmF1bHQpIHRoZSBzZXJpYWxpemVkIHN0YXRlIHdpbGwgYmUgY29tcHJlc3NlZCBiZWZvcmUgaXQKLSAgICAgICAgICAgIGlzIHdyaXR0ZW4gdG8gdGhlIHNlc3Npb24uIElmIGZhbHNlIHRoZSBzdGF0ZSB3aWxsIG5vdCBiZSBjb21wcmVzc2VkLjwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5DT01QUkVTU19TVEFURV9JTl9TRVNTSU9OPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+VGhpcyBwYXJhbWV0ZXIgdGVsbHMgTXlGYWNlcyBpZiBqYXZhc2NyaXB0IGNvZGUgc2hvdWxkIGJlIGFsbG93ZWQgaW4gdGhlCi0gICAgICAgICAgICByZW5kZXJlZCBIVE1MIG91dHB1dC4KLSAgICAgICAgICAgIElmIGphdmFzY3JpcHQgaXMgYWxsb3dlZCwgY29tbWFuZF9saW5rIGFuY2hvcnMgd2lsbCBoYXZlIGphdmFzY3JpcHQgY29kZQotICAgICAgICAgICAgdGhhdCBzdWJtaXRzIHRoZSBjb3JyZXNwb25kaW5nIGZvcm0uCi0gICAgICAgICAgICBJZiBqYXZhc2NyaXB0IGlzIG5vdCBhbGxvd2VkLCB0aGUgc3RhdGUgc2F2aW5nIGluZm8gYW5kIG5lc3RlZCBwYXJhbWV0ZXJzCi0gICAgICAgICAgICB3aWxsIGJlIGFkZGVkIGFzIHVybCBwYXJhbWV0ZXJzLgotICAgICAgICAgICAgRGVmYXVsdDogInRydWUiPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLkFMTE9XX0pBVkFTQ1JJUFQ8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT50cnVlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5ERVRFQ1RfSkFWQVNDUklQVDwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPmZhbHNlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5JZiB0cnVlLCByZW5kZXJlZCBIVE1MIGNvZGUgd2lsbCBiZSBmb3JtYXR0ZWQsIHNvIHRoYXQgaXQgaXMgImh1bWFuIHJlYWRhYmxlIi4KLSAgICAgICAgICAgIGkuZS4gYWRkaXRpb25hbCBsaW5lIHNlcGFyYXRvcnMgYW5kIHdoaXRlc3BhY2Ugd2lsbCBiZSB3cml0dGVuLCB0aGF0IGRvIG5vdAotICAgICAgICAgICAgaW5mbHVlbmNlIHRoZSBIVE1MIGNvZGUuCi0gICAgICAgICAgICBEZWZhdWx0OiAidHJ1ZSI8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuUFJFVFRZX0hUTUw8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT50cnVlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5JZiB0cnVlLCBhIGphdmFzY3JpcHQgZnVuY3Rpb24gd2lsbCBiZSByZW5kZXJlZCB0aGF0IGlzIGFibGUgdG8gcmVzdG9yZSB0aGUKLSAgICAgICAgICAgIGZvcm1lciB2ZXJ0aWNhbCBzY3JvbGwgb24gZXZlcnkgcmVxdWVzdC4gQ29udmVuaWVudCBmZWF0dXJlIGlmIHlvdSBoYXZlIHBhZ2VzCi0gICAgICAgICAgICB3aXRoIGxvbmcgbGlzdHMgYW5kIHlvdSBkbyBub3Qgd2FudCB0aGUgYnJvd3NlciBwYWdlIHRvIGFsd2F5cyBqdW1wIHRvIHRoZSB0b3AKLSAgICAgICAgICAgIGlmIHlvdSB0cmlnZ2VyIGEgbGluayBvciBidXR0b24gYWN0aW9uIHRoYXQgc3RheXMgb24gdGhlIHNhbWUgcGFnZS4KLSAgICAgICAgICAgIERlZmF1bHQ6ICJmYWxzZSI8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuQVVUT19TQ1JPTEw8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT50cnVlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5Vc2VkIGZvciBlbmNyeXB0aW5nIHZpZXcgc3RhdGUuIE9ubHkgcmVsZXZhbnQgZm9yIGNsaWVudCBzaWRlCi0gICAgICAgICAgICBzdGF0ZSBzYXZpbmcuIFNlZSBNeUZhY2VzIHdpa2kvd2ViIHNpdGUgZG9jdW1lbnRhdGlvbiBmb3IgaW5zdHJ1Y3Rpb25zCi0gICAgICAgICAgICBvbiBob3cgdG8gY29uZmlndXJlIGFuIGFwcGxpY2F0aW9uIGZvciBkaWZmZW5lbnQgZW5jcnlwdGlvbiBzdHJlbmd0aHMuCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5TRUNSRVQ8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT5OelkxTkRNeU1UQT08L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLQotICAgIDwhLS0gRmFjZXMgU2VydmxldCAtLT4KLSAgICA8c2VydmxldD4KLSAgICAgICAgPHNlcnZsZXQtbmFtZT5GYWNlcyBTZXJ2bGV0PC9zZXJ2bGV0LW5hbWU+Ci0gICAgICAgIDxzZXJ2bGV0LWNsYXNzPmphdmF4LmZhY2VzLndlYmFwcC5GYWNlc1NlcnZsZXQ8L3NlcnZsZXQtY2xhc3M+Ci0gICAgICAgIDxsb2FkLW9uLXN0YXJ0dXA+MTwvbG9hZC1vbi1zdGFydHVwPgotICAgIDwvc2VydmxldD4KLQotICAgIDwhLS0gRmFjZXMgU2VydmxldCBNYXBwaW5nIC0tPgotICAgIDxzZXJ2bGV0LW1hcHBpbmc+Ci0gICAgICAgIDxzZXJ2bGV0LW5hbWU+RmFjZXMgU2VydmxldDwvc2VydmxldC1uYW1lPgotICAgICAgICA8dXJsLXBhdHRlcm4+Ki5qc2Y8L3VybC1wYXR0ZXJuPgotICAgIDwvc2VydmxldC1tYXBwaW5nPgotCi0gICAgPCEtLSBXZWxjb21lIGZpbGVzIC0tPgotICAgIDx3ZWxjb21lLWZpbGUtbGlzdD4KLSAgICAgICAgPHdlbGNvbWUtZmlsZT5pbmRleC5odG1sPC93ZWxjb21lLWZpbGU+Ci0gICAgPC93ZWxjb21lLWZpbGUtbGlzdD4KLQotPC93ZWItYXBwPgpkaWZmIC0tZ2l0IGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtaGVsbG93b3JsZDIwL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL3dlYmFwcC9oZWxsb1dvcmxkLnhodG1sIGIvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtaGVsbG93b3JsZDIwL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL3dlYmFwcC9oZWxsb1dvcmxkLnhodG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YmEyZjk1Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWhlbGxvd29ybGQyMC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zcmMvbWFpbi93ZWJhcHAvaGVsbG9Xb3JsZC54aHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICAgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICAgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gICAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICAgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gICAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gICAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gICAgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIgotICAgICAgeG1sbnM6aD0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvaHRtbCIKLSAgICAgIHhtbG5zOmY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2NvcmUiPgotPGg6aGVhZD4KLSAgICA8dGl0bGU+SGVsbG8gV29ybGQ8L3RpdGxlPgotPC9oOmhlYWQ+Ci08aDpib2R5PgotICAgIDxoOm91dHB1dFN0eWxlc2hlZXQgbmFtZT0ic3R5bGUuY3NzIiBsaWJyYXJ5PSJjc3MiLz4KLSAgICA8ZGl2IGlkPSJjb250YWluZXIiPgotICAgICAgICA8aDE+TXlGYWNlcyBIZWxsbyBXb3JsZDwvaDE+Ci0gICAgICAgIDxoOmZvcm0gaWQ9Im1haW5Gb3JtIj4KLSAgICAgICAgICAgIDxoOnBhbmVsR3JpZCBjb2x1bW5zPSIyIj4KLSAgICAgICAgICAgICAgICA8aDpvdXRwdXRMYWJlbCBmb3I9Im5hbWUiIHZhbHVlPSJQbGVhc2UgZW50ZXIgeW91ciBuYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGg6aW5wdXRUZXh0IGlkPSJuYW1lIiB2YWx1ZT0iI3toZWxsb1dvcmxkLm5hbWV9IiByZXF1aXJlZD0idHJ1ZSIvPgotICAgICAgICAgICAgICAgIDxoOmNvbW1hbmRCdXR0b24gdmFsdWU9IlByZXNzIG1lIiBhY3Rpb249IiN7aGVsbG9Xb3JsZC5zZW5kfSIvPgotICAgICAgICAgICAgICAgIDxoOm1lc3NhZ2VzIHNob3dEZXRhaWw9InRydWUiIHNob3dTdW1tYXJ5PSJmYWxzZSIvPgotICAgICAgICAgICAgPC9oOnBhbmVsR3JpZD4KLSAgICAgICAgPC9oOmZvcm0+Ci0gICAgPC9kaXY+Ci08L2g6Ym9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWhlbGxvd29ybGQyMC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zcmMvbWFpbi93ZWJhcHAvaW5kZXguaHRtbCBiL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWhlbGxvd29ybGQyMC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zcmMvbWFpbi93ZWJhcHAvaW5kZXguaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTBjMGRmYy4uMDAwMDAwMAotLS0gYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1oZWxsb3dvcmxkMjAvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc3JjL21haW4vd2ViYXBwL2luZGV4Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi08IS0tCi0gICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICAgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICAgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gICAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICAgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gICAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gICAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gICAgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTxodG1sPgotPGhlYWQ+Ci0gICAgPG1ldGEgaHR0cC1lcXVpdj0icmVmcmVzaCIgY29udGVudD0iMDsgVVJMPWhlbGxvV29ybGQuanNmIj4KLTwvaGVhZD4KLTwvaHRtbD4KLSAgICAgICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtaGVsbG93b3JsZDIwL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL3dlYmFwcC9wYWdlMi54aHRtbCBiL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWhlbGxvd29ybGQyMC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zcmMvbWFpbi93ZWJhcHAvcGFnZTIueGh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxOGQzMzcuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtaGVsbG93b3JsZDIwL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL3dlYmFwcC9wYWdlMi54aHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICAgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICAgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gICAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICAgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gICAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gICAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gICAgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIgotICAgICAgeG1sbnM6aD0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvaHRtbCIKLSAgICAgIHhtbG5zOmY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2NvcmUiPgotPGg6aGVhZD4KLSAgICA8dGl0bGU+SGVsbG8gV29ybGQ8L3RpdGxlPgotPC9oOmhlYWQ+Ci08aDpib2R5PgotICAgIDxoOm91dHB1dFN0eWxlc2hlZXQgbmFtZT0ic3R5bGUuY3NzIiBsaWJyYXJ5PSJjc3MiLz4KLSAgICA8ZGl2IGlkPSJjb250YWluZXIiPgotICAgICAgICA8aDE+TXlGYWNlcyBIZWxsbyBXb3JsZDwvaDE+Ci0gICAgICAgIDxoOm91dHB1dFRleHQgdmFsdWU9IkhlbGxvICN7aGVsbG9Xb3JsZC5uYW1lfS4gV2UgaG9wZSB5b3UgZW5qb3kgQXBhY2hlIE15RmFjZXMhIi8+Ci0gICAgICAgIDxici8+Ci0gICAgICAgIDxoOmxpbmsgdmFsdWU9IkhvbWUiIG91dGNvbWU9ImhlbGxvV29ybGQiLz4KLSAgICA8L2Rpdj4KLTwvaDpib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtaGVsbG93b3JsZDIwL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL3dlYmFwcC9yZXNvdXJjZXMvY3NzL3N0eWxlLmNzcyBiL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWhlbGxvd29ybGQyMC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zcmMvbWFpbi93ZWJhcHAvcmVzb3VyY2VzL2Nzcy9zdHlsZS5jc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkMWVjMDkuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtaGVsbG93b3JsZDIwL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL3dlYmFwcC9yZXNvdXJjZXMvY3NzL3N0eWxlLmNzcworKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLWJvZHkgewotICAgIGJhY2tncm91bmQtY29sb3I6IHJnYigwLCAzNSwgNzUpOwotICAgIGZvbnQtZmFtaWx5OiB0YWhvbWEsIGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0gICAgZm9udC1zaXplOiAxMnB4OwotfQotCi0jY29udGFpbmVyIHsKLSAgICBtYXJnaW46IDEwcHggYXV0bzsKLSAgICB3aWR0aDogOTAwcHg7Ci0gICAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7Ci0gICAgcGFkZGluZzogM3B4OwotfQotCi1oMSB7Ci0gICAgZm9udC1zaXplOiAyMHB4OwotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtaGVsbG93b3JsZDIwL3NyYy9zaXRlL2FwdC9pbmRleC5hcHQgYi9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1oZWxsb3dvcmxkMjAvc3JjL3NpdGUvYXB0L2luZGV4LmFwdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2I4NTg1MC4uMDAwMDAwMAotLS0gYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1oZWxsb3dvcmxkMjAvc3JjL3NpdGUvYXB0L2luZGV4LmFwdAorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLSAtLS0tLS0KLSBNeWZhY2VzIEhlbGxvV29ybGQgMi4wIEFyY2hldHlwZQotIC0tLS0tLQotCi1PdmVydmlldwotCi0gIFRoaXMgcHJvamVjdCBkZWZpbmVzIGEgTWF2ZW4gYXJjaGV0eXBlLiBSdW5uaW5nIHRoZSBhcmNoZXR5cGUgcGx1Z2luIHdpdGggdGhpcyBhcmNoZXR5cGUgd2lsbAotICBjcmVhdGUgYSBkaXJlY3RvcnkgdHJlZSBjb250YWluaW5nIHRoZSBmaWxlcyBuZWVkZWQgdG8gcXVpY2tseSBnZXQgc3RhcnRlZCBvbiBhIG5ldyBKU0YgMi4wCi0gIHByb2plY3QuCi0KLVVzYWdlCi0KLSAgVXNlIHRoZSBmb2xsb3dpbmcgbWF2ZW4gY29tbWFuZCBhbmQgdGhlbiBzZWxlY3QgbXlmYWNlcy1hcmNoZXR5cGUtaGVsbG93b3JsZDIwIGZyb20gdGhlIG9wdGlvbnMuCi0KLQotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLW12biBhcmNoZXR5cGU6Z2VuZXJhdGUgLURhcmNoZXR5cGVDYXRhbG9nPWh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcKLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCmRpZmYgLS1naXQgYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1qc2Zjb21wb25lbnRzL3BvbS54bWwgYi9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1qc2Zjb21wb25lbnRzL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5NDBiOWEuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtanNmY29tcG9uZW50cy9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLSAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gICAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gICAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gICAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICAgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICAgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICAgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgICB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+Ci0KLSAgPHBhcmVudD4KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29sczwvZ3JvdXBJZD4KLSAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWFyY2hldHlwZS1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+MS4wLjQtU05BUFNIT1Q8L3ZlcnNpb24+Ci0gIDwvcGFyZW50PgotCi0gICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzPC9ncm91cElkPgotICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtYXJjaGV0eXBlLWpzZmNvbXBvbmVudHM8L2FydGlmYWN0SWQ+Ci0gICAgPHBhY2thZ2luZz5qYXI8L3BhY2thZ2luZz4KLSAgICA8bmFtZT5KU0YgQ29tcG9uZW50IExpYnJhcnkgQXJjaGV0eXBlPC9uYW1lPgotICAgIDxkZXNjcmlwdGlvbj5BcmNoZXR5cGUgdG8gY3JlYXRlIGEgbGliYXJ5IHByb2plY3Qgb2YgSlNGIGNvbXBvbmVudHM8L2Rlc2NyaXB0aW9uPgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtanNmY29tcG9uZW50cy9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvTElDRU5TRS50eHQgYi9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1qc2Zjb21wb25lbnRzL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9MSUNFTlNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDY0NTY5NS4uMDAwMDAwMAotLS0gYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1qc2Zjb21wb25lbnRzL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9MSUNFTlNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDIwMiArMCwwIEBACi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0Ci0gICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvCi0KLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTgotCi0gICAxLiBEZWZpbml0aW9ucy4KLQotICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwKLSAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgotCi0gICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgotCi0gICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsCi0gICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCi0gICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLAotICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlCi0gICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgotICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlCi0gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5LgotCi0gICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLgotCi0gICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywKLSAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24KLSAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCi0KLSAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsCi0gICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0Ci0gICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sCi0gICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuCi0KLSAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yCi0gICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhCi0gICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKLSAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuCi0KLSAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKLSAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUKLSAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMKLSAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCi0gICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4KLSAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwKLSAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCi0KLSAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nCi0gICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCi0gICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkKLSAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIKLSAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgotICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiCi0gICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50Ci0gICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bwotICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywKLSAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlCi0gICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKLSAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlCi0gICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiIKLQotICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKLSAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZAotICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCi0KLSAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKLSAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLAotICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCi0gICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLgotCi0gICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKLSAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLAotICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUKLSAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCi0gICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpCi0gICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQotICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKLSAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsKLSAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0Ci0gICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCi0gICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUKLSAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4KLQotICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUKLSAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dAotICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKLSAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotCi0gICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgotICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kCi0KLSAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKLSAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQKLQotICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCi0gICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZAotICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssCi0gICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgotICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQKLQotICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCi0gICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdAotICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZAotICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAotICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQotICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkCi0gICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgotICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLAotICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQKLSAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKLSAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kCi0gICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24KLSAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQotICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZAotICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZAotICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KLQotICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kCi0gICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCi0gICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yCi0gICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwKLSAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAotICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4KLQotICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAotICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrCi0gICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCi0gICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5Ci0gICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZAotICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgotCi0gICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlCi0gICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCi0gICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUKLSAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLgotCi0gICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IKLSAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gKLSAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucwotICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQotICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlCi0gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkKLSAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KLQotICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksCi0gICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKLSAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5Ci0gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQotICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAotICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhCi0gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlCi0gICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCi0gICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbAotICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcgotICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgotCi0gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nCi0gICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAotICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwKLSAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzCi0gICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQotICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYKLSAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwKLSAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQotICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbgotICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuCi0KLSAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUwotCi0gICBBUFBFTkRJWDogSG93IHRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmsuCi0KLSAgICAgIFRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmssIGF0dGFjaCB0aGUgZm9sbG93aW5nCi0gICAgICBib2lsZXJwbGF0ZSBub3RpY2UsIHdpdGggdGhlIGZpZWxkcyBlbmNsb3NlZCBieSBicmFja2V0cyAiW10iCi0gICAgICByZXBsYWNlZCB3aXRoIHlvdXIgb3duIGlkZW50aWZ5aW5nIGluZm9ybWF0aW9uLiAoRG9uJ3QgaW5jbHVkZQotICAgICAgdGhlIGJyYWNrZXRzISkgIFRoZSB0ZXh0IHNob3VsZCBiZSBlbmNsb3NlZCBpbiB0aGUgYXBwcm9wcmlhdGUKLSAgICAgIGNvbW1lbnQgc3ludGF4IGZvciB0aGUgZmlsZSBmb3JtYXQuIFdlIGFsc28gcmVjb21tZW5kIHRoYXQgYQotICAgICAgZmlsZSBvciBjbGFzcyBuYW1lIGFuZCBkZXNjcmlwdGlvbiBvZiBwdXJwb3NlIGJlIGluY2x1ZGVkIG9uIHRoZQotICAgICAgc2FtZSAicHJpbnRlZCBwYWdlIiBhcyB0aGUgY29weXJpZ2h0IG5vdGljZSBmb3IgZWFzaWVyCi0gICAgICBpZGVudGlmaWNhdGlvbiB3aXRoaW4gdGhpcmQtcGFydHkgYXJjaGl2ZXMuCi0KLSAgIENvcHlyaWdodCBbeXl5eV0gW25hbWUgb2YgY29weXJpZ2h0IG93bmVyXQotCi0gICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgpkaWZmIC0tZ2l0IGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtanNmY29tcG9uZW50cy9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvTk9USUNFLnR4dCBiL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWpzZmNvbXBvbmVudHMvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL05PVElDRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhM2RiZDYuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtanNmY29tcG9uZW50cy9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvTk9USUNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLT09ICBOT1RJQ0UgZmlsZSBjb3JyZXNwb25kaW5nIHRvIHNlY3Rpb24gNChkKSBvZiB0aGUgQXBhY2hlIExpY2Vuc2UsICAgPT0KLT09ICBWZXJzaW9uIDIuMCwgaW4gdGhpcyBjYXNlIGZvciB0aGUgQXBhY2hlIE15RmFjZXMgTWF2ZW4gUGx1Z2lucyAgICAgPT0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSAKLVRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuCi0KLVBvcnRpb25zIG9mIHRoaXMgc29mdHdhcmUgd2VyZSBvcmlnaW5hbGx5IGJhc2VkIG9uIHRoZSBmb2xsb3dpbmc6Ci0KLSAtIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDA2LCBPcmFjbGUgQ29ycCwgPGh0dHA6Ly93d3cub3JhY2xlLmNvbS8+LgotYW5kIGFyZSBsaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gdW5kZXIgdGhlIAotIlNvZnR3YXJlIEdyYW50IGFuZCBDb3Jwb3JhdGUgQ29udHJpYnV0aW9uIExpY2Vuc2UgQWdyZWVtZW50IgotCi1TZWUgdGhlIExJQ0VOU0UudHh0IGZpbGUgZm9yIGluZm9ybWF0aW9uIG9uIGFsbCBsaWNlbnNlcyAKLWFzc29jaWF0ZWQgd2l0aCB0aGlzIHNvZnR3YXJlLgpkaWZmIC0tZ2l0IGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtanNmY29tcG9uZW50cy9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvbWF2ZW4vYXJjaGV0eXBlLW1ldGFkYXRhLnhtbCBiL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWpzZmNvbXBvbmVudHMvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL21hdmVuL2FyY2hldHlwZS1tZXRhZGF0YS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyMDIxM2UuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtanNmY29tcG9uZW50cy9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvbWF2ZW4vYXJjaGV0eXBlLW1ldGFkYXRhLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICAgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICAgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gICAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICAgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gICAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gICAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gICAgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTxhcmNoZXR5cGUtZGVzY3JpcHRvciB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvcGx1Z2lucy9tYXZlbi1hcmNoZXR5cGUtcGx1Z2luL2FyY2hldHlwZS1kZXNjcmlwdG9yLzEuMC4wIgotICAgICAgICAgICAgICAgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgICAgICAgICAgICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9wbHVnaW5zL21hdmVuLWFyY2hldHlwZS1wbHVnaW4vYXJjaGV0eXBlLWRlc2NyaXB0b3IvMS4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL2FyY2hldHlwZS1kZXNjcmlwdG9yLTEuMC4wLnhzZCIKLQotICAgICAgICAgICAgICAgICAgICAgIG5hbWU9Im15ZmFjZXMtYXJjaGV0eXBlLWpzZmNvbXBvbmVudHMiIHBhcnRpYWw9ImZhbHNlIj4KLQotICA8cmVxdWlyZWRQcm9wZXJ0aWVzLz4KLQotICA8bW9kdWxlcz4KLSAgICAgIDxtb2R1bGUgZGlyPSJjb3JlIiBuYW1lPSJNeSBKU0YgQ29tcG9uZW50cyBMaWJyYXJ5Ij4KLSAgICAgICAgICA8ZmlsZVNldHM+Ci0gICAgICAgICAgICAgIDwhLS0gbm8gcGFja2FnaW5nIC0gc291cmNlIGFscmVhZHkgdXNlcyBwYWNrYWdlIG9yZy5teW9yZ2FuaXphdGlvbiAtLT4KLSAgICAgICAgICAgICAgPGZpbGVTZXQgZmlsdGVyZWQ9ImZhbHNlIiBwYWNrYWdlZD0iZmFsc2UiPgotICAgICAgICAgICAgICAgICAgPGRpcmVjdG9yeT5zcmMvbWFpbi9qYXZhLzwvZGlyZWN0b3J5PgotICAgICAgICAgICAgICA8L2ZpbGVTZXQ+Ci0gICAgICAgICAgICAgIDxmaWxlU2V0IGZpbHRlcmVkPSJmYWxzZSIgcGFja2FnZWQ9ImZhbHNlIj4KLSAgICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+c3JjL3Rlc3QvamF2YS88L2RpcmVjdG9yeT4KLSAgICAgICAgICAgICAgPC9maWxlU2V0PgotICAgICAgICAgICAgICA8ZmlsZVNldCBmaWx0ZXJlZD0iZmFsc2UiIHBhY2thZ2VkPSJmYWxzZSI+Ci0gICAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PnNyYy9tYWluL3Jlc291cmNlcy88L2RpcmVjdG9yeT4KLSAgICAgICAgICAgICAgPC9maWxlU2V0PgotICAgICAgICAgIDwvZmlsZVNldHM+Ci0gICAgICA8L21vZHVsZT4KLSAgICAgIAotICAgICAgPG1vZHVsZSBkaXI9ImV4YW1wbGVzIiBuYW1lPSJNeSBDb21wb25lbnRzIEV4YW1wbGVzIj4KLSAgICAgICAgICA8ZmlsZVNldHM+Ci0gICAgICAgICAgICAgIDwhLS0gbm8gcGFja2FnaW5nIC0gc291cmNlIGFscmVhZHkgdXNlcyBwYWNrYWdlIG9yZy5teW9yZ2FuaXphdGlvbiAtLT4KLSAgICAgICAgICAgICAgPGZpbGVTZXQgZmlsdGVyZWQ9ImZhbHNlIiBwYWNrYWdlZD0iZmFsc2UiPgotICAgICAgICAgICAgICAgICAgPGRpcmVjdG9yeT5zcmMvbWFpbi9qYXZhLzwvZGlyZWN0b3J5PgotICAgICAgICAgICAgICA8L2ZpbGVTZXQ+Ci0gICAgICAgICAgICAgIDxmaWxlU2V0IGZpbHRlcmVkPSJmYWxzZSIgcGFja2FnZWQ9ImZhbHNlIj4KLSAgICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+c3JjL21haW4vbG9nNGovPC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgIDwvZmlsZVNldD4KLSAgICAgICAgICAgICAgPGZpbGVTZXQgZmlsdGVyZWQ9ImZhbHNlIiBwYWNrYWdlZD0iZmFsc2UiPgotICAgICAgICAgICAgICAgICAgPGRpcmVjdG9yeT5zcmMvbWFpbi9yZXNvdXJjZXMvPC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgIDwvZmlsZVNldD4KLSAgICAgICAgICAgICAgPGZpbGVTZXQgZmlsdGVyZWQ9ImZhbHNlIiBwYWNrYWdlZD0iZmFsc2UiPgotICAgICAgICAgICAgICAgICAgPGRpcmVjdG9yeT5zcmMvbWFpbi93ZWJhcHAvPC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgIDwvZmlsZVNldD4KLSAgICAgICAgICA8L2ZpbGVTZXRzPgotICAgICAgPC9tb2R1bGU+Ci0gIDwvbW9kdWxlcz4KLQotPC9hcmNoZXR5cGUtZGVzY3JpcHRvcj4KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1qc2Zjb21wb25lbnRzL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL2NvcmUvcG9tLnhtbCBiL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWpzZmNvbXBvbmVudHMvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvY29yZS9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MGMzZjkxLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWpzZmNvbXBvbmVudHMvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvY29yZS9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjQ2ICswLDAgQEAKLSNzZXQoICRzeW1ib2xfcG91bmQgPSAnIycgKQotI3NldCggJHN5bWJvbF9kb2xsYXIgPSAnJCcgKQotI3NldCggJHN5bWJvbF9lc2NhcGUgPSAnXCcgKQotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIKLSAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgotICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLSAgICA8YXJ0aWZhY3RJZD4ke2FydGlmYWN0SWR9LWNvcmU8L2FydGlmYWN0SWQ+Ci0gICAgPHBhY2thZ2luZz5qYXI8L3BhY2thZ2luZz4KLSAgICA8bmFtZT5NeSBKU0YgQ29tcG9uZW50cyBMaWJyYXJ5PC9uYW1lPgotCi0gICAgPGRlc2NyaXB0aW9uPgotICAgICAgICBUaGlzIGlzIG15IHN1cGVyIGpzZiBjb21wb25lbnRzIGxpYnJhcnkuCi0gICAgPC9kZXNjcmlwdGlvbj4KLQotICAgIDxwYXJlbnQ+Ci0gICAgICAgIDxncm91cElkPiR7Z3JvdXBJZH08L2dyb3VwSWQ+Ci0gICAgICAgIDxhcnRpZmFjdElkPiR7YXJ0aWZhY3RJZH0tcHJvamVjdDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPHZlcnNpb24+JHt2ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICA8L3BhcmVudD4KLQotICAgIDxwcm9wZXJ0aWVzPgotICAgICAgICA8c2hvcnRuYW1lPm15Y29tcG9uZW50czwvc2hvcnRuYW1lPgotICAgIDwvcHJvcGVydGllcz4KLQotICAgIDxkZXBlbmRlbmNpZXM+Ci0KLSAgICAgICAgPCEtLSBjb21waWxlIC0tPgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPmNvbW1vbnMtbG9nZ2luZzwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmNvbW1vbnMtbG9nZ2luZzwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuMS4xPC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuY29tbW9uczwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtdmFsaWRhdG9yczEyPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+MS4wLjA8L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgCi0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmNvbW1vbnM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWNvbnZlcnRlcnMxMjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuMC4wPC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0KLSAgICAgICAgPCEtLSBwcm92aWRlZCBkZXBlbmRlbmNpZXMgLS0+Ci0KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuY29yZTwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtYXBpPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+MS4yLjEwPC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotCi0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXguc2VydmxldC5qc3A8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5qc3AtYXBpPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+Mi4xPC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotCi0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXguc2VydmxldDwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPnNlcnZsZXQtYXBpPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+Mi41PC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgIAotICAgICAgICA8IS0tIHRlc3QgZGVwZW5kZW5jaWVzIC0tPgotCi0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+anVuaXQ8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5qdW5pdDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPjMuOC4yPC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgCi0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5zaGFsZTwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPnNoYWxlLXRlc3Q8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4xLjAuNTwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PiAgICAgICAgCi0KLSAgICA8L2RlcGVuZGVuY2llcz4KLQotICAgIDxidWlsZD4KLSAgICAgICAgPHJlc291cmNlcz4KLSAgICAgICAgICAgIDxyZXNvdXJjZT4KLSAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PnNyYy9tYWluL3Jlc291cmNlczwvZGlyZWN0b3J5PgotICAgICAgICAgICAgICAgIDxleGNsdWRlcz4KLSAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+KiovKi52bTwvZXhjbHVkZT4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1ZGVzPgotICAgICAgICAgICAgPC9yZXNvdXJjZT4gICAgCi0gICAgICAgIDwvcmVzb3VyY2VzPgotICAgICAgICA8cGx1Z2lucz4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1idWlsZGVyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8dmVyc2lvbj4xLjAuNjwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KLSAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5idWlsZC1tZXRhZGF0YTwvZ29hbD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5tYWtlLWNvbXBvbmVudHM8L2dvYWw+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+bWFrZS10YWdzPC9nb2FsPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPm1ha2UtdmFsaWRhdG9yczwvZ29hbD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5tYWtlLWNvbnZlcnRlci10YWdzPC9nb2FsPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPm1ha2UtdmFsaWRhdG9yLXRhZ3M8L2dvYWw+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGpzZlZlcnNpb24+MS4yPC9qc2ZWZXJzaW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICA8aWQ+bWFrZWZhY2VzY29uZmlnPC9pZD4KLSAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgPHhtbEZpbGU+TUVUQS1JTkYvZmFjZXMtY29uZmlnLnhtbDwveG1sRmlsZT4KLSAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5tYWtlLWNvbmZpZzwvZ29hbD4KLSAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5tYWtldGxkPC9pZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4bWxGaWxlPk1FVEEtSU5GLyR7c3ltYm9sX2RvbGxhcn17c2hvcnRuYW1lfS50bGQ8L3htbEZpbGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlRmlsZT5teWNvbXBvbmVudHMudGxkLnZtPC90ZW1wbGF0ZUZpbGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmFtcz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hvcnRuYW1lPiR7c3ltYm9sX2RvbGxhcn17c2hvcnRuYW1lfTwvc2hvcnRuYW1lPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx1cmk+aHR0cDovL3d3dy5teW9yZ2FuaXR6YXRpb24ub3JnLyR7c3ltYm9sX2RvbGxhcn17c2hvcnRuYW1lfTwvdXJpPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXNwbGF5bmFtZT5DdXN0b20gdGFnIGxpYnJhcnkuPC9kaXNwbGF5bmFtZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+RW5oYW5jZWQgc3RhbmRhcmQgSlNQIGFjdGlvbnMgYW5kIGN1c3RvbSBNeUZhY2VzIGFjdGlvbnMuPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmFtcz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5tYWtlLWNvbmZpZzwvZ29hbD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICA8L3BsdWdpbnM+Ci0gICAgPC9idWlsZD4KLQotICAgIDxyZXBvcnRpbmc+Ci0gICAgICAgIDxwbHVnaW5zPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1qYXZhZG9jLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8dmVyc2lvbj4yLjQ8L3ZlcnNpb24+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLQotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tanhyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8dmVyc2lvbj4yLjE8L3ZlcnNpb24+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLQotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc3VyZWZpcmUtcmVwb3J0LXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8dmVyc2lvbj4yLjQuMzwvdmVyc2lvbj4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICA8L3BsdWdpbnM+Ci0gICAgPC9yZXBvcnRpbmc+Ci0KLSAgICA8cHJvZmlsZXM+Ci0gICAgICAgIDxwcm9maWxlPgotICAgICAgICAgICAgPGlkPmdlbmVyYXRlLXNpdGU8L2lkPgotICAgICAgICAgICAgPHJlcG9ydGluZz4KLSAgICAgICAgICAgICAgICA8cGx1Z2lucz4KLSAgICAgICAgICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm5ldC5zb3VyY2Vmb3JnZS5tYXZlbi10YWdsaWI8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi10YWdsaWItcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+Mi4zLjE8L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFnbGliLnNyYy5kaXI+JHtzeW1ib2xfZG9sbGFyfXtiYXNlZGlyfS90YXJnZXQvY2xhc3Nlcy9NRVRBLUlORjwvdGFnbGliLnNyYy5kaXI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRsZERvY0Rpcj4ke3N5bWJvbF9kb2xsYXJ9e2Jhc2VkaXJ9L3RhcmdldC9zaXRlL3RsZGRvYzwvdGxkRG9jRGlyPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgICAgICAgICA8L3BsdWdpbnM+Ci0gICAgICAgICAgICA8L3JlcG9ydGluZz4KLSAgICAgICAgPC9wcm9maWxlPgotICAgICAgICA8cHJvZmlsZT4KLSAgICAgICAgICAgIDxpZD5nZW5lcmF0ZS1hc3NlbWJseTwvaWQ+Ci0gICAgICAgICAgICA8YWN0aXZhdGlvbj4KLSAgICAgICAgICAgICAgPHByb3BlcnR5PgotICAgICAgICAgICAgICAgIDxuYW1lPnBlcmZvcm1SZWxlYXNlPC9uYW1lPgotICAgICAgICAgICAgICAgIDx2YWx1ZT50cnVlPC92YWx1ZT4KLSAgICAgICAgICAgICAgPC9wcm9wZXJ0eT4KLSAgICAgICAgICAgIDwvYWN0aXZhdGlvbj4KLSAgICAgICAgICAgIDxidWlsZD4KLSAgICAgICAgICAgICAgICA8cGx1Z2lucz4KLSAgICAgICAgICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWphdmFkb2MtcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+Mi40PC92ZXJzaW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlkPmF0dGFjaC1qYXZhZG9jPC9pZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPjxnb2FsPmphcjwvZ29hbD48L2dvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgotICAgICAgICAgICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm5ldC5zb3VyY2Vmb3JnZS5tYXZlbi10YWdsaWI8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi10YWdsaWItcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+Mi4zLjE8L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFnbGliLnNyYy5kaXI+JHtzeW1ib2xfZG9sbGFyfXtiYXNlZGlyfS90YXJnZXQvY2xhc3Nlcy9NRVRBLUlORjwvdGFnbGliLnNyYy5kaXI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRsZERvY0Rpcj4ke3N5bWJvbF9kb2xsYXJ9e2Jhc2VkaXJ9L3RhcmdldC9zaXRlL3RsZGRvYzwvdGxkRG9jRGlyPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlkPmF0dGFjaC1qYXZhZG9jPC9pZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPjxnb2FsPnRhZ2xpYmRvY2phcjwvZ29hbD48L2dvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgotICAgICAgICAgICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgICAgICAgICA8L3BsdWdpbnM+Ci0gICAgICAgICAgICA8L2J1aWxkPgotICAgICAgICA8L3Byb2ZpbGU+Ci0gICAgPC9wcm9maWxlcz4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWpzZmNvbXBvbmVudHMvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9teW9yZ2FuaXphdGlvbi9jb21wb25lbnQvc2F5aGVsbG8vQWJzdHJhY3RTYXlIZWxsby5qYXZhIGIvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtanNmY29tcG9uZW50cy9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL215b3JnYW5pemF0aW9uL2NvbXBvbmVudC9zYXloZWxsby9BYnN0cmFjdFNheUhlbGxvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxZTU2N2QuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtanNmY29tcG9uZW50cy9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL215b3JnYW5pemF0aW9uL2NvbXBvbmVudC9zYXloZWxsby9BYnN0cmFjdFNheUhlbGxvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcubXlvcmdhbml6YXRpb24uY29tcG9uZW50LnNheWhlbGxvOwotCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJT3V0cHV0OwotCi0vKioKLSAqIEBKU0ZDb21wb25lbnQKLSAqICAgbmFtZSA9ICJteWNvbXBvbmVudHM6c2F5SGVsbG8iCi0gKiAgIGNsYXNzID0gIm9yZy5teW9yZ2FuaXphdGlvbi5jb21wb25lbnQuc2F5aGVsbG8uU2F5SGVsbG8iCi0gKiAgIHRhZ0NsYXNzID0gIm9yZy5teW9yZ2FuaXphdGlvbi5jb21wb25lbnQuc2F5aGVsbG8uU2F5SGVsbG9UYWciCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFNheUhlbGxvIGV4dGVuZHMgVUlPdXRwdXQKLXsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT01QT05FTlRfVFlQRSA9ICJvcmcubXlvcmdhbml6YXRpb24uU2F5SGVsbG8iOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfUkVOREVSRVJfVFlQRSA9ICJvcmcubXlvcmdhbml6YXRpb24uU2F5SGVsbG9SZW5kZXJlciI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NUE9ORU5UX0ZBTUlMWSA9ICJqYXZheC5mYWNlcy5PdXRwdXQiOwotCi0gICAgLyoqCi0gICAgICogVXNlcidzIGZpcnN0IG5hbWUuCi0gICAgICogCi0gICAgICogQEpTRlByb3BlcnR5Ci0gICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRGaXJzdE5hbWUoKTsKLQotCi0gICAgLyoqCi0gICAgICogVXNlcidzIGxhc3QgbmFtZS4KLSAgICAgKiAKLSAgICAgKiBASlNGUHJvcGVydHkKLSAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldExhc3ROYW1lKCk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmVuZGVyZWQgcHJvcGVydHkuCi0gICAgICogCi0gICAgICogQEpTRlByb3BlcnR5Ci0gICAgICogICAgIGRlZmF1bHRWYWx1ZT0idHJ1ZSIgICAgIAotICAgICAqLwotICAgICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpc1JlbmRlcmVkKCk7ICAgICAgICAgICAgICAgICAgIAotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtanNmY29tcG9uZW50cy9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL215b3JnYW5pemF0aW9uL2NvbXBvbmVudC9zYXloZWxsby9TYXlIZWxsb1JlbmRlcmVyLmphdmEgYi9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1qc2Zjb21wb25lbnRzL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvbXlvcmdhbml6YXRpb24vY29tcG9uZW50L3NheWhlbGxvL1NheUhlbGxvUmVuZGVyZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2UxYzgzMS4uMDAwMDAwMAotLS0gYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1qc2Zjb21wb25lbnRzL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvbXlvcmdhbml6YXRpb24vY29tcG9uZW50L3NheWhlbGxvL1NheUhlbGxvUmVuZGVyZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5teW9yZ2FuaXphdGlvbi5jb21wb25lbnQuc2F5aGVsbG87Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuUmVzcG9uc2VXcml0ZXI7Ci1pbXBvcnQgamF2YXguZmFjZXMucmVuZGVyLlJlbmRlcmVyOwotCi0vKioKLSAqIEBKU0ZSZW5kZXJlcgotICogICByZW5kZXJLaXRJZCA9ICJIVE1MX0JBU0lDIiAKLSAqICAgZmFtaWx5ID0gImphdmF4LmZhY2VzLk91dHB1dCIKLSAqICAgdHlwZSA9ICJvcmcubXlvcmdhbml6YXRpb24uU2F5SGVsbG9SZW5kZXJlciIKLSAqLwotcHVibGljIGNsYXNzIFNheUhlbGxvUmVuZGVyZXIgZXh0ZW5kcyBSZW5kZXJlcgotewotCi0gICAgcHVibGljIHZvaWQgZGVjb2RlKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQotICAgIHsKLSAgICAgICAgc3VwZXIuZGVjb2RlKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQpOwotICAgICAgICAvLyBub3RoaW5nIHRvIGRlY29kZQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGVuY29kZUJlZ2luKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHN1cGVyLmVuY29kZUJlZ2luKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQpOwotICAgICAgICAvLyBubyBuZWVkIHRvIHVzZSBlbmNvZGVCZWdpbi4KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBlbmNvZGVDaGlsZHJlbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBzdXBlci5lbmNvZGVDaGlsZHJlbihmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KTsKLSAgICAgICAgLy8gdGhpcyBjb21wb25lbnQgZG9lcyBub3QgaGF2ZSBjaGlsZHJlbgotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGVuY29kZUVuZChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBzdXBlci5lbmNvZGVFbmQoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCk7Ci0KLSAgICAgICAgaWYgKCF1aUNvbXBvbmVudC5pc1JlbmRlcmVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIFJlc3BvbnNlV3JpdGVyIHdyaXRlciA9IGZhY2VzQ29udGV4dC5nZXRSZXNwb25zZVdyaXRlcigpOwotCi0gICAgICAgIFNheUhlbGxvIHNheUhlbGxvID0gKFNheUhlbGxvKSB1aUNvbXBvbmVudDsKLQotICAgICAgICBTdHJpbmcgZmlyc3ROYW1lID0gc2F5SGVsbG8uZ2V0Rmlyc3ROYW1lKCk7Ci0gICAgICAgIFN0cmluZyBsYXN0TmFtZSA9IHNheUhlbGxvLmdldExhc3ROYW1lKCk7Ci0KLSAgICAgICAgd3JpdGVyLndyaXRlKCJIZWxsbyAiKTsKLQotICAgICAgICBpZiAoZmlyc3ROYW1lICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHdyaXRlci53cml0ZShmaXJzdE5hbWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGxhc3ROYW1lICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHdyaXRlci53cml0ZSgiICIrbGFzdE5hbWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgd3JpdGVyLndyaXRlKCIhIik7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtanNmY29tcG9uZW50cy9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL215b3JnYW5pemF0aW9uL2NvbnZlcnRlci9QaG9uZU51bWJlci5qYXZhIGIvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtanNmY29tcG9uZW50cy9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL215b3JnYW5pemF0aW9uL2NvbnZlcnRlci9QaG9uZU51bWJlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMDY5MzQwLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWpzZmNvbXBvbmVudHMvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9teW9yZ2FuaXphdGlvbi9jb252ZXJ0ZXIvUGhvbmVOdW1iZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5teW9yZ2FuaXphdGlvbi5jb252ZXJ0ZXI7Ci0KLXB1YmxpYyBjbGFzcyBQaG9uZU51bWJlcgotewotICAgIHByaXZhdGUgU3RyaW5nIGFyZWFDb2RlOwotICAgIHByaXZhdGUgU3RyaW5nIG51bWJlcjsKLSAgICAKLSAgICBwdWJsaWMgUGhvbmVOdW1iZXIoU3RyaW5nIG51bWJlcikgCi0gICAgewotICAgICAgICB0aGlzLm51bWJlciA9IG51bWJlcjsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFBob25lTnVtYmVyKFN0cmluZyBhcmVhQ29kZSwgU3RyaW5nIG51bWJlcikgCi0gICAgewotICAgICAgICB0aGlzKG51bWJlcik7Ci0gICAgICAgIHRoaXMuYXJlYUNvZGUgPSBhcmVhQ29kZTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFN0cmluZyBnZXRBcmVhQ29kZSgpCi0gICAgewotICAgICAgICByZXR1cm4gYXJlYUNvZGU7Ci0gICAgfQotICAgIHB1YmxpYyB2b2lkIHNldEFyZWFDb2RlKFN0cmluZyBhcmVhQ29kZSkKLSAgICB7Ci0gICAgICAgIHRoaXMuYXJlYUNvZGUgPSBhcmVhQ29kZTsKLSAgICB9Ci0gICAgcHVibGljIFN0cmluZyBnZXROdW1iZXIoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG51bWJlcjsKLSAgICB9Ci0gICAgcHVibGljIHZvaWQgc2V0TnVtYmVyKFN0cmluZyBudW1iZXIpCi0gICAgewotICAgICAgICB0aGlzLm51bWJlciA9IG51bWJlcjsKLSAgICB9Ci0gICAgCi19CmRpZmYgLS1naXQgYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1qc2Zjb21wb25lbnRzL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvbXlvcmdhbml6YXRpb24vY29udmVydGVyL1Bob25lTnVtYmVyQ29udmVydGVyLmphdmEgYi9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1qc2Zjb21wb25lbnRzL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvbXlvcmdhbml6YXRpb24vY29udmVydGVyL1Bob25lTnVtYmVyQ29udmVydGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5ZmJmNTMuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtanNmY29tcG9uZW50cy9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL215b3JnYW5pemF0aW9uL2NvbnZlcnRlci9QaG9uZU51bWJlckNvbnZlcnRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLm15b3JnYW5pemF0aW9uLmNvbnZlcnRlcjsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb252ZXJ0LkNvbnZlcnRlcjsKLWltcG9ydCBqYXZheC5mYWNlcy5jb252ZXJ0LkNvbnZlcnRlckV4Y2VwdGlvbjsKLQotLyoqCi0gKiBASlNGQ29udmVydGVyCi0gKiAgIG5hbWUgPSAibXljb21wb25lbnRzOnBob25lTnVtYmVyQ29udmVydGVyIgotICogICB0YWdDbGFzcyA9ICJvcmcubXlvcmdhbml6YXRpb24uY29udmVydGVyLlBob25lTnVtYmVyQ29udmVydGVyVGFnIgotICovCi1wdWJsaWMgY2xhc3MgUGhvbmVOdW1iZXJDb252ZXJ0ZXIKLSAgICAgICAgaW1wbGVtZW50cyBDb252ZXJ0ZXIKLXsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05WRVJURVJfSUQgPSAiamF2YXguZmFjZXMuUGhvbmVOdW1iZXIiOwotICAgIAotICAgIHB1YmxpYyBPYmplY3QgZ2V0QXNPYmplY3QoRmFjZXNDb250ZXh0IGNvbnRleHQsIFVJQ29tcG9uZW50IGNvbXBvbmVudCwgU3RyaW5nIHZhbHVlKQotICAgICAgICAgICAgdGhyb3dzIENvbnZlcnRlckV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgU3RyaW5nIFtdIHN0clBob25lID0gdmFsdWUuc3BsaXQoIi0iKTsKLSAgICAgICAgUGhvbmVOdW1iZXIgb2JqUGhvbmUgPSBudWxsOwotICAgICAgICBpZihzdHJQaG9uZS5sZW5ndGggPT0gMikgCi0gICAgICAgIHsKLSAgICAgICAgICAgIG9ialBob25lID0gbmV3IFBob25lTnVtYmVyKHN0clBob25lWzBdLCBzdHJQaG9uZVsxXSk7Ci0gICAgICAgIH0gCi0gICAgICAgIGVsc2UgaWYoc3RyUGhvbmUubGVuZ3RoID09IDEpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG9ialBob25lID0gbmV3IFBob25lTnVtYmVyKHN0clBob25lWzBdKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIG9ialBob25lOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXNTdHJpbmcoRmFjZXNDb250ZXh0IGNvbnRleHQsIFVJQ29tcG9uZW50IGNvbXBvbmVudCwgT2JqZWN0IHZhbHVlKQotICAgICAgICAgICAgdGhyb3dzIENvbnZlcnRlckV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgaWYodmFsdWUgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgUGhvbmVOdW1iZXIgcGhvbmUgPSAoUGhvbmVOdW1iZXIpdmFsdWU7Ci0gICAgICAgICAgICByZXR1cm4gcGhvbmUuZ2V0QXJlYUNvZGUoKSArICItIiArIHBob25lLmdldE51bWJlcigpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWpzZmNvbXBvbmVudHMvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9teW9yZ2FuaXphdGlvbi92YWxpZGF0b3IvQWJzdHJhY3RPZGROdW1iZXJWYWxpZGF0b3IuamF2YSBiL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWpzZmNvbXBvbmVudHMvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9teW9yZ2FuaXphdGlvbi92YWxpZGF0b3IvQWJzdHJhY3RPZGROdW1iZXJWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2UzZmFmMS4uMDAwMDAwMAotLS0gYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1qc2Zjb21wb25lbnRzL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvbXlvcmdhbml6YXRpb24vdmFsaWRhdG9yL0Fic3RyYWN0T2RkTnVtYmVyVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcubXlvcmdhbml6YXRpb24udmFsaWRhdG9yOwotCi1pbXBvcnQgamF2YXguZmFjZXMuYXBwbGljYXRpb24uRmFjZXNNZXNzYWdlOwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsKLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yOwotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3JFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuY29tbW9ucy52YWxpZGF0b3IuVmFsaWRhdG9yQmFzZTsKLQotLyoqCi0gKiBASlNGVmFsaWRhdG9yCi0gKiAgIG5hbWUgPSAibXljb21wb25lbnRzOnZhbGlkYXRlT2RkTnVtIgotICogICBjbGFzcyA9ICJvcmcubXlvcmdhbml6YXRpb24udmFsaWRhdG9yLk9kZE51bWJlclZhbGlkYXRvciIKLSAqICAgdGFnQ2xhc3MgPSAib3JnLm15b3JnYW5pemF0aW9uLnZhbGlkYXRvci5PZGROdW1iZXJWYWxpZGF0b3JUYWciCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdE9kZE51bWJlclZhbGlkYXRvciBleHRlbmRzIFZhbGlkYXRvckJhc2UKLXsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxJREFUT1JfSUQgPSAib3JnLm15b3JnYW5pemF0aW9uLnZhbGlkYXRvci5PZGROdW1iZXJWYWxpZGF0b3IiOwotICAgIAotICAgIHB1YmxpYyB2b2lkIHZhbGlkYXRlKEZhY2VzQ29udGV4dCBhcmcwLCBVSUNvbXBvbmVudCBjb21wb25lbnQsIE9iamVjdCB2YWx1ZSkKLSAgICAgICAgICAgIHRocm93cyBWYWxpZGF0b3JFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGlmKCEodmFsdWUgaW5zdGFuY2VvZiBJbnRlZ2VyKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRvckV4Y2VwdGlvbihuZXcgRmFjZXNNZXNzYWdlKCJQbGVhc2UgZW50ZXIgYW4gaW50ZWdlci4iKSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGludCBpbnRWYWwgPSAoKEludGVnZXIpdmFsdWUpLmludFZhbHVlKCk7Ci0gICAgICAgIGlmKGludFZhbCAlIDIgPT0gMCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRvckV4Y2VwdGlvbihuZXcgRmFjZXNNZXNzYWdlKCJQbGVhc2UgZW50ZXIgYW4gb2RkIG51bWJlci4iKSk7Ci0gICAgICAgIH0KLSAgICB9ICAgIAotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtanNmY29tcG9uZW50cy9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9jb3JlL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9jb21wb25lbnRDbGFzczEyLnZtIGIvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtanNmY29tcG9uZW50cy9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9jb3JlL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9jb21wb25lbnRDbGFzczEyLnZtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MmQzOWY4Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWpzZmNvbXBvbmVudHMvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvY29yZS9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvY29tcG9uZW50Q2xhc3MxMi52bQorKysgL2Rldi9udWxsCkBAIC0xLDI1MSArMCwwIEBACi0jIyBWZWxvY2l0eSB0ZW1wbGF0ZSB1c2VkIHRvIGdlbmVyYXRlIEpTRjEuMi1jb21wYXRpYmxlIGNvbXBvbmVudCBjbGFzc2VzDQotIyMgZnJvbSBjb21wb25lbnQgbWV0YS1kYXRhLg0KLSMjDQotIyMgTm90ZSB0aGF0IHRoZXJlIGFyZSB0d28gdHlwZXMgb2YgY29tcG9uZW50IGdlbmVyYXRpb246DQotIyMgICogInN1YmNsYXNzIG1vZGUiICh1c2UgYW5ub3RhdGVkIGNsYXNzIGFzIGEgcGFyZW50IGNsYXNzKQ0KLSMjICAqICJ0ZW1wbGF0ZSBtb2RlIiAodXNlIGFubm90YXRlZCBjbGFzcyBhcyBhIHRlbXBsYXRlKQ0KLSMjIFRoaXMgdGVtcGxhdGUgZmlsZSBpcyB1c2VkIGZvciBib3RoLg0KLSMjDQotIyMgVmFyaWFibGUgJGNvbXBvbmVudCByZWZlcnMgdG8gYSBDb21wb25lbnRNZXRhIG9iamVjdCB0byBwcm9jZXNzDQotIyMgVmFyaWFibGUgJHV0aWxzIHJlZmVycyB0byBhbiBpbnN0YW5jZSBvZiBNeWZhY2VzVXRpbHMuDQotIyMNCi0jIyBXaGVuICJ0ZW1wbGF0ZSBtb2RlIiBpcyBiZWluZyB1c2VkIHRoZW4gdmFyaWFibGUgJGlubmVyc291cmNlDQotIyMgaG9sZHMgYSBTdHJpbmcgY29udGFpbmluZyBhbGwgdGhlIG5vbi1hYnN0cmFjdCBmdW5jdGlvbnMgZGVmaW5lZA0KLSMjIGluIHRoZSBhbm5vdGF0ZWQgY2xhc3MuDQotIyMNCi0jIyBUaGUgamF2YSBwYWNrYWdlIG9mIHRoZSBnZW5lcmF0ZWQgY2xhc3MgaXMgYWx3YXlzIHRoZSBzYW1lIGFzDQotIyMgdGhlIHBhY2thZ2UgaW4gd2hpY2ggdGhlIGFubm90YXRlZCBjbGFzcyBleGlzdHMuDQotIyMNCi0vKg0KLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICogDQotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqIA0KLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqICB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlICR7Y29tcG9uZW50LnBhY2thZ2VOYW1lfTsNCi0NCi1pbXBvcnQgamF2YXguZWwuVmFsdWVFeHByZXNzaW9uOw0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi0kdXRpbHMuaW1wb3J0VGFnQ2xhc3NlcygkY29tcG9uZW50KQ0KLQ0KLSNpZiAoJGNvbXBvbmVudC5pc1RlbXBsYXRlKCkpDQotI3NldCAoJGdlbmVyYXRlZENsYXNzUGFyZW50ID0gJGNvbXBvbmVudC5zb3VyY2VDbGFzc1BhcmVudENsYXNzTmFtZSkNCi0jZWxzZQ0KLSNzZXQgKCRnZW5lcmF0ZWRDbGFzc1BhcmVudCA9ICRjb21wb25lbnQuc291cmNlQ2xhc3NOYW1lKQ0KLSNlbmQNCi0vLyBHZW5lcmF0ZWQgZnJvbSBjbGFzcyAke2NvbXBvbmVudC5zb3VyY2VDbGFzc05hbWV9Lg0KLS8vDQotLy8gV0FSTklORzogVGhpcyBmaWxlIHdhcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZC4gRG8gbm90IGVkaXQgaXQgZGlyZWN0bHksDQotLy8gICAgICAgICAgb3IgeW91IHdpbGwgbG9zZSB5b3VyIGNoYW5nZXMuDQotcHVibGljIGNsYXNzICR7dXRpbHMuZ2V0Q2xhc3NGcm9tRnVsbENsYXNzKCRjb21wb25lbnQuY2xhc3NOYW1lKX0gZXh0ZW5kcyAkZ2VuZXJhdGVkQ2xhc3NQYXJlbnQNCi0jaWYgKCRjb21wb25lbnQuaW1wbGVtZW50cykNCi0gICAgaW1wbGVtZW50cyAkY29tcG9uZW50LmltcGxlbWVudHMNCi0jZW5kDQotew0KLSNpZiAoJGNvbXBvbmVudC5zZXJpYWx1aWQpDQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9ICR7Y29tcG9uZW50LnNlcmlhbHVpZH07IA0KLSNlbmQgIA0KLQ0KLSAgICBzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBDT01QT05FTlRfRkFNSUxZID0NCi0gICAgICAgICIkY29tcG9uZW50LmZhbWlseSI7DQotICAgIHN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIENPTVBPTkVOVF9UWVBFID0NCi0gICAgICAgICIkY29tcG9uZW50LnR5cGUiOw0KLSNpZiAoJGNvbXBvbmVudC5yZW5kZXJlclR5cGUpDQotI2lmICghKCRjb21wb25lbnQucmVuZGVyZXJUeXBlID09ICIiKSkNCi0gICAgc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9SRU5ERVJFUl9UWVBFID0gDQotICAgICAgICAiJGNvbXBvbmVudC5yZW5kZXJlclR5cGUiOw0KLSNlbmQNCi0jZW5kDQotDQotI2lmICgkaW5uZXJzb3VyY2UpDQotICAgIC8vQkVHSU4gQ09ERSBDT1BJRUQgRlJPTSAkY29tcG9uZW50LnNvdXJjZUNsYXNzTmFtZSANCi0kaW5uZXJzb3VyY2UNCi0gICAgLy9FTkQgQ09ERSBDT1BJRUQgRlJPTSAkY29tcG9uZW50LnNvdXJjZUNsYXNzTmFtZQ0KLSNlbmQNCi0NCi0gICAgcHVibGljICR7dXRpbHMuZ2V0Q2xhc3NGcm9tRnVsbENsYXNzKCRjb21wb25lbnQuY2xhc3NOYW1lKX0oKQ0KLSAgICB7DQotI2lmICgkY29tcG9uZW50LnJlbmRlcmVyVHlwZSkNCi0jaWYgKCRjb21wb25lbnQucmVuZGVyZXJUeXBlID09ICIiKQ0KLSAgICAgICAgc2V0UmVuZGVyZXJUeXBlKG51bGwpOw0KLSNlbHNlDQotICAgICAgICBzZXRSZW5kZXJlclR5cGUoIiRjb21wb25lbnQucmVuZGVyZXJUeXBlIik7DQotI2VuZA0KLSNlbHNlDQotICAgICAgICBzZXRSZW5kZXJlclR5cGUobnVsbCk7DQotI2VuZA0KLSAgICB9DQotDQotIyMgT24gbXlmYWNlcyAxLjEgdGhlIGZhbWlseSBpcyBpbmhlcml0ZWQsIHNvIHRoaXMgY291bGQgYmUgY29tbWVudGVkDQotIyMgT24gb3RoZXIgdGhpcyBzaG91bGQgbm90IGJlIGNvbW1lbnRlZCAgICANCi0gICAgcHVibGljIFN0cmluZyBnZXRGYW1pbHkoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gQ09NUE9ORU5UX0ZBTUlMWTsNCi0gICAgfQ0KLSAgICANCi0jc2V0ICgkcHJvcGVydHlMaXN0ID0gJHtjb21wb25lbnQucHJvcGVydHlDb21wb25lbnRMaXN0fSkNCi0NCi0jZm9yZWFjaCggJHByb3BlcnR5IGluICRwcm9wZXJ0eUxpc3QgKQ0KLSNzZXQgKCRmaWVsZCA9ICRwcm9wZXJ0eS5maWVsZE5hbWUpDQotI3NldCAoJHR5cGUgPSAkdXRpbHMuZ2V0Q2xhc3NGcm9tRnVsbENsYXNzKCRwcm9wZXJ0eS5jbGFzc05hbWUpKQ0KLSNpZigkdXRpbHMuZ2V0RGVmYXVsdFZhbHVlRmllbGQoJHByb3BlcnR5KSkgDQotI3NldCAoJGRlZmF1bHRWYWx1ZSA9ICR1dGlscy5nZXREZWZhdWx0VmFsdWVGaWVsZCgkcHJvcGVydHkpKQ0KLSNlbHNlDQotI3NldCAoJGRlZmF1bHRWYWx1ZSA9IGZhbHNlKQ0KLSNlbmQNCi0gICAgLy8gUHJvcGVydHk6ICRwcm9wZXJ0eS5uYW1lDQotI2lmICgkcHJvcGVydHkuaXNMaXRlcmFsT25seSgpIHx8ICRwcm9wZXJ0eS5pc1RhZ0V4Y2x1ZGVkKCkgKQ0KLSAgICBwcml2YXRlICR0eXBlICRmaWVsZCAjaWYoJGRlZmF1bHRWYWx1ZSkgPSAkZGVmYXVsdFZhbHVlOyN7ZWxzZX07I3tlbmR9DQotDQotICAgICANCi0jZWxzZQ0KLSAgICBwcml2YXRlICR0eXBlICRmaWVsZDsNCi0gICAgDQotI2VuZA0KLSNpZigkdXRpbHMuaXNQcmltaXRpdmVDbGFzcygkdHlwZSkgJiYgISRwcm9wZXJ0eS5pc1RhZ0V4Y2x1ZGVkKCkgKQ0KLSAgICBwcml2YXRlIGJvb2xlYW4gJHtmaWVsZH1TZXQ7DQotICAgIA0KLSNpZiAoJHByb3BlcnR5LmlzU2V0TWV0aG9kKCkpDQotICAgICRwcm9wZXJ0eS5zZXRNZXRob2RTY29wZSBib29sZWFuICR1dGlscy5nZXRQcmVmaXhlZFByb3BlcnR5TmFtZSgiaXNTZXQiLCAkcHJvcGVydHkubmFtZSkoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gJHtmaWVsZH1TZXQ7DQotICAgIH0NCi0jZW5kDQotI2VuZA0KLSNpZigkcHJvcGVydHkuaXNMb2NhbE1ldGhvZCgpKQ0KLSNpZigiYm9vbGVhbiIgPT0gJHR5cGUpDQotI3NldCAoJG1ldGhvZE5hbWUgPSAkdXRpbHMuZ2V0UHJlZml4ZWRQcm9wZXJ0eU5hbWUoImlzTG9jYWwiLCAkcHJvcGVydHkubmFtZSkpDQotI2Vsc2UNCi0jc2V0ICgkbWV0aG9kTmFtZSA9ICR1dGlscy5nZXRQcmVmaXhlZFByb3BlcnR5TmFtZSgiZ2V0TG9jYWwiLCAkcHJvcGVydHkubmFtZSkpDQotI2VuZA0KLSAgICBmaW5hbCAkcHJvcGVydHkubG9jYWxNZXRob2RTY29wZSAkdHlwZSAke21ldGhvZE5hbWV9KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuICRmaWVsZDsNCi0gICAgfQ0KLSAgICAgDQotI2VuZA0KLSAgICBwdWJsaWMgJHR5cGUgJHV0aWxzLmdldE1ldGhvZFJlYWRlckZyb21Qcm9wZXJ0eSgkcHJvcGVydHkubmFtZSwgJHR5cGUpKCkNCi0gICAgew0KLSNpZiAoJHByb3BlcnR5LmlzVGFnRXhjbHVkZWQoKSB8fCAkcHJvcGVydHkuaXNMaXRlcmFsT25seSgpKQ0KLSAgICAgICAgcmV0dXJuICRmaWVsZDsNCi0jZWxzZQ0KLSNpZiAoJHV0aWxzLmlzUHJpbWl0aXZlQ2xhc3MoJHR5cGUpKQ0KLSAgICAgICAgaWYgKCR7ZmllbGR9U2V0KQ0KLSNlbHNlDQotICAgICAgICBpZiAoJGZpZWxkICE9IG51bGwpDQotI2VuZA0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiAkZmllbGQ7DQotICAgICAgICB9DQotICAgICAgICBWYWx1ZUV4cHJlc3Npb24gdmIgPSBnZXRWYWx1ZUV4cHJlc3Npb24oIiRwcm9wZXJ0eS5uYW1lIik7DQotICAgICAgICBpZiAodmIgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0jaWYgKCR1dGlscy5pc1ByaW1pdGl2ZUNsYXNzKCR0eXBlKSkNCi0gICAgICAgICAgICByZXR1cm4gKCR1dGlscy5jYXN0SWZOZWNlc3NhcnkoJHR5cGUpIHZiLmdldFZhbHVlKGdldEZhY2VzQ29udGV4dCgpLmdldEVMQ29udGV4dCgpKSkuJHt0eXBlfVZhbHVlKCk7DQotI2Vsc2UNCi0jc2V0ICgkcHJpdHlwZSA9ICR1dGlscy5nZXRQcmltaXRpdmVUeXBlKCRwcm9wZXJ0eS5jbGFzc05hbWUpKQ0KLSNpZiAoJHV0aWxzLmlzUHJpbWl0aXZlQ2xhc3MoJHByaXR5cGUpKQ0KLSAgICAgICAgICAgIE9iamVjdCB2YWx1ZSA9IHZiID09IG51bGwgPyBudWxsIDogdmIuZ2V0VmFsdWUoZ2V0RmFjZXNDb250ZXh0KCkuZ2V0RUxDb250ZXh0KCkpOw0KLSAgICAgICAgICAgIGlmICghKHZhbHVlIGluc3RhbmNlb2YgJHR5cGUpKXsNCi0gICAgICAgICAgICAgICAgdmFsdWUgPSAke3R5cGV9LnZhbHVlT2YodmFsdWUudG9TdHJpbmcoKSk7DQotICAgICAgICAgICAgfSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIHJldHVybiAkdXRpbHMuY2FzdElmTmVjZXNzYXJ5KCR0eXBlKSB2YWx1ZTsNCi0jZWxzZQ0KLSAgICAgICAgICAgIHJldHVybiAkdXRpbHMuY2FzdElmTmVjZXNzYXJ5KCR0eXBlKSB2Yi5nZXRWYWx1ZShnZXRGYWNlc0NvbnRleHQoKS5nZXRFTENvbnRleHQoKSk7DQotI2VuZA0KLSNlbmQNCi0gICAgICAgIH0NCi0jaWYgKCRkZWZhdWx0VmFsdWUpDQotICAgICAgICByZXR1cm4gJGRlZmF1bHRWYWx1ZTsgDQotI2Vsc2VpZiAoJHV0aWxzLmlzUHJpbWl0aXZlQ2xhc3MoJHR5cGUpKQ0KLSAgICAgICAgcmV0dXJuICR1dGlscy5wcmltaXRpdmVEZWZhdWx0VmFsdWUoJHR5cGUpOw0KLSNlbHNlICAgICAgIA0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotI2VuZA0KLSNlbmQNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCAkdXRpbHMuZ2V0UHJlZml4ZWRQcm9wZXJ0eU5hbWUoInNldCIsICRwcm9wZXJ0eS5uYW1lKSgkdHlwZSAkdXRpbHMuZ2V0VmFyaWFibGVGcm9tTmFtZSgkcHJvcGVydHkubmFtZSkpDQotICAgIHsNCi0gICAgICAgIHRoaXMuJGZpZWxkID0gJHV0aWxzLmdldFZhcmlhYmxlRnJvbU5hbWUoJHByb3BlcnR5Lm5hbWUpOw0KLSNpZiAoJHV0aWxzLmlzUHJpbWl0aXZlQ2xhc3MoJHR5cGUpICYmICEkcHJvcGVydHkuaXNUYWdFeGNsdWRlZCgpICkNCi0gICAgICAgIHRoaXMuJHtmaWVsZH1TZXQgPSB0cnVlOyAgICAgICAgDQotI2VuZA0KLSAgICB9DQotI2VuZA0KLQ0KLSAgICBwdWJsaWMgT2JqZWN0IHNhdmVTdGF0ZShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0KQ0KLSAgICB7DQotI3NldCAoJHByaW1pdGl2ZUNvdW50ID0gJHByb3BlcnR5TGlzdC5zaXplKCkgKyAxKQ0KLSNmb3JlYWNoKCAkcHJvcGVydHkgaW4gJHByb3BlcnR5TGlzdCApDQotI2lmKCR1dGlscy5pc1ByaW1pdGl2ZUNsYXNzKCRwcm9wZXJ0eS5jbGFzc05hbWUpKQ0KLSNzZXQgKCRwcmltaXRpdmVDb3VudCA9ICRwcmltaXRpdmVDb3VudCArIDEpDQotI2VuZA0KLSNlbmQNCi0gICAgICAgIE9iamVjdFtdIHZhbHVlcyA9IG5ldyBPYmplY3RbJHByaW1pdGl2ZUNvdW50XTsNCi0gICAgICAgIHZhbHVlc1swXSA9IHN1cGVyLnNhdmVTdGF0ZShmYWNlc0NvbnRleHQpOw0KLSNzZXQgKCRhcnJheUluZGV4ID0gMCkNCi0jZm9yZWFjaCggJHByb3BlcnR5IGluICRwcm9wZXJ0eUxpc3QgKQ0KLSNzZXQgKCRmaWVsZCA9ICRwcm9wZXJ0eS5maWVsZE5hbWUpDQotI3NldCAoJHR5cGUgPSAkcHJvcGVydHkuY2xhc3NOYW1lKQ0KLSNzZXQgKCRhcnJheUluZGV4ID0gJGFycmF5SW5kZXggKyAxKQ0KLSNpZiAoJHByb3BlcnR5LmpzcE5hbWUgPT0gInZhbGlkYXRvciIgJiYgJHByb3BlcnR5LmlzTWV0aG9kQmluZGluZygpICkNCi0gICAgICAgIHZhbHVlc1skYXJyYXlJbmRleF0gPSBzYXZlQXR0YWNoZWRTdGF0ZShmYWNlc0NvbnRleHQsJHtmaWVsZH1MaXN0KTsNCi0jZWxzZWlmICggJHByb3BlcnR5LmlzU3RhdGVIb2xkZXIoKSApIyMgfHwgJHV0aWxzLmlzQ29udmVydGVyKCR0eXBlKQ0KLSAgICAgICAgdmFsdWVzWyRhcnJheUluZGV4XSA9IHNhdmVBdHRhY2hlZFN0YXRlKGZhY2VzQ29udGV4dCwkZmllbGQpOw0KLSNlbHNlaWYoJHV0aWxzLmlzUHJpbWl0aXZlQ2xhc3MoJHR5cGUpKQ0KLSAgICAgICAgdmFsdWVzWyRhcnJheUluZGV4XSA9ICR7dXRpbHMuZ2V0Qm94ZWRDbGFzcygkdHlwZSl9LnZhbHVlT2YoJGZpZWxkKTsNCi0jZWxzZQ0KLSAgICAgICAgdmFsdWVzWyRhcnJheUluZGV4XSA9ICRmaWVsZDsNCi0jZW5kDQotI2lmKCR1dGlscy5pc1ByaW1pdGl2ZUNsYXNzKCR0eXBlKSAmJiAhJHByb3BlcnR5LmlzVGFnRXhjbHVkZWQoKSkNCi0jc2V0ICgkYXJyYXlJbmRleCA9ICRhcnJheUluZGV4ICsgMSkNCi0gICAgICAgIHZhbHVlc1skYXJyYXlJbmRleF0gPSBCb29sZWFuLnZhbHVlT2YoJHtmaWVsZH1TZXQpOw0KLSNlbmQNCi0jZW5kDQotICAgICAgICByZXR1cm4gdmFsdWVzOyANCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCByZXN0b3JlU3RhdGUoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgT2JqZWN0IHN0YXRlKQ0KLSAgICB7DQotICAgICAgICBPYmplY3RbXSB2YWx1ZXMgPSAoT2JqZWN0W10pc3RhdGU7DQotICAgICAgICBzdXBlci5yZXN0b3JlU3RhdGUoZmFjZXNDb250ZXh0LHZhbHVlc1swXSk7DQotI3NldCAoJGFycmF5SW5kZXggPSAwKQ0KLSNmb3JlYWNoKCAkcHJvcGVydHkgaW4gJHByb3BlcnR5TGlzdCApDQotI3NldCAoJGZpZWxkID0gJHByb3BlcnR5LmZpZWxkTmFtZSkNCi0jc2V0ICgkdHlwZSA9ICRwcm9wZXJ0eS5jbGFzc05hbWUpDQotI3NldCAoJGFycmF5SW5kZXggPSAkYXJyYXlJbmRleCArIDEpDQotI2lmICggJHByb3BlcnR5LmlzU3RhdGVIb2xkZXIoKSApDQotI2lmICgkcHJvcGVydHkuanNwTmFtZSA9PSAidmFsaWRhdG9yIiAmJiAkcHJvcGVydHkuaXNNZXRob2RCaW5kaW5nKCkgKQ0KLSAgICAgICAgJHtmaWVsZH1MaXN0ID0gKExpc3Q8VmFsaWRhdG9yPikgcmVzdG9yZUF0dGFjaGVkU3RhdGUoZmFjZXNDb250ZXh0LHZhbHVlc1skYXJyYXlJbmRleF0pOw0KLSNlbHNlaWYgKCR1dGlscy5pc0xpc3QoJHR5cGUpKQ0KLSAgICAgICAgJGZpZWxkID0gKExpc3QpIHJlc3RvcmVBdHRhY2hlZFN0YXRlKGZhY2VzQ29udGV4dCx2YWx1ZXNbJGFycmF5SW5kZXhdKTsNCi0jZWxzZQ0KLSAgICAgICAgJGZpZWxkID0gJHV0aWxzLmNhc3RJZk5lY2Vzc2FyeSgkdHlwZSkgcmVzdG9yZUF0dGFjaGVkU3RhdGUoZmFjZXNDb250ZXh0LHZhbHVlc1skYXJyYXlJbmRleF0pOyANCi0jZW5kDQotI2Vsc2VpZiAoJHV0aWxzLmlzQ29udmVydGVyKCR0eXBlKSkgDQotICAgICAgICAkZmllbGQgPSAoQ29udmVydGVyKSByZXN0b3JlQXR0YWNoZWRTdGF0ZShmYWNlc0NvbnRleHQsdmFsdWVzWyRhcnJheUluZGV4XSk7DQotI2Vsc2VpZiAoJHV0aWxzLmlzUHJpbWl0aXZlQ2xhc3MoJHR5cGUpKQ0KLSAgICAgICAgJGZpZWxkID0gKCR1dGlscy5jYXN0SWZOZWNlc3NhcnkoJHR5cGUpIHZhbHVlc1skYXJyYXlJbmRleF0pLiR7dHlwZX1WYWx1ZSgpOw0KLSNlbHNlDQotICAgICAgICAkZmllbGQgPSAkdXRpbHMuY2FzdElmTmVjZXNzYXJ5KCR0eXBlKSB2YWx1ZXNbJGFycmF5SW5kZXhdOw0KLSNlbmQNCi0jaWYoJHV0aWxzLmlzUHJpbWl0aXZlQ2xhc3MoJHR5cGUpICYmICEkcHJvcGVydHkuaXNUYWdFeGNsdWRlZCgpICkNCi0jc2V0ICgkYXJyYXlJbmRleCA9ICRhcnJheUluZGV4ICsgMSkNCi0gICAgICAgICR7ZmllbGR9U2V0ID0gKChCb29sZWFuKSB2YWx1ZXNbJGFycmF5SW5kZXhdKS5ib29sZWFuVmFsdWUoKTsNCi0jZW5kDQotI2VuZA0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWpzZmNvbXBvbmVudHMvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvY29yZS9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvbXljb21wb25lbnRzLnRhZ2xpYi54bWwgYi9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1qc2Zjb21wb25lbnRzL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL2NvcmUvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL215Y29tcG9uZW50cy50YWdsaWIueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTNlMzQxLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWpzZmNvbXBvbmVudHMvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvY29yZS9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvbXljb21wb25lbnRzLnRhZ2xpYi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhLS0KLSAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gICAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gICAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gICAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICAgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICAgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICAgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgICB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPCFET0NUWVBFIGZhY2VsZXQtdGFnbGliIFBVQkxJQwotICAiLS8vU3VuIE1pY3Jvc3lzdGVtcywgSW5jLi8vRFREIEZhY2VsZXQgVGFnbGliIDEuMC8vRU4iCi0gICJodHRwOi8vamF2YS5zdW4uY29tL2R0ZC9mYWNlbGV0LXRhZ2xpYl8xXzAuZHRkIj4KLTxmYWNlbGV0LXRhZ2xpYj4KLQk8bmFtZXNwYWNlPmh0dHA6Ly93d3cubXlvcmdhbml0emF0aW9uLm9yZy9teWNvbXBvbmVudHM8L25hbWVzcGFjZT4KLQkKLQk8dGFnPgotCQk8dGFnLW5hbWU+c2F5SGVsbG88L3RhZy1uYW1lPgotCQk8Y29tcG9uZW50PgotCQkJPGNvbXBvbmVudC10eXBlPm9yZy5teW9yZ2FuaXphdGlvbi5TYXlIZWxsbzwvY29tcG9uZW50LXR5cGU+Ci0JCQk8cmVuZGVyZXItdHlwZT5vcmcubXlvcmdhbml6YXRpb24uU2F5SGVsbG9SZW5kZXJlcjwvcmVuZGVyZXItdHlwZT4KLQkJPC9jb21wb25lbnQ+Ci0JPC90YWc+Ci08L2ZhY2VsZXQtdGFnbGliPiAKZGlmZiAtLWdpdCBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWpzZmNvbXBvbmVudHMvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvY29yZS9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvbXljb21wb25lbnRzLnRsZC52bSBiL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWpzZmNvbXBvbmVudHMvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvY29yZS9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvbXljb21wb25lbnRzLnRsZC52bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGVmZjlkNi4uMDAwMDAwMAotLS0gYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1qc2Zjb21wb25lbnRzL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL2NvcmUvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL215Y29tcG9uZW50cy50bGQudm0KKysrIC9kZXYvbnVsbApAQCAtMSwyMjUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi08dGFnbGliIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiIA0KLSAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgDQotICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS93ZWItanNwdGFnbGlicmFyeV8yXzEueHNkIiANCi0gICAgICAgIHZlcnNpb249IjIuMSI+DQotICA8dGxpYi12ZXJzaW9uPjEuMS43PC90bGliLXZlcnNpb24+DQotICAgPHNob3J0LW5hbWU+JHNob3J0bmFtZTwvc2hvcnQtbmFtZT4NCi0gICA8dXJpPiR1cmk8L3VyaT4NCi0gICA8ZGlzcGxheS1uYW1lPiRkaXNwbGF5bmFtZTwvZGlzcGxheS1uYW1lPg0KLSAgIDxkZXNjcmlwdGlvbj4kZGVzY3JpcHRpb248L2Rlc2NyaXB0aW9uPg0KLQ0KLSRiYXNlQ29udGVudA0KLQ0KLSAgICA8IS0tIENvbXBvbmVudCBUYWdzIC0tPg0KLSNzZXQgKCRjb21wb25lbnRMaXN0ID0gJHttb2RlbC5nZXRDb21wb25lbnRzKCl9KQ0KLSNmb3JlYWNoKCAkY29tcG9uZW50IGluICRjb21wb25lbnRMaXN0ICkNCi0jaWYgKCRtb2RlbElkcy5jb250YWlucygkY29tcG9uZW50Lm1vZGVsSWQpIA0KLSAgICAmJiAoJGNvbXBvbmVudC5uYW1lKSkNCi0jaWYgKCR1dGlscy5nZXRUYWdQcmVmaXgoJGNvbXBvbmVudC5uYW1lKSA9PSAkc2hvcnRuYW1lKSANCi0gICA8dGFnPg0KLSAgICAgIDxuYW1lPiR1dGlscy5nZXRUYWdOYW1lKCRjb21wb25lbnQubmFtZSk8L25hbWU+DQotICAgICAgPHRhZy1jbGFzcz4kY29tcG9uZW50LnRhZ0NsYXNzPC90YWctY2xhc3M+DQotI2lmICgkY29tcG9uZW50LmJvZHlDb250ZW50KQ0KLSAgICAgIDxib2R5LWNvbnRlbnQ+JGNvbXBvbmVudC5ib2R5Q29udGVudDwvYm9keS1jb250ZW50Pg0KLSNlbHNlDQotICAgICAgPGJvZHktY29udGVudD5KU1A8L2JvZHktY29udGVudD4NCi0jZW5kDQotICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWyRjb21wb25lbnQubG9uZ0Rlc2NyaXB0aW9uXV0+PC9kZXNjcmlwdGlvbj4NCi0gICAgICANCi0jc2V0ICgkcHJvcGVydHlMaXN0ID0gJHtjb21wb25lbnQucHJvcGVydHlMaXN0fSkNCi0jZm9yZWFjaCggJHByb3BlcnR5IGluICRwcm9wZXJ0eUxpc3QgKQ0KLSNpZiAoISRwcm9wZXJ0eS5pc1RhZ0V4Y2x1ZGVkKCkpDQotICAgICAgPGF0dHJpYnV0ZT4NCi0gICAgICAgICA8bmFtZT4kcHJvcGVydHkuanNwTmFtZTwvbmFtZT4NCi0jaWYgKCRwcm9wZXJ0eS5pc1JlcXVpcmVkKCkpDQotICAgICAgICAgPHJlcXVpcmVkPiRwcm9wZXJ0eS5pc1JlcXVpcmVkKCk8L3JlcXVpcmVkPg0KLSNlbmQNCi0jaWYgKCRwcm9wZXJ0eS5pc01ldGhvZEV4cHJlc3Npb24oKSB8fCAkcHJvcGVydHkuaXNNZXRob2RCaW5kaW5nKCkpDQotI2lmICgkcHJvcGVydHkuZ2V0TWV0aG9kQmluZGluZ1NpZ25hdHVyZSgpKQ0KLSAgICAgICAgPGRlZmVycmVkLW1ldGhvZD4NCi0jc2V0ICgkc2lnID0gJHByb3BlcnR5LmdldE1ldGhvZEJpbmRpbmdTaWduYXR1cmUoKSkNCi0gICAgICAgICAgICA8bWV0aG9kLXNpZ25hdHVyZT4kc2lnLnJldHVyblR5cGUgbXlNZXRob2QoICRzaWcucGFyYW1ldGVyVHlwZXNBc1N0cmluZyApPC9tZXRob2Qtc2lnbmF0dXJlPg0KLQ0KLSAgICAgICAgPC9kZWZlcnJlZC1tZXRob2Q+DQotI2Vsc2UNCi0jIyBUaGlzIGlzIGEgdmVyeSBzcGVjaWFsIGNhc2UuIElmIGEgcHJvcGVydHkgaXMgTWV0aG9kQmluZGluZyBvciBNZXRob2RFeHByZXNzaW9uDQotIyMgdGhpcyBzaG91bGQgaGF2ZSBhIHNpZ25hdHVyZS4gSWYgbm90LCBmb3IgYWxsb3cgbXVsdGlwbGUgTWV0aG9kQmluZGluZw0KLSMjIHNpbXVsYXRlIGEgVmFsdWVFeHByZXNzaW9uIGFuZCB3cml0ZSBhIGN1c3RvbSBjb2RlIGxpa2UgaW4gDQotIyMgb3JnLmFwYWNoZS5teWZhY2VzLmN1c3RvbS5zdWdnZXN0YWpheC5BYnN0cmFjdFN1Z2dlc3RBamF4VGFnDQotICAgICAgICAgPGRlZmVycmVkLXZhbHVlLz4NCi0jZW5kDQotI2Vsc2VpZiAoJHByb3BlcnR5LmlzTGl0ZXJhbE9ubHkoKSkNCi0gICAgICAgICA8cnRleHBydmFsdWU+ZmFsc2U8L3J0ZXhwcnZhbHVlPg0KLSNlbHNlDQotI3NldCAoJHR5cGUgPSAkdXRpbHMuZ2V0Q2xhc3NGcm9tRnVsbENsYXNzKCRwcm9wZXJ0eS5jbGFzc05hbWUpKQ0KLSNpZiAoJHR5cGUgPT0gIlN0cmluZyIpDQotICAgICAgICAgPGRlZmVycmVkLXZhbHVlPjwvZGVmZXJyZWQtdmFsdWU+DQotI2Vsc2UNCi0gICAgICAgICA8ZGVmZXJyZWQtdmFsdWU+DQotICAgICAgICAgICAgIDx0eXBlPiRwcm9wZXJ0eS5jbGFzc05hbWU8L3R5cGU+DQotICAgICAgICAgPC9kZWZlcnJlZC12YWx1ZT4NCi0jZW5kDQotI2VuZA0KLSNpZiAoJHByb3BlcnR5LmxvbmdEZXNjcmlwdGlvbikNCi0gICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbJHByb3BlcnR5LmxvbmdEZXNjcmlwdGlvbl1dPjwvZGVzY3JpcHRpb24+DQotI2Vsc2UNCi0gICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbXV0+PC9kZXNjcmlwdGlvbj4NCi0jZW5kDQotICAgICAgPC9hdHRyaWJ1dGU+DQotI2VuZA0KLSNlbmQNCi0gICA8L3RhZz4NCi0jZW5kDQotI2VuZA0KLSNlbmQNCi0gICA8IS0tIENvbnZlcnRlciB0YWdzIC0tPg0KLSNzZXQgKCRjb21wb25lbnRMaXN0ID0gJHttb2RlbC5nZXRDb252ZXJ0ZXJzKCl9KQ0KLSNmb3JlYWNoKCAkY29tcG9uZW50IGluICRjb21wb25lbnRMaXN0ICkNCi0jaWYgKCRtb2RlbElkcy5jb250YWlucygkY29tcG9uZW50Lm1vZGVsSWQpIA0KLSAgICAmJiAoJGNvbXBvbmVudC5uYW1lKSkNCi0jaWYgKCR1dGlscy5nZXRUYWdQcmVmaXgoJGNvbXBvbmVudC5uYW1lKSA9PSAkc2hvcnRuYW1lKSANCi0gICA8dGFnPg0KLSAgICAgIDxuYW1lPiR1dGlscy5nZXRUYWdOYW1lKCRjb21wb25lbnQubmFtZSk8L25hbWU+DQotICAgICAgPHRhZy1jbGFzcz4kY29tcG9uZW50LnRhZ0NsYXNzPC90YWctY2xhc3M+DQotI2lmICgkY29tcG9uZW50LmJvZHlDb250ZW50KQ0KLSAgICAgIDxib2R5LWNvbnRlbnQ+JGNvbXBvbmVudC5ib2R5Q29udGVudDwvYm9keS1jb250ZW50Pg0KLSNlbHNlDQotICAgICAgPGJvZHktY29udGVudD5lbXB0eTwvYm9keS1jb250ZW50Pg0KLSNlbmQNCi0gICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbJGNvbXBvbmVudC5sb25nRGVzY3JpcHRpb25dXT48L2Rlc2NyaXB0aW9uPg0KLSAgICAgIA0KLSNzZXQgKCRwcm9wZXJ0eUxpc3QgPSAke2NvbXBvbmVudC5wcm9wZXJ0eUxpc3R9KQ0KLSNmb3JlYWNoKCAkcHJvcGVydHkgaW4gJHByb3BlcnR5TGlzdCApDQotI2lmICghJHByb3BlcnR5LmlzVGFnRXhjbHVkZWQoKSkNCi0gICAgICA8YXR0cmlidXRlPg0KLSAgICAgICAgIDxuYW1lPiRwcm9wZXJ0eS5uYW1lPC9uYW1lPg0KLSNpZiAoJHByb3BlcnR5LmlzUmVxdWlyZWQoKSkNCi0gICAgICAgICA8cmVxdWlyZWQ+JHByb3BlcnR5LmlzUmVxdWlyZWQoKTwvcmVxdWlyZWQ+DQotI2VuZA0KLSNpZiAoJHByb3BlcnR5LmlzTGl0ZXJhbE9ubHkoKSkNCi0gICAgICAgICA8cnRleHBydmFsdWU+ZmFsc2U8L3J0ZXhwcnZhbHVlPg0KLSNlbHNlDQotI3NldCAoJHR5cGUgPSAkdXRpbHMuZ2V0Q2xhc3NGcm9tRnVsbENsYXNzKCRwcm9wZXJ0eS5jbGFzc05hbWUpKQ0KLSNpZiAoJHR5cGUgPT0gIlN0cmluZyIpDQotICAgICAgICAgPGRlZmVycmVkLXZhbHVlPjwvZGVmZXJyZWQtdmFsdWU+DQotI2Vsc2UNCi0gICAgICAgICA8ZGVmZXJyZWQtdmFsdWU+DQotICAgICAgICAgICAgIDx0eXBlPiRwcm9wZXJ0eS5jbGFzc05hbWU8L3R5cGU+DQotICAgICAgICAgPC9kZWZlcnJlZC12YWx1ZT4NCi0jZW5kDQotI2VuZA0KLSNpZiAoJHByb3BlcnR5LmxvbmdEZXNjcmlwdGlvbikNCi0gICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbJHByb3BlcnR5LmxvbmdEZXNjcmlwdGlvbl1dPjwvZGVzY3JpcHRpb24+DQotI2Vsc2UNCi0gICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbXV0+PC9kZXNjcmlwdGlvbj4NCi0jZW5kDQotICAgICAgPC9hdHRyaWJ1dGU+DQotI2VuZA0KLSNlbmQNCi0gICA8L3RhZz4NCi0jZW5kDQotI2VuZA0KLSNlbmQNCi0gICA8IS0tIFZhbGlkYXRvciB0YWdzIC0tPg0KLSNzZXQgKCRjb21wb25lbnRMaXN0ID0gJHttb2RlbC5nZXRWYWxpZGF0b3JzKCl9KQ0KLSNmb3JlYWNoKCAkY29tcG9uZW50IGluICRjb21wb25lbnRMaXN0ICkNCi0jaWYgKCRtb2RlbElkcy5jb250YWlucygkY29tcG9uZW50Lm1vZGVsSWQpIA0KLSAgICAmJiAoJGNvbXBvbmVudC5uYW1lKSkNCi0jaWYgKCR1dGlscy5nZXRUYWdQcmVmaXgoJGNvbXBvbmVudC5uYW1lKSA9PSAkc2hvcnRuYW1lKSANCi0gICA8dGFnPg0KLSAgICAgIDxuYW1lPiR1dGlscy5nZXRUYWdOYW1lKCRjb21wb25lbnQubmFtZSk8L25hbWU+DQotICAgICAgPHRhZy1jbGFzcz4kY29tcG9uZW50LnRhZ0NsYXNzPC90YWctY2xhc3M+DQotI2lmICgkY29tcG9uZW50LmJvZHlDb250ZW50KQ0KLSAgICAgIDxib2R5LWNvbnRlbnQ+JGNvbXBvbmVudC5ib2R5Q29udGVudDwvYm9keS1jb250ZW50Pg0KLSNlbHNlDQotICAgICAgPGJvZHktY29udGVudD5lbXB0eTwvYm9keS1jb250ZW50Pg0KLSNlbmQNCi0gICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbJGNvbXBvbmVudC5sb25nRGVzY3JpcHRpb25dXT48L2Rlc2NyaXB0aW9uPg0KLSAgICAgIA0KLSNzZXQgKCRwcm9wZXJ0eUxpc3QgPSAke2NvbXBvbmVudC5wcm9wZXJ0eUxpc3R9KQ0KLSNmb3JlYWNoKCAkcHJvcGVydHkgaW4gJHByb3BlcnR5TGlzdCApDQotI2lmICghJHByb3BlcnR5LmlzVGFnRXhjbHVkZWQoKSkNCi0gICAgICA8YXR0cmlidXRlPg0KLSAgICAgICAgIDxuYW1lPiRwcm9wZXJ0eS5uYW1lPC9uYW1lPg0KLSNpZiAoJHByb3BlcnR5LmlzUmVxdWlyZWQoKSkNCi0gICAgICAgICA8cmVxdWlyZWQ+JHByb3BlcnR5LmlzUmVxdWlyZWQoKTwvcmVxdWlyZWQ+DQotI2VuZA0KLSNpZiAoJHByb3BlcnR5LmlzTGl0ZXJhbE9ubHkoKSkNCi0gICAgICAgICA8cnRleHBydmFsdWU+ZmFsc2U8L3J0ZXhwcnZhbHVlPg0KLSNlbHNlDQotI3NldCAoJHR5cGUgPSAkdXRpbHMuZ2V0Q2xhc3NGcm9tRnVsbENsYXNzKCRwcm9wZXJ0eS5jbGFzc05hbWUpKQ0KLSNpZiAoJHR5cGUgPT0gIlN0cmluZyIpDQotICAgICAgICAgPGRlZmVycmVkLXZhbHVlPjwvZGVmZXJyZWQtdmFsdWU+DQotI2Vsc2UNCi0gICAgICAgICA8ZGVmZXJyZWQtdmFsdWU+DQotICAgICAgICAgICAgIDx0eXBlPiRwcm9wZXJ0eS5jbGFzc05hbWU8L3R5cGU+DQotICAgICAgICAgPC9kZWZlcnJlZC12YWx1ZT4NCi0jZW5kDQotI2VuZA0KLSNpZiAoJHByb3BlcnR5LmxvbmdEZXNjcmlwdGlvbikNCi0gICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbJHByb3BlcnR5LmxvbmdEZXNjcmlwdGlvbl1dPjwvZGVzY3JpcHRpb24+DQotI2Vsc2UNCi0gICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbXV0+PC9kZXNjcmlwdGlvbj4NCi0jZW5kDQotICAgICAgPC9hdHRyaWJ1dGU+DQotI2VuZA0KLSNlbmQNCi0gICA8L3RhZz4NCi0jZW5kDQotI2VuZA0KLSNlbmQNCi0gICA8IS0tIFNpbmdsZSBUYWdzIC0tPg0KLSNzZXQgKCR0YWdMaXN0ID0gJG1vZGVsLmdldFRhZ3MoKSkNCi0jZm9yZWFjaCggJHRhZyBpbiAkdGFnTGlzdCApDQotI2lmICgkbW9kZWxJZHMuY29udGFpbnMoJHRhZy5tb2RlbElkKSkNCi0gICA8dGFnPg0KLSAgICAgIDxuYW1lPiR1dGlscy5nZXRUYWdOYW1lKCR0YWcubmFtZSk8L25hbWU+DQotICAgICAgPHRhZy1jbGFzcz4kdGFnLmNsYXNzTmFtZTwvdGFnLWNsYXNzPg0KLSAgICAgIDxib2R5LWNvbnRlbnQ+JHRhZy5ib2R5Q29udGVudDwvYm9keS1jb250ZW50Pg0KLSAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVskdGFnLmxvbmdEZXNjcmlwdGlvbl1dPjwvZGVzY3JpcHRpb24+DQotI3NldCAoJGF0dHJpYnV0ZUxpc3QgPSAke3RhZy5hdHRyaWJ1dGVMaXN0fSkNCi0jZm9yZWFjaCggJGF0dHJpYnV0ZSBpbiAkYXR0cmlidXRlTGlzdCApDQotICAgICAgPGF0dHJpYnV0ZT4NCi0gICAgICAgICA8bmFtZT4kYXR0cmlidXRlLm5hbWU8L25hbWU+DQotICAgICAgICAgPHJlcXVpcmVkPiRhdHRyaWJ1dGUuaXNSZXF1aXJlZCgpPC9yZXF1aXJlZD4NCi0jc2V0ICgkdHlwZSA9ICR1dGlscy5nZXRDbGFzc0Zyb21GdWxsQ2xhc3MoJGF0dHJpYnV0ZS5jbGFzc05hbWUpKQ0KLSNpZiAoJHR5cGUgPT0gIlZhbHVlRXhwcmVzc2lvbiIpDQotICAgICAgICAgPGRlZmVycmVkLXZhbHVlPjwvZGVmZXJyZWQtdmFsdWU+DQotI2Vsc2UNCi0gICAgICAgICA8cnRleHBydmFsdWU+JGF0dHJpYnV0ZS5pc1J0ZXhwcnZhbHVlKCk8L3J0ZXhwcnZhbHVlPg0KLSNpZiAoJGF0dHJpYnV0ZS5jbGFzc05hbWUpICAgICAgICAgDQotICAgICAgICAgPHR5cGU+JGF0dHJpYnV0ZS5jbGFzc05hbWU8L3R5cGU+DQotI2Vsc2UNCi0gICAgICAgICA8dHlwZT5qYXZhLmxhbmcuU3RyaW5nPC90eXBlPg0KLSNlbmQNCi0jZW5kDQotI2lmICgkcHJvcGVydHkubG9uZ0Rlc2NyaXB0aW9uKQ0KLSAgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVskcHJvcGVydHkubG9uZ0Rlc2NyaXB0aW9uXV0+PC9kZXNjcmlwdGlvbj4NCi0jZWxzZQ0KLSAgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVtdXT48L2Rlc2NyaXB0aW9uPg0KLSNlbmQNCi0gICAgICA8L2F0dHJpYnV0ZT4NCi0jZW5kDQotICAgPC90YWc+DQotI2VuZA0KLSNlbmQNCi08L3RhZ2xpYj4NCmRpZmYgLS1naXQgYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1qc2Zjb21wb25lbnRzL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL2NvcmUvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL3RhZ0NsYXNzMTIudm0gYi9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1qc2Zjb21wb25lbnRzL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL2NvcmUvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL3RhZ0NsYXNzMTIudm0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5NTgwZTEuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtanNmY29tcG9uZW50cy9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9jb3JlL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi90YWdDbGFzczEyLnZtCisrKyAvZGV2L251bGwKQEAgLTEsMTcwICswLDAgQEAKLS8vIFdBUk5JTkc6IFRoaXMgZmlsZSB3YXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQuIERvIG5vdCBlZGl0IGl0IGRpcmVjdGx5LA0KLS8vICAgICAgICAgIG9yIHlvdSB3aWxsIGxvc2UgeW91ciBjaGFuZ2VzLg0KLS8qDQotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKiANCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICogDQotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2UgJHtjb21wb25lbnQudGFnUGFja2FnZX07DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZWwuVmFsdWVFeHByZXNzaW9uOw0KLWltcG9ydCBqYXZheC5lbC5NZXRob2RFeHByZXNzaW9uOw0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi0kdXRpbHMuaW1wb3J0VGFnQ2xhc3NlczEyKCRjb21wb25lbnQpDQotDQotcHVibGljIGNsYXNzICR1dGlscy5nZXRDbGFzc0Zyb21GdWxsQ2xhc3MoJGNvbXBvbmVudC50YWdDbGFzcykNCi0jaWYgKCR7Y29tcG9uZW50LnRhZ1N1cGVyY2xhc3N9KQ0KLSAgICBleHRlbmRzICR7Y29tcG9uZW50LnRhZ1N1cGVyY2xhc3N9DQotI2Vsc2UNCi0gICAgZXh0ZW5kcyBqYXZheC5mYWNlcy53ZWJhcHAuVUlDb21wb25lbnRUYWcNCi0jZW5kDQotew0KLSAgICBwdWJsaWMgJHV0aWxzLmdldENsYXNzRnJvbUZ1bGxDbGFzcygkY29tcG9uZW50LnRhZ0NsYXNzKSgpDQotICAgIHsgICAgDQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29tcG9uZW50VHlwZSgpDQotICAgIHsNCi0jaWYgKCRjb21wb25lbnQudHlwZSkNCi0gICAgICAgIHJldHVybiAiJGNvbXBvbmVudC50eXBlIjsNCi0jZWxzZQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotI2VuZA0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVuZGVyZXJUeXBlKCkNCi0gICAgew0KLSNpZiAoJGNvbXBvbmVudC5yZW5kZXJlclR5cGUgJiYgISgkY29tcG9uZW50LnJlbmRlcmVyVHlwZSA9PSAiIikpDQotICAgICAgICByZXR1cm4gIiRjb21wb25lbnQucmVuZGVyZXJUeXBlIjsNCi0jZWxzZQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotI2VuZA0KLSAgICB9DQotDQotI3NldCAoJHByb3BlcnR5TGlzdCA9ICR7Y29tcG9uZW50LnByb3BlcnR5VGFnTGlzdH0pDQotI2ZvcmVhY2goICRwcm9wZXJ0eSBpbiAkcHJvcGVydHlMaXN0ICkNCi0jc2V0ICgkZmllbGQgPSAkcHJvcGVydHkuZmllbGROYW1lKQ0KLSNzZXQgKCR0eXBlID0gJHV0aWxzLmdldEpzcFByb3BlcnR5VHlwZTEyKCRwcm9wZXJ0eSkpDQotIA0KLSAgICBwcml2YXRlICR0eXBlICRmaWVsZDsNCi0gICAgDQotI3NldCAoJHZhciA9ICR1dGlscy5nZXRWYXJpYWJsZUZyb21OYW1lKCRwcm9wZXJ0eS5uYW1lKSkNCi0gICAgcHVibGljIHZvaWQgJHV0aWxzLmdldFByZWZpeGVkUHJvcGVydHlOYW1lKCJzZXQiLCAkcHJvcGVydHkuanNwTmFtZSkoJHR5cGUgJHZhcikNCi0gICAgew0KLSAgICAgICAgJGZpZWxkID0gJHZhcjsNCi0gICAgfQ0KLSNlbmQNCi0NCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0UHJvcGVydGllcyhVSUNvbXBvbmVudCBjb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIGlmICghKGNvbXBvbmVudCBpbnN0YW5jZW9mICRjb21wb25lbnQuY2xhc3NOYW1lKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJDb21wb25lbnQgIisNCi0gICAgICAgICAgICAgICAgY29tcG9uZW50LmdldENsYXNzKCkuZ2V0TmFtZSgpICsiIGlzIG5vICRjb21wb25lbnQuY2xhc3NOYW1lIik7DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgICAgICRjb21wb25lbnQuY2xhc3NOYW1lIGNvbXAgPSAoJGNvbXBvbmVudC5jbGFzc05hbWUpIGNvbXBvbmVudDsNCi0gICAgICAgIA0KLSAgICAgICAgc3VwZXIuc2V0UHJvcGVydGllcyhjb21wb25lbnQpOw0KLSAgICAgICAgDQotICAgICAgICBGYWNlc0NvbnRleHQgY29udGV4dCA9IGdldEZhY2VzQ29udGV4dCgpOw0KLQ0KLSNmb3JlYWNoKCAkcHJvcGVydHkgaW4gJHByb3BlcnR5TGlzdCApIyMgICAgICAgICAgICAxDQotI3NldCAoJGZpZWxkID0gJHByb3BlcnR5LmZpZWxkTmFtZSkNCi0jc2V0ICgkdHlwZSA9ICR1dGlscy5nZXRKc3BQcm9wZXJ0eVR5cGUxMigkcHJvcGVydHkpKQ0KLSNpZiAoJHV0aWxzLmlzQ29udmVydGVyKCRwcm9wZXJ0eS5jbGFzc05hbWUpKSMjICAgICAgICAgICAgICAgICAgIDINCi0gICAgICAgIGlmICgkZmllbGQgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAoISR7ZmllbGR9LmlzTGl0ZXJhbFRleHQoKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGNvbXAuc2V0VmFsdWVFeHByZXNzaW9uKCIkcHJvcGVydHkubmFtZSIsICRmaWVsZCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIFN0cmluZyBzID0gJHtmaWVsZH0uZ2V0RXhwcmVzc2lvblN0cmluZygpOw0KLSAgICAgICAgICAgICAgICBpZiAocyAhPSBudWxsKQ0KLSAgICAgICAgICAgICAgICB7ICAgICAgICAgICAgDQotICAgICAgICAgICAgICAgICAgICBDb252ZXJ0ZXIgY29udmVydGVyID0gZ2V0RmFjZXNDb250ZXh0KCkuZ2V0QXBwbGljYXRpb24oKS5jcmVhdGVDb252ZXJ0ZXIocyk7DQotICAgICAgICAgICAgICAgICAgICBjb21wLnNldENvbnZlcnRlcihjb252ZXJ0ZXIpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSNlbHNlaWYgKCRwcm9wZXJ0eS5pc01ldGhvZEJpbmRpbmcoKSkjIyAgICAgICAgICAgICAgICAgMg0KLSAgICAgICAgaWYgKCRmaWVsZCAhPSBudWxsKQ0KLSAgICAgICAgew0KLSNpZiAoJHByb3BlcnR5LmpzcE5hbWUgPT0gImFjdGlvbkxpc3RlbmVyIikNCi0gICAgICAgICAgICBjb21wLmFkZEFjdGlvbkxpc3RlbmVyKG5ldyBNZXRob2RFeHByZXNzaW9uQWN0aW9uTGlzdGVuZXIoJGZpZWxkKSk7DQotI2Vsc2VpZiAoJHByb3BlcnR5LmpzcE5hbWUgPT0gInZhbHVlQ2hhbmdlTGlzdGVuZXIiKQ0KLSAgICAgICAgICAgIGNvbXAuYWRkVmFsdWVDaGFuZ2VMaXN0ZW5lcihuZXcgTWV0aG9kRXhwcmVzc2lvblZhbHVlQ2hhbmdlTGlzdGVuZXIoJGZpZWxkKSk7DQotI2Vsc2VpZiAoJHByb3BlcnR5LmpzcE5hbWUgPT0gInZhbGlkYXRvciIpDQotICAgICAgICAgICAgY29tcC5hZGRWYWxpZGF0b3IobmV3IE1ldGhvZEV4cHJlc3Npb25WYWxpZGF0b3IoJGZpZWxkKSk7DQotI2Vsc2VpZiAoJHV0aWxzLmlzU3RyaW5nTWV0aG9kQmluZGluZ1JldHVyblR5cGUoJHByb3BlcnR5Lm1ldGhvZEJpbmRpbmdTaWduYXR1cmUpKSMjMw0KLSAgICAgICAgICAgIE1ldGhvZEJpbmRpbmcgbWI7DQotICAgICAgICAgICAgaWYgKGlzVmFsdWVSZWZlcmVuY2UoJGZpZWxkKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIG1iID0gY29udGV4dC5nZXRBcHBsaWNhdGlvbigpLmNyZWF0ZU1ldGhvZEJpbmRpbmcoDQotICAgICAgICAgICAgICAgICAgICAkZmllbGQsICR1dGlscy5nZXRTaWduYXR1cmVQYXJhbXMoJHByb3BlcnR5Lm1ldGhvZEJpbmRpbmdTaWduYXR1cmUpKTsgICAgICAgICAgICANCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZWxzZQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiSW52YWxpZCBleHByZXNzaW9uICIgKyAkZmllbGQpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBjb21wLiR7dXRpbHMuZ2V0UHJlZml4ZWRQcm9wZXJ0eU5hbWUoInNldCIsJHByb3BlcnR5Lm5hbWUpfShtYik7DQotI2Vsc2UjIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzDQotICAgICAgICAgICAgTWV0aG9kQmluZGluZyBtYiA9IGNvbnRleHQuZ2V0QXBwbGljYXRpb24oKS5jcmVhdGVNZXRob2RCaW5kaW5nKA0KLSAgICAgICAgICAgICAgICAkZmllbGQsICR1dGlscy5nZXRTaWduYXR1cmVQYXJhbXMoJHByb3BlcnR5Lm1ldGhvZEJpbmRpbmdTaWduYXR1cmUpKTsNCi0gICAgICAgICAgICBjb21wLiR7dXRpbHMuZ2V0UHJlZml4ZWRQcm9wZXJ0eU5hbWUoInNldCIsJHByb3BlcnR5Lm5hbWUpfShtYik7DQotI2VuZCMjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzDQotICAgICAgICB9DQotI2Vsc2VpZiAoJHByb3BlcnR5LmlzTWV0aG9kRXhwcmVzc2lvbigpKSMjICAgICAgICAgICAgMg0KLSAgICAgICAgaWYgKCRmaWVsZCAhPSBudWxsKQ0KLSAgICAgICAgew0KLSNpZiAoJHByb3BlcnR5LmpzcE5hbWUgPT0gImFjdGlvbiIpDQotICAgICAgICAgICAgY29tcC5zZXRBY3Rpb25FeHByZXNzaW9uKCRmaWVsZCk7DQotI2Vsc2VpZiAoJHByb3BlcnR5LmpzcE5hbWUgPT0gImFjdGlvbkxpc3RlbmVyIikNCi0gICAgICAgICAgICBjb21wLmFkZEFjdGlvbkxpc3RlbmVyKG5ldyBNZXRob2RFeHByZXNzaW9uQWN0aW9uTGlzdGVuZXIoJGZpZWxkKSk7DQotI2Vsc2UNCi0gICAgICAgICAgICBjb21wLiR7dXRpbHMuZ2V0UHJlZml4ZWRQcm9wZXJ0eU5hbWUoInNldCIsJHByb3BlcnR5Lm5hbWUpfSgkZmllbGQpOw0KLSNlbmQgICAgICAgIA0KLSAgICAgICAgfSAgICAgICAgDQotI2Vsc2UjIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMg0KLSAgICAgICAgaWYgKCRmaWVsZCAhPSBudWxsKQ0KLSAgICAgICAgew0KLSNpZiAoJHByb3BlcnR5LmlzTGl0ZXJhbE9ubHkoKSkjIyAgICAgICAgICAgICAgICAgICAgICAgICAzDQotICAgICAgICAgICAgY29tcC5nZXRBdHRyaWJ1dGVzKCkucHV0KCIkcHJvcGVydHkubmFtZSIsICRmaWVsZCk7DQotI2Vsc2UjIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzDQotICAgICAgICAgICAgY29tcC5zZXRWYWx1ZUV4cHJlc3Npb24oIiRwcm9wZXJ0eS5uYW1lIiwgJGZpZWxkKTsNCi0jZW5kIyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMNCi0gICAgICAgIH0gDQotI2VuZCMjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMg0KLSNlbmQjIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxDQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgcmVsZWFzZSgpDQotICAgIHsNCi0gICAgICAgIHN1cGVyLnJlbGVhc2UoKTsNCi0jZm9yZWFjaCggJHByb3BlcnR5IGluICRwcm9wZXJ0eUxpc3QgKQ0KLSNzZXQgKCRmaWVsZCA9ICRwcm9wZXJ0eS5maWVsZE5hbWUpDQotI2lmKCR1dGlscy5nZXRKc3BQcm9wZXJ0eVR5cGUxMigkcHJvcGVydHkpID09ICJib29sZWFuIikNCi0jc2V0ICgkZW1wdHkgPSAiZmFsc2UiKQ0KLSNlbHNlDQotI3NldCAoJGVtcHR5ID0gIm51bGwiKQ0KLSNlbmQNCi0gICAgICAgICRmaWVsZCA9ICRlbXB0eTsNCi0jZW5kDQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtanNmY29tcG9uZW50cy9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9jb3JlL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi90YWdDb252ZXJ0ZXJDbGFzczEyLnZtIGIvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtanNmY29tcG9uZW50cy9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9jb3JlL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi90YWdDb252ZXJ0ZXJDbGFzczEyLnZtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYmYxNzA1Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWpzZmNvbXBvbmVudHMvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvY29yZS9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvdGFnQ29udmVydGVyQ2xhc3MxMi52bQorKysgL2Rldi9udWxsCkBAIC0xLDE2NyArMCwwIEBACi0vLyBXQVJOSU5HOiBUaGlzIGZpbGUgd2FzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkLiBEbyBub3QgZWRpdCBpdCBkaXJlY3RseSwNCi0vLyAgICAgICAgICBvciB5b3Ugd2lsbCBsb3NlIHlvdXIgY2hhbmdlcy4NCi0vKg0KLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICogDQotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqIA0KLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqICB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlICR1dGlscy5nZXRQYWNrYWdlRnJvbUZ1bGxDbGFzcygkY29udmVydGVyLnRhZ0NsYXNzKTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmF4LmVsLkVMQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udmVydC5Db252ZXJ0ZXI7DQotaW1wb3J0IGphdmF4LmVsLlZhbHVlRXhwcmVzc2lvbjsNCi1pbXBvcnQgamF2YXguZmFjZXMud2ViYXBwLlVJQ29tcG9uZW50VGFnOw0KLWltcG9ydCBqYXZheC5zZXJ2bGV0LmpzcC5Kc3BFeGNlcHRpb247DQotaW1wb3J0IGphdmF4LnNlcnZsZXQuanNwLlBhZ2VDb250ZXh0Ow0KLSR1dGlscy5pbXBvcnRUYWdDbGFzc2VzKCRjb252ZXJ0ZXIpDQotDQotcHVibGljIGNsYXNzICR1dGlscy5nZXRDbGFzc0Zyb21GdWxsQ2xhc3MoJGNvbnZlcnRlci50YWdDbGFzcykNCi0jaWYgKCR7Y29udmVydGVyLnRhZ1N1cGVyY2xhc3N9KQ0KLSAgICBleHRlbmRzICR7Y29udmVydGVyLnRhZ1N1cGVyY2xhc3N9DQotI2Vsc2UNCi0gICAgZXh0ZW5kcyBvcmcuYXBhY2hlLm15ZmFjZXMuY29tbW9ucy5jb252ZXJ0ZXIuQ29udmVydGVyVGFnDQotI2VuZA0KLXsNCi0jaWYgKCRjb252ZXJ0ZXIuc2VyaWFsdWlkdGFnKQ0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAke2NvbnZlcnRlci5zZXJpYWx1aWR0YWd9OyANCi0jZW5kICANCi0NCi0gICAgcHVibGljICR1dGlscy5nZXRDbGFzc0Zyb21GdWxsQ2xhc3MoJGNvbnZlcnRlci50YWdDbGFzcykoKQ0KLSAgICB7DQotICAgICAgICBzZXRDb252ZXJ0ZXJJZFN0cmluZygiJGNvbnZlcnRlci5jb252ZXJ0ZXJJZCIpOw0KLSAgICB9DQotI3NldCAoJHByb3BlcnR5TGlzdCA9ICR7Y29udmVydGVyLnByb3BlcnR5VGFnTGlzdH0pDQotI2ZvcmVhY2goICRwcm9wZXJ0eSBpbiAkcHJvcGVydHlMaXN0ICkNCi0jc2V0ICgkZmllbGQgPSAkcHJvcGVydHkuZmllbGROYW1lKQ0KLSNzZXQgKCR0eXBlID0gJHV0aWxzLmdldEpzcFByb3BlcnR5VHlwZTEyKCRwcm9wZXJ0eSkpDQotIA0KLSAgICBwcml2YXRlICR0eXBlICRmaWVsZDsNCi0gICAgDQotI3NldCAoJHZhciA9ICR1dGlscy5nZXRWYXJpYWJsZUZyb21OYW1lKCRwcm9wZXJ0eS5uYW1lKSkNCi0gICAgcHVibGljIHZvaWQgJHV0aWxzLmdldFByZWZpeGVkUHJvcGVydHlOYW1lKCJzZXQiLCAkcHJvcGVydHkuanNwTmFtZSkoJHR5cGUgJHZhcikNCi0gICAgew0KLSAgICAgICAgJGZpZWxkID0gJHZhcjsNCi0gICAgfQ0KLSNlbmQNCi0NCi0gICAgcHVibGljIHZvaWQgc2V0UGFnZUNvbnRleHQoUGFnZUNvbnRleHQgY29udGV4dCkgew0KLSAgICAgICAgc3VwZXIuc2V0UGFnZUNvbnRleHQoY29udGV4dCk7DQotICAgICAgICBzZXRDb252ZXJ0ZXJJZFN0cmluZygiJGNvbnZlcnRlci5jb252ZXJ0ZXJJZCIpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBDb252ZXJ0ZXIgY3JlYXRlQ29udmVydGVyKCkgdGhyb3dzIEpzcEV4Y2VwdGlvbiB7DQotICAgIA0KLSAgICAgICAgRUxDb250ZXh0IGVsQ29udGV4dCA9IEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5nZXRFTENvbnRleHQoKTsgICAgICAgICAgICANCi0gICAgICAgICRjb252ZXJ0ZXIuY2xhc3NOYW1lIGNvbnZlcnRlciA9ICgkY29udmVydGVyLmNsYXNzTmFtZSlzdXBlci5jcmVhdGVDb252ZXJ0ZXIoKTsNCi0jZm9yZWFjaCggJHByb3BlcnR5IGluICRwcm9wZXJ0eUxpc3QgKQ0KLSNzZXQgKCRmaWVsZCA9ICRwcm9wZXJ0eS5maWVsZE5hbWUpDQotI3NldCAoJHR5cGUgPSAkdXRpbHMuZ2V0SnNwUHJvcGVydHlUeXBlMTIoJHByb3BlcnR5KSkNCi0jc2V0ICgkY2xhc3NOYW1lID0gJHV0aWxzLmdldFByaW1pdGl2ZVR5cGUoJHByb3BlcnR5LmNsYXNzTmFtZSkpDQotICAgICAgICBpZiAoJGZpZWxkICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKCR7ZmllbGR9LmlzTGl0ZXJhbFRleHQoKSkNCi0gICAgICAgICAgICB7DQotI2lmICgkdXRpbHMuaXNQcmltaXRpdmVDbGFzcygkcHJvcGVydHkuY2xhc3NOYW1lKSkNCi0gICAgICAgICAgICAgICAgU3RyaW5nICR7ZmllbGR9VmFsdWUgPSAke2ZpZWxkfS5nZXRFeHByZXNzaW9uU3RyaW5nKCk7DQotICAgICAgICAgICAgICAgIGlmICgke2ZpZWxkfVZhbHVlICE9IG51bGwpDQotICAgICAgICAgICAgICAgICAgICBjb252ZXJ0ZXIuJHt1dGlscy5nZXRQcmVmaXhlZFByb3BlcnR5TmFtZSgic2V0IiwkcHJvcGVydHkubmFtZSl9KCR7dXRpbHMuZ2V0Qm94ZWRDbGFzcygkY2xhc3NOYW1lKX0udmFsdWVPZigke2ZpZWxkfVZhbHVlKS4ke3Byb3BlcnR5LmNsYXNzTmFtZX1WYWx1ZSgpKTsNCi0jZWxzZWlmICgkdXRpbHMuaXNQcmltaXRpdmVDbGFzcygkY2xhc3NOYW1lKSkNCi0gICAgICAgICAgICAgICAgU3RyaW5nICR7ZmllbGR9VmFsdWUgPSAke2ZpZWxkfS5nZXRFeHByZXNzaW9uU3RyaW5nKCk7DQotICAgICAgICAgICAgICAgIGlmICgke2ZpZWxkfVZhbHVlICE9IG51bGwpDQotICAgICAgICAgICAgICAgICAgICBjb252ZXJ0ZXIuJHt1dGlscy5nZXRQcmVmaXhlZFByb3BlcnR5TmFtZSgic2V0IiwkcHJvcGVydHkubmFtZSl9KCR7dXRpbHMuZ2V0Qm94ZWRDbGFzcygkY2xhc3NOYW1lKX0udmFsdWVPZigke2ZpZWxkfVZhbHVlKSk7DQotICAgICAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICAgICAgICAgIGNvbnZlcnRlci4ke3V0aWxzLmdldFByZWZpeGVkUHJvcGVydHlOYW1lKCJzZXQiLCRwcm9wZXJ0eS5uYW1lKX0obnVsbCk7DQotI2Vsc2VpZiAoJHV0aWxzLmdldENsYXNzRnJvbUZ1bGxDbGFzcygkcHJvcGVydHkuY2xhc3NOYW1lKSA9PSAiU3RyaW5nIikNCi0gICAgICAgICAgICAgICAgY29udmVydGVyLiR7dXRpbHMuZ2V0UHJlZml4ZWRQcm9wZXJ0eU5hbWUoInNldCIsJHByb3BlcnR5Lm5hbWUpfSgke2ZpZWxkfS5nZXRFeHByZXNzaW9uU3RyaW5nKCkpOw0KLSNlbHNlaWYgKCR1dGlscy5nZXRDbGFzc0Zyb21GdWxsQ2xhc3MoJHByb3BlcnR5LmNsYXNzTmFtZSkgPT0gIk9iamVjdCIpDQotICAgICAgICAgICAgICAgIGNvbnZlcnRlci4ke3V0aWxzLmdldFByZWZpeGVkUHJvcGVydHlOYW1lKCJzZXQiLCRwcm9wZXJ0eS5uYW1lKX0oJHtmaWVsZH0uZ2V0RXhwcmVzc2lvblN0cmluZygpKTsNCi0jZWxzZWlmICgkdXRpbHMuZ2V0Q2xhc3NGcm9tRnVsbENsYXNzKCRwcm9wZXJ0eS5jbGFzc05hbWUpID09ICJMb2NhbGUiKQ0KLSAgICAgICAgICAgICAgICBjb252ZXJ0ZXIuJHt1dGlscy5nZXRQcmVmaXhlZFByb3BlcnR5TmFtZSgic2V0IiwkcHJvcGVydHkubmFtZSl9KA0KLSAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5teWZhY2VzLnNoYXJlZF90b21haGF3ay51dGlsLkxvY2FsZVV0aWxzLmNvbnZlcnRlclRhZ0xvY2FsZUZyb21TdHJpbmcoJHtmaWVsZH0uZ2V0RXhwcmVzc2lvblN0cmluZygpKSk7DQotI2Vsc2VpZiAoJHV0aWxzLmdldENsYXNzRnJvbUZ1bGxDbGFzcygkcHJvcGVydHkuY2xhc3NOYW1lKSA9PSAiQ2xhc3MiKQ0KLSAgICAgICAgICAgICAgICB0cnkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgY29udmVydGVyLiR7dXRpbHMuZ2V0UHJlZml4ZWRQcm9wZXJ0eU5hbWUoInNldCIsJHByb3BlcnR5Lm5hbWUpfSgNCi0gICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUubXlmYWNlcy5zaGFyZWRfdG9tYWhhd2sudXRpbC5DbGFzc1V0aWxzLmNsYXNzRm9yTmFtZSgke2ZpZWxkfS5nZXRFeHByZXNzaW9uU3RyaW5nKCkpKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSnNwRXhjZXB0aW9uKGUpOw0KLSAgICAgICAgICAgICAgICB9DQotI2Vsc2VpZiAoJHV0aWxzLmdldENsYXNzRnJvbUZ1bGxDbGFzcygkcHJvcGVydHkuY2xhc3NOYW1lKSA9PSAiVGltZVpvbmUiKQ0KLSAgICAgICAgICAgICAgICBjb252ZXJ0ZXIuJHt1dGlscy5nZXRQcmVmaXhlZFByb3BlcnR5TmFtZSgic2V0IiwkcHJvcGVydHkubmFtZSl9KA0KLSAgICAgICAgICAgICAgICAgICAgamF2YS51dGlsLlRpbWVab25lLmdldFRpbWVab25lKCR7ZmllbGR9LmdldEV4cHJlc3Npb25TdHJpbmcoKSkpOyAgICAgICAgICAgICAgICANCi0jZWxzZQ0KLSAgICAgICAgICAgICAgICBjb252ZXJ0ZXIuJHt1dGlscy5nZXRQcmVmaXhlZFByb3BlcnR5TmFtZSgic2V0IiwkcHJvcGVydHkubmFtZSl9KCgkcHJvcGVydHkuY2xhc3NOYW1lKSAke2ZpZWxkfS5nZXRWYWx1ZShlbENvbnRleHQpKTsNCi0jZW5kDQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICB7DQotI2lmICgkdXRpbHMuaXNQcmltaXRpdmVDbGFzcygkcHJvcGVydHkuY2xhc3NOYW1lKSkNCi0gICAgICAgICAgICAgICAgT2JqZWN0ICR7ZmllbGR9VmFsdWUgPSAke2ZpZWxkfS5nZXRWYWx1ZShlbENvbnRleHQpOw0KLSAgICAgICAgICAgICAgICBpZiAoJHtmaWVsZH1WYWx1ZSAhPSBudWxsKQ0KLSAgICAgICAgICAgICAgICAgICAgY29udmVydGVyLiR7dXRpbHMuZ2V0UHJlZml4ZWRQcm9wZXJ0eU5hbWUoInNldCIsJHByb3BlcnR5Lm5hbWUpfSggKCgke3V0aWxzLmdldEJveGVkQ2xhc3MoJGNsYXNzTmFtZSl9KSAke2ZpZWxkfVZhbHVlICkuJHtwcm9wZXJ0eS5jbGFzc05hbWV9VmFsdWUoKSk7DQotI2Vsc2VpZiAoJHV0aWxzLmlzUHJpbWl0aXZlQ2xhc3MoJGNsYXNzTmFtZSkpDQotICAgICAgICAgICAgICAgIGNvbnZlcnRlci4ke3V0aWxzLmdldFByZWZpeGVkUHJvcGVydHlOYW1lKCJzZXQiLCRwcm9wZXJ0eS5uYW1lKX0oICgke3V0aWxzLmdldEJveGVkQ2xhc3MoJGNsYXNzTmFtZSl9KSAke2ZpZWxkfS5nZXRWYWx1ZShlbENvbnRleHQpICk7DQotI2Vsc2VpZiAoJHV0aWxzLmdldENsYXNzRnJvbUZ1bGxDbGFzcygkcHJvcGVydHkuY2xhc3NOYW1lKSA9PSAiTG9jYWxlIikNCi0gICAgICAgICAgICAgICAgT2JqZWN0ICR7ZmllbGR9VmFsdWUgPSAke2ZpZWxkfS5nZXRWYWx1ZShlbENvbnRleHQpOw0KLSAgICAgICAgICAgICAgICBpZiAoJHtmaWVsZH1WYWx1ZSA9PSBudWxsKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAke2ZpZWxkfVZhbHVlID0gRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLmdldFZpZXdSb290KCkuZ2V0TG9jYWxlKCk7ICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGlmKCEoJHtmaWVsZH1WYWx1ZSBpbnN0YW5jZW9mIGphdmEudXRpbC5Mb2NhbGUpKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAke2ZpZWxkfVZhbHVlID0gb3JnLmFwYWNoZS5teWZhY2VzLnNoYXJlZF90b21haGF3ay51dGlsLkxvY2FsZVV0aWxzLmNvbnZlcnRlclRhZ0xvY2FsZUZyb21TdHJpbmcoJHtmaWVsZH0uZ2V0RXhwcmVzc2lvblN0cmluZygpKTsgICAgICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGNvbnZlcnRlci4ke3V0aWxzLmdldFByZWZpeGVkUHJvcGVydHlOYW1lKCJzZXQiLCRwcm9wZXJ0eS5uYW1lKX0oKGphdmEudXRpbC5Mb2NhbGUpJHtmaWVsZH1WYWx1ZSk7ICAgICAgICAgICAgICAgIA0KLSNlbHNlaWYgKCR1dGlscy5nZXRDbGFzc0Zyb21GdWxsQ2xhc3MoJHByb3BlcnR5LmNsYXNzTmFtZSkgPT0gIlRpbWVab25lIikNCi0gICAgICAgICAgICAgICAgT2JqZWN0ICR7ZmllbGR9VmFsdWUgPSAke2ZpZWxkfS5nZXRWYWx1ZShlbENvbnRleHQpOw0KLSAgICAgICAgICAgICAgICBpZigke2ZpZWxkfVZhbHVlIGluc3RhbmNlb2YgamF2YS51dGlsLlRpbWVab25lKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBjb252ZXJ0ZXIuJHt1dGlscy5nZXRQcmVmaXhlZFByb3BlcnR5TmFtZSgic2V0IiwkcHJvcGVydHkubmFtZSl9KA0KLSAgICAgICAgICAgICAgICAgICAgICAgIChqYXZhLnV0aWwuVGltZVpvbmUpICR7ZmllbGR9VmFsdWUpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgY29udmVydGVyLiR7dXRpbHMuZ2V0UHJlZml4ZWRQcm9wZXJ0eU5hbWUoInNldCIsJHByb3BlcnR5Lm5hbWUpfSgNCi0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuVGltZVpvbmUuZ2V0VGltZVpvbmUoJHtmaWVsZH1WYWx1ZS50b1N0cmluZygpKSk7DQotICAgICAgICAgICAgICAgIH0NCi0jZWxzZWlmICgkdXRpbHMuZ2V0Q2xhc3NGcm9tRnVsbENsYXNzKCRwcm9wZXJ0eS5jbGFzc05hbWUpID09ICJTdHJpbmciKQ0KLSAgICAgICAgICAgICAgICBjb252ZXJ0ZXIuJHt1dGlscy5nZXRQcmVmaXhlZFByb3BlcnR5TmFtZSgic2V0IiwkcHJvcGVydHkubmFtZSl9KCAoU3RyaW5nKSAke2ZpZWxkfS5nZXRWYWx1ZShlbENvbnRleHQpKTsNCi0jZWxzZQ0KLSAgICAgICAgICAgICAgICBjb252ZXJ0ZXIuJHt1dGlscy5nZXRQcmVmaXhlZFByb3BlcnR5TmFtZSgic2V0IiwkcHJvcGVydHkubmFtZSl9KCgkcHJvcGVydHkuY2xhc3NOYW1lKSAke2ZpZWxkfS5nZXRWYWx1ZShlbENvbnRleHQpKTsNCi0jZW5kDQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSNlbmQNCi0gICAgICAgIHJldHVybiBjb252ZXJ0ZXI7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgcmVsZWFzZSgpDQotICAgIHsNCi0gICAgICAgIHN1cGVyLnJlbGVhc2UoKTsNCi0jZm9yZWFjaCggJHByb3BlcnR5IGluICRwcm9wZXJ0eUxpc3QgKQ0KLSNzZXQgKCRmaWVsZCA9ICRwcm9wZXJ0eS5maWVsZE5hbWUpDQotI2lmKCR1dGlscy5nZXRKc3BQcm9wZXJ0eVR5cGUxMigkcHJvcGVydHkpID09ICJib29sZWFuIikNCi0jc2V0ICgkZW1wdHkgPSAiZmFsc2UiKQ0KLSNlbHNlDQotI3NldCAoJGVtcHR5ID0gIm51bGwiKQ0KLSNlbmQNCi0gICAgICAgICRmaWVsZCA9ICRlbXB0eTsNCi0jZW5kDQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtanNmY29tcG9uZW50cy9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9jb3JlL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi90YWdWYWxpZGF0b3JDbGFzczEyLnZtIGIvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtanNmY29tcG9uZW50cy9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9jb3JlL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi90YWdWYWxpZGF0b3JDbGFzczEyLnZtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNWRmOWU0Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWpzZmNvbXBvbmVudHMvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvY29yZS9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvdGFnVmFsaWRhdG9yQ2xhc3MxMi52bQorKysgL2Rldi9udWxsCkBAIC0xLDE1OCArMCwwIEBACi0vLyBXQVJOSU5HOiBUaGlzIGZpbGUgd2FzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkLiBEbyBub3QgZWRpdCBpdCBkaXJlY3RseSwNCi0vLyAgICAgICAgICBvciB5b3Ugd2lsbCBsb3NlIHlvdXIgY2hhbmdlcy4NCi0vKg0KLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICogDQotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqIA0KLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqICB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlICR1dGlscy5nZXRQYWNrYWdlRnJvbUZ1bGxDbGFzcygkdmFsaWRhdG9yLnRhZ0NsYXNzKTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmF4LmVsLlZhbHVlRXhwcmVzc2lvbjsNCi1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvcjsNCi1pbXBvcnQgamF2YXguZmFjZXMuYXBwbGljYXRpb24uQXBwbGljYXRpb247DQotaW1wb3J0IGphdmF4LnNlcnZsZXQuanNwLkpzcEV4Y2VwdGlvbjsNCi0kdXRpbHMuaW1wb3J0VGFnQ2xhc3NlcygkdmFsaWRhdG9yKQ0KLQ0KLXB1YmxpYyBjbGFzcyAkdXRpbHMuZ2V0Q2xhc3NGcm9tRnVsbENsYXNzKCR2YWxpZGF0b3IudGFnQ2xhc3MpDQotI2lmICgke3ZhbGlkYXRvci50YWdTdXBlcmNsYXNzfSkNCi0gICAgZXh0ZW5kcyAke3ZhbGlkYXRvci50YWdTdXBlcmNsYXNzfQ0KLSNlbHNlDQotICAgIGV4dGVuZHMgb3JnLmFwYWNoZS5teWZhY2VzLmNvbW1vbnMudmFsaWRhdG9yLlZhbGlkYXRvckJhc2VUYWcNCi0jZW5kDQotew0KLSNpZiAoJHZhbGlkYXRvci5zZXJpYWx1aWR0YWcpDQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9ICR7dmFsaWRhdG9yLnNlcmlhbHVpZHRhZ307IA0KLSNlbmQgIA0KLQ0KLSAgICBwdWJsaWMgJHV0aWxzLmdldENsYXNzRnJvbUZ1bGxDbGFzcygkdmFsaWRhdG9yLnRhZ0NsYXNzKSgpDQotICAgIHsgICAgDQotICAgIH0gICAgDQotI3NldCAoJHByb3BlcnR5TGlzdCA9ICR7dmFsaWRhdG9yLnByb3BlcnR5VGFnTGlzdH0pDQotI2ZvcmVhY2goICRwcm9wZXJ0eSBpbiAkcHJvcGVydHlMaXN0ICkNCi0jc2V0ICgkZmllbGQgPSAkcHJvcGVydHkuZmllbGROYW1lKQ0KLSNzZXQgKCR0eXBlID0gJHV0aWxzLmdldEpzcFByb3BlcnR5VHlwZTEyKCRwcm9wZXJ0eSkpDQotIA0KLSAgICBwcml2YXRlICR0eXBlICRmaWVsZDsNCi0gICAgDQotI3NldCAoJHZhciA9ICR1dGlscy5nZXRWYXJpYWJsZUZyb21OYW1lKCRwcm9wZXJ0eS5uYW1lKSkNCi0gICAgcHVibGljIHZvaWQgJHV0aWxzLmdldFByZWZpeGVkUHJvcGVydHlOYW1lKCJzZXQiLCAkcHJvcGVydHkuanNwTmFtZSkoJHR5cGUgJHZhcikNCi0gICAgew0KLSAgICAgICAgJGZpZWxkID0gJHZhcjsNCi0gICAgfQ0KLSNlbmQNCi0NCi0gICAgcHJvdGVjdGVkIFZhbGlkYXRvciBjcmVhdGVWYWxpZGF0b3IoKSB0aHJvd3MgSnNwRXhjZXB0aW9uIHsNCi0gICAgICAgIFN0cmluZyB2YWxpZGF0b3JJZCA9ICIkdmFsaWRhdG9yLnZhbGlkYXRvcklkIjsNCi0gICAgICAgIEFwcGxpY2F0aW9uIGFwcGwgPSBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkuZ2V0QXBwbGljYXRpb24oKTsNCi0gICAgICAgIFZhbGlkYXRvciB2YWxpZGF0b3IgPSAoVmFsaWRhdG9yKWFwcGwuY3JlYXRlVmFsaWRhdG9yKHZhbGlkYXRvcklkKTsNCi0gICAgICAgIF9zZXRQcm9wZXJ0aWVzKHZhbGlkYXRvcik7DQotICAgICAgICByZXR1cm4gdmFsaWRhdG9yOw0KLSAgICB9DQotICAgIA0KLSAgICBwcm90ZWN0ZWQgdm9pZCBfc2V0UHJvcGVydGllcyhWYWxpZGF0b3IgdmFsKSB0aHJvd3MgSnNwRXhjZXB0aW9uIHsNCi0gICAgICAgIHN1cGVyLl9zZXRQcm9wZXJ0aWVzKHZhbCk7ICAgIA0KLSAgICAgICAgRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCA9IEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKTsNCi0NCi0gICAgICAgICR2YWxpZGF0b3IuY2xhc3NOYW1lIHZhbGlkYXRvciA9ICgkdmFsaWRhdG9yLmNsYXNzTmFtZSkgdmFsOw0KLSNmb3JlYWNoKCAkcHJvcGVydHkgaW4gJHByb3BlcnR5TGlzdCApDQotI3NldCAoJGZpZWxkID0gJHByb3BlcnR5LmZpZWxkTmFtZSkNCi0jc2V0ICgkdHlwZSA9ICR1dGlscy5nZXRKc3BQcm9wZXJ0eVR5cGUxMigkcHJvcGVydHkpKQ0KLSNzZXQgKCRjbGFzc05hbWUgPSAkdXRpbHMuZ2V0UHJpbWl0aXZlVHlwZSgkcHJvcGVydHkuY2xhc3NOYW1lKSkNCi0gICAgICAgIGlmICgkZmllbGQgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0jaWYgKCRwcm9wZXJ0eS5pc0xpdGVyYWxPbmx5KCkpDQotI2lmICgkdXRpbHMuaXNQcmltaXRpdmVDbGFzcygkcHJvcGVydHkuY2xhc3NOYW1lKSkNCi0gICAgICAgICAgICAgICAgdmFsaWRhdG9yLiR7dXRpbHMuZ2V0UHJlZml4ZWRQcm9wZXJ0eU5hbWUoInNldCIsJHByb3BlcnR5Lm5hbWUpfSgke3V0aWxzLmdldEJveGVkQ2xhc3MoJGNsYXNzTmFtZSl9LnZhbHVlT2YoJGZpZWxkKS4ke3Byb3BlcnR5LmNsYXNzTmFtZX1WYWx1ZSgpKTsNCi0jZWxzZWlmICgkdXRpbHMuaXNQcmltaXRpdmVDbGFzcygkY2xhc3NOYW1lKSkNCi0gICAgICAgICAgICAgICAgdmFsaWRhdG9yLiR7dXRpbHMuZ2V0UHJlZml4ZWRQcm9wZXJ0eU5hbWUoInNldCIsJHByb3BlcnR5Lm5hbWUpfSgke3V0aWxzLmdldEJveGVkQ2xhc3MoJGNsYXNzTmFtZSl9LnZhbHVlT2YoJGZpZWxkKSk7DQotI2Vsc2UNCi0gICAgICAgICAgICAgICAgdmFsaWRhdG9yLiR7dXRpbHMuZ2V0UHJlZml4ZWRQcm9wZXJ0eU5hbWUoInNldCIsJHByb3BlcnR5Lm5hbWUpfSgkZmllbGQpOw0KLSNlbmQNCi0jZWxzZSAgICAgICAgDQotICAgICAgICAgICAgaWYgKCEke2ZpZWxkfS5pc0xpdGVyYWxUZXh0KCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB2YWxpZGF0b3Iuc2V0VmFsdWVFeHByZXNzaW9uKCIkcHJvcGVydHkubmFtZSIsICRmaWVsZCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICB7DQotI2lmICgkdXRpbHMuaXNQcmltaXRpdmVDbGFzcygkcHJvcGVydHkuY2xhc3NOYW1lKSkNCi0gICAgICAgICAgICAgICAgT2JqZWN0ICR7ZmllbGR9VmFsdWUgPSAke2ZpZWxkfS5nZXRWYWx1ZShmYWNlc0NvbnRleHQuZ2V0RUxDb250ZXh0KCkpOw0KLSAgICAgICAgICAgICAgICBpZiAoJHtmaWVsZH1WYWx1ZSAhPSBudWxsKXsNCi0gICAgICAgICAgICAgICAgICAgIGlmICgke2ZpZWxkfVZhbHVlIGluc3RhbmNlb2YgJHt1dGlscy5nZXRCb3hlZENsYXNzKCRjbGFzc05hbWUpfSl7DQotICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdG9yLiR7dXRpbHMuZ2V0UHJlZml4ZWRQcm9wZXJ0eU5hbWUoInNldCIsJHByb3BlcnR5Lm5hbWUpfSgNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgke3V0aWxzLmdldEJveGVkQ2xhc3MoJGNsYXNzTmFtZSl9KSR7ZmllbGR9VmFsdWUpLiR7cHJvcGVydHkuY2xhc3NOYW1lfVZhbHVlKCkpOyAgICAgICAgICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQ0KLSAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRvci4ke3V0aWxzLmdldFByZWZpeGVkUHJvcGVydHlOYW1lKCJzZXQiLCRwcm9wZXJ0eS5uYW1lKX0oDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICR7dXRpbHMuZ2V0Qm94ZWRDbGFzcygkY2xhc3NOYW1lKX0udmFsdWVPZigke2ZpZWxkfVZhbHVlLnRvU3RyaW5nKCkpLiR7cHJvcGVydHkuY2xhc3NOYW1lfVZhbHVlKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgICAgIH0NCi0jZWxzZWlmICgkdXRpbHMuaXNQcmltaXRpdmVDbGFzcygkY2xhc3NOYW1lKSkNCi0gICAgICAgICAgICAgICAgT2JqZWN0ICR7ZmllbGR9VmFsdWUgPSAke2ZpZWxkfS5nZXRWYWx1ZShmYWNlc0NvbnRleHQuZ2V0RUxDb250ZXh0KCkpOw0KLSAgICAgICAgICAgICAgICBpZiAoJHtmaWVsZH1WYWx1ZSAhPSBudWxsKXsNCi0gICAgICAgICAgICAgICAgICAgIGlmICgke2ZpZWxkfVZhbHVlIGluc3RhbmNlb2YgJHt1dGlscy5nZXRCb3hlZENsYXNzKCRjbGFzc05hbWUpfSl7DQotICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdG9yLiR7dXRpbHMuZ2V0UHJlZml4ZWRQcm9wZXJ0eU5hbWUoInNldCIsJHByb3BlcnR5Lm5hbWUpfSgNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgke3V0aWxzLmdldEJveGVkQ2xhc3MoJGNsYXNzTmFtZSl9KSR7ZmllbGR9VmFsdWUpKTsgICAgICAgICAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0b3IuJHt1dGlscy5nZXRQcmVmaXhlZFByb3BlcnR5TmFtZSgic2V0IiwkcHJvcGVydHkubmFtZSl9KA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAke3V0aWxzLmdldEJveGVkQ2xhc3MoJGNsYXNzTmFtZSl9LnZhbHVlT2YoJHtmaWVsZH1WYWx1ZS50b1N0cmluZygpKSk7DQotICAgICAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICAgfQ0KLSNlbHNlaWYgKCR1dGlscy5nZXRDbGFzc0Zyb21GdWxsQ2xhc3MoJHByb3BlcnR5LmNsYXNzTmFtZSkgPT0gIlN0cmluZyIpDQotICAgICAgICAgICAgICAgIE9iamVjdCAke2ZpZWxkfVZhbHVlID0gJHtmaWVsZH0uZ2V0VmFsdWUoZmFjZXNDb250ZXh0LmdldEVMQ29udGV4dCgpKTsNCi0gICAgICAgICAgICAgICAgaWYgKCR7ZmllbGR9VmFsdWUgIT0gbnVsbCkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgdmFsaWRhdG9yLiR7dXRpbHMuZ2V0UHJlZml4ZWRQcm9wZXJ0eU5hbWUoInNldCIsJHByb3BlcnR5Lm5hbWUpfSgNCi0gICAgICAgICAgICAgICAgICAgICAgICAoJHByb3BlcnR5LmNsYXNzTmFtZSkgICR7ZmllbGR9VmFsdWUudG9TdHJpbmcoKSk7ICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgICB9DQotI2Vsc2VpZiAoJHByb3BlcnR5LmNsYXNzTmFtZSA9PSAiamF2YS5sYW5nLlN0cmluZ1tdIikNCi0gICAgICAgICAgICAgICAgdHJ5DQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZ1tdIHZhbHVlID0gb3JnLmFwYWNoZS5teWZhY2VzLmNvbW1vbnMudXRpbC5UYWdVdGlscy5nZXRTdHJpbmdBcnJheSgke2ZpZWxkfS5nZXRWYWx1ZShmYWNlc0NvbnRleHQuZ2V0RUxDb250ZXh0KCkpKTsNCi0gICAgICAgICAgICAgICAgICAgIHZhbGlkYXRvci4ke3V0aWxzLmdldFByZWZpeGVkUHJvcGVydHlOYW1lKCJzZXQiLCRwcm9wZXJ0eS5uYW1lKX0odmFsdWUpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGNhdGNoIChqYXZhLnRleHQuUGFyc2VFeGNlcHRpb24gcGUpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSnNwRXhjZXB0aW9uKA0KLSAgICAgICAgICAgICAgICAgICAgcGUuZ2V0TWVzc2FnZSgpICsgIjogIiArICJQb3NpdGlvbiAiICsgcGUuZ2V0RXJyb3JPZmZzZXQoKSk7DQotICAgICAgICAgICAgICAgIH0NCi0jZWxzZQ0KLSAgICAgICAgICAgICAgICB2YWxpZGF0b3IuJHt1dGlscy5nZXRQcmVmaXhlZFByb3BlcnR5TmFtZSgic2V0IiwkcHJvcGVydHkubmFtZSl9KCgkcHJvcGVydHkuY2xhc3NOYW1lKSAgJHtmaWVsZH0uZ2V0VmFsdWUoZmFjZXNDb250ZXh0LmdldEVMQ29udGV4dCgpKSk7DQotI2VuZA0KLSAgICAgICAgICAgIH0NCi0jZW5kDQotICAgICAgICB9DQotI2VuZA0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHJlbGVhc2UoKQ0KLSAgICB7DQotICAgICAgICBzdXBlci5yZWxlYXNlKCk7DQotI2ZvcmVhY2goICRwcm9wZXJ0eSBpbiAkcHJvcGVydHlMaXN0ICkNCi0jc2V0ICgkZmllbGQgPSAkcHJvcGVydHkuZmllbGROYW1lKQ0KLSNpZigkdXRpbHMuZ2V0SnNwUHJvcGVydHlUeXBlMTIoJHByb3BlcnR5KSA9PSAiYm9vbGVhbiIpDQotI3NldCAoJGVtcHR5ID0gImZhbHNlIikNCi0jZWxzZQ0KLSNzZXQgKCRlbXB0eSA9ICJudWxsIikNCi0jZW5kDQotICAgICAgICAkZmllbGQgPSAkZW1wdHk7DQotI2VuZA0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWpzZmNvbXBvbmVudHMvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvY29yZS9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvdmFsaWRhdG9yQ2xhc3MxMi52bSBiL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWpzZmNvbXBvbmVudHMvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvY29yZS9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvdmFsaWRhdG9yQ2xhc3MxMi52bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmYxZmQ0Yi4uMDAwMDAwMAotLS0gYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1qc2Zjb21wb25lbnRzL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL2NvcmUvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL3ZhbGlkYXRvckNsYXNzMTIudm0KKysrIC9kZXYvbnVsbApAQCAtMSwyMTUgKzAsMCBAQAotIyMgVmVsb2NpdHkgdGVtcGxhdGUgdXNlZCB0byBnZW5lcmF0ZSBKU0YxLjItY29tcGF0aWJsZSB2YWxpZGF0b3IgY2xhc3Nlcw0KLSMjIGZyb20gdmFsaWRhdG9yIG1ldGEtZGF0YS4NCi0jIw0KLSMjIE5vdGUgdGhhdCB0aGVyZSBhcmUgb25seSBvbmUgdHlwZSBvZiB2YWxpZGF0b3IgZ2VuZXJhdGlvbjoNCi0jIyAgKiAic3ViY2xhc3MgbW9kZSIgKHVzZSBhbm5vdGF0ZWQgY2xhc3MgYXMgYSBwYXJlbnQgY2xhc3MpDQotIyMNCi0jIyBWYXJpYWJsZSAkdmFsaWRhdG9yIHJlZmVycyB0byBhIFZhbGlkYXRvck1ldGEgb2JqZWN0IHRvIHByb2Nlc3MNCi0jIyBWYXJpYWJsZSAkdXRpbHMgcmVmZXJzIHRvIGFuIGluc3RhbmNlIG9mIE15ZmFjZXNVdGlscy4NCi0jIw0KLSMjDQotIyMgVGhlIGphdmEgcGFja2FnZSBvZiB0aGUgZ2VuZXJhdGVkIGNsYXNzIGlzIGFsd2F5cyB0aGUgc2FtZSBhcw0KLSMjIHRoZSBwYWNrYWdlIGluIHdoaWNoIHRoZSBhbm5vdGF0ZWQgY2xhc3MgZXhpc3RzLg0KLSMjDQotLyoNCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqIA0KLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKiANCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSAke3ZhbGlkYXRvci5wYWNrYWdlTmFtZX07DQotDQotaW1wb3J0IGphdmF4LmVsLlZhbHVlRXhwcmVzc2lvbjsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotJHV0aWxzLmltcG9ydFRhZ0NsYXNzZXMoJHZhbGlkYXRvcikNCi0NCi0jaWYgKCR2YWxpZGF0b3IuaXNUZW1wbGF0ZSgpKQ0KLSNzZXQgKCRnZW5lcmF0ZWRDbGFzc1BhcmVudCA9ICR2YWxpZGF0b3Iuc291cmNlQ2xhc3NQYXJlbnRDbGFzc05hbWUpDQotI2Vsc2UNCi0jc2V0ICgkZ2VuZXJhdGVkQ2xhc3NQYXJlbnQgPSAkdmFsaWRhdG9yLnNvdXJjZUNsYXNzTmFtZSkNCi0jZW5kDQotLy8gR2VuZXJhdGVkIGZyb20gY2xhc3MgJHt2YWxpZGF0b3Iuc291cmNlQ2xhc3NOYW1lfS4NCi0vLw0KLS8vIFdBUk5JTkc6IFRoaXMgZmlsZSB3YXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQuIERvIG5vdCBlZGl0IGl0IGRpcmVjdGx5LA0KLS8vICAgICAgICAgIG9yIHlvdSB3aWxsIGxvc2UgeW91ciBjaGFuZ2VzLg0KLXB1YmxpYyBjbGFzcyAke3V0aWxzLmdldENsYXNzRnJvbUZ1bGxDbGFzcygkdmFsaWRhdG9yLmNsYXNzTmFtZSl9IGV4dGVuZHMgJGdlbmVyYXRlZENsYXNzUGFyZW50DQotI2lmICgkdmFsaWRhdG9yLmltcGxlbWVudHMpDQotICAgIGltcGxlbWVudHMgJHZhbGlkYXRvci5pbXBsZW1lbnRzDQotI2VuZA0KLXsNCi0NCi0jaWYgKCR2YWxpZGF0b3IudmFsaWRhdG9ySWQpDQotICAgIHN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIFZBTElEQVRPUl9JRCA9IA0KLSAgICAgICAgIiR2YWxpZGF0b3IudmFsaWRhdG9ySWQiOw0KLSNlbmQNCi0NCi0gICAgcHVibGljICR7dXRpbHMuZ2V0Q2xhc3NGcm9tRnVsbENsYXNzKCR2YWxpZGF0b3IuY2xhc3NOYW1lKX0oKQ0KLSAgICB7DQotICAgIH0NCi0gICAgDQotI3NldCAoJHByb3BlcnR5TGlzdCA9ICR7dmFsaWRhdG9yLnByb3BlcnR5VmFsaWRhdG9yTGlzdH0pDQotDQotI2ZvcmVhY2goICRwcm9wZXJ0eSBpbiAkcHJvcGVydHlMaXN0ICkNCi0jc2V0ICgkZmllbGQgPSAkcHJvcGVydHkuZmllbGROYW1lKQ0KLSNzZXQgKCR0eXBlID0gJHV0aWxzLmdldENsYXNzRnJvbUZ1bGxDbGFzcygkcHJvcGVydHkuY2xhc3NOYW1lKSkNCi0jaWYoJHV0aWxzLmdldERlZmF1bHRWYWx1ZUZpZWxkKCRwcm9wZXJ0eSkpIA0KLSNzZXQgKCRkZWZhdWx0VmFsdWUgPSAkdXRpbHMuZ2V0RGVmYXVsdFZhbHVlRmllbGQoJHByb3BlcnR5KSkNCi0jZWxzZQ0KLSNzZXQgKCRkZWZhdWx0VmFsdWUgPSBmYWxzZSkNCi0jZW5kDQotICAgIC8vIFByb3BlcnR5OiAkcHJvcGVydHkubmFtZQ0KLSNpZiAoJHByb3BlcnR5LmlzTGl0ZXJhbE9ubHkoKSB8fCAkcHJvcGVydHkuaXNUYWdFeGNsdWRlZCgpICkNCi0gICAgcHJpdmF0ZSAkdHlwZSAkZmllbGQgI2lmKCRkZWZhdWx0VmFsdWUpID0gJGRlZmF1bHRWYWx1ZTsje2Vsc2V9OyN7ZW5kfQ0KLQ0KLSAgICAgDQotI2Vsc2UNCi0gICAgcHJpdmF0ZSAkdHlwZSAkZmllbGQ7DQotICAgIA0KLSNlbmQNCi0jaWYoJHV0aWxzLmlzUHJpbWl0aXZlQ2xhc3MoJHR5cGUpICYmICEkcHJvcGVydHkuaXNUYWdFeGNsdWRlZCgpICkNCi0gICAgcHJpdmF0ZSBib29sZWFuICR7ZmllbGR9U2V0Ow0KLSAgICANCi0jaWYgKCRwcm9wZXJ0eS5pc1NldE1ldGhvZCgpKQ0KLSAgICAkcHJvcGVydHkuc2V0TWV0aG9kU2NvcGUgYm9vbGVhbiAkdXRpbHMuZ2V0UHJlZml4ZWRQcm9wZXJ0eU5hbWUoImlzU2V0IiwgJHByb3BlcnR5Lm5hbWUpKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuICR7ZmllbGR9U2V0Ow0KLSAgICB9DQotI2VuZA0KLSNlbmQNCi0jaWYoJHByb3BlcnR5LmlzTG9jYWxNZXRob2QoKSkNCi0jaWYoImJvb2xlYW4iID09ICR0eXBlKQ0KLSNzZXQgKCRtZXRob2ROYW1lID0gJHV0aWxzLmdldFByZWZpeGVkUHJvcGVydHlOYW1lKCJpc0xvY2FsIiwgJHByb3BlcnR5Lm5hbWUpKQ0KLSNlbHNlDQotI3NldCAoJG1ldGhvZE5hbWUgPSAkdXRpbHMuZ2V0UHJlZml4ZWRQcm9wZXJ0eU5hbWUoImdldExvY2FsIiwgJHByb3BlcnR5Lm5hbWUpKQ0KLSNlbmQNCi0gICAgZmluYWwgJHByb3BlcnR5LmxvY2FsTWV0aG9kU2NvcGUgJHR5cGUgJHttZXRob2ROYW1lfSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAkZmllbGQ7DQotICAgIH0NCi0gICAgIA0KLSNlbmQNCi0gICAgcHVibGljICR0eXBlICR1dGlscy5nZXRNZXRob2RSZWFkZXJGcm9tUHJvcGVydHkoJHByb3BlcnR5Lm5hbWUsICR0eXBlKSgpDQotICAgIHsNCi0jaWYgKCRwcm9wZXJ0eS5pc1RhZ0V4Y2x1ZGVkKCkgfHwgJHByb3BlcnR5LmlzTGl0ZXJhbE9ubHkoKSkNCi0gICAgICAgIHJldHVybiAkZmllbGQ7DQotI2Vsc2UNCi0jaWYgKCR1dGlscy5pc1ByaW1pdGl2ZUNsYXNzKCR0eXBlKSkNCi0gICAgICAgIGlmICgke2ZpZWxkfVNldCkNCi0jZWxzZQ0KLSAgICAgICAgaWYgKCRmaWVsZCAhPSBudWxsKQ0KLSNlbmQNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gJGZpZWxkOw0KLSAgICAgICAgfQ0KLSAgICAgICAgVmFsdWVFeHByZXNzaW9uIHZiID0gZ2V0VmFsdWVFeHByZXNzaW9uKCIkcHJvcGVydHkubmFtZSIpOw0KLSAgICAgICAgaWYgKHZiICE9IG51bGwpDQotICAgICAgICB7DQotI2lmICgkdXRpbHMuaXNQcmltaXRpdmVDbGFzcygkdHlwZSkpDQotICAgICAgICAgICAgcmV0dXJuICgkdXRpbHMuY2FzdElmTmVjZXNzYXJ5KCR0eXBlKSB2Yi5nZXRWYWx1ZShnZXRGYWNlc0NvbnRleHQoKS5nZXRFTENvbnRleHQoKSkpLiR7dHlwZX1WYWx1ZSgpOw0KLSNlbHNlDQotI3NldCAoJHByaXR5cGUgPSAkdXRpbHMuZ2V0UHJpbWl0aXZlVHlwZSgkcHJvcGVydHkuY2xhc3NOYW1lKSkNCi0jaWYgKCR1dGlscy5pc1ByaW1pdGl2ZUNsYXNzKCRwcml0eXBlKSkNCi0gICAgICAgICAgICBPYmplY3QgdmFsdWUgPSB2YiA9PSBudWxsID8gbnVsbCA6IHZiLmdldFZhbHVlKGdldEZhY2VzQ29udGV4dCgpLmdldEVMQ29udGV4dCgpKTsNCi0gICAgICAgICAgICBpZiAoISh2YWx1ZSBpbnN0YW5jZW9mICR0eXBlKSl7DQotICAgICAgICAgICAgICAgIHZhbHVlID0gJHt0eXBlfS52YWx1ZU9mKHZhbHVlLnRvU3RyaW5nKCkpOw0KLSAgICAgICAgICAgIH0gICAgICAgICAgICANCi0gICAgICAgICAgICByZXR1cm4gJHV0aWxzLmNhc3RJZk5lY2Vzc2FyeSgkdHlwZSkgdmFsdWU7DQotI2Vsc2UNCi0gICAgICAgICAgICByZXR1cm4gJHV0aWxzLmNhc3RJZk5lY2Vzc2FyeSgkdHlwZSkgdmIuZ2V0VmFsdWUoZ2V0RmFjZXNDb250ZXh0KCkuZ2V0RUxDb250ZXh0KCkpOw0KLSNlbmQNCi0jZW5kDQotICAgICAgICB9DQotI2lmICgkZGVmYXVsdFZhbHVlKQ0KLSAgICAgICAgcmV0dXJuICRkZWZhdWx0VmFsdWU7IA0KLSNlbHNlaWYgKCR1dGlscy5pc1ByaW1pdGl2ZUNsYXNzKCR0eXBlKSkNCi0gICAgICAgIHJldHVybiAkdXRpbHMucHJpbWl0aXZlRGVmYXVsdFZhbHVlKCR0eXBlKTsNCi0jZWxzZSAgICAgICANCi0gICAgICAgIHJldHVybiBudWxsOw0KLSNlbmQNCi0jZW5kDQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgJHV0aWxzLmdldFByZWZpeGVkUHJvcGVydHlOYW1lKCJzZXQiLCAkcHJvcGVydHkubmFtZSkoJHR5cGUgJHV0aWxzLmdldFZhcmlhYmxlRnJvbU5hbWUoJHByb3BlcnR5Lm5hbWUpKQ0KLSAgICB7DQotICAgICAgICB0aGlzLiRmaWVsZCA9ICR1dGlscy5nZXRWYXJpYWJsZUZyb21OYW1lKCRwcm9wZXJ0eS5uYW1lKTsNCi0jaWYgKCR1dGlscy5pc1ByaW1pdGl2ZUNsYXNzKCR0eXBlKSAmJiAhJHByb3BlcnR5LmlzVGFnRXhjbHVkZWQoKSApDQotICAgICAgICB0aGlzLiR7ZmllbGR9U2V0ID0gdHJ1ZTsgICAgICAgIA0KLSNlbmQNCi0gICAgfQ0KLSNlbmQNCi0NCi0gICAgcHVibGljIE9iamVjdCBzYXZlU3RhdGUoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCkNCi0gICAgew0KLSNzZXQgKCRwcmltaXRpdmVDb3VudCA9ICRwcm9wZXJ0eUxpc3Quc2l6ZSgpICsgMSkNCi0jZm9yZWFjaCggJHByb3BlcnR5IGluICRwcm9wZXJ0eUxpc3QgKQ0KLSNpZigkdXRpbHMuaXNQcmltaXRpdmVDbGFzcygkcHJvcGVydHkuY2xhc3NOYW1lKSkNCi0jc2V0ICgkcHJpbWl0aXZlQ291bnQgPSAkcHJpbWl0aXZlQ291bnQgKyAxKQ0KLSNlbmQNCi0jZW5kDQotICAgICAgICBPYmplY3RbXSB2YWx1ZXMgPSBuZXcgT2JqZWN0WyRwcmltaXRpdmVDb3VudF07DQotICAgICAgICB2YWx1ZXNbMF0gPSBzdXBlci5zYXZlU3RhdGUoZmFjZXNDb250ZXh0KTsNCi0jc2V0ICgkYXJyYXlJbmRleCA9IDApDQotI2ZvcmVhY2goICRwcm9wZXJ0eSBpbiAkcHJvcGVydHlMaXN0ICkNCi0jc2V0ICgkZmllbGQgPSAkcHJvcGVydHkuZmllbGROYW1lKQ0KLSNzZXQgKCR0eXBlID0gJHByb3BlcnR5LmNsYXNzTmFtZSkNCi0jc2V0ICgkYXJyYXlJbmRleCA9ICRhcnJheUluZGV4ICsgMSkNCi0jaWYgKCRwcm9wZXJ0eS5qc3BOYW1lID09ICJ2YWxpZGF0b3IiICYmICRwcm9wZXJ0eS5pc01ldGhvZEJpbmRpbmcoKSApDQotICAgICAgICB2YWx1ZXNbJGFycmF5SW5kZXhdID0gc2F2ZUF0dGFjaGVkU3RhdGUoZmFjZXNDb250ZXh0LCR7ZmllbGR9TGlzdCk7DQotI2Vsc2VpZiAoICRwcm9wZXJ0eS5pc1N0YXRlSG9sZGVyKCkgKSMjIHx8ICR1dGlscy5pc0NvbnZlcnRlcigkdHlwZSkNCi0gICAgICAgIHZhbHVlc1skYXJyYXlJbmRleF0gPSBzYXZlQXR0YWNoZWRTdGF0ZShmYWNlc0NvbnRleHQsJGZpZWxkKTsNCi0jZWxzZWlmKCR1dGlscy5pc1ByaW1pdGl2ZUNsYXNzKCR0eXBlKSkNCi0gICAgICAgIHZhbHVlc1skYXJyYXlJbmRleF0gPSAke3V0aWxzLmdldEJveGVkQ2xhc3MoJHR5cGUpfS52YWx1ZU9mKCRmaWVsZCk7DQotI2Vsc2UNCi0gICAgICAgIHZhbHVlc1skYXJyYXlJbmRleF0gPSAkZmllbGQ7DQotI2VuZA0KLSNpZigkdXRpbHMuaXNQcmltaXRpdmVDbGFzcygkdHlwZSkgJiYgISRwcm9wZXJ0eS5pc1RhZ0V4Y2x1ZGVkKCkpDQotI3NldCAoJGFycmF5SW5kZXggPSAkYXJyYXlJbmRleCArIDEpDQotICAgICAgICB2YWx1ZXNbJGFycmF5SW5kZXhdID0gQm9vbGVhbi52YWx1ZU9mKCR7ZmllbGR9U2V0KTsNCi0jZW5kDQotI2VuZA0KLSAgICAgICAgcmV0dXJuIHZhbHVlczsgDQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgcmVzdG9yZVN0YXRlKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIE9iamVjdCBzdGF0ZSkNCi0gICAgew0KLSAgICAgICAgT2JqZWN0W10gdmFsdWVzID0gKE9iamVjdFtdKXN0YXRlOw0KLSAgICAgICAgc3VwZXIucmVzdG9yZVN0YXRlKGZhY2VzQ29udGV4dCx2YWx1ZXNbMF0pOw0KLSNzZXQgKCRhcnJheUluZGV4ID0gMCkNCi0jZm9yZWFjaCggJHByb3BlcnR5IGluICRwcm9wZXJ0eUxpc3QgKQ0KLSNzZXQgKCRmaWVsZCA9ICRwcm9wZXJ0eS5maWVsZE5hbWUpDQotI3NldCAoJHR5cGUgPSAkcHJvcGVydHkuY2xhc3NOYW1lKQ0KLSNzZXQgKCRhcnJheUluZGV4ID0gJGFycmF5SW5kZXggKyAxKQ0KLSNpZiAoICRwcm9wZXJ0eS5pc1N0YXRlSG9sZGVyKCkgKQ0KLSNpZiAoJHByb3BlcnR5LmpzcE5hbWUgPT0gInZhbGlkYXRvciIgJiYgJHByb3BlcnR5LmlzTWV0aG9kQmluZGluZygpICkNCi0gICAgICAgICR7ZmllbGR9TGlzdCA9IChMaXN0PFZhbGlkYXRvcj4pIHJlc3RvcmVBdHRhY2hlZFN0YXRlKGZhY2VzQ29udGV4dCx2YWx1ZXNbJGFycmF5SW5kZXhdKTsNCi0jZWxzZWlmICgkdXRpbHMuaXNMaXN0KCR0eXBlKSkNCi0gICAgICAgICRmaWVsZCA9IChMaXN0KSByZXN0b3JlQXR0YWNoZWRTdGF0ZShmYWNlc0NvbnRleHQsdmFsdWVzWyRhcnJheUluZGV4XSk7DQotI2Vsc2UNCi0gICAgICAgICRmaWVsZCA9ICR1dGlscy5jYXN0SWZOZWNlc3NhcnkoJHR5cGUpIHJlc3RvcmVBdHRhY2hlZFN0YXRlKGZhY2VzQ29udGV4dCx2YWx1ZXNbJGFycmF5SW5kZXhdKTsgDQotI2VuZA0KLSNlbHNlaWYgKCR1dGlscy5pc0NvbnZlcnRlcigkdHlwZSkpIA0KLSAgICAgICAgJGZpZWxkID0gKENvbnZlcnRlcikgcmVzdG9yZUF0dGFjaGVkU3RhdGUoZmFjZXNDb250ZXh0LHZhbHVlc1skYXJyYXlJbmRleF0pOw0KLSNlbHNlaWYgKCR1dGlscy5pc1ByaW1pdGl2ZUNsYXNzKCR0eXBlKSkNCi0gICAgICAgICRmaWVsZCA9ICgkdXRpbHMuY2FzdElmTmVjZXNzYXJ5KCR0eXBlKSB2YWx1ZXNbJGFycmF5SW5kZXhdKS4ke3R5cGV9VmFsdWUoKTsNCi0jZWxzZQ0KLSAgICAgICAgJGZpZWxkID0gJHV0aWxzLmNhc3RJZk5lY2Vzc2FyeSgkdHlwZSkgdmFsdWVzWyRhcnJheUluZGV4XTsNCi0jZW5kDQotI2lmKCR1dGlscy5pc1ByaW1pdGl2ZUNsYXNzKCR0eXBlKSAmJiAhJHByb3BlcnR5LmlzVGFnRXhjbHVkZWQoKSApDQotI3NldCAoJGFycmF5SW5kZXggPSAkYXJyYXlJbmRleCArIDEpDQotICAgICAgICAke2ZpZWxkfVNldCA9ICgoQm9vbGVhbikgdmFsdWVzWyRhcnJheUluZGV4XSkuYm9vbGVhblZhbHVlKCk7DQotI2VuZA0KLSNlbmQNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1qc2Zjb21wb25lbnRzL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL2NvcmUvc3JjL3Rlc3QvamF2YS9vcmcvbXlvcmdhbml6YXRpb24vY29tcG9uZW50L3NheWhlbGxvL1NheUhlbGxvUmVuZGVyZXJUZXN0LmphdmEgYi9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1qc2Zjb21wb25lbnRzL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL2NvcmUvc3JjL3Rlc3QvamF2YS9vcmcvbXlvcmdhbml6YXRpb24vY29tcG9uZW50L3NheWhlbGxvL1NheUhlbGxvUmVuZGVyZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyNTkwY2QuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtanNmY29tcG9uZW50cy9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9jb3JlL3NyYy90ZXN0L2phdmEvb3JnL215b3JnYW5pemF0aW9uL2NvbXBvbmVudC9zYXloZWxsby9TYXlIZWxsb1JlbmRlcmVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLm15b3JnYW5pemF0aW9uLmNvbXBvbmVudC5zYXloZWxsbzsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IG9yZy5hcGFjaGUuc2hhbGUudGVzdC5iYXNlLkFic3RyYWN0SnNmVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5zaGFsZS50ZXN0Lm1vY2suTW9ja1JlbmRlcktpdEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5zaGFsZS50ZXN0Lm1vY2suTW9ja1Jlc3BvbnNlV3JpdGVyOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKLQotLyoqCi0gKiBDbGFzcyB0byB0ZXN0IHRoZSBiZWhhdmlvdXIgb2YgdGhlIFNheUhlbGxvIHJlbmRlcmVyCi0gKi8KLXB1YmxpYyBjbGFzcyBTYXlIZWxsb1JlbmRlcmVyVGVzdCBleHRlbmRzIEFic3RyYWN0SnNmVGVzdENhc2UKLXsKLQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpCi0gICAgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIE1vY2tSZXNwb25zZVdyaXRlciB3cml0ZXIgOwotICAgIHByaXZhdGUgU2F5SGVsbG8gc2F5SGVsbG87Ci0KLSAgICBwdWJsaWMgU2F5SGVsbG9SZW5kZXJlclRlc3QoU3RyaW5nIG5hbWUpCi0gICAgewotICAgICAgICBzdXBlcihuYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHN1cGVyLnNldFVwKCk7Ci0KLSAgICAgICAgc2F5SGVsbG8gPSBuZXcgU2F5SGVsbG8oKTsKLSAgICAgICAgc2F5SGVsbG8uc2V0Rmlyc3ROYW1lKCJKb2huIik7Ci0gICAgICAgIHNheUhlbGxvLnNldExhc3ROYW1lKCJTbWl0aCIpOwotCi0gICAgICAgIHdyaXRlciA9IG5ldyBNb2NrUmVzcG9uc2VXcml0ZXIobmV3IFN0cmluZ1dyaXRlcigpLCBudWxsLCBudWxsKTsKLSAgICAgICAgZmFjZXNDb250ZXh0LnNldFJlc3BvbnNlV3JpdGVyKHdyaXRlcik7Ci0gICAgICAgIC8vIFRPRE8gcmVtb3ZlIHRoZXNlIHR3byBsaW5lcyBvbmNlIHNoYWxlLXRlc3QgZ29lcyBhbHBoYSwgc2VlIE1ZRkFDRVMtMTE1NQotICAgICAgICBmYWNlc0NvbnRleHQuZ2V0Vmlld1Jvb3QoKS5zZXRSZW5kZXJLaXRJZChNb2NrUmVuZGVyS2l0RmFjdG9yeS5IVE1MX0JBU0lDX1JFTkRFUl9LSVQpOwotICAgICAgICBmYWNlc0NvbnRleHQuZ2V0UmVuZGVyS2l0KCkuYWRkUmVuZGVyZXIoCi0gICAgICAgICAgICAgICAgc2F5SGVsbG8uZ2V0RmFtaWx5KCksCi0gICAgICAgICAgICAgICAgc2F5SGVsbG8uZ2V0UmVuZGVyZXJUeXBlKCksCi0gICAgICAgICAgICAgICAgbmV3IFNheUhlbGxvUmVuZGVyZXIoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBzdXBlci50ZWFyRG93bigpOwotICAgICAgICBzYXlIZWxsbyA9IG51bGw7Ci0gICAgICAgIHdyaXRlciA9IG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEVuY29kZUVuZCgpICB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBzYXlIZWxsby5lbmNvZGVFbmQoZmFjZXNDb250ZXh0KTsKLSAgICAgICAgZmFjZXNDb250ZXh0LnJlbmRlclJlc3BvbnNlKCk7Ci0KLSAgICAgICAgU3RyaW5nIG91dHB1dCA9IHdyaXRlci5nZXRXcml0ZXIoKS50b1N0cmluZygpOwotCi0gICAgICAgIGFzc2VydEVxdWFscygiSGVsbG8gSm9obiBTbWl0aCEiLCBvdXRwdXQpOwotICAgICAgICBhc3NlcnROb3RTYW1lKCJCeWUgSm9obiBTbWl0aCEiLCBvdXRwdXQpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtanNmY29tcG9uZW50cy9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9jb3JlL3NyYy90ZXN0L2phdmEvb3JnL215b3JnYW5pemF0aW9uL2NvbnZlcnRlci9QaG9uZU51bWJlckNvbnZlcnRlclRlc3QuamF2YSBiL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWpzZmNvbXBvbmVudHMvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvY29yZS9zcmMvdGVzdC9qYXZhL29yZy9teW9yZ2FuaXphdGlvbi9jb252ZXJ0ZXIvUGhvbmVOdW1iZXJDb252ZXJ0ZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2OWQ4NmQuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtanNmY29tcG9uZW50cy9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9jb3JlL3NyYy90ZXN0L2phdmEvb3JnL215b3JnYW5pemF0aW9uL2NvbnZlcnRlci9QaG9uZU51bWJlckNvbnZlcnRlclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5teW9yZ2FuaXphdGlvbi5jb252ZXJ0ZXI7Ci0KLWltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxJbnB1dFRleHQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuc2hhbGUudGVzdC5iYXNlLkFic3RyYWN0SnNmVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5zaGFsZS50ZXN0Lm1vY2suTW9ja1Jlc3BvbnNlV3JpdGVyOwotCi1wdWJsaWMgY2xhc3MgUGhvbmVOdW1iZXJDb252ZXJ0ZXJUZXN0IGV4dGVuZHMgQWJzdHJhY3RKc2ZUZXN0Q2FzZQotewotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpCi0gICAgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIE1vY2tSZXNwb25zZVdyaXRlciB3cml0ZXIgOwotICAgIHByaXZhdGUgUGhvbmVOdW1iZXJDb252ZXJ0ZXIgcGhvbmVOdW1Db252ZXJ0ZXI7Ci0KLSAgICBwdWJsaWMgUGhvbmVOdW1iZXJDb252ZXJ0ZXJUZXN0KFN0cmluZyBuYW1lKQotICAgIHsKLSAgICAgICAgc3VwZXIobmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBzdXBlci5zZXRVcCgpOwotCi0gICAgICAgIHBob25lTnVtQ29udmVydGVyID0gbmV3IFBob25lTnVtYmVyQ29udmVydGVyKCk7Ci0gICAgICAgIHdyaXRlciA9IG5ldyBNb2NrUmVzcG9uc2VXcml0ZXIobmV3IFN0cmluZ1dyaXRlcigpLCBudWxsLCBudWxsKTsKLSAgICAgICAgZmFjZXNDb250ZXh0LnNldFJlc3BvbnNlV3JpdGVyKHdyaXRlcik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBzdXBlci50ZWFyRG93bigpOwotICAgICAgICBwaG9uZU51bUNvbnZlcnRlciA9IG51bGw7Ci0gICAgICAgIHdyaXRlciA9IG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE51bU9ubHkoKSB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBPYmplY3Qgb2JqID0gcGhvbmVOdW1Db252ZXJ0ZXIuZ2V0QXNPYmplY3QoZmFjZXNDb250ZXh0LCBuZXcgSHRtbElucHV0VGV4dCgpLCAiNjM3MzgyNCIpOwotICAgICAgICBhc3NlcnROb3ROdWxsKG9iaik7Ci0gICAgICAgIFBob25lTnVtYmVyIHBob25lTnVtID0gKFBob25lTnVtYmVyKSBvYmo7Ci0gICAgICAgIGFzc2VydEVxdWFscyhwaG9uZU51bS5nZXROdW1iZXIoKSwgIjYzNzM4MjQiKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdEFyZWFDb2RlTnVtKCkgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgT2JqZWN0IG9iaiA9IHBob25lTnVtQ29udmVydGVyLmdldEFzT2JqZWN0KGZhY2VzQ29udGV4dCwgbmV3IEh0bWxJbnB1dFRleHQoKSwgIjA5LTYzNzM4MjQiKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChvYmopOwotICAgICAgICBQaG9uZU51bWJlciBwaG9uZU51bSA9IChQaG9uZU51bWJlcikgb2JqOwotICAgICAgICBhc3NlcnRFcXVhbHMocGhvbmVOdW0uZ2V0QXJlYUNvZGUoKSwgIjA5Iik7Ci0gICAgICAgIGFzc2VydEVxdWFscyhwaG9uZU51bS5nZXROdW1iZXIoKSwgIjYzNzM4MjQiKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1qc2Zjb21wb25lbnRzL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL2NvcmUvc3JjL3Rlc3QvamF2YS9vcmcvbXlvcmdhbml6YXRpb24vdmFsaWRhdG9yL09kZE51bWJlclZhbGlkYXRvclRlc3QuamF2YSBiL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWpzZmNvbXBvbmVudHMvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvY29yZS9zcmMvdGVzdC9qYXZhL29yZy9teW9yZ2FuaXphdGlvbi92YWxpZGF0b3IvT2RkTnVtYmVyVmFsaWRhdG9yVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYWJlMTcwLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWpzZmNvbXBvbmVudHMvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvY29yZS9zcmMvdGVzdC9qYXZhL29yZy9teW9yZ2FuaXphdGlvbi92YWxpZGF0b3IvT2RkTnVtYmVyVmFsaWRhdG9yVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLm15b3JnYW5pemF0aW9uLnZhbGlkYXRvcjsKLQotaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOwotCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50Lmh0bWwuSHRtbElucHV0VGV4dDsKLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yRXhjZXB0aW9uOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnNoYWxlLnRlc3QuYmFzZS5BYnN0cmFjdEpzZlRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuc2hhbGUudGVzdC5tb2NrLk1vY2tSZXNwb25zZVdyaXRlcjsKLQotcHVibGljIGNsYXNzIE9kZE51bWJlclZhbGlkYXRvclRlc3QgZXh0ZW5kcyBBYnN0cmFjdEpzZlRlc3RDYXNlCi17Ci0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBNb2NrUmVzcG9uc2VXcml0ZXIgd3JpdGVyIDsKLSAgICBwcml2YXRlIE9kZE51bWJlclZhbGlkYXRvciBvZGROdW1WYWxpZGF0b3I7Ci0KLSAgICBwdWJsaWMgT2RkTnVtYmVyVmFsaWRhdG9yVGVzdChTdHJpbmcgbmFtZSkKLSAgICB7Ci0gICAgICAgIHN1cGVyKG5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgc3VwZXIuc2V0VXAoKTsKLQotICAgICAgICBvZGROdW1WYWxpZGF0b3IgPSBuZXcgT2RkTnVtYmVyVmFsaWRhdG9yKCk7Ci0gICAgICAgIHdyaXRlciA9IG5ldyBNb2NrUmVzcG9uc2VXcml0ZXIobmV3IFN0cmluZ1dyaXRlcigpLCBudWxsLCBudWxsKTsKLSAgICAgICAgZmFjZXNDb250ZXh0LnNldFJlc3BvbnNlV3JpdGVyKHdyaXRlcik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBzdXBlci50ZWFyRG93bigpOwotICAgICAgICBvZGROdW1WYWxpZGF0b3IgPSBudWxsOwotICAgICAgICB3cml0ZXIgPSBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RPZGROdW1JbnB1dCgpIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGJvb2xlYW4gbm9FeGNlcHRpb25zVGhyb3duID0gdHJ1ZTsKLSAgICAgICAgdHJ5IAotICAgICAgICB7Ci0gICAgICAgICAgICBvZGROdW1WYWxpZGF0b3IudmFsaWRhdGUoZmFjZXNDb250ZXh0LCBuZXcgSHRtbElucHV0VGV4dCgpLCBuZXcgSW50ZWdlcigzKSk7Ci0gICAgICAgIH0gCi0gICAgICAgIGNhdGNoKFZhbGlkYXRvckV4Y2VwdGlvbiB2ZSkgCi0gICAgICAgIHsKLSAgICAgICAgICAgIG5vRXhjZXB0aW9uc1Rocm93biA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIGFzc2VydFRydWUobm9FeGNlcHRpb25zVGhyb3duKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdEV2ZW5OdW1JbnB1dCgpIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGJvb2xlYW4gbm9FeGNlcHRpb25zVGhyb3duID0gdHJ1ZTsKLSAgICAgICAgdHJ5IAotICAgICAgICB7Ci0gICAgICAgICAgICBvZGROdW1WYWxpZGF0b3IudmFsaWRhdGUoZmFjZXNDb250ZXh0LCBuZXcgSHRtbElucHV0VGV4dCgpLCBuZXcgSW50ZWdlcig4KSk7Ci0gICAgICAgIH0gCi0gICAgICAgIGNhdGNoKFZhbGlkYXRvckV4Y2VwdGlvbiB2ZSkgCi0gICAgICAgIHsKLSAgICAgICAgICAgIG5vRXhjZXB0aW9uc1Rocm93biA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIGFzc2VydEZhbHNlKG5vRXhjZXB0aW9uc1Rocm93bik7Ci0gICAgfQotICAgIAotICAgIAotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtanNmY29tcG9uZW50cy9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9leGFtcGxlcy9wb20ueG1sIGIvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtanNmY29tcG9uZW50cy9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9leGFtcGxlcy9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMzY5YThmLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWpzZmNvbXBvbmVudHMvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvZXhhbXBsZXMvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE5NiArMCwwIEBACi0jc2V0KCAkc3ltYm9sX3BvdW5kID0gJyMnICkKLSNzZXQoICRzeW1ib2xfZG9sbGFyID0gJyQnICkKLSNzZXQoICRzeW1ib2xfZXNjYXBlID0gJ1wnICkKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTwhLS0gVGhpcyBpcyB0aGUgcHJvamVjdCBkZXNjcmlwdG9yIGZvciB0aGUgZXhhbXBsZXMgb2YgbXkgY29tcG9uZW50cyAtLT4KLQotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIKLSAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgotICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLSAgICA8YXJ0aWZhY3RJZD4ke2FydGlmYWN0SWR9LWV4YW1wbGVzPC9hcnRpZmFjdElkPgotICAgIDxwYWNrYWdpbmc+d2FyPC9wYWNrYWdpbmc+Ci0gICAgPG5hbWU+TXkgQ29tcG9uZW50cyBFeGFtcGxlczwvbmFtZT4KLQotICAgIDxwYXJlbnQ+Ci0gICAgICAgIDxncm91cElkPiR7Z3JvdXBJZH08L2dyb3VwSWQ+Ci0gICAgICAgIDxhcnRpZmFjdElkPiR7YXJ0aWZhY3RJZH0tcHJvamVjdDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPHZlcnNpb24+JHt2ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICA8L3BhcmVudD4KLQotICAgIDxwcm9wZXJ0aWVzPgotICAgICAgICA8anNmLW15ZmFjZXMudmVyc2lvbj4xLjIuMTA8L2pzZi1teWZhY2VzLnZlcnNpb24+Ci0gICAgICAgIDxqc2YtcmkudmVyc2lvbj4xLjJfMTU8L2pzZi1yaS52ZXJzaW9uPiAgICAgICAgCi0gICAgICAgIDxtYXZlbi5qZXR0eS5wbHVnaW4udmVyc2lvbj42LjEuMjI8L21hdmVuLmpldHR5LnBsdWdpbi52ZXJzaW9uPgotICAgICAgICA8bG9nNGoudmVyc2lvbj4xLjIuMTM8L2xvZzRqLnZlcnNpb24+Ci0gICAgPC9wcm9wZXJ0aWVzPgotICAgIAotICAgIDxkZXBlbmRlbmNpZXM+Ci0gICAgICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgICAgPGdyb3VwSWQ+JHtncm91cElkfTwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPiR7YXJ0aWZhY3RJZH0tY29yZTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7c3ltYm9sX2RvbGxhcn17cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgICAgIDxncm91cElkPmNvbW1vbnMtbG9nZ2luZzwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmNvbW1vbnMtbG9nZ2luZzwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgIDx2ZXJzaW9uPjEuMS4xPC92ZXJzaW9uPgotICAgICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgotICAgICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC5zZXJ2bGV0PC9ncm91cElkPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmpzdGw8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPHZlcnNpb24+MS4yPC92ZXJzaW9uPgotICAgICAgICAgICAgICAgIDxzY29wZT5ydW50aW1lPC9zY29wZT4KLSAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4gICAgICAgICAgIAotICAgICAgICAgICAKLSAgICAgICA8L2RlcGVuZGVuY2llcz4KLQotICAgIDxwcm9maWxlcz4KLSAgICAgICAgPCEtLSBCeSBkZWZhdWx0IHRoZSB3YXIgZXhhbXBsZXMgdXNlIG15ZmFjZXMhIDopIC0tPgotICAgICAgICA8cHJvZmlsZT4KLSAgICAgICAgICAgIDxpZD5teWZhY2VzPC9pZD4KLSAgICAgICAgICAgIDxhY3RpdmF0aW9uPgotICAgICAgICAgICAgICAgIDxwcm9wZXJ0eT4KLSAgICAgICAgICAgICAgICAgICAgPG5hbWU+IWpzZjwvbmFtZT4KLSAgICAgICAgICAgICAgICA8L3Byb3BlcnR5PgotICAgICAgICAgICAgPC9hY3RpdmF0aW9uPgotICAgICAgICAgICAgPGRlcGVuZGVuY2llcz4KLSAgICAgICAgICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmNvcmU8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtYXBpPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3N5bWJvbF9kb2xsYXJ9e2pzZi1teWZhY2VzLnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmNvcmU8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtaW1wbDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtzeW1ib2xfZG9sbGFyfXtqc2YtbXlmYWNlcy52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPCEtLSBTYW5kYm94IGV4YW1wbGVzIG11c3Qgb25seSBoYXZlIHJ1bnRpbWUgZGVwZW5kZW5jeSB0byBteWZhY2VzLWltcGwKLSAgICAgICAgICAgICAgICAgc28gdGhhdCBpdCB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgYWRkZWQgdG8gd2FyLiBCdXQgdGhlcmUgbXVzdCBub3QgYmUKLSAgICAgICAgICAgICAgICAgYW55IGNvbXBpbGUgZGVwZW5kZW5jeSBvbiBpbXBsIHNvIHRoYXQgaXMgaXMgYWx3YXlzIHBvc3NpYmxlIHRvIHVzZQotICAgICAgICAgICAgICAgICBvdGhlciBKU0YgaW1wbGVtZW50YXRpb25zLiAtLT4KLSAgICAgICAgICAgICAgICAgICAgPHNjb3BlPnJ1bnRpbWU8L3Njb3BlPgotICAgICAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDwvZGVwZW5kZW5jaWVzPgotCi0gICAgICAgICAgICA8cHJvcGVydGllcz4KLSAgICAgICAgICAgICAgICA8anNmX2ltcGxlbWVudGF0aW9uPk15RmFjZXM8L2pzZl9pbXBsZW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvcHJvcGVydGllcz4KLSAgICAgICAgPC9wcm9maWxlPgotCi0gICAgICAgIDwhLS0gVG8gdXNlIHRoZSBleGFtcGxlcyB1c2luZyB0aGUgU3VuJ3MgSlNGIFJlZmVyZW5jZSBJbXBsZW1lbnRhdGlvbjogLURqc2Y9cmkgLS0+Ci0gICAgICAgIDxwcm9maWxlPgotICAgICAgICAgICAgPGlkPmpzZnJpPC9pZD4KLSAgICAgICAgICAgIDxhY3RpdmF0aW9uPgotICAgICAgICAgICAgICAgIDxwcm9wZXJ0eT4KLSAgICAgICAgICAgICAgICAgICAgPG5hbWU+anNmPC9uYW1lPgotICAgICAgICAgICAgICAgICAgICA8dmFsdWU+cmk8L3ZhbHVlPgotICAgICAgICAgICAgICAgIDwvcHJvcGVydHk+Ci0gICAgICAgICAgICA8L2FjdGl2YXRpb24+Ci0gICAgICAgICAgICA8ZGVwZW5kZW5jaWVzPgotICAgICAgICAgICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC5mYWNlczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+anNmLWFwaTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtzeW1ib2xfZG9sbGFyfXtqc2YtcmkudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICAgICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC5mYWNlczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+anNmLWltcGw8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7c3ltYm9sX2RvbGxhcn17anNmLXJpLnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgICAgICAgICA8c2NvcGU+cnVudGltZTwvc2NvcGU+Ci0gICAgICAgICAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICAgICAgPC9kZXBlbmRlbmNpZXM+Ci0KLSAgICAgICAgICAgIDxyZXBvc2l0b3JpZXM+Ci0gICAgICAgICAgICAgICAgPHJlcG9zaXRvcnk+Ci0gICAgICAgICAgICAgICAgICAgIDxpZD5qYXZhLm5ldDwvaWQ+Ci0gICAgICAgICAgICAgICAgICAgIDx1cmw+aHR0cDovL2Rvd25sb2FkLmphdmEubmV0L21hdmVuLzE8L3VybD4KLSAgICAgICAgICAgICAgICAgICAgPGxheW91dD5sZWdhY3k8L2xheW91dD4KLSAgICAgICAgICAgICAgICA8L3JlcG9zaXRvcnk+Ci0gICAgICAgICAgICA8L3JlcG9zaXRvcmllcz4KLQotICAgICAgICAgICAgPHByb3BlcnRpZXM+Ci0gICAgICAgICAgICAgICAgPGpzZl9pbXBsZW1lbnRhdGlvbj5KU0YtUkk8L2pzZl9pbXBsZW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvcHJvcGVydGllcz4KLSAgICAgICAgPC9wcm9maWxlPgotICAgICAgICA8cHJvZmlsZT4KLSAgICAgICAgICAgIDwhLS0gRGVidWcgcHJvZmlsZSBmb3IgbXlmYWNlcyBhbmQgamV0dHkuCi0gICAgICAgICAgICAgICAgSXQgYWxsb3dzIHRvIHNlZSBkZWJ1ZyBtZXNzYWdlcyB1c2luZyAtUGpldHR5Q29uZmlnIC0tPgotICAgICAgICAgICAgPGlkPmpldHR5Q29uZmlnPC9pZD4KLSAgICAgICAgICAgIDxidWlsZD4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2VzPgotICAgICAgICAgICAgICAgICAgICA8cmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PnNyYy9tYWluL3Jlc291cmNlczwvZGlyZWN0b3J5PgotICAgICAgICAgICAgICAgICAgICA8L3Jlc291cmNlPgotICAgICAgICAgICAgICAgICAgICA8cmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PnNyYy9tYWluL2xvZzRqPC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgICAgIDwvcmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgPC9yZXNvdXJjZXM+Ci0gICAgICAgICAgICAgICAgPHBsdWdpbnM+Ci0gICAgICAgICAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8IS0tVGhpcyBwbHVnaW4gYWxsb3dzIHRvIHJ1biB0aGUgZXhhbXBsZSB1c2luZyBtdm4gamV0dHk6cnVuIC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLm1vcnRiYXkuamV0dHk8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1qZXR0eS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3N5bWJvbF9kb2xsYXJ9e21hdmVuLmpldHR5LnBsdWdpbi52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzY2FuSW50ZXJ2YWxTZWNvbmRzPjEwPC9zY2FuSW50ZXJ2YWxTZWNvbmRzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzeXN0ZW1Qcm9wZXJ0aWVzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3lzdGVtUHJvcGVydHk+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5vcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c8L25hbWU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmFsdWU+b3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuaW1wbC5Mb2c0SkxvZ2dlcjwvdmFsdWU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3lzdGVtUHJvcGVydHk+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zeXN0ZW1Qcm9wZXJ0aWVzPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgICAgICAgICA8L3BsdWdpbnM+Ci0gICAgICAgICAgICA8L2J1aWxkPgotICAgICAgICAgICAgPGRlcGVuZGVuY2llcz4KLSAgICAgICAgICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+bG9nNGo8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmxvZzRqPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3N5bWJvbF9kb2xsYXJ9e2xvZzRqLnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgICAgICAgICA8dHlwZT5qYXI8L3R5cGU+Ci0gICAgICAgICAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICAgICAgPC9kZXBlbmRlbmNpZXM+Ci0gICAgICAgIDwvcHJvZmlsZT4KLSAgICA8L3Byb2ZpbGVzPgotCi0gICAgPGJ1aWxkPgotICAgICAgICA8ZmluYWxOYW1lPiR7YXJ0aWZhY3RJZH08L2ZpbmFsTmFtZT4KLSAgICAgICAgPHBsdWdpbnM+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDwhLS1UaGlzIHBsdWdpbiBhbGxvd3MgdG8gcnVuIHRoZSBleGFtcGxlIHVzaW5nIG12biBqZXR0eTpydW4gLS0+Ci0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLm1vcnRiYXkuamV0dHk8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tamV0dHktcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7c3ltYm9sX2RvbGxhcn17bWF2ZW4uamV0dHkucGx1Z2luLnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8c2NhbkludGVydmFsU2Vjb25kcz4xMDwvc2NhbkludGVydmFsU2Vjb25kcz4KLSAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgPC9wbHVnaW5zPgotICAgICAgICA8cmVzb3VyY2VzPgotICAgICAgICAgICAgPHJlc291cmNlPgotICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+c3JjL21haW4vcmVzb3VyY2VzPC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgPGZpbHRlcmluZz50cnVlPC9maWx0ZXJpbmc+Ci0gICAgICAgICAgICA8L3Jlc291cmNlPgotICAgICAgICA8L3Jlc291cmNlcz4KLSAgICA8L2J1aWxkPgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtanNmY29tcG9uZW50cy9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9leGFtcGxlcy9zcmMvbWFpbi9qYXZhL29yZy9teW9yZ2FuaXphdGlvbi9jb21wb25lbnQvZXhhbXBsZS9TYXlIZWxsb0JlYW4uamF2YSBiL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWpzZmNvbXBvbmVudHMvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvZXhhbXBsZXMvc3JjL21haW4vamF2YS9vcmcvbXlvcmdhbml6YXRpb24vY29tcG9uZW50L2V4YW1wbGUvU2F5SGVsbG9CZWFuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxNDFkY2EuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtanNmY29tcG9uZW50cy9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9leGFtcGxlcy9zcmMvbWFpbi9qYXZhL29yZy9teW9yZ2FuaXphdGlvbi9jb21wb25lbnQvZXhhbXBsZS9TYXlIZWxsb0JlYW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcubXlvcmdhbml6YXRpb24uY29tcG9uZW50LmV4YW1wbGU7Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5ldmVudC5BY3Rpb25FdmVudDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotaW1wb3J0IG9yZy5teW9yZ2FuaXphdGlvbi5jb252ZXJ0ZXIuUGhvbmVOdW1iZXI7Ci0KLS8qKgotICogTWFuYWdlZCBiZWFuIGZvciB0aGUgc2F5SGVsbG8gcGFnZSBleGFtcGxlCi0gKi8KLXB1YmxpYyBjbGFzcyBTYXlIZWxsb0JlYW4KLXsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhTYXlIZWxsb0JlYW4uY2xhc3MpOwotCi0gICAgcHJpdmF0ZSBTdHJpbmcgZmlyc3ROYW1lOwotICAgIHByaXZhdGUgU3RyaW5nIGxhc3ROYW1lOwotICAgIHByaXZhdGUgYm9vbGVhbiByZW5kZXJHcmVldGluZzsKLSAgICBwcml2YXRlIEludGVnZXIgb2RkTnVtYmVyOwotICAgIHByaXZhdGUgUGhvbmVOdW1iZXIgcGhvbmVOdW1iZXI7Ci0KLSAgICBwdWJsaWMgU2F5SGVsbG9CZWFuKCkKLSAgICB7Ci0gICAgICAgIHRoaXMucmVuZGVyR3JlZXRpbmcgPSBmYWxzZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzYXlJdChBY3Rpb25FdmVudCBldnQpCi0gICAgewotICAgICAgICByZW5kZXJHcmVldGluZyA9IHRydWU7Ci0KLSAgICAgICAgaWYgKGxvZy5pc0luZm9FbmFibGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvZy5pbmZvKCJUaGUgbmFtZSB0byBzYXkgaGVsbG8gaXMgJyIrZmlyc3ROYW1lKyInIGFuZCB0aGUgbGFzdCBuYW1lIGlzICciK2xhc3ROYW1lKyInLiIpOwotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEZpcnN0TmFtZSgpCi0gICAgewotICAgICAgICByZXR1cm4gZmlyc3ROYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEZpcnN0TmFtZShTdHJpbmcgZmlyc3ROYW1lKQotICAgIHsKLSAgICAgICAgdGhpcy5maXJzdE5hbWUgPSBmaXJzdE5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRMYXN0TmFtZSgpCi0gICAgewotICAgICAgICByZXR1cm4gbGFzdE5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0TGFzdE5hbWUoU3RyaW5nIGxhc3ROYW1lKQotICAgIHsKLSAgICAgICAgdGhpcy5sYXN0TmFtZSA9IGxhc3ROYW1lOwotICAgIH0KLQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNSZW5kZXJHcmVldGluZygpCi0gICAgewotICAgICAgICByZXR1cm4gcmVuZGVyR3JlZXRpbmc7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UmVuZGVyR3JlZXRpbmcoYm9vbGVhbiByZW5kZXJHcmVldGluZykKLSAgICB7Ci0gICAgICAgIHRoaXMucmVuZGVyR3JlZXRpbmcgPSByZW5kZXJHcmVldGluZzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSW50ZWdlciBnZXRPZGROdW1iZXIoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG9kZE51bWJlcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRPZGROdW1iZXIoSW50ZWdlciBvZGROdW1iZXIpCi0gICAgewotICAgICAgICB0aGlzLm9kZE51bWJlciA9IG9kZE51bWJlcjsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFN0cmluZyBzdWJtaXRPZGROdW1iZXIoKSB7Ci0gICAgICAgIHJldHVybiAiZGlzcGxheV9udW1iZXIiOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgU3RyaW5nIHN1Ym1pdFBob25lTnVtYmVyKCkgewotICAgICAgICByZXR1cm4gImRpc3BsYXlfcGhvbmUiOwotICAgIH0KLQotICAgIHB1YmxpYyBQaG9uZU51bWJlciBnZXRQaG9uZU51bWJlcigpCi0gICAgewotICAgICAgICByZXR1cm4gcGhvbmVOdW1iZXI7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UGhvbmVOdW1iZXIoUGhvbmVOdW1iZXIgcGhvbmVOdW1iZXIpCi0gICAgewotICAgICAgICB0aGlzLnBob25lTnVtYmVyID0gcGhvbmVOdW1iZXI7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtanNmY29tcG9uZW50cy9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9leGFtcGxlcy9zcmMvbWFpbi9sb2c0ai9sb2c0ai5wcm9wZXJ0aWVzIGIvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtanNmY29tcG9uZW50cy9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9leGFtcGxlcy9zcmMvbWFpbi9sb2c0ai9sb2c0ai5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ODM1MmU0Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWpzZmNvbXBvbmVudHMvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvZXhhbXBsZXMvc3JjL21haW4vbG9nNGovbG9nNGoucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0jIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotIyB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0jIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0jICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0jIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLWxvZzRqLnJvb3RMb2dnZXI9SU5GTywgQTEsIEEyCi1sb2c0ai5hcHBlbmRlci5BMT1vcmcuYXBhY2hlLmxvZzRqLkNvbnNvbGVBcHBlbmRlcgotbG9nNGouYXBwZW5kZXIuQTEubGF5b3V0PW9yZy5hcGFjaGUubG9nNGouUGF0dGVybkxheW91dAotCi0jbG9nIG9uIGEgZmlsZSBvbiB0YXJnZXQgdG9vLCB0byBtYWtlIGVhc2llciBjaGVjayBpdAotbG9nNGouYXBwZW5kZXIuQTI9b3JnLmFwYWNoZS5sb2c0ai5Sb2xsaW5nRmlsZUFwcGVuZGVyCi1sb2c0ai5hcHBlbmRlci5BMi5GaWxlPXRhcmdldC9sb2c0ai5sb2cKLWxvZzRqLmFwcGVuZGVyLkEyLk1heEZpbGVTaXplPTEwMDBLQgotIyBLZWVwIG9uZSBiYWNrdXAgZmlsZQotbG9nNGouYXBwZW5kZXIuQTIuTWF4QmFja3VwSW5kZXg9MQotbG9nNGouYXBwZW5kZXIuQTIubGF5b3V0PW9yZy5hcGFjaGUubG9nNGouUGF0dGVybkxheW91dAotbG9nNGouYXBwZW5kZXIuQTIubGF5b3V0LkNvbnZlcnNpb25QYXR0ZXJuPSVwICV0ICVjIC0gJW0lbgotCi0jIExvZyBsZXZlbCBmb3IgbXlmYWNlcyBsaWJyYXJpZXMKLWxvZzRqLmxvZ2dlci5vcmcuYXBhY2hlLmNvbW1vbnM9SU5GTwotbG9nNGoubG9nZ2VyLm9yZy5hcGFjaGUubXlmYWNlcz1UUkFDRQotbG9nNGoubG9nZ2VyLmphdmF4LmZhY2VzPVRSQUNFCi0KLSMgUHJpbnQgdGhlIGRhdGUgaW4gSVNPIDg2MDEgZm9ybWF0Ci1sb2c0ai5hcHBlbmRlci5BMS5sYXlvdXQuQ29udmVyc2lvblBhdHRlcm49JTVwIFsldF0gKCVGXDolTCkgLSAlbSVuClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtanNmY29tcG9uZW50cy9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9leGFtcGxlcy9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL215b3JnYW5pemF0aW9uL2NvbXBvbmVudC9leGFtcGxlL2J1aWxkLnByb3BlcnRpZXMgYi9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1qc2Zjb21wb25lbnRzL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL2V4YW1wbGVzL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvbXlvcmdhbml6YXRpb24vY29tcG9uZW50L2V4YW1wbGUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGRkZmEwNS4uMDAwMDAwMAotLS0gYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1qc2Zjb21wb25lbnRzL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL2V4YW1wbGVzL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvbXlvcmdhbml6YXRpb24vY29tcG9uZW50L2V4YW1wbGUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLSMgRG8gbm90IGVkaXQgdGhpcyBmaWxlLCBhcyBpdCB3aWxsIGJlIGNvbXBsZXRlZCBhdXRvbWF0aWNhbGx5Ci0jIGJ5IG1hdmVuIGR1cmluZyB0aGUgYnVpbGQgcHJvY2VzcwotbXljb21wb25lbnRzX3ZlcnNpb249JHtwb20udmVyc2lvbn0KLWpzZl9pbXBsZW1lbnRhdGlvbj0ke2pzZl9pbXBsZW1lbnRhdGlvbn0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1qc2Zjb21wb25lbnRzL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL2V4YW1wbGVzL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL2V4YW1wbGVzLWNvbmZpZy54bWwgYi9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1qc2Zjb21wb25lbnRzL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL2V4YW1wbGVzL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL2V4YW1wbGVzLWNvbmZpZy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhZmUxNmYuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtanNmY29tcG9uZW50cy9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9leGFtcGxlcy9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9leGFtcGxlcy1jb25maWcueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tCi0gICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICAgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICAgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gICAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICAgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gICAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gICAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gICAgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTwhRE9DVFlQRSBmYWNlcy1jb25maWcgUFVCTElDCi0gICItLy9TdW4gTWljcm9zeXN0ZW1zLCBJbmMuLy9EVEQgSmF2YVNlcnZlciBGYWNlcyBDb25maWcgMS4wLy9FTiIKLSAgImh0dHA6Ly9qYXZhLnN1bi5jb20vZHRkL3dlYi1mYWNlc2NvbmZpZ18xXzAuZHRkIj4KLQotPCEtLSA9PT09PT09PT09PSBGVUxMIENPTkZJR1VSQVRJT04gRklMRSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCi08IS0tIG15IGNvbXBvbmVudHMgZXhhbXBsZXMgLS0+Ci0KLTxmYWNlcy1jb25maWc+Ci0KLQotICAgIDwhLS0gTWFuYWdlZCBCZWFucyBmb3Igc2F5aGVsbG8uanNwIC0tPgotICAgIDxtYW5hZ2VkLWJlYW4+Ci0gICAgICAgIDxtYW5hZ2VkLWJlYW4tbmFtZT5zYXlIZWxsb0JlYW48L21hbmFnZWQtYmVhbi1uYW1lPgotICAgICAgICA8bWFuYWdlZC1iZWFuLWNsYXNzPm9yZy5teW9yZ2FuaXphdGlvbi5jb21wb25lbnQuZXhhbXBsZS5TYXlIZWxsb0JlYW48L21hbmFnZWQtYmVhbi1jbGFzcz4KLSAgICAgICAgPG1hbmFnZWQtYmVhbi1zY29wZT5yZXF1ZXN0PC9tYW5hZ2VkLWJlYW4tc2NvcGU+Ci0gICAgPC9tYW5hZ2VkLWJlYW4+Ci0KLSAgICA8IS0tIE5BVklHQVRJT04gUlVMRVMgLS0+Ci0KLSAgICA8bmF2aWdhdGlvbi1ydWxlPgotICAgICAgICA8bmF2aWdhdGlvbi1jYXNlPgotICAgICAgICAgICAgPGZyb20tb3V0Y29tZT5nb19ob21lPC9mcm9tLW91dGNvbWU+Ci0gICAgICAgICAgICA8dG8tdmlldy1pZD4vaG9tZS5qc3A8L3RvLXZpZXctaWQ+Ci0gICAgICAgIDwvbmF2aWdhdGlvbi1jYXNlPgotICAgIDwvbmF2aWdhdGlvbi1ydWxlPgotCi0gICAgPG5hdmlnYXRpb24tcnVsZT4KLSAgICAgICAgPGZyb20tdmlldy1pZD4vdmFsaWRhdG9yRGVtby5qc3A8L2Zyb20tdmlldy1pZD4KLSAgICAgICAgPG5hdmlnYXRpb24tY2FzZT4KLSAgICAgICAgICAgIDxmcm9tLW91dGNvbWU+ZGlzcGxheV9udW1iZXI8L2Zyb20tb3V0Y29tZT4KLSAgICAgICAgICAgIDx0by12aWV3LWlkPi92YWxpZGF0b3JEZW1vUmVzdWx0LmpzcDwvdG8tdmlldy1pZD4KLSAgICAgICAgPC9uYXZpZ2F0aW9uLWNhc2U+Ci0gICAgPC9uYXZpZ2F0aW9uLXJ1bGU+Ci0gICAgCi0gICAgPG5hdmlnYXRpb24tcnVsZT4KLSAgICAgICAgPGZyb20tdmlldy1pZD4vY29udmVydGVyRGVtby5qc3A8L2Zyb20tdmlldy1pZD4KLSAgICAgICAgPG5hdmlnYXRpb24tY2FzZT4KLSAgICAgICAgICAgIDxmcm9tLW91dGNvbWU+ZGlzcGxheV9waG9uZTwvZnJvbS1vdXRjb21lPgotICAgICAgICAgICAgPHRvLXZpZXctaWQ+L2NvbnZlcnRlckRlbW9SZXN1bHQuanNwPC90by12aWV3LWlkPgotICAgICAgICA8L25hdmlnYXRpb24tY2FzZT4KLSAgICA8L25hdmlnYXRpb24tcnVsZT4KLQotPC9mYWNlcy1jb25maWc+CmRpZmYgLS1naXQgYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1qc2Zjb21wb25lbnRzL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL2V4YW1wbGVzL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwgYi9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1qc2Zjb21wb25lbnRzL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL2V4YW1wbGVzL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyZGFmMDEuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtanNmY29tcG9uZW50cy9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9leGFtcGxlcy9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLSAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gICAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gICAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gICAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICAgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICAgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICAgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgICB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPHdlYi1hcHAgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIKLSAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL3dlYi1hcHBfMl81LnhzZCIKLSAgICAgICAgdmVyc2lvbj0iMi41Ij4KLQotICA8ZGVzY3JpcHRpb24+ZGVidWcgd2ViLnhtbDwvZGVzY3JpcHRpb24+Ci0KLSAgPGNvbnRleHQtcGFyYW0+Ci0gICAgPGRlc2NyaXB0aW9uPkNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIFVSSXMgb2YgKGFkZGl0aW9uYWwpIGZhY2VzIGNvbmZpZyBmaWxlcy4KLSAgICAgICAgICAgIChlLmcuIC9XRUItSU5GL215LWNvbmZpZy54bWwpCi0gICAgICAgICAgICBTZWUgSlNGIDEuMCBQUkQyLCAxMC4zLjIKLSAgICAgICAgICAgIEF0dGVudGlvbjogWW91IGRvIG5vdCBuZWVkIHRvIHB1dCAvV0VCLUlORi9mYWNlcy1jb25maWcueG1sIGluIGhlcmUuCi0gICAgPC9kZXNjcmlwdGlvbj4KLSAgICA8cGFyYW0tbmFtZT5qYXZheC5mYWNlcy5DT05GSUdfRklMRVM8L3BhcmFtLW5hbWU+Ci0gICAgPHBhcmFtLXZhbHVlPi9XRUItSU5GL2V4YW1wbGVzLWNvbmZpZy54bWw8L3BhcmFtLXZhbHVlPgotICA8L2NvbnRleHQtcGFyYW0+Ci0KLSAgPGNvbnRleHQtcGFyYW0+Ci0gICAgPGRlc2NyaXB0aW9uPlN0YXRlIHNhdmluZyBtZXRob2Q6ICJjbGllbnQiIG9yICJzZXJ2ZXIiICg9IGRlZmF1bHQpCi0gICAgICAgICAgICBTZWUgSlNGIFNwZWNpZmljYXRpb24gMi41LjM8L2Rlc2NyaXB0aW9uPgotICAgIDxwYXJhbS1uYW1lPmphdmF4LmZhY2VzLlNUQVRFX1NBVklOR19NRVRIT0Q8L3BhcmFtLW5hbWU+Ci0gICAgPHBhcmFtLXZhbHVlPnNlcnZlcjwvcGFyYW0tdmFsdWU+Ci0gIDwvY29udGV4dC1wYXJhbT4KLQotICA8c2VydmxldD4KLSAgICA8c2VydmxldC1uYW1lPkZhY2VzIFNlcnZsZXQ8L3NlcnZsZXQtbmFtZT4KLSAgICA8c2VydmxldC1jbGFzcz5qYXZheC5mYWNlcy53ZWJhcHAuRmFjZXNTZXJ2bGV0PC9zZXJ2bGV0LWNsYXNzPgotICAgIDxsb2FkLW9uLXN0YXJ0dXA+MTwvbG9hZC1vbi1zdGFydHVwPgotICA8L3NlcnZsZXQ+Ci0KLSAgPHNlcnZsZXQtbWFwcGluZz4KLSAgICA8c2VydmxldC1uYW1lPkZhY2VzIFNlcnZsZXQ8L3NlcnZsZXQtbmFtZT4KLSAgICA8dXJsLXBhdHRlcm4+Ki5qc2Y8L3VybC1wYXR0ZXJuPgotICA8L3NlcnZsZXQtbWFwcGluZz4KLQotICA8d2VsY29tZS1maWxlLWxpc3Q+Ci0gICAgPHdlbGNvbWUtZmlsZT5pbmRleC5qc3A8L3dlbGNvbWUtZmlsZT4KLSAgPC93ZWxjb21lLWZpbGUtbGlzdD4KLQotPC93ZWItYXBwPgpkaWZmIC0tZ2l0IGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtanNmY29tcG9uZW50cy9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9leGFtcGxlcy9zcmMvbWFpbi93ZWJhcHAvY29udmVydGVyRGVtby5qc3AgYi9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1qc2Zjb21wb25lbnRzL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL2V4YW1wbGVzL3NyYy9tYWluL3dlYmFwcC9jb252ZXJ0ZXJEZW1vLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZThiYTgzOC4uMDAwMDAwMAotLS0gYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1qc2Zjb21wb25lbnRzL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL2V4YW1wbGVzL3NyYy9tYWluL3dlYmFwcC9jb252ZXJ0ZXJEZW1vLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLTwlLS0KLSAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gICAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gICAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gICAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICAgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICAgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICAgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgICB1bmRlciB0aGUgTGljZW5zZS4KLS0tJT4KLQotPCVAIHRhZ2xpYiB1cmk9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2NvcmUiIHByZWZpeD0iZiIgJT4KLTwlQCB0YWdsaWIgdXJpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9odG1sIiBwcmVmaXg9ImgiICU+Ci08JUAgdGFnbGliIHVyaT0iaHR0cDovL3d3dy5teW9yZ2FuaXR6YXRpb24ub3JnL215Y29tcG9uZW50cyIgcHJlZml4PSJteWNvbXAiJT4KLQotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Ci08aGVhZD4KLSAgICA8dGl0bGU+TXkgSlNGIENvbXBvbmVudHMgRXhhbXBsZXM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHk+Ci0KLTxmOnZpZXc+Ci0gICAgPGg6b3V0cHV0VGV4dCB2YWx1ZT0iQ3VzdG9tIENvbnZlcnRlciBEZW1vIi8+Ci0gICAgPGY6dmVyYmF0aW0+PGhyPjwvZjp2ZXJiYXRpbT4KLQotICAgIDxoOmZvcm0+Ci0gICAgICAgIDxoOnBhbmVsR3JpZCBjb2x1bW5zPSIyIj4KLSAgICAgICAgICAgIDxoOm91dHB1dExhYmVsIGZvcj0ibnVtIiB2YWx1ZT0iRW50ZXIgeW91ciBwaG9uZSBudW1iZXIgKEFyZWEgQ29kZSAtIE51bWJlcikiIC8+Ci0gICAgICAgICAgICA8aDppbnB1dFRleHQgaWQ9Im51bSIgdmFsdWU9IiN7c2F5SGVsbG9CZWFuLnBob25lTnVtYmVyfSI+Ci0gICAgICAgICAgICAgICAgPG15Y29tcDpwaG9uZU51bWJlckNvbnZlcnRlci8+Ci0gICAgICAgICAgICA8L2g6aW5wdXRUZXh0PgotICAgICAgICAgICAgPGg6Y29tbWFuZEJ1dHRvbiB2YWx1ZT0iU3VibWl0IiBhY3Rpb249IiN7c2F5SGVsbG9CZWFuLnN1Ym1pdFBob25lTnVtYmVyfSIvPgotICAgICAgICA8L2g6cGFuZWxHcmlkPgotICAgICAgICA8aDpjb21tYW5kTGluayB2YWx1ZT0iW0hPTUVdIiBhY3Rpb249ImdvX2hvbWUiLz4KLSAgICAgICAgPGg6bWVzc2FnZXMgLz4KLSAgICA8L2g6Zm9ybT4KLTwvZjp2aWV3PgotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1qc2Zjb21wb25lbnRzL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL2V4YW1wbGVzL3NyYy9tYWluL3dlYmFwcC9jb252ZXJ0ZXJEZW1vUmVzdWx0LmpzcCBiL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWpzZmNvbXBvbmVudHMvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvZXhhbXBsZXMvc3JjL21haW4vd2ViYXBwL2NvbnZlcnRlckRlbW9SZXN1bHQuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjdkOTYwLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWpzZmNvbXBvbmVudHMvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvZXhhbXBsZXMvc3JjL21haW4vd2ViYXBwL2NvbnZlcnRlckRlbW9SZXN1bHQuanNwCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotPCUtLQotICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICAgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gICAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICAgIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICAgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gICAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gICAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gICAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICAgIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0lPgotPCVAIHRhZ2xpYiB1cmk9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2NvcmUiIHByZWZpeD0iZiIgJT4KLTwlQCB0YWdsaWIgdXJpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9odG1sIiBwcmVmaXg9ImgiICU+Ci08JUAgdGFnbGliIHVyaT0iaHR0cDovL3d3dy5teW9yZ2FuaXR6YXRpb24ub3JnL215Y29tcG9uZW50cyIgcHJlZml4PSJteWNvbXAiJT4KLQotPGh0bWw+Ci08aGVhZD4KLSAgICA8dGl0bGU+TXkgSlNGIENvbXBvbmVudHM8L3RpdGxlPgotPC9oZWFkPgotCi08Ym9keT4KLQotPGY6dmlldz4KLSAgICA8aDpmb3JtPgotICAgICAgICA8aDpwYW5lbEdyaWQgY29sdW1ucz0iMiI+Ci0gICAgICAgICAgICA8aDpvdXRwdXRMYWJlbCBmb3I9ImFyZWFDb2RlIiB2YWx1ZT0iWW91ciBhcmVhIGNvZGUgaXM6Ii8+IAotICAgICAgICAgICAgPGg6b3V0cHV0VGV4dCBpZD0iYXJlYUNvZGUiIHZhbHVlPSIje3NheUhlbGxvQmVhbi5waG9uZU51bWJlci5hcmVhQ29kZX0iLz4KLSAgICAgICAgICAgIDxoOm91dHB1dExhYmVsIGZvcj0ibnVtIiB2YWx1ZT0iWW91ciBudW1iZXIgaXM6Ii8+IAotICAgICAgICAgICAgPGg6b3V0cHV0VGV4dCBpZD0ibnVtIiB2YWx1ZT0iI3tzYXlIZWxsb0JlYW4ucGhvbmVOdW1iZXIubnVtYmVyfSIvPgotICAgICAgICAgICAgPGg6Y29tbWFuZExpbmsgdmFsdWU9IltIT01FXSIgYWN0aW9uPSJnb19ob21lIi8+Ci0gICAgICAgIDwvaDpwYW5lbEdyaWQ+Ci0gICAgPC9oOmZvcm0+Ci08L2Y6dmlldz4KLQotCi08L2JvZHk+Ci0KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWpzZmNvbXBvbmVudHMvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvZXhhbXBsZXMvc3JjL21haW4vd2ViYXBwL2hvbWUuanNwIGIvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtanNmY29tcG9uZW50cy9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9leGFtcGxlcy9zcmMvbWFpbi93ZWJhcHAvaG9tZS5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4YjIxY2EuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtanNmY29tcG9uZW50cy9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9leGFtcGxlcy9zcmMvbWFpbi93ZWJhcHAvaG9tZS5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi08JS0tCi0gICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICAgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICAgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gICAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICAgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gICAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gICAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gICAgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLSU+Ci0KLTwlQCBwYWdlIHNlc3Npb249ImZhbHNlIiBjb250ZW50VHlwZT0idGV4dC9odG1sO2NoYXJzZXQ9dXRmLTgiJT4KLTwlQCB0YWdsaWIgdXJpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9odG1sIiBwcmVmaXg9ImgiJT4KLTwlQCB0YWdsaWIgdXJpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9jb3JlIiBwcmVmaXg9ImYiJT4KLTwlQCB0YWdsaWIgdXJpPSJodHRwOi8vd3d3Lm15b3JnYW5pdHphdGlvbi5vcmcvbXljb21wb25lbnRzIiBwcmVmaXg9Im15Y29tcCIlPgotCi08aHRtbD4KLQotPGhlYWQ+Ci0gICAgPHRpdGxlPk15IEpTRiBDb21wb25lbnRzIEV4YW1wbGVzPC90aXRsZT4KLTwvaGVhZD4KLQotPGJvZHk+Ci0KLTxmOnZpZXc+Ci0gICAgPGg6Zm9ybT4KLQotICAgICAgICA8Zjpsb2FkQnVuZGxlIGJhc2VuYW1lPSJvcmcubXlvcmdhbml6YXRpb24uY29tcG9uZW50LmV4YW1wbGUuYnVpbGQiIHZhcj0iYnVpbGRJbmZvIi8+Ci0KLSAgICAgICAgPGg6cGFuZWxHcmlkIGNvbHVtbnM9IjIiPgotICAgICAgICAgICAgPGg6b3V0cHV0VGV4dCBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQiIHZhbHVlPSJNeSBKU0YgQ29tcG9uZW50cyBMaWJyYXJ5Ii8+Ci0gICAgICAgICAgICA8aDpvdXRwdXRUZXh0IHZhbHVlPSIgKFZlcnNpb24gI3tidWlsZEluZm9bJ215Y29tcG9uZW50c192ZXJzaW9uJ119LCB1c2luZyAje2J1aWxkSW5mbyBbJ2pzZl9pbXBsZW1lbnRhdGlvbiddfSkiLz4KLSAgICAgICAgPC9oOnBhbmVsR3JpZD4KLQotICAgICAgICA8aDpwYW5lbEdyaWQ+Ci0KLSAgICAgICAgICAgIDxoOm91dHB1dFRleHQgdmFsdWU9Ik15IGNvbXBvbmVudCBleGFtcGxlcyIgLz4KLSAgICAgICAgICAgIDxoOnBhbmVsR3JpZCBzdHlsZT0icGFkZGluZy1sZWZ0OjI1cHgiPgotICAgICAgICAgICAgICAgIDxoOm91dHB1dExpbmsgdmFsdWU9InNheWhlbGxvLmpzZiI+Ci0gICAgICAgICAgICAgICAgICAgIDxmOnZlcmJhdGltPnNheUhlbGxvIC0gZGVtbyBjb21wb25lbnQ8L2Y6dmVyYmF0aW0+Ci0gICAgICAgICAgICAgICAgPC9oOm91dHB1dExpbms+Ci0gICAgICAgICAgICAgICAgPGg6b3V0cHV0TGluayB2YWx1ZT0idmFsaWRhdG9yRGVtby5qc2YiPgotICAgICAgICAgICAgICAgICAgICA8Zjp2ZXJiYXRpbT5zYXlIZWxsbyAtIGRlbW8gdmFsaWRhdG9yPC9mOnZlcmJhdGltPgotICAgICAgICAgICAgICAgIDwvaDpvdXRwdXRMaW5rPgotICAgICAgICAgICAgICAgIDxoOm91dHB1dExpbmsgdmFsdWU9ImNvbnZlcnRlckRlbW8uanNmIj4KLSAgICAgICAgICAgICAgICAgICAgPGY6dmVyYmF0aW0+c2F5SGVsbG8gLSBkZW1vIGNvbnZlcnRlcjwvZjp2ZXJiYXRpbT4KLSAgICAgICAgICAgICAgICA8L2g6b3V0cHV0TGluaz4KLSAgICAgICAgICAgIDwvaDpwYW5lbEdyaWQ+Ci0KLSAgICAgICAgPC9oOnBhbmVsR3JpZD4KLQotICAgIDwvaDpmb3JtPgotPC9mOnZpZXc+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1qc2Zjb21wb25lbnRzL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL2V4YW1wbGVzL3NyYy9tYWluL3dlYmFwcC9pbmRleC5qc3AgYi9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1qc2Zjb21wb25lbnRzL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL2V4YW1wbGVzL3NyYy9tYWluL3dlYmFwcC9pbmRleC5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4MzVhYTguLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtanNmY29tcG9uZW50cy9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9leGFtcGxlcy9zcmMvbWFpbi93ZWJhcHAvaW5kZXguanNwCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotPCUtLQotICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICAgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gICAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICAgIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICAgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gICAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gICAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gICAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICAgIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0lPgotCi08anNwOmZvcndhcmQgcGFnZT0iaG9tZS5qc2YiLz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1qc2Zjb21wb25lbnRzL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL2V4YW1wbGVzL3NyYy9tYWluL3dlYmFwcC9zYXloZWxsby5qc3AgYi9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1qc2Zjb21wb25lbnRzL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL2V4YW1wbGVzL3NyYy9tYWluL3dlYmFwcC9zYXloZWxsby5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxZWM3NDAuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtanNmY29tcG9uZW50cy9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9leGFtcGxlcy9zcmMvbWFpbi93ZWJhcHAvc2F5aGVsbG8uanNwCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotPCUtLQotICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICAgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gICAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICAgIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICAgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gICAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gICAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gICAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICAgIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0lPgotCi08JUAgcGFnZSBzZXNzaW9uPSJmYWxzZSIgY29udGVudFR5cGU9InRleHQvaHRtbDtjaGFyc2V0PXV0Zi04IiU+Ci08JUAgdGFnbGliIHVyaT0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvaHRtbCIgcHJlZml4PSJoIiU+Ci08JUAgdGFnbGliIHVyaT0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvY29yZSIgcHJlZml4PSJmIiU+Ci08JUAgdGFnbGliIHVyaT0iaHR0cDovL3d3dy5teW9yZ2FuaXR6YXRpb24ub3JnL215Y29tcG9uZW50cyIgcHJlZml4PSJteWNvbXAiJT4KLQotPGh0bWw+Ci08aGVhZD4KLSAgICA8dGl0bGU+TXkgSlNGIENvbXBvbmVudHM8L3RpdGxlPgotPC9oZWFkPgotCi08Ym9keT4KLQotPGY6dmlldz4KLQotICAgIDxteWNvbXA6c2F5SGVsbG8gZmlyc3ROYW1lPSJKb2huIiBsYXN0TmFtZT0iU21pdGgiLz4KLQotICAgIDxoOm91dHB1dFRleHQgdmFsdWU9IiAocHJvYmFibHkgbm90IHlvdSwgSSBrbm93KSIvPgotCi0gICAgPGY6dmVyYmF0aW0+PGhyPjwvZjp2ZXJiYXRpbT4KLQotICAgIDxoOmZvcm0+Ci0gICAgICAgIDxoOnBhbmVsR3JpZCBjb2x1bW5zPSIyIj4KLSAgICAgICAgICAgIDxoOm91dHB1dExhYmVsIGZvcj0iaW5wdXRGaXJzdE5hbWUiIHZhbHVlPSJGaXJzdCBuYW1lIiAvPgotICAgICAgICAgICAgPGg6aW5wdXRUZXh0IGlkPSJpbnB1dEZpcnN0TmFtZSIgdmFsdWU9IiN7c2F5SGVsbG9CZWFuLmZpcnN0TmFtZX0iLz4KLQotICAgICAgICAgICAgPGg6b3V0cHV0TGFiZWwgZm9yPSJpbnB1dExhc3ROYW1lIiB2YWx1ZT0iTGFzdCBuYW1lIiAvPgotICAgICAgICAgICAgPGg6aW5wdXRUZXh0IGlkPSJpbnB1dExhc3ROYW1lIiB2YWx1ZT0iI3tzYXlIZWxsb0JlYW4ubGFzdE5hbWV9Ii8+Ci0gICAgICAgIDwvaDpwYW5lbEdyaWQ+Ci0KLSAgICAgICAgPGg6cGFuZWxHcmlkIGNvbHVtbnM9IjEiPgotCi0gICAgICAgICAgICA8aDpjb21tYW5kQnV0dG9uIHZhbHVlPSJTYXkgSGVsbG8hIiBhY3Rpb25MaXN0ZW5lcj0iI3tzYXlIZWxsb0JlYW4uc2F5SXR9Ii8+Ci0KLSAgICAgICAgICAgIDxteWNvbXA6c2F5SGVsbG8gZmlyc3ROYW1lPSIje3NheUhlbGxvQmVhbi5maXJzdE5hbWV9IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0TmFtZT0iI3tzYXlIZWxsb0JlYW4ubGFzdE5hbWV9IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW5kZXJlZD0iI3tzYXlIZWxsb0JlYW4ucmVuZGVyR3JlZXRpbmd9Ii8+Ci0KLSAgICAgICAgICAgIDxoOmNvbW1hbmRMaW5rIHZhbHVlPSJbSE9NRV0iIGFjdGlvbj0iZ29faG9tZSIvPgotCi0gICAgICAgIDwvaDpwYW5lbEdyaWQ+Ci0KLSAgICA8L2g6Zm9ybT4KLQotPC9mOnZpZXc+Ci0KLQotPC9ib2R5PgotCi08L2h0bWw+CmRpZmYgLS1naXQgYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1qc2Zjb21wb25lbnRzL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL2V4YW1wbGVzL3NyYy9tYWluL3dlYmFwcC92YWxpZGF0b3JEZW1vLmpzcCBiL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWpzZmNvbXBvbmVudHMvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvZXhhbXBsZXMvc3JjL21haW4vd2ViYXBwL3ZhbGlkYXRvckRlbW8uanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NDNjMDkxLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWpzZmNvbXBvbmVudHMvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvZXhhbXBsZXMvc3JjL21haW4vd2ViYXBwL3ZhbGlkYXRvckRlbW8uanNwCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotPCUtLQotICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICAgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gICAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICAgIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICAgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gICAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gICAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gICAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICAgIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0lPgotCi08JUAgdGFnbGliIHVyaT0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvY29yZSIgcHJlZml4PSJmIiAlPgotPCVAIHRhZ2xpYiB1cmk9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2h0bWwiIHByZWZpeD0iaCIgJT4KLTwlQCB0YWdsaWIgdXJpPSJodHRwOi8vd3d3Lm15b3JnYW5pdHphdGlvbi5vcmcvbXljb21wb25lbnRzIiBwcmVmaXg9Im15Y29tcCIlPgotCi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KLTxoZWFkPgotICAgIDx0aXRsZT5NeSBKU0YgQ29tcG9uZW50cyBFeGFtcGxlczwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keT4KLQotPGY6dmlldz4KLSAgICA8aDpvdXRwdXRUZXh0IHZhbHVlPSJDdXN0b20gVmFsaWRhdG9yIERlbW8iLz4KLSAgICA8Zjp2ZXJiYXRpbT48aHI+PC9mOnZlcmJhdGltPgotCi0gICAgPGg6Zm9ybT4KLSAgICAgICAgPGg6cGFuZWxHcmlkIGNvbHVtbnM9IjIiPgotICAgICAgICAgICAgPGg6b3V0cHV0TGFiZWwgZm9yPSJudW0iIHZhbHVlPSJFbnRlciBhbiBvZGQgbnVtYmVyIiAvPgotICAgICAgICAgICAgPGg6aW5wdXRUZXh0IGlkPSJudW0iIHZhbHVlPSIje3NheUhlbGxvQmVhbi5vZGROdW1iZXJ9Ij4KLSAgICAgICAgICAgICAgICA8bXljb21wOnZhbGlkYXRlT2RkTnVtLz4KLSAgICAgICAgICAgIDwvaDppbnB1dFRleHQ+Ci0gICAgICAgICAgICA8aDpjb21tYW5kQnV0dG9uIHZhbHVlPSJTdWJtaXQiIGFjdGlvbj0iI3tzYXlIZWxsb0JlYW4uc3VibWl0T2RkTnVtYmVyfSIvPgotICAgICAgICA8L2g6cGFuZWxHcmlkPgotICAgICAgICA8aDpjb21tYW5kTGluayB2YWx1ZT0iW0hPTUVdIiBhY3Rpb249ImdvX2hvbWUiLz4KLSAgICAgICAgPGg6bWVzc2FnZXMgLz4KLSAgICA8L2g6Zm9ybT4KLTwvZjp2aWV3PgotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1qc2Zjb21wb25lbnRzL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL2V4YW1wbGVzL3NyYy9tYWluL3dlYmFwcC92YWxpZGF0b3JEZW1vUmVzdWx0LmpzcCBiL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWpzZmNvbXBvbmVudHMvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvZXhhbXBsZXMvc3JjL21haW4vd2ViYXBwL3ZhbGlkYXRvckRlbW9SZXN1bHQuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTJiZDViLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWpzZmNvbXBvbmVudHMvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvZXhhbXBsZXMvc3JjL21haW4vd2ViYXBwL3ZhbGlkYXRvckRlbW9SZXN1bHQuanNwCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotPCUtLQotICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICAgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gICAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICAgIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICAgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gICAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gICAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gICAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICAgIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0lPgotCi08JUAgdGFnbGliIHVyaT0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvY29yZSIgcHJlZml4PSJmIiAlPgotPCVAIHRhZ2xpYiB1cmk9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2h0bWwiIHByZWZpeD0iaCIgJT4KLTwlQCB0YWdsaWIgdXJpPSJodHRwOi8vd3d3Lm15b3JnYW5pdHphdGlvbi5vcmcvbXljb21wb25lbnRzIiBwcmVmaXg9Im15Y29tcCIlPgotCi08aHRtbD4KLTxoZWFkPgotICAgIDx0aXRsZT5NeSBKU0YgQ29tcG9uZW50czwvdGl0bGU+Ci08L2hlYWQ+Ci0KLTxib2R5PgotCi08Zjp2aWV3PgotICAgIDxoOmZvcm0+Ci0gICAgICAgIDxoOnBhbmVsR3JpZCBjb2x1bW5zPSIyIj4KLSAgICAgICAgICAgIFZhbHVlIGVudGVyZWQgaXM6IDxoOm91dHB1dFRleHQgdmFsdWU9IiN7c2F5SGVsbG9CZWFuLm9kZE51bWJlcn0iLz4KLSAgICAgICAgICAgIDxoOmNvbW1hbmRMaW5rIHZhbHVlPSJbSE9NRV0iIGFjdGlvbj0iZ29faG9tZSIvPgotICAgICAgICA8L2g6cGFuZWxHcmlkPgotICAgIDwvaDpmb3JtPgotPC9mOnZpZXc+Ci0KLQotPC9ib2R5PgotCi08L2h0bWw+CmRpZmYgLS1naXQgYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1qc2Zjb21wb25lbnRzL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3BvbS54bWwgYi9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1qc2Zjb21wb25lbnRzL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjNGFlNGMuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtanNmY29tcG9uZW50cy9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIKLSAgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLSAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotICA8Z3JvdXBJZD4ke2dyb3VwSWR9PC9ncm91cElkPgotICA8YXJ0aWZhY3RJZD4ke2FydGlmYWN0SWR9LXByb2plY3Q8L2FydGlmYWN0SWQ+Ci0gIDxwYWNrYWdpbmc+cG9tPC9wYWNrYWdpbmc+Ci0gIDxuYW1lPk15IEpTRiBDb21wb25lbnRzIExpYnJhcnkgUHJvamVjdDwvbmFtZT4KLSAgPHZlcnNpb24+JHt2ZXJzaW9ufTwvdmVyc2lvbj4KLQotICA8ZGVzY3JpcHRpb24+Ci0gICAgICBUaGlzIGlzIHRoZSBwcm9qZWN0IGZvciBteSBmdW5reSBjb21wb25lbnRzLiBUaGlzIHdpbGwgYnVpbGQgYm90aCB0aGUgY29yZSBhbmQgdGhlIGV4YW1wbGVzCi0gIDwvZGVzY3JpcHRpb24+Ci0KLSAgICA8bW9kdWxlcz4KLSAgICAgICAgPG1vZHVsZT5jb3JlPC9tb2R1bGU+Ci0gICAgICAgIDxtb2R1bGU+ZXhhbXBsZXM8L21vZHVsZT4KLSAgICA8L21vZHVsZXM+Ci0KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWpzZmNvbXBvbmVudHMvc3JjL3NpdGUvYXB0L2luZGV4LmFwdCBiL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWpzZmNvbXBvbmVudHMvc3JjL3NpdGUvYXB0L2luZGV4LmFwdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjg5OGUzNC4uMDAwMDAwMAotLS0gYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1qc2Zjb21wb25lbnRzL3NyYy9zaXRlL2FwdC9pbmRleC5hcHQKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0gLS0tLS0tDQotIE15ZmFjZXMgSlNGLWNvbXBvbmVudHMgQXJjaGV0eXBlDQotIC0tLS0tLQ0KLQ0KLU92ZXJ2aWV3DQotDQotICBUaGlzIHByb2plY3QgZGVmaW5lcyBhIE1hdmVuIGFyY2hldHlwZS4gUnVubmluZyB0aGUgYXJjaGV0eXBlIHBsdWdpbiB3aXRoIHRoaXMgYXJjaGV0eXBlIHdpbGwNCi0gIGNyZWF0ZSBhIGRpcmVjdG9yeSB0cmVlIGNvbnRhaW5pbmcgdGhlIGZpbGVzIG5lZWRlZCB0byBxdWlja2x5IGdldCBzdGFydGVkIG9uIGEgbmV3IEpTRg0KLSAgY29tcG9uZW50LCBjb252ZXJ0ZXIgb3IgdmFsaWRhdG9yLg0KLQ0KLVVzYWdlDQotDQotICBVc2UgdGhlIGZvbGxvd2luZyBtYXZlbiBjb21tYW5kIGFuZCB0aGVuIHNlbGVjdCBteWZhY2VzLWFyY2hldHlwZS1qc2Zjb21wb25lbnRzIGZyb20gdGhlIG9wdGlvbnMuDQotDQotDQotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsNCi1tdm4gYXJjaGV0eXBlOmdlbmVyYXRlIC1EYXJjaGV0eXBlQ2F0YWxvZz1odHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnDQotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsNCmRpZmYgLS1naXQgYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1qc2Zjb21wb25lbnRzMjAvcG9tLnhtbCBiL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWpzZmNvbXBvbmVudHMyMC9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjNjY2NhLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWpzZmNvbXBvbmVudHMyMC9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLSAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gICAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gICAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gICAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICAgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICAgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICAgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgICB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+Ci0KLSAgPHBhcmVudD4KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29sczwvZ3JvdXBJZD4KLSAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWFyY2hldHlwZS1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+MS4wLjQtU05BUFNIT1Q8L3ZlcnNpb24+Ci0gIDwvcGFyZW50PgotCi0gICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzPC9ncm91cElkPgotICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtYXJjaGV0eXBlLWpzZmNvbXBvbmVudHMyMDwvYXJ0aWZhY3RJZD4KLSAgICA8cGFja2FnaW5nPmphcjwvcGFja2FnaW5nPgotICAgIDxuYW1lPkpTRiBDb21wb25lbnQgTGlicmFyeSBBcmNoZXR5cGUgRm9yIEpTRiAyLjA8L25hbWU+Ci0gICAgPGRlc2NyaXB0aW9uPkFyY2hldHlwZSB0byBjcmVhdGUgYSBsaWJhcnkgcHJvamVjdCBvZiBKU0YgMi4wIGNvbXBvbmVudHMgPC9kZXNjcmlwdGlvbj4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWpzZmNvbXBvbmVudHMyMC9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvTElDRU5TRS50eHQgYi9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1qc2Zjb21wb25lbnRzMjAvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL0xJQ0VOU0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjQ1Njk1Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWpzZmNvbXBvbmVudHMyMC9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvTElDRU5TRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwyMDIgKzAsMCBAQAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNAotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLwotCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04KLQotICAgMS4gRGVmaW5pdGlvbnMuCi0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4KLQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4KLQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbgotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwKLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3IKLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KLQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KLQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLgotCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dAotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLAotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgotCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcgotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLgotCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0Ci0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3NlcwotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLgotCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZwotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucwotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5Ci0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIgotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0Ci0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCi0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLgotCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4KLQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywKLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcgotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcwotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCi0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91Ci0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3IKLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZAotCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kCi0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3JrcwotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQKLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YKLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kCi0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cwotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QKLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QKLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUKLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3IKLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwKLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZAotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUKLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQKLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuCi0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucwotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcgotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgKLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuCi0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwKLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yawotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLgotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4KLQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLAotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KLQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEEKLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55Ci0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuCi0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLAotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwKLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KLQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZwotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwKLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcwotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkKLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkKLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgotCi0gICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKLQotICAgQVBQRU5ESVg6IEhvdyB0byBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLgotCi0gICAgICBUbyBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLCBhdHRhY2ggdGhlIGZvbGxvd2luZwotICAgICAgYm9pbGVycGxhdGUgbm90aWNlLCB3aXRoIHRoZSBmaWVsZHMgZW5jbG9zZWQgYnkgYnJhY2tldHMgIltdIgotICAgICAgcmVwbGFjZWQgd2l0aCB5b3VyIG93biBpZGVudGlmeWluZyBpbmZvcm1hdGlvbi4gKERvbid0IGluY2x1ZGUKLSAgICAgIHRoZSBicmFja2V0cyEpICBUaGUgdGV4dCBzaG91bGQgYmUgZW5jbG9zZWQgaW4gdGhlIGFwcHJvcHJpYXRlCi0gICAgICBjb21tZW50IHN5bnRheCBmb3IgdGhlIGZpbGUgZm9ybWF0LiBXZSBhbHNvIHJlY29tbWVuZCB0aGF0IGEKLSAgICAgIGZpbGUgb3IgY2xhc3MgbmFtZSBhbmQgZGVzY3JpcHRpb24gb2YgcHVycG9zZSBiZSBpbmNsdWRlZCBvbiB0aGUKLSAgICAgIHNhbWUgInByaW50ZWQgcGFnZSIgYXMgdGhlIGNvcHlyaWdodCBub3RpY2UgZm9yIGVhc2llcgotICAgICAgaWRlbnRpZmljYXRpb24gd2l0aGluIHRoaXJkLXBhcnR5IGFyY2hpdmVzLgotCi0gICBDb3B5cmlnaHQgW3l5eXldIFtuYW1lIG9mIGNvcHlyaWdodCBvd25lcl0KLQotICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KZGlmZiAtLWdpdCBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWpzZmNvbXBvbmVudHMyMC9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvTk9USUNFLnR4dCBiL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWpzZmNvbXBvbmVudHMyMC9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvTk9USUNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmEzZGJkNi4uMDAwMDAwMAotLS0gYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1qc2Zjb21wb25lbnRzMjAvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL05PVElDRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci09PSAgTk9USUNFIGZpbGUgY29ycmVzcG9uZGluZyB0byBzZWN0aW9uIDQoZCkgb2YgdGhlIEFwYWNoZSBMaWNlbnNlLCAgID09Ci09PSAgVmVyc2lvbiAyLjAsIGluIHRoaXMgY2FzZSBmb3IgdGhlIEFwYWNoZSBNeUZhY2VzIE1hdmVuIFBsdWdpbnMgICAgID09Ci09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgCi1UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLgotCi1Qb3J0aW9ucyBvZiB0aGlzIHNvZnR3YXJlIHdlcmUgb3JpZ2luYWxseSBiYXNlZCBvbiB0aGUgZm9sbG93aW5nOgotCi0gLSBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwNiwgT3JhY2xlIENvcnAsIDxodHRwOi8vd3d3Lm9yYWNsZS5jb20vPi4KLWFuZCBhcmUgbGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIHVuZGVyIHRoZSAKLSJTb2Z0d2FyZSBHcmFudCBhbmQgQ29ycG9yYXRlIENvbnRyaWJ1dGlvbiBMaWNlbnNlIEFncmVlbWVudCIKLQotU2VlIHRoZSBMSUNFTlNFLnR4dCBmaWxlIGZvciBpbmZvcm1hdGlvbiBvbiBhbGwgbGljZW5zZXMgCi1hc3NvY2lhdGVkIHdpdGggdGhpcyBzb2Z0d2FyZS4KZGlmZiAtLWdpdCBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWpzZmNvbXBvbmVudHMyMC9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvbWF2ZW4vYXJjaGV0eXBlLW1ldGFkYXRhLnhtbCBiL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWpzZmNvbXBvbmVudHMyMC9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvbWF2ZW4vYXJjaGV0eXBlLW1ldGFkYXRhLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMThmMzM2Ni4uMDAwMDAwMAotLS0gYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1qc2Zjb21wb25lbnRzMjAvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL21hdmVuL2FyY2hldHlwZS1tZXRhZGF0YS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTwhLS0NCi0gICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gICAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gICAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICAgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gICAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi0gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gICAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gICAgdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotPGFyY2hldHlwZS1kZXNjcmlwdG9yIHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9wbHVnaW5zL21hdmVuLWFyY2hldHlwZS1wbHVnaW4vYXJjaGV0eXBlLWRlc2NyaXB0b3IvMS4wLjAiDQotICAgICAgICAgICAgICAgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiDQotICAgICAgICAgICAgICAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvcGx1Z2lucy9tYXZlbi1hcmNoZXR5cGUtcGx1Z2luL2FyY2hldHlwZS1kZXNjcmlwdG9yLzEuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9hcmNoZXR5cGUtZGVzY3JpcHRvci0xLjAuMC54c2QiDQotDQotICAgICAgICAgICAgICAgICAgICAgIG5hbWU9Im15ZmFjZXMtYXJjaGV0eXBlLWpzZmNvbXBvbmVudHMiIHBhcnRpYWw9ImZhbHNlIj4NCi0NCi0gIDxyZXF1aXJlZFByb3BlcnRpZXMvPg0KLQ0KLSAgPG1vZHVsZXM+DQotICAgICAgPG1vZHVsZSBkaXI9ImNvcmUiIG5hbWU9Ik15IEpTRiBDb21wb25lbnRzIExpYnJhcnkiPg0KLSAgICAgICAgICA8ZmlsZVNldHM+DQotICAgICAgICAgICAgICA8IS0tIG5vIHBhY2thZ2luZyAtIHNvdXJjZSBhbHJlYWR5IHVzZXMgcGFja2FnZSBvcmcubXlvcmdhbml6YXRpb24gLS0+DQotICAgICAgICAgICAgICA8ZmlsZVNldCBmaWx0ZXJlZD0iZmFsc2UiIHBhY2thZ2VkPSJmYWxzZSI+DQotICAgICAgICAgICAgICAgICAgPGRpcmVjdG9yeT5zcmMvbWFpbi9qYXZhLzwvZGlyZWN0b3J5Pg0KLSAgICAgICAgICAgICAgPC9maWxlU2V0Pg0KLSAgICAgICAgICAgICAgPGZpbGVTZXQgZmlsdGVyZWQ9ImZhbHNlIiBwYWNrYWdlZD0iZmFsc2UiPg0KLSAgICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+c3JjL3Rlc3QvamF2YS88L2RpcmVjdG9yeT4NCi0gICAgICAgICAgICAgIDwvZmlsZVNldD4NCi0gICAgICAgICAgICAgIDxmaWxlU2V0IGZpbHRlcmVkPSJmYWxzZSIgcGFja2FnZWQ9ImZhbHNlIj4NCi0gICAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PnNyYy9tYWluL3Jlc291cmNlcy88L2RpcmVjdG9yeT4NCi0gICAgICAgICAgICAgIDwvZmlsZVNldD4NCi0gICAgICAgICAgPC9maWxlU2V0cz4NCi0gICAgICA8L21vZHVsZT4NCi0gICAgICANCi0gICAgICA8bW9kdWxlIGRpcj0iZXhhbXBsZXMiIG5hbWU9Ik15IENvbXBvbmVudHMgRXhhbXBsZXMiPg0KLSAgICAgICAgICA8ZmlsZVNldHM+DQotICAgICAgICAgICAgICA8IS0tIG5vIHBhY2thZ2luZyAtIHNvdXJjZSBhbHJlYWR5IHVzZXMgcGFja2FnZSBvcmcubXlvcmdhbml6YXRpb24gLS0+DQotICAgICAgICAgICAgICA8ZmlsZVNldCBmaWx0ZXJlZD0iZmFsc2UiIHBhY2thZ2VkPSJmYWxzZSI+DQotICAgICAgICAgICAgICAgICAgPGRpcmVjdG9yeT5zcmMvbWFpbi9qYXZhLzwvZGlyZWN0b3J5Pg0KLSAgICAgICAgICAgICAgPC9maWxlU2V0Pg0KLSAgICAgICAgICAgICAgPGZpbGVTZXQgZmlsdGVyZWQ9ImZhbHNlIiBwYWNrYWdlZD0iZmFsc2UiPg0KLSAgICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+c3JjL21haW4vbG9nNGovPC9kaXJlY3Rvcnk+DQotICAgICAgICAgICAgICA8L2ZpbGVTZXQ+DQotICAgICAgICAgICAgICA8ZmlsZVNldCBmaWx0ZXJlZD0iZmFsc2UiIHBhY2thZ2VkPSJmYWxzZSI+DQotICAgICAgICAgICAgICAgICAgPGRpcmVjdG9yeT5zcmMvbWFpbi9yZXNvdXJjZXMvPC9kaXJlY3Rvcnk+DQotICAgICAgICAgICAgICA8L2ZpbGVTZXQ+DQotICAgICAgICAgICAgICA8ZmlsZVNldCBmaWx0ZXJlZD0iZmFsc2UiIHBhY2thZ2VkPSJmYWxzZSI+DQotICAgICAgICAgICAgICAgICAgPGRpcmVjdG9yeT5zcmMvbWFpbi93ZWJhcHAvPC9kaXJlY3Rvcnk+DQotICAgICAgICAgICAgICA8L2ZpbGVTZXQ+DQotICAgICAgICAgIDwvZmlsZVNldHM+DQotICAgICAgPC9tb2R1bGU+DQotICA8L21vZHVsZXM+DQotDQotPC9hcmNoZXR5cGUtZGVzY3JpcHRvcj4NCi0NCi0NCi0NCi0NCi0NCi0NCi0NCi0NCi0NCi0NCi0NCi0NCi0NCi0NCmRpZmYgLS1naXQgYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1qc2Zjb21wb25lbnRzMjAvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvY29yZS9wb20ueG1sIGIvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtanNmY29tcG9uZW50czIwL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL2NvcmUvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWVkZjIyZS4uMDAwMDAwMAotLS0gYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1qc2Zjb21wb25lbnRzMjAvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvY29yZS9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjY3ICswLDAgQEAKLSNzZXQoICRzeW1ib2xfcG91bmQgPSAnIycgKQ0KLSNzZXQoICRzeW1ib2xfZG9sbGFyID0gJyQnICkNCi0jc2V0KCAkc3ltYm9sX2VzY2FwZSA9ICdcJyApDQotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08IS0tDQotIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiDQotICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiDQotICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPg0KLSAgICA8cGFyZW50Pg0KLSAgICAgICAgPGdyb3VwSWQ+JHtncm91cElkfTwvZ3JvdXBJZD4NCi0gICAgICAgIDxhcnRpZmFjdElkPiR7YXJ0aWZhY3RJZH0tcHJvamVjdDwvYXJ0aWZhY3RJZD4NCi0gICAgICAgIDx2ZXJzaW9uPiR7dmVyc2lvbn08L3ZlcnNpb24+DQotICAgIDwvcGFyZW50Pg0KLQ0KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+DQotICAgIDxhcnRpZmFjdElkPiR7YXJ0aWZhY3RJZH0tY29yZTwvYXJ0aWZhY3RJZD4NCi0gICAgPHBhY2thZ2luZz5qYXI8L3BhY2thZ2luZz4NCi0gICAgPG5hbWU+TXkgSlNGIENvbXBvbmVudHMgTGlicmFyeTwvbmFtZT4NCi0NCi0gICAgPGRlc2NyaXB0aW9uPg0KLSAgICAgICAgVGhpcyBpcyBteSBzdXBlciBqc2YgY29tcG9uZW50cyBsaWJyYXJ5Lg0KLSAgICA8L2Rlc2NyaXB0aW9uPg0KLQ0KLSAgICA8cHJvcGVydGllcz4NCi0gICAgICAgIDxzaG9ydG5hbWU+bXljb21wb25lbnRzPC9zaG9ydG5hbWU+DQotICAgIDwvcHJvcGVydGllcz4NCi0NCi0gICAgPGRlcGVuZGVuY2llcz4NCi0NCi0gICAgICAgIDwhLS0gY29tcGlsZSAtLT4NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPmNvbW1vbnMtbG9nZ2luZzwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5jb21tb25zLWxvZ2dpbmc8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+MS4xLjE8L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLQ0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmNvbW1vbnM8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy12YWxpZGF0b3JzMjA8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+MS4wLjE8L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLSAgICAgICAgDQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuY29tbW9uczwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWNvbnZlcnRlcnMyMDwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4xLjAuMTwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotDQotICAgICAgICA8IS0tIHByb3ZpZGVkIGRlcGVuZGVuY2llcyAtLT4NCi0NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5jb3JlPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtYXBpPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotICAgICAgICANCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5jb3JlPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtaW1wbDwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLQ0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXguc2VydmxldC5qc3A8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+anNwLWFwaTwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLQ0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXguc2VydmxldDwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5zZXJ2bGV0LWFwaTwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLSAgICAgICAgDQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29sczwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWJ1aWxkZXItYW5ub3RhdGlvbnM8L2FydGlmYWN0SWQ+IA0KLSAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotDQotICAgICAgICA8IS0tIHRlc3QgZGVwZW5kZW5jaWVzIC0tPg0KLQ0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+anVuaXQ8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+anVuaXQ8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLSAgICANCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy50ZXN0PC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtdGVzdDIwPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0NCi0gICAgPC9kZXBlbmRlbmNpZXM+DQotDQotICAgIDxidWlsZD4NCi0gICAgICAgIDxyZXNvdXJjZXM+DQotICAgICAgICAgICAgPHJlc291cmNlPg0KLSAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PnNyYy9tYWluL3Jlc291cmNlczwvZGlyZWN0b3J5Pg0KLSAgICAgICAgICAgICAgICA8ZXhjbHVkZXM+DQotICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT4qKi8qLnZtPC9leGNsdWRlPg0KLSAgICAgICAgICAgICAgICA8L2V4Y2x1ZGVzPg0KLSAgICAgICAgICAgIDwvcmVzb3VyY2U+ICAgIA0KLSAgICAgICAgPC9yZXNvdXJjZXM+DQotICAgICAgICA8cGx1Z2lucz4NCi0gICAgICAgICAgICA8cGx1Z2luPg0KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29sczwvZ3JvdXBJZD4NCi0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1idWlsZGVyLXBsdWdpbjwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+DQotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+YnVpbGQtbWV0YWRhdGE8L2dvYWw+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPm1ha2UtY29tcG9uZW50czwvZ29hbD4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+bWFrZS10YWdzPC9nb2FsPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5tYWtlLXZhbGlkYXRvcnM8L2dvYWw+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPm1ha2UtY29udmVydGVyLXRhZ3M8L2dvYWw+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPm1ha2UtdmFsaWRhdG9yLXRhZ3M8L2dvYWw+DQotICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGpzZlZlcnNpb24+Mi4wPC9qc2ZWZXJzaW9uPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPg0KLSAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4NCi0gICAgICAgICAgICAgICAgICAgICAgPGlkPm1ha2VfZmFjZXNjb25maWc8L2lkPg0KLSAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgIDx4bWxGaWxlPk1FVEEtSU5GL2ZhY2VzLWNvbmZpZy54bWw8L3htbEZpbGU+DQotICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+bWFrZS1jb25maWc8L2dvYWw+DQotICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+DQotICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4NCi0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGlkPm1ha2V0bGQ8L2lkPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eG1sRmlsZT5NRVRBLUlORi8ke3N5bWJvbF9kb2xsYXJ9e3Nob3J0bmFtZX0udGxkPC94bWxGaWxlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGVGaWxlPm15Y29tcG9uZW50cy50bGQudm08L3RlbXBsYXRlRmlsZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmFtcz4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNob3J0bmFtZT4ke3N5bWJvbF9kb2xsYXJ9e3Nob3J0bmFtZX08L3Nob3J0bmFtZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHVyaT5odHRwOi8vd3d3Lm15b3JnYW5pdHphdGlvbi5vcmcvJHtzeW1ib2xfZG9sbGFyfXtzaG9ydG5hbWV9PC91cmk+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXNwbGF5bmFtZT5DdXN0b20gdGFnIGxpYnJhcnkuPC9kaXNwbGF5bmFtZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPkVuaGFuY2VkIHN0YW5kYXJkIEpTUCBhY3Rpb25zIGFuZCBjdXN0b20gTXlGYWNlcyBhY3Rpb25zLjwvZGVzY3JpcHRpb24+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYW1zPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPm1ha2UtY29uZmlnPC9nb2FsPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+DQotICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4NCi0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGlkPm1ha2VfdGFnbGliPC9pZD4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT4ke3N5bWJvbF9kb2xsYXJ9e2Jhc2VkaXJ9L3NyYy9tYWluL3Jlc291cmNlczwvb3V0cHV0RGlyZWN0b3J5Pg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eG1sRmlsZT5NRVRBLUlORi8ke3N5bWJvbF9kb2xsYXJ9e3Nob3J0bmFtZX0udGFnbGliLnhtbDwveG1sRmlsZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlRmlsZT5mYWNlbGV0cy10YWdsaWIyMC52bTwvdGVtcGxhdGVGaWxlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYW1zPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzaG9ydG5hbWU+JHtzeW1ib2xfZG9sbGFyfXtzaG9ydG5hbWV9PC9zaG9ydG5hbWU+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHVyaT5odHRwOi8vd3d3Lm15b3JnYW5pdHphdGlvbi5vcmcvJHtzeW1ib2xfZG9sbGFyfXtzaG9ydG5hbWV9PC91cmk+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYW1zPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPm1ha2UtY29uZmlnPC9nb2FsPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+DQotICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4NCi0gICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPg0KLSAgICAgICAgICAgIDwvcGx1Z2luPg0KLSAgICAgICAgPC9wbHVnaW5zPg0KLSAgICA8L2J1aWxkPg0KLQ0KLSAgICA8cmVwb3J0aW5nPg0KLSAgICAgICAgPHBsdWdpbnM+DQotICAgICAgICAgICAgPHBsdWdpbj4NCi0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tamF2YWRvYy1wbHVnaW48L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjIuNDwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8L3BsdWdpbj4NCi0NCi0gICAgICAgICAgICA8cGx1Z2luPg0KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+DQotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWp4ci1wbHVnaW48L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjIuMTwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8L3BsdWdpbj4NCi0NCi0gICAgICAgICAgICA8cGx1Z2luPg0KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+DQotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXN1cmVmaXJlLXJlcG9ydC1wbHVnaW48L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjIuNC4zPC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDwvcGx1Z2luPg0KLSAgICAgICAgPC9wbHVnaW5zPg0KLSAgICA8L3JlcG9ydGluZz4NCi0NCi0gICAgPHByb2ZpbGVzPg0KLSAgICAgICAgPHByb2ZpbGU+DQotICAgICAgICAgICAgPGlkPmdlbmVyYXRlLXNpdGU8L2lkPg0KLSAgICAgICAgICAgIDxyZXBvcnRpbmc+DQotICAgICAgICAgICAgICAgIDxwbHVnaW5zPg0KLSAgICAgICAgICAgICAgICAgICAgPHBsdWdpbj4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5uZXQuc291cmNlZm9yZ2UubWF2ZW4tdGFnbGliPC9ncm91cElkPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXRhZ2xpYi1wbHVnaW48L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+Mi4zLjE8L3ZlcnNpb24+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YWdsaWIuc3JjLmRpcj4ke3N5bWJvbF9kb2xsYXJ9e2Jhc2VkaXJ9L3RhcmdldC9jbGFzc2VzL01FVEEtSU5GPC90YWdsaWIuc3JjLmRpcj4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRsZERvY0Rpcj4ke3N5bWJvbF9kb2xsYXJ9e2Jhc2VkaXJ9L3RhcmdldC9zaXRlL3RsZGRvYzwvdGxkRG9jRGlyPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgICAgICAgICAgIDwvcGx1Z2luPg0KLSAgICAgICAgICAgICAgICA8L3BsdWdpbnM+DQotICAgICAgICAgICAgPC9yZXBvcnRpbmc+DQotICAgICAgICA8L3Byb2ZpbGU+DQotICAgICAgICA8cHJvZmlsZT4NCi0gICAgICAgICAgICA8aWQ+Z2VuZXJhdGUtYXNzZW1ibHk8L2lkPg0KLSAgICAgICAgICAgIDxhY3RpdmF0aW9uPg0KLSAgICAgICAgICAgICAgPHByb3BlcnR5Pg0KLSAgICAgICAgICAgICAgICA8bmFtZT5wZXJmb3JtUmVsZWFzZTwvbmFtZT4NCi0gICAgICAgICAgICAgICAgPHZhbHVlPnRydWU8L3ZhbHVlPg0KLSAgICAgICAgICAgICAgPC9wcm9wZXJ0eT4NCi0gICAgICAgICAgICA8L2FjdGl2YXRpb24+DQotICAgICAgICAgICAgPGJ1aWxkPg0KLSAgICAgICAgICAgICAgICA8cGx1Z2lucz4NCi0gICAgICAgICAgICAgICAgICAgIDxwbHVnaW4+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWphdmFkb2MtcGx1Z2luPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjIuNDwvdmVyc2lvbj4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5hdHRhY2gtamF2YWRvYzwvaWQ+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+PGdvYWw+amFyPC9nb2FsPjwvZ29hbHM+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4NCi0gICAgICAgICAgICAgICAgICAgIDwvcGx1Z2luPg0KLSAgICAgICAgICAgICAgICAgICAgPHBsdWdpbj4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5uZXQuc291cmNlZm9yZ2UubWF2ZW4tdGFnbGliPC9ncm91cElkPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXRhZ2xpYi1wbHVnaW48L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+Mi4zLjE8L3ZlcnNpb24+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YWdsaWIuc3JjLmRpcj4ke3N5bWJvbF9kb2xsYXJ9e2Jhc2VkaXJ9L3RhcmdldC9jbGFzc2VzL01FVEEtSU5GPC90YWdsaWIuc3JjLmRpcj4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRsZERvY0Rpcj4ke3N5bWJvbF9kb2xsYXJ9e2Jhc2VkaXJ9L3RhcmdldC9zaXRlL3RsZGRvYzwvdGxkRG9jRGlyPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5hdHRhY2gtamF2YWRvYzwvaWQ+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+PGdvYWw+dGFnbGliZG9jamFyPC9nb2FsPjwvZ29hbHM+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4NCi0gICAgICAgICAgICAgICAgICAgIDwvcGx1Z2luPg0KLSAgICAgICAgICAgICAgICA8L3BsdWdpbnM+DQotICAgICAgICAgICAgPC9idWlsZD4NCi0gICAgICAgIDwvcHJvZmlsZT4NCi0gICAgPC9wcm9maWxlcz4NCi08L3Byb2plY3Q+DQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtanNmY29tcG9uZW50czIwL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvbXlvcmdhbml6YXRpb24vY29tcG9uZW50L3NheWhlbGxvL0Fic3RyYWN0U2F5SGVsbG8uamF2YSBiL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWpzZmNvbXBvbmVudHMyMC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL215b3JnYW5pemF0aW9uL2NvbXBvbmVudC9zYXloZWxsby9BYnN0cmFjdFNheUhlbGxvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhN2JkNGIuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtanNmY29tcG9uZW50czIwL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvbXlvcmdhbml6YXRpb24vY29tcG9uZW50L3NheWhlbGxvL0Fic3RyYWN0U2F5SGVsbG8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5teW9yZ2FuaXphdGlvbi5jb21wb25lbnQuc2F5aGVsbG87DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSU91dHB1dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5idWlsZGVyLmFubm90YXRpb24uSlNGQ29tcG9uZW50Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmJ1aWxkZXIuYW5ub3RhdGlvbi5KU0ZQcm9wZXJ0eTsNCi0NCi0vKioNCi0gKiAgIA0KLSAqICAgDQotICovDQotQEpTRkNvbXBvbmVudCgNCi0gICAgICAgIG5hbWUgPSAibXljb21wb25lbnRzOnNheUhlbGxvIiwNCi0gICAgICAgIGNsYXp6PSJvcmcubXlvcmdhbml6YXRpb24uY29tcG9uZW50LnNheWhlbGxvLlNheUhlbGxvIiwNCi0gICAgICAgIHRhZ0NsYXNzID0gIm9yZy5teW9yZ2FuaXphdGlvbi5jb21wb25lbnQuc2F5aGVsbG8uU2F5SGVsbG9UYWciKQ0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFNheUhlbGxvIGV4dGVuZHMgVUlPdXRwdXQNCi17DQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTVBPTkVOVF9UWVBFID0gIm9yZy5teW9yZ2FuaXphdGlvbi5TYXlIZWxsbyI7DQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfUkVOREVSRVJfVFlQRSA9ICJvcmcubXlvcmdhbml6YXRpb24uU2F5SGVsbG9SZW5kZXJlciI7DQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTVBPTkVOVF9GQU1JTFkgPSAiamF2YXguZmFjZXMuT3V0cHV0IjsNCi0NCi0gICAgLyoqDQotICAgICAqIFVzZXIncyBmaXJzdCBuYW1lLg0KLSAgICAgKiANCi0gICAgICovDQotICAgIEBKU0ZQcm9wZXJ0eQ0KLSAgICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldEZpcnN0TmFtZSgpOw0KLQ0KLQ0KLSAgICAvKioNCi0gICAgICogVXNlcidzIGxhc3QgbmFtZS4NCi0gICAgICogDQotICAgICAqLw0KLSAgICBASlNGUHJvcGVydHkNCi0gICAgcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRMYXN0TmFtZSgpOw0KLSAgICANCi0gICAgLyoqDQotICAgICAqIFJlbmRlcmVkIHByb3BlcnR5Lg0KLSAgICAgKiANCi0gICAgICovDQotICAgIEBKU0ZQcm9wZXJ0eShkZWZhdWx0VmFsdWU9InRydWUiKQ0KLSAgICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpc1JlbmRlcmVkKCk7ICAgICAgICAgICAgICAgICAgIA0KLX0NCmRpZmYgLS1naXQgYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1qc2Zjb21wb25lbnRzMjAvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9teW9yZ2FuaXphdGlvbi9jb21wb25lbnQvc2F5aGVsbG8vU2F5SGVsbG9SZW5kZXJlci5qYXZhIGIvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtanNmY29tcG9uZW50czIwL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvbXlvcmdhbml6YXRpb24vY29tcG9uZW50L3NheWhlbGxvL1NheUhlbGxvUmVuZGVyZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTZjNWJhMS4uMDAwMDAwMAotLS0gYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1qc2Zjb21wb25lbnRzMjAvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9teW9yZ2FuaXphdGlvbi9jb21wb25lbnQvc2F5aGVsbG8vU2F5SGVsbG9SZW5kZXJlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLm15b3JnYW5pemF0aW9uLmNvbXBvbmVudC5zYXloZWxsbzsNCi0NCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5SZXNwb25zZVdyaXRlcjsNCi1pbXBvcnQgamF2YXguZmFjZXMucmVuZGVyLlJlbmRlcmVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmJ1aWxkZXIuYW5ub3RhdGlvbi5KU0ZSZW5kZXJlcjsNCi0NCi0vKioNCi0gKiANCi0gKi8NCi1ASlNGUmVuZGVyZXIoDQotICAgcmVuZGVyS2l0SWQgPSAiSFRNTF9CQVNJQyIsDQotICAgZmFtaWx5ID0gImphdmF4LmZhY2VzLk91dHB1dCIsDQotICAgdHlwZSA9ICJvcmcubXlvcmdhbml6YXRpb24uU2F5SGVsbG9SZW5kZXJlciIpDQotcHVibGljIGNsYXNzIFNheUhlbGxvUmVuZGVyZXIgZXh0ZW5kcyBSZW5kZXJlcg0KLXsNCi0NCi0gICAgcHVibGljIHZvaWQgZGVjb2RlKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICBzdXBlci5kZWNvZGUoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCk7DQotICAgICAgICAvLyBub3RoaW5nIHRvIGRlY29kZQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIGVuY29kZUJlZ2luKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KSB0aHJvd3MgSU9FeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgc3VwZXIuZW5jb2RlQmVnaW4oZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCk7DQotICAgICAgICAvLyBubyBuZWVkIHRvIHVzZSBlbmNvZGVCZWdpbi4NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBlbmNvZGVDaGlsZHJlbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkgdGhyb3dzIElPRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIHN1cGVyLmVuY29kZUNoaWxkcmVuKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQpOw0KLSAgICAgICAgLy8gdGhpcyBjb21wb25lbnQgZG9lcyBub3QgaGF2ZSBjaGlsZHJlbg0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIGVuY29kZUVuZChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkgdGhyb3dzIElPRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIHN1cGVyLmVuY29kZUVuZChmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KTsNCi0NCi0gICAgICAgIGlmICghdWlDb21wb25lbnQuaXNSZW5kZXJlZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIFJlc3BvbnNlV3JpdGVyIHdyaXRlciA9IGZhY2VzQ29udGV4dC5nZXRSZXNwb25zZVdyaXRlcigpOw0KLQ0KLSAgICAgICAgU2F5SGVsbG8gc2F5SGVsbG8gPSAoU2F5SGVsbG8pIHVpQ29tcG9uZW50Ow0KLQ0KLSAgICAgICAgU3RyaW5nIGZpcnN0TmFtZSA9IHNheUhlbGxvLmdldEZpcnN0TmFtZSgpOw0KLSAgICAgICAgU3RyaW5nIGxhc3ROYW1lID0gc2F5SGVsbG8uZ2V0TGFzdE5hbWUoKTsNCi0NCi0gICAgICAgIHdyaXRlci53cml0ZSgiSGVsbG8gIik7DQotDQotICAgICAgICBpZiAoZmlyc3ROYW1lICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgd3JpdGVyLndyaXRlKGZpcnN0TmFtZSk7DQotICAgICAgICB9DQotDQotICAgICAgICBpZiAobGFzdE5hbWUgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB3cml0ZXIud3JpdGUoIiAiK2xhc3ROYW1lKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHdyaXRlci53cml0ZSgiISIpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWpzZmNvbXBvbmVudHMyMC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL215b3JnYW5pemF0aW9uL2NvbnZlcnRlci9QaG9uZU51bWJlci5qYXZhIGIvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtanNmY29tcG9uZW50czIwL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvbXlvcmdhbml6YXRpb24vY29udmVydGVyL1Bob25lTnVtYmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmOTU1YjcuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtanNmY29tcG9uZW50czIwL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvbXlvcmdhbml6YXRpb24vY29udmVydGVyL1Bob25lTnVtYmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcubXlvcmdhbml6YXRpb24uY29udmVydGVyOw0KLQ0KLXB1YmxpYyBjbGFzcyBQaG9uZU51bWJlcg0KLXsNCi0gICAgcHJpdmF0ZSBTdHJpbmcgYXJlYUNvZGU7DQotICAgIHByaXZhdGUgU3RyaW5nIG51bWJlcjsNCi0gICAgDQotICAgIHB1YmxpYyBQaG9uZU51bWJlcihTdHJpbmcgbnVtYmVyKSANCi0gICAgew0KLSAgICAgICAgdGhpcy5udW1iZXIgPSBudW1iZXI7DQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyBQaG9uZU51bWJlcihTdHJpbmcgYXJlYUNvZGUsIFN0cmluZyBudW1iZXIpIA0KLSAgICB7DQotICAgICAgICB0aGlzKG51bWJlcik7DQotICAgICAgICB0aGlzLmFyZWFDb2RlID0gYXJlYUNvZGU7DQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXJlYUNvZGUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gYXJlYUNvZGU7DQotICAgIH0NCi0gICAgcHVibGljIHZvaWQgc2V0QXJlYUNvZGUoU3RyaW5nIGFyZWFDb2RlKQ0KLSAgICB7DQotICAgICAgICB0aGlzLmFyZWFDb2RlID0gYXJlYUNvZGU7DQotICAgIH0NCi0gICAgcHVibGljIFN0cmluZyBnZXROdW1iZXIoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbnVtYmVyOw0KLSAgICB9DQotICAgIHB1YmxpYyB2b2lkIHNldE51bWJlcihTdHJpbmcgbnVtYmVyKQ0KLSAgICB7DQotICAgICAgICB0aGlzLm51bWJlciA9IG51bWJlcjsNCi0gICAgfQ0KLSAgICANCi19DQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtanNmY29tcG9uZW50czIwL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvbXlvcmdhbml6YXRpb24vY29udmVydGVyL1Bob25lTnVtYmVyQ29udmVydGVyLmphdmEgYi9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1qc2Zjb21wb25lbnRzMjAvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9teW9yZ2FuaXphdGlvbi9jb252ZXJ0ZXIvUGhvbmVOdW1iZXJDb252ZXJ0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGYxMDViMi4uMDAwMDAwMAotLS0gYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1qc2Zjb21wb25lbnRzMjAvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9teW9yZ2FuaXphdGlvbi9jb252ZXJ0ZXIvUGhvbmVOdW1iZXJDb252ZXJ0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5teW9yZ2FuaXphdGlvbi5jb252ZXJ0ZXI7DQotDQotaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5hcHBsaWNhdGlvbi5GYWNlc01lc3NhZ2U7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnZlcnQuQ29udmVydGVyOw0KLWltcG9ydCBqYXZheC5mYWNlcy5jb252ZXJ0LkNvbnZlcnRlckV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5idWlsZGVyLmFubm90YXRpb24uSlNGQ29udmVydGVyOw0KLQ0KLS8qKg0KLSAqIA0KLSAqLw0KLUBKU0ZDb252ZXJ0ZXIoDQotICAgbmFtZSA9ICJteWNvbXBvbmVudHM6cGhvbmVOdW1iZXJDb252ZXJ0ZXIiLA0KLSAgIHRhZ0NsYXNzID0gIm9yZy5teW9yZ2FuaXphdGlvbi5jb252ZXJ0ZXIuUGhvbmVOdW1iZXJDb252ZXJ0ZXJUYWciKQ0KLXB1YmxpYyBjbGFzcyBQaG9uZU51bWJlckNvbnZlcnRlcg0KLSAgICAgICAgaW1wbGVtZW50cyBDb252ZXJ0ZXINCi17DQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlZFUlRFUl9JRCA9ICJqYXZheC5mYWNlcy5QaG9uZU51bWJlciI7DQotICAgIA0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIFBIT05FX05VTUJFUl9QQVRURVJOID0gUGF0dGVybi5jb21waWxlKCIoXFxkKSo/KC0pPz8oXFxkKSsrIik7DQotICAgIA0KLSAgICBwdWJsaWMgT2JqZWN0IGdldEFzT2JqZWN0KEZhY2VzQ29udGV4dCBjb250ZXh0LCBVSUNvbXBvbmVudCBjb21wb25lbnQsIFN0cmluZyB2YWx1ZSkNCi0gICAgICAgICAgICB0aHJvd3MgQ29udmVydGVyRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIGlmICghUEhPTkVfTlVNQkVSX1BBVFRFUk4ubWF0Y2hlcih2YWx1ZSkubWF0Y2hlcygpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBDb252ZXJ0ZXJFeGNlcHRpb24obmV3IEZhY2VzTWVzc2FnZSgiQ2Fubm90IGNvbnZlcnQgcGhvbmUgbnVtYmVyLiBJbnNlcnQgYSBudW1iZXIgbGlrZSAxLTU1NTU1NTUiKSk7DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgICAgIFN0cmluZyBbXSBzdHJQaG9uZSA9IHZhbHVlLnNwbGl0KCItIik7DQotICAgICAgICBQaG9uZU51bWJlciBvYmpQaG9uZSA9IG51bGw7DQotICAgICAgICBpZihzdHJQaG9uZS5sZW5ndGggPT0gMikgDQotICAgICAgICB7DQotICAgICAgICAgICAgb2JqUGhvbmUgPSBuZXcgUGhvbmVOdW1iZXIoc3RyUGhvbmVbMF0sIHN0clBob25lWzFdKTsNCi0gICAgICAgIH0gDQotICAgICAgICBlbHNlIGlmKHN0clBob25lLmxlbmd0aCA9PSAxKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIG9ialBob25lID0gbmV3IFBob25lTnVtYmVyKHN0clBob25lWzBdKTsNCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgcmV0dXJuIG9ialBob25lOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXNTdHJpbmcoRmFjZXNDb250ZXh0IGNvbnRleHQsIFVJQ29tcG9uZW50IGNvbXBvbmVudCwgT2JqZWN0IHZhbHVlKQ0KLSAgICAgICAgICAgIHRocm93cyBDb252ZXJ0ZXJFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgaWYodmFsdWUgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBQaG9uZU51bWJlciBwaG9uZSA9IChQaG9uZU51bWJlcil2YWx1ZTsNCi0gICAgICAgICAgICByZXR1cm4gcGhvbmUuZ2V0QXJlYUNvZGUoKSArICItIiArIHBob25lLmdldE51bWJlcigpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1qc2Zjb21wb25lbnRzMjAvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9teW9yZ2FuaXphdGlvbi92YWxpZGF0b3IvQWJzdHJhY3RPZGROdW1iZXJWYWxpZGF0b3IuamF2YSBiL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWpzZmNvbXBvbmVudHMyMC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL215b3JnYW5pemF0aW9uL3ZhbGlkYXRvci9BYnN0cmFjdE9kZE51bWJlclZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZGE4YjI5Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWpzZmNvbXBvbmVudHMyMC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL215b3JnYW5pemF0aW9uL3ZhbGlkYXRvci9BYnN0cmFjdE9kZE51bWJlclZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLm15b3JnYW5pemF0aW9uLnZhbGlkYXRvcjsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuYXBwbGljYXRpb24uRmFjZXNNZXNzYWdlOw0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yOw0KLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yRXhjZXB0aW9uOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmJ1aWxkZXIuYW5ub3RhdGlvbi5KU0ZWYWxpZGF0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5jb21tb25zLnZhbGlkYXRvci5WYWxpZGF0b3JCYXNlOw0KLQ0KLS8qKg0KLSAqIA0KLSAqLw0KLUBKU0ZWYWxpZGF0b3IoDQotICAgbmFtZSA9ICJteWNvbXBvbmVudHM6dmFsaWRhdGVPZGROdW0iLA0KLSAgIGNsYXp6ID0gIm9yZy5teW9yZ2FuaXphdGlvbi52YWxpZGF0b3IuT2RkTnVtYmVyVmFsaWRhdG9yIiwNCi0gICB0YWdDbGFzcyA9ICJvcmcubXlvcmdhbml6YXRpb24udmFsaWRhdG9yLk9kZE51bWJlclZhbGlkYXRvclRhZyIpDQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0T2RkTnVtYmVyVmFsaWRhdG9yIGV4dGVuZHMgVmFsaWRhdG9yQmFzZQ0KLXsNCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMSURBVE9SX0lEID0gIm9yZy5teW9yZ2FuaXphdGlvbi52YWxpZGF0b3IuT2RkTnVtYmVyVmFsaWRhdG9yIjsNCi0gICAgDQotICAgIHB1YmxpYyB2b2lkIHZhbGlkYXRlKEZhY2VzQ29udGV4dCBhcmcwLCBVSUNvbXBvbmVudCBjb21wb25lbnQsIE9iamVjdCB2YWx1ZSkNCi0gICAgICAgICAgICB0aHJvd3MgVmFsaWRhdG9yRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIGlmKCEodmFsdWUgaW5zdGFuY2VvZiBJbnRlZ2VyKSkgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBWYWxpZGF0b3JFeGNlcHRpb24obmV3IEZhY2VzTWVzc2FnZSgiUGxlYXNlIGVudGVyIGFuIGludGVnZXIuIikpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICBpbnQgaW50VmFsID0gKChJbnRlZ2VyKXZhbHVlKS5pbnRWYWx1ZSgpOw0KLSAgICAgICAgaWYoaW50VmFsICUgMiA9PSAwKSB7DQotICAgICAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRvckV4Y2VwdGlvbihuZXcgRmFjZXNNZXNzYWdlKCJQbGVhc2UgZW50ZXIgYW4gb2RkIG51bWJlci4iKSk7DQotICAgICAgICB9DQotICAgIH0gICAgDQotfQ0KZGlmZiAtLWdpdCBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWpzZmNvbXBvbmVudHMyMC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9jb3JlL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9jb21wb25lbnRDbGFzczIwLnZtIGIvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtanNmY29tcG9uZW50czIwL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL2NvcmUvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL2NvbXBvbmVudENsYXNzMjAudm0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyZDkwMTQuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtanNmY29tcG9uZW50czIwL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL2NvcmUvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL2NvbXBvbmVudENsYXNzMjAudm0KKysrIC9kZXYvbnVsbApAQCAtMSw1MTggKzAsMCBAQAotIyMgVmVsb2NpdHkgdGVtcGxhdGUgdXNlZCB0byBnZW5lcmF0ZSBKU0YxLjItY29tcGF0aWJsZSBjb21wb25lbnQgY2xhc3Nlcw0KLSMjIGZyb20gY29tcG9uZW50IG1ldGEtZGF0YS4NCi0jIw0KLSMjIE5vdGUgdGhhdCB0aGVyZSBhcmUgdHdvIHR5cGVzIG9mIGNvbXBvbmVudCBnZW5lcmF0aW9uOg0KLSMjICAqICJzdWJjbGFzcyBtb2RlIiAodXNlIGFubm90YXRlZCBjbGFzcyBhcyBhIHBhcmVudCBjbGFzcykNCi0jIyAgKiAidGVtcGxhdGUgbW9kZSIgKHVzZSBhbm5vdGF0ZWQgY2xhc3MgYXMgYSB0ZW1wbGF0ZSkNCi0jIyBUaGlzIHRlbXBsYXRlIGZpbGUgaXMgdXNlZCBmb3IgYm90aC4NCi0jIw0KLSMjIFZhcmlhYmxlICRjb21wb25lbnQgcmVmZXJzIHRvIGEgQ29tcG9uZW50TWV0YSBvYmplY3QgdG8gcHJvY2Vzcw0KLSMjIFZhcmlhYmxlICR1dGlscyByZWZlcnMgdG8gYW4gaW5zdGFuY2Ugb2YgTXlmYWNlc1V0aWxzLg0KLSMjDQotIyMgV2hlbiAidGVtcGxhdGUgbW9kZSIgaXMgYmVpbmcgdXNlZCB0aGVuIHZhcmlhYmxlICRpbm5lcnNvdXJjZQ0KLSMjIGhvbGRzIGEgU3RyaW5nIGNvbnRhaW5pbmcgYWxsIHRoZSBub24tYWJzdHJhY3QgZnVuY3Rpb25zIGRlZmluZWQNCi0jIyBpbiB0aGUgYW5ub3RhdGVkIGNsYXNzLg0KLSMjDQotIyMgVGhlIGphdmEgcGFja2FnZSBvZiB0aGUgZ2VuZXJhdGVkIGNsYXNzIGlzIGFsd2F5cyB0aGUgc2FtZSBhcw0KLSMjIHRoZSBwYWNrYWdlIGluIHdoaWNoIHRoZSBhbm5vdGF0ZWQgY2xhc3MgZXhpc3RzLg0KLSMjDQotLyoNCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqIA0KLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKiANCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSAke2NvbXBvbmVudC5wYWNrYWdlTmFtZX07DQotDQotaW1wb3J0IGphdmF4LmVsLlZhbHVlRXhwcmVzc2lvbjsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5QYXJ0aWFsU3RhdGVIb2xkZXI7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5TdGF0ZUhvbGRlcjsNCi0jI2ltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuY29tcG9uZW50LkF0dGFjaGVkRGVsdGFXcmFwcGVyOw0KLSR1dGlscy5pbXBvcnRUYWdDbGFzc2VzKCRjb21wb25lbnQpDQotDQotI2lmICgkY29tcG9uZW50LmlzVGVtcGxhdGUoKSkNCi0jc2V0ICgkZ2VuZXJhdGVkQ2xhc3NQYXJlbnQgPSAkY29tcG9uZW50LnNvdXJjZUNsYXNzUGFyZW50Q2xhc3NOYW1lKQ0KLSNlbHNlDQotI3NldCAoJGdlbmVyYXRlZENsYXNzUGFyZW50ID0gJGNvbXBvbmVudC5zb3VyY2VDbGFzc05hbWUpDQotI2VuZA0KLS8vIEdlbmVyYXRlZCBmcm9tIGNsYXNzICR7Y29tcG9uZW50LnNvdXJjZUNsYXNzTmFtZX0uDQotLy8NCi0vLyBXQVJOSU5HOiBUaGlzIGZpbGUgd2FzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkLiBEbyBub3QgZWRpdCBpdCBkaXJlY3RseSwNCi0vLyAgICAgICAgICBvciB5b3Ugd2lsbCBsb3NlIHlvdXIgY2hhbmdlcy4NCi1wdWJsaWMgY2xhc3MgJHt1dGlscy5nZXRDbGFzc0Zyb21GdWxsQ2xhc3MoJGNvbXBvbmVudC5jbGFzc05hbWUpfSBleHRlbmRzICRnZW5lcmF0ZWRDbGFzc1BhcmVudA0KLSNpZiAoJGNvbXBvbmVudC5pbXBsZW1lbnRzKQ0KLSAgICBpbXBsZW1lbnRzICRjb21wb25lbnQuaW1wbGVtZW50cw0KLSNlbmQNCi17DQotI2lmICgkY29tcG9uZW50LnNlcmlhbHVpZCkNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gJHtjb21wb25lbnQuc2VyaWFsdWlkfTsgDQotI2VuZCAgDQotDQotICAgIHN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIENPTVBPTkVOVF9GQU1JTFkgPQ0KLSAgICAgICAgIiRjb21wb25lbnQuZmFtaWx5IjsNCi0gICAgc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgQ09NUE9ORU5UX1RZUEUgPQ0KLSAgICAgICAgIiRjb21wb25lbnQudHlwZSI7DQotI2lmICgkY29tcG9uZW50LnJlbmRlcmVyVHlwZSkNCi0jaWYgKCEoJGNvbXBvbmVudC5yZW5kZXJlclR5cGUgPT0gIiIpKQ0KLSAgICBzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1JFTkRFUkVSX1RZUEUgPSANCi0gICAgICAgICIkY29tcG9uZW50LnJlbmRlcmVyVHlwZSI7DQotI2VuZA0KLSNlbmQNCi0NCi0jaWYgKCRpbm5lcnNvdXJjZSkNCi0gICAgLy9CRUdJTiBDT0RFIENPUElFRCBGUk9NICRjb21wb25lbnQuc291cmNlQ2xhc3NOYW1lIA0KLSRpbm5lcnNvdXJjZQ0KLSAgICAvL0VORCBDT0RFIENPUElFRCBGUk9NICRjb21wb25lbnQuc291cmNlQ2xhc3NOYW1lDQotI2VuZA0KLQ0KLSAgICBwdWJsaWMgJHt1dGlscy5nZXRDbGFzc0Zyb21GdWxsQ2xhc3MoJGNvbXBvbmVudC5jbGFzc05hbWUpfSgpDQotICAgIHsNCi0jaWYgKCRjb21wb25lbnQucmVuZGVyZXJUeXBlKQ0KLSNpZiAoJGNvbXBvbmVudC5yZW5kZXJlclR5cGUgPT0gIiIpDQotICAgICAgICBzZXRSZW5kZXJlclR5cGUobnVsbCk7DQotI2Vsc2UNCi0gICAgICAgIHNldFJlbmRlcmVyVHlwZSgiJGNvbXBvbmVudC5yZW5kZXJlclR5cGUiKTsNCi0jZW5kDQotI2Vsc2UNCi0gICAgICAgIHNldFJlbmRlcmVyVHlwZShudWxsKTsNCi0jZW5kDQotICAgIH0NCi0NCi0jIyBPbiBteWZhY2VzIDEuMSB0aGUgZmFtaWx5IGlzIGluaGVyaXRlZCwgc28gdGhpcyBjb3VsZCBiZSBjb21tZW50ZWQNCi0jIyBPbiBvdGhlciB0aGlzIHNob3VsZCBub3QgYmUgY29tbWVudGVkICAgIA0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEZhbWlseSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBDT01QT05FTlRfRkFNSUxZOw0KLSAgICB9DQotDQotIyMgSXRlcmF0ZSBvdmVyIGZ1bGwgY29tcG9uZW50IHByb3BlcnR5IGxpc3QNCi0jc2V0ICgkcHJvcGVydHlMaXN0ID0gJHtjb21wb25lbnQucHJvcGVydHlMaXN0fSkNCi0NCi0jIyBUT0RPOiB0aGlzIGNvbmRpdGlvbiBzaG91bGQgYmUgY2hlY2tlZCBmb3IgcGFyZW50IGNvbXBvbmVudHMNCi0jIyBhbmQgY3N2IGltcGxlbWVudHMNCi0jaWYgKCRjb21wb25lbnQuaXNDbGllbnRCZWhhdmlvckhvbGRlcigpKQ0KLSNpZiAoJGNvbXBvbmVudC5pc092ZXJyaWRlRXZlbnROYW1lcygpKQ0KLSAgICBzdGF0aWMgcHJpdmF0ZSBmaW5hbCBqYXZhLnV0aWwuQ29sbGVjdGlvbjxTdHJpbmc+IENMSUVOVF9FVkVOVFNfTElTVCA9IA0KLSAgICAgICAgamF2YS51dGlsLkNvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUNvbGxlY3Rpb24oDQotICAgICAgICAgICAgamF2YS51dGlsLkFycmF5cy5hc0xpc3QoDQotI3NldCAoJGNvbW1hdmFyID0gIiIpDQotI2ZvcmVhY2goICRwcm9wZXJ0eSBpbiAkcHJvcGVydHlMaXN0ICkNCi0jaWYgKCRwcm9wZXJ0eS5jbGllbnRFdmVudCkNCi0jaWYgKCRwcm9wZXJ0eS5jbGllbnRFdmVudCAhPSAiIikNCi0gICAgICAgICAgICAkY29tbWF2YXIgIiRwcm9wZXJ0eS5jbGllbnRFdmVudCINCi0jc2V0ICgkY29tbWF2YXIgPSAiLCIpICAgICAgICAgICAgDQotI2VuZA0KLSNlbmQNCi0jZW5kDQotICAgICAgICApKTsNCi0NCi0gICAgcHVibGljIGphdmEudXRpbC5Db2xsZWN0aW9uPFN0cmluZz4gZ2V0RXZlbnROYW1lcygpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBDTElFTlRfRVZFTlRTX0xJU1Q7DQotICAgIH0NCi0jZW5kDQotI2VuZA0KLSNpZiAoJGNvbXBvbmVudC5kZWZhdWx0RXZlbnROYW1lKQ0KLSNpZiAoJGNvbXBvbmVudC5pc092ZXJyaWRlRGVmYXVsdEV2ZW50TmFtZSgpKQ0KLQ0KLSAgICAvL0NsaWVudEJlaGF2aW9ySG9sZGVyIGRlZmF1bHQ6ICRjb21wb25lbnQuZGVmYXVsdEV2ZW50TmFtZQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRFdmVudE5hbWUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gIiRjb21wb25lbnQuZGVmYXVsdEV2ZW50TmFtZSI7DQotICAgIH0NCi0jZW5kDQotI2VuZA0KLQ0KLSNzZXQgKCRwcm9wZXJ0eUxpc3QgPSAke2NvbXBvbmVudC5wcm9wZXJ0eUNvbXBvbmVudExpc3R9KQ0KLSAgICANCi0jZm9yZWFjaCggJHByb3BlcnR5IGluICRwcm9wZXJ0eUxpc3QgKQ0KLSNzZXQgKCRmaWVsZCA9ICRwcm9wZXJ0eS5maWVsZE5hbWUpDQotI3NldCAoJHR5cGUgPSAkdXRpbHMuZ2V0Q2xhc3NGcm9tRnVsbENsYXNzKCRwcm9wZXJ0eS5jbGFzc05hbWUpKQ0KLSNpZigkdXRpbHMuZ2V0RGVmYXVsdFZhbHVlRmllbGQoJHByb3BlcnR5KSkgDQotI3NldCAoJGRlZmF1bHRWYWx1ZSA9ICR1dGlscy5nZXREZWZhdWx0VmFsdWVGaWVsZCgkcHJvcGVydHkpKQ0KLSNlbHNlDQotI3NldCAoJGRlZmF1bHRWYWx1ZSA9IGZhbHNlKQ0KLSNlbmQNCi0gICAgLy8gUHJvcGVydHk6ICRwcm9wZXJ0eS5uYW1lDQotI2lmICgkcHJvcGVydHkuaXNQYXJ0aWFsU3RhdGVIb2xkZXIoKSkNCi0jaWYgKCRwcm9wZXJ0eS5pc0xpdGVyYWxPbmx5KCkgfHwgJHByb3BlcnR5LmlzVGFnRXhjbHVkZWQoKSApDQotICAgIHByaXZhdGUgJHR5cGUgJGZpZWxkICNpZigkZGVmYXVsdFZhbHVlKSA9ICRkZWZhdWx0VmFsdWU7I3tlbHNlfTsje2VuZH0NCi0NCi0gICAgIA0KLSNlbHNlDQotICAgIHByaXZhdGUgJHR5cGUgJGZpZWxkOw0KLSAgICANCi0jZW5kDQotDQotICAgIHByaXZhdGUgYm9vbGVhbiBfJHV0aWxzLmdldFByZWZpeGVkUHJvcGVydHlOYW1lKCJpc1NldCIsICRwcm9wZXJ0eS5uYW1lKSgpDQotICAgIHsNCi0gICAgICAgIEJvb2xlYW4gdmFsdWUgPSAoQm9vbGVhbikgZ2V0U3RhdGVIZWxwZXIoKS5nZXQoUHJvcGVydHlLZXlzLiR7cHJvcGVydHkubmFtZX1TZXQpOw0KLSAgICAgICAgcmV0dXJuIHZhbHVlID09IG51bGwgPyBmYWxzZSA6IHZhbHVlOw0KLSAgICB9DQotDQotI2lmKCR1dGlscy5pc1ByaW1pdGl2ZUNsYXNzKCR0eXBlKSAmJiAhJHByb3BlcnR5LmlzVGFnRXhjbHVkZWQoKQ0KLSAgICAmJiAhJHByb3BlcnR5LmlzTGl0ZXJhbE9ubHkoKSApDQotICAgIHByaXZhdGUgYm9vbGVhbiAke2ZpZWxkfVNldDsNCi0gICAgDQotI2lmICgkcHJvcGVydHkuaXNTZXRNZXRob2QoKSkNCi0gICAgJHByb3BlcnR5LnNldE1ldGhvZFNjb3BlIGJvb2xlYW4gJHV0aWxzLmdldFByZWZpeGVkUHJvcGVydHlOYW1lKCJpc1NldCIsICRwcm9wZXJ0eS5uYW1lKSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAke2ZpZWxkfVNldDsNCi0gICAgfQ0KLSNlbmQNCi0jZW5kDQotI2lmKCRwcm9wZXJ0eS5pc0xvY2FsTWV0aG9kKCkpDQotI2lmKCJib29sZWFuIiA9PSAkdHlwZSkNCi0jc2V0ICgkbWV0aG9kTmFtZSA9ICR1dGlscy5nZXRQcmVmaXhlZFByb3BlcnR5TmFtZSgiaXNMb2NhbCIsICRwcm9wZXJ0eS5uYW1lKSkNCi0jZWxzZQ0KLSNzZXQgKCRtZXRob2ROYW1lID0gJHV0aWxzLmdldFByZWZpeGVkUHJvcGVydHlOYW1lKCJnZXRMb2NhbCIsICRwcm9wZXJ0eS5uYW1lKSkNCi0jZW5kDQotICAgIGZpbmFsICRwcm9wZXJ0eS5sb2NhbE1ldGhvZFNjb3BlICR0eXBlICR7bWV0aG9kTmFtZX0oKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gJGZpZWxkOw0KLSAgICB9DQotICAgICANCi0jZW5kDQotICAgIHB1YmxpYyAkdHlwZSAkdXRpbHMuZ2V0TWV0aG9kUmVhZGVyRnJvbVByb3BlcnR5KCRwcm9wZXJ0eS5uYW1lLCAkdHlwZSkoKQ0KLSAgICB7DQotI2lmICgkcHJvcGVydHkuaXNUYWdFeGNsdWRlZCgpIHx8ICRwcm9wZXJ0eS5pc0xpdGVyYWxPbmx5KCkpDQotICAgICAgICByZXR1cm4gJGZpZWxkOw0KLSNlbHNlDQotI2lmICgkdXRpbHMuaXNQcmltaXRpdmVDbGFzcygkdHlwZSkpDQotICAgICAgICBpZiAoJHtmaWVsZH1TZXQpDQotI2Vsc2UNCi0gICAgICAgIGlmICgkZmllbGQgIT0gbnVsbCkNCi0jZW5kDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuICRmaWVsZDsNCi0gICAgICAgIH0NCi0gICAgICAgIFZhbHVlRXhwcmVzc2lvbiB2YiA9IGdldFZhbHVlRXhwcmVzc2lvbigiJHByb3BlcnR5Lm5hbWUiKTsNCi0gICAgICAgIGlmICh2YiAhPSBudWxsKQ0KLSAgICAgICAgew0KLSNpZiAoJHV0aWxzLmlzUHJpbWl0aXZlQ2xhc3MoJHR5cGUpKQ0KLSAgICAgICAgICAgIHJldHVybiAoJHV0aWxzLmNhc3RJZk5lY2Vzc2FyeSgkdHlwZSkgdmIuZ2V0VmFsdWUoZ2V0RmFjZXNDb250ZXh0KCkuZ2V0RUxDb250ZXh0KCkpKS4ke3R5cGV9VmFsdWUoKTsNCi0jZWxzZQ0KLSNzZXQgKCRwcml0eXBlID0gJHV0aWxzLmdldFByaW1pdGl2ZVR5cGUoJHByb3BlcnR5LmNsYXNzTmFtZSkpDQotI2lmICgkdXRpbHMuaXNQcmltaXRpdmVDbGFzcygkcHJpdHlwZSkpDQotICAgICAgICAgICAgT2JqZWN0IHZhbHVlID0gdmIgPT0gbnVsbCA/IG51bGwgOiB2Yi5nZXRWYWx1ZShnZXRGYWNlc0NvbnRleHQoKS5nZXRFTENvbnRleHQoKSk7DQotICAgICAgICAgICAgaWYgKCEodmFsdWUgaW5zdGFuY2VvZiAkdHlwZSkpew0KLSAgICAgICAgICAgICAgICB2YWx1ZSA9ICR7dHlwZX0udmFsdWVPZih2YWx1ZS50b1N0cmluZygpKTsNCi0gICAgICAgICAgICB9ICAgICAgICAgICAgDQotICAgICAgICAgICAgcmV0dXJuICR1dGlscy5jYXN0SWZOZWNlc3NhcnkoJHR5cGUpIHZhbHVlOw0KLSNlbHNlDQotICAgICAgICAgICAgcmV0dXJuICR1dGlscy5jYXN0SWZOZWNlc3NhcnkoJHR5cGUpIHZiLmdldFZhbHVlKGdldEZhY2VzQ29udGV4dCgpLmdldEVMQ29udGV4dCgpKTsNCi0jZW5kDQotI2VuZA0KLSAgICAgICAgfQ0KLSNpZiAoJGRlZmF1bHRWYWx1ZSkNCi0gICAgICAgIHJldHVybiAkZGVmYXVsdFZhbHVlOyANCi0jZWxzZWlmICgkdXRpbHMuaXNQcmltaXRpdmVDbGFzcygkdHlwZSkpDQotICAgICAgICByZXR1cm4gJHV0aWxzLnByaW1pdGl2ZURlZmF1bHRWYWx1ZSgkdHlwZSk7DQotI2Vsc2UgICAgICAgDQotICAgICAgICByZXR1cm4gbnVsbDsNCi0jZW5kDQotI2VuZA0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkICR1dGlscy5nZXRQcmVmaXhlZFByb3BlcnR5TmFtZSgic2V0IiwgJHByb3BlcnR5Lm5hbWUpKCR0eXBlICR1dGlscy5nZXRWYXJpYWJsZUZyb21OYW1lKCRwcm9wZXJ0eS5uYW1lKSkNCi0gICAgew0KLSAgICAgICAgdGhpcy4kZmllbGQgPSAkdXRpbHMuZ2V0VmFyaWFibGVGcm9tTmFtZSgkcHJvcGVydHkubmFtZSk7DQotICAgICAgICBpZiAoaW5pdGlhbFN0YXRlTWFya2VkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgZ2V0U3RhdGVIZWxwZXIoKS5wdXQoUHJvcGVydHlLZXlzLiR7cHJvcGVydHkubmFtZX1TZXQsQm9vbGVhbi5UUlVFKTsNCi0gICAgICAgIH0NCi0jaWYgKCR1dGlscy5pc1ByaW1pdGl2ZUNsYXNzKCR0eXBlKSAmJiAhJHByb3BlcnR5LmlzVGFnRXhjbHVkZWQoKSApDQotICAgICAgICB0aGlzLiR7ZmllbGR9U2V0ID0gdHJ1ZTsgICAgICAgIA0KLSNlbmQNCi0gICAgfQ0KLSNlbHNlDQotIyMgU3RhdGVIZWxwZXIgYXdhcmUgcHJvcGVydHkNCi0jaWYgKCRwcm9wZXJ0eS5uYW1lID09ICJmb3IiKQ0KLSMjIFRvIGtlZXAgY29tcGF0aWJpbGl0eSB3aXRoIFJJLCB3ZSBzaG91bGQgY2FsbCBpdCBmb3JWYWwNCi0jc2V0ICgkZmllbGQgPSAiZm9yVmFsIikNCi0jZWxzZQ0KLSNzZXQgKCRmaWVsZCA9ICRwcm9wZXJ0eS5uYW1lKQ0KLSNlbmQNCi0jaWYgKCRwcm9wZXJ0eS5pc1NldE1ldGhvZCgpKQ0KLSAgICAkcHJvcGVydHkuc2V0TWV0aG9kU2NvcGUgYm9vbGVhbiAkdXRpbHMuZ2V0UHJlZml4ZWRQcm9wZXJ0eU5hbWUoImlzU2V0IiwgJHByb3BlcnR5Lm5hbWUpKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGdldFN0YXRlSGVscGVyKCkuZ2V0KFByb3BlcnR5S2V5cy4kZmllbGQpICE9IG51bGw7DQotICAgIH0NCi0jZW5kDQotI2lmKCRwcm9wZXJ0eS5pc0xvY2FsTWV0aG9kKCkpDQotI2lmKCJib29sZWFuIiA9PSAkdHlwZSkNCi0jc2V0ICgkbWV0aG9kTmFtZSA9ICR1dGlscy5nZXRQcmVmaXhlZFByb3BlcnR5TmFtZSgiaXNMb2NhbCIsICRwcm9wZXJ0eS5uYW1lKSkNCi0jZWxzZQ0KLSNzZXQgKCRtZXRob2ROYW1lID0gJHV0aWxzLmdldFByZWZpeGVkUHJvcGVydHlOYW1lKCJnZXRMb2NhbCIsICRwcm9wZXJ0eS5uYW1lKSkNCi0jZW5kDQotICAgIGZpbmFsICRwcm9wZXJ0eS5sb2NhbE1ldGhvZFNjb3BlICR0eXBlICR7bWV0aG9kTmFtZX0oKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gJHV0aWxzLmNhc3RJZk5lY2Vzc2FyeSgkdHlwZSkgZ2V0U3RhdGVIZWxwZXIoKS5nZXQoUHJvcGVydHlLZXlzLiRmaWVsZCk7DQotICAgIH0NCi0gICAgIA0KLSNlbmQNCi0gICAgcHVibGljICR0eXBlICR1dGlscy5nZXRNZXRob2RSZWFkZXJGcm9tUHJvcGVydHkoJHByb3BlcnR5Lm5hbWUsICR0eXBlKSgpDQotICAgIHsNCi0jaWYgKCRwcm9wZXJ0eS5pc0xpdGVyYWxPbmx5KCkpDQotI2lmICgkZGVmYXVsdFZhbHVlKQ0KLSAgICAgICAgT2JqZWN0IHZhbHVlID0gZ2V0U3RhdGVIZWxwZXIoKS5nZXQoUHJvcGVydHlLZXlzLiRmaWVsZCk7DQotICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gJHV0aWxzLmNhc3RJZk5lY2Vzc2FyeSgkdHlwZSkgdmFsdWU7ICAgICAgICANCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiAkZGVmYXVsdFZhbHVlOyAgICAgICAgDQotI2Vsc2VpZiAoJHV0aWxzLmlzUHJpbWl0aXZlQ2xhc3MoJHR5cGUpKQ0KLSAgICAgICAgT2JqZWN0IHZhbHVlID0gZ2V0U3RhdGVIZWxwZXIoKS5nZXQoUHJvcGVydHlLZXlzLiRmaWVsZCk7DQotICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gJHV0aWxzLmNhc3RJZk5lY2Vzc2FyeSgkdHlwZSkgdmFsdWU7ICAgICAgICANCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiAkdXRpbHMucHJpbWl0aXZlRGVmYXVsdFZhbHVlKCR0eXBlKTsNCi0jZWxzZQ0KLSAgICAgICAgcmV0dXJuICR1dGlscy5jYXN0SWZOZWNlc3NhcnkoJHR5cGUpIGdldFN0YXRlSGVscGVyKCkuZ2V0KFByb3BlcnR5S2V5cy4kZmllbGQpOyAgICAgICAgDQotI2VuZA0KLSNlbHNlDQotI2lmICgkZGVmYXVsdFZhbHVlKQ0KLSAgICAgICAgcmV0dXJuICR1dGlscy5jYXN0SWZOZWNlc3NhcnkoJHR5cGUpIGdldFN0YXRlSGVscGVyKCkuZXZhbChQcm9wZXJ0eUtleXMuJGZpZWxkLCAkZGVmYXVsdFZhbHVlKTsNCi0jZWxzZWlmICgkdXRpbHMuaXNQcmltaXRpdmVDbGFzcygkdHlwZSkpDQotICAgICAgICBPYmplY3QgdmFsdWUgPSAkdXRpbHMuY2FzdElmTmVjZXNzYXJ5KCR0eXBlKSBnZXRTdGF0ZUhlbHBlcigpLmV2YWwoUHJvcGVydHlLZXlzLiRmaWVsZCk7DQotICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gJHV0aWxzLmNhc3RJZk5lY2Vzc2FyeSgkdHlwZSkgdmFsdWU7ICAgICAgICANCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiAkdXRpbHMucHJpbWl0aXZlRGVmYXVsdFZhbHVlKCR0eXBlKTsNCi0jZWxzZQ0KLSAgICAgICAgcmV0dXJuICR1dGlscy5jYXN0SWZOZWNlc3NhcnkoJHR5cGUpIGdldFN0YXRlSGVscGVyKCkuZXZhbChQcm9wZXJ0eUtleXMuJGZpZWxkKTsNCi0jZW5kDQotI2VuZA0KLSAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgdm9pZCAkdXRpbHMuZ2V0UHJlZml4ZWRQcm9wZXJ0eU5hbWUoInNldCIsICRwcm9wZXJ0eS5uYW1lKSgkdHlwZSAkdXRpbHMuZ2V0VmFyaWFibGVGcm9tTmFtZSgkcHJvcGVydHkubmFtZSkpDQotICAgIHsNCi0gICAgICAgIGdldFN0YXRlSGVscGVyKCkucHV0KFByb3BlcnR5S2V5cy4kZmllbGQsICR1dGlscy5nZXRWYXJpYWJsZUZyb21OYW1lKCRwcm9wZXJ0eS5uYW1lKSApOyANCi0gICAgfSAgICANCi0jZW5kDQotI2VuZA0KLQ0KLSAgICBwcm90ZWN0ZWQgZW51bSBQcm9wZXJ0eUtleXMNCi0gICAgew0KLSNzZXQgKCRjb21tYSA9ICIiKQ0KLSNzZXQgKCRhZGRjID0gImZhbHNlIikNCi0jZm9yZWFjaCggJHByb3BlcnR5IGluICRwcm9wZXJ0eUxpc3QgKQ0KLSNpZiAoJHByb3BlcnR5Lm5hbWUgPT0gImZvciIpDQotI3NldCAoJGFkZGMgPSAidHJ1ZSIpDQotIyMgVG8ga2VlcCBjb21wYXRpYmlsaXR5IHdpdGggUkksIHdlIHNob3VsZCBjYWxsIGl0IGZvclZhbA0KLSNzZXQgKCRmaWVsZCA9ICJmb3JWYWwiKQ0KLSNlbHNlDQotI3NldCAoJGZpZWxkID0gJHByb3BlcnR5Lm5hbWUpDQotI2VuZA0KLSNzZXQgKCR0eXBlID0gJHV0aWxzLmdldENsYXNzRnJvbUZ1bGxDbGFzcygkcHJvcGVydHkuY2xhc3NOYW1lKSkNCi0jaWYoJHV0aWxzLmdldERlZmF1bHRWYWx1ZUZpZWxkKCRwcm9wZXJ0eSkpIA0KLSNzZXQgKCRkZWZhdWx0VmFsdWUgPSAkdXRpbHMuZ2V0RGVmYXVsdFZhbHVlRmllbGQoJHByb3BlcnR5KSkNCi0jZWxzZQ0KLSNzZXQgKCRkZWZhdWx0VmFsdWUgPSBmYWxzZSkNCi0jZW5kDQotI2lmICgkcHJvcGVydHkubmFtZSA9PSAiZm9yIikNCi0gICAgICAgICRjb21tYSAkZmllbGQoImZvciIpDQotI2Vsc2UNCi0jaWYgKCRwcm9wZXJ0eS5pc1BhcnRpYWxTdGF0ZUhvbGRlcigpKQ0KLSAgICAgICAgJGNvbW1hICR7ZmllbGR9U2V0DQotI2Vsc2UNCi0gICAgICAgICRjb21tYSAkZmllbGQNCi0jZW5kDQotI2VuZA0KLSNzZXQoJGNvbW1hID0gIiwiKQ0KLSNlbmQNCi0jaWYgKCJ0cnVlIiA9PSAkYWRkYykNCi0gICAgICAgIDsNCi0gICAgICAgIFN0cmluZyBjOw0KLSAgICAgICAgDQotICAgICAgICBQcm9wZXJ0eUtleXMoKQ0KLSAgICAgICAgew0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICAvL0NvbnN0cnVjdG9yIG5lZWRlZCBieSAiZm9yIiBwcm9wZXJ0eQ0KLSAgICAgICAgUHJvcGVydHlLZXlzKFN0cmluZyBjKQ0KLSAgICAgICAgeyANCi0gICAgICAgICAgICB0aGlzLmMgPSBjOw0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gKCh0aGlzLmMgIT0gbnVsbCkgPyB0aGlzLmMgOiBzdXBlci50b1N0cmluZygpKTsNCi0gICAgICAgIH0NCi0jZW5kDQotICAgIH0NCi0NCi0jc2V0ICgkcHJpbWl0aXZlQ291bnQgPSAxKSAjIyAkcHJvcGVydHlMaXN0LnNpemUoKSArIDEgDQotI2ZvcmVhY2goICRwcm9wZXJ0eSBpbiAkcHJvcGVydHlMaXN0ICkNCi0jaWYgKCRwcm9wZXJ0eS5pc1BhcnRpYWxTdGF0ZUhvbGRlcigpKQ0KLSNzZXQgKCRwcmltaXRpdmVDb3VudCA9ICRwcmltaXRpdmVDb3VudCArIDEpDQotI2lmKCR1dGlscy5pc1ByaW1pdGl2ZUNsYXNzKCRwcm9wZXJ0eS5jbGFzc05hbWUpKQ0KLSNzZXQgKCRwcmltaXRpdmVDb3VudCA9ICRwcmltaXRpdmVDb3VudCArIDEpDQotI2VuZA0KLSNlbmQNCi0jZW5kDQotIyMgc2F2ZVN0YXRlIGFuZCByZXN0b3JlU3RhdGUgbWV0aG9kcyBvbmx5IGhhcyBzZW5zZSBpZiB3ZSBoYXZlIHByb3BlcnRpZXMNCi0jIyB0aGF0IGRvZXMgbm90IHVzZSBTdGF0ZUhlbHBlciBjbGFzcy4NCi0jaWYgKCRwcmltaXRpdmVDb3VudCA+IDEpDQotDQotICAgIHB1YmxpYyB2b2lkIG1hcmtJbml0aWFsU3RhdGUoKQ0KLSAgICB7DQotICAgICAgICBzdXBlci5tYXJrSW5pdGlhbFN0YXRlKCk7DQotI2ZvcmVhY2goICRwcm9wZXJ0eSBpbiAkcHJvcGVydHlMaXN0ICkNCi0jc2V0ICgkZmllbGQgPSAkcHJvcGVydHkuZmllbGROYW1lKQ0KLSNpZiAoJHByb3BlcnR5LmlzUGFydGlhbFN0YXRlSG9sZGVyKCkpICAgICAgICANCi0gICAgICAgIGlmICgkZmllbGQgIT0gbnVsbCAmJiANCi0gICAgICAgICAgICAkZmllbGQgaW5zdGFuY2VvZiBQYXJ0aWFsU3RhdGVIb2xkZXIpDQotICAgICAgICB7DQotICAgICAgICAgICAgKChQYXJ0aWFsU3RhdGVIb2xkZXIpJGZpZWxkKS5tYXJrSW5pdGlhbFN0YXRlKCk7DQotICAgICAgICB9DQotI2VuZA0KLSNlbmQNCi0gICAgfQ0KLSAgICANCi0gICAgcHVibGljIHZvaWQgY2xlYXJJbml0aWFsU3RhdGUoKQ0KLSAgICB7DQotICAgICAgICBpZiAoaW5pdGlhbFN0YXRlTWFya2VkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgc3VwZXIuY2xlYXJJbml0aWFsU3RhdGUoKTsNCi0jZm9yZWFjaCggJHByb3BlcnR5IGluICRwcm9wZXJ0eUxpc3QgKQ0KLSNzZXQgKCRmaWVsZCA9ICRwcm9wZXJ0eS5maWVsZE5hbWUpDQotI2lmICgkcHJvcGVydHkuaXNQYXJ0aWFsU3RhdGVIb2xkZXIoKSkNCi0jIyAgICAgICAgICAvL09ubHkgaGFzIHNlbnNlIHByb3BhZ2F0ZSB0aGlzIG1ldGhvZCBpZiBpcyBpbml0aWFsU3RhdGVNYXJrZWQNCi0gICAgICAgICAgICBpZiAoJGZpZWxkICE9IG51bGwgJiYgDQotICAgICAgICAgICAgICAgICRmaWVsZCBpbnN0YW5jZW9mIFBhcnRpYWxTdGF0ZUhvbGRlcikNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICgoUGFydGlhbFN0YXRlSG9sZGVyKSRmaWVsZCkuY2xlYXJJbml0aWFsU3RhdGUoKTsNCi0gICAgICAgICAgICB9DQotI2VuZA0KLSNlbmQNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIE9iamVjdCBzYXZlU3RhdGUoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCkNCi0gICAgew0KLSAgICAgICAgaWYgKGluaXRpYWxTdGF0ZU1hcmtlZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGJvb2xlYW4gbnVsbERlbHRhID0gdHJ1ZTsNCi0gICAgICAgICAgICBPYmplY3QgcGFyZW50U2F2ZWQgPSBzdXBlci5zYXZlU3RhdGUoZmFjZXNDb250ZXh0KTsNCi0jc2V0ICgkYXJyYXlJbmRleCA9IDApDQotI2ZvcmVhY2goICRwcm9wZXJ0eSBpbiAkcHJvcGVydHlMaXN0ICkNCi0jc2V0ICgkZmllbGQgPSAkcHJvcGVydHkuZmllbGROYW1lKQ0KLSNzZXQgKCR0eXBlID0gJHByb3BlcnR5LmNsYXNzTmFtZSkNCi0jaWYgKCRwcm9wZXJ0eS5pc1BhcnRpYWxTdGF0ZUhvbGRlcigpKQ0KLSNzZXQgKCRhcnJheUluZGV4ID0gJGFycmF5SW5kZXggKyAxKQ0KLSAgICAgICAgICAgIE9iamVjdCAke3Byb3BlcnR5Lm5hbWV9U2F2ZWQgPSBudWxsOw0KLSAgICAgICAgICAgIGlmICghXyR1dGlscy5nZXRQcmVmaXhlZFByb3BlcnR5TmFtZSgiaXNTZXQiLCAkcHJvcGVydHkubmFtZSkoKSAmJg0KLSAgICAgICAgICAgICAgICAkZmllbGQgIT0gbnVsbCAmJiAkZmllbGQgaW5zdGFuY2VvZiBQYXJ0aWFsU3RhdGVIb2xkZXIpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAvL0RlbHRhDQotICAgICAgICAgICAgICAgIFN0YXRlSG9sZGVyIGhvbGRlciA9IChTdGF0ZUhvbGRlcikgJGZpZWxkOw0KLSAgICAgICAgICAgICAgICBpZiAoIWhvbGRlci5pc1RyYW5zaWVudCgpKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBPYmplY3QgYXR0YWNoZWRTdGF0ZSA9IGhvbGRlci5zYXZlU3RhdGUoZmFjZXNDb250ZXh0KTsNCi0gICAgICAgICAgICAgICAgICAgIGlmIChhdHRhY2hlZFN0YXRlICE9IG51bGwpDQotICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgbnVsbERlbHRhID0gZmFsc2U7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAke3Byb3BlcnR5Lm5hbWV9U2F2ZWQgPSBuZXcgQXR0YWNoZWREZWx0YVdyYXBwZXIoJHtmaWVsZH0uZ2V0Q2xhc3MoKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICBhdHRhY2hlZFN0YXRlKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlbHNlIGlmIChfJHV0aWxzLmdldFByZWZpeGVkUHJvcGVydHlOYW1lKCJpc1NldCIsICRwcm9wZXJ0eS5uYW1lKSgpIHx8ICRmaWVsZCAhPSBudWxsICkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIC8vRnVsbA0KLSAgICAgICAgICAgICAgICAke3Byb3BlcnR5Lm5hbWV9U2F2ZWQgPSBzYXZlQXR0YWNoZWRTdGF0ZShmYWNlc0NvbnRleHQsJGZpZWxkKTsNCi0gICAgICAgICAgICAgICAgbnVsbERlbHRhID0gZmFsc2U7DQotICAgICAgICAgICAgfSAgICAgICAgDQotIyMgU3RhdGVIZWxwZXIgUHJvcGVydGllcyBkb2VzIG5vdCBuZWVkIHNhdmUgYW5kIHJlc3RvcmUNCi0jZW5kDQotI2VuZA0KLSAgICAgICAgICAgIGlmIChwYXJlbnRTYXZlZCA9PSBudWxsICYmIG51bGxEZWx0YSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIC8vTm8gdmFsdWVzDQotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICANCi0gICAgICAgICAgICBPYmplY3RbXSB2YWx1ZXMgPSBuZXcgT2JqZWN0WyRwcmltaXRpdmVDb3VudF07DQotICAgICAgICAgICAgdmFsdWVzWzBdID0gcGFyZW50U2F2ZWQ7DQotIyMgU2F2ZSBmdWxsIHN0YXRlDQotI3NldCAoJGFycmF5SW5kZXggPSAwKQ0KLSNmb3JlYWNoKCAkcHJvcGVydHkgaW4gJHByb3BlcnR5TGlzdCApDQotI3NldCAoJGZpZWxkID0gJHByb3BlcnR5LmZpZWxkTmFtZSkNCi0jc2V0ICgkdHlwZSA9ICRwcm9wZXJ0eS5jbGFzc05hbWUpDQotI2lmICgkcHJvcGVydHkuaXNQYXJ0aWFsU3RhdGVIb2xkZXIoKSkNCi0jc2V0ICgkYXJyYXlJbmRleCA9ICRhcnJheUluZGV4ICsgMSkNCi0gICAgICAgICAgICB2YWx1ZXNbJGFycmF5SW5kZXhdID0gJHtwcm9wZXJ0eS5uYW1lfVNhdmVkOw0KLSMjIFN0YXRlSGVscGVyIFByb3BlcnRpZXMgZG9lcyBub3QgbmVlZCBzYXZlIGFuZCByZXN0b3JlDQotI2VuZA0KLSNlbmQNCi0gICAgICAgICAgICByZXR1cm4gdmFsdWVzOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIE9iamVjdFtdIHZhbHVlcyA9IG5ldyBPYmplY3RbJHByaW1pdGl2ZUNvdW50XTsNCi0gICAgICAgICAgICB2YWx1ZXNbMF0gPSBzdXBlci5zYXZlU3RhdGUoZmFjZXNDb250ZXh0KTsNCi0jIyBTYXZlIGZ1bGwgc3RhdGUNCi0jc2V0ICgkYXJyYXlJbmRleCA9IDApDQotI2ZvcmVhY2goICRwcm9wZXJ0eSBpbiAkcHJvcGVydHlMaXN0ICkNCi0jc2V0ICgkZmllbGQgPSAkcHJvcGVydHkuZmllbGROYW1lKQ0KLSNzZXQgKCR0eXBlID0gJHByb3BlcnR5LmNsYXNzTmFtZSkNCi0jaWYgKCRwcm9wZXJ0eS5pc1BhcnRpYWxTdGF0ZUhvbGRlcigpKQ0KLSNzZXQgKCRhcnJheUluZGV4ID0gJGFycmF5SW5kZXggKyAxKQ0KLSAgICAgICAgICAgIHZhbHVlc1skYXJyYXlJbmRleF0gPSBzYXZlQXR0YWNoZWRTdGF0ZShmYWNlc0NvbnRleHQsJGZpZWxkKTsNCi0jIyBTdGF0ZUhlbHBlciBQcm9wZXJ0aWVzIGRvZXMgbm90IG5lZWQgc2F2ZSBhbmQgcmVzdG9yZQ0KLSNlbmQNCi0jZW5kDQotICAgICAgICAgICAgcmV0dXJuIHZhbHVlczsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIHZvaWQgcmVzdG9yZVN0YXRlKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIE9iamVjdCBzdGF0ZSkNCi0gICAgew0KLSAgICAgICAgaWYgKHN0YXRlID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICBPYmplY3RbXSB2YWx1ZXMgPSAoT2JqZWN0W10pc3RhdGU7DQotICAgICAgICBzdXBlci5yZXN0b3JlU3RhdGUoZmFjZXNDb250ZXh0LHZhbHVlc1swXSk7DQotI3NldCAoJGFycmF5SW5kZXggPSAwKQ0KLSNmb3JlYWNoKCAkcHJvcGVydHkgaW4gJHByb3BlcnR5TGlzdCApDQotI3NldCAoJGZpZWxkID0gJHByb3BlcnR5LmZpZWxkTmFtZSkNCi0jc2V0ICgkdHlwZSA9ICRwcm9wZXJ0eS5jbGFzc05hbWUpDQotI2lmICgkcHJvcGVydHkuaXNQYXJ0aWFsU3RhdGVIb2xkZXIoKSkNCi0jc2V0ICgkYXJyYXlJbmRleCA9ICRhcnJheUluZGV4ICsgMSkNCi0gICAgICAgIGlmICh2YWx1ZXNbJGFycmF5SW5kZXhdIGluc3RhbmNlb2YgQXR0YWNoZWREZWx0YVdyYXBwZXIpDQotICAgICAgICB7DQotICAgICAgICAgICAgLy9EZWx0YQ0KLSAgICAgICAgICAgICgoU3RhdGVIb2xkZXIpJGZpZWxkKS5yZXN0b3JlU3RhdGUoZmFjZXNDb250ZXh0LCAoKEF0dGFjaGVkRGVsdGFXcmFwcGVyKSB2YWx1ZXNbJGFycmF5SW5kZXhdKS5nZXRXcmFwcGVkU3RhdGVPYmplY3QoKSk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgLy9GdWxsDQotICAgICAgICAgICAgJGZpZWxkID0gJHV0aWxzLmNhc3RJZk5lY2Vzc2FyeSgkdHlwZSkgcmVzdG9yZUF0dGFjaGVkU3RhdGUoZmFjZXNDb250ZXh0LHZhbHVlc1skYXJyYXlJbmRleF0pOw0KLSAgICAgICAgfSAgICAgICAgIA0KLSNlbHNlDQotIyMgU3RhdGVIZWxwZXIgUHJvcGVydGllcyBkb2VzIG5vdCBuZWVkIHNhdmUgYW5kIHJlc3RvcmUNCi0jZW5kDQotI2VuZA0KLSAgICB9DQotI2VuZA0KLX0NCmRpZmYgLS1naXQgYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1qc2Zjb21wb25lbnRzMjAvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvY29yZS9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvZmFjZWxldHMtdGFnbGliMjAudm0gYi9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1qc2Zjb21wb25lbnRzMjAvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvY29yZS9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvZmFjZWxldHMtdGFnbGliMjAudm0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjMjUzYTQuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtanNmY29tcG9uZW50czIwL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL2NvcmUvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL2ZhY2VsZXRzLXRhZ2xpYjIwLnZtCisrKyAvZGV2L251bGwKQEAgLTEsMzAwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLQ0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotPGZhY2VsZXQtdGFnbGliIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiDQotICAgICAgICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIg0KLSAgICAgICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL3dlYi1mYWNlbGV0dGFnbGlicmFyeV8yXzAueHNkIg0KLSAgICAgICAgICAgICAgdmVyc2lvbj0iMi4wIj4NCi0gICAgICAgICAgICAgIA0KLSAgICA8bmFtZXNwYWNlPiR1cmk8L25hbWVzcGFjZT4NCi0jaWYgKCRjb21wb3NpdGVMaWJyYXJ5KQ0KLSAgICA8Y29tcG9zaXRlLWxpYnJhcnktbmFtZT4kY29tcG9zaXRlTGlicmFyeTwvY29tcG9zaXRlLWxpYnJhcnktbmFtZT4NCi0jZW5kDQotDQotJGJhc2VDb250ZW50DQotDQotIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gU1RBUlQgTUFDUk9TIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyMNCi0jIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyMgd3JpdGVKU0ZQcm9wZXJ0eQ0KLSMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIw0KLSNtYWNybyAod3JpdGVKU0ZQcm9wZXJ0eSAkcHJvcGVydHkpDQotI2lmICghJHByb3BlcnR5LmlzVGFnRXhjbHVkZWQoKSkNCi0gICAgICAgIDxhdHRyaWJ1dGU+DQotI2lmICgkcHJvcGVydHkubG9uZ0Rlc2NyaXB0aW9uKQ0KLSAgICAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWyRwcm9wZXJ0eS5sb25nRGVzY3JpcHRpb25dXT48L2Rlc2NyaXB0aW9uPg0KLSNlbHNlDQotICAgICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbXV0+PC9kZXNjcmlwdGlvbj4NCi0jZW5kDQotICAgICAgICAgICA8bmFtZT4kcHJvcGVydHkuanNwTmFtZTwvbmFtZT4NCi0jaWYgKCRwcm9wZXJ0eS5pc1JlcXVpcmVkKCkpDQotICAgICAgICAgICA8cmVxdWlyZWQ+JHByb3BlcnR5LmlzUmVxdWlyZWQoKTwvcmVxdWlyZWQ+DQotI2VuZA0KLSNpZiAoJHByb3BlcnR5LmlzTWV0aG9kRXhwcmVzc2lvbigpIHx8ICRwcm9wZXJ0eS5pc01ldGhvZEJpbmRpbmcoKSkNCi0jaWYgKCRwcm9wZXJ0eS5nZXRNZXRob2RCaW5kaW5nU2lnbmF0dXJlKCkpDQotI3NldCAoJHNpZyA9ICRwcm9wZXJ0eS5nZXRNZXRob2RCaW5kaW5nU2lnbmF0dXJlKCkpDQotICAgICAgICAgICA8bWV0aG9kLXNpZ25hdHVyZT4kc2lnLnJldHVyblR5cGUgbXlNZXRob2QoICRzaWcucGFyYW1ldGVyVHlwZXNBc1N0cmluZyApPC9tZXRob2Qtc2lnbmF0dXJlPg0KLSNlbmQNCi0jZWxzZWlmKCRwcm9wZXJ0eS5kZWZlcnJlZFZhbHVlVHlwZSkNCi0gICAgICAgICAgIDx0eXBlPiRwcm9wZXJ0eS5kZWZlcnJlZFZhbHVlVHlwZTwvdHlwZT4NCi0jZWxzZWlmICgkdHlwZSA9PSAiU3RyaW5nIikNCi0gICAgICAgICAgIDx0eXBlPmphdmEubGFuZy5TdHJpbmc8L3R5cGU+DQotI2Vsc2UNCi0gICAgICAgICAgIDx0eXBlPiRwcm9wZXJ0eS5jbGFzc05hbWU8L3R5cGU+DQotI2VuZA0KLSAgICAgICAgPC9hdHRyaWJ1dGU+DQotI2VuZA0KLSNlbmQNCi0jIw0KLSMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIyB3cml0ZUpTRkF0dHJpYnV0ZQ0KLSMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIw0KLSNtYWNybyAod3JpdGVKU0ZBdHRyaWJ1dGUgJGF0dHJpYnV0ZSkNCi0jaWYgKCEkYXR0cmlidXRlLmlzVGFnRXhjbHVkZWQoKSkNCi0gICAgICAgIDxhdHRyaWJ1dGU+DQotI2lmICgkYXR0cmlidXRlLmxvbmdEZXNjcmlwdGlvbikNCi0gICAgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVskYXR0cmlidXRlLmxvbmdEZXNjcmlwdGlvbl1dPjwvZGVzY3JpcHRpb24+DQotI2Vsc2UNCi0gICAgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVtdXT48L2Rlc2NyaXB0aW9uPg0KLSNlbmQNCi0gICAgICAgICAgIDxuYW1lPiRhdHRyaWJ1dGUuanNwTmFtZTwvbmFtZT4NCi0jaWYgKCRhdHRyaWJ1dGUuaXNSZXF1aXJlZCgpKQ0KLSAgICAgICAgICAgPHJlcXVpcmVkPiRhdHRyaWJ1dGUuaXNSZXF1aXJlZCgpPC9yZXF1aXJlZD4NCi0jZW5kDQotI3NldCAoJHR5cGUgPSAkdXRpbHMuZ2V0Q2xhc3NGcm9tRnVsbENsYXNzKCRhdHRyaWJ1dGUuY2xhc3NOYW1lKSkNCi0jaWYgKCR0eXBlID09ICJNZXRob2RFeHByZXNzaW9uIikNCi0gICAgICAgICAgIDxtZXRob2Qtc2lnbmF0dXJlPiR7YXR0cmlidXRlLmRlZmVycmVkTWV0aG9kU2lnbmF0dXJlfTwvbWV0aG9kLXNpZ25hdHVyZT4NCi0jZWxzZWlmICgkdHlwZSA9PSAiVmFsdWVFeHByZXNzaW9uIikNCi0jaWYoJGF0dHJpYnV0ZS5kZWZlcnJlZFZhbHVlVHlwZSkNCi0gICAgICAgICAgIDx0eXBlPiRhdHRyaWJ1dGUuZGVmZXJyZWRWYWx1ZVR5cGU8L3R5cGU+DQotI2VuZA0KLSNlbHNlDQotI2lmICgkYXR0cmlidXRlLmNsYXNzTmFtZSkgICAgICAgICANCi0gICAgICAgICAgIDx0eXBlPiRhdHRyaWJ1dGUuY2xhc3NOYW1lPC90eXBlPg0KLSNlbHNlDQotICAgICAgICAgICA8dHlwZT5qYXZhLmxhbmcuU3RyaW5nPC90eXBlPg0KLSNlbmQNCi0jZW5kDQotICAgICAgICA8L2F0dHJpYnV0ZT4NCi0jZW5kDQotI2VuZA0KLSMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEVORCBNQUNST1MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSAgICA8IS0tIENvbXBvbmVudCBUYWdzIC0tPg0KLSNzZXQgKCRjb21wb25lbnRMaXN0ID0gJHttb2RlbC5nZXRDb21wb25lbnRzKCl9KQ0KLSNmb3JlYWNoKCAkY29tcG9uZW50IGluICRjb21wb25lbnRMaXN0ICkNCi0jaWYgKCRtb2RlbElkcy5jb250YWlucygkY29tcG9uZW50Lm1vZGVsSWQpIA0KLSAgICAmJiAoJGNvbXBvbmVudC5uYW1lKSkNCi0jaWYgKCEkY29tcG9uZW50LmlzQ29uZmlnRXhjbHVkZWQoKSAmJiAhJGNvbXBvbmVudC5pc0NvbXBvc2l0ZSgpKQ0KLSMjIENoZWNrIGlmIHdlIGRvbid0IGhhdmUgYSBmYWNlbGV0IHRhZyB0YWtpbmcgcHJlY2VkZW5jZSBvdmVyIHRoaXMgZGVzY3JpcHRpb24NCi0jaWYgKCEgJHttb2RlbC5maW5kRmFjZWxldFRhZ0J5TmFtZSgkY29tcG9uZW50Lm5hbWUpfSkNCi0gICAgPHRhZz4NCi0jaWYgKCRjb21wb25lbnQubG9uZ0Rlc2NyaXB0aW9uKQ0KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWyRjb21wb25lbnQubG9uZ0Rlc2NyaXB0aW9uXV0+PC9kZXNjcmlwdGlvbj4NCi0jZWxzZQ0KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBW11dPjwvZGVzY3JpcHRpb24+DQotI2VuZCAgICANCi0gICAgICAgIDx0YWctbmFtZT4kdXRpbHMuZ2V0VGFnTmFtZSgkY29tcG9uZW50Lm5hbWUpPC90YWctbmFtZT4NCi0gICAgICAgIDxjb21wb25lbnQ+DQotICAgICAgICAgICAgPGNvbXBvbmVudC10eXBlPiRjb21wb25lbnQudHlwZTwvY29tcG9uZW50LXR5cGU+DQotI2lmICgkY29tcG9uZW50LnJlbmRlcmVyVHlwZSkNCi0jaWYgKCEoJGNvbXBvbmVudC5yZW5kZXJlclR5cGUgPT0gIiIpKQ0KLSAgICAgICAgICAgIDxyZW5kZXJlci10eXBlPiRjb21wb25lbnQucmVuZGVyZXJUeXBlPC9yZW5kZXJlci10eXBlPg0KLSNlbmQNCi0jZW5kDQotI2lmICgkY29tcG9uZW50LnRhZ0hhbmRsZXIpDQotICAgICAgICAgICAgPGhhbmRsZXItY2xhc3M+JGNvbXBvbmVudC50YWdIYW5kbGVyPC9oYW5kbGVyLWNsYXNzPg0KLSNlbmQNCi0gICAgICAgIDwvY29tcG9uZW50Pg0KLSNzZXQgKCRhdHRyaWJ1dGVMaXN0ID0gJHtjb21wb25lbnQucHJvcGVydHlMaXN0fSkNCi0jZm9yZWFjaCggJGF0dHJpYnV0ZSBpbiAkYXR0cmlidXRlTGlzdCApDQotI3dyaXRlSlNGUHJvcGVydHkoJGF0dHJpYnV0ZSkNCi0jZW5kICAgICAgICANCi0gICAgPC90YWc+DQotI2VuZA0KLSNlbmQNCi0jZW5kDQotI2VuZA0KLQ0KLSAgIDwhLS0gQ29udmVydGVyIHRhZ3MgLS0+DQotI3NldCAoJGNvbXBvbmVudExpc3QgPSAke21vZGVsLmdldENvbnZlcnRlcnMoKX0pDQotI2ZvcmVhY2goICRjb21wb25lbnQgaW4gJGNvbXBvbmVudExpc3QgKQ0KLSNpZiAoJG1vZGVsSWRzLmNvbnRhaW5zKCRjb21wb25lbnQubW9kZWxJZCkgDQotICAgICYmICgkY29tcG9uZW50Lm5hbWUpKQ0KLSNpZiAoJGNvbXBvbmVudC5jb252ZXJ0ZXJJZCkNCi0jIyBDaGVjayBpZiB3ZSBkb24ndCBoYXZlIGEgZmFjZWxldCB0YWcgdGFraW5nIHByZWNlZGVuY2Ugb3ZlciB0aGlzIGRlc2NyaXB0aW9uDQotI2lmICghICR7bW9kZWwuZmluZEZhY2VsZXRUYWdCeU5hbWUoJGNvbXBvbmVudC5uYW1lKX0pIA0KLSAgICA8dGFnPg0KLSNpZiAoJGNvbXBvbmVudC5sb25nRGVzY3JpcHRpb24pDQotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbJGNvbXBvbmVudC5sb25nRGVzY3JpcHRpb25dXT48L2Rlc2NyaXB0aW9uPg0KLSNlbHNlDQotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbXV0+PC9kZXNjcmlwdGlvbj4NCi0jZW5kICAgIA0KLSAgICAgICAgPHRhZy1uYW1lPiR1dGlscy5nZXRUYWdOYW1lKCRjb21wb25lbnQubmFtZSk8L3RhZy1uYW1lPg0KLSAgICAgICAgPGNvbnZlcnRlcj4NCi0gICAgICAgICAgICA8Y29udmVydGVyLWlkPiRjb21wb25lbnQuY29udmVydGVySWQ8L2NvbnZlcnRlci1pZD4NCi0jaWYgKCRjb21wb25lbnQudGFnSGFuZGxlcikNCi0gICAgICAgICAgICA8aGFuZGxlci1jbGFzcz4kY29tcG9uZW50LnRhZ0hhbmRsZXI8L2hhbmRsZXItY2xhc3M+DQotI2VuZA0KLSAgICAgICAgPC9jb252ZXJ0ZXI+DQotI3NldCAoJHByb3BlcnR5TGlzdCA9ICR7Y29tcG9uZW50LnByb3BlcnR5TGlzdH0pDQotI2ZvcmVhY2goICRwcm9wZXJ0eSBpbiAkcHJvcGVydHlMaXN0ICkNCi0jd3JpdGVKU0ZQcm9wZXJ0eSgkcHJvcGVydHkpDQotI2VuZCAgICAgICAgDQotICAgIDwvdGFnPg0KLSNlbmQNCi0jZW5kDQotI2VuZA0KLSNlbmQNCi0NCi0gICA8IS0tIFZhbGlkYXRvciB0YWdzIC0tPg0KLSNzZXQgKCRjb21wb25lbnRMaXN0ID0gJHttb2RlbC5nZXRWYWxpZGF0b3JzKCl9KQ0KLSNmb3JlYWNoKCAkY29tcG9uZW50IGluICRjb21wb25lbnRMaXN0ICkNCi0jaWYgKCRtb2RlbElkcy5jb250YWlucygkY29tcG9uZW50Lm1vZGVsSWQpIA0KLSAgICAmJiAoJGNvbXBvbmVudC5uYW1lKSkNCi0jaWYgKCRjb21wb25lbnQudmFsaWRhdG9ySWQpDQotIyMgQ2hlY2sgaWYgd2UgZG9uJ3QgaGF2ZSBhIGZhY2VsZXQgdGFnIHRha2luZyBwcmVjZWRlbmNlIG92ZXIgdGhpcyBkZXNjcmlwdGlvbg0KLSNpZiAoISAke21vZGVsLmZpbmRGYWNlbGV0VGFnQnlOYW1lKCRjb21wb25lbnQubmFtZSl9KQ0KLSAgICA8dGFnPg0KLSNpZiAoJGNvbXBvbmVudC5sb25nRGVzY3JpcHRpb24pDQotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbJGNvbXBvbmVudC5sb25nRGVzY3JpcHRpb25dXT48L2Rlc2NyaXB0aW9uPg0KLSNlbHNlDQotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbXV0+PC9kZXNjcmlwdGlvbj4NCi0jZW5kICAgIA0KLSAgICAgICAgPHRhZy1uYW1lPiR1dGlscy5nZXRUYWdOYW1lKCRjb21wb25lbnQubmFtZSk8L3RhZy1uYW1lPg0KLSAgICAgICAgPHZhbGlkYXRvcj4NCi0gICAgICAgICAgICA8dmFsaWRhdG9yLWlkPiRjb21wb25lbnQudmFsaWRhdG9ySWQ8L3ZhbGlkYXRvci1pZD4NCi0jaWYgKCRjb21wb25lbnQudGFnSGFuZGxlcikNCi0gICAgICAgICAgICA8aGFuZGxlci1jbGFzcz4kY29tcG9uZW50LnRhZ0hhbmRsZXI8L2hhbmRsZXItY2xhc3M+DQotI2VuZA0KLSAgICAgICAgPC92YWxpZGF0b3I+DQotI3NldCAoJHByb3BlcnR5TGlzdCA9ICR7Y29tcG9uZW50LnByb3BlcnR5TGlzdH0pDQotI2ZvcmVhY2goICRwcm9wZXJ0eSBpbiAkcHJvcGVydHlMaXN0ICkNCi0jd3JpdGVKU0ZQcm9wZXJ0eSgkcHJvcGVydHkpDQotI2VuZCAgICAgICAgDQotICAgIDwvdGFnPg0KLSNlbmQNCi0jZW5kDQotI2VuZA0KLSNlbmQNCi0NCi0gICA8IS0tIEJlaGF2aW9yIHRhZ3MgLS0+DQotI3NldCAoJGJlaGF2aW9yTGlzdCA9ICR7bW9kZWwuZ2V0QmVoYXZpb3JzKCl9KQ0KLSNmb3JlYWNoKCAkYmVoYXZpb3IgaW4gJGJlaGF2aW9yTGlzdCApDQotI2lmICgkbW9kZWxJZHMuY29udGFpbnMoJGJlaGF2aW9yLm1vZGVsSWQpIA0KLSAgICAmJiAoJGJlaGF2aW9yLm5hbWUpKQ0KLSNpZiAoJGJlaGF2aW9yLmJlaGF2aW9ySWQpDQotIyMgQ2hlY2sgaWYgd2UgZG9uJ3QgaGF2ZSBhIGZhY2VsZXQgdGFnIHRha2luZyBwcmVjZWRlbmNlIG92ZXIgdGhpcyBkZXNjcmlwdGlvbg0KLSNpZiAoISAke21vZGVsLmZpbmRGYWNlbGV0VGFnQnlOYW1lKCRiZWhhdmlvci5uYW1lKX0pIA0KLSAgICA8dGFnPg0KLSNpZiAoJGJlaGF2aW9yLmxvbmdEZXNjcmlwdGlvbikNCi0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVskYmVoYXZpb3IubG9uZ0Rlc2NyaXB0aW9uXV0+PC9kZXNjcmlwdGlvbj4NCi0jZWxzZQ0KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBW11dPjwvZGVzY3JpcHRpb24+DQotI2VuZCAgICANCi0gICAgICAgIDx0YWctbmFtZT4kdXRpbHMuZ2V0VGFnTmFtZSgkYmVoYXZpb3IubmFtZSk8L3RhZy1uYW1lPg0KLSAgICAgICAgPGJlaGF2aW9yPg0KLSAgICAgICAgICAgIDxiZWhhdmlvci1pZD4kYmVoYXZpb3IuYmVoYXZpb3JJZDwvYmVoYXZpb3ItaWQ+DQotI2lmICgkYmVoYXZpb3IudGFnSGFuZGxlcikNCi0gICAgICAgICAgICA8aGFuZGxlci1jbGFzcz4kYmVoYXZpb3IudGFnSGFuZGxlcjwvaGFuZGxlci1jbGFzcz4NCi0jZW5kDQotICAgICAgICA8L2JlaGF2aW9yPg0KLSNzZXQgKCRwcm9wZXJ0eUxpc3QgPSAke2JlaGF2aW9yLnByb3BlcnR5TGlzdH0pDQotI2ZvcmVhY2goICRwcm9wZXJ0eSBpbiAkcHJvcGVydHlMaXN0ICkNCi0jd3JpdGVKU0ZQcm9wZXJ0eSgkcHJvcGVydHkpDQotI2VuZCAgICAgICAgDQotICAgIDwvdGFnPg0KLSNlbmQNCi0jZW5kDQotI2VuZA0KLSNlbmQNCi0gICAgDQotICAgPCEtLSBTaW5nbGUgVGFncyAtLT4NCi0jc2V0ICgkdGFnTGlzdCA9ICRtb2RlbC5nZXRUYWdzKCkpDQotI2ZvcmVhY2goICR0YWcgaW4gJHRhZ0xpc3QgKQ0KLSNpZiAoJG1vZGVsSWRzLmNvbnRhaW5zKCR0YWcubW9kZWxJZCkpDQotI2lmICgkdGFnLnRhZ0hhbmRsZXIpDQotIyMgQ2hlY2sgaWYgd2UgZG9uJ3QgaGF2ZSBhIGZhY2VsZXQgdGFnIHRha2luZyBwcmVjZWRlbmNlIG92ZXIgdGhpcyBkZXNjcmlwdGlvbg0KLSNpZiAoISAke21vZGVsLmZpbmRGYWNlbGV0VGFnQnlOYW1lKCR0YWcubmFtZSl9KQ0KLSAgIDx0YWc+DQotI2lmICgkdGFnLmxvbmdEZXNjcmlwdGlvbikNCi0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVskdGFnLmxvbmdEZXNjcmlwdGlvbl1dPjwvZGVzY3JpcHRpb24+DQotI2Vsc2UNCi0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVtdXT48L2Rlc2NyaXB0aW9uPg0KLSNlbmQgICAgDQotICAgICAgPHRhZy1uYW1lPiR1dGlscy5nZXRUYWdOYW1lKCR0YWcubmFtZSk8L3RhZy1uYW1lPg0KLSAgICAgIDxoYW5kbGVyLWNsYXNzPiR0YWcudGFnSGFuZGxlcjwvaGFuZGxlci1jbGFzcz4NCi0jZm9yZWFjaCggJGF0dHJpYnV0ZSBpbiAkYXR0cmlidXRlTGlzdCApDQotI3dyaXRlSlNGQXR0cmlidXRlKCRhdHRyaWJ1dGUpDQotI2VuZA0KLSAgIDwvdGFnPg0KLSNlbmQNCi0jZW5kDQotI2VuZA0KLSNlbmQNCi0NCi0gICAgPCEtLSBGYWNlbGV0IFRhZ3MgLS0+DQotI3NldCAoJGZhY2VsZXRUYWdMaXN0ID0gJG1vZGVsLmdldEZhY2VsZXRUYWdzKCkpDQotI2ZvcmVhY2goICRmYWNlbGV0VGFnIGluICRmYWNlbGV0VGFnTGlzdCApDQotI2lmICgkbW9kZWxJZHMuY29udGFpbnMoJGZhY2VsZXRUYWcubW9kZWxJZCkgJiYgKCRmYWNlbGV0VGFnLm5hbWUpKQ0KLSNpZiAoJHV0aWxzLmdldFRhZ1ByZWZpeCgkZmFjZWxldFRhZy5uYW1lKSA9PSAkc2hvcnRuYW1lKQ0KLSAgIDx0YWc+DQotI2lmICgkZmFjZWxldFRhZy5sb25nRGVzY3JpcHRpb24pDQotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbJGZhY2VsZXRUYWcubG9uZ0Rlc2NyaXB0aW9uXV0+PC9kZXNjcmlwdGlvbj4NCi0jZWxzZQ0KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBW11dPjwvZGVzY3JpcHRpb24+DQotI2VuZCAgICANCi0NCi0gICAgICA8dGFnLW5hbWU+JHV0aWxzLmdldFRhZ05hbWUoJGZhY2VsZXRUYWcubmFtZSk8L3RhZy1uYW1lPg0KLSNpZiAoJGZhY2VsZXRUYWcuY29tcG9uZW50Q2xhc3MpDQotI3NldCAoJGNvbXBvbmVudCA9ICR7bW9kZWwuZmluZENvbXBvbmVudEJ5Q2xhc3NOYW1lKCRmYWNlbGV0VGFnLmNvbXBvbmVudENsYXNzKX0pDQotICAgIDxjb21wb25lbnQ+DQotICAgICAgICA8Y29tcG9uZW50LXR5cGU+JGNvbXBvbmVudC50eXBlPC9jb21wb25lbnQtdHlwZT4NCi0jaWYgKCRjb21wb25lbnQucmVuZGVyZXJUeXBlKQ0KLSNpZiAoISgkY29tcG9uZW50LnJlbmRlcmVyVHlwZSA9PSAiIikpDQotICAgICAgICA8cmVuZGVyZXItdHlwZT4kY29tcG9uZW50LnJlbmRlcmVyVHlwZTwvcmVuZGVyZXItdHlwZT4NCi0jZW5kDQotI2VuZA0KLSAgICAgICAgPGhhbmRsZXItY2xhc3M+JGZhY2VsZXRUYWcuY2xhc3NOYW1lPC9oYW5kbGVyLWNsYXNzPg0KLSAgICA8L2NvbXBvbmVudD4NCi0jZWxzZWlmICgkZmFjZWxldFRhZy5jb252ZXJ0ZXJDbGFzcykNCi0jc2V0ICgkY29udmVydGVyID0gJHttb2RlbC5maW5kQ29udmVydGVyQnlDbGFzc05hbWUoJGZhY2VsZXRUYWcuY29udmVydGVyQ2xhc3MpfSkNCi0gICAgPGNvbnZlcnRlcj4NCi0gICAgICAgIDxjb252ZXJ0ZXItaWQ+JGNvbnZlcnRlci5jb252ZXJ0ZXJJZDwvY29udmVydGVyLWlkPg0KLSAgICAgICAgPGhhbmRsZXItY2xhc3M+JGZhY2VsZXRUYWcuY2xhc3NOYW1lPC9oYW5kbGVyLWNsYXNzPg0KLSAgICA8L2NvbnZlcnRlcj4NCi0jZWxzZWlmICgkZmFjZWxldFRhZy5iZWhhdmlvckNsYXNzKQ0KLSNzZXQgKCRiZWhhdmlvciA9ICR7bW9kZWwuZmluZEJlaGF2aW9yQnlDbGFzc05hbWUoJGZhY2VsZXRUYWcuYmVoYXZpb3JDbGFzcyl9KQ0KLSAgICA8YmVoYXZpb3I+DQotICAgICAgICA8YmVoYXZpb3ItaWQ+JGJlaGF2aW9yLmJlaGF2aW9ySWQ8L2JlaGF2aW9yLWlkPg0KLSAgICAgICAgPGhhbmRsZXItY2xhc3M+JGZhY2VsZXRUYWcuY2xhc3NOYW1lPC9oYW5kbGVyLWNsYXNzPg0KLSAgICA8L2JlaGF2aW9yPg0KLSNlbHNlDQotICAgIDxoYW5kbGVyLWNsYXNzPiRmYWNlbGV0VGFnLmNsYXNzTmFtZTwvaGFuZGxlci1jbGFzcz4NCi0jZW5kDQotI3NldCAoJGF0dHJpYnV0ZUxpc3QgPSAke3RhZy5hdHRyaWJ1dGVMaXN0fSkNCi0jZm9yZWFjaCggJGF0dHJpYnV0ZSBpbiAkYXR0cmlidXRlTGlzdCApDQotI3dyaXRlSlNGQXR0cmlidXRlKCRhdHRyaWJ1dGUpDQotI2VuZA0KLSAgIDwvdGFnPg0KLSNlbmQNCi0jZW5kDQotI2VuZA0KLTwvZmFjZWxldC10YWdsaWI+DQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtanNmY29tcG9uZW50czIwL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL2NvcmUvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL2ZhY2VzLWNvbmZpZzIwLnZtIGIvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtanNmY29tcG9uZW50czIwL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL2NvcmUvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL2ZhY2VzLWNvbmZpZzIwLnZtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZGVlYmYxLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWpzZmNvbXBvbmVudHMyMC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9jb3JlL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9mYWNlcy1jb25maWcyMC52bQorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotDQotPCEtLQ0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotDQotPGZhY2VzLWNvbmZpZyB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIiANCi0gICAgICAgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIA0KLSAgICAgICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL3dlYi1mYWNlc2NvbmZpZ18yXzAueHNkIiANCi0gICAgICAgICAgICAgIHZlcnNpb249IjIuMCI+DQotDQotJGJhc2VDb250ZW50DQotDQotI3NldCAoJGNvbXBvbmVudExpc3QgPSAke21vZGVsLmdldENvbXBvbmVudHMoKX0pDQotI2ZvcmVhY2goICRjb21wb25lbnQgaW4gJGNvbXBvbmVudExpc3QgKQ0KLSNpZiAoJG1vZGVsSWRzLmNvbnRhaW5zKCRjb21wb25lbnQubW9kZWxJZCkgDQotICAgICYmICEoJGNvbXBvbmVudC5jbGFzc05hbWUuY29udGFpbnMoIlVJQ29tcG9uZW50IikpDQotICAgICYmICEoJGNvbXBvbmVudC5pc0NvbmZpZ0V4Y2x1ZGVkKCkpKQ0KLSAgPGNvbXBvbmVudD4NCi0gICAgPGNvbXBvbmVudC10eXBlPiRjb21wb25lbnQudHlwZTwvY29tcG9uZW50LXR5cGU+DQotICAgIDxjb21wb25lbnQtY2xhc3M+JGNvbXBvbmVudC5jbGFzc05hbWU8L2NvbXBvbmVudC1jbGFzcz4NCi0gIDwvY29tcG9uZW50PiAgICANCi0jZW5kDQotI2VuZA0KLSNzZXQgKCRjb252ZXJ0ZXJMaXN0ID0gJHttb2RlbC5nZXRDb252ZXJ0ZXJzKCl9KQ0KLSNmb3JlYWNoKCAkY29udmVydGVyIGluICRjb252ZXJ0ZXJMaXN0ICkNCi0jaWYgKCRtb2RlbElkcy5jb250YWlucygkY29udmVydGVyLm1vZGVsSWQpKQ0KLSAgPGNvbnZlcnRlcj4NCi0gICAgPGNvbnZlcnRlci1pZD4kY29udmVydGVyLmNvbnZlcnRlcklkPC9jb252ZXJ0ZXItaWQ+DQotICAgIDxjb252ZXJ0ZXItY2xhc3M+JGNvbnZlcnRlci5jbGFzc05hbWU8L2NvbnZlcnRlci1jbGFzcz4NCi0gIDwvY29udmVydGVyPg0KLSNlbmQNCi0jZW5kDQotI3NldCAoJHZhbGlkYXRvckxpc3QgPSAke21vZGVsLmdldFZhbGlkYXRvcnMoKX0pDQotI2ZvcmVhY2goICR2YWxpZGF0b3IgaW4gJHZhbGlkYXRvckxpc3QgKQ0KLSNpZiAoJG1vZGVsSWRzLmNvbnRhaW5zKCR2YWxpZGF0b3IubW9kZWxJZCkgJiYNCi0gICAgISgkdmFsaWRhdG9yLmlzQ29uZmlnRXhjbHVkZWQoKS5ib29sZWFuVmFsdWUoKSkgJiYNCi0gICAgJHZhbGlkYXRvci52YWxpZGF0b3JJZCkNCi0gIDx2YWxpZGF0b3I+DQotICAgIDx2YWxpZGF0b3ItaWQ+JHZhbGlkYXRvci52YWxpZGF0b3JJZDwvdmFsaWRhdG9yLWlkPg0KLSAgICA8dmFsaWRhdG9yLWNsYXNzPiR2YWxpZGF0b3IuY2xhc3NOYW1lPC92YWxpZGF0b3ItY2xhc3M+DQotICA8L3ZhbGlkYXRvcj4NCi0jZW5kDQotI2VuZA0KLSNzZXQgKCRiZWhhdmlvckxpc3QgPSAke21vZGVsLmdldEJlaGF2aW9ycygpfSkNCi0jZm9yZWFjaCggJGJlaGF2aW9yIGluICRiZWhhdmlvckxpc3QgKQ0KLSNpZiAoJG1vZGVsSWRzLmNvbnRhaW5zKCRiZWhhdmlvci5tb2RlbElkKSkNCi0gIDxiZWhhdmlvcj4NCi0gICAgPGJlaGF2aW9yLWlkPiRiZWhhdmlvci5iZWhhdmlvcklkPC9iZWhhdmlvci1pZD4NCi0gICAgPGJlaGF2aW9yLWNsYXNzPiRiZWhhdmlvci5jbGFzc05hbWU8L2JlaGF2aW9yLWNsYXNzPg0KLSAgPC9iZWhhdmlvcj4NCi0jZW5kDQotI2VuZA0KLSNzZXQgKCRyZW5kZXJLaXRMaXN0ID0gJHttb2RlbC5nZXRSZW5kZXJLaXRzKCl9KQ0KLSNmb3JlYWNoKCAkcmVuZGVyS2l0IGluICRyZW5kZXJLaXRMaXN0ICkNCi0gIDxyZW5kZXIta2l0Pg0KLSAgICA8cmVuZGVyLWtpdC1pZD4kcmVuZGVyS2l0LnJlbmRlcktpdElkPC9yZW5kZXIta2l0LWlkPg0KLSNpZiAoJHJlbmRlcktpdC5jbGFzc05hbWUpDQotICAgIDxyZW5kZXIta2l0LWNsYXNzPiRyZW5kZXJLaXQuY2xhc3NOYW1lPC9yZW5kZXIta2l0LWNsYXNzPg0KLSNlbmQNCi0jc2V0ICgkcmVuZGVyZXJMaXN0ID0gJHtyZW5kZXJLaXQuZ2V0UmVuZGVyZXJzKCl9KQ0KLSNmb3JlYWNoKCAkcmVuZGVyZXIgaW4gJHJlbmRlcmVyTGlzdCApDQotICAgICAgPHJlbmRlcmVyPg0KLSAgICAgICAgPGNvbXBvbmVudC1mYW1pbHk+JHJlbmRlcmVyLmNvbXBvbmVudEZhbWlseTwvY29tcG9uZW50LWZhbWlseT4NCi0gICAgICAgIDxyZW5kZXJlci10eXBlPiRyZW5kZXJlci5yZW5kZXJlclR5cGU8L3JlbmRlcmVyLXR5cGU+DQotICAgICAgICA8cmVuZGVyZXItY2xhc3M+JHJlbmRlcmVyLmNsYXNzTmFtZTwvcmVuZGVyZXItY2xhc3M+DQotICAgICAgPC9yZW5kZXJlcj4NCi0jZW5kDQotI3NldCAoJGNsaWVudEJlaGF2aW9yUmVuZGVyZXJMaXN0ID0gJHtyZW5kZXJLaXQuZ2V0Q2xpZW50QmVoYXZpb3JSZW5kZXJlcnMoKX0pDQotI2ZvcmVhY2goICRjbGllbnRCZWhhdmlvclJlbmRlcmVyIGluICRjbGllbnRCZWhhdmlvclJlbmRlcmVyTGlzdCApDQotICAgICAgPGNsaWVudC1iZWhhdmlvci1yZW5kZXJlcj4NCi0gICAgICAgIDxjbGllbnQtYmVoYXZpb3ItcmVuZGVyZXItdHlwZT4kY2xpZW50QmVoYXZpb3JSZW5kZXJlci5yZW5kZXJlclR5cGU8L2NsaWVudC1iZWhhdmlvci1yZW5kZXJlci10eXBlPg0KLSAgICAgICAgPGNsaWVudC1iZWhhdmlvci1yZW5kZXJlci1jbGFzcz4kY2xpZW50QmVoYXZpb3JSZW5kZXJlci5jbGFzc05hbWU8L2NsaWVudC1iZWhhdmlvci1yZW5kZXJlci1jbGFzcz4NCi0gICAgICA8L2NsaWVudC1iZWhhdmlvci1yZW5kZXJlcj4NCi0jZW5kDQotICA8L3JlbmRlci1raXQ+DQotI2VuZA0KLTwvZmFjZXMtY29uZmlnPg0KZGlmZiAtLWdpdCBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWpzZmNvbXBvbmVudHMyMC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9jb3JlL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9teWNvbXBvbmVudHMudGxkLnZtIGIvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtanNmY29tcG9uZW50czIwL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL2NvcmUvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL215Y29tcG9uZW50cy50bGQudm0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlZmY5ZDYuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtanNmY29tcG9uZW50czIwL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL2NvcmUvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL215Y29tcG9uZW50cy50bGQudm0KKysrIC9kZXYvbnVsbApAQCAtMSwyMjUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi08dGFnbGliIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiIA0KLSAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgDQotICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS93ZWItanNwdGFnbGlicmFyeV8yXzEueHNkIiANCi0gICAgICAgIHZlcnNpb249IjIuMSI+DQotICA8dGxpYi12ZXJzaW9uPjEuMS43PC90bGliLXZlcnNpb24+DQotICAgPHNob3J0LW5hbWU+JHNob3J0bmFtZTwvc2hvcnQtbmFtZT4NCi0gICA8dXJpPiR1cmk8L3VyaT4NCi0gICA8ZGlzcGxheS1uYW1lPiRkaXNwbGF5bmFtZTwvZGlzcGxheS1uYW1lPg0KLSAgIDxkZXNjcmlwdGlvbj4kZGVzY3JpcHRpb248L2Rlc2NyaXB0aW9uPg0KLQ0KLSRiYXNlQ29udGVudA0KLQ0KLSAgICA8IS0tIENvbXBvbmVudCBUYWdzIC0tPg0KLSNzZXQgKCRjb21wb25lbnRMaXN0ID0gJHttb2RlbC5nZXRDb21wb25lbnRzKCl9KQ0KLSNmb3JlYWNoKCAkY29tcG9uZW50IGluICRjb21wb25lbnRMaXN0ICkNCi0jaWYgKCRtb2RlbElkcy5jb250YWlucygkY29tcG9uZW50Lm1vZGVsSWQpIA0KLSAgICAmJiAoJGNvbXBvbmVudC5uYW1lKSkNCi0jaWYgKCR1dGlscy5nZXRUYWdQcmVmaXgoJGNvbXBvbmVudC5uYW1lKSA9PSAkc2hvcnRuYW1lKSANCi0gICA8dGFnPg0KLSAgICAgIDxuYW1lPiR1dGlscy5nZXRUYWdOYW1lKCRjb21wb25lbnQubmFtZSk8L25hbWU+DQotICAgICAgPHRhZy1jbGFzcz4kY29tcG9uZW50LnRhZ0NsYXNzPC90YWctY2xhc3M+DQotI2lmICgkY29tcG9uZW50LmJvZHlDb250ZW50KQ0KLSAgICAgIDxib2R5LWNvbnRlbnQ+JGNvbXBvbmVudC5ib2R5Q29udGVudDwvYm9keS1jb250ZW50Pg0KLSNlbHNlDQotICAgICAgPGJvZHktY29udGVudD5KU1A8L2JvZHktY29udGVudD4NCi0jZW5kDQotICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWyRjb21wb25lbnQubG9uZ0Rlc2NyaXB0aW9uXV0+PC9kZXNjcmlwdGlvbj4NCi0gICAgICANCi0jc2V0ICgkcHJvcGVydHlMaXN0ID0gJHtjb21wb25lbnQucHJvcGVydHlMaXN0fSkNCi0jZm9yZWFjaCggJHByb3BlcnR5IGluICRwcm9wZXJ0eUxpc3QgKQ0KLSNpZiAoISRwcm9wZXJ0eS5pc1RhZ0V4Y2x1ZGVkKCkpDQotICAgICAgPGF0dHJpYnV0ZT4NCi0gICAgICAgICA8bmFtZT4kcHJvcGVydHkuanNwTmFtZTwvbmFtZT4NCi0jaWYgKCRwcm9wZXJ0eS5pc1JlcXVpcmVkKCkpDQotICAgICAgICAgPHJlcXVpcmVkPiRwcm9wZXJ0eS5pc1JlcXVpcmVkKCk8L3JlcXVpcmVkPg0KLSNlbmQNCi0jaWYgKCRwcm9wZXJ0eS5pc01ldGhvZEV4cHJlc3Npb24oKSB8fCAkcHJvcGVydHkuaXNNZXRob2RCaW5kaW5nKCkpDQotI2lmICgkcHJvcGVydHkuZ2V0TWV0aG9kQmluZGluZ1NpZ25hdHVyZSgpKQ0KLSAgICAgICAgPGRlZmVycmVkLW1ldGhvZD4NCi0jc2V0ICgkc2lnID0gJHByb3BlcnR5LmdldE1ldGhvZEJpbmRpbmdTaWduYXR1cmUoKSkNCi0gICAgICAgICAgICA8bWV0aG9kLXNpZ25hdHVyZT4kc2lnLnJldHVyblR5cGUgbXlNZXRob2QoICRzaWcucGFyYW1ldGVyVHlwZXNBc1N0cmluZyApPC9tZXRob2Qtc2lnbmF0dXJlPg0KLQ0KLSAgICAgICAgPC9kZWZlcnJlZC1tZXRob2Q+DQotI2Vsc2UNCi0jIyBUaGlzIGlzIGEgdmVyeSBzcGVjaWFsIGNhc2UuIElmIGEgcHJvcGVydHkgaXMgTWV0aG9kQmluZGluZyBvciBNZXRob2RFeHByZXNzaW9uDQotIyMgdGhpcyBzaG91bGQgaGF2ZSBhIHNpZ25hdHVyZS4gSWYgbm90LCBmb3IgYWxsb3cgbXVsdGlwbGUgTWV0aG9kQmluZGluZw0KLSMjIHNpbXVsYXRlIGEgVmFsdWVFeHByZXNzaW9uIGFuZCB3cml0ZSBhIGN1c3RvbSBjb2RlIGxpa2UgaW4gDQotIyMgb3JnLmFwYWNoZS5teWZhY2VzLmN1c3RvbS5zdWdnZXN0YWpheC5BYnN0cmFjdFN1Z2dlc3RBamF4VGFnDQotICAgICAgICAgPGRlZmVycmVkLXZhbHVlLz4NCi0jZW5kDQotI2Vsc2VpZiAoJHByb3BlcnR5LmlzTGl0ZXJhbE9ubHkoKSkNCi0gICAgICAgICA8cnRleHBydmFsdWU+ZmFsc2U8L3J0ZXhwcnZhbHVlPg0KLSNlbHNlDQotI3NldCAoJHR5cGUgPSAkdXRpbHMuZ2V0Q2xhc3NGcm9tRnVsbENsYXNzKCRwcm9wZXJ0eS5jbGFzc05hbWUpKQ0KLSNpZiAoJHR5cGUgPT0gIlN0cmluZyIpDQotICAgICAgICAgPGRlZmVycmVkLXZhbHVlPjwvZGVmZXJyZWQtdmFsdWU+DQotI2Vsc2UNCi0gICAgICAgICA8ZGVmZXJyZWQtdmFsdWU+DQotICAgICAgICAgICAgIDx0eXBlPiRwcm9wZXJ0eS5jbGFzc05hbWU8L3R5cGU+DQotICAgICAgICAgPC9kZWZlcnJlZC12YWx1ZT4NCi0jZW5kDQotI2VuZA0KLSNpZiAoJHByb3BlcnR5LmxvbmdEZXNjcmlwdGlvbikNCi0gICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbJHByb3BlcnR5LmxvbmdEZXNjcmlwdGlvbl1dPjwvZGVzY3JpcHRpb24+DQotI2Vsc2UNCi0gICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbXV0+PC9kZXNjcmlwdGlvbj4NCi0jZW5kDQotICAgICAgPC9hdHRyaWJ1dGU+DQotI2VuZA0KLSNlbmQNCi0gICA8L3RhZz4NCi0jZW5kDQotI2VuZA0KLSNlbmQNCi0gICA8IS0tIENvbnZlcnRlciB0YWdzIC0tPg0KLSNzZXQgKCRjb21wb25lbnRMaXN0ID0gJHttb2RlbC5nZXRDb252ZXJ0ZXJzKCl9KQ0KLSNmb3JlYWNoKCAkY29tcG9uZW50IGluICRjb21wb25lbnRMaXN0ICkNCi0jaWYgKCRtb2RlbElkcy5jb250YWlucygkY29tcG9uZW50Lm1vZGVsSWQpIA0KLSAgICAmJiAoJGNvbXBvbmVudC5uYW1lKSkNCi0jaWYgKCR1dGlscy5nZXRUYWdQcmVmaXgoJGNvbXBvbmVudC5uYW1lKSA9PSAkc2hvcnRuYW1lKSANCi0gICA8dGFnPg0KLSAgICAgIDxuYW1lPiR1dGlscy5nZXRUYWdOYW1lKCRjb21wb25lbnQubmFtZSk8L25hbWU+DQotICAgICAgPHRhZy1jbGFzcz4kY29tcG9uZW50LnRhZ0NsYXNzPC90YWctY2xhc3M+DQotI2lmICgkY29tcG9uZW50LmJvZHlDb250ZW50KQ0KLSAgICAgIDxib2R5LWNvbnRlbnQ+JGNvbXBvbmVudC5ib2R5Q29udGVudDwvYm9keS1jb250ZW50Pg0KLSNlbHNlDQotICAgICAgPGJvZHktY29udGVudD5lbXB0eTwvYm9keS1jb250ZW50Pg0KLSNlbmQNCi0gICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbJGNvbXBvbmVudC5sb25nRGVzY3JpcHRpb25dXT48L2Rlc2NyaXB0aW9uPg0KLSAgICAgIA0KLSNzZXQgKCRwcm9wZXJ0eUxpc3QgPSAke2NvbXBvbmVudC5wcm9wZXJ0eUxpc3R9KQ0KLSNmb3JlYWNoKCAkcHJvcGVydHkgaW4gJHByb3BlcnR5TGlzdCApDQotI2lmICghJHByb3BlcnR5LmlzVGFnRXhjbHVkZWQoKSkNCi0gICAgICA8YXR0cmlidXRlPg0KLSAgICAgICAgIDxuYW1lPiRwcm9wZXJ0eS5uYW1lPC9uYW1lPg0KLSNpZiAoJHByb3BlcnR5LmlzUmVxdWlyZWQoKSkNCi0gICAgICAgICA8cmVxdWlyZWQ+JHByb3BlcnR5LmlzUmVxdWlyZWQoKTwvcmVxdWlyZWQ+DQotI2VuZA0KLSNpZiAoJHByb3BlcnR5LmlzTGl0ZXJhbE9ubHkoKSkNCi0gICAgICAgICA8cnRleHBydmFsdWU+ZmFsc2U8L3J0ZXhwcnZhbHVlPg0KLSNlbHNlDQotI3NldCAoJHR5cGUgPSAkdXRpbHMuZ2V0Q2xhc3NGcm9tRnVsbENsYXNzKCRwcm9wZXJ0eS5jbGFzc05hbWUpKQ0KLSNpZiAoJHR5cGUgPT0gIlN0cmluZyIpDQotICAgICAgICAgPGRlZmVycmVkLXZhbHVlPjwvZGVmZXJyZWQtdmFsdWU+DQotI2Vsc2UNCi0gICAgICAgICA8ZGVmZXJyZWQtdmFsdWU+DQotICAgICAgICAgICAgIDx0eXBlPiRwcm9wZXJ0eS5jbGFzc05hbWU8L3R5cGU+DQotICAgICAgICAgPC9kZWZlcnJlZC12YWx1ZT4NCi0jZW5kDQotI2VuZA0KLSNpZiAoJHByb3BlcnR5LmxvbmdEZXNjcmlwdGlvbikNCi0gICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbJHByb3BlcnR5LmxvbmdEZXNjcmlwdGlvbl1dPjwvZGVzY3JpcHRpb24+DQotI2Vsc2UNCi0gICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbXV0+PC9kZXNjcmlwdGlvbj4NCi0jZW5kDQotICAgICAgPC9hdHRyaWJ1dGU+DQotI2VuZA0KLSNlbmQNCi0gICA8L3RhZz4NCi0jZW5kDQotI2VuZA0KLSNlbmQNCi0gICA8IS0tIFZhbGlkYXRvciB0YWdzIC0tPg0KLSNzZXQgKCRjb21wb25lbnRMaXN0ID0gJHttb2RlbC5nZXRWYWxpZGF0b3JzKCl9KQ0KLSNmb3JlYWNoKCAkY29tcG9uZW50IGluICRjb21wb25lbnRMaXN0ICkNCi0jaWYgKCRtb2RlbElkcy5jb250YWlucygkY29tcG9uZW50Lm1vZGVsSWQpIA0KLSAgICAmJiAoJGNvbXBvbmVudC5uYW1lKSkNCi0jaWYgKCR1dGlscy5nZXRUYWdQcmVmaXgoJGNvbXBvbmVudC5uYW1lKSA9PSAkc2hvcnRuYW1lKSANCi0gICA8dGFnPg0KLSAgICAgIDxuYW1lPiR1dGlscy5nZXRUYWdOYW1lKCRjb21wb25lbnQubmFtZSk8L25hbWU+DQotICAgICAgPHRhZy1jbGFzcz4kY29tcG9uZW50LnRhZ0NsYXNzPC90YWctY2xhc3M+DQotI2lmICgkY29tcG9uZW50LmJvZHlDb250ZW50KQ0KLSAgICAgIDxib2R5LWNvbnRlbnQ+JGNvbXBvbmVudC5ib2R5Q29udGVudDwvYm9keS1jb250ZW50Pg0KLSNlbHNlDQotICAgICAgPGJvZHktY29udGVudD5lbXB0eTwvYm9keS1jb250ZW50Pg0KLSNlbmQNCi0gICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbJGNvbXBvbmVudC5sb25nRGVzY3JpcHRpb25dXT48L2Rlc2NyaXB0aW9uPg0KLSAgICAgIA0KLSNzZXQgKCRwcm9wZXJ0eUxpc3QgPSAke2NvbXBvbmVudC5wcm9wZXJ0eUxpc3R9KQ0KLSNmb3JlYWNoKCAkcHJvcGVydHkgaW4gJHByb3BlcnR5TGlzdCApDQotI2lmICghJHByb3BlcnR5LmlzVGFnRXhjbHVkZWQoKSkNCi0gICAgICA8YXR0cmlidXRlPg0KLSAgICAgICAgIDxuYW1lPiRwcm9wZXJ0eS5uYW1lPC9uYW1lPg0KLSNpZiAoJHByb3BlcnR5LmlzUmVxdWlyZWQoKSkNCi0gICAgICAgICA8cmVxdWlyZWQ+JHByb3BlcnR5LmlzUmVxdWlyZWQoKTwvcmVxdWlyZWQ+DQotI2VuZA0KLSNpZiAoJHByb3BlcnR5LmlzTGl0ZXJhbE9ubHkoKSkNCi0gICAgICAgICA8cnRleHBydmFsdWU+ZmFsc2U8L3J0ZXhwcnZhbHVlPg0KLSNlbHNlDQotI3NldCAoJHR5cGUgPSAkdXRpbHMuZ2V0Q2xhc3NGcm9tRnVsbENsYXNzKCRwcm9wZXJ0eS5jbGFzc05hbWUpKQ0KLSNpZiAoJHR5cGUgPT0gIlN0cmluZyIpDQotICAgICAgICAgPGRlZmVycmVkLXZhbHVlPjwvZGVmZXJyZWQtdmFsdWU+DQotI2Vsc2UNCi0gICAgICAgICA8ZGVmZXJyZWQtdmFsdWU+DQotICAgICAgICAgICAgIDx0eXBlPiRwcm9wZXJ0eS5jbGFzc05hbWU8L3R5cGU+DQotICAgICAgICAgPC9kZWZlcnJlZC12YWx1ZT4NCi0jZW5kDQotI2VuZA0KLSNpZiAoJHByb3BlcnR5LmxvbmdEZXNjcmlwdGlvbikNCi0gICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbJHByb3BlcnR5LmxvbmdEZXNjcmlwdGlvbl1dPjwvZGVzY3JpcHRpb24+DQotI2Vsc2UNCi0gICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbXV0+PC9kZXNjcmlwdGlvbj4NCi0jZW5kDQotICAgICAgPC9hdHRyaWJ1dGU+DQotI2VuZA0KLSNlbmQNCi0gICA8L3RhZz4NCi0jZW5kDQotI2VuZA0KLSNlbmQNCi0gICA8IS0tIFNpbmdsZSBUYWdzIC0tPg0KLSNzZXQgKCR0YWdMaXN0ID0gJG1vZGVsLmdldFRhZ3MoKSkNCi0jZm9yZWFjaCggJHRhZyBpbiAkdGFnTGlzdCApDQotI2lmICgkbW9kZWxJZHMuY29udGFpbnMoJHRhZy5tb2RlbElkKSkNCi0gICA8dGFnPg0KLSAgICAgIDxuYW1lPiR1dGlscy5nZXRUYWdOYW1lKCR0YWcubmFtZSk8L25hbWU+DQotICAgICAgPHRhZy1jbGFzcz4kdGFnLmNsYXNzTmFtZTwvdGFnLWNsYXNzPg0KLSAgICAgIDxib2R5LWNvbnRlbnQ+JHRhZy5ib2R5Q29udGVudDwvYm9keS1jb250ZW50Pg0KLSAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVskdGFnLmxvbmdEZXNjcmlwdGlvbl1dPjwvZGVzY3JpcHRpb24+DQotI3NldCAoJGF0dHJpYnV0ZUxpc3QgPSAke3RhZy5hdHRyaWJ1dGVMaXN0fSkNCi0jZm9yZWFjaCggJGF0dHJpYnV0ZSBpbiAkYXR0cmlidXRlTGlzdCApDQotICAgICAgPGF0dHJpYnV0ZT4NCi0gICAgICAgICA8bmFtZT4kYXR0cmlidXRlLm5hbWU8L25hbWU+DQotICAgICAgICAgPHJlcXVpcmVkPiRhdHRyaWJ1dGUuaXNSZXF1aXJlZCgpPC9yZXF1aXJlZD4NCi0jc2V0ICgkdHlwZSA9ICR1dGlscy5nZXRDbGFzc0Zyb21GdWxsQ2xhc3MoJGF0dHJpYnV0ZS5jbGFzc05hbWUpKQ0KLSNpZiAoJHR5cGUgPT0gIlZhbHVlRXhwcmVzc2lvbiIpDQotICAgICAgICAgPGRlZmVycmVkLXZhbHVlPjwvZGVmZXJyZWQtdmFsdWU+DQotI2Vsc2UNCi0gICAgICAgICA8cnRleHBydmFsdWU+JGF0dHJpYnV0ZS5pc1J0ZXhwcnZhbHVlKCk8L3J0ZXhwcnZhbHVlPg0KLSNpZiAoJGF0dHJpYnV0ZS5jbGFzc05hbWUpICAgICAgICAgDQotICAgICAgICAgPHR5cGU+JGF0dHJpYnV0ZS5jbGFzc05hbWU8L3R5cGU+DQotI2Vsc2UNCi0gICAgICAgICA8dHlwZT5qYXZhLmxhbmcuU3RyaW5nPC90eXBlPg0KLSNlbmQNCi0jZW5kDQotI2lmICgkcHJvcGVydHkubG9uZ0Rlc2NyaXB0aW9uKQ0KLSAgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVskcHJvcGVydHkubG9uZ0Rlc2NyaXB0aW9uXV0+PC9kZXNjcmlwdGlvbj4NCi0jZWxzZQ0KLSAgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVtdXT48L2Rlc2NyaXB0aW9uPg0KLSNlbmQNCi0gICAgICA8L2F0dHJpYnV0ZT4NCi0jZW5kDQotICAgPC90YWc+DQotI2VuZA0KLSNlbmQNCi08L3RhZ2xpYj4NCmRpZmYgLS1naXQgYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1qc2Zjb21wb25lbnRzMjAvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvY29yZS9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvdGFnQ2xhc3MxMi52bSBiL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWpzZmNvbXBvbmVudHMyMC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9jb3JlL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi90YWdDbGFzczEyLnZtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOTU4MGUxLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWpzZmNvbXBvbmVudHMyMC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9jb3JlL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi90YWdDbGFzczEyLnZtCisrKyAvZGV2L251bGwKQEAgLTEsMTcwICswLDAgQEAKLS8vIFdBUk5JTkc6IFRoaXMgZmlsZSB3YXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQuIERvIG5vdCBlZGl0IGl0IGRpcmVjdGx5LA0KLS8vICAgICAgICAgIG9yIHlvdSB3aWxsIGxvc2UgeW91ciBjaGFuZ2VzLg0KLS8qDQotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKiANCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICogDQotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2UgJHtjb21wb25lbnQudGFnUGFja2FnZX07DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZWwuVmFsdWVFeHByZXNzaW9uOw0KLWltcG9ydCBqYXZheC5lbC5NZXRob2RFeHByZXNzaW9uOw0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi0kdXRpbHMuaW1wb3J0VGFnQ2xhc3NlczEyKCRjb21wb25lbnQpDQotDQotcHVibGljIGNsYXNzICR1dGlscy5nZXRDbGFzc0Zyb21GdWxsQ2xhc3MoJGNvbXBvbmVudC50YWdDbGFzcykNCi0jaWYgKCR7Y29tcG9uZW50LnRhZ1N1cGVyY2xhc3N9KQ0KLSAgICBleHRlbmRzICR7Y29tcG9uZW50LnRhZ1N1cGVyY2xhc3N9DQotI2Vsc2UNCi0gICAgZXh0ZW5kcyBqYXZheC5mYWNlcy53ZWJhcHAuVUlDb21wb25lbnRUYWcNCi0jZW5kDQotew0KLSAgICBwdWJsaWMgJHV0aWxzLmdldENsYXNzRnJvbUZ1bGxDbGFzcygkY29tcG9uZW50LnRhZ0NsYXNzKSgpDQotICAgIHsgICAgDQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29tcG9uZW50VHlwZSgpDQotICAgIHsNCi0jaWYgKCRjb21wb25lbnQudHlwZSkNCi0gICAgICAgIHJldHVybiAiJGNvbXBvbmVudC50eXBlIjsNCi0jZWxzZQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotI2VuZA0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVuZGVyZXJUeXBlKCkNCi0gICAgew0KLSNpZiAoJGNvbXBvbmVudC5yZW5kZXJlclR5cGUgJiYgISgkY29tcG9uZW50LnJlbmRlcmVyVHlwZSA9PSAiIikpDQotICAgICAgICByZXR1cm4gIiRjb21wb25lbnQucmVuZGVyZXJUeXBlIjsNCi0jZWxzZQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotI2VuZA0KLSAgICB9DQotDQotI3NldCAoJHByb3BlcnR5TGlzdCA9ICR7Y29tcG9uZW50LnByb3BlcnR5VGFnTGlzdH0pDQotI2ZvcmVhY2goICRwcm9wZXJ0eSBpbiAkcHJvcGVydHlMaXN0ICkNCi0jc2V0ICgkZmllbGQgPSAkcHJvcGVydHkuZmllbGROYW1lKQ0KLSNzZXQgKCR0eXBlID0gJHV0aWxzLmdldEpzcFByb3BlcnR5VHlwZTEyKCRwcm9wZXJ0eSkpDQotIA0KLSAgICBwcml2YXRlICR0eXBlICRmaWVsZDsNCi0gICAgDQotI3NldCAoJHZhciA9ICR1dGlscy5nZXRWYXJpYWJsZUZyb21OYW1lKCRwcm9wZXJ0eS5uYW1lKSkNCi0gICAgcHVibGljIHZvaWQgJHV0aWxzLmdldFByZWZpeGVkUHJvcGVydHlOYW1lKCJzZXQiLCAkcHJvcGVydHkuanNwTmFtZSkoJHR5cGUgJHZhcikNCi0gICAgew0KLSAgICAgICAgJGZpZWxkID0gJHZhcjsNCi0gICAgfQ0KLSNlbmQNCi0NCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0UHJvcGVydGllcyhVSUNvbXBvbmVudCBjb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIGlmICghKGNvbXBvbmVudCBpbnN0YW5jZW9mICRjb21wb25lbnQuY2xhc3NOYW1lKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJDb21wb25lbnQgIisNCi0gICAgICAgICAgICAgICAgY29tcG9uZW50LmdldENsYXNzKCkuZ2V0TmFtZSgpICsiIGlzIG5vICRjb21wb25lbnQuY2xhc3NOYW1lIik7DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgICAgICRjb21wb25lbnQuY2xhc3NOYW1lIGNvbXAgPSAoJGNvbXBvbmVudC5jbGFzc05hbWUpIGNvbXBvbmVudDsNCi0gICAgICAgIA0KLSAgICAgICAgc3VwZXIuc2V0UHJvcGVydGllcyhjb21wb25lbnQpOw0KLSAgICAgICAgDQotICAgICAgICBGYWNlc0NvbnRleHQgY29udGV4dCA9IGdldEZhY2VzQ29udGV4dCgpOw0KLQ0KLSNmb3JlYWNoKCAkcHJvcGVydHkgaW4gJHByb3BlcnR5TGlzdCApIyMgICAgICAgICAgICAxDQotI3NldCAoJGZpZWxkID0gJHByb3BlcnR5LmZpZWxkTmFtZSkNCi0jc2V0ICgkdHlwZSA9ICR1dGlscy5nZXRKc3BQcm9wZXJ0eVR5cGUxMigkcHJvcGVydHkpKQ0KLSNpZiAoJHV0aWxzLmlzQ29udmVydGVyKCRwcm9wZXJ0eS5jbGFzc05hbWUpKSMjICAgICAgICAgICAgICAgICAgIDINCi0gICAgICAgIGlmICgkZmllbGQgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAoISR7ZmllbGR9LmlzTGl0ZXJhbFRleHQoKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGNvbXAuc2V0VmFsdWVFeHByZXNzaW9uKCIkcHJvcGVydHkubmFtZSIsICRmaWVsZCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIFN0cmluZyBzID0gJHtmaWVsZH0uZ2V0RXhwcmVzc2lvblN0cmluZygpOw0KLSAgICAgICAgICAgICAgICBpZiAocyAhPSBudWxsKQ0KLSAgICAgICAgICAgICAgICB7ICAgICAgICAgICAgDQotICAgICAgICAgICAgICAgICAgICBDb252ZXJ0ZXIgY29udmVydGVyID0gZ2V0RmFjZXNDb250ZXh0KCkuZ2V0QXBwbGljYXRpb24oKS5jcmVhdGVDb252ZXJ0ZXIocyk7DQotICAgICAgICAgICAgICAgICAgICBjb21wLnNldENvbnZlcnRlcihjb252ZXJ0ZXIpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSNlbHNlaWYgKCRwcm9wZXJ0eS5pc01ldGhvZEJpbmRpbmcoKSkjIyAgICAgICAgICAgICAgICAgMg0KLSAgICAgICAgaWYgKCRmaWVsZCAhPSBudWxsKQ0KLSAgICAgICAgew0KLSNpZiAoJHByb3BlcnR5LmpzcE5hbWUgPT0gImFjdGlvbkxpc3RlbmVyIikNCi0gICAgICAgICAgICBjb21wLmFkZEFjdGlvbkxpc3RlbmVyKG5ldyBNZXRob2RFeHByZXNzaW9uQWN0aW9uTGlzdGVuZXIoJGZpZWxkKSk7DQotI2Vsc2VpZiAoJHByb3BlcnR5LmpzcE5hbWUgPT0gInZhbHVlQ2hhbmdlTGlzdGVuZXIiKQ0KLSAgICAgICAgICAgIGNvbXAuYWRkVmFsdWVDaGFuZ2VMaXN0ZW5lcihuZXcgTWV0aG9kRXhwcmVzc2lvblZhbHVlQ2hhbmdlTGlzdGVuZXIoJGZpZWxkKSk7DQotI2Vsc2VpZiAoJHByb3BlcnR5LmpzcE5hbWUgPT0gInZhbGlkYXRvciIpDQotICAgICAgICAgICAgY29tcC5hZGRWYWxpZGF0b3IobmV3IE1ldGhvZEV4cHJlc3Npb25WYWxpZGF0b3IoJGZpZWxkKSk7DQotI2Vsc2VpZiAoJHV0aWxzLmlzU3RyaW5nTWV0aG9kQmluZGluZ1JldHVyblR5cGUoJHByb3BlcnR5Lm1ldGhvZEJpbmRpbmdTaWduYXR1cmUpKSMjMw0KLSAgICAgICAgICAgIE1ldGhvZEJpbmRpbmcgbWI7DQotICAgICAgICAgICAgaWYgKGlzVmFsdWVSZWZlcmVuY2UoJGZpZWxkKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIG1iID0gY29udGV4dC5nZXRBcHBsaWNhdGlvbigpLmNyZWF0ZU1ldGhvZEJpbmRpbmcoDQotICAgICAgICAgICAgICAgICAgICAkZmllbGQsICR1dGlscy5nZXRTaWduYXR1cmVQYXJhbXMoJHByb3BlcnR5Lm1ldGhvZEJpbmRpbmdTaWduYXR1cmUpKTsgICAgICAgICAgICANCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZWxzZQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiSW52YWxpZCBleHByZXNzaW9uICIgKyAkZmllbGQpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBjb21wLiR7dXRpbHMuZ2V0UHJlZml4ZWRQcm9wZXJ0eU5hbWUoInNldCIsJHByb3BlcnR5Lm5hbWUpfShtYik7DQotI2Vsc2UjIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzDQotICAgICAgICAgICAgTWV0aG9kQmluZGluZyBtYiA9IGNvbnRleHQuZ2V0QXBwbGljYXRpb24oKS5jcmVhdGVNZXRob2RCaW5kaW5nKA0KLSAgICAgICAgICAgICAgICAkZmllbGQsICR1dGlscy5nZXRTaWduYXR1cmVQYXJhbXMoJHByb3BlcnR5Lm1ldGhvZEJpbmRpbmdTaWduYXR1cmUpKTsNCi0gICAgICAgICAgICBjb21wLiR7dXRpbHMuZ2V0UHJlZml4ZWRQcm9wZXJ0eU5hbWUoInNldCIsJHByb3BlcnR5Lm5hbWUpfShtYik7DQotI2VuZCMjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzDQotICAgICAgICB9DQotI2Vsc2VpZiAoJHByb3BlcnR5LmlzTWV0aG9kRXhwcmVzc2lvbigpKSMjICAgICAgICAgICAgMg0KLSAgICAgICAgaWYgKCRmaWVsZCAhPSBudWxsKQ0KLSAgICAgICAgew0KLSNpZiAoJHByb3BlcnR5LmpzcE5hbWUgPT0gImFjdGlvbiIpDQotICAgICAgICAgICAgY29tcC5zZXRBY3Rpb25FeHByZXNzaW9uKCRmaWVsZCk7DQotI2Vsc2VpZiAoJHByb3BlcnR5LmpzcE5hbWUgPT0gImFjdGlvbkxpc3RlbmVyIikNCi0gICAgICAgICAgICBjb21wLmFkZEFjdGlvbkxpc3RlbmVyKG5ldyBNZXRob2RFeHByZXNzaW9uQWN0aW9uTGlzdGVuZXIoJGZpZWxkKSk7DQotI2Vsc2UNCi0gICAgICAgICAgICBjb21wLiR7dXRpbHMuZ2V0UHJlZml4ZWRQcm9wZXJ0eU5hbWUoInNldCIsJHByb3BlcnR5Lm5hbWUpfSgkZmllbGQpOw0KLSNlbmQgICAgICAgIA0KLSAgICAgICAgfSAgICAgICAgDQotI2Vsc2UjIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMg0KLSAgICAgICAgaWYgKCRmaWVsZCAhPSBudWxsKQ0KLSAgICAgICAgew0KLSNpZiAoJHByb3BlcnR5LmlzTGl0ZXJhbE9ubHkoKSkjIyAgICAgICAgICAgICAgICAgICAgICAgICAzDQotICAgICAgICAgICAgY29tcC5nZXRBdHRyaWJ1dGVzKCkucHV0KCIkcHJvcGVydHkubmFtZSIsICRmaWVsZCk7DQotI2Vsc2UjIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzDQotICAgICAgICAgICAgY29tcC5zZXRWYWx1ZUV4cHJlc3Npb24oIiRwcm9wZXJ0eS5uYW1lIiwgJGZpZWxkKTsNCi0jZW5kIyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMNCi0gICAgICAgIH0gDQotI2VuZCMjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMg0KLSNlbmQjIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxDQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgcmVsZWFzZSgpDQotICAgIHsNCi0gICAgICAgIHN1cGVyLnJlbGVhc2UoKTsNCi0jZm9yZWFjaCggJHByb3BlcnR5IGluICRwcm9wZXJ0eUxpc3QgKQ0KLSNzZXQgKCRmaWVsZCA9ICRwcm9wZXJ0eS5maWVsZE5hbWUpDQotI2lmKCR1dGlscy5nZXRKc3BQcm9wZXJ0eVR5cGUxMigkcHJvcGVydHkpID09ICJib29sZWFuIikNCi0jc2V0ICgkZW1wdHkgPSAiZmFsc2UiKQ0KLSNlbHNlDQotI3NldCAoJGVtcHR5ID0gIm51bGwiKQ0KLSNlbmQNCi0gICAgICAgICRmaWVsZCA9ICRlbXB0eTsNCi0jZW5kDQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtanNmY29tcG9uZW50czIwL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL2NvcmUvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL3RhZ0NvbnZlcnRlckNsYXNzMTIudm0gYi9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1qc2Zjb21wb25lbnRzMjAvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvY29yZS9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvdGFnQ29udmVydGVyQ2xhc3MxMi52bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGJmMTcwNS4uMDAwMDAwMAotLS0gYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1qc2Zjb21wb25lbnRzMjAvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvY29yZS9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvdGFnQ29udmVydGVyQ2xhc3MxMi52bQorKysgL2Rldi9udWxsCkBAIC0xLDE2NyArMCwwIEBACi0vLyBXQVJOSU5HOiBUaGlzIGZpbGUgd2FzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkLiBEbyBub3QgZWRpdCBpdCBkaXJlY3RseSwNCi0vLyAgICAgICAgICBvciB5b3Ugd2lsbCBsb3NlIHlvdXIgY2hhbmdlcy4NCi0vKg0KLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICogDQotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqIA0KLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqICB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlICR1dGlscy5nZXRQYWNrYWdlRnJvbUZ1bGxDbGFzcygkY29udmVydGVyLnRhZ0NsYXNzKTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmF4LmVsLkVMQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udmVydC5Db252ZXJ0ZXI7DQotaW1wb3J0IGphdmF4LmVsLlZhbHVlRXhwcmVzc2lvbjsNCi1pbXBvcnQgamF2YXguZmFjZXMud2ViYXBwLlVJQ29tcG9uZW50VGFnOw0KLWltcG9ydCBqYXZheC5zZXJ2bGV0LmpzcC5Kc3BFeGNlcHRpb247DQotaW1wb3J0IGphdmF4LnNlcnZsZXQuanNwLlBhZ2VDb250ZXh0Ow0KLSR1dGlscy5pbXBvcnRUYWdDbGFzc2VzKCRjb252ZXJ0ZXIpDQotDQotcHVibGljIGNsYXNzICR1dGlscy5nZXRDbGFzc0Zyb21GdWxsQ2xhc3MoJGNvbnZlcnRlci50YWdDbGFzcykNCi0jaWYgKCR7Y29udmVydGVyLnRhZ1N1cGVyY2xhc3N9KQ0KLSAgICBleHRlbmRzICR7Y29udmVydGVyLnRhZ1N1cGVyY2xhc3N9DQotI2Vsc2UNCi0gICAgZXh0ZW5kcyBvcmcuYXBhY2hlLm15ZmFjZXMuY29tbW9ucy5jb252ZXJ0ZXIuQ29udmVydGVyVGFnDQotI2VuZA0KLXsNCi0jaWYgKCRjb252ZXJ0ZXIuc2VyaWFsdWlkdGFnKQ0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAke2NvbnZlcnRlci5zZXJpYWx1aWR0YWd9OyANCi0jZW5kICANCi0NCi0gICAgcHVibGljICR1dGlscy5nZXRDbGFzc0Zyb21GdWxsQ2xhc3MoJGNvbnZlcnRlci50YWdDbGFzcykoKQ0KLSAgICB7DQotICAgICAgICBzZXRDb252ZXJ0ZXJJZFN0cmluZygiJGNvbnZlcnRlci5jb252ZXJ0ZXJJZCIpOw0KLSAgICB9DQotI3NldCAoJHByb3BlcnR5TGlzdCA9ICR7Y29udmVydGVyLnByb3BlcnR5VGFnTGlzdH0pDQotI2ZvcmVhY2goICRwcm9wZXJ0eSBpbiAkcHJvcGVydHlMaXN0ICkNCi0jc2V0ICgkZmllbGQgPSAkcHJvcGVydHkuZmllbGROYW1lKQ0KLSNzZXQgKCR0eXBlID0gJHV0aWxzLmdldEpzcFByb3BlcnR5VHlwZTEyKCRwcm9wZXJ0eSkpDQotIA0KLSAgICBwcml2YXRlICR0eXBlICRmaWVsZDsNCi0gICAgDQotI3NldCAoJHZhciA9ICR1dGlscy5nZXRWYXJpYWJsZUZyb21OYW1lKCRwcm9wZXJ0eS5uYW1lKSkNCi0gICAgcHVibGljIHZvaWQgJHV0aWxzLmdldFByZWZpeGVkUHJvcGVydHlOYW1lKCJzZXQiLCAkcHJvcGVydHkuanNwTmFtZSkoJHR5cGUgJHZhcikNCi0gICAgew0KLSAgICAgICAgJGZpZWxkID0gJHZhcjsNCi0gICAgfQ0KLSNlbmQNCi0NCi0gICAgcHVibGljIHZvaWQgc2V0UGFnZUNvbnRleHQoUGFnZUNvbnRleHQgY29udGV4dCkgew0KLSAgICAgICAgc3VwZXIuc2V0UGFnZUNvbnRleHQoY29udGV4dCk7DQotICAgICAgICBzZXRDb252ZXJ0ZXJJZFN0cmluZygiJGNvbnZlcnRlci5jb252ZXJ0ZXJJZCIpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBDb252ZXJ0ZXIgY3JlYXRlQ29udmVydGVyKCkgdGhyb3dzIEpzcEV4Y2VwdGlvbiB7DQotICAgIA0KLSAgICAgICAgRUxDb250ZXh0IGVsQ29udGV4dCA9IEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5nZXRFTENvbnRleHQoKTsgICAgICAgICAgICANCi0gICAgICAgICRjb252ZXJ0ZXIuY2xhc3NOYW1lIGNvbnZlcnRlciA9ICgkY29udmVydGVyLmNsYXNzTmFtZSlzdXBlci5jcmVhdGVDb252ZXJ0ZXIoKTsNCi0jZm9yZWFjaCggJHByb3BlcnR5IGluICRwcm9wZXJ0eUxpc3QgKQ0KLSNzZXQgKCRmaWVsZCA9ICRwcm9wZXJ0eS5maWVsZE5hbWUpDQotI3NldCAoJHR5cGUgPSAkdXRpbHMuZ2V0SnNwUHJvcGVydHlUeXBlMTIoJHByb3BlcnR5KSkNCi0jc2V0ICgkY2xhc3NOYW1lID0gJHV0aWxzLmdldFByaW1pdGl2ZVR5cGUoJHByb3BlcnR5LmNsYXNzTmFtZSkpDQotICAgICAgICBpZiAoJGZpZWxkICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKCR7ZmllbGR9LmlzTGl0ZXJhbFRleHQoKSkNCi0gICAgICAgICAgICB7DQotI2lmICgkdXRpbHMuaXNQcmltaXRpdmVDbGFzcygkcHJvcGVydHkuY2xhc3NOYW1lKSkNCi0gICAgICAgICAgICAgICAgU3RyaW5nICR7ZmllbGR9VmFsdWUgPSAke2ZpZWxkfS5nZXRFeHByZXNzaW9uU3RyaW5nKCk7DQotICAgICAgICAgICAgICAgIGlmICgke2ZpZWxkfVZhbHVlICE9IG51bGwpDQotICAgICAgICAgICAgICAgICAgICBjb252ZXJ0ZXIuJHt1dGlscy5nZXRQcmVmaXhlZFByb3BlcnR5TmFtZSgic2V0IiwkcHJvcGVydHkubmFtZSl9KCR7dXRpbHMuZ2V0Qm94ZWRDbGFzcygkY2xhc3NOYW1lKX0udmFsdWVPZigke2ZpZWxkfVZhbHVlKS4ke3Byb3BlcnR5LmNsYXNzTmFtZX1WYWx1ZSgpKTsNCi0jZWxzZWlmICgkdXRpbHMuaXNQcmltaXRpdmVDbGFzcygkY2xhc3NOYW1lKSkNCi0gICAgICAgICAgICAgICAgU3RyaW5nICR7ZmllbGR9VmFsdWUgPSAke2ZpZWxkfS5nZXRFeHByZXNzaW9uU3RyaW5nKCk7DQotICAgICAgICAgICAgICAgIGlmICgke2ZpZWxkfVZhbHVlICE9IG51bGwpDQotICAgICAgICAgICAgICAgICAgICBjb252ZXJ0ZXIuJHt1dGlscy5nZXRQcmVmaXhlZFByb3BlcnR5TmFtZSgic2V0IiwkcHJvcGVydHkubmFtZSl9KCR7dXRpbHMuZ2V0Qm94ZWRDbGFzcygkY2xhc3NOYW1lKX0udmFsdWVPZigke2ZpZWxkfVZhbHVlKSk7DQotICAgICAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICAgICAgICAgIGNvbnZlcnRlci4ke3V0aWxzLmdldFByZWZpeGVkUHJvcGVydHlOYW1lKCJzZXQiLCRwcm9wZXJ0eS5uYW1lKX0obnVsbCk7DQotI2Vsc2VpZiAoJHV0aWxzLmdldENsYXNzRnJvbUZ1bGxDbGFzcygkcHJvcGVydHkuY2xhc3NOYW1lKSA9PSAiU3RyaW5nIikNCi0gICAgICAgICAgICAgICAgY29udmVydGVyLiR7dXRpbHMuZ2V0UHJlZml4ZWRQcm9wZXJ0eU5hbWUoInNldCIsJHByb3BlcnR5Lm5hbWUpfSgke2ZpZWxkfS5nZXRFeHByZXNzaW9uU3RyaW5nKCkpOw0KLSNlbHNlaWYgKCR1dGlscy5nZXRDbGFzc0Zyb21GdWxsQ2xhc3MoJHByb3BlcnR5LmNsYXNzTmFtZSkgPT0gIk9iamVjdCIpDQotICAgICAgICAgICAgICAgIGNvbnZlcnRlci4ke3V0aWxzLmdldFByZWZpeGVkUHJvcGVydHlOYW1lKCJzZXQiLCRwcm9wZXJ0eS5uYW1lKX0oJHtmaWVsZH0uZ2V0RXhwcmVzc2lvblN0cmluZygpKTsNCi0jZWxzZWlmICgkdXRpbHMuZ2V0Q2xhc3NGcm9tRnVsbENsYXNzKCRwcm9wZXJ0eS5jbGFzc05hbWUpID09ICJMb2NhbGUiKQ0KLSAgICAgICAgICAgICAgICBjb252ZXJ0ZXIuJHt1dGlscy5nZXRQcmVmaXhlZFByb3BlcnR5TmFtZSgic2V0IiwkcHJvcGVydHkubmFtZSl9KA0KLSAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5teWZhY2VzLnNoYXJlZF90b21haGF3ay51dGlsLkxvY2FsZVV0aWxzLmNvbnZlcnRlclRhZ0xvY2FsZUZyb21TdHJpbmcoJHtmaWVsZH0uZ2V0RXhwcmVzc2lvblN0cmluZygpKSk7DQotI2Vsc2VpZiAoJHV0aWxzLmdldENsYXNzRnJvbUZ1bGxDbGFzcygkcHJvcGVydHkuY2xhc3NOYW1lKSA9PSAiQ2xhc3MiKQ0KLSAgICAgICAgICAgICAgICB0cnkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgY29udmVydGVyLiR7dXRpbHMuZ2V0UHJlZml4ZWRQcm9wZXJ0eU5hbWUoInNldCIsJHByb3BlcnR5Lm5hbWUpfSgNCi0gICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUubXlmYWNlcy5zaGFyZWRfdG9tYWhhd2sudXRpbC5DbGFzc1V0aWxzLmNsYXNzRm9yTmFtZSgke2ZpZWxkfS5nZXRFeHByZXNzaW9uU3RyaW5nKCkpKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSnNwRXhjZXB0aW9uKGUpOw0KLSAgICAgICAgICAgICAgICB9DQotI2Vsc2VpZiAoJHV0aWxzLmdldENsYXNzRnJvbUZ1bGxDbGFzcygkcHJvcGVydHkuY2xhc3NOYW1lKSA9PSAiVGltZVpvbmUiKQ0KLSAgICAgICAgICAgICAgICBjb252ZXJ0ZXIuJHt1dGlscy5nZXRQcmVmaXhlZFByb3BlcnR5TmFtZSgic2V0IiwkcHJvcGVydHkubmFtZSl9KA0KLSAgICAgICAgICAgICAgICAgICAgamF2YS51dGlsLlRpbWVab25lLmdldFRpbWVab25lKCR7ZmllbGR9LmdldEV4cHJlc3Npb25TdHJpbmcoKSkpOyAgICAgICAgICAgICAgICANCi0jZWxzZQ0KLSAgICAgICAgICAgICAgICBjb252ZXJ0ZXIuJHt1dGlscy5nZXRQcmVmaXhlZFByb3BlcnR5TmFtZSgic2V0IiwkcHJvcGVydHkubmFtZSl9KCgkcHJvcGVydHkuY2xhc3NOYW1lKSAke2ZpZWxkfS5nZXRWYWx1ZShlbENvbnRleHQpKTsNCi0jZW5kDQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICB7DQotI2lmICgkdXRpbHMuaXNQcmltaXRpdmVDbGFzcygkcHJvcGVydHkuY2xhc3NOYW1lKSkNCi0gICAgICAgICAgICAgICAgT2JqZWN0ICR7ZmllbGR9VmFsdWUgPSAke2ZpZWxkfS5nZXRWYWx1ZShlbENvbnRleHQpOw0KLSAgICAgICAgICAgICAgICBpZiAoJHtmaWVsZH1WYWx1ZSAhPSBudWxsKQ0KLSAgICAgICAgICAgICAgICAgICAgY29udmVydGVyLiR7dXRpbHMuZ2V0UHJlZml4ZWRQcm9wZXJ0eU5hbWUoInNldCIsJHByb3BlcnR5Lm5hbWUpfSggKCgke3V0aWxzLmdldEJveGVkQ2xhc3MoJGNsYXNzTmFtZSl9KSAke2ZpZWxkfVZhbHVlICkuJHtwcm9wZXJ0eS5jbGFzc05hbWV9VmFsdWUoKSk7DQotI2Vsc2VpZiAoJHV0aWxzLmlzUHJpbWl0aXZlQ2xhc3MoJGNsYXNzTmFtZSkpDQotICAgICAgICAgICAgICAgIGNvbnZlcnRlci4ke3V0aWxzLmdldFByZWZpeGVkUHJvcGVydHlOYW1lKCJzZXQiLCRwcm9wZXJ0eS5uYW1lKX0oICgke3V0aWxzLmdldEJveGVkQ2xhc3MoJGNsYXNzTmFtZSl9KSAke2ZpZWxkfS5nZXRWYWx1ZShlbENvbnRleHQpICk7DQotI2Vsc2VpZiAoJHV0aWxzLmdldENsYXNzRnJvbUZ1bGxDbGFzcygkcHJvcGVydHkuY2xhc3NOYW1lKSA9PSAiTG9jYWxlIikNCi0gICAgICAgICAgICAgICAgT2JqZWN0ICR7ZmllbGR9VmFsdWUgPSAke2ZpZWxkfS5nZXRWYWx1ZShlbENvbnRleHQpOw0KLSAgICAgICAgICAgICAgICBpZiAoJHtmaWVsZH1WYWx1ZSA9PSBudWxsKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAke2ZpZWxkfVZhbHVlID0gRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLmdldFZpZXdSb290KCkuZ2V0TG9jYWxlKCk7ICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGlmKCEoJHtmaWVsZH1WYWx1ZSBpbnN0YW5jZW9mIGphdmEudXRpbC5Mb2NhbGUpKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAke2ZpZWxkfVZhbHVlID0gb3JnLmFwYWNoZS5teWZhY2VzLnNoYXJlZF90b21haGF3ay51dGlsLkxvY2FsZVV0aWxzLmNvbnZlcnRlclRhZ0xvY2FsZUZyb21TdHJpbmcoJHtmaWVsZH0uZ2V0RXhwcmVzc2lvblN0cmluZygpKTsgICAgICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGNvbnZlcnRlci4ke3V0aWxzLmdldFByZWZpeGVkUHJvcGVydHlOYW1lKCJzZXQiLCRwcm9wZXJ0eS5uYW1lKX0oKGphdmEudXRpbC5Mb2NhbGUpJHtmaWVsZH1WYWx1ZSk7ICAgICAgICAgICAgICAgIA0KLSNlbHNlaWYgKCR1dGlscy5nZXRDbGFzc0Zyb21GdWxsQ2xhc3MoJHByb3BlcnR5LmNsYXNzTmFtZSkgPT0gIlRpbWVab25lIikNCi0gICAgICAgICAgICAgICAgT2JqZWN0ICR7ZmllbGR9VmFsdWUgPSAke2ZpZWxkfS5nZXRWYWx1ZShlbENvbnRleHQpOw0KLSAgICAgICAgICAgICAgICBpZigke2ZpZWxkfVZhbHVlIGluc3RhbmNlb2YgamF2YS51dGlsLlRpbWVab25lKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBjb252ZXJ0ZXIuJHt1dGlscy5nZXRQcmVmaXhlZFByb3BlcnR5TmFtZSgic2V0IiwkcHJvcGVydHkubmFtZSl9KA0KLSAgICAgICAgICAgICAgICAgICAgICAgIChqYXZhLnV0aWwuVGltZVpvbmUpICR7ZmllbGR9VmFsdWUpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgY29udmVydGVyLiR7dXRpbHMuZ2V0UHJlZml4ZWRQcm9wZXJ0eU5hbWUoInNldCIsJHByb3BlcnR5Lm5hbWUpfSgNCi0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuVGltZVpvbmUuZ2V0VGltZVpvbmUoJHtmaWVsZH1WYWx1ZS50b1N0cmluZygpKSk7DQotICAgICAgICAgICAgICAgIH0NCi0jZWxzZWlmICgkdXRpbHMuZ2V0Q2xhc3NGcm9tRnVsbENsYXNzKCRwcm9wZXJ0eS5jbGFzc05hbWUpID09ICJTdHJpbmciKQ0KLSAgICAgICAgICAgICAgICBjb252ZXJ0ZXIuJHt1dGlscy5nZXRQcmVmaXhlZFByb3BlcnR5TmFtZSgic2V0IiwkcHJvcGVydHkubmFtZSl9KCAoU3RyaW5nKSAke2ZpZWxkfS5nZXRWYWx1ZShlbENvbnRleHQpKTsNCi0jZWxzZQ0KLSAgICAgICAgICAgICAgICBjb252ZXJ0ZXIuJHt1dGlscy5nZXRQcmVmaXhlZFByb3BlcnR5TmFtZSgic2V0IiwkcHJvcGVydHkubmFtZSl9KCgkcHJvcGVydHkuY2xhc3NOYW1lKSAke2ZpZWxkfS5nZXRWYWx1ZShlbENvbnRleHQpKTsNCi0jZW5kDQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSNlbmQNCi0gICAgICAgIHJldHVybiBjb252ZXJ0ZXI7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgcmVsZWFzZSgpDQotICAgIHsNCi0gICAgICAgIHN1cGVyLnJlbGVhc2UoKTsNCi0jZm9yZWFjaCggJHByb3BlcnR5IGluICRwcm9wZXJ0eUxpc3QgKQ0KLSNzZXQgKCRmaWVsZCA9ICRwcm9wZXJ0eS5maWVsZE5hbWUpDQotI2lmKCR1dGlscy5nZXRKc3BQcm9wZXJ0eVR5cGUxMigkcHJvcGVydHkpID09ICJib29sZWFuIikNCi0jc2V0ICgkZW1wdHkgPSAiZmFsc2UiKQ0KLSNlbHNlDQotI3NldCAoJGVtcHR5ID0gIm51bGwiKQ0KLSNlbmQNCi0gICAgICAgICRmaWVsZCA9ICRlbXB0eTsNCi0jZW5kDQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtanNmY29tcG9uZW50czIwL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL2NvcmUvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL3RhZ1ZhbGlkYXRvckNsYXNzMTIudm0gYi9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1qc2Zjb21wb25lbnRzMjAvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvY29yZS9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvdGFnVmFsaWRhdG9yQ2xhc3MxMi52bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzVkZjllNC4uMDAwMDAwMAotLS0gYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1qc2Zjb21wb25lbnRzMjAvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvY29yZS9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvdGFnVmFsaWRhdG9yQ2xhc3MxMi52bQorKysgL2Rldi9udWxsCkBAIC0xLDE1OCArMCwwIEBACi0vLyBXQVJOSU5HOiBUaGlzIGZpbGUgd2FzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkLiBEbyBub3QgZWRpdCBpdCBkaXJlY3RseSwNCi0vLyAgICAgICAgICBvciB5b3Ugd2lsbCBsb3NlIHlvdXIgY2hhbmdlcy4NCi0vKg0KLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICogDQotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqIA0KLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqICB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlICR1dGlscy5nZXRQYWNrYWdlRnJvbUZ1bGxDbGFzcygkdmFsaWRhdG9yLnRhZ0NsYXNzKTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmF4LmVsLlZhbHVlRXhwcmVzc2lvbjsNCi1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvcjsNCi1pbXBvcnQgamF2YXguZmFjZXMuYXBwbGljYXRpb24uQXBwbGljYXRpb247DQotaW1wb3J0IGphdmF4LnNlcnZsZXQuanNwLkpzcEV4Y2VwdGlvbjsNCi0kdXRpbHMuaW1wb3J0VGFnQ2xhc3NlcygkdmFsaWRhdG9yKQ0KLQ0KLXB1YmxpYyBjbGFzcyAkdXRpbHMuZ2V0Q2xhc3NGcm9tRnVsbENsYXNzKCR2YWxpZGF0b3IudGFnQ2xhc3MpDQotI2lmICgke3ZhbGlkYXRvci50YWdTdXBlcmNsYXNzfSkNCi0gICAgZXh0ZW5kcyAke3ZhbGlkYXRvci50YWdTdXBlcmNsYXNzfQ0KLSNlbHNlDQotICAgIGV4dGVuZHMgb3JnLmFwYWNoZS5teWZhY2VzLmNvbW1vbnMudmFsaWRhdG9yLlZhbGlkYXRvckJhc2VUYWcNCi0jZW5kDQotew0KLSNpZiAoJHZhbGlkYXRvci5zZXJpYWx1aWR0YWcpDQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9ICR7dmFsaWRhdG9yLnNlcmlhbHVpZHRhZ307IA0KLSNlbmQgIA0KLQ0KLSAgICBwdWJsaWMgJHV0aWxzLmdldENsYXNzRnJvbUZ1bGxDbGFzcygkdmFsaWRhdG9yLnRhZ0NsYXNzKSgpDQotICAgIHsgICAgDQotICAgIH0gICAgDQotI3NldCAoJHByb3BlcnR5TGlzdCA9ICR7dmFsaWRhdG9yLnByb3BlcnR5VGFnTGlzdH0pDQotI2ZvcmVhY2goICRwcm9wZXJ0eSBpbiAkcHJvcGVydHlMaXN0ICkNCi0jc2V0ICgkZmllbGQgPSAkcHJvcGVydHkuZmllbGROYW1lKQ0KLSNzZXQgKCR0eXBlID0gJHV0aWxzLmdldEpzcFByb3BlcnR5VHlwZTEyKCRwcm9wZXJ0eSkpDQotIA0KLSAgICBwcml2YXRlICR0eXBlICRmaWVsZDsNCi0gICAgDQotI3NldCAoJHZhciA9ICR1dGlscy5nZXRWYXJpYWJsZUZyb21OYW1lKCRwcm9wZXJ0eS5uYW1lKSkNCi0gICAgcHVibGljIHZvaWQgJHV0aWxzLmdldFByZWZpeGVkUHJvcGVydHlOYW1lKCJzZXQiLCAkcHJvcGVydHkuanNwTmFtZSkoJHR5cGUgJHZhcikNCi0gICAgew0KLSAgICAgICAgJGZpZWxkID0gJHZhcjsNCi0gICAgfQ0KLSNlbmQNCi0NCi0gICAgcHJvdGVjdGVkIFZhbGlkYXRvciBjcmVhdGVWYWxpZGF0b3IoKSB0aHJvd3MgSnNwRXhjZXB0aW9uIHsNCi0gICAgICAgIFN0cmluZyB2YWxpZGF0b3JJZCA9ICIkdmFsaWRhdG9yLnZhbGlkYXRvcklkIjsNCi0gICAgICAgIEFwcGxpY2F0aW9uIGFwcGwgPSBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkuZ2V0QXBwbGljYXRpb24oKTsNCi0gICAgICAgIFZhbGlkYXRvciB2YWxpZGF0b3IgPSAoVmFsaWRhdG9yKWFwcGwuY3JlYXRlVmFsaWRhdG9yKHZhbGlkYXRvcklkKTsNCi0gICAgICAgIF9zZXRQcm9wZXJ0aWVzKHZhbGlkYXRvcik7DQotICAgICAgICByZXR1cm4gdmFsaWRhdG9yOw0KLSAgICB9DQotICAgIA0KLSAgICBwcm90ZWN0ZWQgdm9pZCBfc2V0UHJvcGVydGllcyhWYWxpZGF0b3IgdmFsKSB0aHJvd3MgSnNwRXhjZXB0aW9uIHsNCi0gICAgICAgIHN1cGVyLl9zZXRQcm9wZXJ0aWVzKHZhbCk7ICAgIA0KLSAgICAgICAgRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCA9IEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKTsNCi0NCi0gICAgICAgICR2YWxpZGF0b3IuY2xhc3NOYW1lIHZhbGlkYXRvciA9ICgkdmFsaWRhdG9yLmNsYXNzTmFtZSkgdmFsOw0KLSNmb3JlYWNoKCAkcHJvcGVydHkgaW4gJHByb3BlcnR5TGlzdCApDQotI3NldCAoJGZpZWxkID0gJHByb3BlcnR5LmZpZWxkTmFtZSkNCi0jc2V0ICgkdHlwZSA9ICR1dGlscy5nZXRKc3BQcm9wZXJ0eVR5cGUxMigkcHJvcGVydHkpKQ0KLSNzZXQgKCRjbGFzc05hbWUgPSAkdXRpbHMuZ2V0UHJpbWl0aXZlVHlwZSgkcHJvcGVydHkuY2xhc3NOYW1lKSkNCi0gICAgICAgIGlmICgkZmllbGQgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0jaWYgKCRwcm9wZXJ0eS5pc0xpdGVyYWxPbmx5KCkpDQotI2lmICgkdXRpbHMuaXNQcmltaXRpdmVDbGFzcygkcHJvcGVydHkuY2xhc3NOYW1lKSkNCi0gICAgICAgICAgICAgICAgdmFsaWRhdG9yLiR7dXRpbHMuZ2V0UHJlZml4ZWRQcm9wZXJ0eU5hbWUoInNldCIsJHByb3BlcnR5Lm5hbWUpfSgke3V0aWxzLmdldEJveGVkQ2xhc3MoJGNsYXNzTmFtZSl9LnZhbHVlT2YoJGZpZWxkKS4ke3Byb3BlcnR5LmNsYXNzTmFtZX1WYWx1ZSgpKTsNCi0jZWxzZWlmICgkdXRpbHMuaXNQcmltaXRpdmVDbGFzcygkY2xhc3NOYW1lKSkNCi0gICAgICAgICAgICAgICAgdmFsaWRhdG9yLiR7dXRpbHMuZ2V0UHJlZml4ZWRQcm9wZXJ0eU5hbWUoInNldCIsJHByb3BlcnR5Lm5hbWUpfSgke3V0aWxzLmdldEJveGVkQ2xhc3MoJGNsYXNzTmFtZSl9LnZhbHVlT2YoJGZpZWxkKSk7DQotI2Vsc2UNCi0gICAgICAgICAgICAgICAgdmFsaWRhdG9yLiR7dXRpbHMuZ2V0UHJlZml4ZWRQcm9wZXJ0eU5hbWUoInNldCIsJHByb3BlcnR5Lm5hbWUpfSgkZmllbGQpOw0KLSNlbmQNCi0jZWxzZSAgICAgICAgDQotICAgICAgICAgICAgaWYgKCEke2ZpZWxkfS5pc0xpdGVyYWxUZXh0KCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB2YWxpZGF0b3Iuc2V0VmFsdWVFeHByZXNzaW9uKCIkcHJvcGVydHkubmFtZSIsICRmaWVsZCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICB7DQotI2lmICgkdXRpbHMuaXNQcmltaXRpdmVDbGFzcygkcHJvcGVydHkuY2xhc3NOYW1lKSkNCi0gICAgICAgICAgICAgICAgT2JqZWN0ICR7ZmllbGR9VmFsdWUgPSAke2ZpZWxkfS5nZXRWYWx1ZShmYWNlc0NvbnRleHQuZ2V0RUxDb250ZXh0KCkpOw0KLSAgICAgICAgICAgICAgICBpZiAoJHtmaWVsZH1WYWx1ZSAhPSBudWxsKXsNCi0gICAgICAgICAgICAgICAgICAgIGlmICgke2ZpZWxkfVZhbHVlIGluc3RhbmNlb2YgJHt1dGlscy5nZXRCb3hlZENsYXNzKCRjbGFzc05hbWUpfSl7DQotICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdG9yLiR7dXRpbHMuZ2V0UHJlZml4ZWRQcm9wZXJ0eU5hbWUoInNldCIsJHByb3BlcnR5Lm5hbWUpfSgNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgke3V0aWxzLmdldEJveGVkQ2xhc3MoJGNsYXNzTmFtZSl9KSR7ZmllbGR9VmFsdWUpLiR7cHJvcGVydHkuY2xhc3NOYW1lfVZhbHVlKCkpOyAgICAgICAgICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQ0KLSAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRvci4ke3V0aWxzLmdldFByZWZpeGVkUHJvcGVydHlOYW1lKCJzZXQiLCRwcm9wZXJ0eS5uYW1lKX0oDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICR7dXRpbHMuZ2V0Qm94ZWRDbGFzcygkY2xhc3NOYW1lKX0udmFsdWVPZigke2ZpZWxkfVZhbHVlLnRvU3RyaW5nKCkpLiR7cHJvcGVydHkuY2xhc3NOYW1lfVZhbHVlKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgICAgIH0NCi0jZWxzZWlmICgkdXRpbHMuaXNQcmltaXRpdmVDbGFzcygkY2xhc3NOYW1lKSkNCi0gICAgICAgICAgICAgICAgT2JqZWN0ICR7ZmllbGR9VmFsdWUgPSAke2ZpZWxkfS5nZXRWYWx1ZShmYWNlc0NvbnRleHQuZ2V0RUxDb250ZXh0KCkpOw0KLSAgICAgICAgICAgICAgICBpZiAoJHtmaWVsZH1WYWx1ZSAhPSBudWxsKXsNCi0gICAgICAgICAgICAgICAgICAgIGlmICgke2ZpZWxkfVZhbHVlIGluc3RhbmNlb2YgJHt1dGlscy5nZXRCb3hlZENsYXNzKCRjbGFzc05hbWUpfSl7DQotICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdG9yLiR7dXRpbHMuZ2V0UHJlZml4ZWRQcm9wZXJ0eU5hbWUoInNldCIsJHByb3BlcnR5Lm5hbWUpfSgNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgke3V0aWxzLmdldEJveGVkQ2xhc3MoJGNsYXNzTmFtZSl9KSR7ZmllbGR9VmFsdWUpKTsgICAgICAgICAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0b3IuJHt1dGlscy5nZXRQcmVmaXhlZFByb3BlcnR5TmFtZSgic2V0IiwkcHJvcGVydHkubmFtZSl9KA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAke3V0aWxzLmdldEJveGVkQ2xhc3MoJGNsYXNzTmFtZSl9LnZhbHVlT2YoJHtmaWVsZH1WYWx1ZS50b1N0cmluZygpKSk7DQotICAgICAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICAgfQ0KLSNlbHNlaWYgKCR1dGlscy5nZXRDbGFzc0Zyb21GdWxsQ2xhc3MoJHByb3BlcnR5LmNsYXNzTmFtZSkgPT0gIlN0cmluZyIpDQotICAgICAgICAgICAgICAgIE9iamVjdCAke2ZpZWxkfVZhbHVlID0gJHtmaWVsZH0uZ2V0VmFsdWUoZmFjZXNDb250ZXh0LmdldEVMQ29udGV4dCgpKTsNCi0gICAgICAgICAgICAgICAgaWYgKCR7ZmllbGR9VmFsdWUgIT0gbnVsbCkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgdmFsaWRhdG9yLiR7dXRpbHMuZ2V0UHJlZml4ZWRQcm9wZXJ0eU5hbWUoInNldCIsJHByb3BlcnR5Lm5hbWUpfSgNCi0gICAgICAgICAgICAgICAgICAgICAgICAoJHByb3BlcnR5LmNsYXNzTmFtZSkgICR7ZmllbGR9VmFsdWUudG9TdHJpbmcoKSk7ICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgICB9DQotI2Vsc2VpZiAoJHByb3BlcnR5LmNsYXNzTmFtZSA9PSAiamF2YS5sYW5nLlN0cmluZ1tdIikNCi0gICAgICAgICAgICAgICAgdHJ5DQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZ1tdIHZhbHVlID0gb3JnLmFwYWNoZS5teWZhY2VzLmNvbW1vbnMudXRpbC5UYWdVdGlscy5nZXRTdHJpbmdBcnJheSgke2ZpZWxkfS5nZXRWYWx1ZShmYWNlc0NvbnRleHQuZ2V0RUxDb250ZXh0KCkpKTsNCi0gICAgICAgICAgICAgICAgICAgIHZhbGlkYXRvci4ke3V0aWxzLmdldFByZWZpeGVkUHJvcGVydHlOYW1lKCJzZXQiLCRwcm9wZXJ0eS5uYW1lKX0odmFsdWUpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGNhdGNoIChqYXZhLnRleHQuUGFyc2VFeGNlcHRpb24gcGUpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSnNwRXhjZXB0aW9uKA0KLSAgICAgICAgICAgICAgICAgICAgcGUuZ2V0TWVzc2FnZSgpICsgIjogIiArICJQb3NpdGlvbiAiICsgcGUuZ2V0RXJyb3JPZmZzZXQoKSk7DQotICAgICAgICAgICAgICAgIH0NCi0jZWxzZQ0KLSAgICAgICAgICAgICAgICB2YWxpZGF0b3IuJHt1dGlscy5nZXRQcmVmaXhlZFByb3BlcnR5TmFtZSgic2V0IiwkcHJvcGVydHkubmFtZSl9KCgkcHJvcGVydHkuY2xhc3NOYW1lKSAgJHtmaWVsZH0uZ2V0VmFsdWUoZmFjZXNDb250ZXh0LmdldEVMQ29udGV4dCgpKSk7DQotI2VuZA0KLSAgICAgICAgICAgIH0NCi0jZW5kDQotICAgICAgICB9DQotI2VuZA0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHJlbGVhc2UoKQ0KLSAgICB7DQotICAgICAgICBzdXBlci5yZWxlYXNlKCk7DQotI2ZvcmVhY2goICRwcm9wZXJ0eSBpbiAkcHJvcGVydHlMaXN0ICkNCi0jc2V0ICgkZmllbGQgPSAkcHJvcGVydHkuZmllbGROYW1lKQ0KLSNpZigkdXRpbHMuZ2V0SnNwUHJvcGVydHlUeXBlMTIoJHByb3BlcnR5KSA9PSAiYm9vbGVhbiIpDQotI3NldCAoJGVtcHR5ID0gImZhbHNlIikNCi0jZWxzZQ0KLSNzZXQgKCRlbXB0eSA9ICJudWxsIikNCi0jZW5kDQotICAgICAgICAkZmllbGQgPSAkZW1wdHk7DQotI2VuZA0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWpzZmNvbXBvbmVudHMyMC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9jb3JlL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi92YWxpZGF0b3JDbGFzczEyLnZtIGIvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtanNmY29tcG9uZW50czIwL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL2NvcmUvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL3ZhbGlkYXRvckNsYXNzMTIudm0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmMWZkNGIuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtanNmY29tcG9uZW50czIwL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL2NvcmUvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL3ZhbGlkYXRvckNsYXNzMTIudm0KKysrIC9kZXYvbnVsbApAQCAtMSwyMTUgKzAsMCBAQAotIyMgVmVsb2NpdHkgdGVtcGxhdGUgdXNlZCB0byBnZW5lcmF0ZSBKU0YxLjItY29tcGF0aWJsZSB2YWxpZGF0b3IgY2xhc3Nlcw0KLSMjIGZyb20gdmFsaWRhdG9yIG1ldGEtZGF0YS4NCi0jIw0KLSMjIE5vdGUgdGhhdCB0aGVyZSBhcmUgb25seSBvbmUgdHlwZSBvZiB2YWxpZGF0b3IgZ2VuZXJhdGlvbjoNCi0jIyAgKiAic3ViY2xhc3MgbW9kZSIgKHVzZSBhbm5vdGF0ZWQgY2xhc3MgYXMgYSBwYXJlbnQgY2xhc3MpDQotIyMNCi0jIyBWYXJpYWJsZSAkdmFsaWRhdG9yIHJlZmVycyB0byBhIFZhbGlkYXRvck1ldGEgb2JqZWN0IHRvIHByb2Nlc3MNCi0jIyBWYXJpYWJsZSAkdXRpbHMgcmVmZXJzIHRvIGFuIGluc3RhbmNlIG9mIE15ZmFjZXNVdGlscy4NCi0jIw0KLSMjDQotIyMgVGhlIGphdmEgcGFja2FnZSBvZiB0aGUgZ2VuZXJhdGVkIGNsYXNzIGlzIGFsd2F5cyB0aGUgc2FtZSBhcw0KLSMjIHRoZSBwYWNrYWdlIGluIHdoaWNoIHRoZSBhbm5vdGF0ZWQgY2xhc3MgZXhpc3RzLg0KLSMjDQotLyoNCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqIA0KLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKiANCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSAke3ZhbGlkYXRvci5wYWNrYWdlTmFtZX07DQotDQotaW1wb3J0IGphdmF4LmVsLlZhbHVlRXhwcmVzc2lvbjsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotJHV0aWxzLmltcG9ydFRhZ0NsYXNzZXMoJHZhbGlkYXRvcikNCi0NCi0jaWYgKCR2YWxpZGF0b3IuaXNUZW1wbGF0ZSgpKQ0KLSNzZXQgKCRnZW5lcmF0ZWRDbGFzc1BhcmVudCA9ICR2YWxpZGF0b3Iuc291cmNlQ2xhc3NQYXJlbnRDbGFzc05hbWUpDQotI2Vsc2UNCi0jc2V0ICgkZ2VuZXJhdGVkQ2xhc3NQYXJlbnQgPSAkdmFsaWRhdG9yLnNvdXJjZUNsYXNzTmFtZSkNCi0jZW5kDQotLy8gR2VuZXJhdGVkIGZyb20gY2xhc3MgJHt2YWxpZGF0b3Iuc291cmNlQ2xhc3NOYW1lfS4NCi0vLw0KLS8vIFdBUk5JTkc6IFRoaXMgZmlsZSB3YXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQuIERvIG5vdCBlZGl0IGl0IGRpcmVjdGx5LA0KLS8vICAgICAgICAgIG9yIHlvdSB3aWxsIGxvc2UgeW91ciBjaGFuZ2VzLg0KLXB1YmxpYyBjbGFzcyAke3V0aWxzLmdldENsYXNzRnJvbUZ1bGxDbGFzcygkdmFsaWRhdG9yLmNsYXNzTmFtZSl9IGV4dGVuZHMgJGdlbmVyYXRlZENsYXNzUGFyZW50DQotI2lmICgkdmFsaWRhdG9yLmltcGxlbWVudHMpDQotICAgIGltcGxlbWVudHMgJHZhbGlkYXRvci5pbXBsZW1lbnRzDQotI2VuZA0KLXsNCi0NCi0jaWYgKCR2YWxpZGF0b3IudmFsaWRhdG9ySWQpDQotICAgIHN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIFZBTElEQVRPUl9JRCA9IA0KLSAgICAgICAgIiR2YWxpZGF0b3IudmFsaWRhdG9ySWQiOw0KLSNlbmQNCi0NCi0gICAgcHVibGljICR7dXRpbHMuZ2V0Q2xhc3NGcm9tRnVsbENsYXNzKCR2YWxpZGF0b3IuY2xhc3NOYW1lKX0oKQ0KLSAgICB7DQotICAgIH0NCi0gICAgDQotI3NldCAoJHByb3BlcnR5TGlzdCA9ICR7dmFsaWRhdG9yLnByb3BlcnR5VmFsaWRhdG9yTGlzdH0pDQotDQotI2ZvcmVhY2goICRwcm9wZXJ0eSBpbiAkcHJvcGVydHlMaXN0ICkNCi0jc2V0ICgkZmllbGQgPSAkcHJvcGVydHkuZmllbGROYW1lKQ0KLSNzZXQgKCR0eXBlID0gJHV0aWxzLmdldENsYXNzRnJvbUZ1bGxDbGFzcygkcHJvcGVydHkuY2xhc3NOYW1lKSkNCi0jaWYoJHV0aWxzLmdldERlZmF1bHRWYWx1ZUZpZWxkKCRwcm9wZXJ0eSkpIA0KLSNzZXQgKCRkZWZhdWx0VmFsdWUgPSAkdXRpbHMuZ2V0RGVmYXVsdFZhbHVlRmllbGQoJHByb3BlcnR5KSkNCi0jZWxzZQ0KLSNzZXQgKCRkZWZhdWx0VmFsdWUgPSBmYWxzZSkNCi0jZW5kDQotICAgIC8vIFByb3BlcnR5OiAkcHJvcGVydHkubmFtZQ0KLSNpZiAoJHByb3BlcnR5LmlzTGl0ZXJhbE9ubHkoKSB8fCAkcHJvcGVydHkuaXNUYWdFeGNsdWRlZCgpICkNCi0gICAgcHJpdmF0ZSAkdHlwZSAkZmllbGQgI2lmKCRkZWZhdWx0VmFsdWUpID0gJGRlZmF1bHRWYWx1ZTsje2Vsc2V9OyN7ZW5kfQ0KLQ0KLSAgICAgDQotI2Vsc2UNCi0gICAgcHJpdmF0ZSAkdHlwZSAkZmllbGQ7DQotICAgIA0KLSNlbmQNCi0jaWYoJHV0aWxzLmlzUHJpbWl0aXZlQ2xhc3MoJHR5cGUpICYmICEkcHJvcGVydHkuaXNUYWdFeGNsdWRlZCgpICkNCi0gICAgcHJpdmF0ZSBib29sZWFuICR7ZmllbGR9U2V0Ow0KLSAgICANCi0jaWYgKCRwcm9wZXJ0eS5pc1NldE1ldGhvZCgpKQ0KLSAgICAkcHJvcGVydHkuc2V0TWV0aG9kU2NvcGUgYm9vbGVhbiAkdXRpbHMuZ2V0UHJlZml4ZWRQcm9wZXJ0eU5hbWUoImlzU2V0IiwgJHByb3BlcnR5Lm5hbWUpKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuICR7ZmllbGR9U2V0Ow0KLSAgICB9DQotI2VuZA0KLSNlbmQNCi0jaWYoJHByb3BlcnR5LmlzTG9jYWxNZXRob2QoKSkNCi0jaWYoImJvb2xlYW4iID09ICR0eXBlKQ0KLSNzZXQgKCRtZXRob2ROYW1lID0gJHV0aWxzLmdldFByZWZpeGVkUHJvcGVydHlOYW1lKCJpc0xvY2FsIiwgJHByb3BlcnR5Lm5hbWUpKQ0KLSNlbHNlDQotI3NldCAoJG1ldGhvZE5hbWUgPSAkdXRpbHMuZ2V0UHJlZml4ZWRQcm9wZXJ0eU5hbWUoImdldExvY2FsIiwgJHByb3BlcnR5Lm5hbWUpKQ0KLSNlbmQNCi0gICAgZmluYWwgJHByb3BlcnR5LmxvY2FsTWV0aG9kU2NvcGUgJHR5cGUgJHttZXRob2ROYW1lfSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAkZmllbGQ7DQotICAgIH0NCi0gICAgIA0KLSNlbmQNCi0gICAgcHVibGljICR0eXBlICR1dGlscy5nZXRNZXRob2RSZWFkZXJGcm9tUHJvcGVydHkoJHByb3BlcnR5Lm5hbWUsICR0eXBlKSgpDQotICAgIHsNCi0jaWYgKCRwcm9wZXJ0eS5pc1RhZ0V4Y2x1ZGVkKCkgfHwgJHByb3BlcnR5LmlzTGl0ZXJhbE9ubHkoKSkNCi0gICAgICAgIHJldHVybiAkZmllbGQ7DQotI2Vsc2UNCi0jaWYgKCR1dGlscy5pc1ByaW1pdGl2ZUNsYXNzKCR0eXBlKSkNCi0gICAgICAgIGlmICgke2ZpZWxkfVNldCkNCi0jZWxzZQ0KLSAgICAgICAgaWYgKCRmaWVsZCAhPSBudWxsKQ0KLSNlbmQNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gJGZpZWxkOw0KLSAgICAgICAgfQ0KLSAgICAgICAgVmFsdWVFeHByZXNzaW9uIHZiID0gZ2V0VmFsdWVFeHByZXNzaW9uKCIkcHJvcGVydHkubmFtZSIpOw0KLSAgICAgICAgaWYgKHZiICE9IG51bGwpDQotICAgICAgICB7DQotI2lmICgkdXRpbHMuaXNQcmltaXRpdmVDbGFzcygkdHlwZSkpDQotICAgICAgICAgICAgcmV0dXJuICgkdXRpbHMuY2FzdElmTmVjZXNzYXJ5KCR0eXBlKSB2Yi5nZXRWYWx1ZShnZXRGYWNlc0NvbnRleHQoKS5nZXRFTENvbnRleHQoKSkpLiR7dHlwZX1WYWx1ZSgpOw0KLSNlbHNlDQotI3NldCAoJHByaXR5cGUgPSAkdXRpbHMuZ2V0UHJpbWl0aXZlVHlwZSgkcHJvcGVydHkuY2xhc3NOYW1lKSkNCi0jaWYgKCR1dGlscy5pc1ByaW1pdGl2ZUNsYXNzKCRwcml0eXBlKSkNCi0gICAgICAgICAgICBPYmplY3QgdmFsdWUgPSB2YiA9PSBudWxsID8gbnVsbCA6IHZiLmdldFZhbHVlKGdldEZhY2VzQ29udGV4dCgpLmdldEVMQ29udGV4dCgpKTsNCi0gICAgICAgICAgICBpZiAoISh2YWx1ZSBpbnN0YW5jZW9mICR0eXBlKSl7DQotICAgICAgICAgICAgICAgIHZhbHVlID0gJHt0eXBlfS52YWx1ZU9mKHZhbHVlLnRvU3RyaW5nKCkpOw0KLSAgICAgICAgICAgIH0gICAgICAgICAgICANCi0gICAgICAgICAgICByZXR1cm4gJHV0aWxzLmNhc3RJZk5lY2Vzc2FyeSgkdHlwZSkgdmFsdWU7DQotI2Vsc2UNCi0gICAgICAgICAgICByZXR1cm4gJHV0aWxzLmNhc3RJZk5lY2Vzc2FyeSgkdHlwZSkgdmIuZ2V0VmFsdWUoZ2V0RmFjZXNDb250ZXh0KCkuZ2V0RUxDb250ZXh0KCkpOw0KLSNlbmQNCi0jZW5kDQotICAgICAgICB9DQotI2lmICgkZGVmYXVsdFZhbHVlKQ0KLSAgICAgICAgcmV0dXJuICRkZWZhdWx0VmFsdWU7IA0KLSNlbHNlaWYgKCR1dGlscy5pc1ByaW1pdGl2ZUNsYXNzKCR0eXBlKSkNCi0gICAgICAgIHJldHVybiAkdXRpbHMucHJpbWl0aXZlRGVmYXVsdFZhbHVlKCR0eXBlKTsNCi0jZWxzZSAgICAgICANCi0gICAgICAgIHJldHVybiBudWxsOw0KLSNlbmQNCi0jZW5kDQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgJHV0aWxzLmdldFByZWZpeGVkUHJvcGVydHlOYW1lKCJzZXQiLCAkcHJvcGVydHkubmFtZSkoJHR5cGUgJHV0aWxzLmdldFZhcmlhYmxlRnJvbU5hbWUoJHByb3BlcnR5Lm5hbWUpKQ0KLSAgICB7DQotICAgICAgICB0aGlzLiRmaWVsZCA9ICR1dGlscy5nZXRWYXJpYWJsZUZyb21OYW1lKCRwcm9wZXJ0eS5uYW1lKTsNCi0jaWYgKCR1dGlscy5pc1ByaW1pdGl2ZUNsYXNzKCR0eXBlKSAmJiAhJHByb3BlcnR5LmlzVGFnRXhjbHVkZWQoKSApDQotICAgICAgICB0aGlzLiR7ZmllbGR9U2V0ID0gdHJ1ZTsgICAgICAgIA0KLSNlbmQNCi0gICAgfQ0KLSNlbmQNCi0NCi0gICAgcHVibGljIE9iamVjdCBzYXZlU3RhdGUoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCkNCi0gICAgew0KLSNzZXQgKCRwcmltaXRpdmVDb3VudCA9ICRwcm9wZXJ0eUxpc3Quc2l6ZSgpICsgMSkNCi0jZm9yZWFjaCggJHByb3BlcnR5IGluICRwcm9wZXJ0eUxpc3QgKQ0KLSNpZigkdXRpbHMuaXNQcmltaXRpdmVDbGFzcygkcHJvcGVydHkuY2xhc3NOYW1lKSkNCi0jc2V0ICgkcHJpbWl0aXZlQ291bnQgPSAkcHJpbWl0aXZlQ291bnQgKyAxKQ0KLSNlbmQNCi0jZW5kDQotICAgICAgICBPYmplY3RbXSB2YWx1ZXMgPSBuZXcgT2JqZWN0WyRwcmltaXRpdmVDb3VudF07DQotICAgICAgICB2YWx1ZXNbMF0gPSBzdXBlci5zYXZlU3RhdGUoZmFjZXNDb250ZXh0KTsNCi0jc2V0ICgkYXJyYXlJbmRleCA9IDApDQotI2ZvcmVhY2goICRwcm9wZXJ0eSBpbiAkcHJvcGVydHlMaXN0ICkNCi0jc2V0ICgkZmllbGQgPSAkcHJvcGVydHkuZmllbGROYW1lKQ0KLSNzZXQgKCR0eXBlID0gJHByb3BlcnR5LmNsYXNzTmFtZSkNCi0jc2V0ICgkYXJyYXlJbmRleCA9ICRhcnJheUluZGV4ICsgMSkNCi0jaWYgKCRwcm9wZXJ0eS5qc3BOYW1lID09ICJ2YWxpZGF0b3IiICYmICRwcm9wZXJ0eS5pc01ldGhvZEJpbmRpbmcoKSApDQotICAgICAgICB2YWx1ZXNbJGFycmF5SW5kZXhdID0gc2F2ZUF0dGFjaGVkU3RhdGUoZmFjZXNDb250ZXh0LCR7ZmllbGR9TGlzdCk7DQotI2Vsc2VpZiAoICRwcm9wZXJ0eS5pc1N0YXRlSG9sZGVyKCkgKSMjIHx8ICR1dGlscy5pc0NvbnZlcnRlcigkdHlwZSkNCi0gICAgICAgIHZhbHVlc1skYXJyYXlJbmRleF0gPSBzYXZlQXR0YWNoZWRTdGF0ZShmYWNlc0NvbnRleHQsJGZpZWxkKTsNCi0jZWxzZWlmKCR1dGlscy5pc1ByaW1pdGl2ZUNsYXNzKCR0eXBlKSkNCi0gICAgICAgIHZhbHVlc1skYXJyYXlJbmRleF0gPSAke3V0aWxzLmdldEJveGVkQ2xhc3MoJHR5cGUpfS52YWx1ZU9mKCRmaWVsZCk7DQotI2Vsc2UNCi0gICAgICAgIHZhbHVlc1skYXJyYXlJbmRleF0gPSAkZmllbGQ7DQotI2VuZA0KLSNpZigkdXRpbHMuaXNQcmltaXRpdmVDbGFzcygkdHlwZSkgJiYgISRwcm9wZXJ0eS5pc1RhZ0V4Y2x1ZGVkKCkpDQotI3NldCAoJGFycmF5SW5kZXggPSAkYXJyYXlJbmRleCArIDEpDQotICAgICAgICB2YWx1ZXNbJGFycmF5SW5kZXhdID0gQm9vbGVhbi52YWx1ZU9mKCR7ZmllbGR9U2V0KTsNCi0jZW5kDQotI2VuZA0KLSAgICAgICAgcmV0dXJuIHZhbHVlczsgDQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgcmVzdG9yZVN0YXRlKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIE9iamVjdCBzdGF0ZSkNCi0gICAgew0KLSAgICAgICAgT2JqZWN0W10gdmFsdWVzID0gKE9iamVjdFtdKXN0YXRlOw0KLSAgICAgICAgc3VwZXIucmVzdG9yZVN0YXRlKGZhY2VzQ29udGV4dCx2YWx1ZXNbMF0pOw0KLSNzZXQgKCRhcnJheUluZGV4ID0gMCkNCi0jZm9yZWFjaCggJHByb3BlcnR5IGluICRwcm9wZXJ0eUxpc3QgKQ0KLSNzZXQgKCRmaWVsZCA9ICRwcm9wZXJ0eS5maWVsZE5hbWUpDQotI3NldCAoJHR5cGUgPSAkcHJvcGVydHkuY2xhc3NOYW1lKQ0KLSNzZXQgKCRhcnJheUluZGV4ID0gJGFycmF5SW5kZXggKyAxKQ0KLSNpZiAoICRwcm9wZXJ0eS5pc1N0YXRlSG9sZGVyKCkgKQ0KLSNpZiAoJHByb3BlcnR5LmpzcE5hbWUgPT0gInZhbGlkYXRvciIgJiYgJHByb3BlcnR5LmlzTWV0aG9kQmluZGluZygpICkNCi0gICAgICAgICR7ZmllbGR9TGlzdCA9IChMaXN0PFZhbGlkYXRvcj4pIHJlc3RvcmVBdHRhY2hlZFN0YXRlKGZhY2VzQ29udGV4dCx2YWx1ZXNbJGFycmF5SW5kZXhdKTsNCi0jZWxzZWlmICgkdXRpbHMuaXNMaXN0KCR0eXBlKSkNCi0gICAgICAgICRmaWVsZCA9IChMaXN0KSByZXN0b3JlQXR0YWNoZWRTdGF0ZShmYWNlc0NvbnRleHQsdmFsdWVzWyRhcnJheUluZGV4XSk7DQotI2Vsc2UNCi0gICAgICAgICRmaWVsZCA9ICR1dGlscy5jYXN0SWZOZWNlc3NhcnkoJHR5cGUpIHJlc3RvcmVBdHRhY2hlZFN0YXRlKGZhY2VzQ29udGV4dCx2YWx1ZXNbJGFycmF5SW5kZXhdKTsgDQotI2VuZA0KLSNlbHNlaWYgKCR1dGlscy5pc0NvbnZlcnRlcigkdHlwZSkpIA0KLSAgICAgICAgJGZpZWxkID0gKENvbnZlcnRlcikgcmVzdG9yZUF0dGFjaGVkU3RhdGUoZmFjZXNDb250ZXh0LHZhbHVlc1skYXJyYXlJbmRleF0pOw0KLSNlbHNlaWYgKCR1dGlscy5pc1ByaW1pdGl2ZUNsYXNzKCR0eXBlKSkNCi0gICAgICAgICRmaWVsZCA9ICgkdXRpbHMuY2FzdElmTmVjZXNzYXJ5KCR0eXBlKSB2YWx1ZXNbJGFycmF5SW5kZXhdKS4ke3R5cGV9VmFsdWUoKTsNCi0jZWxzZQ0KLSAgICAgICAgJGZpZWxkID0gJHV0aWxzLmNhc3RJZk5lY2Vzc2FyeSgkdHlwZSkgdmFsdWVzWyRhcnJheUluZGV4XTsNCi0jZW5kDQotI2lmKCR1dGlscy5pc1ByaW1pdGl2ZUNsYXNzKCR0eXBlKSAmJiAhJHByb3BlcnR5LmlzVGFnRXhjbHVkZWQoKSApDQotI3NldCAoJGFycmF5SW5kZXggPSAkYXJyYXlJbmRleCArIDEpDQotICAgICAgICAke2ZpZWxkfVNldCA9ICgoQm9vbGVhbikgdmFsdWVzWyRhcnJheUluZGV4XSkuYm9vbGVhblZhbHVlKCk7DQotI2VuZA0KLSNlbmQNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1qc2Zjb21wb25lbnRzMjAvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvY29yZS9zcmMvdGVzdC9qYXZhL29yZy9teW9yZ2FuaXphdGlvbi9jb21wb25lbnQvc2F5aGVsbG8vU2F5SGVsbG9SZW5kZXJlclRlc3QuamF2YSBiL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWpzZmNvbXBvbmVudHMyMC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9jb3JlL3NyYy90ZXN0L2phdmEvb3JnL215b3JnYW5pemF0aW9uL2NvbXBvbmVudC9zYXloZWxsby9TYXlIZWxsb1JlbmRlcmVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Mjk2MDM0Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWpzZmNvbXBvbmVudHMyMC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9jb3JlL3NyYy90ZXN0L2phdmEvb3JnL215b3JnYW5pemF0aW9uL2NvbXBvbmVudC9zYXloZWxsby9TYXlIZWxsb1JlbmRlcmVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLm15b3JnYW5pemF0aW9uLmNvbXBvbmVudC5zYXloZWxsbzsNCi0NCi1pbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy50ZXN0LmJhc2UuQWJzdHJhY3RKc2ZUZXN0Q2FzZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLnRlc3QubW9jay5Nb2NrUmVuZGVyS2l0RmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLnRlc3QubW9jay5Nb2NrUmVzcG9uc2VXcml0ZXI7DQotDQotLyoqDQotICogQ2xhc3MgdG8gdGVzdCB0aGUgYmVoYXZpb3VyIG9mIHRoZSBTYXlIZWxsbyByZW5kZXJlcg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBTYXlIZWxsb1JlbmRlcmVyVGVzdCBleHRlbmRzIEFic3RyYWN0SnNmVGVzdENhc2UNCi17DQotDQotICAgIHByaXZhdGUgTW9ja1Jlc3BvbnNlV3JpdGVyIHdyaXRlciA7DQotICAgIHByaXZhdGUgU2F5SGVsbG8gc2F5SGVsbG87DQotDQotICAgIHB1YmxpYyBTYXlIZWxsb1JlbmRlcmVyVGVzdChTdHJpbmcgbmFtZSkNCi0gICAgew0KLSAgICAgICAgc3VwZXIobmFtZSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIHN1cGVyLnNldFVwKCk7DQotDQotICAgICAgICBzYXlIZWxsbyA9IG5ldyBTYXlIZWxsbygpOw0KLSAgICAgICAgc2F5SGVsbG8uc2V0Rmlyc3ROYW1lKCJKb2huIik7DQotICAgICAgICBzYXlIZWxsby5zZXRMYXN0TmFtZSgiU21pdGgiKTsNCi0NCi0gICAgICAgIHdyaXRlciA9IG5ldyBNb2NrUmVzcG9uc2VXcml0ZXIobmV3IFN0cmluZ1dyaXRlcigpLCBudWxsLCBudWxsKTsNCi0gICAgICAgIGZhY2VzQ29udGV4dC5zZXRSZXNwb25zZVdyaXRlcih3cml0ZXIpOw0KLSAgICAgICAgLy8gVE9ETyByZW1vdmUgdGhlc2UgdHdvIGxpbmVzIG9uY2Ugc2hhbGUtdGVzdCBnb2VzIGFscGhhLCBzZWUgTVlGQUNFUy0xMTU1DQotICAgICAgICBmYWNlc0NvbnRleHQuZ2V0Vmlld1Jvb3QoKS5zZXRSZW5kZXJLaXRJZChNb2NrUmVuZGVyS2l0RmFjdG9yeS5IVE1MX0JBU0lDX1JFTkRFUl9LSVQpOw0KLSAgICAgICAgZmFjZXNDb250ZXh0LmdldFJlbmRlcktpdCgpLmFkZFJlbmRlcmVyKA0KLSAgICAgICAgICAgICAgICBzYXlIZWxsby5nZXRGYW1pbHkoKSwNCi0gICAgICAgICAgICAgICAgc2F5SGVsbG8uZ2V0UmVuZGVyZXJUeXBlKCksDQotICAgICAgICAgICAgICAgIG5ldyBTYXlIZWxsb1JlbmRlcmVyKCkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBzdXBlci50ZWFyRG93bigpOw0KLSAgICAgICAgc2F5SGVsbG8gPSBudWxsOw0KLSAgICAgICAgd3JpdGVyID0gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RW5jb2RlRW5kKCkgIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgc2F5SGVsbG8uZW5jb2RlRW5kKGZhY2VzQ29udGV4dCk7DQotICAgICAgICBmYWNlc0NvbnRleHQucmVuZGVyUmVzcG9uc2UoKTsNCi0NCi0gICAgICAgIFN0cmluZyBvdXRwdXQgPSB3cml0ZXIuZ2V0V3JpdGVyKCkudG9TdHJpbmcoKTsNCi0NCi0gICAgICAgIGFzc2VydEVxdWFscygiSGVsbG8gSm9obiBTbWl0aCEiLCBvdXRwdXQpOw0KLSAgICAgICAgYXNzZXJ0Tm90U2FtZSgiQnllIEpvaG4gU21pdGghIiwgb3V0cHV0KTsNCi0gICAgfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1qc2Zjb21wb25lbnRzMjAvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvY29yZS9zcmMvdGVzdC9qYXZhL29yZy9teW9yZ2FuaXphdGlvbi9jb252ZXJ0ZXIvUGhvbmVOdW1iZXJDb252ZXJ0ZXJUZXN0LmphdmEgYi9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1qc2Zjb21wb25lbnRzMjAvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvY29yZS9zcmMvdGVzdC9qYXZhL29yZy9teW9yZ2FuaXphdGlvbi9jb252ZXJ0ZXIvUGhvbmVOdW1iZXJDb252ZXJ0ZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0MWI3NGUuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtanNmY29tcG9uZW50czIwL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL2NvcmUvc3JjL3Rlc3QvamF2YS9vcmcvbXlvcmdhbml6YXRpb24vY29udmVydGVyL1Bob25lTnVtYmVyQ29udmVydGVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLm15b3JnYW5pemF0aW9uLmNvbnZlcnRlcjsNCi0NCi1pbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxJbnB1dFRleHQ7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy50ZXN0LmJhc2UuQWJzdHJhY3RKc2ZUZXN0Q2FzZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLnRlc3QubW9jay5Nb2NrUmVzcG9uc2VXcml0ZXI7DQotDQotcHVibGljIGNsYXNzIFBob25lTnVtYmVyQ29udmVydGVyVGVzdCBleHRlbmRzIEFic3RyYWN0SnNmVGVzdENhc2UNCi17DQotDQotICAgIHByaXZhdGUgTW9ja1Jlc3BvbnNlV3JpdGVyIHdyaXRlciA7DQotICAgIHByaXZhdGUgUGhvbmVOdW1iZXJDb252ZXJ0ZXIgcGhvbmVOdW1Db252ZXJ0ZXI7DQotDQotICAgIHB1YmxpYyBQaG9uZU51bWJlckNvbnZlcnRlclRlc3QoU3RyaW5nIG5hbWUpDQotICAgIHsNCi0gICAgICAgIHN1cGVyKG5hbWUpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBzdXBlci5zZXRVcCgpOw0KLQ0KLSAgICAgICAgcGhvbmVOdW1Db252ZXJ0ZXIgPSBuZXcgUGhvbmVOdW1iZXJDb252ZXJ0ZXIoKTsNCi0gICAgICAgIHdyaXRlciA9IG5ldyBNb2NrUmVzcG9uc2VXcml0ZXIobmV3IFN0cmluZ1dyaXRlcigpLCBudWxsLCBudWxsKTsNCi0gICAgICAgIGZhY2VzQ29udGV4dC5zZXRSZXNwb25zZVdyaXRlcih3cml0ZXIpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBzdXBlci50ZWFyRG93bigpOw0KLSAgICAgICAgcGhvbmVOdW1Db252ZXJ0ZXIgPSBudWxsOw0KLSAgICAgICAgd3JpdGVyID0gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TnVtT25seSgpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgT2JqZWN0IG9iaiA9IHBob25lTnVtQ29udmVydGVyLmdldEFzT2JqZWN0KGZhY2VzQ29udGV4dCwgbmV3IEh0bWxJbnB1dFRleHQoKSwgIjYzNzM4MjQiKTsNCi0gICAgICAgIGFzc2VydE5vdE51bGwob2JqKTsNCi0gICAgICAgIFBob25lTnVtYmVyIHBob25lTnVtID0gKFBob25lTnVtYmVyKSBvYmo7DQotICAgICAgICBhc3NlcnRFcXVhbHMocGhvbmVOdW0uZ2V0TnVtYmVyKCksICI2MzczODI0Iik7DQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyB2b2lkIHRlc3RBcmVhQ29kZU51bSgpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgT2JqZWN0IG9iaiA9IHBob25lTnVtQ29udmVydGVyLmdldEFzT2JqZWN0KGZhY2VzQ29udGV4dCwgbmV3IEh0bWxJbnB1dFRleHQoKSwgIjA5LTYzNzM4MjQiKTsNCi0gICAgICAgIGFzc2VydE5vdE51bGwob2JqKTsNCi0gICAgICAgIFBob25lTnVtYmVyIHBob25lTnVtID0gKFBob25lTnVtYmVyKSBvYmo7DQotICAgICAgICBhc3NlcnRFcXVhbHMocGhvbmVOdW0uZ2V0QXJlYUNvZGUoKSwgIjA5Iik7DQotICAgICAgICBhc3NlcnRFcXVhbHMocGhvbmVOdW0uZ2V0TnVtYmVyKCksICI2MzczODI0Iik7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtanNmY29tcG9uZW50czIwL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL2NvcmUvc3JjL3Rlc3QvamF2YS9vcmcvbXlvcmdhbml6YXRpb24vdmFsaWRhdG9yL09kZE51bWJlclZhbGlkYXRvclRlc3QuamF2YSBiL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWpzZmNvbXBvbmVudHMyMC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9jb3JlL3NyYy90ZXN0L2phdmEvb3JnL215b3JnYW5pemF0aW9uL3ZhbGlkYXRvci9PZGROdW1iZXJWYWxpZGF0b3JUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4N2M3NTEuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtanNmY29tcG9uZW50czIwL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL2NvcmUvc3JjL3Rlc3QvamF2YS9vcmcvbXlvcmdhbml6YXRpb24vdmFsaWRhdG9yL09kZE51bWJlclZhbGlkYXRvclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5teW9yZ2FuaXphdGlvbi52YWxpZGF0b3I7DQotDQotaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sSW5wdXRUZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yRXhjZXB0aW9uOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMudGVzdC5iYXNlLkFic3RyYWN0SnNmVGVzdENhc2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy50ZXN0Lm1vY2suTW9ja1Jlc3BvbnNlV3JpdGVyOw0KLQ0KLXB1YmxpYyBjbGFzcyBPZGROdW1iZXJWYWxpZGF0b3JUZXN0IGV4dGVuZHMgQWJzdHJhY3RKc2ZUZXN0Q2FzZQ0KLXsNCi0NCi0gICAgcHJpdmF0ZSBNb2NrUmVzcG9uc2VXcml0ZXIgd3JpdGVyIDsNCi0gICAgcHJpdmF0ZSBPZGROdW1iZXJWYWxpZGF0b3Igb2RkTnVtVmFsaWRhdG9yOw0KLQ0KLSAgICBwdWJsaWMgT2RkTnVtYmVyVmFsaWRhdG9yVGVzdChTdHJpbmcgbmFtZSkNCi0gICAgew0KLSAgICAgICAgc3VwZXIobmFtZSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIHN1cGVyLnNldFVwKCk7DQotDQotICAgICAgICBvZGROdW1WYWxpZGF0b3IgPSBuZXcgT2RkTnVtYmVyVmFsaWRhdG9yKCk7DQotICAgICAgICB3cml0ZXIgPSBuZXcgTW9ja1Jlc3BvbnNlV3JpdGVyKG5ldyBTdHJpbmdXcml0ZXIoKSwgbnVsbCwgbnVsbCk7DQotICAgICAgICBmYWNlc0NvbnRleHQuc2V0UmVzcG9uc2VXcml0ZXIod3JpdGVyKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgc3VwZXIudGVhckRvd24oKTsNCi0gICAgICAgIG9kZE51bVZhbGlkYXRvciA9IG51bGw7DQotICAgICAgICB3cml0ZXIgPSBudWxsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RPZGROdW1JbnB1dCgpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgYm9vbGVhbiBub0V4Y2VwdGlvbnNUaHJvd24gPSB0cnVlOw0KLSAgICAgICAgdHJ5IA0KLSAgICAgICAgew0KLSAgICAgICAgICAgIG9kZE51bVZhbGlkYXRvci52YWxpZGF0ZShmYWNlc0NvbnRleHQsIG5ldyBIdG1sSW5wdXRUZXh0KCksIG5ldyBJbnRlZ2VyKDMpKTsNCi0gICAgICAgIH0gDQotICAgICAgICBjYXRjaChWYWxpZGF0b3JFeGNlcHRpb24gdmUpIA0KLSAgICAgICAgew0KLSAgICAgICAgICAgIG5vRXhjZXB0aW9uc1Rocm93biA9IGZhbHNlOw0KLSAgICAgICAgfQ0KLSAgICAgICAgYXNzZXJ0VHJ1ZShub0V4Y2VwdGlvbnNUaHJvd24pOw0KLSAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RXZlbk51bUlucHV0KCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBib29sZWFuIG5vRXhjZXB0aW9uc1Rocm93biA9IHRydWU7DQotICAgICAgICB0cnkgDQotICAgICAgICB7DQotICAgICAgICAgICAgb2RkTnVtVmFsaWRhdG9yLnZhbGlkYXRlKGZhY2VzQ29udGV4dCwgbmV3IEh0bWxJbnB1dFRleHQoKSwgbmV3IEludGVnZXIoOCkpOw0KLSAgICAgICAgfSANCi0gICAgICAgIGNhdGNoKFZhbGlkYXRvckV4Y2VwdGlvbiB2ZSkgDQotICAgICAgICB7DQotICAgICAgICAgICAgbm9FeGNlcHRpb25zVGhyb3duID0gZmFsc2U7DQotICAgICAgICB9DQotICAgICAgICBhc3NlcnRGYWxzZShub0V4Y2VwdGlvbnNUaHJvd24pOw0KLSAgICB9DQotICAgIA0KLSAgICANCi19DQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtanNmY29tcG9uZW50czIwL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL2V4YW1wbGVzL3BvbS54bWwgYi9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1qc2Zjb21wb25lbnRzMjAvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvZXhhbXBsZXMvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzQ1MjJmZS4uMDAwMDAwMAotLS0gYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1qc2Zjb21wb25lbnRzMjAvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvZXhhbXBsZXMvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIwMiArMCwwIEBACi0jc2V0KCAkc3ltYm9sX3BvdW5kID0gJyMnICkNCi0jc2V0KCAkc3ltYm9sX2RvbGxhciA9ICckJyApDQotI3NldCggJHN5bWJvbF9lc2NhcGUgPSAnXCcgKQ0KLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPCEtLQ0KLSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi08IS0tIFRoaXMgaXMgdGhlIHByb2plY3QgZGVzY3JpcHRvciBmb3IgdGhlIGV4YW1wbGVzIG9mIG15IGNvbXBvbmVudHMgLS0+DQotDQotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+DQotICAgIDxwYXJlbnQ+DQotICAgICAgICA8Z3JvdXBJZD4ke2dyb3VwSWR9PC9ncm91cElkPg0KLSAgICAgICAgPGFydGlmYWN0SWQ+JHthcnRpZmFjdElkfS1wcm9qZWN0PC9hcnRpZmFjdElkPg0KLSAgICAgICAgPHZlcnNpb24+JHt2ZXJzaW9ufTwvdmVyc2lvbj4NCi0gICAgPC9wYXJlbnQ+DQotICAgIA0KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+DQotICAgIDxhcnRpZmFjdElkPiR7YXJ0aWZhY3RJZH0tZXhhbXBsZXM8L2FydGlmYWN0SWQ+DQotICAgIDxwYWNrYWdpbmc+d2FyPC9wYWNrYWdpbmc+DQotICAgIDxuYW1lPk15IENvbXBvbmVudHMgRXhhbXBsZXM8L25hbWU+DQotDQotICAgIDxwcm9wZXJ0aWVzPg0KLSAgICAgICAgPGxvZzRqLnZlcnNpb24+MS4yLjEzPC9sb2c0ai52ZXJzaW9uPg0KLSAgICA8L3Byb3BlcnRpZXM+DQotICAgIA0KLSAgICA8ZGVwZW5kZW5jaWVzPg0KLSAgICAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgICAgPGdyb3VwSWQ+JHtncm91cElkfTwvZ3JvdXBJZD4NCi0gICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD4ke2FydGlmYWN0SWR9LWNvcmU8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgICAgPHZlcnNpb24+JHtzeW1ib2xfZG9sbGFyfXtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPg0KLSAgICAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC5zZXJ2bGV0PC9ncm91cElkPg0KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5zZXJ2bGV0LWFwaTwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4NCi0gICAgICAgICAgICA8L2RlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgICAgIDxncm91cElkPmphdmF4LnNlcnZsZXQuanNwPC9ncm91cElkPg0KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qc3AtYXBpPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPg0KLSAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4gICAgICAgIA0KLSAgICAgICAgICAgDQotICAgICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICAgICA8Z3JvdXBJZD5jb21tb25zLWxvZ2dpbmc8L2dyb3VwSWQ+DQotICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+Y29tbW9ucy1sb2dnaW5nPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgICAgIDx2ZXJzaW9uPjEuMS4xPC92ZXJzaW9uPg0KLSAgICAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4NCi0gICAgICAgICAgIDwvZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXguc2VydmxldDwvZ3JvdXBJZD4NCi0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+anN0bDwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICAgICAgPHZlcnNpb24+MS4yPC92ZXJzaW9uPg0KLSAgICAgICAgICAgICAgICA8c2NvcGU+cnVudGltZTwvc2NvcGU+DQotICAgICAgICAgICAgPC9kZXBlbmRlbmN5PiAgICAgICAgICAgDQotICAgICAgICAgICANCi0gICAgICAgPC9kZXBlbmRlbmNpZXM+DQotDQotICAgIDxwcm9maWxlcz4NCi0gICAgICAgIDwhLS0gQnkgZGVmYXVsdCB0aGUgd2FyIGV4YW1wbGVzIHVzZSBteWZhY2VzISA6KSAtLT4NCi0gICAgICAgIDxwcm9maWxlPg0KLSAgICAgICAgICAgIDxpZD5teWZhY2VzPC9pZD4NCi0gICAgICAgICAgICA8YWN0aXZhdGlvbj4NCi0gICAgICAgICAgICAgICAgPHByb3BlcnR5Pg0KLSAgICAgICAgICAgICAgICAgICAgPG5hbWU+IWpzZjwvbmFtZT4NCi0gICAgICAgICAgICAgICAgPC9wcm9wZXJ0eT4NCi0gICAgICAgICAgICA8L2FjdGl2YXRpb24+DQotICAgICAgICAgICAgPGRlcGVuZGVuY2llcz4NCi0gICAgICAgICAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuY29yZTwvZ3JvdXBJZD4NCi0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtYXBpPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtzeW1ib2xfZG9sbGFyfXtqc2YtbXlmYWNlcy52ZXJzaW9ufTwvdmVyc2lvbj4NCi0gICAgICAgICAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5jb3JlPC9ncm91cElkPg0KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1pbXBsPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtzeW1ib2xfZG9sbGFyfXtqc2YtbXlmYWNlcy52ZXJzaW9ufTwvdmVyc2lvbj4NCi0gICAgICAgICAgICAgICAgICAgIDwhLS0gU2FuZGJveCBleGFtcGxlcyBtdXN0IG9ubHkgaGF2ZSBydW50aW1lIGRlcGVuZGVuY3kgdG8gbXlmYWNlcy1pbXBsDQotICAgICAgICAgICAgICAgICBzbyB0aGF0IGl0IHdpbGwgYmUgYXV0b21hdGljYWxseSBhZGRlZCB0byB3YXIuIEJ1dCB0aGVyZSBtdXN0IG5vdCBiZQ0KLSAgICAgICAgICAgICAgICAgYW55IGNvbXBpbGUgZGVwZW5kZW5jeSBvbiBpbXBsIHNvIHRoYXQgaXMgaXMgYWx3YXlzIHBvc3NpYmxlIHRvIHVzZQ0KLSAgICAgICAgICAgICAgICAgb3RoZXIgSlNGIGltcGxlbWVudGF0aW9ucy4gLS0+DQotICAgICAgICAgICAgICAgICAgICA8c2NvcGU+cnVudGltZTwvc2NvcGU+DQotICAgICAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8L2RlcGVuZGVuY2llcz4NCi0NCi0gICAgICAgICAgICA8cHJvcGVydGllcz4NCi0gICAgICAgICAgICAgICAgPGpzZl9pbXBsZW1lbnRhdGlvbj5NeUZhY2VzPC9qc2ZfaW1wbGVtZW50YXRpb24+DQotICAgICAgICAgICAgPC9wcm9wZXJ0aWVzPg0KLSAgICAgICAgPC9wcm9maWxlPg0KLQ0KLSAgICAgICAgPCEtLSBUbyB1c2UgdGhlIGV4YW1wbGVzIHVzaW5nIHRoZSBTdW4ncyBKU0YgUmVmZXJlbmNlIEltcGxlbWVudGF0aW9uOiAtRGpzZj1yaSAtLT4NCi0gICAgICAgIDxwcm9maWxlPg0KLSAgICAgICAgICAgIDxpZD5qc2ZyaTwvaWQ+DQotICAgICAgICAgICAgPGFjdGl2YXRpb24+DQotICAgICAgICAgICAgICAgIDxwcm9wZXJ0eT4NCi0gICAgICAgICAgICAgICAgICAgIDxuYW1lPmpzZjwvbmFtZT4NCi0gICAgICAgICAgICAgICAgICAgIDx2YWx1ZT5yaTwvdmFsdWU+DQotICAgICAgICAgICAgICAgIDwvcHJvcGVydHk+DQotICAgICAgICAgICAgPC9hY3RpdmF0aW9uPg0KLSAgICAgICAgICAgIDxkZXBlbmRlbmNpZXM+DQotICAgICAgICAgICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXguZmFjZXM8L2dyb3VwSWQ+DQotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qc2YtYXBpPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtzeW1ib2xfZG9sbGFyfXtqc2YtcmkudmVyc2lvbn08L3ZlcnNpb24+DQotICAgICAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC5mYWNlczwvZ3JvdXBJZD4NCi0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmpzZi1pbXBsPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtzeW1ib2xfZG9sbGFyfXtqc2YtcmkudmVyc2lvbn08L3ZlcnNpb24+DQotICAgICAgICAgICAgICAgICAgICA8c2NvcGU+cnVudGltZTwvc2NvcGU+DQotICAgICAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8L2RlcGVuZGVuY2llcz4NCi0NCi0gICAgICAgICAgICA8cmVwb3NpdG9yaWVzPg0KLSAgICAgICAgICAgICAgICA8cmVwb3NpdG9yeT4NCi0gICAgICAgICAgICAgICAgICAgIDxpZD5qYXZhLm5ldDwvaWQ+DQotICAgICAgICAgICAgICAgICAgICA8dXJsPmh0dHA6Ly9kb3dubG9hZC5qYXZhLm5ldC9tYXZlbi8xPC91cmw+DQotICAgICAgICAgICAgICAgICAgICA8bGF5b3V0PmxlZ2FjeTwvbGF5b3V0Pg0KLSAgICAgICAgICAgICAgICA8L3JlcG9zaXRvcnk+DQotICAgICAgICAgICAgPC9yZXBvc2l0b3JpZXM+DQotDQotICAgICAgICAgICAgPHByb3BlcnRpZXM+DQotICAgICAgICAgICAgICAgIDxqc2ZfaW1wbGVtZW50YXRpb24+SlNGLVJJPC9qc2ZfaW1wbGVtZW50YXRpb24+DQotICAgICAgICAgICAgPC9wcm9wZXJ0aWVzPg0KLSAgICAgICAgPC9wcm9maWxlPg0KLSAgICAgICAgPHByb2ZpbGU+DQotICAgICAgICAgICAgPCEtLSBEZWJ1ZyBwcm9maWxlIGZvciBteWZhY2VzIGFuZCBqZXR0eS4NCi0gICAgICAgICAgICAgICAgSXQgYWxsb3dzIHRvIHNlZSBkZWJ1ZyBtZXNzYWdlcyB1c2luZyAtUGpldHR5Q29uZmlnIC0tPg0KLSAgICAgICAgICAgIDxpZD5qZXR0eUNvbmZpZzwvaWQ+DQotICAgICAgICAgICAgPGJ1aWxkPg0KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2VzPg0KLSAgICAgICAgICAgICAgICAgICAgPHJlc291cmNlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+c3JjL21haW4vcmVzb3VyY2VzPC9kaXJlY3Rvcnk+DQotICAgICAgICAgICAgICAgICAgICA8L3Jlc291cmNlPg0KLSAgICAgICAgICAgICAgICAgICAgPHJlc291cmNlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+c3JjL21haW4vbG9nNGo8L2RpcmVjdG9yeT4NCi0gICAgICAgICAgICAgICAgICAgIDwvcmVzb3VyY2U+DQotICAgICAgICAgICAgICAgIDwvcmVzb3VyY2VzPg0KLSAgICAgICAgICAgICAgICA8cGx1Z2lucz4NCi0gICAgICAgICAgICAgICAgICAgIDxwbHVnaW4+DQotICAgICAgICAgICAgICAgICAgICAgICAgPCEtLVRoaXMgcGx1Z2luIGFsbG93cyB0byBydW4gdGhlIGV4YW1wbGUgdXNpbmcgbXZuIGpldHR5OnJ1biAtLT4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcubW9ydGJheS5qZXR0eTwvZ3JvdXBJZD4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1qZXR0eS1wbHVnaW48L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtzeW1ib2xfZG9sbGFyfXttYXZlbi5qZXR0eS5wbHVnaW4udmVyc2lvbn08L3ZlcnNpb24+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzY2FuSW50ZXJ2YWxTZWNvbmRzPjEwPC9zY2FuSW50ZXJ2YWxTZWNvbmRzPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3lzdGVtUHJvcGVydGllcz4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzeXN0ZW1Qcm9wZXJ0eT4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5vcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c8L25hbWU+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZhbHVlPm9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLmltcGwuTG9nNEpMb2dnZXI8L3ZhbHVlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zeXN0ZW1Qcm9wZXJ0eT4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zeXN0ZW1Qcm9wZXJ0aWVzPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgICAgICAgICAgIDwvcGx1Z2luPg0KLSAgICAgICAgICAgICAgICA8L3BsdWdpbnM+DQotICAgICAgICAgICAgPC9idWlsZD4NCi0gICAgICAgICAgICA8ZGVwZW5kZW5jaWVzPg0KLSAgICAgICAgICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPmxvZzRqPC9ncm91cElkPg0KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bG9nNGo8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3N5bWJvbF9kb2xsYXJ9e2xvZzRqLnZlcnNpb259PC92ZXJzaW9uPg0KLSAgICAgICAgICAgICAgICAgICAgPHR5cGU+amFyPC90eXBlPg0KLSAgICAgICAgICAgICAgICA8L2RlcGVuZGVuY3k+DQotICAgICAgICAgICAgPC9kZXBlbmRlbmNpZXM+DQotICAgICAgICA8L3Byb2ZpbGU+DQotICAgIDwvcHJvZmlsZXM+DQotDQotICAgIDxidWlsZD4NCi0gICAgICAgIDxmaW5hbE5hbWU+JHthcnRpZmFjdElkfTwvZmluYWxOYW1lPg0KLSAgICAgICAgPHBsdWdpbnM+DQotICAgICAgICAgICAgPHBsdWdpbj4NCi0gICAgICAgICAgICAgICAgPCEtLVRoaXMgcGx1Z2luIGFsbG93cyB0byBydW4gdGhlIGV4YW1wbGUgdXNpbmcgbXZuIGpldHR5OnJ1biAtLT4NCi0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLm1vcnRiYXkuamV0dHk8L2dyb3VwSWQ+DQotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWpldHR5LXBsdWdpbjwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICAgICAgPHZlcnNpb24+JHtzeW1ib2xfZG9sbGFyfXttYXZlbi5qZXR0eS5wbHVnaW4udmVyc2lvbn08L3ZlcnNpb24+DQotICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPg0KLSAgICAgICAgICAgICAgICAgICAgPHNjYW5JbnRlcnZhbFNlY29uZHM+MTA8L3NjYW5JbnRlcnZhbFNlY29uZHM+DQotICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgICA8L3BsdWdpbj4NCi0gICAgICAgIDwvcGx1Z2lucz4NCi0gICAgICAgIDxyZXNvdXJjZXM+DQotICAgICAgICAgICAgPHJlc291cmNlPg0KLSAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PnNyYy9tYWluL3Jlc291cmNlczwvZGlyZWN0b3J5Pg0KLSAgICAgICAgICAgICAgICA8ZmlsdGVyaW5nPnRydWU8L2ZpbHRlcmluZz4NCi0gICAgICAgICAgICA8L3Jlc291cmNlPg0KLSAgICAgICAgPC9yZXNvdXJjZXM+DQotICAgIDwvYnVpbGQ+DQotPC9wcm9qZWN0Pg0KZGlmZiAtLWdpdCBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWpzZmNvbXBvbmVudHMyMC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9leGFtcGxlcy9zcmMvbWFpbi9qYXZhL29yZy9teW9yZ2FuaXphdGlvbi9jb21wb25lbnQvZXhhbXBsZS9TYXlIZWxsb0JlYW4uamF2YSBiL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWpzZmNvbXBvbmVudHMyMC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9leGFtcGxlcy9zcmMvbWFpbi9qYXZhL29yZy9teW9yZ2FuaXphdGlvbi9jb21wb25lbnQvZXhhbXBsZS9TYXlIZWxsb0JlYW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTQ0Y2JjMS4uMDAwMDAwMAotLS0gYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1qc2Zjb21wb25lbnRzMjAvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvZXhhbXBsZXMvc3JjL21haW4vamF2YS9vcmcvbXlvcmdhbml6YXRpb24vY29tcG9uZW50L2V4YW1wbGUvU2F5SGVsbG9CZWFuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTcgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLm15b3JnYW5pemF0aW9uLmNvbXBvbmVudC5leGFtcGxlOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5iZWFuLk1hbmFnZWRCZWFuOw0KLWltcG9ydCBqYXZheC5mYWNlcy5iZWFuLlJlcXVlc3RTY29wZWQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmV2ZW50LkFjdGlvbkV2ZW50Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotaW1wb3J0IG9yZy5teW9yZ2FuaXphdGlvbi5jb252ZXJ0ZXIuUGhvbmVOdW1iZXI7DQotDQotLyoqDQotICogTWFuYWdlZCBiZWFuIGZvciB0aGUgc2F5SGVsbG8gcGFnZSBleGFtcGxlDQotICovDQotcHVibGljIGNsYXNzIFNheUhlbGxvQmVhbg0KLXsNCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKFNheUhlbGxvQmVhbi5jbGFzcyk7DQotDQotICAgIHByaXZhdGUgU3RyaW5nIGZpcnN0TmFtZTsNCi0gICAgcHJpdmF0ZSBTdHJpbmcgbGFzdE5hbWU7DQotICAgIHByaXZhdGUgYm9vbGVhbiByZW5kZXJHcmVldGluZzsNCi0gICAgcHJpdmF0ZSBJbnRlZ2VyIG9kZE51bWJlcjsNCi0gICAgcHJpdmF0ZSBQaG9uZU51bWJlciBwaG9uZU51bWJlcjsNCi0NCi0gICAgcHVibGljIFNheUhlbGxvQmVhbigpDQotICAgIHsNCi0gICAgICAgIHRoaXMucmVuZGVyR3JlZXRpbmcgPSBmYWxzZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzYXlJdChBY3Rpb25FdmVudCBldnQpDQotICAgIHsNCi0gICAgICAgIHJlbmRlckdyZWV0aW5nID0gdHJ1ZTsNCi0NCi0gICAgICAgIGlmIChsb2cuaXNJbmZvRW5hYmxlZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGxvZy5pbmZvKCJUaGUgbmFtZSB0byBzYXkgaGVsbG8gaXMgJyIrZmlyc3ROYW1lKyInIGFuZCB0aGUgbGFzdCBuYW1lIGlzICciK2xhc3ROYW1lKyInLiIpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Rmlyc3ROYW1lKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGZpcnN0TmFtZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRGaXJzdE5hbWUoU3RyaW5nIGZpcnN0TmFtZSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5maXJzdE5hbWUgPSBmaXJzdE5hbWU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRMYXN0TmFtZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBsYXN0TmFtZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRMYXN0TmFtZShTdHJpbmcgbGFzdE5hbWUpDQotICAgIHsNCi0gICAgICAgIHRoaXMubGFzdE5hbWUgPSBsYXN0TmFtZTsNCi0gICAgfQ0KLQ0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1JlbmRlckdyZWV0aW5nKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHJlbmRlckdyZWV0aW5nOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldFJlbmRlckdyZWV0aW5nKGJvb2xlYW4gcmVuZGVyR3JlZXRpbmcpDQotICAgIHsNCi0gICAgICAgIHRoaXMucmVuZGVyR3JlZXRpbmcgPSByZW5kZXJHcmVldGluZzsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgSW50ZWdlciBnZXRPZGROdW1iZXIoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gb2RkTnVtYmVyOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldE9kZE51bWJlcihJbnRlZ2VyIG9kZE51bWJlcikNCi0gICAgew0KLSAgICAgICAgdGhpcy5vZGROdW1iZXIgPSBvZGROdW1iZXI7DQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyBTdHJpbmcgc3VibWl0T2RkTnVtYmVyKCkgew0KLSAgICAgICAgcmV0dXJuICJkaXNwbGF5X251bWJlciI7DQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyBTdHJpbmcgc3VibWl0UGhvbmVOdW1iZXIoKSB7DQotICAgICAgICByZXR1cm4gImRpc3BsYXlfcGhvbmUiOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBQaG9uZU51bWJlciBnZXRQaG9uZU51bWJlcigpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBwaG9uZU51bWJlcjsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRQaG9uZU51bWJlcihQaG9uZU51bWJlciBwaG9uZU51bWJlcikNCi0gICAgew0KLSAgICAgICAgdGhpcy5waG9uZU51bWJlciA9IHBob25lTnVtYmVyOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWpzZmNvbXBvbmVudHMyMC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9leGFtcGxlcy9zcmMvbWFpbi9sb2c0ai9sb2c0ai5wcm9wZXJ0aWVzIGIvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtanNmY29tcG9uZW50czIwL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL2V4YW1wbGVzL3NyYy9tYWluL2xvZzRqL2xvZzRqLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkZGI3ZjkuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtanNmY29tcG9uZW50czIwL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL2V4YW1wbGVzL3NyYy9tYWluL2xvZzRqL2xvZzRqLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQ0KLSMgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoDQotIyB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuDQotIyBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMA0KLSMgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCi0jIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotIw0KLSMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0jDQotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCi0NCi1sb2c0ai5yb290TG9nZ2VyPUlORk8sIEExLCBBMg0KLWxvZzRqLmFwcGVuZGVyLkExPW9yZy5hcGFjaGUubG9nNGouQ29uc29sZUFwcGVuZGVyDQotbG9nNGouYXBwZW5kZXIuQTEubGF5b3V0PW9yZy5hcGFjaGUubG9nNGouUGF0dGVybkxheW91dA0KLQ0KLSNsb2cgb24gYSBmaWxlIG9uIHRhcmdldCB0b28sIHRvIG1ha2UgZWFzaWVyIGNoZWNrIGl0DQotbG9nNGouYXBwZW5kZXIuQTI9b3JnLmFwYWNoZS5sb2c0ai5Sb2xsaW5nRmlsZUFwcGVuZGVyDQotbG9nNGouYXBwZW5kZXIuQTIuRmlsZT10YXJnZXQvbG9nNGoubG9nDQotbG9nNGouYXBwZW5kZXIuQTIuTWF4RmlsZVNpemU9MTAwMEtCDQotIyBLZWVwIG9uZSBiYWNrdXAgZmlsZQ0KLWxvZzRqLmFwcGVuZGVyLkEyLk1heEJhY2t1cEluZGV4PTENCi1sb2c0ai5hcHBlbmRlci5BMi5sYXlvdXQ9b3JnLmFwYWNoZS5sb2c0ai5QYXR0ZXJuTGF5b3V0DQotbG9nNGouYXBwZW5kZXIuQTIubGF5b3V0LkNvbnZlcnNpb25QYXR0ZXJuPSVwICV0ICVjIC0gJW0lbg0KLQ0KLSMgTG9nIGxldmVsIGZvciBteWZhY2VzIGxpYnJhcmllcw0KLWxvZzRqLmxvZ2dlci5vcmcuYXBhY2hlLmNvbW1vbnM9SU5GTw0KLWxvZzRqLmxvZ2dlci5vcmcuYXBhY2hlLm15ZmFjZXM9VFJBQ0UNCi1sb2c0ai5sb2dnZXIuamF2YXguZmFjZXM9VFJBQ0UNCi0NCi0jIFByaW50IHRoZSBkYXRlIGluIElTTyA4NjAxIGZvcm1hdA0KLWxvZzRqLmFwcGVuZGVyLkExLmxheW91dC5Db252ZXJzaW9uUGF0dGVybj0lNXAgWyV0XSAoJUZcOiVMKSAtICVtJW4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1qc2Zjb21wb25lbnRzMjAvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvZXhhbXBsZXMvc3JjL21haW4vcmVzb3VyY2VzL29yZy9teW9yZ2FuaXphdGlvbi9jb21wb25lbnQvZXhhbXBsZS9idWlsZC5wcm9wZXJ0aWVzIGIvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtanNmY29tcG9uZW50czIwL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL2V4YW1wbGVzL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvbXlvcmdhbml6YXRpb24vY29tcG9uZW50L2V4YW1wbGUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjljYTVlZC4uMDAwMDAwMAotLS0gYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1qc2Zjb21wb25lbnRzMjAvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvZXhhbXBsZXMvc3JjL21haW4vcmVzb3VyY2VzL29yZy9teW9yZ2FuaXphdGlvbi9jb21wb25lbnQvZXhhbXBsZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotIw0KLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0jDQotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0jIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSMNCi0jIERvIG5vdCBlZGl0IHRoaXMgZmlsZSwgYXMgaXQgd2lsbCBiZSBjb21wbGV0ZWQgYXV0b21hdGljYWxseQ0KLSMgYnkgbWF2ZW4gZHVyaW5nIHRoZSBidWlsZCBwcm9jZXNzDQotbXljb21wb25lbnRzX3ZlcnNpb249JHtwb20udmVyc2lvbn0NCi1qc2ZfaW1wbGVtZW50YXRpb249JHtqc2ZfaW1wbGVtZW50YXRpb259ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtanNmY29tcG9uZW50czIwL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL2V4YW1wbGVzL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvbXlvcmdhbml6YXRpb24vY29tcG9uZW50L2V4YW1wbGUvbWVzc2FnZXMucHJvcGVydGllcyBiL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWpzZmNvbXBvbmVudHMyMC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9leGFtcGxlcy9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL215b3JnYW5pemF0aW9uL2NvbXBvbmVudC9leGFtcGxlL21lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiMzUwM2EuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtanNmY29tcG9uZW50czIwL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL2V4YW1wbGVzL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvbXlvcmdhbml6YXRpb24vY29tcG9uZW50L2V4YW1wbGUvbWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLXRpdGxlPU15IEpTRiBDb21wb25lbnQgRXhhbXBsZXMgZm9yIEpTRiAyLjANCi0NCi1kZW1vX2NvbXBvbmVudD1zYXlIZWxsbyAtIGN1c3RvbSBjb21wb25lbnQgZGVtbw0KLWRlbW9fY29udmVydGVyPXBob25lTnVtYmVyQ29udmVydGVyIC0gY3VzdG9tIGNvbnZlcnRlciBkZW1vDQotZGVtb192YWxpZGF0b3I9b2RkTnVtYmVyVmFsaWRhdG9yIC0gY3VzdG9tIHZhbGlkYXRvciBkZW1vDQotZGVtb19jb21wb3NpdGVfY29tcG9uZW50PXNheUhlbGxvQ0MgLSBjdXN0b20gY29tcG9zaXRlIGNvbXBvbmVudCBkZW1vDQotDQotaG9tZT1bSE9NRV0NCi0NCi1waG9uZV9udW1iZXI9RW50ZXIgeW91ciBwaG9uZSBudW1iZXIgKEFyZWEgQ29kZS1OdW1iZXIpDQotDQotc2hvd19hcmVhX2NvZGU9WW91ciBhcmVhIGNvZGUgaXM6DQotc2hvd19udW1iZXI9WW91ciBudW1iZXIgaXM6DQotc2hvd192YWx1ZV9lbnRlcmVkPVZhbHVlIGVudGVyZWQgaXM6IA0KLQ0KLXNheV9oZWxsbz1TYXkgSGVsbG8hDQotaW5wdXRfZmlyc3RfbmFtZT1GaXJzdCBuYW1lDQotaW5wdXRfbGFzdF9uYW1lPUxhc3QgbmFtZQ0KLQ0KLWlucHV0X29kZF9udW1iZXI9RW50ZXIgYW4gb2RkIG51bWJlcg0KLXN1Ym1pdD1TdWJtaXQNCi0NCi1wcm9iYWJseV9ub3RfeW91X2lfa25vdz0ocHJvYmFibHkgbm90IHlvdSwgSSBrbm93KQ0KLQ0KLWhlbGxvPUhlbGxvIA0KZGlmZiAtLWdpdCBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWpzZmNvbXBvbmVudHMyMC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9leGFtcGxlcy9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL215b3JnYW5pemF0aW9uL2NvbXBvbmVudC9leGFtcGxlL21lc3NhZ2VzX2VuLnByb3BlcnRpZXMgYi9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1qc2Zjb21wb25lbnRzMjAvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvZXhhbXBsZXMvc3JjL21haW4vcmVzb3VyY2VzL29yZy9teW9yZ2FuaXphdGlvbi9jb21wb25lbnQvZXhhbXBsZS9tZXNzYWdlc19lbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjlkZTI5Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWpzZmNvbXBvbmVudHMyMC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9leGFtcGxlcy9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL215b3JnYW5pemF0aW9uL2NvbXBvbmVudC9leGFtcGxlL21lc3NhZ2VzX2VuLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApkaWZmIC0tZ2l0IGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtanNmY29tcG9uZW50czIwL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL2V4YW1wbGVzL3NyYy9tYWluL3dlYmFwcC9NRVRBLUlORi90ZW1wbGF0ZXMvZXhhbXBsZS54aHRtbCBiL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWpzZmNvbXBvbmVudHMyMC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9leGFtcGxlcy9zcmMvbWFpbi93ZWJhcHAvTUVUQS1JTkYvdGVtcGxhdGVzL2V4YW1wbGUueGh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjZmY5YzYuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtanNmY29tcG9uZW50czIwL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL2V4YW1wbGVzL3NyYy9tYWluL3dlYmFwcC9NRVRBLUlORi90ZW1wbGF0ZXMvZXhhbXBsZS54aHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiA/Pg0KLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4NCi08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCINCi0gICAgeG1sbnM6dWk9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2ZhY2VsZXRzIg0KLSAgICB4bWxuczpmPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9jb3JlIg0KLSAgICB4bWxuczpoPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9odG1sIg0KLSAgICB4bWxuczpjPSJodHRwOi8vamF2YS5zdW4uY29tL2pzcC9qc3RsL2NvcmUiPg0KLTwhLS0NCi0gICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gICAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gICAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICAgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gICAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi0gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gICAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gICAgdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotPGg6aGVhZD4NCi0gICAgPHRpdGxlPjxoOm91dHB1dFRleHQgdmFsdWU9IiN7bXNnc1sndGl0bGUnXX0iLz48L3RpdGxlPg0KLTwvaDpoZWFkPg0KLTxoOmJvZHk+DQotICA8aDpvdXRwdXRTdHlsZXNoZWV0IG5hbWU9InN0eWxlLmNzcyIgbGlicmFyeT0iY3NzIi8+DQotICA8ZGl2IGlkPSJjb250YWluZXIiPg0KLQ0KLSAgICA8dWk6aW5zZXJ0IG5hbWU9ImhlYWRlciI+DQotICAgICAgICA8aDE+PGg6b3V0cHV0VGV4dCB2YWx1ZT0iI3ttc2dzWyd0aXRsZSddfSIvPjwvaDE+ICAgIA0KLSAgICA8L3VpOmluc2VydD4NCi0NCi0gICAgPHVpOmluc2VydCBuYW1lPSJjb250ZW50Ii8+DQotICAgIA0KLSAgICA8dWk6aW5zZXJ0IG5hbWU9ImZvb3RlciI+DQotICAgICAgICA8aDpwYW5lbEdyaWQ+DQotICAgICAgICAgICAgPGg6bGluayB2YWx1ZT0iI3ttc2dzWydob21lJ119IiBvdXRjb21lPSJob21lIi8+DQotICAgICAgICA8L2g6cGFuZWxHcmlkPg0KLSAgICA8L3VpOmluc2VydD4NCi0gIDwvZGl2Pg0KLTwvaDpib2R5Pg0KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1qc2Zjb21wb25lbnRzMjAvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvZXhhbXBsZXMvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvZXhhbXBsZXMtY29uZmlnLnhtbCBiL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWpzZmNvbXBvbmVudHMyMC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9leGFtcGxlcy9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9leGFtcGxlcy1jb25maWcueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZTY2ZGM4Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWpzZmNvbXBvbmVudHMyMC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9leGFtcGxlcy9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9leGFtcGxlcy1jb25maWcueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+DQotPCEtLQ0KLSAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICAgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICAgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gICAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICAgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICAgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gICAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgICB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi08IURPQ1RZUEUgZmFjZXMtY29uZmlnIFBVQkxJQw0KLSAgIi0vL1N1biBNaWNyb3N5c3RlbXMsIEluYy4vL0RURCBKYXZhU2VydmVyIEZhY2VzIENvbmZpZyAxLjAvL0VOIg0KLSAgImh0dHA6Ly9qYXZhLnN1bi5jb20vZHRkL3dlYi1mYWNlc2NvbmZpZ18xXzAuZHRkIj4NCi0NCi08IS0tID09PT09PT09PT09IEZVTEwgQ09ORklHVVJBVElPTiBGSUxFID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+DQotDQotPCEtLSBteSBjb21wb25lbnRzIGV4YW1wbGVzIC0tPg0KLQ0KLTxmYWNlcy1jb25maWc+DQotDQotDQotICAgIDwhLS0gTWFuYWdlZCBCZWFucyBmb3Igc2F5aGVsbG8ueGh0bWwgLS0+DQotICAgIDxtYW5hZ2VkLWJlYW4+DQotICAgICAgICA8bWFuYWdlZC1iZWFuLW5hbWU+c2F5SGVsbG9CZWFuPC9tYW5hZ2VkLWJlYW4tbmFtZT4NCi0gICAgICAgIDxtYW5hZ2VkLWJlYW4tY2xhc3M+b3JnLm15b3JnYW5pemF0aW9uLmNvbXBvbmVudC5leGFtcGxlLlNheUhlbGxvQmVhbjwvbWFuYWdlZC1iZWFuLWNsYXNzPg0KLSAgICAgICAgPG1hbmFnZWQtYmVhbi1zY29wZT5yZXF1ZXN0PC9tYW5hZ2VkLWJlYW4tc2NvcGU+DQotICAgIDwvbWFuYWdlZC1iZWFuPg0KLQ0KLSAgICA8IS0tIE5BVklHQVRJT04gUlVMRVMgLS0+DQotDQotICAgIDxuYXZpZ2F0aW9uLXJ1bGU+DQotICAgICAgICA8bmF2aWdhdGlvbi1jYXNlPg0KLSAgICAgICAgICAgIDxmcm9tLW91dGNvbWU+Z29faG9tZTwvZnJvbS1vdXRjb21lPg0KLSAgICAgICAgICAgIDx0by12aWV3LWlkPi9ob21lLnhodG1sPC90by12aWV3LWlkPg0KLSAgICAgICAgPC9uYXZpZ2F0aW9uLWNhc2U+DQotICAgIDwvbmF2aWdhdGlvbi1ydWxlPg0KLQ0KLSAgICA8bmF2aWdhdGlvbi1ydWxlPg0KLSAgICAgICAgPGZyb20tdmlldy1pZD4vdmFsaWRhdG9yRGVtby54aHRtbDwvZnJvbS12aWV3LWlkPg0KLSAgICAgICAgPG5hdmlnYXRpb24tY2FzZT4NCi0gICAgICAgICAgICA8ZnJvbS1vdXRjb21lPmRpc3BsYXlfbnVtYmVyPC9mcm9tLW91dGNvbWU+DQotICAgICAgICAgICAgPHRvLXZpZXctaWQ+L3ZhbGlkYXRvckRlbW9SZXN1bHQueGh0bWw8L3RvLXZpZXctaWQ+DQotICAgICAgICA8L25hdmlnYXRpb24tY2FzZT4NCi0gICAgPC9uYXZpZ2F0aW9uLXJ1bGU+DQotICAgIA0KLSAgICA8bmF2aWdhdGlvbi1ydWxlPg0KLSAgICAgICAgPGZyb20tdmlldy1pZD4vY29udmVydGVyRGVtby54aHRtbDwvZnJvbS12aWV3LWlkPg0KLSAgICAgICAgPG5hdmlnYXRpb24tY2FzZT4NCi0gICAgICAgICAgICA8ZnJvbS1vdXRjb21lPmRpc3BsYXlfcGhvbmU8L2Zyb20tb3V0Y29tZT4NCi0gICAgICAgICAgICA8dG8tdmlldy1pZD4vY29udmVydGVyRGVtb1Jlc3VsdC54aHRtbDwvdG8tdmlldy1pZD4NCi0gICAgICAgIDwvbmF2aWdhdGlvbi1jYXNlPg0KLSAgICA8L25hdmlnYXRpb24tcnVsZT4NCi0NCi08L2ZhY2VzLWNvbmZpZz4NCmRpZmYgLS1naXQgYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1qc2Zjb21wb25lbnRzMjAvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvZXhhbXBsZXMvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvZmFjZXMtY29uZmlnLnhtbCBiL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWpzZmNvbXBvbmVudHMyMC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9leGFtcGxlcy9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9mYWNlcy1jb25maWcueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODkxYTcwLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWpzZmNvbXBvbmVudHMyMC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9leGFtcGxlcy9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9mYWNlcy1jb25maWcueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLSAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gICAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gICAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gICAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICAgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICAgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICAgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgICB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPGZhY2VzLWNvbmZpZwotICAgIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiCi0gICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvd2ViLWZhY2VzY29uZmlnXzJfMC54c2QiCi0gICAgdmVyc2lvbj0iMi4wIj4KLQotICAgIDxhcHBsaWNhdGlvbj4KLSAgICAgICAgPGxvY2FsZS1jb25maWc+Ci0gICAgICAgICAgICA8ZGVmYXVsdC1sb2NhbGU+ZW48L2RlZmF1bHQtbG9jYWxlPgotICAgICAgICAgICAgPHN1cHBvcnRlZC1sb2NhbGU+ZW48L3N1cHBvcnRlZC1sb2NhbGU+Ci0gICAgICAgIDwvbG9jYWxlLWNvbmZpZz4KLSAgICAgICAgPHJlc291cmNlLWJ1bmRsZT4KLSAgICAgICAgICAgIDxiYXNlLW5hbWU+b3JnLm15b3JnYW5pemF0aW9uLmNvbXBvbmVudC5leGFtcGxlLm1lc3NhZ2VzPC9iYXNlLW5hbWU+Ci0gICAgICAgICAgICA8dmFyPm1zZ3M8L3Zhcj4KLSAgICAgICAgPC9yZXNvdXJjZS1idW5kbGU+Ci0gICAgPC9hcHBsaWNhdGlvbj4KLQotPC9mYWNlcy1jb25maWc+CmRpZmYgLS1naXQgYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1qc2Zjb21wb25lbnRzMjAvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvZXhhbXBsZXMvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbCBiL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWpzZmNvbXBvbmVudHMyMC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9leGFtcGxlcy9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYWM0ZTk2Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWpzZmNvbXBvbmVudHMyMC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9leGFtcGxlcy9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08IS0tDQotICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gICAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICAgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICAgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gICAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICAgIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gICAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gICAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICAgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICAgIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLTx3ZWItYXBwIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlIiB4bWxuczpqYXZhZWU9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIgeG1sbnM6d2ViPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvd2ViLWFwcF8yXzUueHNkIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZS93ZWItYXBwXzJfNS54c2QiIHZlcnNpb249IjIuNSI+DQotICA8ZGVzY3JpcHRpb24+ZGVidWcgd2ViLnhtbDwvZGVzY3JpcHRpb24+DQotICA8Y29udGV4dC1wYXJhbT4NCi0gICAgPGRlc2NyaXB0aW9uPkNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIFVSSXMgb2YgKGFkZGl0aW9uYWwpIGZhY2VzIGNvbmZpZyBmaWxlcy4NCi0gICAgICAgICAgICAoZS5nLiAvV0VCLUlORi9teS1jb25maWcueG1sKQ0KLSAgICAgICAgICAgIFNlZSBKU0YgMS4wIFBSRDIsIDEwLjMuMg0KLSAgICAgICAgICAgIEF0dGVudGlvbjogWW91IGRvIG5vdCBuZWVkIHRvIHB1dCAvV0VCLUlORi9mYWNlcy1jb25maWcueG1sIGluIGhlcmUuDQotICAgIDwvZGVzY3JpcHRpb24+DQotICAgIDxwYXJhbS1uYW1lPmphdmF4LmZhY2VzLkNPTkZJR19GSUxFUzwvcGFyYW0tbmFtZT4NCi0gICAgPHBhcmFtLXZhbHVlPi9XRUItSU5GL2V4YW1wbGVzLWNvbmZpZy54bWw8L3BhcmFtLXZhbHVlPg0KLSAgPC9jb250ZXh0LXBhcmFtPg0KLSAgPGNvbnRleHQtcGFyYW0+DQotICAgIDxkZXNjcmlwdGlvbj5TdGF0ZSBzYXZpbmcgbWV0aG9kOiAmcXVvdDtjbGllbnQmcXVvdDsgb3IgJnF1b3Q7c2VydmVyJnF1b3Q7ICg9IGRlZmF1bHQpDQotICAgICAgICAgICAgU2VlIEpTRiBTcGVjaWZpY2F0aW9uIDIuNS4zPC9kZXNjcmlwdGlvbj4NCi0gICAgPHBhcmFtLW5hbWU+amF2YXguZmFjZXMuU1RBVEVfU0FWSU5HX01FVEhPRDwvcGFyYW0tbmFtZT4NCi0gICAgPHBhcmFtLXZhbHVlPnNlcnZlcjwvcGFyYW0tdmFsdWU+DQotICA8L2NvbnRleHQtcGFyYW0+DQotICA8Y29udGV4dC1wYXJhbT4NCi0gICAgPHBhcmFtLW5hbWU+amF2YXguZmFjZXMuUFJPSkVDVF9TVEFHRTwvcGFyYW0tbmFtZT4NCi0gICAgPHBhcmFtLXZhbHVlPkRldmVsb3BtZW50PC9wYXJhbS12YWx1ZT4NCi0gIDwvY29udGV4dC1wYXJhbT4NCi0gIDxzZXJ2bGV0Pg0KLSAgICA8c2VydmxldC1uYW1lPkZhY2VzIFNlcnZsZXQ8L3NlcnZsZXQtbmFtZT4NCi0gICAgPHNlcnZsZXQtY2xhc3M+amF2YXguZmFjZXMud2ViYXBwLkZhY2VzU2VydmxldDwvc2VydmxldC1jbGFzcz4NCi0gICAgPGxvYWQtb24tc3RhcnR1cD4xPC9sb2FkLW9uLXN0YXJ0dXA+DQotICA8L3NlcnZsZXQ+DQotICA8c2VydmxldC1tYXBwaW5nPg0KLSAgICA8c2VydmxldC1uYW1lPkZhY2VzIFNlcnZsZXQ8L3NlcnZsZXQtbmFtZT4NCi0gICAgPHVybC1wYXR0ZXJuPiouanNmPC91cmwtcGF0dGVybj4NCi0gIDwvc2VydmxldC1tYXBwaW5nPg0KLSAgPHdlbGNvbWUtZmlsZS1saXN0Pg0KLSAgICA8d2VsY29tZS1maWxlPmluZGV4Lmh0bWw8L3dlbGNvbWUtZmlsZT4NCi0gIDwvd2VsY29tZS1maWxlLWxpc3Q+DQotPC93ZWItYXBwPg0KZGlmZiAtLWdpdCBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWpzZmNvbXBvbmVudHMyMC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9leGFtcGxlcy9zcmMvbWFpbi93ZWJhcHAvY29udmVydGVyRGVtby54aHRtbCBiL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWpzZmNvbXBvbmVudHMyMC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9leGFtcGxlcy9zcmMvbWFpbi93ZWJhcHAvY29udmVydGVyRGVtby54aHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTZlNTRhNi4uMDAwMDAwMAotLS0gYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1qc2Zjb21wb25lbnRzMjAvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvZXhhbXBsZXMvc3JjL21haW4vd2ViYXBwL2NvbnZlcnRlckRlbW8ueGh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgPz4NCi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+DQotPGh0bWwgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIg0KLSAgICB4bWxuczp1aT0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvZmFjZWxldHMiDQotICAgIHhtbG5zOmY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2NvcmUiDQotICAgIHhtbG5zOmg9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2h0bWwiDQotICAgIHhtbG5zOmM9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNwL2pzdGwvY29yZSINCi0gICAgeG1sbnM6bXljb21wPSJodHRwOi8vd3d3Lm15b3JnYW5pdHphdGlvbi5vcmcvbXljb21wb25lbnRzIj4NCi08IS0tDQotICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gICAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICAgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICAgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gICAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICAgIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gICAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gICAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICAgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICAgIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLTxoZWFkPg0KLTwvaGVhZD4NCi08Ym9keT4NCi08dWk6ZGVjb3JhdGUgdGVtcGxhdGU9Ii9NRVRBLUlORi90ZW1wbGF0ZXMvZXhhbXBsZS54aHRtbCI+DQotICA8dWk6ZGVmaW5lIG5hbWU9ImhlYWRlciI+DQotICAgICAgPGgxPjxoOm91dHB1dFRleHQgdmFsdWU9IiN7bXNnc1sndGl0bGUnXX0iLz48L2gxPg0KLSAgICAgIDxoMj48aDpvdXRwdXRUZXh0IHZhbHVlPSIje21zZ3NbJ2RlbW9fY29udmVydGVyJ119Ii8+PC9oMj4gICAgDQotICA8L3VpOmRlZmluZT4NCi0gIDx1aTpkZWZpbmUgbmFtZT0iY29udGVudCI+DQotICANCi0gICAgPGg6Zm9ybT4NCi0gICAgICAgIDxoOnBhbmVsR3JpZCBjb2x1bW5zPSIyIj4NCi0gICAgICAgICAgICA8aDpvdXRwdXRMYWJlbCBmb3I9Im51bSIgdmFsdWU9IiN7bXNnc1sncGhvbmVfbnVtYmVyJ119IiAvPg0KLSAgICAgICAgICAgIDxoOmlucHV0VGV4dCBpZD0ibnVtIiB2YWx1ZT0iI3tzYXlIZWxsb0JlYW4ucGhvbmVOdW1iZXJ9Ij4NCi0gICAgICAgICAgICAgICAgPG15Y29tcDpwaG9uZU51bWJlckNvbnZlcnRlci8+DQotICAgICAgICAgICAgPC9oOmlucHV0VGV4dD4NCi0gICAgICAgICAgICA8aDpjb21tYW5kQnV0dG9uIHZhbHVlPSIje21zZ3NbJ3N1Ym1pdCddfSIgYWN0aW9uPSIje3NheUhlbGxvQmVhbi5zdWJtaXRQaG9uZU51bWJlcn0iLz4NCi0gICAgICAgIDwvaDpwYW5lbEdyaWQ+DQotICAgICAgICA8aDptZXNzYWdlcyAvPg0KLSAgICA8L2g6Zm9ybT4NCi0gIDwvdWk6ZGVmaW5lPg0KLTwvdWk6ZGVjb3JhdGU+DQotPC9ib2R5Pg0KLTwvaHRtbD4NCmRpZmYgLS1naXQgYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1qc2Zjb21wb25lbnRzMjAvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvZXhhbXBsZXMvc3JjL21haW4vd2ViYXBwL2NvbnZlcnRlckRlbW9SZXN1bHQueGh0bWwgYi9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1qc2Zjb21wb25lbnRzMjAvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvZXhhbXBsZXMvc3JjL21haW4vd2ViYXBwL2NvbnZlcnRlckRlbW9SZXN1bHQueGh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwMDQyOTguLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtanNmY29tcG9uZW50czIwL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL2V4YW1wbGVzL3NyYy9tYWluL3dlYmFwcC9jb252ZXJ0ZXJEZW1vUmVzdWx0LnhodG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiID8+DQotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPg0KLTxodG1sICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCINCi0gICAgeG1sbnM6dWk9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2ZhY2VsZXRzIg0KLSAgICB4bWxuczpmPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9jb3JlIg0KLSAgICB4bWxuczpoPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9odG1sIg0KLSAgICB4bWxuczpjPSJodHRwOi8vamF2YS5zdW4uY29tL2pzcC9qc3RsL2NvcmUiDQotICAgIHhtbG5zOm15Y29tcD0iaHR0cDovL3d3dy5teW9yZ2FuaXR6YXRpb24ub3JnL215Y29tcG9uZW50cyI+DQotPCEtLQ0KLSAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICAgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICAgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gICAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICAgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICAgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gICAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgICB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi08aGVhZD4NCi08L2hlYWQ+DQotPGJvZHk+DQotPHVpOmRlY29yYXRlIHRlbXBsYXRlPSIvTUVUQS1JTkYvdGVtcGxhdGVzL2V4YW1wbGUueGh0bWwiPg0KLSAgPHVpOmRlZmluZSBuYW1lPSJoZWFkZXIiPg0KLSAgICAgIDxoMT48aDpvdXRwdXRUZXh0IHZhbHVlPSIje21zZ3NbJ3RpdGxlJ119Ii8+PC9oMT4NCi0gICAgICA8aDI+PGg6b3V0cHV0VGV4dCB2YWx1ZT0iI3ttc2dzWydkZW1vX2NvbnZlcnRlciddfSIvPjwvaDI+ICAgIA0KLSAgPC91aTpkZWZpbmU+DQotICA8dWk6ZGVmaW5lIG5hbWU9ImNvbnRlbnQiPg0KLSAgDQotICAgIDxoOmZvcm0+DQotICAgICAgICA8aDpwYW5lbEdyaWQgY29sdW1ucz0iMiI+DQotICAgICAgICAgICAgPGg6b3V0cHV0TGFiZWwgZm9yPSJhcmVhQ29kZSIgdmFsdWU9IiN7bXNnc1snc2hvd19hcmVhX2NvZGUnXX0iLz4gDQotICAgICAgICAgICAgPGg6b3V0cHV0VGV4dCBpZD0iYXJlYUNvZGUiIHZhbHVlPSIje3NheUhlbGxvQmVhbi5waG9uZU51bWJlci5hcmVhQ29kZX0iLz4NCi0gICAgICAgICAgICA8aDpvdXRwdXRMYWJlbCBmb3I9Im51bSIgdmFsdWU9IiN7bXNnc1snc2hvd19udW1iZXInXX0iLz4gDQotICAgICAgICAgICAgPGg6b3V0cHV0VGV4dCBpZD0ibnVtIiB2YWx1ZT0iI3tzYXlIZWxsb0JlYW4ucGhvbmVOdW1iZXIubnVtYmVyfSIvPg0KLSAgICAgICAgPC9oOnBhbmVsR3JpZD4NCi0gICAgPC9oOmZvcm0+DQotDQotICA8L3VpOmRlZmluZT4NCi08L3VpOmRlY29yYXRlPg0KLTwvYm9keT4NCi08L2h0bWw+DQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtanNmY29tcG9uZW50czIwL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL2V4YW1wbGVzL3NyYy9tYWluL3dlYmFwcC9ob21lLnhodG1sIGIvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtanNmY29tcG9uZW50czIwL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL2V4YW1wbGVzL3NyYy9tYWluL3dlYmFwcC9ob21lLnhodG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNWQ3MzQzLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWpzZmNvbXBvbmVudHMyMC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9leGFtcGxlcy9zcmMvbWFpbi93ZWJhcHAvaG9tZS54aHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiA/Pg0KLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4NCi08aHRtbCAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiDQotICAgIHhtbG5zOnVpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9mYWNlbGV0cyINCi0gICAgeG1sbnM6Zj0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvY29yZSINCi0gICAgeG1sbnM6aD0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvaHRtbCINCi0gICAgeG1sbnM6Yz0iaHR0cDovL2phdmEuc3VuLmNvbS9qc3AvanN0bC9jb3JlIg0KLSAgICB4bWxuczpteWNvbXA9Imh0dHA6Ly93d3cubXlvcmdhbml0emF0aW9uLm9yZy9teWNvbXBvbmVudHMiPg0KLTwhLS0NCi0gICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gICAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gICAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICAgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gICAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi0gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gICAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gICAgdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotPGg6aGVhZD4NCi0gICAgPHRpdGxlPjxoOm91dHB1dFRleHQgdmFsdWU9IiN7bXNnc1sndGl0bGUnXX0iLz48L3RpdGxlPg0KLTwvaDpoZWFkPg0KLTxoOmJvZHk+DQotICA8aDpvdXRwdXRTdHlsZXNoZWV0IG5hbWU9InN0eWxlLmNzcyIgbGlicmFyeT0iY3NzIi8+DQotICA8ZGl2IGlkPSJjb250YWluZXIiPg0KLSAgDQotICAgIDxoOmZvcm0+DQotDQotICAgICAgICA8Zjpsb2FkQnVuZGxlIGJhc2VuYW1lPSJvcmcubXlvcmdhbml6YXRpb24uY29tcG9uZW50LmV4YW1wbGUuYnVpbGQiIHZhcj0iYnVpbGRJbmZvIi8+DQotDQotICAgICAgICA8aDE+PGg6b3V0cHV0VGV4dCB2YWx1ZT0iI3ttc2dzWyd0aXRsZSddfSIvPjwvaDE+DQotICAgICAgICA8aDpwYW5lbEdyaWQgY29sdW1ucz0iMSI+DQotICAgICAgICAgICAgPGg6b3V0cHV0VGV4dCB2YWx1ZT0iIChWZXJzaW9uICN7YnVpbGRJbmZvWydteWNvbXBvbmVudHNfdmVyc2lvbiddfSwgdXNpbmcgI3tidWlsZEluZm8gWydqc2ZfaW1wbGVtZW50YXRpb24nXX0pIi8+DQotICAgICAgICA8L2g6cGFuZWxHcmlkPg0KLQ0KLSAgICAgICAgPGg6cGFuZWxHcmlkPg0KLQ0KLSAgICAgICAgICAgIDxoOnBhbmVsR3JpZCBzdHlsZT0icGFkZGluZy1sZWZ0OjI1cHgiPg0KLSAgICAgICAgICAgICAgICA8aDpvdXRwdXRMaW5rIHZhbHVlPSJzYXloZWxsby5qc2YiPnNheUhlbGxvIC0gZGVtbyBjb21wb25lbnQ8L2g6b3V0cHV0TGluaz4NCi0gICAgICAgICAgICAgICAgPGg6b3V0cHV0TGluayB2YWx1ZT0ic2F5aGVsbG9jYy5qc2YiPnNheUhlbGxvQ0MgLSBkZW1vIGNvbXBvc2l0ZSBjb21wb25lbnQ8L2g6b3V0cHV0TGluaz4NCi0gICAgICAgICAgICAgICAgPGg6b3V0cHV0TGluayB2YWx1ZT0idmFsaWRhdG9yRGVtby5qc2YiPm9kZE51bWJlclZhbGlkYXRvciAtIGRlbW8gdmFsaWRhdG9yPC9oOm91dHB1dExpbms+DQotICAgICAgICAgICAgICAgIDxoOm91dHB1dExpbmsgdmFsdWU9ImNvbnZlcnRlckRlbW8uanNmIj5waG9uZU51bWJlckNvbnZlcnRlciAtIGRlbW8gY29udmVydGVyPC9oOm91dHB1dExpbms+DQotICAgICAgICAgICAgPC9oOnBhbmVsR3JpZD4NCi0NCi0gICAgICAgIDwvaDpwYW5lbEdyaWQ+DQotDQotICAgIDwvaDpmb3JtPg0KLQ0KLSAgPC9kaXY+DQotPC9oOmJvZHk+DQotPC9odG1sPg0KZGlmZiAtLWdpdCBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWpzZmNvbXBvbmVudHMyMC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9leGFtcGxlcy9zcmMvbWFpbi93ZWJhcHAvaW5kZXguaHRtbCBiL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWpzZmNvbXBvbmVudHMyMC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9leGFtcGxlcy9zcmMvbWFpbi93ZWJhcHAvaW5kZXguaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOThlODVmZC4uMDAwMDAwMAotLS0gYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1qc2Zjb21wb25lbnRzMjAvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvZXhhbXBsZXMvc3JjL21haW4vd2ViYXBwL2luZGV4Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPg0KLTxoZWFkPg0KLSAgICA8bWV0YSBodHRwLWVxdWl2PSJyZWZyZXNoIiBjb250ZW50PSIwOyBVUkw9aG9tZS5qc2YiLz4NCi08L2hlYWQ+DQotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWpzZmNvbXBvbmVudHMyMC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9leGFtcGxlcy9zcmMvbWFpbi93ZWJhcHAvcmVzb3VyY2VzL2Nzcy9zdHlsZS5jc3MgYi9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1qc2Zjb21wb25lbnRzMjAvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvZXhhbXBsZXMvc3JjL21haW4vd2ViYXBwL3Jlc291cmNlcy9jc3Mvc3R5bGUuY3NzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZDFlYzA5Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWpzZmNvbXBvbmVudHMyMC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9leGFtcGxlcy9zcmMvbWFpbi93ZWJhcHAvcmVzb3VyY2VzL2Nzcy9zdHlsZS5jc3MKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1ib2R5IHsKLSAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMCwgMzUsIDc1KTsKLSAgICBmb250LWZhbWlseTogdGFob21hLCBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotICAgIGZvbnQtc2l6ZTogMTJweDsKLX0KLQotI2NvbnRhaW5lciB7Ci0gICAgbWFyZ2luOiAxMHB4IGF1dG87Ci0gICAgd2lkdGg6IDkwMHB4OwotICAgIGJhY2tncm91bmQtY29sb3I6IHdoaXRlOwotICAgIHBhZGRpbmc6IDNweDsKLX0KLQotaDEgewotICAgIGZvbnQtc2l6ZTogMjBweDsKLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWpzZmNvbXBvbmVudHMyMC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9leGFtcGxlcy9zcmMvbWFpbi93ZWJhcHAvcmVzb3VyY2VzL3Rlc3RjYy9zYXlIZWxsb0NDLnhodG1sIGIvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtanNmY29tcG9uZW50czIwL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL2V4YW1wbGVzL3NyYy9tYWluL3dlYmFwcC9yZXNvdXJjZXMvdGVzdGNjL3NheUhlbGxvQ0MueGh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiY2QzZjEuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtanNmY29tcG9uZW50czIwL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL2V4YW1wbGVzL3NyYy9tYWluL3dlYmFwcC9yZXNvdXJjZXMvdGVzdGNjL3NheUhlbGxvQ0MueGh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgPz4NCi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+DQotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiDQotICAgICAgeG1sbnM6dWk9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2ZhY2VsZXRzIg0KLSAgICAgIHhtbG5zOmY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2NvcmUiDQotICAgICAgeG1sbnM6aD0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvaHRtbCINCi0gICAgICB4bWxuczpjPSJodHRwOi8vamF2YS5zdW4uY29tL2pzcC9qc3RsL2NvcmUiDQotICAgICAgeG1sbnM6Y2M9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2NvbXBvc2l0ZSI+DQotPGhlYWQ+DQotPC9oZWFkPg0KLTxib2R5Pg0KLTxjYzppbnRlcmZhY2U+DQotICAgIDxjYzphdHRyaWJ1dGUgbmFtZT0iZmlyc3ROYW1lIiBzaG9ydERlc2NyaXB0aW9uPSJVc2VyJ3MgZmlyc3QgbmFtZS4iLz4NCi0gICAgPGNjOmF0dHJpYnV0ZSBuYW1lPSJsYXN0TmFtZSIgc2hvcnREZXNjcmlwdGlvbj0iVXNlcidzIGxhc3QgbmFtZS4iIC8+DQotICAgIDxjYzphdHRyaWJ1dGUgbmFtZT0icmVuZGVyZWQiIC8+DQotPC9jYzppbnRlcmZhY2U+DQotPGNjOmltcGxlbWVudGF0aW9uPjxoOm91dHB1dFRleHQgdmFsdWU9IiN7bXNnc1snaGVsbG8nXX0iLz4gPGg6b3V0cHV0VGV4dCB2YWx1ZT0iICN7Y2MuYXR0cnMuZmlyc3ROYW1lfSIvPiA8aDpvdXRwdXRUZXh0IHZhbHVlPSIgI3tjYy5hdHRycy5sYXN0TmFtZX0iLz48L2NjOmltcGxlbWVudGF0aW9uPg0KLTwvYm9keT4NCi08L2h0bWw+DQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtanNmY29tcG9uZW50czIwL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL2V4YW1wbGVzL3NyYy9tYWluL3dlYmFwcC9zYXloZWxsby54aHRtbCBiL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWpzZmNvbXBvbmVudHMyMC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9leGFtcGxlcy9zcmMvbWFpbi93ZWJhcHAvc2F5aGVsbG8ueGh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliMzc5YzAuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtanNmY29tcG9uZW50czIwL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL2V4YW1wbGVzL3NyYy9tYWluL3dlYmFwcC9zYXloZWxsby54aHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiA/Pg0KLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4NCi08aHRtbCAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiDQotICAgIHhtbG5zOnVpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9mYWNlbGV0cyINCi0gICAgeG1sbnM6Zj0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvY29yZSINCi0gICAgeG1sbnM6aD0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvaHRtbCINCi0gICAgeG1sbnM6Yz0iaHR0cDovL2phdmEuc3VuLmNvbS9qc3AvanN0bC9jb3JlIg0KLSAgICB4bWxuczpteWNvbXA9Imh0dHA6Ly93d3cubXlvcmdhbml0emF0aW9uLm9yZy9teWNvbXBvbmVudHMiPg0KLTwhLS0NCi0gICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gICAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gICAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICAgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gICAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi0gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gICAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gICAgdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotPGhlYWQ+DQotPC9oZWFkPg0KLTxib2R5Pg0KLTx1aTpkZWNvcmF0ZSB0ZW1wbGF0ZT0iL01FVEEtSU5GL3RlbXBsYXRlcy9leGFtcGxlLnhodG1sIj4NCi0gIDx1aTpkZWZpbmUgbmFtZT0iaGVhZGVyIj4NCi0gICAgICA8aDE+PGg6b3V0cHV0VGV4dCB2YWx1ZT0iI3ttc2dzWyd0aXRsZSddfSIvPjwvaDE+DQotICAgICAgPGgyPjxoOm91dHB1dFRleHQgdmFsdWU9IiN7bXNnc1snZGVtb19jb21wb25lbnQnXX0iLz48L2gyPiAgICANCi0gIDwvdWk6ZGVmaW5lPg0KLSAgPHVpOmRlZmluZSBuYW1lPSJjb250ZW50Ij4NCi0gIA0KLSAgICA8bXljb21wOnNheUhlbGxvIGZpcnN0TmFtZT0iSm9obiIgbGFzdE5hbWU9IlNtaXRoIi8+DQotDQotICAgIDxoOm91dHB1dFRleHQgdmFsdWU9IiN7bXNnc1sncHJvYmFibHlfbm90X3lvdV9pX2tub3cnXX0iLz4NCi0NCi0gICAgPGhyLz4NCi0NCi0gICAgPGg6Zm9ybT4NCi0gICAgICAgIDxoOnBhbmVsR3JpZCBjb2x1bW5zPSIyIj4NCi0gICAgICAgICAgICA8aDpvdXRwdXRMYWJlbCBmb3I9ImlucHV0Rmlyc3ROYW1lIiB2YWx1ZT0iI3ttc2dzWydpbnB1dF9maXJzdF9uYW1lJ119IiAvPg0KLSAgICAgICAgICAgIDxoOmlucHV0VGV4dCBpZD0iaW5wdXRGaXJzdE5hbWUiIHZhbHVlPSIje3NheUhlbGxvQmVhbi5maXJzdE5hbWV9Ii8+DQotDQotICAgICAgICAgICAgPGg6b3V0cHV0TGFiZWwgZm9yPSJpbnB1dExhc3ROYW1lIiB2YWx1ZT0iI3ttc2dzWydpbnB1dF9sYXN0X25hbWUnXX0iIC8+DQotICAgICAgICAgICAgPGg6aW5wdXRUZXh0IGlkPSJpbnB1dExhc3ROYW1lIiB2YWx1ZT0iI3tzYXlIZWxsb0JlYW4ubGFzdE5hbWV9Ii8+DQotICAgICAgICA8L2g6cGFuZWxHcmlkPg0KLQ0KLSAgICAgICAgPGg6cGFuZWxHcmlkIGNvbHVtbnM9IjEiPg0KLQ0KLSAgICAgICAgICAgIDxoOmNvbW1hbmRCdXR0b24gdmFsdWU9IiN7bXNnc1snc2F5X2hlbGxvJ119IiBhY3Rpb25MaXN0ZW5lcj0iI3tzYXlIZWxsb0JlYW4uc2F5SXR9Ii8+DQotDQotICAgICAgICAgICAgPG15Y29tcDpzYXlIZWxsbyBmaXJzdE5hbWU9IiN7c2F5SGVsbG9CZWFuLmZpcnN0TmFtZX0iDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0TmFtZT0iI3tzYXlIZWxsb0JlYW4ubGFzdE5hbWV9Ig0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVuZGVyZWQ9IiN7c2F5SGVsbG9CZWFuLnJlbmRlckdyZWV0aW5nfSIvPg0KLQ0KLSAgICAgICAgPC9oOnBhbmVsR3JpZD4NCi0NCi0gICAgPC9oOmZvcm0+DQotDQotDQotICA8L3VpOmRlZmluZT4NCi08L3VpOmRlY29yYXRlPg0KLTwvYm9keT4NCi08L2h0bWw+DQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtanNmY29tcG9uZW50czIwL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL2V4YW1wbGVzL3NyYy9tYWluL3dlYmFwcC9zYXloZWxsb2NjLnhodG1sIGIvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtanNmY29tcG9uZW50czIwL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL2V4YW1wbGVzL3NyYy9tYWluL3dlYmFwcC9zYXloZWxsb2NjLnhodG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNDllZWVhLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWpzZmNvbXBvbmVudHMyMC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9leGFtcGxlcy9zcmMvbWFpbi93ZWJhcHAvc2F5aGVsbG9jYy54aHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiA/Pg0KLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4NCi08aHRtbCAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiDQotICAgIHhtbG5zOnVpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9mYWNlbGV0cyINCi0gICAgeG1sbnM6Zj0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvY29yZSINCi0gICAgeG1sbnM6aD0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvaHRtbCINCi0gICAgeG1sbnM6Yz0iaHR0cDovL2phdmEuc3VuLmNvbS9qc3AvanN0bC9jb3JlIg0KLSAgICB4bWxuczp0ZXN0Y2M9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2NvbXBvc2l0ZS90ZXN0Y2MiPg0KLTwhLS0NCi0gICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gICAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gICAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICAgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gICAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi0gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gICAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gICAgdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotPGhlYWQ+DQotPC9oZWFkPg0KLTxib2R5Pg0KLTx1aTpkZWNvcmF0ZSB0ZW1wbGF0ZT0iL01FVEEtSU5GL3RlbXBsYXRlcy9leGFtcGxlLnhodG1sIj4NCi0gIDx1aTpkZWZpbmUgbmFtZT0iaGVhZGVyIj4NCi0gICAgICA8aDE+PGg6b3V0cHV0VGV4dCB2YWx1ZT0iI3ttc2dzWyd0aXRsZSddfSIvPjwvaDE+DQotICAgICAgPGgyPjxoOm91dHB1dFRleHQgdmFsdWU9IiN7bXNnc1snZGVtb19jb21wb3NpdGVfY29tcG9uZW50J119Ii8+PC9oMj4gICAgDQotICA8L3VpOmRlZmluZT4NCi0gIDx1aTpkZWZpbmUgbmFtZT0iY29udGVudCI+DQotICANCi0gICAgPHRlc3RjYzpzYXlIZWxsb0NDIGZpcnN0TmFtZT0iSm9obiIgbGFzdE5hbWU9IlNtaXRoIi8+DQotDQotICAgIDxoOm91dHB1dFRleHQgdmFsdWU9IiN7bXNnc1sncHJvYmFibHlfbm90X3lvdV9pX2tub3cnXX0iLz4NCi0NCi0gICAgPGY6dmVyYmF0aW0+PGhyLz48L2Y6dmVyYmF0aW0+DQotDQotICAgIDxoOmZvcm0+DQotICAgICAgICA8aDpwYW5lbEdyaWQgY29sdW1ucz0iMiI+DQotICAgICAgICAgICAgPGg6b3V0cHV0TGFiZWwgZm9yPSJpbnB1dEZpcnN0TmFtZSIgdmFsdWU9IiN7bXNnc1snaW5wdXRfZmlyc3RfbmFtZSddfSIgLz4NCi0gICAgICAgICAgICA8aDppbnB1dFRleHQgaWQ9ImlucHV0Rmlyc3ROYW1lIiB2YWx1ZT0iI3tzYXlIZWxsb0JlYW4uZmlyc3ROYW1lfSIvPg0KLQ0KLSAgICAgICAgICAgIDxoOm91dHB1dExhYmVsIGZvcj0iaW5wdXRMYXN0TmFtZSIgdmFsdWU9IiN7bXNnc1snaW5wdXRfbGFzdF9uYW1lJ119IiAvPg0KLSAgICAgICAgICAgIDxoOmlucHV0VGV4dCBpZD0iaW5wdXRMYXN0TmFtZSIgdmFsdWU9IiN7c2F5SGVsbG9CZWFuLmxhc3ROYW1lfSIvPg0KLSAgICAgICAgPC9oOnBhbmVsR3JpZD4NCi0NCi0gICAgICAgIDxoOnBhbmVsR3JpZCBjb2x1bW5zPSIxIj4NCi0NCi0gICAgICAgICAgICA8aDpjb21tYW5kQnV0dG9uIHZhbHVlPSIje21zZ3NbJ3NheV9oZWxsbyddfSIgYWN0aW9uTGlzdGVuZXI9IiN7c2F5SGVsbG9CZWFuLnNheUl0fSIvPg0KLQ0KLSAgICAgICAgICAgIDx0ZXN0Y2M6c2F5SGVsbG9DQyBmaXJzdE5hbWU9IiN7c2F5SGVsbG9CZWFuLmZpcnN0TmFtZX0iDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0TmFtZT0iI3tzYXlIZWxsb0JlYW4ubGFzdE5hbWV9Ig0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVuZGVyZWQ9IiN7c2F5SGVsbG9CZWFuLnJlbmRlckdyZWV0aW5nfSIvPg0KLQ0KLSAgICAgICAgPC9oOnBhbmVsR3JpZD4NCi0NCi0gICAgPC9oOmZvcm0+DQotDQotICA8L3VpOmRlZmluZT4NCi08L3VpOmRlY29yYXRlPg0KLTwvYm9keT4NCi08L2h0bWw+DQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtanNmY29tcG9uZW50czIwL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL2V4YW1wbGVzL3NyYy9tYWluL3dlYmFwcC92YWxpZGF0b3JEZW1vLnhodG1sIGIvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtanNmY29tcG9uZW50czIwL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL2V4YW1wbGVzL3NyYy9tYWluL3dlYmFwcC92YWxpZGF0b3JEZW1vLnhodG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjZlYTY1Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWpzZmNvbXBvbmVudHMyMC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9leGFtcGxlcy9zcmMvbWFpbi93ZWJhcHAvdmFsaWRhdG9yRGVtby54aHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiA/Pg0KLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4NCi08aHRtbCAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiDQotICAgIHhtbG5zOnVpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9mYWNlbGV0cyINCi0gICAgeG1sbnM6Zj0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvY29yZSINCi0gICAgeG1sbnM6aD0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvaHRtbCINCi0gICAgeG1sbnM6Yz0iaHR0cDovL2phdmEuc3VuLmNvbS9qc3AvanN0bC9jb3JlIg0KLSAgICB4bWxuczpteWNvbXA9Imh0dHA6Ly93d3cubXlvcmdhbml0emF0aW9uLm9yZy9teWNvbXBvbmVudHMiPg0KLTwhLS0NCi0gICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gICAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gICAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICAgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gICAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi0gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gICAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gICAgdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotPGhlYWQ+DQotPC9oZWFkPg0KLTxib2R5Pg0KLTx1aTpkZWNvcmF0ZSB0ZW1wbGF0ZT0iL01FVEEtSU5GL3RlbXBsYXRlcy9leGFtcGxlLnhodG1sIj4NCi0gIDx1aTpkZWZpbmUgbmFtZT0iaGVhZGVyIj4NCi0gICAgICA8aDE+PGg6b3V0cHV0VGV4dCB2YWx1ZT0iI3ttc2dzWyd0aXRsZSddfSIvPjwvaDE+DQotICAgICAgPGgyPjxoOm91dHB1dFRleHQgdmFsdWU9IiN7bXNnc1snZGVtb192YWxpZGF0b3InXX0iLz48L2gyPiAgICANCi0gIDwvdWk6ZGVmaW5lPg0KLSAgPHVpOmRlZmluZSBuYW1lPSJjb250ZW50Ij4NCi0gIA0KLSAgICA8aDpmb3JtPg0KLSAgICAgICAgPGg6cGFuZWxHcmlkIGNvbHVtbnM9IjIiPg0KLSAgICAgICAgICAgIDxoOm91dHB1dExhYmVsIGZvcj0ibnVtIiB2YWx1ZT0iI3ttc2dzWydpbnB1dF9vZGRfbnVtYmVyJ119IiAvPg0KLSAgICAgICAgICAgIDxoOmlucHV0VGV4dCBpZD0ibnVtIiB2YWx1ZT0iI3tzYXlIZWxsb0JlYW4ub2RkTnVtYmVyfSI+DQotICAgICAgICAgICAgICAgIDxteWNvbXA6dmFsaWRhdGVPZGROdW0vPg0KLSAgICAgICAgICAgIDwvaDppbnB1dFRleHQ+DQotICAgICAgICAgICAgPGg6Y29tbWFuZEJ1dHRvbiB2YWx1ZT0iI3ttc2dzWydpbnB1dF9vZGRfbnVtYmVyJ119IiBhY3Rpb249IiN7c2F5SGVsbG9CZWFuLnN1Ym1pdE9kZE51bWJlcn0iLz4NCi0gICAgICAgIDwvaDpwYW5lbEdyaWQ+DQotICAgICAgICA8aDptZXNzYWdlcyAvPg0KLSAgICA8L2g6Zm9ybT4NCi0NCi0gIDwvdWk6ZGVmaW5lPg0KLTwvdWk6ZGVjb3JhdGU+DQotPC9ib2R5Pg0KLTwvaHRtbD4NCmRpZmYgLS1naXQgYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1qc2Zjb21wb25lbnRzMjAvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvZXhhbXBsZXMvc3JjL21haW4vd2ViYXBwL3ZhbGlkYXRvckRlbW9SZXN1bHQueGh0bWwgYi9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1qc2Zjb21wb25lbnRzMjAvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvZXhhbXBsZXMvc3JjL21haW4vd2ViYXBwL3ZhbGlkYXRvckRlbW9SZXN1bHQueGh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyNGUwMmMuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtanNmY29tcG9uZW50czIwL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL2V4YW1wbGVzL3NyYy9tYWluL3dlYmFwcC92YWxpZGF0b3JEZW1vUmVzdWx0LnhodG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiID8+DQotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPg0KLTxodG1sICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCINCi0gICAgeG1sbnM6dWk9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2ZhY2VsZXRzIg0KLSAgICB4bWxuczpmPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9jb3JlIg0KLSAgICB4bWxuczpoPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9odG1sIg0KLSAgICB4bWxuczpjPSJodHRwOi8vamF2YS5zdW4uY29tL2pzcC9qc3RsL2NvcmUiDQotICAgIHhtbG5zOm15Y29tcD0iaHR0cDovL3d3dy5teW9yZ2FuaXR6YXRpb24ub3JnL215Y29tcG9uZW50cyI+DQotPCEtLQ0KLSAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICAgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICAgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gICAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICAgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICAgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gICAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgICB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi08aGVhZD4NCi08L2hlYWQ+DQotPGJvZHk+DQotPHVpOmRlY29yYXRlIHRlbXBsYXRlPSIvTUVUQS1JTkYvdGVtcGxhdGVzL2V4YW1wbGUueGh0bWwiPg0KLSAgPHVpOmRlZmluZSBuYW1lPSJoZWFkZXIiPg0KLSAgICAgIDxoMT48aDpvdXRwdXRUZXh0IHZhbHVlPSIje21zZ3NbJ3RpdGxlJ119Ii8+PC9oMT4NCi0gICAgICA8aDI+PGg6b3V0cHV0VGV4dCB2YWx1ZT0iI3ttc2dzWydkZW1vX3ZhbGlkYXRvciddfSIvPjwvaDI+ICAgIA0KLSAgPC91aTpkZWZpbmU+DQotICA8dWk6ZGVmaW5lIG5hbWU9ImNvbnRlbnQiPg0KLSAgDQotICAgIDxoOmZvcm0+DQotICAgICAgICA8aDpwYW5lbEdyaWQgY29sdW1ucz0iMiI+DQotICAgICAgICAgICAgPGg6b3V0cHV0TGFiZWwgdmFsdWU9IiN7bXNnc1snc2hvd192YWx1ZV9lbnRlcmVkJ119IiBmb3I9Im9kZE51bWJlciIvPg0KLSAgICAgICAgICAgIDxoOm91dHB1dFRleHQgaWQ9Im9kZE51bWJlciIgdmFsdWU9IiN7c2F5SGVsbG9CZWFuLm9kZE51bWJlcn0iLz4NCi0gICAgICAgIDwvaDpwYW5lbEdyaWQ+DQotICAgIDwvaDpmb3JtPg0KLQ0KLSAgPC91aTpkZWZpbmU+DQotPC91aTpkZWNvcmF0ZT4NCi08L2JvZHk+DQotPC9odG1sPg0KZGlmZiAtLWdpdCBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWpzZmNvbXBvbmVudHMyMC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9wb20ueG1sIGIvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtanNmY29tcG9uZW50czIwL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwNmVmOWMuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtanNmY29tcG9uZW50czIwL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMjIgKzAsMCBAQAotI3NldCggJHN5bWJvbF9wb3VuZCA9ICcjJyApDQotI3NldCggJHN5bWJvbF9kb2xsYXIgPSAnJCcgKQ0KLSNzZXQoICRzeW1ib2xfZXNjYXBlID0gJ1wnICkNCi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTwhLS0NCi0gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi0gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCINCi0gICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIg0KLSAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPg0KLSAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPg0KLSAgPGdyb3VwSWQ+JHtncm91cElkfTwvZ3JvdXBJZD4NCi0gIDxhcnRpZmFjdElkPiR7YXJ0aWZhY3RJZH0tcHJvamVjdDwvYXJ0aWZhY3RJZD4NCi0gIDxwYWNrYWdpbmc+cG9tPC9wYWNrYWdpbmc+DQotICA8bmFtZT5NeSBKU0YgQ29tcG9uZW50cyBMaWJyYXJ5IFByb2plY3Q8L25hbWU+DQotICA8dmVyc2lvbj4ke3ZlcnNpb259PC92ZXJzaW9uPg0KLQ0KLSAgPGRlc2NyaXB0aW9uPg0KLSAgICAgIFRoaXMgaXMgdGhlIHByb2plY3QgZm9yIG15IGZ1bmt5IGNvbXBvbmVudHMuIFRoaXMgd2lsbCBidWlsZCBib3RoIHRoZSBjb3JlIGFuZCB0aGUgZXhhbXBsZXMNCi0gIDwvZGVzY3JpcHRpb24+DQotICANCi0gIDxwcm9wZXJ0aWVzPg0KLSAgICA8anNmLW15ZmFjZXMudmVyc2lvbj4yLjAuNDwvanNmLW15ZmFjZXMudmVyc2lvbj4NCi0gICAgPGpzZi1yaS52ZXJzaW9uPjIuMC4zLTIwMTAwNjMwPC9qc2YtcmkudmVyc2lvbj4NCi0gICAgPG1hdmVuLmpldHR5LnBsdWdpbi52ZXJzaW9uPjYuMS4yMjwvbWF2ZW4uamV0dHkucGx1Z2luLnZlcnNpb24+DQotICA8L3Byb3BlcnRpZXM+DQotDQotICA8YnVpbGQ+DQotICAgIDxwbHVnaW5zPg0KLSAgICAgIDxwbHVnaW4+DQotICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1jb21waWxlci1wbHVnaW48L2FydGlmYWN0SWQ+DQotICAgICAgICA8Y29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPHNvdXJjZT4xLjU8L3NvdXJjZT4NCi0gICAgICAgICAgPHRhcmdldD4xLjU8L3RhcmdldD4NCi0gICAgICAgIDwvY29uZmlndXJhdGlvbj4NCi0gICAgICA8L3BsdWdpbj4NCi0gICAgPC9wbHVnaW5zPg0KLSAgICA8cGx1Z2luTWFuYWdlbWVudD4NCi0gICAgICA8cGx1Z2lucz4NCi0gICAgICAgIDxwbHVnaW4+DQotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHM8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1idWlsZGVyLXBsdWdpbjwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4xLjAuOTwvdmVyc2lvbj4NCi0gICAgICAgIDwvcGx1Z2luPg0KLSAgICAgIDwvcGx1Z2lucz4NCi0gICAgPC9wbHVnaW5NYW5hZ2VtZW50Pg0KLSAgPC9idWlsZD4NCi0gIA0KLSAgPG1vZHVsZXM+DQotICAgICAgPG1vZHVsZT5jb3JlPC9tb2R1bGU+DQotICAgICAgPG1vZHVsZT5leGFtcGxlczwvbW9kdWxlPg0KLSAgPC9tb2R1bGVzPg0KLSAgDQotICA8ZGVwZW5kZW5jeU1hbmFnZW1lbnQ+DQotICAgIDxkZXBlbmRlbmNpZXM+DQotICAgIA0KLSAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgPGdyb3VwSWQ+amF2YXguc2VydmxldC5qc3A8L2dyb3VwSWQ+DQotICAgICAgICA8YXJ0aWZhY3RJZD5qc3AtYXBpPC9hcnRpZmFjdElkPg0KLSAgICAgICAgPHZlcnNpb24+Mi4xPC92ZXJzaW9uPg0KLSAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4NCi0gICAgICA8L2RlcGVuZGVuY3k+DQotDQotICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICA8Z3JvdXBJZD5qYXZheC5zZXJ2bGV0PC9ncm91cElkPg0KLSAgICAgICAgPGFydGlmYWN0SWQ+c2VydmxldC1hcGk8L2FydGlmYWN0SWQ+DQotICAgICAgICA8dmVyc2lvbj4yLjU8L3ZlcnNpb24+DQotICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPg0KLSAgICAgIDwvZGVwZW5kZW5jeT4NCi0gICAgDQotICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29sczwvZ3JvdXBJZD4NCi0gICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtYnVpbGRlci1hbm5vdGF0aW9uczwvYXJ0aWZhY3RJZD4gDQotICAgICAgICA8dmVyc2lvbj4xLjAuODwvdmVyc2lvbj4NCi0gICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+DQotICAgICAgPC9kZXBlbmRlbmN5Pg0KLSAgICAgIA0KLSAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmNvcmU8L2dyb3VwSWQ+DQotICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWFwaTwvYXJ0aWZhY3RJZD4NCi0gICAgICAgIDx2ZXJzaW9uPiR7c3ltYm9sX2RvbGxhcn17anNmLW15ZmFjZXMudmVyc2lvbn08L3ZlcnNpb24+DQotICAgICAgPC9kZXBlbmRlbmN5Pg0KLQ0KLSAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmNvcmU8L2dyb3VwSWQ+DQotICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWltcGw8L2FydGlmYWN0SWQ+DQotICAgICAgICA8dmVyc2lvbj4ke3N5bWJvbF9kb2xsYXJ9e2pzZi1teWZhY2VzLnZlcnNpb259PC92ZXJzaW9uPg0KLSAgICAgIDwvZGVwZW5kZW5jeT4NCi0gICAgICANCi0gICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgIDxncm91cElkPmp1bml0PC9ncm91cElkPg0KLSAgICAgICAgPGFydGlmYWN0SWQ+anVuaXQ8L2FydGlmYWN0SWQ+DQotICAgICAgICA8dmVyc2lvbj40LjguMTwvdmVyc2lvbj4NCi0gICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4NCi0gICAgICA8L2RlcGVuZGVuY3k+DQotICAgICAgDQotICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMudGVzdDwvZ3JvdXBJZD4NCi0gICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtdGVzdDIwPC9hcnRpZmFjdElkPg0KLSAgICAgICAgPHZlcnNpb24+MS4wLjI8L3ZlcnNpb24+DQotICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+DQotICAgICAgPC9kZXBlbmRlbmN5Pg0KLSAgICAgIA0KLSAgICA8L2RlcGVuZGVuY2llcz4NCi0gIDwvZGVwZW5kZW5jeU1hbmFnZW1lbnQ+DQotDQotPC9wcm9qZWN0Pg0KZGlmZiAtLWdpdCBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWpzZmNvbXBvbmVudHMyMC9zcmMvc2l0ZS9hcHQvaW5kZXguYXB0IGIvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtanNmY29tcG9uZW50czIwL3NyYy9zaXRlL2FwdC9pbmRleC5hcHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyYTcxOWIuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtanNmY29tcG9uZW50czIwL3NyYy9zaXRlL2FwdC9pbmRleC5hcHQKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0gLS0tLS0tDQotIE15ZmFjZXMgSlNGLWNvbXBvbmVudHMgMi4wIEFyY2hldHlwZQ0KLSAtLS0tLS0NCi0NCi1PdmVydmlldw0KLQ0KLSAgVGhpcyBwcm9qZWN0IGRlZmluZXMgYSBNYXZlbiBhcmNoZXR5cGUuIFJ1bm5pbmcgdGhlIGFyY2hldHlwZSBwbHVnaW4gd2l0aCB0aGlzIGFyY2hldHlwZSB3aWxsDQotICBjcmVhdGUgYSBkaXJlY3RvcnkgdHJlZSBjb250YWluaW5nIHRoZSBmaWxlcyBuZWVkZWQgdG8gcXVpY2tseSBnZXQgc3RhcnRlZCBvbiBhIG5ldyBKU0YNCi0gIGNvbXBvbmVudCwgY29udmVydGVyIG9yIHZhbGlkYXRvci4NCi0NCi1Vc2FnZQ0KLQ0KLSAgVXNlIHRoZSBmb2xsb3dpbmcgbWF2ZW4gY29tbWFuZCBhbmQgdGhlbiBzZWxlY3QgbXlmYWNlcy1hcmNoZXR5cGUtanNmY29tcG9uZW50cyBmcm9tIHRoZSBvcHRpb25zLg0KLQ0KLQ0KLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rDQotbXZuIGFyY2hldHlwZTpnZW5lcmF0ZSAtRGFyY2hldHlwZUNhdGFsb2c9aHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZw0KLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rDQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtdHJpbmlkYWQvcG9tLnhtbCBiL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLXRyaW5pZGFkL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3OTQ1ZjEuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtdHJpbmlkYWQvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICAgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICAgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gICAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICAgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gICAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gICAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gICAgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPiAKLQotICA8cGFyZW50PgotICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzPC9ncm91cElkPgotICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtYXJjaGV0eXBlLXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj4xLjAuNC1TTkFQU0hPVDwvdmVyc2lvbj4KLSAgPC9wYXJlbnQ+Ci0KLSAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29sczwvZ3JvdXBJZD4KLSAgPGFydGlmYWN0SWQ+bXlmYWNlcy1hcmNoZXR5cGUtdHJpbmlkYWQ8L2FydGlmYWN0SWQ+Ci0gIDxwYWNrYWdpbmc+amFyPC9wYWNrYWdpbmc+Ci0gIDxuYW1lPk15RmFjZXMgVHJpbmlkYWQgQXJjaGV0eXBlPC9uYW1lPgotICA8ZGVzY3JpcHRpb24+QXJjaGV0eXBlIHRvIGNyZWF0ZSBhIG5ldyB3ZWJhcHAgYmFzZWQgb24gVHJpbmlkYWQ8L2Rlc2NyaXB0aW9uPgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtdHJpbmlkYWQvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL0xJQ0VOU0UgYi9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS10cmluaWRhZC9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvTElDRU5TRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDY0NTY5NS4uMDAwMDAwMAotLS0gYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS10cmluaWRhZC9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvTElDRU5TRQorKysgL2Rldi9udWxsCkBAIC0xLDIwMiArMCwwIEBACi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0Ci0gICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvCi0KLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTgotCi0gICAxLiBEZWZpbml0aW9ucy4KLQotICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwKLSAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgotCi0gICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgotCi0gICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsCi0gICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCi0gICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLAotICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlCi0gICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgotICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlCi0gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5LgotCi0gICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLgotCi0gICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywKLSAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24KLSAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCi0KLSAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsCi0gICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0Ci0gICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sCi0gICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuCi0KLSAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yCi0gICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhCi0gICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKLSAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuCi0KLSAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKLSAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUKLSAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMKLSAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCi0gICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4KLSAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwKLSAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCi0KLSAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nCi0gICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCi0gICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkKLSAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIKLSAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgotICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiCi0gICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50Ci0gICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bwotICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywKLSAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlCi0gICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKLSAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlCi0gICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiIKLQotICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKLSAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZAotICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCi0KLSAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKLSAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLAotICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCi0gICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLgotCi0gICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKLSAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLAotICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUKLSAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCi0gICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpCi0gICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQotICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKLSAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsKLSAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0Ci0gICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCi0gICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUKLSAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4KLQotICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUKLSAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dAotICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKLSAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotCi0gICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgotICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kCi0KLSAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKLSAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQKLQotICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCi0gICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZAotICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssCi0gICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgotICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQKLQotICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCi0gICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdAotICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZAotICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAotICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQotICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkCi0gICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgotICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLAotICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQKLSAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKLSAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kCi0gICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24KLSAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQotICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZAotICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZAotICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KLQotICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kCi0gICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCi0gICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yCi0gICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwKLSAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAotICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4KLQotICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAotICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrCi0gICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCi0gICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5Ci0gICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZAotICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgotCi0gICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlCi0gICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCi0gICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUKLSAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLgotCi0gICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IKLSAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gKLSAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucwotICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQotICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlCi0gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkKLSAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KLQotICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksCi0gICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKLSAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5Ci0gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQotICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAotICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhCi0gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlCi0gICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCi0gICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbAotICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcgotICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgotCi0gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nCi0gICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAotICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwKLSAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzCi0gICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQotICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYKLSAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwKLSAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQotICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbgotICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuCi0KLSAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUwotCi0gICBBUFBFTkRJWDogSG93IHRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmsuCi0KLSAgICAgIFRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmssIGF0dGFjaCB0aGUgZm9sbG93aW5nCi0gICAgICBib2lsZXJwbGF0ZSBub3RpY2UsIHdpdGggdGhlIGZpZWxkcyBlbmNsb3NlZCBieSBicmFja2V0cyAiW10iCi0gICAgICByZXBsYWNlZCB3aXRoIHlvdXIgb3duIGlkZW50aWZ5aW5nIGluZm9ybWF0aW9uLiAoRG9uJ3QgaW5jbHVkZQotICAgICAgdGhlIGJyYWNrZXRzISkgIFRoZSB0ZXh0IHNob3VsZCBiZSBlbmNsb3NlZCBpbiB0aGUgYXBwcm9wcmlhdGUKLSAgICAgIGNvbW1lbnQgc3ludGF4IGZvciB0aGUgZmlsZSBmb3JtYXQuIFdlIGFsc28gcmVjb21tZW5kIHRoYXQgYQotICAgICAgZmlsZSBvciBjbGFzcyBuYW1lIGFuZCBkZXNjcmlwdGlvbiBvZiBwdXJwb3NlIGJlIGluY2x1ZGVkIG9uIHRoZQotICAgICAgc2FtZSAicHJpbnRlZCBwYWdlIiBhcyB0aGUgY29weXJpZ2h0IG5vdGljZSBmb3IgZWFzaWVyCi0gICAgICBpZGVudGlmaWNhdGlvbiB3aXRoaW4gdGhpcmQtcGFydHkgYXJjaGl2ZXMuCi0KLSAgIENvcHlyaWdodCBbeXl5eV0gW25hbWUgb2YgY29weXJpZ2h0IG93bmVyXQotCi0gICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgpkaWZmIC0tZ2l0IGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtdHJpbmlkYWQvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL05PVElDRSBiL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLXRyaW5pZGFkL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9OT1RJQ0UKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiMmMyYjUuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtdHJpbmlkYWQvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL05PVElDRQorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi09PSAgTk9USUNFIGZpbGUgY29ycmVzcG9uZGluZyB0byBzZWN0aW9uIDQoZCkgb2YgdGhlIEFwYWNoZSBMaWNlbnNlLCAgID09DQotPT0gIFZlcnNpb24gMi4wLCBpbiB0aGlzIGNhc2UgZm9yIHRoZSBBcGFjaGUgTXlGYWNlcyAgICAgICAgICAgICAgICAgICA9PQ0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0NCi1UaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IA0KLVRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuDQotDQotUG9ydGlvbnMgb2YgdGhpcyBzb2Z0d2FyZSB3ZXJlIG9yaWdpbmFsbHkgYmFzZWQgb24gdGhlIGZvbGxvd2luZzoNCi0NCi0gLSBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwNiwgT3JhY2xlIENvcnAsIDxodHRwOi8vd3d3Lm9yYWNsZS5jb20vPi4NCi1hbmQgYXJlIGxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiB1bmRlciB0aGUgDQotIlNvZnR3YXJlIEdyYW50IGFuZCBDb3Jwb3JhdGUgQ29udHJpYnV0aW9uIExpY2Vuc2UgQWdyZWVtZW50Ig0KLQ0KLVNlZSB0aGUgTElDRU5TRS50eHQgZmlsZSBmb3IgaW5mb3JtYXRpb24gb24gYWxsIGxpY2Vuc2VzIA0KLWFzc29jaWF0ZWQgd2l0aCB0aGlzIHNvZnR3YXJlLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLXRyaW5pZGFkL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9tYXZlbi9hcmNoZXR5cGUtbWV0YWRhdGEueG1sIGIvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtdHJpbmlkYWQvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL21hdmVuL2FyY2hldHlwZS1tZXRhZGF0YS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkNmU0MzMuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtdHJpbmlkYWQvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL21hdmVuL2FyY2hldHlwZS1tZXRhZGF0YS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTwhLS0NCi0gICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gICAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gICAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICAgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gICAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi0gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gICAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gICAgdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotPGFyY2hldHlwZS1kZXNjcmlwdG9yIHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9wbHVnaW5zL21hdmVuLWFyY2hldHlwZS1wbHVnaW4vYXJjaGV0eXBlLWRlc2NyaXB0b3IvMS4wLjAiDQotICAgICAgICAgICAgICAgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiDQotICAgICAgICAgICAgICAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvcGx1Z2lucy9tYXZlbi1hcmNoZXR5cGUtcGx1Z2luL2FyY2hldHlwZS1kZXNjcmlwdG9yLzEuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9hcmNoZXR5cGUtZGVzY3JpcHRvci0xLjAuMC54c2QiDQotDQotICAgICAgICAgICAgICAgICAgICAgIG5hbWU9Im15ZmFjZXMtYXJjaGV0eXBlLXRyaW5pZGFkIiBwYXJ0aWFsPSJmYWxzZSI+DQotDQotICA8cmVxdWlyZWRQcm9wZXJ0aWVzLz4NCi0NCi0gIDxmaWxlU2V0cz4NCi0gICAgICA8ZmlsZVNldCBmaWx0ZXJlZD0idHJ1ZSIgcGFja2FnZWQ9InRydWUiPg0KLSAgICAgICAgICA8ZGlyZWN0b3J5PnNyYy9tYWluL2phdmEvPC9kaXJlY3Rvcnk+DQotICAgICAgPC9maWxlU2V0Pg0KLSAgICAgIDxmaWxlU2V0IGZpbHRlcmVkPSJmYWxzZSIgcGFja2FnZWQ9ImZhbHNlIj4NCi0gICAgICAgICAgPGRpcmVjdG9yeT5zcmMvbWFpbi93ZWJhcHAvPC9kaXJlY3Rvcnk+DQotICAgICAgICAgIDxleGNsdWRlcz4NCi0gICAgICAgICAgICAgIDxleGNsdWRlPldFQi1JTkYvZmFjZXMtY29uZmlnLnhtbDwvZXhjbHVkZT4NCi0gICAgICAgICAgPC9leGNsdWRlcz4NCi0gICAgICA8L2ZpbGVTZXQ+DQotICAgICAgPGZpbGVTZXQgZmlsdGVyZWQ9InRydWUiIHBhY2thZ2VkPSJmYWxzZSI+DQotICAgICAgICAgIDxkaXJlY3Rvcnk+c3JjL21haW4vd2ViYXBwLzwvZGlyZWN0b3J5Pg0KLSAgICAgICAgICA8aW5jbHVkZXM+DQotICAgICAgICAgICAgICA8IS0tIGZhY2VzLWNvbmZpZyBuZWVkcyB0byBiZSBmaWx0ZXJlZCAtLT4NCi0gICAgICAgICAgICAgIDxpbmNsdWRlPldFQi1JTkYvZmFjZXMtY29uZmlnLnhtbDwvaW5jbHVkZT4NCi0gICAgICAgICAgPC9pbmNsdWRlcz4NCi0gICAgICA8L2ZpbGVTZXQ+DQotICAgICAgPGZpbGVTZXQgZmlsdGVyZWQ9ImZhbHNlIiBwYWNrYWdlZD0iZmFsc2UiPg0KLSAgICAgICAgICA8ZGlyZWN0b3J5PnNyYy9tYWluL2xvZzRqLzwvZGlyZWN0b3J5Pg0KLSAgICAgIDwvZmlsZVNldD4NCi0gIDwvZmlsZVNldHM+DQotDQotICA8bW9kdWxlcy8+DQotDQotPC9hcmNoZXR5cGUtZGVzY3JpcHRvcj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS10cmluaWRhZC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9wb20ueG1sIGIvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtdHJpbmlkYWQvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTRkOTRlYS4uMDAwMDAwMAotLS0gYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS10cmluaWRhZC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTg5ICswLDAgQEAKLSNzZXQoICRzeW1ib2xfcG91bmQgPSAnIycgKQ0KLSNzZXQoICRzeW1ib2xfZG9sbGFyID0gJyQnICkNCi0jc2V0KCAkc3ltYm9sX2VzY2FwZSA9ICdcJyApDQotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08IS0tDQotICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gICAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICAgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICAgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gICAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICAgIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gICAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gICAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICAgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICAgIHVuZGVyIHRoZSBMaWNlbnNlLg0KLQkgICANCi0tLT4NCi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIg0KLSAgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiDQotICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+DQotICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4NCi0gICAgPGdyb3VwSWQ+JHtncm91cElkfTwvZ3JvdXBJZD4NCi0gICAgPGFydGlmYWN0SWQ+JHthcnRpZmFjdElkfTwvYXJ0aWZhY3RJZD4NCi0gICAgPHBhY2thZ2luZz53YXI8L3BhY2thZ2luZz4NCi0gICAgPHZlcnNpb24+JHt2ZXJzaW9ufTwvdmVyc2lvbj4NCi0gICAgPG5hbWU+QSBjdXN0b20gcHJvamVjdCB1c2luZyBteWZhY2VzIDEuMiB3aXRoIHRyaW5pZGFkPC9uYW1lPg0KLSAgICA8dXJsPmh0dHA6Ly93d3cubXlvcmdhbml6YXRpb24ub3JnPC91cmw+DQotDQotICAgIDxwcm9wZXJ0aWVzPg0KLSAgICAgICAgPGpzZi1teWZhY2VzLnZlcnNpb24+MS4yLjEwPC9qc2YtbXlmYWNlcy52ZXJzaW9uPg0KLSAgICAgICAgPGpzZi1yaS52ZXJzaW9uPjEuMl8xNTwvanNmLXJpLnZlcnNpb24+DQotICAgICAgICA8dHJpbmlkYWQudmVyc2lvbj4xLjIuMTQ8L3RyaW5pZGFkLnZlcnNpb24+ICAgICAgICANCi0gICAgICAgIDxtYXZlbi5qZXR0eS5wbHVnaW4udmVyc2lvbj42LjEuMjI8L21hdmVuLmpldHR5LnBsdWdpbi52ZXJzaW9uPg0KLSAgICAgICAgPGxvZzRqLnZlcnNpb24+MS4yLjEzPC9sb2c0ai52ZXJzaW9uPg0KLSAgICA8L3Byb3BlcnRpZXM+DQotICAgIA0KLSAgICA8YnVpbGQ+DQotICAgICAgICA8ZmluYWxOYW1lPiR7YXJ0aWZhY3RJZH08L2ZpbmFsTmFtZT4NCi0gICAgICAgIDxwbHVnaW5zPg0KLSAgICAgICAgICAgIDxwbHVnaW4+DQotICAgICAgICAgICAgICAgIDwhLS1UaGlzIHBsdWdpbiBhbGxvd3MgdG8gcnVuIHRoZSBleGFtcGxlIHVzaW5nIG12biBqZXR0eTpydW4gLS0+DQotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5tb3J0YmF5LmpldHR5PC9ncm91cElkPg0KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1qZXR0eS1wbHVnaW48L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7c3ltYm9sX2RvbGxhcn17bWF2ZW4uamV0dHkucGx1Z2luLnZlcnNpb259PC92ZXJzaW9uPg0KLSAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgICAgICAgICAgIDxzY2FuSW50ZXJ2YWxTZWNvbmRzPjEwPC9zY2FuSW50ZXJ2YWxTZWNvbmRzPg0KLSAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+DQotICAgICAgICAgICAgPC9wbHVnaW4+DQotICAgICAgICA8L3BsdWdpbnM+ICAgIA0KLSAgICA8L2J1aWxkPg0KLSAgICANCi0gICAgPHByb2ZpbGVzPg0KLSAgICAgICAgPHByb2ZpbGU+DQotICAgICAgICAgICAgPGlkPm15ZmFjZXM8L2lkPg0KLSAgICAgICAgICAgIDxhY3RpdmF0aW9uPg0KLSAgICAgICAgICAgICAgICA8cHJvcGVydHk+DQotICAgICAgICAgICAgICAgICAgICA8bmFtZT4hanNmPC9uYW1lPg0KLSAgICAgICAgICAgICAgICA8L3Byb3BlcnR5Pg0KLSAgICAgICAgICAgIDwvYWN0aXZhdGlvbj4NCi0gICAgICAgICAgICA8ZGVwZW5kZW5jaWVzPg0KLSAgICAgICAgICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5jb3JlPC9ncm91cElkPg0KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1hcGk8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3N5bWJvbF9kb2xsYXJ9e2pzZi1teWZhY2VzLnZlcnNpb259PC92ZXJzaW9uPg0KLSAgICAgICAgICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPg0KLSAgICAgICAgICAgICAgICA8L2RlcGVuZGVuY3k+DQotICAgICAgICAgICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmNvcmU8L2dyb3VwSWQ+DQotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWltcGw8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3N5bWJvbF9kb2xsYXJ9e2pzZi1teWZhY2VzLnZlcnNpb259PC92ZXJzaW9uPg0KLSAgICAgICAgICAgICAgICAgICAgPHNjb3BlPnJ1bnRpbWU8L3Njb3BlPg0KLSAgICAgICAgICAgICAgICA8L2RlcGVuZGVuY3k+DQotICAgICAgICAgICAgPC9kZXBlbmRlbmNpZXM+DQotICAgICAgICA8L3Byb2ZpbGU+DQotICAgICAgICA8cHJvZmlsZT4NCi0gICAgICAgICAgICA8IS0tIEFjdGl2ZSBhZGRpbmcgLURqc2Y9cmkgd2hlbiBleGVjdXRlIG1hdmVuIGdvYWxzLiAtLT4NCi0gICAgICAgICAgICA8aWQ+anNmLXJpPC9pZD4NCi0gICAgICAgICAgICA8YWN0aXZhdGlvbj4NCi0gICAgICAgICAgICAgICAgPHByb3BlcnR5Pg0KLSAgICAgICAgICAgICAgICAgICAgPG5hbWU+anNmPC9uYW1lPg0KLSAgICAgICAgICAgICAgICAgICAgPHZhbHVlPnJpPC92YWx1ZT4NCi0gICAgICAgICAgICAgICAgPC9wcm9wZXJ0eT4NCi0gICAgICAgICAgICA8L2FjdGl2YXRpb24+DQotICAgICAgICAgICAgPGRlcGVuZGVuY2llcz4NCi0gICAgICAgICAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC5mYWNlczwvZ3JvdXBJZD4NCi0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmpzZi1hcGk8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3N5bWJvbF9kb2xsYXJ9e2pzZi1yaS52ZXJzaW9ufTwvdmVyc2lvbj4NCi0gICAgICAgICAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4NCi0gICAgICAgICAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPmphdmF4LmZhY2VzPC9ncm91cElkPg0KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+anNmLWltcGw8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3N5bWJvbF9kb2xsYXJ9e2pzZi1yaS52ZXJzaW9ufTwvdmVyc2lvbj4NCi0gICAgICAgICAgICAgICAgICAgIDxzY29wZT5ydW50aW1lPC9zY29wZT4NCi0gICAgICAgICAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDwvZGVwZW5kZW5jaWVzPg0KLSAgICAgICAgICAgIDxyZXBvc2l0b3JpZXM+DQotICAgICAgICAgICAgICAgIDxyZXBvc2l0b3J5Pg0KLSAgICAgICAgICAgICAgICAgICAgPGlkPmphdmEubmV0PC9pZD4NCi0gICAgICAgICAgICAgICAgICAgIDx1cmw+aHR0cDovL2Rvd25sb2FkLmphdmEubmV0L21hdmVuLzE8L3VybD4NCi0gICAgICAgICAgICAgICAgICAgIDxsYXlvdXQ+bGVnYWN5PC9sYXlvdXQ+DQotICAgICAgICAgICAgICAgIDwvcmVwb3NpdG9yeT4NCi0gICAgICAgICAgICA8L3JlcG9zaXRvcmllcz4NCi0gICAgICAgIDwvcHJvZmlsZT4NCi0gICAgICAgIA0KLSAgICAgICAgPHByb2ZpbGU+DQotICAgICAgICAgICAgPCEtLSBEZWJ1ZyBwcm9maWxlIGZvciBteWZhY2VzIGFuZCBqZXR0eS4NCi0gICAgICAgICAgICAgICAgSXQgYWxsb3dzIHRvIHNlZSBkZWJ1ZyBtZXNzYWdlcyB1c2luZyAtUGpldHR5Q29uZmlnIC0tPg0KLSAgICAgICAgICAgIDxpZD5qZXR0eUNvbmZpZzwvaWQ+DQotICAgICAgICAgICAgPGJ1aWxkPg0KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2VzPg0KLSAgICAgICAgICAgICAgICAgICAgPHJlc291cmNlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+c3JjL21haW4vcmVzb3VyY2VzPC9kaXJlY3Rvcnk+DQotICAgICAgICAgICAgICAgICAgICA8L3Jlc291cmNlPg0KLSAgICAgICAgICAgICAgICAgICAgPHJlc291cmNlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+c3JjL21haW4vbG9nNGo8L2RpcmVjdG9yeT4NCi0gICAgICAgICAgICAgICAgICAgIDwvcmVzb3VyY2U+DQotICAgICAgICAgICAgICAgIDwvcmVzb3VyY2VzPg0KLSAgICAgICAgICAgICAgICA8cGx1Z2lucz4NCi0gICAgICAgICAgICAgICAgICAgIDxwbHVnaW4+DQotICAgICAgICAgICAgICAgICAgICAgICAgPCEtLVRoaXMgcGx1Z2luIGFsbG93cyB0byBydW4gdGhlIGV4YW1wbGUgdXNpbmcgbXZuIGpldHR5OnJ1biAtLT4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcubW9ydGJheS5qZXR0eTwvZ3JvdXBJZD4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1qZXR0eS1wbHVnaW48L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtzeW1ib2xfZG9sbGFyfXttYXZlbi5qZXR0eS5wbHVnaW4udmVyc2lvbn08L3ZlcnNpb24+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzY2FuSW50ZXJ2YWxTZWNvbmRzPjEwPC9zY2FuSW50ZXJ2YWxTZWNvbmRzPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3lzdGVtUHJvcGVydGllcz4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzeXN0ZW1Qcm9wZXJ0eT4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5vcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c8L25hbWU+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZhbHVlPm9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLmltcGwuTG9nNEpMb2dnZXI8L3ZhbHVlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zeXN0ZW1Qcm9wZXJ0eT4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zeXN0ZW1Qcm9wZXJ0aWVzPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgICAgICAgICAgIDwvcGx1Z2luPg0KLSAgICAgICAgICAgICAgICA8L3BsdWdpbnM+DQotICAgICAgICAgICAgPC9idWlsZD4NCi0gICAgICAgICAgICA8ZGVwZW5kZW5jaWVzPg0KLSAgICAgICAgICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPmxvZzRqPC9ncm91cElkPg0KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bG9nNGo8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3N5bWJvbF9kb2xsYXJ9e2xvZzRqLnZlcnNpb259PC92ZXJzaW9uPg0KLSAgICAgICAgICAgICAgICAgICAgPHR5cGU+amFyPC90eXBlPg0KLSAgICAgICAgICAgICAgICA8L2RlcGVuZGVuY3k+DQotICAgICAgICAgICAgPC9kZXBlbmRlbmNpZXM+DQotICAgICAgICA8L3Byb2ZpbGU+DQotICAgIDwvcHJvZmlsZXM+DQotDQotICAgIDwhLS0gUHJvamVjdCBkZXBlbmRlbmNpZXMgLS0+DQotICAgIDxkZXBlbmRlbmNpZXM+DQotICAgICAgICANCi0gICAgICAgIDwhLS0gQXBhY2hlIFRyaW5pZGFkIC0tPg0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPnRyaW5pZGFkLWFwaTwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4ke3N5bWJvbF9kb2xsYXJ9e3RyaW5pZGFkLnZlcnNpb259PC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0gICAgICAgIA0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPnRyaW5pZGFkLWltcGw8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+JHtzeW1ib2xfZG9sbGFyfXt0cmluaWRhZC52ZXJzaW9ufTwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+cnVudGltZTwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotICAgICAgICANCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgCTxncm91cElkPmphdmF4LnNlcnZsZXQ8L2dyb3VwSWQ+DQotICAgICAgICAJPGFydGlmYWN0SWQ+anN0bDwvYXJ0aWZhY3RJZD4NCi0gICAgICAgIAk8dmVyc2lvbj4xLjI8L3ZlcnNpb24+DQotICAgICAgICAJPHNjb3BlPnJ1bnRpbWU8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLSAgICAgICAgDQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5qdW5pdDwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5qdW5pdDwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj40LjguMTwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotICAgICAgICANCi0gICAgPC9kZXBlbmRlbmNpZXM+DQotDQotPC9wcm9qZWN0Pg0KZGlmZiAtLWdpdCBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLXRyaW5pZGFkL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL2phdmEvSGVsbG9Xb3JsZEJhY2tpbmcuamF2YSBiL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLXRyaW5pZGFkL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL2phdmEvSGVsbG9Xb3JsZEJhY2tpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTU2YmMxNy4uMDAwMDAwMAotLS0gYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS10cmluaWRhZC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zcmMvbWFpbi9qYXZhL0hlbGxvV29ybGRCYWNraW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlICRwYWNrYWdlOwotCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQucmVuZGVyLkV4dGVuZGVkUmVuZGVyS2l0U2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQudXRpbC5TZXJ2aWNlOwotCi0vKioKLSAqIEEgdHlwaWNhbCBzaW1wbGUgYmFja2luZyBiZWFuLCB0aGF0IGlzIGJhY2tlZCB0byA8Y29kZT5oZWxsb3dvcmxkLmpzcDwvY29kZT4KLSAqIAotICovCi1wdWJsaWMgY2xhc3MgSGVsbG9Xb3JsZEJhY2tpbmcKLXsKLQotICAvL3Byb3BlcnRpZXMKLSAgcHJpdmF0ZSBTdHJpbmcgX25hbWU7Ci0KLSAgLyoqCi0gICAqIGRlZmF1bHQgZW1wdHkgY29uc3RydWN0b3IKLSAgICovCi0gIHB1YmxpYyBIZWxsb1dvcmxkQmFja2luZygpCi0gIHsgICAKLSAgfQotCi0gIC8vLS0tLS0tLS0tLS0tLS0tLS0tLWdldHRlciAmIHNldHRlcgotICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKQotICB7Ci0gICAgcmV0dXJuIF9uYW1lOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkKLSAgewotICAgIHRoaXMuX25hbWUgPSBuYW1lOwotICB9Ci0KLSAgLyoqCi0gICAqIE1ldGhvZCB0aGF0IGlzIGJhY2tlZCB0byBhIHN1Ym1pdCBidXR0b24gb2YgYSBmb3JtLgotICAgKi8KLSAgcHVibGljIFN0cmluZyBzZW5kKCkKLSAgewotICAgIEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQgPSBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCk7Ci0gICAgRXh0ZW5kZWRSZW5kZXJLaXRTZXJ2aWNlIHNlcnZpY2UgPSAoRXh0ZW5kZWRSZW5kZXJLaXRTZXJ2aWNlKQotICAgICAgU2VydmljZS5nZXRSZW5kZXJLaXRTZXJ2aWNlKGZhY2VzQ29udGV4dCwgRXh0ZW5kZWRSZW5kZXJLaXRTZXJ2aWNlLmNsYXNzKTsKLSAgICBzZXJ2aWNlLmFkZFNjcmlwdChmYWNlc0NvbnRleHQsICJhbGVydCgnU2NyaXB0IGFkZGVkIGJ5IEV4dGVuZGVkUmVuZGVyS2l0U2VydmljZScpIik7Ci0KLSAgICAvL2RvIHJlYWwgbG9naWMKLSAgICByZXR1cm4gKCJzdWNjZXNzIik7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS10cmluaWRhZC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zcmMvbWFpbi9sb2c0ai9sb2c0ai5wcm9wZXJ0aWVzIGIvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtdHJpbmlkYWQvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc3JjL21haW4vbG9nNGovbG9nNGoucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzgzNTJlNC4uMDAwMDAwMAotLS0gYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS10cmluaWRhZC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zcmMvbWFpbi9sb2c0ai9sb2c0ai5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSMgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0jIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSMgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSMgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSMgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotbG9nNGoucm9vdExvZ2dlcj1JTkZPLCBBMSwgQTIKLWxvZzRqLmFwcGVuZGVyLkExPW9yZy5hcGFjaGUubG9nNGouQ29uc29sZUFwcGVuZGVyCi1sb2c0ai5hcHBlbmRlci5BMS5sYXlvdXQ9b3JnLmFwYWNoZS5sb2c0ai5QYXR0ZXJuTGF5b3V0Ci0KLSNsb2cgb24gYSBmaWxlIG9uIHRhcmdldCB0b28sIHRvIG1ha2UgZWFzaWVyIGNoZWNrIGl0Ci1sb2c0ai5hcHBlbmRlci5BMj1vcmcuYXBhY2hlLmxvZzRqLlJvbGxpbmdGaWxlQXBwZW5kZXIKLWxvZzRqLmFwcGVuZGVyLkEyLkZpbGU9dGFyZ2V0L2xvZzRqLmxvZwotbG9nNGouYXBwZW5kZXIuQTIuTWF4RmlsZVNpemU9MTAwMEtCCi0jIEtlZXAgb25lIGJhY2t1cCBmaWxlCi1sb2c0ai5hcHBlbmRlci5BMi5NYXhCYWNrdXBJbmRleD0xCi1sb2c0ai5hcHBlbmRlci5BMi5sYXlvdXQ9b3JnLmFwYWNoZS5sb2c0ai5QYXR0ZXJuTGF5b3V0Ci1sb2c0ai5hcHBlbmRlci5BMi5sYXlvdXQuQ29udmVyc2lvblBhdHRlcm49JXAgJXQgJWMgLSAlbSVuCi0KLSMgTG9nIGxldmVsIGZvciBteWZhY2VzIGxpYnJhcmllcwotbG9nNGoubG9nZ2VyLm9yZy5hcGFjaGUuY29tbW9ucz1JTkZPCi1sb2c0ai5sb2dnZXIub3JnLmFwYWNoZS5teWZhY2VzPVRSQUNFCi1sb2c0ai5sb2dnZXIuamF2YXguZmFjZXM9VFJBQ0UKLQotIyBQcmludCB0aGUgZGF0ZSBpbiBJU08gODYwMSBmb3JtYXQKLWxvZzRqLmFwcGVuZGVyLkExLmxheW91dC5Db252ZXJzaW9uUGF0dGVybj0lNXAgWyV0XSAoJUZcOiVMKSAtICVtJW4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS10cmluaWRhZC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9mYWNlcy1jb25maWcueG1sIGIvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtdHJpbmlkYWQvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvZmFjZXMtY29uZmlnLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWViZTZlMS4uMDAwMDAwMAotLS0gYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS10cmluaWRhZC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9mYWNlcy1jb25maWcueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+DQotPCEtLQ0KLSAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICAgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICAgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gICAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICAgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICAgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gICAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgICB1bmRlciB0aGUgTGljZW5zZS4NCi0JICAgDQotLS0+DQotPGZhY2VzLWNvbmZpZyB2ZXJzaW9uPSIxLjIiIA0KLSAgICB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIg0KLSAgICB4bWxuczp4aT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YSW5jbHVkZSINCi0gICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgDQotICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS93ZWItZmFjZXNjb25maWdfMV8yLnhzZCI+DQotICANCi0gIDxhcHBsaWNhdGlvbj4NCi0gICAgPCEtLSBVc2UgdGhlIFRyaW5pZGFkIFJlbmRlcktpdCAtLT4NCi0gICAgPGRlZmF1bHQtcmVuZGVyLWtpdC1pZD4NCi0gICAgICBvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuY29yZQ0KLSAgICA8L2RlZmF1bHQtcmVuZGVyLWtpdC1pZD4NCi0gIDwvYXBwbGljYXRpb24+DQotDQotICA8IS0tIEdsb2JhbCBwcmVmZXJlbmNlcyBvYmplY3QgdGhhdCBwcm94aWVzIHRvIG90aGVycyAtLT4NCi0gIDxtYW5hZ2VkLWJlYW4+DQotICAgIDxtYW5hZ2VkLWJlYW4tbmFtZT5oZWxsb1dvcmxkQmFja2luZzwvbWFuYWdlZC1iZWFuLW5hbWU+DQotICAgIDxtYW5hZ2VkLWJlYW4tY2xhc3M+JHtwYWNrYWdlfS5IZWxsb1dvcmxkQmFja2luZzwvbWFuYWdlZC1iZWFuLWNsYXNzPg0KLSAgICA8bWFuYWdlZC1iZWFuLXNjb3BlPnJlcXVlc3Q8L21hbmFnZWQtYmVhbi1zY29wZT4NCi0gIDwvbWFuYWdlZC1iZWFuPg0KLQ0KLSAgPCEtLSBuYXZpZ2F0aW9uIHJ1bGVzIGZvciBpbmRleC5qc3B4IC0tPg0KLSAgPG5hdmlnYXRpb24tcnVsZT4NCi0gICAgPGZyb20tdmlldy1pZD4vaW5kZXguanNweDwvZnJvbS12aWV3LWlkPg0KLSAgICA8bmF2aWdhdGlvbi1jYXNlPg0KLSAgICAgIDxmcm9tLW91dGNvbWU+c3VjY2VzczwvZnJvbS1vdXRjb21lPg0KLSAgICAgIDx0by12aWV3LWlkPi9wYWdlMi5qc3B4PC90by12aWV3LWlkPg0KLSAgICA8L25hdmlnYXRpb24tY2FzZT4NCi0gIDwvbmF2aWdhdGlvbi1ydWxlPg0KLQkNCi0gIDwhLS0gbmF2aWdhdGlvbiBydWxlcyBmb3IgcGFnZTIuanNweCAtLT4NCi0gIDxuYXZpZ2F0aW9uLXJ1bGU+DQotICAgIDxmcm9tLXZpZXctaWQ+L3BhZ2UyLmpzcHg8L2Zyb20tdmlldy1pZD4NCi0gICAgPG5hdmlnYXRpb24tY2FzZT4NCi0gICAgICA8ZnJvbS1vdXRjb21lPmJhY2s8L2Zyb20tb3V0Y29tZT4NCi0gICAgICA8dG8tdmlldy1pZD4vaW5kZXguanNweDwvdG8tdmlldy1pZD4NCi0gICAgPC9uYXZpZ2F0aW9uLWNhc2U+DQotICA8L25hdmlnYXRpb24tcnVsZT4NCi0NCi08L2ZhY2VzLWNvbmZpZz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS10cmluaWRhZC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sIGIvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtdHJpbmlkYWQvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2JjZTNjMy4uMDAwMDAwMAotLS0gYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS10cmluaWRhZC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTEzICswLDAgQEAKLTw/eG1sIHZlcnNpb24gPSAnMS4wJyBlbmNvZGluZyA9ICdJU08tODg1OS0xJz8+DQotPCEtLQ0KLSAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICAgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICAgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gICAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICAgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICAgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gICAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgICB1bmRlciB0aGUgTGljZW5zZS4NCi0JICAgDQotLS0+DQotPHdlYi1hcHAgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUiDQotICAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSINCi0gICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZS93ZWItYXBwXzJfNC54c2QiDQotICAgICAgICAgdmVyc2lvbj0iMi40Ij4NCi0gIDwhLS0gVXNlIGNsaWVudC1zaWRlIHN0YXRlIHNhdmluZy4gIEluIFRyaW5pZGFkLCBpdCBpcyBhbg0KLSAgICAgICBvcHRpbWl6ZWQsIHRva2VuLWJhc2VkIG1lY2hhbmlzbSB0aGF0IGlzIGFsbW9zdCBhbHdheXMgYQ0KLSAgICAgICBiZXR0ZXIgY2hvaWNlIHRoYW4gdGhlIHN0YW5kYXJkIEpTRiBzZXJ2ZXItc2lkZSBzdGF0ZSBzYXZpbmcuIC0tPg0KLSAgPGNvbnRleHQtcGFyYW0+DQotICAgIDxwYXJhbS1uYW1lPmphdmF4LmZhY2VzLlNUQVRFX1NBVklOR19NRVRIT0Q8L3BhcmFtLW5hbWU+DQotICAgIDxwYXJhbS12YWx1ZT5jbGllbnQ8L3BhcmFtLXZhbHVlPg0KLSAgICA8IS0tcGFyYW0tdmFsdWU+c2VydmVyPC9wYXJhbS12YWx1ZS0tPg0KLSAgPC9jb250ZXh0LXBhcmFtPg0KLQ0KLSAgPCEtLSBUcmluaWRhZCBieSBkZWZhdWx0IHVzZXMgYW4gb3B0aW1pemVkIGNsaWVudC1zaWRlIHN0YXRlIHNhdmluZw0KLSAgICAgICBtZWNoYW5pc20uIFRvIGRpc2FibGUgdGhhdCwgdW5jb21tZW50IHRoZSBmb2xsb3dpbmcgLS0+DQotICA8IS0tY29udGV4dC1wYXJhbT4NCi0gICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLkNMSUVOVF9TVEFURV9NRVRIT0Q8L3BhcmFtLW5hbWU+DQotICAgIDxwYXJhbS12YWx1ZT5hbGw8L3BhcmFtLXZhbHVlPg0KLSAgPC9jb250ZXh0LXBhcmFtLS0+DQotDQotICA8IS0tIFRyaW5pZGFkIGFsc28gc3VwcG9ydHMgYW4gb3B0aW1pemVkIHN0cmF0ZWd5IGZvciBjYWNoaW5nIHNvbWUNCi0gICB2aWV3IHN0YXRlIGF0IGFuIGFwcGxpY2F0aW9uIGxldmVsLCB3aGljaCBzaWduaWZpY2FudGx5IGltcHJvdmVzDQotICAgc2NhbGFiaWxpdHkuICBIb3dldmVyLCBpdCBtYWtlcyBpdCBoYXJkZXIgdG8gZGV2ZWxvcCAodXBkYXRlcyB0bw0KLSAgIHBhZ2VzIHdpbGwgbm90IGJlIG5vdGljZWQgdW50aWwgdGhlIHNlcnZlciBpcyByZXN0YXJ0ZWQpLCBhbmQgaW4NCi0gICBzb21lIHJhcmUgY2FzZXMgY2Fubm90IGJlIHVzZWQgZm9yIHNvbWUgcGFnZXMgKHNlZSBUcmluaWRhZA0KLSAgIGRvY3VtZW50YXRpb24gZm9yIG1vcmUgaW5mb3JtYXRpb24pIC0tPg0KLSAgPGNvbnRleHQtcGFyYW0+DQotICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5VU0VfQVBQTElDQVRJT05fVklFV19DQUNIRTwvcGFyYW0tbmFtZT4NCi0gICAgPHBhcmFtLXZhbHVlPmZhbHNlPC9wYXJhbS12YWx1ZT4NCi0gIDwvY29udGV4dC1wYXJhbT4NCi0NCi0gIDwhLS0gSWYgdGhpcyBwYXJhbWV0ZXIgaXMgZW5hYmxlZCwgVHJpbmlkYWQgd2lsbCBhdXRvbWF0aWNhbGx5DQotICAgICAgIGNoZWNrIHRoZSBtb2RpZmljYXRpb24gZGF0ZSBvZiB5b3VyIEpTUHMsIGFuZCBkaXNjYXJkIHNhdmVkDQotICAgICAgIHN0YXRlIHdoZW4gdGhleSBjaGFuZ2U7ICB0aGlzIG1ha2VzIGRldmVsb3BtZW50IGVhc2llciwNCi0gICAgICAgYnV0IGFkZHMgb3ZlcmhlYWQgdGhhdCBzaG91bGQgYmUgYXZvaWRlZCB3aGVuIHlvdXIgYXBwbGljYXRpb24NCi0gICAgICAgaXMgZGVwbG95ZWQgLS0+DQotICA8Y29udGV4dC1wYXJhbT4NCi0gICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLkNIRUNLX0ZJTEVfTU9ESUZJQ0FUSU9OPC9wYXJhbS1uYW1lPg0KLSAgICA8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+DQotICA8L2NvbnRleHQtcGFyYW0+DQotDQotICA8IS0tIEVuYWJsZXMgQ2hhbmdlIFBlcnNpc3RlbmNlIGF0IGEgc2Vzc2lvbiBzY29wZS4gIEJ5IGRlZmF1bHQsDQotICAgICAgIENoYW5nZSBQZXJzaXN0ZW5jZSBpcyBlbnRpcmVseSBkaXNhYmxlZC4gVGhlIENoYW5nZU1hbmFnZXIgaXMNCi0gICAgICAgYW4gQVBJLCB3aGljaCBjYW4gcGVyc2lzdCBjb21wb25lbnQgbW9kaWZpY2F0aW9ucyAobGlrZSwNCi0gICAgICAgaXMgYSBzaG93RGV0YWlsIG9yIHRyZWUgZXhwYW5kZWQgb3IgY29sbGFwc2VkKS4gRm9yIHByb3ZpZGluZw0KLSAgICAgICBhIGN1c3RvbSBDaGFuZ2UgUGVyc2lzdGVuY2UgaW1wbGVtZW50YXRpb24gaW5oZXJpdCBmcm9tIHRoZSANCi0gICAgICAgVHJpbmlkYWQgQVBJJ3MgQ2hhbmdlTWFuYWdlciBjbGFzcy4gQXMgdGhlIHZhbHVlIHlvdSBoYXZlIA0KLSAgICAgICB0byB1c2UgdGhlIGZ1bGxxdWFsaWZpZWQgY2xhc3MgbmFtZS4gLS0+DQotICA8Y29udGV4dC1wYXJhbT4NCi0gICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLkNIQU5HRV9QRVJTSVNURU5DRTwvcGFyYW0tbmFtZT4NCi0gICAgPHBhcmFtLXZhbHVlPnNlc3Npb248L3BhcmFtLXZhbHVlPg0KLSAgPC9jb250ZXh0LXBhcmFtPg0KLQ0KLSAgPGZpbHRlcj4NCi0gICAgPGZpbHRlci1uYW1lPnRyaW5pZGFkPC9maWx0ZXItbmFtZT4NCi0gICAgPGZpbHRlci1jbGFzcz5vcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQud2ViYXBwLlRyaW5pZGFkRmlsdGVyPC9maWx0ZXItY2xhc3M+DQotICA8L2ZpbHRlcj4NCi0NCi0gIDxmaWx0ZXItbWFwcGluZz4NCi0gICAgPGZpbHRlci1uYW1lPnRyaW5pZGFkPC9maWx0ZXItbmFtZT4NCi0gICAgPHNlcnZsZXQtbmFtZT5mYWNlczwvc2VydmxldC1uYW1lPg0KLSAgPC9maWx0ZXItbWFwcGluZz4NCi0NCi0gIDwhLS0gRmFjZXMgU2VydmxldCAtLT4NCi0gIDxzZXJ2bGV0Pg0KLSAgICA8c2VydmxldC1uYW1lPmZhY2VzPC9zZXJ2bGV0LW5hbWU+DQotICAgIDxzZXJ2bGV0LWNsYXNzPmphdmF4LmZhY2VzLndlYmFwcC5GYWNlc1NlcnZsZXQ8L3NlcnZsZXQtY2xhc3M+DQotICA8L3NlcnZsZXQ+DQotICANCi0gIDwhLS0gcmVzb3VyY2UgbG9hZGVyIHNlcnZsZXQgLS0+DQotICA8c2VydmxldD4NCi0gICAgPHNlcnZsZXQtbmFtZT5yZXNvdXJjZXM8L3NlcnZsZXQtbmFtZT4NCi0gICAgPHNlcnZsZXQtY2xhc3M+b3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLndlYmFwcC5SZXNvdXJjZVNlcnZsZXQ8L3NlcnZsZXQtY2xhc3M+DQotICA8L3NlcnZsZXQ+DQotDQotICA8IS0tIEZhY2VzIFNlcnZsZXQgTWFwcGluZ3MgLS0+DQotICA8c2VydmxldC1tYXBwaW5nPg0KLSAgICA8c2VydmxldC1uYW1lPmZhY2VzPC9zZXJ2bGV0LW5hbWU+DQotICAgIDx1cmwtcGF0dGVybj4vZmFjZXMvKjwvdXJsLXBhdHRlcm4+DQotICA8L3NlcnZsZXQtbWFwcGluZz4NCi0gIA0KLSAgPHNlcnZsZXQtbWFwcGluZz4NCi0gICAgPHNlcnZsZXQtbmFtZT5yZXNvdXJjZXM8L3NlcnZsZXQtbmFtZT4NCi0gICAgPHVybC1wYXR0ZXJuPi9hZGYvKjwvdXJsLXBhdHRlcm4+DQotICA8L3NlcnZsZXQtbWFwcGluZz4NCi0NCi0NCi0gIDwhLS0gV2VsY29tZSBGaWxlcyAtLT4NCi0gIDx3ZWxjb21lLWZpbGUtbGlzdD4NCi0gICAgPHdlbGNvbWUtZmlsZT5pbmRleC5qc3A8L3dlbGNvbWUtZmlsZT4NCi0gIDwvd2VsY29tZS1maWxlLWxpc3Q+DQotDQotPC93ZWItYXBwPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLXRyaW5pZGFkL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL3dlYmFwcC9pbmRleC5qc3AgYi9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS10cmluaWRhZC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zcmMvbWFpbi93ZWJhcHAvaW5kZXguanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Mzk5ODdiLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLXRyaW5pZGFkL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL3dlYmFwcC9pbmRleC5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08JS0tCi0gICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICAgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICAgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gICAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICAgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gICAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gICAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gICAgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLSU+Ci08JUAgcGFnZSBzZXNzaW9uPSJmYWxzZSIlPgotPCUKLXJlc3BvbnNlLnNlbmRSZWRpcmVjdCgiZmFjZXMvaW5kZXguanNweCIpOwotJT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS10cmluaWRhZC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zcmMvbWFpbi93ZWJhcHAvaW5kZXguanNweCBiL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLXRyaW5pZGFkL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL3dlYmFwcC9pbmRleC5qc3B4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NDFjN2ViLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLXRyaW5pZGFkL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL3dlYmFwcC9pbmRleC5qc3B4CisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSIgc3RhbmRhbG9uZT0ieWVzIiA/Pg0KLTwhLS0NCi0gICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gICAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gICAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICAgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gICAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi0gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gICAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gICAgdW5kZXIgdGhlIExpY2Vuc2UuDQotCSAgIA0KLS0tPg0KLTxqc3A6cm9vdCB4bWxuczpqc3A9Imh0dHA6Ly9qYXZhLnN1bi5jb20vSlNQL1BhZ2UiIHZlcnNpb249IjIuMCINCi0gICAgICAgICAgeG1sbnM6Zj0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvY29yZSINCi0gICAgICAgICAgeG1sbnM6dHI9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvdHJpbmlkYWQiID4NCi0gIDxqc3A6ZGlyZWN0aXZlLnBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDtjaGFyc2V0PXV0Zi04Ii8+DQotICA8Zjp2aWV3Pg0KLSAgICA8dHI6ZG9jdW1lbnQgdGl0bGU9IkFwYWNoZSBNeUZhY2VzIFRyaW5pZGFkIEFyY2hldHlwZSBEZW1vIj4NCi0gICAgICAgPHRyOmZvcm0+DQotICAgICAgIA0KLSAgICAgICAgPHRyOnBhbmVsUGFnZT4NCi0gICAgICAgICAgPHRyOmlucHV0VGV4dCBsYWJlbD0iWW91ciBuYW1lIiBpZD0iaW5wdXQxIiB2YWx1ZT0iI3toZWxsb1dvcmxkQmFja2luZy5uYW1lfSIgcmVxdWlyZWQ9InRydWUiLz4NCi0gICAgICAgICAgPHRyOmNvbW1hbmRCdXR0b24gaWQ9ImJ1dHRvbjEiIHRleHQ9InByZXNzIG1lIiBhY3Rpb249IiN7aGVsbG9Xb3JsZEJhY2tpbmcuc2VuZH0iIC8+DQotICAgICAgICA8L3RyOnBhbmVsUGFnZT4NCi0gICAgICAgDQotICAgICAgIDwvdHI6Zm9ybT4NCi0gICAgPC90cjpkb2N1bWVudD4NCi0gIDwvZjp2aWV3Pg0KLTwvanNwOnJvb3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtdHJpbmlkYWQvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc3JjL21haW4vd2ViYXBwL3BhZ2UyLmpzcHggYi9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS10cmluaWRhZC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zcmMvbWFpbi93ZWJhcHAvcGFnZTIuanNweApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjNjYWY0NC4uMDAwMDAwMAotLS0gYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS10cmluaWRhZC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zcmMvbWFpbi93ZWJhcHAvcGFnZTIuanNweAorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9Imlzby04ODU5LTEiIHN0YW5kYWxvbmU9InllcyIgPz4NCi08IS0tDQotICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gICAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICAgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICAgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gICAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICAgIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gICAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gICAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICAgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICAgIHVuZGVyIHRoZSBMaWNlbnNlLg0KLQkgICANCi0tLT4NCi08anNwOnJvb3QgeG1sbnM6anNwPSJodHRwOi8vamF2YS5zdW4uY29tL0pTUC9QYWdlIiB2ZXJzaW9uPSIyLjAiDQotICAgICAgICAgIHhtbG5zOmY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2NvcmUiDQotICAgICAgICAgIHhtbG5zOnRyPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL3RyaW5pZGFkIiA+DQotICA8anNwOmRpcmVjdGl2ZS5wYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7Y2hhcnNldD11dGYtOCIvPg0KLSAgPGY6dmlldz4NCi0gICAgPHRyOmRvY3VtZW50IHRpdGxlPSJBcGFjaGUgTXlGYWNlcyBUcmluaWRhZCBBcmNoZXR5cGUgRGVtbyI+DQotICAgICAgIDx0cjpmb3JtPg0KLSAgICAgICANCi0gICAgICAgIDx0cjpwYW5lbFBhZ2U+DQotICAgICAgICAgIDx0cjpvdXRwdXRUZXh0IGlkPSJpbnB1dDEiIHZhbHVlPSJIZWxsbyAje2hlbGxvV29ybGRCYWNraW5nLm5hbWV9LiBXZSBob3BlIHlvdSBlbmpveSBBcGFjaGUgTXlGYWNlcyBUcmluaWRhZCIvPg0KLSAgICAgICAgICA8dHI6Y29tbWFuZExpbmsgaWQ9ImxpbmsiIHRleHQ9IkdPIEhPTUUiIGFjdGlvbj0iYmFjayIgLz4NCi0gICAgICAgIDwvdHI6cGFuZWxQYWdlPg0KLSAgICAgICANCi0gICAgICAgPC90cjpmb3JtPg0KLSAgICA8L3RyOmRvY3VtZW50Pg0KLSAgPC9mOnZpZXc+DQotPC9qc3A6cm9vdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS10cmluaWRhZC9zcmMvc2l0ZS9hcHQvaW5kZXguYXB0IGIvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtdHJpbmlkYWQvc3JjL3NpdGUvYXB0L2luZGV4LmFwdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWY1NmI5NC4uMDAwMDAwMAotLS0gYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS10cmluaWRhZC9zcmMvc2l0ZS9hcHQvaW5kZXguYXB0CisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotIC0tLS0tLQ0KLSBNeWZhY2VzIFRyaW5pZGFkIEFyY2hldHlwZQ0KLSAtLS0tLS0NCi0NCi1PdmVydmlldw0KLQ0KLSAgVGhpcyBwcm9qZWN0IGRlZmluZXMgYSBNYXZlbiBhcmNoZXR5cGUuIFJ1bm5pbmcgdGhlIGFyY2hldHlwZSBwbHVnaW4gd2l0aCB0aGlzIGFyY2hldHlwZSB3aWxsDQotICBjcmVhdGUgYSBkaXJlY3RvcnkgdHJlZSBjb250YWluaW5nIHRoZSBmaWxlcyBuZWVkZWQgdG8gcXVpY2tseSBnZXQgc3RhcnRlZCBvbiBhIG5ldyBKU0YgMS4yDQotICBwcm9qZWN0IHdoaWNoIHVzZXMgTXlGYWNlcyBUcmluaWRhZC4NCi0NCi1Vc2FnZQ0KLQ0KLSAgVXNlIHRoZSBmb2xsb3dpbmcgbWF2ZW4gY29tbWFuZCBhbmQgdGhlbiBzZWxlY3QgbXlmYWNlcy1hcmNoZXR5cGUtdHJpbmlkYWQgZnJvbSB0aGUgb3B0aW9ucy4NCi0NCi0NCi0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKw0KLW12biBhcmNoZXR5cGU6Z2VuZXJhdGUgLURhcmNoZXR5cGVDYXRhbG9nPWh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcNCi0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKw0KZGlmZiAtLWdpdCBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLXRyaW5pZGFkMjAvcG9tLnhtbCBiL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLXRyaW5pZGFkMjAvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjJlMjg4Zi4uMDAwMDAwMAotLS0gYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS10cmluaWRhZDIwL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICAgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gICAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICAgIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICAgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gICAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gICAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gICAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICAgIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4gCi0KLSAgPHBhcmVudD4KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29sczwvZ3JvdXBJZD4KLSAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWFyY2hldHlwZS1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+MS4wLjQtU05BUFNIT1Q8L3ZlcnNpb24+Ci0gIDwvcGFyZW50PgotCi0gIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLSAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHM8L2dyb3VwSWQ+Ci0gIDxhcnRpZmFjdElkPm15ZmFjZXMtYXJjaGV0eXBlLXRyaW5pZGFkMjA8L2FydGlmYWN0SWQ+Ci0gIDxwYWNrYWdpbmc+amFyPC9wYWNrYWdpbmc+Ci0gIDxuYW1lPk15RmFjZXMgVHJpbmlkYWQgMi4wIEFyY2hldHlwZTwvbmFtZT4KLSAgPGRlc2NyaXB0aW9uPkFyY2hldHlwZSB0byBjcmVhdGUgYSBuZXcgd2ViYXBwIGJhc2VkIG9uIFRyaW5pZGFkIGFuZCBKU0YgMi4wPC9kZXNjcmlwdGlvbj4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLXRyaW5pZGFkMjAvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL0xJQ0VOU0UgYi9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS10cmluaWRhZDIwL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9MSUNFTlNFCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjQ1Njk1Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLXRyaW5pZGFkMjAvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL0xJQ0VOU0UKKysrIC9kZXYvbnVsbApAQCAtMSwyMDIgKzAsMCBAQAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNAotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLwotCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04KLQotICAgMS4gRGVmaW5pdGlvbnMuCi0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4KLQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4KLQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbgotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwKLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3IKLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KLQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KLQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLgotCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dAotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLAotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgotCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcgotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLgotCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0Ci0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3NlcwotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLgotCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZwotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucwotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5Ci0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIgotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0Ci0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCi0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLgotCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4KLQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywKLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcgotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcwotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCi0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91Ci0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3IKLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZAotCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kCi0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3JrcwotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQKLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YKLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kCi0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cwotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QKLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QKLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUKLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3IKLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwKLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZAotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUKLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQKLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuCi0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucwotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcgotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgKLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuCi0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwKLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yawotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLgotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4KLQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLAotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KLQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEEKLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55Ci0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuCi0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLAotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwKLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KLQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZwotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwKLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcwotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkKLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkKLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgotCi0gICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKLQotICAgQVBQRU5ESVg6IEhvdyB0byBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLgotCi0gICAgICBUbyBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLCBhdHRhY2ggdGhlIGZvbGxvd2luZwotICAgICAgYm9pbGVycGxhdGUgbm90aWNlLCB3aXRoIHRoZSBmaWVsZHMgZW5jbG9zZWQgYnkgYnJhY2tldHMgIltdIgotICAgICAgcmVwbGFjZWQgd2l0aCB5b3VyIG93biBpZGVudGlmeWluZyBpbmZvcm1hdGlvbi4gKERvbid0IGluY2x1ZGUKLSAgICAgIHRoZSBicmFja2V0cyEpICBUaGUgdGV4dCBzaG91bGQgYmUgZW5jbG9zZWQgaW4gdGhlIGFwcHJvcHJpYXRlCi0gICAgICBjb21tZW50IHN5bnRheCBmb3IgdGhlIGZpbGUgZm9ybWF0LiBXZSBhbHNvIHJlY29tbWVuZCB0aGF0IGEKLSAgICAgIGZpbGUgb3IgY2xhc3MgbmFtZSBhbmQgZGVzY3JpcHRpb24gb2YgcHVycG9zZSBiZSBpbmNsdWRlZCBvbiB0aGUKLSAgICAgIHNhbWUgInByaW50ZWQgcGFnZSIgYXMgdGhlIGNvcHlyaWdodCBub3RpY2UgZm9yIGVhc2llcgotICAgICAgaWRlbnRpZmljYXRpb24gd2l0aGluIHRoaXJkLXBhcnR5IGFyY2hpdmVzLgotCi0gICBDb3B5cmlnaHQgW3l5eXldIFtuYW1lIG9mIGNvcHlyaWdodCBvd25lcl0KLQotICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KZGlmZiAtLWdpdCBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLXRyaW5pZGFkMjAvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL05PVElDRSBiL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLXRyaW5pZGFkMjAvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL05PVElDRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWIyYzJiNS4uMDAwMDAwMAotLS0gYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS10cmluaWRhZDIwL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9OT1RJQ0UKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotPT0gIE5PVElDRSBmaWxlIGNvcnJlc3BvbmRpbmcgdG8gc2VjdGlvbiA0KGQpIG9mIHRoZSBBcGFjaGUgTGljZW5zZSwgICA9PQ0KLT09ICBWZXJzaW9uIDIuMCwgaW4gdGhpcyBjYXNlIGZvciB0aGUgQXBhY2hlIE15RmFjZXMgICAgICAgICAgICAgICAgICAgPT0NCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotDQotVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSANCi1UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLg0KLQ0KLVBvcnRpb25zIG9mIHRoaXMgc29mdHdhcmUgd2VyZSBvcmlnaW5hbGx5IGJhc2VkIG9uIHRoZSBmb2xsb3dpbmc6DQotDQotIC0gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDYsIE9yYWNsZSBDb3JwLCA8aHR0cDovL3d3dy5vcmFjbGUuY29tLz4uDQotYW5kIGFyZSBsaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gdW5kZXIgdGhlIA0KLSJTb2Z0d2FyZSBHcmFudCBhbmQgQ29ycG9yYXRlIENvbnRyaWJ1dGlvbiBMaWNlbnNlIEFncmVlbWVudCINCi0NCi1TZWUgdGhlIExJQ0VOU0UudHh0IGZpbGUgZm9yIGluZm9ybWF0aW9uIG9uIGFsbCBsaWNlbnNlcyANCi1hc3NvY2lhdGVkIHdpdGggdGhpcyBzb2Z0d2FyZS4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS10cmluaWRhZDIwL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9tYXZlbi9hcmNoZXR5cGUtbWV0YWRhdGEueG1sIGIvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtdHJpbmlkYWQyMC9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvbWF2ZW4vYXJjaGV0eXBlLW1ldGFkYXRhLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmE1NWQ5ZC4uMDAwMDAwMAotLS0gYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS10cmluaWRhZDIwL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9tYXZlbi9hcmNoZXR5cGUtbWV0YWRhdGEueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08IS0tDQotICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gICAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICAgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICAgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gICAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICAgIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gICAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gICAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICAgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICAgIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLTxhcmNoZXR5cGUtZGVzY3JpcHRvciB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvcGx1Z2lucy9tYXZlbi1hcmNoZXR5cGUtcGx1Z2luL2FyY2hldHlwZS1kZXNjcmlwdG9yLzEuMC4wIg0KLSAgICAgICAgICAgICAgICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIg0KLSAgICAgICAgICAgICAgICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3BsdWdpbnMvbWF2ZW4tYXJjaGV0eXBlLXBsdWdpbi9hcmNoZXR5cGUtZGVzY3JpcHRvci8xLjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvYXJjaGV0eXBlLWRlc2NyaXB0b3ItMS4wLjAueHNkIg0KLQ0KLSAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJteWZhY2VzLWFyY2hldHlwZS10cmluaWRhZDIwIiBwYXJ0aWFsPSJmYWxzZSI+DQotDQotICA8cmVxdWlyZWRQcm9wZXJ0aWVzLz4NCi0NCi0gIDxmaWxlU2V0cz4NCi0gICAgICA8ZmlsZVNldCBmaWx0ZXJlZD0idHJ1ZSIgcGFja2FnZWQ9InRydWUiPg0KLSAgICAgICAgICA8ZGlyZWN0b3J5PnNyYy9tYWluL2phdmEvPC9kaXJlY3Rvcnk+DQotICAgICAgPC9maWxlU2V0Pg0KLSAgICAgIDxmaWxlU2V0IGZpbHRlcmVkPSJmYWxzZSIgcGFja2FnZWQ9ImZhbHNlIj4NCi0gICAgICAgICAgPGRpcmVjdG9yeT5zcmMvbWFpbi93ZWJhcHAvPC9kaXJlY3Rvcnk+DQotICAgICAgPC9maWxlU2V0Pg0KLSAgICAgIDxmaWxlU2V0IGZpbHRlcmVkPSJmYWxzZSIgcGFja2FnZWQ9ImZhbHNlIj4NCi0gICAgICAgICAgPGRpcmVjdG9yeT5zcmMvbWFpbi9sb2c0ai88L2RpcmVjdG9yeT4NCi0gICAgICA8L2ZpbGVTZXQ+DQotICA8L2ZpbGVTZXRzPg0KLQ0KLSAgPG1vZHVsZXMvPg0KLQ0KLTwvYXJjaGV0eXBlLWRlc2NyaXB0b3I+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtdHJpbmlkYWQyMC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9wb20ueG1sIGIvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtdHJpbmlkYWQyMC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMmIzZmEzLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLXRyaW5pZGFkMjAvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE2NCArMCwwIEBACi0jc2V0KCAkc3ltYm9sX3BvdW5kID0gJyMnICkNCi0jc2V0KCAkc3ltYm9sX2RvbGxhciA9ICckJyApDQotI3NldCggJHN5bWJvbF9lc2NhcGUgPSAnXCcgKQ0KLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPCEtLQ0KLSAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICAgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICAgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gICAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICAgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICAgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gICAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgICB1bmRlciB0aGUgTGljZW5zZS4NCi0JICAgDQotLS0+DQotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCINCi0gICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIg0KLSAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPg0KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+DQotICAgIDxncm91cElkPiR7Z3JvdXBJZH08L2dyb3VwSWQ+DQotICAgIDxhcnRpZmFjdElkPiR7YXJ0aWZhY3RJZH08L2FydGlmYWN0SWQ+DQotICAgIDxwYWNrYWdpbmc+d2FyPC9wYWNrYWdpbmc+DQotICAgIDx2ZXJzaW9uPiR7dmVyc2lvbn08L3ZlcnNpb24+DQotICAgIDxuYW1lPkEgY3VzdG9tIHByb2plY3QgdXNpbmcgbXlmYWNlcyAyLjAgd2l0aCB0cmluaWRhZDwvbmFtZT4NCi0gICAgPHVybD5odHRwOi8vd3d3Lm15b3JnYW5pemF0aW9uLm9yZzwvdXJsPg0KLQ0KLSAgICA8cHJvcGVydGllcz4NCi0gICAgICAgIDxqc2YtbXlmYWNlcy52ZXJzaW9uPjIuMC41PC9qc2YtbXlmYWNlcy52ZXJzaW9uPg0KLSAgICAgICAgPGpzZi1tb2phcnJhLnZlcnNpb24+Mi4wLjUtYjAyPC9qc2YtbW9qYXJyYS52ZXJzaW9uPg0KLSAgICAgICAgPHRyaW5pZGFkLnZlcnNpb24+Mi4wLjAtYmV0YS0yPC90cmluaWRhZC52ZXJzaW9uPiAgICAgICAgDQotICAgICAgICA8bWF2ZW4uamV0dHkucGx1Z2luLnZlcnNpb24+Ni4xLjIyPC9tYXZlbi5qZXR0eS5wbHVnaW4udmVyc2lvbj4NCi0gICAgPC9wcm9wZXJ0aWVzPg0KLSAgICANCi0gICAgPGJ1aWxkPg0KLSAgICAgICAgPGZpbmFsTmFtZT4ke2FydGlmYWN0SWR9PC9maW5hbE5hbWU+DQotICAgICAgICA8cGx1Z2lucz4NCi0gICAgICAgICAgICA8cGx1Z2luPg0KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+DQotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWNvbXBpbGVyLXBsdWdpbjwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgICAgICAgICAgICA8c291cmNlPjEuNTwvc291cmNlPg0KLSAgICAgICAgICAgICAgICAgICAgPHRhcmdldD4xLjU8L3RhcmdldD4NCi0gICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPg0KLSAgICAgICAgICAgIDwvcGx1Z2luPg0KLSAgICAgICAgPC9wbHVnaW5zPiAgICANCi0gICAgPC9idWlsZD4NCi0gICAgDQotICAgIDxwcm9maWxlcz4NCi0gICAgICAgIDxwcm9maWxlPg0KLSAgICAgICAgICAgIDxpZD5teWZhY2VzPC9pZD4NCi0gICAgICAgICAgICA8YWN0aXZhdGlvbj4NCi0gICAgICAgICAgICAgICAgPHByb3BlcnR5Pg0KLSAgICAgICAgICAgICAgICAgICAgPG5hbWU+IWpzZjwvbmFtZT4NCi0gICAgICAgICAgICAgICAgPC9wcm9wZXJ0eT4NCi0gICAgICAgICAgICA8L2FjdGl2YXRpb24+DQotICAgICAgICAgICAgPGRlcGVuZGVuY2llcz4NCi0gICAgICAgICAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuY29yZTwvZ3JvdXBJZD4NCi0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtYXBpPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtzeW1ib2xfZG9sbGFyfXtqc2YtbXlmYWNlcy52ZXJzaW9ufTwvdmVyc2lvbj4NCi0gICAgICAgICAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4NCi0gICAgICAgICAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5jb3JlPC9ncm91cElkPg0KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1pbXBsPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtzeW1ib2xfZG9sbGFyfXtqc2YtbXlmYWNlcy52ZXJzaW9ufTwvdmVyc2lvbj4NCi0gICAgICAgICAgICAgICAgICAgIDxzY29wZT5ydW50aW1lPC9zY29wZT4NCi0gICAgICAgICAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDwvZGVwZW5kZW5jaWVzPg0KLSAgICAgICAgPC9wcm9maWxlPg0KLSAgICAgICAgPHByb2ZpbGU+DQotICAgICAgICAgICAgPCEtLSBBY3RpdmUgYWRkaW5nIC1EanNmPW1vamFycmEgd2hlbiBleGVjdXRlIG1hdmVuIGdvYWxzLiAtLT4NCi0gICAgICAgICAgICA8aWQ+anNmLXJpPC9pZD4NCi0gICAgICAgICAgICA8YWN0aXZhdGlvbj4NCi0gICAgICAgICAgICAgICAgPHByb3BlcnR5Pg0KLSAgICAgICAgICAgICAgICAgICAgPG5hbWU+anNmPC9uYW1lPg0KLSAgICAgICAgICAgICAgICAgICAgPHZhbHVlPm1vamFycmE8L3ZhbHVlPg0KLSAgICAgICAgICAgICAgICA8L3Byb3BlcnR5Pg0KLSAgICAgICAgICAgIDwvYWN0aXZhdGlvbj4NCi0gICAgICAgICAgICA8ZGVwZW5kZW5jaWVzPg0KLSAgICAgICAgICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPmNvbS5zdW4uZmFjZXM8L2dyb3VwSWQ+DQotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qc2YtYXBpPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtzeW1ib2xfZG9sbGFyfXtqc2YtbW9qYXJyYS52ZXJzaW9ufTwvdmVyc2lvbj4NCi0gICAgICAgICAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4NCi0gICAgICAgICAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPmNvbS5zdW4uZmFjZXM8L2dyb3VwSWQ+DQotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qc2YtaW1wbDwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7c3ltYm9sX2RvbGxhcn17anNmLW1vamFycmEudmVyc2lvbn08L3ZlcnNpb24+DQotICAgICAgICAgICAgICAgICAgICA8c2NvcGU+cnVudGltZTwvc2NvcGU+DQotICAgICAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8L2RlcGVuZGVuY2llcz4NCi0gICAgICAgICAgICA8cmVwb3NpdG9yaWVzPg0KLSAgICAgICAgICAgICAgICA8cmVwb3NpdG9yeT4NCi0gICAgICAgICAgICAgICAgICAgIDxpZD5qYXZhLm5ldDwvaWQ+DQotICAgICAgICAgICAgICAgICAgICA8dXJsPmh0dHA6Ly9kb3dubG9hZC5qYXZhLm5ldC9tYXZlbi8xPC91cmw+DQotICAgICAgICAgICAgICAgICAgICA8bGF5b3V0PmxlZ2FjeTwvbGF5b3V0Pg0KLSAgICAgICAgICAgICAgICA8L3JlcG9zaXRvcnk+DQotICAgICAgICAgICAgPC9yZXBvc2l0b3JpZXM+DQotICAgICAgICA8L3Byb2ZpbGU+DQotICAgICAgICANCi0gICAgICAgIDxwcm9maWxlPg0KLSAgICAgICAgICAgIDwhLS0gVXNlIG12biBjbGVhbiBqZXR0eTpydW4tZXhwbG9kZWQgLVBqZXR0eUNvbmZpZyB0byBydW4gd2l0aCBqZXR0eSAtLT4NCi0gICAgICAgICAgICA8aWQ+amV0dHlDb25maWc8L2lkPg0KLSAgICAgICAgICAgIDxidWlsZD4NCi0gICAgICAgICAgICAgICAgPHBsdWdpbnM+DQotICAgICAgICAgICAgICAgICAgICA8cGx1Z2luPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDwhLS1UaGlzIHBsdWdpbiBhbGxvd3MgdG8gcnVuIHRoZSB3YXIgdXNpbmcgbXZuIGpldHR5OnJ1biAtLT4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcubW9ydGJheS5qZXR0eTwvZ3JvdXBJZD4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1qZXR0eS1wbHVnaW48L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtzeW1ib2xfZG9sbGFyfXttYXZlbi5qZXR0eS5wbHVnaW4udmVyc2lvbn08L3ZlcnNpb24+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzY2FuSW50ZXJ2YWxTZWNvbmRzPjEwPC9zY2FuSW50ZXJ2YWxTZWNvbmRzPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgICAgICAgICAgIDwvcGx1Z2luPg0KLSAgICAgICAgICAgICAgICA8L3BsdWdpbnM+DQotICAgICAgICAgICAgPC9idWlsZD4NCi0gICAgICAgIDwvcHJvZmlsZT4NCi0gICAgPC9wcm9maWxlcz4NCi0NCi0gICAgPCEtLSBQcm9qZWN0IGRlcGVuZGVuY2llcyAtLT4NCi0gICAgPGRlcGVuZGVuY2llcz4NCi0gICAgICAgIA0KLSAgICAgICAgPCEtLSBBcGFjaGUgVHJpbmlkYWQgLS0+DQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQ8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+dHJpbmlkYWQtYXBpPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7c3ltYm9sX2RvbGxhcn17dHJpbmlkYWQudmVyc2lvbn08L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLSAgICAgICAgDQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQ8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+dHJpbmlkYWQtaW1wbDwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4ke3N5bWJvbF9kb2xsYXJ9e3RyaW5pZGFkLnZlcnNpb259PC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDxzY29wZT5ydW50aW1lPC9zY29wZT4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0gICAgICAgIA0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAJPGdyb3VwSWQ+amF2YXguc2VydmxldDwvZ3JvdXBJZD4NCi0gICAgICAgIAk8YXJ0aWZhY3RJZD5qc3RsPC9hcnRpZmFjdElkPg0KLSAgICAgICAgCTx2ZXJzaW9uPjEuMjwvdmVyc2lvbj4NCi0gICAgICAgIAk8c2NvcGU+cnVudGltZTwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotICAgICAgICANCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPmp1bml0PC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmp1bml0PC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPjQuOC4xPC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0gICAgICAgIA0KLSAgICA8L2RlcGVuZGVuY2llcz4NCi0NCi08L3Byb2plY3Q+DQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtdHJpbmlkYWQyMC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zcmMvbWFpbi9qYXZhL0hlbGxvV29ybGRCYWNraW5nLmphdmEgYi9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS10cmluaWRhZDIwL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL2phdmEvSGVsbG9Xb3JsZEJhY2tpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjUwOWU2OS4uMDAwMDAwMAotLS0gYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS10cmluaWRhZDIwL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL2phdmEvSGVsbG9Xb3JsZEJhY2tpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgJHBhY2thZ2U7Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5iZWFuLk1hbmFnZWRCZWFuOwotaW1wb3J0IGphdmF4LmZhY2VzLmJlYW4uUmVxdWVzdFNjb3BlZDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5yZW5kZXIuRXh0ZW5kZWRSZW5kZXJLaXRTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC51dGlsLlNlcnZpY2U7Ci0KLS8qKgotICogQSB0eXBpY2FsIHNpbXBsZSBiYWNraW5nIGJlYW4sIHRoYXQgaXMgYmFja2VkIHRvIDxjb2RlPmhlbGxvd29ybGQuanNwPC9jb2RlPgotICogCi0gKi8KLUBNYW5hZ2VkQmVhbihuYW1lID0gImhlbGxvV29ybGRCYWNraW5nIikKLUBSZXF1ZXN0U2NvcGVkCi1wdWJsaWMgY2xhc3MgSGVsbG9Xb3JsZEJhY2tpbmcKLXsKLQotICAvL3Byb3BlcnRpZXMKLSAgcHJpdmF0ZSBTdHJpbmcgX25hbWU7Ci0KLSAgLyoqCi0gICAqIGRlZmF1bHQgZW1wdHkgY29uc3RydWN0b3IKLSAgICovCi0gIHB1YmxpYyBIZWxsb1dvcmxkQmFja2luZygpCi0gIHsgICAKLSAgfQotCi0gIC8vLS0tLS0tLS0tLS0tLS0tLS0tLWdldHRlciAmIHNldHRlcgotICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKQotICB7Ci0gICAgcmV0dXJuIF9uYW1lOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkKLSAgewotICAgIHRoaXMuX25hbWUgPSBuYW1lOwotICB9Ci0KLSAgLyoqCi0gICAqIE1ldGhvZCB0aGF0IGlzIGJhY2tlZCB0byBhIHN1Ym1pdCBidXR0b24gb2YgYSBmb3JtLgotICAgKi8KLSAgcHVibGljIFN0cmluZyBzZW5kKCkKLSAgewotICAgIEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQgPSBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCk7Ci0gICAgRXh0ZW5kZWRSZW5kZXJLaXRTZXJ2aWNlIHNlcnZpY2UgPSAoRXh0ZW5kZWRSZW5kZXJLaXRTZXJ2aWNlKQotICAgICAgU2VydmljZS5nZXRSZW5kZXJLaXRTZXJ2aWNlKGZhY2VzQ29udGV4dCwgRXh0ZW5kZWRSZW5kZXJLaXRTZXJ2aWNlLmNsYXNzKTsKLSAgICBzZXJ2aWNlLmFkZFNjcmlwdChmYWNlc0NvbnRleHQsICJhbGVydCgnU2NyaXB0IGFkZGVkIGJ5IEV4dGVuZGVkUmVuZGVyS2l0U2VydmljZScpIik7Ci0KLSAgICAvL2RvIHJlYWwgbG9naWMKLSAgICByZXR1cm4gKCJzdWNjZXNzIik7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS10cmluaWRhZDIwL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL2ZhY2VzLWNvbmZpZy54bWwgYi9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS10cmluaWRhZDIwL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL2ZhY2VzLWNvbmZpZy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4YjViNGUuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtdHJpbmlkYWQyMC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9mYWNlcy1jb25maWcueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+DQotPCEtLQ0KLSAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICAgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICAgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gICAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICAgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICAgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gICAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgICB1bmRlciB0aGUgTGljZW5zZS4NCi0JICAgDQotLS0+DQotPGZhY2VzLWNvbmZpZyB2ZXJzaW9uPSIyLjAiIA0KLSAgICB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIg0KLSAgICB4bWxuczp4aT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YSW5jbHVkZSINCi0gICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgDQotICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS93ZWItZmFjZXNjb25maWdfMV8yLnhzZCI+DQotICANCi0gIDxhcHBsaWNhdGlvbj4NCi0gICAgPCEtLSBVc2UgdGhlIFRyaW5pZGFkIFJlbmRlcktpdCAtLT4NCi0gICAgPGRlZmF1bHQtcmVuZGVyLWtpdC1pZD4NCi0gICAgICBvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuY29yZQ0KLSAgICA8L2RlZmF1bHQtcmVuZGVyLWtpdC1pZD4NCi0gIDwvYXBwbGljYXRpb24+DQotDQotICA8IS0tIG5hdmlnYXRpb24gcnVsZXMgZm9yIGluZGV4LmpzcHggLS0+DQotICA8bmF2aWdhdGlvbi1ydWxlPg0KLSAgICA8ZnJvbS12aWV3LWlkPi9pbmRleC5qc3B4PC9mcm9tLXZpZXctaWQ+DQotICAgIDxuYXZpZ2F0aW9uLWNhc2U+DQotICAgICAgPGZyb20tb3V0Y29tZT5zdWNjZXNzPC9mcm9tLW91dGNvbWU+DQotICAgICAgPHRvLXZpZXctaWQ+L3BhZ2UyLmpzcHg8L3RvLXZpZXctaWQ+DQotICAgIDwvbmF2aWdhdGlvbi1jYXNlPg0KLSAgPC9uYXZpZ2F0aW9uLXJ1bGU+DQotCQ0KLSAgPCEtLSBuYXZpZ2F0aW9uIHJ1bGVzIGZvciBwYWdlMi5qc3B4IC0tPg0KLSAgPG5hdmlnYXRpb24tcnVsZT4NCi0gICAgPGZyb20tdmlldy1pZD4vcGFnZTIuanNweDwvZnJvbS12aWV3LWlkPg0KLSAgICA8bmF2aWdhdGlvbi1jYXNlPg0KLSAgICAgIDxmcm9tLW91dGNvbWU+YmFjazwvZnJvbS1vdXRjb21lPg0KLSAgICAgIDx0by12aWV3LWlkPi9pbmRleC5qc3B4PC90by12aWV3LWlkPg0KLSAgICA8L25hdmlnYXRpb24tY2FzZT4NCi0gIDwvbmF2aWdhdGlvbi1ydWxlPg0KLQ0KLTwvZmFjZXMtY29uZmlnPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLXRyaW5pZGFkMjAvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbCBiL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLXRyaW5pZGFkMjAvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzgzYjBhOC4uMDAwMDAwMAotLS0gYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS10cmluaWRhZDIwL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMjEgKzAsMCBAQAotPD94bWwgdmVyc2lvbiA9ICcxLjAnIGVuY29kaW5nID0gJ0lTTy04ODU5LTEnPz4NCi08IS0tDQotICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gICAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICAgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICAgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gICAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICAgIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gICAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gICAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICAgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICAgIHVuZGVyIHRoZSBMaWNlbnNlLg0KLQkgICANCi0tLT4NCi08d2ViLWFwcCB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZSINCi0gICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIg0KLSAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZSBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlL3dlYi1hcHBfMl80LnhzZCINCi0gICAgICAgICB2ZXJzaW9uPSIyLjQiPg0KLQ0KLSAgPGNvbnRleHQtcGFyYW0+DQotICAgIDxkZXNjcmlwdGlvbj5Qcm9qZWN0IHN0YWdlIGZvciB0aGUgYXBwbGljYXRpb24gKG5ldyBpbiAyLjApLiBFeHBlY3RzIG9uZSBvZg0KLSAgICAgIHRoZSBmb2xsb3dpbmcgdmFsdWVzOiBEZXZlbG9wbWVudCwgUHJvZHVjdGlvbiwgU3lzdGVtVGVzdCwgVW5pdFRlc3QNCi0gICAgPC9kZXNjcmlwdGlvbj4NCi0gICAgPHBhcmFtLW5hbWU+amF2YXguZmFjZXMuUFJPSkVDVF9TVEFHRTwvcGFyYW0tbmFtZT4NCi0gICAgPHBhcmFtLXZhbHVlPkRldmVsb3BtZW50PC9wYXJhbS12YWx1ZT4NCi0gIDwvY29udGV4dC1wYXJhbT4NCi0gIDwhLS0gVXNlIGNsaWVudC1zaWRlIHN0YXRlIHNhdmluZy4gIEluIFRyaW5pZGFkLCBpdCBpcyBhbg0KLSAgICAgICBvcHRpbWl6ZWQsIHRva2VuLWJhc2VkIG1lY2hhbmlzbSB0aGF0IGlzIGFsbW9zdCBhbHdheXMgYQ0KLSAgICAgICBiZXR0ZXIgY2hvaWNlIHRoYW4gdGhlIHN0YW5kYXJkIEpTRiBzZXJ2ZXItc2lkZSBzdGF0ZSBzYXZpbmcuIC0tPg0KLSAgPGNvbnRleHQtcGFyYW0+DQotICAgIDxwYXJhbS1uYW1lPmphdmF4LmZhY2VzLlNUQVRFX1NBVklOR19NRVRIT0Q8L3BhcmFtLW5hbWU+DQotICAgIDxwYXJhbS12YWx1ZT5jbGllbnQ8L3BhcmFtLXZhbHVlPg0KLSAgICA8IS0tcGFyYW0tdmFsdWU+c2VydmVyPC9wYXJhbS12YWx1ZS0tPg0KLSAgPC9jb250ZXh0LXBhcmFtPg0KLQ0KLSAgPCEtLSBUcmluaWRhZCBieSBkZWZhdWx0IHVzZXMgYW4gb3B0aW1pemVkIGNsaWVudC1zaWRlIHN0YXRlIHNhdmluZw0KLSAgICAgICBtZWNoYW5pc20uIFRvIGRpc2FibGUgdGhhdCwgdW5jb21tZW50IHRoZSBmb2xsb3dpbmcgLS0+DQotICA8IS0tY29udGV4dC1wYXJhbT4NCi0gICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLkNMSUVOVF9TVEFURV9NRVRIT0Q8L3BhcmFtLW5hbWU+DQotICAgIDxwYXJhbS12YWx1ZT5hbGw8L3BhcmFtLXZhbHVlPg0KLSAgPC9jb250ZXh0LXBhcmFtLS0+DQotDQotICA8IS0tIFRyaW5pZGFkIGFsc28gc3VwcG9ydHMgYW4gb3B0aW1pemVkIHN0cmF0ZWd5IGZvciBjYWNoaW5nIHNvbWUNCi0gICB2aWV3IHN0YXRlIGF0IGFuIGFwcGxpY2F0aW9uIGxldmVsLCB3aGljaCBzaWduaWZpY2FudGx5IGltcHJvdmVzDQotICAgc2NhbGFiaWxpdHkuICBIb3dldmVyLCBpdCBtYWtlcyBpdCBoYXJkZXIgdG8gZGV2ZWxvcCAodXBkYXRlcyB0bw0KLSAgIHBhZ2VzIHdpbGwgbm90IGJlIG5vdGljZWQgdW50aWwgdGhlIHNlcnZlciBpcyByZXN0YXJ0ZWQpLCBhbmQgaW4NCi0gICBzb21lIHJhcmUgY2FzZXMgY2Fubm90IGJlIHVzZWQgZm9yIHNvbWUgcGFnZXMgKHNlZSBUcmluaWRhZA0KLSAgIGRvY3VtZW50YXRpb24gZm9yIG1vcmUgaW5mb3JtYXRpb24pIC0tPg0KLSAgPGNvbnRleHQtcGFyYW0+DQotICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5VU0VfQVBQTElDQVRJT05fVklFV19DQUNIRTwvcGFyYW0tbmFtZT4NCi0gICAgPHBhcmFtLXZhbHVlPmZhbHNlPC9wYXJhbS12YWx1ZT4NCi0gIDwvY29udGV4dC1wYXJhbT4NCi0NCi0gIDwhLS0gSWYgdGhpcyBwYXJhbWV0ZXIgaXMgZW5hYmxlZCwgVHJpbmlkYWQgd2lsbCBhdXRvbWF0aWNhbGx5DQotICAgICAgIGNoZWNrIHRoZSBtb2RpZmljYXRpb24gZGF0ZSBvZiB5b3VyIEpTUHMsIGFuZCBkaXNjYXJkIHNhdmVkDQotICAgICAgIHN0YXRlIHdoZW4gdGhleSBjaGFuZ2U7ICB0aGlzIG1ha2VzIGRldmVsb3BtZW50IGVhc2llciwNCi0gICAgICAgYnV0IGFkZHMgb3ZlcmhlYWQgdGhhdCBzaG91bGQgYmUgYXZvaWRlZCB3aGVuIHlvdXIgYXBwbGljYXRpb24NCi0gICAgICAgaXMgZGVwbG95ZWQgLS0+DQotICA8Y29udGV4dC1wYXJhbT4NCi0gICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLkNIRUNLX0ZJTEVfTU9ESUZJQ0FUSU9OPC9wYXJhbS1uYW1lPg0KLSAgICA8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+DQotICA8L2NvbnRleHQtcGFyYW0+DQotDQotICA8IS0tIEVuYWJsZXMgQ2hhbmdlIFBlcnNpc3RlbmNlIGF0IGEgc2Vzc2lvbiBzY29wZS4gIEJ5IGRlZmF1bHQsDQotICAgICAgIENoYW5nZSBQZXJzaXN0ZW5jZSBpcyBlbnRpcmVseSBkaXNhYmxlZC4gVGhlIENoYW5nZU1hbmFnZXIgaXMNCi0gICAgICAgYW4gQVBJLCB3aGljaCBjYW4gcGVyc2lzdCBjb21wb25lbnQgbW9kaWZpY2F0aW9ucyAobGlrZSwNCi0gICAgICAgaXMgYSBzaG93RGV0YWlsIG9yIHRyZWUgZXhwYW5kZWQgb3IgY29sbGFwc2VkKS4gRm9yIHByb3ZpZGluZw0KLSAgICAgICBhIGN1c3RvbSBDaGFuZ2UgUGVyc2lzdGVuY2UgaW1wbGVtZW50YXRpb24gaW5oZXJpdCBmcm9tIHRoZSANCi0gICAgICAgVHJpbmlkYWQgQVBJJ3MgQ2hhbmdlTWFuYWdlciBjbGFzcy4gQXMgdGhlIHZhbHVlIHlvdSBoYXZlIA0KLSAgICAgICB0byB1c2UgdGhlIGZ1bGxxdWFsaWZpZWQgY2xhc3MgbmFtZS4gLS0+DQotICA8Y29udGV4dC1wYXJhbT4NCi0gICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLkNIQU5HRV9QRVJTSVNURU5DRTwvcGFyYW0tbmFtZT4NCi0gICAgPHBhcmFtLXZhbHVlPnNlc3Npb248L3BhcmFtLXZhbHVlPg0KLSAgPC9jb250ZXh0LXBhcmFtPg0KLQ0KLSAgPGZpbHRlcj4NCi0gICAgPGZpbHRlci1uYW1lPnRyaW5pZGFkPC9maWx0ZXItbmFtZT4NCi0gICAgPGZpbHRlci1jbGFzcz5vcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQud2ViYXBwLlRyaW5pZGFkRmlsdGVyPC9maWx0ZXItY2xhc3M+DQotICA8L2ZpbHRlcj4NCi0NCi0gIDxmaWx0ZXItbWFwcGluZz4NCi0gICAgPGZpbHRlci1uYW1lPnRyaW5pZGFkPC9maWx0ZXItbmFtZT4NCi0gICAgPHNlcnZsZXQtbmFtZT5mYWNlczwvc2VydmxldC1uYW1lPg0KLSAgPC9maWx0ZXItbWFwcGluZz4NCi0NCi0gIDwhLS0gRmFjZXMgU2VydmxldCAtLT4NCi0gIDxzZXJ2bGV0Pg0KLSAgICA8c2VydmxldC1uYW1lPmZhY2VzPC9zZXJ2bGV0LW5hbWU+DQotICAgIDxzZXJ2bGV0LWNsYXNzPmphdmF4LmZhY2VzLndlYmFwcC5GYWNlc1NlcnZsZXQ8L3NlcnZsZXQtY2xhc3M+DQotICA8L3NlcnZsZXQ+DQotICANCi0gIDwhLS0gcmVzb3VyY2UgbG9hZGVyIHNlcnZsZXQgLS0+DQotICA8c2VydmxldD4NCi0gICAgPHNlcnZsZXQtbmFtZT5yZXNvdXJjZXM8L3NlcnZsZXQtbmFtZT4NCi0gICAgPHNlcnZsZXQtY2xhc3M+b3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLndlYmFwcC5SZXNvdXJjZVNlcnZsZXQ8L3NlcnZsZXQtY2xhc3M+DQotICA8L3NlcnZsZXQ+DQotDQotICA8IS0tIEZhY2VzIFNlcnZsZXQgTWFwcGluZ3MgLS0+DQotICA8c2VydmxldC1tYXBwaW5nPg0KLSAgICA8c2VydmxldC1uYW1lPmZhY2VzPC9zZXJ2bGV0LW5hbWU+DQotICAgIDx1cmwtcGF0dGVybj4vZmFjZXMvKjwvdXJsLXBhdHRlcm4+DQotICA8L3NlcnZsZXQtbWFwcGluZz4NCi0gIA0KLSAgPHNlcnZsZXQtbWFwcGluZz4NCi0gICAgPHNlcnZsZXQtbmFtZT5yZXNvdXJjZXM8L3NlcnZsZXQtbmFtZT4NCi0gICAgPHVybC1wYXR0ZXJuPi9hZGYvKjwvdXJsLXBhdHRlcm4+DQotICA8L3NlcnZsZXQtbWFwcGluZz4NCi0NCi0NCi0gIDwhLS0gV2VsY29tZSBGaWxlcyAtLT4NCi0gIDx3ZWxjb21lLWZpbGUtbGlzdD4NCi0gICAgPHdlbGNvbWUtZmlsZT5pbmRleC5qc3A8L3dlbGNvbWUtZmlsZT4NCi0gIDwvd2VsY29tZS1maWxlLWxpc3Q+DQotDQotPC93ZWItYXBwPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLXRyaW5pZGFkMjAvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc3JjL21haW4vd2ViYXBwL2luZGV4LmpzcCBiL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLXRyaW5pZGFkMjAvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc3JjL21haW4vd2ViYXBwL2luZGV4LmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjM5OTg3Yi4uMDAwMDAwMAotLS0gYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS10cmluaWRhZDIwL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL3dlYmFwcC9pbmRleC5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08JS0tCi0gICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICAgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICAgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gICAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICAgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gICAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gICAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gICAgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLSU+Ci08JUAgcGFnZSBzZXNzaW9uPSJmYWxzZSIlPgotPCUKLXJlc3BvbnNlLnNlbmRSZWRpcmVjdCgiZmFjZXMvaW5kZXguanNweCIpOwotJT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS10cmluaWRhZDIwL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL3dlYmFwcC9pbmRleC5qc3B4IGIvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtdHJpbmlkYWQyMC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zcmMvbWFpbi93ZWJhcHAvaW5kZXguanNweApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjQxYzdlYi4uMDAwMDAwMAotLS0gYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS10cmluaWRhZDIwL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL3dlYmFwcC9pbmRleC5qc3B4CisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSIgc3RhbmRhbG9uZT0ieWVzIiA/Pg0KLTwhLS0NCi0gICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gICAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gICAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICAgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gICAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi0gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gICAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gICAgdW5kZXIgdGhlIExpY2Vuc2UuDQotCSAgIA0KLS0tPg0KLTxqc3A6cm9vdCB4bWxuczpqc3A9Imh0dHA6Ly9qYXZhLnN1bi5jb20vSlNQL1BhZ2UiIHZlcnNpb249IjIuMCINCi0gICAgICAgICAgeG1sbnM6Zj0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvY29yZSINCi0gICAgICAgICAgeG1sbnM6dHI9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvdHJpbmlkYWQiID4NCi0gIDxqc3A6ZGlyZWN0aXZlLnBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDtjaGFyc2V0PXV0Zi04Ii8+DQotICA8Zjp2aWV3Pg0KLSAgICA8dHI6ZG9jdW1lbnQgdGl0bGU9IkFwYWNoZSBNeUZhY2VzIFRyaW5pZGFkIEFyY2hldHlwZSBEZW1vIj4NCi0gICAgICAgPHRyOmZvcm0+DQotICAgICAgIA0KLSAgICAgICAgPHRyOnBhbmVsUGFnZT4NCi0gICAgICAgICAgPHRyOmlucHV0VGV4dCBsYWJlbD0iWW91ciBuYW1lIiBpZD0iaW5wdXQxIiB2YWx1ZT0iI3toZWxsb1dvcmxkQmFja2luZy5uYW1lfSIgcmVxdWlyZWQ9InRydWUiLz4NCi0gICAgICAgICAgPHRyOmNvbW1hbmRCdXR0b24gaWQ9ImJ1dHRvbjEiIHRleHQ9InByZXNzIG1lIiBhY3Rpb249IiN7aGVsbG9Xb3JsZEJhY2tpbmcuc2VuZH0iIC8+DQotICAgICAgICA8L3RyOnBhbmVsUGFnZT4NCi0gICAgICAgDQotICAgICAgIDwvdHI6Zm9ybT4NCi0gICAgPC90cjpkb2N1bWVudD4NCi0gIDwvZjp2aWV3Pg0KLTwvanNwOnJvb3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtdHJpbmlkYWQyMC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zcmMvbWFpbi93ZWJhcHAvcGFnZTIuanNweCBiL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLXRyaW5pZGFkMjAvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc3JjL21haW4vd2ViYXBwL3BhZ2UyLmpzcHgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzY2FmNDQuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtdHJpbmlkYWQyMC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zcmMvbWFpbi93ZWJhcHAvcGFnZTIuanNweAorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9Imlzby04ODU5LTEiIHN0YW5kYWxvbmU9InllcyIgPz4NCi08IS0tDQotICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gICAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICAgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICAgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gICAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICAgIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gICAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gICAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICAgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICAgIHVuZGVyIHRoZSBMaWNlbnNlLg0KLQkgICANCi0tLT4NCi08anNwOnJvb3QgeG1sbnM6anNwPSJodHRwOi8vamF2YS5zdW4uY29tL0pTUC9QYWdlIiB2ZXJzaW9uPSIyLjAiDQotICAgICAgICAgIHhtbG5zOmY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2NvcmUiDQotICAgICAgICAgIHhtbG5zOnRyPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL3RyaW5pZGFkIiA+DQotICA8anNwOmRpcmVjdGl2ZS5wYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7Y2hhcnNldD11dGYtOCIvPg0KLSAgPGY6dmlldz4NCi0gICAgPHRyOmRvY3VtZW50IHRpdGxlPSJBcGFjaGUgTXlGYWNlcyBUcmluaWRhZCBBcmNoZXR5cGUgRGVtbyI+DQotICAgICAgIDx0cjpmb3JtPg0KLSAgICAgICANCi0gICAgICAgIDx0cjpwYW5lbFBhZ2U+DQotICAgICAgICAgIDx0cjpvdXRwdXRUZXh0IGlkPSJpbnB1dDEiIHZhbHVlPSJIZWxsbyAje2hlbGxvV29ybGRCYWNraW5nLm5hbWV9LiBXZSBob3BlIHlvdSBlbmpveSBBcGFjaGUgTXlGYWNlcyBUcmluaWRhZCIvPg0KLSAgICAgICAgICA8dHI6Y29tbWFuZExpbmsgaWQ9ImxpbmsiIHRleHQ9IkdPIEhPTUUiIGFjdGlvbj0iYmFjayIgLz4NCi0gICAgICAgIDwvdHI6cGFuZWxQYWdlPg0KLSAgICAgICANCi0gICAgICAgPC90cjpmb3JtPg0KLSAgICA8L3RyOmRvY3VtZW50Pg0KLSAgPC9mOnZpZXc+DQotPC9qc3A6cm9vdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS10cmluaWRhZDIwL3NyYy9zaXRlL2FwdC9pbmRleC5hcHQgYi9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS10cmluaWRhZDIwL3NyYy9zaXRlL2FwdC9pbmRleC5hcHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjNGQzMmMuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtdHJpbmlkYWQyMC9zcmMvc2l0ZS9hcHQvaW5kZXguYXB0CisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotIC0tLS0tLQ0KLSBNeWZhY2VzIDIuMCBUcmluaWRhZCBBcmNoZXR5cGUNCi0gLS0tLS0tDQotDQotT3ZlcnZpZXcNCi0NCi0gIFRoaXMgcHJvamVjdCBkZWZpbmVzIGEgTWF2ZW4gYXJjaGV0eXBlLiBSdW5uaW5nIHRoZSBhcmNoZXR5cGUgcGx1Z2luIHdpdGggdGhpcyBhcmNoZXR5cGUgd2lsbA0KLSAgY3JlYXRlIGEgZGlyZWN0b3J5IHRyZWUgY29udGFpbmluZyB0aGUgZmlsZXMgbmVlZGVkIHRvIHF1aWNrbHkgZ2V0IHN0YXJ0ZWQgb24gYSBuZXcgSlNGIDIuMA0KLSAgcHJvamVjdCB3aGljaCB1c2VzIE15RmFjZXMgVHJpbmlkYWQuDQotDQotVXNhZ2UNCi0NCi0gIFVzZSB0aGUgZm9sbG93aW5nIG1hdmVuIGNvbW1hbmQgYW5kIHRoZW4gc2VsZWN0IG15ZmFjZXMtYXJjaGV0eXBlLXRyaW5pZGFkMjAgZnJvbSB0aGUgb3B0aW9ucy4NCi0NCi0NCi0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKw0KLW12biBhcmNoZXR5cGU6Z2VuZXJhdGUgLURhcmNoZXR5cGVDYXRhbG9nPWh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcNCi0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKw0KZGlmZiAtLWdpdCBhL21hdmVuMi1hcmNoZXR5cGVzL3BvbS54bWwgYi9tYXZlbjItYXJjaGV0eXBlcy9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjN2MyY2I1Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1hcmNoZXR5cGVzL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMzQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLSAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gICAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gICAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gICAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICAgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICAgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICAgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgICB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08IS0tCi0gIC0gVGhlIGFyY2hldHlwZXMgcHJvamVjdCBkZWZpbmVzIGEgc2V0IG9mIG1hdmVuIGFyY2hldHlwZSBwbHVnaW5zIHRoYXQgY2FuIGJlCi0gIC0gdXNlZCB0byBjcmVhdGUgYW4gaW5pdGlhbCBkaXJlY3RvcnkgdHJlZSBvZiBmaWxlcyB3aGVuIHN0YXJ0aW5nIGEgbmV3IEpTRgotICAtIHByb2plY3QuCi0gIC0KLSAgLSBUaGlzIHBvbSBpcyB1c2VkOgotICAtICogYXMgdGhlIHBhcmVudCBwb20gZm9yIGFsbCBpbmRpdmlkdWFsIGFyY2hldHlwZSBtb2R1bGVzLCB0byBkZWZpbmUgY29tbW9uIHNldHRpbmdzCi0gIC0gKiB0byBkZWZpbmUgdGhlIGNvbW1vbiBhcmNoZXR5cGUgd2Vic2l0ZQotICAtICogYXMgYSBjb252ZW5pZW50IHRvb2wgZm9yIGJ1aWxkaW5nIGFsbCB0aGUgYXJjaGV0eXBlIHByb2plY3RzLgotICAtLT4KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgotICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0KLSAgPHBhcmVudD4KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXM8L2dyb3VwSWQ+Ci0gICAgPGFydGlmYWN0SWQ+bXlmYWNlczwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj4xMDwvdmVyc2lvbj4KLSAgPC9wYXJlbnQ+Ci0KLSAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHM8L2dyb3VwSWQ+Ci0gIDxhcnRpZmFjdElkPm15ZmFjZXMtYXJjaGV0eXBlLXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgPHZlcnNpb24+MS4wLjQtU05BUFNIT1Q8L3ZlcnNpb24+Ci0gIDxwYWNrYWdpbmc+cG9tPC9wYWNrYWdpbmc+Ci0gIDxuYW1lPkFwYWNoZSBNeUZhY2VzIEJ1aWxkdG9vbHMgTWF2ZW4yIEFyY2hldHlwZSBQYXJlbnQ8L25hbWU+Ci0gIDx1cmw+aHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9idWlsZC10b29scy9hcmNoZXR5cGVzLzwvdXJsPgotCi0gIDxpc3N1ZU1hbmFnZW1lbnQ+Ci0gICAgPHN5c3RlbT5qaXJhPC9zeXN0ZW0+Ci0gICAgPHVybD5odHRwOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvTVlGQUNFUzwvdXJsPgotICA8L2lzc3VlTWFuYWdlbWVudD4KLQotICA8Y2lNYW5hZ2VtZW50PgotICAgIDxzeXN0ZW0+Y29udGludXVtPC9zeXN0ZW0+Ci0gICAgPHVybD5odHRwOi8vbXlmYWNlcy56b25lcy5hcGFjaGUub3JnOjgwODAvY29udGludXVtPC91cmw+Ci0gICAgPG5vdGlmaWVycz4KLSAgICAgIDxub3RpZmllcj4KLSAgICAgICAgPHR5cGU+bWFpbDwvdHlwZT4KLSAgICAgICAgPHNlbmRPblN1Y2Nlc3M+dHJ1ZTwvc2VuZE9uU3VjY2Vzcz4KLSAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgPGFkZHJlc3M+Y29tbWl0c0BteWZhY2VzLmFwYWNoZS5vcmc8L2FkZHJlc3M+Ci0gICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgIDwvbm90aWZpZXI+Ci0gICAgPC9ub3RpZmllcnM+Ci0gIDwvY2lNYW5hZ2VtZW50PgotCi0gIDxpbmNlcHRpb25ZZWFyPjIwMDg8L2luY2VwdGlvblllYXI+Ci0KLSAgPGJ1aWxkPgotICAgIDxyZXNvdXJjZXM+Ci0gICAgICA8cmVzb3VyY2U+Ci0gICAgICAgIDxkaXJlY3Rvcnk+JHtiYXNlZGlyfTwvZGlyZWN0b3J5PgotICAgICAgICA8dGFyZ2V0UGF0aD5NRVRBLUlORjwvdGFyZ2V0UGF0aD4KLSAgICAgICAgPGluY2x1ZGVzPgotICAgICAgICAgIDxpbmNsdWRlPk5PVElDRS50eHQ8L2luY2x1ZGU+Ci0gICAgICAgICAgPGluY2x1ZGU+TElDRU5TRS50eHQ8L2luY2x1ZGU+Ci0gICAgICAgIDwvaW5jbHVkZXM+Ci0gICAgICA8L3Jlc291cmNlPgotICAgICAgPHJlc291cmNlPgotICAgICAgICA8ZGlyZWN0b3J5PiR7YmFzZWRpcn0vc3JjL21haW4vcmVzb3VyY2VzPC9kaXJlY3Rvcnk+Ci0gICAgICA8L3Jlc291cmNlPgotICAgIDwvcmVzb3VyY2VzPgotICA8L2J1aWxkPgotCi0gIDxyZXBvcnRpbmc+Ci0gICAgPHBsdWdpbnM+Ci0gICAgICA8cGx1Z2luPgotICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1wcm9qZWN0LWluZm8tcmVwb3J0cy1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgIDx2ZXJzaW9uPjIuMjwvdmVyc2lvbj4KLSAgICAgIDwvcGx1Z2luPgotICAgICAgPHBsdWdpbj4KLSAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tcG1kLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPHZlcnNpb24+Mi41PC92ZXJzaW9uPgotICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICA8cnVsZXNldHM+Ci0gICAgICAgICAgICA8cnVsZXNldD4vcnVsZXNldHMvYmFzaWMueG1sPC9ydWxlc2V0PgotICAgICAgICAgICAgPHJ1bGVzZXQ+L3J1bGVzZXRzL3VudXNlZGNvZGUueG1sPC9ydWxlc2V0PgotICAgICAgICAgIDwvcnVsZXNldHM+Ci0gICAgICAgICAgPGxpbmtYcmVmPnRydWU8L2xpbmtYcmVmPgotICAgICAgICAgIDxtaW5pbXVtVG9rZW5zPjEwMDwvbWluaW11bVRva2Vucz4KLSAgICAgICAgICA8dGFyZ2V0SmRrPjEuNTwvdGFyZ2V0SmRrPgotICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICA8L3BsdWdpbj4KLSAgICA8L3BsdWdpbnM+Ci0gIDwvcmVwb3J0aW5nPgotCi0gIDxzY20+Ci0gICAgPGNvbm5lY3Rpb24+c2NtOnN2bjpodHRwOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL215ZmFjZXMvbXlmYWNlcy1idWlsZC10b29scy90cnVuay9tYXZlbjItYXJjaGV0eXBlcy88L2Nvbm5lY3Rpb24+Ci0gICAgPGRldmVsb3BlckNvbm5lY3Rpb24+c2NtOnN2bjpodHRwczovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9teWZhY2VzL215ZmFjZXMtYnVpbGQtdG9vbHMvdHJ1bmsvbWF2ZW4yLWFyY2hldHlwZXMvPC9kZXZlbG9wZXJDb25uZWN0aW9uPgotICAgIDx1cmw+aHR0cDovL3N2bi5hcGFjaGUub3JnL3ZpZXd2Yy9teWZhY2VzL215ZmFjZXMtYnVpbGQtdG9vbHMvdHJ1bmsvbWF2ZW4yLWFyY2hldHlwZXMvPC91cmw+Ci0gIDwvc2NtPgotCi0gIDxtb2R1bGVzPgotICAgIDxtb2R1bGU+bXlmYWNlcy1hcmNoZXR5cGUtaGVsbG93b3JsZDwvbW9kdWxlPgotICAgIDxtb2R1bGU+bXlmYWNlcy1hcmNoZXR5cGUtaGVsbG93b3JsZDIwPC9tb2R1bGU+Ci0gICAgPG1vZHVsZT5teWZhY2VzLWFyY2hldHlwZS1oZWxsb3dvcmxkMjAtb3diPC9tb2R1bGU+Ci0gICAgPG1vZHVsZT5teWZhY2VzLWFyY2hldHlwZS1oZWxsb3dvcmxkLWZhY2VsZXRzPC9tb2R1bGU+Ci0gICAgPG1vZHVsZT5teWZhY2VzLWFyY2hldHlwZS1oZWxsb3dvcmxkLXBvcnRsZXRzPC9tb2R1bGU+Ci0gICAgPG1vZHVsZT5teWZhY2VzLWFyY2hldHlwZS10cmluaWRhZDwvbW9kdWxlPgotICAgIDxtb2R1bGU+bXlmYWNlcy1hcmNoZXR5cGUtdHJpbmlkYWQyMDwvbW9kdWxlPiAgCi0gICAgPG1vZHVsZT5teWZhY2VzLWFyY2hldHlwZS1qc2Zjb21wb25lbnRzPC9tb2R1bGU+Ci0gICAgPG1vZHVsZT5teWZhY2VzLWFyY2hldHlwZS1qc2Zjb21wb25lbnRzMjA8L21vZHVsZT4KLSAgICA8bW9kdWxlPm15ZmFjZXMtYXJjaGV0eXBlLWNvZGktanNmMTI8L21vZHVsZT4KLSAgICA8bW9kdWxlPm15ZmFjZXMtYXJjaGV0eXBlLWNvZGktanNmMjA8L21vZHVsZT4KLSAgICA8bW9kdWxlPm15ZmFjZXMtYXJjaGV0eXBlLWNvcmUtaW50ZWdyYXRpb24tdGVzdDwvbW9kdWxlPgotICA8L21vZHVsZXM+Ci0KLSAgPGRpc3RyaWJ1dGlvbk1hbmFnZW1lbnQ+Ci0gICAgPHNpdGU+Ci0gICAgICA8aWQ+YXBhY2hlLndlYnNpdGU8L2lkPgotICAgICAgPHVybD5zY3BleGU6Ly9wZW9wbGUuYXBhY2hlLm9yZy93d3cvbXlmYWNlcy5hcGFjaGUub3JnL2J1aWxkLXRvb2xzL2FyY2hldHlwZXM8L3VybD4KLSAgICA8L3NpdGU+Ci0gIDwvZGlzdHJpYnV0aW9uTWFuYWdlbWVudD4KLQotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvbWF2ZW4yLWFyY2hldHlwZXMvc3JjL3NpdGUvYXB0L2luZGV4LmFwdCBiL21hdmVuMi1hcmNoZXR5cGVzL3NyYy9zaXRlL2FwdC9pbmRleC5hcHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkNDU4NGIuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLWFyY2hldHlwZXMvc3JjL3NpdGUvYXB0L2luZGV4LmFwdAorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLSAtLS0tLS0KLSBNeWZhY2VzIEFyY2hldHlwZXMKLSAtLS0tLS0KLQotT3ZlcnZpZXcKLQotICBUaGUgYXJjaGV0eXBlIHN1YnByb2plY3RzIGRlZmluZSBNYXZlbiBhcmNoZXR5cGVzIHRoYXQgY2FuIGJ1aWxkIGEgZGlyZWN0b3J5IHRyZWUgY29udGFpbmluZwotICB0aGUgZmlsZXMgbmVlZGVkIHRvIHF1aWNrbHkgZ2V0IHN0YXJ0ZWQgb24gYSBuZXcgSlNGIHByb2plY3QuCi0KLSAgRGlmZmVyZW50IGFyY2hldHlwZXMgY3JlYXRlIGRpZmZlcmVudCBpbml0aWFsIHNldHVwcywgc3VjaCBhcyBpbmNsdWRpbmcgZGlmZmVyZW50IGxpYnJhcmllcwotICBpbiB0aGUgY3JlYXRlZCBwb20ueG1sIGZpbGUsIGFuZCBhZGRpbmcgZGlmZmVyZW50IGNvbmZpZ3VyYXRpb24gdG8gdGhlIGNyZWF0ZWQgd2ViLnhtbCBmaWxlLgotCi1BcmNoZXR5cGVzCi0KLSogSGVsbG9Xb3JsZCAyLjAgQmFzaWMgQXJjaGV0eXBlCi0KLSAgU2V0cyB1cCBhIHdlYmFwcCBwcm9qZWN0IHRoYXQgdXNlcyBNeUZhY2VzIENvcmUgMi4wLnggd2l0aCBGYWNlbGV0cyBhcyB0aGUgcGFnZSB0ZW1wbGF0aW5nCi0gIHN5c3RlbS4KLQotKiBIZWxsb1dvcmxkIDIuMCBPcGVuV2ViQmVhbnMgQXJjaGV0eXBlCi0KLSAgU2V0cyB1cCBhIHdlYmFwcCBwcm9qZWN0IHRoYXQgdXNlcyBNeUZhY2VzIENvcmUgMi4wLnggd2l0aCBGYWNlbGV0cyBhcyB0aGUgcGFnZSB0ZW1wbGF0aW5nCi0gIHN5c3RlbS4gVXNlcyBKU1ItMjk5L0pTUi0zMzAgYW5ub3RhdGlvbnMgZm9yIG1hbmFnZWQgYmVhbiBkZWZpbml0aW9uIHdpdGggQXBhY2hlCi0gIE9wZW5XZWJCZWFucyBhcyB0aGUgQ0RJIGltcGxlbWVudGF0aW9uLgotCi0qIEhlbGxvV29ybGQgQmFzaWMgQXJjaGV0eXBlCi0KLSAgU2V0cyB1cCBhIHdlYmFwcCBwcm9qZWN0IHRoYXQgdXNlcyBNeUZhY2VzIENvcmUgMS4yLnggd2l0aCBKU1AgYXMgdGhlIHBhZ2UgdGVtcGxhdGluZyBzeXN0ZW0uCi0gIFRoZSB3ZWJhcHAgY29udGFpbnMgYSBzaW5nbGUgLmpzcCBmaWxlIGlzIGNyZWF0ZWQgd2hpY2ggcmVuZGVycyBhbiBIVE1MIHBhZ2Ugc2F5aW5nIAotICAiaGVsbG8gd29ybGQiLgotCi0qIEhlbGxvV29ybGQtRmFjZWxldHMgQXJjaGV0eXBlCi0KLSAgQXMgZm9yIHRoZSBIZWxsb1dvcmxkIGFyY2hldHlwZSwgYnV0IGNvbmZpZ3VyZWQgdG8gdXNlIHRoZSBGYWNlbGV0cyBwYWdlIHRlbXBsYXRpbmcgc3lzdGVtLgotCi0qIEhlbGxvV29ybGQtUG9ydGxldCBBcmNoZXR5cGUKLQotICBTZXRzIHVwIGEgc2ltcGxlIHBvcnRsZXQtZW5hYmxlZCB3ZWJhcHAuCi0KLSogVHJpbmlkYWQgQXJjaGV0eXBlCi0KLSAgU2V0cyB1cCBhIHdlYmFwcCB0aGF0IHVzZXMgTXlGYWNlcyBDb3JlIDEuMi54IGFuZCBNeUZhY2VzIFRyaW5pZGFkLgotCi0qIFRyaW5pZGFkIDIuMCBBcmNoZXR5cGUKLQotICBTZXRzIHVwIGEgd2ViYXBwIHRoYXQgdXNlcyBNeUZhY2VzIENvcmUgMi4wLnggYW5kIE15RmFjZXMgVHJpbmlkYWQgMi4wLgotCi0qIEpTRi1Db21wb25lbnQgTGlicmFyeSBBcmNoZXR5cGUKLQotICBTZXRzIHVwIGEgcHJvamVjdCB0aGF0IGlzIGludGVuZGVkIHRvIGRlZmluZSBuZXcgSlNGIGNvbXBvbmVudHMgKHJhdGhlciB0aGFuIGp1c3QgdXNlIHRoZW0pLgotICBJZiB5b3Ugd2FudCB0byBjcmVhdGUgYSBqYXIgdGhhdCBkZWZpbmVzIGEgc2V0IG9mIG5ldyBjdXN0b20gSlNGIGNvbXBvbmVudHMgdGhlbiB0aGlzCi0gIGFyY2hldHlwZSBpcyBhIGdvb2Qgc3RhcnRpbmcgcG9pbnQuCi0KLSogQ09ESSBKU0YgMi4wIEFyY2hldHlwZQotCi0gIFNldHMgdXAgYSBuZXcgSlNGIDIuMCBwcm9qZWN0IHVzaW5nIE15RmFjZXMgQ09ESSBhbmQgQXBhY2hlIE9wZW5XZWJCZWFucy4KLQotKiBDT0RJIEpTRiAxLjIgQXJjaGV0eXBlCi0KLSAgU2V0cyB1cCBhIG5ldyBKU0YgMS4yIHByb2plY3QgdXNpbmcgTXlGYWNlcyBDT0RJIGFuZCBBcGFjaGUgT3BlbldlYkJlYW5zLgpkaWZmIC0tZ2l0IGEvbWF2ZW4yLWFyY2hldHlwZXMvc3JjL3NpdGUvc2l0ZS54bWwgYi9tYXZlbjItYXJjaGV0eXBlcy9zcmMvc2l0ZS9zaXRlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmFlYjQ2Zi4uMDAwMDAwMAotLS0gYS9tYXZlbjItYXJjaGV0eXBlcy9zcmMvc2l0ZS9zaXRlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IklTTy04ODU5LTEiPz4KLTwhLS0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08cHJvamVjdCBuYW1lPSJBcGFjaGUgTXlGYWNlcyBCdWlsZHRvb2xzIEFyY2hldHlwZXMiPgotICA8YmFubmVyTGVmdD4KLSAgICA8bmFtZT5BcGFjaGUgTXlGYWNlczwvbmFtZT4KLSAgICA8c3JjPmltZy9iYW5uZXJzL015RmFjZXNfbG9nby5qcGc8L3NyYz4KLSAgICA8aHJlZj5odHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2luZGV4Lmh0bWw8L2hyZWY+Ci0gIDwvYmFubmVyTGVmdD4KLQotICA8YmFubmVyUmlnaHQ+Ci0gICAgPG5hbWU+QXBhY2hlIEJhbm5lcjwvbmFtZT4KLSAgICA8c3JjPmltZy9iYW5uZXJzL2FwYWNoZV9iYW5uZXIucG5nPC9zcmM+Ci0gICAgPGhyZWY+aHR0cDovL3d3dy5hcGFjaGUub3JnLzwvaHJlZj4KLSAgPC9iYW5uZXJSaWdodD4gIAotCi0gIDxwdWJsaXNoRGF0ZSBmb3JtYXQ9ImRkIE1NTSB5eXl5Ii8+Ci0KLSAgPHNraW4+Ci0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLm1hdmVuPC9ncm91cElkPgotICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtc2l0ZS1za2luPC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjI8L3ZlcnNpb24+Ci0gIDwvc2tpbj4KLQotICA8Ym9keT4KLSAgICA8bGlua3M+Ci0gICAgICA8aXRlbSBuYW1lPSJBcGFjaGUiIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZyIvPgotICAgICAgPGl0ZW0gbmFtZT0iTXlGYWNlcyIgaHJlZj0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9pbmRleC5odG1sIi8+Ci0gICAgPC9saW5rcz4KLQotICAgIDxtZW51IG5hbWU9IkFwYWNoZSBNeUZhY2VzIiBpbmhlcml0PSJ0b3AiPgotICAgICAgPGl0ZW0gbmFtZT0iT3ZlcnZpZXciICAgICAgIGhyZWY9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvaW5kZXguaHRtbCIvPgotICAgICAgPGl0ZW0gbmFtZT0iRG93bmxvYWQiICAgICAgIGhyZWY9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvZG93bmxvYWQuaHRtbCIvPgotICAgIDwvbWVudT4KLQotICAgIDxtZW51IG5hbWU9IkRvY3VtZW50YXRpb24iPgotICAgICAgPGl0ZW0gbmFtZT0iQWJvdXQiICAgICAgICAgaHJlZj0iaW5kZXguaHRtbCIvPgotICAgIDwvbWVudT4KLQotICAgIDxtZW51IHJlZj0ibW9kdWxlcyIgaW5oZXJpdD0idG9wIi8+Ci0KLSAgICA8bWVudSByZWY9InJlcG9ydHMiLz4KLQotICAgIDxtZW51IG5hbWU9IkZvdW5kYXRpb24iIGluaGVyaXQ9ImJvdHRvbSI+Ci0gICAgICA8aXRlbSBuYW1lPSJBU0YiICAgICAgICAgICAgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnLyIgLz4KLSAgICAgIDxpdGVtIG5hbWU9IlNwb25zb3JzaGlwIiAgICBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZm91bmRhdGlvbi9zcG9uc29yc2hpcC5odG1sIiAvPgotICAgICAgPGl0ZW0gbmFtZT0iVGhhbmtzIiAgICAgICAgIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9mb3VuZGF0aW9uL3RoYW5rcy5odG1sIiAvPgotICAgIDwvbWVudT4KLSAgPC9ib2R5PgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLWFubm90YXRpb25zL0xJQ0VOU0UudHh0IGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLWFubm90YXRpb25zL0xJQ0VOU0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjQ1Njk1Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1hbm5vdGF0aW9ucy9MSUNFTlNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDIwMiArMCwwIEBACi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0Ci0gICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvCi0KLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTgotCi0gICAxLiBEZWZpbml0aW9ucy4KLQotICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwKLSAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgotCi0gICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgotCi0gICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsCi0gICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCi0gICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLAotICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlCi0gICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgotICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlCi0gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5LgotCi0gICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLgotCi0gICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywKLSAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24KLSAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCi0KLSAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsCi0gICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0Ci0gICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sCi0gICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuCi0KLSAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yCi0gICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhCi0gICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKLSAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuCi0KLSAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKLSAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUKLSAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMKLSAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCi0gICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4KLSAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwKLSAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCi0KLSAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nCi0gICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCi0gICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkKLSAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIKLSAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgotICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiCi0gICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50Ci0gICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bwotICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywKLSAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlCi0gICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKLSAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlCi0gICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiIKLQotICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKLSAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZAotICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCi0KLSAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKLSAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLAotICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCi0gICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLgotCi0gICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKLSAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLAotICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUKLSAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCi0gICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpCi0gICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQotICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKLSAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsKLSAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0Ci0gICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCi0gICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUKLSAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4KLQotICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUKLSAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dAotICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKLSAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotCi0gICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgotICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kCi0KLSAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKLSAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQKLQotICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCi0gICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZAotICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssCi0gICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgotICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQKLQotICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCi0gICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdAotICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZAotICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAotICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQotICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkCi0gICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgotICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLAotICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQKLSAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKLSAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kCi0gICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24KLSAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQotICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZAotICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZAotICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KLQotICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kCi0gICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCi0gICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yCi0gICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwKLSAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAotICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4KLQotICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAotICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrCi0gICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCi0gICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5Ci0gICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZAotICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgotCi0gICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlCi0gICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCi0gICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUKLSAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLgotCi0gICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IKLSAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gKLSAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucwotICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQotICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlCi0gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkKLSAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KLQotICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksCi0gICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKLSAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5Ci0gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQotICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAotICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhCi0gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlCi0gICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCi0gICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbAotICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcgotICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgotCi0gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nCi0gICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAotICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwKLSAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzCi0gICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQotICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYKLSAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwKLSAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQotICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbgotICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuCi0KLSAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUwotCi0gICBBUFBFTkRJWDogSG93IHRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmsuCi0KLSAgICAgIFRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmssIGF0dGFjaCB0aGUgZm9sbG93aW5nCi0gICAgICBib2lsZXJwbGF0ZSBub3RpY2UsIHdpdGggdGhlIGZpZWxkcyBlbmNsb3NlZCBieSBicmFja2V0cyAiW10iCi0gICAgICByZXBsYWNlZCB3aXRoIHlvdXIgb3duIGlkZW50aWZ5aW5nIGluZm9ybWF0aW9uLiAoRG9uJ3QgaW5jbHVkZQotICAgICAgdGhlIGJyYWNrZXRzISkgIFRoZSB0ZXh0IHNob3VsZCBiZSBlbmNsb3NlZCBpbiB0aGUgYXBwcm9wcmlhdGUKLSAgICAgIGNvbW1lbnQgc3ludGF4IGZvciB0aGUgZmlsZSBmb3JtYXQuIFdlIGFsc28gcmVjb21tZW5kIHRoYXQgYQotICAgICAgZmlsZSBvciBjbGFzcyBuYW1lIGFuZCBkZXNjcmlwdGlvbiBvZiBwdXJwb3NlIGJlIGluY2x1ZGVkIG9uIHRoZQotICAgICAgc2FtZSAicHJpbnRlZCBwYWdlIiBhcyB0aGUgY29weXJpZ2h0IG5vdGljZSBmb3IgZWFzaWVyCi0gICAgICBpZGVudGlmaWNhdGlvbiB3aXRoaW4gdGhpcmQtcGFydHkgYXJjaGl2ZXMuCi0KLSAgIENvcHlyaWdodCBbeXl5eV0gW25hbWUgb2YgY29weXJpZ2h0IG93bmVyXQotCi0gICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLWFubm90YXRpb25zL05PVElDRS50eHQgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItYW5ub3RhdGlvbnMvTk9USUNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmEzZGJkNi4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItYW5ub3RhdGlvbnMvTk9USUNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLT09ICBOT1RJQ0UgZmlsZSBjb3JyZXNwb25kaW5nIHRvIHNlY3Rpb24gNChkKSBvZiB0aGUgQXBhY2hlIExpY2Vuc2UsICAgPT0KLT09ICBWZXJzaW9uIDIuMCwgaW4gdGhpcyBjYXNlIGZvciB0aGUgQXBhY2hlIE15RmFjZXMgTWF2ZW4gUGx1Z2lucyAgICAgPT0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSAKLVRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuCi0KLVBvcnRpb25zIG9mIHRoaXMgc29mdHdhcmUgd2VyZSBvcmlnaW5hbGx5IGJhc2VkIG9uIHRoZSBmb2xsb3dpbmc6Ci0KLSAtIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDA2LCBPcmFjbGUgQ29ycCwgPGh0dHA6Ly93d3cub3JhY2xlLmNvbS8+LgotYW5kIGFyZSBsaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gdW5kZXIgdGhlIAotIlNvZnR3YXJlIEdyYW50IGFuZCBDb3Jwb3JhdGUgQ29udHJpYnV0aW9uIExpY2Vuc2UgQWdyZWVtZW50IgotCi1TZWUgdGhlIExJQ0VOU0UudHh0IGZpbGUgZm9yIGluZm9ybWF0aW9uIG9uIGFsbCBsaWNlbnNlcyAKLWFzc29jaWF0ZWQgd2l0aCB0aGlzIHNvZnR3YXJlLgpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLWFubm90YXRpb25zL3BvbS54bWwgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItYW5ub3RhdGlvbnMvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDkzMjhhNi4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItYW5ub3RhdGlvbnMvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPiAKLQotICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0KLSAgPHBhcmVudD4KLSAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzPC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1wbHVnaW4tcGFyZW50PC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+MS4wLjU8L3ZlcnNpb24+Ci0gICAgICA8cmVsYXRpdmVQYXRoPi4uL215ZmFjZXMtcGx1Z2luLXBhcmVudC9wb20ueG1sPC9yZWxhdGl2ZVBhdGg+Ci0gIDwvcGFyZW50PgotCi0gIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzPC9ncm91cElkPgotICA8YXJ0aWZhY3RJZD5teWZhY2VzLWJ1aWxkZXItYW5ub3RhdGlvbnM8L2FydGlmYWN0SWQ+IAotICA8dmVyc2lvbj4xLjAuOS1TTkFQU0hPVDwvdmVyc2lvbj4KLSAgPHBhY2thZ2luZz5qYXI8L3BhY2thZ2luZz4KLSAgPG5hbWU+QXBhY2hlIE15RmFjZXMgQnVpbGR0b29scyBNYXZlbjIgQnVpbGRlciBBbm5vdGF0aW9uczwvbmFtZT4KLQotICA8ZGVzY3JpcHRpb24+Ci0gICAgQSBzZXQgb2YgSmF2YSAxLjUgQW5ub3RhdGlvbiBjbGFzc2VzIHRoYXQgY2FuIGJlIGFwcGxpZWQgdG8gY2xhc3NlcyB0aGF0IGFyZQotICAgIGludGVuZGVkIHRvIGJlIEpTRiBjb21wb25lbnRzLCB2YWxpZGF0b3JzLCBldGMuIFRoZSBtYXZlbi1idWlsZGVyLXBsdWdpbiB3aWxsCi0gICAgcmVjb2duaXNlIHRoZXNlIGFubm90YXRpb25zIGFuZCBwcm9jZXNzIHRoZSBjbGFzcyBhcHByb3ByaWF0ZWx5LgotICA8L2Rlc2NyaXB0aW9uPgotICAKLSAgPHNjbT4KLSAgICA8Y29ubmVjdGlvbj5zY206c3ZuOmh0dHA6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvbXlmYWNlcy9teWZhY2VzLWJ1aWxkLXRvb2xzL3RydW5rL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1hbm5vdGF0aW9uczwvY29ubmVjdGlvbj4KLSAgICA8ZGV2ZWxvcGVyQ29ubmVjdGlvbj5zY206c3ZuOmh0dHBzOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL215ZmFjZXMvbXlmYWNlcy1idWlsZC10b29scy90cnVuay9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItYW5ub3RhdGlvbnM8L2RldmVsb3BlckNvbm5lY3Rpb24+Ci0gICAgPHVybD5odHRwOi8vc3ZuLmFwYWNoZS5vcmcvdmlld3ZjL215ZmFjZXMvbXlmYWNlcy1idWlsZC10b29scy90cnVuay9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItYW5ub3RhdGlvbnM8L3VybD4KLSAgPC9zY20+Ci0KLSAgPGJ1aWxkPgotICAgIDxwbHVnaW5zPgotICAgICAgPHBsdWdpbj4KLSAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY29tcGlsZXItcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj4yLjAuMjwvdmVyc2lvbj4KLSAgICAgICAgPGluaGVyaXRlZD50cnVlPC9pbmhlcml0ZWQ+Ci0gICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgIDxzb3VyY2U+MS41PC9zb3VyY2U+Ci0gICAgICAgICAgPHRhcmdldD4xLjU8L3RhcmdldD4KLSAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgPC9wbHVnaW4+Ci0gICAgPC9wbHVnaW5zPgotICA8L2J1aWxkPgotCi0gIDxyZXBvcnRpbmc+Ci0gICAgPHBsdWdpbnM+Ci0gICAgICA8cGx1Z2luPgotICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1qYXZhZG9jLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPHZlcnNpb24+Mi4zPC92ZXJzaW9uPgotICAgICAgPC9wbHVnaW4+Ci0gICAgPC9wbHVnaW5zPgotICA8L3JlcG9ydGluZz4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1hbm5vdGF0aW9ucy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9hbm5vdGF0aW9uL0pTRkJlaGF2aW9yLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItYW5ub3RhdGlvbnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvYW5ub3RhdGlvbi9KU0ZCZWhhdmlvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNGIxYzFlLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1hbm5vdGF0aW9ucy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9hbm5vdGF0aW9uL0pTRkJlaGF2aW9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vKg0KLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICogDQotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqIA0KLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqICB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uYnVpbGRlci5hbm5vdGF0aW9uOw0KLQ0KLXB1YmxpYyBAaW50ZXJmYWNlIEpTRkJlaGF2aW9yDQotew0KLSAgICAvKioNCi0gICAgICogSW5kaWNhdGUgdGhlIGJlaGF2aW9ySWQgd2hpY2ggaWRlbnRpZmllcyB0aGlzIGNsYXNzLiBJZiBub3QgZGVmaW5lZCwgaXQNCi0gICAgICogdHJpZXMgdG8gZ2V0IHRoZSB2YWx1ZSBvZiB0aGUgZmllbGQgQkVIQVZJT1JfSUQuDQotICAgICAqLw0KLSAgICBTdHJpbmcgaWQoKSBkZWZhdWx0ICIiOw0KLSAgICANCi0gICAgLyoqDQotICAgICAqIFRoZSBuYW1lIG9mIHRoZSBjb21wb25lbnQgaW4gYSBwYWdlIChleDogeDpteWNvbXApLg0KLSAgICAgKi8NCi0gICAgU3RyaW5nIG5hbWUoKSBkZWZhdWx0ICIiOw0KLSAgICANCi0gICAgLyoqDQotICAgICAqIEluZGljYXRlIGlmIHRoZSBlbGVtZW50IGFjY2VwdCBpbm5lciBlbGVtZW50cyBvciBub3QuDQotICAgICAqLw0KLSAgICBTdHJpbmcgYm9keUNvbnRlbnQoKSBkZWZhdWx0ICIiOw0KLQ0KLSAgICAvKioNCi0gICAgICogU2hvcnQgZGVzY3JpcHRpb24NCi0gICAgICovDQotICAgIFN0cmluZyBkZXNjKCkgZGVmYXVsdCAiIjsNCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBJbmRpY2F0ZSB0aGF0IHRoaXMgY29tcG9uZW50IHNob3VsZCBub3QgYmUgZGVmaW5lZCBvbiBmYWNlcy1jb25maWcueG1sLg0KLSAgICAgKiBBbnl3YXksIGlmIHRoaXMgaXMgdHJ1ZSBvciBmYWxzZSBkb2VzIG5vdCBoYXZlIGFueSBzaWduaWZpY2F0aXZlIGltcGFjdC4gDQotICAgICAqIA0KLSAgICAgKiBAc2luY2UgMS4wLjgNCi0gICAgICogQHJldHVybg0KLSAgICAgKi8NCi0gICAgYm9vbGVhbiBjb25maWdFeGNsdWRlZCgpIGRlZmF1bHQgZmFsc2U7DQotICAgIA0KLSAgICAvKioNCi0gICAgICogVGhlIGZ1bGx5LXF1YWxpZmllZC1uYW1lIG9mIGEgY29uY3JldGUgdmFsaWRhdG9yIGNsYXNzLg0KLSAgICAgKiA8cD4NCi0gICAgICogVGhpcyBhdHRyaWJ1dGUgaXMgb25seSByZWxldmFudCB3aGVuICJuYW1lIiBpcyBhbHNvIHNldCwgaWUgdGhlDQotICAgICAqIGFubm90YXRpb24gaXMgaW5kaWNhdGluZyB0aGF0IGEgdmFsaWRhdG9yIGlzIHJlYWxseSBiZWluZyBkZWNsYXJlZC4NCi0gICAgICogPHA+DQotICAgICAqIFdoZW4gdGhpcyBhdHRyaWJ1dGUgaXMgbm90IGRlZmluZWQgdGhlbiBpdCBpcyBhc3N1bWVkIHRoYXQgdGhpcw0KLSAgICAgKiBhbm5vdGF0ZWQgY2xhc3MgaXMgdGhlIGFjdHVhbCB2YWxpZGF0b3IgY2xhc3MuDQotICAgICAqIDxwPg0KLSAgICAgKiBXaGVuIHRoaXMgYXR0cmlidXRlIGlzIHNldCB0byBzb21ldGhpbmcgb3RoZXIgdGhhbiB0aGUgbmFtZSBvZiB0aGUNCi0gICAgICogYW5ub3RhdGVkIGNsYXNzIHRoZW4gdGhlIHNwZWNpZmllZCBjbGFzcyBpcyB0aGUgb25lIHRoYXQgdGhlIEpTRg0KLSAgICAgKiB2YWxpZGF0b3IgcmVnaXN0cmF0aW9uIGluIGZhY2VzLWNvbmZpZy54bWwgd2lsbCByZWZlciB0by4gQW5kIGlmIHRoYXQNCi0gICAgICogY2xhc3MgZG9lcyBub3QgZXhpc3QgaW4gdGhlIGNsYXNzcGF0aCAod2hpY2ggd2lsbCBub3JtYWxseSBiZSB0aGUNCi0gICAgICogY2FzZSkgdGhlbiBjb2RlLWdlbmVyYXRpb24gd2lsbCBiZSB0cmlnZ2VyZWQgdG8gY3JlYXRlIGl0Lg0KLSAgICAgKiA8cD4NCi0gICAgICogVGhpcyBhdHRyaWJ1dGUgaXMgbm90IGluaGVyaXRhYmxlLg0KLSAgICAgKiA8cD4NCi0gICAgICogVGhlIGRvY2xldC1hbm5vdGF0aW9uIGVxdWl2YWxlbnQgb2YgdGhpcyBhdHRyaWJ1dGUgaXMgbmFtZWQgImNsYXNzIi4NCi0gICAgICogDQotICAgICAqIEBzaW5jZSAxLjAuOA0KLSAgICAgKi8NCi0gICAgU3RyaW5nIGNsYXp6KCkgZGVmYXVsdCAiIjsNCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBJbmRpY2F0ZSB0YWcgaGFuZGxlciBjbGFzcyB1c2VkIGZvciB0aGlzIGNvbXBvbmVudCBvbiBmYWNlbGV0cy4NCi0gICAgICogDQotICAgICAqIEBzaW5jZSAxLjAuOA0KLSAgICAgKi8NCi0gICAgU3RyaW5nIHRhZ0hhbmRsZXIoKSBkZWZhdWx0ICIiOw0KLSAgICANCi0gICAgLyoqDQotICAgICAqIEluZGljYXRlIHRoYXQgdGhlIEVMIEV4cHJlc3Npb25zIHNob3VsZCBiZSBzdG9yZWQgdXNpbmcgDQotICAgICAqIHNldFZhbHVlRXhwcmVzc2lvbigpIG1ldGhvZCwgaW5zdGVhZCBldmFsdWF0ZSB0aGVtIGF0IGJ1aWxkIHZpZXcNCi0gICAgICogdGltZS4gTGF0ZXIgdGhlIEVMIEV4cHJlc3Npb25zIHdpbGwgYmUgZXZhbHVhdGVkIGFjY29yZGluZyB0bw0KLSAgICAgKiB0aGVpciBuZWVkcw0KLSAgICAgKiANCi0gICAgICogQHNpbmNlIDEuMC44DQotICAgICAqLw0KLSAgICBib29sZWFuIGV2YWx1YXRlRUxPbkV4ZWN1dGlvbigpIGRlZmF1bHQgZmFsc2U7DQotfQ0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1hbm5vdGF0aW9ucy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9hbm5vdGF0aW9uL0pTRkNsaWVudEJlaGF2aW9yLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItYW5ub3RhdGlvbnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvYW5ub3RhdGlvbi9KU0ZDbGllbnRCZWhhdmlvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ODhmNTUxLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1hbm5vdGF0aW9ucy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9hbm5vdGF0aW9uL0pTRkNsaWVudEJlaGF2aW9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotLyoNCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqIA0KLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKiANCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmJ1aWxkZXIuYW5ub3RhdGlvbjsNCi0NCi1wdWJsaWMgQGludGVyZmFjZSBKU0ZDbGllbnRCZWhhdmlvcg0KLXsNCi0gICAgLyoqDQotICAgICAqIEluZGljYXRlIHRoZSBiZWhhdmlvcklkIHdoaWNoIGlkZW50aWZpZXMgdGhpcyBjbGFzcy4gSWYgbm90IGRlZmluZWQsIGl0DQotICAgICAqIHRyaWVzIHRvIGdldCB0aGUgdmFsdWUgb2YgdGhlIGZpZWxkIEJFSEFWSU9SX0lELg0KLSAgICAgKi8NCi0gICAgU3RyaW5nIGlkKCkgZGVmYXVsdCAiIjsNCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBUaGUgbmFtZSBvZiB0aGUgY29tcG9uZW50IGluIGEgcGFnZSAoZXg6IHg6bXljb21wKS4NCi0gICAgICovDQotICAgIFN0cmluZyBuYW1lKCkgZGVmYXVsdCAiIjsNCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBJbmRpY2F0ZSBpZiB0aGUgZWxlbWVudCBhY2NlcHQgaW5uZXIgZWxlbWVudHMgb3Igbm90Lg0KLSAgICAgKi8NCi0gICAgU3RyaW5nIGJvZHlDb250ZW50KCkgZGVmYXVsdCAiIjsNCi0NCi0gICAgLyoqDQotICAgICAqIFNob3J0IGRlc2NyaXB0aW9uDQotICAgICAqLw0KLSAgICBTdHJpbmcgZGVzYygpIGRlZmF1bHQgIiI7DQotICAgIA0KLSAgICAvKioNCi0gICAgICogSW5kaWNhdGUgdGhhdCB0aGlzIGNvbXBvbmVudCBzaG91bGQgbm90IGJlIGRlZmluZWQgb24gZmFjZXMtY29uZmlnLnhtbC4NCi0gICAgICogQW55d2F5LCBpZiB0aGlzIGlzIHRydWUgb3IgZmFsc2UgZG9lcyBub3QgaGF2ZSBhbnkgc2lnbmlmaWNhdGl2ZSBpbXBhY3QuIA0KLSAgICAgKiANCi0gICAgICogQHNpbmNlIDEuMC44DQotICAgICAqIEByZXR1cm4NCi0gICAgICovDQotICAgIGJvb2xlYW4gY29uZmlnRXhjbHVkZWQoKSBkZWZhdWx0IGZhbHNlOw0KLSAgICANCi0gICAgLyoqDQotICAgICAqIFRoZSBmdWxseS1xdWFsaWZpZWQtbmFtZSBvZiBhIGNvbmNyZXRlIHZhbGlkYXRvciBjbGFzcy4NCi0gICAgICogPHA+DQotICAgICAqIFRoaXMgYXR0cmlidXRlIGlzIG9ubHkgcmVsZXZhbnQgd2hlbiAibmFtZSIgaXMgYWxzbyBzZXQsIGllIHRoZQ0KLSAgICAgKiBhbm5vdGF0aW9uIGlzIGluZGljYXRpbmcgdGhhdCBhIHZhbGlkYXRvciBpcyByZWFsbHkgYmVpbmcgZGVjbGFyZWQuDQotICAgICAqIDxwPg0KLSAgICAgKiBXaGVuIHRoaXMgYXR0cmlidXRlIGlzIG5vdCBkZWZpbmVkIHRoZW4gaXQgaXMgYXNzdW1lZCB0aGF0IHRoaXMNCi0gICAgICogYW5ub3RhdGVkIGNsYXNzIGlzIHRoZSBhY3R1YWwgdmFsaWRhdG9yIGNsYXNzLg0KLSAgICAgKiA8cD4NCi0gICAgICogV2hlbiB0aGlzIGF0dHJpYnV0ZSBpcyBzZXQgdG8gc29tZXRoaW5nIG90aGVyIHRoYW4gdGhlIG5hbWUgb2YgdGhlDQotICAgICAqIGFubm90YXRlZCBjbGFzcyB0aGVuIHRoZSBzcGVjaWZpZWQgY2xhc3MgaXMgdGhlIG9uZSB0aGF0IHRoZSBKU0YNCi0gICAgICogdmFsaWRhdG9yIHJlZ2lzdHJhdGlvbiBpbiBmYWNlcy1jb25maWcueG1sIHdpbGwgcmVmZXIgdG8uIEFuZCBpZiB0aGF0DQotICAgICAqIGNsYXNzIGRvZXMgbm90IGV4aXN0IGluIHRoZSBjbGFzc3BhdGggKHdoaWNoIHdpbGwgbm9ybWFsbHkgYmUgdGhlDQotICAgICAqIGNhc2UpIHRoZW4gY29kZS1nZW5lcmF0aW9uIHdpbGwgYmUgdHJpZ2dlcmVkIHRvIGNyZWF0ZSBpdC4NCi0gICAgICogPHA+DQotICAgICAqIFRoaXMgYXR0cmlidXRlIGlzIG5vdCBpbmhlcml0YWJsZS4NCi0gICAgICogPHA+DQotICAgICAqIFRoZSBkb2NsZXQtYW5ub3RhdGlvbiBlcXVpdmFsZW50IG9mIHRoaXMgYXR0cmlidXRlIGlzIG5hbWVkICJjbGFzcyIuDQotICAgICAqIA0KLSAgICAgKiBAc2luY2UgMS4wLjgNCi0gICAgICovDQotICAgIFN0cmluZyBjbGF6eigpIGRlZmF1bHQgIiI7DQotICAgIA0KLSAgICAvKioNCi0gICAgICogSW5kaWNhdGUgdGFnIGhhbmRsZXIgY2xhc3MgdXNlZCBmb3IgdGhpcyBjb21wb25lbnQgb24gZmFjZWxldHMuDQotICAgICAqIA0KLSAgICAgKiBAc2luY2UgMS4wLjgNCi0gICAgICovDQotICAgIFN0cmluZyB0YWdIYW5kbGVyKCkgZGVmYXVsdCAiIjsNCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBJbmRpY2F0ZSB0aGF0IHRoZSBFTCBFeHByZXNzaW9ucyBzaG91bGQgYmUgc3RvcmVkIHVzaW5nIA0KLSAgICAgKiBzZXRWYWx1ZUV4cHJlc3Npb24oKSBtZXRob2QsIGluc3RlYWQgZXZhbHVhdGUgdGhlbSBhdCBidWlsZCB2aWV3DQotICAgICAqIHRpbWUuIExhdGVyIHRoZSBFTCBFeHByZXNzaW9ucyB3aWxsIGJlIGV2YWx1YXRlZCBhY2NvcmRpbmcgdG8NCi0gICAgICogdGhlaXIgbmVlZHMNCi0gICAgICogDQotICAgICAqIEBzaW5jZSAxLjAuOA0KLSAgICAgKi8NCi0gICAgYm9vbGVhbiBldmFsdWF0ZUVMT25FeGVjdXRpb24oKSBkZWZhdWx0IGZhbHNlOw0KLSAgICANCi0gICAgLyoqDQotICAgICAqIERlZmluZSB0aGUgcmVuZGVyZXItdHlwZSBhdHRyaWJ1dGUgdGhhdCBpcyB1c2VkIHRvDQotICAgICAqIGxvb2sgdXAgYSByZW5kZXJlciBmb3IgaW5zdGFuY2VzIG9mIGEgY29tcG9uZW50Lg0KLSAgICAgKiANCi0gICAgICogSWYgdGhpcyBhdHRyaWJ1dGUgaXMgbm90IGRlZmluZWQsIHRoZSBidWlsZGVyIHBsdWdpbiBsb29rcyBmb3IgYSBjb25zdGFudA0KLSAgICAgKiBvbiB0aGUgY2xhc3Mgd2l0aCBuYW1lIFJFTkRFUkVSX1RZUEUuIEl0IGlzIGFuIGVycm9yIGlmIGENCi0gICAgICogY29uY3JldGUgY29tcG9uZW50IGhhcyBubyBzdWNoIHNldHRpbmcgKGJ1dCB0aGUgdmFsdWUgY2FuIGJlIGluaGVyaXRlZCBmcm9tIGFuDQotICAgICAqIGFuY2VzdG9yIGNsYXNzKS4NCi0gICAgICogPHA+DQotICAgICAqIFRoaXMgYXR0cmlidXRlIGlzIGluaGVyaXRhYmxlLg0KLSAgICAgKiANCi0gICAgICogQHNpbmNlIDEuMC44DQotICAgICAqLw0KLSAgICBTdHJpbmcgcmVuZGVyZXJUeXBlKCkgZGVmYXVsdCAiIjsNCi19DQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLWFubm90YXRpb25zL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL2Fubm90YXRpb24vSlNGQ2xpZW50QmVoYXZpb3JSZW5kZXJlci5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLWFubm90YXRpb25zL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL2Fubm90YXRpb24vSlNGQ2xpZW50QmVoYXZpb3JSZW5kZXJlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMjkxY2Y3Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1hbm5vdGF0aW9ucy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9hbm5vdGF0aW9uL0pTRkNsaWVudEJlaGF2aW9yUmVuZGVyZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qDQotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKiANCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICogDQotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5idWlsZGVyLmFubm90YXRpb247DQotDQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkRvY3VtZW50ZWQ7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeTsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0Ow0KLQ0KLS8qKg0KLSAqIEluZGljYXRlIHRoYXQgdGhpcyBjbGFzcyBpcyBhIENsaWVudEJlaGF2aW9yUmVuZGVyZXIuIFRoaXMgaXMgcmVnaXN0ZXJlZCBvbiBmYWNlcy1jb25maWcueG1sLg0KLSAqIA0KLSAqIEBhdXRob3IgTGVvbmFyZG8gVXJpYmUgKGxhdGVzdCBtb2RpZmljYXRpb24gYnkgJEF1dGhvcjogbHU0MjQyICQpDQotICogQHZlcnNpb24gJFJldmlzaW9uOiA2NjAwNjQgJCAkRGF0ZTogMjAwOC0wNS0yNSAxOTo0Mzo0OCAtMDUwMCAoZG9tLCAyNSBtYXkgMjAwOCkgJA0KLSAqLw0KLUBEb2N1bWVudGVkDQotQFRhcmdldChFbGVtZW50VHlwZS5UWVBFKQ0KLUBSZXRlbnRpb24oUmV0ZW50aW9uUG9saWN5LlNPVVJDRSkNCi1wdWJsaWMgQGludGVyZmFjZSBKU0ZDbGllbnRCZWhhdmlvclJlbmRlcmVyDQotew0KLSAgICAvKioNCi0gICAgICogVGhlIHJlbmRlcktpdElkIHRoYXQgYmVsb25ncyB0aGlzIHJlbmRlcmVyLiBJZiBubyBjdXN0b20gcmVuZGVya2l0IGRlZmluZWQgeW91IHNob3VsZCB1c2UgSFRNTF9CQVNJQy4NCi0gICAgICovDQotICAgIFN0cmluZyByZW5kZXJLaXRJZCgpIGRlZmF1bHQgIiI7DQotDQotICAgIC8qKg0KLSAgICAgKiBUaGUgcmVuZGVyZXIgdHlwZSB0aGF0IGlzIGFwcGxpZWQgdGhpcyByZW5kZXJlci4NCi0gICAgICovDQotICAgIFN0cmluZyB0eXBlKCkgZGVmYXVsdCAiIjsNCi0NCi0gICAgLyoqDQotICAgICAqIFNob3J0IGRlc2NyaXB0aW9uDQotICAgICAqLw0KLSAgICBTdHJpbmcgZGVzYygpIGRlZmF1bHQgIiI7DQotDQotfQ0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1hbm5vdGF0aW9ucy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9hbm5vdGF0aW9uL0pTRkNsaWVudEJlaGF2aW9yUmVuZGVyZXJzLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItYW5ub3RhdGlvbnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvYW5ub3RhdGlvbi9KU0ZDbGllbnRCZWhhdmlvclJlbmRlcmVycy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOTA4ZWQ1Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1hbm5vdGF0aW9ucy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9hbm5vdGF0aW9uL0pTRkNsaWVudEJlaGF2aW9yUmVuZGVyZXJzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKg0KLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICogDQotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqIA0KLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqICB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uYnVpbGRlci5hbm5vdGF0aW9uOw0KLQ0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Eb2N1bWVudGVkOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZTsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3k7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsNCi0NCi0vKioNCi0gKiBEZWZpbmUgYSBzZXQgb2YgcmVuZGVyZXJzIHVzZWQgdG8gZ3JvdXAgc2V2ZXJhbCBkZWZpbml0aW9ucw0KLSAqIG9mIEpTRlJlbmRlcmVyIGFubm90YXRpb25zLg0KLSAqIA0KLSAqIEBhdXRob3IgTGVvbmFyZG8gVXJpYmUgKGxhdGVzdCBtb2RpZmljYXRpb24gYnkgJEF1dGhvcjogbHU0MjQyICQpDQotICogQHZlcnNpb24gJFJldmlzaW9uOiA2OTA2MTkgJCAkRGF0ZTogMjAwOC0wOC0zMCAxOToxNTo1OCAtMDUwMCAoc8OhYiwgMzAgYWdvIDIwMDgpICQNCi0gKi8NCi1ARG9jdW1lbnRlZA0KLUBUYXJnZXQoRWxlbWVudFR5cGUuVFlQRSkNCi1AUmV0ZW50aW9uKFJldGVudGlvblBvbGljeS5TT1VSQ0UpDQotcHVibGljIEBpbnRlcmZhY2UgSlNGQ2xpZW50QmVoYXZpb3JSZW5kZXJlcnMNCi17DQotDQotICAgIC8qKg0KLSAgICAgKiBBcnJheSBvZiBKU0ZDbGllbnRCZWhhdmlvclJlbmRlcmVyIHRvIGJlIGRlZmluZWQuDQotICAgICAqLw0KLSAgICBKU0ZDbGllbnRCZWhhdmlvclJlbmRlcmVyIFtdIHJlbmRlcmVycygpOw0KLSAgICANCi19DQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLWFubm90YXRpb25zL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL2Fubm90YXRpb24vSlNGQ29tcG9uZW50LmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItYW5ub3RhdGlvbnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvYW5ub3RhdGlvbi9KU0ZDb21wb25lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjZiOGEzYy4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItYW5ub3RhdGlvbnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvYW5ub3RhdGlvbi9KU0ZDb21wb25lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1NSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uYnVpbGRlci5hbm5vdGF0aW9uOwotCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRG9jdW1lbnRlZDsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZTsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5OwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsKLQotLyoqCi0gKiBUaGlzIGFubm90YXRpb24gaWRlbnRpZmllcyBhIGNsYXNzIGFzIGJlaW5nIGEgSlNGIGNvbXBvbmVudCwgYW4gYW5jZXN0b3Igb2YKLSAqIG9uZSwgb3IgYSB0ZW1wbGF0ZSBmb3Igb25lLgotICogPHA+Ci0gKiBBIEpTRiBjb21wb25lbnQgaXMgYSBjb25jcmV0ZSBjbGFzcyB0aGF0IGlzIGEgc3ViY2xhc3Mgb2YgVUlDb21wb25lbnQsIGFuZAotICogaXMgcmVnaXN0ZXJlZCBpbiBhIGZhY2VzLWNvbmZpZy54bWwgZmlsZS4gSXQgYWx3YXlzIGltcGxlbWVudHMgdGhlIFN0YXRlSG9sZGVyCi0gKiBpbnRlcmZhY2UsIGFuZCB0eXBpY2FsbHkgaGFzIHNldmVyYWwgcHJvcGVydGllcyB0aGF0IGNhbiBiZSBkZWZpbmVkIGZyb20gYQotICogdmlldyBmaWxlIChqc3AsIGZhY2VsZXRzIG9yIG90aGVyIHNpbWlsYXIgdGVjaG5vbG9neSkuCi0gKiA8cD4KLSAqIFRoZSBteWZhY2VzLWJ1aWxkZXItcGx1Z2luIHVzZXMgdGhpcyBhbm5vdGF0aW9uIGluZm9ybWF0aW9uIHRvIGdlbmVyYXRlIHRoZQotICogY29ycmVjdCBmYWNlcy1jb25maWcueG1sIGRlY2xhcmF0aW9ucywgdGh1cyBlbnN1cmluZyB0aGF0IHRoZSBjb25maWcgZGVjbGFyYXRpb25zCi0gKiBhcmUgY29uc2lzdGVudCB3aXRoIHRoZSBjb2RlLiBUaGUgcGx1Z2luIGNhbiBhbHNvIG9wdGlvbmFsbHkgdXNlIHRoaXMgaW5mb3JtYXRpb24KLSAqIHRvIGdlbmVyYXRlIEpTUCB0YWcgY2xhc3NlcywgYW5kIGNvbmNyZXRlIFVJQ29tcG9uZW50IGltcGxlbWVudGF0aW9ucy4KLSAqIDxwPgotICogVGhpcyB0YWcgY2FuIGJlIHVzZWQgaW4gc2V2ZXJhbCB3YXlzOgotICogPHVsPgotICogPGxpPlRvIG1hcmsgYW4gaW50ZXJmYWNlIGFzIG9uZSB0aGF0IGRlY2xhcmVzIGNvbXBvbmVudCBwcm9wZXJ0aWVzLgotICogPGxpPlRvIG1hcmsgYSBjbGFzcyB0aGF0IHdpbGwgYmUgdXNlZCBhcyBhIGJhc2UgY2xhc3MgYnkgb3RoZXIgaGFuZC13cml0dGVuCi0gKiBjbGFzc2VzLgotICogPGxpPlRvIG1hcmsgYSBjbGFzcyBhcyBhbiBhY3R1YWwgY29uY3JldGUgSlNGIENvbXBvbmVudCBjbGFzcyB3aGljaCBzaG91bGQgYmUKLSAqIHJlZ2lzdGVyZWQgYXMgYSBjb21wb25lbnQgaW4gZmFjZXMtY29uZmlnIGV0Yy4KLSAqIDxsaT5UbyBtYXJrIGEgY2xhc3MgYXMgYSBiYXNlIGNsYXNzIGZvciB3aGljaCBhIGNvbmNyZXRlIGNvbXBvbmVudCBzdWJjbGFzcyBzaG91bGQKLSAqIGJlIGNyZWF0ZWQgdXNpbmcgY29kZSBnZW5lcmF0aW9uLgotICogPGxpPlRvIG1hcmsgYSBjbGFzcyBhcyBhICJ0ZW1wbGF0ZSIgZnJvbSB3aGljaCBhIGNvbmNyZXRlIGNvbXBvbmVudCBjbGFzcyBzaG91bGQKLSAqIGJlIGNyZWF0ZWQgdXNpbmcgY29kZSBnZW5lcmF0aW9uLgotICogPC91bD4KLSAqIEFueSBjbGFzcyBvciBpbnRlcmZhY2UgbWFya2VkIHdpdGggdGhpcyBhbm5vdGF0aW9uIHdpbGwgYWxzbyBoYXZlIGl0cyAibWV0YWRhdGEiCi0gKiBzdG9yZWQgaW4gdGhlIG1ldGFkYXRhIGZpbGUgdGhhdCB0aGUgYnVpbGRlciBwbHVnaW4gY3JlYXRlcyBhbmQgc3RvcmVzIGluIHRoZQotICogTUVUQS1JTkYgZGlyZWN0b3J5IG9mIHRoZSBwcm9jZXNzZWQgcHJvamVjdC4KLSAqIDxwPgotICogTm90ZSB0aGF0IGEgSlNQUHJvcGVydHkgYW5ub3RhdGlvbiAob24gYSBtZXRob2QpIGlzIG5vdCBwcm9jZXNzZWQgdW5sZXNzIHRoZSBjbGFzcwotICogaXMgbWFya2VkIHdpdGggdGhpcyBKU1BDb21wb25lbnQgYW5ub3RhdGlvbi4gCi0gKiAKLSAqIDxoMj5Bbm5vdGF0aW5nIGFuIEludGVyZmFjZTwvaDI+Ci0gKiAKLSAqIFdoZW4gYW4gaW50ZXJmYWNlIGlzIG1hcmtlZCB3aXRoIHRoaXMgYW5ub3RhdGlvbiwgdGhlbiBjbGFzc2VzIHdoaWNoIGltcGxlbWVudCB0aGF0Ci0gKiBpbnRlcmZhY2UgYW5kIGFyZSB0aGVtc2VsdmVzIG1hcmtlZCB3aXRoIHRoaXMgYW5ub3RhdGlvbiBpbmhlcml0IHRoZSBKU0ZQcm9wZXJ0eQotICogc2V0dGluZ3MgZGVjbGFyZWQgb24gdGhlIG1ldGhvZHMgaW4gdGhlIGludGVyZmFjZS4KLSAqIDxwPgotICogVGhpcyBhbGxvd3MgY29tbW9uIGdyb3VwcyBvZiBKU0YgcHJvcGVydGllcyB0byBiZSBkZWZpbmVkIGFzIGFuIGludGVyZmFjZSwgYW5kIGVhY2gKLSAqIEpTRiBjb21wb25lbnQgY2xhc3MgdGhhdCBpcyBleHBlY3RlZCB0byBwcm92aWRlIHRob3NlIHByb3BlcnRpZXMgc2ltcGx5IGRlY2xhcmVzIHRoYXQKLSAqIGl0IGltcGxlbWVudHMgdGhhdCBpbnRlcmZhY2UuIFRoZSBub3JtYWwgamF2YSBjb21waWxhdGlvbiBydWxlcyBlbnN1cmUgdGhhdCB0aGUgY29uY3JldGUKLSAqIEpTRiBjb21wb25lbnQgY2xhc3MgaW1wbGVtZW50cyBhbGwgb2YgdGhlIG1ldGhvZHMgb24gdGhlIGludGVyZmFjZSwgYW5kIHRoZSBidWlsZGVyCi0gKiBwbHVnaW4gZW5zdXJlcyB0aGF0IHRoZSBpbmhlcml0ZWQgSlNGUHJvcGVydHkgc2V0dGluZ3MgYXJlIHVzZWQuCi0gKiAKLSAqIDxoMj5Bbm5vdGF0aW5nIGFuIEFic3RyYWN0IEJhc2UgQ2xhc3M8L2gyPgotICogCi0gKiBXaGVuIGFuIGFic3RyYWN0IGNsYXNzIGlzIG1hcmtlZCB3aXRoIHRoaXMgYW5ub3RhdGlvbiwgYW5kIHRoZSBuYW1lIGF0dHJpYnV0ZSBpcwotICogbm90IHNldCwgdGhlbiB0aGlzIGlzIGEgYmFzZSBjbGFzcyB0aGF0IGNvbmNyZXRlIGNvbXBvbmVudHMgY2FuIGV4dGVuZC4gQW55Ci0gKiBKU0ZQcm9wZXJ0eSBzZXR0aW5ncyBkZWZpbmVkIG9uIHRoaXMgY2xhc3MgYXJlIGluaGVyaXRlZCBieSBzdWJjbGFzc2VzLgotICogCi0gKiA8aDI+QW5ub3RhdGluZyBhIENvbmNyZXRlIENvbXBvbmVudCBDbGFzczwvaDI+Ci0gKiAKLSAqIFdoZW4gYSBub24tYWJzdHJhY3QgY2xhc3MgaXMgbWFya2VkIHdpdGggdGhpcyBhbm5vdGF0aW9uLCBhbmQgdGhlIG5hbWUgYXR0cmlidXRlCi0gKiBpcyBkZWZpbmVkIHRoZW4gYW4gZW50cnkgd2lsbCBiZSBjcmVhdGVkIGluIHRoZSBnZW5lcmF0ZWQgZmFjZXMtY29uZmlnLnhtbCBmaWxlCi0gKiBtYXJraW5nIHRoaXMgY2xhc3MgYXMgYSBjb21wb25lbnQuIAotICogPHA+Ci0gKiBJbiBhZGRpdGlvbiwgYSBKU1AgVGFnSGFuZGxlciBjbGFzcyB3aWxsIGJlIGNyZWF0ZWQgdXNpbmcgY29kZS1nZW5lcmF0aW9uIGFuZCBhbgotICogZW50cnkgd2lsbCBiZSBjcmVhdGVkIGluIHRoZSBnZW5lcmF0ZWQgLnRsZCBmaWxlIHNvIHRoYXQgdGhlIHRhZyBjbGFzcyBjYW4gYmUKLSAqIHVzZWQgZnJvbSBKU1AgYXBwbGljYXRpb25zLgotICogCi0gKiA8aDI+QW5ub3RhdGluZyBhIENsYXNzIGZvciBTdWJjbGFzcyBHZW5lcmF0aW9uPC9oMj4KLSAqIAotICogV2hlbiBhbiBhYnN0cmFjdCBjbGFzcyBpcyBtYXJrZWQgd2l0aCB0aGlzIGFubm90YXRpb24sIHRoZSBuYW1lIGF0dHJpYnV0ZSBpcwotICogZGVmaW5lZCwgYW5kIHRoZSAiY2xhenoiIGF0dHJpYnV0ZSBpcyBkZWZpbmVkIHRoZW4gY29kZS1nZW5lcmF0aW9uIHdpbGwgYmUKLSAqIHVzZWQgdG8gY3JlYXRlIGEgY29uY3JldGUgVUlDb21wb25lbnQgY2xhc3Mgd2hpY2ggaXMgYSBzdWJjbGFzcyBvZiB0aGlzIGNsYXNzLgotICogVGhlIHN1YmNsYXNzIHdpbGwgYmUgcmVnaXN0ZXJlZCBpbiB0aGUgZ2VuZXJhdGVkIGZhY2VzLWNvbmZpZy54bWwgZmlsZSwgYQotICogSlNQIFRhZ0hhbmRsZXIgY2xhc3Mgd2lsbCBiZSBjcmVhdGVkIGFuZCByZWdpc3RlcmVkIGluIHRoZSAudGxkIGZpbGUsIGV0Yy4KLSAqIDxwPgotICogVXNpbmcgY29kZS1nZW5lcmF0aW9uIHRvIGNyZWF0ZSBhIHN1YmNsYXNzIGFsbG93cyBhdXRvbWF0aWMgZ2VuZXJhdGlvbiBvZgotICogdGhlICJib2lsZXJwbGF0ZSBjb2RlIiB0aGF0IGlzIGNvbW1vbmx5IG5lZWRlZCBmb3IgaW1wbGVtZW50aW5nIGNvbXBvbmVudAotICogcHJvcGVydHkgZ2V0dGVyL3NldHRlciBtZXRob2RzIGFuZCB0aGUgc2F2ZVN0YXRlL3Jlc3RvcmVTdGF0ZSBtZXRob2RzLgotICogPHA+Ci0gKiBBbnkgYWJzdHJhY3QgcHJvcGVydHkgZ2V0dGVyL3NldHRlciBtZXRob2RzIG9uIHRoZSBhbm5vdGF0ZWQgY2xhc3Mgd2lsbCBoYXZlCi0gKiB0aGUgYXBwcm9wcmlhdGUgaW1wbGVtZW50YXRpb24gYXV0b21hdGljYWxseSB3cml0dGVuIGZvciBpdCBpbiB0aGUgbmV3Ci0gKiBzdWJjbGFzcy4gSG93ZXZlciB0aGUgcGFyZW50IGNsYXNzIGNhbiBvdmVycmlkZSB0aGlzIGZvciBhbnkgcGFydGljdWxhcgotICogbWV0aG9kIHNpbXBseSBieSBwcm92aWRpbmcgYSBjb25jcmV0ZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbWV0aG9kLgotICogCi0gKiA8aDI+QW5ub3RhdGluZyBhIENsYXNzIGFzIGEgQ29tcG9uZW50IFRlbXBsYXRlPC9oMj4KLSAqIAotICogV2hlbiBhbiBhYnN0cmFjdCBjbGFzcyBpcyBtYXJrZWQgd2l0aCB0aGlzIGFubm90YXRpb24sIHRoZSBuYW1lIGF0dHJpYnV0ZQotICogaXMgc2V0LCB0aGUgY2xhenogYXR0cmlidXRlIGlzIHNldCwgYW5kIGF0dHJpYnV0ZSB0ZW1wbGF0ZSBpcyBzZXQgdG8gInRydWUiCi0gKiB0aGVuIGNvZGUtZ2VuZXJhdGlvbiB3aWxsIGJlIHVzZWQgdG8gY3JlYXRlIGEgbmV3IGNsYXNzIHRoYXQgaXMgYSAiY29weSIgb2YKLSAqIHRoZSBzb3VyY2UgY29kZSBoZXJlLiBBcyBmb3IgInN1YmNsYXNzIGdlbmVyYXRpb24iLCBhbnkgYWJzdHJhY3QgbWV0aG9kcyB3aWxsCi0gKiBoYXZlIGFuIGFwcHJvcHJpYXRlIGltcGxlbWVudGF0aW9uIGdlbmVyYXRlZC4KLSAqIDxwPgotICogVGhpcyBhcHByb2FjaCBhbGxvd3MgYSBjb21wb25lbnQgInRlbXBsYXRlIiB0byBiZSB3cml0dGVuIGFzIGEgbm9ybWFsIGNsYXNzCi0gKiAod2l0aCB0aGUgdXN1YWwgc3VwcG9ydCB0b29scyBwcm92aWRlZCBieSBJREVzIGV0Yykgd2hpbGUgYWxsb3dpbmcgdGhlCi0gKiBhY3R1YWwgVUlDb21wb25lbnQgY2xhc3NlcyB0byBoYXZlIGEgaGllcmFyY2h5IHRoYXQgaXMgY29tcGxldGVseSB1bmRlcgotICogdGhlIGNvbnRyb2wgb2YgdGhlIGFubm90YXRpb25zLiBJbiBwYXJ0aWN1bGFyLCB0aGlzIGlzIHVzZWZ1bCBmb3IgZ2VuZXJhdGluZwotICogY29tcG9uZW50cyBmb3IgYSBKU0Ygc3BlY2lmaWNhdGlvbiBpbXBsZW1lbnRhdGlvbiwgd2hpY2ggaXMgdmVyeSBzcGVjaWZpYwotICogYWJvdXQgdGhlIGluaGVyaXRhbmNlIGhpZXJhcmNoeSBvZiB0aGUgc3RhbmRhcmQgY29tcG9uZW50IGNsYXNzZXMuCi0gKiA8cD4KLSAqIFdoZW4gdXNpbmcgdGhpcyAidGVtcGxhdGUiIGFwcHJvYWNoLCB0aGUgYW5ub3RhdGVkIGNsYXNzIGl0c2VsZiBjYW4gKGFuZAotICogcHJvYmFibHkgc2hvdWxkIGJlKSBwYWNrYWdlLXNjb3BlZC4KLSAqIAotICogQGF1dGhvciBMZW9uYXJkbyBVcmliZSAobGF0ZXN0IG1vZGlmaWNhdGlvbiBieSAkQXV0aG9yJCkKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCi0gKi8KLUBEb2N1bWVudGVkCi1AVGFyZ2V0KEVsZW1lbnRUeXBlLlRZUEUpCi1AUmV0ZW50aW9uKFJldGVudGlvblBvbGljeS5TT1VSQ0UpCi1wdWJsaWMgQGludGVyZmFjZSBKU0ZDb21wb25lbnQKLXsKLSAgICAvKioKLSAgICAgKiBUaGUgbmFtZSBvZiB0aGUgY29tcG9uZW50IGluIGEgcGFnZS4gVGhpcyBpcyB0aGUgbmFtZSBieSB3aGljaCB0aGUKLSAgICAgKiBjb21wb25lbnQgd2lsbCBiZSByZWZlcmVuY2VkIGJ5IHRoZSB1c2VkICh0aGUgbmFtZSB1c2VkIHRvIHJlZ2lzdGVyCi0gICAgICogSlNQIFRhZ0hhbmRsZXJzIGZvciBleGFtcGxlKS4gRm9yIGV4YW1wbGU6ICJteWNvbXAiLgotICAgICAqIDxwPgotICAgICAqIFdoZW4gYSBwcm9qZWN0IGlzIGdlbmVyYXRpbmcgY29tcG9uZW50cyB0aGF0IGxpdmUgaW4gbW9yZSB0aGFuIG9uZQotICAgICAqIG5hbWVzcGFjZSwgdGhlbiB0aGUgbmFtZSBjYW4gb3B0aW9uYWxseSBpbmNsdWRlIGEgbmFtZXNwYWNlIHByZWZpeCwKLSAgICAgKiBmb3IgZXhhbXBsZSAieDpteWNvbXAiLgotICAgICAqIDxwPgotICAgICAqIElmIGEgY2xhc3MgaXMgbWFya2VkIHdpdGggdGhlIEpTRkNvbXBvbmVudCBhbm5vdGF0aW9uLCBidXQgZG9lcyBub3QKLSAgICAgKiBkZWZpbmUgdGhlIG5hbWUgYXR0cmlidXRlIHRoZW4gaXQgaXMgYSAiYmFzZSBjbGFzcyIgdGhhdCBvdGhlcgotICAgICAqIFVJQ29tcG9uZW50IGNsYXNzZXMgY2FuIGV4dGVuZCAoYW5kIHRoZXJlZm9yZSBpbmhlcml0IGFueSBKU0ZQcm9wZXJ0eQotICAgICAqIGRlZmluaXRpb25zIGZyb20gdGhlIGJhc2UgY2xhc3MpLCBidXQgaXMgbm90IGEgY29tcG9uZW50IHRoYXQgY2FuIGJlCi0gICAgICogaW5zdGFudGlhdGVkLgotICAgICAqIDxwPgotICAgICAqIFRoaXMgcHJvcGVydHkgc2hvdWxkIG5ldmVyIGJlIHNldCBmb3IgYW4gaW50ZXJmYWNlLgotICAgICAqIDxwPgotICAgICAqIFRoaXMgcHJvcGVydHkgc2hvdWxkIG9ubHkgYmUgc2V0IGZvciBhbiBhYnN0cmFjdCBjbGFzcyB3aGVuIGNvZGUKLSAgICAgKiBnZW5lcmF0aW9uIGlzIGV4cGVjdGVkIHRvIGF1dG9tYXRpY2FsbHkgY3JlYXRlIGEgY29tcG9uZW50IGJhc2VkIG9uCi0gICAgICogdGhpcyBvbmUgKGllIHdoZW4gY2xhenogYW5kIHBlcmhhcHMgdGVtcGxhdGUgYXJlIHNldCkuCi0gICAgICogPHA+Ci0gICAgICogVGhpcyBhdHRyaWJ1dGUgaXMgbm90IGluaGVyaXRhYmxlLgotICAgICAqLwotICAgIFN0cmluZyBuYW1lKCkgZGVmYXVsdCAiIjsKLQotICAgIC8qKgotICAgICAqIFRoZSBmdWxseS1xdWFsaWZpZWQtbmFtZSBvZiBhIGNvbmNyZXRlIGNvbXBvbmVudCBjbGFzcy4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIGF0dHJpYnV0ZSBpcyBvbmx5IHJlbGV2YW50IHdoZW4gIm5hbWUiIGlzIGFsc28gc2V0LCBpZSB0aGUKLSAgICAgKiBhbm5vdGF0aW9uIGlzIGluZGljYXRpbmcgdGhhdCBhIGNvbXBvbmVudCBpcyByZWFsbHkgYmVpbmcgZGVjbGFyZWQuCi0gICAgICogPHA+Ci0gICAgICogV2hlbiB0aGlzIGF0dHJpYnV0ZSBpcyBub3QgZGVmaW5lZCB0aGVuIGl0IGlzIGFzc3VtZWQgdGhhdCB0aGlzCi0gICAgICogYW5ub3RhdGVkIGNsYXNzIGlzIHRoZSBhY3R1YWwgY29tcG9uZW50IGNsYXNzLgotICAgICAqIDxwPgotICAgICAqIFdoZW4gdGhpcyBhdHRyaWJ1dGUgaXMgc2V0IHRvIHNvbWV0aGluZyBvdGhlciB0aGFuIHRoZSBuYW1lIG9mIHRoZQotICAgICAqIGFubm90YXRlZCBjbGFzcyB0aGVuIHRoZSBzcGVjaWZpZWQgY2xhc3MgaXMgdGhlIG9uZSB0aGF0IHRoZSBKU0YKLSAgICAgKiBjb21wb25lbnQgcmVnaXN0cmF0aW9uIGluIGZhY2VzLWNvbmZpZy54bWwgd2lsbCByZWZlciB0by4gQW5kIGlmIHRoYXQKLSAgICAgKiBjbGFzcyBkb2VzIG5vdCBleGlzdCBpbiB0aGUgY2xhc3NwYXRoICh3aGljaCB3aWxsIG5vcm1hbGx5IGJlIHRoZQotICAgICAqIGNhc2UpIHRoZW4gY29kZS1nZW5lcmF0aW9uIHdpbGwgYmUgdHJpZ2dlcmVkIHRvIGNyZWF0ZSBpdC4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIGF0dHJpYnV0ZSBpcyBub3QgaW5oZXJpdGFibGUuCi0gICAgICogPHA+Ci0gICAgICogVGhlIGRvY2xldC1hbm5vdGF0aW9uIGVxdWl2YWxlbnQgb2YgdGhpcyBhdHRyaWJ1dGUgaXMgbmFtZWQgImNsYXNzIi4KLSAgICAgKi8KLSAgICBTdHJpbmcgY2xhenooKSBkZWZhdWx0ICIiOwotICAgIAotICAgIC8qKgotICAgICAqIFRoZSBKU0YgQ29tcG9uZW50IEZhbWlseSB0aGF0IHRoaXMgY29tcG9uZW50IGJlbG9uZ3MgdG8uCi0gICAgICogPHA+Ci0gICAgICogQSBVSUNvbXBvbmVudCBpbnN0YW5jZSdzICJmYW1pbHkiIHNldHRpbmcgaXMgdXNlZCB0b2dldGhlciB3aXRoIGEgInJlbmRlcmVyLXR5cGUiIHRvCi0gICAgICogZmluZCBhIHJlbmRlcmVyIGZvciB0aGUgY29tcG9uZW50IChzZWUgbWV0aG9kIFVJQ29tcG9uZW50LmdldFJlbmRlcmVyKS4gRWFjaAotICAgICAqIFJlbmRlcmVyIGltcGxlbWVudGF0aW9uIGlzIHJlZ2lzdGVyZWQgaW4gYSBmYWNlcy1jb25maWcueG1sIGZpbGUgdXNpbmcgYQotICAgICAqIChjb21wb25lbnQtZmFtaWx5LCByZW5kZXJlci10eXBlKSBwYWlyLgotICAgICAqIDxwPgotICAgICAqIElmIHRoaXMgYXR0cmlidXRlIGlzIG5vdCBzZXQgdGhlbiB0aGUgYnVpbGRlciBwbHVnaW4gd2lsbCBsb29rIGZvciBhCi0gICAgICogY29uc3RhbnQgb24gdGhlIGNsYXNzIHdpdGggbmFtZSBDT01QT05FTlRfRkFNSUxZLiBJdCBpcyBhbiBlcnJvciBpZiBhCi0gICAgICogY29uY3JldGUgY29tcG9uZW50IGhhcyBubyBzdWNoIHNldHRpbmcgKGJ1dCB0aGUgdmFsdWUgY2FuIGJlIGluaGVyaXRlZCBmcm9tIGFuCi0gICAgICogYW5jZXN0b3IgY2xhc3MpLgotICAgICAqLwotICAgIFN0cmluZyBmYW1pbHkoKSBkZWZhdWx0ICIiOwotICAgIAotICAgIC8qKgotICAgICAqIFRoZSB0eXBlIHN0cmluZyB1c2VkIHRvIGNyZWF0ZSBuZXcgaW5zdGFuY2VzIG9mIHRoaXMgY29tcG9uZW50LgotICAgICAqIDxwPgotICAgICAqIENvbXBvbmVudHMgYXJlIHJlZ2lzdGVyZWQgaW4gZmFjZXMtY29uZmlnLnhtbCB1c2luZyB0aGlzIHR5cGUgdmFsdWUsIGFuZAotICAgICAqIG5ldyBpbnN0YW5jZXMgYXJlIGNyZWF0ZWQgdmlhIEFwcGxpY2F0aW9uLmNyZWF0ZUNvbXBvbmVudCh0eXBlKS4KLSAgICAgKiA8cD4KLSAgICAgKiBJZiB0aGlzIGF0dHJpYnV0ZSBpcyBub3Qgc2V0LCB0aGVuIHRoZSBidWlsZGVyIHBsdWdpbiB3aWxsIGxvb2sgZm9yIGEKLSAgICAgKiBjb25zdGFudCBvbiB0aGUgY2xhc3Mgd2l0aCBuYW1lIENPTVBPTkVOVF9UWVBFLiBJdCBpcyBhbiBlcnJvciBpZiBhCi0gICAgICogY29tcG9uZW50IGhhcyBubyBzdWNoIHNldHRpbmcuCi0gICAgICogPHA+Ci0gICAgICogVGhpcyBzaG91bGQgb25seSBiZSBzZXQgb24gY29uY3JldGUgY29tcG9uZW50IGNsYXNzZXMgKG9yIGNsYXNzZXMgZm9yIHdoaWNoCi0gICAgICogY29kZSBnZW5lcmF0aW9uIGNyZWF0ZXMgYSBjb25jcmV0ZSBjb21wb25lbnQgY2xhc3MpLiBUaGUgYXR0cmlidXRlIGlzCi0gICAgICogbm90IGluaGVyaXRhYmxlLgotICAgICAqLwotICAgIFN0cmluZyB0eXBlKCkgZGVmYXVsdCAiIjsKLSAgICAKLSAgICAvKioKLSAgICAgKiBEZWZpbmUgdGhlIHJlbmRlcmVyLXR5cGUgYXR0cmlidXRlIHRoYXQgKHRvZ2V0aGVyIHdpdGggImZhbWlseSIpIGlzIHVzZWQgdG8KLSAgICAgKiBsb29rIHVwIGEgcmVuZGVyZXIgZm9yIGluc3RhbmNlcyBvZiBhIGNvbXBvbmVudC4KLSAgICAgKiA8cD4KLSAgICAgKiBTZWUgYXR0cmlidXRlICJmYW1pbHkiIGZvciBtb3JlIGRldGFpbHMuCi0gICAgICogPHA+Ci0gICAgICogSWYgdGhpcyBhdHRyaWJ1dGUgaXMgbm90IGRlZmluZWQsIHRoZSBidWlsZGVyIHBsdWdpbiBsb29rcyBmb3IgYSBjb25zdGFudAotICAgICAqIG9uIHRoZSBjbGFzcyB3aXRoIG5hbWUgREVGQVVMVF9SRU5ERVJFUl9UWVBFLiBJdCBpcyBhbiBlcnJvciBpZiBhCi0gICAgICogY29uY3JldGUgY29tcG9uZW50IGhhcyBubyBzdWNoIHNldHRpbmcgKGJ1dCB0aGUgdmFsdWUgY2FuIGJlIGluaGVyaXRlZCBmcm9tIGFuCi0gICAgICogYW5jZXN0b3IgY2xhc3MpLgotICAgICAqIDxwPgotICAgICAqIFRoaXMgYXR0cmlidXRlIGlzIGluaGVyaXRhYmxlLgotICAgICAqLwotICAgIFN0cmluZyBkZWZhdWx0UmVuZGVyZXJUeXBlKCkgZGVmYXVsdCAiIjsKLSAgICAKLSAgICAvKioKLSAgICAgKiBJbmRpY2F0ZSBpZiB0aGUgY29tcG9uZW50IGlzIGFsbG93ZWQgdG8gaGF2ZSBvdGhlciBVSUNvbXBvbmVudCBpbnN0YW5jZXMKLSAgICAgKiBhcyBjaGlsZHJlbiAoaWUgIm5lc3RlZCB3aXRoaW4gaXQiIGluIGEgcGFnZSkuCi0gICAgICogPHA+Ci0gICAgICogVGhpcyBpbmZvcm1hdGlvbiBjYW4gYmUgaW5zZXJ0ZWQgaW50byAudGxkIGZpbGVzIGFuZCBzaW1pbGFyIHRvIHByZXNlbnQKLSAgICAgKiB1c2VycyB3aXRoIGFuIGVycm9yIG1lc3NhZ2UgaWYgYW4gYXR0ZW1wdCBpcyBtYWRlIHRvIGRlZmluZSBjaGlsZAotICAgICAqIGNvbXBvbmVudHMgZm9yIGEgY29tcG9uZW50IHRoYXQgZG9lcyBub3Qgc3VwcG9ydCB0aGVtLgotICAgICAqIDxwPgotICAgICAqIENvZGUgZ2VuZXJhdGlvbiBtaWdodCBhbHNvIHVzZSB0aGlzIGluZm9ybWF0aW9uIHRvIGVuc3VyZSB0aGF0IGFuIGV4Y2VwdGlvbgotICAgICAqIGlzIHRocm93biBpZiBhbiBhdHRlbXB0IHRvIGFkZCBjaGlsZCBjb21wb25lbnRzIG9jY3VycyBhdCBydW50aW1lLgotICAgICAqIDxwPgotICAgICAqIE5vdGUgdGhhdCB0aGlzIGlzIHJlbGF0ZWQgdG8sIGJ1dCBub3QgcXVpdGUgdGhlIHNhbWUgYXMsIHRoZSAiYm9keUNvbnRlbnQiCi0gICAgICogYXR0cmlidXRlLiBUaGF0IGF0dHJpYnV0ZSBwcmV2ZW50cyBhbnl0aGluZyBiZWluZyBuZXN0ZWQgaW5zaWRlIHRoZSBjb21wb25lbnQKLSAgICAgKiBpbiB0aGUgcGFnZSwgd2hpbGUgdGhpcyBwcmV2ZW50cyBVSUNvbXBvbmVudHMgYmVpbmcgbmVzdGVkLgotICAgICAqIAotICAgICAqID8/IFRPRE86IGJ1dCBpbiBKU0YxLjIsIGlzbid0IHN0YXRpYyB0ZXh0IGEgdHJhbnNpZW50IGNoaWxkPz8KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIGF0dHJpYnV0ZSBpcyBpbmhlcml0YWJsZS4KLSAgICAgKi8KLSAgICBib29sZWFuIGNhbkhhdmVDaGlsZHJlbigpIGRlZmF1bHQgZmFsc2U7Ci0gICAgCi0gICAgLyoqCi0gICAgICogVE9ETzogdGhpcyBpcyBob3BlZnVsbHkgdW51c2VkLCBhbmQgY2FuIGJlIGRlbGV0ZWQuCi0gICAgICogPHA+Ci0gICAgICogSW5kaWNhdGUgdGhhdCB0aGlzIGNvbXBvbmVudCBzaG91bGQgbm90IGJlIGRlZmluZWQgb24gZmFjZXMtY29uZmlnLnhtbC4KLSAgICAgKiBBbnl3YXksIGlmIHRoaXMgaXMgdHJ1ZSBvciBmYWxzZSBkb2VzIG5vdCBoYXZlIGFueSBzaWduaWZpY2F0aXZlIGltcGFjdC4gCi0gICAgICovCi0gICAgYm9vbGVhbiBjb25maWdFeGNsdWRlZCgpIGRlZmF1bHQgZmFsc2U7Ci0gICAgCi0gICAgLyoqCi0gICAgICogVGhlIG5hbWUgb2YgdGhlIEpTUCBUYWcgY2xhc3MgdGhhdCBzaG91bGQgYmUgZ2VuZXJhdGVkIGZvciB0aGlzIGNvbXBvbmVudC4KLSAgICAgKiA8cD4KLSAgICAgKiBJdCBpcyBhbiBlcnJvciB0byBzZXQgdGhpcyBhdHRyaWJ1dGUgaWYgdGhlIGFubm90YXRlZCBjbGFzcyBpcyBub3QgYQotICAgICAqIGNvbmNyZXRlIEpTRiBjb21wb25lbnQuCi0gICAgICogPHA+Ci0gICAgICogVE9ETzogPyBXSGF0IGhhcHBlbnMgaWYgYSBjbGFzcyBpcyBhIGNvbmNyZXRlIGNvbXBvbmVudCBidXQgdGhpcyBpcyBub3QKLSAgICAgKiBzZXQ/IElzIGEgdGFnQ2xhc3MgbmFtZSBhdXRvbWF0aWNhbGx5IGNyZWF0ZWQ/IE9yIGlzIG5vIHRhZyBjbGFzcyBjcmVhdGVkPwotICAgICAqLwotICAgIFN0cmluZyB0YWdDbGFzcygpIGRlZmF1bHQgIiI7Ci0gICAgIAotICAgIC8qKgotICAgICAqIFRhZyBzdXBlciBjbGFzcyB0aGF0IHRoZSBnZW5lcmF0ZWQgdGFnIGNsYXNzIGV4dGVuZHMuCi0gICAgICogPHA+Ci0gICAgICogVGhlIGdlbmVyYXRlZCB0YWcgY2xhc3MgZm9yIHRoaXMgY29tcG9uZW50IG1heSBuZWVkIHRvIGJlIGEgc3ViY2xhc3Mgb2YKLSAgICAgKiBkaWZmZXJlbnQgdGFnIGJhc2UgY2xhc3NlcyBkZXBlbmRpbmcgdXBvbiB0aGUgdHlwZSBvZiB0aGlzIGNvbXBvbmVudC4KLSAgICAgKiBGb3IgZXhhbXBsZSwgdGhlIEpTRiBzdGFuZGFyZCBwcm92aWRlcyB0aGUgZm9sbG93aW5nIHRhZyBjbGFzc2VzOgotICAgICAqIDx1bD4KLSAgICAgKiA8bGk+VUlDb21wb25lbnRUYWcgKHRoZSBkZWZhdWx0IHRhZyBiYXNlIGNsYXNzKQotICAgICAqIDxsaT5VSUNvbXBvbmVudEJvZHlUYWcsIGZvciB0YWdzIHRoYXQgIm5lZWQgdG8gcHJvY2VzcyB0aGVpciB0YWcgYm9kaWVzIi4KLSAgICAgKiBFeGFtcGxlcyBmcm9tIHRoZSBKU0Ygc3RhbmRhcmQgYXJlIGg6cGFuZWxHcmlkLCBoOnBhbmVsR3JvdXAsIGg6ZGF0YVRhYmxlLAotICAgICAqIGg6Y29sdW1uLgotICAgICAqIDwvdWw+Ci0gICAgICogPHA+Ci0gICAgICogVGhpcyBpcyBvcHRpb25hbDsgd2hlbiBub3QgZGVmaW5lZCwgdGhlIHN0YW5kYXJkIFVJQ29tcG9uZW50VGFnIGNsYXNzIGlzCi0gICAgICogdXNlZC4gVGhpcyBpcyBhcHByb3ByaWF0ZSBmb3IgbW9zdCBKU0YgY29tcG9uZW50cy4KLSAgICAgKi8KLSAgICBTdHJpbmcgdGFnU3VwZXJjbGFzcygpIGRlZmF1bHQgIiI7Ci0gICAgCi0gICAgLyoqCi0gICAgICogSW5kaWNhdGUgdGFnIGhhbmRsZXIgY2xhc3MgdXNlZCBmb3IgdGhpcyBjb21wb25lbnQgb24gZmFjZWxldHMuCi0gICAgICogCi0gICAgICovCi0gICAgU3RyaW5nIHRhZ0hhbmRsZXIoKSBkZWZhdWx0ICIiOwotICAgIAotICAgIC8qKgotICAgICAqIEluZGljYXRlIGlmIHRoZSBlbGVtZW50IGFjY2VwdCBpbm5lciBlbGVtZW50cyAoSlNQKSBvciBub3QgKGVtcHR5KS4KLSAgICAgKi8KLSAgICBTdHJpbmcgYm9keUNvbnRlbnQoKSBkZWZhdWx0ICIiOwotICAgIAotICAgIC8qKgotICAgICAqIEEgU2hvcnQgZGVzY3JpcHRpb24gb2YgdGhlIHB1cnBvc2Ugb2YgdGhpcyBVSUNvbXBvbmVudC4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIGluZm9ybWF0aW9uIGlzIG91dHB1dCBpbnRvIHRoZSAudGxkIGFuZCBmYWNlcy1jb25maWcueG1sIGZpbGVzIGFzIGhlbHAKLSAgICAgKiBmb3IgdXNlcnMgb2YgdGhpcyBjb21wb25lbnQsIGFuZCBtYXkgYmUgZGlzcGxheWVkIGJ5IElERXMgYW5kIHNpbWlsYXIgdG9vbHMuCi0gICAgICogPHA+Ci0gICAgICogSWYgbm90IHNldCwgdGhlbiB0aGUgamF2YWRvYyAic3VtbWFyeSIgc2VudGVuY2UgZm9yIHRoZSBjbGFzcyB3aWxsIGJlCi0gICAgICogdXNlZC4gSWYgdGhlcmUgaXMgbm8gamF2YWRvYyBmb3IgdGhlIGNsYXNzIHRoZW4gdGhlIGRlc2NyaXB0aW9uIHdpbGwgYmUKLSAgICAgKiBhbiBlbXB0eSBzdHJpbmcgKGJ1dCB0aGF0IHdpbGwgbmV2ZXIgaGFwcGVuLCByaWdodD8pLgotICAgICAqIDxwPgotICAgICAqIE5vdGUgdGhhdCB0bGQgb3IgZmFjZXMtY29uZmlnIGZpbGVzIGFsc28gaGF2ZSBhICJsb25nIGRlc2NyaXB0aW9uIiBmaWVsZC4KLSAgICAgKiBUaGF0IHZhbHVlIGlzIGFsd2F5cyB0aGUgY29tcGxldGUgamF2YWRvYyBmb3IgdGhlIGNvbXBvbmVudCBjbGFzcy4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIGF0dHJpYnV0ZSBpcyBub3QgaW5oZXJpdGFibGUuCi0gICAgICovCi0gICAgU3RyaW5nIGRlc2MoKSBkZWZhdWx0ICIiOwotICAgIAotICAgIC8qKgotICAgICAqIFNlcmlhbCBVSUQgdG8gYmUgcHV0IG9uIGNsYXNzIHdoZW4gZ2VuZXJhdGVkLgotICAgICAqIDxwPgotICAgICAqIFRoaXMgc2hvdWxkIGJlIHNldCBvbmx5IGZvciAiY29tcG9uZW50IHRlbXBsYXRlIiBjb2RlIGdlbmVyYXRpb24sIGllCi0gICAgICogd2hlcmUgdGhlIHN1cGVyQ2xhc3MgYXR0cmlidXRlIGlzIHNldC4gSW4gdGhpcyBjYXNlLCB0aGUgZ2VuZXJhdGVkCi0gICAgICogY2xhc3Mgd2lsbCBoYXZlIGEgc2VyaWFsVmVyc2lvblVJRCBjb25zdGFudCBkZWZpbmVkIHdoaWNoIGlzIHNldCB0bwotICAgICAqIHRoaXMgdmFsdWUuCi0gICAgICogPHA+Ci0gICAgICogVE9ETzogaXMgdGhpcyB2YWxpZD8gV2h5IGNhbid0IHRoZSBjb2RlLWdlbmVyYXRpb24ganVzdCBhZGQgYQotICAgICAqIHNlcmlhbFVpZCB2YWx1ZSBiYXNlZCB1cG9uIHdoYXQgdmVyc2lvbiBvZiB0aGUgdGVtcGxhdGUgd2FzIHVzZWQ/Ci0gICAgICogTWF5YmUgYmVjYXVzZSB0aGUgdGVtcGxhdGUgZ2VuZXJhdGVzIGRpZmZlcmVudCBzdHVmZiBiYXNlZCB1cG9uCi0gICAgICogd2hhdCBhdHRyaWJ1dGVzIGFyZSBkZWZpbmVkIGhlcmU/Ci0gICAgICovCi0gICAgU3RyaW5nIHNlcmlhbHVpZCgpIGRlZmF1bHQgIiI7Ci0gICAgCi0gICAgLyoqCi0gICAgICogSW50ZXJmYWNlcyB0aGF0IGdlbmVyYXRlZCBjbGFzc2VzIHNob3VsZCBpbXBsZW1lbnQuCi0gICAgICogPHA+Ci0gICAgICogVXNlZCBvbmx5IHdoZW4gImNvbXBvbmVudCB0ZW1wbGF0ZSIgY29kZSBnZW5lcmF0aW9uIGlzIHVzZWQuIFdoZW4KLSAgICAgKiBkZWZpbmVkLCB0aGVuIHRoZSBnZW5lcmF0ZWQgY2xhc3Mgd2lsbCBpbXBsZW1lbnQgdGhlIGxpc3RlZAotICAgICAqIGludGVyZmFjZXMgaW4gYWRkaXRpb24gdG8gdGhlIGludGVyZmFjZXMgdGhhdCB0aGlzIGFubm90YXRlZCBjbGFzcwotICAgICAqIGltcGxlbWVudHMuCi0gICAgICovCi0gICAgU3RyaW5nIGltcGxlbWVudHooKSBkZWZhdWx0ICIiOwotICAgIAotICAgIC8qKgotICAgICAqIEluZGljYXRlIGlmIHRoZSBwYXR0ZXJuIHVzZWQgdG8gZ2VuZXJhdGUgY29tcG9uZW50IGNsYXNzIGNvZGUgaXMKLSAgICAgKiB0ZW1wbGF0ZSAodHJ1ZSkgb3Igc3ViY2xhc3MgKGZhbHNlKS4KLSAgICAgKi8KLSAgICBib29sZWFuIHRlbXBsYXRlKCkgZGVmYXVsdCBmYWxzZTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBUaGUgbmFtZSBvZiB0aGUgZGVmYXVsdCBjbGllbnQgZXZlbnQgdG8gYmUgcmV0dXJuIG9uIG1ldGhvZAotICAgICAqIENsaWVudEJlaGF2aW9ySG9sZGVyLmdldERlZmF1bHRFdmVudE5hbWUoKS4gVGhpcyBwcm9wZXJ0eSBpcwotICAgICAqIEpTRiAyLjAgc3BlY2lmaWMsIGFuZCB0aGUgY29tcG9uZW50IG11c3QgaW1wbGVtZW50IAotICAgICAqIGphdmF4LmZhY2VzLmNvbXBvbmVudC5iZWhhdmlvci5DbGllbnRCZWhhdmlvckhvbGRlciBpbnRlcmZhY2UuICAKLSAgICAgKiAKLSAgICAgKiBAc2luY2UgMS4wLjQKLSAgICAgKi8KLSAgICBTdHJpbmcgZGVmYXVsdEV2ZW50TmFtZSgpIGRlZmF1bHQgIiI7Ci0KLSAgICAvKioKLSAgICAgKiAKLSAgICAgKiBAc2luY2UgMS4wLjUKLSAgICAgKi8KLSAgICBib29sZWFuIGNvbXBvc2l0ZSgpIGRlZmF1bHQgZmFsc2U7Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItYW5ub3RhdGlvbnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvYW5ub3RhdGlvbi9KU0ZDb252ZXJ0ZXIuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1hbm5vdGF0aW9ucy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9hbm5vdGF0aW9uL0pTRkNvbnZlcnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjMzOGMwLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1hbm5vdGF0aW9ucy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9hbm5vdGF0aW9uL0pTRkNvbnZlcnRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5idWlsZGVyLmFubm90YXRpb247Ci0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Eb2N1bWVudGVkOwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlOwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3k7Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0OwotCi0vKioKLSAqIFVzZWQgdG8gZGVmaW5lIGEganNmIGNvbnZlcnRlci4KLSAqIAotICogQGF1dGhvciBMZW9uYXJkbyBVcmliZSAobGF0ZXN0IG1vZGlmaWNhdGlvbiBieSAkQXV0aG9yJCkKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCi0gKi8KLUBEb2N1bWVudGVkCi1AVGFyZ2V0KEVsZW1lbnRUeXBlLlRZUEUpCi1AUmV0ZW50aW9uKFJldGVudGlvblBvbGljeS5TT1VSQ0UpCi1wdWJsaWMgQGludGVyZmFjZSBKU0ZDb252ZXJ0ZXIKLXsKLSAgICAvKioKLSAgICAgKiBJbmRpY2F0ZSB0aGUgY29udmVydGVySWQgd2hpY2ggaWRlbnRpZmllcyB0aGlzIGNsYXNzLiBJZiBub3QgZGVmaW5lZCwKLSAgICAgKiBpdCB0cmllcyB0byBnZXQgdGhlIHZhbHVlIG9mIHRoZSBmaWVsZCBDT05WRVJURVJfSUQuIAotICAgICAqLwotICAgIFN0cmluZyBpZCgpIGRlZmF1bHQgIiI7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgbmFtZSBvZiB0aGUgY29tcG9uZW50IGluIGEgcGFnZSAoZXg6IHg6bXljb21wKS4KLSAgICAgKi8KLSAgICBTdHJpbmcgbmFtZSgpIGRlZmF1bHQgIiI7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgdGFnIGNsYXNzIHVzZWQgZm9yIHRoaXMgY29udmVydGVyLCBpZiBhcHBsaWVzLgotICAgICAqLwotICAgIFN0cmluZyB0YWdDbGFzcygpIGRlZmF1bHQgIiI7Ci0gICAgCi0gICAgLyoqCi0gICAgICogVGFnIHN1cGVyIGNsYXNzIHRoYXQgaW5oZXJpdHMgdGhlIHRhZyBjbGFzcwotICAgICAqLwotICAgIFN0cmluZyB0YWdTdXBlcmNsYXNzKCkgZGVmYXVsdCAiIjsKLQotICAgIC8qKgotICAgICAqIEluZGljYXRlIHRoYXQgdGhpcyBjb21wb25lbnQgc2hvdWxkIG5vdCBiZSBkZWZpbmVkIG9uIGZhY2VzLWNvbmZpZy54bWwuCi0gICAgICogQW55d2F5LCBpZiB0aGlzIGlzIHRydWUgb3IgZmFsc2UgZG9lcyBub3QgaGF2ZSBhbnkgc2lnbmlmaWNhdGl2ZSBpbXBhY3QuIAotICAgICAqIAotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBib29sZWFuIGNvbmZpZ0V4Y2x1ZGVkKCkgZGVmYXVsdCBmYWxzZTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBJbmRpY2F0ZSBpZiB0aGUgZWxlbWVudCBhY2NlcHQgaW5uZXIgZWxlbWVudHMgb3Igbm90LgotICAgICAqLwotICAgIFN0cmluZyBib2R5Q29udGVudCgpIGRlZmF1bHQgIiI7Ci0gICAgCi0gICAgLyoqCi0gICAgICogU2hvcnQgZGVzY3JpcHRpb24KLSAgICAgKi8KLSAgICBTdHJpbmcgZGVzYygpIGRlZmF1bHQgIiI7Ci0gICAgCi0gICAgLyoqCi0gICAgICogU2VyaWFsIHVpZCB0aGF0IHNob3VsZCBiZSBhZGRlZCBvbiBnZW5lcmF0ZWQgdGFnIGNsYXNzCi0gICAgICogCi0gICAgICogQHNpbmNlIDEuMC4zCi0gICAgICovCi0gICAgU3RyaW5nIHNlcmlhbHVpZHRhZygpIGRlZmF1bHQgIiI7Ci0gICAgCi0gICAgLyoqCi0gICAgICogVGhlIGZ1bGx5LXF1YWxpZmllZC1uYW1lIG9mIGEgY29uY3JldGUgY29udmVydGVyIGNsYXNzLgotICAgICAqIDxwPgotICAgICAqIFRoaXMgYXR0cmlidXRlIGlzIG9ubHkgcmVsZXZhbnQgd2hlbiAibmFtZSIgaXMgYWxzbyBzZXQsIGllIHRoZQotICAgICAqIGFubm90YXRpb24gaXMgaW5kaWNhdGluZyB0aGF0IGEgY29udmVydGVyIGlzIHJlYWxseSBiZWluZyBkZWNsYXJlZC4KLSAgICAgKiA8cD4KLSAgICAgKiBXaGVuIHRoaXMgYXR0cmlidXRlIGlzIG5vdCBkZWZpbmVkIHRoZW4gaXQgaXMgYXNzdW1lZCB0aGF0IHRoaXMKLSAgICAgKiBhbm5vdGF0ZWQgY2xhc3MgaXMgdGhlIGFjdHVhbCBjb252ZXJ0ZXIgY2xhc3MuCi0gICAgICogPHA+Ci0gICAgICogV2hlbiB0aGlzIGF0dHJpYnV0ZSBpcyBzZXQgdG8gc29tZXRoaW5nIG90aGVyIHRoYW4gdGhlIG5hbWUgb2YgdGhlCi0gICAgICogYW5ub3RhdGVkIGNsYXNzIHRoZW4gdGhlIHNwZWNpZmllZCBjbGFzcyBpcyB0aGUgb25lIHRoYXQgdGhlIEpTRgotICAgICAqIGNvbnZlcnRlciByZWdpc3RyYXRpb24gaW4gZmFjZXMtY29uZmlnLnhtbCB3aWxsIHJlZmVyIHRvLiBBbmQgaWYgdGhhdAotICAgICAqIGNsYXNzIGRvZXMgbm90IGV4aXN0IGluIHRoZSBjbGFzc3BhdGggKHdoaWNoIHdpbGwgbm9ybWFsbHkgYmUgdGhlCi0gICAgICogY2FzZSkgdGhlbiBjb2RlLWdlbmVyYXRpb24gd2lsbCBiZSB0cmlnZ2VyZWQgdG8gY3JlYXRlIGl0LgotICAgICAqIDxwPgotICAgICAqIFRoaXMgYXR0cmlidXRlIGlzIG5vdCBpbmhlcml0YWJsZS4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgZG9jbGV0LWFubm90YXRpb24gZXF1aXZhbGVudCBvZiB0aGlzIGF0dHJpYnV0ZSBpcyBuYW1lZCAiY2xhc3MiLgotICAgICAqIAotICAgICAqIEBzaW5jZSAxLjAuNwotICAgICAqLwotICAgIFN0cmluZyBjbGF6eigpIGRlZmF1bHQgIiI7Ci0gICAgCi0gICAgLyoqCi0gICAgICogSW5kaWNhdGUgdGFnIGhhbmRsZXIgY2xhc3MgdXNlZCBmb3IgdGhpcyBjb21wb25lbnQgb24gZmFjZWxldHMuCi0gICAgICogCi0gICAgICogQHNpbmNlIDEuMC43Ci0gICAgICovCi0gICAgU3RyaW5nIHRhZ0hhbmRsZXIoKSBkZWZhdWx0ICIiOwotICAgIAotICAgIC8qKgotICAgICAqIEluZGljYXRlIHRoYXQgdGhlIEVMIEV4cHJlc3Npb25zIHNob3VsZCBiZSBzdG9yZWQgdXNpbmcgCi0gICAgICogc2V0VmFsdWVFeHByZXNzaW9uKCkgbWV0aG9kLCBpbnN0ZWFkIGV2YWx1YXRlIHRoZW0gYXQgYnVpbGQgdmlldwotICAgICAqIHRpbWUuIExhdGVyIHRoZSBFTCBFeHByZXNzaW9ucyB3aWxsIGJlIGV2YWx1YXRlZCBhY2NvcmRpbmcgdG8KLSAgICAgKiB0aGVpciBuZWVkcwotICAgICAqIAotICAgICAqIEBzaW5jZSAxLjAuNwotICAgICAqLwotICAgIGJvb2xlYW4gZXZhbHVhdGVFTE9uRXhlY3V0aW9uKCkgZGVmYXVsdCBmYWxzZTsKLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1hbm5vdGF0aW9ucy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9hbm5vdGF0aW9uL0pTRkV4Y2x1ZGUuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1hbm5vdGF0aW9ucy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9hbm5vdGF0aW9uL0pTRkV4Y2x1ZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWM3Y2M5Zi4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItYW5ub3RhdGlvbnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvYW5ub3RhdGlvbi9KU0ZFeGNsdWRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uYnVpbGRlci5hbm5vdGF0aW9uOwotCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRG9jdW1lbnRlZDsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZTsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5OwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsKLQotLyoqCi0gKiBJbmRpY2F0ZSB0aGF0IHRoaXMgY29kZSBtdXN0IGJlIGV4Y2x1ZGVkIGZyb20gY29weWluZyB3aGVuIGdlbmVyYXRpb24gdXNpbmcgYSAKLSAqIHRlbXBsYXRlIHBhY2thZ2Ugc2NvcGVkIGNsYXNzIGlzIHVzZWQuIAotICogCi0gKiBUSElTIE9OTFkgU0hPVUxEIEJFIFVTRUQgSU4gVkVSWSBTUEVDSUFMIENBU0VTIAotICogCi0gKiAoVXNlIGFic3RyYWN0IHBhdHRlcm4gdG8gYWRkIGN1c3RvbSBjb2RlIG9uIGNvbXBvbmVudCBjbGFzcyBpbnN0ZWFkKS4KLSAqIAotICogQGF1dGhvciBMZW9uYXJkbyBVcmliZSAobGF0ZXN0IG1vZGlmaWNhdGlvbiBieSAkQXV0aG9yJCkKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCi0gKi8KLUBEb2N1bWVudGVkCi1AVGFyZ2V0KHZhbHVlPXsKLSAgICAgICAgRWxlbWVudFR5cGUuVFlQRSwKLSAgICAgICAgRWxlbWVudFR5cGUuTUVUSE9ELAotICAgICAgICBFbGVtZW50VHlwZS5MT0NBTF9WQVJJQUJMRSwKLSAgICAgICAgRWxlbWVudFR5cGUuRklFTEQsCi0gICAgICAgIEVsZW1lbnRUeXBlLkNPTlNUUlVDVE9SfSkKLUBSZXRlbnRpb24oUmV0ZW50aW9uUG9saWN5LlNPVVJDRSkKLXB1YmxpYyBAaW50ZXJmYWNlIEpTRkV4Y2x1ZGUKLXsKLQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLWFubm90YXRpb25zL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL2Fubm90YXRpb24vSlNGRmFjZWxldEF0dHJpYnV0ZS5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLWFubm90YXRpb25zL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL2Fubm90YXRpb24vSlNGRmFjZWxldEF0dHJpYnV0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMmQ1NTQ5Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1hbm5vdGF0aW9ucy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9hbm5vdGF0aW9uL0pTRkZhY2VsZXRBdHRyaWJ1dGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOCArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uYnVpbGRlci5hbm5vdGF0aW9uOwotCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRG9jdW1lbnRlZDsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZTsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5OwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsKLQotLyoqCi0gKiAKLSAqIERlZmluZSBhIGZhY2VsZXQgdGFnIGF0dHJpYnV0ZS4gVGhpcyBkb2NsZXQgc2hvdWxkIGJlIHVzZWQgaW5zaWRlIGEgQEpTRkZhY2VsZXRUYWcgY2xhc3MsIAotICogdG8gZGVmaW5lIGluZGl2aWR1YWwgdGFnIGNsYXNzZXMgdXNlZCBpbiBKU0YKLSAqIAotICogVGhpcyBhbm5vdGF0aW9uIHNob3VsZCBvbmx5IGJlIHVzZWQgaW4ganNmIDIuMCBsaWJyYXJpZXMuCi0gKiAKLSAqIEBzaW5jZSAxLjAuNAotICogQGF1dGhvciBMZW9uYXJkbyBVcmliZSAobGF0ZXN0IG1vZGlmaWNhdGlvbiBieSAkQXV0aG9yJCkKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCi0gKi8KLUBEb2N1bWVudGVkCi1AVGFyZ2V0KHZhbHVlPXsKLSAgICAgICAgRWxlbWVudFR5cGUuVFlQRSwKLSAgICAgICAgRWxlbWVudFR5cGUuTUVUSE9ELAotICAgICAgICBFbGVtZW50VHlwZS5MT0NBTF9WQVJJQUJMRSwKLSAgICAgICAgRWxlbWVudFR5cGUuRklFTEQKLSAgICAgICAgfSkKLUBSZXRlbnRpb24oUmV0ZW50aW9uUG9saWN5LlNPVVJDRSkKLXB1YmxpYyBAaW50ZXJmYWNlIEpTRkZhY2VsZXRBdHRyaWJ1dGUKLXsKLSAgICAvKioKLSAgICAgKiBUaGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlLiBUaGlzIGlzIHRoZSBuYW1lIG9uIHRoZSB0bGQKLSAgICAgKiAKLSAgICAgKiBAc2luY2UgMS4wLjQKLSAgICAgKi8KLSAgICBTdHJpbmcgbmFtZSgpIGRlZmF1bHQgIiI7Ci0gICAgCi0gICAgLyoqCi0gICAgICogVGhlIGNsYXNzIG9yIHR5cGUgdGhlIGNvbXBvbmVudCBtdXN0IHJlZmVyIG9uIHRoZSB0YWcgY2xhc3MuIAotICAgICAqIE9uIDEuMSBpcyBqYXZhLmxhbmcuU3RyaW5nIGFsd2F5cyBhbmQgb24gMS4yIGlzIAotICAgICAqIGphdmF4LmVsLlZhbHVlRXhwcmVzc2lvbiBvciBqYXZheC5lbC5NZXRob2RFeHByZXNzaW9uLgotICAgICAqIAotICAgICAqIEBzaW5jZSAxLjAuNAotICAgICAqLwotICAgIFN0cmluZyBjbGFzc05hbWUoKSBkZWZhdWx0ICIiOwotICAgIAotICAgIC8qKgotICAgICAqIExvbmcgZGVzY3JpcHRpb24uIEJ5IGRlZmF1bHQsIGl0IHRha2VzIHdoYXQgaXMgaW5zaWRlIGNvbW1lbnQgYXJlYS4KLSAgICAgKiAKLSAgICAgKiBAc2luY2UgMS4wLjQKLSAgICAgKi8KLSAgICBTdHJpbmcgbG9uZ0Rlc2NyaXB0aW9uKCkgZGVmYXVsdCAiIjsKLSAgICAKLSAgICAvKioKLSAgICAgKiAodHJ1ZXxmYWxzZSkgRGVmaW5lIGlmIHRoZSBwcm9wZXJ0eSBpcyByZXF1aXJlZCBvciBub3QuIERlZmF1bHQ6ZmFsc2UKLSAgICAgKiAKLSAgICAgKiBAc2luY2UgMS4wLjQKLSAgICAgKi8KLSAgICBib29sZWFuIHJlcXVpcmVkKCkgZGVmYXVsdCBmYWxzZTsKLSAgICAKLSAgICAvKioKLSAgICAgKiAodHJ1ZXxmYWxzZSkgVGhpcyB2YWx1ZSBpcyBwdXQgb24gdGhlIHRsZCB3aGVuIGFwcGxpZXMgCi0gICAgICogYW5kIGNsYXNzTmFtZSBpcyBub3QgamF2YXguZWwuVmFsdWVFeHByZXNzaW9uIG9yIAotICAgICAqIGphdmF4LmVsLk1ldGhvZEV4cHJlc3Npb24uCi0gICAgICogCi0gICAgICogQHNpbmNlIDEuMC40Ci0gICAgICovCi0gICAgYm9vbGVhbiBydGV4cHJ2YWx1ZSgpIGRlZmF1bHQgZmFsc2U7Ci0gICAgCi0gICAgLyoqCi0gICAgICogU2hvcnQgZGVzY3JpcHRpb24KLSAgICAgKiAKLSAgICAgKiBAc2luY2UgMS4wLjQKLSAgICAgKi8KLSAgICBTdHJpbmcgZGVzYygpIGRlZmF1bHQgIiI7Ci0KLSAgICAvKioKLSAgICAgKiBJbmRpY2F0ZSB0aGUgdHlwZSB0aGF0IHZhbHVlcyBzaG91bGQgYmUKLSAgICAgKiBjYXN0IG9uIHRsZC4gSXQgaXMgc3VwcG9zZWQgdGhhdCB0aGUgY2xhc3NOYW1lIGlzCi0gICAgICogamF2YXguZWwuVmFsdWVFeHByZXNzaW9uIHRvIGFwcGx5IGl0LiAKLSAgICAgKgotICAgICAqIEBzaW5jZSAxLjAuNAotICAgICAqLwotICAgIFN0cmluZyBkZWZlcnJlZFZhbHVlVHlwZSgpIGRlZmF1bHQgIiI7Ci0KLSAgICAvKioKLSAgICAgKiBJbmRpY2F0ZSB0aGUgbWV0aG9kIHNpZ25hdHVyZSB0aGF0IHZhbHVlcyBzaG91bGQgYmUKLSAgICAgKiBjYXN0IG9uIHRsZC4gSXQgaXMgc3VwcG9zZWQgdGhhdCB0aGUgY2xhc3NOYW1lIGlzCi0gICAgICogamF2YXguZWwuTWV0aG9kRXhwcmVzc2lvbiB0byBhcHBseSBpdC4gCi0gICAgICoKLSAgICAgKiBAc2luY2UgMS4wLjQKLSAgICAgKi8KLSAgICBTdHJpbmcgZGVmZXJyZWRNZXRob2RTaWduYXR1cmUoKSBkZWZhdWx0ICIiOwotICAgIAotICAgIC8qKgotICAgICAqIE1hcmsgdGhpcyBwcm9wZXJ0eSB0byBub3QgYmUgaW5jbHVkZWQgb24gdGhlIHRsZC4KLSAgICAgKiAKLSAgICAgKiBAc2luY2UgMS4wLjQKLSAgICAgKi8KLSAgICBib29sZWFuIGV4Y2x1ZGUoKSBkZWZhdWx0IGZhbHNlOwotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLWFubm90YXRpb25zL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL2Fubm90YXRpb24vSlNGRmFjZWxldEF0dHJpYnV0ZXMuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1hbm5vdGF0aW9ucy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9hbm5vdGF0aW9uL0pTRkZhY2VsZXRBdHRyaWJ1dGVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2NTJiYWMuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLWFubm90YXRpb25zL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL2Fubm90YXRpb24vSlNGRmFjZWxldEF0dHJpYnV0ZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5idWlsZGVyLmFubm90YXRpb247Ci0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Eb2N1bWVudGVkOwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlOwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3k7Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0OwotCi0vKioKLSAqIERlZmluZSBhIHNldCBvZiBwcm9wZXJ0aWVzIHVzZWQgdG8gZ3JvdXAgc2V2ZXJhbCBkZWZpbml0aW9ucwotICogb2YgSlNGRmFjZWxldEF0dHJpYnV0ZSBhbm5vdGF0aW9ucy4KLSAqIAotICogVGhpcyBhbm5vdGF0aW9uIHNob3VsZCBvbmx5IGJlIHVzZWQgaW4ganNmIDIuMCBsaWJyYXJpZXMuCi0gKiAKLSAqIEBzaW5jZSAxLjAuNAotICogQGF1dGhvciBMZW9uYXJkbyBVcmliZSAobGF0ZXN0IG1vZGlmaWNhdGlvbiBieSAkQXV0aG9yJCkKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCi0gKi8KLUBEb2N1bWVudGVkCi1AVGFyZ2V0KEVsZW1lbnRUeXBlLlRZUEUpCi1AUmV0ZW50aW9uKFJldGVudGlvblBvbGljeS5TT1VSQ0UpCi1wdWJsaWMgQGludGVyZmFjZSBKU0ZGYWNlbGV0QXR0cmlidXRlcwotewotCi0gICAgLyoqCi0gICAgICogQXJyYXkgb2YgSlNGRmFjZWxldEF0dHJpYnV0ZSB0byBiZSBkZWZpbmVkLgotICAgICAqIAotICAgICAqIEBzaW5jZSAxLjAuNAotICAgICAqLwotICAgIEpTRkZhY2VsZXRBdHRyaWJ1dGUgW10gYXR0cmlidXRlcygpOwotICAgIAotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLWFubm90YXRpb25zL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL2Fubm90YXRpb24vSlNGRmFjZWxldFRhZy5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLWFubm90YXRpb25zL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL2Fubm90YXRpb24vSlNGRmFjZWxldFRhZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYmQ0ODNkLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1hbm5vdGF0aW9ucy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9hbm5vdGF0aW9uL0pTRkZhY2VsZXRUYWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uYnVpbGRlci5hbm5vdGF0aW9uOwotCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRG9jdW1lbnRlZDsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZTsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5OwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsKLQotLyoqCi0gKiBVc2VkIHRvIGRlZmluZSBhIGpzZiBmYWNlbGV0IHRhZyBoYW5kbGVyLiAKLSAqIDxwPgotICogVGhlIGludGVudGlvbiBvZiB0aGlzIGFubm90YXRpb24gaXMgdXNlIGl0cyBpbmZvcm1hdGlvbiB0byBnZW5lcmF0ZSBhCi0gKiBmYWNlbGV0IHRhZ2xpYiB4bWwgZmlsZShvcHRpb25hbCksIGFuZCBjcmVhdGUgYSBzcGVjaWZpYyAKLSAqIGZhY2VsZXQgZG9jdW1lbnRhdGlvbiAoZ2VuZXJhdGUgYWx0ZXJuYXRlIC50bGQgZmlsZXMgYW5kIHVzZSAKLSAqIG1hdmVuLXRhZ2xpYi1wbHVnaW4gb24gdGhlc2UgZmlsZXMpLgotICogSW4gb3JkZXIgdG8gZG8gdGhhdCwgdGhpcyBhbm5vdGF0aW9uIGhhcyBtdWx0aXBsZSB1c2UgY2FzZXM6Ci0gKiA8L3A+Ci0gKiA8dWw+Ci0gKiA8bGk+RGVmaW5lIGEgY29tcG9uZW50IG9ubHkgYXZhaWxhYmxlIG9uIGZhY2VsZXRzLjwvbGk+Ci0gKiA8bGk+V2hlbiBhIGNvbXBvbmVudCBoYXMgYWRkaXRpb25hbCBwcm9wZXJ0aWVzIG9ubHkgYXZhaWxhYmxlIG9uIGZhY2VsZXRzLgotICogSW4gdGhpcyBjYXNlLCB3ZSBzZXQgY29tcG9uZW50Q2xhc3MvY29udmVydGVyQ2xhc3MvdmFsaWRhdG9yQ2xhc3MvdGFnQ2xhc3MgYXR0cmlidXRlLgotICogVGhlIGVmZmVjdCBpcyB0aGF0IGFsbCBwcm9wZXJ0aWVzIGFuZCBkZXNjcmlwdGlvbnMgYXJlIGZsYXR0ZW5lZCB0byB0aGlzIGNsYXNzLiBJbiBvdGhlcgotICogd29yZHMsIHdoZW4gdGhlIGRvY3VtZW50YXRpb24gb2YgdGhlIGFubm90YXRlZCBmYWNlbGV0IHRhZyBoYW5kbGVyIGlzIGdlbmVyYXRlZCwgCi0gKiB0aGlzIGluZm9ybWF0aW9uIHByZWNlZGVzIHRoZSBvbmUgcG9pbnRlZCBieSB0aGUgYW5ub3RhdGlvbi4gVGhpcyBvbmx5IGhhcHBlbnMgd2hlbgotICogbmFtZSBhdHRyaWJ1dGUgbWF0Y2guPC9saT4KLSAqIDxsaT5XaGVuIGEgY29tcG9uZW50IGRvZXMgbm90IGhhdmUgYW4gc3BlY2lmaWMgdGFnIGhhbmRsZXIsIHNvIHdlIGNhbiBjcmVhdGUKLSAqIGEgZHVtbXkgdGFnIGhhbmRsZXIsIGFubm90YXRlIGl0IGFuZCBzZXQgY29uZmlnRXhjbHVkZWQ9dHJ1ZSwgc28gd2UgY2FuIAotICogZG9jdW1lbnQgaXQgaW5zdGVhZCBwdXQgdGhpcyBpbmZvcm1hdGlvbiBvbiB0aGUgYmFzZSB0bGQgdXNlZCB0byBnZW5lcmF0ZS4KLSAqIFRoaXMgaXMgdGhlIGNhc2Ugb2YgaDpvdXRwdXRTY3JpcHQgb3IgaDpvdXRwdXRTdHlsZXNoZWV0PC9saT4KLSAqIDwvdWw+Ci0gKiAKLSAqIFRoaXMgYW5ub3RhdGlvbiBzaG91bGQgb25seSBiZSB1c2VkIGluIGpzZiAyLjAgbGlicmFyaWVzLgotICogCi0gKiBAc2luY2UgMS4wLjQKLSAqIEBhdXRob3IgTGVvbmFyZG8gVXJpYmUgKGxhdGVzdCBtb2RpZmljYXRpb24gYnkgJEF1dGhvciQpCi0gKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAotICovCi1ARG9jdW1lbnRlZAotQFRhcmdldChFbGVtZW50VHlwZS5UWVBFKQotQFJldGVudGlvbihSZXRlbnRpb25Qb2xpY3kuU09VUkNFKQotcHVibGljIEBpbnRlcmZhY2UgSlNGRmFjZWxldFRhZwotewotICAgIC8qKgotICAgICAqIEluZGljYXRlIGlmIHRoZSBlbGVtZW50IGFjY2VwdCBpbm5lciBlbGVtZW50cyBvciBub3QuIChKU1Agb3IgZW1wdHkpCi0gICAgICogCi0gICAgICogQHNpbmNlIDEuMC40Ci0gICAgICovCi0gICAgU3RyaW5nIGJvZHlDb250ZW50KCkgZGVmYXVsdCAiIjsKLSAgICAKLSAgICAvKioKLSAgICAgKiBTaG9ydCBkZXNjcmlwdGlvbgotICAgICAqIAotICAgICAqIEBzaW5jZSAxLjAuNAotICAgICAqLwotICAgIFN0cmluZyBkZXNjKCkgZGVmYXVsdCAiIjsKLSAgICAKLSAgICAvKioKLSAgICAgKiBMb25nIGRlc2NyaXB0aW9uLiBCeSBkZWZhdWx0LCBpdCB0YWtlcyB3aGF0IGlzIGluc2lkZSBjb21tZW50IGFyZWEuCi0gICAgICogCi0gICAgICogQHNpbmNlIDEuMC40Ci0gICAgICovCi0gICAgU3RyaW5nIGxvbmdEZXNjcmlwdGlvbigpIGRlZmF1bHQgIiI7ICAgIAotICAgIAotICAgIC8qKgotICAgICAqIFRoZSBuYW1lIG9mIHRoZSBjb21wb25lbnQgaW4gYSBwYWdlIChleDogeDpteWNvbXApLgotICAgICAqIAotICAgICAqIEBzaW5jZSAxLjAuNAotICAgICAqLwotICAgIFN0cmluZyBuYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAKLSAgICAvKioKLSAgICAgKiBJbmRpY2F0ZSB0aGF0IHRoaXMgZmFjZWxldCB0YWcgaGFuZGxlciBzaG91bGQgbm90IGJlIGRlZmluZWQgCi0gICAgICogb24gZmFjZWxldHMgdGFnbGliIHhtbCBmaWxlLgotICAgICAqIE5vdGUgdGhhdCBmb3Igc29tZSBsaWJyYXJpZXMgYSB4bWwgZmlsZSBpcyBub3QgZ2VuZXJhdGVkIAotICAgICAqIChsaWtlIGluIGNvcmUgMi4wKSwgaW5zdGVhZCBhIGxpYnJhcnkgY2xhc3MgaXMgZGVmaW5lZCwgCi0gICAgICogc28gaW4gdGhvc2UgY2FzZXMgc2V0IHRoaXMgdmFsdWUgaGFzIG5vIGVmZmVjdC4KLSAgICAgKiAKLSAgICAgKiBAc2luY2UgMS4wLjQKLSAgICAgKi8KLSAgICBib29sZWFuIGNvbmZpZ0V4Y2x1ZGVkKCkgZGVmYXVsdCBmYWxzZTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBUaGUgbmFtZSBvZiB0aGUgbW9zdCBuZWFyIGpzcCB0YWcgY2xhc3Mgd2hlcmUgYWxsCi0gICAgICogYXR0cmlidXRlcyBzaG91bGQgYmUgaW5oZXJpdGVkIGZyb20gdGhpcyBjbGFzcwotICAgICAqIAotICAgICAqIEBzaW5jZSAxLjAuNAotICAgICAqLwotICAgIFN0cmluZyB0YWdDbGFzcygpIGRlZmF1bHQgIiI7Ci0gICAgCi0gICAgLyoqCi0gICAgICogVGhlIG5hbWUgb2YgdGhlIG1vc3QgbmVhciBjb21wb25lbnQgY2xhc3Mgd2hlcmUgYWxsCi0gICAgICogYXR0cmlidXRlcyBzaG91bGQgYmUgaW5oZXJpdGVkIGZyb20gdGhpcyBjbGFzcwotICAgICAqIAotICAgICAqIEBzaW5jZSAxLjAuNAotICAgICAqLwotICAgIFN0cmluZyBjb21wb25lbnRDbGFzcygpIGRlZmF1bHQgIiI7Ci0gICAgCi0gICAgLyoqCi0gICAgICogVGhlIG5hbWUgb2YgdGhlIG1vc3QgbmVhciBjb252ZXJ0ZXIgY2xhc3Mgd2hlcmUgYWxsCi0gICAgICogYXR0cmlidXRlcyBzaG91bGQgYmUgaW5oZXJpdGVkIGZyb20gdGhpcyBjbGFzcwotICAgICAqIAotICAgICAqIEBzaW5jZSAxLjAuNAotICAgICAqLwotICAgIFN0cmluZyBjb252ZXJ0ZXJDbGFzcygpIGRlZmF1bHQgIiI7Ci0gICAgCi0gICAgLyoqCi0gICAgICogVGhlIG5hbWUgb2YgdGhlIG1vc3QgbmVhciB2YWxpZGF0b3IgY2xhc3Mgd2hlcmUgYWxsCi0gICAgICogYXR0cmlidXRlcyBzaG91bGQgYmUgaW5oZXJpdGVkIGZyb20gdGhpcyBjbGFzcwotICAgICAqIAotICAgICAqIEBzaW5jZSAxLjAuNAotICAgICAqLwotICAgIFN0cmluZyB2YWxpZGF0b3JDbGFzcygpIGRlZmF1bHQgIiI7Ci0gICAgCi0gICAgLyoqCi0gICAgICogVGhlIG5hbWUgb2YgdGhlIG1vc3QgbmVhciBiZWhhdmlvciBjbGFzcyB3aGVyZSBhbGwKLSAgICAgKiBhdHRyaWJ1dGVzIHNob3VsZCBiZSBpbmhlcml0ZWQgZnJvbSB0aGlzIGNsYXNzCi0gICAgICogCi0gICAgICogQHNpbmNlIDEuMC41Ci0gICAgICovCi0gICAgU3RyaW5nIGJlaGF2aW9yQ2xhc3MoKSBkZWZhdWx0ICIiOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1hbm5vdGF0aW9ucy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9hbm5vdGF0aW9uL0pTRkZhY2VsZXRUYWdzLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItYW5ub3RhdGlvbnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvYW5ub3RhdGlvbi9KU0ZGYWNlbGV0VGFncy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNDZmOGY2Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1hbm5vdGF0aW9ucy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9hbm5vdGF0aW9uL0pTRkZhY2VsZXRUYWdzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uYnVpbGRlci5hbm5vdGF0aW9uOwotCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRG9jdW1lbnRlZDsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZTsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5OwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsKLQotLyoqCi0gKiBEZWZpbmUgYSBzZXQgb2YgdGFncyB0aGF0IHVzZXMgdGhlIHRhZyBoYW5kbGVyIGNsYXNzIGFubm90YXRlZC4KLSAqIDxwPgotICogSW4ganNwLCBlYWNoIHRhZyAocmVhZCBpdCBhcyBjb21wb25lbnQvY29udmVydGVyL3ZhbGlkYXRvci90YWcpCi0gKiBoYXMgb25lIHNwZWNpZmljIHRhZyBmaWxlIHRoYXQgb25seSB3b3JrcyBmb3IuIEJ1dCBpbiBmYWNlbGV0cywKLSAqIG9uZSB0YWcgaGFuZGxlciBjb3VsZCB0YWtlIGNhcmUgb2YgbXVsdGlwbGUgdGFncy4gCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIFRoaXMgdGFnIGlzIHVzZWQgdG8gZ3JvdXAgc2V2ZXJhbCBKU0ZGYWNlbGV0VGFnIGRlZmluaXRpb25zIGFuZAotICogaW5kaWNhdGUgdGhhdCB0aGUgdGFnIGhhbmRsZXIgYW5ub3RhdGVkIGJ5IHRoaXMgYW5ub3RhdGlvbnMgaGFuZGxlCi0gKiB0aGUgc2VsZWN0ZWQgdGFncy4KLSAqIDwvcD4KLSAqIDxwPgotICogVGhpcyBhbm5vdGF0aW9uIHNob3VsZCBvbmx5IGJlIHVzZWQgaW4ganNmIDIuMCBsaWJyYXJpZXMuCi0gKiA8L3A+Ci0gKiAKLSAqIEBzaW5jZSAxLjAuNAotICogQGF1dGhvciBMZW9uYXJkbyBVcmliZSAobGF0ZXN0IG1vZGlmaWNhdGlvbiBieSAkQXV0aG9yJCkKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCi0gKi8KLUBEb2N1bWVudGVkCi1AVGFyZ2V0KEVsZW1lbnRUeXBlLlRZUEUpCi1AUmV0ZW50aW9uKFJldGVudGlvblBvbGljeS5TT1VSQ0UpCi1wdWJsaWMgQGludGVyZmFjZSBKU0ZGYWNlbGV0VGFncwotewotCi0gICAgLyoqCi0gICAgICogQXJyYXkgb2YgSlNGRmFjZWxldFRhZ3MgdG8gYmUgZGVmaW5lZC4KLSAgICAgKiAKLSAgICAgKiBAc2luY2UgMS4wLjQKLSAgICAgKi8KLSAgICBKU0ZGYWNlbGV0VGFnIFtdIHRhZ3MoKTsKLSAgICAKLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1hbm5vdGF0aW9ucy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9hbm5vdGF0aW9uL0pTRkZhY2V0LmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItYW5ub3RhdGlvbnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvYW5ub3RhdGlvbi9KU0ZGYWNldC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYzVmNDcyLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1hbm5vdGF0aW9ucy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9hbm5vdGF0aW9uL0pTRkZhY2V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uYnVpbGRlci5hbm5vdGF0aW9uOwotCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRG9jdW1lbnRlZDsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZTsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5OwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsKLQotLyoqCi0gKiBJbmRpY2F0ZSB0aGF0IHRoaXMgbWV0aG9kIGlzIGEgZmFjZXQgbWV0aG9kLgotICogCi0gKiBAYXV0aG9yIExlb25hcmRvIFVyaWJlIChsYXRlc3QgbW9kaWZpY2F0aW9uIGJ5ICRBdXRob3IkKQotICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKLSAqLwotQERvY3VtZW50ZWQKLUBUYXJnZXQoRWxlbWVudFR5cGUuTUVUSE9EKQotQFJldGVudGlvbihSZXRlbnRpb25Qb2xpY3kuU09VUkNFKQotcHVibGljIEBpbnRlcmZhY2UgSlNGRmFjZXQKLXsKLQotICAgIC8qKgotICAgICAqICh0cnVlfGZhbHNlKSBEZWZpbmUgaWYgdGhlIHByb3BlcnR5IGlzIHJlcXVpcmVkIG9yIG5vdC4gRGVmYXVsdDpmYWxzZQotICAgICAqLwotICAgIGJvb2xlYW4gcmVxdWlyZWQoKSBkZWZhdWx0IGZhbHNlOwotICAgIAotICAgIC8qKgotICAgICAqIFNob3J0IGRlc2NyaXB0aW9uCi0gICAgICovCi0gICAgU3RyaW5nIGRlc2MoKSBkZWZhdWx0ICIiOwotCi19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItYW5ub3RhdGlvbnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvYW5ub3RhdGlvbi9KU0ZKc3BBdHRyaWJ1dGUuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1hbm5vdGF0aW9ucy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9hbm5vdGF0aW9uL0pTRkpzcEF0dHJpYnV0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5N2RkZWE2Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1hbm5vdGF0aW9ucy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9hbm5vdGF0aW9uL0pTRkpzcEF0dHJpYnV0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5idWlsZGVyLmFubm90YXRpb247Ci0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Eb2N1bWVudGVkOwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlOwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3k7Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0OwotCi0vKioKLSAqIAotICogRGVmaW5lIGEgdGFnIGF0dHJpYnV0ZS4gVGhpcyBkb2NsZXQgc2hvdWxkIGJlIHVzZWQgaW5zaWRlIGEgQEpTRkpzcFRhZyBjbGFzcywgCi0gKiB0byBkZWZpbmUgaW5kaXZpZHVhbCB0YWcgY2xhc3NlcyB1c2VkIGluIEpTRiwgbGlrZSBmOnZlcmJhdGltIG9yIGY6YWN0aW9uTGlzdGVuZXIKLSAqIAotICogQGF1dGhvciBMZW9uYXJkbyBVcmliZSAobGF0ZXN0IG1vZGlmaWNhdGlvbiBieSAkQXV0aG9yJCkKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCi0gKi8KLUBEb2N1bWVudGVkCi1AVGFyZ2V0KEVsZW1lbnRUeXBlLk1FVEhPRCkKLUBSZXRlbnRpb24oUmV0ZW50aW9uUG9saWN5LlNPVVJDRSkKLXB1YmxpYyBAaW50ZXJmYWNlIEpTRkpzcEF0dHJpYnV0ZQotewotICAgIC8qKgotICAgICAqIFRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUuIFRoaXMgaXMgdGhlIG5hbWUgb24gdGhlIHRsZAotICAgICAqLwotICAgIFN0cmluZyBuYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAKLSAgICAvKioKLSAgICAgKiBUaGUgY2xhc3Mgb3IgdHlwZSB0aGUgY29tcG9uZW50IG11c3QgcmVmZXIgb24gdGhlIHRhZyBjbGFzcy4gCi0gICAgICogT24gMS4xIGlzIGphdmEubGFuZy5TdHJpbmcgYWx3YXlzIGFuZCBvbiAxLjIgaXMgCi0gICAgICogamF2YXguZWwuVmFsdWVFeHByZXNzaW9uIG9yIGphdmF4LmVsLk1ldGhvZEV4cHJlc3Npb24uCi0gICAgICovCi0gICAgU3RyaW5nIGNsYXNzTmFtZSgpIGRlZmF1bHQgIiI7Ci0gICAgCi0gICAgLyoqCi0gICAgICogTG9uZyBkZXNjcmlwdGlvbi4gQnkgZGVmYXVsdCwgaXQgdGFrZXMgd2hhdCBpcyBpbnNpZGUgY29tbWVudCBhcmVhLgotICAgICAqLwotICAgIFN0cmluZyBsb25nRGVzY3JpcHRpb24oKSBkZWZhdWx0ICIiOwotICAgIAotICAgIC8qKgotICAgICAqICh0cnVlfGZhbHNlKSBEZWZpbmUgaWYgdGhlIHByb3BlcnR5IGlzIHJlcXVpcmVkIG9yIG5vdC4gRGVmYXVsdDpmYWxzZQotICAgICAqLwotICAgIGJvb2xlYW4gcmVxdWlyZWQoKSBkZWZhdWx0IGZhbHNlOwotICAgIAotICAgIC8qKgotICAgICAqICh0cnVlfGZhbHNlKSBUaGlzIHZhbHVlIGlzIHB1dCBvbiB0aGUgdGxkIHdoZW4gYXBwbGllcyAKLSAgICAgKiBhbmQgY2xhc3NOYW1lIGlzIG5vdCBqYXZheC5lbC5WYWx1ZUV4cHJlc3Npb24gb3IgCi0gICAgICogamF2YXguZWwuTWV0aG9kRXhwcmVzc2lvbi4KLSAgICAgKi8KLSAgICBib29sZWFuIHJ0ZXhwcnZhbHVlKCkgZGVmYXVsdCBmYWxzZTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBTaG9ydCBkZXNjcmlwdGlvbgotICAgICAqLwotICAgIFN0cmluZyBkZXNjKCkgZGVmYXVsdCAiIjsKLQotICAgIC8qKgotICAgICAqIEluZGljYXRlIHRoZSB0eXBlIHRoYXQgdmFsdWVzIHNob3VsZCBiZQotICAgICAqIGNhc3Qgb24gdGxkLiBJdCBpcyBzdXBwb3NlZCB0aGF0IHRoZSBjbGFzc05hbWUgaXMKLSAgICAgKiBqYXZheC5lbC5WYWx1ZUV4cHJlc3Npb24gdG8gYXBwbHkgaXQuIAotICAgICAqCi0gICAgICogQHNpbmNlIDEuMC4zCi0gICAgICovCi0gICAgU3RyaW5nIGRlZmVycmVkVmFsdWVUeXBlKCkgZGVmYXVsdCAiIjsKLQotICAgIC8qKgotICAgICAqIEluZGljYXRlIHRoZSBtZXRob2Qgc2lnbmF0dXJlIHRoYXQgdmFsdWVzIHNob3VsZCBiZQotICAgICAqIGNhc3Qgb24gdGxkLiBJdCBpcyBzdXBwb3NlZCB0aGF0IHRoZSBjbGFzc05hbWUgaXMKLSAgICAgKiBqYXZheC5lbC5NZXRob2RFeHByZXNzaW9uIHRvIGFwcGx5IGl0LiAKLSAgICAgKgotICAgICAqIEBzaW5jZSAxLjAuMwotICAgICAqLwotICAgIFN0cmluZyBkZWZlcnJlZE1ldGhvZFNpZ25hdHVyZSgpIGRlZmF1bHQgIiI7Ci0gICAgCi0gICAgLyoqCi0gICAgICogTWFyayB0aGlzIHByb3BlcnR5IHRvIG5vdCBiZSBpbmNsdWRlZCBvbiB0aGUgdGxkLgotICAgICAqIAotICAgICAqIEBzaW5jZSAxLjAuMwotICAgICAqLwotICAgIGJvb2xlYW4gZXhjbHVkZSgpIGRlZmF1bHQgZmFsc2U7Ci0gICAgCi0gICAgLyoqCi0gICAgICogCi0gICAgICogQHNpbmNlIDEuMC41Ci0gICAgICovCi0gICAgYm9vbGVhbiBmYWNlbGV0c09ubHkoKSBkZWZhdWx0IGZhbHNlOwotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLWFubm90YXRpb25zL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL2Fubm90YXRpb24vSlNGSnNwUHJvcGVydGllcy5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLWFubm90YXRpb25zL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL2Fubm90YXRpb24vSlNGSnNwUHJvcGVydGllcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYmMwNjZmLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1hbm5vdGF0aW9ucy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9hbm5vdGF0aW9uL0pTRkpzcFByb3BlcnRpZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5idWlsZGVyLmFubm90YXRpb247Ci0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Eb2N1bWVudGVkOwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlOwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3k7Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0OwotCi0vKioKLSAqIERlZmluZSBhIHNldCBvZiBwcm9wZXJ0aWVzIHVzZWQgdG8gZ3JvdXAgc2V2ZXJhbCBkZWZpbml0aW9ucwotICogb2YgSlNGSnNwUHJvcGVydHkgYW5ub3RhdGlvbnMuCi0gKiAKLSAqIEBhdXRob3IgTGVvbmFyZG8gVXJpYmUgKGxhdGVzdCBtb2RpZmljYXRpb24gYnkgJEF1dGhvciQpCi0gKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAotICovCi1ARG9jdW1lbnRlZAotQFRhcmdldChFbGVtZW50VHlwZS5UWVBFKQotQFJldGVudGlvbihSZXRlbnRpb25Qb2xpY3kuU09VUkNFKQotcHVibGljIEBpbnRlcmZhY2UgSlNGSnNwUHJvcGVydGllcwotewotCi0gICAgLyoqCi0gICAgICogQXJyYXkgb2YgSlNGSnNwUHJvcGVydGllcyB0byBiZSBkZWZpbmVkLgotICAgICAqLwotICAgIEpTRkpzcFByb3BlcnR5IFtdIHByb3BlcnRpZXMoKTsKLSAgICAKLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1hbm5vdGF0aW9ucy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9hbm5vdGF0aW9uL0pTRkpzcFByb3BlcnR5LmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItYW5ub3RhdGlvbnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvYW5ub3RhdGlvbi9KU0ZKc3BQcm9wZXJ0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMjYwNmVmLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1hbm5vdGF0aW9ucy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9hbm5vdGF0aW9uL0pTRkpzcFByb3BlcnR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmJ1aWxkZXIuYW5ub3RhdGlvbjsKLQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkRvY3VtZW50ZWQ7Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGU7Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeTsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7Ci0KLS8qKgotICogRGVmaW5lcyBhIGxvZ2ljYWwgcHJvcGVydHkgb2YgYSBjb21wb25lbnQgdGhhdCBpcyBhY2Nlc3NlZCB2aWEgdGhlCi0gKiBjb21wb25lbnQncyBBdHRyaWJ1dGVzIG1hcCwgcmF0aGVyIHRoYW4gamF2YUJlYW4gZ2V0dGVyL3NldHRlciBtZXRob2RzLgotICogPHA+Ci0gKiBUaGVzZSBsb2dpY2FsIHByb3BlcnRpZXMgYXJlIGFjY2Vzc2libGUgZnJvbSB2aWV3cyAoZWcgYXZhaWxhYmxlIGFzCi0gKiBKU1AgdGFnIGF0dHJpYnV0ZXMpIGp1c3QgbGlrZSBwcm9wZXJ0aWVzIGRlY2xhcmVkIHdpdGggdGhlIEpTRlByb3BlcnR5Ci0gKiBhbm5vdGF0aW9uLgotICogPHA+Ci0gKiBBIGNsYXNzIG9yIGludGVyZmFjZSB0aGF0IGRlZmluZXMganVzdCBvbmUgbG9naWNhbCBwcm9wZXJ0eSBtYXkgdXNlIHRoaXMKLSAqIGFubm90YXRpb24gZGlyZWN0bHk7IHRvIGRlY2xhcmUgbW9yZSB0aGFuIG9uZSBsb2dpY2FsIHByb3BlcnR5IHNob3VsZAotICogdXNlIHRoZSBKU0ZKc3BQcm9wZXJ0aWVzIGFubm90YXRpb24gdG8gZ3JvdXAgYSBzZXQgb2YgdGhlc2UuIENsYXNzZXMgdGhhdAotICogaW1wbGVtZW50IGludGVyZmFjZXMgd2l0aCB0aGlzIGFubm90YXRpb24sIG9yIHN1YmNsYXNzIGEgYmFzZSBjbGFzcyB0aGF0Ci0gKiBoYXMgdGhpcyBhbm5vdGF0aW9uLCB3aWxsIGluaGVyaXQgdGhlIGRlY2xhcmVkIGF0dHJpYnV0ZXMuCi0gKiA8cD4KLSAqIFRoaXMgYW5ub3RhdGlvbiBzaG91bGQgb25seSBiZSBhcHBsaWVkIHRvIGNsYXNzZXMgdGhhdCBhbHNvIGhhdmUgdGhlIEpTRkNvbXBvbmVudAotICogYW5kIEpTRlZhbGlkYXRvciBhbm5vdGF0aW9uLgotICogCi0gKiBAYXV0aG9yIExlb25hcmRvIFVyaWJlIChsYXRlc3QgbW9kaWZpY2F0aW9uIGJ5ICRBdXRob3IkKQotICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKLSAqLwotQERvY3VtZW50ZWQKLUBUYXJnZXQoRWxlbWVudFR5cGUuVFlQRSkKLUBSZXRlbnRpb24oUmV0ZW50aW9uUG9saWN5LlNPVVJDRSkKLXB1YmxpYyBAaW50ZXJmYWNlIEpTRkpzcFByb3BlcnR5Ci17Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgbmFtZSB0aGF0IGlkZW50aWZpZXMgdGhpcyBhdHRyaWJ1dGUuCi0gICAgICogPHA+Ci0gICAgICogVGhpcyBTdHJpbmcgaXMgdGhlIGtleSB1c2VkIHRvIGxvb2sgdXAgdGhlIGF0dHJpYnV0ZSBpbiB0aGUgY29tcG9uZW50J3MKLSAgICAgKiBBdHRyaWJ1dGVzIG1hcC4KLSAgICAgKiA8cD4KLSAgICAgKiBFeGFtcGxlczogYm9yZGVyLCBpZCwgdmFsdWUKLSAgICAgKi8KLSAgICBTdHJpbmcgbmFtZSgpIGRlZmF1bHQgIiI7Ci0gICAgCi0gICAgLyoqCi0gICAgICogVGhlIHR5cGUgb2YgdGhpcyBhdHRyaWJ1dGUuCi0gICAgICogPHA+Ci0gICAgICogVGhpcyBtdXN0IGJlIGEgZnVsbHktcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgYSBqYXZhIHR5cGUuCi0gICAgICogPHA+Ci0gICAgICogVE9ETzogZG9lc24ndCB0aGUgSlNGIHNwZWMgYWxzbyBhbGxvdyBzaG9ydC1jdXRzIGZvciBjb21tb24gdHlwZXMgaGVyZT8KLSAgICAgKi8KLSAgICBTdHJpbmcgcmV0dXJuVHlwZSgpIGRlZmF1bHQgIiI7Ci0gICAgCi0gICAgLyoqCi0gICAgICogRGVmaW5lIHdoZXRoZXIgdGhpcyBhdHRyaWJ1dGUgaXMgbWFuZGF0b3J5IGZvciB0aGUgYXNzb2NpYXRlZCBjb21wb25lbnQsCi0gICAgICogaWUgd2hldGhlciBpdCBpcyBhbiBlcnJvciB0byBjcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhlIGNvbXBvbmVudCBhbmQKLSAgICAgKiBub3QgdG8gcHJvdmlkZSBhIHZhbHVlIGZvciB0aGlzIGF0dHJpYnV0ZS4KLSAgICAgKi8KLSAgICBib29sZWFuIHJlcXVpcmVkKCkgZGVmYXVsdCBmYWxzZTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBEZWZpbmUgaWYgdGhpcyB0YWcgaXMgZXhjbHVkZWQgZnJvbSB0bGQuCi0gICAgICogPHA+Ci0gICAgICogVGhpcyBpcyB2ZXJ5IHVnbHkgZmVhdHVyZSwgYW5kIHNob3VsZCBiZSB1c2VkIGFzIGxpdHRsZSBhcyBwb3NzaWJsZS4gSXQKLSAgICAgKiBhbGxvd3MgYSBwYXJlbnQgY2xhc3MgKG9yIGludGVyZmFjZSkgdG8gZGVjbGFyZSBsb2dpY2FsIHByb3BlcnRpZXMsIHRoZW4KLSAgICAgKiBhIHN1YmNsYXNzIHRvICJ1bmRlY2xhcmUiIHRoZW0uIFRoaXMgaXMgY29tcGxldGVseSBicm9rZW4gT08gZGVzaWduLAotICAgICAqIGJ1dCBpcyByZXF1aXJlZCBpbiBhIGZldyByYXJlIGNhc2VzIGJ5IHRoZSBKU0Ygc3BlY2lmaWNhdGlvbi4gCi0gICAgICovCi0gICAgYm9vbGVhbiB0YWdFeGNsdWRlZCgpIGRlZmF1bHQgZmFsc2U7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQSBsb25nIGRlc2NyaXB0aW9uIG9mIHRoZSBwdXJwb3NlIG9mIHRoaXMgYXR0cmlidXRlLgotICAgICAqIDxwPgotICAgICAqIFRoaXMgaXMgY29tbW9ubHkgc2hvd24gYXMgaGVscCBpbiBJREVzLgotICAgICAqLwotICAgIFN0cmluZyBsb25nRGVzYygpIGRlZmF1bHQgIiI7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQSBzaG9ydCBkZXNjcmlwdGlvbiBvZiB0aGUgcHVycG9zZSBvZiB0aGlzIGF0dHJpYnV0ZS4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIGlzIGNvbW1vbmx5IHNob3duIGFzIGEgInRvb2wgdGlwIiBvciBwb3B1cC1oZWxwIGluIElERXMuCi0gICAgICovCi0gICAgU3RyaW5nIGRlc2MoKSBkZWZhdWx0ICIiOwotICAgIAotICAgIC8qKgotICAgICAqIEluZGljYXRlIGlmIHRoaXMgcHJvcGVydHkgaXMgaW5oZXJpdGVkIGZyb20gYSBwYXJlbnQgdGFnIGNsYXNzIG9yIG5vdC4KLSAgICAgKiAKLSAgICAgKiBAc2luY2UgMS4wLjYKLSAgICAgKi8KLSAgICBib29sZWFuIGluaGVyaXRlZFRhZygpIGRlZmF1bHQgZmFsc2U7Ci0KLSAgICAvKioKLSAgICAgKiBVc2Ugc2F2ZUF0dGFjaGVkWFhYIGFuZCByZXN0b3JlQXR0YWNoZWRYWFggdG8gc2F2ZSBhbmQgcmVzdG9yZSBzdGF0ZQotICAgICAqIAotICAgICAqIEBzaW5jZSAxLjAuNgotICAgICAqLwotICAgIGJvb2xlYW4gc3RhdGVIb2xkZXIoKSBkZWZhdWx0IGZhbHNlOwotICAgIAotICAgIC8qKgotICAgICAqIEluZGljYXRlIHRoYXQgdGhlIGdldHRlciBhbmQgc2V0dGVyIGRvZXMgbm90IGV2YWx1YXRlIEVMIG9yIFZhbHVlQmluZGluZyBleHByZXNzaW9ucy4KLSAgICAgKiAKLSAgICAgKiBAc2luY2UgMS4wLjYKLSAgICAgKi8KLSAgICBib29sZWFuIGxpdGVyYWxPbmx5KCkgZGVmYXVsdCBmYWxzZTsKLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1hbm5vdGF0aW9ucy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9hbm5vdGF0aW9uL0pTRkpzcFRhZy5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLWFubm90YXRpb25zL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL2Fubm90YXRpb24vSlNGSnNwVGFnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiNzc4MTQuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLWFubm90YXRpb25zL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL2Fubm90YXRpb24vSlNGSnNwVGFnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uYnVpbGRlci5hbm5vdGF0aW9uOwotCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRG9jdW1lbnRlZDsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZTsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5OwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsKLQotLyoqCi0gKiBVc2VkIHRvIGRlZmluZSBhIGpzZiB0YWcgdGhhdCBkb2VzIG5vdCBmYWxsIGluIGEgY2F0ZWdvcnkgbGlrZSBjb252ZXJ0ZXIsIHZhbGlkYXRvcgotICogb3IgY29tcG9uZW50LiBFeGFtcGxlcyBhcmUgZjp2ZXJiYXRpbSBvciBmOmFjdGlvbkxpc3RlbmVyCi0gKiAKLSAqIEBhdXRob3IgTGVvbmFyZG8gVXJpYmUgKGxhdGVzdCBtb2RpZmljYXRpb24gYnkgJEF1dGhvciQpCi0gKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAotICovCi1ARG9jdW1lbnRlZAotQFRhcmdldChFbGVtZW50VHlwZS5UWVBFKQotQFJldGVudGlvbihSZXRlbnRpb25Qb2xpY3kuU09VUkNFKQotcHVibGljIEBpbnRlcmZhY2UgSlNGSnNwVGFnCi17Ci0gICAgCi0gICAgLyoqCi0gICAgICogSW5kaWNhdGUgaWYgdGhlIGVsZW1lbnQgYWNjZXB0IGlubmVyIGVsZW1lbnRzIG9yIG5vdC4KLSAgICAgKi8KLSAgICBTdHJpbmcgYm9keUNvbnRlbnQoKSBkZWZhdWx0ICIiOwotICAgIAotICAgIC8qKgotICAgICAqIFNob3J0IGRlc2NyaXB0aW9uCi0gICAgICovCi0gICAgU3RyaW5nIGRlc2MoKSBkZWZhdWx0ICIiOwotICAgIAotICAgIC8qKgotICAgICAqIFRoZSBuYW1lIG9mIHRoZSBjb21wb25lbnQgaW4gYSBwYWdlIChleDogeDpteWNvbXApLgotICAgICAqLwotICAgIFN0cmluZyBuYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAKLSAgICAvKioKLSAgICAgKiBJbmRpY2F0ZSB0YWcgaGFuZGxlciBjbGFzcyB1c2VkIGZvciB0aGlzIGNvbXBvbmVudCBvbiBmYWNlbGV0cy4KLSAgICAgKiAKLSAgICAgKi8KLSAgICBTdHJpbmcgdGFnSGFuZGxlcigpIGRlZmF1bHQgIiI7Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItYW5ub3RhdGlvbnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvYW5ub3RhdGlvbi9KU0ZMaXN0ZW5lci5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLWFubm90YXRpb25zL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL2Fubm90YXRpb24vSlNGTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODg3OWZlZS4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItYW5ub3RhdGlvbnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvYW5ub3RhdGlvbi9KU0ZMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoNCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqIA0KLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKiANCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmJ1aWxkZXIuYW5ub3RhdGlvbjsNCi0NCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRG9jdW1lbnRlZDsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGU7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5Ow0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7DQotDQotLyoqDQotICogQHNpbmNlIDEuMC40IA0KLSAqIEBhdXRob3IgTGVvbmFyZG8gVXJpYmUgKGxhdGVzdCBtb2RpZmljYXRpb24gYnkgJEF1dGhvcjogbHU0MjQyICQpDQotICogQHZlcnNpb24gJFJldmlzaW9uOiA3OTY2MDcgJCAkRGF0ZTogMjAwOS0wNy0yMSAyMjowMDozMCAtMDUwMCAobWFyLCAyMSBqdWwgMjAwOSkgJA0KLSAqLw0KLUBEb2N1bWVudGVkDQotQFRhcmdldChFbGVtZW50VHlwZS5NRVRIT0QpDQotQFJldGVudGlvbihSZXRlbnRpb25Qb2xpY3kuU09VUkNFKQ0KLXB1YmxpYyBAaW50ZXJmYWNlIEpTRkxpc3RlbmVyDQoteyAgIA0KLSAgICBTdHJpbmcgbmFtZSgpIGRlZmF1bHQgIiI7DQotICAgIA0KLSAgICBTdHJpbmcgZXZlbnQoKSBkZWZhdWx0ICIiOw0KLSAgICANCi0gICAgLyoqDQotICAgICAqICh0cnVlfGZhbHNlKSBEZWZpbmUgaWYgdGhlIHByb3BlcnR5IGlzIHJlcXVpcmVkIG9yIG5vdC4gRGVmYXVsdDpmYWxzZQ0KLSAgICAgKi8NCi0gICAgYm9vbGVhbiByZXF1aXJlZCgpIGRlZmF1bHQgZmFsc2U7DQotICAgIA0KLSAgICAvKioNCi0gICAgICogU2hvcnQgZGVzY3JpcHRpb24NCi0gICAgICovDQotICAgIFN0cmluZyBkZXNjKCkgZGVmYXVsdCAiIjsNCi0NCi0gICAgU3RyaW5nIGNsYXp6KCkgZGVmYXVsdCAiIjsNCi0gICAgDQotICAgIFN0cmluZyBwaGFzZXMoKSBkZWZhdWx0ICIiOw0KLX0NCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItYW5ub3RhdGlvbnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvYW5ub3RhdGlvbi9KU0ZQcm9wZXJ0eS5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLWFubm90YXRpb25zL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL2Fubm90YXRpb24vSlNGUHJvcGVydHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWEwMTMyMi4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItYW5ub3RhdGlvbnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvYW5ub3RhdGlvbi9KU0ZQcm9wZXJ0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcyICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5idWlsZGVyLmFubm90YXRpb247Ci0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Eb2N1bWVudGVkOwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlOwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3k7Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0OwotCi0vKioKLSAqIERlZmluZSB0aGF0IHRoaXMgZ2V0dGVyIG9yIHNldHRlciBtZXRob2QgZGVmaW5lIGEgcHJvcGVydHkuCi0gKiAKLSAqIEBhdXRob3IgTGVvbmFyZG8gVXJpYmUgKGxhdGVzdCBtb2RpZmljYXRpb24gYnkgJEF1dGhvciQpCi0gKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAotICovCi1ARG9jdW1lbnRlZAotQFRhcmdldChFbGVtZW50VHlwZS5NRVRIT0QpCi1AUmV0ZW50aW9uKFJldGVudGlvblBvbGljeS5TT1VSQ0UpCi1wdWJsaWMgQGludGVyZmFjZSBKU0ZQcm9wZXJ0eQotewotCi0gICAgLyoqCi0gICAgICogKHRydWV8ZmFsc2UpIERlZmluZSBpZiB0aGUgcHJvcGVydHkgaXMgcmVxdWlyZWQgb3Igbm90LiBEZWZhdWx0OmZhbHNlCi0gICAgICovCi0gICAgYm9vbGVhbiByZXF1aXJlZCgpIGRlZmF1bHQgZmFsc2U7Ci0gICAgCi0gICAgLyoqCi0gICAgICogSW5kaWNhdGUgaWYgdGhlIHByb3BlcnR5IGlzIG5vdCBzYXZlZCBhbmQgcmVzdG9yZWQgaXRzIHN0YXRlLgotICAgICAqLwotICAgIGJvb2xlYW4gaXN0cmFuc2llbnQoKSBkZWZhdWx0IGZhbHNlOwotICAgIAotICAgIC8qKgotICAgICAqIFVzZSBzYXZlQXR0YWNoZWRYWFggYW5kIHJlc3RvcmVBdHRhY2hlZFhYWCB0byBzYXZlIGFuZCByZXN0b3JlIHN0YXRlCi0gICAgICovCi0gICAgYm9vbGVhbiBzdGF0ZUhvbGRlcigpIGRlZmF1bHQgZmFsc2U7Ci0gICAgCi0gICAgLyoqCi0gICAgICogSW5kaWNhdGUgdGhhdCB0aGUgZ2V0dGVyIGFuZCBzZXR0ZXIgZG9lcyBub3QgZXZhbHVhdGUgRUwgb3IgVmFsdWVCaW5kaW5nIGV4cHJlc3Npb25zLgotICAgICAqLwotICAgIGJvb2xlYW4gbGl0ZXJhbE9ubHkoKSBkZWZhdWx0IGZhbHNlOwotICAgIAotICAgIC8qKgotICAgICAqIERlZmluZSBpZiB0aGlzIHRhZyBpcyBleGNsdWRlZCBmcm9tIHRsZC4KLSAgICAgKi8KLSAgICBib29sZWFuIHRhZ0V4Y2x1ZGVkKCkgZGVmYXVsdCBmYWxzZTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBJbmRpY2F0ZSBpZiBpdCBzaG91bGQgYmUgZ2VuZXJhdGVkIGEgbWV0aG9kIGxpa2UKLSAgICAgKiBnZXRMb2NhbFhYWCB0byByZXRyaWV2ZSB0aGUgbG9jYWwgdmFsdWUgb2YgdGhlIHByb3BlcnR5Ci0gICAgICogZGlyZWN0bHkgKHdpdGhvdXQgZXZhbHVhdGUgVmFsdWVCaW5kaW5nIG9yIFZhbHVlRXhwcmVzc2lvbikuCi0gICAgICogCi0gICAgICogSWYgdGhlcmUgaXMgbm8gZ2VuZXJhdGlvbiBvZiBjb21wb25lbnQgY2xhc3MgdGhpcyBwcm9wZXJ0eQotICAgICAqIGhhcyBhbnkgZWZmZWN0LgotICAgICAqIAotICAgICAqLwotICAgIGJvb2xlYW4gbG9jYWxNZXRob2QoKSBkZWZhdWx0IGZhbHNlOwotICAgIAotICAgIC8qKgotICAgICAqIERlZmluZSB0aGUgc2NvcGUgdG8gYmUgdXNlZCB3aGVuIGdlbmVyYXRpbmcgdGhlIG1ldGhvZCBnZXRMb2NhbFhYWC4KLSAgICAgKiAKLSAgICAgKiBUaGUgZGVmYXVsdCB0byBiZSBhcHBsaWVkIGlzICJwcm90ZWN0ZWQiLgotICAgICAqIAotICAgICAqLwotICAgIFN0cmluZyBsb2NhbE1ldGhvZFNjb3BlKCkgZGVmYXVsdCAiIjsKLSAgICAKLSAgICAvKioKLSAgICAgKiBJbmRpY2F0ZSBpZiBpdCBzaG91bGQgYmUgZ2VuZXJhdGVkIGEgbWV0aG9kIGxpa2UKLSAgICAgKiBpc1NldFhYWCwgdXNlZCB3aGVuIGl0IGlzIG5lY2Vzc2FyeSB0byBjaGVjayBpZiBhIGJvb2xlYW4gdHlwZQotICAgICAqIHByb3BlcnR5IHdhcyBzZXQgcHJvZ3JhbWF0aWNhbGx5ICh1c2luZyBzZXRYWFggbWV0aG9kKSBvciBub3QuIAotICAgICAqIAotICAgICAqIElmIHRoZXJlIGlzIG5vIGdlbmVyYXRpb24gb2YgY29tcG9uZW50IGNsYXNzIHRoaXMgcHJvcGVydHkKLSAgICAgKiBoYXMgYW55IGVmZmVjdC4KLSAgICAgKi8KLSAgICBib29sZWFuIHNldE1ldGhvZCgpIGRlZmF1bHQgZmFsc2U7Ci0gICAgCi0gICAgLyoqCi0gICAgICogRGVmaW5lIHRoZSBzY29wZSB0byBiZSB1c2VkIHdoZW4gZ2VuZXJhdGluZyB0aGUgbWV0aG9kIGlzU2V0WFhYLgotICAgICAqIAotICAgICAqIFRoZSBkZWZhdWx0IHRvIGJlIGFwcGxpZWQgaXMgInByb3RlY3RlZCIuCi0gICAgICogCi0gICAgICovCi0gICAgU3RyaW5nIHNldE1ldGhvZFNjb3BlKCkgZGVmYXVsdCAiIjsKLSAgICAKLSAgICAvKioKLSAgICAgKiBUaGUgbmFtZSB1c2VkIGluIGpzcCBwYWdlcyB0byBtYWtlIHJlZmVyZW5jZSB0byB0aGlzCi0gICAgICogcHJvcGVydHkgKHVzZWQgb24gdGxkKS4KLSAgICAgKi8KLSAgICBTdHJpbmcganNwTmFtZSgpIGRlZmF1bHQgIiI7Ci0gICAgCi0gICAgLyoqCi0gICAgICogKHRydWV8ZmFsc2UpIFRoaXMgdmFsdWUgaXMgcHV0IG9uIHRoZSB0bGQgd2hlbiBhcHBsaWVzLgotICAgICAqLwotICAgIGJvb2xlYW4gcnRleHBydmFsdWUoKSBkZWZhdWx0IGZhbHNlOwotICAgIAotICAgIC8qKgotICAgICAqIFNob3J0IGRlc2NyaXB0aW9uCi0gICAgICovCi0gICAgU3RyaW5nIGRlc2MoKSBkZWZhdWx0ICIiOwotICAgIAotICAgIC8qKgotICAgICAqIEluZGljYXRlIGlmIHRoaXMgcHJvcGVydHkgaXMgaW5oZXJpdGVkIGZyb20gYSBwYXJlbnQgdGFnIGNsYXNzIG9yIG5vdC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgYm9vbGVhbiBpbmhlcml0ZWRUYWcoKSBkZWZhdWx0IGZhbHNlOwotICAgIAotICAgIC8qKgotICAgICAqIFRoZSBmdWxsIG5hbWUgb2YgdGhlIHJldHVybiB0eXBlIGZvciBNZXRob2RCaW5kaW5nIG9yIE1ldGhvZEV4cHJlc3Npb24gaXQgdXNlcwotICAgICAqLwotICAgIFN0cmluZyByZXR1cm5TaWduYXR1cmUoKSBkZWZhdWx0ICIiOwotCi0gICAgLyoqCi0gICAgICogQ1NWIGZ1bGwgbmFtZXMgb2YgdGhlIHR5cGVzIHRoYXQgYXJlIHBhcmFtcyBmb3IgbWV0aG9kcyB1c2luZyB0aGlzIE1ldGhvZEJpbmRpbmcgb3IgTWV0aG9kRXhwcmVzc2lvbiBwYXJhbQotICAgICAqLwotICAgIFN0cmluZyBtZXRob2RTaWduYXR1cmUoKSBkZWZhdWx0ICIiOwotICAgIAotICAgIC8qKgotICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIHRvIHNldCBpZiB0aGlzIHByb3BlcnR5IGlzIGdlbmVyYXRlZC4KLSAgICAgKi8KLSAgICBTdHJpbmcgZGVmYXVsdFZhbHVlKCkgZGVmYXVsdCAiIjsKLQotICAgIC8qKgotICAgICAqIEluZGljYXRlIHRoZSB0eXBlIHRoYXQgdmFsdWVzIHNob3VsZCBiZSBjYXN0IG9uIHRsZC4gCi0gICAgICogVGhpcyBwYXJhbSBvbmx5IGFwcGxpZXMgb24ganNmIDEuMiAoaXQgaXMgc3VwcG9zZWQgdGhhdCAKLSAgICAgKiB0aGUgY2xhc3NOYW1lIGlzIGphdmF4LmVsLlZhbHVlRXhwcmVzc2lvbiB0byBhcHBseSBpdCksCi0gICAgICogYmVjYXVzZSBpbiBqc2YgMS4xLCB2YWx1ZXMgb24gdGFnIGNsYXNzIGFyZSBjb25zaWRlcmVkIAotICAgICAqIHRvIGJlIFN0cmluZy4gCi0gICAgICoKLSAgICAgKiBAc2luY2UgMS4wLjMKLSAgICAgKi8KLSAgICBTdHJpbmcgZGVmZXJyZWRWYWx1ZVR5cGUoKSBkZWZhdWx0ICIiOwotICAgIAotICAgIC8qKgotICAgICAqIEluZGljYXRlIGlmIHRoaXMgcHJvcGVydHkgaXMgYSBjbGllbnQgZXZlbnQgdGhhdCBzaG91bGQKLSAgICAgKiBiZSByZXR1cm5lZCBieSBDbGllbnRCZWhhdmlvckhvbGRlci5nZXRFdmVudE5hbWVzKCkuIFRoaXMKLSAgICAgKiBwcm9wZXJ0eSBpcyBieSBkZWZhdWx0ICIiLCBpdCBpcyBKU0YgMi4wIHNwZWNpZmljLCBhbmQgCi0gICAgICogdGhlIGNvbXBvbmVudCBob2xkaW5nIGl0IG11c3QgaW1wbGVtZW50IAotICAgICAqIGphdmF4LmZhY2VzLmNvbXBvbmVudC5iZWhhdmlvci5DbGllbnRCZWhhdmlvckhvbGRlciBpbnRlcmZhY2UuCi0gICAgICogCi0gICAgICogQHNpbmNlIDEuMC40Ci0gICAgICovCi0gICAgU3RyaW5nIGNsaWVudEV2ZW50KCkgZGVmYXVsdCAiIjsKLSAgICAKLSAgICAvKioKLSAgICAgKiAKLSAgICAgKiBAc2luY2UgMS4wLjUKLSAgICAgKi8KLSAgICBib29sZWFuIHBhcnRpYWxTdGF0ZUhvbGRlcigpIGRlZmF1bHQgZmFsc2U7Ci0gICAgCi0gICAgLyoqCi0gICAgICogCi0gICAgICogQHNpbmNlIDEuMC41Ci0gICAgICovCi0gICAgYm9vbGVhbiBmYWNlbGV0c09ubHkoKSBkZWZhdWx0IGZhbHNlOwotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLWFubm90YXRpb25zL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL2Fubm90YXRpb24vSlNGUmVuZGVyS2l0LmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItYW5ub3RhdGlvbnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvYW5ub3RhdGlvbi9KU0ZSZW5kZXJLaXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjQyYmMzZi4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItYW5ub3RhdGlvbnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvYW5ub3RhdGlvbi9KU0ZSZW5kZXJLaXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5idWlsZGVyLmFubm90YXRpb247Ci0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Eb2N1bWVudGVkOwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlOwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3k7Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0OwotCi0vKioKLSAqIFRoZSByZW5kZXJLaXRJZCB0aGF0IGlkZW50aWZpZXMgdGhpcyBSZW5kZXJLaXQuIFRoaXMgaXMgcmVnaXN0ZXJlZCBvbiBmYWNlcy1jb25maWcueG1sLgotICogCi0gKiBAYXV0aG9yIExlb25hcmRvIFVyaWJlIChsYXRlc3QgbW9kaWZpY2F0aW9uIGJ5ICRBdXRob3IkKQotICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKLSAqLwotQERvY3VtZW50ZWQKLUBUYXJnZXQoRWxlbWVudFR5cGUuVFlQRSkKLUBSZXRlbnRpb24oUmV0ZW50aW9uUG9saWN5LlNPVVJDRSkKLXB1YmxpYyBAaW50ZXJmYWNlIEpTRlJlbmRlcktpdAotewotICAgIC8qKgotICAgICAqIFRoZSByZW5kZXJLaXRJZCByZWxhdGVkIHRvIHRoaXMgY2xhc3MgCi0gICAgICovCi0gICAgU3RyaW5nIHJlbmRlcktpdElkKCkgZGVmYXVsdCAiIjsKLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1hbm5vdGF0aW9ucy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9hbm5vdGF0aW9uL0pTRlJlbmRlcmVyLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItYW5ub3RhdGlvbnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvYW5ub3RhdGlvbi9KU0ZSZW5kZXJlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMmVhY2ViLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1hbm5vdGF0aW9ucy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9hbm5vdGF0aW9uL0pTRlJlbmRlcmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uYnVpbGRlci5hbm5vdGF0aW9uOwotCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRG9jdW1lbnRlZDsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZTsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5OwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsKLQotLyoqCi0gKiBJbmRpY2F0ZSB0aGF0IHRoaXMgY2xhc3MgaXMgYSBSZW5kZXJlci4gVGhpcyBpcyByZWdpc3RlcmVkIG9uIGZhY2VzLWNvbmZpZy54bWwuCi0gKiAKLSAqIEBhdXRob3IgTGVvbmFyZG8gVXJpYmUgKGxhdGVzdCBtb2RpZmljYXRpb24gYnkgJEF1dGhvciQpCi0gKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAotICovCi1ARG9jdW1lbnRlZAotQFRhcmdldChFbGVtZW50VHlwZS5UWVBFKQotQFJldGVudGlvbihSZXRlbnRpb25Qb2xpY3kuU09VUkNFKQotcHVibGljIEBpbnRlcmZhY2UgSlNGUmVuZGVyZXIKLXsKLSAgICAvKioKLSAgICAgKiBUaGUgcmVuZGVyS2l0SWQgdGhhdCBiZWxvbmdzIHRoaXMgcmVuZGVyZXIuIElmIG5vIGN1c3RvbSByZW5kZXJraXQgZGVmaW5lZCB5b3Ugc2hvdWxkIHVzZSBIVE1MX0JBU0lDLgotICAgICAqLwotICAgIFN0cmluZyByZW5kZXJLaXRJZCgpIGRlZmF1bHQgIiI7Ci0gICAgCi0gICAgLyoqCi0gICAgICogVGhlIGNvbXBvbmVudCBmYW1pbHkgdGhhdCB0aGlzIHJlbmRlcmVyIHNob3VsZCBiZSBhcHBsaWVkLgotICAgICAqLwotICAgIFN0cmluZyBmYW1pbHkoKSBkZWZhdWx0ICIiOwotICAgIAotICAgIC8qKgotICAgICAqIFRoZSByZW5kZXJlciB0eXBlIHRoYXQgaXMgYXBwbGllZCB0aGlzIHJlbmRlcmVyLgotICAgICAqLwotICAgIFN0cmluZyB0eXBlKCkgZGVmYXVsdCAiIjsKLSAgICAKLSAgICAvKioKLSAgICAgKiBTaG9ydCBkZXNjcmlwdGlvbgotICAgICAqLwotICAgIFN0cmluZyBkZXNjKCkgZGVmYXVsdCAiIjsKLQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLWFubm90YXRpb25zL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL2Fubm90YXRpb24vSlNGUmVuZGVyZXJzLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItYW5ub3RhdGlvbnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvYW5ub3RhdGlvbi9KU0ZSZW5kZXJlcnMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGNmMDY3Zi4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItYW5ub3RhdGlvbnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvYW5ub3RhdGlvbi9KU0ZSZW5kZXJlcnMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5idWlsZGVyLmFubm90YXRpb247Ci0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Eb2N1bWVudGVkOwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlOwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3k7Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0OwotCi0vKioKLSAqIERlZmluZSBhIHNldCBvZiByZW5kZXJlcnMgdXNlZCB0byBncm91cCBzZXZlcmFsIGRlZmluaXRpb25zCi0gKiBvZiBKU0ZSZW5kZXJlciBhbm5vdGF0aW9ucy4KLSAqIAotICogQGF1dGhvciBMZW9uYXJkbyBVcmliZSAobGF0ZXN0IG1vZGlmaWNhdGlvbiBieSAkQXV0aG9yJCkKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCi0gKi8KLUBEb2N1bWVudGVkCi1AVGFyZ2V0KEVsZW1lbnRUeXBlLlRZUEUpCi1AUmV0ZW50aW9uKFJldGVudGlvblBvbGljeS5TT1VSQ0UpCi1wdWJsaWMgQGludGVyZmFjZSBKU0ZSZW5kZXJlcnMKLXsKLQotICAgIC8qKgotICAgICAqIEFycmF5IG9mIEpTRlJlbmRlcmVyIHRvIGJlIGRlZmluZWQuCi0gICAgICovCi0gICAgSlNGUmVuZGVyZXIgW10gcmVuZGVyZXJzKCk7Ci0gICAgCi19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItYW5ub3RhdGlvbnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvYW5ub3RhdGlvbi9KU0ZWYWxpZGF0b3IuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1hbm5vdGF0aW9ucy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9hbm5vdGF0aW9uL0pTRlZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNTNiNGI1Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1hbm5vdGF0aW9ucy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9hbm5vdGF0aW9uL0pTRlZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI0ICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5idWlsZGVyLmFubm90YXRpb247Ci0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Eb2N1bWVudGVkOwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlOwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3k7Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0OwotCi0vKioKLSAqIFVzZWQgdG8gZGVmaW5lIGEganNmIHZhbGlkYXRvci4KLSAqIAotICogQGF1dGhvciBMZW9uYXJkbyBVcmliZSAobGF0ZXN0IG1vZGlmaWNhdGlvbiBieSAkQXV0aG9yJCkKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCi0gKi8KLUBEb2N1bWVudGVkCi1AVGFyZ2V0KEVsZW1lbnRUeXBlLlRZUEUpCi1AUmV0ZW50aW9uKFJldGVudGlvblBvbGljeS5TT1VSQ0UpCi1wdWJsaWMgQGludGVyZmFjZSBKU0ZWYWxpZGF0b3IKLXsKLSAgICAKLSAgICAvKioKLSAgICAgKiBJbmRpY2F0ZSB0aGUgdmFsaWRhdG9ySWQgd2hpY2ggaWRlbnRpZmllcyB0aGlzIGNsYXNzLiBJZiBub3QgZGVmaW5lZCwgaXQKLSAgICAgKiB0cmllcyB0byBnZXQgdGhlIHZhbHVlIG9mIHRoZSBmaWVsZCBWQUxJREFUT1JfSUQuCi0gICAgICovCi0gICAgU3RyaW5nIGlkKCkgZGVmYXVsdCAiIjsKLSAgICAKLSAgICAvKioKLSAgICAgKiBUaGUgbmFtZSBvZiB0aGUgY29tcG9uZW50IGluIGEgcGFnZSAoZXg6IHg6bXljb21wKS4KLSAgICAgKi8KLSAgICBTdHJpbmcgbmFtZSgpIGRlZmF1bHQgIiI7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgdGFnIGNsYXNzIHVzZWQgZm9yIHRoaXMgdmFsaWRhdG9yLCBpZiBhcHBsaWVzLgotICAgICAqLwotICAgIFN0cmluZyB0YWdDbGFzcygpIGRlZmF1bHQgIiI7Ci0gICAgCi0gICAgLyoqCi0gICAgICogVGFnIHN1cGVyIGNsYXNzIHRoYXQgaW5oZXJpdHMgdGhlIHRhZyBjbGFzcwotICAgICAqLwotICAgIFN0cmluZyB0YWdTdXBlcmNsYXNzKCkgZGVmYXVsdCAiIjsKLQotICAgIC8qKgotICAgICAqIEluZGljYXRlIHRoYXQgdGhpcyBjb21wb25lbnQgc2hvdWxkIG5vdCBiZSBkZWZpbmVkIG9uIGZhY2VzLWNvbmZpZy54bWwuCi0gICAgICogQW55d2F5LCBpZiB0aGlzIGlzIHRydWUgb3IgZmFsc2UgZG9lcyBub3QgaGF2ZSBhbnkgc2lnbmlmaWNhdGl2ZSBpbXBhY3QuIAotICAgICAqIAotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBib29sZWFuIGNvbmZpZ0V4Y2x1ZGVkKCkgZGVmYXVsdCBmYWxzZTsKLSAgICAgICAgCi0gICAgLyoqCi0gICAgICogSW5kaWNhdGUgaWYgdGhlIGVsZW1lbnQgYWNjZXB0IGlubmVyIGVsZW1lbnRzIG9yIG5vdC4KLSAgICAgKi8KLSAgICBTdHJpbmcgYm9keUNvbnRlbnQoKSBkZWZhdWx0ICIiOwotICAgIAotICAgIC8qKgotICAgICAqIFNob3J0IGRlc2NyaXB0aW9uCi0gICAgICovCi0gICAgU3RyaW5nIGRlc2MoKSBkZWZhdWx0ICIiOwotICAgIAotICAgIC8qKgotICAgICAqIFNlcmlhbCB1aWQgdGhhdCBzaG91bGQgYmUgYWRkZWQgb24gZ2VuZXJhdGVkIHRhZyBjbGFzcwotICAgICAqIAotICAgICAqIEBzaW5jZSAxLjAuMwotICAgICAqLwotICAgIFN0cmluZyBzZXJpYWx1aWR0YWcoKSBkZWZhdWx0ICIiOwotICAgIAotICAgIC8qKgotICAgICAqIFRoZSBmdWxseS1xdWFsaWZpZWQtbmFtZSBvZiBhIGNvbmNyZXRlIHZhbGlkYXRvciBjbGFzcy4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIGF0dHJpYnV0ZSBpcyBvbmx5IHJlbGV2YW50IHdoZW4gIm5hbWUiIGlzIGFsc28gc2V0LCBpZSB0aGUKLSAgICAgKiBhbm5vdGF0aW9uIGlzIGluZGljYXRpbmcgdGhhdCBhIHZhbGlkYXRvciBpcyByZWFsbHkgYmVpbmcgZGVjbGFyZWQuCi0gICAgICogPHA+Ci0gICAgICogV2hlbiB0aGlzIGF0dHJpYnV0ZSBpcyBub3QgZGVmaW5lZCB0aGVuIGl0IGlzIGFzc3VtZWQgdGhhdCB0aGlzCi0gICAgICogYW5ub3RhdGVkIGNsYXNzIGlzIHRoZSBhY3R1YWwgdmFsaWRhdG9yIGNsYXNzLgotICAgICAqIDxwPgotICAgICAqIFdoZW4gdGhpcyBhdHRyaWJ1dGUgaXMgc2V0IHRvIHNvbWV0aGluZyBvdGhlciB0aGFuIHRoZSBuYW1lIG9mIHRoZQotICAgICAqIGFubm90YXRlZCBjbGFzcyB0aGVuIHRoZSBzcGVjaWZpZWQgY2xhc3MgaXMgdGhlIG9uZSB0aGF0IHRoZSBKU0YKLSAgICAgKiB2YWxpZGF0b3IgcmVnaXN0cmF0aW9uIGluIGZhY2VzLWNvbmZpZy54bWwgd2lsbCByZWZlciB0by4gQW5kIGlmIHRoYXQKLSAgICAgKiBjbGFzcyBkb2VzIG5vdCBleGlzdCBpbiB0aGUgY2xhc3NwYXRoICh3aGljaCB3aWxsIG5vcm1hbGx5IGJlIHRoZQotICAgICAqIGNhc2UpIHRoZW4gY29kZS1nZW5lcmF0aW9uIHdpbGwgYmUgdHJpZ2dlcmVkIHRvIGNyZWF0ZSBpdC4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIGF0dHJpYnV0ZSBpcyBub3QgaW5oZXJpdGFibGUuCi0gICAgICogPHA+Ci0gICAgICogVGhlIGRvY2xldC1hbm5vdGF0aW9uIGVxdWl2YWxlbnQgb2YgdGhpcyBhdHRyaWJ1dGUgaXMgbmFtZWQgImNsYXNzIi4KLSAgICAgKiAKLSAgICAgKiBAc2luY2UgMS4wLjMKLSAgICAgKi8KLSAgICBTdHJpbmcgY2xhenooKSBkZWZhdWx0ICIiOwotICAgIAotICAgIC8qKgotICAgICAqIEluZGljYXRlIHRhZyBoYW5kbGVyIGNsYXNzIHVzZWQgZm9yIHRoaXMgY29tcG9uZW50IG9uIGZhY2VsZXRzLgotICAgICAqIAotICAgICAqIEBzaW5jZSAxLjAuNwotICAgICAqLwotICAgIFN0cmluZyB0YWdIYW5kbGVyKCkgZGVmYXVsdCAiIjsKLSAgICAKLSAgICAvKioKLSAgICAgKiBJbmRpY2F0ZSB0aGF0IHRoZSBFTCBFeHByZXNzaW9ucyBzaG91bGQgYmUgc3RvcmVkIHVzaW5nIAotICAgICAqIHNldFZhbHVlRXhwcmVzc2lvbigpIG1ldGhvZCwgaW5zdGVhZCBldmFsdWF0ZSB0aGVtIGF0IGJ1aWxkIHZpZXcKLSAgICAgKiB0aW1lLiBMYXRlciB0aGUgRUwgRXhwcmVzc2lvbnMgd2lsbCBiZSBldmFsdWF0ZWQgYWNjb3JkaW5nIHRvCi0gICAgICogdGhlaXIgbmVlZHMKLSAgICAgKiAKLSAgICAgKiBAc2luY2UgMS4wLjcKLSAgICAgKi8KLSAgICBib29sZWFuIGV2YWx1YXRlRUxPbkV4ZWN1dGlvbigpIGRlZmF1bHQgZmFsc2U7Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItYW5ub3RhdGlvbnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvYW5ub3RhdGlvbi9KU0ZXZWJDb25maWdQYXJhbS5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLWFubm90YXRpb25zL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL2Fubm90YXRpb24vSlNGV2ViQ29uZmlnUGFyYW0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmEwZTdiZi4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItYW5ub3RhdGlvbnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvYW5ub3RhdGlvbi9KU0ZXZWJDb25maWdQYXJhbS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoNCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqIA0KLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKiANCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmJ1aWxkZXIuYW5ub3RhdGlvbjsNCi0NCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRG9jdW1lbnRlZDsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGU7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5Ow0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7DQotDQotLyoqDQotICogVXNlZCB0byBkZWZpbmUgYSBwYXJhbSBjb25maWd1cmVkIGluIHdlYi54bWwgZmlsZS4NCi0gKiANCi0gKiBAc2luY2UgMS4wLjQNCi0gKiBAYXV0aG9yIExlb25hcmRvIFVyaWJlIChsYXRlc3QgbW9kaWZpY2F0aW9uIGJ5ICRBdXRob3I6IGx1NDI0MiAkKQ0KLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogNzU4NTEzICQgJERhdGU6IDIwMDktMDMtMjUgMjM6MDI6MTYgLTA1MDAgKG1pw6ksIDI1IG1hciAyMDA5KSAkDQotICovDQotQERvY3VtZW50ZWQNCi1AVGFyZ2V0KEVsZW1lbnRUeXBlLkZJRUxEKQ0KLUBSZXRlbnRpb24oUmV0ZW50aW9uUG9saWN5LlNPVVJDRSkNCi1wdWJsaWMgQGludGVyZmFjZSBKU0ZXZWJDb25maWdQYXJhbQ0KLXsNCi0gICAgU3RyaW5nIG5hbWUoKSBkZWZhdWx0ICIiOw0KLSAgICANCi0gICAgLyoqDQotICAgICAqIFNob3J0IGRlc2NyaXB0aW9uDQotICAgICAqLw0KLSAgICBTdHJpbmcgZGVzYygpIGRlZmF1bHQgIiI7DQotICAgIA0KLSAgICAvKioNCi0gICAgICogDQotICAgICAqLw0KLSAgICBTdHJpbmcgZGVmYXVsdFZhbHVlKCkgZGVmYXVsdCAiIjsNCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiANCi0gICAgICovDQotICAgIFN0cmluZyBleHBlY3RlZFZhbHVlcygpIGRlZmF1bHQgIiI7DQotICAgIA0KLSAgICAvKioNCi0gICAgICogDQotICAgICAqLw0KLSAgICBTdHJpbmcgc2luY2UoKSBkZWZhdWx0ICIiOw0KLX0NCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL0xJQ0VOU0UudHh0IGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9MSUNFTlNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDY0NTY5NS4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL0xJQ0VOU0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMjAyICswLDAgQEAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKLSAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8KLQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCi0KLSAgIDEuIERlZmluaXRpb25zLgotCi0gICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLAotICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuCi0KLSAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5Ci0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuCi0KLSAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwKLSAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24KLSAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCi0gICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUKLSAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yCi0gICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKLSAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuCi0KLSAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKLSAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuCi0KLSAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAotICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbgotICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4KLQotICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwKLSAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQKLSAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKLSAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4KLQotICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKLSAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGEKLSAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yawotICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KLQotICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdAotICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQotICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucwotICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMKLSAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgotICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLAotICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4KLQotICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcKLSAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMKLSAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQotICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcgotICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIKLSAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQKLSAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvCi0gICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAotICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUKLSAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dAotICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKLSAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIgotCi0gICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kCi0gICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4KLQotICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsCi0gICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUKLSAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCi0KLSAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKLSAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLAotICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCi0gICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQotICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXIKLSAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKLSAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91Ci0gICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQotICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yawotICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QKLSAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMKLSAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQotICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLgotCi0gICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQotICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0Ci0gICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQotICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0KLSAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yCi0gICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKLQotICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcwotICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAotCi0gICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MKLSAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCi0gICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywKLSAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mCi0gICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAotCi0gICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMKLSAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0Ci0gICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkCi0gICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90Ci0gICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCi0gICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQKLSAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yCi0gICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCi0gICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZAotICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cwotICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKLSAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbgotICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlCi0gICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCi0gICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkCi0gICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLgotCi0gICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQKLSAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMKLSAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKLSAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLAotICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoCi0gICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgotCi0gICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsCi0gICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKLSAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4KLSAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKLSAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkCi0gICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuCi0KLSAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUKLSAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwKLSAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQotICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuCi0KLSAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgotICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaAotICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zCi0gICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBCi0gICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKLSAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQotICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLgotCi0gICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwKLSAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLAotICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKLSAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlCi0gICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsCi0gICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKLSAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUKLSAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwKLSAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCi0gICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yCi0gICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCi0KLSAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcKLSAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsCi0gICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAotICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMKLSAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5Ci0gICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgotICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LAotICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5Ci0gICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCi0gICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4KLQotICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCi0KLSAgIEFQUEVORElYOiBIb3cgdG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yay4KLQotICAgICAgVG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yaywgYXR0YWNoIHRoZSBmb2xsb3dpbmcKLSAgICAgIGJvaWxlcnBsYXRlIG5vdGljZSwgd2l0aCB0aGUgZmllbGRzIGVuY2xvc2VkIGJ5IGJyYWNrZXRzICJbXSIKLSAgICAgIHJlcGxhY2VkIHdpdGggeW91ciBvd24gaWRlbnRpZnlpbmcgaW5mb3JtYXRpb24uIChEb24ndCBpbmNsdWRlCi0gICAgICB0aGUgYnJhY2tldHMhKSAgVGhlIHRleHQgc2hvdWxkIGJlIGVuY2xvc2VkIGluIHRoZSBhcHByb3ByaWF0ZQotICAgICAgY29tbWVudCBzeW50YXggZm9yIHRoZSBmaWxlIGZvcm1hdC4gV2UgYWxzbyByZWNvbW1lbmQgdGhhdCBhCi0gICAgICBmaWxlIG9yIGNsYXNzIG5hbWUgYW5kIGRlc2NyaXB0aW9uIG9mIHB1cnBvc2UgYmUgaW5jbHVkZWQgb24gdGhlCi0gICAgICBzYW1lICJwcmludGVkIHBhZ2UiIGFzIHRoZSBjb3B5cmlnaHQgbm90aWNlIGZvciBlYXNpZXIKLSAgICAgIGlkZW50aWZpY2F0aW9uIHdpdGhpbiB0aGlyZC1wYXJ0eSBhcmNoaXZlcy4KLQotICAgQ29weXJpZ2h0IFt5eXl5XSBbbmFtZSBvZiBjb3B5cmlnaHQgb3duZXJdCi0KLSAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL05PVElDRS50eHQgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL05PVElDRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhM2RiZDYuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9OT1RJQ0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotPT0gIE5PVElDRSBmaWxlIGNvcnJlc3BvbmRpbmcgdG8gc2VjdGlvbiA0KGQpIG9mIHRoZSBBcGFjaGUgTGljZW5zZSwgICA9PQotPT0gIFZlcnNpb24gMi4wLCBpbiB0aGlzIGNhc2UgZm9yIHRoZSBBcGFjaGUgTXlGYWNlcyBNYXZlbiBQbHVnaW5zICAgICA9PQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1UaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IAotVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4KLQotUG9ydGlvbnMgb2YgdGhpcyBzb2Z0d2FyZSB3ZXJlIG9yaWdpbmFsbHkgYmFzZWQgb24gdGhlIGZvbGxvd2luZzoKLQotIC0gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDYsIE9yYWNsZSBDb3JwLCA8aHR0cDovL3d3dy5vcmFjbGUuY29tLz4uCi1hbmQgYXJlIGxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiB1bmRlciB0aGUgCi0iU29mdHdhcmUgR3JhbnQgYW5kIENvcnBvcmF0ZSBDb250cmlidXRpb24gTGljZW5zZSBBZ3JlZW1lbnQiCi0KLVNlZSB0aGUgTElDRU5TRS50eHQgZmlsZSBmb3IgaW5mb3JtYXRpb24gb24gYWxsIGxpY2Vuc2VzIAotYXNzb2NpYXRlZCB3aXRoIHRoaXMgc29mdHdhcmUuCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3BvbS54bWwgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0NWI3ZWIuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjQ2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPiAKLQotICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0KLSAgPHBhcmVudD4KLSAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzPC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1wbHVnaW4tcGFyZW50PC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+MS4wLjU8L3ZlcnNpb24+Ci0gICAgICA8cmVsYXRpdmVQYXRoPi4uL215ZmFjZXMtcGx1Z2luLXBhcmVudC9wb20ueG1sPC9yZWxhdGl2ZVBhdGg+Ci0gIDwvcGFyZW50PgotCi0gIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzPC9ncm91cElkPgotICA8YXJ0aWZhY3RJZD5teWZhY2VzLWJ1aWxkZXItcGx1Z2luPC9hcnRpZmFjdElkPiAKLSAgPHZlcnNpb24+MS4wLjEwLVNOQVBTSE9UPC92ZXJzaW9uPgotICA8cGFja2FnaW5nPm1hdmVuLXBsdWdpbjwvcGFja2FnaW5nPgotICA8bmFtZT5BcGFjaGUgTXlGYWNlcyBCdWlsZHRvb2xzIE1hdmVuMiBCdWlsZGVyIFBsdWdpbjwvbmFtZT4KLSAgPGRlc2NyaXB0aW9uPgotICAgIEEgbWF2ZW4gcGx1Z2luIHRoYXQgdXNlcyBhbm5vdGF0aW9ucyAoamF2YTE1IG9yIGRvY2xldCBzdHlsZSkgdG8gZ2VuZXJhdGUgdGhlIG5lY2Vzc2FyeSBKU0YgY29uZmlndXJhdGlvbgotICAgIGZpbGVzICgudGxkLCBmYWNlcy1jb25maWcueG1sLCBldGMpIGFuZCBvcHRpb25hbGx5IFRhZywgVmFsaWRhdG9yIGFuZCBDb21wb25lbnQgY2xhc3Nlcy4KLSAgPC9kZXNjcmlwdGlvbj4KLQotICA8c2NtPgotICAgIDxjb25uZWN0aW9uPnNjbTpzdm46aHR0cDovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9teWZhY2VzL215ZmFjZXMtYnVpbGQtdG9vbHMvdHJ1bmsvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbjwvY29ubmVjdGlvbj4KLSAgICA8ZGV2ZWxvcGVyQ29ubmVjdGlvbj5zY206c3ZuOmh0dHBzOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL215ZmFjZXMvbXlmYWNlcy1idWlsZC10b29scy90cnVuay9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luPC9kZXZlbG9wZXJDb25uZWN0aW9uPgotICAgIDx1cmw+aHR0cDovL3N2bi5hcGFjaGUub3JnL3ZpZXd2Yy9teWZhY2VzL215ZmFjZXMtYnVpbGQtdG9vbHMvdHJ1bmsvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbjwvdXJsPgotICA8L3NjbT4KLQotICA8cHJvcGVydGllcz4KLSAgICA8bWF2ZW5WZXJzaW9uPjIuMC45PC9tYXZlblZlcnNpb24+Ci0gICAgPGRveGlhVmVyc2lvbj4xLjA8L2RveGlhVmVyc2lvbj4KLSAgICA8cGx1Z2luVGVzdGluZ1ZlcnNpb24+MS4yPC9wbHVnaW5UZXN0aW5nVmVyc2lvbj4KLSAgPC9wcm9wZXJ0aWVzPgotICAKLSAgPGJ1aWxkPgotICAgIDxwbHVnaW5zPgotICAgICAgPCEtLSByZXF1aXJlZCBmb3IgcGxleHVzLCBidXQgd2UgYXJlIG5vdCB1c2luZyB0aGlzIHJpZ2h0IG5vdwotICAgICAgPHBsdWdpbj4KLSAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tcGx1Z2luLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgPGdvYWxQcmVmaXg+bXlmYWNlcy1idWlsZGVyPC9nb2FsUHJlZml4PgotICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICA8L3BsdWdpbj4KLSAgICAgICAtLT4KLSAgICAgIDxwbHVnaW4+Ci0gICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWNvbXBpbGVyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPHZlcnNpb24+Mi4wLjI8L3ZlcnNpb24+Ci0gICAgICAgIDxpbmhlcml0ZWQ+dHJ1ZTwvaW5oZXJpdGVkPgotICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICA8c291cmNlPjEuNTwvc291cmNlPgotICAgICAgICAgIDx0YXJnZXQ+MS41PC90YXJnZXQ+Ci0gICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgIDwvcGx1Z2luPgotICAgICAgPHBsdWdpbj4KLSAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc3VyZWZpcmUtcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj4yLjQuMjwvdmVyc2lvbj4KLSAgICAgIDwvcGx1Z2luPgotICAgICAgPHBsdWdpbj4KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgotICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1jaGVja3N0eWxlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgPGNvbmZpZ0xvY2F0aW9uPmRlZmF1bHQvbXlmYWNlcy1jaGVja3MtbWluaW1hbC54bWw8L2NvbmZpZ0xvY2F0aW9uPgotICAgICAgICAgIDxoZWFkZXJMb2NhdGlvbj5kZWZhdWx0L215ZmFjZXMtaGVhZGVyLXNwYWNlcy50eHQ8L2hlYWRlckxvY2F0aW9uPgotICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICA8L3BsdWdpbj4KLSAgICAgIAotICAgIDwvcGx1Z2lucz4KLSAgPC9idWlsZD4KLQotICA8cmVwb3J0aW5nPgotICAgIDxwbHVnaW5zPgotICAgICAgPHBsdWdpbj4KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgotICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1wbHVnaW4tcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj4yLjI8L3ZlcnNpb24+Ci0gICAgICA8L3BsdWdpbj4KLSAgICAgIDxwbHVnaW4+Ci0gICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWphdmFkb2MtcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgPC9wbHVnaW4+Ci0gICAgPC9wbHVnaW5zPgotICA8L3JlcG9ydGluZz4KLSAgCi0gIDxkZXBlbmRlbmNpZXM+Ci0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuPC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tcGx1Z2luLWFwaTwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPiR7bWF2ZW5WZXJzaW9ufTwvdmVyc2lvbj4KLSAgICA8L2RlcGVuZGVuY3k+Ci0KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW48L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1wcm9qZWN0PC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+JHttYXZlblZlcnNpb259PC92ZXJzaW9uPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgICAKLSAgICA8ZGVwZW5kZW5jeT4gICAgCi0gICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1kZXBlbmRlbmN5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjIuMzwvdmVyc2lvbj4KLSAgICA8L2RlcGVuZGVuY3k+ICAgCi0KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPmNvbS50aG91Z2h0d29ya3MucWRveDwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPnFkb3g8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4xLjEyPC92ZXJzaW9uPgotICAgIDwvZGVwZW5kZW5jeT4KLQotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+Y29tbW9ucy1kaWdlc3RlcjwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPmNvbW1vbnMtZGlnZXN0ZXI8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4xLjg8L3ZlcnNpb24+Ci0gICAgPC9kZXBlbmRlbmN5PgotCi0gICAgPCEtLQotICAgIDxkZXBlbmRlbmN5PgotICAgIAk8Z3JvdXBJZD54bWwtYXBpczwvZ3JvdXBJZD4KLSAgICAJPGFydGlmYWN0SWQ+eG1sLWFwaXM8L2FydGlmYWN0SWQ+Ci0gICAgCTx2ZXJzaW9uPjEuMC5iMjwvdmVyc2lvbj4KLSAgICAJPHNjb3BlPnJ1bnRpbWU8L3Njb3BlPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgICAtLT4KLQotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+c2F4b248L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5zYXhvbjwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjYuNS4zPC92ZXJzaW9uPgotICAgICAgPHNjb3BlPnJ1bnRpbWU8L3Njb3BlPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgICAKLSAgICA8IS0tCi0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD54ZXJjZXM8L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD54ZXJjZXNJbXBsPC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+Mi42LjI8L3ZlcnNpb24+Ci0gICAgICA8c2NvcGU+cnVudGltZTwvc2NvcGU+Ci0gICAgPC9kZXBlbmRlbmN5PgotICAgIC0tPgotCi0gICAgPGRlcGVuZGVuY3k+Ci0gICAgCTxncm91cElkPnN0YXg8L2dyb3VwSWQ+Ci0gICAgCTxhcnRpZmFjdElkPnN0YXgtYXBpPC9hcnRpZmFjdElkPgotICAgIAk8dmVyc2lvbj4xLjAuMTwvdmVyc2lvbj4KLSAgICAJPCEtLSA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+ICAtLT4KLSAgICA8L2RlcGVuZGVuY3k+Ci0KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAJPGdyb3VwSWQ+c3RheDwvZ3JvdXBJZD4KLSAgICAJPGFydGlmYWN0SWQ+c3RheDwvYXJ0aWZhY3RJZD4KLSAgICAJPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+Ci0gICAgCTwhLS0gPHNjb3BlPnJ1bnRpbWU8L3Njb3BlPiAgLS0+Ci0gICAgPC9kZXBlbmRlbmN5PgotCi0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLnZlbG9jaXR5PC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+dmVsb2NpdHk8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4xLjYuNDwvdmVyc2lvbj4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gICAgCi0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5sb2draXQ8L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5sb2draXQ8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4yLjA8L3ZlcnNpb24+Ci0gICAgPC9kZXBlbmRlbmN5PgotCi0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5jb21tb25zLWNvbGxlY3Rpb25zPC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+Y29tbW9ucy1jb2xsZWN0aW9uczwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjMuMTwvdmVyc2lvbj4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gICAgCi0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5jb21tb25zLWxhbmc8L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5jb21tb25zLWxhbmc8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4yLjQ8L3ZlcnNpb24+Ci0gICAgPC9kZXBlbmRlbmN5PgotICAgIDwhLS0gICAgIAotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+b3JnLmNvZGVoYXVzLnBsZXh1czwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPnBsZXh1cy12ZWxvY2l0eTwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjEuMS43PC92ZXJzaW9uPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgLS0+Ci0gICAgCi0gICAgPCEtLSBSZXBvcnRpbmcgcmVxdWlyZWQgQVBJLS0+Ci0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnJlcG9ydGluZzwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXJlcG9ydGluZy1hcGk8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4zLjA8L3ZlcnNpb24+Ci0gICAgPC9kZXBlbmRlbmN5PgotICAKLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucmVwb3J0aW5nPC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tcmVwb3J0aW5nLWltcGw8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4yLjAuNTwvdmVyc2lvbj4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gICAgCi0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLmRveGlhPC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+ZG94aWEtc2luay1hcGk8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4ke2RveGlhVmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgPC9kZXBlbmRlbmN5PgotICAgIAotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5kb3hpYTwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPmRveGlhLXNpdGUtcmVuZGVyZXI8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4ke2RveGlhVmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgPC9kZXBlbmRlbmN5PgotICAgIAotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5kb3hpYTwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPmRveGlhLWRlY29yYXRpb24tbW9kZWw8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4xLjA8L3ZlcnNpb24+Ci0gICAgPC9kZXBlbmRlbmN5PgotCi0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5vcmcuY29kZWhhdXMucGxleHVzPC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+cGxleHVzLXV0aWxzPC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+My4wPC92ZXJzaW9uPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgICA8IS0tIEVuZCBSZXBvcnRpbmcgcmVxdWlyZWQgQVBJIC0tPgotCi0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5sb2c0ajwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPmxvZzRqPC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+MS4yLjEzPC92ZXJzaW9uPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgPC9kZXBlbmRlbmNpZXM+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL0J1aWxkTWV0YURhdGFNb2pvLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL0J1aWxkTWV0YURhdGFNb2pvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4MmQ1NjcuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9CdWlsZE1ldGFEYXRhTW9qby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAzICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5idWlsZGVyOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLm5ldC5VUkxDbGFzc0xvYWRlcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5QYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlNBWFBhcnNlckZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuZGlnZXN0ZXIuRGlnZXN0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5hcnRpZmFjdC5EZXBlbmRlbmN5UmVzb2x1dGlvblJlcXVpcmVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ubW9kZWwuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uQWJzdHJhY3RNb2pvOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLk1vam9FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wcm9qZWN0Lk1hdmVuUHJvamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmJ1aWxkZXIubW9kZWwuQ29tcG9uZW50TWV0YTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmJ1aWxkZXIubW9kZWwuTW9kZWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5idWlsZGVyLnFkb3guUWRveE1vZGVsQnVpbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmJ1aWxkZXIudHJpbmlkYWQucGFyc2UuRmFjZXNDb25maWdCZWFuOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uYnVpbGRlci50cmluaWRhZC5wYXJzZS5GYWNlc0NvbmZpZ1BhcnNlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmJ1aWxkZXIudHJpbmlkYWQudXRpbC5YSW5jbHVkZUZpbHRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmJ1aWxkZXIudXRpbHMuQnVpbGRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi50YWdkb2MuVGFnZG9jQ29udGVudE1vam8uVVJMQ3JlYXRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMudXRpbC5TdHJpbmdVdGlsczsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247Ci0KLS8qKgotICogTWF2ZW4gZ29hbCB3aGljaCBydW5zIG9uZSBvciBtb3JlIE1vZGVsQnVpbGRlciBvYmplY3RzIHRvIGdhdGhlciBtZXRhZGF0YQotICogYWJvdXQgSlNGIGFydGlmYWN0cyBpbnRvIGEgTW9kZWwgb2JqZWN0LCB0aGVuIHNhdmUgdGhhdCBtb2RlbCBvYmplY3QgYXMgYW4KLSAqIHhtbCBmaWxlIGZvciB1c2UgYnkgb3RoZXIgZ29hbHMgb2YgdGhpcyBwbHVnaW4uCi0gKiA8cD4KLSAqIEJ5IGRlZmF1bHQsIHRoZSBnZW5lcmF0ZWQgZmlsZSBpcyBuYW1lZCAiTUVUQS1JTkYvbXlmYWNlcy1tZXRhZGF0YS54bWwiLgotICogVGhpcyBmaWxlIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIGZpbmFsIGFydGlmYWN0IGZvciB0aGlzIHByb2plY3QuIEhhdmluZwotICogdGhhdCBtZXRhZGF0YSBmaWxlIGVtYmVkZGVkIGluIHRoZSBnZW5lcmF0ZWQgamFyZmlsZSBpcyB1c2VmdWwgZm9yIHR3bwotICogcHVycG9zZXM6Ci0gKiA8dWw+Ci0gKiA8bGk+SXQgaXMgbmVlZGVkIGlmIG90aGVyIHByb2plY3RzIHRoZW4gdXNlIHRoZSBteWZhY2VzLWJ1aWxkZXItcGx1Z2luIHRvCi0gKiBjcmVhdGUgc3ViY2xhc3NlcyBvZiB0aGUganNmIGNsYXNzZXMgaW4gdGhpcyBwcm9qZWN0LjwvbGk+Ci0gKiA8bGk+SXQgaXMgZ29vZCBkb2N1bWVudGF0aW9uIChtb3JlIHByZWNpc2UgdGhhbiB0aGUgdGxkIGFuZCBmYWNlcy1jb25maWcueG1sCi0gKiBmaWxlcykuPC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKiA8cD4KLSAqIE5vdGUgdGhhdCB0aGUgZ2VuZXJhdGVkIGZpbGUgY29udGFpbnMgYWxsIHRoZSBtZXRhZGF0YSBuZWVkZWQgYnkgdGhpcwotICogcHJvamVjdCwgaW5jbHVkaW5nIGEgY29weSBvZiBhbGwgdGhlIG1ldGFkYXRhIGZyb20gb3RoZXIgcHJvamVjdHMgdGhhdAotICogdGhpcyBvbmUgZGVwZW5kcyBvbi4gQWxsIG90aGVyIGdvYWxzIG9mIHRoaXMgcGx1Z2luIGNhbiBleGVjdXRlIHdpdGgKLSAqIGp1c3QgdGhlIGdlbmVyYXRlZCBtZXRhZGF0YSBhcyBpbnB1dCwgd2l0aG91dCBuZWVkaW5nIHRvIGxvYWQgb3RoZXIKLSAqIHByb2plY3RzLiBFYWNoIGVudHJ5IGluIHRoZSBtZXRhZGF0YSBpcyBsYWJlbGxlZCB3aXRoIGEgIm1vZGVsSWQiCi0gKiBwcm9wZXJ0eSB0aGF0IGluZGljYXRlcyB3aGVyZSBpdCBvcmlnaW5hbGx5IGNhbWUgZnJvbS4KLSAqIDwvcD4KLSAqIAotICogQHJlcXVpcmVzRGVwZW5kZW5jeVJlc29sdXRpb24gY29tcGlsZQotICogQGdvYWwgYnVpbGQtbWV0YWRhdGEKLSAqIEBwaGFzZSBnZW5lcmF0ZS1zb3VyY2VzCi0gKi8KLXB1YmxpYyBjbGFzcyBCdWlsZE1ldGFEYXRhTW9qbyBleHRlbmRzIEFic3RyYWN0TW9qbwotewotICAgIC8qKgotICAgICAqIEluamVjdGVkIE1hdmVuIHByb2plY3Qgb2JqZWN0LgotICAgICAqIAotICAgICAqIEBwYXJhbWV0ZXIgZXhwcmVzc2lvbj0iJHtwcm9qZWN0fSIKLSAgICAgKiBAcmVhZG9ubHkKLSAgICAgKi8KLSAgICBwcml2YXRlIE1hdmVuUHJvamVjdCBwcm9qZWN0OwotCi0gICAgLyoqCi0gICAgICogQnVpbGQgZGlyZWN0b3J5IGZvciBhbGwgZ2VuZXJhdGVkIHN0dWZmLgotICAgICAqIDxwPgotICAgICAqIFRoaXMgbW9qbyByZWdpc3RlcnMgdGhlIHNwZWNpZmllZCBkaXJlY3Rvcnkgd2l0aCBNYXZlbiBhcyBhIHJlc291cmNlIGRpci4gVGhlCi0gICAgICogbWF2ZW4tcmVzb3VyY2VzLXBsdWdpbiB3aWxsIHRoZW4gcmVhZCB0aGUgZmlsZXMgZnJvbSB0aGlzIGRpciBhbmQgY29weSB0aGVtCi0gICAgICogaW50byB0aGUgImNlbnRyYWwiIHRhcmdldCBkaXJlY3RvcnkgZnJvbSB3aGljaCB0aGUgamFyZmlsZSBpcyBidWlsdC4gCi0gICAgICogPC9wPgotICAgICAqIAotICAgICAqIEBwYXJhbWV0ZXIgZXhwcmVzc2lvbj0iJHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vZ2VuZXJhdGVkLXJlc291cmNlcy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luIgotICAgICAqLwotICAgIHByaXZhdGUgRmlsZSB0YXJnZXREaXJlY3Rvcnk7Ci0KLSAgICAvKioKLSAgICAgKiBOYW1lIG9mIHRoZSBtZXRhZGF0YSBmaWxlIHRvIGdlbmVyYXRlLCByZWxhdGl2ZSB0byB0YXJnZXREaXJlY3RvcnkuCi0gICAgICogCi0gICAgICogQHBhcmFtZXRlcgotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIG91dHB1dEZpbGUgPSAiTUVUQS1JTkYvbXlmYWNlcy1tZXRhZGF0YS54bWwiOwotCi0gICAgLyoqCi0gICAgICogVGhlIG1vZGVsSWQgdG8gYXNzb2NpYXRlIHdpdGggYWxsIG1vZGVsIGl0ZW1zIGRpc2NvdmVyZWQgaW4gdGhlCi0gICAgICogc291cmNlIGRpcmVjdG9yaWVzIG9mIHRoaXMgcHJvamVjdC4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIHZhbHVlIDxpPm11c3Q8L2k+IGJlIHVuaXF1ZSBmb3IgZWFjaCBwcm9qZWN0LiBJZiBub3Qgc3BlY2lmaWVkLAotICAgICAqIHRoZW4gaXQgZGVmYXVsdHMgdG8gdGhlIGFydGlmYWN0SWQgb2YgdGhlIGN1cnJlbnQgbWF2ZW4gcHJvamVjdC4KLSAgICAgKiA8L3A+Ci0gICAgICogPHA+Ci0gICAgICogSW4gbGF0ZXIgcGhhc2VzLCBnb2FscyBhcmUgcGFzc2VkIHRoZSBjb21wbGV0ZSBtZXRhZGF0YSBtb2RlbCB3aGljaAotICAgICAqIG1peGVzIGl0ZW1zIGRpc2NvdmVyZWQgaGVyZSB3aXRoIGl0ZW1zIGltcG9ydGVkIGZyb20gbWV0YWRhdGEgaW4gCi0gICAgICogb3RoZXIgcHJvamVjdHMuIFRoZSBtb2RlbElkIGlzIHVzZWQgdG8gZmlndXJlIG91dCB3aGljaCBvZiB0aGUKLSAgICAgKiBpdGVtcyBzaG91bGQgYmUgcHJvY2Vzc2VkIChpZSB3aGljaCBvbmVzIGFyZSBhc3NvY2lhdGVkIHdpdGggdGhpcwotICAgICAqIHByb2plY3QpIGFuZCB3aGljaCBzaG91bGQgYmUgaWdub3JlZC4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW1ldGVyIGV4cHJlc3Npb249IiR7cHJvamVjdC5hcnRpZmFjdElkfSIKLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBtb2RlbElkOwotICAgIAotICAgIC8qKgotICAgICAqIFJlcGxhY2UgdGhlIHBhY2thZ2UgcHJlZml4LgotICAgICAqIDxwPgotICAgICAqIFRoaXMgYWxsb3dzIGEgcHJvamVjdCB0aGF0IGluaGVyaXRzIG1ldGFkYXRhIGZyb20gc29tZSBvdGhlciBwcm9qZWN0IHRvIGZvcmNlCi0gICAgICogY29waWVzIG9mIHRoZSBUYWcgY2xhc3NlcyB0byBiZSBjcmVhdGVkIGluIGEgbmFtZXNwYWNlIG9mIGl0cyBvd24gY2hvb3NpbmcuCi0gICAgICogPC9wPgotICAgICAqIDxwPgotICAgICAqIFRoaXMgaXMgdXNlZCBpbiBwYXJ0aWN1bGFyIHRvIGNyZWF0ZSBjb3BpZXMgb2YgdGhlIFRhZyBjbGFzc2VzIGluIG15ZmFjZXMtaW1wbAotICAgICAqIHdpdGhpbiBvdGhlciBwcm9qZWN0cyBzbyB0aGF0IHRoZXkgY2FuIGJlIHVzZWQgYXMgYmFzZSBjbGFzc2VzIGZvciBvdGhlciB0YWdzCi0gICAgICogd2l0aGluIHRoYXQgcHJvamVjdC4gVGhlIG9yaWdpbmFsIHRhZyBwcmVzZW50IGluIHRoZSBteWZhY2VzLWltcGwuamFyIGNhbm5vdAotICAgICAqIGJlIHVzZWQgYXMgYSBiYXNlIGJlY2F1c2UgdGhhdCB3b3VsZCBwcmV2ZW50IHRoZSBkZXJpdmVkIHByb2plY3QgZnJvbSBydW5uaW5nCi0gICAgICogd2l0aCBvdGhlciBKU0YgaW1wbGVtZW50YXRpb25zLgotICAgICAqIDwvcD4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgY2hpbGQgcHJvamVjdCBmaXJzdCBkZWZpbmVzIHRoaXMgKGFuZCByZXBsYWNlUGFja2FnZVByZWZpeFRhZ1RvKTsgYXMgdGhlCi0gICAgICogaW5oZXJpdGVkIG1ldGFkYXRhIGlzIG1lcmdlZCB0aGUgdGFnQ2xhc3MgYXR0cmlidXRlIGlzIG1vZGlmaWVkLiBUaGVuIGR1cmluZwotICAgICAqIHRoZSB0YWcgY2xhc3MgZ2VuZXJhdGlvbiBnb2FsLCB0aGUgbW9kZWxJZCBvZiB0aGUgaW5oZXJpdGVkIHByb2plY3QgaXMgaW5jbHVkZWQKLSAgICAgKiBpbiB0aGUgbGlzdCBvZiBtb2RlbElkcyB0byBwcm9jZXNzLiBUaGF0IGNhdXNlcyB0aGUgdGFnIGNsYXNzZXMgdG8gYmUgZ2VuZXJhdGVkCi0gICAgICogYWdhaW4gLSBidXQgdGhpcyB0aW1lIGluIGEgZGlmZmVyZW50IHBhY2thZ2UuCi0gICAgICogPC9wPgotICAgICAqIAotICAgICAqIEBwYXJhbWV0ZXIKLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyByZXBsYWNlUGFja2FnZVByZWZpeFRhZ0Zyb207Ci0KLSAgICAvKioKLSAgICAgKiBSZXBsYWNlIHRoZSBwYWNrYWdlIHByZWZpeAotICAgICAqIDxwPgotICAgICAqIFNlZSByZXBsYWNlUGFja2FnZVByZWZpeFRhZ1RvLgotICAgICAqIDwvcD4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW1ldGVyCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgcmVwbGFjZVBhY2thZ2VQcmVmaXhUYWdUbzsKLSAgICAKLSAgICAvKioKLSAgICAgKiBTcGVjaWZ5IHRoZSBvcmRlciBpbiB3aGljaCBtb2RlbHMgYXJlIHRvIGJlIG1lcmdlZCAobm90IHVzdWFsbHkgbmVlZGVkKS4KLSAgICAgKiA8cD4KLSAgICAgKiBXaGVuIHR3byBkaWZmZXJlbnQgbW9kZWxzIGRlZmluZSBleGFjdGx5IHRoZSBzYW1lIGl0ZW0gKGllIHRoZSAiY2xhc3MiIGF0dHJpYnV0ZQotICAgICAqIGZvciB0d28gaXRlbXMgaXMgdGhlIHNhbWUpIHRoZW4gdGhlIG9uZSBmcm9tIHRoZSBtb2RlbCB0aGF0IGlzIG1lcmdlZCBmaXJzdCBpcwotICAgICAqIHVzZWQsIGFuZCB0aGUgbGF0ZXIgb25lIGlzIGlnbm9yZWQuCi0gICAgICogPC9wPgotICAgICAqIDxwPgotICAgICAqIFRoaXMgcHJvcGVydHkgYWxsb3dzIHRoZSBvcmRlciBvZiBtZXJnaW5nIHRvIGJlIGNvbnRyb2xsZWQ7IG1vZGVscyBhcmUgbWVyZ2VkIGluCi0gICAgICogdGhlIG9yZGVyIHNwZWNpZmllZCBpbiB0aGlzIGxpc3QuIEFueSBtb2RlbHMgd2hvc2UgaWRzIGFyZSBub3QgaW4gdGhpcyBsaXN0IGFyZQotICAgICAqIHRoZW4gbWVyZ2VkIGluIGFuIHVuZGVmaW5lZCBvcmRlciBhdCB0aGUgZW5kLgotICAgICAqIDwvcD4KLSAgICAgKiA8cD4KLSAgICAgKiBTZXR0aW5nIHRoaXMgcHJvcGVydHkgaXMgbm90IG5vcm1hbGx5IG5lY2Vzc2FyeTsgdHlwaWNhbGx5IG1vZGVscyBpbmhlcml0ZWQgZnJvbQotICAgICAqIGRlcGVuZGVuY2llcyBkZWZpbmUgZGlmZmVyZW50IG1vZGVsIGl0ZW1zIChpZSBoYXZlIG5vIG92ZXJsYXApLiBIb3dldmVyIGNvbnNpZGVyCi0gICAgICogdGhlIHNpdHVhdGlvbiB3aGVyZSBwcm9qZWN0IEEgZGVmaW5lcyBhIG1vZGVsLCBwcm9qZWN0IEIgZXh0ZW5kcyBBLCB0aGVuIHByb2plY3QgQwotICAgICAqIGV4dGVuZHMgQi4gSW4gdGhpcyBjYXNlLCBib3RoIEEgYW5kIEIgYXJlIGluIHRoZSBkZXBlbmRlbmNpZXMsIGJ1dCB0aGUgbWV0YWRhdGEgaW4KLSAgICAgKiBwcm9qZWN0IEIgY29udGFpbnMgYSBjb21wbGV0ZSBjb3B5IG9mIGFsbCB0aGUgZGF0YSBmcm9tIEEuIEhvd2V2ZXIgQidzIG1ldGFkYXRhIGlzCi0gICAgICogZnJvbSA8aT50aGUgdmVyc2lvbiBvZiBBIHRoYXQgaXQgd2FzIGNvbXBpbGVkIGFnYWluc3Q8L2k+IHdoaWNoIG1pZ2h0IG5vdCBiZSB0aGUKLSAgICAgKiB2ZXJzaW9uIG9mIEEgdGhhdCBpcyBpbiB0aGUgZGVwZW5kZW5jaWVzLiBGb3Igc2FmZXR5IGluIHRoaXMgY2FzZSwgaXQgaXMgYmV0dGVyIHRvCi0gICAgICogZW5zdXJlIHRoYXQgcHJvamVjdCBCJ3MgbWV0YWRhdGEgaXMgbG9hZGVkIGZpcnN0OyB0aGlzIGNhbiBwb3NzaWJseSBoaWRlIGFueSBuZXcKLSAgICAgKiBmZWF0dXJlcyAob3IgYnVnZml4ZXMpIGZyb20gdGhlIG5ldyByZWxlYXNlIG9mIEEsIGJ1dCBhbHNvIGVuc3VyZXMgdGhhdCBjbGFzc2VzCi0gICAgICogaW4gQyB3aGljaCBleHRlbmQgY2xhc3NlcyBpbiBCIGRvIG5vdCBkZWNsYXJlIGZlYXR1cmVzIHRoYXQgQiBkb2VzIG5vdCBzdXBwb3J0LgotICAgICAqIDwvcD4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIHByb3BlcnR5IGlzIG9ubHkgbmVlZGVkIGluIHJhcmUgc2l0dWF0aW9uczsgbm9ybWFsbHkgaXQgY2FuIGJlIG9taXR0ZWQuCi0gICAgICogPC9wPgotICAgICAqIAotICAgICAqIEBwYXJhbWV0ZXIKLSAgICAgKi8KLSAgICBwcml2YXRlIExpc3Qgb3JkZXJNb2RlbElkczsKLSAgICAKLSAgICAvKioKLSAgICAgKiBBbiBvcHRpb25hbCBsaXN0IG9mIG1vZGVscyB0byBpbXBvcnQgZnJvbSBkZXBlbmRlbmN5IGphcnMuCi0gICAgICogPHA+Ci0gICAgICogVGhlIGRlZmF1bHQgYmVoYXZpb3VyIGlzIHRvIHNjYW4gYWxsIGphciBkZXBlbmRlbmNpZXMgZm9yIG1ldGFkYXRhIGZpbGVzLCBhbmQKLSAgICAgKiBtZXJnZSBhbGwgdGhlIGRhdGEgaW50byB0aGUgbW9kZWwgZm9yIHRoaXMgcHJvamVjdC4gSWYgdGhpcyBwcm9wZXJ0eSBpcyBzZXQsCi0gICAgICogdGhlbiBtZXRhZGF0YSBmb3VuZCBpbiBkZXBlbmRlbmNpZXMgaXMgb25seSBtZXJnZWQgaWYgdGhlIG1vZGVsSWQgbWF0Y2hlcyBvbmUKLSAgICAgKiBpbiB0aGlzIGxpc3QuCi0gICAgICogPC9wPgotICAgICAqIDxwPgotICAgICAqIE5vdGUgdGhhdCBieSBkZWZhdWx0LCBhIHByb2plY3QncyBtb2RlbElkIGlzIHRoZSBzYW1lIGFzIHRoZSBhcnRpZmFjdElkLgotICAgICAqIDwvcD4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW1ldGVyCi0gICAgICovCi0gICAgcHJpdmF0ZSBMaXN0IGRlcGVuZGVuY3lNb2RlbElkczsKLSAgICAKLSAgICAvKioKLSAgICAgKiBUaGUgbmFtZSBvZiBhIG1ldGFkYXRhIGZpbGUgdG8gbWVyZ2UgaW50byB0aGUgbW9kZWwgZm9yIHRoZSBjdXJyZW50IHByb2plY3QuCi0gICAgICogPHA+Ci0gICAgICogVGhpcyBmaWxlIGlzIGFsd2F5cyBsb2FkZWQgZmlyc3QsIGJlZm9yZSBhbnkgbWV0YWRhdGEgZnJvbSBkZXBlbmRlbmNpZXMgaXMKLSAgICAgKiBsb2FkZWQsIGFuZCBiZWZvcmUgc2Nhbm5pbmcgb2YgdGhlIHNvdXJjZSBkaXJlY3RvcmllcyBmb3IgdGhlIGN1cnJlbnQKLSAgICAgKiBwcm9qZWN0IGlzIGRvbmUuCi0gICAgICogPC9wPgotICAgICAqIDxwPgotICAgICAqIFRoZSBzcGVjaWZpZWQgZmlsZW5hbWUgaXMgcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkuCi0gICAgICogPC9wPgotICAgICAqIDxwPgotICAgICAqIE5vcm1hbGx5LCB0aGlzIG9wdGlvbiBpcyBub3QgdXNlZCBhbmQgYW55IG1vZGVscyB0aGF0IHRoaXMgcHJvamVjdCBleHRlbmRzCi0gICAgICogYXJlIHNpbXBseSBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIHZpYSBzY2FubmluZyBvZiB0aGUgbWF2ZW4gZGVwZW5kZW5jaWVzIGFuZAotICAgICAqIGxvYWRlZCBmcm9tIHRoZSBkZXBlbmRlbmN5IGphcmZpbGUuIEhvd2V2ZXIgdGhlcmUgYXJlIGEgY291cGxlIG9mIHNpdHVhdGlvbnMKLSAgICAgKiB3aGVyZSBpdCBpcyB1c2VmdWwgdG8gc3BlY2lmeSBhbiBleHBsaWNpdCBtZXRhZGF0YSBmaWxlIHRvIGxvYWQgaW5zdGVhZC4gIAotICAgICAqIDwvcD4KLSAgICAgKiA8cD4gCi0gICAgICogT25lIGV4YW1wbGUgaXMgd2hlbiBhIHByb2plY3QgZXh0ZW5kcyBjb21wb25lbnRzIGluIGEgcHJvamVjdCB3aGljaCB3YXMgbm90Ci0gICAgICogYnVpbHQgd2l0aCB0aGUgbXlmYWNlcy1idWlsZGVyLXBsdWdpbiAob3Igd2hlcmUgbXlmYWNlcy1idWlsZGVyLXBsdWdpbgotICAgICAqIHN1cHBvcnQgaXMgb25seSBpbiBhIG5vdC15ZXQtcmVsZWFzZWQgdmVyc2lvbikuIEluIHRoaXMgY2FzZSwgYSBtZXRhZGF0YSBmaWxlCi0gICAgICogY2FuIGJlIGNyZWF0ZWQgYnkgaGFuZCAob3IgZ2VuZXJhdGVkIGZyb20gdGhlIHVucmVsZWFzZWQgdHJ1bmsgdmVyc2lvbikgYW5kCi0gICAgICogZXhwbGljaXRseSBsb2FkZWQgdmlhIHRoaXMgcHJvcGVydHkuCi0gICAgICogPC9wPgotICAgICAqIDxwPgotICAgICAqIEEgc2Vjb25kIGV4YW1wbGUgaXMgd2hlbiBpdCBpcyBuZWNlc3NhcnkgdG8gYWRkIHNvbWUgY3VzdG9tIG1vZGVsIGRlZmluaXRpb25zIHRvCi0gICAgICogdGhlIG1vZGVsIHRvIGJlIGJ1aWx0LCBlZyB0byBvdmVycmlkZSBidWdneSBvciBtaXNzaW5nIG1ldGFkYXRhIGluIGEgcHJvamVjdAotICAgICAqIHRoYXQgdGhpcyBwcm9qZWN0IGV4dGVuZHMuIE9mIGNvdXJzZSB0aGlzIGlzIGhvcGVmdWxseSBub3QgbmVlZGVkOyBpdCB3b3VsZCBiZQotICAgICAqIGJldHRlciB0byBnZXQgYSBidWdmaXggcmVsZWFzZSBvZiB0aGUgcGFyZW50IHByb2plY3Qgb3V0IGluc3RlYWQhCi0gICAgICogPC9wPgotICAgICAqIAotICAgICAqIEBwYXJhbWV0ZXIKLSAgICAgKi8KLSAgICBwcml2YXRlIEZpbGUgaW5wdXRGaWxlOwotICAgIAotICAgIC8qKgotICAgICAqIEEgY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgZmlsZSBwYXR0ZXJucyB0byBpbmNsdWRlIHdoZW4gYnVpbGRpbmcgdGhlCi0gICAgICogbW9kZWwuICBpLmUuICAqKlwvKi5qYXZhCi0gICAgICogCi0gICAgICogQHBhcmFtZXRlcgotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIGluY2x1ZGVzOwotICAgIAotICAgIC8qKgotICAgICAqICBBIGNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIGZpbGUgcGF0dGVybnMgdG8gZXhjbHVkZSB3aGVuIGJ1aWxkaW5nIHRoZQotICAgICAqICBtb2RlbC4gIGkuZS4gICoqXC8qLmphdmEKLSAgICAgKiBAcGFyYW1ldGVyCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgZXhjbHVkZXM7Ci0gICAgCi0gICAgLyoqCi0gICAgICogVGhpcyBwYXJhbSBpcyB1c2VkIHRvIHNlYXJjaCBpbiB0aGlzIGZvbGRlciBpZiBzb21lIGZpbGUgdG8KLSAgICAgKiBiZSBnZW5lcmF0ZWQgZXhpc3RzIGFuZCBhdm9pZCBnZW5lcmF0aW9uIGFuZCBkdXBsaWNhdGUgZXhjZXB0aW9uLgotICAgICAqIAotICAgICAqIEBzaW5jZSAxLjAuNAotICAgICAqIEBwYXJhbWV0ZXIKLSAgICAgKi8gICAgCi0gICAgcHJpdmF0ZSBMaXN0IHNvdXJjZURpcmVjdG9yaWVzOwotCi0gICAgLyoqCi0gICAgICogVGhlIGRpcmVjdG9yeSB3aGVyZSBhbGwgZ2VuZXJhdGVkIGZpbGVzIGFyZSBjcmVhdGVkLiBUaGlzIGRpcmVjdG9yeSBpcyBhZGRlZCBhcyBhCi0gICAgICogY29tcGlsZSBzb3VyY2Ugcm9vdCBhdXRvbWF0aWNhbGx5IGxpa2Ugc3JjL21haW4vamF2YSBpcy4gCi0gICAgICogCi0gICAgICogQHNpbmNlIDEuMC44Ci0gICAgICogQHBhcmFtZXRlciBleHByZXNzaW9uPSIke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9nZW5lcmF0ZWQtc291cmNlcy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luIgotICAgICAqLwotICAgIHByaXZhdGUgRmlsZSBnZW5lcmF0ZWRTb3VyY2VEaXJlY3Rvcnk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogVGhlIGRpcmVjdG9yeSB3aGVyZSB0aGVyZSBhcmUgdGhlIGNvbXBvc2l0ZSBjb21wb25lbnQgdGVtcGxhdGVzCi0gICAgICogCi0gICAgICogQHBhcmFtZXRlciBleHByZXNzaW9uPSJzcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvcmVzb3VyY2VzIgotICAgICAqLwotICAgIHByaXZhdGUgRmlsZSBjb21wb3NpdGVDb21wb25lbnREaXJlY3Rvcnk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogSW5kaWNhdGUgdGhlIGNvbXBvc2l0ZSBsaWJyYXJpZXMgdG8gYmUgbG9hZGVkIGluIHRoZSBmb3JtIG9mIAotICAgICAqICZsdDtzaG9ydC1uYW1lJmd0O2xpYnJhcnlOYW1lJmx0Oy9zaG9ydC1uYW1lJmd0OyAuCi0gICAgICogCi0gICAgICogQHBhcmFtZXRlcgotICAgICAqLwotICAgIHByaXZhdGUgTWFwIGNvbXBvc2l0ZUNvbXBvbmVudExpYnJhcmllczsKLSAgICAKLSAgICAvKioKLSAgICAgKiBJbmRpY2F0ZSB0aGUgZXh0ZW5zaW9ucyB1c2VkIGZvciBjb21wb3NpdGUgY29tcG9uZW50cywgc2VwYXJhdGVkIGJ5IHNwYWNlcy4KLSAgICAgKiBCeSBkZWZhdWx0IGl0IGlzIC54aHRtbAotICAgICAqIAotICAgICAqIEBwYXJhbWV0ZXIKLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBjb21wb3NpdGVDb21wb25lbnRGaWxlRXh0ZW5zaW9uczsgCi0gICAgCi0gICAgLyoqCi0gICAgICogSW5kaWNhdGUgdGhhdCBtZXRhZGF0YSBpcyBwcm92aWRlZCBpbiB0aGUgc3RydWN0dXJlIG9mIAotICAgICAqIHRyaW5pZGFkIG1hdmVuLWZhY2VzLXBsdWdpbiBmYWNlcy1jb25maWcueG1sIGZpbGVzICAKLSAgICAgKiBhbmQgc2hvdWxkIGJlIGZlZWQgdG8gYnVpbGQgdGhlIGZ1bGwgbWV0YWRhdGEgCi0gICAgICogaW5mb3JtYXRpb24gb2YgdGhpcyBqYXIgZmlsZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW1ldGVyIAotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIHJlYWRNYXZlbkZhY2VzUGx1Z2luTWV0YWRhdGE7Ci0gICAgCi0gICAgcHJpdmF0ZSBGaWxlIGxvY2FsUmVzb3VyY2U7Ci0gICAgCi0gICAgcHJpdmF0ZSBGYWNlc0NvbmZpZ0JlYW4gX2ZhY2VzQ29uZmlnOwotICAgIAotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIG1ldGFkYXRhIGZpbGUgY29udGFpbmluZyBpbmZvcm1hdGlvbiBpbXBvcnRlZCBmcm9tIG90aGVyIHByb2plY3RzCi0gICAgICogcGx1cyBkYXRhIGV4dHJhY3RlZCBmcm9tIGFubm90YXRlZCBjbGFzc2VzIGluIHRoaXMgcHJvamVjdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIE1vam9FeGVjdXRpb25FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBUZWxsIE1hdmVuIHRvIGFkZCB0aGlzIGRpcmVjdG9yeSB0byBpdHMgInJlc291cmNlcyIgcGF0aC4gCi0gICAgICAgICAgICAvLyBUaGUgbWF2ZW4tcmVzb3VyY2VzLXBsdWdpbiB3aWxsIHRoZW4gY29weSBhbGwgdGhlIGZpbGVzCi0gICAgICAgICAgICAvLyBmcm9tIHRoaXMgZGlyZWN0b3J5IHRvIGl0cyBvd24gdGFyZ2V0IGRpcmVjdG9yeSwgd2hpY2ggaXMKLSAgICAgICAgICAgIC8vIHdoZXJlIHRoZSBmaW5hbCBqYXIgYXJ0aWZhY3QgaXMgYnVpbHQgZnJvbS4KLSAgICAgICAgICAgIGFkZFJlc291cmNlUm9vdChwcm9qZWN0LCB0YXJnZXREaXJlY3RvcnkuZ2V0Q2Fub25pY2FsUGF0aCgpKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaChJT0V4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbigiRXJyb3IgZHVyaW5nIGdlbmVyYXRpb24iLCBlKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgTGlzdCBtb2RlbHMgPSBJT1V0aWxzLmdldE1vZGVsc0Zyb21BcnRpZmFjdHMocHJvamVjdCk7IAotICAgICAgICBtb2RlbHMgPSBzb3J0TW9kZWxzKG1vZGVscyk7Ci0KLSAgICAgICAgTW9kZWwgbW9kZWwgPSBuZXcgTW9kZWwoKTsKLQotICAgICAgICBpZiAoaW5wdXRGaWxlICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIEFuIGV4cGxpY2l0bHktc3BlY2lmaWVkIGlucHV0IG1vZGVsIHRha2VzIHByZWNlZGVuY2UKLSAgICAgICAgICAgIE1vZGVsIGZpbGVNb2RlbCA9IElPVXRpbHMubG9hZE1vZGVsKGlucHV0RmlsZSk7Ci0gICAgICAgICAgICBtb2RlbC5tZXJnZShmaWxlTW9kZWwpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgZm9yIChJdGVyYXRvciBpdCA9IG1vZGVscy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KQotICAgICAgICB7Ci0gICAgICAgICAgICBNb2RlbCBhcnRpZmFjdE1vZGVsID0gKE1vZGVsKSBpdC5uZXh0KCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmICgoZGVwZW5kZW5jeU1vZGVsSWRzID09IG51bGwpIHx8IGRlcGVuZGVuY3lNb2RlbElkcy5jb250YWlucyhhcnRpZmFjdE1vZGVsLmdldE1vZGVsSWQoKSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbW9kZWwubWVyZ2UoYXJ0aWZhY3RNb2RlbCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBNb2RlbFBhcmFtcyBwYXJhbWV0ZXJzID0gbmV3IE1vZGVsUGFyYW1zKCk7Ci0gICAgICAgIAotICAgICAgICBMaXN0IHNvdXJjZURpcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIGlmIChzb3VyY2VEaXJlY3RvcmllcyA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBzb3VyY2VEaXJzLmFkZEFsbChwcm9qZWN0LmdldENvbXBpbGVTb3VyY2VSb290cygpKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHNvdXJjZURpcnMuYWRkQWxsKHNvdXJjZURpcmVjdG9yaWVzKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYgKGdlbmVyYXRlZFNvdXJjZURpcmVjdG9yeSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ID0gc291cmNlRGlycy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEZpbGUgZiA9IG5ldyBGaWxlKChTdHJpbmcpIGl0Lm5leHQoKSk7Ci0gICAgICAgICAgICAgICAgaWYgKGdlbmVyYXRlZFNvdXJjZURpcmVjdG9yeS5lcXVhbHMoZikpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpdC5yZW1vdmUoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHBhcmFtZXRlcnMuc2V0U291cmNlRGlycyhzb3VyY2VEaXJzKTsKLSAgICAgICAgCi0gICAgICAgIExpc3QgY29tcG9zaXRlQ29tcG9uZW50RGlycyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgY29tcG9zaXRlQ29tcG9uZW50RGlycy5hZGQoY29tcG9zaXRlQ29tcG9uZW50RGlyZWN0b3J5KTsKLSAgICAgICAgcGFyYW1ldGVycy5zZXRDb21wb3NpdGVDb21wb25lbnREaXJlY3Rvcmllcyhjb21wb3NpdGVDb21wb25lbnREaXJzKTsKLSAgICAgICAgCi0gICAgICAgIHBhcmFtZXRlcnMuc2V0Q29tcG9zaXRlQ29tcG9uZW50TGlicmFyaWVzKGNvbXBvc2l0ZUNvbXBvbmVudExpYnJhcmllcyk7Ci0gICAgICAgIAotICAgICAgICBwYXJhbWV0ZXJzLnNldENvbXBvc2l0ZUNvbXBvbmVudEZpbGVFeHRlbnNpb25zKGNvbXBvc2l0ZUNvbXBvbmVudEZpbGVFeHRlbnNpb25zKTsKLSAgICAgICAgCi0gICAgICAgIC8vVHJpbmlkYWQgbWF2ZW4gZmFjZXMgcGx1Z2luIGludGVncmF0aW9uCi0gICAgICAgIGlmIChpc1JlYWRNYXZlbkZhY2VzUGx1Z2luTWV0YWRhdGEoKSkKLSAgICAgICAgewotICAgICAgICAgICAgcHJvY2Vzc0luZGV4KHByb2plY3QpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoX2ZhY2VzQ29uZmlnICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcGFyYW1ldGVycy5zZXRGYWNlc0NvbmZpZ0JlYW4oX2ZhY2VzQ29uZmlnKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgYnVpbGRNb2RlbChtb2RlbCwgcHJvamVjdCwgcGFyYW1ldGVycyk7Ci0gICAgICAgIAotICAgICAgICByZXNvbHZlUmVwbGFjZVBhY2thZ2UobW9kZWwpOwotICAgICAgICAKLSAgICAgICAgSU9VdGlscy5zYXZlTW9kZWwobW9kZWwsIG5ldyBGaWxlKHRhcmdldERpcmVjdG9yeSwgb3V0cHV0RmlsZSkpOwotICAgICAgICAKLSAgICAgICAgdmFsaWRhdGVDb21wb25lbnRzKG1vZGVsKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogT3JkZXIgdGhlIG1vZGVscyBhcyBzcGVjaWZpZWQgYnkgdGhlIG1vZGVsSWRPcmRlciBwcm9wZXJ0eS4KLSAgICAgKiA8cD4KLSAgICAgKiBUb21haGF3ayBzYW5kYm94IGRlcGVuZHMgZnJvbSBteWZhY2VzLWFwaSBhbmQgdG9tYWhhd2sgY29yZSwgc28KLSAgICAgKiB0aGUgbXlmYWNlcy1tZXRhZGF0YS54bWwgb2YgdG9tYWhhd2sgY29yZSBtdXN0IGJlIG1lcmdlZCBmaXJzdAotICAgICAqIGFuZCB0aGVuIG15ZmFjZXMtYXBpLgotICAgICAqIDxwPgotICAgICAqIEluIHNvbWUgY2FzZXMsIHRoZSBzYW1lIG1ldGFkYXRhIGNhbiBiZSBpbXBvcnRlZCBtdWx0aXBsZSB0aW1lcy4KLSAgICAgKiBGb3IgZXhhbXBsZSwgUHJvamVjdCBBIGhhcyBtZXRhZGF0YS4gUHJvamVjdCBCIGV4dGVuZHMgQSwgYW5kCi0gICAgICogUHJvamVjdCBDIGV4dGVuZHMgQi4gCi0gICAgICogCi0gICAgICogQHBhcmFtIG1vZGVscwotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwcml2YXRlIExpc3Qgc29ydE1vZGVscyhMaXN0IG1vZGVscykKLSAgICB7Ci0gICAgICAgIGlmIChvcmRlck1vZGVsSWRzID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vTm8gY2hhbmdlcwotICAgICAgICAgICAgcmV0dXJuIG1vZGVsczsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgTWFwIG1vZGVsc01hcCA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgIExpc3QgbW9kZWxzU29ydGVkID0gbmV3IEFycmF5TGlzdCgpOwotCi0gICAgICAgIC8vIEZpcnN0LCBwdXQgYWxsIG1vZGVscyBpbnRvIGEgbWFwIGtleWVkIGJ5IG1vZGVsSWQuCi0gICAgICAgIGZvciAoSXRlcmF0b3IgaXQgPSBtb2RlbHMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykKLSAgICAgICAgewotICAgICAgICAgICAgTW9kZWwgYXJ0aWZhY3RNb2RlbCA9IChNb2RlbCkgaXQubmV4dCgpOwotICAgICAgICAgICAgbW9kZWxzTWFwLnB1dChhcnRpZmFjdE1vZGVsLmdldE1vZGVsSWQoKSwgYXJ0aWZhY3RNb2RlbCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBub3cgcHVsbCB0aGVtIG91dCBvZiB0aGUgbWFwIGluIHRoZSBvcmRlciBzcGVjaWZpZWQgYnkgb3JkZXJNb2RlbElkcy4KLSAgICAgICAgZm9yIChJdGVyYXRvciBpdCA9IG9yZGVyTW9kZWxJZHMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykKLSAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIG1vZGVsSWQgPSAoU3RyaW5nKSBpdC5uZXh0KCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIE1vZGVsIGFydGlmYWN0TW9kZWwgPSAoTW9kZWwpIG1vZGVsc01hcC5nZXQobW9kZWxJZCk7Ci0gICAgICAgICAgICBpZiAoYXJ0aWZhY3RNb2RlbCAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG1vZGVsc01hcC5yZW1vdmUobW9kZWxJZCk7Ci0gICAgICAgICAgICAgICAgbW9kZWxzU29ydGVkLmFkZChhcnRpZmFjdE1vZGVsKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIGFuZCBhbnkgb2YgdGhlIG9uZXMgdGhhdCByZW1haW4gaW4gdGhlIG1hcCAoaWUgaGFkIG5vIG9yZGVyIHNwZWNpZmllZCkKLSAgICAgICAgLy8gbm93IGdldCBhZGRlZCB0byB0aGUgZW5kIG9mIHRoZSBsaXN0LgotICAgICAgICBtb2RlbHNTb3J0ZWQuYWRkQWxsKG1vZGVsc01hcC52YWx1ZXMoKSk7Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gbW9kZWxzU29ydGVkOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHZvaWQgcmVzb2x2ZVJlcGxhY2VQYWNrYWdlKE1vZGVsIG1vZGVsKQotICAgIHsKLSAgICAgICAgaWYgKHJlcGxhY2VQYWNrYWdlUHJlZml4VGFnRnJvbSA9PSBudWxsIHx8Ci0gICAgICAgICAgICAgICAgcmVwbGFjZVBhY2thZ2VQcmVmaXhUYWdUbyA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIExpc3QgY29tcG9uZW50cyA9IG1vZGVsLmdldENvbXBvbmVudHMoKTsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpID0gY29tcG9uZW50cy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgICAgIHsKLSAgICAgICAgICAgIENvbXBvbmVudE1ldGEgY29tcCA9IChDb21wb25lbnRNZXRhKSBpLm5leHQoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKGNvbXAuZ2V0VGFnQ2xhc3MoKSA9PSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGNvbXAuZ2V0VGFnQ2xhc3MoKS5zdGFydHNXaXRoKHJlcGxhY2VQYWNrYWdlUHJlZml4VGFnRnJvbSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY29tcC5zZXRUYWdDbGFzcyhTdHJpbmdVdGlscy5yZXBsYWNlT25jZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbXAuZ2V0VGFnQ2xhc3MoKSwgcmVwbGFjZVBhY2thZ2VQcmVmaXhUYWdGcm9tLCByZXBsYWNlUGFja2FnZVByZWZpeFRhZ1RvKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0KLSAgICAvKioKLSAgICAgKiBFeGVjdXRlIE1vZGVsQnVpbGRlciBjbGFzc2VzIHRvIGNyZWF0ZSB0aGUgTW9kZWwgZGF0YS1zdHJ1Y3R1cmUuCi0gICAgICovCi0gICAgcHJpdmF0ZSBNb2RlbCBidWlsZE1vZGVsKE1vZGVsIG1vZGVsLCBNYXZlblByb2plY3QgcHJvamVjdCwgTW9kZWxQYXJhbXMgcGFyYW1ldGVycykKLSAgICAgICAgICAgIHRocm93cyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uCi0gICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgUWRveE1vZGVsQnVpbGRlciBidWlsZGVyID0gbmV3IFFkb3hNb2RlbEJ1aWxkZXIoKTsKLSAgICAgICAgICAgIG1vZGVsLnNldE1vZGVsSWQobW9kZWxJZCk7Ci0gICAgICAgICAgICBpZiAoU3RyaW5nVXRpbHMuaXNOb3RFbXB0eShpbmNsdWRlcykpIAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMuc2V0SW5jbHVkZXMoaW5jbHVkZXMpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKFN0cmluZ1V0aWxzLmlzTm90RW1wdHkoZXhjbHVkZXMpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMuc2V0RXhjbHVkZXMoZXhjbHVkZXMpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnVpbGRlci5idWlsZE1vZGVsKG1vZGVsLCBwYXJhbWV0ZXJzKTsgICAgICAgICAgICAKLSAgICAgICAgICAgIHJldHVybiBtb2RlbDsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoQnVpbGRFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IE1vam9FeGVjdXRpb25FeGNlcHRpb24oIlVuYWJsZSB0byBidWlsZCBtZXRhZGF0YSIsIGUpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCB2b2lkIGFkZFJlc291cmNlUm9vdChNYXZlblByb2plY3QgcHJvamVjdCwgU3RyaW5nIHJlc291cmNlUm9vdCkKLSAgICB7Ci0gICAgICAgIExpc3QgcmVzb3VyY2VzID0gcHJvamVjdC5nZXRCdWlsZCgpLmdldFJlc291cmNlcygpOwotICAgICAgICBSZXNvdXJjZSByZXNvdXJjZSA9IG5ldyBSZXNvdXJjZSgpOwotICAgICAgICByZXNvdXJjZS5zZXREaXJlY3RvcnkocmVzb3VyY2VSb290KTsKLSAgICAgICAgcmVzb3VyY2VzLmFkZChyZXNvdXJjZSk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIENoZWNrIHRoYXQgZWFjaCBjb21wb25lbnQgaXMgdmFsaWQgKGhhcyBhbGwgbWFuZGF0b3J5IHByb3BlcnRpZXMgZXRjKS4KLSAgICAgKiA8cD4KLSAgICAgKiBNb3N0IHNhbml0eSBjaGVja3MgYXJlIGJlc3QgZG9uZSBhZnRlciB0aGUgbXlmYWNlcy1tZXRhZGF0YS54bWwgZmlsZQotICAgICAqIGlzIGNyZWF0ZWQsIHNvIHRoYXQgaWYgYW4gZXJyb3Igb2NjdXJzIHRoZSBmaWxlIGlzIGF2YWlsYWJsZSBmb3IgdGhlCi0gICAgICogdXNlciB0byBpbnNwZWN0LiBJbiBwYXJ0aWN1bGFyLCBwcm9ibGVtcyBkdWUgdG8gbWlzc2luZyBwcm9wZXJ0aWVzCi0gICAgICogd2hpY2ggYXJlIHBlcm1pdHRlZCB0byBiZSBpbmhlcml0ZWQgY2FuIGJlIHRyaWNreSB0byB0cmFjayBkb3duIGlmCi0gICAgICogdGhlIG1ldGFkYXRhIGZpbGUgaXMgbm90IGF2YWlsYWJsZS4KLSAgICAgKiA8cD4KLSAgICAgKiBUT0RPOiBtYWtlIHRoaXMgZ2F0aGVyIHVwIGFsbCB0aGUgZXJyb3JzLCB0aGVuIHJlcG9ydCB0aGVtIGF0IG9uY2UKLSAgICAgKiByYXRoZXIgdGhhbiBzdG9wcGluZyBvbiB0aGUgZmlyc3QgZXJyb3IgZm91bmQuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHZhbGlkYXRlQ29tcG9uZW50cyhNb2RlbCBtb2RlbCkgdGhyb3dzIE1vam9FeGVjdXRpb25FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGZvcihJdGVyYXRvciBpID0gbW9kZWwuY29tcG9uZW50cygpOyBpLmhhc05leHQoKTsgKQotICAgICAgICB7Ci0gICAgICAgICAgICBDb21wb25lbnRNZXRhIGNvbXBvbmVudCA9IChDb21wb25lbnRNZXRhKSBpLm5leHQoKTsKLSAgICAgICAgICAgIHZhbGlkYXRlQ29tcG9uZW50KG1vZGVsLCBjb21wb25lbnQpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgdm9pZCB2YWxpZGF0ZUNvbXBvbmVudChNb2RlbCBtb2RlbCwgQ29tcG9uZW50TWV0YSBjb21wb25lbnQpCi0gICAgdGhyb3dzIE1vam9FeGVjdXRpb25FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGlmIChjb21wb25lbnQuZ2V0TmFtZSgpICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICghY29tcG9uZW50LmlzQ29tcG9zaXRlKCkuYm9vbGVhblZhbHVlKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKGNvbXBvbmVudC5nZXREZXNjcmlwdGlvbigpID09IG51bGwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTWlzc2luZyBtYW5kYXRvcnkgcHJvcGVydHkgb24gY29tcG9uZW50ICIgKyBjb21wb25lbnQuZ2V0Q2xhc3NOYW1lKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgW3NvdXJjZUNsYXNzPSIgKyBjb21wb25lbnQuZ2V0U291cmNlQ2xhc3NOYW1lKCkgKyAiXTogZGVzY3JpcHRpb24iKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGNvbXBvbmVudC5nZXRUeXBlKCkgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNaXNzaW5nIG1hbmRhdG9yeSBwcm9wZXJ0eSBvbiBjb21wb25lbnQgIiArIGNvbXBvbmVudC5nZXRDbGFzc05hbWUoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBbc291cmNlQ2xhc3M9IiArIGNvbXBvbmVudC5nZXRTb3VyY2VDbGFzc05hbWUoKSArICJdOiB0eXBlIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8vIHRoaXMgaXMgYSBjb25jcmV0ZSBjb21wb25lbnQsIHNvIGl0IG11c3QgaGF2ZSBhIGZhbWlseSBwcm9wZXJ0eQotICAgICAgICAgICAgICAgIHZhbGlkYXRlQ29tcG9uZW50RmFtaWx5KG1vZGVsLCBjb21wb25lbnQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgdm9pZCB2YWxpZGF0ZUNvbXBvbmVudEZhbWlseShNb2RlbCBtb2RlbCwgQ29tcG9uZW50TWV0YSBjb21wb25lbnQpCi0gICAgdGhyb3dzIE1vam9FeGVjdXRpb25FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIC8vIFRPRE86IGNsZWFuIHRoaXMgY29kZSB1cCwgaXQgaXMgcHJldHR5IHVnbHkKLSAgICAgICAgYm9vbGVhbiBmYW1pbHlEZWZpbmVkID0gZmFsc2U7Ci0gICAgICAgIENvbXBvbmVudE1ldGEgY3VyciA9IGNvbXBvbmVudDsKLSAgICAgICAgd2hpbGUgKChjdXJyICE9IG51bGwpICYmICFmYW1pbHlEZWZpbmVkKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoY3Vyci5nZXRGYW1pbHkoKSAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZhbWlseURlZmluZWQgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFN0cmluZyBwYXJlbnROYW1lID0gY3Vyci5nZXRQYXJlbnRDbGFzc05hbWUoKTsKLSAgICAgICAgICAgICAgICBpZiAocGFyZW50TmFtZSA9PSBudWxsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgY3VyciA9IG51bGw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIENvbXBvbmVudE1ldGEgY3VycjEgPSBtb2RlbC5maW5kQ29tcG9uZW50QnlDbGFzc05hbWUocGFyZW50TmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjdXJyMSA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlBhcmVudCBjbGFzcyBub3QgZm91bmQgZm9yIGNvbXBvbmVudCAiICsgY29tcG9uZW50LmdldENsYXNzTmFtZSgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBbc291cmNlQ2xhc3M9IiArIGNvbXBvbmVudC5nZXRTb3VyY2VDbGFzc05hbWUoKSArICJdIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjdXJyID0gY3VycjE7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFmYW1pbHlEZWZpbmVkKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAiTWlzc2luZyBtYW5kYXRvcnkgcHJvcGVydHkgb24gY29tcG9uZW50ICIgKyBjb21wb25lbnQuZ2V0Q2xhc3NOYW1lKCkKLSAgICAgICAgICAgICAgICArICIgW3NvdXJjZUNsYXNzPSIgKyBjb21wb25lbnQuZ2V0U291cmNlQ2xhc3NOYW1lKCkgKyAiXTogZmFtaWx5Iik7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzUmVhZE1hdmVuRmFjZXNQbHVnaW5NZXRhZGF0YSgpCi0gICAgewotICAgICAgICBpZiAocmVhZE1hdmVuRmFjZXNQbHVnaW5NZXRhZGF0YSA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gQm9vbGVhbi52YWx1ZU9mKHJlYWRNYXZlbkZhY2VzUGx1Z2luTWV0YWRhdGEpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzSW5kZXgoTWF2ZW5Qcm9qZWN0IHByb2plY3QpCi0gICAgICAgICAgICB0aHJvd3MgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgVVJMW10gaW5kZXggPSByZWFkSW5kZXgocHJvamVjdCk7Ci0KLSAgICAgICAgaWYgKGluZGV4Lmxlbmd0aCA+IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIF9mYWNlc0NvbmZpZyA9IG5ldyBGYWNlc0NvbmZpZ0JlYW4oKTsKLSAgICAKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW5kZXgubGVuZ3RoOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcHJvY2Vzc0luZGV4RW50cnkoaW5kZXhbaV0pOwotICAgICAgICAgICAgfQotICAgIAotICAgICAgICAgICAgLy8gUGVyZm9ybSBhbnkgcG9zdC1wcm9jZXNzaW5nCi0gICAgICAgICAgICBfZmFjZXNDb25maWcucGVyZm9ybVBvc3RQcm9jZXNzaW5nKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc0luZGV4RW50cnkoVVJMIGVudHJ5KSB0aHJvd3MgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgVVJMIG9sZCA9IF9mYWNlc0NvbmZpZy5zZXRDdXJyZW50UmVzb3VyY2UoZW50cnkpOwotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgbmV3IEZhY2VzQ29uZmlnUGFyc2VyKCkubWVyZ2UoX2ZhY2VzQ29uZmlnLCBlbnRyeSk7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxseQotICAgICAgICB7Ci0gICAgICAgICAgICBfZmFjZXNDb25maWcuc2V0Q3VycmVudFJlc291cmNlKG9sZCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIEZhY2VzQ29uZmlnQmVhbiBnZXRGYWNlc0NvbmZpZygpCi0gICAgewotICAgICAgICByZXR1cm4gX2ZhY2VzQ29uZmlnOwotICAgIH0KLQotICAgIHByaXZhdGUgVVJMW10gcmVhZEluZGV4KE1hdmVuUHJvamVjdCBwcm9qZWN0KQotICAgICAgICAgICAgdGhyb3dzIE1vam9FeGVjdXRpb25FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyAxLiByZWFkIG1hc3RlciBmYWNlcy1jb25maWcueG1sIHJlc291cmNlcwotICAgICAgICAgICAgTGlzdCBtYXN0ZXJzID0gZ2V0TWFzdGVyQ29uZmlncyhwcm9qZWN0KTsKLSAgICAgICAgICAgIGlmIChtYXN0ZXJzLmlzRW1wdHkoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBnZXRMb2coKS53YXJuKCJNYXN0ZXIgZmFjZXMtY29uZmlnLnhtbCBub3QgZm91bmQiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFVSTFswXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBMaXN0IGVudHJpZXMgPSBuZXcgTGlua2VkTGlzdCgpOwotCi0gICAgICAgICAgICAgICAgU0FYUGFyc2VyRmFjdG9yeSBzcGYgPSBTQVhQYXJzZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAgICAgICAgICAgc3BmLnNldE5hbWVzcGFjZUF3YXJlKHRydWUpOwotICAgICAgICAgICAgICAgIC8vIHJlcXVpcmVzIEpBWFAgMS4zLCBpbiBKYXZhU0UgNS4wCi0gICAgICAgICAgICAgICAgLy8gc3BmLnNldFhJbmNsdWRlQXdhcmUoZmFsc2UpOwotCi0gICAgICAgICAgICAgICAgZm9yIChJdGVyYXRvcjxVUkw+IGkgPSBtYXN0ZXJzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFVSTCB1cmwgPSBpLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgRGlnZXN0ZXIgZGlnZXN0ZXIgPSBuZXcgRGlnZXN0ZXIoc3BmLm5ld1NBWFBhcnNlcigpKTsKLSAgICAgICAgICAgICAgICAgICAgZGlnZXN0ZXIuc2V0TmFtZXNwYWNlQXdhcmUodHJ1ZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gWEluY2x1ZGUKLSAgICAgICAgICAgICAgICAgICAgZGlnZXN0ZXIuc2V0UnVsZU5hbWVzcGFjZVVSSShYSW5jbHVkZUZpbHRlci5YSU5DTFVERV9OQU1FU1BBQ0UpOwotICAgICAgICAgICAgICAgICAgICBkaWdlc3Rlci5hZGRDYWxsTWV0aG9kKCJmYWNlcy1jb25maWcvaW5jbHVkZSIsICJhZGQiLCAxKTsKLSAgICAgICAgICAgICAgICAgICAgZGlnZXN0ZXIuYWRkRmFjdG9yeUNyZWF0ZSgiZmFjZXMtY29uZmlnL2luY2x1ZGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVSTENyZWF0aW9uRmFjdG9yeS5jbGFzcyk7Ci0gICAgICAgICAgICAgICAgICAgIGRpZ2VzdGVyLmFkZENhbGxQYXJhbSgiZmFjZXMtY29uZmlnL2luY2x1ZGUiLCAwLCAwKTsKLQotICAgICAgICAgICAgICAgICAgICBkaWdlc3Rlci5wdXNoKHVybCk7Ci0gICAgICAgICAgICAgICAgICAgIGRpZ2VzdGVyLnB1c2goZW50cmllcyk7Ci0gICAgICAgICAgICAgICAgICAgIGRpZ2VzdGVyLnBhcnNlKHVybC5vcGVuU3RyZWFtKCkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHJldHVybiAoVVJMW10pIGVudHJpZXMudG9BcnJheShuZXcgVVJMWzBdKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbigiRmFpbGVkIHRvIHBhcnNlIG1hc3RlciBjb25maWciLCBlKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoU0FYRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uKCJGYWlsZWQgdG8gcGFyc2UgbWFzdGVyIGNvbmZpZyIsIGUpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbigiRmFpbGVkIHRvIHBhcnNlIG1hc3RlciBjb25maWciLCBlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgTGlzdCBnZXRNYXN0ZXJDb25maWdzKE1hdmVuUHJvamVjdCBwcm9qZWN0KQotICAgICAgICAgICAgdGhyb3dzIE1vam9FeGVjdXRpb25FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGlmIChsb2NhbFJlc291cmNlICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIExpc3QgdXJscyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHVybHMuYWRkKGxvY2FsUmVzb3VyY2UudG9VUkwoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZ2V0TG9nKCkuZXJyb3IoIiIsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHVybHM7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmcgcmVzb3VyY2VQYXRoID0gIk1FVEEtSU5GL21hdmVuLWZhY2VzLXBsdWdpbi9mYWNlcy1jb25maWcueG1sIjsKLSAgICAgICAgICAgIHJldHVybiBnZXRDb21waWxlRGVwZW5kZW5jeVJlc291cmNlcyhwcm9qZWN0LCByZXNvdXJjZVBhdGgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBMaXN0IGdldENvbXBpbGVEZXBlbmRlbmN5UmVzb3VyY2VzKE1hdmVuUHJvamVjdCBwcm9qZWN0LAotICAgICAgICAgICAgU3RyaW5nIHJlc291cmNlUGF0aCkgdGhyb3dzIE1vam9FeGVjdXRpb25FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBDbGFzc0xvYWRlciBjbCA9IGNyZWF0ZUNvbXBpbGVDbGFzc0xvYWRlcihwcm9qZWN0KTsKLSAgICAgICAgICAgIEVudW1lcmF0aW9uIGUgPSBjbC5nZXRSZXNvdXJjZXMocmVzb3VyY2VQYXRoKTsKLSAgICAgICAgICAgIExpc3QgdXJscyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgICAgIHdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFVSTCB1cmwgPSAoVVJMKSBlLm5leHRFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAgdXJscy5hZGQodXJsKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KHVybHMpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgIlVuYWJsZSB0byBnZXQgcmVzb3VyY2VzIGZvciBwYXRoICIgKyAiXCIiICsgcmVzb3VyY2VQYXRoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiXCIiLCBlKTsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgcHJpdmF0ZSBDbGFzc0xvYWRlciBjcmVhdGVDb21waWxlQ2xhc3NMb2FkZXIoTWF2ZW5Qcm9qZWN0IHByb2plY3QpCi0gICAgICAgICAgICB0aHJvd3MgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgVGhyZWFkIGN1cnJlbnQgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpOwotICAgICAgICBDbGFzc0xvYWRlciBjbCA9IGN1cnJlbnQuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCk7Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIExpc3QgY2xhc3NwYXRoRWxlbWVudHMgPSBwcm9qZWN0LmdldENvbXBpbGVDbGFzc3BhdGhFbGVtZW50cygpOwotICAgICAgICAgICAgaWYgKCFjbGFzc3BhdGhFbGVtZW50cy5pc0VtcHR5KCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nW10gZW50cmllcyA9IChTdHJpbmdbXSkgY2xhc3NwYXRoRWxlbWVudHMKLSAgICAgICAgICAgICAgICAgICAgICAgIC50b0FycmF5KG5ldyBTdHJpbmdbMF0pOwotICAgICAgICAgICAgICAgIFVSTFtdIHVybHMgPSBuZXcgVVJMW2VudHJpZXMubGVuZ3RoXTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHVybHMubGVuZ3RoOyBpKyspCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB1cmxzW2ldID0gbmV3IEZpbGUoZW50cmllc1tpXSkudG9VUkwoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2wgPSBuZXcgVVJMQ2xhc3NMb2FkZXIodXJscywgY2wpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChEZXBlbmRlbmN5UmVzb2x1dGlvblJlcXVpcmVkRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAiRXJyb3IgY2FsY3VsYXRpbmcgc2NvcGUgY2xhc3NwYXRoIiwgZSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgIkVycm9yIGNhbGN1bGF0aW5nIHNjb3BlIGNsYXNzcGF0aCIsIGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGNsOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvRmxhdHRlbmVyLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL0ZsYXR0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjIyZjE1Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvRmxhdHRlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NjkgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmJ1aWxkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uYnVpbGRlci5tb2RlbC5BdHRyaWJ1dGVIb2xkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5idWlsZGVyLm1vZGVsLkF0dHJpYnV0ZU1ldGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5idWlsZGVyLm1vZGVsLkJlaGF2aW9yTWV0YTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmJ1aWxkZXIubW9kZWwuQ29tcG9uZW50TWV0YTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmJ1aWxkZXIubW9kZWwuQ29udmVydGVyTWV0YTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmJ1aWxkZXIubW9kZWwuRmFjZWxldFRhZ01ldGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5idWlsZGVyLm1vZGVsLk1ldGhvZFNpZ25hdHVyZU1ldGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5idWlsZGVyLm1vZGVsLk1vZGVsOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uYnVpbGRlci5tb2RlbC5Nb2RlbFV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uYnVpbGRlci5tb2RlbC5Qcm9wZXJ0eUhvbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmJ1aWxkZXIubW9kZWwuUHJvcGVydHlNZXRhOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uYnVpbGRlci5tb2RlbC5UYWdNZXRhOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uYnVpbGRlci5tb2RlbC5WYWxpZGF0b3JNZXRhOwotCi0vKioKLSAqLwotcHVibGljIGNsYXNzIEZsYXR0ZW5lcgotewotICAgIHByaXZhdGUgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKEZsYXR0ZW5lci5jbGFzcyk7Ci0KLSAgICBwcml2YXRlIE1vZGVsIG1vZGVsOwotICAgIHByaXZhdGUgU2V0IGZsYXR0ZW5lZCA9IG5ldyBIYXNoU2V0KCk7Ci0KLSAgICBwdWJsaWMgRmxhdHRlbmVyKE1vZGVsIG1vZGVsKQotICAgIHsKLSAgICAgICAgdGhpcy5tb2RlbCA9IG1vZGVsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZsYXR0ZW4gdGhlIHNwZWNpZmllZCBtb2RlbC4KLSAgICAgKiA8cD4KLSAgICAgKiBJbiB0aGUgZmxhdHRlbmVkIHJlcHJlc2VudGF0aW9uLCBlYWNoIG1vZGVsIG9iamVjdCBkaXJlY3RseSBjb250YWlucyB0aGUKLSAgICAgKiBkYXRhIHRoYXQgaXQgaW5oZXJpdHMgZnJvbSBpdHMgcGFyZW50cywgc28gdGhhdCB0aGUgZ2V0dGVyIG1ldGhvZHMgcmV0dXJuCi0gICAgICogYWxsIGF2YWlsYWJsZSBtZXRhZGF0YSwgbm90IGp1c3QgdGhlIGRhdGEgdGhhdCB3YXMgZGVmaW5lZCBkaXJlY3RseSBvbgotICAgICAqIHRoYXQgaXRlbS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBmbGF0dGVuKCkKLSAgICB7Ci0gICAgICAgIGZsYXR0ZW5Db21wb25lbnRQcm9wZXJ0aWVzKCk7Ci0gICAgICAgIGZsYXR0ZW5WYWxpZGF0b3JQcm9wZXJ0aWVzKCk7Ci0gICAgICAgIGZsYXR0ZW5Db252ZXJ0ZXJQcm9wZXJ0aWVzKCk7Ci0gICAgICAgIGZsYXR0ZW5CZWhhdmlvclByb3BlcnRpZXMoKTsKLSAgICAgICAgZmxhdHRlblRhZ0F0dHJpYnV0ZXMoKTsKLSAgICAgICAgZmxhdHRlbkZhY2VsZXRUYWdBdHRyaWJ1dGVzKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGZsYXR0ZW5Db21wb25lbnRQcm9wZXJ0aWVzKCkKLSAgICB7Ci0gICAgICAgIExpc3QgY29tcG9uZW50cyA9IG1vZGVsLmdldENvbXBvbmVudHMoKTsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpID0gY29tcG9uZW50cy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgICAgIHsKLSAgICAgICAgICAgIENvbXBvbmVudE1ldGEgY29tcCA9IChDb21wb25lbnRNZXRhKSBpLm5leHQoKTsKLSAgICAgICAgICAgIGZsYXR0ZW5Db21wb25lbnQoY29tcCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZmxhdHRlbkNvbXBvbmVudChDb21wb25lbnRNZXRhIGNvbXBvbmVudCkKLSAgICB7Ci0gICAgICAgIGlmIChmbGF0dGVuZWQuY29udGFpbnMoY29tcG9uZW50KSkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gYWxyZWFkeSBkb25lCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgU3RyaW5nIHBhcmVudENsYXNzTmFtZSA9IGNvbXBvbmVudC5nZXRQYXJlbnRDbGFzc05hbWUoKTsKLSAgICAgICAgaWYgKHBhcmVudENsYXNzTmFtZSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBDb21wb25lbnRNZXRhIHBhcmVudCA9IG1vZGVsCi0gICAgICAgICAgICAgICAgICAgIC5maW5kQ29tcG9uZW50QnlDbGFzc05hbWUocGFyZW50Q2xhc3NOYW1lKTsKLSAgICAgICAgICAgIGlmIChwYXJlbnQgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmbGF0dGVuQ29tcG9uZW50KHBhcmVudCk7Ci0gICAgICAgICAgICAgICAgY29tcG9uZW50Lm1lcmdlKHBhcmVudCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy9Ib3cgdG8gbWFuYWdlIGEgY29tcG9uZW50IHRoYXQgaXRzCi0gICAgICAgICAgICAgICAgLy9wYXJlbnQgY2xhc3MgaXMgbm90IGEgcmVhbCBjb21wb25lbnQ/Ci0gICAgICAgICAgICAgICAgLy9Vc2UgVUlDb21wb25lbnQgaW5zdGVhZCBhbmQgbG9nIGEgd2FybgotICAgICAgICAgICAgICAgIC8vc28gaWYgbmVlZGVkIHdlIGNhbiBmaXggdGhpcy4KLSAgICAgICAgICAgICAgICBsb2cud2FybigiQ29tcG9uZW50OiIrY29tcG9uZW50LmdldENsYXNzTmFtZSgpKwotICAgICAgICAgICAgICAgICAgICAgICAgIiB3aXRob3V0IGEgcGFyZW50IGRlZmluZWQgYXMgY29tcG9uZW50LCB1c2luZyAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICJVSUNvbXBvbmVudCIpOwotICAgICAgICAgICAgICAgIHBhcmVudCA9IG1vZGVsCi0gICAgICAgICAgICAgICAgICAgIC5maW5kQ29tcG9uZW50QnlDbGFzc05hbWUoImphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudCIpOwotICAgICAgICAgICAgICAgIGZsYXR0ZW5Db21wb25lbnQocGFyZW50KTsKLSAgICAgICAgICAgICAgICBjb21wb25lbnQubWVyZ2UocGFyZW50KTsgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBMaXN0IGludGVyZmFjZUNsYXNzTmFtZXMgPSBjb21wb25lbnQuZ2V0SW50ZXJmYWNlQ2xhc3NOYW1lcygpOwotICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBpbnRlcmZhY2VDbGFzc05hbWVzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIGlmYWNlQ2xhc3NOYW1lID0gKFN0cmluZykgaS5uZXh0KCk7Ci0gICAgICAgICAgICBDb21wb25lbnRNZXRhIGlmYWNlID0gbW9kZWwKLSAgICAgICAgICAgICAgICAgICAgLmZpbmRDb21wb25lbnRCeUNsYXNzTmFtZShpZmFjZUNsYXNzTmFtZSk7Ci0gICAgICAgICAgICBmbGF0dGVuQ29tcG9uZW50KGlmYWNlKTsKLSAgICAgICAgICAgIGNvbXBvbmVudC5tZXJnZShpZmFjZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBmbGF0dGVuZWQuYWRkKGNvbXBvbmVudCk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgdm9pZCBmbGF0dGVuVmFsaWRhdG9yUHJvcGVydGllcygpCi0gICAgewotICAgICAgICBMaXN0IHZhbGlkYXRvciA9IG1vZGVsLmdldFZhbGlkYXRvcnMoKTsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpID0gdmFsaWRhdG9yLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICAgICAgewotICAgICAgICAgICAgVmFsaWRhdG9yTWV0YSB2YWwgPSAoVmFsaWRhdG9yTWV0YSkgaS5uZXh0KCk7Ci0gICAgICAgICAgICBmbGF0dGVuVmFsaWRhdG9yKHZhbCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIGZsYXR0ZW5WYWxpZGF0b3IoVmFsaWRhdG9yTWV0YSB2YWxpZGF0b3IpCi0gICAgewotICAgICAgICBpZiAoZmxhdHRlbmVkLmNvbnRhaW5zKHZhbGlkYXRvcikpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIGFscmVhZHkgZG9uZQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIFN0cmluZyBwYXJlbnRDbGFzc05hbWUgPSB2YWxpZGF0b3IuZ2V0UGFyZW50Q2xhc3NOYW1lKCk7Ci0gICAgICAgIGlmIChwYXJlbnRDbGFzc05hbWUgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgVmFsaWRhdG9yTWV0YSBwYXJlbnQgPSBtb2RlbAotICAgICAgICAgICAgICAgICAgICAuZmluZFZhbGlkYXRvckJ5Q2xhc3NOYW1lKHBhcmVudENsYXNzTmFtZSk7Ci0gICAgICAgICAgICBpZiAocGFyZW50ICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmxhdHRlblZhbGlkYXRvcihwYXJlbnQpOwotICAgICAgICAgICAgICAgIHZhbGlkYXRvci5tZXJnZShwYXJlbnQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vSG93IHRvIG1hbmFnZSBhIHZhbGlkYXRvciB0aGF0IGl0cwotICAgICAgICAgICAgICAgIC8vcGFyZW50IGNsYXNzIGlzIG5vdCBhIHJlYWwgdmFsaWRhdG9yPwotICAgICAgICAgICAgICAgIC8vQW5zOiBubyBwcm9ibGVtLCBkbyBub3RoaW5nLgotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgZmxhdHRlbmVkLmFkZCh2YWxpZGF0b3IpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBmbGF0dGVuQ29udmVydGVyUHJvcGVydGllcygpCi0gICAgewotICAgICAgICBMaXN0IGNvbnZlcnRlciA9IG1vZGVsLmdldENvbnZlcnRlcnMoKTsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpID0gY29udmVydGVyLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICAgICAgewotICAgICAgICAgICAgQ29udmVydGVyTWV0YSB2YWwgPSAoQ29udmVydGVyTWV0YSkgaS5uZXh0KCk7Ci0gICAgICAgICAgICBmbGF0dGVuQ29udmVydGVyKHZhbCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIGZsYXR0ZW5Db252ZXJ0ZXIoQ29udmVydGVyTWV0YSBjb252ZXJ0ZXIpCi0gICAgewotICAgICAgICBpZiAoZmxhdHRlbmVkLmNvbnRhaW5zKGNvbnZlcnRlcikpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIGFscmVhZHkgZG9uZQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIFN0cmluZyBwYXJlbnRDbGFzc05hbWUgPSBjb252ZXJ0ZXIuZ2V0UGFyZW50Q2xhc3NOYW1lKCk7Ci0gICAgICAgIGlmIChwYXJlbnRDbGFzc05hbWUgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgQ29udmVydGVyTWV0YSBwYXJlbnQgPSBtb2RlbAotICAgICAgICAgICAgICAgICAgICAuZmluZENvbnZlcnRlckJ5Q2xhc3NOYW1lKHBhcmVudENsYXNzTmFtZSk7Ci0gICAgICAgICAgICBpZiAocGFyZW50ICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmxhdHRlbkNvbnZlcnRlcihwYXJlbnQpOwotICAgICAgICAgICAgICAgIGNvbnZlcnRlci5tZXJnZShwYXJlbnQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vSG93IHRvIG1hbmFnZSBhIHZhbGlkYXRvciB0aGF0IGl0cwotICAgICAgICAgICAgICAgIC8vcGFyZW50IGNsYXNzIGlzIG5vdCBhIHJlYWwgdmFsaWRhdG9yPwotICAgICAgICAgICAgICAgIC8vQW5zOiBubyBwcm9ibGVtLCBkbyBub3RoaW5nLgotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgZmxhdHRlbmVkLmFkZChjb252ZXJ0ZXIpOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHZvaWQgZmxhdHRlblRhZ0F0dHJpYnV0ZXMoKQotICAgIHsKLSAgICAgICAgTGlzdCB0YWdzID0gbW9kZWwuZ2V0VGFncygpOwotICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSB0YWdzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICAgICAgewotICAgICAgICAgICAgVGFnTWV0YSB2YWwgPSAoVGFnTWV0YSkgaS5uZXh0KCk7Ci0gICAgICAgICAgICBmbGF0dGVuVGFnKHZhbCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogVGhpcyBtZXRob2QgYWxsb3dzIGNvbXBvbmVudCB0YWcgY2xhc3NlcyB0byBiZQotICAgICAqIHVzZWQgd2l0aCB0YWdzLCBzbyBpdCBpcyBwb3NzaWJsZSB0byBpbmhlcml0IGF0dHJpYnV0ZQotICAgICAqIGZvciBjb21wb25lbnQgdGFncy4gQnV0IHRhZ3MgY2Fubm90IGluaGVyaXQKLSAgICAgKiBhdHRyaWJ1dGVzIGZyb20gb3RoZXIgdGFncy4gCi0gICAgICogIAotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBmbGF0dGVuVGFnKFRhZ01ldGEgdGFnKQotICAgIHsKLSAgICAgICAgaWYgKGZsYXR0ZW5lZC5jb250YWlucyh0YWcpKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBhbHJlYWR5IGRvbmUKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYgKHRhZy5nZXRTb3VyY2VDbGFzc1BhcmVudENsYXNzTmFtZSgpID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vTm8gbmVlZCB0byBzY2FuCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgQ29tcG9uZW50TWV0YSBjb21wb25lbnQgPSBtb2RlbC5maW5kQ29tcG9uZW50QnlUYWdDbGFzc05hbWUoCi0gICAgICAgICAgICAgICAgdGFnLmdldFNvdXJjZUNsYXNzUGFyZW50Q2xhc3NOYW1lKCkpOwotICAgICAgICAKLSAgICAgICAgaWYgKG51bGwgIT0gY29tcG9uZW50KQotICAgICAgICB7Ci0gICAgICAgICAgICBDb2xsZWN0aW9uIHByb3BlcnR5TGlzdCA9IGNvbXBvbmVudC5nZXRQcm9wZXJ0eUxpc3QoKTsKLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXQgPSBwcm9wZXJ0eUxpc3QuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBQcm9wZXJ0eU1ldGEgcHJvcGVydHkgPSAoUHJvcGVydHlNZXRhKSBpdC5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLy9KdXN0IGFkZCBhbGwgbm9uIHRhZyBleGNsdWRlZCBwcm9wZXJ0aWVzLiAKLSAgICAgICAgICAgICAgICBpZiAoIXByb3BlcnR5LmlzVGFnRXhjbHVkZWQoKS5ib29sZWFuVmFsdWUoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZU1ldGEgYXR0cmlidXRlID0gbmV3IEF0dHJpYnV0ZU1ldGEoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BlcnR5LmlzTWV0aG9kRXhwcmVzc2lvbigpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGUuc2V0Q2xhc3NOYW1lKCJqYXZheC5lbC5NZXRob2RFeHByZXNzaW9uIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNZXRob2RTaWduYXR1cmVNZXRhIHNpZyA9IHByb3BlcnR5LmdldE1ldGhvZEJpbmRpbmdTaWduYXR1cmUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZS5zZXREZWZlcnJlZE1ldGhvZFNpZ25hdHVyZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnLmdldFJldHVyblR5cGUoKSsiIG15TWV0aG9kKCIrc2lnLmdldFBhcmFtZXRlclR5cGVzQXNTdHJpbmcoKSsiKSIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKG51bGwgPT0gcHJvcGVydHkuaXNSdGV4cHJ2YWx1ZSgpIHx8ICFwcm9wZXJ0eS5pc1J0ZXhwcnZhbHVlKCkuYm9vbGVhblZhbHVlKCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZS5zZXREZWZlcnJlZFZhbHVlVHlwZShwcm9wZXJ0eS5nZXRDbGFzc05hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGUuc2V0Q2xhc3NOYW1lKCJqYXZheC5lbC5WYWx1ZUV4cHJlc3Npb24iKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vcnRleHBydmFsdWUgPSB0cnVlLCBzZXQgY2xhc3NOYW1lIGFzIGV4cGVjdGVkCi0gICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGUuc2V0Q2xhc3NOYW1lKHByb3BlcnR5LmdldENsYXNzTmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGUuc2V0UnRleHBydmFsdWUocHJvcGVydHkuaXNSdGV4cHJ2YWx1ZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZS5zZXREZXNjcmlwdGlvbihwcm9wZXJ0eS5nZXREZXNjcmlwdGlvbigpKTsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlLnNldExvbmdEZXNjcmlwdGlvbihwcm9wZXJ0eS5nZXRMb25nRGVzY3JpcHRpb24oKSk7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZS5zZXROYW1lKHByb3BlcnR5LmdldEpzcE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZS5zZXRSZXF1aXJlZChwcm9wZXJ0eS5pc1JlcXVpcmVkKCkpOwotCi0gICAgICAgICAgICAgICAgICAgIC8vanVzdCBhZGQgYXR0cmlidXRlIHRvIHRhZwotICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGVNZXRhIGF0dHJpYnV0ZUluVGFnID0gdGFnLmdldEF0dHJpYnV0ZShhdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVJblRhZyAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvL2F0dHJpYnV0ZUluVGFnIHRha2VzIHByZWNlZGVuY2UsIHNvIAotICAgICAgICAgICAgICAgICAgICAgICAgLy93ZSBoYXZlIHRvIG1lcmdlIGFuZCBjb3B5Ci0gICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGUubWVyZ2UoYXR0cmlidXRlSW5UYWcpOwotICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlSW5UYWcuY29weShhdHRyaWJ1dGUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLy9BZGQgaXQgdG8gdGFnCi0gICAgICAgICAgICAgICAgICAgICAgICB0YWcuYWRkQXR0cmlidXRlKGF0dHJpYnV0ZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGZsYXR0ZW5lZC5hZGQodGFnKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICAqIEBzaW5jZSAxLjAuNAotICAgICAgKiovCi0gICAgcHJpdmF0ZSB2b2lkIGZsYXR0ZW5GYWNlbGV0VGFnQXR0cmlidXRlcygpCi0gICAgewotICAgICAgICBMaXN0IGZhY2VsZXRUYWdzID0gbW9kZWwuZ2V0RmFjZWxldFRhZ3MoKTsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpID0gZmFjZWxldFRhZ3MuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgICAgICB7Ci0gICAgICAgICAgICBGYWNlbGV0VGFnTWV0YSB2YWwgPSAoRmFjZWxldFRhZ01ldGEpIGkubmV4dCgpOwotICAgICAgICAgICAgZmxhdHRlbkZhY2VsZXRUYWcodmFsKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzaW5jZSAxLjAuNgotICAgICAqKi8KLSAgICBwcml2YXRlIHZvaWQgZmxhdHRlbkJlaGF2aW9yUHJvcGVydGllcygpCi0gICAgewotICAgICAgICBMaXN0IGJlaGF2aW9yID0gbW9kZWwuZ2V0QmVoYXZpb3JzKCk7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGJlaGF2aW9yLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICAgICAgewotICAgICAgICAgICAgQmVoYXZpb3JNZXRhIHZhbCA9IChCZWhhdmlvck1ldGEpIGkubmV4dCgpOwotICAgICAgICAgICAgZmxhdHRlbkJlaGF2aW9yKHZhbCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQHNpbmNlIDEuMC42Ci0gICAgICoqLwotICAgIHByaXZhdGUgdm9pZCBmbGF0dGVuQmVoYXZpb3IoQmVoYXZpb3JNZXRhIGJlaGF2aW9yKQotICAgIHsKLSAgICAgICAgaWYgKGZsYXR0ZW5lZC5jb250YWlucyhiZWhhdmlvcikpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIGFscmVhZHkgZG9uZQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIFN0cmluZyBwYXJlbnRDbGFzc05hbWUgPSBiZWhhdmlvci5nZXRQYXJlbnRDbGFzc05hbWUoKTsKLSAgICAgICAgaWYgKHBhcmVudENsYXNzTmFtZSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBCZWhhdmlvck1ldGEgcGFyZW50ID0gbW9kZWwKLSAgICAgICAgICAgICAgICAgICAgLmZpbmRCZWhhdmlvckJ5Q2xhc3NOYW1lKHBhcmVudENsYXNzTmFtZSk7Ci0gICAgICAgICAgICBpZiAocGFyZW50ICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmxhdHRlbkJlaGF2aW9yKHBhcmVudCk7Ci0gICAgICAgICAgICAgICAgYmVoYXZpb3IubWVyZ2UocGFyZW50KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvL0hvdyB0byBtYW5hZ2UgYSB2YWxpZGF0b3IgdGhhdCBpdHMKLSAgICAgICAgICAgICAgICAvL3BhcmVudCBjbGFzcyBpcyBub3QgYSByZWFsIHZhbGlkYXRvcj8KLSAgICAgICAgICAgICAgICAvL0Fuczogbm8gcHJvYmxlbSwgZG8gbm90aGluZy4KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGZsYXR0ZW5lZC5hZGQoYmVoYXZpb3IpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBUaGlzIG1ldGhvZCBhbGxvd3MgY29tcG9uZW50IGZhY2VsZXQgdGFnIGNsYXNzZXMgdG8gYmUKLSAgICAgKiB1c2VkIHdpdGggY29tcG9uZW50IGFuZCBqc3AgdGFncywgc28gaXQgaXMgcG9zc2libGUgdG8gCi0gICAgICogaW5oZXJpdCBhdHRyaWJ1dGUgZm9yIGNvbXBvbmVudC4gQnV0IGZhY2VsZXQgdGFncyBjYW4gaW5oZXJpdAotICAgICAqIGF0dHJpYnV0ZXMgZnJvbSBvdGhlciBmYWNlbGV0IHRhZ3MuIAotICAgICAqIAotICAgICAqIEBzaW5jZSAxLjAuNAotICAgICAqIAotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBmbGF0dGVuRmFjZWxldFRhZyhGYWNlbGV0VGFnTWV0YSBmYWNlbGV0VGFnKQotICAgIHsKLSAgICAgICAgaWYgKGZsYXR0ZW5lZC5jb250YWlucyhmYWNlbGV0VGFnKSkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gYWxyZWFkeSBkb25lCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgICAKLSAgICAgICAgaWYgKGZhY2VsZXRUYWcuZ2V0U291cmNlQ2xhc3NQYXJlbnRDbGFzc05hbWUoKSA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICAvL05vIG5lZWQgdG8gc2NhbgotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyBJbiBvcmRlciBvZiBwcmVjZWRlbmNlCi0gICAgICAgIC8vIDEuIE1lcmdlIGJhc2UgcGFyZW50IHRhZyBoYW5kbGVyCi0gICAgICAgIFN0cmluZyBwYXJlbnRDbGFzc05hbWUgPSBmYWNlbGV0VGFnLmdldFBhcmVudENsYXNzTmFtZSgpOwotICAgICAgICBpZiAocGFyZW50Q2xhc3NOYW1lICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEZhY2VsZXRUYWdNZXRhIHBhcmVudCA9IG1vZGVsCi0gICAgICAgICAgICAgICAgICAgIC5maW5kRmFjZWxldFRhZ0J5Q2xhc3NOYW1lKHBhcmVudENsYXNzTmFtZSk7Ci0gICAgICAgICAgICBpZiAocGFyZW50ICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmxhdHRlbkZhY2VsZXRUYWcocGFyZW50KTsKLSAgICAgICAgICAgICAgICBmYWNlbGV0VGFnLm1lcmdlKHBhcmVudCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy9kbyBub3RoaW5nLgotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLzEuMSBNYXJrIGFsbCBhdHRyaWJ1dGVzIG9uIHRoZSBmYWNlbGV0cyB0YWcgaGllcmFyY2h5IGFzIGZhY2VsZXRzT25seQotICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ID0gZmFjZWxldFRhZy5hdHRyaWJ1dGVzKCk7IGl0Lmhhc05leHQoKTspCi0gICAgICAgIHsKLSAgICAgICAgICAgIEF0dHJpYnV0ZU1ldGEgYSA9IChBdHRyaWJ1dGVNZXRhKSBpdC5uZXh0KCk7Ci0gICAgICAgICAgICBhLnNldEZhY2VsZXRzT25seShCb29sZWFuLlRSVUUpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gMi4gTWVyZ2UgZnJvbSB0YWcgY2xhc3MKLSAgICAgICAgaWYgKGZhY2VsZXRUYWcuZ2V0VGFnQ2xhc3MoKSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBUYWdNZXRhIHRhZyA9IG1vZGVsLmZpbmRUYWdCeUNsYXNzTmFtZShmYWNlbGV0VGFnLmdldFRhZ0NsYXNzKCkpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAobnVsbCAhPSB0YWcpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKHRhZy5nZXRMb25nRGVzY3JpcHRpb24oKSAhPSBudWxsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZmFjZWxldFRhZy5zZXRMb25nRGVzY3JpcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFnLmdldExvbmdEZXNjcmlwdGlvbigpKyI8cD4iK2ZhY2VsZXRUYWcuZ2V0TG9uZ0Rlc2NyaXB0aW9uKCkrIjwvcD4iKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHRhZy5nZXREZXNjcmlwdGlvbigpICE9IG51bGwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmYWNlbGV0VGFnLnNldERlc2NyaXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhZy5nZXREZXNjcmlwdGlvbigpKyIgIitmYWNlbGV0VGFnLmdldERlc2NyaXB0aW9uKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBNb2RlbFV0aWxzLm1lcmdlQXR0cmlidXRlcyhmYWNlbGV0VGFnLCB0YWcpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gMy4gTWVyZ2UgZnJvbSBjb252ZXJ0ZXIvdmFsaWRhdG9yL2NvbXBvbmVudCBjbGFzcwotCi0gICAgICAgIGlmIChmYWNlbGV0VGFnLmdldENvbnZlcnRlckNsYXNzKCkgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgQ29udmVydGVyTWV0YSBjb252ZXJ0ZXIgPSBtb2RlbC5maW5kQ29udmVydGVyQnlDbGFzc05hbWUoCi0gICAgICAgICAgICAgICAgICAgICAgICBmYWNlbGV0VGFnLmdldENvbnZlcnRlckNsYXNzKCkpOyAgICAgICAgCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChudWxsICE9IGNvbnZlcnRlcikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoY29udmVydGVyLmdldExvbmdEZXNjcmlwdGlvbigpICE9IG51bGwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmYWNlbGV0VGFnLnNldExvbmdEZXNjcmlwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb252ZXJ0ZXIuZ2V0TG9uZ0Rlc2NyaXB0aW9uKCkrIjxwPiIrZmFjZWxldFRhZy5nZXRMb25nRGVzY3JpcHRpb24oKSsiPC9wPiIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoY29udmVydGVyLmdldERlc2NyaXB0aW9uKCkgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGZhY2VsZXRUYWcuc2V0RGVzY3JpcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udmVydGVyLmdldERlc2NyaXB0aW9uKCkrIiAiK2ZhY2VsZXRUYWcuZ2V0RGVzY3JpcHRpb24oKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGFkZE9yTWVyZ2VQcm9wZXJ0aWVzVG9BdHRyaWJ1dGVIb2xkZXIoZmFjZWxldFRhZywgY29udmVydGVyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChmYWNlbGV0VGFnLmdldFZhbGlkYXRvckNsYXNzKCkgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgVmFsaWRhdG9yTWV0YSB2YWxpZGF0b3IgPSBtb2RlbC5maW5kVmFsaWRhdG9yQnlDbGFzc05hbWUoCi0gICAgICAgICAgICAgICAgICAgICAgICBmYWNlbGV0VGFnLmdldFZhbGlkYXRvckNsYXNzKCkpOyAgICAgICAgCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChudWxsICE9IHZhbGlkYXRvcikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAodmFsaWRhdG9yLmdldExvbmdEZXNjcmlwdGlvbigpICE9IG51bGwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmYWNlbGV0VGFnLnNldExvbmdEZXNjcmlwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0b3IuZ2V0TG9uZ0Rlc2NyaXB0aW9uKCkrIjxwPiIrZmFjZWxldFRhZy5nZXRMb25nRGVzY3JpcHRpb24oKSsiPC9wPiIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAodmFsaWRhdG9yLmdldERlc2NyaXB0aW9uKCkgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGZhY2VsZXRUYWcuc2V0RGVzY3JpcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdG9yLmdldERlc2NyaXB0aW9uKCkrIiAiK2ZhY2VsZXRUYWcuZ2V0RGVzY3JpcHRpb24oKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGFkZE9yTWVyZ2VQcm9wZXJ0aWVzVG9BdHRyaWJ1dGVIb2xkZXIoZmFjZWxldFRhZywgdmFsaWRhdG9yKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYgKGZhY2VsZXRUYWcuZ2V0QmVoYXZpb3JDbGFzcygpICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEJlaGF2aW9yTWV0YSBiZWhhdmlvciA9IG1vZGVsLmZpbmRCZWhhdmlvckJ5Q2xhc3NOYW1lKAotICAgICAgICAgICAgICAgICAgICAgICAgZmFjZWxldFRhZy5nZXRCZWhhdmlvckNsYXNzKCkpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAobnVsbCAhPSBiZWhhdmlvcikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoYmVoYXZpb3IuZ2V0TG9uZ0Rlc2NyaXB0aW9uKCkgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGZhY2VsZXRUYWcuc2V0TG9uZ0Rlc2NyaXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlaGF2aW9yLmdldExvbmdEZXNjcmlwdGlvbigpKyI8cD4iK2ZhY2VsZXRUYWcuZ2V0TG9uZ0Rlc2NyaXB0aW9uKCkrIjwvcD4iKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGJlaGF2aW9yLmdldERlc2NyaXB0aW9uKCkgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGZhY2VsZXRUYWcuc2V0RGVzY3JpcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVoYXZpb3IuZ2V0RGVzY3JpcHRpb24oKSsiICIrZmFjZWxldFRhZy5nZXREZXNjcmlwdGlvbigpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYWRkT3JNZXJnZVByb3BlcnRpZXNUb0F0dHJpYnV0ZUhvbGRlcihmYWNlbGV0VGFnLCBiZWhhdmlvcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZmFjZWxldFRhZy5nZXRDb21wb25lbnRDbGFzcygpICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIENvbXBvbmVudE1ldGEgY29tcG9uZW50ID0gbW9kZWwuZmluZENvbXBvbmVudEJ5Q2xhc3NOYW1lKAotICAgICAgICAgICAgICAgICAgICAgICAgZmFjZWxldFRhZy5nZXRDb21wb25lbnRDbGFzcygpKTsgICAgICAgIAotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAobnVsbCAhPSBjb21wb25lbnQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKGNvbXBvbmVudC5nZXRMb25nRGVzY3JpcHRpb24oKSAhPSBudWxsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZmFjZWxldFRhZy5zZXRMb25nRGVzY3JpcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50LmdldExvbmdEZXNjcmlwdGlvbigpKyI8cD4iK2ZhY2VsZXRUYWcuZ2V0TG9uZ0Rlc2NyaXB0aW9uKCkrIjwvcD4iKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGNvbXBvbmVudC5nZXREZXNjcmlwdGlvbigpICE9IG51bGwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmYWNlbGV0VGFnLnNldERlc2NyaXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC5nZXREZXNjcmlwdGlvbigpKyIgIitmYWNlbGV0VGFnLmdldERlc2NyaXB0aW9uKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBhZGRPck1lcmdlUHJvcGVydGllc1RvQXR0cmlidXRlSG9sZGVyKGZhY2VsZXRUYWcsIGNvbXBvbmVudCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgZmxhdHRlbmVkLmFkZChmYWNlbGV0VGFnKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICAqIEBzaW5jZSAxLjAuNAotICAgICAgKiovCi0gICAgcHJpdmF0ZSB2b2lkIGFkZE9yTWVyZ2VQcm9wZXJ0aWVzVG9BdHRyaWJ1dGVIb2xkZXIoQXR0cmlidXRlSG9sZGVyIGF0dHJpYnV0ZUhvbGRlciwgUHJvcGVydHlIb2xkZXIgcHJvcGVydHlIb2xkZXIpCi0gICAgewotICAgICAgICBDb2xsZWN0aW9uIHByb3BlcnR5TGlzdCA9IHByb3BlcnR5SG9sZGVyLmdldFByb3BlcnRpZXMoKS52YWx1ZXMoKTsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpdCA9IHByb3BlcnR5TGlzdC5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KQotICAgICAgICB7Ci0gICAgICAgICAgICBQcm9wZXJ0eU1ldGEgcHJvcGVydHkgPSAoUHJvcGVydHlNZXRhKSBpdC5uZXh0KCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vSnVzdCBhZGQgYWxsIG5vbiB0YWcgZXhjbHVkZWQgcHJvcGVydGllcy4gCi0gICAgICAgICAgICBpZiAoIXByb3BlcnR5LmlzVGFnRXhjbHVkZWQoKS5ib29sZWFuVmFsdWUoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBBdHRyaWJ1dGVNZXRhIGF0dHJpYnV0ZSA9IG5ldyBBdHRyaWJ1dGVNZXRhKCk7Ci0gICAgICAgICAgICAgICAgaWYgKHByb3BlcnR5LmlzTWV0aG9kRXhwcmVzc2lvbigpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlLnNldENsYXNzTmFtZSgiamF2YXguZWwuTWV0aG9kRXhwcmVzc2lvbiIpOwotICAgICAgICAgICAgICAgICAgICBNZXRob2RTaWduYXR1cmVNZXRhIHNpZyA9IHByb3BlcnR5LmdldE1ldGhvZEJpbmRpbmdTaWduYXR1cmUoKTsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlLnNldERlZmVycmVkTWV0aG9kU2lnbmF0dXJlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpZy5nZXRSZXR1cm5UeXBlKCkrIiBteU1ldGhvZCgiK3NpZy5nZXRQYXJhbWV0ZXJUeXBlc0FzU3RyaW5nKCkrIikiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAobnVsbCA9PSBwcm9wZXJ0eS5pc1J0ZXhwcnZhbHVlKCkgfHwgIXByb3BlcnR5LmlzUnRleHBydmFsdWUoKS5ib29sZWFuVmFsdWUoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZS5zZXREZWZlcnJlZFZhbHVlVHlwZShwcm9wZXJ0eS5nZXRDbGFzc05hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZS5zZXRDbGFzc05hbWUoImphdmF4LmVsLlZhbHVlRXhwcmVzc2lvbiIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvL3J0ZXhwcnZhbHVlID0gdHJ1ZSwgc2V0IGNsYXNzTmFtZSBhcyBleHBlY3RlZAotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGUuc2V0Q2xhc3NOYW1lKHByb3BlcnR5LmdldENsYXNzTmFtZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYXR0cmlidXRlLnNldFJ0ZXhwcnZhbHVlKHByb3BlcnR5LmlzUnRleHBydmFsdWUoKSk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgYXR0cmlidXRlLnNldERlc2NyaXB0aW9uKHByb3BlcnR5LmdldERlc2NyaXB0aW9uKCkpOwotICAgICAgICAgICAgICAgIGF0dHJpYnV0ZS5zZXRMb25nRGVzY3JpcHRpb24ocHJvcGVydHkuZ2V0TG9uZ0Rlc2NyaXB0aW9uKCkpOwotICAgICAgICAgICAgICAgIGF0dHJpYnV0ZS5zZXROYW1lKHByb3BlcnR5LmdldEpzcE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgYXR0cmlidXRlLnNldFJlcXVpcmVkKHByb3BlcnR5LmlzUmVxdWlyZWQoKSk7Ci0gICAgICAgICAgICAgICAgYXR0cmlidXRlLnNldEZhY2VsZXRzT25seShwcm9wZXJ0eS5pc0ZhY2VsZXRzT25seSgpKTsKLQotICAgICAgICAgICAgICAgIC8vanVzdCBhZGQgYXR0cmlidXRlIHRvIHRhZwotICAgICAgICAgICAgICAgIEF0dHJpYnV0ZU1ldGEgYXR0cmlidXRlSW5UYWcgPSBhdHRyaWJ1dGVIb2xkZXIuZ2V0QXR0cmlidXRlKGF0dHJpYnV0ZS5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVJblRhZyAhPSBudWxsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy9hdHRyaWJ1dGVJblRhZyB0YWtlcyBwcmVjZWRlbmNlLCBzbyAKLSAgICAgICAgICAgICAgICAgICAgLy93ZSBoYXZlIHRvIG1lcmdlIGFuZCBjb3B5Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZS5tZXJnZShhdHRyaWJ1dGVJblRhZyk7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZUluVGFnLmNvcHkoYXR0cmlidXRlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy9BZGQgaXQgdG8gdGFnCi0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZUhvbGRlci5hZGRBdHRyaWJ1dGUoYXR0cmlidXRlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gICAgICAgCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9JT1V0aWxzLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL0lPVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWIwMzE4ZC4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL0lPVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4NCArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uYnVpbGRlcjsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLkZpbGVSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5GaWxlV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5Xcml0ZXI7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEubmV0LlVSTENsYXNzTG9hZGVyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXJGYWN0b3J5OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmRpZ2VzdGVyLkRpZ2VzdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4uYXJ0aWZhY3QuQXJ0aWZhY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnByb2plY3QuTWF2ZW5Qcm9qZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uYnVpbGRlci5pby5YbWxXcml0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5idWlsZGVyLm1vZGVsLk1vZGVsOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLQotLyoqCi0gKiBVdGlsaXRpZXMgdG8gd3JpdGUgYSBNb2RlbCBhcyB4bWwsIGFuZCByZWFkIGEgTW9kZWwgaW4gZnJvbSB4bWwuCi0gKi8KLXB1YmxpYyBjbGFzcyBJT1V0aWxzCi17Ci0gICAgCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIE1ZRkFDRVNfTUVUQURBVEEgPSAiTUVUQS1JTkYvbXlmYWNlcy1tZXRhZGF0YS54bWwiOwotICAgIAotICAgIC8qKgotICAgICAqIFdyaXRlIHRoZSBjb250ZW50cyBvZiB0aGUgbW9kZWwgdG8gYW4geG1sIGZpbGUuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHNhdmVNb2RlbChNb2RlbCBtb2RlbCwgRmlsZSBvdXRmaWxlKQotICAgICAgICAgICAgdGhyb3dzIE1vam9FeGVjdXRpb25FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIEZpbGVXcml0ZXIgd3JpdGVyID0gbnVsbDsKLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgb3V0ZmlsZS5nZXRQYXJlbnRGaWxlKCkubWtkaXJzKCk7Ci0KLSAgICAgICAgICAgIHdyaXRlciA9IG5ldyBGaWxlV3JpdGVyKG91dGZpbGUpOwotICAgICAgICAgICAgd3JpdGVNb2RlbChtb2RlbCwgd3JpdGVyKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IE1vam9FeGVjdXRpb25FeGNlcHRpb24oIlVuYWJsZSB0byBzYXZlIGRhdGEiLCBlKTsKLSAgICAgICAgfQotICAgICAgICBmaW5hbGx5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmICh3cml0ZXIgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHdyaXRlci5jbG9zZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIGlnbm9yZQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogV3JpdGUgdGhlIGNvbnRlbnRzIG9mIHRoZSBtb2RlbCB0byBhIHByb3ZpZGVkIFdyaXRlciBvYmplY3QuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHdyaXRlTW9kZWwoTW9kZWwgbW9kZWwsIFdyaXRlciB3cml0ZXIpCi0gICAgICAgICAgICB0aHJvd3MgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHdyaXRlci53cml0ZSgiPD94bWwgdmVyc2lvbj0nMS4wJyA/PlxuIik7Ci0gICAgICAgICAgICBQcmludFdyaXRlciBwdyA9IG5ldyBQcmludFdyaXRlcih3cml0ZXIpOwotICAgICAgICAgICAgWG1sV3JpdGVyIHhtbFdyaXRlciA9IG5ldyBYbWxXcml0ZXIocHcpOwotICAgICAgICAgICAgTW9kZWwud3JpdGVYbWwoeG1sV3JpdGVyLCBtb2RlbCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uKCJVbmFibGUgdG8gc2F2ZSBkYXRhIiwgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZWFkIHRoZSBjb250ZW50cyBvZiB0aGUgbW9kZWwgZnJvbSBhbiB4bWwgZmlsZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIE1vZGVsIGxvYWRNb2RlbChGaWxlIGluZmlsZSkgdGhyb3dzIE1vam9FeGVjdXRpb25FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIEZpbGVSZWFkZXIgcmVhZGVyID0gbnVsbDsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKGluZmlsZSk7Ci0gICAgICAgICAgICByZXR1cm4gcmVhZE1vZGVsKHJlYWRlcik7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbigiTm8gbWV0YWRhdGEgZmlsZToiICsgaW5maWxlKTsKLSAgICAgICAgfQotICAgICAgICBmaW5hbGx5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChyZWFkZXIgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJlYWRlci5jbG9zZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gZXhpc3RzU291cmNlRmlsZShTdHJpbmcgZmlsZW5hbWUsIExpc3Qgc291cmNlRGlycykKLSAgICB7Ci0gICAgICAgIGJvb2xlYW4gZXhpc3RzRmlsZSA9IGZhbHNlOyAgICAgICAgICAgIAotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNvdXJjZURpcnMuc2l6ZSgpOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyBzcmNEaXIgPSAoU3RyaW5nKSBzb3VyY2VEaXJzLmdldChpKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy9UaGlzIGRpcmVjdG9yeSB0aGF0IGNvbnRhaW5zIHRhcmdldC9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL21haW4KLSAgICAgICAgICAgIC8vaXMgYmFubmVkLCBhbGwgaGVyZSBpcyBnZW5lcmF0ZWQKLSAgICAgICAgICAgIC8vc28gd2UgZG9uJ3QgdGFrZSBhIGxvb2sgYXQgdGhpcyBkaXJlY3RvcnkKLSAgICAgICAgICAgIC8vaWYgKHNyY0Rpci5tYXRjaGVzKCIuKlxcVyt0YXJnZXRcXFcrbXlmYWNlcy1idWlsZGVyLXBsdWdpblxcVyttYWluXFxXKy4qIikpCi0gICAgICAgICAgICAvL2lmIChzcmNEaXIubWF0Y2hlcygiLipcXFcrdGFyZ2V0XFxXK2dlbmVyYXRlZC1zb3VyY2VzXFxXK215ZmFjZXMtYnVpbGRlci1wbHVnaW4iKSkKLSAgICAgICAgICAgIC8vewotICAgICAgICAgICAgLy8gICAgY29udGludWU7Ci0gICAgICAgICAgICAvL30gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIAotICAgICAgICAgICAgRmlsZSBmID0gbmV3IEZpbGUoc3JjRGlyLGZpbGVuYW1lKTsKLSAgICAgICAgICAgIGlmIChmLmV4aXN0cygpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGV4aXN0c0ZpbGU9dHJ1ZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZXhpc3RzRmlsZTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBNb2RlbCBnZXRNb2RlbEZyb21BcnRpZmFjdChBcnRpZmFjdCBhcnRpZmFjdCkgCi0gICAgICAgIHRocm93cyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uCi0gICAgewotICAgICAgICBNb2RlbCBtb2RlbCA9IG51bGw7Ci0gICAgICAgIEZpbGUgamFyRmlsZSA9IGFydGlmYWN0LmdldEZpbGUoKTsKLQotICAgICAgICBVUkxDbGFzc0xvYWRlciBhcmNoZXR5cGVKYXJMb2FkZXI7Ci0KLSAgICAgICAgSW5wdXRTdHJlYW0gaXMgPSBudWxsOwotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgVVJMW10gdXJscyA9IG5ldyBVUkxbMV07Ci0gICAgICAgICAgICB1cmxzWzBdID0gamFyRmlsZS50b1VSSSgpLnRvVVJMKCk7Ci0gICAgICAgICAgICBhcmNoZXR5cGVKYXJMb2FkZXIgPSBuZXcgVVJMQ2xhc3NMb2FkZXIodXJscyk7Ci0KLSAgICAgICAgICAgIGlzID0gZ2V0U3RyZWFtKE1ZRkFDRVNfTUVUQURBVEEsIGFyY2hldHlwZUphckxvYWRlcik7Ci0KLSAgICAgICAgICAgIGlmIChpcyAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFJlYWRlciByID0gbnVsbDsKLSAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHIgPSBuZXcgSW5wdXRTdHJlYW1SZWFkZXIoaXMpOwotICAgICAgICAgICAgICAgICAgICBtb2RlbCA9IHJlYWRNb2RlbChyKTsKLSAgICAgICAgICAgICAgICAgICAgci5jbG9zZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFcnJvciByZWFkaW5nIG15ZmFjZXMtbWV0YWRhdGEueG1sIGZvcm0gIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBhcnRpZmFjdC5nZXRGaWxlKCkuZ2V0TmFtZSgpLCBlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZmluYWxseQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHIgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgci5jbG9zZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9pZ25vcmUKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQXJ0aWZhY3Q6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgYXJ0aWZhY3QuZ2V0RmlsZSgpLmdldE5hbWUoKQotICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGhhdmUgTUVUQS1JTkYvbXlmYWNlcy1tZXRhZGF0YS54bWwiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IE1vam9FeGVjdXRpb25FeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICJFcnJvciByZWFkaW5nIG15ZmFjZXMtbWV0YWRhdGEueG1sIGZvcm0gIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgYXJ0aWZhY3QuZ2V0RmlsZSgpLmdldE5hbWUoKSwgZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxseQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoaXMgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlzLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBleCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vaWdub3JlCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG1vZGVsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNjYW4gZXZlcnkgamFyZmlsZSB0aGF0IHRoaXMgbWF2ZW4gcHJvamVjdCBoYXMgYSBkZXBlbmRlbmN5IG9uLCBsb29raW5nIGZvciBtZXRhZGF0YSBmaWxlcy4KLSAgICAgKiA8cD4KLSAgICAgKiBFYWNoIGZpbGUgZm91bmQgaXMgbG9hZGVkIGludG8gbWVtb3J5IGFzIGEgTW9kZWwgb2JqZWN0IGFuZCBhZGRlZCB0byB0aGUgbGlzdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIExpc3QgZ2V0TW9kZWxzRnJvbUFydGlmYWN0cyhNYXZlblByb2plY3QgcHJvamVjdCkKLSAgICAgICAgICAgIHRocm93cyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uCi0gICAgewotICAgICAgICBMaXN0IG1vZGVscyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgCi0gICAgICAgIGZvciAoSXRlcmF0b3IgaXQgPSBwcm9qZWN0LmdldEFydGlmYWN0cygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspCi0gICAgICAgIHsKLQotICAgICAgICAgICAgQXJ0aWZhY3QgYXJ0aWZhY3QgPSAoQXJ0aWZhY3QpIGl0Lm5leHQoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKCJjb21waWxlIi5lcXVhbHMoYXJ0aWZhY3QuZ2V0U2NvcGUoKSkKLSAgICAgICAgICAgICAgICAgICAgfHwgInByb3ZpZGVkIi5lcXVhbHMoYXJ0aWZhY3QuZ2V0U2NvcGUoKSkKLSAgICAgICAgICAgICAgICAgICAgfHwgInN5c3RlbSIuZXF1YWxzKGFydGlmYWN0LmdldFNjb3BlKCkpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vVGhpcyBpcyBzYWZlIHNpbmNlIHdlIGhhdmUgYWxsIGRlcGVuY2VuY2llcyBvbiB0aGUKLSAgICAgICAgICAgICAgICAvL3BvbSwgc28gdGhleSBhcmUgZG93bmxvYWRlZCBmaXJzdCBieSBtYXZlbi4KLSAgICAgICAgICAgICAgICBGaWxlIGphckZpbGUgPSBhcnRpZmFjdC5nZXRGaWxlKCk7Ci0KLSAgICAgICAgICAgICAgICBVUkxDbGFzc0xvYWRlciBhcmNoZXR5cGVKYXJMb2FkZXI7Ci0KLSAgICAgICAgICAgICAgICBJbnB1dFN0cmVhbSBpcyA9IG51bGw7Ci0gICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBVUkxbXSB1cmxzID0gbmV3IFVSTFsxXTsKLSAgICAgICAgICAgICAgICAgICAgdXJsc1swXSA9IGphckZpbGUudG9VUkwoKTsKLSAgICAgICAgICAgICAgICAgICAgYXJjaGV0eXBlSmFyTG9hZGVyID0gbmV3IFVSTENsYXNzTG9hZGVyKHVybHMpOwotCi0gICAgICAgICAgICAgICAgICAgIGlzID0gZ2V0U3RyZWFtKE1ZRkFDRVNfTUVUQURBVEEsIGFyY2hldHlwZUphckxvYWRlcik7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGlzICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFJlYWRlciByID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIgPSBuZXcgSW5wdXRTdHJlYW1SZWFkZXIoaXMpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vZGVsIG0gPSByZWFkTW9kZWwocik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWxzLmFkZChtKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFcnJvciByZWFkaW5nIG15ZmFjZXMtbWV0YWRhdGEueG1sIGZvcm0gIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGFydGlmYWN0LmdldEZpbGUoKS5nZXROYW1lKCksIGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZmluYWxseQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci5jbG9zZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2lnbm9yZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkFydGlmYWN0OiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgYXJ0aWZhY3QuZ2V0RmlsZSgpLmdldE5hbWUoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgaGF2ZSBNRVRBLUlORi9teWZhY2VzLW1ldGFkYXRhLnhtbCIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE1vam9FeGVjdXRpb25FeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVycm9yIHJlYWRpbmcgbXlmYWNlcy1tZXRhZGF0YS54bWwgZm9ybSAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGFydGlmYWN0LmdldEZpbGUoKS5nZXROYW1lKCksIGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBmaW5hbGx5Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAoaXMgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMuY2xvc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBleCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2lnbm9yZQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtb2RlbHM7Ci0gICAgfQotICAgICAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBJbnB1dFN0cmVhbSBnZXRTdHJlYW0oIFN0cmluZyBuYW1lLAotICAgICAgICAgICAgQ2xhc3NMb2FkZXIgbG9hZGVyICkKLSAgICB7Ci0gICAgICAgIGlmICggbG9hZGVyID09IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKS5nZXRSZXNvdXJjZUFzU3RyZWFtKCBuYW1lICk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGxvYWRlci5nZXRSZXNvdXJjZUFzU3RyZWFtKCBuYW1lICk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFJlYWQgdGhlIGNvbnRlbnRzIG9mIHRoZSBtb2RlbCBmcm9tIGEgcHJvdmlkZWQgUmVhZGVyIG9iamVjdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIE1vZGVsIHJlYWRNb2RlbChSZWFkZXIgcmVhZGVyKSB0aHJvd3MgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIC8vRGlnZXN0ZXIgZCA9IG5ldyBEaWdlc3RlcigpOwotICAgICAgICAgICAgU0FYUGFyc2VyRmFjdG9yeSBzcGYgPSBTQVhQYXJzZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAgICAgICBzcGYuc2V0TmFtZXNwYWNlQXdhcmUodHJ1ZSk7Ci0gICAgICAgICAgICAvLyByZXF1aXJlcyBKQVhQIDEuMywgaW4gSmF2YVNFIDUuMAotICAgICAgICAgICAgLy8gc3BmLnNldFhJbmNsdWRlQXdhcmUodHJ1ZSk7Ci0gICAgICAgICAgICBEaWdlc3RlciBkID0gbmV3IERpZ2VzdGVyKHNwZi5uZXdTQVhQYXJzZXIoKSk7Ci0gICAgICAgICAgICBkLnNldE5hbWVzcGFjZUF3YXJlKHRydWUpOyAgICAgICAgICAgIAotCi0gICAgICAgICAgICBNb2RlbC5hZGRYbWxSdWxlcyhkKTsKLQotICAgICAgICAgICAgZC5wYXJzZShyZWFkZXIpOwotCi0gICAgICAgICAgICBNb2RlbCBtb2RlbCA9IChNb2RlbCkgZC5nZXRSb290KCk7Ci0gICAgICAgICAgICByZXR1cm4gbW9kZWw7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uKCJVbmFibGUgdG8gbG9hZCBtZXRhZGF0YSIsIGUpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChTQVhFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IE1vam9FeGVjdXRpb25FeGNlcHRpb24oIlVuYWJsZSB0byBsb2FkIG1ldGFkYXRhIiwgZSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jawotICAgICAgICAgICAgdGhyb3cgbmV3IE1vam9FeGVjdXRpb25FeGNlcHRpb24oIlVuYWJsZSB0byBsb2FkIHBhcnNlciIsIGUpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9NYWtlQ2xpZW50QmVoYXZpb3JzTW9qby5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9NYWtlQ2xpZW50QmVoYXZpb3JzTW9qby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMGNmYWMwLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvTWFrZUNsaWVudEJlaGF2aW9yc01vam8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyMCArMCwwIEBACi0vKg0KLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICogDQotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqIA0KLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqICB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uYnVpbGRlcjsNCi0NCi1pbXBvcnQgamF2YS5pby5GaWxlOw0KLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07DQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247DQotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtV3JpdGVyOw0KLWltcG9ydCBqYXZhLmlvLldyaXRlcjsNCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOw0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uQWJzdHJhY3RNb2pvOw0KLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5Nb2pvRXhlY3V0aW9uRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnByb2plY3QuTWF2ZW5Qcm9qZWN0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmJ1aWxkZXIubW9kZWwuQmVoYXZpb3JNZXRhOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmJ1aWxkZXIubW9kZWwuTW9kZWw7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uYnVpbGRlci51dGlscy5CdWlsZEV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5idWlsZGVyLnV0aWxzLk1hdmVuUGx1Z2luQ29uc29sZUxvZ1N5c3RlbTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5idWlsZGVyLnV0aWxzLk15ZmFjZXNVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS52ZWxvY2l0eS5UZW1wbGF0ZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS52ZWxvY2l0eS5WZWxvY2l0eUNvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUudmVsb2NpdHkuYXBwLlZlbG9jaXR5RW5naW5lOw0KLWltcG9ydCBvcmcuYXBhY2hlLnZlbG9jaXR5LmNvbnRleHQuQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS52ZWxvY2l0eS5ydW50aW1lLlJ1bnRpbWVDb25zdGFudHM7DQotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMudXRpbC5JT1V0aWw7DQotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMudXRpbC5TdHJpbmdVdGlsczsNCi0NCi1pbXBvcnQgY29tLnRob3VnaHR3b3Jrcy5xZG94LkphdmFEb2NCdWlsZGVyOw0KLQ0KLS8qKg0KLSAqIE1hdmVuIGdvYWwgdG8gZ2VuZXJhdGUgamF2YSBzb3VyY2UgY29kZSBmb3IgQmVoYXZpb3IgY2xhc3Nlcy4NCi0gKiANCi0gKiA8cD5JdCB1c2VzIHZlbG9jaXR5IHRvIGdlbmVyYXRlIHRlbXBsYXRlcywgYW5kIGhhcyB0aGUgb3B0aW9uIHRvIGRlZmluZSBjdXN0b20gdGVtcGxhdGVzLjwvcD4NCi0gKiA8cD5UaGUgZXhlY3V0ZWQgdGVtcGxhdGUgaGFzIHRoZSBmb2xsb3dpbmcgdmFyaWFibGVzIGF2YWlsYWJsZSB0byBpdDo8L3A+DQotICogPHVsPg0KLSAqICA8bGk+dXRpbHMgOiBSZXR1cm5zIGFuIGluc3RhbmNlIG9mIA0KLSAqICBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmJ1aWxkZXIudXRpbHMuTXlmYWNlc1V0aWxzLCANCi0gKiAgaXQgY29udGFpbnMgc29tZSB1c2VmdWwgbWV0aG9kcy48L2xpPg0KLSAqICA8bGk+YmVoYXZpb3IgOiBSZXR1cm5zIHRoZSBjdXJyZW50IGluc3RhbmNlIG9mDQotICogICBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmJ1aWxkZXIubW9kZWwuQmVoYXZpb3JNZXRhPC9saT4NCi0gKiA8L3VsPg0KLSAqIA0KLSAqIEB2ZXJzaW9uICRJZDogTWFrZUJlaGF2aW9yc01vam8uamF2YSAxMDMxOTA2IDIwMTAtMTEtMDYgMDE6MTg6MDNaIGx1NDI0MiAkDQotICogQHJlcXVpcmVzRGVwZW5kZW5jeVJlc29sdXRpb24gY29tcGlsZQ0KLSAqIEBnb2FsIG1ha2UtY2xpZW50LWJlaGF2aW9ycw0KLSAqIEBwaGFzZSBnZW5lcmF0ZS1zb3VyY2VzDQotICovDQotcHVibGljIGNsYXNzIE1ha2VDbGllbnRCZWhhdmlvcnNNb2pvIGV4dGVuZHMgQWJzdHJhY3RNb2pvDQotew0KLSAgICAvKioNCi0gICAgICogSW5qZWN0ZWQgTWF2ZW4gcHJvamVjdC4NCi0gICAgICogDQotICAgICAqIEBwYXJhbWV0ZXIgZXhwcmVzc2lvbj0iJHtwcm9qZWN0fSINCi0gICAgICogQHJlYWRvbmx5DQotICAgICAqLw0KLSAgICBwcml2YXRlIE1hdmVuUHJvamVjdCBwcm9qZWN0Ow0KLQ0KLSAgICAvKioNCi0gICAgICogRGVmaW5lcyB0aGUgZGlyZWN0b3J5IHdoZXJlIHRoZSBtZXRhZGF0YSBmaWxlIChNRVRBLUlORi9teWZhY2VzLW1ldGFkYXRhLnhtbCkgaXMgbG9hZGVkLg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtZXRlciBleHByZXNzaW9uPSIke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9nZW5lcmF0ZWQtcmVzb3VyY2VzL215ZmFjZXMtYnVpbGRlci1wbHVnaW4iDQotICAgICAqLw0KLSAgICBwcml2YXRlIEZpbGUgYnVpbGREaXJlY3Rvcnk7DQotDQotICAgIC8qKg0KLSAgICAgKiBJbmplY3RlZCBuYW1lIG9mIGZpbGUgZ2VuZXJhdGVkIGJ5IGVhcmxpZXIgcnVuIG9mIEJ1aWxkTWV0YURhdGFNb2pvIGdvYWwuDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW1ldGVyDQotICAgICAqLw0KLSAgICBwcml2YXRlIFN0cmluZyBtZXRhZGF0YUZpbGUgPSAiTUVUQS1JTkYvbXlmYWNlcy1tZXRhZGF0YS54bWwiOw0KLQ0KLSAgICAvKioNCi0gICAgICogVGhlIGRpcmVjdG9yeSB1c2VkIHRvIGxvYWQgdGVtcGxhdGVzIGludG8gdmVsb2NpdHkgZW52aXJvbm1lbnQuDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW1ldGVyIGV4cHJlc3Npb249InNyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORiINCi0gICAgICovDQotICAgIHByaXZhdGUgRmlsZSB0ZW1wbGF0ZVNvdXJjZURpcmVjdG9yeTsNCi0NCi0gICAgLyoqDQotICAgICAqIFRoZSBkaXJlY3Rvcnkgd2hlcmUgYWxsIGdlbmVyYXRlZCBmaWxlcyBhcmUgY3JlYXRlZC4gVGhpcyBkaXJlY3RvcnkgaXMgYWRkZWQgYXMgYQ0KLSAgICAgKiBjb21waWxlIHNvdXJjZSByb290IGF1dG9tYXRpY2FsbHkgbGlrZSBzcmMvbWFpbi9qYXZhIGlzLiANCi0gICAgICogDQotICAgICAqIEBwYXJhbWV0ZXIgZXhwcmVzc2lvbj0iJHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vZ2VuZXJhdGVkLXNvdXJjZXMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbiINCi0gICAgICovDQotICAgIHByaXZhdGUgRmlsZSBnZW5lcmF0ZWRTb3VyY2VEaXJlY3Rvcnk7DQotDQotICAgIC8qKg0KLSAgICAgKiBPbmx5IGdlbmVyYXRlIHRhZyBjbGFzc2VzIHRoYXQgY29udGFpbnMgdGhhdCBwYWNrYWdlIHByZWZpeA0KLSAgICAgKiANCi0gICAgICogQHBhcmFtZXRlcg0KLSAgICAgKi8NCi0gICAgcHJpdmF0ZSBTdHJpbmcgcGFja2FnZUNvbnRhaW5zOw0KLQ0KLSAgICAvKioNCi0gICAgICogIExvZyBhbmQgY29udGludWUgZXhlY3V0aW9uIHdoZW4gZ2VuZXJhdGluZyBiZWhhdmlvciBjbGFzc2VzLg0KLSAgICAgKiAgPHA+DQotICAgICAqICBJZiB0aGlzIHByb3BlcnR5IGlzIHNldCB0byBmYWxzZSAoZGVmYXVsdCksIGVycm9ycyB3aGVuIGEgYmVoYXZpb3IgY2xhc3MgaXMgZ2VuZXJhdGVkIHN0b3BzDQotICAgICAqICBleGVjdXRpb24gaW1tZWRpYXRlbHkuDQotICAgICAqICA8L3A+DQotICAgICAqIA0KLSAgICAgKiBAcGFyYW1ldGVyDQotICAgICAqLw0KLSAgICBwcml2YXRlIGJvb2xlYW4gZm9yY2U7DQotDQotICAgIC8qKg0KLSAgICAgKiBEZWZpbmUgdGhlIG1vZGVscyB0aGF0IHNob3VsZCBiZSBpbmNsdWRlZCB3aGVuIGdlbmVyYXRlIGJlaGF2aW9yIGNsYXNzZXMuIElmIG5vdCBzZXQsIHRoZQ0KLSAgICAgKiBjdXJyZW50IG1vZGVsIGlkZW50aWZpZWQgYnkgdGhlIGFydGlmYWN0SWQgaXMgdXNlZC4NCi0gICAgICogPHA+DQotICAgICAqIEVhY2ggbW9kZWwgYnVpbHQgYnkgYnVpbGQtbWV0YWRhdGEgZ29hbCBoYXMgYSBtb2RlbElkLCB0aGF0IGJ5IGRlZmF1bHQgaXMgdGhlIGFydGlmYWN0SWQgb2YNCi0gICAgICogdGhlIHByb2plY3QuIFNldHRpbmcgdGhpcyBwcm9wZXJ0eSBkZWZpbmVzIHdoaWNoIG9iamVjdHMgdGllZCBpbiBhIHNwZWNpZmllZCBtb2RlbElkIHNob3VsZA0KLSAgICAgKiBiZSB0YWtlbiBpbnRvIGFjY291bnQuICANCi0gICAgICogPC9wPg0KLSAgICAgKiA8cD5JbiB0aGlzIGNhc2UsIGxpbWl0IGNvbnZlcnRlciB0YWcgZ2VuZXJhdGlvbiBvbmx5IHRvIHRoZSBjb21wb25lbnRzIGRlZmluZWQgaW4gdGhlIG1vZGVscyANCi0gICAgICogaWRlbnRpZmllZCBieSB0aGUgbW9kZWxJZCBkZWZpbmVkLiA8L3A+DQotICAgICAqIDxwPlRoaXMgaXMgdXNlZnVsIHdoZW4geW91IG5lZWQgdG8gZ2VuZXJhdGUgZmlsZXMgdGhhdCB0YWtlIGluZm9ybWF0aW9uIGRlZmluZWQgb24gb3RoZXINCi0gICAgICogcHJvamVjdHMuPC9wPg0KLSAgICAgKiA8cD5FeGFtcGxlOjwvcD4NCi0gICAgICogPHByZT4NCi0gICAgICogICAgJmx0O21vZGVsSWRzJmd0Ow0KLSAgICAgKiAgICAgICAgJmx0O21vZGVsSWQ+bW9kZWwxJmx0Oy9tb2RlbElkJmd0Ow0KLSAgICAgKiAgICAgICAgJmx0O21vZGVsSWQ+bW9kZWwyJmx0Oy9tb2RlbElkJmd0Ow0KLSAgICAgKiAgICAmbHQ7L21vZGVsSWRzJmd0Ow0KLSAgICAgKiA8L3ByZT4NCi0gICAgICogDQotICAgICAqIEBwYXJhbWV0ZXINCi0gICAgICovDQotICAgIHByaXZhdGUgTGlzdCBtb2RlbElkczsNCi0NCi0gICAgLyoqDQotICAgICAqIFRoZSBuYW1lIG9mIHRoZSB0ZW1wbGF0ZSB1c2VkIHRvIGdlbmVyYXRlIGJlaGF2aW9yIGNsYXNzZXMuIEFjY29yZGluZyB0byB0aGUgdmFsdWUgb24gDQotICAgICAqIGpzZlZlcnNpb24gcHJvcGVydHkgdGhlIGRlZmF1bHQgaWYgdGhpcyBwcm9wZXJ0eSBpcyBub3Qgc2V0IGNvdWxkIGJlIGJlaGF2aW9yQ2xhc3MxMS52bSAoMS4xKSBvcg0KLSAgICAgKiBiZWhhdmlvckNsYXNzMTIudm0gKDEuMikNCi0gICAgICogDQotICAgICAqIEBwYXJhbWV0ZXIgDQotICAgICAqLw0KLSAgICBwcml2YXRlIFN0cmluZyB0ZW1wbGF0ZUNsaWVudEJlaGF2aW9yTmFtZTsNCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBUaGlzIHBhcmFtIGlzIHVzZWQgdG8gc2VhcmNoIGluIHRoaXMgZm9sZGVyIGlmIHNvbWUgZmlsZSB0bw0KLSAgICAgKiBiZSBnZW5lcmF0ZWQgZXhpc3RzIGFuZCBhdm9pZCBnZW5lcmF0aW9uIGFuZCBkdXBsaWNhdGUgZXhjZXB0aW9uLg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtZXRlciBleHByZXNzaW9uPSJzcmMvbWFpbi9qYXZhIg0KLSAgICAgKi8gICAgDQotICAgIHByaXZhdGUgRmlsZSBtYWluU291cmNlRGlyZWN0b3J5Ow0KLSAgICANCi0gICAgLyoqDQotICAgICAqIFRoaXMgcGFyYW0gaXMgdXNlZCB0byBzZWFyY2ggaW4gdGhpcyBmb2xkZXIgaWYgc29tZSBmaWxlIHRvDQotICAgICAqIGJlIGdlbmVyYXRlZCBleGlzdHMgYW5kIGF2b2lkIGdlbmVyYXRpb24gYW5kIGR1cGxpY2F0ZSBleGNlcHRpb24uDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW1ldGVyDQotICAgICAqLyAgICAgICAgDQotICAgIHByaXZhdGUgRmlsZSBtYWluU291cmNlRGlyZWN0b3J5MjsNCi0NCi0gICAgLyoqDQotICAgICAqIEV4ZWN1dGUgdGhlIE1vam8uDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIE1vam9FeGVjdXRpb25FeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgLy8gVGhpcyBjb21tYW5kIG1ha2VzIE1hdmVuIGNvbXBpbGUgdGhlIGdlbmVyYXRlZCBzb3VyY2U6DQotICAgICAgICAvLyBnZXRQcm9qZWN0KCkuYWRkQ29tcGlsZVNvdXJjZVJvb3QoIGFic29sdXRlR2VuZXJhdGVkUGF0aC5nZXRQYXRoKCkgKTsNCi0gICAgICAgIA0KLSAgICAgICAgdHJ5DQotICAgICAgICB7DQotICAgICAgICAgICAgcHJvamVjdC5hZGRDb21waWxlU291cmNlUm9vdCggZ2VuZXJhdGVkU291cmNlRGlyZWN0b3J5LmdldENhbm9uaWNhbFBhdGgoKSApOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIGlmIChtb2RlbElkcyA9PSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgbW9kZWxJZHMgPSBuZXcgQXJyYXlMaXN0KCk7DQotICAgICAgICAgICAgICAgIG1vZGVsSWRzLmFkZChwcm9qZWN0LmdldEFydGlmYWN0SWQoKSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIE1vZGVsIG1vZGVsID0gSU9VdGlscy5sb2FkTW9kZWwobmV3IEZpbGUoYnVpbGREaXJlY3RvcnksDQotICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YUZpbGUpKTsNCi0gICAgICAgICAgICBuZXcgRmxhdHRlbmVyKG1vZGVsKS5mbGF0dGVuKCk7DQotICAgICAgICAgICAgZ2VuZXJhdGVCZWhhdmlvcnMobW9kZWwpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhyb3cgbmV3IE1vam9FeGVjdXRpb25FeGNlcHRpb24oIkVycm9yIGdlbmVyYXRpbmcgYmVoYXZpb3JzIiwgZSk7DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoQnVpbGRFeGNlcHRpb24gZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbigiRXJyb3IgZ2VuZXJhdGluZyBiZWhhdmlvcnMiLCBlKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICANCi0gICAgDQotICAgIHByaXZhdGUgVmVsb2NpdHlFbmdpbmUgaW5pdFZlbG9jaXR5KCkgdGhyb3dzIE1vam9FeGVjdXRpb25FeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgRmlsZSB0ZW1wbGF0ZSA9IG5ldyBGaWxlKHRlbXBsYXRlU291cmNlRGlyZWN0b3J5LCBfZ2V0VGVtcGxhdGVOYW1lKCkpOw0KLSAgICAgICAgDQotICAgICAgICBpZiAodGVtcGxhdGUuZXhpc3RzKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgZ2V0TG9nKCkuaW5mbygiVXNpbmcgdGVtcGxhdGUgZnJvbSBmaWxlIGxvYWRlcjogIit0ZW1wbGF0ZS5nZXRQYXRoKCkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGdldExvZygpLmluZm8oIlVzaW5nIHRlbXBsYXRlIGZyb20gY2xhc3MgbG9hZGVyOiBNRVRBLUlORi8iK19nZXRUZW1wbGF0ZU5hbWUoKSk7DQotICAgICAgICB9DQotICAgICAgICAgICAgICAgIA0KLSAgICAgICAgVmVsb2NpdHlFbmdpbmUgdmVsb2NpdHlFbmdpbmUgPSBuZXcgVmVsb2NpdHlFbmdpbmUoKTsNCi0gICAgICAgICAgICAgICAgDQotICAgICAgICB0cnkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB2ZWxvY2l0eUVuZ2luZS5zZXRQcm9wZXJ0eSggInJlc291cmNlLmxvYWRlciIsICJmaWxlLCBjbGFzcyIgKTsNCi0gICAgICAgICAgICB2ZWxvY2l0eUVuZ2luZS5zZXRQcm9wZXJ0eSggImZpbGUucmVzb3VyY2UubG9hZGVyLmNsYXNzIiwNCi0gICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLnZlbG9jaXR5LnJ1bnRpbWUucmVzb3VyY2UubG9hZGVyLkZpbGVSZXNvdXJjZUxvYWRlciIpOw0KLSAgICAgICAgICAgIHZlbG9jaXR5RW5naW5lLnNldFByb3BlcnR5KCAiZmlsZS5yZXNvdXJjZS5sb2FkZXIucGF0aCIsIHRlbXBsYXRlU291cmNlRGlyZWN0b3J5LmdldFBhdGgoKSk7DQotICAgICAgICAgICAgdmVsb2NpdHlFbmdpbmUuc2V0UHJvcGVydHkoICJjbGFzcy5yZXNvdXJjZS5sb2FkZXIuY2xhc3MiLA0KLSAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uYnVpbGRlci51dGlscy5SZWxhdGl2ZUNsYXNzcGF0aFJlc291cmNlTG9hZGVyIiApOw0KLSAgICAgICAgICAgIHZlbG9jaXR5RW5naW5lLnNldFByb3BlcnR5KCAiY2xhc3MucmVzb3VyY2UubG9hZGVyLnBhdGgiLCAiTUVUQS1JTkYiKTsgICAgICAgICAgICANCi0gICAgICAgICAgICB2ZWxvY2l0eUVuZ2luZS5zZXRQcm9wZXJ0eSggInZlbG9jaW1hY3JvLmxpYnJhcnkiLCAiYmVoYXZpb3JDbGFzc01hY3JvczIwLnZtIik7DQotICAgICAgICAgICAgdmVsb2NpdHlFbmdpbmUuc2V0UHJvcGVydHkoICJ2ZWxvY2ltYWNyby5wZXJtaXNzaW9ucy5hbGxvdy5pbmxpbmUiLCJ0cnVlIik7DQotICAgICAgICAgICAgdmVsb2NpdHlFbmdpbmUuc2V0UHJvcGVydHkoICJ2ZWxvY2ltYWNyby5wZXJtaXNzaW9ucy5hbGxvdy5pbmxpbmUubG9jYWwuc2NvcGUiLCAidHJ1ZSIpOw0KLSAgICAgICAgICAgIHZlbG9jaXR5RW5naW5lLnNldFByb3BlcnR5KCAiZGlyZWN0aXZlLmZvcmVhY2guY291bnRlci5pbml0aWFsLnZhbHVlIiwiMCIpOw0KLSAgICAgICAgICAgIC8vdmVsb2NpdHlFbmdpbmUuc2V0UHJvcGVydHkoIFJ1bnRpbWVDb25zdGFudHMuUlVOVElNRV9MT0dfTE9HU1lTVEVNX0NMQVNTLA0KLSAgICAgICAgICAgIC8vICAgICJvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmJ1aWxkZXIudXRpbHMuQ29uc29sZUxvZ1N5c3RlbSIgKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICB2ZWxvY2l0eUVuZ2luZS5zZXRQcm9wZXJ0eShSdW50aW1lQ29uc3RhbnRzLlJVTlRJTUVfTE9HX0xPR1NZU1RFTSwNCi0gICAgICAgICAgICAgICAgICAgIG5ldyBNYXZlblBsdWdpbkNvbnNvbGVMb2dTeXN0ZW0odGhpcy5nZXRMb2coKSkpOw0KLQ0KLSAgICAgICAgICAgIHZlbG9jaXR5RW5naW5lLmluaXQoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbigiRXJyb3IgY3JlYXRpbmcgVmVsb2NpdHlFbmdpbmUiLCBlKTsNCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgcmV0dXJuIHZlbG9jaXR5RW5naW5lOw0KLSAgICB9DQotICAgIA0KLQ0KLSAgICAvKioNCi0gICAgICogR2VuZXJhdGVzIHBhcnNlZCBiZWhhdmlvcnMuDQotICAgICAqLw0KLSAgICBwcml2YXRlIHZvaWQgZ2VuZXJhdGVCZWhhdmlvcnMoTW9kZWwgbW9kZWwpIHRocm93cyBJT0V4Y2VwdGlvbiwNCi0gICAgICAgICAgICBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIC8vIE1ha2Ugc3VyZSBnZW5lcmF0ZWQgc291cmNlIGRpcmVjdG9yeSANCi0gICAgICAgIC8vIGlzIGFkZGVkIHRvIGNvbXBpbGF0aW9uIHNvdXJjZSBwYXRoIA0KLSAgICAgICAgLy9wcm9qZWN0LmFkZENvbXBpbGVTb3VyY2VSb290KGdlbmVyYXRlZFNvdXJjZURpcmVjdG9yeS5nZXRDYW5vbmljYWxQYXRoKCkpOw0KLSAgICAgICAgDQotICAgICAgICAvL0luaXQgUWRveCBmb3IgZXh0cmFjdCBjb2RlIA0KLSAgICAgICAgSmF2YURvY0J1aWxkZXIgYnVpbGRlciA9IG5ldyBKYXZhRG9jQnVpbGRlcigpOw0KLSAgICAgICAgDQotICAgICAgICBMaXN0IHNvdXJjZURpcnMgPSBwcm9qZWN0LmdldENvbXBpbGVTb3VyY2VSb290cygpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBuZWVkIGEgRmlsZSBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBvcmlnaW5hbCBzb3VyY2UgdHJlZQ0KLSAgICAgICAgZm9yIChJdGVyYXRvciBpID0gc291cmNlRGlycy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspDQotICAgICAgICB7DQotICAgICAgICAgICAgU3RyaW5nIHNyY0RpciA9IChTdHJpbmcpIGkubmV4dCgpOw0KLSAgICAgICAgICAgIGJ1aWxkZXIuYWRkU291cmNlVHJlZShuZXcgRmlsZShzcmNEaXIpKTsNCi0gICAgICAgIH0gICAgICAgIA0KLSAgICAgICAgDQotICAgICAgICAvL0luaXQgdmVsb2NpdHkNCi0gICAgICAgIFZlbG9jaXR5RW5naW5lIHZlbG9jaXR5RW5naW5lID0gaW5pdFZlbG9jaXR5KCk7DQotDQotICAgICAgICBWZWxvY2l0eUNvbnRleHQgYmFzZUNvbnRleHQgPSBuZXcgVmVsb2NpdHlDb250ZXh0KCk7DQotICAgICAgICBiYXNlQ29udGV4dC5wdXQoInV0aWxzIiwgbmV3IE15ZmFjZXNVdGlscygpKTsNCi0gICAgICAgIA0KLSAgICAgICAgZm9yIChJdGVyYXRvciBpdCA9IG1vZGVsLmdldEJlaGF2aW9ycygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspDQotICAgICAgICB7DQotICAgICAgICAgICAgQmVoYXZpb3JNZXRhIGJlaGF2aW9yID0gKEJlaGF2aW9yTWV0YSkgaXQubmV4dCgpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIGlmIChiZWhhdmlvci5nZXRDbGFzc05hbWUoKSAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgRmlsZSBmID0gbmV3IEZpbGUobWFpblNvdXJjZURpcmVjdG9yeSwgU3RyaW5nVXRpbHMucmVwbGFjZSgNCi0gICAgICAgICAgICAgICAgICAgIGJlaGF2aW9yLmdldENsYXNzTmFtZSgpLCAiLiIsICIvIikrIi5qYXZhIik7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICAgaWYgKCFmLmV4aXN0cygpICYmIGNhbkdlbmVyYXRlQmVoYXZpb3IoYmVoYXZpb3IpKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBpZiAobWFpblNvdXJjZURpcmVjdG9yeTIgIT0gbnVsbCkNCi0gICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBGaWxlIGYyID0gbmV3IEZpbGUobWFpblNvdXJjZURpcmVjdG9yeTIsIFN0cmluZ1V0aWxzLnJlcGxhY2UoDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWhhdmlvci5nZXRDbGFzc05hbWUoKSwgIi4iLCAiLyIpKyIuamF2YSIpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmMi5leGlzdHMoKSkNCi0gICAgICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vU2tpcA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBnZXRMb2coKS5pbmZvKCJHZW5lcmF0aW5nIGNsaWVudCBiZWhhdmlvciBjbGFzczoiK2JlaGF2aW9yLmdldENsYXNzTmFtZSgpKTsNCi0gICAgICAgICAgICAgICAgICAgIHRyeQ0KLSAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIF9nZW5lcmF0ZUJlaGF2aW9yKHZlbG9jaXR5RW5naW5lLCBidWlsZGVyLGJlaGF2aW9yLGJhc2VDb250ZXh0KTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIGNhdGNoKE1vam9FeGVjdXRpb25FeGNlcHRpb24gZSkNCi0gICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZm9yY2UpDQotICAgICAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRMb2coKS5lcnJvcihlLmdldE1lc3NhZ2UoKSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vU3RvcCBleGVjdXRpb24gdGhyb3dpbmcgZXhjZXB0aW9uDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGU7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfSAgICAgICAgDQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyBib29sZWFuIGNhbkdlbmVyYXRlQmVoYXZpb3IoQmVoYXZpb3JNZXRhIGJlaGF2aW9yKQ0KLSAgICB7DQotICAgICAgICBpZiAoIG1vZGVsSWRzLmNvbnRhaW5zKGJlaGF2aW9yLmdldE1vZGVsSWQoKSkNCi0gICAgICAgICAgICAgICAgJiYgaW5jbHVkZVBhY2thZ2UoYmVoYXZpb3IpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmICgiY2xpZW50QmVoYXZpb3IiLmVxdWFscyhiZWhhdmlvci5nZXRCZWhhdmlvclR5cGUoKSkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZWxzZQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyBib29sZWFuIGluY2x1ZGVQYWNrYWdlKEJlaGF2aW9yTWV0YSBiZWhhdmlvcikNCi0gICAgew0KLSAgICAgICAgaWYgKHBhY2thZ2VDb250YWlucyAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmIChNeWZhY2VzVXRpbHMuZ2V0UGFja2FnZUZyb21GdWxsQ2xhc3MoYmVoYXZpb3IuZ2V0Q2xhc3NOYW1lKCkpLnN0YXJ0c1dpdGgocGFja2FnZUNvbnRhaW5zKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlbHNlDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgfSAgICAgICAgDQotICAgIH0NCi0gICAgDQotICAgIA0KLSAgICAvKioNCi0gICAgICogR2VuZXJhdGVzIGEgcGFyc2VkIGJlaGF2aW9yLg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIGJlaGF2aW9yDQotICAgICAqICAgICAgICAgICAgdGhlIHBhcnNlZCBiZWhhdmlvciBtZXRhZGF0YQ0KLSAgICAgKi8NCi0gICAgcHJpdmF0ZSB2b2lkIF9nZW5lcmF0ZUJlaGF2aW9yKFZlbG9jaXR5RW5naW5lIHZlbG9jaXR5RW5naW5lLA0KLSAgICAgICAgICAgIEphdmFEb2NCdWlsZGVyIGJ1aWxkZXIsDQotICAgICAgICAgICAgQmVoYXZpb3JNZXRhIGJlaGF2aW9yLCBWZWxvY2l0eUNvbnRleHQgYmFzZUNvbnRleHQpDQotICAgICAgICAgICAgdGhyb3dzIE1vam9FeGVjdXRpb25FeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgQ29udGV4dCBjb250ZXh0ID0gbmV3IFZlbG9jaXR5Q29udGV4dChiYXNlQ29udGV4dCk7DQotICAgICAgICBjb250ZXh0LnB1dCgiY2xpZW50QmVoYXZpb3IiLCBiZWhhdmlvcik7DQotICAgICAgICANCi0gICAgICAgIFdyaXRlciB3cml0ZXIgPSBudWxsOw0KLSAgICAgICAgRmlsZSBvdXRGaWxlID0gbnVsbDsNCi0NCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIG91dEZpbGUgPSBuZXcgRmlsZShnZW5lcmF0ZWRTb3VyY2VEaXJlY3RvcnksIFN0cmluZ1V0aWxzLnJlcGxhY2UoDQotICAgICAgICAgICAgICAgICAgICBiZWhhdmlvci5nZXRDbGFzc05hbWUoKSwgIi4iLCAiLyIpKyIuamF2YSIpOw0KLQ0KLSAgICAgICAgICAgIGlmICggIW91dEZpbGUuZ2V0UGFyZW50RmlsZSgpLmV4aXN0cygpICkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIG91dEZpbGUuZ2V0UGFyZW50RmlsZSgpLm1rZGlycygpOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICB3cml0ZXIgPSBuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKG5ldyBGaWxlT3V0cHV0U3RyZWFtKG91dEZpbGUpKTsNCi0NCi0gICAgICAgICAgICBUZW1wbGF0ZSB0ZW1wbGF0ZSA9IHZlbG9jaXR5RW5naW5lLmdldFRlbXBsYXRlKF9nZXRUZW1wbGF0ZU5hbWUoKSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgdGVtcGxhdGUubWVyZ2UoY29udGV4dCwgd3JpdGVyKTsNCi0NCi0gICAgICAgICAgICB3cml0ZXIuZmx1c2goKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbigNCi0gICAgICAgICAgICAgICAgICAgICJFcnJvciBtZXJnaW5nIHZlbG9jaXR5IHRlbXBsYXRlczogIiArIGUuZ2V0TWVzc2FnZSgpLCBlKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGZpbmFsbHkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBJT1V0aWwuY2xvc2Uod3JpdGVyKTsNCi0gICAgICAgICAgICB3cml0ZXIgPSBudWxsOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgICAgICAgICAgICAgIA0KLSAgICBwcml2YXRlIFN0cmluZyBfZ2V0VGVtcGxhdGVOYW1lKCkNCi0gICAgew0KLSAgICAgICAgaWYgKHRlbXBsYXRlQ2xpZW50QmVoYXZpb3JOYW1lID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuICJjbGllbnRCZWhhdmlvckNsYXNzMjAudm0iOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiB0ZW1wbGF0ZUNsaWVudEJlaGF2aW9yTmFtZTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL01ha2VDb21wb25lbnRzTW9qby5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9NYWtlQ29tcG9uZW50c01vam8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDUwNzkwYi4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL01ha2VDb21wb25lbnRzTW9qby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjk1ICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5idWlsZGVyOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uV3JpdGVyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uQWJzdHJhY3RNb2pvOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLk1vam9FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wcm9qZWN0Lk1hdmVuUHJvamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmJ1aWxkZXIubW9kZWwuQ29tcG9uZW50TWV0YTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmJ1aWxkZXIubW9kZWwuTW9kZWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5idWlsZGVyLnV0aWxzLkJ1aWxkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uYnVpbGRlci51dGlscy5NYXZlblBsdWdpbkNvbnNvbGVMb2dTeXN0ZW07Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5idWlsZGVyLnV0aWxzLk15ZmFjZXNVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLnZlbG9jaXR5LlRlbXBsYXRlOwotaW1wb3J0IG9yZy5hcGFjaGUudmVsb2NpdHkuVmVsb2NpdHlDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUudmVsb2NpdHkuYXBwLlZlbG9jaXR5RW5naW5lOwotaW1wb3J0IG9yZy5hcGFjaGUudmVsb2NpdHkuY29udGV4dC5Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUudmVsb2NpdHkucnVudGltZS5SdW50aW1lQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMudXRpbC5JT1V0aWw7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy51dGlsLlN0cmluZ1V0aWxzOwotCi1pbXBvcnQgY29tLnRob3VnaHR3b3Jrcy5xZG94LkphdmFEb2NCdWlsZGVyOwotaW1wb3J0IGNvbS50aG91Z2h0d29ya3MucWRveC5tb2RlbC5BYnN0cmFjdEphdmFFbnRpdHk7Ci1pbXBvcnQgY29tLnRob3VnaHR3b3Jrcy5xZG94Lm1vZGVsLkFubm90YXRpb247Ci1pbXBvcnQgY29tLnRob3VnaHR3b3Jrcy5xZG94Lm1vZGVsLkRvY2xldFRhZzsKLWltcG9ydCBjb20udGhvdWdodHdvcmtzLnFkb3gubW9kZWwuSmF2YUNsYXNzOwotaW1wb3J0IGNvbS50aG91Z2h0d29ya3MucWRveC5tb2RlbC5KYXZhRmllbGQ7Ci1pbXBvcnQgY29tLnRob3VnaHR3b3Jrcy5xZG94Lm1vZGVsLkphdmFNZXRob2Q7Ci0KLS8qKgotICogTWF2ZW4gZ29hbCB0byBnZW5lcmF0ZSBqYXZhIHNvdXJjZSBjb2RlIGZvciBDb21wb25lbnQgY2xhc3Nlcy4KLSAqIAotICogPHA+SXQgdXNlcyB2ZWxvY2l0eSB0byBnZW5lcmF0ZSB0ZW1wbGF0ZXMsIGFuZCBoYXMgdGhlIG9wdGlvbiB0byBkZWZpbmUgY3VzdG9tIHRlbXBsYXRlcy48L3A+Ci0gKiA8cD5UaGUgZXhlY3V0ZWQgdGVtcGxhdGUgaGFzIHRoZSBmb2xsb3dpbmcgdmFyaWFibGVzIGF2YWlsYWJsZSB0byBpdDo8L3A+Ci0gKiA8dWw+Ci0gKiAgPGxpPnV0aWxzIDogUmV0dXJucyBhbiBpbnN0YW5jZSBvZiAKLSAqICBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmJ1aWxkZXIudXRpbHMuTXlmYWNlc1V0aWxzLCAKLSAqICBpdCBjb250YWlucyBzb21lIHVzZWZ1bCBtZXRob2RzLjwvbGk+Ci0gKiAgPGxpPmNvbXBvbmVudCA6IFJldHVybnMgdGhlIGN1cnJlbnQgaW5zdGFuY2Ugb2YKLSAqICAgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5idWlsZGVyLm1vZGVsLkNvbXBvbmVudE1ldGE8L2xpPgotICogIDxsaT5pbm5lcnNvdXJjZSA6IGNvZGUgdG8gYmUgaW5qZWN0ZWQgZnJvbSB0aGUgdGVtcGxhdGUgY2xhc3Mgd2hlbiB0ZW1wbGF0ZQotICogIG1vZGUgaXMgdXNlZDwvbGk+ICAKLSAqIDwvdWw+Ci0gKiAKLSAqIEB2ZXJzaW9uICRJZCQKLSAqIEByZXF1aXJlc0RlcGVuZGVuY3lSZXNvbHV0aW9uIGNvbXBpbGUKLSAqIEBnb2FsIG1ha2UtY29tcG9uZW50cwotICogQHBoYXNlIGdlbmVyYXRlLXNvdXJjZXMKLSAqLwotcHVibGljIGNsYXNzIE1ha2VDb21wb25lbnRzTW9qbyBleHRlbmRzIEFic3RyYWN0TW9qbwotewotICAgIC8qKgotICAgICAqIEluamVjdGVkIE1hdmVuIHByb2plY3QuCi0gICAgICogCi0gICAgICogQHBhcmFtZXRlciBleHByZXNzaW9uPSIke3Byb2plY3R9IgotICAgICAqIEByZWFkb25seQotICAgICAqLwotICAgIHByaXZhdGUgTWF2ZW5Qcm9qZWN0IHByb2plY3Q7Ci0KLSAgICAvKioKLSAgICAgKiBEZWZpbmVzIHRoZSBkaXJlY3Rvcnkgd2hlcmUgdGhlIG1ldGFkYXRhIGZpbGUgKE1FVEEtSU5GL215ZmFjZXMtbWV0YWRhdGEueG1sKSBpcyBsb2FkZWQuCi0gICAgICogCi0gICAgICogQHBhcmFtZXRlciBleHByZXNzaW9uPSIke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9nZW5lcmF0ZWQtcmVzb3VyY2VzL215ZmFjZXMtYnVpbGRlci1wbHVnaW4iCi0gICAgICovCi0gICAgcHJpdmF0ZSBGaWxlIGJ1aWxkRGlyZWN0b3J5OwotCi0gICAgLyoqCi0gICAgICogSW5qZWN0ZWQgbmFtZSBvZiBmaWxlIGdlbmVyYXRlZCBieSBlYXJsaWVyIHJ1biBvZiBCdWlsZE1ldGFEYXRhTW9qbyBnb2FsLgotICAgICAqIAotICAgICAqIEBwYXJhbWV0ZXIKLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBtZXRhZGF0YUZpbGUgPSAiTUVUQS1JTkYvbXlmYWNlcy1tZXRhZGF0YS54bWwiOwotCi0gICAgLyoqCi0gICAgICogVGhlIGRpcmVjdG9yeSB1c2VkIHRvIGxvYWQgdGVtcGxhdGVzIGludG8gdmVsb2NpdHkgZW52aXJvbm1lbnQuCi0gICAgICogCi0gICAgICogQHBhcmFtZXRlciBleHByZXNzaW9uPSJzcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYiCi0gICAgICovCi0gICAgcHJpdmF0ZSBGaWxlIHRlbXBsYXRlU291cmNlRGlyZWN0b3J5OwotCi0gICAgLyoqCi0gICAgICogVGhlIGRpcmVjdG9yeSB3aGVyZSBhbGwgZ2VuZXJhdGVkIGZpbGVzIGFyZSBjcmVhdGVkLiBUaGlzIGRpcmVjdG9yeSBpcyBhZGRlZCBhcyBhCi0gICAgICogY29tcGlsZSBzb3VyY2Ugcm9vdCBhdXRvbWF0aWNhbGx5IGxpa2Ugc3JjL21haW4vamF2YSBpcy4gCi0gICAgICogCi0gICAgICogQHBhcmFtZXRlciBleHByZXNzaW9uPSIke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9nZW5lcmF0ZWQtc291cmNlcy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luIgotICAgICAqLwotICAgIHByaXZhdGUgRmlsZSBnZW5lcmF0ZWRTb3VyY2VEaXJlY3Rvcnk7Ci0KLSAgICAvKioKLSAgICAgKiBHZW5lcmF0ZSBvbmx5IGNvbXBvbmVudCBjbGFzc2VzIHRoYXQgc3RhcnRzIHdpdGggdGhlIHNwZWNpZmllZCBwYWNrYWdlIHByZWZpeC4gCi0gICAgICogCi0gICAgICogQHBhcmFtZXRlcgotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIHBhY2thZ2VDb250YWluczsKLQotICAgIC8qKgotICAgICAqIEdlbmVyYXRlIG9ubHkgY29tcG9uZW50IGNsYXNzZXMgdGhhdCBzdGFydHMgd2l0aCB0aGUgc3BlY2lmaWVkIGNvbXBvbmVudCB0eXBlIHByZWZpeC4gCi0gICAgICogCi0gICAgICogQHBhcmFtZXRlcgotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIHR5cGVQcmVmaXg7Ci0KLSAgICAvKioKLSAgICAgKiAgTG9nIGFuZCBjb250aW51ZSBleGVjdXRpb24gd2hlbiBnZW5lcmF0aW5nIGNvbXBvbmVudCBjbGFzc2VzLgotICAgICAqICA8cD4KLSAgICAgKiAgSWYgdGhpcyBwcm9wZXJ0eSBpcyBzZXQgdG8gZmFsc2UgKGRlZmF1bHQpLCBlcnJvcnMgd2hlbiBhIGNvbXBvbmVudCBjbGFzcyBpcyBnZW5lcmF0ZWQgc3RvcHMKLSAgICAgKiAgZXhlY3V0aW9uIGltbWVkaWF0ZWx5LgotICAgICAqICA8L3A+Ci0gICAgICogCi0gICAgICogQHBhcmFtZXRlcgotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBmb3JjZTsKLQotICAgIC8qKgotICAgICAqIERlZmluZXMgdGhlIGpzZiB2ZXJzaW9uICgxLjEgb3IgMS4yKSwgdXNlZCB0byB0YWtlIHRoZSBkZWZhdWx0IHRlbXBsYXRlcyBmb3IgZWFjaCB2ZXJzaW9uLgotICAgICAqIDxwPiAKLSAgICAgKiBJZiB2ZXJzaW9uIGlzIDEuMSwgdGhlIGRlZmF1bHQgdGVtcGxhdGVDb21wb25lbnROYW1lIGlzICdjb21wb25lbnRDbGFzczExLnZtJywgaWYgdmVyc2lvbgotICAgICAqIGlzIDEuMiB0aGUgZGVmYXVsdCB0ZW1wbGF0ZUNvbXBvbmVudE5hbWUgaXMgJ2NvbXBvbmVudENsYXNzMTIudm0nLCBpZiB2ZXJzaW9uIGlzIDIuMCB0aGUKLSAgICAgKiBkZWZhdWx0IHRlbXBsYXRlQ29tcG9uZW50TmFtZSBpcyAnY29tcG9uZW50Q2xhc3MyMC52bScKLSAgICAgKiA8L3A+Ci0gICAgICogCi0gICAgICogQHBhcmFtZXRlcgotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIGpzZlZlcnNpb247Ci0gICAgCi0gICAgLyoqCi0gICAgICogRGVmaW5lIHRoZSBtb2RlbHMgdGhhdCBzaG91bGQgYmUgaW5jbHVkZWQgd2hlbiBnZW5lcmF0ZSBjb21wb25lbnQgY2xhc3Nlcy4gSWYgbm90IHNldCwgdGhlCi0gICAgICogY3VycmVudCBtb2RlbCBpZGVudGlmaWVkIGJ5IHRoZSBhcnRpZmFjdElkIGlzIHVzZWQuCi0gICAgICogPHA+Ci0gICAgICogRWFjaCBtb2RlbCBidWlsdCBieSBidWlsZC1tZXRhZGF0YSBnb2FsIGhhcyBhIG1vZGVsSWQsIHRoYXQgYnkgZGVmYXVsdCBpcyB0aGUgYXJ0aWZhY3RJZCBvZgotICAgICAqIHRoZSBwcm9qZWN0LiBTZXR0aW5nIHRoaXMgcHJvcGVydHkgZGVmaW5lcyB3aGljaCBvYmplY3RzIHRpZWQgaW4gYSBzcGVjaWZpZWQgbW9kZWxJZCBzaG91bGQKLSAgICAgKiBiZSB0YWtlbiBpbnRvIGFjY291bnQuICAKLSAgICAgKiA8L3A+Ci0gICAgICogPHA+SW4gdGhpcyBjYXNlLCBsaW1pdCBjb21wb25lbnQgZ2VuZXJhdGlvbiBvbmx5IHRvIHRoZSBjb21wb25lbnRzIGRlZmluZWQgaW4gdGhlIG1vZGVscyAKLSAgICAgKiBpZGVudGlmaWVkIGJ5IHRoZSBtb2RlbElkIGRlZmluZWQuIDwvcD4KLSAgICAgKiA8cD5UaGlzIGlzIHVzZWZ1bCB3aGVuIHlvdSBuZWVkIHRvIGdlbmVyYXRlIGZpbGVzIHRoYXQgdGFrZSBpbmZvcm1hdGlvbiBkZWZpbmVkIG9uIG90aGVyCi0gICAgICogcHJvamVjdHM8L3A+Ci0gICAgICogPHA+RXhhbXBsZTo8L3A+Ci0gICAgICogPHByZT4KLSAgICAgKiAgICAmbHQ7bW9kZWxJZHMmZ3Q7Ci0gICAgICogICAgICAgICZsdDttb2RlbElkPm1vZGVsMSZsdDsvbW9kZWxJZCZndDsKLSAgICAgKiAgICAgICAgJmx0O21vZGVsSWQ+bW9kZWwyJmx0Oy9tb2RlbElkJmd0OwotICAgICAqICAgICZsdDsvbW9kZWxJZHMmZ3Q7Ci0gICAgICogPC9wcmU+Ci0gICAgICogCi0gICAgICogQHBhcmFtZXRlcgotICAgICAqLwotICAgIHByaXZhdGUgTGlzdCBtb2RlbElkczsKLQotICAgIC8qKgotICAgICAqIFRoZSBuYW1lIG9mIHRoZSB0ZW1wbGF0ZSB1c2VkIHRvIGdlbmVyYXRlIGNvbXBvbmVudCBjbGFzc2VzLiBBY2NvcmRpbmcgdG8gdGhlIHZhbHVlIG9uIAotICAgICAqIGpzZlZlcnNpb24gcHJvcGVydHkgdGhlIGRlZmF1bHQgaWYgdGhpcyBwcm9wZXJ0eSBpcyBub3Qgc2V0IGNvdWxkIGJlIGNvbXBvbmVudENsYXNzMTEudm0gKDEuMSkgb3IKLSAgICAgKiBjb21wb25lbnRDbGFzczEyLnZtICgxLjIpCi0gICAgICogCi0gICAgICogQHBhcmFtZXRlciAKLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyB0ZW1wbGF0ZUNvbXBvbmVudE5hbWU7Ci0gICAgCi0gICAgLyoqCi0gICAgICogVGhpcyBwYXJhbSBpcyB1c2VkIHRvIHNlYXJjaCBpbiB0aGlzIGZvbGRlciBpZiBzb21lIGZpbGUgdG8KLSAgICAgKiBiZSBnZW5lcmF0ZWQgZXhpc3RzIGFuZCBhdm9pZCBnZW5lcmF0aW9uIGFuZCBkdXBsaWNhdGUgZXhjZXB0aW9uLgotICAgICAqIAotICAgICAqIEBwYXJhbWV0ZXIgZXhwcmVzc2lvbj0ic3JjL21haW4vamF2YSIKLSAgICAgKi8gICAgCi0gICAgcHJpdmF0ZSBGaWxlIG1haW5Tb3VyY2VEaXJlY3Rvcnk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogVGhpcyBwYXJhbSBpcyB1c2VkIHRvIHNlYXJjaCBpbiB0aGlzIGZvbGRlciBpZiBzb21lIGZpbGUgdG8KLSAgICAgKiBiZSBnZW5lcmF0ZWQgZXhpc3RzIGFuZCBhdm9pZCBnZW5lcmF0aW9uIGFuZCBkdXBsaWNhdGUgZXhjZXB0aW9uLgotICAgICAqIAotICAgICAqIEBwYXJhbWV0ZXIKLSAgICAgKi8gICAgICAgIAotICAgIHByaXZhdGUgRmlsZSBtYWluU291cmNlRGlyZWN0b3J5MjsKLQotICAgIC8qKgotICAgICAqIEV4ZWN1dGUgdGhlIE1vam8uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uCi0gICAgewotICAgICAgICAvLyBUaGlzIGNvbW1hbmQgbWFrZXMgTWF2ZW4gY29tcGlsZSB0aGUgZ2VuZXJhdGVkIHNvdXJjZToKLSAgICAgICAgLy8gZ2V0UHJvamVjdCgpLmFkZENvbXBpbGVTb3VyY2VSb290KCBhYnNvbHV0ZUdlbmVyYXRlZFBhdGguZ2V0UGF0aCgpICk7Ci0gICAgICAgIAotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgcHJvamVjdC5hZGRDb21waWxlU291cmNlUm9vdCggZ2VuZXJhdGVkU291cmNlRGlyZWN0b3J5LmdldENhbm9uaWNhbFBhdGgoKSApOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAobW9kZWxJZHMgPT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBtb2RlbElkcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgICAgICAgICBtb2RlbElkcy5hZGQocHJvamVjdC5nZXRBcnRpZmFjdElkKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgTW9kZWwgbW9kZWwgPSBJT1V0aWxzLmxvYWRNb2RlbChuZXcgRmlsZShidWlsZERpcmVjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGFGaWxlKSk7Ci0gICAgICAgICAgICBuZXcgRmxhdHRlbmVyKG1vZGVsKS5mbGF0dGVuKCk7Ci0gICAgICAgICAgICBnZW5lcmF0ZUNvbXBvbmVudHMobW9kZWwpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbigiRXJyb3IgZ2VuZXJhdGluZyBjb21wb25lbnRzIiwgZSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uKCJFcnJvciBnZW5lcmF0aW5nIGNvbXBvbmVudHMiLCBlKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAKLSAgICBwcml2YXRlIFZlbG9jaXR5RW5naW5lIGluaXRWZWxvY2l0eSgpIHRocm93cyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uCi0gICAgewotICAgICAgICBGaWxlIHRlbXBsYXRlID0gbmV3IEZpbGUodGVtcGxhdGVTb3VyY2VEaXJlY3RvcnksIF9nZXRUZW1wbGF0ZU5hbWUoKSk7Ci0gICAgICAgIAotICAgICAgICBpZiAodGVtcGxhdGUuZXhpc3RzKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldExvZygpLmluZm8oIlVzaW5nIHRlbXBsYXRlIGZyb20gZmlsZSBsb2FkZXI6ICIrdGVtcGxhdGUuZ2V0UGF0aCgpKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldExvZygpLmluZm8oIlVzaW5nIHRlbXBsYXRlIGZyb20gY2xhc3MgbG9hZGVyOiBNRVRBLUlORi8iK19nZXRUZW1wbGF0ZU5hbWUoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgVmVsb2NpdHlFbmdpbmUgdmVsb2NpdHlFbmdpbmUgPSBudWxsOwotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgdmVsb2NpdHlFbmdpbmUgPSBuZXcgVmVsb2NpdHlFbmdpbmUoKTsKLSAgICAgICAgICAgIHZlbG9jaXR5RW5naW5lLnNldFByb3BlcnR5KCAicmVzb3VyY2UubG9hZGVyIiwgImZpbGUsIGNsYXNzIiApOwotICAgICAgICAgICAgdmVsb2NpdHlFbmdpbmUuc2V0UHJvcGVydHkoICJmaWxlLnJlc291cmNlLmxvYWRlci5jbGFzcyIsCi0gICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLnZlbG9jaXR5LnJ1bnRpbWUucmVzb3VyY2UubG9hZGVyLkZpbGVSZXNvdXJjZUxvYWRlciIpOwotICAgICAgICAgICAgdmVsb2NpdHlFbmdpbmUuc2V0UHJvcGVydHkoICJmaWxlLnJlc291cmNlLmxvYWRlci5wYXRoIiwgdGVtcGxhdGVTb3VyY2VEaXJlY3RvcnkuZ2V0UGF0aCgpKTsKLSAgICAgICAgICAgIHZlbG9jaXR5RW5naW5lLnNldFByb3BlcnR5KCAiY2xhc3MucmVzb3VyY2UubG9hZGVyLmNsYXNzIiwKLSAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uYnVpbGRlci51dGlscy5SZWxhdGl2ZUNsYXNzcGF0aFJlc291cmNlTG9hZGVyIiApOwotICAgICAgICAgICAgdmVsb2NpdHlFbmdpbmUuc2V0UHJvcGVydHkoICJjbGFzcy5yZXNvdXJjZS5sb2FkZXIucGF0aCIsICJNRVRBLUlORiIpOyAgICAgICAgICAgIAotICAgICAgICAgICAgdmVsb2NpdHlFbmdpbmUuc2V0UHJvcGVydHkoICJ2ZWxvY2ltYWNyby5saWJyYXJ5IiwgImNvbXBvbmVudENsYXNzTWFjcm9zMTEudm0iKTsKLSAgICAgICAgICAgIHZlbG9jaXR5RW5naW5lLnNldFByb3BlcnR5KCAidmVsb2NpbWFjcm8ucGVybWlzc2lvbnMuYWxsb3cuaW5saW5lIiwidHJ1ZSIpOwotICAgICAgICAgICAgdmVsb2NpdHlFbmdpbmUuc2V0UHJvcGVydHkoICJ2ZWxvY2ltYWNyby5wZXJtaXNzaW9ucy5hbGxvdy5pbmxpbmUubG9jYWwuc2NvcGUiLCAidHJ1ZSIpOwotICAgICAgICAgICAgdmVsb2NpdHlFbmdpbmUuc2V0UHJvcGVydHkoICJkaXJlY3RpdmUuZm9yZWFjaC5jb3VudGVyLmluaXRpYWwudmFsdWUiLCIwIik7Ci0gICAgICAgICAgICAvL3ZlbG9jaXR5RW5naW5lLnNldFByb3BlcnR5KCBSdW50aW1lQ29uc3RhbnRzLlJVTlRJTUVfTE9HX0xPR1NZU1RFTV9DTEFTUywKLSAgICAgICAgICAgIC8vICAgICJvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmJ1aWxkZXIudXRpbHMuQ29uc29sZUxvZ1N5c3RlbSIgKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgdmVsb2NpdHlFbmdpbmUuc2V0UHJvcGVydHkoUnVudGltZUNvbnN0YW50cy5SVU5USU1FX0xPR19MT0dTWVNURU0sCi0gICAgICAgICAgICAgICAgICAgIG5ldyBNYXZlblBsdWdpbkNvbnNvbGVMb2dTeXN0ZW0odGhpcy5nZXRMb2coKSkpOwotICAgICAgICAgICAgdmVsb2NpdHlFbmdpbmUuaW5pdCgpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IE1vam9FeGVjdXRpb25FeGNlcHRpb24oIkVycm9yIGNyZWF0aW5nIFZlbG9jaXR5RW5naW5lIiwgZSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiB2ZWxvY2l0eUVuZ2luZTsKLSAgICB9Ci0gICAgCi0KLSAgICAvKioKLSAgICAgKiBHZW5lcmF0ZXMgcGFyc2VkIGNvbXBvbmVudHMuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGdlbmVyYXRlQ29tcG9uZW50cyhNb2RlbCBtb2RlbCkgdGhyb3dzIElPRXhjZXB0aW9uLAotICAgICAgICAgICAgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgLy8gTWFrZSBzdXJlIGdlbmVyYXRlZCBzb3VyY2UgZGlyZWN0b3J5IAotICAgICAgICAvLyBpcyBhZGRlZCB0byBjb21waWxhdGlvbiBzb3VyY2UgcGF0aCAKLSAgICAgICAgLy9wcm9qZWN0LmFkZENvbXBpbGVTb3VyY2VSb290KGdlbmVyYXRlZFNvdXJjZURpcmVjdG9yeS5nZXRDYW5vbmljYWxQYXRoKCkpOwotICAgICAgICAKLSAgICAgICAgLy9Jbml0IFFkb3ggZm9yIGV4dHJhY3QgY29kZSAKLSAgICAgICAgSmF2YURvY0J1aWxkZXIgYnVpbGRlciA9IG5ldyBKYXZhRG9jQnVpbGRlcigpOwotICAgICAgICAKLSAgICAgICAgTGlzdCBzb3VyY2VEaXJzID0gcHJvamVjdC5nZXRDb21waWxlU291cmNlUm9vdHMoKTsKLSAgICAgICAgCi0gICAgICAgIC8vIG5lZWQgYSBGaWxlIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIG9yaWdpbmFsIHNvdXJjZSB0cmVlCi0gICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IHNvdXJjZURpcnMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmcgc3JjRGlyID0gKFN0cmluZykgaS5uZXh0KCk7Ci0gICAgICAgICAgICBidWlsZGVyLmFkZFNvdXJjZVRyZWUobmV3IEZpbGUoc3JjRGlyKSk7Ci0gICAgICAgIH0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgLy9Jbml0IHZlbG9jaXR5Ci0gICAgICAgIFZlbG9jaXR5RW5naW5lIHZlbG9jaXR5RW5naW5lID0gaW5pdFZlbG9jaXR5KCk7Ci0KLSAgICAgICAgVmVsb2NpdHlDb250ZXh0IGJhc2VDb250ZXh0ID0gbmV3IFZlbG9jaXR5Q29udGV4dCgpOwotICAgICAgICBiYXNlQ29udGV4dC5wdXQoInV0aWxzIiwgbmV3IE15ZmFjZXNVdGlscygpKTsKLSAgICAgICAgCi0gICAgICAgIGZvciAoSXRlcmF0b3IgaXQgPSBtb2RlbC5nZXRDb21wb25lbnRzKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykKLSAgICAgICAgewotICAgICAgICAgICAgQ29tcG9uZW50TWV0YSBjb21wb25lbnQgPSAoQ29tcG9uZW50TWV0YSkgaXQubmV4dCgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoY29tcG9uZW50LmdldENsYXNzTmFtZSgpICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgRmlsZSBmID0gbmV3IEZpbGUobWFpblNvdXJjZURpcmVjdG9yeSwgU3RyaW5nVXRpbHMucmVwbGFjZSgKLSAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50LmdldENsYXNzTmFtZSgpLCAiLiIsICIvIikrIi5qYXZhIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmICghZi5leGlzdHMoKSAmJiBjYW5HZW5lcmF0ZUNvbXBvbmVudChjb21wb25lbnQpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1haW5Tb3VyY2VEaXJlY3RvcnkyICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEZpbGUgZjIgPSBuZXcgRmlsZShtYWluU291cmNlRGlyZWN0b3J5MiwgU3RyaW5nVXRpbHMucmVwbGFjZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50LmdldENsYXNzTmFtZSgpLCAiLiIsICIvIikrIi5qYXZhIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZjIuZXhpc3RzKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9Ta2lwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZ2V0TG9nKCkuaW5mbygiR2VuZXJhdGluZyBjb21wb25lbnQgY2xhc3M6Iitjb21wb25lbnQuZ2V0Q2xhc3NOYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgdHJ5IAotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBfZ2VuZXJhdGVDb21wb25lbnQodmVsb2NpdHlFbmdpbmUsIGJ1aWxkZXIsY29tcG9uZW50LGJhc2VDb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBjYXRjaChNb2pvRXhlY3V0aW9uRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmb3JjZSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRMb2coKS5lcnJvcihlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9TdG9wIGV4ZWN1dGlvbiB0aHJvd2luZyBleGNlcHRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9ICAgICAgICAKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGJvb2xlYW4gY2FuR2VuZXJhdGVDb21wb25lbnQoQ29tcG9uZW50TWV0YSBjb21wb25lbnQpCi0gICAgewotICAgICAgICBpZiAoIG1vZGVsSWRzLmNvbnRhaW5zKGNvbXBvbmVudC5nZXRNb2RlbElkKCkpCi0gICAgICAgICAgICAgICAgJiYgaW5jbHVkZVBhY2thZ2UoY29tcG9uZW50KQotICAgICAgICAgICAgICAgICYmIGluY2x1ZGVUeXBlKGNvbXBvbmVudCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBib29sZWFuIGluY2x1ZGVQYWNrYWdlKENvbXBvbmVudE1ldGEgY29tcG9uZW50KQotICAgIHsKLSAgICAgICAgaWYgKHBhY2thZ2VDb250YWlucyAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoTXlmYWNlc1V0aWxzLmdldFBhY2thZ2VGcm9tRnVsbENsYXNzKGNvbXBvbmVudC5nZXRDbGFzc05hbWUoKSkuc3RhcnRzV2l0aChwYWNrYWdlQ29udGFpbnMpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9ICAgICAgICAKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpbmNsdWRlVHlwZShDb21wb25lbnRNZXRhIGNvbXBvbmVudCkKLSAgICB7Ci0gICAgICAgIGlmICh0eXBlUHJlZml4ICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChjb21wb25lbnQuZ2V0VHlwZSgpLnN0YXJ0c1dpdGgodHlwZVByZWZpeCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0gICAgICAgIAotICAgIH0KLSAgICAKLSAgICAKLSAgICAvKioKLSAgICAgKiBHZW5lcmF0ZXMgYSBwYXJzZWQgY29tcG9uZW50LgotICAgICAqIAotICAgICAqIEBwYXJhbSBjb21wb25lbnQKLSAgICAgKiAgICAgICAgICAgIHRoZSBwYXJzZWQgY29tcG9uZW50IG1ldGFkYXRhCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIF9nZW5lcmF0ZUNvbXBvbmVudChWZWxvY2l0eUVuZ2luZSB2ZWxvY2l0eUVuZ2luZSwKLSAgICAgICAgICAgIEphdmFEb2NCdWlsZGVyIGJ1aWxkZXIsCi0gICAgICAgICAgICBDb21wb25lbnRNZXRhIGNvbXBvbmVudCwgVmVsb2NpdHlDb250ZXh0IGJhc2VDb250ZXh0KQotICAgICAgICAgICAgdGhyb3dzIE1vam9FeGVjdXRpb25FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIENvbnRleHQgY29udGV4dCA9IG5ldyBWZWxvY2l0eUNvbnRleHQoYmFzZUNvbnRleHQpOwotICAgICAgICBjb250ZXh0LnB1dCgiY29tcG9uZW50IiwgY29tcG9uZW50KTsKLQotICAgICAgICBpZiAoQm9vbGVhbi5UUlVFLmVxdWFscyhjb21wb25lbnQuaXNUZW1wbGF0ZSgpKSkKLSAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIHNvdXJjZSA9IHRoaXMuZ2V0SW5uZXJTb3VyY2VDb2RlKGJ1aWxkZXIsIGNvbXBvbmVudCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChzb3VyY2UgIT0gbnVsbCAmJiAhIiIuZXF1YWxzKHNvdXJjZSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY29udGV4dC5wdXQoImlubmVyc291cmNlIiwgc291cmNlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSAgICAgICAgCi0gICAgICAgIAotICAgICAgICBXcml0ZXIgd3JpdGVyID0gbnVsbDsKLSAgICAgICAgRmlsZSBvdXRGaWxlID0gbnVsbDsKLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgb3V0RmlsZSA9IG5ldyBGaWxlKGdlbmVyYXRlZFNvdXJjZURpcmVjdG9yeSwgU3RyaW5nVXRpbHMucmVwbGFjZSgKLSAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50LmdldENsYXNzTmFtZSgpLCAiLiIsICIvIikrIi5qYXZhIik7Ci0KLSAgICAgICAgICAgIGlmICggIW91dEZpbGUuZ2V0UGFyZW50RmlsZSgpLmV4aXN0cygpICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBvdXRGaWxlLmdldFBhcmVudEZpbGUoKS5ta2RpcnMoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgd3JpdGVyID0gbmV3IE91dHB1dFN0cmVhbVdyaXRlcihuZXcgRmlsZU91dHB1dFN0cmVhbShvdXRGaWxlKSk7Ci0KLSAgICAgICAgICAgIFRlbXBsYXRlIHRlbXBsYXRlID0gdmVsb2NpdHlFbmdpbmUuZ2V0VGVtcGxhdGUoX2dldFRlbXBsYXRlTmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgdGVtcGxhdGUubWVyZ2UoY29udGV4dCwgd3JpdGVyKTsKLQotICAgICAgICAgICAgd3JpdGVyLmZsdXNoKCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgIkVycm9yIG1lcmdpbmcgdmVsb2NpdHkgdGVtcGxhdGVzOiAiICsgZS5nZXRNZXNzYWdlKCksIGUpOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsbHkKLSAgICAgICAgewotICAgICAgICAgICAgSU9VdGlsLmNsb3NlKHdyaXRlcik7Ci0gICAgICAgICAgICB3cml0ZXIgPSBudWxsOwotICAgICAgICB9Ci0gICAgfQotICAgICAgICAKLSAgICAvKioKLSAgICAgKiBUaGlzIG1ldGhvZCBleHRyYWN0IGZyb20gY29tcG9uZW50IHNjYW5uZWQgc291cmNlQ2xhc3MsIHRoZSBwYXJ0cwotICAgICAqIHdoaWNoIHdlIG5lZWQgdG8gbW92ZSB0byBnZW5lcmF0ZWQgY2xhc3MgYXMgYSBzaW5nbGUgU3RyaW5nIHVzaW5nIFFkb3guCi0gICAgICogCi0gICAgICogSWdub3JlIGNvZGUgdGhhdCBoYXMgYSBcQEpTRkV4Y2x1ZGUgb3IgXEBKU0ZQcm9wZXJ0eSBEb2NsZXQgb3IgQW5ub3RhdGlvbgotICAgICAqIAotICAgICAqIEBwYXJhbSBjb21wb25lbnQKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0SW5uZXJTb3VyY2VDb2RlKEphdmFEb2NCdWlsZGVyIGJ1aWxkZXIsIENvbXBvbmVudE1ldGEgY29tcG9uZW50KQotICAgIHsgICAKLSAgICAgICAgU3RyaW5nV3JpdGVyIHdyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLSAgICAgICAgCi0gICAgICAgIEphdmFDbGFzcyBzb3VyY2VDbGFzcyA9IGJ1aWxkZXIuZ2V0Q2xhc3NCeU5hbWUoY29tcG9uZW50LmdldFNvdXJjZUNsYXNzTmFtZSgpKTsKLSAgICAgICAgCi0gICAgICAgIEphdmFGaWVsZCBbXSBmaWVsZHMgPSBzb3VyY2VDbGFzcy5nZXRGaWVsZHMoKTsKLQotICAgICAgICAvL0luY2x1ZGUgdGhlIGZpZWxkcyBkZWZpbmVkCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmllbGRzLmxlbmd0aDsgaSsrKQotICAgICAgICB7ICAgICAgICAgICAgCi0gICAgICAgICAgICBKYXZhRmllbGQgZmllbGQgPSBmaWVsZHNbaV07Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIERvY2xldFRhZyB0YWcgPSBmaWVsZC5nZXRUYWdCeU5hbWUoIkpTRkV4Y2x1ZGUiKTsKLSAgICAgICAgICAgIEFubm90YXRpb24gYW5ubyA9IGdldEFubm90YXRpb24oZmllbGQsICJKU0ZFeGNsdWRlIik7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmICghKHRhZyA9PSBudWxsICYmIGFubm8gPT0gbnVsbCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIGlmICghaXNFeGNsdWRlZEZpZWxkKGZpZWxkLmdldE5hbWUoKSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlKCIgICAgIik7Ci0gICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlKGZpZWxkLmdldERlY2xhcmF0aW9uU2lnbmF0dXJlKHRydWUpKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgaW5pdEV4cHIgPSBmaWVsZC5nZXRJbml0aWFsaXphdGlvbkV4cHJlc3Npb24oKTsKLSAgICAgICAgICAgICAgICBpbml0RXhwciA9IGNsZWFuSW5pdGlhbGl6YXRpb25FeHByZXNzaW9uKGluaXRFeHByKTsKLSAgICAgICAgICAgICAgICBpZiAoaW5pdEV4cHIgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZSgiID0gIik7Ci0gICAgICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZShpbml0RXhwcik7Ci0gICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGUoJzsnKTsKLSAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGUoJ1xuJyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIEphdmFNZXRob2QgW10gbWV0aG9kcyA9IHNvdXJjZUNsYXNzLmdldE1ldGhvZHMoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtZXRob2RzLmxlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBKYXZhTWV0aG9kIG1ldGhvZCA9IG1ldGhvZHNbaV07Ci0KLSAgICAgICAgICAgIERvY2xldFRhZyB0YWcgPSBtZXRob2QuZ2V0VGFnQnlOYW1lKCJKU0ZFeGNsdWRlIik7Ci0gICAgICAgICAgICBBbm5vdGF0aW9uIGFubm8gPSBnZXRBbm5vdGF0aW9uKG1ldGhvZCwgIkpTRkV4Y2x1ZGUiKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKCEodGFnID09IG51bGwgJiYgYW5ubyA9PSBudWxsKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgdGFnID0gbWV0aG9kLmdldFRhZ0J5TmFtZSgiSlNGUHJvcGVydHkiLCBmYWxzZSk7Ci0gICAgICAgICAgICBhbm5vID0gZ2V0QW5ub3RhdGlvbihtZXRob2QsICJKU0ZQcm9wZXJ0eSIpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoICh0YWcgPT0gbnVsbCAmJiBhbm5vID09IG51bGwpIHx8ICFtZXRob2QuaXNBYnN0cmFjdCgpKQotICAgICAgICAgICAgeyAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLy9HZXQgZGVjbGFyYXRpb24gc2lnbmF0dXJlIGluIGEgd2F5IHRoYXQgd2UgZG9uJ3QgbmVlZAotICAgICAgICAgICAgICAgIC8vdG8gZGVjbGFyZSBpbXBvcnRzLgotICAgICAgICAgICAgICAgIFN0cmluZyBkZWNsYXJhdGlvbiA9IG1ldGhvZC5nZXREZWNsYXJhdGlvblNpZ25hdHVyZSh0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlKCIgICAgIik7Ci0gICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlKGRlY2xhcmF0aW9uKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgc291cmNlQ29kZSA9IG1ldGhvZC5nZXRTb3VyY2VDb2RlKCk7Ci0gICAgICAgICAgICAgICAgaWYoc291cmNlQ29kZSAhPSBudWxsICYmIHNvdXJjZUNvZGUubGVuZ3RoKCkgPiAwKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlKCdcbicpOwotICAgICAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGUoIiAgICAiKTsKLSAgICAgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlKCd7Jyk7Ci0gICAgICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZShtZXRob2QuZ2V0U291cmNlQ29kZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlKCd9Jyk7Ci0gICAgICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZSgnXG4nKTsKLSAgICAgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlKCdcbicpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGUoJzsnKTsKLSAgICAgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlKCdcbicpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgIHJldHVybiB3cml0ZXIudG9TdHJpbmcoKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzRXhjbHVkZWRGaWVsZChTdHJpbmcgbmFtZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiAobmFtZS5lcXVhbHMoIkNPTVBPTkVOVF9UWVBFIikgfHwgCi0gICAgICAgICAgICAgICAgbmFtZS5lcXVhbHMoIkRFRkFVTFRfUkVOREVSRVJfVFlQRSIpIHx8Ci0gICAgICAgICAgICAgICAgbmFtZS5lcXVhbHMoIkNPTVBPTkVOVF9GQU1JTFkiKSApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENsZWFuIHVwIGEgZmllbGQgaW5pdGlhbGlzYXRpb24gZXhwcmVzc2lvbiByZXR1cm5lZCBieSBxZG94LgotICAgICAqIDxwPgotICAgICAqIFdoZW4gYSBjbGFzcyBoYXMgImludCBmb28gPSAxOyIgdGhlbiB0aGUgaW5pdGlhbGlzYXRpb24gZXhwcmVzc2lvbgotICAgICAqIGlzIHRoZSBiaXQgYWZ0ZXIgdGhlIGVxdWFscyBzaWduLiBVbmZvcnR1bmF0ZWx5IHFkb3ggdGVuZHMgdG8gcmV0dXJuCi0gICAgICogYSBsb3Qgb2YgZ2FyYmFnZSBzdHVmZiBpbiB0aGVyZS4gSW4gcGFydGljdWxhciwgaWYgdGhlcmUgaXMgbm8KLSAgICAgKiBpbml0aWFsaXNhdGlvbiBleHByZXNzaW9uLCB0aGVuIHFkb3ggY2FuIHJldHVybiBhIHN0cmluZyB3aXRoCi0gICAgICogd2hpdGVzcGFjZSAobm90IGEgbnVsbCBvciBlbXB0eSBzdHJpbmcpLiAKLSAgICAgKiA8cD4KLSAgICAgKiBJbiBhZGRpdGlvbiwgaWYgdGhlcmUgYXJlIGNvbW1lbnRzICpiZWZvcmUqIGEgZmllbGQgZGVjbGFyYXRpb24sCi0gICAgICogdGhleSBhcHBlYXIgaW5zaWRlIHRoZSBpbml0aWFsaXNhdGlvbiB0ZXh0ICh0aGlzIGlzIGp1c3QgYnJva2VuCi0gICAgICogYmVoYXZpb3VyIGluIHFkb3gpLiBJZGVhbGx5IHdlIHdvdWxkIG1vdmUgdGhlbSB0byBhYm92ZSB0aGUgZmllbGQKLSAgICAgKiBkZWNsYXJhdGlvbiB3aGVyZSB0aGV5IGJlbG9uZy4gSG93ZXZlciB0aGF0IGlzIGNvbXBsaWNhdGVkIGFuZAotICAgICAqIGZyYWdpbGUsIHNvIHdlIGp1c3QgZGlzY2FyZCB0aGVtIGhlcmUuCi0gICAgICovCi0gICAgc3RhdGljIFN0cmluZyBjbGVhbkluaXRpYWxpemF0aW9uRXhwcmVzc2lvbihTdHJpbmcgZXhwcikKLSAgICB7Ci0gICAgICAgIGV4cHIgPSBTdHJpbmdVdGlscy50cmltKGV4cHIpOwotICAgICAgICBpZiAoU3RyaW5nVXRpbHMuaXNFbXB0eShleHByKSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vIHNwbGl0IG9uIGxpbmVmZWVkcwotICAgICAgICAvLyB0cmltIGVhY2ggc2VwYXJhdGVseQotICAgICAgICAvLyByZW1vdmUgYW55IGNvbW1lbnQgY2hhcnMKLSAgICAgICAgCi0gICAgICAgIGlmIChleHByLmluZGV4T2YoIlxuIikgPiAtMSkKLSAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoMTAwKTsKLSAgICAgICAgICAgIFN0cmluZ1tdIGxpbmVzID0gU3RyaW5nVXRpbHMuc3BsaXQoZXhwciwgIlxuIik7Ci0gICAgICAgICAgICBmb3IoaW50IGk9MDsgaTxsaW5lcy5sZW5ndGg7ICsraSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgbGluZSA9IGxpbmVzW2ldOwotICAgICAgICAgICAgICAgIGxpbmUgPSBTdHJpbmdVdGlscy50cmltKGxpbmUpOwotICAgICAgICAgICAgICAgIGlmICghbGluZS5zdGFydHNXaXRoKCIvLyIpICYmICFTdHJpbmdVdGlscy5pc0VtcHR5KGxpbmUpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGJ1Zi5sZW5ndGgoKT4gMCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgYnVmLmFwcGVuZCgiICIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQobGluZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBleHByID0gYnVmLnRvU3RyaW5nKCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGlmIChleHByLnN0YXJ0c1dpdGgoIi8vIikpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKFN0cmluZ1V0aWxzLmlzRW1wdHkoZXhwcikpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGV4cHI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVE9ETzogQ29waWVkIGZyb20gUWRveE1vZGVsQnVpbGRlciEKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZW50aXR5Ci0gICAgICogQHBhcmFtIGFubm9OYW1lCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHByaXZhdGUgQW5ub3RhdGlvbiBnZXRBbm5vdGF0aW9uKEFic3RyYWN0SmF2YUVudGl0eSBlbnRpdHksIFN0cmluZyBhbm5vTmFtZSkKLSAgICB7Ci0gICAgICAgIEFubm90YXRpb25bXSBhbm5vcyA9IGVudGl0eS5nZXRBbm5vdGF0aW9ucygpOwotICAgICAgICBpZiAoYW5ub3MgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gU3RyaW5nIHdhbnRlZCA9IEFOTk9UQVRJT05fQkFTRSArICIuIiArIGFubm9OYW1lOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFubm9zLmxlbmd0aDsgKytpKQotICAgICAgICB7Ci0gICAgICAgICAgICBBbm5vdGF0aW9uIHRoaXNBbm5vID0gYW5ub3NbaV07Ci0gICAgICAgICAgICAvLyBJZGVhbGx5LCBoZXJlIHdlIHdvdWxkIGNoZWNrIHdoZXRoZXIgdGhlIGZ1bGx5LXF1YWxpZmllZCBuYW1lIG9mCi0gICAgICAgICAgICAvLyB0aGUgYW5ub3RhdGlvbgotICAgICAgICAgICAgLy8gY2xhc3MgbWF0Y2hlcyBBTk5PVEFUSU9OX0JBU0UgKyAiLiIgKyBhbm5vTmFtZS4gSG93ZXZlciBpdAotICAgICAgICAgICAgLy8gYXBwZWFycyB0aGF0IHFkb3ggMS42LjMKLSAgICAgICAgICAgIC8vIGRvZXMgbm90IGNvcnJlY3RseSBleHBhbmQgQEZvbyB1c2luZyB0aGUgY2xhc3MgaW1wb3J0IHN0YXRlbWVudHM7Ci0gICAgICAgICAgICAvLyBtZXRob2QKLSAgICAgICAgICAgIC8vIEFubm90YXRpb24uZ2V0VHlwZS5nZXRKYXZhQ2xhc3MuZ2V0RnVsbHlRdWFsaWZpZWROYW1lIHN0aWxsIGp1c3QKLSAgICAgICAgICAgIC8vIHJldHVybnMgdGhlIHNob3J0Ci0gICAgICAgICAgICAvLyBjbGFzcyBuYW1lLiBTbyBmb3Igbm93LCBqdXN0IGNoZWNrIGZvciB0aGUgc2hvcnQgbmFtZS4KLSAgICAgICAgICAgIFN0cmluZyB0aGlzQW5ub05hbWUgPSB0aGlzQW5uby5nZXRUeXBlKCkuZ2V0SmF2YUNsYXNzKCkuZ2V0TmFtZSgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvL01ha2Ugc2hvcnQgbmFtZSBmb3IgcmVjb2duaXppbmcsIGlmIHJldHVybnMgbG9uZwotICAgICAgICAgICAgaW50IGNvbnRhaW5zUG9pbnQgPSB0aGlzQW5ub05hbWUubGFzdEluZGV4T2YoJy4nKTsKLSAgICAgICAgICAgIGlmIChjb250YWluc1BvaW50ICE9IC0xKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRoaXNBbm5vTmFtZSA9IHRoaXNBbm5vTmFtZS5zdWJzdHJpbmcoY29udGFpbnNQb2ludCsxKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICh0aGlzQW5ub05hbWUuZXF1YWxzKGFubm9OYW1lKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdGhpc0Fubm87Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfSAgICAKLQotICAgIHByaXZhdGUgU3RyaW5nIF9nZXRUZW1wbGF0ZU5hbWUoKQotICAgIHsKLSAgICAgICAgaWYgKHRlbXBsYXRlQ29tcG9uZW50TmFtZSA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoX2lzMjAoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gImNvbXBvbmVudENsYXNzMjAudm0iOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoX2lzMTIoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gImNvbXBvbmVudENsYXNzMTIudm0iOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiAiY29tcG9uZW50Q2xhc3MxMS52bSI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gdGVtcGxhdGVDb21wb25lbnROYW1lOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgYm9vbGVhbiBfaXMxMigpCi0gICAgewotICAgICAgICByZXR1cm4gIjEuMiIuZXF1YWxzKGpzZlZlcnNpb24pIHx8ICIxMiIuZXF1YWxzKGpzZlZlcnNpb24pOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIGJvb2xlYW4gX2lzMjAoKQotICAgIHsKLSAgICAgICAgcmV0dXJuICIyLjAiLmVxdWFscyhqc2ZWZXJzaW9uKSB8fCAiMjAiLmVxdWFscyhqc2ZWZXJzaW9uKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL01ha2VDb25maWdNb2pvLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL01ha2VDb25maWdNb2pvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4NDkyMWUuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9NYWtlQ29uZmlnTW9qby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcyICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5idWlsZGVyOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbVdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKLWltcG9ydCBqYXZhLmlvLldyaXRlcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uQWJzdHJhY3RNb2pvOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLk1vam9FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wcm9qZWN0Lk1hdmVuUHJvamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmJ1aWxkZXIubW9kZWwuTW9kZWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5idWlsZGVyLnV0aWxzLkJ1aWxkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uYnVpbGRlci51dGlscy5NYXZlblBsdWdpbkNvbnNvbGVMb2dTeXN0ZW07Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5idWlsZGVyLnV0aWxzLk15ZmFjZXNVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLnZlbG9jaXR5LlRlbXBsYXRlOwotaW1wb3J0IG9yZy5hcGFjaGUudmVsb2NpdHkuVmVsb2NpdHlDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUudmVsb2NpdHkuYXBwLlZlbG9jaXR5RW5naW5lOwotaW1wb3J0IG9yZy5hcGFjaGUudmVsb2NpdHkuZXhjZXB0aW9uLlBhcnNlRXJyb3JFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS52ZWxvY2l0eS5leGNlcHRpb24uUmVzb3VyY2VOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnZlbG9jaXR5LnJ1bnRpbWUuUnVudGltZUNvbnN0YW50czsKLWltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLnV0aWwuSU9VdGlsOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMudXRpbC54bWwuWHBwM0RvbTsKLWltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLnV0aWwueG1sLlhwcDNEb21CdWlsZGVyOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMudXRpbC54bWwuWHBwM0RvbVdyaXRlcjsKLWltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLnV0aWwueG1sLnB1bGwuWG1sUHVsbFBhcnNlckV4Y2VwdGlvbjsKLQotLyoqCi0gKiBDcmVhdGVzIHRhZ2xpYiAodGxkKSBhbmQgZmFjZXMtY29uZmlnIGZpbGVzLgotICogPHA+Ci0gKiBUaGlzIE1vam8gYWN0dWFsbHkgcHJvdmlkZXMgYSBnZW5lcmljIGdvYWwgdGhhdCB3aWxsIHJ1biBhIGNvbmZpZ3VyYWJsZQotICogdmVsb2NpdHkgdGVtcGxhdGUgZmlsZSBhbmQgZ2VuZXJhdGUgYSBzaW5nbGUgb3V0cHV0IGZpbGUuIFRoZSB0ZW1wbGF0ZSBpcwotICogcGFzc2VkIHRoZSBmdWxsIG1ldGFkYXRhIG1vZGVsIG9iamVjdCwgYW5kIGNhbiBzZWxlY3QgZnJvbSB0aGUgbW9kZWwgd2hhdGV2ZXIKLSAqIGRhdGEgaXQgd2FudHMuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIFRoZSBleGVjdXRpb24gY2FuIGJlIGNvbmZpZ3VyZWQgd2l0aDoKLSAqIDx1bD4KLSAqIDxsaT5UaGUgbmFtZSBvZiB0aGUgaW5wdXQgdGVtcGxhdGUgdG8gYmUgZXhlY3V0ZWQ8L2xpPgotICogPGxpPlRoZSBuYW1lIG9mIHRoZSBvdXRwdXQgZmlsZSB0byBiZSBjcmVhdGVkPC9saT4KLSAqIDxsaT5BbnkgbnVtYmVyIG9mIHZhcmlhYmxlcyB3aGljaCBhcmUgYWNjZXNzYWJsZSBmcm9tIHRoZSB0ZW1wbGF0ZQotICogKHN0cmluZyB2YWx1ZXMgb25seSk8L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqIDxwPgotICogVGhlIGV4ZWN1dGVkIHRlbXBsYXRlIGhhcyB0aGUgZm9sbG93aW5nIHZhcmlhYmxlcyBhdmFpbGFibGUgdG8gaXQ6Ci0gKiA8dWw+Ci0gKiA8bGk+bW9kZWw6IHRoZSBmdWxsIG1ldGFkYXRhIG1vZGVsIGZvciB0aGlzIHByb2plY3Q8L2xpPgotICogPGxpPm1vZGVsSWRzOiBzcGVjaWZpZXMgd2hpY2ggaXRlbXMgZnJvbSB0aGUgbW9kZWwgc2hvdWxkIGJlIHByb2Nlc3NlZDwvbGk+Ci0gKiA8bGk+YmFzZUNvbnRlbnQ6IHRoZSBmdWxsIHRleHQgb2YgdGhlIGNvbnRlbnRzIG9mIHRoZSAieG1sQmFzZUZpbGUiIChpZiBhbnkpPC9saT4KLSAqIDxsaT51dGlsczogYW4gaW5zdGFuY2Ugb2YgTXlmYWNlc1V0aWxzIHRoYXQgcHJvdmlkZXMgc3RhdGljIGhlbHBlciBtZXRob2RzPC9saT4KLSAqIDxsaT5hbmQgd2hhdGV2ZXIgKG5hbWUsdmFsdWUpIHBhaXJzIHdlcmUgY29uZmlndXJlZCB2aWEgdGhlICJwYXJhbXMiIHByb3BlcnR5Ci0gKiBvZiB0aGlzIG1vam8uPC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKiAKLSAqIEByZXF1aXJlc0RlcGVuZGVuY3lSZXNvbHV0aW9uIGNvbXBpbGUKLSAqIEBnb2FsIG1ha2UtY29uZmlnCi0gKiBAcGhhc2UgZ2VuZXJhdGUtc291cmNlcwotICovCi1wdWJsaWMgY2xhc3MgTWFrZUNvbmZpZ01vam8gZXh0ZW5kcyBBYnN0cmFjdE1vam8KLXsKLSAgICAvKioKLSAgICAgKiBUaGUgY3VycmVudCBtYXZlbiBwcm9qZWN0IChhdXRvLWluamVjdGVkIGJ5IE1hdmVuKS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW1ldGVyIGV4cHJlc3Npb249IiR7cHJvamVjdH0iCi0gICAgICogQHJlYWRvbmx5Ci0gICAgICovCi0gICAgcHJpdmF0ZSBNYXZlblByb2plY3QgcHJvamVjdDsKLQotICAgIC8qKgotICAgICAqIERlZmluZXMgdGhlIGRpcmVjdG9yeSB3aGVyZSB0aGUgbWV0YWRhdGEgZmlsZSAoTUVUQS1JTkYvbXlmYWNlcy1tZXRhZGF0YS54bWwpIGlzIGxvYWRlZCwKLSAgICAgKiBhbmQgdGhlIGdlbmVyYXRlZCBmaWxlIG5hbWVkIGJ5IHhtbEZpbGUgcGFyYW1ldGVyIGlzIGNyZWF0ZWQuIAotICAgICAqIAotICAgICAqIEBwYXJhbWV0ZXIgZXhwcmVzc2lvbj0iJHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vZ2VuZXJhdGVkLXJlc291cmNlcy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luIgotICAgICAqLwotICAgIHByaXZhdGUgRmlsZSBidWlsZERpcmVjdG9yeTsKLQotICAgIC8qKgotICAgICAqIERlZmluZXMgdGhlIGRpcmVjdG9yeSB3aGVyZSB0aGUgcmVzb3VyY2Ugd2lsbCBiZSBvdXRwdXQuIAotICAgICAqIAotICAgICAqIEBzaW5jZSAxLjAuNAotICAgICAqIEBwYXJhbWV0ZXIgZXhwcmVzc2lvbj0iJHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vZ2VuZXJhdGVkLXJlc291cmNlcy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luIgotICAgICAqLwotICAgIHByaXZhdGUgRmlsZSBvdXRwdXREaXJlY3Rvcnk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogTmFtZSBvZiB0aGUgZmlsZSBmcm9tIHdoaWNoIHRoZSBtZXRhZGF0YSBtb2RlbCBwYXNzZWQgdG8gdGhlCi0gICAgICogdGVtcGxhdGUgd2lsbCBiZSByZWFkLiBUaGlzIGZpbGUgaXMgdHlwaWNhbGx5IGdlbmVyYXRlZCBieSBhbiBlYXJsaWVyCi0gICAgICogZXhlY3V0aW9uIG9mIHRoZSBCdWlsZE1ldGFEYXRhTW9qbyBnb2FsIGZvciB0aGUgc2FtZSBtYXZlbiBwcm9qZWN0LgotICAgICAqIAotICAgICAqIEBwYXJhbWV0ZXIKLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBtZXRhZGF0YUZpbGUgPSAiTUVUQS1JTkYvbXlmYWNlcy1tZXRhZGF0YS54bWwiOwotCi0gICAgLyoqCi0gICAgICogU3BlY2lmaWVzIHRoZSBuYW1lIG9mIHRoZSBvdXRwdXQgZmlsZSB0byBiZSBjcmVhdGVkLgotICAgICAqIAotICAgICAqIEBwYXJhbWV0ZXIKLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyB4bWxGaWxlID0gIk1FVEEtSU5GL2ZhY2VzLWNvbmZpZy54bWwiOwotICAgIAotICAgIC8qKgotICAgICAqIEEgbGlzdCBvZiBtZXRhZGF0YSBtb2RlbCBpZHMuCi0gICAgICogPHA+Ci0gICAgICogSWYgbm90IGRlZmluZWQsIHRoZW4gdGhpcyBkZWZhdWx0cyB0byBhIGxpc3QgY29udGFpbmluZyBqdXN0IG9uZSBzdHJpbmcgd2hvc2UKLSAgICAgKiB2YWx1ZSBpcyB0aGUgc2FtZSBhcyB0aGUgY3VycmVudCBtYXZlbiBwcm9qZWN0J3MgYXJ0aWZhY3RJZC4KLSAgICAgKiA8L3A+Ci0gICAgICogPHA+Ci0gICAgICogVGhlIGNvbXBsZXRlIG1ldGFkYXRhIG1vZGVsIGlzIHBhc3NlZCB0byB0aGUgdmVsb2NpdHkgdGVtcGxhdGUuIFRoaXMgY29udGFpbnMgCi0gICAgICogZGF0YSBhYm91dCBub3QganVzdCB0aGUgbW9kZWwgaXRlbXMgZGVmaW5lZCBpbiB0aGUgY2FsbGluZyBwcm9qZWN0LCBidXQgYWxzbwotICAgICAqIGFib3V0IGl0ZW1zIGltcG9ydGVkIGZyb20gb3RoZXIgcHJvamVjdHMuIEVhY2ggaXRlbSBpbiB0aGUgbW9kZWwgaXMKLSAgICAgKiBsYWJlbGxlZCB3aXRoIGEgIm1vZGVsIGlkIiBpbmRpY2F0aW5nIHdoaWNoIHByb2plY3QgaXQgd2FzIGRlZmluZWQgYnkuCi0gICAgICogPC9wPgotICAgICAqIDxwPgotICAgICAqIFRoaXMgbGlzdCBvZiBtb2RlbCBpZHMgaXMgYWxzbyBwYXNzZWQgdG8gdGhlIHRlbXBsYXRlLiBUaGUgdGVtcGxhdGUgY2FuCi0gICAgICogdGhlbiB1c2UgdGhhdCBkYXRhIHRvIHNlbGVjdCB0aGUgcmVsZXZhbnQgaXRlbXMgZnJvbSB0aGUgZnVsbCBtb2RlbC4KLSAgICAgKiA8L3A+Ci0gICAgICogCi0gICAgICogQHBhcmFtZXRlcgotICAgICAqLwotICAgIHByaXZhdGUgTGlzdCBtb2RlbElkczsKLSAgICAgICAgICAgIAotICAgIC8qKgotICAgICAqIFRoZSBiYXNlIGRpcmVjdG9yeSB1c2VkIHdoZW4gcmVzb2x2aW5nIHJlZmVyZW5jZXMgdG8gZXh0ZXJuYWwgZmlsZXMgZnJvbQotICAgICAqIHZlbG9jaXR5ICNpbmNsdWRlIGFuZCAjcGFyc2UgY29tbWFuZHMgd2l0aGluIHRoZSBleGVjdXRlZCB0ZW1wbGF0ZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW1ldGVyIGV4cHJlc3Npb249InNyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORiIKLSAgICAgKi8KLSAgICBwcml2YXRlIEZpbGUgdGVtcGxhdGVTb3VyY2VEaXJlY3Rvcnk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogV2hlbiBkZWZpbmVkLCBzcGVjaWZpZXMgYW4geG1sIGZpbGUgd2hvc2UgdG9wLWxldmVsIGVsZW1lbnRzIGFyZSB0byBiZSBjb3BpZWQKLSAgICAgKiBkaXJlY3RseSBpbnRvIHRoZSBjcmVhdGVkIGZpbGUuCi0gICAgICogPHA+Ci0gICAgICogVGhpcyBhbGxvd3MgYSBoYW5kLXdyaXR0ZW4gZmlsZSB0byBiZSBjcmVhdGVkIGNvbnRhaW5pbmcgZGF0YSB0aGF0IGNhbm5vdCBiZQotICAgICAqIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkLiBBbGwgY29udGVudCBiZW5lYXRoIHRoZSByb290IGVsZW1lbnQgb2YgdGhlIHNwZWNpZmllZAotICAgICAqIGZpbGUgKGJ1dCBub3QgdGhlIHJvb3QgZWxlbWVudCBpdHNlbGYpIGlzIHBsYWNlZCBpbnRvIGEgVmVsb2NpdHkgdmFyaWFibGUKLSAgICAgKiBuYW1lZCAiYmFzZUNvbnRlbnQiIHRoYXQgdGhlIHRlbXBsYXRlIGNhbiByZWZlcmVuY2UuCi0gICAgICogPC9wPgotICAgICAqIDxwPgotICAgICAqIFRoZSB0ZW1wbGF0ZSBjYW4gZG8gd2hhdGV2ZXIgaXQgd2FudHMgd2l0aCB0aGlzIHZhcmlhYmxlLCBidXQgaXQgaXMgZXhwZWN0ZWQKLSAgICAgKiB0aGF0IHRoZSB0ZW1wbGF0ZSB3aWxsIHNpbXBseSBvdXRwdXQgdGhpcyBpbW1lZGlhdGVseSBhZnRlciB3cml0aW5nIHRoZQotICAgICAqIHJvb3QgZWxlbWVudCBvZiB0aGUgb3V0cHV0IHhtbCBmaWxlLgotICAgICAqIGZpbGUuCi0gICAgICogPC9wPgotICAgICAqIDxwPgotICAgICAqIE5vdGUgdGhhdCBhbnkgYXR0cmlidXRlcyBvciBuYW1lc3BhY2VzIGRlZmluZWQgb24gdGhlIHJvb3QgZWxlbWVudCBvZiB0aGUKLSAgICAgKiB4bWxCYXNlRmlsZSBhcmUgaWdub3JlZC4KLSAgICAgKiA8L3A+Ci0gICAgICogCi0gICAgICogQHBhcmFtZXRlciBleHByZXNzaW9uPSJzcmMvbWFpbi9jb25mL01FVEEtSU5GL2ZhY2VzLWNvbmZpZy1iYXNlLnhtbCIKLSAgICAgKi8gICAgCi0gICAgcHJpdmF0ZSBGaWxlIHhtbEJhc2VGaWxlOwotCi0gICAgLyoqCi0gICAgICogU3BlY2lmaWVzIHRoZSBWZWxvY2l0eSB0ZW1wbGF0ZSBmaWxlIHRvIGJlIGV4ZWN1dGVkLgotICAgICAqIAotICAgICAqIEBwYXJhbWV0ZXIgZXhwcmVzc2lvbj0iZmFjZXMtY29uZmlnMTEudm0iCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgdGVtcGxhdGVGaWxlOwotICAgIAotICAgIC8qKgotICAgICAqIEEgbWFwIG9mIChuYW1lLCB2YWx1ZSkgcGFpcnMgdG8gYmUgbWFkZSBhdmFpbGFibGUgYXMgVmVsb2NpdHkgdmFyaWFibGVzCi0gICAgICogZm9yIHRoZSBleGVjdXRlZCB0ZW1wbGF0ZSB0byBhY2Nlc3MuCi0gICAgICogCi0gICAgICogQHBhcmFtZXRlcgotICAgICAqLwotICAgIHByaXZhdGUgTWFwIHBhcmFtczsKLSAgICAgICAgCi0gICAgLyoqCi0gICAgICogRXhlY3V0ZSB0aGUgTW9qby4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgbWV0YWRhdGEgbW9kZWwgaXMgbG9hZGVkLCBhbmQgdGhlIHNwZWNpZmllZCB0ZW1wbGF0ZSBpcyBleGVjdXRlZCB3aXRoCi0gICAgICogYW55IHRlbXBsYXRlIG91dHB1dCBiZWluZyB3cml0dGVuIHRvIHRoZSBzcGVjaWZpZWQgb3V0cHV0IGZpbGUuCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChtb2RlbElkcyA9PSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG1vZGVsSWRzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAgICAgICAgIG1vZGVsSWRzLmFkZChwcm9qZWN0LmdldEFydGlmYWN0SWQoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIExvYWQgdGhlIG1ldGFkYXRhIGZpbGUgZnJvbSBhbiB4bWwgZmlsZSAocHJlc3VtYWJseSBnZW5lcmF0ZWQKLSAgICAgICAgICAgIC8vIGJ5IGFuIGVhcmxpZXIgZXhlY3V0aW9uIG9mIHRoZSBidWlsZC1tZXRhZGF0YSBnb2FsLgotICAgICAgICAgICAgTW9kZWwgbW9kZWwgPSBJT1V0aWxzLmxvYWRNb2RlbChuZXcgRmlsZShidWlsZERpcmVjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGFGaWxlKSk7Ci0KLSAgICAgICAgICAgIC8vIEZsYXR0ZW4gdGhlIG1vZGVsIHNvIHRoYXQgdGhlIHRlbXBsYXRlIGNhbiBhY2Nlc3MgZXZlcnkgcHJvcGVydHkKLSAgICAgICAgICAgIC8vIG9mIGVhY2ggbW9kZWwgaXRlbSBkaXJlY3RseSwgZXZlbiB3aGVuIHRoZSBwcm9wZXJ0eSBpcyBhY3R1YWxseQotICAgICAgICAgICAgLy8gZGVmaW5lZCBvbiBhbiBhbmNlc3RvciBjbGFzcyBvciBpbnRlcmZhY2UuCi0gICAgICAgICAgICBuZXcgRmxhdHRlbmVyKG1vZGVsKS5mbGF0dGVuKCk7Ci0KLSAgICAgICAgICAgIGdlbmVyYXRlQ29uZmlnRnJvbVZlbG9jaXR5KG1vZGVsKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IE1vam9FeGVjdXRpb25FeGNlcHRpb24oIkVycm9yIGR1cmluZyBjb25maWcgZ2VuZXJhdGlvbiIsIGUpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbigiRXJyb3IgZHVyaW5nIGNvbmZpZyBnZW5lcmF0aW9uIiwgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIGdlbmVyYXRlQ29uZmlnRnJvbVZlbG9jaXR5KE1vZGVsIG1vZGVsKSB0aHJvd3MgSU9FeGNlcHRpb24sCi0gICAgICAgIE1vam9FeGVjdXRpb25FeGNlcHRpb24KLSAgICB7ICAgIAotICAgICAgICBWZWxvY2l0eUVuZ2luZSB2ZWxvY2l0eUVuZ2luZSA9IGluaXRWZWxvY2l0eSgpOwotCi0gICAgICAgIFZlbG9jaXR5Q29udGV4dCBiYXNlQ29udGV4dCA9IG5ldyBWZWxvY2l0eUNvbnRleHQoKTsKLSAgICAgICAgYmFzZUNvbnRleHQucHV0KCJ1dGlscyIsIG5ldyBNeWZhY2VzVXRpbHMoKSk7Ci0gICAgICAgIAotICAgICAgICBTdHJpbmcgYmFzZUNvbnRlbnQgPSAiIjsKLSAgICAgICAgCi0gICAgICAgIGlmICh4bWxCYXNlRmlsZSAhPSBudWxsICYmIHhtbEJhc2VGaWxlLmV4aXN0cygpKQotICAgICAgICB7Ci0gICAgICAgICAgICBnZXRMb2coKS5pbmZvKCJ1c2luZyBiYXNlIGNvbnRlbnQgZmlsZTogIit4bWxCYXNlRmlsZS5nZXRQYXRoKCkpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBSZWFkZXIgcmVhZGVyID0gbnVsbDsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKHhtbEJhc2VGaWxlKTsKLSAgICAgICAgICAgICAgICBYcHAzRG9tIHJvb3QgPSBYcHAzRG9tQnVpbGRlci5idWlsZChyZWFkZXIpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIFN0cmluZ1dyaXRlciB3cml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgWHBwM0RvbSBbXSBjaGlsZHJlbiA9IHJvb3QuZ2V0Q2hpbGRyZW4oKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaTwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBYcHAzRG9tIGRvbSA9IGNoaWxkcmVuW2ldOwotICAgICAgICAgICAgICAgICAgICBYcHAzRG9tV3JpdGVyLndyaXRlKHdyaXRlciwgZG9tKTsKLSAgICAgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlKCdcbicpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBiYXNlQ29udGVudCA9IHdyaXRlci50b1N0cmluZygpOwotICAgICAgICAgICAgICAgIHdyaXRlci5jbG9zZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKFhtbFB1bGxQYXJzZXJFeGNlcHRpb24gZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCi0gICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZpbmFsbHkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZWFkZXIuY2xvc2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgYmFzZUNvbnRleHQucHV0KCJiYXNlQ29udGVudCIsIGJhc2VDb250ZW50KTsKLSAgICAgICAgCi0gICAgICAgIGJhc2VDb250ZXh0LnB1dCgibW9kZWwiLCBtb2RlbCk7Ci0gICAgICAgIAotICAgICAgICBiYXNlQ29udGV4dC5wdXQoIm1vZGVsSWRzIiwgbW9kZWxJZHMpOwotICAgICAgICAKLSAgICAgICAgaWYgKHBhcmFtcyAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICAvL0xvYWQgYWxsIHBhcmFtZXRlcnMgdG8gdGhlIGNvbnRleHQsIHNvIHRoZSB0ZW1wbGF0ZSBjYW4KLSAgICAgICAgICAgIC8vbG9hZCBpdC4gVGhpcyBhbGxvdyB0byBnZW5lcmF0ZSBhbnkgY29uZmlnIGZpbGUgd2Ugd2FudAotICAgICAgICAgICAgLy8oZmFjZXMtY29uZmlnLCB0bGQsIGZhY2VsZXQsLi4uLikKLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXQgPSBwYXJhbXMua2V5U2V0KCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcga2V5ID0gKFN0cmluZykgaXQubmV4dCgpOwotICAgICAgICAgICAgICAgIGJhc2VDb250ZXh0LnB1dChrZXkscGFyYW1zLmdldChrZXkpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgV3JpdGVyIHdyaXRlciA9IG51bGw7Ci0gICAgICAgIEZpbGUgb3V0RmlsZSA9IG51bGw7Ci0gICAgICAgIAotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgb3V0RmlsZSA9IG5ldyBGaWxlKG91dHB1dERpcmVjdG9yeSwgeG1sRmlsZSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmICggIW91dEZpbGUuZ2V0UGFyZW50RmlsZSgpLmV4aXN0cygpICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBvdXRGaWxlLmdldFBhcmVudEZpbGUoKS5ta2RpcnMoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgd3JpdGVyID0gbmV3IE91dHB1dFN0cmVhbVdyaXRlcihuZXcgRmlsZU91dHB1dFN0cmVhbShvdXRGaWxlKSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIFRlbXBsYXRlIHRlbXBsYXRlID0gdmVsb2NpdHlFbmdpbmUuZ2V0VGVtcGxhdGUodGVtcGxhdGVGaWxlKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgdGVtcGxhdGUubWVyZ2UoYmFzZUNvbnRleHQsIHdyaXRlcik7Ci0KLSAgICAgICAgICAgIHdyaXRlci5mbHVzaCgpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChSZXNvdXJjZU5vdEZvdW5kRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAiRXJyb3IgbWVyZ2luZyB2ZWxvY2l0eSB0ZW1wbGF0ZXM6ICIgKyBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFBhcnNlRXJyb3JFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IE1vam9FeGVjdXRpb25FeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICJFcnJvciBtZXJnaW5nIHZlbG9jaXR5IHRlbXBsYXRlczogIiArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAiRXJyb3IgbWVyZ2luZyB2ZWxvY2l0eSB0ZW1wbGF0ZXM6ICIgKyBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxseQotICAgICAgICB7Ci0gICAgICAgICAgICBJT1V0aWwuY2xvc2Uod3JpdGVyKTsKLSAgICAgICAgICAgIHdyaXRlciA9IG51bGw7Ci0gICAgICAgIH0gICAgICAgIAotICAgIH0KLQotICAgIHByaXZhdGUgVmVsb2NpdHlFbmdpbmUgaW5pdFZlbG9jaXR5KCkgdGhyb3dzIE1vam9FeGVjdXRpb25FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFZlbG9jaXR5RW5naW5lIHZlbG9jaXR5RW5naW5lID0gbmV3IFZlbG9jaXR5RW5naW5lKCk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICB2ZWxvY2l0eUVuZ2luZS5zZXRQcm9wZXJ0eSggInJlc291cmNlLmxvYWRlciIsICJmaWxlLCBjbGFzcyIgKTsKLSAgICAgICAgICAgIHZlbG9jaXR5RW5naW5lLnNldFByb3BlcnR5KCAiZmlsZS5yZXNvdXJjZS5sb2FkZXIuY2xhc3MiLAotICAgICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS52ZWxvY2l0eS5ydW50aW1lLnJlc291cmNlLmxvYWRlci5GaWxlUmVzb3VyY2VMb2FkZXIiKTsKLSAgICAgICAgICAgIHZlbG9jaXR5RW5naW5lLnNldFByb3BlcnR5KCAiZmlsZS5yZXNvdXJjZS5sb2FkZXIucGF0aCIsIHRlbXBsYXRlU291cmNlRGlyZWN0b3J5LmdldFBhdGgoKSk7Ci0gICAgICAgICAgICB2ZWxvY2l0eUVuZ2luZS5zZXRQcm9wZXJ0eSggImNsYXNzLnJlc291cmNlLmxvYWRlci5jbGFzcyIsCi0gICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmJ1aWxkZXIudXRpbHMuUmVsYXRpdmVDbGFzc3BhdGhSZXNvdXJjZUxvYWRlciIgKTsKLSAgICAgICAgICAgIHZlbG9jaXR5RW5naW5lLnNldFByb3BlcnR5KCAiY2xhc3MucmVzb3VyY2UubG9hZGVyLnBhdGgiLCAiTUVUQS1JTkYiKTsgICAgICAgICAgICAKLSAgICAgICAgICAgIHZlbG9jaXR5RW5naW5lLnNldFByb3BlcnR5KCAidmVsb2NpbWFjcm8ubGlicmFyeSIsICJ4bWxNYWNyb3Mudm0iKTsKLSAgICAgICAgICAgIHZlbG9jaXR5RW5naW5lLnNldFByb3BlcnR5KCAidmVsb2NpbWFjcm8ucGVybWlzc2lvbnMuYWxsb3cuaW5saW5lIiwidHJ1ZSIpOwotICAgICAgICAgICAgdmVsb2NpdHlFbmdpbmUuc2V0UHJvcGVydHkoICJ2ZWxvY2ltYWNyby5wZXJtaXNzaW9ucy5hbGxvdy5pbmxpbmUubG9jYWwuc2NvcGUiLCAidHJ1ZSIpOwotICAgICAgICAgICAgdmVsb2NpdHlFbmdpbmUuc2V0UHJvcGVydHkoICJkaXJlY3RpdmUuZm9yZWFjaC5jb3VudGVyLmluaXRpYWwudmFsdWUiLCIwIik7Ci0gICAgICAgICAgICAvL3ZlbG9jaXR5RW5naW5lLnNldFByb3BlcnR5KCBSdW50aW1lQ29uc3RhbnRzLlJVTlRJTUVfTE9HX0xPR1NZU1RFTV9DTEFTUywKLSAgICAgICAgICAgIC8vIm9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uYnVpbGRlci51dGlscy5Db25zb2xlTG9nU3lzdGVtIiApOwotCi0gICAgICAgICAgICB2ZWxvY2l0eUVuZ2luZS5zZXRQcm9wZXJ0eShSdW50aW1lQ29uc3RhbnRzLlJVTlRJTUVfTE9HX0xPR1NZU1RFTSwKLSAgICAgICAgICAgICAgICAgICAgbmV3IE1hdmVuUGx1Z2luQ29uc29sZUxvZ1N5c3RlbSh0aGlzLmdldExvZygpKSk7Ci0KLSAgICAgICAgICAgIHZlbG9jaXR5RW5naW5lLmluaXQoKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uKCJFcnJvciBjcmVhdGluZyBWZWxvY2l0eUVuZ2luZSIsIGUpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gdmVsb2NpdHlFbmdpbmU7Ci0gICAgfQotICAgIAotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9NYWtlQ29udmVydGVyVGFnc01vam8uamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvTWFrZUNvbnZlcnRlclRhZ3NNb2pvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyNDlmZWYuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9NYWtlQ29udmVydGVyVGFnc01vam8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0OCArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uYnVpbGRlcjsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbVdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLldyaXRlcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLkFic3RyYWN0TW9qbzsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5Nb2pvRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucHJvamVjdC5NYXZlblByb2plY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5idWlsZGVyLm1vZGVsLkNvbnZlcnRlck1ldGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5idWlsZGVyLm1vZGVsLk1vZGVsOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uYnVpbGRlci51dGlscy5CdWlsZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmJ1aWxkZXIudXRpbHMuTWF2ZW5QbHVnaW5Db25zb2xlTG9nU3lzdGVtOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uYnVpbGRlci51dGlscy5NeWZhY2VzVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS52ZWxvY2l0eS5UZW1wbGF0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLnZlbG9jaXR5LlZlbG9jaXR5Q29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLnZlbG9jaXR5LmFwcC5WZWxvY2l0eUVuZ2luZTsKLWltcG9ydCBvcmcuYXBhY2hlLnZlbG9jaXR5LmNvbnRleHQuQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLnZlbG9jaXR5LnJ1bnRpbWUuUnVudGltZUNvbnN0YW50czsKLWltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLnV0aWwuSU9VdGlsOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMudXRpbC5TdHJpbmdVdGlsczsKLQotLyoqCi0gKiBNYXZlbiBnb2FsIHRvIGdlbmVyYXRlIGphdmEgc291cmNlIGNvZGUgZm9yIENvbXBvbmVudCB0YWcgY2xhc3Nlcy4KLSAqIAotICogPHA+SXQgdXNlcyB2ZWxvY2l0eSB0byBnZW5lcmF0ZSB0ZW1wbGF0ZXMsIGFuZCBoYXMgdGhlIG9wdGlvbiB0byBkZWZpbmUgY3VzdG9tIHRlbXBsYXRlcy48L3A+Ci0gKiA8cD5UaGUgZXhlY3V0ZWQgdGVtcGxhdGUgaGFzIHRoZSBmb2xsb3dpbmcgdmFyaWFibGVzIGF2YWlsYWJsZSB0byBpdDo8L3A+Ci0gKiA8dWw+Ci0gKiAgPGxpPnV0aWxzIDogUmV0dXJucyBhbiBpbnN0YW5jZSBvZiAKLSAqICBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmJ1aWxkZXIudXRpbHMuTXlmYWNlc1V0aWxzLCAKLSAqICBpdCBjb250YWlucyBzb21lIHVzZWZ1bCBtZXRob2RzLjwvbGk+Ci0gKiAgPGxpPmNvbnZlcnRlciA6IFJldHVybnMgdGhlIGN1cnJlbnQgaW5zdGFuY2Ugb2YKLSAqICAgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5idWlsZGVyLm1vZGVsLkNvbnZlcnRlck1ldGE8L2xpPgotICogPC91bD4KLSAqIAotICogQHZlcnNpb24gJElkJAotICogQHJlcXVpcmVzRGVwZW5kZW5jeVJlc29sdXRpb24gY29tcGlsZQotICogQGdvYWwgbWFrZS1jb252ZXJ0ZXItdGFncwotICogQHBoYXNlIGdlbmVyYXRlLXNvdXJjZXMKLSAqLwotcHVibGljIGNsYXNzIE1ha2VDb252ZXJ0ZXJUYWdzTW9qbyBleHRlbmRzIEFic3RyYWN0TW9qbwotewotICAgIC8qKgotICAgICAqIEluamVjdGVkIE1hdmVuIHByb2plY3QuCi0gICAgICogCi0gICAgICogQHBhcmFtZXRlciBleHByZXNzaW9uPSIke3Byb2plY3R9IgotICAgICAqIEByZWFkb25seQotICAgICAqLwotICAgIHByaXZhdGUgTWF2ZW5Qcm9qZWN0IHByb2plY3Q7Ci0KLSAgICAvKioKLSAgICAgKiBEZWZpbmVzIHRoZSBkaXJlY3Rvcnkgd2hlcmUgdGhlIG1ldGFkYXRhIGZpbGUgKE1FVEEtSU5GL215ZmFjZXMtbWV0YWRhdGEueG1sKSBpcyBsb2FkZWQuCi0gICAgICogCi0gICAgICogQHBhcmFtZXRlciBleHByZXNzaW9uPSIke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9nZW5lcmF0ZWQtcmVzb3VyY2VzL215ZmFjZXMtYnVpbGRlci1wbHVnaW4iCi0gICAgICovCi0gICAgcHJpdmF0ZSBGaWxlIGJ1aWxkRGlyZWN0b3J5OwotCi0gICAgLyoqCi0gICAgICogSW5qZWN0ZWQgbmFtZSBvZiBmaWxlIGdlbmVyYXRlZCBieSBlYXJsaWVyIHJ1biBvZiBCdWlsZE1ldGFEYXRhTW9qbyBnb2FsLgotICAgICAqIAotICAgICAqIEBwYXJhbWV0ZXIKLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBtZXRhZGF0YUZpbGUgPSAiTUVUQS1JTkYvbXlmYWNlcy1tZXRhZGF0YS54bWwiOwotCi0gICAgLyoqCi0gICAgICogVGhlIGRpcmVjdG9yeSB1c2VkIHRvIGxvYWQgdGVtcGxhdGVzIGludG8gdmVsb2NpdHkgZW52aXJvbm1lbnQuCi0gICAgICogCi0gICAgICogQHBhcmFtZXRlciBleHByZXNzaW9uPSJzcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYiCi0gICAgICovCi0gICAgcHJpdmF0ZSBGaWxlIHRlbXBsYXRlU291cmNlRGlyZWN0b3J5OwotICAgIAotICAgIC8qKgotICAgICAqIFRoaXMgcGFyYW0gaXMgdXNlZCB0byBzZWFyY2ggaW4gdGhpcyBmb2xkZXIgaWYgc29tZSBmaWxlIHRvCi0gICAgICogYmUgZ2VuZXJhdGVkIGV4aXN0cyBhbmQgYXZvaWQgZ2VuZXJhdGlvbiBhbmQgZHVwbGljYXRlIGV4Y2VwdGlvbi4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW1ldGVyIGV4cHJlc3Npb249InNyYy9tYWluL2phdmEiCi0gICAgICovICAgIAotICAgIHByaXZhdGUgRmlsZSBtYWluU291cmNlRGlyZWN0b3J5OwotCi0gICAgLyoqCi0gICAgICogVGhpcyBwYXJhbSBpcyB1c2VkIHRvIHNlYXJjaCBpbiB0aGlzIGZvbGRlciBpZiBzb21lIGZpbGUgdG8KLSAgICAgKiBiZSBnZW5lcmF0ZWQgZXhpc3RzIGFuZCBhdm9pZCBnZW5lcmF0aW9uIGFuZCBkdXBsaWNhdGUgZXhjZXB0aW9uLgotICAgICAqIAotICAgICAqIEBwYXJhbWV0ZXIKLSAgICAgKi8gICAgICAgIAotICAgIHByaXZhdGUgRmlsZSBtYWluU291cmNlRGlyZWN0b3J5MjsKLQotICAgIC8qKgotICAgICAqIFRoZSBuYW1lIG9mIHRoZSB0ZW1wbGF0ZSB1c2VkIHRvIGdlbmVyYXRlIGNvbnZlcnRlciB0YWcgY2xhc3Nlcy4gQWNjb3JkaW5nIHRvIHRoZSB2YWx1ZSBvbiAKLSAgICAgKiBqc2ZWZXJzaW9uIHByb3BlcnR5IHRoZSBkZWZhdWx0IGlmIHRoaXMgcHJvcGVydHkgaXMgbm90IHNldCBjb3VsZCBiZSB0YWdDb252ZXJ0ZXJDbGFzczExLnZtICgxLjEpIG9yCi0gICAgICogdGFnQ29udmVydGVyQ2xhc3MxMi52bSAoMS4yKQotICAgICAqIAotICAgICAqIEBwYXJhbWV0ZXIgCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgdGVtcGxhdGVUYWdOYW1lOwotCi0gICAgLyoqCi0gICAgICogVGhlIGRpcmVjdG9yeSB3aGVyZSBhbGwgZ2VuZXJhdGVkIGZpbGVzIGFyZSBjcmVhdGVkLiBUaGlzIGRpcmVjdG9yeSBpcyBhZGRlZCBhcyBhCi0gICAgICogY29tcGlsZSBzb3VyY2Ugcm9vdCBhdXRvbWF0aWNhbGx5IGxpa2Ugc3JjL21haW4vamF2YSBpcy4gCi0gICAgICogCi0gICAgICogQHBhcmFtZXRlciBleHByZXNzaW9uPSIke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9nZW5lcmF0ZWQtc291cmNlcy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luIgotICAgICAqIEByZXF1aXJlZAotICAgICAqLwotICAgIHByaXZhdGUgRmlsZSBnZW5lcmF0ZWRTb3VyY2VEaXJlY3Rvcnk7Ci0KLSAgICAvKioKLSAgICAgKiBPbmx5IGdlbmVyYXRlIHRhZyBjbGFzc2VzIHRoYXQgY29udGFpbnMgdGhhdCBwYWNrYWdlIHByZWZpeAotICAgICAqIAotICAgICAqIEBwYXJhbWV0ZXIKLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBwYWNrYWdlQ29udGFpbnM7Ci0KLSAgICAvKioKLSAgICAgKiBPbmx5IGdlbmVyYXRlIHRhZyBjbGFzc2VzIHRoYXQgaXRzIGNvbXBvbmVudCBzdGFydHMgd2l0aCB0aGlzIHR5cGUgcHJlZml4Ci0gICAgICogCi0gICAgICogQHBhcmFtZXRlcgotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIHR5cGVQcmVmaXg7Ci0gICAgCi0gICAgLyoqCi0gICAgICogIExvZyBhbmQgY29udGludWUgZXhlY3V0aW9uIHdoZW4gZ2VuZXJhdGluZyBjb252ZXJ0ZXIgdGFnIGNsYXNzZXMuCi0gICAgICogIDxwPgotICAgICAqICBJZiB0aGlzIHByb3BlcnR5IGlzIHNldCB0byBmYWxzZSAoZGVmYXVsdCksIGVycm9ycyB3aGVuIGEgY29udmVydGVyIHRhZyBjbGFzcyBpcyBnZW5lcmF0ZWQgc3RvcHMKLSAgICAgKiAgZXhlY3V0aW9uIGltbWVkaWF0ZWx5LgotICAgICAqICA8L3A+Ci0gICAgICogCi0gICAgICogQHBhcmFtZXRlcgotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBmb3JjZTsKLQotICAgIC8qKgotICAgICAqIERlZmluZXMgdGhlIGpzZiB2ZXJzaW9uICgxLjEgb3IgMS4yKSwgdXNlZCB0byB0YWtlIHRoZSBkZWZhdWx0IHRlbXBsYXRlcyBmb3IgZWFjaCB2ZXJzaW9uLgotICAgICAqIDxwPiAKLSAgICAgKiBJZiB2ZXJzaW9uIGlzIDEuMSwgdGhlIGRlZmF1bHQgdGVtcGxhdGVUYWdOYW1lIGlzICd0YWdDb252ZXJ0ZXJDbGFzczExLnZtJyBhbmQgaWYgdmVyc2lvbgotICAgICAqIGlzIDEuMiB0aGUgZGVmYXVsdCB0ZW1wbGF0ZVRhZ05hbWUgaXMgJ3RhZ0NvbnZlcnRlckNsYXNzMTIudm0nLgotICAgICAqIDwvcD4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW1ldGVyCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcganNmVmVyc2lvbjsKLSAgICAKLSAgICAvKioKLSAgICAgKiBEZWZpbmUgdGhlIG1vZGVscyB0aGF0IHNob3VsZCBiZSBpbmNsdWRlZCB3aGVuIGdlbmVyYXRlIGNvbnZlcnRlciB0YWcgY2xhc3Nlcy4gSWYgbm90IHNldCwgdGhlCi0gICAgICogY3VycmVudCBtb2RlbCBpZGVudGlmaWVkIGJ5IHRoZSBhcnRpZmFjdElkIGlzIHVzZWQuCi0gICAgICogPHA+Ci0gICAgICogRWFjaCBtb2RlbCBidWlsdCBieSBidWlsZC1tZXRhZGF0YSBnb2FsIGhhcyBhIG1vZGVsSWQsIHRoYXQgYnkgZGVmYXVsdCBpcyB0aGUgYXJ0aWZhY3RJZCBvZgotICAgICAqIHRoZSBwcm9qZWN0LiBTZXR0aW5nIHRoaXMgcHJvcGVydHkgZGVmaW5lcyB3aGljaCBvYmplY3RzIHRpZWQgaW4gYSBzcGVjaWZpZWQgbW9kZWxJZCBzaG91bGQKLSAgICAgKiBiZSB0YWtlbiBpbnRvIGFjY291bnQuICAKLSAgICAgKiA8L3A+Ci0gICAgICogPHA+SW4gdGhpcyBjYXNlLCBsaW1pdCBjb252ZXJ0ZXIgdGFnIGdlbmVyYXRpb24gb25seSB0byB0aGUgY29tcG9uZW50cyBkZWZpbmVkIGluIHRoZSBtb2RlbHMgCi0gICAgICogaWRlbnRpZmllZCBieSB0aGUgbW9kZWxJZCBkZWZpbmVkLiA8L3A+Ci0gICAgICogPHA+VGhpcyBpcyB1c2VmdWwgd2hlbiB5b3UgbmVlZCB0byBnZW5lcmF0ZSBmaWxlcyB0aGF0IHRha2UgaW5mb3JtYXRpb24gZGVmaW5lZCBvbiBvdGhlcgotICAgICAqIHByb2plY3RzLjwvcD4KLSAgICAgKiA8cD5FeGFtcGxlOjwvcD4KLSAgICAgKiA8cHJlPgotICAgICAqICAgICZsdDttb2RlbElkcyZndDsKLSAgICAgKiAgICAgICAgJmx0O21vZGVsSWQ+bW9kZWwxJmx0Oy9tb2RlbElkJmd0OwotICAgICAqICAgICAgICAmbHQ7bW9kZWxJZD5tb2RlbDImbHQ7L21vZGVsSWQmZ3Q7Ci0gICAgICogICAgJmx0Oy9tb2RlbElkcyZndDsKLSAgICAgKiA8L3ByZT4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW1ldGVyCi0gICAgICovCi0gICAgcHJpdmF0ZSBMaXN0IG1vZGVsSWRzOwotICAgIAotICAgIC8qKgotICAgICAqIEV4ZWN1dGUgdGhlIE1vam8uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uCi0gICAgewotICAgICAgICAvLyBUaGlzIGNvbW1hbmQgbWFrZXMgTWF2ZW4gY29tcGlsZSB0aGUgZ2VuZXJhdGVkIHNvdXJjZToKLSAgICAgICAgLy8gZ2V0UHJvamVjdCgpLmFkZENvbXBpbGVTb3VyY2VSb290KCBhYnNvbHV0ZUdlbmVyYXRlZFBhdGguZ2V0UGF0aCgpICk7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBwcm9qZWN0LmFkZENvbXBpbGVTb3VyY2VSb290KCBnZW5lcmF0ZWRTb3VyY2VEaXJlY3RvcnkuZ2V0Q2Fub25pY2FsUGF0aCgpICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChtb2RlbElkcyA9PSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG1vZGVsSWRzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAgICAgICAgIG1vZGVsSWRzLmFkZChwcm9qZWN0LmdldEFydGlmYWN0SWQoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBNb2RlbCBtb2RlbCA9IElPVXRpbHMubG9hZE1vZGVsKG5ldyBGaWxlKGJ1aWxkRGlyZWN0b3J5LAotICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YUZpbGUpKTsKLSAgICAgICAgICAgIG5ldyBGbGF0dGVuZXIobW9kZWwpLmZsYXR0ZW4oKTsKLSAgICAgICAgICAgIGdlbmVyYXRlQ29udmVydGVycyhtb2RlbCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uKCJFcnJvciBnZW5lcmF0aW5nIGNvbXBvbmVudHMiLCBlKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoQnVpbGRFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IE1vam9FeGVjdXRpb25FeGNlcHRpb24oIkVycm9yIGdlbmVyYXRpbmcgY29tcG9uZW50cyIsIGUpOwotICAgICAgICB9Ci0gICAgfQotICAgICAgICAKLSAgICBwcml2YXRlIFZlbG9jaXR5RW5naW5lIGluaXRWZWxvY2l0eSgpIHRocm93cyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uCi0gICAgewotCi0gICAgICAgIEZpbGUgdGVtcGxhdGUgPSBuZXcgRmlsZSh0ZW1wbGF0ZVNvdXJjZURpcmVjdG9yeSwgX2dldFRlbXBsYXRlVGFnTmFtZSgpKTsKLSAgICAgICAgCi0gICAgICAgIGlmICh0ZW1wbGF0ZS5leGlzdHMoKSkKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0TG9nKCkuaW5mbygiVXNpbmcgdGVtcGxhdGUgZnJvbSBmaWxlIGxvYWRlcjogIit0ZW1wbGF0ZS5nZXRQYXRoKCkpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0TG9nKCkuaW5mbygiVXNpbmcgdGVtcGxhdGUgZnJvbSBjbGFzcyBsb2FkZXI6IE1FVEEtSU5GLyIrX2dldFRlbXBsYXRlVGFnTmFtZSgpKTsKLSAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICBWZWxvY2l0eUVuZ2luZSB2ZWxvY2l0eUVuZ2luZSA9IG5ldyBWZWxvY2l0eUVuZ2luZSgpOwotICAgICAgICAgICAgICAgIAotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgdmVsb2NpdHlFbmdpbmUuc2V0UHJvcGVydHkoICJyZXNvdXJjZS5sb2FkZXIiLCAiZmlsZSwgY2xhc3MiICk7Ci0gICAgICAgICAgICB2ZWxvY2l0eUVuZ2luZS5zZXRQcm9wZXJ0eSggImZpbGUucmVzb3VyY2UubG9hZGVyLmNsYXNzIiwKLSAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUudmVsb2NpdHkucnVudGltZS5yZXNvdXJjZS5sb2FkZXIuRmlsZVJlc291cmNlTG9hZGVyIik7Ci0gICAgICAgICAgICB2ZWxvY2l0eUVuZ2luZS5zZXRQcm9wZXJ0eSggImZpbGUucmVzb3VyY2UubG9hZGVyLnBhdGgiLCB0ZW1wbGF0ZVNvdXJjZURpcmVjdG9yeS5nZXRQYXRoKCkpOwotICAgICAgICAgICAgdmVsb2NpdHlFbmdpbmUuc2V0UHJvcGVydHkoICJjbGFzcy5yZXNvdXJjZS5sb2FkZXIuY2xhc3MiLAotICAgICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5idWlsZGVyLnV0aWxzLlJlbGF0aXZlQ2xhc3NwYXRoUmVzb3VyY2VMb2FkZXIiICk7Ci0gICAgICAgICAgICB2ZWxvY2l0eUVuZ2luZS5zZXRQcm9wZXJ0eSggImNsYXNzLnJlc291cmNlLmxvYWRlci5wYXRoIiwgIk1FVEEtSU5GIik7ICAgICAgICAgICAgCi0gICAgICAgICAgICB2ZWxvY2l0eUVuZ2luZS5zZXRQcm9wZXJ0eSggInZlbG9jaW1hY3JvLmxpYnJhcnkiLCAidGFnQ2xhc3NNYWNyb3MxMS52bSIpOwotICAgICAgICAgICAgdmVsb2NpdHlFbmdpbmUuc2V0UHJvcGVydHkoICJ2ZWxvY2ltYWNyby5wZXJtaXNzaW9ucy5hbGxvdy5pbmxpbmUiLCJ0cnVlIik7Ci0gICAgICAgICAgICB2ZWxvY2l0eUVuZ2luZS5zZXRQcm9wZXJ0eSggInZlbG9jaW1hY3JvLnBlcm1pc3Npb25zLmFsbG93LmlubGluZS5sb2NhbC5zY29wZSIsICJ0cnVlIik7Ci0gICAgICAgICAgICB2ZWxvY2l0eUVuZ2luZS5zZXRQcm9wZXJ0eSggImRpcmVjdGl2ZS5mb3JlYWNoLmNvdW50ZXIuaW5pdGlhbC52YWx1ZSIsIjAiKTsKLSAgICAgICAgICAgIC8vdmVsb2NpdHlFbmdpbmUuc2V0UHJvcGVydHkoIFJ1bnRpbWVDb25zdGFudHMuUlVOVElNRV9MT0dfTE9HU1lTVEVNX0NMQVNTLAotICAgICAgICAgICAgLy8gICAgIm9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uYnVpbGRlci51dGlscy5Db25zb2xlTG9nU3lzdGVtIiApOwotICAgICAgICAgICAgCi0gICAgICAgICAgICB2ZWxvY2l0eUVuZ2luZS5zZXRQcm9wZXJ0eShSdW50aW1lQ29uc3RhbnRzLlJVTlRJTUVfTE9HX0xPR1NZU1RFTSwKLSAgICAgICAgICAgICAgICAgICAgbmV3IE1hdmVuUGx1Z2luQ29uc29sZUxvZ1N5c3RlbSh0aGlzLmdldExvZygpKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIHZlbG9jaXR5RW5naW5lLmluaXQoKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uKCJFcnJvciBjcmVhdGluZyBWZWxvY2l0eUVuZ2luZSIsIGUpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gdmVsb2NpdHlFbmdpbmU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2VuZXJhdGVzIHBhcnNlZCBjb21wb25lbnRzLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBnZW5lcmF0ZUNvbnZlcnRlcnMoTW9kZWwgbW9kZWwpIHRocm93cyBJT0V4Y2VwdGlvbiwKLSAgICAgICAgICAgIE1vam9FeGVjdXRpb25FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFZlbG9jaXR5RW5naW5lIHZlbG9jaXR5RW5naW5lID0gaW5pdFZlbG9jaXR5KCk7Ci0KLSAgICAgICAgVmVsb2NpdHlDb250ZXh0IGJhc2VDb250ZXh0ID0gbmV3IFZlbG9jaXR5Q29udGV4dCgpOwotICAgICAgICBiYXNlQ29udGV4dC5wdXQoInV0aWxzIiwgbmV3IE15ZmFjZXNVdGlscygpKTsKLSAgICAgICAgCi0gICAgICAgIGZvciAoSXRlcmF0b3IgaXQgPSBtb2RlbC5nZXRDb252ZXJ0ZXJzKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykKLSAgICAgICAgewotICAgICAgICAgICAgQ29udmVydGVyTWV0YSBjb252ZXJ0ZXIgPSAoQ29udmVydGVyTWV0YSkgaXQubmV4dCgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoY29udmVydGVyLmdldFRhZ0NsYXNzKCkgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBGaWxlIGYgPSBuZXcgRmlsZShtYWluU291cmNlRGlyZWN0b3J5LCBTdHJpbmdVdGlscy5yZXBsYWNlKAotICAgICAgICAgICAgICAgICAgICBjb252ZXJ0ZXIuZ2V0VGFnQ2xhc3MoKSwgIi4iLCAiLyIpKyIuamF2YSIpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmICghZi5leGlzdHMoKSAmJiBjYW5HZW5lcmF0ZUNvbnZlcnRlclRhZyhjb252ZXJ0ZXIpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1haW5Tb3VyY2VEaXJlY3RvcnkyICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEZpbGUgZjIgPSBuZXcgRmlsZShtYWluU291cmNlRGlyZWN0b3J5MiwgU3RyaW5nVXRpbHMucmVwbGFjZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udmVydGVyLmdldFRhZ0NsYXNzKCksICIuIiwgIi8iKSsiLmphdmEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmMi5leGlzdHMoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL1NraXAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBnZXRMb2coKS5pbmZvKCJHZW5lcmF0aW5nIHRhZyBjbGFzczoiK2NvbnZlcnRlci5nZXRUYWdDbGFzcygpKTsKLSAgICAgICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIF9nZW5lcmF0ZUNvbnZlcnRlcih2ZWxvY2l0eUVuZ2luZSwgY29udmVydGVyLGJhc2VDb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBjYXRjaChNb2pvRXhlY3V0aW9uRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmb3JjZSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRMb2coKS5lcnJvcihlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9TdG9wIGV4ZWN1dGlvbiB0aHJvd2luZyBleGNlcHRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vdGhyb3cgbmV3IE1vam9FeGVjdXRpb25FeGNlcHRpb24oInN0b3BwaW5nLi4iKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGJvb2xlYW4gY2FuR2VuZXJhdGVDb252ZXJ0ZXJUYWcoQ29udmVydGVyTWV0YSBjb21wb25lbnQpCi0gICAgewotICAgICAgICBpZiAoIG1vZGVsSWRzLmNvbnRhaW5zKGNvbXBvbmVudC5nZXRNb2RlbElkKCkpCi0gICAgICAgICAgICAgICAgJiYgaW5jbHVkZVBhY2thZ2UoY29tcG9uZW50KQotICAgICAgICAgICAgICAgICYmIGluY2x1ZGVJZChjb21wb25lbnQpKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgYm9vbGVhbiBpbmNsdWRlUGFja2FnZShDb252ZXJ0ZXJNZXRhIGNvbnZlcnRlcikKLSAgICB7Ci0gICAgICAgIGlmIChwYWNrYWdlQ29udGFpbnMgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKE15ZmFjZXNVdGlscy5nZXRQYWNrYWdlRnJvbUZ1bGxDbGFzcyhjb252ZXJ0ZXIuZ2V0VGFnQ2xhc3MoKSkuc3RhcnRzV2l0aChwYWNrYWdlQ29udGFpbnMpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9ICAgICAgICAKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpbmNsdWRlSWQoQ29udmVydGVyTWV0YSBjb252ZXJ0ZXIpCi0gICAgewotICAgICAgICBpZiAodHlwZVByZWZpeCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoY29udmVydGVyLmdldENvbnZlcnRlcklkKCkuc3RhcnRzV2l0aCh0eXBlUHJlZml4KSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfSAgICAgICAgCi0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBHZW5lcmF0ZXMgYSBwYXJzZWQgY29tcG9uZW50LgotICAgICAqIAotICAgICAqIEBwYXJhbSBjb252ZXJ0ZXIKLSAgICAgKiAgICAgICAgICAgIHRoZSBwYXJzZWQgY29tcG9uZW50IG1ldGFkYXRhCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIF9nZW5lcmF0ZUNvbnZlcnRlcihWZWxvY2l0eUVuZ2luZSB2ZWxvY2l0eUVuZ2luZSwgQ29udmVydGVyTWV0YSBjb252ZXJ0ZXIsIFZlbG9jaXR5Q29udGV4dCBiYXNlQ29udGV4dCkKLSAgICAgICAgICAgIHRocm93cyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uCi0gICAgewotCi0gICAgICAgIENvbnRleHQgY29udGV4dCA9IG5ldyBWZWxvY2l0eUNvbnRleHQoYmFzZUNvbnRleHQpOwotICAgICAgICBjb250ZXh0LnB1dCgiY29udmVydGVyIiwgY29udmVydGVyKTsKLQotICAgICAgICBXcml0ZXIgd3JpdGVyID0gbnVsbDsKLSAgICAgICAgRmlsZSBvdXRGaWxlID0gbnVsbDsKLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgb3V0RmlsZSA9IG5ldyBGaWxlKGdlbmVyYXRlZFNvdXJjZURpcmVjdG9yeSwgU3RyaW5nVXRpbHMucmVwbGFjZSgKLSAgICAgICAgICAgICAgICAgICAgY29udmVydGVyLmdldFRhZ0NsYXNzKCksICIuIiwgIi8iKSsiLmphdmEiKTsKLQotICAgICAgICAgICAgaWYgKCAhb3V0RmlsZS5nZXRQYXJlbnRGaWxlKCkuZXhpc3RzKCkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG91dEZpbGUuZ2V0UGFyZW50RmlsZSgpLm1rZGlycygpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB3cml0ZXIgPSBuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKG5ldyBGaWxlT3V0cHV0U3RyZWFtKG91dEZpbGUpKTsKLQotICAgICAgICAgICAgVGVtcGxhdGUgdGVtcGxhdGUgPSB2ZWxvY2l0eUVuZ2luZS5nZXRUZW1wbGF0ZShfZ2V0VGVtcGxhdGVUYWdOYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICB0ZW1wbGF0ZS5tZXJnZShjb250ZXh0LCB3cml0ZXIpOwotCi0gICAgICAgICAgICB3cml0ZXIuZmx1c2goKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAiRXJyb3IgbWVyZ2luZyB2ZWxvY2l0eSB0ZW1wbGF0ZXM6ICIgKyBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxseQotICAgICAgICB7Ci0gICAgICAgICAgICBJT1V0aWwuY2xvc2Uod3JpdGVyKTsKLSAgICAgICAgICAgIHdyaXRlciA9IG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBTdHJpbmcgX2dldFRlbXBsYXRlVGFnTmFtZSgpCi0gICAgewotICAgICAgICBpZiAodGVtcGxhdGVUYWdOYW1lID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChfaXMxMigpIHx8IF9pczIwKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJ0YWdDb252ZXJ0ZXJDbGFzczEyLnZtIjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gInRhZ0NvbnZlcnRlckNsYXNzMTEudm0iOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHRlbXBsYXRlVGFnTmFtZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBfaXMxMigpCi0gICAgewotICAgICAgICByZXR1cm4gIjEuMiIuZXF1YWxzKGpzZlZlcnNpb24pIHx8ICIxMiIuZXF1YWxzKGpzZlZlcnNpb24pOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBfaXMyMCgpCi0gICAgewotICAgICAgICByZXR1cm4gIjIuMCIuZXF1YWxzKGpzZlZlcnNpb24pIHx8ICIyMCIuZXF1YWxzKGpzZlZlcnNpb24pOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9NYWtlQ29udmVydGVyc01vam8uamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvTWFrZUNvbnZlcnRlcnNNb2pvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzNTY4N2MuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9NYWtlQ29udmVydGVyc01vam8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0NSArMCwwIEBACi0vKg0KLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICogDQotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqIA0KLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqICB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uYnVpbGRlcjsNCi0NCi1pbXBvcnQgamF2YS5pby5GaWxlOw0KLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07DQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247DQotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtV3JpdGVyOw0KLWltcG9ydCBqYXZhLmlvLldyaXRlcjsNCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOw0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uQWJzdHJhY3RNb2pvOw0KLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5Nb2pvRXhlY3V0aW9uRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnByb2plY3QuTWF2ZW5Qcm9qZWN0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmJ1aWxkZXIubW9kZWwuTW9kZWw7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uYnVpbGRlci5tb2RlbC5Db252ZXJ0ZXJNZXRhOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmJ1aWxkZXIudXRpbHMuQnVpbGRFeGNlcHRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uYnVpbGRlci51dGlscy5NYXZlblBsdWdpbkNvbnNvbGVMb2dTeXN0ZW07DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uYnVpbGRlci51dGlscy5NeWZhY2VzVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUudmVsb2NpdHkuVGVtcGxhdGU7DQotaW1wb3J0IG9yZy5hcGFjaGUudmVsb2NpdHkuVmVsb2NpdHlDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLnZlbG9jaXR5LmFwcC5WZWxvY2l0eUVuZ2luZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS52ZWxvY2l0eS5jb250ZXh0LkNvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUudmVsb2NpdHkucnVudGltZS5SdW50aW1lQ29uc3RhbnRzOw0KLWltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLnV0aWwuSU9VdGlsOw0KLWltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLnV0aWwuU3RyaW5nVXRpbHM7DQotDQotaW1wb3J0IGNvbS50aG91Z2h0d29ya3MucWRveC5KYXZhRG9jQnVpbGRlcjsNCi0NCi0vKioNCi0gKiBNYXZlbiBnb2FsIHRvIGdlbmVyYXRlIGphdmEgc291cmNlIGNvZGUgZm9yIENvbnZlcnRlciBjbGFzc2VzLg0KLSAqIA0KLSAqIDxwPkl0IHVzZXMgdmVsb2NpdHkgdG8gZ2VuZXJhdGUgdGVtcGxhdGVzLCBhbmQgaGFzIHRoZSBvcHRpb24gdG8gZGVmaW5lIGN1c3RvbSB0ZW1wbGF0ZXMuPC9wPg0KLSAqIDxwPlRoZSBleGVjdXRlZCB0ZW1wbGF0ZSBoYXMgdGhlIGZvbGxvd2luZyB2YXJpYWJsZXMgYXZhaWxhYmxlIHRvIGl0OjwvcD4NCi0gKiA8dWw+DQotICogIDxsaT51dGlscyA6IFJldHVybnMgYW4gaW5zdGFuY2Ugb2YgDQotICogIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uYnVpbGRlci51dGlscy5NeWZhY2VzVXRpbHMsIA0KLSAqICBpdCBjb250YWlucyBzb21lIHVzZWZ1bCBtZXRob2RzLjwvbGk+DQotICogIDxsaT5jb252ZXJ0ZXIgOiBSZXR1cm5zIHRoZSBjdXJyZW50IGluc3RhbmNlIG9mDQotICogICBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmJ1aWxkZXIubW9kZWwuQ29udmVydGVyTWV0YTwvbGk+DQotICogPC91bD4NCi0gKiANCi0gKiANCi0gKiBAc2luY2UgMS4wLjgNCi0gKiBAdmVyc2lvbiAkSWQ6IE1ha2VDb252ZXJ0ZXJzTW9qby5qYXZhIDk0Mjk3MCAyMDEwLTA1LTExIDAwOjM2OjE0WiBsdTQyNDIgJA0KLSAqIEByZXF1aXJlc0RlcGVuZGVuY3lSZXNvbHV0aW9uIGNvbXBpbGUNCi0gKiBAZ29hbCBtYWtlLWNvbnZlcnRlcnMNCi0gKiBAcGhhc2UgZ2VuZXJhdGUtc291cmNlcw0KLSAqLw0KLXB1YmxpYyBjbGFzcyBNYWtlQ29udmVydGVyc01vam8gZXh0ZW5kcyBBYnN0cmFjdE1vam8NCi17DQotICAgIC8qKg0KLSAgICAgKiBJbmplY3RlZCBNYXZlbiBwcm9qZWN0Lg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtZXRlciBleHByZXNzaW9uPSIke3Byb2plY3R9Ig0KLSAgICAgKiBAcmVhZG9ubHkNCi0gICAgICovDQotICAgIHByaXZhdGUgTWF2ZW5Qcm9qZWN0IHByb2plY3Q7DQotDQotICAgIC8qKg0KLSAgICAgKiBEZWZpbmVzIHRoZSBkaXJlY3Rvcnkgd2hlcmUgdGhlIG1ldGFkYXRhIGZpbGUgKE1FVEEtSU5GL215ZmFjZXMtbWV0YWRhdGEueG1sKSBpcyBsb2FkZWQuDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW1ldGVyIGV4cHJlc3Npb249IiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L2dlbmVyYXRlZC1yZXNvdXJjZXMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbiINCi0gICAgICogQHJlYWRvbmx5DQotICAgICAqLw0KLSAgICBwcml2YXRlIEZpbGUgYnVpbGREaXJlY3Rvcnk7DQotDQotICAgIC8qKg0KLSAgICAgKiBJbmplY3RlZCBuYW1lIG9mIGZpbGUgZ2VuZXJhdGVkIGJ5IGVhcmxpZXIgcnVuIG9mIEJ1aWxkTWV0YURhdGFNb2pvIGdvYWwuDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW1ldGVyDQotICAgICAqLw0KLSAgICBwcml2YXRlIFN0cmluZyBtZXRhZGF0YUZpbGUgPSAiTUVUQS1JTkYvbXlmYWNlcy1tZXRhZGF0YS54bWwiOw0KLQ0KLSAgICAvKioNCi0gICAgICogVGhlIGRpcmVjdG9yeSB1c2VkIHRvIGxvYWQgdGVtcGxhdGVzIGludG8gdmVsb2NpdHkgZW52aXJvbm1lbnQuDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW1ldGVyIGV4cHJlc3Npb249InNyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORiINCi0gICAgICovDQotICAgIHByaXZhdGUgRmlsZSB0ZW1wbGF0ZVNvdXJjZURpcmVjdG9yeTsNCi0NCi0gICAgLyoqDQotICAgICAqIFRoZSBkaXJlY3Rvcnkgd2hlcmUgYWxsIGdlbmVyYXRlZCBmaWxlcyBhcmUgY3JlYXRlZC4gVGhpcyBkaXJlY3RvcnkgaXMgYWRkZWQgYXMgYQ0KLSAgICAgKiBjb21waWxlIHNvdXJjZSByb290IGF1dG9tYXRpY2FsbHkgbGlrZSBzcmMvbWFpbi9qYXZhIGlzLiANCi0gICAgICogDQotICAgICAqIEBwYXJhbWV0ZXIgZXhwcmVzc2lvbj0iJHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vZ2VuZXJhdGVkLXNvdXJjZXMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbiINCi0gICAgICovDQotICAgIHByaXZhdGUgRmlsZSBnZW5lcmF0ZWRTb3VyY2VEaXJlY3Rvcnk7DQotDQotICAgIC8qKg0KLSAgICAgKiBPbmx5IGdlbmVyYXRlIHRhZyBjbGFzc2VzIHRoYXQgY29udGFpbnMgdGhhdCBwYWNrYWdlIHByZWZpeA0KLSAgICAgKiANCi0gICAgICogQHBhcmFtZXRlcg0KLSAgICAgKi8NCi0gICAgcHJpdmF0ZSBTdHJpbmcgcGFja2FnZUNvbnRhaW5zOw0KLQ0KLSAgICAvKioNCi0gICAgICogIExvZyBhbmQgY29udGludWUgZXhlY3V0aW9uIHdoZW4gZ2VuZXJhdGluZyBjb252ZXJ0ZXIgY2xhc3Nlcy4NCi0gICAgICogIDxwPg0KLSAgICAgKiAgSWYgdGhpcyBwcm9wZXJ0eSBpcyBzZXQgdG8gZmFsc2UgKGRlZmF1bHQpLCBlcnJvcnMgd2hlbiBhIGNvbnZlcnRlciBjbGFzcyBpcyBnZW5lcmF0ZWQgc3RvcHMNCi0gICAgICogIGV4ZWN1dGlvbiBpbW1lZGlhdGVseS4NCi0gICAgICogIDwvcD4NCi0gICAgICogDQotICAgICAqIEBwYXJhbWV0ZXINCi0gICAgICovDQotICAgIHByaXZhdGUgYm9vbGVhbiBmb3JjZTsNCi0NCi0gICAgLyoqDQotICAgICAqIERlZmluZXMgdGhlIGpzZiB2ZXJzaW9uICgxLjEgb3IgMS4yKSwgdXNlZCB0byB0YWtlIHRoZSBkZWZhdWx0IHRlbXBsYXRlcyBmb3IgZWFjaCB2ZXJzaW9uLg0KLSAgICAgKiA8cD4gDQotICAgICAqIElmIHZlcnNpb24gaXMgMS4xLCB0aGUgZGVmYXVsdCB0ZW1wbGF0ZUNvbnZlcnRlck5hbWUgaXMgJ2NvbnZlcnRlckNsYXNzMTEudm0nIGFuZCBpZiB2ZXJzaW9uDQotICAgICAqIGlzIDEuMiB0aGUgZGVmYXVsdCB0ZW1wbGF0ZUNvbnZlcnRlck5hbWUgaXMgJ2NvbnZlcnRlckNsYXNzMTIudm0nLg0KLSAgICAgKiA8L3A+DQotICAgICAqIA0KLSAgICAgKiBAcGFyYW1ldGVyDQotICAgICAqLw0KLSAgICBwcml2YXRlIFN0cmluZyBqc2ZWZXJzaW9uOw0KLSAgICANCi0gICAgLyoqDQotICAgICAqIERlZmluZSB0aGUgbW9kZWxzIHRoYXQgc2hvdWxkIGJlIGluY2x1ZGVkIHdoZW4gZ2VuZXJhdGUgY29udmVydGVyIGNsYXNzZXMuIElmIG5vdCBzZXQsIHRoZQ0KLSAgICAgKiBjdXJyZW50IG1vZGVsIGlkZW50aWZpZWQgYnkgdGhlIGFydGlmYWN0SWQgaXMgdXNlZC4NCi0gICAgICogPHA+DQotICAgICAqIEVhY2ggbW9kZWwgYnVpbHQgYnkgYnVpbGQtbWV0YWRhdGEgZ29hbCBoYXMgYSBtb2RlbElkLCB0aGF0IGJ5IGRlZmF1bHQgaXMgdGhlIGFydGlmYWN0SWQgb2YNCi0gICAgICogdGhlIHByb2plY3QuIFNldHRpbmcgdGhpcyBwcm9wZXJ0eSBkZWZpbmVzIHdoaWNoIG9iamVjdHMgdGllZCBpbiBhIHNwZWNpZmllZCBtb2RlbElkIHNob3VsZA0KLSAgICAgKiBiZSB0YWtlbiBpbnRvIGFjY291bnQuICANCi0gICAgICogPC9wPg0KLSAgICAgKiA8cD5JbiB0aGlzIGNhc2UsIGxpbWl0IGNvbnZlcnRlciB0YWcgZ2VuZXJhdGlvbiBvbmx5IHRvIHRoZSBjb21wb25lbnRzIGRlZmluZWQgaW4gdGhlIG1vZGVscyANCi0gICAgICogaWRlbnRpZmllZCBieSB0aGUgbW9kZWxJZCBkZWZpbmVkLiA8L3A+DQotICAgICAqIDxwPlRoaXMgaXMgdXNlZnVsIHdoZW4geW91IG5lZWQgdG8gZ2VuZXJhdGUgZmlsZXMgdGhhdCB0YWtlIGluZm9ybWF0aW9uIGRlZmluZWQgb24gb3RoZXINCi0gICAgICogcHJvamVjdHMuPC9wPg0KLSAgICAgKiA8cD5FeGFtcGxlOjwvcD4NCi0gICAgICogPHByZT4NCi0gICAgICogICAgJmx0O21vZGVsSWRzJmd0Ow0KLSAgICAgKiAgICAgICAgJmx0O21vZGVsSWQ+bW9kZWwxJmx0Oy9tb2RlbElkJmd0Ow0KLSAgICAgKiAgICAgICAgJmx0O21vZGVsSWQ+bW9kZWwyJmx0Oy9tb2RlbElkJmd0Ow0KLSAgICAgKiAgICAmbHQ7L21vZGVsSWRzJmd0Ow0KLSAgICAgKiA8L3ByZT4NCi0gICAgICogDQotICAgICAqIEBwYXJhbWV0ZXINCi0gICAgICovDQotICAgIHByaXZhdGUgTGlzdCBtb2RlbElkczsNCi0NCi0gICAgLyoqDQotICAgICAqIFRoZSBuYW1lIG9mIHRoZSB0ZW1wbGF0ZSB1c2VkIHRvIGdlbmVyYXRlIGNvbnZlcnRlciBjbGFzc2VzLiBBY2NvcmRpbmcgdG8gdGhlIHZhbHVlIG9uIA0KLSAgICAgKiBqc2ZWZXJzaW9uIHByb3BlcnR5IHRoZSBkZWZhdWx0IGlmIHRoaXMgcHJvcGVydHkgaXMgbm90IHNldCBjb3VsZCBiZSBjb252ZXJ0ZXJDbGFzczExLnZtICgxLjEpIG9yDQotICAgICAqIGNvbnZlcnRlckNsYXNzMTIudm0gKDEuMikNCi0gICAgICogDQotICAgICAqIEBwYXJhbWV0ZXIgDQotICAgICAqLw0KLSAgICBwcml2YXRlIFN0cmluZyB0ZW1wbGF0ZUNvbnZlcnRlck5hbWU7DQotICAgIA0KLSAgICAvKioNCi0gICAgICogVGhpcyBwYXJhbSBpcyB1c2VkIHRvIHNlYXJjaCBpbiB0aGlzIGZvbGRlciBpZiBzb21lIGZpbGUgdG8NCi0gICAgICogYmUgZ2VuZXJhdGVkIGV4aXN0cyBhbmQgYXZvaWQgZ2VuZXJhdGlvbiBhbmQgZHVwbGljYXRlIGV4Y2VwdGlvbi4NCi0gICAgICogDQotICAgICAqIEBwYXJhbWV0ZXIgZXhwcmVzc2lvbj0ic3JjL21haW4vamF2YSINCi0gICAgICovICAgIA0KLSAgICBwcml2YXRlIEZpbGUgbWFpblNvdXJjZURpcmVjdG9yeTsNCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBUaGlzIHBhcmFtIGlzIHVzZWQgdG8gc2VhcmNoIGluIHRoaXMgZm9sZGVyIGlmIHNvbWUgZmlsZSB0bw0KLSAgICAgKiBiZSBnZW5lcmF0ZWQgZXhpc3RzIGFuZCBhdm9pZCBnZW5lcmF0aW9uIGFuZCBkdXBsaWNhdGUgZXhjZXB0aW9uLg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtZXRlcg0KLSAgICAgKi8gICAgICAgIA0KLSAgICBwcml2YXRlIEZpbGUgbWFpblNvdXJjZURpcmVjdG9yeTI7DQotDQotICAgIC8qKg0KLSAgICAgKiBFeGVjdXRlIHRoZSBNb2pvLg0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIC8vIFRoaXMgY29tbWFuZCBtYWtlcyBNYXZlbiBjb21waWxlIHRoZSBnZW5lcmF0ZWQgc291cmNlOg0KLSAgICAgICAgLy8gZ2V0UHJvamVjdCgpLmFkZENvbXBpbGVTb3VyY2VSb290KCBhYnNvbHV0ZUdlbmVyYXRlZFBhdGguZ2V0UGF0aCgpICk7DQotICAgICAgICANCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHByb2plY3QuYWRkQ29tcGlsZVNvdXJjZVJvb3QoIGdlbmVyYXRlZFNvdXJjZURpcmVjdG9yeS5nZXRDYW5vbmljYWxQYXRoKCkgKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICBpZiAobW9kZWxJZHMgPT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIG1vZGVsSWRzID0gbmV3IEFycmF5TGlzdCgpOw0KLSAgICAgICAgICAgICAgICBtb2RlbElkcy5hZGQocHJvamVjdC5nZXRBcnRpZmFjdElkKCkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBNb2RlbCBtb2RlbCA9IElPVXRpbHMubG9hZE1vZGVsKG5ldyBGaWxlKGJ1aWxkRGlyZWN0b3J5LA0KLSAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGFGaWxlKSk7DQotICAgICAgICAgICAgbmV3IEZsYXR0ZW5lcihtb2RlbCkuZmxhdHRlbigpOw0KLSAgICAgICAgICAgIGdlbmVyYXRlQ29udmVydGVycyhtb2RlbCk7DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbigiRXJyb3IgZ2VuZXJhdGluZyBjb252ZXJ0ZXJzIiwgZSk7DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoQnVpbGRFeGNlcHRpb24gZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbigiRXJyb3IgZ2VuZXJhdGluZyBjb252ZXJ0ZXJzIiwgZSk7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgDQotICAgIA0KLSAgICBwcml2YXRlIFZlbG9jaXR5RW5naW5lIGluaXRWZWxvY2l0eSgpIHRocm93cyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIEZpbGUgdGVtcGxhdGUgPSBuZXcgRmlsZSh0ZW1wbGF0ZVNvdXJjZURpcmVjdG9yeSwgX2dldFRlbXBsYXRlTmFtZSgpKTsNCi0gICAgICAgIA0KLSAgICAgICAgaWYgKHRlbXBsYXRlLmV4aXN0cygpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGdldExvZygpLmluZm8oIlVzaW5nIHRlbXBsYXRlIGZyb20gZmlsZSBsb2FkZXI6ICIrdGVtcGxhdGUuZ2V0UGF0aCgpKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBnZXRMb2coKS5pbmZvKCJVc2luZyB0ZW1wbGF0ZSBmcm9tIGNsYXNzIGxvYWRlcjogTUVUQS1JTkYvIitfZ2V0VGVtcGxhdGVOYW1lKCkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICANCi0gICAgICAgIFZlbG9jaXR5RW5naW5lIHZlbG9jaXR5RW5naW5lID0gbmV3IFZlbG9jaXR5RW5naW5lKCk7DQotICAgICAgICAgICAgICAgIA0KLSAgICAgICAgdHJ5DQotICAgICAgICB7DQotICAgICAgICAgICAgdmVsb2NpdHlFbmdpbmUuc2V0UHJvcGVydHkoICJyZXNvdXJjZS5sb2FkZXIiLCAiZmlsZSwgY2xhc3MiICk7DQotICAgICAgICAgICAgdmVsb2NpdHlFbmdpbmUuc2V0UHJvcGVydHkoICJmaWxlLnJlc291cmNlLmxvYWRlci5jbGFzcyIsDQotICAgICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS52ZWxvY2l0eS5ydW50aW1lLnJlc291cmNlLmxvYWRlci5GaWxlUmVzb3VyY2VMb2FkZXIiKTsNCi0gICAgICAgICAgICB2ZWxvY2l0eUVuZ2luZS5zZXRQcm9wZXJ0eSggImZpbGUucmVzb3VyY2UubG9hZGVyLnBhdGgiLCB0ZW1wbGF0ZVNvdXJjZURpcmVjdG9yeS5nZXRQYXRoKCkpOw0KLSAgICAgICAgICAgIHZlbG9jaXR5RW5naW5lLnNldFByb3BlcnR5KCAiY2xhc3MucmVzb3VyY2UubG9hZGVyLmNsYXNzIiwNCi0gICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmJ1aWxkZXIudXRpbHMuUmVsYXRpdmVDbGFzc3BhdGhSZXNvdXJjZUxvYWRlciIgKTsNCi0gICAgICAgICAgICB2ZWxvY2l0eUVuZ2luZS5zZXRQcm9wZXJ0eSggImNsYXNzLnJlc291cmNlLmxvYWRlci5wYXRoIiwgIk1FVEEtSU5GIik7ICAgICAgICAgICAgDQotICAgICAgICAgICAgdmVsb2NpdHlFbmdpbmUuc2V0UHJvcGVydHkoICJ2ZWxvY2ltYWNyby5saWJyYXJ5IiwgImNvbnZlcnRlckNsYXNzTWFjcm9zMTEudm0iKTsNCi0gICAgICAgICAgICB2ZWxvY2l0eUVuZ2luZS5zZXRQcm9wZXJ0eSggInZlbG9jaW1hY3JvLnBlcm1pc3Npb25zLmFsbG93LmlubGluZSIsInRydWUiKTsNCi0gICAgICAgICAgICB2ZWxvY2l0eUVuZ2luZS5zZXRQcm9wZXJ0eSggInZlbG9jaW1hY3JvLnBlcm1pc3Npb25zLmFsbG93LmlubGluZS5sb2NhbC5zY29wZSIsICJ0cnVlIik7DQotICAgICAgICAgICAgdmVsb2NpdHlFbmdpbmUuc2V0UHJvcGVydHkoICJkaXJlY3RpdmUuZm9yZWFjaC5jb3VudGVyLmluaXRpYWwudmFsdWUiLCIwIik7DQotICAgICAgICAgICAgLy92ZWxvY2l0eUVuZ2luZS5zZXRQcm9wZXJ0eSggUnVudGltZUNvbnN0YW50cy5SVU5USU1FX0xPR19MT0dTWVNURU1fQ0xBU1MsDQotICAgICAgICAgICAgLy8gICAgIm9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uYnVpbGRlci51dGlscy5Db25zb2xlTG9nU3lzdGVtIiApOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIHZlbG9jaXR5RW5naW5lLnNldFByb3BlcnR5KFJ1bnRpbWVDb25zdGFudHMuUlVOVElNRV9MT0dfTE9HU1lTVEVNLA0KLSAgICAgICAgICAgICAgICAgICAgbmV3IE1hdmVuUGx1Z2luQ29uc29sZUxvZ1N5c3RlbSh0aGlzLmdldExvZygpKSk7DQotDQotICAgICAgICAgICAgdmVsb2NpdHlFbmdpbmUuaW5pdCgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uKCJFcnJvciBjcmVhdGluZyBWZWxvY2l0eUVuZ2luZSIsIGUpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICByZXR1cm4gdmVsb2NpdHlFbmdpbmU7DQotICAgIH0NCi0gICAgDQotDQotICAgIC8qKg0KLSAgICAgKiBHZW5lcmF0ZXMgcGFyc2VkIGNvbnZlcnRlcnMuDQotICAgICAqLw0KLSAgICBwcml2YXRlIHZvaWQgZ2VuZXJhdGVDb252ZXJ0ZXJzKE1vZGVsIG1vZGVsKSB0aHJvd3MgSU9FeGNlcHRpb24sDQotICAgICAgICAgICAgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICAvLyBNYWtlIHN1cmUgZ2VuZXJhdGVkIHNvdXJjZSBkaXJlY3RvcnkgDQotICAgICAgICAvLyBpcyBhZGRlZCB0byBjb21waWxhdGlvbiBzb3VyY2UgcGF0aCANCi0gICAgICAgIC8vcHJvamVjdC5hZGRDb21waWxlU291cmNlUm9vdChnZW5lcmF0ZWRTb3VyY2VEaXJlY3RvcnkuZ2V0Q2Fub25pY2FsUGF0aCgpKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy9Jbml0IFFkb3ggZm9yIGV4dHJhY3QgY29kZSANCi0gICAgICAgIEphdmFEb2NCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgSmF2YURvY0J1aWxkZXIoKTsNCi0gICAgICAgIA0KLSAgICAgICAgTGlzdCBzb3VyY2VEaXJzID0gcHJvamVjdC5nZXRDb21waWxlU291cmNlUm9vdHMoKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gbmVlZCBhIEZpbGUgb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgb3JpZ2luYWwgc291cmNlIHRyZWUNCi0gICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IHNvdXJjZURpcnMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIFN0cmluZyBzcmNEaXIgPSAoU3RyaW5nKSBpLm5leHQoKTsNCi0gICAgICAgICAgICBidWlsZGVyLmFkZFNvdXJjZVRyZWUobmV3IEZpbGUoc3JjRGlyKSk7DQotICAgICAgICB9ICAgICAgICANCi0gICAgICAgIA0KLSAgICAgICAgLy9Jbml0IHZlbG9jaXR5DQotICAgICAgICBWZWxvY2l0eUVuZ2luZSB2ZWxvY2l0eUVuZ2luZSA9IGluaXRWZWxvY2l0eSgpOw0KLQ0KLSAgICAgICAgVmVsb2NpdHlDb250ZXh0IGJhc2VDb250ZXh0ID0gbmV3IFZlbG9jaXR5Q29udGV4dCgpOw0KLSAgICAgICAgYmFzZUNvbnRleHQucHV0KCJ1dGlscyIsIG5ldyBNeWZhY2VzVXRpbHMoKSk7DQotICAgICAgICANCi0gICAgICAgIGZvciAoSXRlcmF0b3IgaXQgPSBtb2RlbC5nZXRDb252ZXJ0ZXJzKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBDb252ZXJ0ZXJNZXRhIGNvbnZlcnRlciA9IChDb252ZXJ0ZXJNZXRhKSBpdC5uZXh0KCk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgaWYgKGNvbnZlcnRlci5nZXRDbGFzc05hbWUoKSAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgRmlsZSBmID0gbmV3IEZpbGUobWFpblNvdXJjZURpcmVjdG9yeSwgU3RyaW5nVXRpbHMucmVwbGFjZSgNCi0gICAgICAgICAgICAgICAgICAgIGNvbnZlcnRlci5nZXRDbGFzc05hbWUoKSwgIi4iLCAiLyIpKyIuamF2YSIpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgICAgIGlmICghZi5leGlzdHMoKSAmJiBjYW5HZW5lcmF0ZUNvbnZlcnRlcihjb252ZXJ0ZXIpKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBpZiAobWFpblNvdXJjZURpcmVjdG9yeTIgIT0gbnVsbCkNCi0gICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBGaWxlIGYyID0gbmV3IEZpbGUobWFpblNvdXJjZURpcmVjdG9yeTIsIFN0cmluZ1V0aWxzLnJlcGxhY2UoDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb252ZXJ0ZXIuZ2V0Q2xhc3NOYW1lKCksICIuIiwgIi8iKSsiLmphdmEiKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZjIuZXhpc3RzKCkpDQotICAgICAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL1NraXANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgZ2V0TG9nKCkuaW5mbygiR2VuZXJhdGluZyBjb252ZXJ0ZXIgY2xhc3M6Iitjb252ZXJ0ZXIuZ2V0Q2xhc3NOYW1lKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgdHJ5DQotICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgX2dlbmVyYXRlQ29udmVydGVyKHZlbG9jaXR5RW5naW5lLCBidWlsZGVyLGNvbnZlcnRlcixiYXNlQ29udGV4dCk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBjYXRjaChNb2pvRXhlY3V0aW9uRXhjZXB0aW9uIGUpDQotICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZvcmNlKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TG9nKCkuZXJyb3IoZS5nZXRNZXNzYWdlKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlDQotICAgICAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL1N0b3AgZXhlY3V0aW9uIHRocm93aW5nIGV4Y2VwdGlvbg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0gICAgICAgIA0KLSAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgYm9vbGVhbiBjYW5HZW5lcmF0ZUNvbnZlcnRlcihDb252ZXJ0ZXJNZXRhIGNvbnZlcnRlcikNCi0gICAgew0KLSAgICAgICAgaWYgKCBtb2RlbElkcy5jb250YWlucyhjb252ZXJ0ZXIuZ2V0TW9kZWxJZCgpKQ0KLSAgICAgICAgICAgICAgICAmJiBpbmNsdWRlUGFja2FnZShjb252ZXJ0ZXIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICANCi0gICAgcHVibGljIGJvb2xlYW4gaW5jbHVkZVBhY2thZ2UoQ29udmVydGVyTWV0YSBjb252ZXJ0ZXIpDQotICAgIHsNCi0gICAgICAgIGlmIChwYWNrYWdlQ29udGFpbnMgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAoTXlmYWNlc1V0aWxzLmdldFBhY2thZ2VGcm9tRnVsbENsYXNzKGNvbnZlcnRlci5nZXRDbGFzc05hbWUoKSkuc3RhcnRzV2l0aChwYWNrYWdlQ29udGFpbnMpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICB9ICAgICAgICANCi0gICAgfQ0KLSAgICANCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBHZW5lcmF0ZXMgYSBwYXJzZWQgY29udmVydGVyLg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIGNvbnZlcnRlcg0KLSAgICAgKiAgICAgICAgICAgIHRoZSBwYXJzZWQgY29udmVydGVyIG1ldGFkYXRhDQotICAgICAqLw0KLSAgICBwcml2YXRlIHZvaWQgX2dlbmVyYXRlQ29udmVydGVyKFZlbG9jaXR5RW5naW5lIHZlbG9jaXR5RW5naW5lLA0KLSAgICAgICAgICAgIEphdmFEb2NCdWlsZGVyIGJ1aWxkZXIsDQotICAgICAgICAgICAgQ29udmVydGVyTWV0YSBjb252ZXJ0ZXIsIFZlbG9jaXR5Q29udGV4dCBiYXNlQ29udGV4dCkNCi0gICAgICAgICAgICB0aHJvd3MgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBDb250ZXh0IGNvbnRleHQgPSBuZXcgVmVsb2NpdHlDb250ZXh0KGJhc2VDb250ZXh0KTsNCi0gICAgICAgIGNvbnRleHQucHV0KCJjb252ZXJ0ZXIiLCBjb252ZXJ0ZXIpOw0KLSAgICAgICAgDQotICAgICAgICBXcml0ZXIgd3JpdGVyID0gbnVsbDsNCi0gICAgICAgIEZpbGUgb3V0RmlsZSA9IG51bGw7DQotDQotICAgICAgICB0cnkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBvdXRGaWxlID0gbmV3IEZpbGUoZ2VuZXJhdGVkU291cmNlRGlyZWN0b3J5LCBTdHJpbmdVdGlscy5yZXBsYWNlKA0KLSAgICAgICAgICAgICAgICAgICAgY29udmVydGVyLmdldENsYXNzTmFtZSgpLCAiLiIsICIvIikrIi5qYXZhIik7DQotDQotICAgICAgICAgICAgaWYgKCAhb3V0RmlsZS5nZXRQYXJlbnRGaWxlKCkuZXhpc3RzKCkgKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgb3V0RmlsZS5nZXRQYXJlbnRGaWxlKCkubWtkaXJzKCk7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIHdyaXRlciA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIobmV3IEZpbGVPdXRwdXRTdHJlYW0ob3V0RmlsZSkpOw0KLQ0KLSAgICAgICAgICAgIFRlbXBsYXRlIHRlbXBsYXRlID0gdmVsb2NpdHlFbmdpbmUuZ2V0VGVtcGxhdGUoX2dldFRlbXBsYXRlTmFtZSgpKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICB0ZW1wbGF0ZS5tZXJnZShjb250ZXh0LCB3cml0ZXIpOw0KLQ0KLSAgICAgICAgICAgIHdyaXRlci5mbHVzaCgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uKA0KLSAgICAgICAgICAgICAgICAgICAgIkVycm9yIG1lcmdpbmcgdmVsb2NpdHkgdGVtcGxhdGVzOiAiICsgZS5nZXRNZXNzYWdlKCksIGUpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZmluYWxseQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIElPVXRpbC5jbG9zZSh3cml0ZXIpOw0KLSAgICAgICAgICAgIHdyaXRlciA9IG51bGw7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgICAgICAgICAgICAgDQotICAgIHByaXZhdGUgU3RyaW5nIF9nZXRUZW1wbGF0ZU5hbWUoKQ0KLSAgICB7DQotICAgICAgICBpZiAodGVtcGxhdGVDb252ZXJ0ZXJOYW1lID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKF9pczEyKCkgfHwgX2lzMjAoKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiAiY29udmVydGVyQ2xhc3MxMi52bSI7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiAiY29udmVydGVyQ2xhc3MxMS52bSI7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiB0ZW1wbGF0ZUNvbnZlcnRlck5hbWU7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgDQotICAgIHByaXZhdGUgYm9vbGVhbiBfaXMxMigpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAiMS4yIi5lcXVhbHMoanNmVmVyc2lvbikgfHwgIjEyIi5lcXVhbHMoanNmVmVyc2lvbik7DQotICAgIH0NCi0NCi0NCi0gICAgcHJpdmF0ZSBib29sZWFuIF9pczIwKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuICIyLjAiLmVxdWFscyhqc2ZWZXJzaW9uKSB8fCAiMjAiLmVxdWFscyhqc2ZWZXJzaW9uKTsNCi0gICAgfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL01ha2VUYWdzTW9qby5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9NYWtlVGFnc01vam8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjk5YjllMy4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL01ha2VUYWdzTW9qby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQ2ICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5idWlsZGVyOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uV3JpdGVyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uQWJzdHJhY3RNb2pvOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLk1vam9FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wcm9qZWN0Lk1hdmVuUHJvamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmJ1aWxkZXIubW9kZWwuQ29tcG9uZW50TWV0YTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmJ1aWxkZXIubW9kZWwuTW9kZWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5idWlsZGVyLnV0aWxzLkJ1aWxkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uYnVpbGRlci51dGlscy5NYXZlblBsdWdpbkNvbnNvbGVMb2dTeXN0ZW07Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5idWlsZGVyLnV0aWxzLk15ZmFjZXNVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLnZlbG9jaXR5LlRlbXBsYXRlOwotaW1wb3J0IG9yZy5hcGFjaGUudmVsb2NpdHkuVmVsb2NpdHlDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUudmVsb2NpdHkuYXBwLlZlbG9jaXR5RW5naW5lOwotaW1wb3J0IG9yZy5hcGFjaGUudmVsb2NpdHkuY29udGV4dC5Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUudmVsb2NpdHkucnVudGltZS5SdW50aW1lQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMudXRpbC5JT1V0aWw7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy51dGlsLlN0cmluZ1V0aWxzOwotCi0vKioKLSAqIE1hdmVuIGdvYWwgdG8gZ2VuZXJhdGUgamF2YSBzb3VyY2UgY29kZSBmb3IgQ29tcG9uZW50IHRhZyBjbGFzc2VzLgotICogCi0gKiA8cD5JdCB1c2VzIHZlbG9jaXR5IHRvIGdlbmVyYXRlIHRlbXBsYXRlcywgYW5kIGhhcyB0aGUgb3B0aW9uIHRvIGRlZmluZSBjdXN0b20gdGVtcGxhdGVzLjwvcD4KLSAqIDxwPlRoZSBleGVjdXRlZCB0ZW1wbGF0ZSBoYXMgdGhlIGZvbGxvd2luZyB2YXJpYWJsZXMgYXZhaWxhYmxlIHRvIGl0OjwvcD4KLSAqIDx1bD4KLSAqICA8bGk+dXRpbHMgOiBSZXR1cm5zIGFuIGluc3RhbmNlIG9mIAotICogIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uYnVpbGRlci51dGlscy5NeWZhY2VzVXRpbHMsIAotICogIGl0IGNvbnRhaW5zIHNvbWUgdXNlZnVsIG1ldGhvZHMuPC9saT4KLSAqICA8bGk+Y29tcG9uZW50IDogUmV0dXJucyB0aGUgY3VycmVudCBpbnN0YW5jZSBvZgotICogICBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmJ1aWxkZXIubW9kZWwuQ29tcG9uZW50TWV0YTwvbGk+Ci0gKiA8L3VsPgotICogCi0gKiBAdmVyc2lvbiAkSWQkCi0gKiBAcmVxdWlyZXNEZXBlbmRlbmN5UmVzb2x1dGlvbiBjb21waWxlCi0gKiBAZ29hbCBtYWtlLXRhZ3MKLSAqIEBwaGFzZSBnZW5lcmF0ZS1zb3VyY2VzCi0gKi8KLXB1YmxpYyBjbGFzcyBNYWtlVGFnc01vam8gZXh0ZW5kcyBBYnN0cmFjdE1vam8KLXsKLSAgICAvKioKLSAgICAgKiBJbmplY3RlZCBNYXZlbiBwcm9qZWN0LgotICAgICAqIAotICAgICAqIEBwYXJhbWV0ZXIgZXhwcmVzc2lvbj0iJHtwcm9qZWN0fSIKLSAgICAgKiBAcmVhZG9ubHkKLSAgICAgKi8KLSAgICBwcml2YXRlIE1hdmVuUHJvamVjdCBwcm9qZWN0OwotCi0gICAgLyoqCi0gICAgICogRGVmaW5lcyB0aGUgZGlyZWN0b3J5IHdoZXJlIHRoZSBtZXRhZGF0YSBmaWxlIChNRVRBLUlORi9teWZhY2VzLW1ldGFkYXRhLnhtbCkgaXMgbG9hZGVkLgotICAgICAqIAotICAgICAqIEBwYXJhbWV0ZXIgZXhwcmVzc2lvbj0iJHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vZ2VuZXJhdGVkLXJlc291cmNlcy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luIgotICAgICAqLwotICAgIHByaXZhdGUgRmlsZSBidWlsZERpcmVjdG9yeTsKLQotICAgIC8qKgotICAgICAqIEluamVjdGVkIG5hbWUgb2YgZmlsZSBnZW5lcmF0ZWQgYnkgZWFybGllciBydW4gb2YgQnVpbGRNZXRhRGF0YU1vam8gZ29hbC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW1ldGVyCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgbWV0YWRhdGFGaWxlID0gIk1FVEEtSU5GL215ZmFjZXMtbWV0YWRhdGEueG1sIjsKLQotICAgIC8qKgotICAgICAqIFRoZSBkaXJlY3RvcnkgdXNlZCB0byBsb2FkIHRlbXBsYXRlcyBpbnRvIHZlbG9jaXR5IGVudmlyb25tZW50LgotICAgICAqIAotICAgICAqIEBwYXJhbWV0ZXIgZXhwcmVzc2lvbj0ic3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GIgotICAgICAqLwotICAgIHByaXZhdGUgRmlsZSB0ZW1wbGF0ZVNvdXJjZURpcmVjdG9yeTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBUaGlzIHBhcmFtIGlzIHVzZWQgdG8gc2VhcmNoIGluIHRoaXMgZm9sZGVyIGlmIHNvbWUgZmlsZSB0bwotICAgICAqIGJlIGdlbmVyYXRlZCBleGlzdHMgYW5kIGF2b2lkIGdlbmVyYXRpb24gYW5kIGR1cGxpY2F0ZSBleGNlcHRpb24uCi0gICAgICogCi0gICAgICogQHBhcmFtZXRlciBleHByZXNzaW9uPSJzcmMvbWFpbi9qYXZhIgotICAgICAqLyAgICAKLSAgICBwcml2YXRlIEZpbGUgbWFpblNvdXJjZURpcmVjdG9yeTsKLQotICAgIC8qKgotICAgICAqIFRoaXMgcGFyYW0gaXMgdXNlZCB0byBzZWFyY2ggaW4gdGhpcyBmb2xkZXIgaWYgc29tZSBmaWxlIHRvCi0gICAgICogYmUgZ2VuZXJhdGVkIGV4aXN0cyBhbmQgYXZvaWQgZ2VuZXJhdGlvbiBhbmQgZHVwbGljYXRlIGV4Y2VwdGlvbi4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW1ldGVyCi0gICAgICovICAgICAgICAKLSAgICBwcml2YXRlIEZpbGUgbWFpblNvdXJjZURpcmVjdG9yeTI7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgbmFtZSBvZiB0aGUgdGVtcGxhdGUgdXNlZCB0byBnZW5lcmF0ZSBjb21wb25lbnQgdGFnIGNsYXNzZXMuIEFjY29yZGluZyB0byB0aGUgdmFsdWUgb24gCi0gICAgICoganNmVmVyc2lvbiBwcm9wZXJ0eSB0aGUgZGVmYXVsdCBpZiB0aGlzIHByb3BlcnR5IGlzIG5vdCBzZXQgY291bGQgYmUgdGFnQ2xhc3MxMS52bSAoMS4xKSBvcgotICAgICAqIHRhZ0NsYXNzMTIudm0gKDEuMikKLSAgICAgKiAKLSAgICAgKiBAcGFyYW1ldGVyIAotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIHRlbXBsYXRlVGFnTmFtZTsKLQotICAgIC8qKgotICAgICAqIFRoZSBkaXJlY3Rvcnkgd2hlcmUgYWxsIGdlbmVyYXRlZCBmaWxlcyBhcmUgY3JlYXRlZC4gVGhpcyBkaXJlY3RvcnkgaXMgYWRkZWQgYXMgYQotICAgICAqIGNvbXBpbGUgc291cmNlIHJvb3QgYXV0b21hdGljYWxseSBsaWtlIHNyYy9tYWluL2phdmEgaXMuIAotICAgICAqIAotICAgICAqIEBwYXJhbWV0ZXIgZXhwcmVzc2lvbj0iJHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vZ2VuZXJhdGVkLXNvdXJjZXMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbiIKLSAgICAgKiBAcmVxdWlyZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIEZpbGUgZ2VuZXJhdGVkU291cmNlRGlyZWN0b3J5OwotCi0gICAgLyoqCi0gICAgICogT25seSBnZW5lcmF0ZSB0YWcgY2xhc3NlcyB0aGF0IGNvbnRhaW5zIHRoYXQgcGFja2FnZSBwcmVmaXgKLSAgICAgKiAKLSAgICAgKiBAcGFyYW1ldGVyCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgcGFja2FnZUNvbnRhaW5zOwotCi0gICAgLyoqCi0gICAgICogT25seSBnZW5lcmF0ZSB0YWcgY2xhc3NlcyB0aGF0IGl0cyBjb21wb25lbnQgc3RhcnRzIHdpdGggdGhpcyB0eXBlIHByZWZpeAotICAgICAqIAotICAgICAqIEBwYXJhbWV0ZXIKLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyB0eXBlUHJlZml4OwotICAgIAotICAgIC8qKgotICAgICAqICBMb2cgYW5kIGNvbnRpbnVlIGV4ZWN1dGlvbiB3aGVuIGdlbmVyYXRpbmcgY29tcG9uZW50IHRhZyBjbGFzc2VzLgotICAgICAqICA8cD4KLSAgICAgKiAgSWYgdGhpcyBwcm9wZXJ0eSBpcyBzZXQgdG8gZmFsc2UgKGRlZmF1bHQpLCBlcnJvcnMgd2hlbiBhIGNvbXBvbmVudCB0YWcgY2xhc3MgaXMgZ2VuZXJhdGVkIHN0b3BzCi0gICAgICogIGV4ZWN1dGlvbiBpbW1lZGlhdGVseS4KLSAgICAgKiAgPC9wPgotICAgICAqIAotICAgICAqIEBwYXJhbWV0ZXIKLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gZm9yY2U7Ci0KLSAgICAvKioKLSAgICAgKiBEZWZpbmVzIHRoZSBqc2YgdmVyc2lvbiAoMS4xIG9yIDEuMiksIHVzZWQgdG8gdGFrZSB0aGUgZGVmYXVsdCB0ZW1wbGF0ZXMgZm9yIGVhY2ggdmVyc2lvbi4KLSAgICAgKiA8cD4gCi0gICAgICogSWYgdmVyc2lvbiBpcyAxLjEsIHRoZSBkZWZhdWx0IHRlbXBsYXRlVGFnTmFtZSBpcyAndGFnQ2xhc3MxMS52bScgYW5kIGlmIHZlcnNpb24KLSAgICAgKiBpcyAxLjIgdGhlIGRlZmF1bHQgdGVtcGxhdGVUYWdOYW1lIGlzICd0YWdDbGFzczEyLnZtJy4KLSAgICAgKiA8L3A+Ci0gICAgICogCi0gICAgICogQHBhcmFtZXRlcgotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIGpzZlZlcnNpb247Ci0gICAgCi0gICAgLyoqCi0gICAgICogRGVmaW5lIHRoZSBtb2RlbHMgdGhhdCBzaG91bGQgYmUgaW5jbHVkZWQgd2hlbiBnZW5lcmF0ZSBjb21wb25lbnQgdGFnIGNsYXNzZXMuIElmIG5vdCBzZXQsIHRoZQotICAgICAqIGN1cnJlbnQgbW9kZWwgaWRlbnRpZmllZCBieSB0aGUgYXJ0aWZhY3RJZCBpcyB1c2VkLgotICAgICAqIDxwPgotICAgICAqIEVhY2ggbW9kZWwgYnVpbHQgYnkgYnVpbGQtbWV0YWRhdGEgZ29hbCBoYXMgYSBtb2RlbElkLCB0aGF0IGJ5IGRlZmF1bHQgaXMgdGhlIGFydGlmYWN0SWQgb2YKLSAgICAgKiB0aGUgcHJvamVjdC4gU2V0dGluZyB0aGlzIHByb3BlcnR5IGRlZmluZXMgd2hpY2ggb2JqZWN0cyB0aWVkIGluIGEgc3BlY2lmaWVkIG1vZGVsSWQgc2hvdWxkCi0gICAgICogYmUgdGFrZW4gaW50byBhY2NvdW50LiAgCi0gICAgICogPC9wPgotICAgICAqIDxwPkluIHRoaXMgY2FzZSwgbGltaXQgY29tcG9uZW50IHRhZyBnZW5lcmF0aW9uIG9ubHkgdG8gdGhlIGNvbXBvbmVudHMgZGVmaW5lZCBpbiB0aGUgbW9kZWxzIAotICAgICAqIGlkZW50aWZpZWQgYnkgdGhlIG1vZGVsSWQgZGVmaW5lZC4gPC9wPgotICAgICAqIDxwPlRoaXMgaXMgdXNlZnVsIHdoZW4geW91IG5lZWQgdG8gZ2VuZXJhdGUgZmlsZXMgdGhhdCB0YWtlIGluZm9ybWF0aW9uIGRlZmluZWQgb24gb3RoZXIKLSAgICAgKiBwcm9qZWN0cy48L3A+Ci0gICAgICogPHA+RXhhbXBsZTo8L3A+Ci0gICAgICogPHByZT4KLSAgICAgKiAgICAmbHQ7bW9kZWxJZHMmZ3Q7Ci0gICAgICogICAgICAgICZsdDttb2RlbElkPm1vZGVsMSZsdDsvbW9kZWxJZCZndDsKLSAgICAgKiAgICAgICAgJmx0O21vZGVsSWQ+bW9kZWwyJmx0Oy9tb2RlbElkJmd0OwotICAgICAqICAgICZsdDsvbW9kZWxJZHMmZ3Q7Ci0gICAgICogPC9wcmU+Ci0gICAgICogCi0gICAgICogQHBhcmFtZXRlcgotICAgICAqLwotICAgIHByaXZhdGUgTGlzdCBtb2RlbElkczsKLSAgICAKLSAgICAvKioKLSAgICAgKiBFeGVjdXRlIHRoZSBNb2pvLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgLy8gVGhpcyBjb21tYW5kIG1ha2VzIE1hdmVuIGNvbXBpbGUgdGhlIGdlbmVyYXRlZCBzb3VyY2U6Ci0gICAgICAgIC8vIGdldFByb2plY3QoKS5hZGRDb21waWxlU291cmNlUm9vdCggYWJzb2x1dGVHZW5lcmF0ZWRQYXRoLmdldFBhdGgoKSApOwotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgcHJvamVjdC5hZGRDb21waWxlU291cmNlUm9vdCggZ2VuZXJhdGVkU291cmNlRGlyZWN0b3J5LmdldENhbm9uaWNhbFBhdGgoKSApOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAobW9kZWxJZHMgPT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBtb2RlbElkcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgICAgICAgICBtb2RlbElkcy5hZGQocHJvamVjdC5nZXRBcnRpZmFjdElkKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgTW9kZWwgbW9kZWwgPSBJT1V0aWxzLmxvYWRNb2RlbChuZXcgRmlsZShidWlsZERpcmVjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGFGaWxlKSk7Ci0gICAgICAgICAgICBuZXcgRmxhdHRlbmVyKG1vZGVsKS5mbGF0dGVuKCk7Ci0gICAgICAgICAgICBnZW5lcmF0ZUNvbXBvbmVudHMobW9kZWwpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbigiRXJyb3IgZ2VuZXJhdGluZyBjb21wb25lbnRzIiwgZSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uKCJFcnJvciBnZW5lcmF0aW5nIGNvbXBvbmVudHMiLCBlKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAgICAgCi0gICAgcHJpdmF0ZSBWZWxvY2l0eUVuZ2luZSBpbml0VmVsb2NpdHkoKSB0aHJvd3MgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgRmlsZSB0ZW1wbGF0ZSA9IG5ldyBGaWxlKHRlbXBsYXRlU291cmNlRGlyZWN0b3J5LCBfZ2V0VGVtcGxhdGVUYWdOYW1lKCkpOwotICAgICAgICAKLSAgICAgICAgaWYgKHRlbXBsYXRlLmV4aXN0cygpKQotICAgICAgICB7Ci0gICAgICAgICAgICBnZXRMb2coKS5pbmZvKCJVc2luZyB0ZW1wbGF0ZSBmcm9tIGZpbGUgbG9hZGVyOiAiK3RlbXBsYXRlLmdldFBhdGgoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBnZXRMb2coKS5pbmZvKCJVc2luZyB0ZW1wbGF0ZSBmcm9tIGNsYXNzIGxvYWRlcjogTUVUQS1JTkYvIitfZ2V0VGVtcGxhdGVUYWdOYW1lKCkpOwotICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgIFZlbG9jaXR5RW5naW5lIHZlbG9jaXR5RW5naW5lID0gbmV3IFZlbG9jaXR5RW5naW5lKCk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICB2ZWxvY2l0eUVuZ2luZS5zZXRQcm9wZXJ0eSggInJlc291cmNlLmxvYWRlciIsICJmaWxlLCBjbGFzcyIgKTsKLSAgICAgICAgICAgIHZlbG9jaXR5RW5naW5lLnNldFByb3BlcnR5KCAiZmlsZS5yZXNvdXJjZS5sb2FkZXIuY2xhc3MiLAotICAgICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS52ZWxvY2l0eS5ydW50aW1lLnJlc291cmNlLmxvYWRlci5GaWxlUmVzb3VyY2VMb2FkZXIiKTsKLSAgICAgICAgICAgIHZlbG9jaXR5RW5naW5lLnNldFByb3BlcnR5KCAiZmlsZS5yZXNvdXJjZS5sb2FkZXIucGF0aCIsIHRlbXBsYXRlU291cmNlRGlyZWN0b3J5LmdldFBhdGgoKSk7Ci0gICAgICAgICAgICB2ZWxvY2l0eUVuZ2luZS5zZXRQcm9wZXJ0eSggImNsYXNzLnJlc291cmNlLmxvYWRlci5jbGFzcyIsCi0gICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmJ1aWxkZXIudXRpbHMuUmVsYXRpdmVDbGFzc3BhdGhSZXNvdXJjZUxvYWRlciIgKTsKLSAgICAgICAgICAgIHZlbG9jaXR5RW5naW5lLnNldFByb3BlcnR5KCAiY2xhc3MucmVzb3VyY2UubG9hZGVyLnBhdGgiLCAiTUVUQS1JTkYiKTsgICAgICAgICAgICAKLSAgICAgICAgICAgIHZlbG9jaXR5RW5naW5lLnNldFByb3BlcnR5KCAidmVsb2NpbWFjcm8ubGlicmFyeSIsICJ0YWdDbGFzc01hY3JvczExLnZtIik7Ci0gICAgICAgICAgICB2ZWxvY2l0eUVuZ2luZS5zZXRQcm9wZXJ0eSggInZlbG9jaW1hY3JvLnBlcm1pc3Npb25zLmFsbG93LmlubGluZSIsInRydWUiKTsKLSAgICAgICAgICAgIHZlbG9jaXR5RW5naW5lLnNldFByb3BlcnR5KCAidmVsb2NpbWFjcm8ucGVybWlzc2lvbnMuYWxsb3cuaW5saW5lLmxvY2FsLnNjb3BlIiwgInRydWUiKTsKLSAgICAgICAgICAgIHZlbG9jaXR5RW5naW5lLnNldFByb3BlcnR5KCAiZGlyZWN0aXZlLmZvcmVhY2guY291bnRlci5pbml0aWFsLnZhbHVlIiwiMCIpOwotICAgICAgICAgICAgLy92ZWxvY2l0eUVuZ2luZS5zZXRQcm9wZXJ0eSggUnVudGltZUNvbnN0YW50cy5SVU5USU1FX0xPR19MT0dTWVNURU1fQ0xBU1MsCi0gICAgICAgICAgICAvLyAgICAib3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5idWlsZGVyLnV0aWxzLkNvbnNvbGVMb2dTeXN0ZW0iICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHZlbG9jaXR5RW5naW5lLnNldFByb3BlcnR5KFJ1bnRpbWVDb25zdGFudHMuUlVOVElNRV9MT0dfTE9HU1lTVEVNLAotICAgICAgICAgICAgICAgICAgICBuZXcgTWF2ZW5QbHVnaW5Db25zb2xlTG9nU3lzdGVtKHRoaXMuZ2V0TG9nKCkpKTsKLQotICAgICAgICAgICAgdmVsb2NpdHlFbmdpbmUuaW5pdCgpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IE1vam9FeGVjdXRpb25FeGNlcHRpb24oIkVycm9yIGNyZWF0aW5nIFZlbG9jaXR5RW5naW5lIiwgZSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiB2ZWxvY2l0eUVuZ2luZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZW5lcmF0ZXMgcGFyc2VkIGNvbXBvbmVudHMuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGdlbmVyYXRlQ29tcG9uZW50cyhNb2RlbCBtb2RlbCkgdGhyb3dzIElPRXhjZXB0aW9uLAotICAgICAgICAgICAgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgVmVsb2NpdHlFbmdpbmUgdmVsb2NpdHlFbmdpbmUgPSBpbml0VmVsb2NpdHkoKTsKLQotICAgICAgICBWZWxvY2l0eUNvbnRleHQgYmFzZUNvbnRleHQgPSBuZXcgVmVsb2NpdHlDb250ZXh0KCk7Ci0gICAgICAgIGJhc2VDb250ZXh0LnB1dCgidXRpbHMiLCBuZXcgTXlmYWNlc1V0aWxzKCkpOwotICAgICAgICAKLSAgICAgICAgZm9yIChJdGVyYXRvciBpdCA9IG1vZGVsLmdldENvbXBvbmVudHMoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KQotICAgICAgICB7Ci0gICAgICAgICAgICBDb21wb25lbnRNZXRhIGNvbXBvbmVudCA9IChDb21wb25lbnRNZXRhKSBpdC5uZXh0KCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChjb21wb25lbnQuZ2V0VGFnQ2xhc3MoKSAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEZpbGUgZiA9IG5ldyBGaWxlKG1haW5Tb3VyY2VEaXJlY3RvcnksIFN0cmluZ1V0aWxzLnJlcGxhY2UoCi0gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC5nZXRUYWdDbGFzcygpLCAiLiIsICIvIikrIi5qYXZhIik7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYgKCFmLmV4aXN0cygpICYmIGNhbkdlbmVyYXRlQ29tcG9uZW50VGFnKGNvbXBvbmVudCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAobWFpblNvdXJjZURpcmVjdG9yeTIgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgRmlsZSBmMiA9IG5ldyBGaWxlKG1haW5Tb3VyY2VEaXJlY3RvcnkyLCBTdHJpbmdVdGlscy5yZXBsYWNlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQuZ2V0VGFnQ2xhc3MoKSwgIi4iLCAiLyIpKyIuamF2YSIpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGYyLmV4aXN0cygpKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vU2tpcAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGdldExvZygpLmluZm8oIkdlbmVyYXRpbmcgdGFnIGNsYXNzOiIrY29tcG9uZW50LmdldFRhZ0NsYXNzKCkpOwotICAgICAgICAgICAgICAgICAgICB0cnkgCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIF9nZW5lcmF0ZUNvbXBvbmVudCh2ZWxvY2l0eUVuZ2luZSwgY29tcG9uZW50LGJhc2VDb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBjYXRjaChNb2pvRXhlY3V0aW9uRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmb3JjZSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRMb2coKS5lcnJvcihlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9TdG9wIGV4ZWN1dGlvbiB0aHJvd2luZyBleGNlcHRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vdGhyb3cgbmV3IE1vam9FeGVjdXRpb25FeGNlcHRpb24oInN0b3BwaW5nLi4iKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGJvb2xlYW4gY2FuR2VuZXJhdGVDb21wb25lbnRUYWcoQ29tcG9uZW50TWV0YSBjb21wb25lbnQpCi0gICAgewotICAgICAgICBpZiAoIG1vZGVsSWRzLmNvbnRhaW5zKGNvbXBvbmVudC5nZXRNb2RlbElkKCkpCi0gICAgICAgICAgICAgICAgJiYgaW5jbHVkZVBhY2thZ2UoY29tcG9uZW50KQotICAgICAgICAgICAgICAgICYmIGluY2x1ZGVUeXBlKGNvbXBvbmVudCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBib29sZWFuIGluY2x1ZGVQYWNrYWdlKENvbXBvbmVudE1ldGEgY29tcG9uZW50KQotICAgIHsKLSAgICAgICAgaWYgKHBhY2thZ2VDb250YWlucyAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoY29tcG9uZW50LmdldFRhZ1BhY2thZ2UoKS5zdGFydHNXaXRoKHBhY2thZ2VDb250YWlucykpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0gICAgICAgIAotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGluY2x1ZGVUeXBlKENvbXBvbmVudE1ldGEgY29tcG9uZW50KQotICAgIHsKLSAgICAgICAgaWYgKHR5cGVQcmVmaXggIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGNvbXBvbmVudC5nZXRUeXBlKCkuc3RhcnRzV2l0aCh0eXBlUHJlZml4KSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfSAgICAgICAgCi0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBHZW5lcmF0ZXMgYSBwYXJzZWQgY29tcG9uZW50LgotICAgICAqIAotICAgICAqIEBwYXJhbSBjb21wb25lbnQKLSAgICAgKiAgICAgICAgICAgIHRoZSBwYXJzZWQgY29tcG9uZW50IG1ldGFkYXRhCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIF9nZW5lcmF0ZUNvbXBvbmVudChWZWxvY2l0eUVuZ2luZSB2ZWxvY2l0eUVuZ2luZSwgQ29tcG9uZW50TWV0YSBjb21wb25lbnQsIFZlbG9jaXR5Q29udGV4dCBiYXNlQ29udGV4dCkKLSAgICAgICAgICAgIHRocm93cyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uCi0gICAgewotCi0gICAgICAgIENvbnRleHQgY29udGV4dCA9IG5ldyBWZWxvY2l0eUNvbnRleHQoYmFzZUNvbnRleHQpOwotICAgICAgICBjb250ZXh0LnB1dCgiY29tcG9uZW50IiwgY29tcG9uZW50KTsKLQotICAgICAgICBXcml0ZXIgd3JpdGVyID0gbnVsbDsKLSAgICAgICAgRmlsZSBvdXRGaWxlID0gbnVsbDsKLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgb3V0RmlsZSA9IG5ldyBGaWxlKGdlbmVyYXRlZFNvdXJjZURpcmVjdG9yeSwgU3RyaW5nVXRpbHMucmVwbGFjZSgKLSAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50LmdldFRhZ0NsYXNzKCksICIuIiwgIi8iKSsiLmphdmEiKTsKLQotICAgICAgICAgICAgaWYgKCAhb3V0RmlsZS5nZXRQYXJlbnRGaWxlKCkuZXhpc3RzKCkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG91dEZpbGUuZ2V0UGFyZW50RmlsZSgpLm1rZGlycygpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB3cml0ZXIgPSBuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKG5ldyBGaWxlT3V0cHV0U3RyZWFtKG91dEZpbGUpKTsKLQotICAgICAgICAgICAgVGVtcGxhdGUgdGVtcGxhdGUgPSB2ZWxvY2l0eUVuZ2luZS5nZXRUZW1wbGF0ZShfZ2V0VGVtcGxhdGVUYWdOYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICB0ZW1wbGF0ZS5tZXJnZShjb250ZXh0LCB3cml0ZXIpOwotCi0gICAgICAgICAgICB3cml0ZXIuZmx1c2goKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAiRXJyb3IgbWVyZ2luZyB2ZWxvY2l0eSB0ZW1wbGF0ZXM6ICIgKyBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxseQotICAgICAgICB7Ci0gICAgICAgICAgICBJT1V0aWwuY2xvc2Uod3JpdGVyKTsKLSAgICAgICAgICAgIHdyaXRlciA9IG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBTdHJpbmcgX2dldFRlbXBsYXRlVGFnTmFtZSgpCi0gICAgewotICAgICAgICBpZiAodGVtcGxhdGVUYWdOYW1lID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChfaXMxMigpIHx8IF9pczIwKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJ0YWdDbGFzczEyLnZtIjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gInRhZ0NsYXNzMTEudm0iOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHRlbXBsYXRlVGFnTmFtZTsgICAgICAgICAgICAKLSAgICAgICAgfSAgICAgICAgCi0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIF9pczEyKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAiMS4yIi5lcXVhbHMoanNmVmVyc2lvbikgfHwgIjEyIi5lcXVhbHMoanNmVmVyc2lvbik7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIF9pczIwKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAiMi4wIi5lcXVhbHMoanNmVmVyc2lvbikgfHwgIjIwIi5lcXVhbHMoanNmVmVyc2lvbik7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9NYWtlVmFsaWRhdG9yVGFnc01vam8uamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvTWFrZVZhbGlkYXRvclRhZ3NNb2pvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjOWQxMjYuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9NYWtlVmFsaWRhdG9yVGFnc01vam8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0OCArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uYnVpbGRlcjsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbVdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLldyaXRlcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLkFic3RyYWN0TW9qbzsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5Nb2pvRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucHJvamVjdC5NYXZlblByb2plY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5idWlsZGVyLm1vZGVsLk1vZGVsOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uYnVpbGRlci5tb2RlbC5WYWxpZGF0b3JNZXRhOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uYnVpbGRlci51dGlscy5CdWlsZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmJ1aWxkZXIudXRpbHMuTWF2ZW5QbHVnaW5Db25zb2xlTG9nU3lzdGVtOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uYnVpbGRlci51dGlscy5NeWZhY2VzVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS52ZWxvY2l0eS5UZW1wbGF0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLnZlbG9jaXR5LlZlbG9jaXR5Q29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLnZlbG9jaXR5LmFwcC5WZWxvY2l0eUVuZ2luZTsKLWltcG9ydCBvcmcuYXBhY2hlLnZlbG9jaXR5LmNvbnRleHQuQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLnZlbG9jaXR5LnJ1bnRpbWUuUnVudGltZUNvbnN0YW50czsKLWltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLnV0aWwuSU9VdGlsOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMudXRpbC5TdHJpbmdVdGlsczsKLQotLyoqCi0gKiBNYXZlbiBnb2FsIHRvIGdlbmVyYXRlIGphdmEgc291cmNlIGNvZGUgZm9yIENvbXBvbmVudCB0YWcgY2xhc3Nlcy4KLSAqIAotICogPHA+SXQgdXNlcyB2ZWxvY2l0eSB0byBnZW5lcmF0ZSB0ZW1wbGF0ZXMsIGFuZCBoYXMgdGhlIG9wdGlvbiB0byBkZWZpbmUgY3VzdG9tIHRlbXBsYXRlcy48L3A+Ci0gKiA8cD5UaGUgZXhlY3V0ZWQgdGVtcGxhdGUgaGFzIHRoZSBmb2xsb3dpbmcgdmFyaWFibGVzIGF2YWlsYWJsZSB0byBpdDo8L3A+Ci0gKiA8dWw+Ci0gKiAgPGxpPnV0aWxzIDogUmV0dXJucyBhbiBpbnN0YW5jZSBvZiAKLSAqICBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmJ1aWxkZXIudXRpbHMuTXlmYWNlc1V0aWxzLCAKLSAqICBpdCBjb250YWlucyBzb21lIHVzZWZ1bCBtZXRob2RzLjwvbGk+Ci0gKiAgPGxpPnZhbGlkYXRvciA6IFJldHVybnMgdGhlIGN1cnJlbnQgaW5zdGFuY2Ugb2YKLSAqICAgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5idWlsZGVyLm1vZGVsLlZhbGlkYXRvck1ldGE8L2xpPgotICogPC91bD4KLSAqIAotICogQHZlcnNpb24gJElkJAotICogQHJlcXVpcmVzRGVwZW5kZW5jeVJlc29sdXRpb24gY29tcGlsZQotICogQGdvYWwgbWFrZS12YWxpZGF0b3ItdGFncwotICogQHBoYXNlIGdlbmVyYXRlLXNvdXJjZXMKLSAqLwotcHVibGljIGNsYXNzIE1ha2VWYWxpZGF0b3JUYWdzTW9qbyBleHRlbmRzIEFic3RyYWN0TW9qbwotewotICAgIC8qKgotICAgICAqIEluamVjdGVkIE1hdmVuIHByb2plY3QuCi0gICAgICogCi0gICAgICogQHBhcmFtZXRlciBleHByZXNzaW9uPSIke3Byb2plY3R9IgotICAgICAqIEByZWFkb25seQotICAgICAqLwotICAgIHByaXZhdGUgTWF2ZW5Qcm9qZWN0IHByb2plY3Q7Ci0KLSAgICAvKioKLSAgICAgKiBEZWZpbmVzIHRoZSBkaXJlY3Rvcnkgd2hlcmUgdGhlIG1ldGFkYXRhIGZpbGUgKE1FVEEtSU5GL215ZmFjZXMtbWV0YWRhdGEueG1sKSBpcyBsb2FkZWQuCi0gICAgICogCi0gICAgICogQHBhcmFtZXRlciBleHByZXNzaW9uPSIke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9nZW5lcmF0ZWQtcmVzb3VyY2VzL215ZmFjZXMtYnVpbGRlci1wbHVnaW4iCi0gICAgICovCi0gICAgcHJpdmF0ZSBGaWxlIGJ1aWxkRGlyZWN0b3J5OwotCi0gICAgLyoqCi0gICAgICogSW5qZWN0ZWQgbmFtZSBvZiBmaWxlIGdlbmVyYXRlZCBieSBlYXJsaWVyIHJ1biBvZiBCdWlsZE1ldGFEYXRhTW9qbyBnb2FsLgotICAgICAqIAotICAgICAqIEBwYXJhbWV0ZXIKLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBtZXRhZGF0YUZpbGUgPSAiTUVUQS1JTkYvbXlmYWNlcy1tZXRhZGF0YS54bWwiOwotCi0gICAgLyoqCi0gICAgICogVGhlIGRpcmVjdG9yeSB1c2VkIHRvIGxvYWQgdGVtcGxhdGVzIGludG8gdmVsb2NpdHkgZW52aXJvbm1lbnQuCi0gICAgICogCi0gICAgICogQHBhcmFtZXRlciBleHByZXNzaW9uPSJzcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYiCi0gICAgICovCi0gICAgcHJpdmF0ZSBGaWxlIHRlbXBsYXRlU291cmNlRGlyZWN0b3J5OwotICAgIAotICAgIC8qKgotICAgICAqIFRoaXMgcGFyYW0gaXMgdXNlZCB0byBzZWFyY2ggaW4gdGhpcyBmb2xkZXIgaWYgc29tZSBmaWxlIHRvCi0gICAgICogYmUgZ2VuZXJhdGVkIGV4aXN0cyBhbmQgYXZvaWQgZ2VuZXJhdGlvbiBhbmQgZHVwbGljYXRlIGV4Y2VwdGlvbi4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW1ldGVyIGV4cHJlc3Npb249InNyYy9tYWluL2phdmEiCi0gICAgICovICAgIAotICAgIHByaXZhdGUgRmlsZSBtYWluU291cmNlRGlyZWN0b3J5OwotCi0gICAgLyoqCi0gICAgICogVGhpcyBwYXJhbSBpcyB1c2VkIHRvIHNlYXJjaCBpbiB0aGlzIGZvbGRlciBpZiBzb21lIGZpbGUgdG8KLSAgICAgKiBiZSBnZW5lcmF0ZWQgZXhpc3RzIGFuZCBhdm9pZCBnZW5lcmF0aW9uIGFuZCBkdXBsaWNhdGUgZXhjZXB0aW9uLgotICAgICAqIAotICAgICAqIEBwYXJhbWV0ZXIKLSAgICAgKi8gICAgICAgIAotICAgIHByaXZhdGUgRmlsZSBtYWluU291cmNlRGlyZWN0b3J5MjsKLQotICAgIC8qKgotICAgICAqIFRoZSBuYW1lIG9mIHRoZSB0ZW1wbGF0ZSB1c2VkIHRvIGdlbmVyYXRlIHZhbGlkYXRvciB0YWcgY2xhc3Nlcy4gQWNjb3JkaW5nIHRvIHRoZSB2YWx1ZSBvbiAKLSAgICAgKiBqc2ZWZXJzaW9uIHByb3BlcnR5IHRoZSBkZWZhdWx0IGlmIHRoaXMgcHJvcGVydHkgaXMgbm90IHNldCBjb3VsZCBiZSB0YWdWYWxpZGF0b3JDbGFzczExLnZtICgxLjEpIG9yCi0gICAgICogdGFnVmFsaWRhdG9yQ2xhc3MxMi52bSAoMS4yKQotICAgICAqIAotICAgICAqIEBwYXJhbWV0ZXIgCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgdGVtcGxhdGVUYWdOYW1lOwotCi0gICAgLyoqCi0gICAgICogVGhlIGRpcmVjdG9yeSB3aGVyZSBhbGwgZ2VuZXJhdGVkIGZpbGVzIGFyZSBjcmVhdGVkLiBUaGlzIGRpcmVjdG9yeSBpcyBhZGRlZCBhcyBhCi0gICAgICogY29tcGlsZSBzb3VyY2Ugcm9vdCBhdXRvbWF0aWNhbGx5IGxpa2Ugc3JjL21haW4vamF2YSBpcy4gCi0gICAgICogIAotICAgICAqIEBwYXJhbWV0ZXIgZXhwcmVzc2lvbj0iJHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vZ2VuZXJhdGVkLXNvdXJjZXMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbiIKLSAgICAgKiBAcmVxdWlyZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIEZpbGUgZ2VuZXJhdGVkU291cmNlRGlyZWN0b3J5OwotCi0gICAgLyoqCi0gICAgICogT25seSBnZW5lcmF0ZSB0YWcgY2xhc3NlcyB0aGF0IGNvbnRhaW5zIHRoYXQgcGFja2FnZSBwcmVmaXgKLSAgICAgKiAKLSAgICAgKiBAcGFyYW1ldGVyCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgcGFja2FnZUNvbnRhaW5zOwotCi0gICAgLyoqCi0gICAgICogT25seSBnZW5lcmF0ZSB0YWcgY2xhc3NlcyB0aGF0IGl0cyBjb21wb25lbnQgc3RhcnRzIHdpdGggdGhpcyB0eXBlIHByZWZpeAotICAgICAqIAotICAgICAqIEBwYXJhbWV0ZXIKLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyB0eXBlUHJlZml4OwotICAgIAotICAgIC8qKgotICAgICAqICBMb2cgYW5kIGNvbnRpbnVlIGV4ZWN1dGlvbiB3aGVuIGdlbmVyYXRpbmcgdmFsaWRhdG9yIHRhZyBjbGFzc2VzLgotICAgICAqICA8cD4KLSAgICAgKiAgSWYgdGhpcyBwcm9wZXJ0eSBpcyBzZXQgdG8gZmFsc2UgKGRlZmF1bHQpLCBlcnJvcnMgd2hlbiBhIHZhbGlkYXRvciB0YWcgY2xhc3MgaXMgZ2VuZXJhdGVkIHN0b3BzCi0gICAgICogIGV4ZWN1dGlvbiBpbW1lZGlhdGVseS4KLSAgICAgKiAgPC9wPgotICAgICAqIAotICAgICAqIEBwYXJhbWV0ZXIKLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gZm9yY2U7Ci0KLSAgICAvKioKLSAgICAgKiBEZWZpbmVzIHRoZSBqc2YgdmVyc2lvbiAoMS4xIG9yIDEuMiksIHVzZWQgdG8gdGFrZSB0aGUgZGVmYXVsdCB0ZW1wbGF0ZXMgZm9yIGVhY2ggdmVyc2lvbi4KLSAgICAgKiA8cD4gCi0gICAgICogSWYgdmVyc2lvbiBpcyAxLjEsIHRoZSBkZWZhdWx0IHRlbXBsYXRlVGFnTmFtZSBpcyAndGFnVmFsaWRhdG9yQ2xhc3MxMS52bScgYW5kIGlmIHZlcnNpb24KLSAgICAgKiBpcyAxLjIgdGhlIGRlZmF1bHQgdGVtcGxhdGVUYWdOYW1lIGlzICd0YWdWYWxpZGF0b3JDbGFzczEyLnZtJy4KLSAgICAgKiA8L3A+Ci0gICAgICogCi0gICAgICogQHBhcmFtZXRlcgotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIGpzZlZlcnNpb247Ci0gICAgCi0gICAgLyoqCi0gICAgICogRGVmaW5lIHRoZSBtb2RlbHMgdGhhdCBzaG91bGQgYmUgaW5jbHVkZWQgd2hlbiBnZW5lcmF0ZSB2YWxpZGF0b3IgdGFnIGNsYXNzZXMuIElmIG5vdCBzZXQsIHRoZQotICAgICAqIGN1cnJlbnQgbW9kZWwgaWRlbnRpZmllZCBieSB0aGUgYXJ0aWZhY3RJZCBpcyB1c2VkLgotICAgICAqIDxwPgotICAgICAqIEVhY2ggbW9kZWwgYnVpbHQgYnkgYnVpbGQtbWV0YWRhdGEgZ29hbCBoYXMgYSBtb2RlbElkLCB0aGF0IGJ5IGRlZmF1bHQgaXMgdGhlIGFydGlmYWN0SWQgb2YKLSAgICAgKiB0aGUgcHJvamVjdC4gU2V0dGluZyB0aGlzIHByb3BlcnR5IGRlZmluZXMgd2hpY2ggb2JqZWN0cyB0aWVkIGluIGEgc3BlY2lmaWVkIG1vZGVsSWQgc2hvdWxkCi0gICAgICogYmUgdGFrZW4gaW50byBhY2NvdW50LiAgCi0gICAgICogPC9wPgotICAgICAqIDxwPkluIHRoaXMgY2FzZSwgbGltaXQgY29udmVydGVyIHRhZyBnZW5lcmF0aW9uIG9ubHkgdG8gdGhlIGNvbXBvbmVudHMgZGVmaW5lZCBpbiB0aGUgbW9kZWxzIAotICAgICAqIGlkZW50aWZpZWQgYnkgdGhlIG1vZGVsSWQgZGVmaW5lZC4gPC9wPgotICAgICAqIDxwPlRoaXMgaXMgdXNlZnVsIHdoZW4geW91IG5lZWQgdG8gZ2VuZXJhdGUgZmlsZXMgdGhhdCB0YWtlIGluZm9ybWF0aW9uIGRlZmluZWQgb24gb3RoZXIKLSAgICAgKiBwcm9qZWN0cy48L3A+Ci0gICAgICogPHA+RXhhbXBsZTo8L3A+Ci0gICAgICogPHByZT4KLSAgICAgKiAgICAmbHQ7bW9kZWxJZHMmZ3Q7Ci0gICAgICogICAgICAgICZsdDttb2RlbElkPm1vZGVsMSZsdDsvbW9kZWxJZCZndDsKLSAgICAgKiAgICAgICAgJmx0O21vZGVsSWQ+bW9kZWwyJmx0Oy9tb2RlbElkJmd0OwotICAgICAqICAgICZsdDsvbW9kZWxJZHMmZ3Q7Ci0gICAgICogPC9wcmU+Ci0gICAgICogCi0gICAgICogQHBhcmFtZXRlcgotICAgICAqLwotICAgIHByaXZhdGUgTGlzdCBtb2RlbElkczsKLSAgICAKLSAgICAvKioKLSAgICAgKiBFeGVjdXRlIHRoZSBNb2pvLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgLy8gVGhpcyBjb21tYW5kIG1ha2VzIE1hdmVuIGNvbXBpbGUgdGhlIGdlbmVyYXRlZCBzb3VyY2U6Ci0gICAgICAgIC8vIGdldFByb2plY3QoKS5hZGRDb21waWxlU291cmNlUm9vdCggYWJzb2x1dGVHZW5lcmF0ZWRQYXRoLmdldFBhdGgoKSApOwotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgcHJvamVjdC5hZGRDb21waWxlU291cmNlUm9vdCggZ2VuZXJhdGVkU291cmNlRGlyZWN0b3J5LmdldENhbm9uaWNhbFBhdGgoKSApOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAobW9kZWxJZHMgPT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBtb2RlbElkcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgICAgICAgICBtb2RlbElkcy5hZGQocHJvamVjdC5nZXRBcnRpZmFjdElkKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgTW9kZWwgbW9kZWwgPSBJT1V0aWxzLmxvYWRNb2RlbChuZXcgRmlsZShidWlsZERpcmVjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGFGaWxlKSk7Ci0gICAgICAgICAgICBuZXcgRmxhdHRlbmVyKG1vZGVsKS5mbGF0dGVuKCk7Ci0gICAgICAgICAgICBnZW5lcmF0ZVZhbGlkYXRvcnMobW9kZWwpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbigiRXJyb3IgZ2VuZXJhdGluZyBjb21wb25lbnRzIiwgZSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uKCJFcnJvciBnZW5lcmF0aW5nIGNvbXBvbmVudHMiLCBlKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAgICAgCi0gICAgcHJpdmF0ZSBWZWxvY2l0eUVuZ2luZSBpbml0VmVsb2NpdHkoKSB0aHJvd3MgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgRmlsZSB0ZW1wbGF0ZSA9IG5ldyBGaWxlKHRlbXBsYXRlU291cmNlRGlyZWN0b3J5LCBfZ2V0VGVtcGxhdGVUYWdOYW1lKCkpOwotICAgICAgICAKLSAgICAgICAgaWYgKHRlbXBsYXRlLmV4aXN0cygpKQotICAgICAgICB7Ci0gICAgICAgICAgICBnZXRMb2coKS5pbmZvKCJVc2luZyB0ZW1wbGF0ZSBmcm9tIGZpbGUgbG9hZGVyOiAiK3RlbXBsYXRlLmdldFBhdGgoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBnZXRMb2coKS5pbmZvKCJVc2luZyB0ZW1wbGF0ZSBmcm9tIGNsYXNzIGxvYWRlcjogTUVUQS1JTkYvIitfZ2V0VGVtcGxhdGVUYWdOYW1lKCkpOwotICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgIFZlbG9jaXR5RW5naW5lIHZlbG9jaXR5RW5naW5lID0gbmV3IFZlbG9jaXR5RW5naW5lKCk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICB2ZWxvY2l0eUVuZ2luZS5zZXRQcm9wZXJ0eSggInJlc291cmNlLmxvYWRlciIsICJmaWxlLCBjbGFzcyIgKTsKLSAgICAgICAgICAgIHZlbG9jaXR5RW5naW5lLnNldFByb3BlcnR5KCAiZmlsZS5yZXNvdXJjZS5sb2FkZXIuY2xhc3MiLAotICAgICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS52ZWxvY2l0eS5ydW50aW1lLnJlc291cmNlLmxvYWRlci5GaWxlUmVzb3VyY2VMb2FkZXIiKTsKLSAgICAgICAgICAgIHZlbG9jaXR5RW5naW5lLnNldFByb3BlcnR5KCAiZmlsZS5yZXNvdXJjZS5sb2FkZXIucGF0aCIsIHRlbXBsYXRlU291cmNlRGlyZWN0b3J5LmdldFBhdGgoKSk7Ci0gICAgICAgICAgICB2ZWxvY2l0eUVuZ2luZS5zZXRQcm9wZXJ0eSggImNsYXNzLnJlc291cmNlLmxvYWRlci5jbGFzcyIsCi0gICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmJ1aWxkZXIudXRpbHMuUmVsYXRpdmVDbGFzc3BhdGhSZXNvdXJjZUxvYWRlciIgKTsKLSAgICAgICAgICAgIHZlbG9jaXR5RW5naW5lLnNldFByb3BlcnR5KCAiY2xhc3MucmVzb3VyY2UubG9hZGVyLnBhdGgiLCAiTUVUQS1JTkYiKTsgICAgICAgICAgICAKLSAgICAgICAgICAgIHZlbG9jaXR5RW5naW5lLnNldFByb3BlcnR5KCAidmVsb2NpbWFjcm8ubGlicmFyeSIsICJ0YWdDbGFzc01hY3JvczExLnZtIik7Ci0gICAgICAgICAgICB2ZWxvY2l0eUVuZ2luZS5zZXRQcm9wZXJ0eSggInZlbG9jaW1hY3JvLnBlcm1pc3Npb25zLmFsbG93LmlubGluZSIsInRydWUiKTsKLSAgICAgICAgICAgIHZlbG9jaXR5RW5naW5lLnNldFByb3BlcnR5KCAidmVsb2NpbWFjcm8ucGVybWlzc2lvbnMuYWxsb3cuaW5saW5lLmxvY2FsLnNjb3BlIiwgInRydWUiKTsKLSAgICAgICAgICAgIHZlbG9jaXR5RW5naW5lLnNldFByb3BlcnR5KCAiZGlyZWN0aXZlLmZvcmVhY2guY291bnRlci5pbml0aWFsLnZhbHVlIiwiMCIpOwotCi0gICAgICAgICAgICAvL3ZlbG9jaXR5RW5naW5lLnNldFByb3BlcnR5KCBSdW50aW1lQ29uc3RhbnRzLlJVTlRJTUVfTE9HX0xPR1NZU1RFTV9DTEFTUywKLSAgICAgICAgICAgIC8vICAgICJvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmJ1aWxkZXIudXRpbHMuQ29uc29sZUxvZ1N5c3RlbSIgKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgdmVsb2NpdHlFbmdpbmUuc2V0UHJvcGVydHkoUnVudGltZUNvbnN0YW50cy5SVU5USU1FX0xPR19MT0dTWVNURU0sCi0gICAgICAgICAgICAgICAgICAgIG5ldyBNYXZlblBsdWdpbkNvbnNvbGVMb2dTeXN0ZW0odGhpcy5nZXRMb2coKSkpOwotCi0gICAgICAgICAgICB2ZWxvY2l0eUVuZ2luZS5pbml0KCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbigiRXJyb3IgY3JlYXRpbmcgVmVsb2NpdHlFbmdpbmUiLCBlKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIHZlbG9jaXR5RW5naW5lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdlbmVyYXRlcyBwYXJzZWQgY29tcG9uZW50cy4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgZ2VuZXJhdGVWYWxpZGF0b3JzKE1vZGVsIG1vZGVsKSB0aHJvd3MgSU9FeGNlcHRpb24sCi0gICAgICAgICAgICBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uCi0gICAgewotICAgICAgICBWZWxvY2l0eUVuZ2luZSB2ZWxvY2l0eUVuZ2luZSA9IGluaXRWZWxvY2l0eSgpOwotCi0gICAgICAgIFZlbG9jaXR5Q29udGV4dCBiYXNlQ29udGV4dCA9IG5ldyBWZWxvY2l0eUNvbnRleHQoKTsKLSAgICAgICAgYmFzZUNvbnRleHQucHV0KCJ1dGlscyIsIG5ldyBNeWZhY2VzVXRpbHMoKSk7Ci0gICAgICAgIAotICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ID0gbW9kZWwuZ2V0VmFsaWRhdG9ycygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspCi0gICAgICAgIHsKLSAgICAgICAgICAgIFZhbGlkYXRvck1ldGEgdmFsaWRhdG9yID0gKFZhbGlkYXRvck1ldGEpIGl0Lm5leHQoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKHZhbGlkYXRvci5nZXRUYWdDbGFzcygpICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgRmlsZSBmID0gbmV3IEZpbGUobWFpblNvdXJjZURpcmVjdG9yeSwgU3RyaW5nVXRpbHMucmVwbGFjZSgKLSAgICAgICAgICAgICAgICAgICAgdmFsaWRhdG9yLmdldFRhZ0NsYXNzKCksICIuIiwgIi8iKSsiLmphdmEiKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAoIWYuZXhpc3RzKCkgJiYgY2FuR2VuZXJhdGVWYWxpZGF0b3JUYWcodmFsaWRhdG9yKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtYWluU291cmNlRGlyZWN0b3J5MiAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBGaWxlIGYyID0gbmV3IEZpbGUobWFpblNvdXJjZURpcmVjdG9yeTIsIFN0cmluZ1V0aWxzLnJlcGxhY2UoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRvci5nZXRUYWdDbGFzcygpLCAiLiIsICIvIikrIi5qYXZhIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZjIuZXhpc3RzKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9Ta2lwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZ2V0TG9nKCkuaW5mbygiR2VuZXJhdGluZyB0YWcgY2xhc3M6Iit2YWxpZGF0b3IuZ2V0VGFnQ2xhc3MoKSk7Ci0gICAgICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBfZ2VuZXJhdGVWYWxpZGF0b3IodmVsb2NpdHlFbmdpbmUsIHZhbGlkYXRvcixiYXNlQ29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgY2F0Y2goTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZm9yY2UpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TG9nKCkuZXJyb3IoZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vU3RvcCBleGVjdXRpb24gdGhyb3dpbmcgZXhjZXB0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvL3Rocm93IG5ldyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uKCJzdG9wcGluZy4uIik7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBib29sZWFuIGNhbkdlbmVyYXRlVmFsaWRhdG9yVGFnKFZhbGlkYXRvck1ldGEgY29tcG9uZW50KQotICAgIHsKLSAgICAgICAgaWYgKCBtb2RlbElkcy5jb250YWlucyhjb21wb25lbnQuZ2V0TW9kZWxJZCgpKQotICAgICAgICAgICAgICAgICYmIGluY2x1ZGVQYWNrYWdlKGNvbXBvbmVudCkKLSAgICAgICAgICAgICAgICAmJiBpbmNsdWRlSWQoY29tcG9uZW50KSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGJvb2xlYW4gaW5jbHVkZVBhY2thZ2UoVmFsaWRhdG9yTWV0YSB2YWxpZGF0b3IpCi0gICAgewotICAgICAgICBpZiAocGFja2FnZUNvbnRhaW5zICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChNeWZhY2VzVXRpbHMuZ2V0UGFja2FnZUZyb21GdWxsQ2xhc3ModmFsaWRhdG9yLmdldFRhZ0NsYXNzKCkpLnN0YXJ0c1dpdGgocGFja2FnZUNvbnRhaW5zKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfSAgICAgICAgCi0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaW5jbHVkZUlkKFZhbGlkYXRvck1ldGEgdmFsaWRhdG9yKQotICAgIHsKLSAgICAgICAgaWYgKHR5cGVQcmVmaXggIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHZhbGlkYXRvci5nZXRWYWxpZGF0b3JJZCgpLnN0YXJ0c1dpdGgodHlwZVByZWZpeCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0gICAgICAgIAotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogR2VuZXJhdGVzIGEgcGFyc2VkIGNvbXBvbmVudC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdmFsaWRhdG9yCi0gICAgICogICAgICAgICAgICB0aGUgcGFyc2VkIGNvbXBvbmVudCBtZXRhZGF0YQotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBfZ2VuZXJhdGVWYWxpZGF0b3IoVmVsb2NpdHlFbmdpbmUgdmVsb2NpdHlFbmdpbmUsIFZhbGlkYXRvck1ldGEgdmFsaWRhdG9yLCBWZWxvY2l0eUNvbnRleHQgYmFzZUNvbnRleHQpCi0gICAgICAgICAgICB0aHJvd3MgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbgotICAgIHsKLQotICAgICAgICBDb250ZXh0IGNvbnRleHQgPSBuZXcgVmVsb2NpdHlDb250ZXh0KGJhc2VDb250ZXh0KTsKLSAgICAgICAgY29udGV4dC5wdXQoInZhbGlkYXRvciIsIHZhbGlkYXRvcik7Ci0KLSAgICAgICAgV3JpdGVyIHdyaXRlciA9IG51bGw7Ci0gICAgICAgIEZpbGUgb3V0RmlsZSA9IG51bGw7Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIG91dEZpbGUgPSBuZXcgRmlsZShnZW5lcmF0ZWRTb3VyY2VEaXJlY3RvcnksIFN0cmluZ1V0aWxzLnJlcGxhY2UoCi0gICAgICAgICAgICAgICAgICAgIHZhbGlkYXRvci5nZXRUYWdDbGFzcygpLCAiLiIsICIvIikrIi5qYXZhIik7Ci0KLSAgICAgICAgICAgIGlmICggIW91dEZpbGUuZ2V0UGFyZW50RmlsZSgpLmV4aXN0cygpICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBvdXRGaWxlLmdldFBhcmVudEZpbGUoKS5ta2RpcnMoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgd3JpdGVyID0gbmV3IE91dHB1dFN0cmVhbVdyaXRlcihuZXcgRmlsZU91dHB1dFN0cmVhbShvdXRGaWxlKSk7Ci0KLSAgICAgICAgICAgIFRlbXBsYXRlIHRlbXBsYXRlID0gdmVsb2NpdHlFbmdpbmUuZ2V0VGVtcGxhdGUoX2dldFRlbXBsYXRlVGFnTmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgdGVtcGxhdGUubWVyZ2UoY29udGV4dCwgd3JpdGVyKTsKLQotICAgICAgICAgICAgd3JpdGVyLmZsdXNoKCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgIkVycm9yIG1lcmdpbmcgdmVsb2NpdHkgdGVtcGxhdGVzOiAiICsgZS5nZXRNZXNzYWdlKCksIGUpOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsbHkKLSAgICAgICAgewotICAgICAgICAgICAgSU9VdGlsLmNsb3NlKHdyaXRlcik7Ci0gICAgICAgICAgICB3cml0ZXIgPSBudWxsOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgU3RyaW5nIF9nZXRUZW1wbGF0ZVRhZ05hbWUoKQotICAgIHsKLSAgICAgICAgaWYgKHRlbXBsYXRlVGFnTmFtZSA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoX2lzMTIoKSB8fCBfaXMyMCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiAidGFnVmFsaWRhdG9yQ2xhc3MxMi52bSI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJ0YWdWYWxpZGF0b3JDbGFzczExLnZtIjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiB0ZW1wbGF0ZVRhZ05hbWU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gX2lzMTIoKQotICAgIHsKLSAgICAgICAgcmV0dXJuICIxLjIiLmVxdWFscyhqc2ZWZXJzaW9uKSB8fCAiMTIiLmVxdWFscyhqc2ZWZXJzaW9uKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gX2lzMjAoKQotICAgIHsKLSAgICAgICAgcmV0dXJuICIyLjAiLmVxdWFscyhqc2ZWZXJzaW9uKSB8fCAiMjAiLmVxdWFscyhqc2ZWZXJzaW9uKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvTWFrZVZhbGlkYXRvcnNNb2pvLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL01ha2VWYWxpZGF0b3JzTW9qby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOGFiZmI2Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvTWFrZVZhbGlkYXRvcnNNb2pvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NDIgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmJ1aWxkZXI7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW1Xcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5Xcml0ZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5BYnN0cmFjdE1vam87Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnByb2plY3QuTWF2ZW5Qcm9qZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uYnVpbGRlci5tb2RlbC5Nb2RlbDsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmJ1aWxkZXIubW9kZWwuVmFsaWRhdG9yTWV0YTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmJ1aWxkZXIudXRpbHMuQnVpbGRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5idWlsZGVyLnV0aWxzLk1hdmVuUGx1Z2luQ29uc29sZUxvZ1N5c3RlbTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmJ1aWxkZXIudXRpbHMuTXlmYWNlc1V0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUudmVsb2NpdHkuVGVtcGxhdGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS52ZWxvY2l0eS5WZWxvY2l0eUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS52ZWxvY2l0eS5hcHAuVmVsb2NpdHlFbmdpbmU7Ci1pbXBvcnQgb3JnLmFwYWNoZS52ZWxvY2l0eS5jb250ZXh0LkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS52ZWxvY2l0eS5ydW50aW1lLlJ1bnRpbWVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy51dGlsLklPVXRpbDsKLWltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLnV0aWwuU3RyaW5nVXRpbHM7Ci0KLWltcG9ydCBjb20udGhvdWdodHdvcmtzLnFkb3guSmF2YURvY0J1aWxkZXI7Ci0KLS8qKgotICogTWF2ZW4gZ29hbCB0byBnZW5lcmF0ZSBqYXZhIHNvdXJjZSBjb2RlIGZvciBWYWxpZGF0b3IgY2xhc3Nlcy4KLSAqIAotICogPHA+SXQgdXNlcyB2ZWxvY2l0eSB0byBnZW5lcmF0ZSB0ZW1wbGF0ZXMsIGFuZCBoYXMgdGhlIG9wdGlvbiB0byBkZWZpbmUgY3VzdG9tIHRlbXBsYXRlcy48L3A+Ci0gKiA8cD5UaGUgZXhlY3V0ZWQgdGVtcGxhdGUgaGFzIHRoZSBmb2xsb3dpbmcgdmFyaWFibGVzIGF2YWlsYWJsZSB0byBpdDo8L3A+Ci0gKiA8dWw+Ci0gKiAgPGxpPnV0aWxzIDogUmV0dXJucyBhbiBpbnN0YW5jZSBvZiAKLSAqICBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmJ1aWxkZXIudXRpbHMuTXlmYWNlc1V0aWxzLCAKLSAqICBpdCBjb250YWlucyBzb21lIHVzZWZ1bCBtZXRob2RzLjwvbGk+Ci0gKiAgPGxpPnZhbGlkYXRvciA6IFJldHVybnMgdGhlIGN1cnJlbnQgaW5zdGFuY2Ugb2YKLSAqICAgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5idWlsZGVyLm1vZGVsLlZhbGlkYXRvck1ldGE8L2xpPgotICogPC91bD4KLSAqIAotICogQHZlcnNpb24gJElkJAotICogQHJlcXVpcmVzRGVwZW5kZW5jeVJlc29sdXRpb24gY29tcGlsZQotICogQGdvYWwgbWFrZS12YWxpZGF0b3JzCi0gKiBAcGhhc2UgZ2VuZXJhdGUtc291cmNlcwotICovCi1wdWJsaWMgY2xhc3MgTWFrZVZhbGlkYXRvcnNNb2pvIGV4dGVuZHMgQWJzdHJhY3RNb2pvCi17Ci0gICAgLyoqCi0gICAgICogSW5qZWN0ZWQgTWF2ZW4gcHJvamVjdC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW1ldGVyIGV4cHJlc3Npb249IiR7cHJvamVjdH0iCi0gICAgICogQHJlYWRvbmx5Ci0gICAgICovCi0gICAgcHJpdmF0ZSBNYXZlblByb2plY3QgcHJvamVjdDsKLQotICAgIC8qKgotICAgICAqIERlZmluZXMgdGhlIGRpcmVjdG9yeSB3aGVyZSB0aGUgbWV0YWRhdGEgZmlsZSAoTUVUQS1JTkYvbXlmYWNlcy1tZXRhZGF0YS54bWwpIGlzIGxvYWRlZC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW1ldGVyIGV4cHJlc3Npb249IiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L2dlbmVyYXRlZC1yZXNvdXJjZXMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbiIKLSAgICAgKi8KLSAgICBwcml2YXRlIEZpbGUgYnVpbGREaXJlY3Rvcnk7Ci0KLSAgICAvKioKLSAgICAgKiBJbmplY3RlZCBuYW1lIG9mIGZpbGUgZ2VuZXJhdGVkIGJ5IGVhcmxpZXIgcnVuIG9mIEJ1aWxkTWV0YURhdGFNb2pvIGdvYWwuCi0gICAgICogCi0gICAgICogQHBhcmFtZXRlcgotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIG1ldGFkYXRhRmlsZSA9ICJNRVRBLUlORi9teWZhY2VzLW1ldGFkYXRhLnhtbCI7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZGlyZWN0b3J5IHVzZWQgdG8gbG9hZCB0ZW1wbGF0ZXMgaW50byB2ZWxvY2l0eSBlbnZpcm9ubWVudC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW1ldGVyIGV4cHJlc3Npb249InNyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORiIKLSAgICAgKi8KLSAgICBwcml2YXRlIEZpbGUgdGVtcGxhdGVTb3VyY2VEaXJlY3Rvcnk7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZGlyZWN0b3J5IHdoZXJlIGFsbCBnZW5lcmF0ZWQgZmlsZXMgYXJlIGNyZWF0ZWQuIFRoaXMgZGlyZWN0b3J5IGlzIGFkZGVkIGFzIGEKLSAgICAgKiBjb21waWxlIHNvdXJjZSByb290IGF1dG9tYXRpY2FsbHkgbGlrZSBzcmMvbWFpbi9qYXZhIGlzLiAKLSAgICAgKiAKLSAgICAgKiBAcGFyYW1ldGVyIGV4cHJlc3Npb249IiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L2dlbmVyYXRlZC1zb3VyY2VzL215ZmFjZXMtYnVpbGRlci1wbHVnaW4iCi0gICAgICovCi0gICAgcHJpdmF0ZSBGaWxlIGdlbmVyYXRlZFNvdXJjZURpcmVjdG9yeTsKLQotICAgIC8qKgotICAgICAqIE9ubHkgZ2VuZXJhdGUgdGFnIGNsYXNzZXMgdGhhdCBjb250YWlucyB0aGF0IHBhY2thZ2UgcHJlZml4Ci0gICAgICogCi0gICAgICogQHBhcmFtZXRlcgotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIHBhY2thZ2VDb250YWluczsKLQotICAgIC8qKgotICAgICAqICBMb2cgYW5kIGNvbnRpbnVlIGV4ZWN1dGlvbiB3aGVuIGdlbmVyYXRpbmcgdmFsaWRhdG9yIGNsYXNzZXMuCi0gICAgICogIDxwPgotICAgICAqICBJZiB0aGlzIHByb3BlcnR5IGlzIHNldCB0byBmYWxzZSAoZGVmYXVsdCksIGVycm9ycyB3aGVuIGEgdmFsaWRhdG9yIGNsYXNzIGlzIGdlbmVyYXRlZCBzdG9wcwotICAgICAqICBleGVjdXRpb24gaW1tZWRpYXRlbHkuCi0gICAgICogIDwvcD4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW1ldGVyCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIGZvcmNlOwotCi0gICAgLyoqCi0gICAgICogRGVmaW5lcyB0aGUganNmIHZlcnNpb24gKDEuMSBvciAxLjIpLCB1c2VkIHRvIHRha2UgdGhlIGRlZmF1bHQgdGVtcGxhdGVzIGZvciBlYWNoIHZlcnNpb24uCi0gICAgICogPHA+IAotICAgICAqIElmIHZlcnNpb24gaXMgMS4xLCB0aGUgZGVmYXVsdCB0ZW1wbGF0ZVZhbGlkYXRvck5hbWUgaXMgJ3ZhbGlkYXRvckNsYXNzMTEudm0nIGFuZCBpZiB2ZXJzaW9uCi0gICAgICogaXMgMS4yIHRoZSBkZWZhdWx0IHRlbXBsYXRlVmFsaWRhdG9yTmFtZSBpcyAndmFsaWRhdG9yQ2xhc3MxMi52bScuCi0gICAgICogPC9wPgotICAgICAqIAotICAgICAqIEBwYXJhbWV0ZXIKLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBqc2ZWZXJzaW9uOwotICAgIAotICAgIC8qKgotICAgICAqIERlZmluZSB0aGUgbW9kZWxzIHRoYXQgc2hvdWxkIGJlIGluY2x1ZGVkIHdoZW4gZ2VuZXJhdGUgdmFsaWRhdG9yIGNsYXNzZXMuIElmIG5vdCBzZXQsIHRoZQotICAgICAqIGN1cnJlbnQgbW9kZWwgaWRlbnRpZmllZCBieSB0aGUgYXJ0aWZhY3RJZCBpcyB1c2VkLgotICAgICAqIDxwPgotICAgICAqIEVhY2ggbW9kZWwgYnVpbHQgYnkgYnVpbGQtbWV0YWRhdGEgZ29hbCBoYXMgYSBtb2RlbElkLCB0aGF0IGJ5IGRlZmF1bHQgaXMgdGhlIGFydGlmYWN0SWQgb2YKLSAgICAgKiB0aGUgcHJvamVjdC4gU2V0dGluZyB0aGlzIHByb3BlcnR5IGRlZmluZXMgd2hpY2ggb2JqZWN0cyB0aWVkIGluIGEgc3BlY2lmaWVkIG1vZGVsSWQgc2hvdWxkCi0gICAgICogYmUgdGFrZW4gaW50byBhY2NvdW50LiAgCi0gICAgICogPC9wPgotICAgICAqIDxwPkluIHRoaXMgY2FzZSwgbGltaXQgY29udmVydGVyIHRhZyBnZW5lcmF0aW9uIG9ubHkgdG8gdGhlIGNvbXBvbmVudHMgZGVmaW5lZCBpbiB0aGUgbW9kZWxzIAotICAgICAqIGlkZW50aWZpZWQgYnkgdGhlIG1vZGVsSWQgZGVmaW5lZC4gPC9wPgotICAgICAqIDxwPlRoaXMgaXMgdXNlZnVsIHdoZW4geW91IG5lZWQgdG8gZ2VuZXJhdGUgZmlsZXMgdGhhdCB0YWtlIGluZm9ybWF0aW9uIGRlZmluZWQgb24gb3RoZXIKLSAgICAgKiBwcm9qZWN0cy48L3A+Ci0gICAgICogPHA+RXhhbXBsZTo8L3A+Ci0gICAgICogPHByZT4KLSAgICAgKiAgICAmbHQ7bW9kZWxJZHMmZ3Q7Ci0gICAgICogICAgICAgICZsdDttb2RlbElkPm1vZGVsMSZsdDsvbW9kZWxJZCZndDsKLSAgICAgKiAgICAgICAgJmx0O21vZGVsSWQ+bW9kZWwyJmx0Oy9tb2RlbElkJmd0OwotICAgICAqICAgICZsdDsvbW9kZWxJZHMmZ3Q7Ci0gICAgICogPC9wcmU+Ci0gICAgICogCi0gICAgICogQHBhcmFtZXRlcgotICAgICAqLwotICAgIHByaXZhdGUgTGlzdCBtb2RlbElkczsKLQotICAgIC8qKgotICAgICAqIFRoZSBuYW1lIG9mIHRoZSB0ZW1wbGF0ZSB1c2VkIHRvIGdlbmVyYXRlIHZhbGlkYXRvciBjbGFzc2VzLiBBY2NvcmRpbmcgdG8gdGhlIHZhbHVlIG9uIAotICAgICAqIGpzZlZlcnNpb24gcHJvcGVydHkgdGhlIGRlZmF1bHQgaWYgdGhpcyBwcm9wZXJ0eSBpcyBub3Qgc2V0IGNvdWxkIGJlIHZhbGlkYXRvckNsYXNzMTEudm0gKDEuMSkgb3IKLSAgICAgKiB2YWxpZGF0b3JDbGFzczEyLnZtICgxLjIpCi0gICAgICogCi0gICAgICogQHBhcmFtZXRlciAKLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyB0ZW1wbGF0ZVZhbGlkYXRvck5hbWU7Ci0gICAgCi0gICAgLyoqCi0gICAgICogVGhpcyBwYXJhbSBpcyB1c2VkIHRvIHNlYXJjaCBpbiB0aGlzIGZvbGRlciBpZiBzb21lIGZpbGUgdG8KLSAgICAgKiBiZSBnZW5lcmF0ZWQgZXhpc3RzIGFuZCBhdm9pZCBnZW5lcmF0aW9uIGFuZCBkdXBsaWNhdGUgZXhjZXB0aW9uLgotICAgICAqIAotICAgICAqIEBwYXJhbWV0ZXIgZXhwcmVzc2lvbj0ic3JjL21haW4vamF2YSIKLSAgICAgKi8gICAgCi0gICAgcHJpdmF0ZSBGaWxlIG1haW5Tb3VyY2VEaXJlY3Rvcnk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogVGhpcyBwYXJhbSBpcyB1c2VkIHRvIHNlYXJjaCBpbiB0aGlzIGZvbGRlciBpZiBzb21lIGZpbGUgdG8KLSAgICAgKiBiZSBnZW5lcmF0ZWQgZXhpc3RzIGFuZCBhdm9pZCBnZW5lcmF0aW9uIGFuZCBkdXBsaWNhdGUgZXhjZXB0aW9uLgotICAgICAqIAotICAgICAqIEBwYXJhbWV0ZXIKLSAgICAgKi8gICAgICAgIAotICAgIHByaXZhdGUgRmlsZSBtYWluU291cmNlRGlyZWN0b3J5MjsKLQotICAgIC8qKgotICAgICAqIEV4ZWN1dGUgdGhlIE1vam8uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uCi0gICAgewotICAgICAgICAvLyBUaGlzIGNvbW1hbmQgbWFrZXMgTWF2ZW4gY29tcGlsZSB0aGUgZ2VuZXJhdGVkIHNvdXJjZToKLSAgICAgICAgLy8gZ2V0UHJvamVjdCgpLmFkZENvbXBpbGVTb3VyY2VSb290KCBhYnNvbHV0ZUdlbmVyYXRlZFBhdGguZ2V0UGF0aCgpICk7Ci0gICAgICAgIAotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgcHJvamVjdC5hZGRDb21waWxlU291cmNlUm9vdCggZ2VuZXJhdGVkU291cmNlRGlyZWN0b3J5LmdldENhbm9uaWNhbFBhdGgoKSApOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAobW9kZWxJZHMgPT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBtb2RlbElkcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgICAgICAgICBtb2RlbElkcy5hZGQocHJvamVjdC5nZXRBcnRpZmFjdElkKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgTW9kZWwgbW9kZWwgPSBJT1V0aWxzLmxvYWRNb2RlbChuZXcgRmlsZShidWlsZERpcmVjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGFGaWxlKSk7Ci0gICAgICAgICAgICBuZXcgRmxhdHRlbmVyKG1vZGVsKS5mbGF0dGVuKCk7Ci0gICAgICAgICAgICBnZW5lcmF0ZVZhbGlkYXRvcnMobW9kZWwpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbigiRXJyb3IgZ2VuZXJhdGluZyB2YWxpZGF0b3JzIiwgZSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uKCJFcnJvciBnZW5lcmF0aW5nIHZhbGlkYXRvcnMiLCBlKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAKLSAgICBwcml2YXRlIFZlbG9jaXR5RW5naW5lIGluaXRWZWxvY2l0eSgpIHRocm93cyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uCi0gICAgewotICAgICAgICBGaWxlIHRlbXBsYXRlID0gbmV3IEZpbGUodGVtcGxhdGVTb3VyY2VEaXJlY3RvcnksIF9nZXRUZW1wbGF0ZU5hbWUoKSk7Ci0gICAgICAgIAotICAgICAgICBpZiAodGVtcGxhdGUuZXhpc3RzKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldExvZygpLmluZm8oIlVzaW5nIHRlbXBsYXRlIGZyb20gZmlsZSBsb2FkZXI6ICIrdGVtcGxhdGUuZ2V0UGF0aCgpKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldExvZygpLmluZm8oIlVzaW5nIHRlbXBsYXRlIGZyb20gY2xhc3MgbG9hZGVyOiBNRVRBLUlORi8iK19nZXRUZW1wbGF0ZU5hbWUoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgVmVsb2NpdHlFbmdpbmUgdmVsb2NpdHlFbmdpbmUgPSBuZXcgVmVsb2NpdHlFbmdpbmUoKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHZlbG9jaXR5RW5naW5lLnNldFByb3BlcnR5KCAicmVzb3VyY2UubG9hZGVyIiwgImZpbGUsIGNsYXNzIiApOwotICAgICAgICAgICAgdmVsb2NpdHlFbmdpbmUuc2V0UHJvcGVydHkoICJmaWxlLnJlc291cmNlLmxvYWRlci5jbGFzcyIsCi0gICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLnZlbG9jaXR5LnJ1bnRpbWUucmVzb3VyY2UubG9hZGVyLkZpbGVSZXNvdXJjZUxvYWRlciIpOwotICAgICAgICAgICAgdmVsb2NpdHlFbmdpbmUuc2V0UHJvcGVydHkoICJmaWxlLnJlc291cmNlLmxvYWRlci5wYXRoIiwgdGVtcGxhdGVTb3VyY2VEaXJlY3RvcnkuZ2V0UGF0aCgpKTsKLSAgICAgICAgICAgIHZlbG9jaXR5RW5naW5lLnNldFByb3BlcnR5KCAiY2xhc3MucmVzb3VyY2UubG9hZGVyLmNsYXNzIiwKLSAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uYnVpbGRlci51dGlscy5SZWxhdGl2ZUNsYXNzcGF0aFJlc291cmNlTG9hZGVyIiApOwotICAgICAgICAgICAgdmVsb2NpdHlFbmdpbmUuc2V0UHJvcGVydHkoICJjbGFzcy5yZXNvdXJjZS5sb2FkZXIucGF0aCIsICJNRVRBLUlORiIpOyAgICAgICAgICAgIAotICAgICAgICAgICAgdmVsb2NpdHlFbmdpbmUuc2V0UHJvcGVydHkoICJ2ZWxvY2ltYWNyby5saWJyYXJ5IiwgInZhbGlkYXRvckNsYXNzTWFjcm9zMTEudm0iKTsKLSAgICAgICAgICAgIHZlbG9jaXR5RW5naW5lLnNldFByb3BlcnR5KCAidmVsb2NpbWFjcm8ucGVybWlzc2lvbnMuYWxsb3cuaW5saW5lIiwidHJ1ZSIpOwotICAgICAgICAgICAgdmVsb2NpdHlFbmdpbmUuc2V0UHJvcGVydHkoICJ2ZWxvY2ltYWNyby5wZXJtaXNzaW9ucy5hbGxvdy5pbmxpbmUubG9jYWwuc2NvcGUiLCAidHJ1ZSIpOwotICAgICAgICAgICAgdmVsb2NpdHlFbmdpbmUuc2V0UHJvcGVydHkoICJkaXJlY3RpdmUuZm9yZWFjaC5jb3VudGVyLmluaXRpYWwudmFsdWUiLCIwIik7Ci0gICAgICAgICAgICAvL3ZlbG9jaXR5RW5naW5lLnNldFByb3BlcnR5KCBSdW50aW1lQ29uc3RhbnRzLlJVTlRJTUVfTE9HX0xPR1NZU1RFTV9DTEFTUywKLSAgICAgICAgICAgIC8vICAgICJvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmJ1aWxkZXIudXRpbHMuQ29uc29sZUxvZ1N5c3RlbSIgKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgdmVsb2NpdHlFbmdpbmUuc2V0UHJvcGVydHkoUnVudGltZUNvbnN0YW50cy5SVU5USU1FX0xPR19MT0dTWVNURU0sCi0gICAgICAgICAgICAgICAgICAgIG5ldyBNYXZlblBsdWdpbkNvbnNvbGVMb2dTeXN0ZW0odGhpcy5nZXRMb2coKSkpOwotCi0gICAgICAgICAgICB2ZWxvY2l0eUVuZ2luZS5pbml0KCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbigiRXJyb3IgY3JlYXRpbmcgVmVsb2NpdHlFbmdpbmUiLCBlKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIHZlbG9jaXR5RW5naW5lOwotICAgIH0KLSAgICAKLQotICAgIC8qKgotICAgICAqIEdlbmVyYXRlcyBwYXJzZWQgdmFsaWRhdG9ycy4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgZ2VuZXJhdGVWYWxpZGF0b3JzKE1vZGVsIG1vZGVsKSB0aHJvd3MgSU9FeGNlcHRpb24sCi0gICAgICAgICAgICBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uCi0gICAgewotICAgICAgICAvLyBNYWtlIHN1cmUgZ2VuZXJhdGVkIHNvdXJjZSBkaXJlY3RvcnkgCi0gICAgICAgIC8vIGlzIGFkZGVkIHRvIGNvbXBpbGF0aW9uIHNvdXJjZSBwYXRoIAotICAgICAgICAvL3Byb2plY3QuYWRkQ29tcGlsZVNvdXJjZVJvb3QoZ2VuZXJhdGVkU291cmNlRGlyZWN0b3J5LmdldENhbm9uaWNhbFBhdGgoKSk7Ci0gICAgICAgIAotICAgICAgICAvL0luaXQgUWRveCBmb3IgZXh0cmFjdCBjb2RlIAotICAgICAgICBKYXZhRG9jQnVpbGRlciBidWlsZGVyID0gbmV3IEphdmFEb2NCdWlsZGVyKCk7Ci0gICAgICAgIAotICAgICAgICBMaXN0IHNvdXJjZURpcnMgPSBwcm9qZWN0LmdldENvbXBpbGVTb3VyY2VSb290cygpOwotICAgICAgICAKLSAgICAgICAgLy8gbmVlZCBhIEZpbGUgb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgb3JpZ2luYWwgc291cmNlIHRyZWUKLSAgICAgICAgZm9yIChJdGVyYXRvciBpID0gc291cmNlRGlycy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyBzcmNEaXIgPSAoU3RyaW5nKSBpLm5leHQoKTsKLSAgICAgICAgICAgIGJ1aWxkZXIuYWRkU291cmNlVHJlZShuZXcgRmlsZShzcmNEaXIpKTsKLSAgICAgICAgfSAgICAgICAgCi0gICAgICAgIAotICAgICAgICAvL0luaXQgdmVsb2NpdHkKLSAgICAgICAgVmVsb2NpdHlFbmdpbmUgdmVsb2NpdHlFbmdpbmUgPSBpbml0VmVsb2NpdHkoKTsKLQotICAgICAgICBWZWxvY2l0eUNvbnRleHQgYmFzZUNvbnRleHQgPSBuZXcgVmVsb2NpdHlDb250ZXh0KCk7Ci0gICAgICAgIGJhc2VDb250ZXh0LnB1dCgidXRpbHMiLCBuZXcgTXlmYWNlc1V0aWxzKCkpOwotICAgICAgICAKLSAgICAgICAgZm9yIChJdGVyYXRvciBpdCA9IG1vZGVsLmdldFZhbGlkYXRvcnMoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KQotICAgICAgICB7Ci0gICAgICAgICAgICBWYWxpZGF0b3JNZXRhIHZhbGlkYXRvciA9IChWYWxpZGF0b3JNZXRhKSBpdC5uZXh0KCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmICh2YWxpZGF0b3IuZ2V0Q2xhc3NOYW1lKCkgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBGaWxlIGYgPSBuZXcgRmlsZShtYWluU291cmNlRGlyZWN0b3J5LCBTdHJpbmdVdGlscy5yZXBsYWNlKAotICAgICAgICAgICAgICAgICAgICB2YWxpZGF0b3IuZ2V0Q2xhc3NOYW1lKCksICIuIiwgIi8iKSsiLmphdmEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYgKCFmLmV4aXN0cygpICYmIGNhbkdlbmVyYXRlVmFsaWRhdG9yKHZhbGlkYXRvcikpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAobWFpblNvdXJjZURpcmVjdG9yeTIgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgRmlsZSBmMiA9IG5ldyBGaWxlKG1haW5Tb3VyY2VEaXJlY3RvcnkyLCBTdHJpbmdVdGlscy5yZXBsYWNlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0b3IuZ2V0Q2xhc3NOYW1lKCksICIuIiwgIi8iKSsiLmphdmEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmMi5leGlzdHMoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL1NraXAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBnZXRMb2coKS5pbmZvKCJHZW5lcmF0aW5nIHZhbGlkYXRvciBjbGFzczoiK3ZhbGlkYXRvci5nZXRDbGFzc05hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBfZ2VuZXJhdGVWYWxpZGF0b3IodmVsb2NpdHlFbmdpbmUsIGJ1aWxkZXIsdmFsaWRhdG9yLGJhc2VDb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBjYXRjaChNb2pvRXhlY3V0aW9uRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmb3JjZSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRMb2coKS5lcnJvcihlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9TdG9wIGV4ZWN1dGlvbiB0aHJvd2luZyBleGNlcHRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9ICAgICAgICAKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGJvb2xlYW4gY2FuR2VuZXJhdGVWYWxpZGF0b3IoVmFsaWRhdG9yTWV0YSB2YWxpZGF0b3IpCi0gICAgewotICAgICAgICBpZiAoIG1vZGVsSWRzLmNvbnRhaW5zKHZhbGlkYXRvci5nZXRNb2RlbElkKCkpCi0gICAgICAgICAgICAgICAgJiYgaW5jbHVkZVBhY2thZ2UodmFsaWRhdG9yKSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGJvb2xlYW4gaW5jbHVkZVBhY2thZ2UoVmFsaWRhdG9yTWV0YSB2YWxpZGF0b3IpCi0gICAgewotICAgICAgICBpZiAocGFja2FnZUNvbnRhaW5zICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChNeWZhY2VzVXRpbHMuZ2V0UGFja2FnZUZyb21GdWxsQ2xhc3ModmFsaWRhdG9yLmdldENsYXNzTmFtZSgpKS5zdGFydHNXaXRoKHBhY2thZ2VDb250YWlucykpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0gICAgICAgIAotICAgIH0KLSAgICAKLSAgICAKLSAgICAvKioKLSAgICAgKiBHZW5lcmF0ZXMgYSBwYXJzZWQgdmFsaWRhdG9yLgotICAgICAqIAotICAgICAqIEBwYXJhbSB2YWxpZGF0b3IKLSAgICAgKiAgICAgICAgICAgIHRoZSBwYXJzZWQgdmFsaWRhdG9yIG1ldGFkYXRhCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIF9nZW5lcmF0ZVZhbGlkYXRvcihWZWxvY2l0eUVuZ2luZSB2ZWxvY2l0eUVuZ2luZSwKLSAgICAgICAgICAgIEphdmFEb2NCdWlsZGVyIGJ1aWxkZXIsCi0gICAgICAgICAgICBWYWxpZGF0b3JNZXRhIHZhbGlkYXRvciwgVmVsb2NpdHlDb250ZXh0IGJhc2VDb250ZXh0KQotICAgICAgICAgICAgdGhyb3dzIE1vam9FeGVjdXRpb25FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIENvbnRleHQgY29udGV4dCA9IG5ldyBWZWxvY2l0eUNvbnRleHQoYmFzZUNvbnRleHQpOwotICAgICAgICBjb250ZXh0LnB1dCgidmFsaWRhdG9yIiwgdmFsaWRhdG9yKTsKLSAgICAgICAgCi0gICAgICAgIFdyaXRlciB3cml0ZXIgPSBudWxsOwotICAgICAgICBGaWxlIG91dEZpbGUgPSBudWxsOwotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBvdXRGaWxlID0gbmV3IEZpbGUoZ2VuZXJhdGVkU291cmNlRGlyZWN0b3J5LCBTdHJpbmdVdGlscy5yZXBsYWNlKAotICAgICAgICAgICAgICAgICAgICB2YWxpZGF0b3IuZ2V0Q2xhc3NOYW1lKCksICIuIiwgIi8iKSsiLmphdmEiKTsKLQotICAgICAgICAgICAgaWYgKCAhb3V0RmlsZS5nZXRQYXJlbnRGaWxlKCkuZXhpc3RzKCkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG91dEZpbGUuZ2V0UGFyZW50RmlsZSgpLm1rZGlycygpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB3cml0ZXIgPSBuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKG5ldyBGaWxlT3V0cHV0U3RyZWFtKG91dEZpbGUpKTsKLQotICAgICAgICAgICAgVGVtcGxhdGUgdGVtcGxhdGUgPSB2ZWxvY2l0eUVuZ2luZS5nZXRUZW1wbGF0ZShfZ2V0VGVtcGxhdGVOYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICB0ZW1wbGF0ZS5tZXJnZShjb250ZXh0LCB3cml0ZXIpOwotCi0gICAgICAgICAgICB3cml0ZXIuZmx1c2goKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAiRXJyb3IgbWVyZ2luZyB2ZWxvY2l0eSB0ZW1wbGF0ZXM6ICIgKyBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxseQotICAgICAgICB7Ci0gICAgICAgICAgICBJT1V0aWwuY2xvc2Uod3JpdGVyKTsKLSAgICAgICAgICAgIHdyaXRlciA9IG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgcHJpdmF0ZSBTdHJpbmcgX2dldFRlbXBsYXRlTmFtZSgpCi0gICAgewotICAgICAgICBpZiAodGVtcGxhdGVWYWxpZGF0b3JOYW1lID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChfaXMxMigpIHx8IF9pczIwKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJ2YWxpZGF0b3JDbGFzczEyLnZtIjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gInZhbGlkYXRvckNsYXNzMTEudm0iOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHRlbXBsYXRlVmFsaWRhdG9yTmFtZTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIGJvb2xlYW4gX2lzMTIoKQotICAgIHsKLSAgICAgICAgcmV0dXJuICIxLjIiLmVxdWFscyhqc2ZWZXJzaW9uKSB8fCAiMTIiLmVxdWFscyhqc2ZWZXJzaW9uKTsKLSAgICB9Ci0gICAgCi0KLSAgICBwcml2YXRlIGJvb2xlYW4gX2lzMjAoKQotICAgIHsKLSAgICAgICAgcmV0dXJuICIyLjAiLmVxdWFscyhqc2ZWZXJzaW9uKSB8fCAiMjAiLmVxdWFscyhqc2ZWZXJzaW9uKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvTW9kZWxCdWlsZGVyLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL01vZGVsQnVpbGRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjA5YzFhLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvTW9kZWxCdWlsZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uYnVpbGRlcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLk1vam9FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5idWlsZGVyLm1vZGVsLk1vZGVsOwotCi0vKioKLSAqIEFuIGludGVyZmFjZSB0aGF0IGlzIGltcGxlbWVudGVkIGJ5IGNsYXNzZXMgdGhhdCBhcmUgY2FwYWJsZSBvZiBjb2xsZWN0aW5nCi0gKiBtZXRhZGF0YSBhYm91dCBKU0YgY29tcG9uZW50cywgY29udmVydGVycywgdmFsaWRhdG9ycywgZXRjLgotICogPHA+Ci0gKiBBIE1vZGVsQnVpbGRlciBpbXBsZW1lbnRhdGlvbiBtaWdodCByZWFkIHhtbCBmaWxlcywgb3Igc2NhbiBzb3VyY2UgY29kZSBmb3IKLSAqIGFubm90YXRpb25zLCBvciByZWFkIGRhdGEgZnJvbSBhIGRhdGFiYXNlLCBvciBhbnkgbnVtYmVyIG9mIHBvc3NpYmxlCi0gKiBhcHByb2FjaGVzLiBBbGwgdGhhdCBtYXR0ZXJzIGlzIHRoYXQgaXQgbWFrZXMgYSBzZXJpZXMgb2YgY2FsbHMgdG8gYSBNb2RlbAotICogb2JqZWN0IHRvIGFkZCBpbmZvcm1hdGlvbi4KLSAqIDxwPgotICogTW9kZWxCdWlsZGVyIGltcGxlbWVudGF0aW9ucyBtYXkgYmUgcnVuIGFzIGEgY2hhaW4sIGllIG9uZSBpbnN0YW5jZSB1c2VkIHRvCi0gKiBwb3B1bGF0ZSB0aGUgTW9kZWwgb2JqZWN0IHdpdGggc29tZSBvYmplY3RzLCB0aGVuIGEgc2Vjb25kIGluc3RhbmNlIHVzZWQgdG8KLSAqIGFkZCBtb3JlIGRhdGEgb3IgbW9kaWZ5IHRoZSBkYXRhIGFscmVhZHkgaW4gdGhlIG1vZGVsLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIE1vZGVsQnVpbGRlcgotewotICAgIC8qKgotICAgICAqIEdpdmVuIGEgbW9kZWwgKHdoaWNoIG1pZ2h0IGFscmVhZHkgYmUgcGFydGx5IHBvcHVsYXRlZCB3aXRoIGRhdGEsIGFkZAotICAgICAqIGluZm9ybWF0aW9uIGFib3V0IEpTRiBhcnRpZmFjdHMuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYnVpbGRNb2RlbChNb2RlbCBtb2RlbCwgTW9kZWxQYXJhbXMgcGFyYW1ldGVycykKLSAgICAgICAgICAgIHRocm93cyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvTW9kZWxQYXJhbXMuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvTW9kZWxQYXJhbXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTNjZmIxMy4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL01vZGVsUGFyYW1zLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotLyoNCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqIA0KLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKiANCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmJ1aWxkZXI7DQotDQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmJ1aWxkZXIudHJpbmlkYWQucGFyc2UuRmFjZXNDb25maWdCZWFuOw0KLQ0KLXB1YmxpYyBjbGFzcyBNb2RlbFBhcmFtcw0KLXsNCi0gICAgcHJpdmF0ZSBTdHJpbmcgaW5jbHVkZXM7DQotDQotICAgIHByaXZhdGUgU3RyaW5nIGV4Y2x1ZGVzOw0KLQ0KLSAgICBwcml2YXRlIExpc3Qgc291cmNlczsNCi0gICAgDQotICAgIHByaXZhdGUgTGlzdCBjb21wb3NpdGVDb21wb25lbnREaXJlY3RvcmllczsNCi0gICAgDQotICAgIHByaXZhdGUgTWFwIGNvbXBvc2l0ZUNvbXBvbmVudExpYnJhcmllczsNCi0gICAgDQotICAgIHByaXZhdGUgU3RyaW5nIGNvbXBvc2l0ZUNvbXBvbmVudEZpbGVFeHRlbnNpb25zOw0KLSAgICANCi0gICAgcHJpdmF0ZSBGYWNlc0NvbmZpZ0JlYW4gZmFjZXNDb25maWdCZWFuOw0KLQ0KLSAgICBwdWJsaWMgTW9kZWxQYXJhbXMoKQ0KLSAgICB7DQotICAgICAgICBzdXBlcigpOw0KLSAgICB9DQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0SW5jbHVkZXMoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gaW5jbHVkZXM7DQotICAgIH0NCi0gICAgcHVibGljIHZvaWQgc2V0SW5jbHVkZXMoU3RyaW5nIGluY2x1ZGVzKQ0KLSAgICB7DQotICAgICAgICB0aGlzLmluY2x1ZGVzID0gaW5jbHVkZXM7DQotICAgIH0NCi0gICAgcHVibGljIFN0cmluZyBnZXRFeGNsdWRlcygpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBleGNsdWRlczsNCi0gICAgfQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRFeGNsdWRlcyhTdHJpbmcgZXhjbHVkZXMpDQotICAgIHsNCi0gICAgICAgIHRoaXMuZXhjbHVkZXMgPSBleGNsdWRlczsNCi0gICAgfQ0KLSAgICBwdWJsaWMgTGlzdCBnZXRTb3VyY2VEaXJzKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHNvdXJjZXM7DQotICAgIH0NCi0gICAgcHVibGljIHZvaWQgc2V0U291cmNlRGlycyhMaXN0IHNvdXJjZXMpDQotICAgIHsNCi0gICAgICAgIHRoaXMuc291cmNlcyA9IHNvdXJjZXM7DQotICAgIH0NCi0gICAgcHVibGljIExpc3QgZ2V0Q29tcG9zaXRlQ29tcG9uZW50RGlyZWN0b3JpZXMoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gY29tcG9zaXRlQ29tcG9uZW50RGlyZWN0b3JpZXM7DQotICAgIH0NCi0gICAgcHVibGljIE1hcCBnZXRDb21wb3NpdGVDb21wb25lbnRMaWJyYXJpZXMoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gY29tcG9zaXRlQ29tcG9uZW50TGlicmFyaWVzOw0KLSAgICB9DQotICAgIHB1YmxpYyB2b2lkIHNldENvbXBvc2l0ZUNvbXBvbmVudERpcmVjdG9yaWVzKExpc3QgY29tcG9zaXRlQ29tcG9uZW50RGlyZWN0b3JpZXMpDQotICAgIHsNCi0gICAgICAgIHRoaXMuY29tcG9zaXRlQ29tcG9uZW50RGlyZWN0b3JpZXMgPSBjb21wb3NpdGVDb21wb25lbnREaXJlY3RvcmllczsNCi0gICAgfQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRDb21wb3NpdGVDb21wb25lbnRMaWJyYXJpZXMoTWFwIGNvbXBvc2l0ZUNvbXBvbmVudExpYnJhcmllcykNCi0gICAgew0KLSAgICAgICAgdGhpcy5jb21wb3NpdGVDb21wb25lbnRMaWJyYXJpZXMgPSBjb21wb3NpdGVDb21wb25lbnRMaWJyYXJpZXM7DQotICAgIH0NCi0gICAgcHVibGljIEZhY2VzQ29uZmlnQmVhbiBnZXRGYWNlc0NvbmZpZ0JlYW4oKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZmFjZXNDb25maWdCZWFuOw0KLSAgICB9DQotICAgIHB1YmxpYyB2b2lkIHNldEZhY2VzQ29uZmlnQmVhbihGYWNlc0NvbmZpZ0JlYW4gZmFjZXNDb25maWdCZWFuKQ0KLSAgICB7DQotICAgICAgICB0aGlzLmZhY2VzQ29uZmlnQmVhbiA9IGZhY2VzQ29uZmlnQmVhbjsNCi0gICAgfQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldENvbXBvc2l0ZUNvbXBvbmVudEZpbGVFeHRlbnNpb25zKCkgew0KLSAgICAgICAgcmV0dXJuIGNvbXBvc2l0ZUNvbXBvbmVudEZpbGVFeHRlbnNpb25zOw0KLSAgICB9DQotICAgIHB1YmxpYyB2b2lkIHNldENvbXBvc2l0ZUNvbXBvbmVudEZpbGVFeHRlbnNpb25zKA0KLSAgICAgICAgICAgIFN0cmluZyBjb21wb3NpdGVDb21wb25lbnRGaWxlRXh0ZW5zaW9ucykgew0KLSAgICAgICAgdGhpcy5jb21wb3NpdGVDb21wb25lbnRGaWxlRXh0ZW5zaW9ucyA9IGNvbXBvc2l0ZUNvbXBvbmVudEZpbGVFeHRlbnNpb25zOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvaW8vUHJldHR5V3JpdGVyLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL2lvL1ByZXR0eVdyaXRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwODExMWZiLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvaW8vUHJldHR5V3JpdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzggKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmJ1aWxkZXIuaW87Ci0KLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwotaW1wb3J0IGphdmEuaW8uV3JpdGVyOwotCi1wdWJsaWMgY2xhc3MgUHJldHR5V3JpdGVyIGV4dGVuZHMgUHJpbnRXcml0ZXIKLXsKLSAgICBwdWJsaWMgUHJldHR5V3JpdGVyKE91dHB1dFN0cmVhbSBvdXQpCi0gICAgewotICAgICAgICBzdXBlcihvdXQpOwotICAgIH0KLQotICAgIHB1YmxpYyBQcmV0dHlXcml0ZXIoT3V0cHV0U3RyZWFtIG91dCwgYm9vbGVhbiBhdXRvRmx1c2gpCi0gICAgewotICAgICAgICBzdXBlcihvdXQsIGF1dG9GbHVzaCk7Ci0gICAgfQotCi0gICAgcHVibGljIFByZXR0eVdyaXRlcihXcml0ZXIgb3V0KQotICAgIHsKLSAgICAgICAgc3VwZXIob3V0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUHJldHR5V3JpdGVyKFdyaXRlciBvdXQsIGJvb2xlYW4gYXV0b0ZsdXNoKQotICAgIHsKLSAgICAgICAgc3VwZXIob3V0LCBhdXRvRmx1c2gpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGluZGVudCgpCi0gICAgewotICAgICAgICBfaW5kZW50YXRpb24rKzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB1bmluZGVudCgpCi0gICAgewotICAgICAgICBfaW5kZW50YXRpb24tLTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB3cml0ZShTdHJpbmcgc3RyaW5nLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKQotICAgIHsKLSAgICAgICAgaWYgKF91bmxhdGNoUGVuZGluZygpKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IF9pbmRlbnRhdGlvbjsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN1cGVyLndyaXRlKFRBQl9JTkRFTlQsIDAsIDIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgc3VwZXIud3JpdGUoc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgd3JpdGUoY2hhcltdIGNoYXJzLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKQotICAgIHsKLSAgICAgICAgaWYgKF91bmxhdGNoUGVuZGluZygpKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IF9pbmRlbnRhdGlvbjsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN1cGVyLndyaXRlKFRBQl9JTkRFTlRfQ0hBUlMsIDAsIDIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgc3VwZXIud3JpdGUoY2hhcnMsIG9mZnNldCwgbGVuZ3RoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBwcmludGxuKCkKLSAgICB7Ci0gICAgICAgIHN1cGVyLnByaW50bG4oKTsKLSAgICAgICAgX2xhdGNoUGVuZGluZygpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHByaW50bG4oYm9vbGVhbiB4KQotICAgIHsKLSAgICAgICAgc3VwZXIucHJpbnRsbih4KTsKLSAgICAgICAgX2xhdGNoUGVuZGluZygpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHByaW50bG4oY2hhciB4KQotICAgIHsKLSAgICAgICAgc3VwZXIucHJpbnRsbih4KTsKLSAgICAgICAgX2xhdGNoUGVuZGluZygpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHByaW50bG4oaW50IHgpCi0gICAgewotICAgICAgICBzdXBlci5wcmludGxuKHgpOwotICAgICAgICBfbGF0Y2hQZW5kaW5nKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcHJpbnRsbihsb25nIHgpCi0gICAgewotICAgICAgICBzdXBlci5wcmludGxuKHgpOwotICAgICAgICBfbGF0Y2hQZW5kaW5nKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcHJpbnRsbihmbG9hdCB4KQotICAgIHsKLSAgICAgICAgc3VwZXIucHJpbnRsbih4KTsKLSAgICAgICAgX2xhdGNoUGVuZGluZygpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHByaW50bG4oZG91YmxlIHgpCi0gICAgewotICAgICAgICBzdXBlci5wcmludGxuKHgpOwotICAgICAgICBfbGF0Y2hQZW5kaW5nKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcHJpbnRsbihjaGFyW10geCkKLSAgICB7Ci0gICAgICAgIHN1cGVyLnByaW50bG4oeCk7Ci0gICAgICAgIF9sYXRjaFBlbmRpbmcoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBwcmludGxuKFN0cmluZyB4KQotICAgIHsKLSAgICAgICAgaW50IGZyb21JbmRleCA9IDA7Ci0gICAgICAgIGZvciAoaW50IGluZGV4ID0geC5pbmRleE9mKCdcbicpOyBpbmRleCAhPSAtMSAmJiBpbmRleCArIDEgPCB4Lmxlbmd0aCgpOyBmcm9tSW5kZXggPSBpbmRleCArIDEsIGluZGV4ID0geAotICAgICAgICAgICAgICAgIC5pbmRleE9mKCdcbicsIGZyb21JbmRleCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN1cGVyLnByaW50bG4oeC5zdWJzdHJpbmcoZnJvbUluZGV4LCBpbmRleCkpOwotICAgICAgICAgICAgX2xhdGNoUGVuZGluZygpOwotICAgICAgICB9Ci0KLSAgICAgICAgc3VwZXIucHJpbnRsbih4LnN1YnN0cmluZyhmcm9tSW5kZXgpKTsKLSAgICAgICAgX2xhdGNoUGVuZGluZygpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHByaW50bG4oT2JqZWN0IHgpCi0gICAgewotICAgICAgICBzdXBlci5wcmludGxuKHgpOwotICAgICAgICBfbGF0Y2hQZW5kaW5nKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIF91bmxhdGNoUGVuZGluZygpCi0gICAgewotICAgICAgICBib29sZWFuIHBlbmRpbmcgPSBfcGVuZGluZzsKLSAgICAgICAgaWYgKHBlbmRpbmcpCi0gICAgICAgIHsKLSAgICAgICAgICAgIF9wZW5kaW5nID0gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcGVuZGluZzsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gX2xhdGNoUGVuZGluZygpCi0gICAgewotICAgICAgICBib29sZWFuIHBlbmRpbmcgPSBfcGVuZGluZzsKLSAgICAgICAgaWYgKCFwZW5kaW5nKQotICAgICAgICB7Ci0gICAgICAgICAgICBfcGVuZGluZyA9IHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gIXBlbmRpbmc7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBpbnQgX2luZGVudGF0aW9uOwotICAgIHByaXZhdGUgYm9vbGVhbiBfcGVuZGluZyA9IHRydWU7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFCX0lOREVOVCA9ICIgICI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhcltdIFRBQl9JTkRFTlRfQ0hBUlMgPSBUQUJfSU5ERU5ULnRvQ2hhckFycmF5KCk7Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL2lvL1htbFdyaXRlci5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9pby9YbWxXcml0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjZhYmY2Ny4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL2lvL1htbFdyaXRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE5ICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5idWlsZGVyLmlvOwotCi1pbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKLWltcG9ydCBqYXZhLnV0aWwuU3RhY2s7Ci0KLS8qKgotICogU2ltcGxlIHV0aWxpdHkgdG8gaGVscCB3cml0ZSBvdXQgZGF0YSBzdHJ1Y3R1cmVzIGluIHhtbCBmb3JtYXQsIHdpdGggcHJldHR5Ci0gKiBpbmRlbnRpbmcuCi0gKi8KLXB1YmxpYyBjbGFzcyBYbWxXcml0ZXIKLXsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX0NIQVJTID0gIjw+JiI7Ci0KLSAgICBwcml2YXRlIFByaW50V3JpdGVyIG91dDsKLSAgICBwcml2YXRlIFN0YWNrIGNvbnRleHRzID0gbmV3IFN0YWNrKCk7Ci0gICAgcHJpdmF0ZSBpbnQgaW5kZW50ID0gMDsKLQotICAgIC8vIElzIHRoZSBjdXJyZW50IHhtbCBlbGVtZW50IHN0aWxsICJvcGVuIiBmb3IgYWRkaW5nIGF0dHJpYnV0ZXMsCi0gICAgLy8gaWUgbmVlZHMgYSAiPiIgYmVmb3JlIGFkZGluZyBuZXN0ZWQgdGV4dCBvciBjaGlsZCBlbGVtZW50cy4KLSAgICBwcml2YXRlIGJvb2xlYW4gb3BlbkVsZW1lbnQgPSBmYWxzZTsKLQotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIENvbnRleHQKLSAgICB7Ci0gICAgICAgIFN0cmluZyBlbGVtZW50TmFtZTsKLSAgICAgICAgYm9vbGVhbiBoYXNDb250ZW50OwotCi0gICAgICAgIENvbnRleHQoU3RyaW5nIGVsZW1lbnQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVsZW1lbnROYW1lID0gZWxlbWVudDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBYbWxXcml0ZXIoUHJpbnRXcml0ZXIgb3V0KQotICAgIHsKLSAgICAgICAgdGhpcy5vdXQgPSBvdXQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGluZGVudCgpCi0gICAgewotICAgICAgICBvdXQud3JpdGUoIlxuIik7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW5kZW50OyArK2kpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG91dC53cml0ZSgiICAiKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBpbmRlbnRJbmMoKQotICAgIHsKLSAgICAgICAgaW5kZW50KCk7Ci0gICAgICAgICsraW5kZW50OwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBpbmRlbnREZWMoKQotICAgIHsKLSAgICAgICAgLS1pbmRlbnQ7Ci0gICAgICAgIGluZGVudCgpOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBjb250YWluc1htbENoYXJzKFN0cmluZyB0ZXh0KQotICAgIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBYTUxfQ0hBUlMubGVuZ3RoKCk7ICsraSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHRleHQuaW5kZXhPZihYTUxfQ0hBUlMuY2hhckF0KGkpKSA+PSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB3cml0ZUVsZW1lbnQoU3RyaW5nIG5hbWUsIFN0cmluZyBib2R5KQotICAgIHsKLSAgICAgICAgaWYgKGJvZHkgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG9wZW5FbGVtZW50KQotICAgICAgICB7Ci0gICAgICAgICAgICBvdXQud3JpdGUoIj4iKTsKLSAgICAgICAgICAgIG9wZW5FbGVtZW50ID0gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBpbmRlbnQoKTsKLSAgICAgICAgb3V0LndyaXRlKCI8Iik7Ci0gICAgICAgIG91dC53cml0ZShuYW1lKTsKLSAgICAgICAgb3V0LndyaXRlKCI+Iik7Ci0KLSAgICAgICAgaWYgKGNvbnRhaW5zWG1sQ2hhcnMoYm9keSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIFRoZSB0ZXh0IGNvbnRhaW5zIGNoYXJzIHRoYXQgbmVlZCB0byBiZSBlc2NhcGVkLiBSYXRoZXIgdGhhbgotICAgICAgICAgICAgLy8gZXNjYXBlIHRoZW0gb25lLWJ5LW9uZSwganVzdCB3cml0ZSB0aGUgYm9keSBpbiBhIENEQVRBIHNlY3Rpb24uCi0KLSAgICAgICAgICAgIGlmIChib2R5LmluZGV4T2YoIlxuIikgPiAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIG11bHRpLWxpbmUgYm9keSwgc28gaXQgaXMgbW9zdCByZWFkYWJsZSB3aGVuIHRoZSBDREFUQQotICAgICAgICAgICAgICAgIC8vIG1hcmtlcnMgYXJlIGFnYWluc3QgdGhlIGxlZnQtaGFuZCBtYXJnaW4KLSAgICAgICAgICAgICAgICBvdXQud3JpdGUoIlxuPCFbQ0RBVEFbXG4iKTsKLSAgICAgICAgICAgICAgICBvdXQud3JpdGUoYm9keSk7Ci0gICAgICAgICAgICAgICAgb3V0LndyaXRlKCJcbl1dPiIpOwotCi0gICAgICAgICAgICAgICAgLy8gV3JpdGUgdGhlIGVuZCB0YWcgb24gdGhlIG5leHQgbGluZSwgY29ycmVjdGx5IGluZGVudGVkCi0gICAgICAgICAgICAgICAgaW5kZW50KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8ganVzdCBhIHNtYWxsIGJvZHksIHNvIG91dHB1dCBpdCAiaW5saW5lIgotICAgICAgICAgICAgICAgIG91dC53cml0ZSgiPCFbQ0RBVEFbIik7Ci0gICAgICAgICAgICAgICAgb3V0LndyaXRlKGJvZHkpOwotICAgICAgICAgICAgICAgIG91dC53cml0ZSgiXV0+Iik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBvdXQud3JpdGUoYm9keSk7Ci0gICAgICAgIH0KLSAgICAgICAgb3V0LndyaXRlKCI8LyIpOwotICAgICAgICBvdXQud3JpdGUobmFtZSk7Ci0gICAgICAgIG91dC53cml0ZSgiPiIpOwotCi0gICAgICAgICgoQ29udGV4dCkgY29udGV4dHMucGVlaygpKS5oYXNDb250ZW50ID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB3cml0ZUVsZW1lbnQoU3RyaW5nIG5hbWUsIGJvb2xlYW4gdmFsdWUpCi0gICAgewotICAgICAgICB3cml0ZUVsZW1lbnQobmFtZSwgU3RyaW5nLnZhbHVlT2YodmFsdWUpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB3cml0ZUVsZW1lbnQoU3RyaW5nIG5hbWUsIEJvb2xlYW4gdmFsdWUpCi0gICAgewotICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgd3JpdGVFbGVtZW50KG5hbWUsIHZhbHVlLnRvU3RyaW5nKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYmVnaW5FbGVtZW50KFN0cmluZyBuYW1lKQotICAgIHsKLSAgICAgICAgaWYgKG9wZW5FbGVtZW50KQotICAgICAgICB7Ci0gICAgICAgICAgICBvdXQud3JpdGUoIj4iKTsKLSAgICAgICAgfQotICAgICAgICBvcGVuRWxlbWVudCA9IHRydWU7Ci0KLSAgICAgICAgaW5kZW50SW5jKCk7Ci0gICAgICAgIG91dC53cml0ZSgiPCIpOwotICAgICAgICBvdXQud3JpdGUobmFtZSk7Ci0KLSAgICAgICAgaWYgKCFjb250ZXh0cy5lbXB0eSgpKQotICAgICAgICB7Ci0gICAgICAgICAgICAoKENvbnRleHQpIGNvbnRleHRzLnBlZWsoKSkuaGFzQ29udGVudCA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgY29udGV4dHMucHVzaChuZXcgQ29udGV4dChuYW1lKSk7Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB3cml0ZUF0dHIoU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkKLSAgICB7Ci0gICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIW9wZW5FbGVtZW50KQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJ4bWwgZWxlbWVudCBub3Qgb3BlbiIpOwotICAgICAgICB9Ci0gICAgICAgIG91dC53cml0ZSgiICIpOwotICAgICAgICBvdXQud3JpdGUobmFtZSk7Ci0gICAgICAgIG91dC53cml0ZSgiPSIpOwotICAgICAgICBvdXQud3JpdGUoIlwiIik7Ci0gICAgICAgIG91dC53cml0ZSh2YWx1ZSk7Ci0gICAgICAgIG91dC53cml0ZSgiXCIiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBlbmRFbGVtZW50KFN0cmluZyBuYW1lKQotICAgIHsKLSAgICAgICAgQ29udGV4dCBjID0gKENvbnRleHQpIGNvbnRleHRzLnBvcCgpOwotCi0gICAgICAgIGlmICghYy5lbGVtZW50TmFtZS5lcXVhbHMobmFtZSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlVuYmFsYW5jZWQgeG1sOiBleHBlY3RlZCB0byBlbmQgWyIKLSAgICAgICAgICAgICAgICAgICAgKyBjLmVsZW1lbnROYW1lICsgIl0iICsgIiBidXQgWyIgKyBuYW1lCi0gICAgICAgICAgICAgICAgICAgICsgIl0gd2FzIGVuZGVkIGluc3RlYWQiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChjLmhhc0NvbnRlbnQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGluZGVudERlYygpOwotICAgICAgICAgICAgb3V0LndyaXRlKCI8LyIpOwotICAgICAgICAgICAgb3V0LndyaXRlKGMuZWxlbWVudE5hbWUpOwotICAgICAgICAgICAgb3V0LndyaXRlKCI+Iik7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBvdXQud3JpdGUoIi8+Iik7Ci0gICAgICAgICAgICAtLWluZGVudDsgLy8gZGVjcmVtZW50IHRoZSBpbmRlbnQsIGJ1dCBkbyBub3Qgd3JpdGUgdGhlIGxpbmVmZWVkCi0gICAgICAgIH0KLSAgICAgICAgb3BlbkVsZW1lbnQgPSBmYWxzZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL21vZGVsL0F0dHJpYnV0ZUhvbGRlci5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9tb2RlbC9BdHRyaWJ1dGVIb2xkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWFlZTQyYy4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL21vZGVsL0F0dHJpYnV0ZUhvbGRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmJ1aWxkZXIubW9kZWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLS8qKgotICogSW50ZXJmYWNlIGZvciBhbnkgYXJ0aWZhY3QgdGhhdCBoYXMgSlNQIGF0dHJpYnV0ZXMgb24gaXQuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQXR0cmlidXRlSG9sZGVyCi17Ci0gICAgCi0gICAgSXRlcmF0b3IgYXR0cmlidXRlcygpOwotCi0gICAgQXR0cmlidXRlTWV0YSBnZXRBdHRyaWJ1dGUoU3RyaW5nIG5hbWUpOwotCi0gICAgdm9pZCBhZGRBdHRyaWJ1dGUoQXR0cmlidXRlTWV0YSBwcm9wKTsKLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvbW9kZWwvQXR0cmlidXRlTWV0YS5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9tb2RlbC9BdHRyaWJ1dGVNZXRhLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzM2VjMWQuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9tb2RlbC9BdHRyaWJ1dGVNZXRhLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTggKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmJ1aWxkZXIubW9kZWw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuZGlnZXN0ZXIuRGlnZXN0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5idWlsZGVyLmlvLlhtbFdyaXRlcjsKLQotLyoqCi0gKiBTdG9yZSBtZXRhZGF0YSBhYm91dCBhIGF0dHJpYnV0ZSBvZiBhIGpzcCB0YWcuIAotICogPHA+Ci0gKiBUaGlzIG1ldGFkYXRhIGRlZmluZXMgdGhlIGF0dHJpYnV0ZXMgb2YgSlNQIHRhZ3MsIGFtb25nIG90aGVyIHRoaW5ncy4KLSAqIAotICogU2luY2UgdGhpcyBpcyBhIGRpZmZlcmVudCBjb25jZXB0IGZyb20gUHJvcGVydHlNZXRhLCBpcyBpcyBsZWZ0IGFzCi0gKiBhbm90aGVyIGNsYXNzIChNYXliZSBQcm9wZXJ0eU1ldGEgbXVzdCBBdHRyaWJ1dGVNZXRhIGJ1dCBJJ20gbm90IHN1cmUsIHNpbmNlCi0gKiB0aGVyZSBhcmUgZGlmZmVyZW50IGNvbmNlcHRzIChhIHByb3BlcnR5IGlzIGZvciBqc2YsIGFuIGF0dHJpYnV0ZSBpcyBmb3IganNwKSkuCi0gKi8KLXB1YmxpYyBjbGFzcyBBdHRyaWJ1dGVNZXRhCi17Ci0gICAgcHJpdmF0ZSBTdHJpbmcgX25hbWU7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgX2NsYXNzTmFtZTsKLSAgICBwcml2YXRlIEJvb2xlYW4gX3JlcXVpcmVkOwotICAgIHByaXZhdGUgU3RyaW5nIF9kZXNjcmlwdGlvbjsKLSAgICBwcml2YXRlIFN0cmluZyBfbG9uZ0Rlc2NyaXB0aW9uOwotICAgIHByaXZhdGUgQm9vbGVhbiBfcnRleHBydmFsdWU7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgX2RlZmVycmVkVmFsdWVUeXBlOwotICAgIHByaXZhdGUgU3RyaW5nIF9kZWZlcnJlZE1ldGhvZFNpZ25hdHVyZTsKLSAgICBwcml2YXRlIEJvb2xlYW4gX2V4Y2x1ZGU7Ci0gICAgCi0gICAgLy9TZXQgb24gZmFjZWxldCBtZXJnZQotICAgIHByaXZhdGUgdHJhbnNpZW50IEJvb2xlYW4gX2ZhY2VsZXRzT25seTsKLQotICAgIHB1YmxpYyBBdHRyaWJ1dGVNZXRhKCkKLSAgICB7Ci0gICAgICAgIAotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgICogQHNpbmNlIDEuMC40Ci0gICAgICAqKi8KLSAgICBwdWJsaWMgQXR0cmlidXRlTWV0YShBdHRyaWJ1dGVNZXRhIGFtKQotICAgIHsKLSAgICAgICAgX25hbWUgPSBhbS5fbmFtZTsKLSAgICAgICAgX2NsYXNzTmFtZSA9IGFtLl9jbGFzc05hbWU7Ci0gICAgICAgIF9yZXF1aXJlZCA9IGFtLl9yZXF1aXJlZDsKLSAgICAgICAgX2Rlc2NyaXB0aW9uID0gYW0uX2Rlc2NyaXB0aW9uOwotICAgICAgICBfbG9uZ0Rlc2NyaXB0aW9uID0gYW0uX2xvbmdEZXNjcmlwdGlvbjsKLSAgICAgICAgX3J0ZXhwcnZhbHVlID0gYW0uX3J0ZXhwcnZhbHVlOwotICAgICAgICBfZGVmZXJyZWRWYWx1ZVR5cGUgPSBhbS5fZGVmZXJyZWRWYWx1ZVR5cGU7Ci0gICAgICAgIF9kZWZlcnJlZE1ldGhvZFNpZ25hdHVyZSA9IGFtLl9kZWZlcnJlZE1ldGhvZFNpZ25hdHVyZTsKLSAgICAgICAgX2V4Y2x1ZGUgPSBhbS5fZXhjbHVkZTsKLSAgICAgICAgX2ZhY2VsZXRzT25seSA9IGFtLl9mYWNlbGV0c09ubHk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFdyaXRlIHRoaXMgbW9kZWwgb3V0IGFzIHhtbC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgd3JpdGVYbWwoWG1sV3JpdGVyIG91dCwgQXR0cmlidXRlTWV0YSBhbSkKLSAgICB7Ci0gICAgICAgIG91dC5iZWdpbkVsZW1lbnQoImF0dHJpYnV0ZSIpOwotICAgICAgICBvdXQud3JpdGVFbGVtZW50KCJuYW1lIiwgYW0uX25hbWUpOwotICAgICAgICBvdXQud3JpdGVFbGVtZW50KCJjbGFzc05hbWUiLCBhbS5fY2xhc3NOYW1lKTsKLSAgICAgICAgb3V0LndyaXRlRWxlbWVudCgicmVxdWlyZWQiLCBhbS5fcmVxdWlyZWQpOwotICAgICAgICBvdXQud3JpdGVFbGVtZW50KCJydGV4cHJ2YWx1ZSIsIGFtLl9ydGV4cHJ2YWx1ZSk7Ci0gICAgICAgIG91dC53cml0ZUVsZW1lbnQoImRlc2MiLCBhbS5fZGVzY3JpcHRpb24pOwotICAgICAgICBvdXQud3JpdGVFbGVtZW50KCJsb25nRGVzYyIsIGFtLl9sb25nRGVzY3JpcHRpb24pOwotICAgICAgICBvdXQud3JpdGVFbGVtZW50KCJkZWZlcnJlZFZhbHVlVHlwZSIsIGFtLl9kZWZlcnJlZFZhbHVlVHlwZSk7Ci0gICAgICAgIG91dC53cml0ZUVsZW1lbnQoImRlZmVycmVkTWV0aG9kU2lnbmF0dXJlIiwgYW0uX2RlZmVycmVkTWV0aG9kU2lnbmF0dXJlKTsKLSAgICAgICAgb3V0LndyaXRlRWxlbWVudCgiZXhjbHVkZSIsIGFtLl9leGNsdWRlKTsKLSAgICAgICAgb3V0LndyaXRlRWxlbWVudCgiZmFjZWxldHNPbmx5IiwgYW0uX2ZhY2VsZXRzT25seSk7Ci0gICAgICAgIG91dC5lbmRFbGVtZW50KCJhdHRyaWJ1dGUiKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGQgZGlnZXN0ZXIgcnVsZXMgdG8gcmVwb3B1bGF0ZSBhIE1vZGVsIGluc3RhbmNlIGZyb20gYW4geG1sIGZpbGUuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGFkZFhtbFJ1bGVzKERpZ2VzdGVyIGRpZ2VzdGVyLCBTdHJpbmcgcHJlZml4KQotICAgIHsKLSAgICAgICAgU3RyaW5nIG5ld1ByZWZpeCA9IHByZWZpeCArICIvYXR0cmlidXRlIjsKLQotICAgICAgICBkaWdlc3Rlci5hZGRPYmplY3RDcmVhdGUobmV3UHJlZml4LCBBdHRyaWJ1dGVNZXRhLmNsYXNzKTsKLSAgICAgICAgZGlnZXN0ZXIuYWRkU2V0TmV4dChuZXdQcmVmaXgsICJhZGRBdHRyaWJ1dGUiKTsKLQotICAgICAgICBkaWdlc3Rlci5hZGRCZWFuUHJvcGVydHlTZXR0ZXIobmV3UHJlZml4ICsgIi9uYW1lIik7Ci0gICAgICAgIGRpZ2VzdGVyLmFkZEJlYW5Qcm9wZXJ0eVNldHRlcihuZXdQcmVmaXggKyAiL2NsYXNzTmFtZSIpOwotICAgICAgICBkaWdlc3Rlci5hZGRCZWFuUHJvcGVydHlTZXR0ZXIobmV3UHJlZml4ICsgIi9yZXF1aXJlZCIpOwotICAgICAgICBkaWdlc3Rlci5hZGRCZWFuUHJvcGVydHlTZXR0ZXIobmV3UHJlZml4ICsgIi9ydGV4cHJ2YWx1ZSIpOwotICAgICAgICBkaWdlc3Rlci5hZGRCZWFuUHJvcGVydHlTZXR0ZXIobmV3UHJlZml4ICsgIi9kZXNjIiwgImRlc2NyaXB0aW9uIik7Ci0gICAgICAgIGRpZ2VzdGVyLmFkZEJlYW5Qcm9wZXJ0eVNldHRlcihuZXdQcmVmaXggKyAiL2xvbmdEZXNjIiwKLSAgICAgICAgICAgICAgICAibG9uZ0Rlc2NyaXB0aW9uIik7Ci0gICAgICAgIGRpZ2VzdGVyLmFkZEJlYW5Qcm9wZXJ0eVNldHRlcihuZXdQcmVmaXggKyAiL2RlZmVycmVkVmFsdWVUeXBlIik7Ci0gICAgICAgIGRpZ2VzdGVyLmFkZEJlYW5Qcm9wZXJ0eVNldHRlcihuZXdQcmVmaXggKyAiL2RlZmVycmVkTWV0aG9kU2lnbmF0dXJlIik7Ci0gICAgICAgIGRpZ2VzdGVyLmFkZEJlYW5Qcm9wZXJ0eVNldHRlcihuZXdQcmVmaXggKyAiL2V4Y2x1ZGUiKTsKLSAgICAgICAgZGlnZXN0ZXIuYWRkQmVhblByb3BlcnR5U2V0dGVyKG5ld1ByZWZpeCArICIvZmFjZWxldHNPbmx5Iik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTWVyZ2UgdGhlIGRhdGEgaW4gdGhlIHNwZWNpZmllZCBvdGhlciBwcm9wZXJ0eSBpbnRvIHRoaXMgb25lLCB0aHJvd2luZyBhbgotICAgICAqIGV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhbiBpbmNvbXBhdGliaWxpdHkuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgbWVyZ2UoQXR0cmlidXRlTWV0YSBvdGhlcikKLSAgICB7Ci0gICAgICAgIC8vIGRvbid0IG1lcmdlIGNsYXNzTmFtZQotICAgICAgICAKLSAgICAgICAgX25hbWUgPSBNb2RlbFV0aWxzLm1lcmdlKHRoaXMuX25hbWUsIG90aGVyLl9uYW1lKTsKLSAgICAgICAgX3JlcXVpcmVkID0gTW9kZWxVdGlscy5tZXJnZSh0aGlzLl9yZXF1aXJlZCwgb3RoZXIuX3JlcXVpcmVkKTsKLSAgICAgICAgX3J0ZXhwcnZhbHVlID0gTW9kZWxVdGlscy5tZXJnZSh0aGlzLl9ydGV4cHJ2YWx1ZSwgb3RoZXIuX3J0ZXhwcnZhbHVlKTsKLSAgICAgICAgX2Rlc2NyaXB0aW9uID0gTW9kZWxVdGlscy5tZXJnZSh0aGlzLl9kZXNjcmlwdGlvbiwgb3RoZXIuX2Rlc2NyaXB0aW9uKTsKLSAgICAgICAgX2xvbmdEZXNjcmlwdGlvbiA9IE1vZGVsVXRpbHMubWVyZ2UodGhpcy5fbG9uZ0Rlc2NyaXB0aW9uLCBvdGhlci5fbG9uZ0Rlc2NyaXB0aW9uKTsKLSAgICAgICAgX2RlZmVycmVkVmFsdWVUeXBlID0gTW9kZWxVdGlscy5tZXJnZSh0aGlzLl9kZWZlcnJlZFZhbHVlVHlwZSwgb3RoZXIuX2RlZmVycmVkVmFsdWVUeXBlKTsKLSAgICAgICAgX2RlZmVycmVkTWV0aG9kU2lnbmF0dXJlID0gTW9kZWxVdGlscy5tZXJnZSh0aGlzLl9kZWZlcnJlZE1ldGhvZFNpZ25hdHVyZSwgb3RoZXIuX2RlZmVycmVkTWV0aG9kU2lnbmF0dXJlKTsKLSAgICAgICAgX2V4Y2x1ZGUgPSBNb2RlbFV0aWxzLm1lcmdlKHRoaXMuX2V4Y2x1ZGUsIG90aGVyLl9leGNsdWRlKTsKLSAgICAgICAgX2ZhY2VsZXRzT25seSA9IE1vZGVsVXRpbHMubWVyZ2UodGhpcy5fZmFjZWxldHNPbmx5LCBvdGhlci5fZmFjZWxldHNPbmx5KTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ29weSBhbGwgYXR0cmlidXRlcyBpbiBvdGhlciB0byB0aGlzIGluc3RhbmNlLgotICAgICAqIAotICAgICAqIEBzaW5jZSAxLjAuMwotICAgICAqIEBwYXJhbSBvdGhlcgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNvcHkoQXR0cmlidXRlTWV0YSBvdGhlcikKLSAgICB7Ci0gICAgICAgIF9uYW1lID0gb3RoZXIuX25hbWU7Ci0gICAgICAgIF9yZXF1aXJlZCA9IG90aGVyLl9yZXF1aXJlZDsKLSAgICAgICAgX3J0ZXhwcnZhbHVlID0gb3RoZXIuX3J0ZXhwcnZhbHVlOwotICAgICAgICBfZGVzY3JpcHRpb24gPSBvdGhlci5fZGVzY3JpcHRpb247Ci0gICAgICAgIF9sb25nRGVzY3JpcHRpb24gPSBvdGhlci5fbG9uZ0Rlc2NyaXB0aW9uOwotICAgICAgICBfZGVmZXJyZWRWYWx1ZVR5cGUgPSBvdGhlci5fZGVmZXJyZWRWYWx1ZVR5cGU7Ci0gICAgICAgIF9kZWZlcnJlZE1ldGhvZFNpZ25hdHVyZSA9IG90aGVyLl9kZWZlcnJlZE1ldGhvZFNpZ25hdHVyZTsKLSAgICAgICAgX2V4Y2x1ZGUgPSBvdGhlci5fZXhjbHVkZTsKLSAgICAgICAgX2ZhY2VsZXRzT25seSA9IG90aGVyLl9mYWNlbGV0c09ubHk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFNldCB0aGUgbmFtZSB0aGF0IHVzZXJzIHJlZmVyIHRvIHRoaXMgcHJvcGVydHkgYnkuCi0gICAgICogPHA+Ci0gICAgICogVGhpcyBzZXRzIHRoZSBuYW1lIG9mIHhtbCB0YWcgYXR0cmlidXRlcywgYW5kIHRoZSBiYXNlIG5hbWVzIG9mIGdlbmVyYXRlZAotICAgICAqIGdldHRlci9zZXR0ZXIgbWV0aG9kcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKQotICAgIHsKLSAgICAgICAgX25hbWUgPSBuYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpCi0gICAgewotICAgICAgICByZXR1cm4gX25hbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBmdWxseS1xdWFsaWZpZWQgbmFtZSBvZiB0aGUgdHlwZSBvZiB0aGlzIHByb3BlcnR5LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldENsYXNzTmFtZShTdHJpbmcgY2xhc3NOYW1lKQotICAgIHsKLSAgICAgICAgdGhpcy5fY2xhc3NOYW1lID0gY2xhc3NOYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2xhc3NOYW1lKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfY2xhc3NOYW1lOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBTcGVjaWZ5IHdoZXRoZXIgdGhpcyBwcm9wZXJ0eSBpcyByZXF1aXJlZCwgaWUgd2hldGhlciBpdCBpcyBhIHN5bnRheAotICAgICAqIGVycm9yIGZvciBzb21lb25lIHRvIHVzZSBhIHRhZyBmb3IgYSBjb21wb25lbnQgd2l0aCB0aGlzIHByb3BlcnR5IGJ1dCBub3QKLSAgICAgKiBleHBsaWNpdGx5IHByb3ZpZGUgYSB2YWx1ZSBmb3IgdGhpcyBwcm9wZXJ0eS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRSZXF1aXJlZChCb29sZWFuIHJlcXVpcmVkKQotICAgIHsKLSAgICAgICAgX3JlcXVpcmVkID0gcmVxdWlyZWQ7Ci0gICAgfQotCi0gICAgcHVibGljIEJvb2xlYW4gaXNSZXF1aXJlZCgpCi0gICAgewotICAgICAgICByZXR1cm4gTW9kZWxVdGlscy5kZWZhdWx0T2YoX3JlcXVpcmVkLCBmYWxzZSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHNldFJ0ZXhwcnZhbHVlKEJvb2xlYW4gcnRleHBydmFsdWUpCi0gICAgewotICAgICAgICBfcnRleHBydmFsdWUgPSBydGV4cHJ2YWx1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQm9vbGVhbiBpc1J0ZXhwcnZhbHVlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBNb2RlbFV0aWxzLmRlZmF1bHRPZihfcnRleHBydmFsdWUsIGZhbHNlKTsKLSAgICB9Ci0gICAgCi0gICAgCi0gICAgcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIGRlc2MpCi0gICAgewotICAgICAgICBfZGVzY3JpcHRpb24gPSBkZXNjOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9kZXNjcmlwdGlvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRMb25nRGVzY3JpcHRpb24oU3RyaW5nIGRlc2MpCi0gICAgewotICAgICAgICBfbG9uZ0Rlc2NyaXB0aW9uID0gZGVzYzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldExvbmdEZXNjcmlwdGlvbigpCi0gICAgewotICAgICAgICByZXR1cm4gX2xvbmdEZXNjcmlwdGlvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2luY2UgMS4wLjMKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXREZWZlcnJlZFZhbHVlVHlwZShTdHJpbmcgZGVmZXJyZWRWYWx1ZVR5cGUpCi0gICAgewotICAgICAgICBfZGVmZXJyZWRWYWx1ZVR5cGUgPSBkZWZlcnJlZFZhbHVlVHlwZTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogSW5kaWNhdGUgdGhlIHR5cGUgdGhhdCB2YWx1ZXMgc2hvdWxkIGJlCi0gICAgICogY2FzdCBvbiB0bGQuIEl0IGlzIHN1cHBvc2VkIHRoYXQgdGhlIGNsYXNzTmFtZSBpcwotICAgICAqIGphdmF4LmVsLlZhbHVlRXhwcmVzc2lvbiB0byBhcHBseSBpdC4gCi0gICAgICoKLSAgICAgKiBAc2luY2UgMS4wLjMKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldERlZmVycmVkVmFsdWVUeXBlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfZGVmZXJyZWRWYWx1ZVR5cGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNpbmNlIDEuMC4zCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RGVmZXJyZWRNZXRob2RTaWduYXR1cmUoU3RyaW5nIGRlZmVycmVkTWV0aG9kU2lnbmF0dXJlKQotICAgIHsKLSAgICAgICAgX2RlZmVycmVkTWV0aG9kU2lnbmF0dXJlID0gZGVmZXJyZWRNZXRob2RTaWduYXR1cmU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW5kaWNhdGUgdGhlIG1ldGhvZCBzaWduYXR1cmUgdGhhdCB2YWx1ZXMgc2hvdWxkIGJlCi0gICAgICogY2FzdCBvbiB0bGQuIEl0IGlzIHN1cHBvc2VkIHRoYXQgdGhlIGNsYXNzTmFtZSBpcwotICAgICAqIGphdmF4LmVsLk1ldGhvZEV4cHJlc3Npb24gdG8gYXBwbHkgaXQuIAotICAgICAqCi0gICAgICogQHNpbmNlIDEuMC4zCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXREZWZlcnJlZE1ldGhvZFNpZ25hdHVyZSgpCi0gICAgewotICAgICAgICByZXR1cm4gX2RlZmVycmVkTWV0aG9kU2lnbmF0dXJlOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBAc2luY2UgMS4wLjMKLSAgICAgKi8KLSAgICBwdWJsaWMgQm9vbGVhbiBpc0V4Y2x1ZGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE1vZGVsVXRpbHMuZGVmYXVsdE9mKF9leGNsdWRlLCBmYWxzZSk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEBzaW5jZSAxLjAuMwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEV4Y2x1ZGUoQm9vbGVhbiBleGNsdWRlKQotICAgIHsKLSAgICAgICAgX2V4Y2x1ZGUgPSBleGNsdWRlOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiAKLSAgICAgKiBAc2luY2UgMS4wLjYKLSAgICAgKi8KLSAgICBwdWJsaWMgQm9vbGVhbiBpc0ZhY2VsZXRzT25seSgpCi0gICAgewotICAgICAgICByZXR1cm4gTW9kZWxVdGlscy5kZWZhdWx0T2YoX2ZhY2VsZXRzT25seSwgZmFsc2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIAotICAgICAqIEBzaW5jZSAxLjAuNgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEZhY2VsZXRzT25seShCb29sZWFuIGZhY2VsZXRzT25seSkKLSAgICB7Ci0gICAgICAgIHRoaXMuX2ZhY2VsZXRzT25seSA9IGZhY2VsZXRzT25seTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL21vZGVsL0JlaGF2aW9yTWV0YS5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9tb2RlbC9CZWhhdmlvck1ldGEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjY1NGI2Ni4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL21vZGVsL0JlaGF2aW9yTWV0YS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzI0ICswLDAgQEAKLS8qDQotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKiANCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICogDQotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5idWlsZGVyLm1vZGVsOw0KLQ0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllcjsNCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5kaWdlc3Rlci5EaWdlc3RlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5idWlsZGVyLmlvLlhtbFdyaXRlcjsNCi0NCi0vKioNCi0gKiBTdG9yZSBtZXRhZGF0YSBhYm91dCBhIGNsYXNzIHRoYXQgaXMgZWl0aGVyIGEgSlNGIEJlaGF2aW9yLCBvciBzb21lIGJhc2UNCi0gKiBjbGFzcyBvciBpbnRlcmZhY2UgdGhhdCBhIEJlaGF2aW9yIGNhbiBiZSBkZXJpdmVkIGZyb20uDQotICogPHA+DQotICogQSBiZWhhdmlvciBjYW4gYmUgdXNlZCBpbiB0d28gd2F5czoNCi0gKiA8dWw+DQotICogPGxpPmluc3RhbnRpYXRlZCB2aWEgYSBmYWNlbGV0IHRhZywNCi0gKiA8bGk+cmVmZXJlbmNlZCB2aWEgaXRzIGlkDQotICogPC91bD4NCi0gKiBAc2luY2UgMS4wLjYNCi0gKi8NCi1wdWJsaWMgY2xhc3MgQmVoYXZpb3JNZXRhIGV4dGVuZHMgVmlld0VudGl0eU1ldGEgaW1wbGVtZW50cyBQcm9wZXJ0eUhvbGRlcg0KLXsNCi0gICAgcHJpdmF0ZSBTdHJpbmcgX2JlaGF2aW9ySWQ7DQotICAgIHByaXZhdGUgaW50IF9iZWhhdmlvckNsYXNzTW9kaWZpZXJzOw0KLSAgICANCi0gICAgLy9Tb21lIGJlaGF2aW9ycyBoYXMgaXRzIG93biB0YWcgY2xhc3MsIHNvIGl0J3MgbmVjZXNzYXJ5IHRvDQotICAgIC8vYWRkIHNvbWUgcHJvcGVydGllcyBmb3IgdGhpcyBjYXNlcyAoZjpjb252ZXJ0TnVtYmVyIG9yIGY6Y29udmVydERhdGVUaW1lKQ0KLSAgICBwcml2YXRlIFN0cmluZyBfYm9keUNvbnRlbnQ7DQotICAgIHByaXZhdGUgQm9vbGVhbiBfY29uZmlnRXhjbHVkZWQ7DQotICAgIA0KLSAgICBwcml2YXRlIFN0cmluZyBfdGFnSGFuZGxlcjsNCi0gICAgcHJpdmF0ZSBCb29sZWFuIF9nZW5lcmF0ZWRDb21wb25lbnRDbGFzczsNCi0gICAgcHJpdmF0ZSBCb29sZWFuIF9ldmFsdWF0ZUVMT25FeGVjdXRpb247DQotDQotDQotICAgIC8qKg0KLSAgICAgKiBXcml0ZSBhbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIG91dCBhcyB4bWwuDQotICAgICAqLw0KLSAgICBwcm90ZWN0ZWQgdm9pZCB3cml0ZVhtbFNpbXBsZShYbWxXcml0ZXIgb3V0KQ0KLSAgICB7DQotICAgICAgICBzdXBlci53cml0ZVhtbFNpbXBsZShvdXQpOw0KLSAgICAgICAgb3V0LndyaXRlRWxlbWVudCgiYmVoYXZpb3JJZCIsIF9iZWhhdmlvcklkKTsNCi0gICAgICAgIG91dC53cml0ZUVsZW1lbnQoImJvZHlDb250ZW50IiwgX2JvZHlDb250ZW50KTsNCi0gICAgICAgIG91dC53cml0ZUVsZW1lbnQoImNvbmZpZ0V4Y2x1ZGVkIiwgX2NvbmZpZ0V4Y2x1ZGVkKTsNCi0gICAgICAgIG91dC53cml0ZUVsZW1lbnQoInRhZ0hhbmRsZXIiLCBfdGFnSGFuZGxlcik7DQotICAgICAgICBvdXQud3JpdGVFbGVtZW50KCJnZW5lcmF0ZWRDb21wb25lbnRDbGFzcyIsIF9nZW5lcmF0ZWRDb21wb25lbnRDbGFzcyk7DQotICAgICAgICBvdXQud3JpdGVFbGVtZW50KCJldmFsdWF0ZUVMT25FeGVjdXRpb24iLCBfZXZhbHVhdGVFTE9uRXhlY3V0aW9uKTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogQWRkIGRpZ2VzdGVyIHJ1bGVzIHRvIHJlcG9wdWxhdGUgYW4gaW5zdGFuY2Ugb2YgdGhpcyB0eXBlIGZyb20gYW4geG1sDQotICAgICAqIGZpbGUuDQotICAgICAqLw0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgYWRkWG1sUnVsZXMoRGlnZXN0ZXIgZGlnZXN0ZXIsIFN0cmluZyBwcmVmaXgpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBuZXdQcmVmaXggPSBwcmVmaXggKyAiL2JlaGF2aW9yIjsNCi0NCi0gICAgICAgIGRpZ2VzdGVyLmFkZE9iamVjdENyZWF0ZShuZXdQcmVmaXgsIEJlaGF2aW9yTWV0YS5jbGFzcyk7DQotICAgICAgICBkaWdlc3Rlci5hZGRTZXROZXh0KG5ld1ByZWZpeCwgImFkZEJlaGF2aW9yIik7DQotDQotICAgICAgICBWaWV3RW50aXR5TWV0YS5hZGRYbWxSdWxlcyhkaWdlc3RlciwgbmV3UHJlZml4KTsNCi0NCi0gICAgICAgIGRpZ2VzdGVyLmFkZEJlYW5Qcm9wZXJ0eVNldHRlcihuZXdQcmVmaXggKyAiL2JlaGF2aW9ySWQiKTsNCi0gICAgICAgIGRpZ2VzdGVyLmFkZEJlYW5Qcm9wZXJ0eVNldHRlcihuZXdQcmVmaXggKyAiL2JvZHlDb250ZW50Iik7DQotICAgICAgICBkaWdlc3Rlci5hZGRCZWFuUHJvcGVydHlTZXR0ZXIobmV3UHJlZml4ICsgIi9jb25maWdFeGNsdWRlZCIpOw0KLSAgICAgICAgZGlnZXN0ZXIuYWRkQmVhblByb3BlcnR5U2V0dGVyKG5ld1ByZWZpeCArICIvdGFnSGFuZGxlciIpOw0KLSAgICAgICAgZGlnZXN0ZXIuYWRkQmVhblByb3BlcnR5U2V0dGVyKG5ld1ByZWZpeCArICIvZ2VuZXJhdGVkQ29tcG9uZW50Q2xhc3MiKTsNCi0gICAgICAgIGRpZ2VzdGVyLmFkZEJlYW5Qcm9wZXJ0eVNldHRlcihuZXdQcmVmaXggKyAiL2V2YWx1YXRlRUxPbkV4ZWN1dGlvbiIpOw0KLSAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgQmVoYXZpb3JNZXRhKCkNCi0gICAgew0KLSAgICAgICAgc3VwZXIoImJlaGF2aW9yIik7DQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyBCZWhhdmlvck1ldGEoU3RyaW5nIG5hbWUpDQotICAgIHsNCi0gICAgICAgIHN1cGVyKG5hbWUpOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBNZXJnZSB0aGUgZGF0YSBpbiB0aGUgc3BlY2lmaWVkIG90aGVyIHByb3BlcnR5IGludG8gdGhpcyBvbmUsIHRocm93aW5nIGFuDQotICAgICAqIGV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhbiBpbmNvbXBhdGliaWxpdHkuDQotICAgICAqIA0KLSAgICAgKiBOb3QgdXNlZCByaWdodCBub3cgc2luY2UgdGhlb3JpY2FsbHkgdGhlcmUgaXMgdmVyeSBmZXcgaW5oZXJpdGFuY2UNCi0gICAgICogb24gYmVoYXZpb3JzDQotICAgICAqIA0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgbWVyZ2UoQmVoYXZpb3JNZXRhIG90aGVyKQ0KLSAgICB7DQotICAgICAgICBzdXBlci5tZXJnZShvdGhlcik7DQotICAgICAgICBfYm9keUNvbnRlbnQgPSBNb2RlbFV0aWxzLm1lcmdlKHRoaXMuX2JvZHlDb250ZW50LCBvdGhlci5fYm9keUNvbnRlbnQpOw0KLQ0KLSAgICAgICAgYm9vbGVhbiBpbmhlcml0UGFyZW50VGFnID0gZmFsc2U7DQotICAgICAgICAvL2NoZWNrIGlmIHRoZSBwYXJlbnQgc2V0IGEgdGFnIGNsYXNzDQotDQotICAgICAgICBfdGFnSGFuZGxlciA9IE1vZGVsVXRpbHMubWVyZ2UodGhpcy5fdGFnSGFuZGxlciwgb3RoZXIuX3RhZ0hhbmRsZXIpOw0KLSAgICAgICAgX2V2YWx1YXRlRUxPbkV4ZWN1dGlvbiA9IE1vZGVsVXRpbHMubWVyZ2UodGhpcy5fZXZhbHVhdGVFTE9uRXhlY3V0aW9uLCBvdGhlci5fZXZhbHVhdGVFTE9uRXhlY3V0aW9uKTsNCi0NCi0gICAgICAgIF9iZWhhdmlvcklkID0gTW9kZWxVdGlscy5tZXJnZSh0aGlzLl9iZWhhdmlvcklkLCBvdGhlci5fYmVoYXZpb3JJZCk7DQotICAgICAgICANCi0gICAgICAgIC8vIFRPRE86IF9iZWhhdmlvckNsYXNzTU9kaWZpZXJzDQotICAgICAgICANCi0gICAgICAgIGlmIChpbmhlcml0UGFyZW50VGFnKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IHRoaXMucHJvcGVydGllcygpOyBpLmhhc05leHQoKTspDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBQcm9wZXJ0eU1ldGEgc3JjUHJvcCA9IChQcm9wZXJ0eU1ldGEpIGkubmV4dCgpOw0KLSAgICAgICAgICAgICAgICBQcm9wZXJ0eU1ldGEgcGFyZW50UHJvcCA9IG90aGVyLmdldFByb3BlcnR5KHNyY1Byb3AuZ2V0TmFtZSgpKTsNCi0gICAgICAgICAgICAgICAgaWYgKHBhcmVudFByb3AgIT0gbnVsbCkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgLy9UaGVyZSBhcmUgdGhyZWUgcG9zc2libGUgYmVoYXZpb3JzOg0KLSAgICAgICAgICAgICAgICAgICAgLy8xLiBUaGUgcHJvcGVydHkgaXMgZGVmaW5lZCBvbiB0aGUgY2hpbGQgYWdhaW4gYW5kDQotICAgICAgICAgICAgICAgICAgICAvLyAgIHRoZSBwcm9wZXJ0eSB3YXMgYWxyZWFkeSBvbiB0aGUgdGFnIGhpZXJhcmNoeSwgc28NCi0gICAgICAgICAgICAgICAgICAgIC8vICAgaW5oZXJpdGVkVGFnIG11c3QgYmUgc2V0IHRvIFRSVUUuDQotICAgICAgICAgICAgICAgICAgICAvLzIuIFRoZSBwcm9wZXJ0eSBpcyBkZWZpbmVkIG9uIHRoZSBjaGlsZCBhZ2FpbiBhbmQNCi0gICAgICAgICAgICAgICAgICAgIC8vICAgaXQgaXMgbmVjZXNzYXJ5IHRvIHdyaXRlIGFnYWluIG9uIHRoZSBnZW5lcmF0ZWQNCi0gICAgICAgICAgICAgICAgICAgIC8vICAgdGFnLCBzbyB0aGUgYW5ub3RhdGlvbiBsb29rcyBsaWtlDQotICAgICAgICAgICAgICAgICAgICAvLyAgICJASlNGUHJvcGVydHkgaW5oZXJpdGVkVGFnPWZhbHNlIg0KLSAgICAgICAgICAgICAgICAgICAgLy8gICBUaGlzIGNvbmRpdGlvbiBtdXN0IHJlbWFpbiBhcyBGQUxTRQ0KLSAgICAgICAgICAgICAgICAgICAgLy8zLiBUaGUgcHJvcGVydHkgaXMgc2V0IGJ5IHRoZSB1c2VyIGFzIHRydWUsIGJ1dCB0aGVyZQ0KLSAgICAgICAgICAgICAgICAgICAgLy8gICB3YXMgbm90IGRlZmluZWQgcHJldmlvdXNseSBvbiB0aGUgaGllcmFyY2h5LCBzbw0KLSAgICAgICAgICAgICAgICAgICAgLy8gICB0aGlzIGNvbmRpdGlvbiBtdXN0IGJlIGFzIGlzIChUUlVFKSANCi0gICAgICAgICAgICAgICAgICAgIC8vICAgKHNraXBwZWQgb24gcGFyZW50UHJvcCAhPSBudWxsKS4NCi0gICAgICAgICAgICAgICAgICAgIGlmIChzcmNQcm9wLmlzTG9jYWxJbmhlcml0ZWRUYWcoKSA9PSBudWxsIHx8DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY1Byb3AuaXNJbmhlcml0ZWRUYWcoKS5ib29sZWFuVmFsdWUoKSkNCi0gICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBzcmNQcm9wLnNldEluaGVyaXRlZFRhZyhCb29sZWFuLlRSVUUpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIF9wcm9wZXJ0eVRhZ0xpc3QgPSBudWxsOw0KLSAgICAgICAgfSAgICAgICAgDQotDQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIFNldHMgdGhlIGJlaGF2aW9yIGlkZW50aWZlciBmb3IgdGhpcyBjb21wb25lbnQuDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCBzZXRCZWhhdmlvcklkKFN0cmluZyBiZWhhdmlvcklkKQ0KLSAgICB7DQotICAgICAgICBfYmVoYXZpb3JJZCA9IGJlaGF2aW9ySWQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRCZWhhdmlvcklkKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIF9iZWhhdmlvcklkOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBBZGRzIGEgSmF2YSBMYW5ndWFnZSBjbGFzcyBtb2RpZmllciB0byB0aGUgYmVoYXZpb3IgY2xhc3MuDQotICAgICAqIDxwPg0KLSAgICAgKiBUT0RPOiB3aGF0IGlzIHRoaXMgZm9yPz8/Pw0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgYWRkQmVoYXZpb3JDbGFzc01vZGlmaWVyKGludCBtb2RpZmllcikNCi0gICAgew0KLSAgICAgICAgX2JlaGF2aW9yQ2xhc3NNb2RpZmllcnMgfD0gbW9kaWZpZXI7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIFJldHVybnMgdGhlIEphdmEgTGFuZ3VhZ2UgY2xhc3MgbW9kaWZpZXJzIGZvciB0aGUgYmVoYXZpb3IgY2xhc3MuIEJ5DQotICAgICAqIGRlZmF1bHQsIHRoZXNlIG1vZGlmaWVycyBpbmNsdWRlIE1vZGlmaWVyLlBVQkxJQy4NCi0gICAgICogDQotICAgICAqIEByZXR1cm4gdGhlIEphdmEgTGFuZ3VhZ2UgY2xhc3MgbW9kaWZpZXJzIGZvciB0aGUgYmVoYXZpb3IgY2xhc3MNCi0gICAgICovDQotICAgIHB1YmxpYyBpbnQgZ2V0QmVoYXZpb3JDbGFzc01vZGlmaWVycygpDQotICAgIHsNCi0gICAgICAgIGludCBtb2RpZmllcnMgPSBfYmVoYXZpb3JDbGFzc01vZGlmaWVyczsNCi0NCi0gICAgICAgIGlmICghTW9kaWZpZXIuaXNQcml2YXRlKG1vZGlmaWVycykgJiYgIU1vZGlmaWVyLmlzUHJvdGVjdGVkKG1vZGlmaWVycykNCi0gICAgICAgICAgICAgICAgJiYgIU1vZGlmaWVyLmlzUHVibGljKG1vZGlmaWVycykpDQotICAgICAgICB7DQotICAgICAgICAgICAgbW9kaWZpZXJzIHw9IE1vZGlmaWVyLlBVQkxJQzsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBtb2RpZmllcnM7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0Qm9keUNvbnRlbnQoU3RyaW5nIGJvZHlDb250ZW50KQ0KLSAgICB7DQotICAgICAgICB0aGlzLl9ib2R5Q29udGVudCA9IGJvZHlDb250ZW50Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Qm9keUNvbnRlbnQoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gX2JvZHlDb250ZW50Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldENvbmZpZ0V4Y2x1ZGVkKEJvb2xlYW4gY29uZmlnRXhjbHVkZWQpDQotICAgIHsNCi0gICAgICAgIF9jb25maWdFeGNsdWRlZCA9IGNvbmZpZ0V4Y2x1ZGVkOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBCb29sZWFuIGlzQ29uZmlnRXhjbHVkZWQoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gTW9kZWxVdGlscy5kZWZhdWx0T2YoX2NvbmZpZ0V4Y2x1ZGVkLGZhbHNlKTsNCi0gICAgfQ0KLSAgICANCi0gICAgcHVibGljIFN0cmluZyBnZXRCZWhhdmlvclR5cGUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLSAgICANCi0gICAgLyoqDQotICAgICAqIFNwZWNpZmllcyB0aGUgY2xhc3Mgb2YgdGhlIEZhY2VsZXRzIHRhZyBoYW5kbGVyIChjb21wb25lbnQgaGFuZGxlcikgZm9yDQotICAgICAqIHRoaXMgY29tcG9uZW50Lg0KLSAgICAgKiA8cD4NCi0gICAgICogTm90ZSB0aGF0IGEgRmFjZWxldHMgdGFnIGhhbmRsZXIgY2xhc3MgaXMgbm90IG5lZWRlZCBmb3IgbW9zdCBjb21wb25lbnRzLg0KLSAgICAgKiANCi0gICAgICogQHNpbmNlIDEuMC45DQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCBzZXRUYWdIYW5kbGVyKFN0cmluZyB0YWdIYW5kbGVyKQ0KLSAgICB7DQotICAgICAgICBfdGFnSGFuZGxlciA9IHRhZ0hhbmRsZXI7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIA0KLSAgICAgKiBAc2luY2UgMS4wLjkNCi0gICAgICovDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGFnSGFuZGxlcigpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBfdGFnSGFuZGxlcjsNCi0gICAgfQ0KLSAgICANCi0gICAgLyoqDQotICAgICAqIA0KLSAgICAgKiBAc2luY2UgMS4wLjkNCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHNldEV2YWx1YXRlRUxPbkV4ZWN1dGlvbihCb29sZWFuIGV2YWx1YXRlRUxPbkV4ZWN1dGlvbikNCi0gICAgew0KLSAgICAgICAgdGhpcy5fZXZhbHVhdGVFTE9uRXhlY3V0aW9uID0gZXZhbHVhdGVFTE9uRXhlY3V0aW9uOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiANCi0gICAgICogQHNpbmNlIDEuMC45DQotICAgICAqLw0KLSAgICBwdWJsaWMgQm9vbGVhbiBpc0V2YWx1YXRlRUxPbkV4ZWN1dGlvbigpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBNb2RlbFV0aWxzLmRlZmF1bHRPZihfZXZhbHVhdGVFTE9uRXhlY3V0aW9uLGZhbHNlKTsNCi0gICAgfQ0KLSAgICANCi0gICAgLyoqDQotICAgICAqIA0KLSAgICAgKiBAc2luY2UgMS4wLjkNCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHNldEdlbmVyYXRlZENvbXBvbmVudENsYXNzKEJvb2xlYW4gZ2VuZXJhdGVkQ29tcG9uZW50Q2xhc3MpDQotICAgIHsNCi0gICAgICAgIF9nZW5lcmF0ZWRDb21wb25lbnRDbGFzcyA9IGdlbmVyYXRlZENvbXBvbmVudENsYXNzOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiANCi0gICAgICogQHNpbmNlIDEuMC45DQotICAgICAqLw0KLSAgICBwdWJsaWMgQm9vbGVhbiBpc0dlbmVyYXRlZENvbXBvbmVudENsYXNzKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIE1vZGVsVXRpbHMuZGVmYXVsdE9mKF9nZW5lcmF0ZWRDb21wb25lbnRDbGFzcyxmYWxzZSk7DQotICAgIH0NCi0NCi0gICAgLy9USElTIE1FVEhPRFMgQVJFIFVTRUQgRk9SIFZFTE9DSVRZIFRPIEdFVCBEQVRBIEFORCBHRU5FUkFURSBDTEFTU0VTDQotICAgIA0KLSAgICBwcml2YXRlIExpc3QgX3Byb3BlcnR5VGFnTGlzdCA9IG51bGw7IA0KLSAgICANCi0gICAgcHVibGljIENvbGxlY3Rpb24gZ2V0UHJvcGVydHlUYWdMaXN0KCkNCi0gICAgew0KLSAgICAgICAgaWYgKF9wcm9wZXJ0eVRhZ0xpc3QgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBfcHJvcGVydHlUYWdMaXN0ID0gbmV3IEFycmF5TGlzdCgpOw0KLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXQgPSBnZXRQcm9wZXJ0eUxpc3QoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgUHJvcGVydHlNZXRhIHByb3AgPSAoUHJvcGVydHlNZXRhKSBpdC5uZXh0KCk7DQotICAgICAgICAgICAgICAgIGlmICghcHJvcC5pc1RhZ0V4Y2x1ZGVkKCkuYm9vbGVhblZhbHVlKCkgJiYNCi0gICAgICAgICAgICAgICAgICAgICAgICAhcHJvcC5pc0luaGVyaXRlZFRhZygpLmJvb2xlYW5WYWx1ZSgpKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBfcHJvcGVydHlUYWdMaXN0LmFkZChwcm9wKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICANCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBfcHJvcGVydHlUYWdMaXN0Ow0KLSAgICB9DQotDQotICAgIHByaXZhdGUgTGlzdCBfcHJvcGVydHlCZWhhdmlvckxpc3QgPSBudWxsOyANCi0NCi0gICAgcHVibGljIENvbGxlY3Rpb24gZ2V0UHJvcGVydHlCZWhhdmlvckxpc3QoKQ0KLSAgICB7DQotICAgICAgICBpZiAoX3Byb3BlcnR5QmVoYXZpb3JMaXN0ID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgX3Byb3BlcnR5QmVoYXZpb3JMaXN0ID0gbmV3IEFycmF5TGlzdCgpOw0KLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXQgPSBnZXRQcm9wZXJ0eUxpc3QoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgUHJvcGVydHlNZXRhIHByb3AgPSAoUHJvcGVydHlNZXRhKSBpdC5uZXh0KCk7DQotICAgICAgICAgICAgICAgIGlmICghcHJvcC5pc0luaGVyaXRlZCgpLmJvb2xlYW5WYWx1ZSgpICYmIHByb3AuaXNHZW5lcmF0ZWQoKS5ib29sZWFuVmFsdWUoKSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgX3Byb3BlcnR5QmVoYXZpb3JMaXN0LmFkZChwcm9wKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICANCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBfcHJvcGVydHlCZWhhdmlvckxpc3Q7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9tb2RlbC9DbGFzc01ldGEuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvbW9kZWwvQ2xhc3NNZXRhLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkNDJkYjYuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9tb2RlbC9DbGFzc01ldGEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxNiArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uYnVpbGRlci5tb2RlbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmRpZ2VzdGVyLkRpZ2VzdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nLlN0cmluZ1V0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uYnVpbGRlci5pby5YbWxXcml0ZXI7Ci0KLS8qKgotICogQmFzZSBjbGFzcyBmb3IgdmFyaW91cyBtZXRhZGF0YSAobW9kZWwpIGNsYXNzZXMuCi0gKiA8cD4KLSAqIFRoaXMgaG9sZHMgbWV0YWRhdGEgY29tbW9uIHRvIGFsbCBtb2RlbCBjbGFzc2VzIHRoYXQgcmVwcmVzZW50IGEgSlNGIGVudGl0eSwKLSAqIGVnIGEgY29tcG9uZW50LCBjb252ZXJ0ZXIsIHZhbGlkYXRvciwgcmVuZGVyZXIuIEluIGFsbCB0aGVzZSBjYXNlcywgdGhlIGNsYXNzIGhhcyBhCi0gKiB0eXBlLCBhIHBhcmVudCBhbmQgb3B0aW9uYWxseSBhIGxpc3Qgb2YgaW1wbGVtZW50ZWQgaW50ZXJmYWNlcy4KLSAqIDxwPgotICogSW5zdGFuY2VzIG9mIHRoaXMgdHlwZSBhcmUgaW50ZW5kZWQgcHJpbWFyaWx5IHRvIG1hcCB0byBlbnRyaWVzIGluIGdlbmVyYXRlZAotICogSlNQIFRMRCBmaWxlcywgZmFjZXMtY29uZmlnLnhtbCBmaWxlcyBhbmQgc2ltaWxhci4gVGhlICJjbGFzcyIgYXR0cmlidXRlIG9uCi0gKiB0aGlzIGNsYXNzIGNvbnRhaW5zIHRoZSBuYW1lIG9mIHRoZSBqYXZhIGNsYXNzIHRoYXQgaW1wbGVtZW50cyB0aGF0IGVudGl0eS4KLSAqIDxwPgotICogSG93ZXZlciB0aGVyZSBhcmUgYWxzbyBpbnN0YW5jZXMgb2YgdGhpcyBjbGFzcyB0aGF0IHJlcHJlc2VudCAiYWJzdHJhY3QiCi0gKiBlbnRpdGllcyB0aGF0IGFyZSBub3QgZGlyZWN0bHkgcmVmZXJlbmNlZCBieSBUTEQgb3IgZmFjZXMtY29uZmlnIGZpbGVzOyB0aGV5Ci0gKiBleGlzdCB0byByZXByZXNlbnQgYW5jZXN0b3IgY2xhc3NlcyBvZiB0aGUgY29uY3JldGUgZW50aXRpZXMuIAotICogPHA+Ci0gKiBUaGUgaW5zdGFuY2VzIGFyZSBjcmVhdGVkIHZpYSBhbm5vdGF0aW9ucyBvbiBKYXZhIGNsYXNzZXMuIFRoZXJlZm9yZSBlYWNoCi0gKiBDbGFzc01ldGEgaGFzIGEgInNvdXJjZUNsYXNzIiBwcm9wZXJ0eSB0aGF0IHJlY29yZHMgdGhlIG5hbWUgb2YgdGhlIGFubm90YXRlZAotICogY2xhc3MuIEluIHNpbXBsZSBjYXNlcywgImNsYXNzIiBhbmQgInNvdXJjZUNsYXNzIiBhcmUgdGhlIHNhbWUsIGllIHRoZSBKU0YgZW50aXR5Ci0gKiA8aT5pczwvaT4gdGhlIGNsYXNzIHRoYXQgaG9sZHMgdGhlIHJlbGV2YW50IGFubm90YXRpb25zLiBCdXQgdGhpcyBpcyBub3QgdHJ1ZSBpbgotICogdGhlIGNhc2Ugb2YgImNvZGUgZ2VuZXJhdGlvbiI7IGhlcmUgdGhlIGNsYXNzIHByb3BlcnR5IHJlZmVyZW5jZXMgdGhlIGFjdHVhbCBKU0YKLSAqIGVudGl0eSAodGhlIGdlbmVyYXRlZCBjbGFzcykuCi0gKiA8cD4KLSAqIEFzIGRlc2NyaWJlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgdGhlIHBhcmVudCBhdHRyaWJ1dGUsIHRoZSBDbGFzc01ldGEgb2JqZWN0cwotICogZGVzY3JpYmUgYSBqYXZhIGluaGVyaXRhbmNlIHRyZWUsIGJ1dCBpdCBpcyBub3QgcXVpdGUgdGhlIHNhbWUgYXMgdGhlIHJlYWwgamF2YQotICogaW5oZXJpdGFuY2UgaGllcmFyY2h5IGZvciB0aGUgYW5ub3RhdGVkIGphdmEgY2xhc3Nlcy4gVGhlIENsYXNzTWV0YSBkYXRhIG9taXRzCi0gKiBhbnkgY2xhc3NlcyBpbiB0aGUgaGllcmFyY2h5IHRoYXQgYXJlIG5vdCBhbm5vdGF0ZWQsIGFzIHRoZXkgYXJlIG5vdCByZWxldmFudAotICogZm9yIHRoZSBwdXJwb3NlcyBvZiBtZXRhZGF0YSBpbmhlcml0YW5jZS4KLSAqLwotcHVibGljIGNsYXNzIENsYXNzTWV0YQotewotICAgIHByaXZhdGUgU3RyaW5nIF94bWxFbGVtZW50TmFtZTsKLQotICAgIHByaXZhdGUgU3RyaW5nIF9jbGFzc05hbWU7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgX3BhcmVudENsYXNzTmFtZTsKLSAgICAKLSAgICBwcml2YXRlIExpc3QgX2ludGVyZmFjZUNsYXNzTmFtZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgX21vZGVsSWQ7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgX3NvdXJjZUNsYXNzTmFtZTsKLSAgICBwcml2YXRlIFN0cmluZyBfc291cmNlQ2xhc3NQYXJlbnRDbGFzc05hbWU7Ci0KLSAgICAvKioKLSAgICAgKiBBZGQgZGlnZXN0ZXIgcnVsZXMgdG8gcmVwb3B1bGF0ZSBhbiBpbnN0YW5jZSBvZiB0aGlzIHR5cGUgZnJvbSBhbiB4bWwKLSAgICAgKiBmaWxlLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhZGRYbWxSdWxlcyhEaWdlc3RlciBkaWdlc3RlciwgU3RyaW5nIHByZWZpeCkKLSAgICB7Ci0gICAgICAgIGRpZ2VzdGVyLmFkZEJlYW5Qcm9wZXJ0eVNldHRlcihwcmVmaXggKyAiL21vZGVsSWQiKTsKLSAgICAgICAgZGlnZXN0ZXIuYWRkQmVhblByb3BlcnR5U2V0dGVyKHByZWZpeCArICIvY2xhc3NOYW1lIik7Ci0gICAgICAgIGRpZ2VzdGVyLmFkZEJlYW5Qcm9wZXJ0eVNldHRlcihwcmVmaXggKyAiL3BhcmVudENsYXNzTmFtZSIpOwotICAgICAgICBkaWdlc3Rlci5hZGRCZWFuUHJvcGVydHlTZXR0ZXIocHJlZml4ICsgIi9zb3VyY2VDbGFzc05hbWUiKTsKLSAgICAgICAgZGlnZXN0ZXIuYWRkQmVhblByb3BlcnR5U2V0dGVyKHByZWZpeCArICIvc291cmNlQ2xhc3NQYXJlbnRDbGFzc05hbWUiKTsKLSAgICAgICAgZGlnZXN0ZXIuYWRkQ2FsbE1ldGhvZChwcmVmaXggKyAiL2ludGVyZmFjZXMvaW50ZXJmYWNlIiwKLSAgICAgICAgICAgICAgICAiYWRkSW50ZXJmYWNlQ2xhc3NOYW1lIiwgMSk7Ci0gICAgICAgIGRpZ2VzdGVyLmFkZENhbGxQYXJhbShwcmVmaXggKyAiL2ludGVyZmFjZXMvaW50ZXJmYWNlIiwgMCwgIm5hbWUiKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3Rvci4KLSAgICAgKiAKLSAgICAgKiBQYXJhbSB4bWxFbGVtZW50TmFtZSBpcyB0aGUgbmFtZSBvZiB0aGUgeG1sIGVsZW1lbnQgdGhhdCBpcyBjcmVhdGVkCi0gICAgICogd2hlbiBtZXRob2Qgd3JpdGVYbWwgaXMgaW52b2tlZC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQ2xhc3NNZXRhKFN0cmluZyB4bWxFbGVtZW50TmFtZSkKLSAgICB7Ci0gICAgICAgIF94bWxFbGVtZW50TmFtZSA9IHhtbEVsZW1lbnROYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFdyaXRlIHRoZSBwcm9wZXJ0aWVzIG9mIHRoaXMgaW5zdGFuY2Ugb3V0IGFzIHhtbC4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgbmFtZSBvZiB0aGUgeG1sIGVsZW1lbnQgdGhhdCBpcyBjcmVhdGVkIHRvIGhvbGQgdGhlIHByb3BlcnRpZXMKLSAgICAgKiB3YXMgc3BlY2lmaWVkIHdoZW4gdGhlIGNvbnN0cnVjdG9yIHdhcyBjYWxsZWQuCi0gICAgICogPHA+Ci0gICAgICogU3ViY2xhc3NlcyB0aGF0IHdhbnQgdG8gb3V0cHV0IHRoZWlyIG93biBwcm9wZXJ0aWVzIHNob3VsZCBub3QKLSAgICAgKiBvdmVycmlkZSB0aGlzIG1ldGhvZC4gSW5zdGVhZCwgdGhleSBzaG91bGQgb3ZlcnJpZGUgd3JpdGVYbWxTaW1wbGUKLSAgICAgKiAoYW5kIGluIHJhcmUgY2FzZXMgd3JpdGVYbWxDb21wbGV4KS4KLSAgICAgKiA8cD4KLSAgICAgKiBIYXZpbmcgdHdvIHdyaXRlIG1ldGhvZHMgKHdyaXRlWG1sU2ltcGxlL3dyaXRlWG1sQ29tcGxleCkgZ2l2ZXMgc29tZSBiYXNpYwotICAgICAqIGNvbnRyb2wgb3ZlciB0aGUgb3JkZXIgaW4gd2hpY2ggZGF0YSBpcyB3cml0dGVuIHRvIHhtbCwgaW4gb3JkZXIgdG8gbWFrZQotICAgICAqIHRoZSBnZW5lcmF0ZWQgeG1sIGxvb2sgbmljZS4gQW55IHByb3BlcnRpZXMgd3JpdHRlbiBpbiB3cml0ZVhtbFNpbXBsZSB3aWxsCi0gICAgICogYXBwZWFyIGluIHRoZSBvdXRwdXQgZmlsZSBiZWZvcmUgcHJvcGVydGllcyB3cml0dGVuIGJ5IHdyaXRlWG1sQ29tcGxleC4gCi0gICAgICogVGhlcmVmb3JlLCBwcm9wZXJ0aWVzIHdoaWNoIGFyZSAiZWFzaWx5IHJlYWQiIHNob3VsZCBiZSB3cml0dGVuIG91dCBpbgotICAgICAqIGEgd3JpdGVYbWxTaW1wbGUgbWV0aG9kLiBEYXRhIHdoaWNoIGhhcyBsYXJnZSBDREFUQSBibG9ja3MsIG9yIGNvbXBsaWNhdGVkCi0gICAgICogbmVzdGVkIHN0cnVjdHVyZSBzaG91bGQgYmUgd3JpdHRlbiBvdXQgaW4gYSB3cml0ZVhtbENvbXBsZXggbWV0aG9kIHNvIHRoYXQKLSAgICAgKiB0aGUgInNpbXBsZSIgc3R1ZmYgY2FuIGJlIGVhc2lseSByZWFkIGFuZCBpcyBub3QgYnVyaWVkIGluIHRoZSBtaWRkbGUgb2YKLSAgICAgKiB0aGUgaGFyZGVyLXRvLXJlYWQgb3V0cHV0LgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHdyaXRlWG1sKFhtbFdyaXRlciBvdXQpCi0gICAgewotICAgICAgICBvdXQuYmVnaW5FbGVtZW50KF94bWxFbGVtZW50TmFtZSk7Ci0gICAgICAgIHdyaXRlWG1sU2ltcGxlKG91dCk7Ci0gICAgICAgIHdyaXRlWG1sQ29tcGxleChvdXQpOwotICAgICAgICBvdXQuZW5kRWxlbWVudChfeG1sRWxlbWVudE5hbWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFdyaXRlIHRoaXMgbW9kZWwgb3V0IGFzIHhtbC4KLSAgICAgKiA8cD4KLSAgICAgKiBTdWJjbGFzc2VzIHRoYXQgd2lzaCB0byB3cml0ZSBvdXQgcHJvcGVydGllcyBhcyB4bWwgc2hvdWxkIG92ZXJyaWRlCi0gICAgICogdGhpcyBtZXRob2QsIGNhbGwgdGhlIHN1cGVyIGltcGxlbWVudGF0aW9uLCB0aGVuIGNhbGwgbWV0aG9kcyBvbiB0aGUKLSAgICAgKiBYbWxXcml0ZXIgb2JqZWN0IHRvIG91dHB1dCB0aGVpciBkYXRhLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHdyaXRlWG1sU2ltcGxlKFhtbFdyaXRlciBvdXQpCi0gICAgewotICAgICAgICBvdXQud3JpdGVFbGVtZW50KCJtb2RlbElkIiwgX21vZGVsSWQpOwotICAgICAgICBvdXQud3JpdGVFbGVtZW50KCJjbGFzc05hbWUiLCBfY2xhc3NOYW1lKTsKLSAgICAgICAgb3V0LndyaXRlRWxlbWVudCgicGFyZW50Q2xhc3NOYW1lIiwgX3BhcmVudENsYXNzTmFtZSk7Ci0gICAgICAgIG91dC53cml0ZUVsZW1lbnQoInNvdXJjZUNsYXNzTmFtZSIsIF9zb3VyY2VDbGFzc05hbWUpOwotICAgICAgICBvdXQud3JpdGVFbGVtZW50KCJzb3VyY2VDbGFzc1BhcmVudENsYXNzTmFtZSIsIF9zb3VyY2VDbGFzc1BhcmVudENsYXNzTmFtZSk7Ci0KLSAgICAgICAgLy8gSW50ZXJmYWNlIGRhdGEgaXMgYSBsaXR0bGUgY29tcGxleCwgYW5kIGNvdWxkIHBvc3NpYmx5IGJlIHBsYWNlZCBpbiB0aGUKLSAgICAgICAgLy8gd3JpdGVYbWxDb21wbGV4IG1ldGhvZC4gQnV0IGV4Y2VwdCBmb3IgdmVyeSBjb21wbGljYXRlZCBpbmhlcml0YW5jZQotICAgICAgICAvLyBoaWVyYXJjaGllcyBpcyBpcyBzdGlsbCBvbmx5IGdvaW5nIHRvIGJlIGEgZmV3IGxpbmVzIGFuZCBpdCBsb2dpY2FsbHkKLSAgICAgICAgLy8gYmVsb25ncyB3aXRoIHRoZSBjbGFzc05hbWUvcGFyZW50Q2xhc3NOYW1lL2V0YyBkYXRhLiBTbyBpdCBpcyB3cml0dGVuIGhlcmUKLSAgICAgICAgLy8gYWxvbmcgd2l0aCB0aGUgb3RoZXIgInNpbXBsZSIgZGF0YS4KLSAgICAgICAgaWYgKCFfaW50ZXJmYWNlQ2xhc3NOYW1lcy5pc0VtcHR5KCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG91dC5iZWdpbkVsZW1lbnQoImludGVyZmFjZXMiKTsKLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IF9pbnRlcmZhY2VDbGFzc05hbWVzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IChTdHJpbmcpIGkubmV4dCgpOwotICAgICAgICAgICAgICAgIG91dC5iZWdpbkVsZW1lbnQoImludGVyZmFjZSIpOwotICAgICAgICAgICAgICAgIG91dC53cml0ZUF0dHIoIm5hbWUiLCBuYW1lKTsKLSAgICAgICAgICAgICAgICBvdXQuZW5kRWxlbWVudCgiaW50ZXJmYWNlIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBvdXQuZW5kRWxlbWVudCgiaW50ZXJmYWNlcyIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2VlIGRvY3VtZW50YXRpb24gZm9yIHdyaXRlWG1sIGFuZCB3cml0ZVhtbFNpbXBsZSBtZXRob2RzLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHdyaXRlWG1sQ29tcGxleChYbWxXcml0ZXIgb3V0KQotICAgIHsKLSAgICAgICAgLy8gbm8gY29tcGxleCBkYXRhIHRvIHdyaXRlIGZvciB0aGlzIGNsYXNzLgotICAgIH0KLQotICAgIC8qKgotICAgICAqIE1lcmdlIGFueSBpbmhlcml0YWJsZSBkYXRhIGZyb20gdGhlIHNwZWNpZmllZCAib3RoZXIiIGluc3RhbmNlIGludG8KLSAgICAgKiB0aGUgbWV0YWRhdGEgaGVsZCBieSB0aGlzIGluc3RhbmNlLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIG1lcmdlKENsYXNzTWV0YSBvdGhlcikKLSAgICB7Ci0gICAgICAgIC8vIFRoZXJlIGlzIG5vdGhpbmcgdG8gbWVyZ2UgYmV0d2VlbiB0d28gQ2xhc3NNZXRhIG9iamVjdHM7Ci0gICAgICAgIC8vIG5vbmUgb2YgdGhlIHByb3BlcnRpZXMgb24gdGhpcyBjbGFzcyBhcmUgaW5oZXJpdGFibGUuCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW5kaWNhdGVzIHdoaWNoICJncm91cCIgb2YgbWV0YWRhdGEgdGhpcyBjbGFzcyBiZWxvbmdzIHRvLgotICAgICAqIDxwPgotICAgICAqIFByb2plY3RzIGNhbiBpbmhlcml0IG1ldGFkYXRhIGZyb20gb3RoZXIgcHJvamVjdHMsIGluIHdoaWNoIGNhc2UKLSAgICAgKiBhbGwgdGhlIENsYXNzTWV0YSBvYmplY3RzIGVuZCB1cCBpbiBvbmUgYmlnIGNvbGxlY3Rpb24uIEJ1dCBmb3IKLSAgICAgKiBzb21lIHB1cnBvc2VzIGl0IGlzIG5lY2Vzc2FyeSB0byBpdGVyYXRlIG92ZXIgdGhlIG9iamVjdHMgYmVsb25naW5nCi0gICAgICogdG8gb25seSBvbmUgcHJvamVjdCAoZWcgd2hlbiBnZW5lcmF0aW5nIGNvbXBvbmVudHMpLiBUaGlzIHJldHVybgotICAgICAqIHZhbHVlIGNhbiBiZSB0ZXN0ZWQgdG8gY2hlY2sgd2hpY2ggImdyb3VwIiAocHJvamVjdCkgYSBwYXJ0aWN1bGFyCi0gICAgICogaW5zdGFuY2UgYmVsb25ncyB0by4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldE1vZGVsSWQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9tb2RlbElkOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE1vZGVsSWQoU3RyaW5nIG1vZGVsSWQpCi0gICAgewotICAgICAgICB0aGlzLl9tb2RlbElkID0gbW9kZWxJZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZnVsbHktcXVhbGlmaWVkIG5hbWUgb2YgdGhlIEpTRiBlbnRpdHkgY2xhc3MsIGllIHRoZSBjbGFzcyB0aGF0IGFjdHVhbGx5Ci0gICAgICogaW1wbGVtZW50cyBhIENvbXBvbmVudCwgQ29udmVydGVyLCBWYWxpZGF0b3IsIFJlbmRlcmVyLCBldGMuCi0gICAgICogPHA+Ci0gICAgICogVGhlIHNwZWNpZmllZCBjbGFzcyBtYXkgYmUgYSBoYW5kLXdyaXR0ZW4gb25lLCBvciBvbmUgY3JlYXRlZCB2aWEgY29kZSBnZW5lcmF0aW9uLiAKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldENsYXNzTmFtZSgpCi0gICAgewotICAgICAgICByZXR1cm4gX2NsYXNzTmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRDbGFzc05hbWUoU3RyaW5nIGNsYXNzTmFtZSkKLSAgICB7Ci0gICAgICAgIF9jbGFzc05hbWUgPSBjbGFzc05hbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVXRpbGl0eSBtZXRob2QgdG8gcmV0dXJuIGp1c3QgdGhlIHBhY2thZ2VuYW1lIHBhcnQgb2YgdGhlIGNsYXNzTmFtZQotICAgICAqIGF0dHJpYnV0ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFBhY2thZ2VOYW1lKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBTdHJpbmdVdGlscy5zdWJzdHJpbmcoZ2V0Q2xhc3NOYW1lKCksIDAsIFN0cmluZ1V0aWxzLmxhc3RJbmRleE9mKGdldENsYXNzTmFtZSgpLCAnLicpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgbmVhcmVzdCByZWxldmFudCAoYW5ub3RhdGVkKSBhbmNlc3RvciBjbGFzcyBvZiB0aGUgY2xhc3MgdGhhdCB0aGlzIG1ldGFkYXRhIHdhcwotICAgICAqIGV4dHJhY3RlZCBmcm9tLgotICAgICAqIDxwPgotICAgICAqIEZvciBleGFtcGxlLCB3aGVuIGEgY2xhc3MgaXMgbWFya2VkIGFzIGEgQ29tcG9uZW50IGNsYXNzLCB0aGVuIHRoaXMgd2lsbAotICAgICAqIHJlZmVyIHRvIHRoZSBuZWFyZXN0IGFuY2VzdG9yIGNsYXNzIHRoYXQgaXMgYWxzbyBtYXJrZWQgYXMgYSBDb21wb25lbnQKLSAgICAgKiBjbGFzcy4gTm90ZSB0aGF0IHRoaXMgaXMgImNvbnNpc3RlbnQgd2l0aCIgdGhlIGFjdHVhbCBKYXZhIGNsYXNzIGhpZXJhcmNoeSBmb3IgCi0gICAgICogYW5ub3RhdGVkIGNsYXNzZXMgdGhhdCB3ZXJlIHVzZWQgdG8gY3JlYXRlIHRoaXMgZGF0YSwgYnV0IHNraXBzIGphdmEgY2xhc3NlcwotICAgICAqIHRoYXQgd2VyZSBub3QgYW5ub3RhdGVkIChhbmQgYXJlIHRoZXJlZm9yZSBpcnJlbGV2YW50IGZvciBtZXRhZGF0YSBwdXJwb3NlcykuCi0gICAgICogPHA+Ci0gICAgICogVGhlIHZhbHVlIG9mIHRoaXMgYXR0cmlidXRlIHdpbGwgbWF0Y2ggdGhlIGNsYXNzTmFtZSBhdHRyaWJ1dGUgb2YgYW5vdGhlciBDbGFzc01ldGEKLSAgICAgKiBvYmplY3QuIEZvbGxvd2luZyB0aGUgY2hhaW4gb2YgUGFyZW50Q2xhc3NOYW1lIGxpbmtzIChwbHVzIEludGVyZmFjZSBsaW5rcykgZ2l2ZXMgYWxsCi0gICAgICogdGhlIENsYXNzTWV0YSBvYmplY3RzIG5lZWRlZCB0byBkZXRlcm1pbmUgdGhlIHNldCBvZiBtZXRhZGF0YSBwcm9wZXJ0aWVzIGZvciBhIEpTRgotICAgICAqIGVudGl0eS4gICAgCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRQYXJlbnRDbGFzc05hbWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9wYXJlbnRDbGFzc05hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UGFyZW50Q2xhc3NOYW1lKFN0cmluZyBjbGFzc05hbWUpCi0gICAgewotICAgICAgICBfcGFyZW50Q2xhc3NOYW1lID0gY2xhc3NOYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoZSBsaXN0IG9mIHJlbGV2YW50IGludGVyZmFjZSBjbGFzc2VzLgotICAgICAqIDxwPgotICAgICAqIEZvciBleGFtcGxlLCB3aGVuIGEgY2xhc3MgaXMgbWFya2VkIGFzIGEgQ29tcG9uZW50IGNsYXNzLCB0aGVuIHRoaXMgd2lsbAotICAgICAqIHJlZmVyIHRvIHRoZSBsaXN0IG9mIGludGVyZmFjZXMgd2hpY2ggdGhhdCBjbGFzcyBpbXBsZW1lbnRzIHRoYXQgYXJlIGFsc28KLSAgICAgKiBtYXJrZWQgYXMgYSBjb21wb25lbnQuCi0gICAgICovCi0gICAgcHVibGljIExpc3QgZ2V0SW50ZXJmYWNlQ2xhc3NOYW1lcygpCi0gICAgewotICAgICAgICByZXR1cm4gX2ludGVyZmFjZUNsYXNzTmFtZXM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0SW50ZXJmYWNlQ2xhc3NOYW1lcyhMaXN0IGNsYXNzTmFtZXMpCi0gICAgewotICAgICAgICBfaW50ZXJmYWNlQ2xhc3NOYW1lcyA9IGNsYXNzTmFtZXM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkSW50ZXJmYWNlQ2xhc3NOYW1lKFN0cmluZyBuYW1lKQotICAgIHsKLSAgICAgICAgX2ludGVyZmFjZUNsYXNzTmFtZXMuYWRkKG5hbWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybiB0aGUgY2xhc3NOYW1lIG9mIHRoZSByZWFsIGphdmEgY2xhc3MgZnJvbSB3aGljaCB0aGlzIG1ldGFkYXRhIHdhcyBnYXRoZXJlZC4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIGlzIG1vc3RseSB1c2VkIGZvciBkb2N1bWVudGF0aW9uLiBIb3dldmVyIHdoZW4gZ2VuZXJhdGluZyBjb2RlIGluICJ0ZW1wbGF0ZSBtb2RlIiwKLSAgICAgKiB0aGlzIGlzIHVzZWQgdG8gbG9jYXRlIHRoZSBvcmlnaW5hbCBjbGFzcyBpbiBvcmRlciB0byBmaW5kIHRoZSBzb3VyY2UgY29kZSB0byBjb3B5LgotICAgICAqIEl0IGlzIGFsc28gdXNlZCBmb3Igc29tZSByZWFzb24gaW4gTWFrZUNvbXBvbmVudHNNb2pvIHdoZW4gZGV0ZXJtaW5pbmcgd2hldGhlciB0bwotICAgICAqIGdlbmVyYXRlIGEgY2xhc3Mgb3Igbm90IC0gdGhpcyBpcyBwcm9iYWJseSB3cm9uZy4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFNvdXJjZUNsYXNzTmFtZSgpCi0gICAgewotICAgICAgICByZXR1cm4gX3NvdXJjZUNsYXNzTmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRTb3VyY2VDbGFzc05hbWUoU3RyaW5nIHNvdXJjZUNsYXNzTmFtZSkKLSAgICB7Ci0gICAgICAgIHRoaXMuX3NvdXJjZUNsYXNzTmFtZSA9IHNvdXJjZUNsYXNzTmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIHJlYWwgamF2YSBwYXJlbnQgY2xhc3Mgb2YgdGhlIGNsYXNzIGZyb20gd2hpY2ggdGhpcyBtZXRhZGF0YQotICAgICAqIHdhcyBnYXRoZXJlZCAoc2VlIGNsYXNzU291cmNlIHByb3BlcnR5KS4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIHZhbHVlIGlzIHVzdWFsbHkgdGhlIHNhbWUgYXMgcHJvcGVydHkgcGFyZW50Q2xhc3NOYW1lLiBIb3dldmVyIGlmCi0gICAgICogdGhlIHBhcmVudCBvZiB0aGUgYW5ub3RhdGVkIGNsYXNzIGlzIG5vdCBpdHNlbGYgYW5ub3RhdGVkLCB0aGVuIHRoaXMKLSAgICAgKiBwcm9wZXJ0eSBzdGlsbCBwb2ludHMgdG8gdGhlIHJlYWwgamF2YSBwYXJlbnQgKHdoaWNoIHdpbGwgbm90IGhhdmUgYQotICAgICAqIENsYXNzTWV0YSBvYmplY3QgcmVwcmVzZW50aW5nIGl0KSB3aGlsZSBwcm9wZXJ0eSBwYXJlbnRDbGFzcyB3aWxsIHBvaW50Ci0gICAgICogdG8gdGhlIG5lYXJlc3Qgc3VwZXJjbGFzcyB0aGF0IGRvZXMgaGF2ZSBhbiBhbm5vdGF0aW9uIChhbmQgZG9lcyBoYXZlIGEKLSAgICAgKiBjb3JyZXNwb25kaW5nIENsYXNzTWV0YSBvYmplY3QpLgotICAgICAqIDxwPgotICAgICAqIFRoaXMgaW5mb3JtYXRpb24gaXMgbmVlZGVkIGZvciBjb2RlIGdlbmVyYXRpb24uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0U291cmNlQ2xhc3NQYXJlbnRDbGFzc05hbWUoU3RyaW5nIHNvdXJjZUNsYXNzUGFyZW50Q2xhc3NOYW1lKQotICAgIHsKLSAgICAgICAgdGhpcy5fc291cmNlQ2xhc3NQYXJlbnRDbGFzc05hbWUgPSBzb3VyY2VDbGFzc1BhcmVudENsYXNzTmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFNvdXJjZUNsYXNzUGFyZW50Q2xhc3NOYW1lKCkKLSAgICB7Ci0gICAgICAgIGlmIChfc291cmNlQ2xhc3NQYXJlbnRDbGFzc05hbWUgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgLy9yZXR1cm4gdGhlIHBhcmVudCBjbGFzcyBuYW1lIGluc3RlYWQuCi0gICAgICAgICAgICByZXR1cm4gZ2V0UGFyZW50Q2xhc3NOYW1lKCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gX3NvdXJjZUNsYXNzUGFyZW50Q2xhc3NOYW1lOyAgICAgICAgICAgIAotICAgICAgICB9ICAgICAgICAKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL21vZGVsL0NsaWVudEJlaGF2aW9yTWV0YS5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9tb2RlbC9DbGllbnRCZWhhdmlvck1ldGEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODFlNGJlZi4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL21vZGVsL0NsaWVudEJlaGF2aW9yTWV0YS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotLyoNCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqIA0KLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKiANCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmJ1aWxkZXIubW9kZWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5kaWdlc3Rlci5EaWdlc3RlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5idWlsZGVyLmlvLlhtbFdyaXRlcjsNCi0NCi0vKioNCi0gKiBAc2luY2UgMS4wLjkNCi0gKi8NCi1wdWJsaWMgY2xhc3MgQ2xpZW50QmVoYXZpb3JNZXRhIGV4dGVuZHMgQmVoYXZpb3JNZXRhDQotew0KLSAgICBwcml2YXRlIFN0cmluZyBfcmVuZGVyZXJUeXBlOw0KLQ0KLQ0KLSAgICAvKioNCi0gICAgICogV3JpdGUgYW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBvdXQgYXMgeG1sLg0KLSAgICAgKi8NCi0gICAgcHJvdGVjdGVkIHZvaWQgd3JpdGVYbWxTaW1wbGUoWG1sV3JpdGVyIG91dCkNCi0gICAgew0KLSAgICAgICAgc3VwZXIud3JpdGVYbWxTaW1wbGUob3V0KTsNCi0gICAgICAgIG91dC53cml0ZUVsZW1lbnQoInJlbmRlcmVyVHlwZSIsIF9yZW5kZXJlclR5cGUpOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBBZGQgZGlnZXN0ZXIgcnVsZXMgdG8gcmVwb3B1bGF0ZSBhbiBpbnN0YW5jZSBvZiB0aGlzIHR5cGUgZnJvbSBhbiB4bWwNCi0gICAgICogZmlsZS4NCi0gICAgICovDQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhZGRYbWxSdWxlcyhEaWdlc3RlciBkaWdlc3RlciwgU3RyaW5nIHByZWZpeCkNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIG5ld1ByZWZpeCA9IHByZWZpeCArICIvY2xpZW50QmVoYXZpb3IiOw0KLQ0KLSAgICAgICAgZGlnZXN0ZXIuYWRkT2JqZWN0Q3JlYXRlKG5ld1ByZWZpeCwgQ2xpZW50QmVoYXZpb3JNZXRhLmNsYXNzKTsNCi0gICAgICAgIGRpZ2VzdGVyLmFkZFNldE5leHQobmV3UHJlZml4LCAiYWRkQmVoYXZpb3IiKTsNCi0NCi0gICAgICAgIFZpZXdFbnRpdHlNZXRhLmFkZFhtbFJ1bGVzKGRpZ2VzdGVyLCBuZXdQcmVmaXgpOw0KLQ0KLSAgICAgICAgZGlnZXN0ZXIuYWRkQmVhblByb3BlcnR5U2V0dGVyKG5ld1ByZWZpeCArICIvYmVoYXZpb3JJZCIpOw0KLSAgICAgICAgZGlnZXN0ZXIuYWRkQmVhblByb3BlcnR5U2V0dGVyKG5ld1ByZWZpeCArICIvYm9keUNvbnRlbnQiKTsNCi0gICAgICAgIGRpZ2VzdGVyLmFkZEJlYW5Qcm9wZXJ0eVNldHRlcihuZXdQcmVmaXggKyAiL2NvbmZpZ0V4Y2x1ZGVkIik7DQotICAgICAgICBkaWdlc3Rlci5hZGRCZWFuUHJvcGVydHlTZXR0ZXIobmV3UHJlZml4ICsgIi90YWdIYW5kbGVyIik7DQotICAgICAgICBkaWdlc3Rlci5hZGRCZWFuUHJvcGVydHlTZXR0ZXIobmV3UHJlZml4ICsgIi9nZW5lcmF0ZWRDb21wb25lbnRDbGFzcyIpOw0KLSAgICAgICAgZGlnZXN0ZXIuYWRkQmVhblByb3BlcnR5U2V0dGVyKG5ld1ByZWZpeCArICIvZXZhbHVhdGVFTE9uRXhlY3V0aW9uIik7DQotICAgICAgICBkaWdlc3Rlci5hZGRCZWFuUHJvcGVydHlTZXR0ZXIobmV3UHJlZml4ICsgIi9yZW5kZXJlclR5cGUiKTsNCi0gICAgfQ0KLSAgICANCi0gICAgcHVibGljIENsaWVudEJlaGF2aW9yTWV0YSgpDQotICAgIHsNCi0gICAgICAgIHN1cGVyKCJjbGllbnRCZWhhdmlvciIpOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBNZXJnZSB0aGUgZGF0YSBpbiB0aGUgc3BlY2lmaWVkIG90aGVyIHByb3BlcnR5IGludG8gdGhpcyBvbmUsIHRocm93aW5nIGFuDQotICAgICAqIGV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhbiBpbmNvbXBhdGliaWxpdHkuDQotICAgICAqIA0KLSAgICAgKiBOb3QgdXNlZCByaWdodCBub3cgc2luY2UgdGhlb3JpY2FsbHkgdGhlcmUgaXMgdmVyeSBmZXcgaW5oZXJpdGFuY2UNCi0gICAgICogb24gYmVoYXZpb3JzDQotICAgICAqIA0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgbWVyZ2UoQ2xpZW50QmVoYXZpb3JNZXRhIG90aGVyKQ0KLSAgICB7DQotICAgICAgICBzdXBlci5tZXJnZShvdGhlcik7DQotICAgICAgICBfcmVuZGVyZXJUeXBlID0gTW9kZWxVdGlscy5tZXJnZSh0aGlzLl9yZW5kZXJlclR5cGUsIG90aGVyLl9yZW5kZXJlclR5cGUpOw0KLSAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEJlaGF2aW9yVHlwZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAiY2xpZW50QmVoYXZpb3IiOw0KLSAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgdm9pZCBzZXRSZW5kZXJlclR5cGUoU3RyaW5nIHJlbmRlcmVyVHlwZSkNCi0gICAgew0KLSAgICAgICAgX3JlbmRlcmVyVHlwZSA9IHJlbmRlcmVyVHlwZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFJlbmRlcmVyVHlwZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBfcmVuZGVyZXJUeXBlOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvbW9kZWwvQ2xpZW50QmVoYXZpb3JSZW5kZXJlck1ldGEuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvbW9kZWwvQ2xpZW50QmVoYXZpb3JSZW5kZXJlck1ldGEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjdkN2JmNS4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL21vZGVsL0NsaWVudEJlaGF2aW9yUmVuZGVyZXJNZXRhLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotLyoNCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqIA0KLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKiANCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmJ1aWxkZXIubW9kZWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5kaWdlc3Rlci5EaWdlc3RlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5idWlsZGVyLmlvLlhtbFdyaXRlcjsNCi0NCi0NCi0vKioNCi0gKiBTdG9yZSBtZXRhZGF0YSBhYm91dCBhIGNsYXNzIHRoYXQgaXMgZWl0aGVyIGEgSlNGIFJlbmRlcmVyLCBvciBzb21lIGJhc2UNCi0gKiBjbGFzcyBvciBpbnRlcmZhY2UgdGhhdCBhIFJlbmRlcmVyIGNhbiBiZSBkZXJpdmVkIGZyb20uDQotICovDQotcHVibGljIGNsYXNzIENsaWVudEJlaGF2aW9yUmVuZGVyZXJNZXRhIGV4dGVuZHMgQ2xhc3NNZXRhDQotew0KLSAgICBwcml2YXRlIFN0cmluZyBfZGVzY3JpcHRpb247DQotICAgIHByaXZhdGUgU3RyaW5nIF9yZW5kZXJlclR5cGU7DQotDQotICAgIC8qKg0KLSAgICAgKiBXcml0ZSBhbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIG91dCBhcyB4bWwuDQotICAgICAqLw0KLSAgICBwcm90ZWN0ZWQgdm9pZCB3cml0ZVhtbFNpbXBsZShYbWxXcml0ZXIgb3V0KQ0KLSAgICB7DQotICAgICAgICBzdXBlci53cml0ZVhtbFNpbXBsZShvdXQpOw0KLSAgICAgICAgDQotICAgICAgICBvdXQud3JpdGVFbGVtZW50KCJyZW5kZXJlclR5cGUiLCBfcmVuZGVyZXJUeXBlKTsNCi0gICAgICAgIG91dC53cml0ZUVsZW1lbnQoImRlc2NyaXB0aW9uIiwgX2Rlc2NyaXB0aW9uKTsNCi0gICAgfQ0KLSAgICANCi0gICAgLyoqDQotICAgICAqIEFkZCBkaWdlc3RlciBydWxlcyB0byByZXBvcHVsYXRlIGFuIGluc3RhbmNlIG9mIHRoaXMgdHlwZSBmcm9tIGFuIHhtbA0KLSAgICAgKiBmaWxlLg0KLSAgICAgKi8NCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGFkZFhtbFJ1bGVzKERpZ2VzdGVyIGRpZ2VzdGVyLCBTdHJpbmcgcHJlZml4KQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgbmV3UHJlZml4ID0gcHJlZml4ICsgIi9jbGllbnRCZWhhdmlvclJlbmRlcmVyIjsNCi0NCi0gICAgICAgIGRpZ2VzdGVyLmFkZE9iamVjdENyZWF0ZShuZXdQcmVmaXgsIENsaWVudEJlaGF2aW9yUmVuZGVyZXJNZXRhLmNsYXNzKTsNCi0gICAgICAgIGRpZ2VzdGVyLmFkZFNldE5leHQobmV3UHJlZml4LCAiYWRkQ2xpZW50QmVoYXZpb3JSZW5kZXJlciIpOw0KLQ0KLSAgICAgICAgQ2xhc3NNZXRhLmFkZFhtbFJ1bGVzKGRpZ2VzdGVyLCBuZXdQcmVmaXgpOw0KLQ0KLSAgICAgICAgZGlnZXN0ZXIuYWRkQmVhblByb3BlcnR5U2V0dGVyKG5ld1ByZWZpeCArICIvY29tcG9uZW50RmFtaWx5Iik7DQotICAgICAgICBkaWdlc3Rlci5hZGRCZWFuUHJvcGVydHlTZXR0ZXIobmV3UHJlZml4ICsgIi9yZW5kZXJlclR5cGUiKTsNCi0gICAgICAgIGRpZ2VzdGVyLmFkZEJlYW5Qcm9wZXJ0eVNldHRlcihuZXdQcmVmaXggKyAiL2Rlc2NyaXB0aW9uIik7DQotICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBDcmVhdGVzIGEgbmV3IFJlbmRlcmVyQmVhbi4NCi0gICAgICovDQotICAgIHB1YmxpYyBDbGllbnRCZWhhdmlvclJlbmRlcmVyTWV0YSgpDQotICAgIHsNCi0gICAgICAgIHN1cGVyKCJjbGllbnRCZWhhdmlvclJlbmRlcmVyIik7DQotICAgIH0gICAgDQotDQotICAgIC8qKg0KLSAgICAgKiBTZXRzIHRoZSByZW5kZXJlciB0eXBlIGZvciB0aGlzIGNvbXBvbmVudC4NCi0gICAgICogDQotICAgICAqIEBwYXJhbSByZW5kZXJlclR5cGUNCi0gICAgICogICAgICAgICAgICB0aGUgcmVuZGVyZXIgdHlwZQ0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgc2V0UmVuZGVyZXJUeXBlKFN0cmluZyByZW5kZXJlclR5cGUpDQotICAgIHsNCi0gICAgICAgIF9yZW5kZXJlclR5cGUgPSByZW5kZXJlclR5cGU7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIFJldHVybnMgdGhlIHJlbmRlcmVyIHR5cGUgZm9yIHRoaXMgY29tcG9uZW50Lg0KLSAgICAgKiANCi0gICAgICogQHJldHVybiB0aGUgcmVuZGVyZXIgdHlwZQ0KLSAgICAgKi8NCi0gICAgcHVibGljIFN0cmluZyBnZXRSZW5kZXJlclR5cGUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gX3JlbmRlcmVyVHlwZTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogU2V0cyB0aGUgZGVzY3JpcHRpb24gb2YgdGhpcyBhdHRyaWJ1dGUuDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gZGVzY3JpcHRpb24NCi0gICAgICogICAgICAgICAgICB0aGUgYXR0cmlidXRlIGRlc2NyaXB0aW9uDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgZGVzY3JpcHRpb24pDQotICAgIHsNCi0gICAgICAgIF9kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBSZXR1cm5zIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGlzIGF0dHJpYnV0ZS4NCi0gICAgICogDQotICAgICAqIEByZXR1cm4gdGhlIGF0dHJpYnV0ZSBkZXNjcmlwdGlvbg0KLSAgICAgKi8NCi0gICAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBfZGVzY3JpcHRpb247DQotICAgIH0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9tb2RlbC9Db21wb25lbnRNZXRhLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL21vZGVsL0NvbXBvbmVudE1ldGEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTM4ODVmOS4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL21vZGVsL0NvbXBvbmVudE1ldGEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5MiArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uYnVpbGRlci5tb2RlbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuZGlnZXN0ZXIuRGlnZXN0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmcuU3RyaW5nVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5idWlsZGVyLmlvLlhtbFdyaXRlcjsKLQotLyoqCi0gKiBTdG9yZSBtZXRhZGF0YSBhYm91dCBhIEpTRiBVSUNvbXBvbmVudCwgb3Igc29tZSBiYXNlCi0gKiBjbGFzcyBvciBpbnRlcmZhY2UgdGhhdCBhIFVJQ29tcG9uZW50IGNhbiBiZSBkZXJpdmVkIGZyb20uCi0gKi8KLXB1YmxpYyBjbGFzcyBDb21wb25lbnRNZXRhIGV4dGVuZHMgVmlld0VudGl0eU1ldGEgaW1wbGVtZW50cyAKLSAgICBQcm9wZXJ0eUhvbGRlciwgRmFjZXRIb2xkZXIsIExpc3RlbmVySG9sZGVyCi17Ci0gICAgcHJpdmF0ZSBTdHJpbmcgX2JvZHlDb250ZW50OwotCi0gICAgcHJpdmF0ZSBTdHJpbmcgX3R5cGU7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgX2ZhbWlseTsKLSAgICBwcml2YXRlIFN0cmluZyBfcmVuZGVyZXJUeXBlOwotCi0gICAgcHJpdmF0ZSBTdHJpbmcgX3RhZ0NsYXNzOwotICAgIHByaXZhdGUgU3RyaW5nIF90YWdIYW5kbGVyOwotICAgIHByaXZhdGUgU3RyaW5nIF90YWdTdXBlcmNsYXNzOwotICAgIHByaXZhdGUgQm9vbGVhbiBfbmFtaW5nQ29udGFpbmVyOwotICAgIHByaXZhdGUgQm9vbGVhbiBfY2hpbGRyZW47Ci0gICAgcHJpdmF0ZSBCb29sZWFuIF9jb25maWdFeGNsdWRlZDsKLSAgICBwcml2YXRlIFN0cmluZyBfc2VyaWFsdWlkOwotICAgIHByaXZhdGUgU3RyaW5nIF9pbXBsZW1lbnRzOwotICAgIHByaXZhdGUgU3RyaW5nIF9kZWZhdWx0RXZlbnROYW1lOwotICAgIHByaXZhdGUgQm9vbGVhbiBfb3ZlcnJpZGVEZWZhdWx0RXZlbnROYW1lOwotICAgIHByaXZhdGUgQm9vbGVhbiBfY2xpZW50QmVoYXZpb3JIb2xkZXI7Ci0gICAgcHJpdmF0ZSBCb29sZWFuIF9jb21wb3NpdGU7Ci0gICAgCi0gICAgcHJpdmF0ZSBTdHJpbmcgX2NjTGlicmFyeU5hbWU7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgX2NjUmVzb3VyY2VOYW1lOwotICAgIAotICAgIHByaXZhdGUgQm9vbGVhbiBfZ2VuZXJhdGVkQ29tcG9uZW50Q2xhc3M7Ci0gICAgcHJpdmF0ZSBCb29sZWFuIF9nZW5lcmF0ZWRUYWdDbGFzczsKLSAgICAKLSAgICBwcml2YXRlIEJvb2xlYW4gX3RlbXBsYXRlOwotICAgIAotICAgIHByb3RlY3RlZCBNYXAgX2ZhY2V0czsKLSAgICBwcm90ZWN0ZWQgTWFwIF9saXN0ZW5lcnM7Ci0gICAgcHJvdGVjdGVkIExpc3QgX2ltcGxlbWVudGVkSW50ZXJmYWNlQ2xhc3NOYW1lczsKLQotICAgIC8qKgotICAgICAqIFdyaXRlIGFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3Mgb3V0IGFzIHhtbC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCB3cml0ZVhtbFNpbXBsZShYbWxXcml0ZXIgb3V0KQotICAgIHsKLSAgICAgICAgc3VwZXIud3JpdGVYbWxTaW1wbGUob3V0KTsKLQotICAgICAgICBvdXQud3JpdGVFbGVtZW50KCJ0eXBlIiwgX3R5cGUpOwotICAgICAgICBvdXQud3JpdGVFbGVtZW50KCJib2R5Q29udGVudCIsIF9ib2R5Q29udGVudCk7Ci0gICAgICAgIG91dC53cml0ZUVsZW1lbnQoImZhbWlseSIsIF9mYW1pbHkpOwotICAgICAgICBvdXQud3JpdGVFbGVtZW50KCJ0YWdDbGFzcyIsIF90YWdDbGFzcyk7Ci0gICAgICAgIG91dC53cml0ZUVsZW1lbnQoInRhZ1N1cGVyY2xhc3MiLCBfdGFnU3VwZXJjbGFzcyk7Ci0gICAgICAgIG91dC53cml0ZUVsZW1lbnQoInRhZ0hhbmRsZXIiLCBfdGFnSGFuZGxlcik7Ci0gICAgICAgIG91dC53cml0ZUVsZW1lbnQoInJlbmRlcmVyVHlwZSIsIF9yZW5kZXJlclR5cGUpOwotICAgICAgICBvdXQud3JpdGVFbGVtZW50KCJjb25maWdFeGNsdWRlZCIsIF9jb25maWdFeGNsdWRlZCk7Ci0gICAgICAgIG91dC53cml0ZUVsZW1lbnQoImRlZmF1bHRFdmVudE5hbWUiLCBfZGVmYXVsdEV2ZW50TmFtZSk7Ci0gICAgICAgIG91dC53cml0ZUVsZW1lbnQoIm92ZXJyaWRlRGVmYXVsdEV2ZW50TmFtZSIsIF9vdmVycmlkZURlZmF1bHRFdmVudE5hbWUpOwotICAgICAgICBvdXQud3JpdGVFbGVtZW50KCJzZXJpYWx1aWQiLCBfc2VyaWFsdWlkKTsKLSAgICAgICAgb3V0LndyaXRlRWxlbWVudCgiaW1wbGVtZW50cyIsIF9pbXBsZW1lbnRzKTsKLSAgICAgICAgb3V0LndyaXRlRWxlbWVudCgiZ2VuZXJhdGVkQ29tcG9uZW50Q2xhc3MiLCBfZ2VuZXJhdGVkQ29tcG9uZW50Q2xhc3MpOwotICAgICAgICBvdXQud3JpdGVFbGVtZW50KCJnZW5lcmF0ZWRUYWdDbGFzcyIsIF9nZW5lcmF0ZWRUYWdDbGFzcyk7Ci0gICAgICAgIG91dC53cml0ZUVsZW1lbnQoInRlbXBsYXRlIiwgX3RlbXBsYXRlKTsKLSAgICAgICAgb3V0LndyaXRlRWxlbWVudCgiY2xpZW50QmVoYXZpb3JIb2xkZXIiLCBfY2xpZW50QmVoYXZpb3JIb2xkZXIpOwotICAgICAgICBvdXQud3JpdGVFbGVtZW50KCJjb21wb3NpdGUiLCBfY29tcG9zaXRlKTsKLSAgICAgICAgb3V0LndyaXRlRWxlbWVudCgiY2NMaWJyYXJ5TmFtZSIsIF9jY0xpYnJhcnlOYW1lKTsKLSAgICAgICAgb3V0LndyaXRlRWxlbWVudCgiY2NSZXNvdXJjZU5hbWUiLCBfY2NSZXNvdXJjZU5hbWUpOwotICAgICAgICAKLSAgICAgICAgZm9yIChJdGVyYXRvciBpID0gX2ZhY2V0cy52YWx1ZXMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgICAgIHsKLSAgICAgICAgICAgIEZhY2V0TWV0YSBmYWNldCA9IChGYWNldE1ldGEpIGkubmV4dCgpOwotICAgICAgICAgICAgRmFjZXRNZXRhLndyaXRlWG1sKG91dCwgZmFjZXQpOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IF9saXN0ZW5lcnMudmFsdWVzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgICAgICB7Ci0gICAgICAgICAgICBMaXN0ZW5lck1ldGEgbGlzdGVuZXIgPSAoTGlzdGVuZXJNZXRhKSBpLm5leHQoKTsKLSAgICAgICAgICAgIExpc3RlbmVyTWV0YS53cml0ZVhtbChvdXQsIGxpc3RlbmVyKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYgKCFfaW1wbGVtZW50ZWRJbnRlcmZhY2VDbGFzc05hbWVzLmlzRW1wdHkoKSkKLSAgICAgICAgewotICAgICAgICAgICAgb3V0LmJlZ2luRWxlbWVudCgiaW1wbGVtZW50ZWRJbnRlcmZhY2VzIik7Ci0gICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBfaW1wbGVtZW50ZWRJbnRlcmZhY2VDbGFzc05hbWVzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IChTdHJpbmcpIGkubmV4dCgpOwotICAgICAgICAgICAgICAgIG91dC5iZWdpbkVsZW1lbnQoImludGVyZmFjZSIpOwotICAgICAgICAgICAgICAgIG91dC53cml0ZUF0dHIoIm5hbWUiLCBuYW1lKTsKLSAgICAgICAgICAgICAgICBvdXQuZW5kRWxlbWVudCgiaW50ZXJmYWNlIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBvdXQuZW5kRWxlbWVudCgiaW1wbGVtZW50ZWRJbnRlcmZhY2VzIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGQgZGlnZXN0ZXIgcnVsZXMgdG8gcmVwb3B1bGF0ZSBhbiBpbnN0YW5jZSBvZiB0aGlzIHR5cGUgZnJvbSBhbiB4bWwKLSAgICAgKiBmaWxlLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhZGRYbWxSdWxlcyhEaWdlc3RlciBkaWdlc3RlciwgU3RyaW5nIHByZWZpeCkKLSAgICB7Ci0gICAgICAgIFN0cmluZyBuZXdQcmVmaXggPSBwcmVmaXggKyAiL2NvbXBvbmVudCI7Ci0KLSAgICAgICAgZGlnZXN0ZXIuYWRkT2JqZWN0Q3JlYXRlKG5ld1ByZWZpeCwgQ29tcG9uZW50TWV0YS5jbGFzcyk7Ci0gICAgICAgIGRpZ2VzdGVyLmFkZFNldE5leHQobmV3UHJlZml4LCAiYWRkQ29tcG9uZW50Iik7Ci0KLSAgICAgICAgVmlld0VudGl0eU1ldGEuYWRkWG1sUnVsZXMoZGlnZXN0ZXIsIG5ld1ByZWZpeCk7Ci0KLSAgICAgICAgZGlnZXN0ZXIuYWRkQmVhblByb3BlcnR5U2V0dGVyKG5ld1ByZWZpeCArICIvdHlwZSIpOwotICAgICAgICBkaWdlc3Rlci5hZGRCZWFuUHJvcGVydHlTZXR0ZXIobmV3UHJlZml4ICsgIi9ib2R5Q29udGVudCIpOwotICAgICAgICBkaWdlc3Rlci5hZGRCZWFuUHJvcGVydHlTZXR0ZXIobmV3UHJlZml4ICsgIi9mYW1pbHkiKTsKLSAgICAgICAgZGlnZXN0ZXIuYWRkQmVhblByb3BlcnR5U2V0dGVyKG5ld1ByZWZpeCArICIvdGFnQ2xhc3MiKTsKLSAgICAgICAgZGlnZXN0ZXIuYWRkQmVhblByb3BlcnR5U2V0dGVyKG5ld1ByZWZpeCArICIvdGFnU3VwZXJjbGFzcyIpOwotICAgICAgICBkaWdlc3Rlci5hZGRCZWFuUHJvcGVydHlTZXR0ZXIobmV3UHJlZml4ICsgIi90YWdIYW5kbGVyIik7Ci0gICAgICAgIGRpZ2VzdGVyLmFkZEJlYW5Qcm9wZXJ0eVNldHRlcihuZXdQcmVmaXggKyAiL3JlbmRlcmVyVHlwZSIpOwotICAgICAgICBkaWdlc3Rlci5hZGRCZWFuUHJvcGVydHlTZXR0ZXIobmV3UHJlZml4ICsgIi9kZWZhdWx0RXZlbnROYW1lIik7Ci0gICAgICAgIGRpZ2VzdGVyLmFkZEJlYW5Qcm9wZXJ0eVNldHRlcihuZXdQcmVmaXggKyAiL292ZXJyaWRlRGVmYXVsdEV2ZW50TmFtZSIpOwotICAgICAgICBkaWdlc3Rlci5hZGRCZWFuUHJvcGVydHlTZXR0ZXIobmV3UHJlZml4ICsgIi9mYWNlbGV0UmVuZGVyZXJUeXBlIik7Ci0gICAgICAgIGRpZ2VzdGVyLmFkZEJlYW5Qcm9wZXJ0eVNldHRlcihuZXdQcmVmaXggKyAiL2NvbmZpZ0V4Y2x1ZGVkIik7Ci0gICAgICAgIGRpZ2VzdGVyLmFkZEJlYW5Qcm9wZXJ0eVNldHRlcihuZXdQcmVmaXggKyAiL3NlcmlhbHVpZCIpOwotICAgICAgICBkaWdlc3Rlci5hZGRCZWFuUHJvcGVydHlTZXR0ZXIobmV3UHJlZml4ICsgIi9pbXBsZW1lbnRzIik7Ci0gICAgICAgIGRpZ2VzdGVyLmFkZEJlYW5Qcm9wZXJ0eVNldHRlcihuZXdQcmVmaXggKyAiL2dlbmVyYXRlZENvbXBvbmVudENsYXNzIik7Ci0gICAgICAgIGRpZ2VzdGVyLmFkZEJlYW5Qcm9wZXJ0eVNldHRlcihuZXdQcmVmaXggKyAiL2dlbmVyYXRlZFRhZ0NsYXNzIik7Ci0gICAgICAgIGRpZ2VzdGVyLmFkZEJlYW5Qcm9wZXJ0eVNldHRlcihuZXdQcmVmaXggKyAiL3RlbXBsYXRlIik7Ci0gICAgICAgIGRpZ2VzdGVyLmFkZEJlYW5Qcm9wZXJ0eVNldHRlcihuZXdQcmVmaXggKyAiL2NsaWVudEJlaGF2aW9ySG9sZGVyIik7Ci0gICAgICAgIGRpZ2VzdGVyLmFkZEJlYW5Qcm9wZXJ0eVNldHRlcihuZXdQcmVmaXggKyAiL2NvbXBvc2l0ZSIpOwotICAgICAgICBkaWdlc3Rlci5hZGRCZWFuUHJvcGVydHlTZXR0ZXIobmV3UHJlZml4ICsgIi9jY0xpYnJhcnlOYW1lIik7Ci0gICAgICAgIGRpZ2VzdGVyLmFkZEJlYW5Qcm9wZXJ0eVNldHRlcihuZXdQcmVmaXggKyAiL2NjUmVzb3VyY2VOYW1lIik7Ci0KLSAgICAgICAgRmFjZXRNZXRhLmFkZFhtbFJ1bGVzKGRpZ2VzdGVyLCBuZXdQcmVmaXgpOwotICAgICAgICBMaXN0ZW5lck1ldGEuYWRkWG1sUnVsZXMoZGlnZXN0ZXIsIG5ld1ByZWZpeCk7Ci0gICAgICAgIAotICAgICAgICBkaWdlc3Rlci5hZGRDYWxsTWV0aG9kKG5ld1ByZWZpeCArICIvaW1wbGVtZW50ZWRJbnRlcmZhY2VzL2ludGVyZmFjZSIsCi0gICAgICAgICAgICAgICAgImFkZEltcGxlbWVudGVkSW50ZXJmYWNlQ2xhc3NOYW1lIiwgMSk7Ci0gICAgICAgIGRpZ2VzdGVyLmFkZENhbGxQYXJhbShuZXdQcmVmaXggKyAiL2ltcGxlbWVudGVkSW50ZXJmYWNlcy9pbnRlcmZhY2UiLCAwLCAibmFtZSIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yLgotICAgICAqLwotICAgIHB1YmxpYyBDb21wb25lbnRNZXRhKCkKLSAgICB7Ci0gICAgICAgIHN1cGVyKCJjb21wb25lbnQiKTsKLSAgICAgICAgX2ZhY2V0cyA9IG5ldyBMaW5rZWRIYXNoTWFwKCk7Ci0gICAgICAgIF9saXN0ZW5lcnMgPSBuZXcgTGlua2VkSGFzaE1hcCgpOwotICAgICAgICBfaW1wbGVtZW50ZWRJbnRlcmZhY2VDbGFzc05hbWVzID0gbmV3IEFycmF5TGlzdCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE1lcmdlIHRoZSBkYXRhIGluIHRoZSBzcGVjaWZpZWQgb3RoZXIgcHJvcGVydHkgaW50byB0aGlzIG9uZSwgdGhyb3dpbmcgYW4KLSAgICAgKiBleGNlcHRpb24gaWYgdGhlcmUgaXMgYW4gaW5jb21wYXRpYmlsaXR5LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIG1lcmdlKENvbXBvbmVudE1ldGEgb3RoZXIpCi0gICAgewotICAgICAgICBfYm9keUNvbnRlbnQgPSBNb2RlbFV0aWxzLm1lcmdlKHRoaXMuX2JvZHlDb250ZW50LCBvdGhlci5fYm9keUNvbnRlbnQpOwotCi0gICAgICAgIF90eXBlID0gTW9kZWxVdGlscy5tZXJnZSh0aGlzLl90eXBlLCBvdGhlci5fdHlwZSk7Ci0gICAgICAgIF9mYW1pbHkgPSBNb2RlbFV0aWxzLm1lcmdlKHRoaXMuX2ZhbWlseSwgb3RoZXIuX2ZhbWlseSk7Ci0gICAgICAgIF9yZW5kZXJlclR5cGUgPSBNb2RlbFV0aWxzLm1lcmdlKHRoaXMuX3JlbmRlcmVyVHlwZSwKLSAgICAgICAgICAgICAgICBvdGhlci5fcmVuZGVyZXJUeXBlKTsKLSAgICAgICAgCi0gICAgICAgIGJvb2xlYW4gaW5oZXJpdFBhcmVudFRhZyA9IGZhbHNlOwotICAgICAgICAvL2NoZWNrIGlmIHRoZSBwYXJlbnQgc2V0IGEgdGFnIGNsYXNzCi0gICAgICAgIGlmIChvdGhlci5fdGFnQ2xhc3MgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgLy9UaGUgdGFnU3VwZXJjbGFzcyBpcyB0aGUgdGFnQ2xhc3Mgb2YgdGhlIHBhcmVudAotICAgICAgICAgICAgX3RhZ1N1cGVyY2xhc3MgPSBNb2RlbFV0aWxzLm1lcmdlKHRoaXMuX3RhZ1N1cGVyY2xhc3MsCi0gICAgICAgICAgICAgICAgICAgIG90aGVyLl90YWdDbGFzcyk7Ci0gICAgICAgICAgICBpbmhlcml0UGFyZW50VGFnID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vVGhlIHRhZ1N1cGVyY2xhc3MgaXMgdGhlIHRhZ1N1cGVyY2xhc3Mgb2YgdGhlIHBhcmVudAotICAgICAgICAgICAgX3RhZ1N1cGVyY2xhc3MgPSBNb2RlbFV0aWxzLm1lcmdlKHRoaXMuX3RhZ1N1cGVyY2xhc3MsCi0gICAgICAgICAgICAgICAgICAgIG90aGVyLl90YWdTdXBlcmNsYXNzKTsgICAgICAgICAgICAKLSAgICAgICAgfQotICAgICAgICAvL190YWdDbGFzcyA9IE1vZGVsVXRpbHMubWVyZ2UodGhpcy5fdGFnQ2xhc3MsIG90aGVyLl90YWdDbGFzcyk7Ci0gICAgICAgIF90YWdIYW5kbGVyID0gTW9kZWxVdGlscy5tZXJnZSh0aGlzLl90YWdIYW5kbGVyLCBvdGhlci5fdGFnSGFuZGxlcik7Ci0gICAgICAgIF9kZWZhdWx0RXZlbnROYW1lID0gTW9kZWxVdGlscy5tZXJnZSh0aGlzLl9kZWZhdWx0RXZlbnROYW1lLCBvdGhlci5fZGVmYXVsdEV2ZW50TmFtZSk7Ci0gICAgICAgIF9jbGllbnRCZWhhdmlvckhvbGRlciA9IE1vZGVsVXRpbHMubWVyZ2UodGhpcy5fY2xpZW50QmVoYXZpb3JIb2xkZXIsIG90aGVyLl9jbGllbnRCZWhhdmlvckhvbGRlcik7Ci0gICAgICAgIF9jb21wb3NpdGUgPSBNb2RlbFV0aWxzLm1lcmdlKHRoaXMuX2NvbXBvc2l0ZSwgb3RoZXIuX2NvbXBvc2l0ZSk7Ci0gICAgICAgIF9uYW1pbmdDb250YWluZXIgPSBNb2RlbFV0aWxzLm1lcmdlKHRoaXMuX25hbWluZ0NvbnRhaW5lciwKLSAgICAgICAgICAgICAgICBvdGhlci5fbmFtaW5nQ29udGFpbmVyKTsKLSAgICAgICAgX2NoaWxkcmVuID0gTW9kZWxVdGlscy5tZXJnZSh0aGlzLl9jaGlsZHJlbiwgb3RoZXIuX2NoaWxkcmVuKTsKLQotICAgICAgICBNb2RlbFV0aWxzLm1lcmdlUHJvcHModGhpcywgb3RoZXIpOwotICAgICAgICBNb2RlbFV0aWxzLm1lcmdlRmFjZXRzKHRoaXMsIG90aGVyKTsKLSAgICAgICAgTW9kZWxVdGlscy5tZXJnZUxpc3RlbmVycyh0aGlzLCBvdGhlcik7Ci0gICAgICAgIAotICAgICAgICBpZiAoIW90aGVyLl9pbXBsZW1lbnRlZEludGVyZmFjZUNsYXNzTmFtZXMuaXNFbXB0eSgpKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLl9pbXBsZW1lbnRlZEludGVyZmFjZUNsYXNzTmFtZXMuYWRkQWxsKG90aGVyLl9pbXBsZW1lbnRlZEludGVyZmFjZUNsYXNzTmFtZXMpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZiAoaW5oZXJpdFBhcmVudFRhZykKLSAgICAgICAgewotICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpID0gdGhpcy5wcm9wZXJ0aWVzKCk7IGkuaGFzTmV4dCgpOykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBQcm9wZXJ0eU1ldGEgc3JjUHJvcCA9IChQcm9wZXJ0eU1ldGEpIGkubmV4dCgpOwotICAgICAgICAgICAgICAgIFByb3BlcnR5TWV0YSBwYXJlbnRQcm9wID0gb3RoZXIuZ2V0UHJvcGVydHkoc3JjUHJvcC5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgIGlmIChwYXJlbnRQcm9wICE9IG51bGwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvL1RoZXJlIGFyZSB0aHJlZSBwb3NzaWJsZSBiZWhhdmlvcnM6Ci0gICAgICAgICAgICAgICAgICAgIC8vMS4gVGhlIHByb3BlcnR5IGlzIGRlZmluZWQgb24gdGhlIGNoaWxkIGFnYWluIGFuZAotICAgICAgICAgICAgICAgICAgICAvLyAgIHRoZSBwcm9wZXJ0eSB3YXMgYWxyZWFkeSBvbiB0aGUgdGFnIGhpZXJhcmNoeSwgc28KLSAgICAgICAgICAgICAgICAgICAgLy8gICBpbmhlcml0ZWRUYWcgbXVzdCBiZSBzZXQgdG8gVFJVRS4KLSAgICAgICAgICAgICAgICAgICAgLy8yLiBUaGUgcHJvcGVydHkgaXMgZGVmaW5lZCBvbiB0aGUgY2hpbGQgYWdhaW4gYW5kCi0gICAgICAgICAgICAgICAgICAgIC8vICAgaXQgaXMgbmVjZXNzYXJ5IHRvIHdyaXRlIGFnYWluIG9uIHRoZSBnZW5lcmF0ZWQKLSAgICAgICAgICAgICAgICAgICAgLy8gICB0YWcsIHNvIHRoZSBhbm5vdGF0aW9uIGxvb2tzIGxpa2UKLSAgICAgICAgICAgICAgICAgICAgLy8gICAiQEpTRlByb3BlcnR5IGluaGVyaXRlZFRhZz1mYWxzZSIKLSAgICAgICAgICAgICAgICAgICAgLy8gICBUaGlzIGNvbmRpdGlvbiBtdXN0IHJlbWFpbiBhcyBGQUxTRQotICAgICAgICAgICAgICAgICAgICAvLzMuIFRoZSBwcm9wZXJ0eSBpcyBzZXQgYnkgdGhlIHVzZXIgYXMgdHJ1ZSwgYnV0IHRoZXJlCi0gICAgICAgICAgICAgICAgICAgIC8vICAgd2FzIG5vdCBkZWZpbmVkIHByZXZpb3VzbHkgb24gdGhlIGhpZXJhcmNoeSwgc28KLSAgICAgICAgICAgICAgICAgICAgLy8gICB0aGlzIGNvbmRpdGlvbiBtdXN0IGJlIGFzIGlzIChUUlVFKSAKLSAgICAgICAgICAgICAgICAgICAgLy8gICAoc2tpcHBlZCBvbiBwYXJlbnRQcm9wICE9IG51bGwpLgotICAgICAgICAgICAgICAgICAgICBpZiAoc3JjUHJvcC5pc0xvY2FsSW5oZXJpdGVkVGFnKCkgPT0gbnVsbCB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY1Byb3AuaXNJbmhlcml0ZWRUYWcoKS5ib29sZWFuVmFsdWUoKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgc3JjUHJvcC5zZXRJbmhlcml0ZWRUYWcoQm9vbGVhbi5UUlVFKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIF9wcm9wZXJ0eVRhZ0xpc3QgPSBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Qm9keUNvbnRlbnQoU3RyaW5nIGJvZHlDb250ZW50KQotICAgIHsKLSAgICAgICAgdGhpcy5fYm9keUNvbnRlbnQgPSBib2R5Q29udGVudDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEJvZHlDb250ZW50KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfYm9keUNvbnRlbnQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgSlNGIGNvbXBvbmVudCB0eXBlIGZvciB0aGlzIGNvbXBvbmVudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRUeXBlKFN0cmluZyBjb21wb25lbnRUeXBlKQotICAgIHsKLSAgICAgICAgX3R5cGUgPSBjb21wb25lbnRUeXBlOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpCi0gICAgewotICAgICAgICByZXR1cm4gX3R5cGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgSlNGIGNvbXBvbmVudCBmYW1pbHkgZm9yIHRoaXMgY29tcG9uZW50LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEZhbWlseShTdHJpbmcgY29tcG9uZW50RmFtaWx5KQotICAgIHsKLSAgICAgICAgX2ZhbWlseSA9IGNvbXBvbmVudEZhbWlseTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEZhbWlseSgpCi0gICAgewotICAgICAgICByZXR1cm4gX2ZhbWlseTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSByZW5kZXJlciB0eXBlIGZvciB0aGlzIGNvbXBvbmVudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRSZW5kZXJlclR5cGUoU3RyaW5nIHJlbmRlcmVyVHlwZSkKLSAgICB7Ci0gICAgICAgIF9yZW5kZXJlclR5cGUgPSByZW5kZXJlclR5cGU7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRSZW5kZXJlclR5cGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9yZW5kZXJlclR5cGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgSlNQIHRhZyBoYW5kbGVyIGNsYXNzIGZvciB0aGlzIGNvbXBvbmVudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRUYWdDbGFzcyhTdHJpbmcgdGFnQ2xhc3MpCi0gICAgewotICAgICAgICBfdGFnQ2xhc3MgPSB0YWdDbGFzczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFRhZ0NsYXNzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfdGFnQ2xhc3M7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgSlNQIHRhZyBoYW5kbGVyIHN1cGVyY2xhc3MgZm9yIHRoaXMgY29tcG9uZW50LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFRhZ1N1cGVyY2xhc3MoU3RyaW5nIHRhZ1N1cGVyY2xhc3MpCi0gICAgewotICAgICAgICBfdGFnU3VwZXJjbGFzcyA9IHRhZ1N1cGVyY2xhc3M7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRUYWdTdXBlcmNsYXNzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfdGFnU3VwZXJjbGFzczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTcGVjaWZpZXMgdGhlIGNsYXNzIG9mIHRoZSBGYWNlbGV0cyB0YWcgaGFuZGxlciAoY29tcG9uZW50IGhhbmRsZXIpIGZvcgotICAgICAqIHRoaXMgY29tcG9uZW50LgotICAgICAqIDxwPgotICAgICAqIE5vdGUgdGhhdCBhIEZhY2VsZXRzIHRhZyBoYW5kbGVyIGNsYXNzIGlzIG5vdCBuZWVkZWQgZm9yIG1vc3QgY29tcG9uZW50cy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRUYWdIYW5kbGVyKFN0cmluZyB0YWdIYW5kbGVyKQotICAgIHsKLSAgICAgICAgX3RhZ0hhbmRsZXIgPSB0YWdIYW5kbGVyOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGFnSGFuZGxlcigpCi0gICAgewotICAgICAgICByZXR1cm4gX3RhZ0hhbmRsZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU3BlY2lmaWVzIHdoZXRoZXIgdGhpcyBjb21wb25lbnQgaXMgYSAibmFtaW5nIGNvbnRhaW5lciIsIGllIHdoZXRoZXIgaXQKLSAgICAgKiBhZGRzIGl0cyBvd24gY2xpZW50SWQgYXMgYSBwcmVmaXggb250byB0aGUgY2xpZW50SWQgb2YgaXRzIGNoaWxkCi0gICAgICogY29tcG9uZW50cy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXROYW1pbmdDb250YWluZXIoQm9vbGVhbiBuYW1pbmdDb250YWluZXIpCi0gICAgewotICAgICAgICBfbmFtaW5nQ29udGFpbmVyID0gbmFtaW5nQ29udGFpbmVyOwotICAgIH0KLQotICAgIHB1YmxpYyBCb29sZWFuIGdldE5hbWluZ0NvbnRhaW5lcigpCi0gICAgewotICAgICAgICByZXR1cm4gTW9kZWxVdGlscy5kZWZhdWx0T2YoX25hbWluZ0NvbnRhaW5lciwgZmFsc2UpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldENvbmZpZ0V4Y2x1ZGVkKEJvb2xlYW4gY29uZmlnRXhjbHVkZWQpCi0gICAgewotICAgICAgICBfY29uZmlnRXhjbHVkZWQgPSBjb25maWdFeGNsdWRlZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQm9vbGVhbiBpc0NvbmZpZ0V4Y2x1ZGVkKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBNb2RlbFV0aWxzLmRlZmF1bHRPZihfY29uZmlnRXhjbHVkZWQsZmFsc2UpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXRTZXJpYWx1aWQoU3RyaW5nIHNlcmlhbHVpZCkKLSAgICB7Ci0gICAgICAgIF9zZXJpYWx1aWQgPSBzZXJpYWx1aWQ7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRTZXJpYWx1aWQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9zZXJpYWx1aWQ7Ci0gICAgfQotICAgIAotCi0gICAgcHVibGljIHZvaWQgc2V0SW1wbGVtZW50cyhTdHJpbmcgaW1wbGVtZW50c1ZhbHVlKQotICAgIHsKLSAgICAgICAgX2ltcGxlbWVudHMgPSBpbXBsZW1lbnRzVmFsdWU7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRJbXBsZW1lbnRzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfaW1wbGVtZW50czsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRHZW5lcmF0ZWRDb21wb25lbnRDbGFzcyhCb29sZWFuIGdlbmVyYXRlZENvbXBvbmVudENsYXNzKQotICAgIHsKLSAgICAgICAgX2dlbmVyYXRlZENvbXBvbmVudENsYXNzID0gZ2VuZXJhdGVkQ29tcG9uZW50Q2xhc3M7Ci0gICAgfQotCi0gICAgcHVibGljIEJvb2xlYW4gaXNHZW5lcmF0ZWRDb21wb25lbnRDbGFzcygpCi0gICAgewotICAgICAgICByZXR1cm4gTW9kZWxVdGlscy5kZWZhdWx0T2YoX2dlbmVyYXRlZENvbXBvbmVudENsYXNzLGZhbHNlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRHZW5lcmF0ZWRUYWdDbGFzcyhCb29sZWFuIGdlbmVyYXRlZFRhZ0NsYXNzKQotICAgIHsKLSAgICAgICAgX2dlbmVyYXRlZFRhZ0NsYXNzID0gZ2VuZXJhdGVkVGFnQ2xhc3M7Ci0gICAgfQotCi0gICAgcHVibGljIEJvb2xlYW4gaXNHZW5lcmF0ZWRUYWdDbGFzcygpCi0gICAgewotICAgICAgICByZXR1cm4gTW9kZWxVdGlscy5kZWZhdWx0T2YoX2dlbmVyYXRlZFRhZ0NsYXNzLGZhbHNlKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc2V0VGVtcGxhdGUoQm9vbGVhbiB0ZW1wbGF0ZSkKLSAgICB7Ci0gICAgICAgIF90ZW1wbGF0ZSA9IHRlbXBsYXRlOwotICAgIH0KLQotICAgIHB1YmxpYyBCb29sZWFuIGlzVGVtcGxhdGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE1vZGVsVXRpbHMuZGVmYXVsdE9mKF90ZW1wbGF0ZSxmYWxzZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU3BlY2lmaWVzIGlmIHRoZSBjb21wb25lbnQgc3VwcG9ydHMgY2hpbGQgY29tcG9uZW50cy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRDaGlsZHJlbihCb29sZWFuIGNoaWxkcmVuKQotICAgIHsKLSAgICAgICAgX2NoaWxkcmVuID0gY2hpbGRyZW47Ci0gICAgfQotCi0gICAgcHVibGljIEJvb2xlYW4gaGFzQ2hpbGRyZW4oKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE1vZGVsVXRpbHMuZGVmYXVsdE9mKF9jaGlsZHJlbiwgdHJ1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkRmFjZXQoRmFjZXRNZXRhIHByb3ApCi0gICAgewotICAgICAgICBfZmFjZXRzLnB1dChwcm9wLmdldE5hbWUoKSwgcHJvcCk7Ci0gICAgfQotCi0gICAgcHVibGljIEl0ZXJhdG9yIGZhY2V0cygpCi0gICAgewotICAgICAgICByZXR1cm4gX2ZhY2V0cy52YWx1ZXMoKS5pdGVyYXRvcigpOwotICAgIH0KLQotICAgIHB1YmxpYyBGYWNldE1ldGEgZ2V0RmFjZXQoU3RyaW5nIG5hbWUpCi0gICAgewotICAgICAgICByZXR1cm4gKEZhY2V0TWV0YSkgX2ZhY2V0cy5nZXQobmFtZSk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEBzaW5jZSAxLjAuNAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKExpc3RlbmVyTWV0YSBwcm9wKQotICAgIHsKLSAgICAgICAgX2xpc3RlbmVycy5wdXQocHJvcC5nZXROYW1lKCksIHByb3ApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzaW5jZSAxLjAuNAotICAgICAqLwotICAgIHB1YmxpYyBJdGVyYXRvciBsaXN0ZW5lcnMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9saXN0ZW5lcnMudmFsdWVzKCkuaXRlcmF0b3IoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2luY2UgMS4wLjQKLSAgICAgKi8KLSAgICBwdWJsaWMgTGlzdGVuZXJNZXRhIGdldExpc3RlbmVyKFN0cmluZyBuYW1lKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChMaXN0ZW5lck1ldGEpIF9saXN0ZW5lcnMuZ2V0KG5hbWUpOwotICAgIH0KLQotICAgIAotICAgIC8qKgotICAgICAqIAotICAgICAqIEBzaW5jZSAxLjAuNAotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdEV2ZW50TmFtZSgpCi0gICAgewotICAgICAgICByZXR1cm4gX2RlZmF1bHRFdmVudE5hbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogCi0gICAgICogQHNpbmNlIDEuMC40Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RGVmYXVsdEV2ZW50TmFtZShTdHJpbmcgZGVmYXVsdEV2ZW50TmFtZSkKLSAgICB7Ci0gICAgICAgIHRoaXMuX2RlZmF1bHRFdmVudE5hbWUgPSBkZWZhdWx0RXZlbnROYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIAotICAgICAqIEBzaW5jZSAxLjAuNQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE92ZXJyaWRlRGVmYXVsdEV2ZW50TmFtZShCb29sZWFuIG92ZXJyaWRlRGVmYXVsdEV2ZW50TmFtZSkKLSAgICB7Ci0gICAgICAgIF9vdmVycmlkZURlZmF1bHRFdmVudE5hbWUgPSBvdmVycmlkZURlZmF1bHRFdmVudE5hbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW5kaWNhdGUgaWYgdGhpcyBjb21wb25lbnQgbXVzdCBvdmVycmlkZSB0aGUgbWV0aG9kOgotICAgICAqIHB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdEV2ZW50TmFtZSgpCi0gICAgICogVG8gcmV0dXJuIHRoZSB2YWx1ZSBvbiBkZWZhdWx0RXZlbnROYW1lIAotICAgICAqIAotICAgICAqIEBzaW5jZSAxLjAuNQotICAgICAqLwotICAgIHB1YmxpYyBCb29sZWFuIGlzT3ZlcnJpZGVEZWZhdWx0RXZlbnROYW1lKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBNb2RlbFV0aWxzLmRlZmF1bHRPZihfb3ZlcnJpZGVEZWZhdWx0RXZlbnROYW1lLGZhbHNlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAKLSAgICAgKiBAc2luY2UgMS4wLjUKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRDbGllbnRCZWhhdmlvckhvbGRlcihCb29sZWFuIGNsaWVudEJlaGF2aW9ySG9sZGVyKQotICAgIHsKLSAgICAgICAgX2NsaWVudEJlaGF2aW9ySG9sZGVyID0gY2xpZW50QmVoYXZpb3JIb2xkZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogCi0gICAgICogQHNpbmNlIDEuMC41Ci0gICAgICovCi0gICAgcHVibGljIEJvb2xlYW4gaXNDbGllbnRCZWhhdmlvckhvbGRlcigpCi0gICAgewotICAgICAgICByZXR1cm4gTW9kZWxVdGlscy5kZWZhdWx0T2YoX2NsaWVudEJlaGF2aW9ySG9sZGVyLGZhbHNlKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogCi0gICAgICogQHNpbmNlIDEuMC41Ci0gICAgICovCi0gICAgcHVibGljIExpc3QgZ2V0SW1wbGVtZW50ZWRJbnRlcmZhY2VDbGFzc05hbWVzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfaW1wbGVtZW50ZWRJbnRlcmZhY2VDbGFzc05hbWVzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIAotICAgICAqIEBzaW5jZSAxLjAuNQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEltcGxlbWVudGVkSW50ZXJmYWNlQ2xhc3NOYW1lcyhMaXN0IGNsYXNzTmFtZXMpCi0gICAgewotICAgICAgICBfaW1wbGVtZW50ZWRJbnRlcmZhY2VDbGFzc05hbWVzID0gY2xhc3NOYW1lczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAKLSAgICAgKiBAc2luY2UgMS4wLjUKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRJbXBsZW1lbnRlZEludGVyZmFjZUNsYXNzTmFtZShTdHJpbmcgbmFtZSkKLSAgICB7Ci0gICAgICAgIF9pbXBsZW1lbnRlZEludGVyZmFjZUNsYXNzTmFtZXMuYWRkKG5hbWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIAotICAgICAqIEBzaW5jZSAxLjAuNQotICAgICAqLwotICAgIHB1YmxpYyBCb29sZWFuIGlzQ29tcG9zaXRlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBNb2RlbFV0aWxzLmRlZmF1bHRPZihfY29tcG9zaXRlLGZhbHNlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAKLSAgICAgKiBAc2luY2UgMS4wLjUKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRDb21wb3NpdGUoQm9vbGVhbiBjb21wb3NpdGUpCi0gICAgewotICAgICAgICBfY29tcG9zaXRlID0gY29tcG9zaXRlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIAotICAgICAqIEBzaW5jZSAxLjAuOQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2NMaWJyYXJ5TmFtZSgpCi0gICAgewotICAgICAgICByZXR1cm4gX2NjTGlicmFyeU5hbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogCi0gICAgICogQHNpbmNlIDEuMC45Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Q2NMaWJyYXJ5TmFtZShTdHJpbmcgY2NMaWJyYXJ5TmFtZSkKLSAgICB7Ci0gICAgICAgIHRoaXMuX2NjTGlicmFyeU5hbWUgPSBjY0xpYnJhcnlOYW1lOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiAKLSAgICAgKiBAc2luY2UgMS4wLjkKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldENjUmVzb3VyY2VOYW1lKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfY2NSZXNvdXJjZU5hbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogCi0gICAgICogQHNpbmNlIDEuMC45Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Q2NSZXNvdXJjZU5hbWUoU3RyaW5nIGNjUmVzb3VyY2VOYW1lKQotICAgIHsKLSAgICAgICAgdGhpcy5fY2NSZXNvdXJjZU5hbWUgPSBjY1Jlc291cmNlTmFtZTsKLSAgICB9Ci0KLSAgICAvL1RISVMgTUVUSE9EUyBBUkUgVVNFRCBGT1IgVkVMT0NJVFkgVE8gR0VUIERBVEEgQU5EIEdFTkVSQVRFIENMQVNTRVMKLSAgICAKLSAgICBwdWJsaWMgQ29sbGVjdGlvbiBnZXRGYWNldExpc3QoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9mYWNldHMudmFsdWVzKCk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgTGlzdCBfcHJvcGVydHlUYWdMaXN0ID0gbnVsbDsgCi0gICAgCi0gICAgcHVibGljIENvbGxlY3Rpb24gZ2V0UHJvcGVydHlUYWdMaXN0KCkKLSAgICB7Ci0gICAgICAgIGlmIChfcHJvcGVydHlUYWdMaXN0ID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIF9wcm9wZXJ0eVRhZ0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ID0gZ2V0UHJvcGVydHlMaXN0KCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBQcm9wZXJ0eU1ldGEgcHJvcCA9IChQcm9wZXJ0eU1ldGEpIGl0Lm5leHQoKTsKLSAgICAgICAgICAgICAgICBpZiAoIXByb3AuaXNUYWdFeGNsdWRlZCgpLmJvb2xlYW5WYWx1ZSgpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAhcHJvcC5pc0luaGVyaXRlZFRhZygpLmJvb2xlYW5WYWx1ZSgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgX3Byb3BlcnR5VGFnTGlzdC5hZGQocHJvcCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIF9wcm9wZXJ0eVRhZ0xpc3Q7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgTGlzdCBfcHJvcGVydHlDb21wb25lbnRMaXN0ID0gbnVsbDsgCi0gICAgCi0gICAgcHVibGljIENvbGxlY3Rpb24gZ2V0UHJvcGVydHlDb21wb25lbnRMaXN0KCkKLSAgICB7Ci0gICAgICAgIGlmIChfcHJvcGVydHlDb21wb25lbnRMaXN0ID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIF9wcm9wZXJ0eUNvbXBvbmVudExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ID0gZ2V0UHJvcGVydHlMaXN0KCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBQcm9wZXJ0eU1ldGEgcHJvcCA9IChQcm9wZXJ0eU1ldGEpIGl0Lm5leHQoKTsKLSAgICAgICAgICAgICAgICBpZiAoIXByb3AuaXNJbmhlcml0ZWQoKS5ib29sZWFuVmFsdWUoKSAmJiBwcm9wLmlzR2VuZXJhdGVkKCkuYm9vbGVhblZhbHVlKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBfcHJvcGVydHlDb21wb25lbnRMaXN0LmFkZChwcm9wKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gX3Byb3BlcnR5Q29tcG9uZW50TGlzdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBwYWNrYWdlIHBhcnQgb2YgdGhlIHRhZyBjbGFzcwotICAgICAqIAotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFRhZ1BhY2thZ2UoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIFN0cmluZ1V0aWxzLnN1YnN0cmluZyhnZXRUYWdDbGFzcygpLCAwLCBTdHJpbmdVdGlscy5sYXN0SW5kZXhPZihnZXRUYWdDbGFzcygpLCAnLicpKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBCb29sZWFuIF9vdmVycmlkZUV2ZW50TmFtZXM7Ci0gICAgCi0gICAgLyoqCi0gICAgICogCi0gICAgICogQHNpbmNlIDEuMC41Ci0gICAgICovCi0gICAgcHVibGljIEJvb2xlYW4gaXNPdmVycmlkZUV2ZW50TmFtZXMoKQotICAgIHsKLSAgICAgICAgaWYgKF9vdmVycmlkZUV2ZW50TmFtZXMgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdCA9IGdldFByb3BlcnR5TGlzdCgpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgUHJvcGVydHlNZXRhIHByb3AgPSAoUHJvcGVydHlNZXRhKSBpdC5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgaWYgKCFwcm9wLmlzSW5oZXJpdGVkKCkuYm9vbGVhblZhbHVlKCkgJiYgcHJvcC5nZXRDbGllbnRFdmVudCgpICE9IG51bGwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBfb3ZlcnJpZGVFdmVudE5hbWVzID0gQm9vbGVhbi5UUlVFOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIE1vZGVsVXRpbHMuZGVmYXVsdE9mKF9vdmVycmlkZUV2ZW50TmFtZXMsZmFsc2UpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9tb2RlbC9Db252ZXJ0ZXJNZXRhLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL21vZGVsL0NvbnZlcnRlck1ldGEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTkyOThiOS4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL21vZGVsL0NvbnZlcnRlck1ldGEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwOCArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uYnVpbGRlci5tb2RlbDsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1vZGlmaWVyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmRpZ2VzdGVyLkRpZ2VzdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uYnVpbGRlci5pby5YbWxXcml0ZXI7Ci0KLS8qKgotICogU3RvcmUgbWV0YWRhdGEgYWJvdXQgYSBjbGFzcyB0aGF0IGlzIGVpdGhlciBhIEpTRiBDb252ZXJ0ZXIsIG9yIHNvbWUgYmFzZQotICogY2xhc3Mgb3IgaW50ZXJmYWNlIHRoYXQgYSBDb252ZXJ0ZXIgY2FuIGJlIGRlcml2ZWQgZnJvbS4KLSAqIDxwPgotICogQSBjb252ZXJ0ZXIgY2FuIGJlIHVzZWQgaW4gdGhyZWUgd2F5czoKLSAqIDx1bD4KLSAqIDxsaT5pbnN0YW50aWF0ZWQgdmlhIGEgdGFnLAotICogPGxpPnJlZmVyZW5jZWQgdmlhIGl0cyBpZCwKLSAqIDxsaT5pbXBsaWNpdGx5IHVzZWQgdmlhIGl0cyBmb3JDbGFzcyBwcm9wZXJ0eQotICogPC91bD4KLSAqLwotcHVibGljIGNsYXNzIENvbnZlcnRlck1ldGEgZXh0ZW5kcyBWaWV3RW50aXR5TWV0YSBpbXBsZW1lbnRzIFByb3BlcnR5SG9sZGVyCi17Ci0gICAgcHJpdmF0ZSBTdHJpbmcgX2NvbnZlcnRlcklkOwotICAgIHByaXZhdGUgaW50IF9jb252ZXJ0ZXJDbGFzc01vZGlmaWVyczsKLSAgICAKLSAgICAvL1NvbWUgY29udmVydGVycyBoYXMgaXRzIG93biB0YWcgY2xhc3MsIHNvIGl0J3MgbmVjZXNzYXJ5IHRvCi0gICAgLy9hZGQgc29tZSBwcm9wZXJ0aWVzIGZvciB0aGlzIGNhc2VzIChmOmNvbnZlcnROdW1iZXIgb3IgZjpjb252ZXJ0RGF0ZVRpbWUpCi0gICAgcHJpdmF0ZSBTdHJpbmcgX2JvZHlDb250ZW50OwotICAgIHByaXZhdGUgU3RyaW5nIF90YWdDbGFzczsKLSAgICBwcml2YXRlIFN0cmluZyBfdGFnU3VwZXJjbGFzczsKLSAgICBwcml2YXRlIFN0cmluZyBfc2VyaWFsdWlkdGFnOwotICAgIHByaXZhdGUgU3RyaW5nIF90YWdIYW5kbGVyOwotICAgIAotICAgIHByaXZhdGUgQm9vbGVhbiBfZ2VuZXJhdGVkQ29tcG9uZW50Q2xhc3M7Ci0gICAgcHJpdmF0ZSBCb29sZWFuIF9nZW5lcmF0ZWRUYWdDbGFzczsKLSAgICBwcml2YXRlIEJvb2xlYW4gX2NvbmZpZ0V4Y2x1ZGVkOwotICAgIAotICAgIHByaXZhdGUgQm9vbGVhbiBfZXZhbHVhdGVFTE9uRXhlY3V0aW9uOwotCi0gICAgLyoqCi0gICAgICogV3JpdGUgYW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBvdXQgYXMgeG1sLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHdyaXRlWG1sU2ltcGxlKFhtbFdyaXRlciBvdXQpCi0gICAgewotICAgICAgICBzdXBlci53cml0ZVhtbFNpbXBsZShvdXQpOwotCi0gICAgICAgIG91dC53cml0ZUVsZW1lbnQoImNvbnZlcnRlcklkIiwgX2NvbnZlcnRlcklkKTsKLSAgICAgICAgb3V0LndyaXRlRWxlbWVudCgiYm9keUNvbnRlbnQiLCBfYm9keUNvbnRlbnQpOwotICAgICAgICBvdXQud3JpdGVFbGVtZW50KCJ0YWdDbGFzcyIsIF90YWdDbGFzcyk7Ci0gICAgICAgIG91dC53cml0ZUVsZW1lbnQoInRhZ1N1cGVyY2xhc3MiLCBfdGFnU3VwZXJjbGFzcyk7Ci0gICAgICAgIG91dC53cml0ZUVsZW1lbnQoInRhZ0hhbmRsZXIiLCBfdGFnSGFuZGxlcik7Ci0gICAgICAgIG91dC53cml0ZUVsZW1lbnQoInNlcmlhbHVpZHRhZyIsIF9zZXJpYWx1aWR0YWcpOwotICAgICAgICBvdXQud3JpdGVFbGVtZW50KCJnZW5lcmF0ZWRDb21wb25lbnRDbGFzcyIsIF9nZW5lcmF0ZWRDb21wb25lbnRDbGFzcyk7Ci0gICAgICAgIG91dC53cml0ZUVsZW1lbnQoImdlbmVyYXRlZFRhZ0NsYXNzIiwgX2dlbmVyYXRlZFRhZ0NsYXNzKTsKLSAgICAgICAgb3V0LndyaXRlRWxlbWVudCgiY29uZmlnRXhjbHVkZWQiLCBfY29uZmlnRXhjbHVkZWQpOwotICAgICAgICBvdXQud3JpdGVFbGVtZW50KCJldmFsdWF0ZUVMT25FeGVjdXRpb24iLCBfZXZhbHVhdGVFTE9uRXhlY3V0aW9uKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGQgZGlnZXN0ZXIgcnVsZXMgdG8gcmVwb3B1bGF0ZSBhbiBpbnN0YW5jZSBvZiB0aGlzIHR5cGUgZnJvbSBhbiB4bWwKLSAgICAgKiBmaWxlLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhZGRYbWxSdWxlcyhEaWdlc3RlciBkaWdlc3RlciwgU3RyaW5nIHByZWZpeCkKLSAgICB7Ci0gICAgICAgIFN0cmluZyBuZXdQcmVmaXggPSBwcmVmaXggKyAiL2NvbnZlcnRlciI7Ci0KLSAgICAgICAgZGlnZXN0ZXIuYWRkT2JqZWN0Q3JlYXRlKG5ld1ByZWZpeCwgQ29udmVydGVyTWV0YS5jbGFzcyk7Ci0gICAgICAgIGRpZ2VzdGVyLmFkZFNldE5leHQobmV3UHJlZml4LCAiYWRkQ29udmVydGVyIik7Ci0KLSAgICAgICAgVmlld0VudGl0eU1ldGEuYWRkWG1sUnVsZXMoZGlnZXN0ZXIsIG5ld1ByZWZpeCk7Ci0KLSAgICAgICAgZGlnZXN0ZXIuYWRkQmVhblByb3BlcnR5U2V0dGVyKG5ld1ByZWZpeCArICIvY29udmVydGVySWQiKTsKLSAgICAgICAgZGlnZXN0ZXIuYWRkQmVhblByb3BlcnR5U2V0dGVyKG5ld1ByZWZpeCArICIvYm9keUNvbnRlbnQiKTsKLSAgICAgICAgZGlnZXN0ZXIuYWRkQmVhblByb3BlcnR5U2V0dGVyKG5ld1ByZWZpeCArICIvdGFnQ2xhc3MiKTsKLSAgICAgICAgZGlnZXN0ZXIuYWRkQmVhblByb3BlcnR5U2V0dGVyKG5ld1ByZWZpeCArICIvdGFnU3VwZXJjbGFzcyIpOwotICAgICAgICBkaWdlc3Rlci5hZGRCZWFuUHJvcGVydHlTZXR0ZXIobmV3UHJlZml4ICsgIi90YWdIYW5kbGVyIik7Ci0gICAgICAgIGRpZ2VzdGVyLmFkZEJlYW5Qcm9wZXJ0eVNldHRlcihuZXdQcmVmaXggKyAiL3NlcmlhbHVpZHRhZyIpOwotICAgICAgICBkaWdlc3Rlci5hZGRCZWFuUHJvcGVydHlTZXR0ZXIobmV3UHJlZml4ICsgIi9nZW5lcmF0ZWRDb21wb25lbnRDbGFzcyIpOwotICAgICAgICBkaWdlc3Rlci5hZGRCZWFuUHJvcGVydHlTZXR0ZXIobmV3UHJlZml4ICsgIi9nZW5lcmF0ZWRUYWdDbGFzcyIpOwotICAgICAgICBkaWdlc3Rlci5hZGRCZWFuUHJvcGVydHlTZXR0ZXIobmV3UHJlZml4ICsgIi9jb25maWdFeGNsdWRlZCIpOwotICAgICAgICBkaWdlc3Rlci5hZGRCZWFuUHJvcGVydHlTZXR0ZXIobmV3UHJlZml4ICsgIi9ldmFsdWF0ZUVMT25FeGVjdXRpb24iKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIENvbnZlcnRlck1ldGEoKQotICAgIHsKLSAgICAgICAgc3VwZXIoImNvbnZlcnRlciIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE1lcmdlIHRoZSBkYXRhIGluIHRoZSBzcGVjaWZpZWQgb3RoZXIgcHJvcGVydHkgaW50byB0aGlzIG9uZSwgdGhyb3dpbmcgYW4KLSAgICAgKiBleGNlcHRpb24gaWYgdGhlcmUgaXMgYW4gaW5jb21wYXRpYmlsaXR5LgotICAgICAqIAotICAgICAqIE5vdCB1c2VkIHJpZ2h0IG5vdyBzaW5jZSB0aGVvcmljYWxseSB0aGVyZSBpcyB2ZXJ5IGZldyBpbmhlcml0YW5jZQotICAgICAqIG9uIGNvbnZlcnRlcnMKLSAgICAgKiAKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBtZXJnZShDb252ZXJ0ZXJNZXRhIG90aGVyKQotICAgIHsKLSAgICAgICAgc3VwZXIubWVyZ2Uob3RoZXIpOwotCi0gICAgICAgIF9ib2R5Q29udGVudCA9IE1vZGVsVXRpbHMubWVyZ2UodGhpcy5fYm9keUNvbnRlbnQsIG90aGVyLl9ib2R5Q29udGVudCk7Ci0KLSAgICAgICAgLy8gaW5oZXJpdFBhcmVudFRhZyBpcyB0cnVlIGlmIHRoZSB0YWcgY2xhc3MgdG8gYmUgZ2VuZXJhdGVkIGZvciB0aGlzCi0gICAgICAgIC8vIGFydGlmYWN0IGV4dGVuZHMgdGhlIHRhZyBjbGFzcyBnZW5lcmF0ZWQgZm9yIHRoZSBwYXJlbnQgYXJ0aWZhY3QuCi0gICAgICAgIC8vIEluIHRoaXMgY2FzZSwgdGhlIHRhZyBmb3IgdGhpcyBjbGFzcyBhbHJlYWR5IGluaGVyaXRzIHNldHRlciBtZXRob2RzCi0gICAgICAgIC8vIGZyb20gaXRzIHBhcmVudCB0aGF0IGhhbmRsZSBhbGwgdGhlIGluaGVyaXRlZCBwcm9wZXJ0aWVzLCBzbyB0aGUKLSAgICAgICAgLy8gdGFnIGNsYXNzIGZvciB0aGlzIGNvbXBvbmVudCBqdXN0IG5lZWRzIHRvIGhhbmRsZSBpdHMgb3duIHByb3BlcnRpZXMuCi0gICAgICAgIC8vCi0gICAgICAgIC8vIEJ1dCB3aGVuIHRoZSB0YWcgY2xhc3MgZm9yIHRoaXMgY29tcG9uZW50IGRvZXMgbm90IGV4dGVuZCB0aGUgdGFnIGNsYXNzCi0gICAgICAgIC8vIGZvciB0aGUgcGFyZW50IGNvbXBvbmVudCAoYmVjYXVzZSB0aGUgcGFyZW50IGNvbXBvbmVudCBkb2VzIG5vdCBoYXZlCi0gICAgICAgIC8vIGEgdGFnIGNsYXNzKSB0aGVuIHdlIG5lZWQgdG8gCi0gICAgICAgIGJvb2xlYW4gaW5oZXJpdFBhcmVudFRhZyA9IGZhbHNlOwotICAgICAgICAvL2NoZWNrIGlmIHRoZSBwYXJlbnQgc2V0IGEgdGFnIGNsYXNzCi0gICAgICAgIGlmIChvdGhlci5fdGFnQ2xhc3MgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgLy9UaGUgdGFnU3VwZXJjbGFzcyBpcyB0aGUgdGFnQ2xhc3Mgb2YgdGhlIHBhcmVudAotICAgICAgICAgICAgX3RhZ1N1cGVyY2xhc3MgPSBNb2RlbFV0aWxzLm1lcmdlKHRoaXMuX3RhZ1N1cGVyY2xhc3MsCi0gICAgICAgICAgICAgICAgICAgIG90aGVyLl90YWdDbGFzcyk7Ci0gICAgICAgICAgICBpbmhlcml0UGFyZW50VGFnID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vVGhlIHRhZ1N1cGVyY2xhc3MgaXMgdGhlIHRhZ1N1cGVyY2xhc3Mgb2YgdGhlIHBhcmVudAotICAgICAgICAgICAgX3RhZ1N1cGVyY2xhc3MgPSBNb2RlbFV0aWxzLm1lcmdlKHRoaXMuX3RhZ1N1cGVyY2xhc3MsCi0gICAgICAgICAgICAgICAgICAgIG90aGVyLl90YWdTdXBlcmNsYXNzKTsgICAgICAgICAgICAKLSAgICAgICAgfQotCi0gICAgICAgIF90YWdIYW5kbGVyID0gTW9kZWxVdGlscy5tZXJnZSh0aGlzLl90YWdIYW5kbGVyLCBvdGhlci5fdGFnSGFuZGxlcik7Ci0gICAgICAgIF9ldmFsdWF0ZUVMT25FeGVjdXRpb24gPSBNb2RlbFV0aWxzLm1lcmdlKHRoaXMuX2V2YWx1YXRlRUxPbkV4ZWN1dGlvbiwgb3RoZXIuX2V2YWx1YXRlRUxPbkV4ZWN1dGlvbik7Ci0gICAgICAgIAotICAgICAgICBfY29udmVydGVySWQgPSBNb2RlbFV0aWxzLm1lcmdlKHRoaXMuX2NvbnZlcnRlcklkLCBvdGhlci5fY29udmVydGVySWQpOwotCi0gICAgICAgIC8vIFRPRE86IF9jb252ZXJ0ZXJDbGFzc01PZGlmaWVycwotICAgICAgICAKLSAgICAgICAgaWYgKGluaGVyaXRQYXJlbnRUYWcpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IHRoaXMucHJvcGVydGllcygpOyBpLmhhc05leHQoKTspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgUHJvcGVydHlNZXRhIHNyY1Byb3AgPSAoUHJvcGVydHlNZXRhKSBpLm5leHQoKTsKLSAgICAgICAgICAgICAgICBQcm9wZXJ0eU1ldGEgcGFyZW50UHJvcCA9IG90aGVyLmdldFByb3BlcnR5KHNyY1Byb3AuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICBpZiAocGFyZW50UHJvcCAhPSBudWxsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy9UaGVyZSBhcmUgdGhyZWUgcG9zc2libGUgYmVoYXZpb3JzOgotICAgICAgICAgICAgICAgICAgICAvLzEuIFRoZSBwcm9wZXJ0eSBpcyBkZWZpbmVkIG9uIHRoZSBjaGlsZCBhZ2FpbiBhbmQKLSAgICAgICAgICAgICAgICAgICAgLy8gICB0aGUgcHJvcGVydHkgd2FzIGFscmVhZHkgb24gdGhlIHRhZyBoaWVyYXJjaHksIHNvCi0gICAgICAgICAgICAgICAgICAgIC8vICAgaW5oZXJpdGVkVGFnIG11c3QgYmUgc2V0IHRvIFRSVUUuCi0gICAgICAgICAgICAgICAgICAgIC8vMi4gVGhlIHByb3BlcnR5IGlzIGRlZmluZWQgb24gdGhlIGNoaWxkIGFnYWluIGFuZAotICAgICAgICAgICAgICAgICAgICAvLyAgIGl0IGlzIG5lY2Vzc2FyeSB0byB3cml0ZSBhZ2FpbiBvbiB0aGUgZ2VuZXJhdGVkCi0gICAgICAgICAgICAgICAgICAgIC8vICAgdGFnLCBzbyB0aGUgYW5ub3RhdGlvbiBsb29rcyBsaWtlCi0gICAgICAgICAgICAgICAgICAgIC8vICAgIkBKU0ZQcm9wZXJ0eSBpbmhlcml0ZWRUYWc9ZmFsc2UiCi0gICAgICAgICAgICAgICAgICAgIC8vICAgVGhpcyBjb25kaXRpb24gbXVzdCByZW1haW4gYXMgRkFMU0UKLSAgICAgICAgICAgICAgICAgICAgLy8zLiBUaGUgcHJvcGVydHkgaXMgc2V0IGJ5IHRoZSB1c2VyIGFzIHRydWUsIGJ1dCB0aGVyZQotICAgICAgICAgICAgICAgICAgICAvLyAgIHdhcyBub3QgZGVmaW5lZCBwcmV2aW91c2x5IG9uIHRoZSBoaWVyYXJjaHksIHNvCi0gICAgICAgICAgICAgICAgICAgIC8vICAgdGhpcyBjb25kaXRpb24gbXVzdCBiZSBhcyBpcyAoVFJVRSkgCi0gICAgICAgICAgICAgICAgICAgIC8vICAgKHNraXBwZWQgb24gcGFyZW50UHJvcCAhPSBudWxsKS4KLSAgICAgICAgICAgICAgICAgICAgaWYgKHNyY1Byb3AuaXNMb2NhbEluaGVyaXRlZFRhZygpID09IG51bGwgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNQcm9wLmlzSW5oZXJpdGVkVGFnKCkuYm9vbGVhblZhbHVlKCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNyY1Byb3Auc2V0SW5oZXJpdGVkVGFnKEJvb2xlYW4uVFJVRSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBfcHJvcGVydHlUYWdMaXN0ID0gbnVsbDsKLSAgICAgICAgfSAgICAgICAgCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgY29udmVydGVyIGlkZW50aWZlciBmb3IgdGhpcyBjb21wb25lbnQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Q29udmVydGVySWQoU3RyaW5nIGNvbnZlcnRlcklkKQotICAgIHsKLSAgICAgICAgX2NvbnZlcnRlcklkID0gY29udmVydGVySWQ7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRDb252ZXJ0ZXJJZCgpCi0gICAgewotICAgICAgICByZXR1cm4gX2NvbnZlcnRlcklkOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZHMgYSBKYXZhIExhbmd1YWdlIGNsYXNzIG1vZGlmaWVyIHRvIHRoZSBjb252ZXJ0ZXIgY2xhc3MuCi0gICAgICogPHA+Ci0gICAgICogVE9ETzogd2hhdCBpcyB0aGlzIGZvcj8/Pz8KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRDb252ZXJ0ZXJDbGFzc01vZGlmaWVyKGludCBtb2RpZmllcikKLSAgICB7Ci0gICAgICAgIF9jb252ZXJ0ZXJDbGFzc01vZGlmaWVycyB8PSBtb2RpZmllcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBKYXZhIExhbmd1YWdlIGNsYXNzIG1vZGlmaWVycyBmb3IgdGhlIGNvbnZlcnRlciBjbGFzcy4gQnkKLSAgICAgKiBkZWZhdWx0LCB0aGVzZSBtb2RpZmllcnMgaW5jbHVkZSBNb2RpZmllci5QVUJMSUMuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgSmF2YSBMYW5ndWFnZSBjbGFzcyBtb2RpZmllcnMgZm9yIHRoZSBjb252ZXJ0ZXIgY2xhc3MKLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldENvbnZlcnRlckNsYXNzTW9kaWZpZXJzKCkKLSAgICB7Ci0gICAgICAgIGludCBtb2RpZmllcnMgPSBfY29udmVydGVyQ2xhc3NNb2RpZmllcnM7Ci0KLSAgICAgICAgaWYgKCFNb2RpZmllci5pc1ByaXZhdGUobW9kaWZpZXJzKSAmJiAhTW9kaWZpZXIuaXNQcm90ZWN0ZWQobW9kaWZpZXJzKQotICAgICAgICAgICAgICAgICYmICFNb2RpZmllci5pc1B1YmxpYyhtb2RpZmllcnMpKQotICAgICAgICB7Ci0gICAgICAgICAgICBtb2RpZmllcnMgfD0gTW9kaWZpZXIuUFVCTElDOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG1vZGlmaWVyczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRCb2R5Q29udGVudChTdHJpbmcgYm9keUNvbnRlbnQpCi0gICAgewotICAgICAgICB0aGlzLl9ib2R5Q29udGVudCA9IGJvZHlDb250ZW50OwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Qm9keUNvbnRlbnQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9ib2R5Q29udGVudDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBKU1AgdGFnIGhhbmRsZXIgY2xhc3MgZm9yIHRoaXMgY29tcG9uZW50LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFRhZ0NsYXNzKFN0cmluZyB0YWdDbGFzcykKLSAgICB7Ci0gICAgICAgIF90YWdDbGFzcyA9IHRhZ0NsYXNzOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGFnQ2xhc3MoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF90YWdDbGFzczsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgSlNQIHRhZyBoYW5kbGVyIHN1cGVyY2xhc3MgZm9yIHRoaXMgY29tcG9uZW50LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFRhZ1N1cGVyY2xhc3MoU3RyaW5nIHRhZ1N1cGVyY2xhc3MpCi0gICAgewotICAgICAgICBfdGFnU3VwZXJjbGFzcyA9IHRhZ1N1cGVyY2xhc3M7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRUYWdTdXBlcmNsYXNzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfdGFnU3VwZXJjbGFzczsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogU3BlY2lmaWVzIHRoZSBjbGFzcyBvZiB0aGUgRmFjZWxldHMgdGFnIGhhbmRsZXIgKGNvbXBvbmVudCBoYW5kbGVyKSBmb3IKLSAgICAgKiB0aGlzIGNvbXBvbmVudC4KLSAgICAgKiA8cD4KLSAgICAgKiBOb3RlIHRoYXQgYSBGYWNlbGV0cyB0YWcgaGFuZGxlciBjbGFzcyBpcyBub3QgbmVlZGVkIGZvciBtb3N0IGNvbXBvbmVudHMuCi0gICAgICogPC9wPgotICAgICAqIAotICAgICAqIEBzaW5jZSAxLjAuOAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFRhZ0hhbmRsZXIoU3RyaW5nIHRhZ0hhbmRsZXIpCi0gICAgewotICAgICAgICBfdGFnSGFuZGxlciA9IHRhZ0hhbmRsZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogCi0gICAgICogQHNpbmNlIDEuMC44Ci0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRUYWdIYW5kbGVyKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfdGFnSGFuZGxlcjsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc2V0U2VyaWFsdWlkdGFnKFN0cmluZyBzZXJpYWx1aWR0YWcpCi0gICAgewotICAgICAgICBfc2VyaWFsdWlkdGFnID0gc2VyaWFsdWlkdGFnOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2VyaWFsdWlkdGFnKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfc2VyaWFsdWlkdGFnOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiAKLSAgICAgKiBAc2luY2UgMS4wLjgKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRHZW5lcmF0ZWRDb21wb25lbnRDbGFzcyhCb29sZWFuIGdlbmVyYXRlZENvbXBvbmVudENsYXNzKQotICAgIHsKLSAgICAgICAgX2dlbmVyYXRlZENvbXBvbmVudENsYXNzID0gZ2VuZXJhdGVkQ29tcG9uZW50Q2xhc3M7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogCi0gICAgICogQHNpbmNlIDEuMC44Ci0gICAgICovCi0gICAgcHVibGljIEJvb2xlYW4gaXNHZW5lcmF0ZWRDb21wb25lbnRDbGFzcygpCi0gICAgewotICAgICAgICByZXR1cm4gTW9kZWxVdGlscy5kZWZhdWx0T2YoX2dlbmVyYXRlZENvbXBvbmVudENsYXNzLGZhbHNlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRHZW5lcmF0ZWRUYWdDbGFzcyhCb29sZWFuIGdlbmVyYXRlZFRhZ0NsYXNzKQotICAgIHsKLSAgICAgICAgX2dlbmVyYXRlZFRhZ0NsYXNzID0gZ2VuZXJhdGVkVGFnQ2xhc3M7Ci0gICAgfQotCi0gICAgcHVibGljIEJvb2xlYW4gaXNHZW5lcmF0ZWRUYWdDbGFzcygpCi0gICAgewotICAgICAgICByZXR1cm4gTW9kZWxVdGlscy5kZWZhdWx0T2YoX2dlbmVyYXRlZFRhZ0NsYXNzLGZhbHNlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRDb25maWdFeGNsdWRlZChCb29sZWFuIGNvbmZpZ0V4Y2x1ZGVkKQotICAgIHsKLSAgICAgICAgX2NvbmZpZ0V4Y2x1ZGVkID0gY29uZmlnRXhjbHVkZWQ7Ci0gICAgfQotCi0gICAgcHVibGljIEJvb2xlYW4gaXNDb25maWdFeGNsdWRlZCgpCi0gICAgewotICAgICAgICByZXR1cm4gTW9kZWxVdGlscy5kZWZhdWx0T2YoX2NvbmZpZ0V4Y2x1ZGVkLGZhbHNlKTsKLSAgICB9ICAgIAotCi0gICAgLyoqCi0gICAgICogCi0gICAgICogQHNpbmNlIDEuMC44Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RXZhbHVhdGVFTE9uRXhlY3V0aW9uKEJvb2xlYW4gZXZhbHVhdGVFTE9uRXhlY3V0aW9uKQotICAgIHsKLSAgICAgICAgdGhpcy5fZXZhbHVhdGVFTE9uRXhlY3V0aW9uID0gZXZhbHVhdGVFTE9uRXhlY3V0aW9uOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIAotICAgICAqIEBzaW5jZSAxLjAuOAotICAgICAqLwotICAgIHB1YmxpYyBCb29sZWFuIGlzRXZhbHVhdGVFTE9uRXhlY3V0aW9uKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBNb2RlbFV0aWxzLmRlZmF1bHRPZihfZXZhbHVhdGVFTE9uRXhlY3V0aW9uLGZhbHNlKTsKLSAgICB9Ci0KLSAgICAvL1RISVMgTUVUSE9EUyBBUkUgVVNFRCBGT1IgVkVMT0NJVFkgVE8gR0VUIERBVEEgQU5EIEdFTkVSQVRFIENMQVNTRVMKLQotICAgIC8vIEEgdHJhbnNpZW50IGF0dHJpYnV0ZSB0aGF0IGlzIGNvbXB1dGVkIG9uLWRlbWFuZCBmcm9tIHRoZSBtb2RlbCBkYXRhCi0gICAgLy8gYnV0IGlzIG5vdCBpdHNlbGYgc3RvcmVkIGluIHRoZSBtb2RlbC4KLSAgICAvLwotICAgIC8vIEl0IGhvbGRzIGEgbGlzdCBvZiBhbGwgdGhlIHByb3BlcnRpZXMgd2hpY2ggbmVlZCB0byBiZSBpbXBsZW1lbnRlZAotICAgIC8vIG9uIHRoZSB0YWcgY2xhc3MuIFRoaXMgaXMgYSBzdWJzZXQgb2YgdGhlIHByb3BlcnRpZXMgYXZhaWxhYmxlIG9uCi0gICAgLy8gdGhpcyBjb21wb25lbnQgaXRzZWxmLCBhbmQgZGVwZW5kcyB1cG9uIHdoYXQgdGhlIHBhcmVudCBjbGFzcwotICAgIC8vIG9mIHRoZSBnZW5lcmF0ZWQgdGFnIGFscmVhZHkgc3VwcG9ydHMuCi0gICAgcHJpdmF0ZSBMaXN0IF9wcm9wZXJ0eVRhZ0xpc3QgPSBudWxsOyAKLSAgICAKLSAgICBwdWJsaWMgQ29sbGVjdGlvbiBnZXRQcm9wZXJ0eVRhZ0xpc3QoKQotICAgIHsKLSAgICAgICAgaWYgKF9wcm9wZXJ0eVRhZ0xpc3QgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgX3Byb3BlcnR5VGFnTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXQgPSBnZXRQcm9wZXJ0eUxpc3QoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFByb3BlcnR5TWV0YSBwcm9wID0gKFByb3BlcnR5TWV0YSkgaXQubmV4dCgpOwotICAgICAgICAgICAgICAgIGlmICghcHJvcC5pc1RhZ0V4Y2x1ZGVkKCkuYm9vbGVhblZhbHVlKCkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICFwcm9wLmlzSW5oZXJpdGVkVGFnKCkuYm9vbGVhblZhbHVlKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBfcHJvcGVydHlUYWdMaXN0LmFkZChwcm9wKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gX3Byb3BlcnR5VGFnTGlzdDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIExpc3QgX3Byb3BlcnR5Q29udmVydGVyTGlzdCA9IG51bGw7IAotCi0gICAgLyoqCi0gICAgICogCi0gICAgICogQHNpbmNlIDEuMC44Ci0gICAgICovCi0gICAgcHVibGljIENvbGxlY3Rpb24gZ2V0UHJvcGVydHlDb252ZXJ0ZXJMaXN0KCkKLSAgICB7Ci0gICAgICAgIGlmIChfcHJvcGVydHlDb252ZXJ0ZXJMaXN0ID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIF9wcm9wZXJ0eUNvbnZlcnRlckxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ID0gZ2V0UHJvcGVydHlMaXN0KCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBQcm9wZXJ0eU1ldGEgcHJvcCA9IChQcm9wZXJ0eU1ldGEpIGl0Lm5leHQoKTsKLSAgICAgICAgICAgICAgICBpZiAoIXByb3AuaXNJbmhlcml0ZWQoKS5ib29sZWFuVmFsdWUoKSAmJiBwcm9wLmlzR2VuZXJhdGVkKCkuYm9vbGVhblZhbHVlKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBfcHJvcGVydHlDb252ZXJ0ZXJMaXN0LmFkZChwcm9wKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gX3Byb3BlcnR5Q29udmVydGVyTGlzdDsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvbW9kZWwvRmFjZWxldFRhZ01ldGEuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvbW9kZWwvRmFjZWxldFRhZ01ldGEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzlmZDJiYy4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL21vZGVsL0ZhY2VsZXRUYWdNZXRhLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTUgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmJ1aWxkZXIubW9kZWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5kaWdlc3Rlci5EaWdlc3RlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmJ1aWxkZXIuaW8uWG1sV3JpdGVyOwotCi0vKioKLSAqIFN0b3JlIG1ldGFkYXRhIGFib3V0IGEgSlNGIEZhY2VsZXQgVGFnIEhhbmRsZXIsIG9yIHNvbWUgYmFzZQotICogY2xhc3Mgb3IgaW50ZXJmYWNlIHRoYXQgYSBUYWcgSGFuZGxlciBjYW4gYmUgZGVyaXZlZCBmcm9tLgotICogCi0gKiBAc2luY2UgMS4wLjQKLSAqIEBhdXRob3IgTGVvbmFyZG8gVXJpYmUgKGxhdGVzdCBtb2RpZmljYXRpb24gYnkgJEF1dGhvciQpCi0gKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAotICovCi1wdWJsaWMgY2xhc3MgRmFjZWxldFRhZ01ldGEgZXh0ZW5kcyBDbGFzc01ldGEgaW1wbGVtZW50cyBBdHRyaWJ1dGVIb2xkZXIKLXsKLSAgICBwcml2YXRlIFN0cmluZyBfbmFtZTsKLSAgICBwcml2YXRlIFN0cmluZyBfYm9keUNvbnRlbnQ7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgX2Rlc2NyaXB0aW9uOwotICAgIHByaXZhdGUgU3RyaW5nIF9sb25nRGVzY3JpcHRpb247Ci0gICAgcHJpdmF0ZSBTdHJpbmcgX2NvbXBvbmVudENsYXNzOwotICAgIHByaXZhdGUgU3RyaW5nIF9jb252ZXJ0ZXJDbGFzczsKLSAgICBwcml2YXRlIFN0cmluZyBfYmVoYXZpb3JDbGFzczsKLSAgICBwcml2YXRlIFN0cmluZyBfdmFsaWRhdG9yQ2xhc3M7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgX3RhZ0NsYXNzOwotICAgIHByaXZhdGUgQm9vbGVhbiBfY29uZmlnRXhjbHVkZWQ7Ci0KLSAgICBwcm90ZWN0ZWQgTWFwIF9hdHRyaWJ1dGVzOwotICAgIAotICAgIC8qKgotICAgICAqIFdyaXRlIGFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3Mgb3V0IGFzIHhtbC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCB3cml0ZVhtbFNpbXBsZShYbWxXcml0ZXIgb3V0KQotICAgIHsKLSAgICAgICAgc3VwZXIud3JpdGVYbWxTaW1wbGUob3V0KTsKLQotICAgICAgICBvdXQud3JpdGVFbGVtZW50KCJuYW1lIiwgX25hbWUpOwotICAgICAgICBvdXQud3JpdGVFbGVtZW50KCJib2R5Q29udGVudCIsIF9ib2R5Q29udGVudCk7Ci0gICAgICAgIG91dC53cml0ZUVsZW1lbnQoImRlc2MiLCBfZGVzY3JpcHRpb24pOwotICAgICAgICBvdXQud3JpdGVFbGVtZW50KCJsb25nRGVzYyIsIF9sb25nRGVzY3JpcHRpb24pOwotICAgICAgICBvdXQud3JpdGVFbGVtZW50KCJjb21wb25lbnRDbGFzcyIsIF9jb21wb25lbnRDbGFzcyk7Ci0gICAgICAgIG91dC53cml0ZUVsZW1lbnQoInRhZ0NsYXNzIiwgX3RhZ0NsYXNzKTsKLSAgICAgICAgb3V0LndyaXRlRWxlbWVudCgiY29udmVydGVyQ2xhc3MiLCBfY29udmVydGVyQ2xhc3MpOwotICAgICAgICBvdXQud3JpdGVFbGVtZW50KCJiZWhhdmlvckNsYXNzIiwgX2JlaGF2aW9yQ2xhc3MpOwotICAgICAgICBvdXQud3JpdGVFbGVtZW50KCJ2YWxpZGF0b3JDbGFzcyIsIF92YWxpZGF0b3JDbGFzcyk7Ci0gICAgICAgIG91dC53cml0ZUVsZW1lbnQoImNvbmZpZ0V4Y2x1ZGVkIiwgX2NvbmZpZ0V4Y2x1ZGVkKTsKLQotICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBfYXR0cmlidXRlcy52YWx1ZXMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgICAgIHsKLSAgICAgICAgICAgIEF0dHJpYnV0ZU1ldGEgcHJvcCA9IChBdHRyaWJ1dGVNZXRhKSBpLm5leHQoKTsKLSAgICAgICAgICAgIEF0dHJpYnV0ZU1ldGEud3JpdGVYbWwob3V0LCBwcm9wKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZCBkaWdlc3RlciBydWxlcyB0byByZXBvcHVsYXRlIGFuIGluc3RhbmNlIG9mIHRoaXMgdHlwZSBmcm9tIGFuIHhtbAotICAgICAqIGZpbGUuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGFkZFhtbFJ1bGVzKERpZ2VzdGVyIGRpZ2VzdGVyLCBTdHJpbmcgcHJlZml4KQotICAgIHsKLSAgICAgICAgU3RyaW5nIG5ld1ByZWZpeCA9IHByZWZpeCArICIvZmFjZWxldFRhZyI7Ci0KLSAgICAgICAgZGlnZXN0ZXIuYWRkT2JqZWN0Q3JlYXRlKG5ld1ByZWZpeCwgRmFjZWxldFRhZ01ldGEuY2xhc3MpOwotICAgICAgICBkaWdlc3Rlci5hZGRTZXROZXh0KG5ld1ByZWZpeCwgImFkZEZhY2VsZXRUYWciKTsKLQotICAgICAgICBDbGFzc01ldGEuYWRkWG1sUnVsZXMoZGlnZXN0ZXIsIG5ld1ByZWZpeCk7Ci0gICAgICAgIGRpZ2VzdGVyLmFkZEJlYW5Qcm9wZXJ0eVNldHRlcihuZXdQcmVmaXggKyAiL25hbWUiLCAibmFtZSIpOwotICAgICAgICBkaWdlc3Rlci5hZGRCZWFuUHJvcGVydHlTZXR0ZXIobmV3UHJlZml4ICsgIi9ib2R5Q29udGVudCIsICJib2R5Q29udGVudCIpOwotICAgICAgICBkaWdlc3Rlci5hZGRCZWFuUHJvcGVydHlTZXR0ZXIobmV3UHJlZml4ICsgIi9kZXNjIiwgImRlc2NyaXB0aW9uIik7Ci0gICAgICAgIGRpZ2VzdGVyLmFkZEJlYW5Qcm9wZXJ0eVNldHRlcihuZXdQcmVmaXggKyAiL2xvbmdEZXNjIiwKLSAgICAgICAgICAgICAgICAibG9uZ0Rlc2NyaXB0aW9uIik7Ci0gICAgICAgIGRpZ2VzdGVyLmFkZEJlYW5Qcm9wZXJ0eVNldHRlcihuZXdQcmVmaXggKyAiL2NvbXBvbmVudENsYXNzIiwgImNvbXBvbmVudENsYXNzIik7Ci0gICAgICAgIGRpZ2VzdGVyLmFkZEJlYW5Qcm9wZXJ0eVNldHRlcihuZXdQcmVmaXggKyAiL3RhZ0NsYXNzIiwgInRhZ0NsYXNzIik7Ci0gICAgICAgIGRpZ2VzdGVyLmFkZEJlYW5Qcm9wZXJ0eVNldHRlcihuZXdQcmVmaXggKyAiL2NvbnZlcnRlckNsYXNzIiwgImNvbnZlcnRlckNsYXNzIik7Ci0gICAgICAgIGRpZ2VzdGVyLmFkZEJlYW5Qcm9wZXJ0eVNldHRlcihuZXdQcmVmaXggKyAiL2JlaGF2aW9yQ2xhc3MiLCAiYmVoYXZpb3JDbGFzcyIpOwotICAgICAgICBkaWdlc3Rlci5hZGRCZWFuUHJvcGVydHlTZXR0ZXIobmV3UHJlZml4ICsgIi92YWxpZGF0b3JDbGFzcyIsICJ2YWxpZGF0b3JDbGFzcyIpOwotICAgICAgICBkaWdlc3Rlci5hZGRCZWFuUHJvcGVydHlTZXR0ZXIobmV3UHJlZml4ICsgIi9jb25maWdFeGNsdWRlZCIpOwotICAgICAgICAKLSAgICAgICAgQXR0cmlidXRlTWV0YS5hZGRYbWxSdWxlcyhkaWdlc3RlciwgbmV3UHJlZml4KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3Rvci4KLSAgICAgKi8KLSAgICBwdWJsaWMgRmFjZWxldFRhZ01ldGEoKQotICAgIHsKLSAgICAgICAgc3VwZXIoImZhY2VsZXRUYWciKTsKLSAgICAgICAgX2F0dHJpYnV0ZXMgPSBuZXcgTGlua2VkSGFzaE1hcCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE1lcmdlIHRoZSBkYXRhIGluIHRoZSBzcGVjaWZpZWQgb3RoZXIgcHJvcGVydHkgaW50byB0aGlzIG9uZSwgdGhyb3dpbmcgYW4KLSAgICAgKiBleGNlcHRpb24gaWYgdGhlcmUgaXMgYW4gaW5jb21wYXRpYmlsaXR5LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIG1lcmdlKEZhY2VsZXRUYWdNZXRhIG90aGVyKQotICAgIHsKLSAgICAgICAgX25hbWUgPSBNb2RlbFV0aWxzLm1lcmdlKHRoaXMuX25hbWUsIG90aGVyLl9uYW1lKTsKLSAgICAgICAgX2Rlc2NyaXB0aW9uID0gTW9kZWxVdGlscy5tZXJnZSh0aGlzLl9kZXNjcmlwdGlvbiwgb3RoZXIuX2Rlc2NyaXB0aW9uKTsKLSAgICAgICAgX2xvbmdEZXNjcmlwdGlvbiA9IE1vZGVsVXRpbHMubWVyZ2UodGhpcy5fbG9uZ0Rlc2NyaXB0aW9uLAotICAgICAgICAgICAgICAgIG90aGVyLl9sb25nRGVzY3JpcHRpb24pOwotICAgICAgICBfYm9keUNvbnRlbnQgPSBNb2RlbFV0aWxzLm1lcmdlKHRoaXMuX2JvZHlDb250ZW50LCBvdGhlci5fYm9keUNvbnRlbnQpOwotICAgICAgICBNb2RlbFV0aWxzLm1lcmdlQXR0cmlidXRlcyh0aGlzLCBvdGhlcik7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGJyaWVmIGRlc2NyaXB0aW9uIG9mIHRoaXMgcHJvcGVydHkuCi0gICAgICogPHA+Ci0gICAgICogVGhpcyBkZXNjcmlwdGlvbiBpcyB1c2VkIGluIHRvb2x0aXBzLCBldGMuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIGRlc2NyaXB0aW9uKQotICAgIHsKLSAgICAgICAgX2Rlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpCi0gICAgewotICAgICAgICByZXR1cm4gX2Rlc2NyaXB0aW9uOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGxvbmcgZGVzY3JpcHRpb24gb2YgdGhpcyBwcm9wZXJ0eS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRMb25nRGVzY3JpcHRpb24oU3RyaW5nIGxvbmdEZXNjcmlwdGlvbikKLSAgICB7Ci0gICAgICAgIF9sb25nRGVzY3JpcHRpb24gPSBsb25nRGVzY3JpcHRpb247Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRMb25nRGVzY3JpcHRpb24oKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9sb25nRGVzY3JpcHRpb247Ci0gICAgfQotICAgICAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXRCb2R5Q29udGVudChTdHJpbmcgYm9keUNvbnRlbnQpCi0gICAgewotICAgICAgICB0aGlzLl9ib2R5Q29udGVudCA9IGJvZHlDb250ZW50OwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Qm9keUNvbnRlbnQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9ib2R5Q29udGVudDsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgbmFtZSB0aGF0IHRoZSB1c2VyIHdpbGwgcmVmZXIgdG8gaW5zdGFuY2VzIG9mIHRoaXMgY29tcG9uZW50IGJ5LgotICAgICAqIDxwPgotICAgICAqIEluIEpTUCB0YWdzLCB0aGlzIHZhbHVlIHdpbGwgYmUgdXNlZCBhcyB0aGUgSlNQIHRhZyBuYW1lLgotICAgICAqIDxwPgotICAgICAqIFRoaXMgcHJvcGVydHkgaXMgb3B0aW9uYWw7IGlmIG5vdCBzZXQgdGhlbiB0aGlzIE1vZGVsIGluc3RhbmNlIHJlcHJlc2VudHMKLSAgICAgKiBhIGJhc2UgY2xhc3MgdGhhdCBjb21wb25lbnRzIGNhbiBiZSBkZXJpdmVkIGZyb20sIGJ1dCB3aGljaCBjYW5ub3QgaXRzZWxmCi0gICAgICogYmUgaW5zdGFudGlhdGVkIGFzIGEgY29tcG9uZW50LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpCi0gICAgewotICAgICAgICBfbmFtZSA9IG5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfbmFtZTsKLSAgICB9Ci0gICAgICAgIAotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29tcG9uZW50Q2xhc3MoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9jb21wb25lbnRDbGFzczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRDb21wb25lbnRDbGFzcyhTdHJpbmcgY29tcG9uZW50Q2xhc3MpCi0gICAgewotICAgICAgICB0aGlzLl9jb21wb25lbnRDbGFzcyA9IGNvbXBvbmVudENsYXNzOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGFnQ2xhc3MoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF90YWdDbGFzczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRUYWdDbGFzcyhTdHJpbmcgdGFnQ2xhc3MpCi0gICAgewotICAgICAgICB0aGlzLl90YWdDbGFzcyA9IHRhZ0NsYXNzOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgU3RyaW5nIGdldENvbnZlcnRlckNsYXNzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfY29udmVydGVyQ2xhc3M7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Q29udmVydGVyQ2xhc3MoU3RyaW5nIGNvbnZlcnRlckNsYXNzKQotICAgIHsKLSAgICAgICAgdGhpcy5fY29udmVydGVyQ2xhc3MgPSBjb252ZXJ0ZXJDbGFzczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFZhbGlkYXRvckNsYXNzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfdmFsaWRhdG9yQ2xhc3M7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VmFsaWRhdG9yQ2xhc3MoU3RyaW5nIHZhbGlkYXRvckNsYXNzKQotICAgIHsKLSAgICAgICAgdGhpcy5fdmFsaWRhdG9yQ2xhc3MgPSB2YWxpZGF0b3JDbGFzczsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogCi0gICAgICogQHNpbmNlIDEuMC42Ci0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRCZWhhdmlvckNsYXNzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfYmVoYXZpb3JDbGFzczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAKLSAgICAgKiBAc2luY2UgMS4wLjYKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRCZWhhdmlvckNsYXNzKFN0cmluZyBiZWhhdmlvckNsYXNzKQotICAgIHsKLSAgICAgICAgdGhpcy5fYmVoYXZpb3JDbGFzcyA9IGJlaGF2aW9yQ2xhc3M7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHNldENvbmZpZ0V4Y2x1ZGVkKEJvb2xlYW4gY29uZmlnRXhjbHVkZWQpCi0gICAgewotICAgICAgICBfY29uZmlnRXhjbHVkZWQgPSBjb25maWdFeGNsdWRlZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQm9vbGVhbiBpc0NvbmZpZ0V4Y2x1ZGVkKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBNb2RlbFV0aWxzLmRlZmF1bHRPZihfY29uZmlnRXhjbHVkZWQsZmFsc2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZHMgYSBwcm9wZXJ0eSB0byB0aGlzIGNvbXBvbmVudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRBdHRyaWJ1dGUoQXR0cmlidXRlTWV0YSBhdHRyaWJ1dGUpCi0gICAgewotICAgICAgICBfYXR0cmlidXRlcy5wdXQoYXR0cmlidXRlLmdldE5hbWUoKSwgYXR0cmlidXRlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQXR0cmlidXRlTWV0YSBnZXRBdHRyaWJ1dGUoU3RyaW5nIGF0dHJpYnV0ZU5hbWUpCi0gICAgewotICAgICAgICByZXR1cm4gKEF0dHJpYnV0ZU1ldGEpIF9hdHRyaWJ1dGVzLmdldChhdHRyaWJ1dGVOYW1lKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBOdW1iZXIgb2YgcHJvcGVydGllcyBmb3IgdGhpcyBjb21wb25lbnQKLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGF0dHJpYnV0ZXNTaXplKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfYXR0cmlidXRlcy5zaXplKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgY29tcG9uZW50IGhhcyBhbnkgcHJvcGVydGllcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNBdHRyaWJ1dGVzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfYXR0cmlidXRlcy5zaXplKCkgPiAwOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYW4gaXRlcmF0b3IgZm9yIGFsbCBwcm9wZXJ0aWVzCi0gICAgICovCi0gICAgcHVibGljIEl0ZXJhdG9yIGF0dHJpYnV0ZXMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9hdHRyaWJ1dGVzLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0gICAgfQotICAgIAotICAgIC8vVEhJUyBNRVRIT0RTIEFSRSBVU0VEIEZPUiBWRUxPQ0lUWSBUTyBHRVQgREFUQSBBTkQgR0VORVJBVEUgQ0xBU1NFUwotICAgIAotICAgIHB1YmxpYyBDb2xsZWN0aW9uIGdldEF0dHJpYnV0ZUxpc3QoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9hdHRyaWJ1dGVzLnZhbHVlcygpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvbW9kZWwvRmFjZXRIb2xkZXIuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvbW9kZWwvRmFjZXRIb2xkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTEyZDM1MC4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL21vZGVsL0ZhY2V0SG9sZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uYnVpbGRlci5tb2RlbDsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotLyoqCi0gKiBJbnRlcmZhY2UgZm9yIGFueSBhcnRpZmFjdCB0aGF0IGhhcyBKU0YgZmFjZXRzIG9uIGl0LgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEZhY2V0SG9sZGVyCi17Ci0gICAgCi0gICAgSXRlcmF0b3IgZmFjZXRzKCk7Ci0KLSAgICBGYWNldE1ldGEgZ2V0RmFjZXQoU3RyaW5nIG5hbWUpOwotCi0gICAgdm9pZCBhZGRGYWNldChGYWNldE1ldGEgcHJvcCk7Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL21vZGVsL0ZhY2V0TWV0YS5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9tb2RlbC9GYWNldE1ldGEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2JiN2YyNy4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL21vZGVsL0ZhY2V0TWV0YS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk1ICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5idWlsZGVyLm1vZGVsOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmRpZ2VzdGVyLkRpZ2VzdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uYnVpbGRlci5pby5YbWxXcml0ZXI7Ci0KLS8qKgotICogRmFjZXRCZWFuIGlzIGEgSmF2YSByZXByZXNlbnRhdGlvbiBvZiB0aGUgZmFjZXMtY29uZmlnIGNvbXBvbmVudCBvcgotICogcmVuZGVyZXIgZmFjZXQgWE1MIGVsZW1lbnQuCi0gKi8KLXB1YmxpYyBjbGFzcyBGYWNldE1ldGEKLXsKLSAgICBwcml2YXRlIFN0cmluZyBfbG9uZ0Rlc2NyaXB0aW9uOwotICAgIHByaXZhdGUgU3RyaW5nIF9kZXNjcmlwdGlvbjsKLSAgICBwcml2YXRlIFN0cmluZyBfbmFtZTsKLSAgICBwcml2YXRlIEJvb2xlYW4gX3JlcXVpcmVkOwotICAgIAotICAgIHByaXZhdGUgQm9vbGVhbiBfaW5oZXJpdGVkOyAvL0RlZmluZSBpZiB0aGlzIGZhY2V0IGlzIGluaGVyaXRlZCBmcm9tIHBhcmVudCBjb21wb25lbnQKLSAgICBwcml2YXRlIEJvb2xlYW4gX2dlbmVyYXRlZDsgLy9EZWZpbmUgaWYgdGhpcyBmYWNldCBzaG91bGQgYmUgZ2VuZXJhdGVkCi0KLSAgICBwdWJsaWMgRmFjZXRNZXRhKCkKLSAgICB7Ci0gICAgICAgIAotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgRmFjZXRNZXRhKEZhY2V0TWV0YSBwbSkKLSAgICB7Ci0gICAgICAgIF9uYW1lID0gcG0uX25hbWU7Ci0gICAgICAgIF9yZXF1aXJlZCA9IHBtLl9yZXF1aXJlZDsKLSAgICAgICAgX2Rlc2NyaXB0aW9uID0gcG0uX2Rlc2NyaXB0aW9uOwotICAgICAgICBfbG9uZ0Rlc2NyaXB0aW9uID0gcG0uX2xvbmdEZXNjcmlwdGlvbjsKLSAgICAgICAgX2luaGVyaXRlZCA9IHBtLl9pbmhlcml0ZWQ7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFdyaXRlIHRoaXMgbW9kZWwgb3V0IGFzIHhtbC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgd3JpdGVYbWwoWG1sV3JpdGVyIG91dCwgRmFjZXRNZXRhIGFtKQotICAgIHsKLSAgICAgICAgb3V0LmJlZ2luRWxlbWVudCgiZmFjZXQiKTsKLSAgICAgICAgb3V0LndyaXRlRWxlbWVudCgibmFtZSIsIGFtLl9uYW1lKTsKLSAgICAgICAgb3V0LndyaXRlRWxlbWVudCgicmVxdWlyZWQiLCBhbS5fcmVxdWlyZWQpOwotICAgICAgICBvdXQud3JpdGVFbGVtZW50KCJkZXNjIiwgYW0uX2Rlc2NyaXB0aW9uKTsKLSAgICAgICAgb3V0LndyaXRlRWxlbWVudCgibG9uZ0Rlc2MiLCBhbS5fbG9uZ0Rlc2NyaXB0aW9uKTsKLSAgICAgICAgb3V0LndyaXRlRWxlbWVudCgiaW5oZXJpdGVkIiwgYW0uX2luaGVyaXRlZCk7Ci0gICAgICAgIG91dC5lbmRFbGVtZW50KCJmYWNldCIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZCBkaWdlc3RlciBydWxlcyB0byByZXBvcHVsYXRlIGEgTW9kZWwgaW5zdGFuY2UgZnJvbSBhbiB4bWwgZmlsZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgYWRkWG1sUnVsZXMoRGlnZXN0ZXIgZGlnZXN0ZXIsIFN0cmluZyBwcmVmaXgpCi0gICAgewotICAgICAgICBTdHJpbmcgbmV3UHJlZml4ID0gcHJlZml4ICsgIi9mYWNldCI7Ci0KLSAgICAgICAgZGlnZXN0ZXIuYWRkT2JqZWN0Q3JlYXRlKG5ld1ByZWZpeCwgRmFjZXRNZXRhLmNsYXNzKTsKLSAgICAgICAgZGlnZXN0ZXIuYWRkU2V0TmV4dChuZXdQcmVmaXgsICJhZGRGYWNldCIpOwotCi0gICAgICAgIGRpZ2VzdGVyLmFkZEJlYW5Qcm9wZXJ0eVNldHRlcihuZXdQcmVmaXggKyAiL25hbWUiKTsKLSAgICAgICAgZGlnZXN0ZXIuYWRkQmVhblByb3BlcnR5U2V0dGVyKG5ld1ByZWZpeCArICIvcmVxdWlyZWQiKTsKLSAgICAgICAgZGlnZXN0ZXIuYWRkQmVhblByb3BlcnR5U2V0dGVyKG5ld1ByZWZpeCArICIvZGVzYyIsICJkZXNjcmlwdGlvbiIpOwotICAgICAgICBkaWdlc3Rlci5hZGRCZWFuUHJvcGVydHlTZXR0ZXIobmV3UHJlZml4ICsgIi9sb25nRGVzYyIsCi0gICAgICAgICAgICAgICAgImxvbmdEZXNjcmlwdGlvbiIpOwotICAgICAgICBkaWdlc3Rlci5hZGRCZWFuUHJvcGVydHlTZXR0ZXIobmV3UHJlZml4ICsgIi9pbmhlcml0ZWQiLCAiaW5oZXJpdGVkIik7ICAgICAgICAKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNZXJnZSB0aGUgZGF0YSBpbiB0aGUgc3BlY2lmaWVkIG90aGVyIHByb3BlcnR5IGludG8gdGhpcyBvbmUsIHRocm93aW5nIGFuCi0gICAgICogZXhjZXB0aW9uIGlmIHRoZXJlIGlzIGFuIGluY29tcGF0aWJpbGl0eS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBtZXJnZShGYWNldE1ldGEgb3RoZXIpCi0gICAgewotICAgICAgICAKLSAgICAgICAgX25hbWUgPSBNb2RlbFV0aWxzLm1lcmdlKHRoaXMuX25hbWUsIG90aGVyLl9uYW1lKTsKLSAgICAgICAgX3JlcXVpcmVkID0gTW9kZWxVdGlscy5tZXJnZSh0aGlzLl9yZXF1aXJlZCwgb3RoZXIuX3JlcXVpcmVkKTsKLSAgICAgICAgX2Rlc2NyaXB0aW9uID0gTW9kZWxVdGlscy5tZXJnZSh0aGlzLl9kZXNjcmlwdGlvbiwgb3RoZXIuX2Rlc2NyaXB0aW9uKTsKLSAgICAgICAgX2xvbmdEZXNjcmlwdGlvbiA9IE1vZGVsVXRpbHMubWVyZ2UodGhpcy5fbG9uZ0Rlc2NyaXB0aW9uLCBvdGhlci5fbG9uZ0Rlc2NyaXB0aW9uKTsgICAgICAgIAotICAgIH0KLSAgICAKLSAgICAKLSAgICAKLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBmYWNldCBuYW1lIGZvciB0aGlzIGZhY2V0LgotICAgICAqCi0gICAgICogQHBhcmFtIGZhY2V0TmFtZSAgdGhlIGZhY2V0IG5hbWUKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKQotICAgIHsKLSAgICAgICAgX25hbWUgPSBuYW1lOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBmYWNldCBuYW1lIGZvciB0aGlzIGZhY2V0LgotICAgICAqCi0gICAgICogQHJldHVybiAgdGhlIGZhY2V0IG5hbWUKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9uYW1lOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGlzIHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHBhcmFtIGRlc2NyaXB0aW9uICB0aGUgcHJvcGVydHkgZGVzY3JpcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgZGVzY3JpcHRpb24pCi0gICAgewotICAgICAgICBfZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGlzIHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHJldHVybiAgdGhlIHByb3BlcnR5IGRlc2NyaXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpCi0gICAgewotICAgICAgICByZXR1cm4gX2Rlc2NyaXB0aW9uOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHJlcXVpcmVkIGZsYWcgb2YgdGhpcyBmYWNldC4KLSAgICAgKgotICAgICAqIEBwYXJhbSByZXF1aXJlZCAgdGhlIGZhY2V0IHJlcXVpcmVkIGZsYWcKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRSZXF1aXJlZChCb29sZWFuIHJlcXVpcmVkKQotICAgIHsKLSAgICAgICAgX3JlcXVpcmVkID0gcmVxdWlyZWQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyByZXF1aXJlZCBmbGFnIG9mIHRoaXMgZmFjZXQuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuICB0aGUgZmFjZXQgcmVxdWlyZWQgZmxhZwotICAgICAqLwotICAgIHB1YmxpYyBCb29sZWFuIGlzUmVxdWlyZWQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE1vZGVsVXRpbHMuZGVmYXVsdE9mKF9yZXF1aXJlZCxmYWxzZSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHNldExvbmdEZXNjcmlwdGlvbihTdHJpbmcgZGVzYykKLSAgICB7Ci0gICAgICAgIF9sb25nRGVzY3JpcHRpb24gPSBkZXNjOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TG9uZ0Rlc2NyaXB0aW9uKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfbG9uZ0Rlc2NyaXB0aW9uOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXRJbmhlcml0ZWQoQm9vbGVhbiBpbmhlcml0ZWQpCi0gICAgewotICAgICAgICBfaW5oZXJpdGVkID0gaW5oZXJpdGVkOwotICAgIH0KLQotICAgIHB1YmxpYyBCb29sZWFuIGlzSW5oZXJpdGVkKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBNb2RlbFV0aWxzLmRlZmF1bHRPZihfaW5oZXJpdGVkLCBmYWxzZSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHNldEdlbmVyYXRlZChCb29sZWFuIGdlbmVyYXRlZCkKLSAgICB7Ci0gICAgICAgIF9nZW5lcmF0ZWQgPSBnZW5lcmF0ZWQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW5kaWNhdGVzIGlmIHRoZSBwcm9wZXJ0eSBzaG91bGQgYmUgZ2VuZXJhdGVkCi0gICAgICogb3Igbm90LgotICAgICAqIAotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwdWJsaWMgQm9vbGVhbiBpc0dlbmVyYXRlZCgpCi0gICAgewotICAgICAgICByZXR1cm4gTW9kZWxVdGlscy5kZWZhdWx0T2YoX2dlbmVyYXRlZCwgZmFsc2UpOwotICAgIH0KLSAgICAKLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvbW9kZWwvTGlzdGVuZXJIb2xkZXIuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvbW9kZWwvTGlzdGVuZXJIb2xkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjIzZDAwNy4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL21vZGVsL0xpc3RlbmVySG9sZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKg0KLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICogDQotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqIA0KLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqICB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uYnVpbGRlci5tb2RlbDsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOw0KLQ0KLS8qKg0KLSAqIEludGVyZmFjZSBmb3IgYW55IGFydGlmYWN0IHRoYXQgaGFzIEpTRiBsaXN0ZW5lciBvbiBpdC4NCi0gKiANCi0gKiBAc2luY2UgMS4wLjQNCi0gKiBAYXV0aG9yIExlb25hcmRvIFVyaWJlIChsYXRlc3QgbW9kaWZpY2F0aW9uIGJ5ICRBdXRob3I6IGx1NDI0MiAkKQ0KLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogNzk2NjA3ICQgJERhdGU6IDIwMDktMDctMjEgMjI6MDA6MzAgLTA1MDAgKG1hciwgMjEganVsIDIwMDkpICQNCi0gKi8NCi1wdWJsaWMgaW50ZXJmYWNlIExpc3RlbmVySG9sZGVyDQotew0KLSAgICANCi0gICAgSXRlcmF0b3IgbGlzdGVuZXJzKCk7DQotDQotICAgIExpc3RlbmVyTWV0YSBnZXRMaXN0ZW5lcihTdHJpbmcgbmFtZSk7DQotDQotICAgIHZvaWQgYWRkTGlzdGVuZXIoTGlzdGVuZXJNZXRhIHByb3ApOw0KLX0NCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL21vZGVsL0xpc3RlbmVyTWV0YS5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9tb2RlbC9MaXN0ZW5lck1ldGEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTA1NzUwNC4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL21vZGVsL0xpc3RlbmVyTWV0YS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ3ICswLDAgQEAKLS8qDQotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKiANCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICogDQotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5idWlsZGVyLm1vZGVsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuZGlnZXN0ZXIuRGlnZXN0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uYnVpbGRlci5pby5YbWxXcml0ZXI7DQotDQotLyoqDQotICogDQotICogQHNpbmNlIDEuMC40DQotICogQGF1dGhvciBMZW9uYXJkbyBVcmliZSAobGF0ZXN0IG1vZGlmaWNhdGlvbiBieSAkQXV0aG9yOiBsdTQyNDIgJCkNCi0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDc5NjYwNyAkICREYXRlOiAyMDA5LTA3LTIxIDIyOjAwOjMwIC0wNTAwIChtYXIsIDIxIGp1bCAyMDA5KSAkDQotICovDQotcHVibGljIGNsYXNzIExpc3RlbmVyTWV0YQ0KLXsNCi0gICAgcHJpdmF0ZSBTdHJpbmcgX2xvbmdEZXNjcmlwdGlvbjsNCi0gICAgcHJpdmF0ZSBTdHJpbmcgX2Rlc2NyaXB0aW9uOw0KLSAgICBwcml2YXRlIFN0cmluZyBfbmFtZTsNCi0gICAgcHJpdmF0ZSBCb29sZWFuIF9yZXF1aXJlZDsNCi0gICAgDQotICAgIHByaXZhdGUgQm9vbGVhbiBfaW5oZXJpdGVkOyAvL0RlZmluZSBpZiB0aGlzIGZhY2V0IGlzIGluaGVyaXRlZCBmcm9tIHBhcmVudCBjb21wb25lbnQNCi0gICAgcHJpdmF0ZSBCb29sZWFuIF9nZW5lcmF0ZWQ7IC8vRGVmaW5lIGlmIHRoaXMgZmFjZXQgc2hvdWxkIGJlIGdlbmVyYXRlZA0KLSAgICANCi0gICAgcHJpdmF0ZSBTdHJpbmcgX2NsYXNzTmFtZTsNCi0gICAgcHJpdmF0ZSBTdHJpbmcgX2V2ZW50Q2xhc3NOYW1lOw0KLSAgICBwcml2YXRlIFN0cmluZyBfcGhhc2VzOw0KLQ0KLSAgICBwdWJsaWMgTGlzdGVuZXJNZXRhKCkNCi0gICAgew0KLSAgICAgICAgDQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyBMaXN0ZW5lck1ldGEoTGlzdGVuZXJNZXRhIHBtKQ0KLSAgICB7DQotICAgICAgICBfbmFtZSA9IHBtLl9uYW1lOw0KLSAgICAgICAgX2NsYXNzTmFtZSA9IHBtLl9jbGFzc05hbWU7DQotICAgICAgICBfZXZlbnRDbGFzc05hbWUgPSBwbS5fZXZlbnRDbGFzc05hbWU7DQotICAgICAgICBfcmVxdWlyZWQgPSBwbS5fcmVxdWlyZWQ7DQotICAgICAgICBfZGVzY3JpcHRpb24gPSBwbS5fZGVzY3JpcHRpb247DQotICAgICAgICBfbG9uZ0Rlc2NyaXB0aW9uID0gcG0uX2xvbmdEZXNjcmlwdGlvbjsNCi0gICAgICAgIF9waGFzZXMgPSBwbS5fcGhhc2VzOw0KLSAgICAgICAgX2luaGVyaXRlZCA9IHBtLl9pbmhlcml0ZWQ7DQotICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBXcml0ZSB0aGlzIG1vZGVsIG91dCBhcyB4bWwuDQotICAgICAqLw0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgd3JpdGVYbWwoWG1sV3JpdGVyIG91dCwgTGlzdGVuZXJNZXRhIGFtKQ0KLSAgICB7DQotICAgICAgICBvdXQuYmVnaW5FbGVtZW50KCJsaXN0ZW5lciIpOw0KLSAgICAgICAgb3V0LndyaXRlRWxlbWVudCgibmFtZSIsIGFtLl9uYW1lKTsNCi0gICAgICAgIG91dC53cml0ZUVsZW1lbnQoImNsYXNzTmFtZSIsIGFtLl9jbGFzc05hbWUpOw0KLSAgICAgICAgb3V0LndyaXRlRWxlbWVudCgiZXZlbnRDbGFzc05hbWUiLCBhbS5fZXZlbnRDbGFzc05hbWUpOw0KLSAgICAgICAgb3V0LndyaXRlRWxlbWVudCgicmVxdWlyZWQiLCBhbS5fcmVxdWlyZWQpOw0KLSAgICAgICAgb3V0LndyaXRlRWxlbWVudCgiZGVzYyIsIGFtLl9kZXNjcmlwdGlvbik7DQotICAgICAgICBvdXQud3JpdGVFbGVtZW50KCJsb25nRGVzYyIsIGFtLl9sb25nRGVzY3JpcHRpb24pOw0KLSAgICAgICAgb3V0LndyaXRlRWxlbWVudCgicGhhc2VzIiwgYW0uX3BoYXNlcyk7DQotICAgICAgICBvdXQud3JpdGVFbGVtZW50KCJpbmhlcml0ZWQiLCBhbS5faW5oZXJpdGVkKTsNCi0gICAgICAgIG91dC5lbmRFbGVtZW50KCJsaXN0ZW5lciIpOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBBZGQgZGlnZXN0ZXIgcnVsZXMgdG8gcmVwb3B1bGF0ZSBhIE1vZGVsIGluc3RhbmNlIGZyb20gYW4geG1sIGZpbGUuDQotICAgICAqLw0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgYWRkWG1sUnVsZXMoRGlnZXN0ZXIgZGlnZXN0ZXIsIFN0cmluZyBwcmVmaXgpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBuZXdQcmVmaXggPSBwcmVmaXggKyAiL2xpc3RlbmVyIjsNCi0NCi0gICAgICAgIGRpZ2VzdGVyLmFkZE9iamVjdENyZWF0ZShuZXdQcmVmaXgsIExpc3RlbmVyTWV0YS5jbGFzcyk7DQotICAgICAgICBkaWdlc3Rlci5hZGRTZXROZXh0KG5ld1ByZWZpeCwgImFkZExpc3RlbmVyIik7DQotDQotICAgICAgICBkaWdlc3Rlci5hZGRCZWFuUHJvcGVydHlTZXR0ZXIobmV3UHJlZml4ICsgIi9uYW1lIik7DQotICAgICAgICBkaWdlc3Rlci5hZGRCZWFuUHJvcGVydHlTZXR0ZXIobmV3UHJlZml4ICsgIi9jbGFzc05hbWUiKTsNCi0gICAgICAgIGRpZ2VzdGVyLmFkZEJlYW5Qcm9wZXJ0eVNldHRlcihuZXdQcmVmaXggKyAiL2V2ZW50Q2xhc3NOYW1lIik7DQotICAgICAgICBkaWdlc3Rlci5hZGRCZWFuUHJvcGVydHlTZXR0ZXIobmV3UHJlZml4ICsgIi9yZXF1aXJlZCIpOw0KLSAgICAgICAgZGlnZXN0ZXIuYWRkQmVhblByb3BlcnR5U2V0dGVyKG5ld1ByZWZpeCArICIvZGVzYyIsICJkZXNjcmlwdGlvbiIpOw0KLSAgICAgICAgZGlnZXN0ZXIuYWRkQmVhblByb3BlcnR5U2V0dGVyKG5ld1ByZWZpeCArICIvbG9uZ0Rlc2MiLA0KLSAgICAgICAgICAgICAgICAibG9uZ0Rlc2NyaXB0aW9uIik7DQotICAgICAgICBkaWdlc3Rlci5hZGRCZWFuUHJvcGVydHlTZXR0ZXIobmV3UHJlZml4ICsgIi9waGFzZXMiLCAicGhhc2VzIik7DQotICAgICAgICBkaWdlc3Rlci5hZGRCZWFuUHJvcGVydHlTZXR0ZXIobmV3UHJlZml4ICsgIi9pbmhlcml0ZWQiLCAiaW5oZXJpdGVkIik7ICAgICAgICANCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogTWVyZ2UgdGhlIGRhdGEgaW4gdGhlIHNwZWNpZmllZCBvdGhlciBwcm9wZXJ0eSBpbnRvIHRoaXMgb25lLCB0aHJvd2luZyBhbg0KLSAgICAgKiBleGNlcHRpb24gaWYgdGhlcmUgaXMgYW4gaW5jb21wYXRpYmlsaXR5Lg0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgbWVyZ2UoTGlzdGVuZXJNZXRhIG90aGVyKQ0KLSAgICB7DQotICAgICAgICANCi0gICAgICAgIF9uYW1lID0gTW9kZWxVdGlscy5tZXJnZSh0aGlzLl9uYW1lLCBvdGhlci5fbmFtZSk7DQotICAgICAgICBfcmVxdWlyZWQgPSBNb2RlbFV0aWxzLm1lcmdlKHRoaXMuX3JlcXVpcmVkLCBvdGhlci5fcmVxdWlyZWQpOw0KLSAgICAgICAgX2Rlc2NyaXB0aW9uID0gTW9kZWxVdGlscy5tZXJnZSh0aGlzLl9kZXNjcmlwdGlvbiwgb3RoZXIuX2Rlc2NyaXB0aW9uKTsNCi0gICAgICAgIF9sb25nRGVzY3JpcHRpb24gPSBNb2RlbFV0aWxzLm1lcmdlKHRoaXMuX2xvbmdEZXNjcmlwdGlvbiwgb3RoZXIuX2xvbmdEZXNjcmlwdGlvbik7DQotICAgICAgICBfcGhhc2VzID0gTW9kZWxVdGlscy5tZXJnZSh0aGlzLl9waGFzZXMsIG90aGVyLl9waGFzZXMpOw0KLSAgICB9DQotICAgIA0KLSAgICANCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBTZXRzIHRoZSBsaXN0ZW5lciBuYW1lIGZvciB0aGlzIGxpc3RlbmVyLg0KLSAgICAgKg0KLSAgICAgKiBAcGFyYW0gbmFtZSAgdGhlIGxpc3RlbmVyIG5hbWUNCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpDQotICAgIHsNCi0gICAgICAgIF9uYW1lID0gbmFtZTsNCi0gICAgfQ0KLSAgICANCi0gICAgLyoqDQotICAgICAqIFJldHVybnMgdGhlIGxpc3RlbmVyIG5hbWUgZm9yIHRoaXMgbGlzdGVuZXIuDQotICAgICAqDQotICAgICAqIEByZXR1cm4gIHRoZSBsaXN0ZW5lciBuYW1lDQotICAgICAqLw0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gX25hbWU7DQotICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBUaGUgZnVsbHktcXVhbGlmaWVkIG5hbWUgb2YgdGhlIEpTRiBlbnRpdHkgY2xhc3MsIGllIHRoZSBjbGFzcyB0aGF0IGFjdHVhbGx5DQotICAgICAqIGltcGxlbWVudHMgYSBMaXN0ZW5lci4NCi0gICAgICogPHA+DQotICAgICAqIFRoZSBzcGVjaWZpZWQgY2xhc3MgbWF5IGJlIGEgaGFuZC13cml0dGVuIG9uZSwgb3Igb25lIGNyZWF0ZWQgdmlhIGNvZGUgZ2VuZXJhdGlvbi4gDQotICAgICAqLw0KLSAgICBwdWJsaWMgU3RyaW5nIGdldENsYXNzTmFtZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBfY2xhc3NOYW1lOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldENsYXNzTmFtZShTdHJpbmcgY2xhc3NOYW1lKQ0KLSAgICB7DQotICAgICAgICBfY2xhc3NOYW1lID0gY2xhc3NOYW1lOw0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogU2V0cyB0aGUgZGVzY3JpcHRpb24gb2YgdGhpcyBwcm9wZXJ0eS4NCi0gICAgICoNCi0gICAgICogQHBhcmFtIGRlc2NyaXB0aW9uICB0aGUgcHJvcGVydHkgZGVzY3JpcHRpb24NCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyBkZXNjcmlwdGlvbikNCi0gICAgew0KLSAgICAgICAgX2Rlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIFJldHVybnMgdGhlIGRlc2NyaXB0aW9uIG9mIHRoaXMgcHJvcGVydHkuDQotICAgICAqDQotICAgICAqIEByZXR1cm4gIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdGlvbg0KLSAgICAgKi8NCi0gICAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBfZGVzY3JpcHRpb247DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIFNldHMgdGhlIHJlcXVpcmVkIGZsYWcgb2YgdGhpcyBmYWNldC4NCi0gICAgICoNCi0gICAgICogQHBhcmFtIHJlcXVpcmVkICB0aGUgZmFjZXQgcmVxdWlyZWQgZmxhZw0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgc2V0UmVxdWlyZWQoQm9vbGVhbiByZXF1aXJlZCkNCi0gICAgew0KLSAgICAgICAgX3JlcXVpcmVkID0gcmVxdWlyZWQ7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIFJldHVybnMgcmVxdWlyZWQgZmxhZyBvZiB0aGlzIGZhY2V0Lg0KLSAgICAgKg0KLSAgICAgKiBAcmV0dXJuICB0aGUgZmFjZXQgcmVxdWlyZWQgZmxhZw0KLSAgICAgKi8NCi0gICAgcHVibGljIEJvb2xlYW4gaXNSZXF1aXJlZCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBNb2RlbFV0aWxzLmRlZmF1bHRPZihfcmVxdWlyZWQsZmFsc2UpOw0KLSAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgdm9pZCBzZXRMb25nRGVzY3JpcHRpb24oU3RyaW5nIGRlc2MpDQotICAgIHsNCi0gICAgICAgIF9sb25nRGVzY3JpcHRpb24gPSBkZXNjOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TG9uZ0Rlc2NyaXB0aW9uKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIF9sb25nRGVzY3JpcHRpb247DQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyB2b2lkIHNldEluaGVyaXRlZChCb29sZWFuIGluaGVyaXRlZCkNCi0gICAgew0KLSAgICAgICAgX2luaGVyaXRlZCA9IGluaGVyaXRlZDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgQm9vbGVhbiBpc0luaGVyaXRlZCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBNb2RlbFV0aWxzLmRlZmF1bHRPZihfaW5oZXJpdGVkLCBmYWxzZSk7DQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyB2b2lkIHNldEdlbmVyYXRlZChCb29sZWFuIGdlbmVyYXRlZCkNCi0gICAgew0KLSAgICAgICAgX2dlbmVyYXRlZCA9IGdlbmVyYXRlZDsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogSW5kaWNhdGVzIGlmIHRoZSBwcm9wZXJ0eSBzaG91bGQgYmUgZ2VuZXJhdGVkDQotICAgICAqIG9yIG5vdC4NCi0gICAgICogDQotICAgICAqIEByZXR1cm4NCi0gICAgICovDQotICAgIHB1YmxpYyBCb29sZWFuIGlzR2VuZXJhdGVkKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIE1vZGVsVXRpbHMuZGVmYXVsdE9mKF9nZW5lcmF0ZWQsIGZhbHNlKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRFdmVudENsYXNzTmFtZShTdHJpbmcgZXZlbnRDbGFzc05hbWUpDQotICAgIHsNCi0gICAgICAgIF9ldmVudENsYXNzTmFtZSA9IGV2ZW50Q2xhc3NOYW1lOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RXZlbnRDbGFzc05hbWUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gX2V2ZW50Q2xhc3NOYW1lOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldFBoYXNlcyhTdHJpbmcgcGhhc2VzKQ0KLSAgICB7DQotICAgICAgICBfcGhhc2VzID0gcGhhc2VzOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGhhc2VzKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIF9waGFzZXM7DQotICAgIH0NCi0gICAgDQotfQ0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvbW9kZWwvTWV0aG9kU2lnbmF0dXJlTWV0YS5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9tb2RlbC9NZXRob2RTaWduYXR1cmVNZXRhLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjNDM0MGMuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9tb2RlbC9NZXRob2RTaWduYXR1cmVNZXRhLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjQgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmJ1aWxkZXIubW9kZWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuZGlnZXN0ZXIuRGlnZXN0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5idWlsZGVyLmlvLlhtbFdyaXRlcjsKLQotLyoqCi0gKiBNZXRob2RTaWduYXR1cmVNZXRhIGlzIGEgSmF2YSByZXByZXNlbnRhdGlvbiBvZiB0aGUgZmFjZXMtY29uZmlnIGNvbXBvbmVudAotICogcHJvcGVydHktZXh0ZW5zaW9uIG1ldGhvZC1zaWduYXR1cmUgWE1MIGVsZW1lbnQuCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXRob2RTaWduYXR1cmVNZXRhIGV4dGVuZHMgT2JqZWN0Ci17Ci0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBNZXRob2RTaWduYXR1cmVCZWFuLgotICAgICAqLwotICAgIHB1YmxpYyBNZXRob2RTaWduYXR1cmVNZXRhKCkKLSAgICB7Ci0gICAgICAgIF9wYXJhbWV0ZXJUeXBlcyA9IG5ldyBMaW5rZWRMaXN0KCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhZGRYbWxSdWxlcyhEaWdlc3RlciBkaWdlc3RlciwgU3RyaW5nIHByZWZpeCkKLSAgICB7Ci0gICAgICAgIFN0cmluZyBuZXdQcmVmaXggPSBwcmVmaXggKyAiL21ldGhvZEJpbmRpbmdTaWduYXR1cmUiOwotICAgICAgICBkaWdlc3Rlci5hZGRPYmplY3RDcmVhdGUobmV3UHJlZml4ICwgTWV0aG9kU2lnbmF0dXJlTWV0YS5jbGFzcyk7Ci0gICAgICAgIGRpZ2VzdGVyLmFkZEJlYW5Qcm9wZXJ0eVNldHRlcihuZXdQcmVmaXggKyIvcmV0dXJuVHlwZSIsICJyZXR1cm5UeXBlIik7Ci0gICAgICAgIGRpZ2VzdGVyLmFkZENhbGxNZXRob2QobmV3UHJlZml4ICsiL3BhcmFtZXRlclR5cGUiLCJhZGRQYXJhbWV0ZXJUeXBlIiwgMSk7Ci0gICAgICAgIGRpZ2VzdGVyLmFkZENhbGxQYXJhbShuZXdQcmVmaXggKyIvcGFyYW1ldGVyVHlwZSIsIDApOwotICAgICAgICBkaWdlc3Rlci5hZGRTZXROZXh0KG5ld1ByZWZpeCAsInNldE1ldGhvZEJpbmRpbmdTaWduYXR1cmUiLCBNZXRob2RTaWduYXR1cmVNZXRhLmNsYXNzLmdldE5hbWUoKSk7Ci0gICAgICAgIAotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgd3JpdGVYbWwoWG1sV3JpdGVyIG91dCwgTWV0aG9kU2lnbmF0dXJlTWV0YSBwbSkKLSAgICB7Ci0gICAgICAgIG91dC5iZWdpbkVsZW1lbnQoIm1ldGhvZEJpbmRpbmdTaWduYXR1cmUiKTsKLSAgICAgICAgb3V0LndyaXRlRWxlbWVudCgicmV0dXJuVHlwZSIsIHBtLl9yZXR1cm5UeXBlKTsKLSAgICAgICAgCi0gICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IHBtLl9wYXJhbWV0ZXJUeXBlcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyBwYXJhbSA9IChTdHJpbmcpIGkubmV4dCgpOwotICAgICAgICAgICAgb3V0LndyaXRlRWxlbWVudCgicGFyYW1ldGVyVHlwZSIsIHBhcmFtKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgb3V0LmVuZEVsZW1lbnQoIm1ldGhvZEJpbmRpbmdTaWduYXR1cmUiKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIGEgbmV3IHBhcmFtZXRlciB0eXBlIHRvIHRoaXMgbWV0aG9kIHNpZ25hdHVyZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwYXJhbWV0ZXJUeXBlICB0aGUgcGFyYW1ldGVyIHR5cGUKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRQYXJhbWV0ZXJUeXBlKFN0cmluZyBwYXJhbWV0ZXJUeXBlKQotICAgIHsKLSAgICAgICAgX3BhcmFtZXRlclR5cGVzLmFkZChwYXJhbWV0ZXJUeXBlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBsaXN0IG9mIHBhcmFtZXRlciB0eXBlcyBhcyBhbiBhcnJheS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gIHRoZSBwYXJhbWV0ZXIgdHlwZSBsaXN0Ci0gICAgICovCi0gICAgcHVibGljIFN0cmluZ1tdIGdldFBhcmFtZXRlclR5cGVzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoU3RyaW5nW10pIF9wYXJhbWV0ZXJUeXBlcy50b0FycmF5KG5ldyBTdHJpbmdbMF0pOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgU3RyaW5nIGdldFBhcmFtZXRlclR5cGVzQXNTdHJpbmcoKQotICAgIHsKLSAgICAgICAgU3RyaW5nW10gcGFyYW1zID0gdGhpcy5nZXRQYXJhbWV0ZXJUeXBlcygpOwotICAgICAgICBTdHJpbmdCdWZmZXIgcmVzcCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsgCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFyYW1zLmxlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKGkgPiAwKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJlc3AuYXBwZW5kKCIsICIpOwotICAgICAgICAgIH0KLSAgICAgICAgICByZXNwLmFwcGVuZChwYXJhbXNbaV0pOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXNwLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgcmV0dXJuIHR5cGUgb2YgdGhpcyBtZXRob2Qgc2lnbmF0dXJlLgotICAgICAqCi0gICAgICogQHBhcmFtIHJldHVyblR5cGUgIHRoZSBtZXRob2Qgc2lnbmF0dXJlIHJldHVybiB0eXBlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UmV0dXJuVHlwZShTdHJpbmcgcmV0dXJuVHlwZSkKLSAgICB7Ci0gICAgICAgIF9yZXR1cm5UeXBlID0gcmV0dXJuVHlwZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSByZXR1cm4gdHlwZSBvZiB0aGlzIG1ldGhvZCBzaWduYXR1cmUuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuICB0aGUgbWV0aG9kIHNpZ25hdHVyZSByZXR1cm4gdHlwZQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmV0dXJuVHlwZSgpCi0gICAgewotICAgICAgICByZXR1cm4gX3JldHVyblR5cGU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgX3JldHVyblR5cGU7Ci0gICAgcHJpdmF0ZSBMaXN0IF9wYXJhbWV0ZXJUeXBlczsKLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvbW9kZWwvTW9kZWwuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvbW9kZWwvTW9kZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Y5ZTI3NS4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL21vZGVsL01vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NDggKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmJ1aWxkZXIubW9kZWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5UcmVlTWFwOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmRpZ2VzdGVyLkRpZ2VzdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uYnVpbGRlci5pby5YbWxXcml0ZXI7Ci0KLS8qKgotICogU3RvcmVzIGluZm8gYWJvdXQgYWxsIG9mIHRoZSBqc2YgYXJ0aWZhY3RzIGluIHRoZSBzeXN0ZW0gYmVpbmcgcHJvY2Vzc2VkLgotICovCi1wdWJsaWMgY2xhc3MgTW9kZWwKLXsKLQotICAgIHByaXZhdGUgTGlzdCBfY29tcG9uZW50cyA9IG5ldyBBcnJheUxpc3QoMTAwKTsKLSAgICBwcml2YXRlIExpc3QgX2NvbnZlcnRlcnMgPSBuZXcgQXJyYXlMaXN0KDEwMCk7Ci0gICAgcHJpdmF0ZSBMaXN0IF9iZWhhdmlvcnMgPSBuZXcgQXJyYXlMaXN0KDEwMCk7Ci0gICAgcHJpdmF0ZSBMaXN0IF92YWxpZGF0b3JzID0gbmV3IEFycmF5TGlzdCgxMDApOwotICAgIHByaXZhdGUgTGlzdCBfcmVuZGVyS2l0cyA9IG5ldyBBcnJheUxpc3QoMTAwKTsKLSAgICBwcml2YXRlIExpc3QgX3RhZ3MgPSBuZXcgQXJyYXlMaXN0KDEwMCk7Ci0gICAgcHJpdmF0ZSBMaXN0IF9mYWNlbGV0VGFncyA9IG5ldyBBcnJheUxpc3QoMTAwKTsKLSAgICBwcml2YXRlIExpc3QgX3dlYkNvbmZpZ3MgPSBuZXcgQXJyYXlMaXN0KDEwKTsKLQotICAgIHByaXZhdGUgTWFwIF9jb21wb25lbnRzQnlDbGFzcyA9IG5ldyBUcmVlTWFwKCk7Ci0gICAgcHJpdmF0ZSBNYXAgX2NvbnZlcnRlcnNCeUNsYXNzID0gbmV3IFRyZWVNYXAoKTsKLSAgICBwcml2YXRlIE1hcCBfYmVoYXZpb3JzQnlDbGFzcyA9IG5ldyBUcmVlTWFwKCk7Ci0gICAgcHJpdmF0ZSBNYXAgX3ZhbGlkYXRvcnNCeUNsYXNzID0gbmV3IFRyZWVNYXAoKTsKLSAgICBwcml2YXRlIE1hcCBfcmVuZGVyS2l0c0J5SWQgPSBuZXcgVHJlZU1hcCgpOwotICAgIHByaXZhdGUgTWFwIF90YWdzQnlDbGFzcyA9ICBuZXcgVHJlZU1hcCgpOwotICAgIHByaXZhdGUgTWFwIF9mYWNlbGV0VGFnc0J5Q2xhc3MgPSAgbmV3IFRyZWVNYXAoKTsKLSAgICBwcml2YXRlIE1hcCBfY29tcG9uZW50c0J5VGFnQ2xhc3MgPSBuZXcgVHJlZU1hcCgpOwotICAgIHByaXZhdGUgTWFwIF9mYWNlbGV0VGFnc0J5TmFtZSA9IG5ldyBUcmVlTWFwKCk7Ci0gICAgcHJpdmF0ZSBNYXAgX3dlYkNvbmZpZ3NCeU1vZGVsSWQgPSBuZXcgVHJlZU1hcCgpOwotICAgIAotICAgIHByaXZhdGUgTWFwIF9jb21wb25lbnRzQnlUeXBlID0gbmV3IFRyZWVNYXAoKTsKLSAgICAKLSAgICBwcml2YXRlIFN0cmluZyBfbW9kZWxJZDsKLQotICAgIC8qKgotICAgICAqIFdyaXRlIHRoaXMgbW9kZWwgb3V0IGFzIHhtbC4KLSAgICAgKiA8cD4KLSAgICAgKiBIYXZpbmcgYSBoYW5kLWNvZGVkIG1ldGhvZCBsaWtlIHRoaXMgaXMgbm90IHZlcnkgZWxlZ2FudDsgaXQgd291bGQgYmUKLSAgICAgKiBiZXR0ZXIgdG8gZG8gdGhpcyB2aWEgc29tZSBsaWJyYXJ5IGxpa2UgQmV0d2l4dC4gSG93ZXZlciBJJ20gbm90IHZlcnkKLSAgICAgKiBmYW1pbGlhciB3aXRoIHN1Y2ggbGlicywgc28gaGFuZC1jb2RpbmcgaXMgcXVpY2tlciBmb3Igbm93LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB3cml0ZVhtbChYbWxXcml0ZXIgb3V0LCBNb2RlbCBtb2RlbCkKLSAgICB7Ci0gICAgICAgIG91dC5iZWdpbkVsZW1lbnQoIm1vZGVsIik7Ci0gICAgICAgIG91dC53cml0ZUVsZW1lbnQoIm1vZGVsSWQiLCBtb2RlbC5fbW9kZWxJZCk7Ci0KLSAgICAgICAgZm9yIChJdGVyYXRvciBpID0gbW9kZWwuX2NvbXBvbmVudHMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgICAgICB7Ci0gICAgICAgICAgICBDb21wb25lbnRNZXRhIGMgPSAoQ29tcG9uZW50TWV0YSkgaS5uZXh0KCk7Ci0gICAgICAgICAgICBjLndyaXRlWG1sKG91dCk7Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBtb2RlbC5fY29udmVydGVycy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgICAgIHsKLSAgICAgICAgICAgIENvbnZlcnRlck1ldGEgYyA9IChDb252ZXJ0ZXJNZXRhKSBpLm5leHQoKTsKLSAgICAgICAgICAgIGMud3JpdGVYbWwob3V0KTsKLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IG1vZGVsLl92YWxpZGF0b3JzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICAgICAgewotICAgICAgICAgICAgVmFsaWRhdG9yTWV0YSBjID0gKFZhbGlkYXRvck1ldGEpIGkubmV4dCgpOwotICAgICAgICAgICAgYy53cml0ZVhtbChvdXQpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBtb2RlbC5fYmVoYXZpb3JzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICAgICAgewotICAgICAgICAgICAgQmVoYXZpb3JNZXRhIGMgPSAoQmVoYXZpb3JNZXRhKSBpLm5leHQoKTsKLSAgICAgICAgICAgIGMud3JpdGVYbWwob3V0KTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgZm9yIChJdGVyYXRvciBpID0gbW9kZWwuX3JlbmRlcktpdHMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgICAgICB7Ci0gICAgICAgICAgICBSZW5kZXJLaXRNZXRhIGMgPSAoUmVuZGVyS2l0TWV0YSkgaS5uZXh0KCk7Ci0gICAgICAgICAgICBSZW5kZXJLaXRNZXRhLndyaXRlWG1sKG91dCwgYyk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IG1vZGVsLl90YWdzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICAgICAgewotICAgICAgICAgICAgVGFnTWV0YSBjID0gKFRhZ01ldGEpIGkubmV4dCgpOwotICAgICAgICAgICAgYy53cml0ZVhtbChvdXQpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBtb2RlbC5fZmFjZWxldFRhZ3MuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgICAgICB7Ci0gICAgICAgICAgICBGYWNlbGV0VGFnTWV0YSBjID0gKEZhY2VsZXRUYWdNZXRhKSBpLm5leHQoKTsKLSAgICAgICAgICAgIGMud3JpdGVYbWwob3V0KTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgZm9yIChJdGVyYXRvciBpID0gbW9kZWwuX3dlYkNvbmZpZ3MuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgICAgICB7Ci0gICAgICAgICAgICBXZWJDb25maWdNZXRhIGMgPSAoV2ViQ29uZmlnTWV0YSkgaS5uZXh0KCk7Ci0gICAgICAgICAgICBjLndyaXRlWG1sKG91dCk7Ci0gICAgICAgIH0KLQotICAgICAgICBvdXQuZW5kRWxlbWVudCgibW9kZWwiKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGQgZGlnZXN0ZXIgcnVsZXMgdG8gcmVwb3B1bGF0ZSBhIE1vZGVsIGluc3RhbmNlIGZyb20gYW4geG1sIGZpbGUuCi0gICAgICogPHA+Ci0gICAgICogSGF2aW5nIGEgaGFuZC1jb2RlZCBtZXRob2QgbGlrZSB0aGlzIGlzIG5vdCB2ZXJ5IGVsZWdhbnQ7IGl0IHdvdWxkIGJlCi0gICAgICogYmV0dGVyIHRvIGRvIHRoaXMgdmlhIHNvbWUgbGlicmFyeSBsaWtlIEJldHdpeHQuIEhvd2V2ZXIgSSdtIG5vdCB2ZXJ5Ci0gICAgICogZmFtaWxpYXIgd2l0aCBzdWNoIGxpYnMsIHNvIGhhbmQtY29kaW5nIGlzIHF1aWNrZXIgZm9yIG5vdy4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgYWRkWG1sUnVsZXMoRGlnZXN0ZXIgZGlnZXN0ZXIpCi0gICAgewotICAgICAgICBTdHJpbmcgcHJlZml4ID0gIm1vZGVsIjsKLQotICAgICAgICBkaWdlc3Rlci5hZGRPYmplY3RDcmVhdGUocHJlZml4LCBNb2RlbC5jbGFzcyk7Ci0gICAgICAgIGRpZ2VzdGVyLmFkZEJlYW5Qcm9wZXJ0eVNldHRlcihwcmVmaXggKyAiL21vZGVsSWQiKTsKLSAgICAgICAgQ29tcG9uZW50TWV0YS5hZGRYbWxSdWxlcyhkaWdlc3RlciwgcHJlZml4KTsKLSAgICAgICAgQ29udmVydGVyTWV0YS5hZGRYbWxSdWxlcyhkaWdlc3RlciwgcHJlZml4KTsKLSAgICAgICAgVmFsaWRhdG9yTWV0YS5hZGRYbWxSdWxlcyhkaWdlc3RlciwgcHJlZml4KTsKLSAgICAgICAgQmVoYXZpb3JNZXRhLmFkZFhtbFJ1bGVzKGRpZ2VzdGVyLCBwcmVmaXgpOwotICAgICAgICBDbGllbnRCZWhhdmlvck1ldGEuYWRkWG1sUnVsZXMoZGlnZXN0ZXIsIHByZWZpeCk7ICAgICAgICAKLSAgICAgICAgUmVuZGVyS2l0TWV0YS5hZGRYbWxSdWxlcyhkaWdlc3RlciwgcHJlZml4KTsKLSAgICAgICAgQ2xpZW50QmVoYXZpb3JSZW5kZXJlck1ldGEuYWRkWG1sUnVsZXMoZGlnZXN0ZXIsIHByZWZpeCk7Ci0gICAgICAgIFRhZ01ldGEuYWRkWG1sUnVsZXMoZGlnZXN0ZXIsIHByZWZpeCk7Ci0gICAgICAgIEZhY2VsZXRUYWdNZXRhLmFkZFhtbFJ1bGVzKGRpZ2VzdGVyLCBwcmVmaXgpOwotICAgICAgICBXZWJDb25maWdNZXRhLmFkZFhtbFJ1bGVzKGRpZ2VzdGVyLCBwcmVmaXgpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBBZGRzIGFsbCBjb21wb25lbnRzIGZyb20gdGhlIG90aGVyIG1vZGVsIHRvIHRoaXMgbW9kZWwsIGJlY2F1c2UKLSAgICAgKiBvbmx5IHRoaXMgaW5mbyBpcyBuZWNlc3NhcnkgZnJvbSBjb25zdHJ1Y3QgYSBmdWxsIG1vZGVsIG9mIAotICAgICAqIGNvbXBvbmVudHMgYW5kIGJ1aWxkIGNvcnJlY3RseSBmYWNlcy1jb25maWcueG1sLCAudGxkLCBhbmQKLSAgICAgKiBjb21wb25lbnQgYW5kIHRhZyBjbGFzc2VzLgotICAgICAqIAotICAgICAqIEBwYXJhbSBvdGhlcgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIG1lcmdlKE1vZGVsIG90aGVyKQotICAgIHsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpdCA9IG90aGVyLmdldENvbXBvbmVudHMoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KQotICAgICAgICB7Ci0gICAgICAgICAgICBDb21wb25lbnRNZXRhIGNvbXBvbmVudCA9IChDb21wb25lbnRNZXRhKSBpdC5uZXh0KCk7Ci0gICAgICAgICAgICAvL0lmIHRoZSBjb21wb25lbnQgaXMgcHJlc2VudCwgdGhlIGFjdHVhbCB0YWtlcyBwcmVjZWRlbmNlLgotICAgICAgICAgICAgaWYgKHRoaXMuZmluZENvbXBvbmVudEJ5Q2xhc3NOYW1lKGNvbXBvbmVudC5nZXRDbGFzc05hbWUoKSk9PSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRoaXMuYWRkQ29tcG9uZW50KGNvbXBvbmVudCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGZvciAoSXRlcmF0b3IgaXQgPSBvdGhlci5nZXRDb252ZXJ0ZXJzKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykKLSAgICAgICAgewotICAgICAgICAgICAgQ29udmVydGVyTWV0YSBjb252ZXJ0ZXIgPSAoQ29udmVydGVyTWV0YSkgaXQubmV4dCgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAodGhpcy5maW5kQ29udmVydGVyQnlDbGFzc05hbWUoY29udmVydGVyLmdldENsYXNzTmFtZSgpKT09IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhpcy5hZGRDb252ZXJ0ZXIoY29udmVydGVyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgZm9yIChJdGVyYXRvciBpdCA9IG90aGVyLmdldFZhbGlkYXRvcnMoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KQotICAgICAgICB7Ci0gICAgICAgICAgICBWYWxpZGF0b3JNZXRhIHZhbGlkYXRvciA9IChWYWxpZGF0b3JNZXRhKSBpdC5uZXh0KCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmICh0aGlzLmZpbmRWYWxpZGF0b3JCeUNsYXNzTmFtZSh2YWxpZGF0b3IuZ2V0Q2xhc3NOYW1lKCkpPT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aGlzLmFkZFZhbGlkYXRvcih2YWxpZGF0b3IpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ID0gb3RoZXIuZ2V0QmVoYXZpb3JzKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykKLSAgICAgICAgewotICAgICAgICAgICAgQmVoYXZpb3JNZXRhIGJlaGF2aW9yID0gKEJlaGF2aW9yTWV0YSkgaXQubmV4dCgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAodGhpcy5maW5kQmVoYXZpb3JCeUNsYXNzTmFtZShiZWhhdmlvci5nZXRDbGFzc05hbWUoKSk9PSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRoaXMuYWRkQmVoYXZpb3IoYmVoYXZpb3IpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ID0gb3RoZXIuZ2V0VGFncygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspCi0gICAgICAgIHsKLSAgICAgICAgICAgIFRhZ01ldGEgdmFsaWRhdG9yID0gKFRhZ01ldGEpIGl0Lm5leHQoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKHRoaXMuZmluZFRhZ0J5Q2xhc3NOYW1lKHZhbGlkYXRvci5nZXRDbGFzc05hbWUoKSk9PSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRoaXMuYWRkVGFnKHZhbGlkYXRvcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGZvciAoSXRlcmF0b3IgaXQgPSBvdGhlci5nZXRGYWNlbGV0VGFncygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspCi0gICAgICAgIHsKLSAgICAgICAgICAgIEZhY2VsZXRUYWdNZXRhIGZhY2VsZXRUYWcgPSAoRmFjZWxldFRhZ01ldGEpIGl0Lm5leHQoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKHRoaXMuZmluZEZhY2VsZXRUYWdCeUNsYXNzTmFtZShmYWNlbGV0VGFnLmdldENsYXNzTmFtZSgpKT09IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhpcy5hZGRGYWNlbGV0VGFnKGZhY2VsZXRUYWcpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ID0gb3RoZXIuZ2V0V2ViQ29uZmlncygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspCi0gICAgICAgIHsKLSAgICAgICAgICAgIFdlYkNvbmZpZ01ldGEgd2ViQ29uZmlnID0gKFdlYkNvbmZpZ01ldGEpIGl0Lm5leHQoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKHRoaXMuZmluZFdlYkNvbmZpZ3NCeU1vZGVsSWQod2ViQ29uZmlnLmdldE1vZGVsSWQoKSk9PSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRoaXMuYWRkV2ViQ29uZmlnKHdlYkNvbmZpZyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIGEgY29tcG9uZW50IHRvIHRoaXMgZmFjZXMgY29uZmlnIGRvY3VtZW50LgotICAgICAqIAotICAgICAqIEBwYXJhbSBjb21wb25lbnQKLSAgICAgKiAgICAgICAgICAgIHRoZSBjb21wb25lbnQgdG8gYWRkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkQ29tcG9uZW50KENvbXBvbmVudE1ldGEgY29tcG9uZW50KQotICAgIHsKLSAgICAgICAgX2NvbXBvbmVudHMuYWRkKGNvbXBvbmVudCk7Ci0gICAgICAgIF9jb21wb25lbnRzQnlDbGFzcy5wdXQoY29tcG9uZW50LmdldENsYXNzTmFtZSgpLCBjb21wb25lbnQpOwotICAgICAgICBpZiAobnVsbCAhPSBjb21wb25lbnQuZ2V0VHlwZSgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBfY29tcG9uZW50c0J5VHlwZS5wdXQoY29tcG9uZW50LmdldFR5cGUoKSwgY29tcG9uZW50KTsKLSAgICAgICAgfQotICAgICAgICBpZiAobnVsbCAhPSBjb21wb25lbnQuZ2V0VGFnQ2xhc3MoKSkKLSAgICAgICAgewotICAgICAgICAgICAgX2NvbXBvbmVudHNCeVRhZ0NsYXNzLnB1dChjb21wb25lbnQuZ2V0VGFnQ2xhc3MoKSwgY29tcG9uZW50KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYWxsIGNvbXBvbmVudHMKLSAgICAgKi8KLSAgICBwdWJsaWMgTGlzdCBnZXRDb21wb25lbnRzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfY29tcG9uZW50czsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGFuIGl0ZXJhdG9yIGZvciBhbGwgY29tcG9uZW50cy4KLSAgICAgKi8KLSAgICBwdWJsaWMgSXRlcmF0b3IgY29tcG9uZW50cygpCi0gICAgewotICAgICAgICByZXR1cm4gX2NvbXBvbmVudHMuaXRlcmF0b3IoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ29tcG9uZW50TWV0YSBmaW5kQ29tcG9uZW50QnlDbGFzc05hbWUoU3RyaW5nIGNsYXNzTmFtZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoQ29tcG9uZW50TWV0YSkgX2NvbXBvbmVudHNCeUNsYXNzLmdldChjbGFzc05hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBDb21wb25lbnRNZXRhIGZpbmRDb21wb25lbnRCeVRhZ0NsYXNzTmFtZShTdHJpbmcgY2xhc3NOYW1lKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChDb21wb25lbnRNZXRhKSBfY29tcG9uZW50c0J5VGFnQ2xhc3MuZ2V0KGNsYXNzTmFtZSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBDb21wb25lbnRNZXRhIGZpbmRDb21wb25lbnRCeVR5cGUoU3RyaW5nIGNvbXBvbmVudFR5cGUpCi0gICAgewotICAgICAgICByZXR1cm4gKENvbXBvbmVudE1ldGEpIF9jb21wb25lbnRzQnlUeXBlLmdldChjb21wb25lbnRUeXBlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBIb2xkcyBpbmZvIGFib3V0IGEgSlNGIENvbnZlcnRlciBkZWZpbml0aW9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkQ29udmVydGVyKENvbnZlcnRlck1ldGEgY29udmVydGVyKQotICAgIHsKLSAgICAgICAgX2NvbnZlcnRlcnMuYWRkKGNvbnZlcnRlcik7Ci0gICAgICAgIF9jb252ZXJ0ZXJzQnlDbGFzcy5wdXQoY29udmVydGVyLmdldENsYXNzTmFtZSgpLCBjb252ZXJ0ZXIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYWxsIGNvbnZlcnRlcnMKLSAgICAgKi8KLSAgICBwdWJsaWMgTGlzdCBnZXRDb252ZXJ0ZXJzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfY29udmVydGVyczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGFuIGl0ZXJhdG9yIGZvciBhbGwgY29udmVydGVycwotICAgICAqLwotICAgIHB1YmxpYyBJdGVyYXRvciBjb252ZXJ0ZXJzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfY29udmVydGVycy5pdGVyYXRvcigpOwotICAgIH0KLQotICAgIHB1YmxpYyBDb252ZXJ0ZXJNZXRhIGZpbmRDb252ZXJ0ZXJCeUNsYXNzTmFtZShTdHJpbmcgY2xhc3NOYW1lKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChDb252ZXJ0ZXJNZXRhKSBfY29udmVydGVyc0J5Q2xhc3MuZ2V0KGNsYXNzTmFtZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSG9sZHMgaW5mbyBhYm91dCBhIEpTRiBCZWhhdmlvciBkZWZpbml0aW9uCi0gICAgICogQHNpbmNlIDEuMC42Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkQmVoYXZpb3IoQmVoYXZpb3JNZXRhIGJlaGF2aW9yKQotICAgIHsKLSAgICAgICAgX2JlaGF2aW9ycy5hZGQoYmVoYXZpb3IpOwotICAgICAgICBfYmVoYXZpb3JzQnlDbGFzcy5wdXQoYmVoYXZpb3IuZ2V0Q2xhc3NOYW1lKCksIGJlaGF2aW9yKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGFsbCBiZWhhdmlvcnMKLSAgICAgKiBAc2luY2UgMS4wLjYKLSAgICAgKi8KLSAgICBwdWJsaWMgTGlzdCBnZXRCZWhhdmlvcnMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9iZWhhdmlvcnM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhbiBpdGVyYXRvciBmb3IgYWxsIGJlaGF2aW9ycwotICAgICAqIEBzaW5jZSAxLjAuNgotICAgICAqLwotICAgIHB1YmxpYyBJdGVyYXRvciBiZWhhdmlvcnMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9iZWhhdmlvcnMuaXRlcmF0b3IoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAKLSAgICAgKiBAc2luY2UgMS4wLjYKLSAgICAgKi8KLSAgICBwdWJsaWMgQmVoYXZpb3JNZXRhIGZpbmRCZWhhdmlvckJ5Q2xhc3NOYW1lKFN0cmluZyBjbGFzc05hbWUpCi0gICAgewotICAgICAgICByZXR1cm4gKEJlaGF2aW9yTWV0YSkgX2JlaGF2aW9yc0J5Q2xhc3MuZ2V0KGNsYXNzTmFtZSk7Ci0gICAgfQotCi0gICAgCi0gICAgLyoqCi0gICAgICogSG9sZHMgaW5mbyBhYm91dCBhIEpTRiBDb252ZXJ0ZXIgZGVmaW5pdGlvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZFZhbGlkYXRvcihWYWxpZGF0b3JNZXRhIHZhbGlkYXRvcikKLSAgICB7Ci0gICAgICAgIF92YWxpZGF0b3JzLmFkZCh2YWxpZGF0b3IpOwotICAgICAgICBfdmFsaWRhdG9yc0J5Q2xhc3MucHV0KHZhbGlkYXRvci5nZXRDbGFzc05hbWUoKSwgdmFsaWRhdG9yKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGFsbCB2YWxpZGF0b3JzCi0gICAgICovCi0gICAgcHVibGljIExpc3QgZ2V0VmFsaWRhdG9ycygpCi0gICAgewotICAgICAgICByZXR1cm4gX3ZhbGlkYXRvcnM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhbiBpdGVyYXRvciBmb3IgYWxsIHZhbGlkYXRvcnMKLSAgICAgKi8KLSAgICBwdWJsaWMgSXRlcmF0b3IgdmFsaWRhdG9ycygpCi0gICAgewotICAgICAgICByZXR1cm4gX3ZhbGlkYXRvcnMuaXRlcmF0b3IoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVmFsaWRhdG9yTWV0YSBmaW5kVmFsaWRhdG9yQnlDbGFzc05hbWUoU3RyaW5nIGNsYXNzTmFtZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoVmFsaWRhdG9yTWV0YSkgX3ZhbGlkYXRvcnNCeUNsYXNzLmdldChjbGFzc05hbWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZHMgYSByZW5kZXIga2l0IHRvIHRoaXMgZmFjZXMgY29uZmlnIGRvY3VtZW50LgotICAgICAqIAotICAgICAqIEBwYXJhbSByZW5kZXJLaXQKLSAgICAgKiAgICAgICAgICAgIHRoZSByZW5kZXIga2l0IHRvIGFkZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZFJlbmRlcktpdChSZW5kZXJLaXRNZXRhIHJlbmRlcktpdCkKLSAgICB7Ci0gICAgICAgIF9yZW5kZXJLaXRzLmFkZChyZW5kZXJLaXQpOwotICAgICAgICBfcmVuZGVyS2l0c0J5SWQucHV0KHJlbmRlcktpdC5nZXRSZW5kZXJLaXRJZCgpLCByZW5kZXJLaXQpOwotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0IGdldFJlbmRlcktpdHMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9yZW5kZXJLaXRzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYW4gaXRlcmF0b3IgZm9yIGFsbCByZW5kZXIga2l0cyBpbiB0aGlzIGZhY2VzIGNvbmZpZy4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSByZW5kZXIga2l0IGl0ZXJhdG9yCi0gICAgICovCi0gICAgcHVibGljIEl0ZXJhdG9yIHJlbmRlcktpdHMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9yZW5kZXJLaXRzLml0ZXJhdG9yKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcmVuZGVyIGtpdCBmb3IgdGhpcyByZW5kZXIga2l0IGlkLgotICAgICAqIAotICAgICAqIEBwYXJhbSByZW5kZXJLaXRJZAotICAgICAqICAgICAgICAgICAgdGhlIHJlbmRlciBraXQgaWQgdG8gZmluZAotICAgICAqLwotICAgIHB1YmxpYyBSZW5kZXJLaXRNZXRhIGZpbmRSZW5kZXJLaXRCeUlkKFN0cmluZyBpZCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoUmVuZGVyS2l0TWV0YSkgX3JlbmRlcktpdHNCeUlkLmdldChpZCk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEFkZHMgYSB0YWcgdG8gdGhpcyBmYWNlcyBjb25maWcgZG9jdW1lbnQuCi0gICAgICogCi0gICAgICogQHBhcmFtIHRhZwotICAgICAqICAgICAgICAgICAgdGhlIHRhZyB0byBhZGQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRUYWcoVGFnTWV0YSB0YWcpCi0gICAgewotICAgICAgICBfdGFncy5hZGQodGFnKTsKLSAgICAgICAgX3RhZ3NCeUNsYXNzLnB1dCh0YWcuZ2V0Q2xhc3NOYW1lKCksIHRhZyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhbGwgdGFncwotICAgICAqLwotICAgIHB1YmxpYyBMaXN0IGdldFRhZ3MoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF90YWdzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYW4gaXRlcmF0b3IgZm9yIGFsbCB0YWdzLgotICAgICAqLwotICAgIHB1YmxpYyBJdGVyYXRvciB0YWdzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfdGFncy5pdGVyYXRvcigpOwotICAgIH0KLQotICAgIHB1YmxpYyBUYWdNZXRhIGZpbmRUYWdCeUNsYXNzTmFtZShTdHJpbmcgY2xhc3NOYW1lKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChUYWdNZXRhKSBfdGFnc0J5Q2xhc3MuZ2V0KGNsYXNzTmFtZSk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEFkZHMgYSB0YWcgdG8gdGhpcyBmYWNlcyBjb25maWcgZG9jdW1lbnQuCi0gICAgICogCi0gICAgICogQHNpbmNlIDEuMC40Ci0gICAgICogQHBhcmFtIHRhZwotICAgICAqICAgICAgICAgICAgdGhlIHRhZyB0byBhZGQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRGYWNlbGV0VGFnKEZhY2VsZXRUYWdNZXRhIHRhZykKLSAgICB7Ci0gICAgICAgIF9mYWNlbGV0VGFncy5hZGQodGFnKTsKLSAgICAgICAgX2ZhY2VsZXRUYWdzQnlDbGFzcy5wdXQodGFnLmdldENsYXNzTmFtZSgpLCB0YWcpOwotICAgICAgICBpZiAodGFnLmdldE5hbWUoKSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBfZmFjZWxldFRhZ3NCeU5hbWUucHV0KHRhZy5nZXROYW1lKCksIHRhZyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGFsbCB0YWdzCi0gICAgICogQHNpbmNlIDEuMC40Ci0gICAgICovCi0gICAgcHVibGljIExpc3QgZ2V0RmFjZWxldFRhZ3MoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9mYWNlbGV0VGFnczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGFuIGl0ZXJhdG9yIGZvciBhbGwgdGFncy4KLSAgICAgKiBAc2luY2UgMS4wLjQKLSAgICAgKi8KLSAgICBwdWJsaWMgSXRlcmF0b3IgZmFjZWxldFRhZ3MoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9mYWNlbGV0VGFncy5pdGVyYXRvcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzaW5jZSAxLjAuNAotICAgICAqLwotICAgIHB1YmxpYyBGYWNlbGV0VGFnTWV0YSBmaW5kRmFjZWxldFRhZ0J5Q2xhc3NOYW1lKFN0cmluZyBjbGFzc05hbWUpCi0gICAgewotICAgICAgICByZXR1cm4gKEZhY2VsZXRUYWdNZXRhKSBfZmFjZWxldFRhZ3NCeUNsYXNzLmdldChjbGFzc05hbWUpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBAc2luY2UgMS4wLjQKLSAgICAgKi8KLSAgICBwdWJsaWMgRmFjZWxldFRhZ01ldGEgZmluZEZhY2VsZXRUYWdCeU5hbWUoU3RyaW5nIG5hbWUpCi0gICAgewotICAgICAgICByZXR1cm4gKEZhY2VsZXRUYWdNZXRhKSBfZmFjZWxldFRhZ3NCeU5hbWUuZ2V0KG5hbWUpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBAc2luY2UgMS4wLjQKLSAgICAgKi8KLSAgICBwdWJsaWMgTGlzdCBnZXRXZWJDb25maWdzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfd2ViQ29uZmlnczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2luY2UgMS4wLjQKLSAgICAgKi8KLSAgICBwdWJsaWMgSXRlcmF0b3Igd2ViQ29uZmlncygpCi0gICAgewotICAgICAgICByZXR1cm4gX3dlYkNvbmZpZ3MuaXRlcmF0b3IoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2luY2UgMS4wLjQKLSAgICAgKi8KLSAgICBwdWJsaWMgV2ViQ29uZmlnTWV0YSBmaW5kV2ViQ29uZmlnc0J5TW9kZWxJZChTdHJpbmcgbW9kZWxJZCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoV2ViQ29uZmlnTWV0YSkgX3dlYkNvbmZpZ3NCeU1vZGVsSWQuZ2V0KG1vZGVsSWQpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBAc2luY2UgMS4wLjQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRXZWJDb25maWcoV2ViQ29uZmlnTWV0YSBjb25maWcpCi0gICAgewotICAgICAgICBfd2ViQ29uZmlncy5hZGQoY29uZmlnKTsKLSAgICAgICAgX3dlYkNvbmZpZ3NCeU1vZGVsSWQucHV0KGNvbmZpZy5nZXRNb2RlbElkKCksIGNvbmZpZyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0TW9kZWxJZChTdHJpbmcgbW9kZWxJZCkKLSAgICB7Ci0gICAgICAgIHRoaXMuX21vZGVsSWQgPSBtb2RlbElkOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE9idGFpbiBhIHZhbHVlIHRoYXQgaW5kaWNhdGUgZnJvbSB3aGVyZSB0aGlzIG1vZGVsCi0gICAgICogY29tZXMgZnJvbS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRNb2RlbElkKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfbW9kZWxJZDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL21vZGVsL01vZGVsVXRpbHMuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvbW9kZWwvTW9kZWxVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjFkMjhjLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvbW9kZWwvTW9kZWxVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc4ICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5idWlsZGVyLm1vZGVsOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi0vKioKLSAqIFNpbXBsZSBzdGF0aWMgaGVscGVyIG1ldGhvZHMuCi0gKi8KLXB1YmxpYyBjbGFzcyBNb2RlbFV0aWxzCi17Ci0gICAgLyoqCi0gICAgICogSW5oZXJpdCBzZXR0aW5nIG9ubHkgaWYgY3VycmVudCBvbmUgaXMgZW1wdHkuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgbWVyZ2UoU3RyaW5nIGN1cnIsIFN0cmluZyBpbmhlcml0ZWQpCi0gICAgewotICAgICAgICBpZiAoY3VyciAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gY3VycjsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaW5oZXJpdGVkOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBJbmhlcml0IHNldHRpbmcgb25seSBpZiBjdXJyZW50IG9uZSBpcyBlbXB0eS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBtZXJnZShPYmplY3QgY3VyciwgT2JqZWN0IGluaGVyaXRlZCkKLSAgICB7Ci0gICAgICAgIGlmIChjdXJyICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBjdXJyOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpbmhlcml0ZWQ7Ci0gICAgfSAgICAKLSAgICAKLSAgICAvKioKLSAgICAgKiBJbmhlcml0IHNldHRpbmcgb25seSBpZiBjdXJyZW50IG9uZSBpcyBlbXB0eS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIEJvb2xlYW4gbWVyZ2UoQm9vbGVhbiBjdXJyLCBCb29sZWFuIGluaGVyaXRlZCkKLSAgICB7Ci0gICAgICAgIGlmIChjdXJyICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBjdXJyOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpbmhlcml0ZWQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIGEgZGVmYXVsdCB2YWx1ZSBpZiBhIGJvb2xlYW4gcHJvcGVydHkgaXMgbnVsbC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIEJvb2xlYW4gZGVmYXVsdE9mKEJvb2xlYW4gdmFsLCBib29sZWFuIGRmbHQpCi0gICAgewotICAgICAgICBpZiAodmFsICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiB2YWw7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gQm9vbGVhbi52YWx1ZU9mKGRmbHQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2l2ZW4gdHdvIEpTRiBhcnRpZmFjdHMgdGhhdCBjYW4gaGF2ZSBhc3NvY2lhdGVkIHVzZXItc2V0dGFibGUgcHJvcGVydGllcywKLSAgICAgKiBtZXJnZSBhbGwgdGhlIHByb3BlcnRpZXMgb25lIG9uZSBpbnRvIHRoZSBvdGhlci4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgZHN0IG9iamVjdCBpcyBleHBlY3RlZCB0byBiZSBhICJjaGlsZCIgb2YgdGhlIHNyYyBvYmplY3QuIEFueSBkYXRhIG9uIGRzdAotICAgICAqIHRoZXJlZm9yZSBvdmVycmlkZXMgc3R1ZmYgb24gc3JjLCBidXQgb3RoZXJ3aXNlIGV2ZXJ5dGhpbmcgb24gc3JjIGdldHMgY29waWVkCi0gICAgICogdG8gZHN0LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtZXJnZVByb3BzKFByb3BlcnR5SG9sZGVyIGRzdCwgUHJvcGVydHlIb2xkZXIgc3JjKQotICAgIHsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpID0gc3JjLnByb3BlcnRpZXMoKTsgaS5oYXNOZXh0KCk7KQotICAgICAgICB7Ci0gICAgICAgICAgICBQcm9wZXJ0eU1ldGEgc3JjUHJvcCA9IChQcm9wZXJ0eU1ldGEpIGkubmV4dCgpOwotICAgICAgICAgICAgUHJvcGVydHlNZXRhIGRzdFByb3AgPSBkc3QuZ2V0UHJvcGVydHkoc3JjUHJvcC5nZXROYW1lKCkpOwotICAgICAgICAgICAgaWYgKGRzdFByb3AgPT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyBKdXN0IGNvcHkgdGhlIHdob2xlIHByb3BlcnR5IHVuYWx0ZXJlZAotICAgICAgICAgICAgICAgIGRzdFByb3AgPSBuZXcgUHJvcGVydHlNZXRhKHNyY1Byb3ApOwotICAgICAgICAgICAgICAgIGRzdFByb3Auc2V0SW5oZXJpdGVkKEJvb2xlYW4uVFJVRSk7Ci0gICAgICAgICAgICAgICAgZHN0LmFkZFByb3BlcnR5KGRzdFByb3ApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIG1lcmdlIHRoZSB0d28gcHJvcGVydHkgb2JqZWN0cyB0b2dldGhlcgotICAgICAgICAgICAgICAgIGRzdFByb3AubWVyZ2Uoc3JjUHJvcCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1lcmdlRmFjZXRzKEZhY2V0SG9sZGVyIGRzdCwgRmFjZXRIb2xkZXIgc3JjKQotICAgIHsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpID0gc3JjLmZhY2V0cygpOyBpLmhhc05leHQoKTspCi0gICAgICAgIHsKLSAgICAgICAgICAgIEZhY2V0TWV0YSBzcmNQcm9wID0gKEZhY2V0TWV0YSkgaS5uZXh0KCk7Ci0gICAgICAgICAgICBGYWNldE1ldGEgZHN0UHJvcCA9IGRzdC5nZXRGYWNldChzcmNQcm9wLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICBpZiAoZHN0UHJvcCA9PSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIEp1c3QgY29weSB0aGUgd2hvbGUgcHJvcGVydHkgdW5hbHRlcmVkCi0gICAgICAgICAgICAgICAgZHN0UHJvcCA9IG5ldyBGYWNldE1ldGEoc3JjUHJvcCk7Ci0gICAgICAgICAgICAgICAgZHN0UHJvcC5zZXRJbmhlcml0ZWQoQm9vbGVhbi5UUlVFKTsKLSAgICAgICAgICAgICAgICBkc3QuYWRkRmFjZXQoZHN0UHJvcCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gbWVyZ2UgdGhlIHR3byBwcm9wZXJ0eSBvYmplY3RzIHRvZ2V0aGVyCi0gICAgICAgICAgICAgICAgZHN0UHJvcC5tZXJnZShzcmNQcm9wKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBAc2luY2UgMS4wLjQKLSAgICAgKiBAcGFyYW0gZHN0Ci0gICAgICogQHBhcmFtIHNyYwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtZXJnZUxpc3RlbmVycyhMaXN0ZW5lckhvbGRlciBkc3QsIExpc3RlbmVySG9sZGVyIHNyYykKLSAgICB7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IHNyYy5saXN0ZW5lcnMoKTsgaS5oYXNOZXh0KCk7KQotICAgICAgICB7Ci0gICAgICAgICAgICBMaXN0ZW5lck1ldGEgc3JjUHJvcCA9IChMaXN0ZW5lck1ldGEpIGkubmV4dCgpOwotICAgICAgICAgICAgTGlzdGVuZXJNZXRhIGRzdFByb3AgPSBkc3QuZ2V0TGlzdGVuZXIoc3JjUHJvcC5nZXROYW1lKCkpOwotICAgICAgICAgICAgaWYgKGRzdFByb3AgPT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyBKdXN0IGNvcHkgdGhlIHdob2xlIHByb3BlcnR5IHVuYWx0ZXJlZAotICAgICAgICAgICAgICAgIGRzdFByb3AgPSBuZXcgTGlzdGVuZXJNZXRhKHNyY1Byb3ApOwotICAgICAgICAgICAgICAgIGRzdFByb3Auc2V0SW5oZXJpdGVkKEJvb2xlYW4uVFJVRSk7Ci0gICAgICAgICAgICAgICAgZHN0LmFkZExpc3RlbmVyKGRzdFByb3ApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIG1lcmdlIHRoZSB0d28gcHJvcGVydHkgb2JqZWN0cyB0b2dldGhlcgotICAgICAgICAgICAgICAgIGRzdFByb3AubWVyZ2Uoc3JjUHJvcCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQHNpbmNlIDEuMC40Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1lcmdlQXR0cmlidXRlcyhBdHRyaWJ1dGVIb2xkZXIgZHN0LCBBdHRyaWJ1dGVIb2xkZXIgc3JjKQotICAgIHsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpID0gc3JjLmF0dHJpYnV0ZXMoKTsgaS5oYXNOZXh0KCk7KQotICAgICAgICB7Ci0gICAgICAgICAgICBBdHRyaWJ1dGVNZXRhIHNyY0F0dHIgPSAoQXR0cmlidXRlTWV0YSkgaS5uZXh0KCk7Ci0gICAgICAgICAgICBBdHRyaWJ1dGVNZXRhIGRzdEF0dHIgPSBkc3QuZ2V0QXR0cmlidXRlKHNyY0F0dHIuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIGlmIChkc3RBdHRyID09IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gSnVzdCBjb3B5IHRoZSB3aG9sZSBwcm9wZXJ0eSB1bmFsdGVyZWQKLSAgICAgICAgICAgICAgICBkc3RBdHRyID0gbmV3IEF0dHJpYnV0ZU1ldGEoc3JjQXR0cik7Ci0gICAgICAgICAgICAgICAgLy9kc3RQcm9wLnNldEluaGVyaXRlZChCb29sZWFuLlRSVUUpOwotICAgICAgICAgICAgICAgIGRzdC5hZGRBdHRyaWJ1dGUoZHN0QXR0cik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gbWVyZ2UgdGhlIHR3byBwcm9wZXJ0eSBvYmplY3RzIHRvZ2V0aGVyCi0gICAgICAgICAgICAgICAgZHN0QXR0ci5tZXJnZShzcmNBdHRyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvbW9kZWwvUHJvcGVydHlIb2xkZXIuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvbW9kZWwvUHJvcGVydHlIb2xkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmM3MzIzNy4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL21vZGVsL1Byb3BlcnR5SG9sZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uYnVpbGRlci5tb2RlbDsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIEludGVyZmFjZSBmb3IgYW55IGFydGlmYWN0IHRoYXQgaGFzIEpTRiBwcm9wZXJ0aWVzIG9uIGl0LgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFByb3BlcnR5SG9sZGVyCi17Ci0gICAgSXRlcmF0b3IgcHJvcGVydGllcygpOwotCi0gICAgUHJvcGVydHlNZXRhIGdldFByb3BlcnR5KFN0cmluZyBuYW1lKTsKLQotICAgIHZvaWQgYWRkUHJvcGVydHkoUHJvcGVydHlNZXRhIHByb3ApOwotICAgIAotICAgIE1hcCBnZXRQcm9wZXJ0aWVzKCk7Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL21vZGVsL1Byb3BlcnR5TWV0YS5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9tb2RlbC9Qcm9wZXJ0eU1ldGEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDk1M2M2YS4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL21vZGVsL1Byb3BlcnR5TWV0YS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjE5ICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5idWlsZGVyLm1vZGVsOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmRpZ2VzdGVyLkRpZ2VzdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uYnVpbGRlci5pby5YbWxXcml0ZXI7Ci0KLS8qKgotICogU3RvcmUgbWV0YWRhdGEgYWJvdXQgYSBiZWFuIHByb3BlcnR5IG9mIGEgY29tcG9uZW50LCBjb252ZXJ0ZXIgb3Igb3RoZXIgSlNGCi0gKiBhcnRpZmFjdC4KLSAqIDxwPgotICogVGhpcyBtZXRhZGF0YSBkZWZpbmVzIHRoZSBhdHRyaWJ1dGVzIG9mIEpTUCB0YWdzLCBhbW9uZyBvdGhlciB0aGluZ3MuCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9wZXJ0eU1ldGEKLXsKLSAgICBwcml2YXRlIFN0cmluZyBfbmFtZTsKLSAgICBwcml2YXRlIFN0cmluZyBfY2xhc3NOYW1lOwotICAgIHByaXZhdGUgU3RyaW5nIF9qc3BOYW1lOwotICAgIHByaXZhdGUgU3RyaW5nIF9maWVsZE5hbWU7ICAgIAotICAgIHByaXZhdGUgQm9vbGVhbiBfcmVxdWlyZWQ7Ci0gICAgcHJpdmF0ZSBCb29sZWFuIF9saXRlcmFsT25seTsKLSAgICBwcml2YXRlIEJvb2xlYW4gX3RyYW5zaWVudDsKLSAgICBwcml2YXRlIEJvb2xlYW4gX3N0YXRlSG9sZGVyOwotICAgIHByaXZhdGUgQm9vbGVhbiBfcGFydGlhbFN0YXRlSG9sZGVyOwotICAgIHByaXZhdGUgU3RyaW5nIF9kZXNjcmlwdGlvbjsKLSAgICBwcml2YXRlIFN0cmluZyBfbG9uZ0Rlc2NyaXB0aW9uOwotICAgIHByaXZhdGUgU3RyaW5nICAgX2RlZmF1bHRWYWx1ZTsKLSAgICBwcml2YXRlIE1ldGhvZFNpZ25hdHVyZU1ldGEgX3NpZ25hdHVyZTsKLSAgICAKLSAgICBwcml2YXRlIEJvb2xlYW4gX2luaGVyaXRlZDsgLy9EZWZpbmUgaWYgdGhpcyBwcm9wZXJ0eSBpcyBpbmhlcml0ZWQgZnJvbSBwYXJlbnQgY29tcG9uZW50Ci0gICAgcHJpdmF0ZSBCb29sZWFuIF9pbmhlcml0ZWRUYWc7IC8vRGVmaW5lIGlmIHRoaXMgcHJvcGVydHkgaXMgaW5oZXJpdGVkIGZyb20gdGFnIGNvbXBvbmVudAotICAgIHByaXZhdGUgQm9vbGVhbiBfdGFnRXhjbHVkZWQ7IC8vRGVmaW5lIGlmIHRoaXMgcHJvcGVydHkgaXMgZXhjbHVkZWQgZnJvbSB0YWcgYW5kIHRsZAotICAgIAotICAgIHByaXZhdGUgQm9vbGVhbiBfZ2VuZXJhdGVkOwotICAgIAotICAgIHByaXZhdGUgU3RyaW5nIF9sb2NhbE1ldGhvZFNjb3BlOwotICAgIHByaXZhdGUgQm9vbGVhbiBfbG9jYWxNZXRob2Q7IC8vZ2VuZXJhdGUgbWV0aG9kIHRoYXQgcmV0dXJucyBsb2NhbCB2YWx1ZSB3aXRob3V0IGV2YWx1YXRlIEVMCi0gICAgcHJpdmF0ZSBTdHJpbmcgX3NldE1ldGhvZFNjb3BlOwotICAgIHByaXZhdGUgQm9vbGVhbiBfc2V0TWV0aG9kOyAvL0dlbmVyYXRlIG1ldGhvZCB0byBkZWZpbmUgaWYgaXMgc2V0IGEgdmFsdWUgb3Igbm90Ci0gICAgCi0gICAgcHJpdmF0ZSBCb29sZWFuIF9ydGV4cHJ2YWx1ZTsKLSAgICBwcml2YXRlIFN0cmluZyBfY2xpZW50RXZlbnQ7Ci0gICAgCi0gICAgcHJpdmF0ZSBTdHJpbmcgX2RlZmVycmVkVmFsdWVUeXBlOwotICAgIHByaXZhdGUgQm9vbGVhbiBfZmFjZWxldHNPbmx5OwotCi0gICAgcHVibGljIFByb3BlcnR5TWV0YSgpCi0gICAgewotICAgICAgICAKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFByb3BlcnR5TWV0YShQcm9wZXJ0eU1ldGEgcG0pCi0gICAgewotICAgICAgICBfbmFtZSA9IHBtLl9uYW1lOwotICAgICAgICBfY2xhc3NOYW1lID0gcG0uX2NsYXNzTmFtZTsKLSAgICAgICAgX2pzcE5hbWUgPSBwbS5fanNwTmFtZTsKLSAgICAgICAgX2ZpZWxkTmFtZSA9IHBtLl9maWVsZE5hbWU7ICAgIAotICAgICAgICBfcmVxdWlyZWQgPSBwbS5fcmVxdWlyZWQ7Ci0gICAgICAgIF9saXRlcmFsT25seSA9IHBtLl9saXRlcmFsT25seTsKLSAgICAgICAgX3RyYW5zaWVudCA9IHBtLl90cmFuc2llbnQ7Ci0gICAgICAgIF9zdGF0ZUhvbGRlciA9IHBtLl9zdGF0ZUhvbGRlcjsKLSAgICAgICAgX2Rlc2NyaXB0aW9uID0gcG0uX2Rlc2NyaXB0aW9uOwotICAgICAgICBfbG9uZ0Rlc2NyaXB0aW9uID0gcG0uX2xvbmdEZXNjcmlwdGlvbjsKLSAgICAgICAgX2RlZmF1bHRWYWx1ZSA9IHBtLl9kZWZhdWx0VmFsdWU7Ci0gICAgICAgIF9zaWduYXR1cmUgPSBwbS5fc2lnbmF0dXJlOwotICAgICAgICAKLSAgICAgICAgX2luaGVyaXRlZCA9IHBtLl9pbmhlcml0ZWQ7Ci0gICAgICAgIF9pbmhlcml0ZWRUYWcgPSBwbS5faW5oZXJpdGVkVGFnOwotICAgICAgICBfdGFnRXhjbHVkZWQgPSBwbS5fdGFnRXhjbHVkZWQ7Ci0gICAgICAgIAotICAgICAgICBfZ2VuZXJhdGVkID0gcG0uX2dlbmVyYXRlZDsKLSAgICAgICAgX2xvY2FsTWV0aG9kU2NvcGUgPSBwbS5fbG9jYWxNZXRob2RTY29wZTsKLSAgICAgICAgX2xvY2FsTWV0aG9kID0gcG0uX2xvY2FsTWV0aG9kOwotICAgICAgICBfc2V0TWV0aG9kU2NvcGUgPSBwbS5fc2V0TWV0aG9kU2NvcGU7Ci0gICAgICAgIF9zZXRNZXRob2QgPSBwbS5fc2V0TWV0aG9kOwotICAgICAgICBfcnRleHBydmFsdWUgPSBwbS5fcnRleHBydmFsdWU7Ci0gICAgICAgIF9kZWZlcnJlZFZhbHVlVHlwZSA9IHBtLl9kZWZlcnJlZFZhbHVlVHlwZTsKLSAgICAgICAgX2NsaWVudEV2ZW50ID0gcG0uX2NsaWVudEV2ZW50OwotICAgICAgICBfcGFydGlhbFN0YXRlSG9sZGVyID0gcG0uX3BhcnRpYWxTdGF0ZUhvbGRlcjsKLSAgICAgICAgX2ZhY2VsZXRzT25seSA9IHBtLl9mYWNlbGV0c09ubHk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFdyaXRlIHRoaXMgbW9kZWwgb3V0IGFzIHhtbC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgd3JpdGVYbWwoWG1sV3JpdGVyIG91dCwgUHJvcGVydHlNZXRhIHBtKQotICAgIHsKLSAgICAgICAgb3V0LmJlZ2luRWxlbWVudCgicHJvcGVydHkiKTsKLSAgICAgICAgb3V0LndyaXRlRWxlbWVudCgibmFtZSIsIHBtLl9uYW1lKTsKLSAgICAgICAgaWYgKHBtLl9qc3BOYW1lICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG91dC53cml0ZUVsZW1lbnQoImpzcE5hbWUiLCBwbS5fanNwTmFtZSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHBtLl9maWVsZE5hbWUgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgb3V0LndyaXRlRWxlbWVudCgiZmllbGROYW1lIiwgcG0uX2ZpZWxkTmFtZSk7Ci0gICAgICAgIH0KLSAgICAgICAgb3V0LndyaXRlRWxlbWVudCgiY2xhc3NOYW1lIiwgcG0uX2NsYXNzTmFtZSk7Ci0gICAgICAgIG91dC53cml0ZUVsZW1lbnQoInJlcXVpcmVkIiwgcG0uX3JlcXVpcmVkKTsKLSAgICAgICAgb3V0LndyaXRlRWxlbWVudCgibGl0ZXJhbE9ubHkiLCBwbS5fbGl0ZXJhbE9ubHkpOwotICAgICAgICBvdXQud3JpdGVFbGVtZW50KCJ0cmFuc2llbnQiLCBwbS5fdHJhbnNpZW50KTsKLSAgICAgICAgb3V0LndyaXRlRWxlbWVudCgic3RhdGVIb2xkZXIiLCBwbS5fc3RhdGVIb2xkZXIpOwotICAgICAgICBvdXQud3JpdGVFbGVtZW50KCJwYXJ0aWFsU3RhdGVIb2xkZXIiLCBwbS5fcGFydGlhbFN0YXRlSG9sZGVyKTsKLSAgICAgICAgb3V0LndyaXRlRWxlbWVudCgiZGVzYyIsIHBtLl9kZXNjcmlwdGlvbik7Ci0gICAgICAgIG91dC53cml0ZUVsZW1lbnQoImxvbmdEZXNjIiwgcG0uX2xvbmdEZXNjcmlwdGlvbik7Ci0gICAgICAgIG91dC53cml0ZUVsZW1lbnQoImRlZmF1bHRWYWx1ZSIsIHBtLl9kZWZhdWx0VmFsdWUpOwotICAgICAgICBpZiAocG0uX3NpZ25hdHVyZSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBNZXRob2RTaWduYXR1cmVNZXRhLndyaXRlWG1sKG91dCwgcG0uX3NpZ25hdHVyZSk7Ci0gICAgICAgIH0KLSAgICAgICAgb3V0LndyaXRlRWxlbWVudCgiaW5oZXJpdGVkIiwgcG0uX2luaGVyaXRlZCk7Ci0gICAgICAgIG91dC53cml0ZUVsZW1lbnQoImluaGVyaXRlZFRhZyIsIHBtLl9pbmhlcml0ZWRUYWcpOwotICAgICAgICBvdXQud3JpdGVFbGVtZW50KCJ0YWdFeGNsdWRlZCIsIHBtLl90YWdFeGNsdWRlZCk7Ci0gICAgICAgIG91dC53cml0ZUVsZW1lbnQoImdlbmVyYXRlZCIscG0uX2dlbmVyYXRlZCk7Ci0gICAgICAgIG91dC53cml0ZUVsZW1lbnQoImxvY2FsTWV0aG9kU2NvcGUiLCBwbS5fbG9jYWxNZXRob2RTY29wZSk7Ci0gICAgICAgIG91dC53cml0ZUVsZW1lbnQoImxvY2FsTWV0aG9kIiwgcG0uX2xvY2FsTWV0aG9kKTsKLSAgICAgICAgb3V0LndyaXRlRWxlbWVudCgic2V0TWV0aG9kU2NvcGUiLCBwbS5fc2V0TWV0aG9kU2NvcGUpOwotICAgICAgICBvdXQud3JpdGVFbGVtZW50KCJzZXRNZXRob2QiLCBwbS5fc2V0TWV0aG9kKTsKLSAgICAgICAgb3V0LndyaXRlRWxlbWVudCgicnRleHBydmFsdWUiLCBwbS5fcnRleHBydmFsdWUpOwotICAgICAgICBvdXQud3JpdGVFbGVtZW50KCJkZWZlcnJlZFZhbHVlVHlwZSIsIHBtLl9kZWZlcnJlZFZhbHVlVHlwZSk7Ci0gICAgICAgIG91dC53cml0ZUVsZW1lbnQoImNsaWVudEV2ZW50IiwgcG0uX2NsaWVudEV2ZW50KTsKLSAgICAgICAgb3V0LndyaXRlRWxlbWVudCgiZmFjZWxldHNPbmx5IiwgcG0uX2ZhY2VsZXRzT25seSk7Ci0gICAgICAgIG91dC5lbmRFbGVtZW50KCJwcm9wZXJ0eSIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZCBkaWdlc3RlciBydWxlcyB0byByZXBvcHVsYXRlIGEgTW9kZWwgaW5zdGFuY2UgZnJvbSBhbiB4bWwgZmlsZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgYWRkWG1sUnVsZXMoRGlnZXN0ZXIgZGlnZXN0ZXIsIFN0cmluZyBwcmVmaXgpCi0gICAgewotICAgICAgICBTdHJpbmcgbmV3UHJlZml4ID0gcHJlZml4ICsgIi9wcm9wZXJ0eSI7Ci0KLSAgICAgICAgZGlnZXN0ZXIuYWRkT2JqZWN0Q3JlYXRlKG5ld1ByZWZpeCwgUHJvcGVydHlNZXRhLmNsYXNzKTsKLSAgICAgICAgZGlnZXN0ZXIuYWRkU2V0TmV4dChuZXdQcmVmaXgsICJhZGRQcm9wZXJ0eSIpOwotCi0gICAgICAgIGRpZ2VzdGVyLmFkZEJlYW5Qcm9wZXJ0eVNldHRlcihuZXdQcmVmaXggKyAiL25hbWUiKTsKLSAgICAgICAgZGlnZXN0ZXIuYWRkQmVhblByb3BlcnR5U2V0dGVyKG5ld1ByZWZpeCArICIvanNwTmFtZSIpOwotICAgICAgICBkaWdlc3Rlci5hZGRCZWFuUHJvcGVydHlTZXR0ZXIobmV3UHJlZml4ICsgIi9maWVsZE5hbWUiKTsKLSAgICAgICAgZGlnZXN0ZXIuYWRkQmVhblByb3BlcnR5U2V0dGVyKG5ld1ByZWZpeCArICIvY2xhc3NOYW1lIik7Ci0gICAgICAgIGRpZ2VzdGVyLmFkZEJlYW5Qcm9wZXJ0eVNldHRlcihuZXdQcmVmaXggKyAiL3JlcXVpcmVkIik7Ci0gICAgICAgIGRpZ2VzdGVyLmFkZEJlYW5Qcm9wZXJ0eVNldHRlcihuZXdQcmVmaXggKyAiL2xpdGVyYWxPbmx5Iik7Ci0gICAgICAgIGRpZ2VzdGVyLmFkZEJlYW5Qcm9wZXJ0eVNldHRlcihuZXdQcmVmaXggKyAiL3RyYW5zaWVudCIpOwotICAgICAgICBkaWdlc3Rlci5hZGRCZWFuUHJvcGVydHlTZXR0ZXIobmV3UHJlZml4ICsgIi9zdGF0ZUhvbGRlciIpOwotICAgICAgICBkaWdlc3Rlci5hZGRCZWFuUHJvcGVydHlTZXR0ZXIobmV3UHJlZml4ICsgIi9wYXJ0aWFsU3RhdGVIb2xkZXIiKTsKLSAgICAgICAgZGlnZXN0ZXIuYWRkQmVhblByb3BlcnR5U2V0dGVyKG5ld1ByZWZpeCArICIvZGVzYyIsICJkZXNjcmlwdGlvbiIpOwotICAgICAgICBkaWdlc3Rlci5hZGRCZWFuUHJvcGVydHlTZXR0ZXIobmV3UHJlZml4ICsgIi9sb25nRGVzYyIsCi0gICAgICAgICAgICAgICAgImxvbmdEZXNjcmlwdGlvbiIpOwotICAgICAgICBkaWdlc3Rlci5hZGRCZWFuUHJvcGVydHlTZXR0ZXIobmV3UHJlZml4ICsgIi9kZWZhdWx0VmFsdWUiLCAiZGVmYXVsdFZhbHVlIik7Ci0gICAgICAgIGRpZ2VzdGVyLmFkZEJlYW5Qcm9wZXJ0eVNldHRlcihuZXdQcmVmaXggKyAiL2luaGVyaXRlZCIsICJpbmhlcml0ZWQiKTsKLSAgICAgICAgZGlnZXN0ZXIuYWRkQmVhblByb3BlcnR5U2V0dGVyKG5ld1ByZWZpeCArICIvaW5oZXJpdGVkVGFnIiwgImluaGVyaXRlZFRhZyIpOwotICAgICAgICBkaWdlc3Rlci5hZGRCZWFuUHJvcGVydHlTZXR0ZXIobmV3UHJlZml4ICsgIi90YWdFeGNsdWRlZCIsICJ0YWdFeGNsdWRlZCIpOwotICAgICAgICBkaWdlc3Rlci5hZGRCZWFuUHJvcGVydHlTZXR0ZXIobmV3UHJlZml4ICsgIi9nZW5lcmF0ZWQiLCAiZ2VuZXJhdGVkIik7Ci0gICAgICAgIGRpZ2VzdGVyLmFkZEJlYW5Qcm9wZXJ0eVNldHRlcihuZXdQcmVmaXggKyAiL2xvY2FsTWV0aG9kU2NvcGUiLCAibG9jYWxNZXRob2RTY29wZSIpOwotICAgICAgICBkaWdlc3Rlci5hZGRCZWFuUHJvcGVydHlTZXR0ZXIobmV3UHJlZml4ICsgIi9sb2NhbE1ldGhvZCIsICJsb2NhbE1ldGhvZCIpOwotICAgICAgICBkaWdlc3Rlci5hZGRCZWFuUHJvcGVydHlTZXR0ZXIobmV3UHJlZml4ICsgIi9zZXRNZXRob2RTY29wZSIsICJzZXRNZXRob2RTY29wZSIpOwotICAgICAgICBkaWdlc3Rlci5hZGRCZWFuUHJvcGVydHlTZXR0ZXIobmV3UHJlZml4ICsgIi9zZXRNZXRob2QiLCAic2V0TWV0aG9kIik7Ci0gICAgICAgIGRpZ2VzdGVyLmFkZEJlYW5Qcm9wZXJ0eVNldHRlcihuZXdQcmVmaXggKyAiL3J0ZXhwcnZhbHVlIiwgInJ0ZXhwcnZhbHVlIik7Ci0gICAgICAgIGRpZ2VzdGVyLmFkZEJlYW5Qcm9wZXJ0eVNldHRlcihuZXdQcmVmaXggKyAiL2RlZmVycmVkVmFsdWVUeXBlIiwgImRlZmVycmVkVmFsdWVUeXBlIik7Ci0gICAgICAgIGRpZ2VzdGVyLmFkZEJlYW5Qcm9wZXJ0eVNldHRlcihuZXdQcmVmaXggKyAiL2NsaWVudEV2ZW50IiwgImNsaWVudEV2ZW50Iik7Ci0gICAgICAgIGRpZ2VzdGVyLmFkZEJlYW5Qcm9wZXJ0eVNldHRlcihuZXdQcmVmaXggKyAiL2ZhY2VsZXRzT25seSIsICJmYWNlbGV0c09ubHkiKTsKLSAgICAgICAgTWV0aG9kU2lnbmF0dXJlTWV0YS5hZGRYbWxSdWxlcyhkaWdlc3RlciwgbmV3UHJlZml4KTsKLSAgICAgICAgCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogTWVyZ2UgdGhlIGRhdGEgaW4gdGhlIHNwZWNpZmllZCBvdGhlciBwcm9wZXJ0eSBpbnRvIHRoaXMgb25lLCB0aHJvd2luZyBhbgotICAgICAqIGV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhbiBpbmNvbXBhdGliaWxpdHkuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgbWVyZ2UoUHJvcGVydHlNZXRhIG90aGVyKQotICAgIHsKLSAgICAgICAgLy8gTWVyZ2UgY2xhc3NOYW1lIGRvZXMgbm90IGhhcm0sIHNpbmNlIHlvdSBjYW5ub3QKLSAgICAgICAgLy91c2UgcG9seW1vcnBoaXNtIG9uIGEganNmIGNvbXBvbmVudC4gIAotICAgICAgICBfY2xhc3NOYW1lID0gTW9kZWxVdGlscy5tZXJnZSh0aGlzLl9jbGFzc05hbWUsIG90aGVyLl9jbGFzc05hbWUpOwotICAgICAgICAKLSAgICAgICAgX25hbWUgPSBNb2RlbFV0aWxzLm1lcmdlKHRoaXMuX25hbWUsIG90aGVyLl9uYW1lKTsKLSAgICAgICAgX2pzcE5hbWUgPSBNb2RlbFV0aWxzLm1lcmdlKHRoaXMuX2pzcE5hbWUsIG90aGVyLl9qc3BOYW1lKTsKLSAgICAgICAgX2ZpZWxkTmFtZSA9IE1vZGVsVXRpbHMubWVyZ2UodGhpcy5fZmllbGROYW1lLCBvdGhlci5fZmllbGROYW1lKTsKLSAgICAgICAgX3JlcXVpcmVkID0gTW9kZWxVdGlscy5tZXJnZSh0aGlzLl9yZXF1aXJlZCwgb3RoZXIuX3JlcXVpcmVkKTsKLSAgICAgICAgX2xpdGVyYWxPbmx5ID0gTW9kZWxVdGlscy5tZXJnZSh0aGlzLl9saXRlcmFsT25seSwgb3RoZXIuX2xpdGVyYWxPbmx5KTsKLSAgICAgICAgX3RyYW5zaWVudCA9IE1vZGVsVXRpbHMubWVyZ2UodGhpcy5fdHJhbnNpZW50LCBvdGhlci5fdHJhbnNpZW50KTsKLSAgICAgICAgX3N0YXRlSG9sZGVyID0gTW9kZWxVdGlscy5tZXJnZSh0aGlzLl9zdGF0ZUhvbGRlciwgb3RoZXIuX3N0YXRlSG9sZGVyKTsKLSAgICAgICAgX3BhcnRpYWxTdGF0ZUhvbGRlciA9IE1vZGVsVXRpbHMubWVyZ2UodGhpcy5fcGFydGlhbFN0YXRlSG9sZGVyLCBvdGhlci5fcGFydGlhbFN0YXRlSG9sZGVyKTsKLSAgICAgICAgX2Rlc2NyaXB0aW9uID0gTW9kZWxVdGlscy5tZXJnZSh0aGlzLl9kZXNjcmlwdGlvbiwgb3RoZXIuX2Rlc2NyaXB0aW9uKTsKLSAgICAgICAgX2xvbmdEZXNjcmlwdGlvbiA9IE1vZGVsVXRpbHMubWVyZ2UodGhpcy5fbG9uZ0Rlc2NyaXB0aW9uLCBvdGhlci5fbG9uZ0Rlc2NyaXB0aW9uKTsKLSAgICAgICAgX2RlZmF1bHRWYWx1ZSA9IE1vZGVsVXRpbHMubWVyZ2UodGhpcy5fZGVmYXVsdFZhbHVlLCBvdGhlci5fZGVmYXVsdFZhbHVlKTsKLSAgICAgICAgX3NpZ25hdHVyZSA9IChNZXRob2RTaWduYXR1cmVNZXRhKSBNb2RlbFV0aWxzLm1lcmdlKHRoaXMuX3NpZ25hdHVyZSwgb3RoZXIuX3NpZ25hdHVyZSk7Ci0gICAgICAgIF9nZW5lcmF0ZWQgPSBNb2RlbFV0aWxzLm1lcmdlKHRoaXMuX2dlbmVyYXRlZCwgb3RoZXIuX2dlbmVyYXRlZCk7Ci0gICAgICAgIF9sb2NhbE1ldGhvZCA9IE1vZGVsVXRpbHMubWVyZ2UodGhpcy5fbG9jYWxNZXRob2QsIG90aGVyLl9sb2NhbE1ldGhvZCk7Ci0gICAgICAgIF9sb2NhbE1ldGhvZFNjb3BlID0gTW9kZWxVdGlscy5tZXJnZSh0aGlzLl9sb2NhbE1ldGhvZFNjb3BlLCBvdGhlci5fbG9jYWxNZXRob2RTY29wZSk7Ci0gICAgICAgIF9zZXRNZXRob2RTY29wZSA9IE1vZGVsVXRpbHMubWVyZ2UodGhpcy5fc2V0TWV0aG9kU2NvcGUsIG90aGVyLl9zZXRNZXRob2RTY29wZSk7Ci0gICAgICAgIF9zZXRNZXRob2QgPSBNb2RlbFV0aWxzLm1lcmdlKHRoaXMuX3NldE1ldGhvZCwgb3RoZXIuX3NldE1ldGhvZCk7Ci0gICAgICAgIF90YWdFeGNsdWRlZCA9IE1vZGVsVXRpbHMubWVyZ2UodGhpcy5fdGFnRXhjbHVkZWQsIG90aGVyLl90YWdFeGNsdWRlZCk7Ci0gICAgICAgIF9ydGV4cHJ2YWx1ZSA9IE1vZGVsVXRpbHMubWVyZ2UodGhpcy5fcnRleHBydmFsdWUsIG90aGVyLl9ydGV4cHJ2YWx1ZSk7Ci0gICAgICAgIF9kZWZlcnJlZFZhbHVlVHlwZSA9IE1vZGVsVXRpbHMubWVyZ2UodGhpcy5fZGVmZXJyZWRWYWx1ZVR5cGUsIG90aGVyLl9kZWZlcnJlZFZhbHVlVHlwZSk7Ci0gICAgICAgIF9jbGllbnRFdmVudCA9IE1vZGVsVXRpbHMubWVyZ2UodGhpcy5fY2xpZW50RXZlbnQsIG90aGVyLl9jbGllbnRFdmVudCk7Ci0gICAgICAgIF9mYWNlbGV0c09ubHkgPSBNb2RlbFV0aWxzLm1lcmdlKHRoaXMuX2ZhY2VsZXRzT25seSwgb3RoZXIuX2ZhY2VsZXRzT25seSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBuYW1lIHRoYXQgdXNlcnMgcmVmZXIgdG8gdGhpcyBwcm9wZXJ0eSBieS4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIHNldHMgdGhlIG5hbWUgb2YgeG1sIHRhZyBhdHRyaWJ1dGVzLCBhbmQgdGhlIGJhc2UgbmFtZXMgb2YgZ2VuZXJhdGVkCi0gICAgICogZ2V0dGVyL3NldHRlciBtZXRob2RzLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpCi0gICAgewotICAgICAgICBfbmFtZSA9IG5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfbmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIGZ1bGx5LXF1YWxpZmllZCBuYW1lIG9mIHRoZSB0eXBlIG9mIHRoaXMgcHJvcGVydHkuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Q2xhc3NOYW1lKFN0cmluZyBjbGFzc05hbWUpCi0gICAgewotICAgICAgICB0aGlzLl9jbGFzc05hbWUgPSBjbGFzc05hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRDbGFzc05hbWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9jbGFzc05hbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU3BlY2lmeSB3aGV0aGVyIHRoaXMgcHJvcGVydHkgaXMgdHJhbnNpZW50IG9yIG5vdC4KLSAgICAgKiA8cD4KLSAgICAgKiBUcmFuc2llbnQgcHJvcGVydGllcyBhcmUgbm90IHNhdmVkIGluIHRoZSB2aWV3IHN0YXRlIGFuZCBhcmUgbm90IHJlc3RvcmVkCi0gICAgICogZHVyaW5nIHRoZSAicmVzdG9yZSB2aWV3IiBwaGFzZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRUcmFuc2llbnQoQm9vbGVhbiBzdGF0ZSkKLSAgICB7Ci0gICAgICAgIF90cmFuc2llbnQgPSBzdGF0ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQm9vbGVhbiBpc1RyYW5zaWVudCgpCi0gICAgewotICAgICAgICByZXR1cm4gTW9kZWxVdGlscy5kZWZhdWx0T2YoX3RyYW5zaWVudCwgZmFsc2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNwZWNpZnkgd2hldGhlciB0aGlzIHByb3BlcnR5IGlzIHJlcXVpcmVkLCBpZSB3aGV0aGVyIGl0IGlzIGEgc3ludGF4Ci0gICAgICogZXJyb3IgZm9yIHNvbWVvbmUgdG8gdXNlIGEgdGFnIGZvciBhIGNvbXBvbmVudCB3aXRoIHRoaXMgcHJvcGVydHkgYnV0IG5vdAotICAgICAqIGV4cGxpY2l0bHkgcHJvdmlkZSBhIHZhbHVlIGZvciB0aGlzIHByb3BlcnR5LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFJlcXVpcmVkKEJvb2xlYW4gcmVxdWlyZWQpCi0gICAgewotICAgICAgICBfcmVxdWlyZWQgPSByZXF1aXJlZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQm9vbGVhbiBpc1JlcXVpcmVkKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBNb2RlbFV0aWxzLmRlZmF1bHRPZihfcmVxdWlyZWQsIGZhbHNlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTcGVjaWZ5IHdoZXRoZXIgdGhpcyBwcm9wZXJ0eSBhY2NlcHRzIG9ubHkgbGl0ZXJhbCAoY29uc3RhbnQpIHZhbHVlcywgb3IKLSAgICAgKiB3aGV0aGVyIHRoaXMgcHJvcGVydHkgY2FuIGJlIG1hcHBlZCB0byBhbiBFTCBleHByZXNzaW9uLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldExpdGVyYWxPbmx5KEJvb2xlYW4gbGl0ZXJhbE9ubHkpCi0gICAgewotICAgICAgICBfbGl0ZXJhbE9ubHkgPSBsaXRlcmFsT25seTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQm9vbGVhbiBpc0xpdGVyYWxPbmx5KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBNb2RlbFV0aWxzLmRlZmF1bHRPZihfbGl0ZXJhbE9ubHksIGZhbHNlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgZGVzYykKLSAgICB7Ci0gICAgICAgIF9kZXNjcmlwdGlvbiA9IGRlc2M7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpCi0gICAgewotICAgICAgICByZXR1cm4gX2Rlc2NyaXB0aW9uOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldExvbmdEZXNjcmlwdGlvbihTdHJpbmcgZGVzYykKLSAgICB7Ci0gICAgICAgIF9sb25nRGVzY3JpcHRpb24gPSBkZXNjOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TG9uZ0Rlc2NyaXB0aW9uKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfbG9uZ0Rlc2NyaXB0aW9uOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoaXMgYXR0cmlidXRlLgotICAgICAqCi0gICAgICogQHBhcmFtIGRlZmF1bHRWYWx1ZSAgdGhlIGF0dHJpYnV0ZSBkZWZhdWx0IHZhbHVlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RGVmYXVsdFZhbHVlKFN0cmluZyBkZWZhdWx0VmFsdWUpCi0gICAgewotICAgICAgX2RlZmF1bHRWYWx1ZSA9IGRlZmF1bHRWYWx1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoaXMgYXR0cmlidXRlLgotICAgICAqCi0gICAgICogQHJldHVybiAgdGhlIGF0dHJpYnV0ZSBkZWZhdWx0IHZhbHVlCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXREZWZhdWx0VmFsdWUoKQotICAgIHsKLSAgICAgIHJldHVybiBfZGVmYXVsdFZhbHVlOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBKU1AgbmFtZSBvZiB0aGlzIHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHBhcmFtIGpzcE5hbWUgIHRoZSBKU1AgcHJvcGVydHkgbmFtZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEpzcE5hbWUoU3RyaW5nIGpzcE5hbWUpCi0gICAgewotICAgICAgX2pzcE5hbWUgPSBqc3BOYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIEpTUCBuYW1lIG9mIHRoaXMgcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuICB0aGUgSlNQIHByb3BlcnR5IG5hbWUKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldEpzcE5hbWUoKQotICAgIHsKLSAgICAgIGlmIChfanNwTmFtZSA9PSBudWxsKQotICAgICAgewotICAgICAgICByZXR1cm4gZ2V0TmFtZSgpOwotICAgICAgfQotCi0gICAgICByZXR1cm4gX2pzcE5hbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgZmllbGQgbmFtZSBvZiB0aGlzIHByb3BlcnR5LCB3aGVuIG5vdCBnZW5lcmF0aW5nIFRyaW5pZGFkIGNvbXBvbmVudHMKLSAgICAgKgotICAgICAqIEBwYXJhbSBmaWVsZE5hbWUgIHRoZSBmaWVsZCBwcm9wZXJ0eSBuYW1lCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RmllbGROYW1lKFN0cmluZyBmaWVsZE5hbWUpCi0gICAgewotICAgICAgX2ZpZWxkTmFtZSA9IGZpZWxkTmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBmaWVsZCBuYW1lIG9mIHRoaXMgcHJvcGVydHksIHdoZW4gbm90IGdlbmVyYXRpbmcgVHJpbmlkYWQgY29tcG9uZW50cwotICAgICAqCi0gICAgICogQHJldHVybiAgdGhlIGZpZWxkIHByb3BlcnR5IG5hbWUKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldEZpZWxkTmFtZSgpCi0gICAgewotICAgICAgaWYgKF9maWVsZE5hbWUgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuICJfIitnZXROYW1lKCk7Ci0gICAgICB9Ci0KLSAgICAgIHJldHVybiBfZmllbGROYW1lOwotICAgIH0KLSAgICAgICAgICAgIAotICAgIC8qKgotICAgICAqIFNldHMgdGhlIG1ldGhvZCBiaW5kaW5nIHNpZ25hdHVyZSBvZiB0aGlzIHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHBhcmFtIHNpZ25hdHVyZSAgdGhlIG1ldGhvZCBiaW5kaW5nIHNpZ25hdHVyZSBvZiB0aGlzIHByb3BlcnR5Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0TWV0aG9kQmluZGluZ1NpZ25hdHVyZSgKLSAgICAgIE1ldGhvZFNpZ25hdHVyZU1ldGEgc2lnbmF0dXJlKQotICAgIHsKLSAgICAgIF9zaWduYXR1cmUgPSBzaWduYXR1cmU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWV0aG9kIGJpbmRpbmcgc2lnbmF0dXJlIG9mIHRoaXMgcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBtZXRob2QgYmluZGluZyBzaWduYXR1cmUgb2YgdGhpcyBwcm9wZXJ0eQotICAgICAqLwotICAgIHB1YmxpYyBNZXRob2RTaWduYXR1cmVNZXRhIGdldE1ldGhvZEJpbmRpbmdTaWduYXR1cmUoKQotICAgIHsKLSAgICAgIHJldHVybiBfc2lnbmF0dXJlOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXRJbmhlcml0ZWQoQm9vbGVhbiBpbmhlcml0ZWQpCi0gICAgewotICAgICAgICBfaW5oZXJpdGVkID0gaW5oZXJpdGVkOwotICAgIH0KLQotICAgIHB1YmxpYyBCb29sZWFuIGlzSW5oZXJpdGVkKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBNb2RlbFV0aWxzLmRlZmF1bHRPZihfaW5oZXJpdGVkLCBmYWxzZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0SW5oZXJpdGVkVGFnKEJvb2xlYW4gaW5oZXJpdGVkVGFnKQotICAgIHsKLSAgICAgICAgX2luaGVyaXRlZFRhZyA9IGluaGVyaXRlZFRhZzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBwcm9wZXJ0eSB3YXMgaW5oZXJpdGVkIGZyb20gYW4gYW5jZXN0b3IgY29tcG9uZW50Ci0gICAgICogd2hpY2ggaGFzIG5vIGFzc29jaWF0ZWQgdGFnIGNsYXNzLgotICAgICAqIDxwPgotICAgICAqIFdoZW4gYSB0YWcgY2xhc3MgaXMgZ2VuZXJhdGVkIGZvciA8aT50aGlzPC9pPiBjb21wb25lbnQsIHRoZW4gdGhlIHRhZwotICAgICAqIGNsYXNzIHdpbGwgbmVlZCB0byBkZWZpbmUgYSBzZXR0ZXIgbWV0aG9kIHRvIGhhbmRsZSB0aGlzIHByb3BlcnR5LgotICAgICAqIDxwPgotICAgICAqIEhvd2V2ZXIgcHJvcGVydGllcyB3aGljaCBhcmUgaW5oZXJpdGVkIGZyb20gYW4gYW5jZXN0b3IgY29tcG9uZW50IHRoYXQKLSAgICAgKiBkb2VzIGhhdmUgYSB0YWcgY2xhc3Mgd2lsbCBub3QgbmVlZCAKLSAgICAgKiBAcGFyYW0gaW5oZXJpdGVkVGFnCi0gICAgICovCi0gICAgcHVibGljIEJvb2xlYW4gaXNJbmhlcml0ZWRUYWcoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE1vZGVsVXRpbHMuZGVmYXVsdE9mKF9pbmhlcml0ZWRUYWcsIGZhbHNlKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogCi0gICAgICovCi0gICAgcHVibGljIEJvb2xlYW4gaXNMb2NhbEluaGVyaXRlZFRhZygpCi0gICAgewotICAgICAgICByZXR1cm4gX2luaGVyaXRlZFRhZzsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc2V0VGFnRXhjbHVkZWQoQm9vbGVhbiB0YWdFeGNsdWRlZCkKLSAgICB7Ci0gICAgICAgIF90YWdFeGNsdWRlZCA9IHRhZ0V4Y2x1ZGVkOwotICAgIH0KLQotICAgIHB1YmxpYyBCb29sZWFuIGlzVGFnRXhjbHVkZWQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE1vZGVsVXRpbHMuZGVmYXVsdE9mKF90YWdFeGNsdWRlZCwgZmFsc2UpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXRHZW5lcmF0ZWQoQm9vbGVhbiBnZW5lcmF0ZWQpCi0gICAgewotICAgICAgICBfZ2VuZXJhdGVkID0gZ2VuZXJhdGVkOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEluZGljYXRlcyBpZiB0aGUgcHJvcGVydHkgc2hvdWxkIGJlIGdlbmVyYXRlZAotICAgICAqIG9yIG5vdC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHVibGljIEJvb2xlYW4gaXNHZW5lcmF0ZWQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE1vZGVsVXRpbHMuZGVmYXVsdE9mKF9nZW5lcmF0ZWQsIGZhbHNlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRTdGF0ZUhvbGRlcihCb29sZWFuIHN0YXRlSG9sZGVyKQotICAgIHsKLSAgICAgICAgX3N0YXRlSG9sZGVyID0gc3RhdGVIb2xkZXI7Ci0gICAgfQotCi0gICAgcHVibGljIEJvb2xlYW4gaXNTdGF0ZUhvbGRlcigpCi0gICAgewotICAgICAgICByZXR1cm4gTW9kZWxVdGlscy5kZWZhdWx0T2YoX3N0YXRlSG9sZGVyLCBmYWxzZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0TG9jYWxNZXRob2RTY29wZShTdHJpbmcgbG9jYWxNZXRob2RTY29wZSkKLSAgICB7Ci0gICAgICAgIF9sb2NhbE1ldGhvZFNjb3BlID0gbG9jYWxNZXRob2RTY29wZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldExvY2FsTWV0aG9kU2NvcGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9sb2NhbE1ldGhvZFNjb3BlID09IG51bGwgPyAicHJvdGVjdGVkIiA6IF9sb2NhbE1ldGhvZFNjb3BlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldExvY2FsTWV0aG9kKEJvb2xlYW4gbG9jYWxNZXRob2QpCi0gICAgewotICAgICAgICBfbG9jYWxNZXRob2QgPSBsb2NhbE1ldGhvZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQm9vbGVhbiBpc0xvY2FsTWV0aG9kKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBNb2RlbFV0aWxzLmRlZmF1bHRPZihfbG9jYWxNZXRob2QsZmFsc2UpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFNldE1ldGhvZFNjb3BlKFN0cmluZyBzZXRNZXRob2RTY29wZSkKLSAgICB7Ci0gICAgICAgIF9zZXRNZXRob2RTY29wZSA9IHNldE1ldGhvZFNjb3BlOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2V0TWV0aG9kU2NvcGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9zZXRNZXRob2RTY29wZSA9PSBudWxsID8gInByb3RlY3RlZCIgOiBfc2V0TWV0aG9kU2NvcGU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0U2V0TWV0aG9kKEJvb2xlYW4gc2V0TWV0aG9kKQotICAgIHsKLSAgICAgICAgX3NldE1ldGhvZCA9IHNldE1ldGhvZDsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc2V0UnRleHBydmFsdWUoQm9vbGVhbiBydGV4cHJ2YWx1ZSkKLSAgICB7Ci0gICAgICAgIF9ydGV4cHJ2YWx1ZSA9IHJ0ZXhwcnZhbHVlOwotICAgIH0KLQotICAgIHB1YmxpYyBCb29sZWFuIGlzUnRleHBydmFsdWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9ydGV4cHJ2YWx1ZTsKLSAgICB9Ci0gICAgCi0KLSAgICBwdWJsaWMgQm9vbGVhbiBpc1NldE1ldGhvZCgpCi0gICAgewotICAgICAgICByZXR1cm4gTW9kZWxVdGlscy5kZWZhdWx0T2YoX3NldE1ldGhvZCxmYWxzZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgcHJvcGVydHkgaXMgYSBtZXRob2QgYmluZGluZy4KLSAgICAgKiA8cD4KLSAgICAgKiBUT0RPOiB3aGF0IGlzIHRoaXMgZm9yPwotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzTWV0aG9kQmluZGluZygpCi0gICAgewotICAgICAgICByZXR1cm4gKCJqYXZheC5mYWNlcy5lbC5NZXRob2RCaW5kaW5nIi5lcXVhbHMoZ2V0Q2xhc3NOYW1lKCkpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBwcm9wZXJ0eSBpcyBhIG1ldGhvZCBiaW5kaW5nLgotICAgICAqIDxwPgotICAgICAqIFRPRE86IHdoYXQgaXMgdGhpcyBmb3I/Ci0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNNZXRob2RFeHByZXNzaW9uKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoImphdmF4LmVsLk1ldGhvZEV4cHJlc3Npb24iLmVxdWFscyhnZXRDbGFzc05hbWUoKSkpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBAc2luY2UgMS4wLjMKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXREZWZlcnJlZFZhbHVlVHlwZShTdHJpbmcgZGVmZXJyZWRWYWx1ZVR5cGUpCi0gICAgewotICAgICAgICBfZGVmZXJyZWRWYWx1ZVR5cGUgPSBkZWZlcnJlZFZhbHVlVHlwZTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogSW5kaWNhdGUgdGhlIHR5cGUgdGhhdCB2YWx1ZXMgc2hvdWxkIGJlCi0gICAgICogY2FzdCBvbiB0bGQuIEl0IGlzIHN1cHBvc2VkIHRoYXQgdGhlIGNsYXNzTmFtZSBpcwotICAgICAqIGphdmF4LmVsLlZhbHVlRXhwcmVzc2lvbiB0byBhcHBseSBpdC4gCi0gICAgICoKLSAgICAgKiBAc2luY2UgMS4wLjMKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldERlZmVycmVkVmFsdWVUeXBlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfZGVmZXJyZWRWYWx1ZVR5cGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogCi0gICAgICogQHNpbmNlIDEuMC40Ci0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRDbGllbnRFdmVudCgpCi0gICAgewotICAgICAgICByZXR1cm4gX2NsaWVudEV2ZW50OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIAotICAgICAqIEBzaW5jZSAxLjAuNAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldENsaWVudEV2ZW50KFN0cmluZyBjbGllbnRFdmVudCkKLSAgICB7Ci0gICAgICAgIHRoaXMuX2NsaWVudEV2ZW50ID0gY2xpZW50RXZlbnQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogCi0gICAgICogQHNpbmNlIDEuMC42Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UGFydGlhbFN0YXRlSG9sZGVyKEJvb2xlYW4gcGFydGlhbFN0YXRlSG9sZGVyKQotICAgIHsKLSAgICAgICAgX3BhcnRpYWxTdGF0ZUhvbGRlciA9IHBhcnRpYWxTdGF0ZUhvbGRlcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAKLSAgICAgKiBAc2luY2UgMS4wLjYKLSAgICAgKi8KLSAgICBwdWJsaWMgQm9vbGVhbiBpc1BhcnRpYWxTdGF0ZUhvbGRlcigpCi0gICAgewotICAgICAgICByZXR1cm4gTW9kZWxVdGlscy5kZWZhdWx0T2YoX3BhcnRpYWxTdGF0ZUhvbGRlciwgZmFsc2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIAotICAgICAqIEBzaW5jZSAxLjAuNgotICAgICAqLwotICAgIHB1YmxpYyBCb29sZWFuIGlzRmFjZWxldHNPbmx5KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBNb2RlbFV0aWxzLmRlZmF1bHRPZihfZmFjZWxldHNPbmx5LCBmYWxzZSk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIAotICAgICAqIEBzaW5jZSAxLjAuNgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEZhY2VsZXRzT25seShCb29sZWFuIGZhY2VsZXRzT25seSkKLSAgICB7Ci0gICAgICAgIF9mYWNlbGV0c09ubHkgPSBmYWNlbGV0c09ubHk7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvbW9kZWwvUmVuZGVyS2l0TWV0YS5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9tb2RlbC9SZW5kZXJLaXRNZXRhLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjM2Q3ZTMuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9tb2RlbC9SZW5kZXJLaXRNZXRhLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTAgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmJ1aWxkZXIubW9kZWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuVHJlZU1hcDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5kaWdlc3Rlci5EaWdlc3RlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmJ1aWxkZXIuaW8uWG1sV3JpdGVyOwotCi0vKioKLSAqIFN0b3JlIG1ldGFkYXRhIGFib3V0IGEgSlNGIFJlbmRlcktpdC4KLSAqLwotcHVibGljIGNsYXNzIFJlbmRlcktpdE1ldGEKLXsKLSAgICBwcml2YXRlIFN0cmluZyBfY2xhc3NOYW1lOwotCi0gICAgcHJpdmF0ZSBTdHJpbmcgX3JlbmRlcktpdElkID0gIiI7Ci0gICAgcHJpdmF0ZSBNYXAgX3JlbmRlcmVyczsKLSAgICBwcml2YXRlIE1hcCBfY2xpZW50QmVoYXZpb3JSZW5kZXJlcnM7Ci0KLSAgICAvKioKLSAgICAgKiBXcml0ZSBhbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIG91dCBhcyB4bWwuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHdyaXRlWG1sKFhtbFdyaXRlciBvdXQsIFJlbmRlcktpdE1ldGEgcmttKQotICAgIHsKLSAgICAgICAgb3V0LmJlZ2luRWxlbWVudCgicmVuZGVyS2l0Iik7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgIG91dC53cml0ZUVsZW1lbnQoInJlbmRlcktpdElkIiwgcmttLl9yZW5kZXJLaXRJZCk7Ci0gICAgICAgIG91dC53cml0ZUVsZW1lbnQoImNsYXNzTmFtZSIsIHJrbS5fY2xhc3NOYW1lKTsKLSAgICAgICAgCi0gICAgICAgIGZvciAoSXRlcmF0b3IgaXQgPSBya20uX3JlbmRlcmVycy52YWx1ZXMoKS5pdGVyYXRvcigpO2l0Lmhhc05leHQoKTspCi0gICAgICAgIHsKLSAgICAgICAgICAgIFJlbmRlcmVyTWV0YSBybSA9IChSZW5kZXJlck1ldGEpIGl0Lm5leHQoKTsKLSAgICAgICAgICAgIHJtLndyaXRlWG1sKG91dCk7ICAKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgZm9yIChJdGVyYXRvciBpdCA9IHJrbS5fY2xpZW50QmVoYXZpb3JSZW5kZXJlcnMudmFsdWVzKCkuaXRlcmF0b3IoKTtpdC5oYXNOZXh0KCk7KQotICAgICAgICB7Ci0gICAgICAgICAgICBDbGllbnRCZWhhdmlvclJlbmRlcmVyTWV0YSBybSA9IChDbGllbnRCZWhhdmlvclJlbmRlcmVyTWV0YSkgaXQubmV4dCgpOwotICAgICAgICAgICAgcm0ud3JpdGVYbWwob3V0KTsgIAotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBvdXQuZW5kRWxlbWVudCgicmVuZGVyS2l0Iik7ICAgICAgICAKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQWRkIGRpZ2VzdGVyIHJ1bGVzIHRvIHJlcG9wdWxhdGUgYW4gaW5zdGFuY2Ugb2YgdGhpcyB0eXBlIGZyb20gYW4geG1sCi0gICAgICogZmlsZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgYWRkWG1sUnVsZXMoRGlnZXN0ZXIgZGlnZXN0ZXIsIFN0cmluZyBwcmVmaXgpCi0gICAgewotICAgICAgICBTdHJpbmcgbmV3UHJlZml4ID0gcHJlZml4ICsgIi9yZW5kZXJLaXQiOwotCi0gICAgICAgIGRpZ2VzdGVyLmFkZE9iamVjdENyZWF0ZShuZXdQcmVmaXgsIFJlbmRlcktpdE1ldGEuY2xhc3MpOwotICAgICAgICBkaWdlc3Rlci5hZGRTZXROZXh0KG5ld1ByZWZpeCwgImFkZFJlbmRlcktpdCIpOwotCi0gICAgICAgIENsYXNzTWV0YS5hZGRYbWxSdWxlcyhkaWdlc3RlciwgbmV3UHJlZml4KTsKLQotICAgICAgICBkaWdlc3Rlci5hZGRCZWFuUHJvcGVydHlTZXR0ZXIobmV3UHJlZml4ICsgIi9yZW5kZXJLaXRJZCIpOwotICAgICAgICBkaWdlc3Rlci5hZGRCZWFuUHJvcGVydHlTZXR0ZXIobmV3UHJlZml4ICsgIi9jbGFzc05hbWUiKTsKLSAgICAgICAgCi0gICAgICAgIFJlbmRlcmVyTWV0YS5hZGRYbWxSdWxlcyhkaWdlc3RlciwgbmV3UHJlZml4KTsKLSAgICAgICAgQ2xpZW50QmVoYXZpb3JSZW5kZXJlck1ldGEuYWRkWG1sUnVsZXMoZGlnZXN0ZXIsIG5ld1ByZWZpeCk7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IFJlbmRlcktpdEJlYW4uCi0gICAgICovCi0gICAgcHVibGljIFJlbmRlcktpdE1ldGEoKQotICAgIHsKLSAgICAgICAgX3JlbmRlcmVycyA9IG5ldyBUcmVlTWFwKCk7Ci0gICAgICAgIF9jbGllbnRCZWhhdmlvclJlbmRlcmVycyA9IG5ldyBUcmVlTWFwKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhlIG5hbWUgb2YgdGhlIGNsYXNzIHRoYXQgdGhpcyBtZXRhZGF0YSBhcHBsaWVzIHRvLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2xhc3NOYW1lKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfY2xhc3NOYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldENsYXNzTmFtZShTdHJpbmcgY2xhc3NOYW1lKQotICAgIHsKLSAgICAgICAgX2NsYXNzTmFtZSA9IGNsYXNzTmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSByZW5kZXIga2l0IGlkIGZvciB0aGlzIGNvbXBvbmVudC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcmVuZGVyS2l0SWQKLSAgICAgKiAgICAgICAgICAgIHRoZSByZW5kZXIga2l0IGlkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UmVuZGVyS2l0SWQoU3RyaW5nIHJlbmRlcktpdElkKQotICAgIHsKLSAgICAgICAgX3JlbmRlcktpdElkID0gcmVuZGVyS2l0SWQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcmVuZGVyIGtpdCBpZCB0eXBlIGZvciB0aGlzIGNvbXBvbmVudC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSByZW5kZXIga2l0IGlkCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRSZW5kZXJLaXRJZCgpCi0gICAgewotICAgICAgICByZXR1cm4gX3JlbmRlcktpdElkOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZHMgYSByZW5kZXJlciB0byB0aGlzIHJlbmRlciBraXQuCi0gICAgICogCi0gICAgICogQHBhcmFtIHJlbmRlcmVyCi0gICAgICogICAgICAgICAgICB0aGUgcmVuZGVyZXIgdG8gYWRkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkUmVuZGVyZXIoUmVuZGVyZXJNZXRhIHJlbmRlcmVyKQotICAgIHsKLSAgICAgICAgU3RyaW5nIGNvbXBvbmVudEZhbWlseSA9IHJlbmRlcmVyLmdldENvbXBvbmVudEZhbWlseSgpOwotICAgICAgICBTdHJpbmcgcmVuZGVyZXJUeXBlID0gcmVuZGVyZXIuZ2V0UmVuZGVyZXJUeXBlKCk7Ci0gICAgICAgIFN0cmluZyBjb21wb3NpdGVLZXkgPSBjb21wb25lbnRGYW1pbHkgKyAifCIgKyByZW5kZXJlclR5cGU7Ci0gICAgICAgIF9yZW5kZXJlcnMucHV0KGNvbXBvc2l0ZUtleSwgcmVuZGVyZXIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHJlbmRlcmVyIGZvciB0aGlzIGNvbXBvbmVudCBmYW1pbHkgYW5kIHJlbmRlcmVyIHR5cGUuCi0gICAgICogCi0gICAgICogQHBhcmFtIGNvbXBvbmVudEZhbWlseQotICAgICAqICAgICAgICAgICAgdGhlIGNvbXBvbmVudCBmYW1pbHkKLSAgICAgKiBAcGFyYW0gcmVuZGVyZXJUeXBlCi0gICAgICogICAgICAgICAgICB0aGUgcmVuZGVyZXIgdHlwZQotICAgICAqLwotICAgIHB1YmxpYyBSZW5kZXJlck1ldGEgZmluZFJlbmRlcmVyKFN0cmluZyBjb21wb25lbnRGYW1pbHksCi0gICAgICAgICAgICBTdHJpbmcgcmVuZGVyZXJUeXBlKQotICAgIHsKLSAgICAgICAgU3RyaW5nIGNvbXBvc2l0ZUtleSA9IGNvbXBvbmVudEZhbWlseSArICJ8IiArIHJlbmRlcmVyVHlwZTsKLSAgICAgICAgcmV0dXJuIChSZW5kZXJlck1ldGEpIF9yZW5kZXJlcnMuZ2V0KGNvbXBvc2l0ZUtleSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgcmVuZGVyIGtpdCBoYXMgYW55IHJlbmRlcmVycy4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyByZW5kZXIga2l0IGhhcyBhbnkgcmVuZGVyZXJzLCBmYWxzZSBvdGhlcndpc2UKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNSZW5kZXJlcnMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuICFfcmVuZGVyZXJzLmlzRW1wdHkoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGFuIGl0ZXJhdG9yIGZvciBhbGwgcmVuZGVyZXJzIGluIHRoaXMgcmVuZGVyIGtpdC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSByZW5kZXJlciBpdGVyYXRvcgotICAgICAqLwotICAgIHB1YmxpYyBJdGVyYXRvciByZW5kZXJlcnMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9yZW5kZXJlcnMudmFsdWVzKCkuaXRlcmF0b3IoKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIENvbGxlY3Rpb24gZ2V0UmVuZGVyZXJzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfcmVuZGVyZXJzLnZhbHVlcygpOwotICAgIH0KLQotICAgIHZvaWQgYWRkQWxsUmVuZGVyZXJzKFJlbmRlcktpdE1ldGEgcmVuZGVyS2l0KQotICAgIHsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpID0gcmVuZGVyS2l0Ll9yZW5kZXJlcnMudmFsdWVzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyB1c2UgYWRkUmVuZGVyZXIgdG8gZXN0YWJsaXNoIG93bmVyCi0gICAgICAgICAgICBhZGRSZW5kZXJlcigoUmVuZGVyZXJNZXRhKSBpLm5leHQoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQWRkcyBhIHJlbmRlcmVyIHRvIHRoaXMgcmVuZGVyIGtpdC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcmVuZGVyZXIKLSAgICAgKiAgICAgICAgICAgIHRoZSByZW5kZXJlciB0byBhZGQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRDbGllbnRCZWhhdmlvclJlbmRlcmVyKENsaWVudEJlaGF2aW9yUmVuZGVyZXJNZXRhIHJlbmRlcmVyKQotICAgIHsKLSAgICAgICAgU3RyaW5nIHJlbmRlcmVyVHlwZSA9IHJlbmRlcmVyLmdldFJlbmRlcmVyVHlwZSgpOwotICAgICAgICBfY2xpZW50QmVoYXZpb3JSZW5kZXJlcnMucHV0KHJlbmRlcmVyVHlwZSwgcmVuZGVyZXIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHJlbmRlcmVyIGZvciB0aGlzIGNvbXBvbmVudCBmYW1pbHkgYW5kIHJlbmRlcmVyIHR5cGUuCi0gICAgICogCi0gICAgICogQHBhcmFtIGNvbXBvbmVudEZhbWlseQotICAgICAqICAgICAgICAgICAgdGhlIGNvbXBvbmVudCBmYW1pbHkKLSAgICAgKiBAcGFyYW0gcmVuZGVyZXJUeXBlCi0gICAgICogICAgICAgICAgICB0aGUgcmVuZGVyZXIgdHlwZQotICAgICAqLwotICAgIHB1YmxpYyBSZW5kZXJlck1ldGEgZmluZENsaWVudEJlaGF2aW9yUmVuZGVyZXIoU3RyaW5nIHJlbmRlcmVyVHlwZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoUmVuZGVyZXJNZXRhKSBfcmVuZGVyZXJzLmdldChyZW5kZXJlclR5cGUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIHJlbmRlciBraXQgaGFzIGFueSByZW5kZXJlcnMuCi0gICAgICogCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoaXMgcmVuZGVyIGtpdCBoYXMgYW55IHJlbmRlcmVycywgZmFsc2Ugb3RoZXJ3aXNlCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaGFzQ2xpZW50QmVoYXZpb3JSZW5kZXJlcnMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuICFfY2xpZW50QmVoYXZpb3JSZW5kZXJlcnMuaXNFbXB0eSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYW4gaXRlcmF0b3IgZm9yIGFsbCByZW5kZXJlcnMgaW4gdGhpcyByZW5kZXIga2l0LgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHJlbmRlcmVyIGl0ZXJhdG9yCi0gICAgICovCi0gICAgcHVibGljIEl0ZXJhdG9yIGNsaWVudEJlaGF2aW9yUmVuZGVyZXJzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfY2xpZW50QmVoYXZpb3JSZW5kZXJlcnMudmFsdWVzKCkuaXRlcmF0b3IoKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIENvbGxlY3Rpb24gZ2V0Q2xpZW50QmVoYXZpb3JSZW5kZXJlcnMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9jbGllbnRCZWhhdmlvclJlbmRlcmVycy52YWx1ZXMoKTsKLSAgICB9Ci0KLSAgICB2b2lkIGFkZEFsbENsaWVudEJlaGF2aW9yUmVuZGVyZXJzKFJlbmRlcktpdE1ldGEgcmVuZGVyS2l0KQotICAgIHsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpID0gcmVuZGVyS2l0Ll9jbGllbnRCZWhhdmlvclJlbmRlcmVycy52YWx1ZXMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIHVzZSBhZGRSZW5kZXJlciB0byBlc3RhYmxpc2ggb3duZXIKLSAgICAgICAgICAgIGFkZENsaWVudEJlaGF2aW9yUmVuZGVyZXIoKENsaWVudEJlaGF2aW9yUmVuZGVyZXJNZXRhKSBpLm5leHQoKSk7Ci0gICAgICAgIH0KLSAgICB9ICAgIAotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9tb2RlbC9SZW5kZXJlck1ldGEuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvbW9kZWwvUmVuZGVyZXJNZXRhLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1NGI1NDYuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9tb2RlbC9SZW5kZXJlck1ldGEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNiArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uYnVpbGRlci5tb2RlbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5kaWdlc3Rlci5EaWdlc3RlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmJ1aWxkZXIuaW8uWG1sV3JpdGVyOwotCi0KLS8qKgotICogU3RvcmUgbWV0YWRhdGEgYWJvdXQgYSBjbGFzcyB0aGF0IGlzIGVpdGhlciBhIEpTRiBSZW5kZXJlciwgb3Igc29tZSBiYXNlCi0gKiBjbGFzcyBvciBpbnRlcmZhY2UgdGhhdCBhIFJlbmRlcmVyIGNhbiBiZSBkZXJpdmVkIGZyb20uCi0gKi8KLXB1YmxpYyBjbGFzcyBSZW5kZXJlck1ldGEgZXh0ZW5kcyBDbGFzc01ldGEKLXsKLSAgICBwcml2YXRlIFN0cmluZyBfZGVzY3JpcHRpb247Ci0gICAgcHJpdmF0ZSBTdHJpbmcgX2NvbXBvbmVudEZhbWlseTsKLSAgICBwcml2YXRlIFN0cmluZyBfcmVuZGVyZXJUeXBlOwotCi0gICAgLyoqCi0gICAgICogV3JpdGUgYW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBvdXQgYXMgeG1sLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHdyaXRlWG1sU2ltcGxlKFhtbFdyaXRlciBvdXQpCi0gICAgewotICAgICAgICBzdXBlci53cml0ZVhtbFNpbXBsZShvdXQpOwotICAgICAgICAKLSAgICAgICAgb3V0LndyaXRlRWxlbWVudCgiY29tcG9uZW50RmFtaWx5IiwgX2NvbXBvbmVudEZhbWlseSk7Ci0gICAgICAgIG91dC53cml0ZUVsZW1lbnQoInJlbmRlcmVyVHlwZSIsIF9yZW5kZXJlclR5cGUpOwotICAgICAgICBvdXQud3JpdGVFbGVtZW50KCJkZXNjcmlwdGlvbiIsIF9kZXNjcmlwdGlvbik7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEFkZCBkaWdlc3RlciBydWxlcyB0byByZXBvcHVsYXRlIGFuIGluc3RhbmNlIG9mIHRoaXMgdHlwZSBmcm9tIGFuIHhtbAotICAgICAqIGZpbGUuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGFkZFhtbFJ1bGVzKERpZ2VzdGVyIGRpZ2VzdGVyLCBTdHJpbmcgcHJlZml4KQotICAgIHsKLSAgICAgICAgU3RyaW5nIG5ld1ByZWZpeCA9IHByZWZpeCArICIvcmVuZGVyZXIiOwotCi0gICAgICAgIGRpZ2VzdGVyLmFkZE9iamVjdENyZWF0ZShuZXdQcmVmaXgsIFJlbmRlcmVyTWV0YS5jbGFzcyk7Ci0gICAgICAgIGRpZ2VzdGVyLmFkZFNldE5leHQobmV3UHJlZml4LCAiYWRkUmVuZGVyZXIiKTsKLQotICAgICAgICBDbGFzc01ldGEuYWRkWG1sUnVsZXMoZGlnZXN0ZXIsIG5ld1ByZWZpeCk7Ci0KLSAgICAgICAgZGlnZXN0ZXIuYWRkQmVhblByb3BlcnR5U2V0dGVyKG5ld1ByZWZpeCArICIvY29tcG9uZW50RmFtaWx5Iik7Ci0gICAgICAgIGRpZ2VzdGVyLmFkZEJlYW5Qcm9wZXJ0eVNldHRlcihuZXdQcmVmaXggKyAiL3JlbmRlcmVyVHlwZSIpOwotICAgICAgICBkaWdlc3Rlci5hZGRCZWFuUHJvcGVydHlTZXR0ZXIobmV3UHJlZml4ICsgIi9kZXNjcmlwdGlvbiIpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IFJlbmRlcmVyQmVhbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgUmVuZGVyZXJNZXRhKCkKLSAgICB7Ci0gICAgICAgIHN1cGVyKCJyZW5kZXJlciIpOwotICAgIH0gICAgCi0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBjb21wb25lbnQgZmFtaWx5IGZvciB0aGlzIGNvbXBvbmVudC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gY29tcG9uZW50RmFtaWx5Ci0gICAgICogICAgICAgICAgICB0aGUgY29tcG9uZW50IGZhbWlseQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldENvbXBvbmVudEZhbWlseShTdHJpbmcgY29tcG9uZW50RmFtaWx5KQotICAgIHsKLSAgICAgICAgX2NvbXBvbmVudEZhbWlseSA9IGNvbXBvbmVudEZhbWlseTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjb21wb25lbnQgZmFtaWx5IGZvciB0aGlzIGNvbXBvbmVudC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBjb21wb25lbnQgZmFtaWx5Ci0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRDb21wb25lbnRGYW1pbHkoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9jb21wb25lbnRGYW1pbHk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgcmVuZGVyZXIgdHlwZSBmb3IgdGhpcyBjb21wb25lbnQuCi0gICAgICogCi0gICAgICogQHBhcmFtIHJlbmRlcmVyVHlwZQotICAgICAqICAgICAgICAgICAgdGhlIHJlbmRlcmVyIHR5cGUKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRSZW5kZXJlclR5cGUoU3RyaW5nIHJlbmRlcmVyVHlwZSkKLSAgICB7Ci0gICAgICAgIF9yZW5kZXJlclR5cGUgPSByZW5kZXJlclR5cGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcmVuZGVyZXIgdHlwZSBmb3IgdGhpcyBjb21wb25lbnQuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgcmVuZGVyZXIgdHlwZQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVuZGVyZXJUeXBlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfcmVuZGVyZXJUeXBlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGRlc2NyaXB0aW9uIG9mIHRoaXMgYXR0cmlidXRlLgotICAgICAqIAotICAgICAqIEBwYXJhbSBkZXNjcmlwdGlvbgotICAgICAqICAgICAgICAgICAgdGhlIGF0dHJpYnV0ZSBkZXNjcmlwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyBkZXNjcmlwdGlvbikKLSAgICB7Ci0gICAgICAgIF9kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGRlc2NyaXB0aW9uIG9mIHRoaXMgYXR0cmlidXRlLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGF0dHJpYnV0ZSBkZXNjcmlwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9kZXNjcmlwdGlvbjsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvbW9kZWwvVGFnTWV0YS5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9tb2RlbC9UYWdNZXRhLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhNTMzOGQuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9tb2RlbC9UYWdNZXRhLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTQgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmJ1aWxkZXIubW9kZWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5kaWdlc3Rlci5EaWdlc3RlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmJ1aWxkZXIuaW8uWG1sV3JpdGVyOwotCi0vKioKLSAqIFJlcHJlc2VudHMgbWV0YWRhdGEgYWJvdXQgYSBjbGFzcyB0aGF0IGlzIGp1c3QgYSBwdXJlIEpTRiBUYWcgY2xhc3MsCi0gKiB3aXRoIG5vIGNvcnJlc3BvbmRpbmcgSlNGIGNvbXBvbmVudCwgdmFsaWRhdG9yIG9yIGNvbnZlcnRlci4KLSAqIDxwPgotICogVGhlcmUgYXJlIG5vdCB2ZXJ5IG1hbnkgcHVyZSB0YWcgY2xhc3NlcywgYnV0IHRoZXJlIGFyZSBhIGZldy4gT25lCi0gKiBleGFtcGxlIGlzIHRoZSBmOmF0dHJpYnV0ZSB0YWcgZnJvbSB0aGUgSlNGIGNvcmUgc3BlY2lmaWNhdGlvbiwgd2hpY2gKLSAqIGV4aXN0cyBzb2xlbHkgdG8gc3RvcmUgYW4gZW50cnkgaW50byB0aGUgYXR0cmlidXRlcyBtYXAgb2Ygc29tZSBvdGhlcgotICogY29tcG9uZW50IHdoZW4gdGhlIHZpZXcgaXMgZmlyc3QgY3JlYXRlZC4KLSAqIDxwPgotICogQW5vdGhlciBleGFtcGxlIGlzIHRoZSBmOmNvbnZlcnRlciB0YWcsIHdoaWNoIGNyZWF0ZXMgYSBjb3JyZXNwb25kaW5nCi0gKiBjb252ZXJ0ZXIgY29tcG9uZW50IGJ5IGlkLCBhbmQgc3RvcmVzIGl0IGludG8gdGhlIHZpZXcuIFRoZSB0YWcgCi0gKiBkb2Vzbid0IGNvcnJlc3BvbmQgdG8gYW55IHBhcnRpY3VsYXIgY29udmVydGVyIGNsYXNzLCBzbyB0aGVyZSBpcwotICogbm8gY29udmVydGVyIGNsYXNzIHdob3NlIGFubm90YXRpb25zIGNhbiBiZSB1c2VkIHRvIGRlc2NyaWJlIHRoaXMKLSAqIGdlbmVyaWMgdGFnLiBOb3RlIHRoYXQgc3BlY2lmaWMgY29udmVydGVycyBjYW4gYWxzbyBoYXZlIHRoZWlyIG93bgotICogZGVkaWNhdGVkIHRhZ3MgKGVnIGY6Y29udmVydERhdGVUaW1lKSBpbiB3aGljaCBjYXNlIHRoZSBUTEQgZW50cnkKLSAqIGlzIGdlbmVyYXRlZCB1c2luZyBtZXRhZGF0YSBmcm9tIHRoZSBjb252ZXJ0ZXIgY2xhc3MuCi0gKiA8cD4KLSAqIEFub3RoZXIgY2FzZSB3aGVuIHRoaXMgaXMgbmVlZGVkIGlzIHdoZXJlIHRoZXJlIGFyZSBtdWx0aXBsZSB0YWdzIHRoYXQKLSAqIGNvcnJlc3BvbmQgdG8gYSBzaW5nbGUgY29tcG9uZW50IGNsYXNzLiBGb3IgZXhhbXBsZSwgaW4gdGhlIGNvcmUKLSAqIGltcGxlbWVudGF0aW9uIGJvdGggZjpvdXRwdXRUZXh0IGFuZCBmOnZlcmJhdGltIGFyZSBpbXBsZW1lbnRlZCB3aXRoCi0gKiB0aGUgVUlPdXRwdXRUZXh0IGNvbXBvbmVudC4gSW4gdGhpcyBjYXNlLCB0aGUgY29tcG9uZW50IGlzIHVzZWQgdG8KLSAqIGdlbmVyYXRlIG9uZSBUTEQgZW50cnkgKHRoZSAicHJpbWFyeSIgdGFnKSBidXQgVExEIGVudHJpZXMgZm9yIHRoZQotICogInNlY29uZGFyeSIgdGFnIG11c3QgYmUgdHJpZ2dlcmVkIGluIGFub3RoZXIgd2F5LgotICogPHA+Ci0gKiBJbiB0aGUgYWJvdmUgY2FzZXMsIHRoZSB0YWcgY2xhc3MgaXRzZWxmIGNhbiBiZSBhbm5vdGF0ZWQgd2l0aCB0aGlzCi0gKiBhbm5vdGF0aW9uLiBEdXJpbmcgVExEIGZpbGUgZ2VuZXJhdGlvbiwgYW4gYXBwcm9wcmlhdGUgZW50cnkgaXMgdGhlbgotICogYWRkZWQuCi0gKiA8cD4KLSAqIEFuIGFsdGVybmF0aXZlIGlzIHRvIG9taXQgdGhpcyBlbnRyeSwgYW5kIHNpbXBseSB3cml0ZSB0aGUgVExECi0gKiBlbnRyaWVzIGZvciB0aGVzZSBmZXcgY2xhc3NlcyBieSBoYW5kIGluIHRoZSAiYmFzZSIgZmlsZSB0aGF0IGdldHMKLSAqIGluY2x1ZGVkIGludG8gdGhlIGdlbmVyYXRlZCBvbmUuCi0gKi8KLXB1YmxpYyBjbGFzcyBUYWdNZXRhIGV4dGVuZHMgQ2xhc3NNZXRhIGltcGxlbWVudHMgQXR0cmlidXRlSG9sZGVyCi17Ci0gICAgcHJpdmF0ZSBTdHJpbmcgX25hbWU7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgX2JvZHlDb250ZW50OwotICAgIHByaXZhdGUgU3RyaW5nIF9kZXNjcmlwdGlvbjsKLSAgICBwcml2YXRlIFN0cmluZyBfbG9uZ0Rlc2NyaXB0aW9uOwotICAgIHByaXZhdGUgU3RyaW5nIF90YWdIYW5kbGVyOwotCi0gICAgcHJvdGVjdGVkIE1hcCBfYXR0cmlidXRlczsKLSAgICAKLSAgICAvKioKLSAgICAgKiBXcml0ZSBhbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIG91dCBhcyB4bWwuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgd3JpdGVYbWxTaW1wbGUoWG1sV3JpdGVyIG91dCkKLSAgICB7Ci0gICAgICAgIHN1cGVyLndyaXRlWG1sU2ltcGxlKG91dCk7Ci0KLSAgICAgICAgb3V0LndyaXRlRWxlbWVudCgibmFtZSIsIF9uYW1lKTsKLSAgICAgICAgb3V0LndyaXRlRWxlbWVudCgiYm9keUNvbnRlbnQiLCBfYm9keUNvbnRlbnQpOwotICAgICAgICBvdXQud3JpdGVFbGVtZW50KCJkZXNjIiwgX2Rlc2NyaXB0aW9uKTsKLSAgICAgICAgb3V0LndyaXRlRWxlbWVudCgibG9uZ0Rlc2MiLCBfbG9uZ0Rlc2NyaXB0aW9uKTsKLSAgICAgICAgb3V0LndyaXRlRWxlbWVudCgidGFnSGFuZGxlciIsIF90YWdIYW5kbGVyKTsKLQotICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBfYXR0cmlidXRlcy52YWx1ZXMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgICAgIHsKLSAgICAgICAgICAgIEF0dHJpYnV0ZU1ldGEgcHJvcCA9IChBdHRyaWJ1dGVNZXRhKSBpLm5leHQoKTsKLSAgICAgICAgICAgIEF0dHJpYnV0ZU1ldGEud3JpdGVYbWwob3V0LCBwcm9wKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZCBkaWdlc3RlciBydWxlcyB0byByZXBvcHVsYXRlIGFuIGluc3RhbmNlIG9mIHRoaXMgdHlwZSBmcm9tIGFuIHhtbAotICAgICAqIGZpbGUuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGFkZFhtbFJ1bGVzKERpZ2VzdGVyIGRpZ2VzdGVyLCBTdHJpbmcgcHJlZml4KQotICAgIHsKLSAgICAgICAgU3RyaW5nIG5ld1ByZWZpeCA9IHByZWZpeCArICIvdGFnIjsKLQotICAgICAgICBkaWdlc3Rlci5hZGRPYmplY3RDcmVhdGUobmV3UHJlZml4LCBUYWdNZXRhLmNsYXNzKTsKLSAgICAgICAgZGlnZXN0ZXIuYWRkU2V0TmV4dChuZXdQcmVmaXgsICJhZGRUYWciKTsKLQotICAgICAgICBDbGFzc01ldGEuYWRkWG1sUnVsZXMoZGlnZXN0ZXIsIG5ld1ByZWZpeCk7Ci0gICAgICAgIGRpZ2VzdGVyLmFkZEJlYW5Qcm9wZXJ0eVNldHRlcihuZXdQcmVmaXggKyAiL25hbWUiLCAibmFtZSIpOwotICAgICAgICBkaWdlc3Rlci5hZGRCZWFuUHJvcGVydHlTZXR0ZXIobmV3UHJlZml4ICsgIi9ib2R5Q29udGVudCIsICJib2R5Q29udGVudCIpOwotICAgICAgICBkaWdlc3Rlci5hZGRCZWFuUHJvcGVydHlTZXR0ZXIobmV3UHJlZml4ICsgIi9kZXNjIiwgImRlc2NyaXB0aW9uIik7Ci0gICAgICAgIGRpZ2VzdGVyLmFkZEJlYW5Qcm9wZXJ0eVNldHRlcihuZXdQcmVmaXggKyAiL2xvbmdEZXNjIiwKLSAgICAgICAgICAgICAgICAibG9uZ0Rlc2NyaXB0aW9uIik7Ci0gICAgICAgIGRpZ2VzdGVyLmFkZEJlYW5Qcm9wZXJ0eVNldHRlcihuZXdQcmVmaXggKyAiL3RhZ0hhbmRsZXIiKTsKLSAgICAgICAgCi0gICAgICAgIEF0dHJpYnV0ZU1ldGEuYWRkWG1sUnVsZXMoZGlnZXN0ZXIsIG5ld1ByZWZpeCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IuCi0gICAgICovCi0gICAgcHVibGljIFRhZ01ldGEoKQotICAgIHsKLSAgICAgICAgc3VwZXIoInRhZyIpOwotICAgICAgICBfYXR0cmlidXRlcyA9IG5ldyBMaW5rZWRIYXNoTWFwKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTWVyZ2UgdGhlIGRhdGEgaW4gdGhlIHNwZWNpZmllZCBvdGhlciBwcm9wZXJ0eSBpbnRvIHRoaXMgb25lLCB0aHJvd2luZyBhbgotICAgICAqIGV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhbiBpbmNvbXBhdGliaWxpdHkuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgbWVyZ2UoVGFnTWV0YSBvdGhlcikKLSAgICB7Ci0gICAgICAgIF9uYW1lID0gTW9kZWxVdGlscy5tZXJnZSh0aGlzLl9uYW1lLCBvdGhlci5fbmFtZSk7Ci0gICAgICAgIF9kZXNjcmlwdGlvbiA9IE1vZGVsVXRpbHMubWVyZ2UodGhpcy5fZGVzY3JpcHRpb24sIG90aGVyLl9kZXNjcmlwdGlvbik7Ci0gICAgICAgIF9sb25nRGVzY3JpcHRpb24gPSBNb2RlbFV0aWxzLm1lcmdlKHRoaXMuX2xvbmdEZXNjcmlwdGlvbiwKLSAgICAgICAgICAgICAgICBvdGhlci5fbG9uZ0Rlc2NyaXB0aW9uKTsKLSAgICAgICAgX2JvZHlDb250ZW50ID0gTW9kZWxVdGlscy5tZXJnZSh0aGlzLl9ib2R5Q29udGVudCwgb3RoZXIuX2JvZHlDb250ZW50KTsKLSAgICAgICAgX3RhZ0hhbmRsZXIgPSBNb2RlbFV0aWxzLm1lcmdlKHRoaXMuX3RhZ0hhbmRsZXIsIG90aGVyLl90YWdIYW5kbGVyKTsKLSAgICAgICAgLy9UT0RPOiBNZXJnZSBhdHRyaWJ1dGVzCi0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGJyaWVmIGRlc2NyaXB0aW9uIG9mIHRoaXMgcHJvcGVydHkuCi0gICAgICogPHA+Ci0gICAgICogVGhpcyBkZXNjcmlwdGlvbiBpcyB1c2VkIGluIHRvb2x0aXBzLCBldGMuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIGRlc2NyaXB0aW9uKQotICAgIHsKLSAgICAgICAgX2Rlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpCi0gICAgewotICAgICAgICByZXR1cm4gX2Rlc2NyaXB0aW9uOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGxvbmcgZGVzY3JpcHRpb24gb2YgdGhpcyBwcm9wZXJ0eS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRMb25nRGVzY3JpcHRpb24oU3RyaW5nIGxvbmdEZXNjcmlwdGlvbikKLSAgICB7Ci0gICAgICAgIF9sb25nRGVzY3JpcHRpb24gPSBsb25nRGVzY3JpcHRpb247Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRMb25nRGVzY3JpcHRpb24oKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9sb25nRGVzY3JpcHRpb247Ci0gICAgfQotICAgICAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXRCb2R5Q29udGVudChTdHJpbmcgYm9keUNvbnRlbnQpCi0gICAgewotICAgICAgICB0aGlzLl9ib2R5Q29udGVudCA9IGJvZHlDb250ZW50OwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Qm9keUNvbnRlbnQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9ib2R5Q29udGVudDsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgbmFtZSB0aGF0IHRoZSB1c2VyIHdpbGwgcmVmZXIgdG8gaW5zdGFuY2VzIG9mIHRoaXMgY29tcG9uZW50IGJ5LgotICAgICAqIDxwPgotICAgICAqIEluIEpTUCB0YWdzLCB0aGlzIHZhbHVlIHdpbGwgYmUgdXNlZCBhcyB0aGUgSlNQIHRhZyBuYW1lLgotICAgICAqIDxwPgotICAgICAqIFRoaXMgcHJvcGVydHkgaXMgb3B0aW9uYWw7IGlmIG5vdCBzZXQgdGhlbiB0aGlzIE1vZGVsIGluc3RhbmNlIHJlcHJlc2VudHMKLSAgICAgKiBhIGJhc2UgY2xhc3MgdGhhdCBjb21wb25lbnRzIGNhbiBiZSBkZXJpdmVkIGZyb20sIGJ1dCB3aGljaCBjYW5ub3QgaXRzZWxmCi0gICAgICogYmUgaW5zdGFudGlhdGVkIGFzIGEgY29tcG9uZW50LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpCi0gICAgewotICAgICAgICBfbmFtZSA9IG5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfbmFtZTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogU3BlY2lmaWVzIHRoZSBjbGFzcyBvZiB0aGUgRmFjZWxldHMgdGFnIGhhbmRsZXIgKGNvbXBvbmVudCBoYW5kbGVyKSBmb3IKLSAgICAgKiB0aGlzIGNvbXBvbmVudC4KLSAgICAgKiA8cD4KLSAgICAgKiBOb3RlIHRoYXQgYSBGYWNlbGV0cyB0YWcgaGFuZGxlciBjbGFzcyBpcyBub3QgbmVlZGVkIGZvciBtb3N0IGNvbXBvbmVudHMuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VGFnSGFuZGxlcihTdHJpbmcgdGFnSGFuZGxlcikKLSAgICB7Ci0gICAgICAgIF90YWdIYW5kbGVyID0gdGFnSGFuZGxlcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFRhZ0hhbmRsZXIoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF90YWdIYW5kbGVyOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBBZGRzIGEgcHJvcGVydHkgdG8gdGhpcyBjb21wb25lbnQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkQXR0cmlidXRlKEF0dHJpYnV0ZU1ldGEgYXR0cmlidXRlKQotICAgIHsKLSAgICAgICAgX2F0dHJpYnV0ZXMucHV0KGF0dHJpYnV0ZS5nZXROYW1lKCksIGF0dHJpYnV0ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIEF0dHJpYnV0ZU1ldGEgZ2V0QXR0cmlidXRlKFN0cmluZyBhdHRyaWJ1dGVOYW1lKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChBdHRyaWJ1dGVNZXRhKSBfYXR0cmlidXRlcy5nZXQoYXR0cmlidXRlTmFtZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTnVtYmVyIG9mIHByb3BlcnRpZXMgZm9yIHRoaXMgY29tcG9uZW50Ci0gICAgICovCi0gICAgcHVibGljIGludCBhdHRyaWJ1dGVzU2l6ZSgpCi0gICAgewotICAgICAgICByZXR1cm4gX2F0dHJpYnV0ZXMuc2l6ZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGNvbXBvbmVudCBoYXMgYW55IHByb3BlcnRpZXMuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaGFzQXR0cmlidXRlcygpCi0gICAgewotICAgICAgICByZXR1cm4gX2F0dHJpYnV0ZXMuc2l6ZSgpID4gMDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGFuIGl0ZXJhdG9yIGZvciBhbGwgcHJvcGVydGllcwotICAgICAqLwotICAgIHB1YmxpYyBJdGVyYXRvciBhdHRyaWJ1dGVzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfYXR0cmlidXRlcy52YWx1ZXMoKS5pdGVyYXRvcigpOwotICAgIH0KLSAgICAKLSAgICAvL1RISVMgTUVUSE9EUyBBUkUgVVNFRCBGT1IgVkVMT0NJVFkgVE8gR0VUIERBVEEgQU5EIEdFTkVSQVRFIENMQVNTRVMKLSAgICAKLSAgICBwdWJsaWMgQ29sbGVjdGlvbiBnZXRBdHRyaWJ1dGVMaXN0KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfYXR0cmlidXRlcy52YWx1ZXMoKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvbW9kZWwvVmFsaWRhdG9yTWV0YS5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9tb2RlbC9WYWxpZGF0b3JNZXRhLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjOGZlMGUuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9tb2RlbC9WYWxpZGF0b3JNZXRhLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzODUgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmJ1aWxkZXIubW9kZWw7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5kaWdlc3Rlci5EaWdlc3RlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmJ1aWxkZXIuaW8uWG1sV3JpdGVyOwotCi0vKioKLSAqIFN0b3JlIG1ldGFkYXRhIGFib3V0IGEgY2xhc3MgdGhhdCBpcyBlaXRoZXIgYSBKU0YgVmFsaWRhdG9yLCBvciBzb21lIGJhc2UKLSAqIGNsYXNzIG9yIGludGVyZmFjZSB0aGF0IGEgVmFsaWRhdG9yIGNhbiBiZSBkZXJpdmVkIGZyb20uCi0gKi8KLXB1YmxpYyBjbGFzcyBWYWxpZGF0b3JNZXRhIGV4dGVuZHMgVmlld0VudGl0eU1ldGEgaW1wbGVtZW50cyBQcm9wZXJ0eUhvbGRlcgotewotICAgIHByaXZhdGUgU3RyaW5nIF92YWxpZGF0b3JJZDsKLSAgICBwcml2YXRlIGludCBfdmFsaWRhdG9yQ2xhc3NNb2RpZmllcnM7Ci0gICAgCi0gICAgcHJpdmF0ZSBTdHJpbmcgX2JvZHlDb250ZW50OwotICAgIHByaXZhdGUgU3RyaW5nIF90YWdDbGFzczsKLSAgICBwcml2YXRlIFN0cmluZyBfdGFnU3VwZXJjbGFzczsKLSAgICBwcml2YXRlIFN0cmluZyBfc2VyaWFsdWlkdGFnOwotICAgIHByaXZhdGUgU3RyaW5nIF90YWdIYW5kbGVyOwotICAgIAotICAgIHByaXZhdGUgQm9vbGVhbiBfZ2VuZXJhdGVkQ29tcG9uZW50Q2xhc3M7Ci0gICAgcHJpdmF0ZSBCb29sZWFuIF9nZW5lcmF0ZWRUYWdDbGFzczsKLSAgICBwcml2YXRlIEJvb2xlYW4gX2NvbmZpZ0V4Y2x1ZGVkOwotICAgIAotICAgIHByaXZhdGUgQm9vbGVhbiBfZXZhbHVhdGVFTE9uRXhlY3V0aW9uOwotCi0gICAgLyoqCi0gICAgICogV3JpdGUgYW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBvdXQgYXMgeG1sLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHdyaXRlWG1sU2ltcGxlKFhtbFdyaXRlciBvdXQpCi0gICAgewotICAgICAgICBzdXBlci53cml0ZVhtbFNpbXBsZShvdXQpOwotCi0gICAgICAgIG91dC53cml0ZUVsZW1lbnQoInZhbGlkYXRvcklkIiwgX3ZhbGlkYXRvcklkKTsKLSAgICAgICAgb3V0LndyaXRlRWxlbWVudCgiYm9keUNvbnRlbnQiLCBfYm9keUNvbnRlbnQpOwotICAgICAgICBvdXQud3JpdGVFbGVtZW50KCJ0YWdDbGFzcyIsIF90YWdDbGFzcyk7Ci0gICAgICAgIG91dC53cml0ZUVsZW1lbnQoInRhZ1N1cGVyY2xhc3MiLCBfdGFnU3VwZXJjbGFzcyk7Ci0gICAgICAgIG91dC53cml0ZUVsZW1lbnQoInRhZ0hhbmRsZXIiLCBfdGFnSGFuZGxlcik7Ci0gICAgICAgIG91dC53cml0ZUVsZW1lbnQoInNlcmlhbHVpZHRhZyIsIF9zZXJpYWx1aWR0YWcpOwotICAgICAgICBvdXQud3JpdGVFbGVtZW50KCJnZW5lcmF0ZWRDb21wb25lbnRDbGFzcyIsIF9nZW5lcmF0ZWRDb21wb25lbnRDbGFzcyk7Ci0gICAgICAgIG91dC53cml0ZUVsZW1lbnQoImdlbmVyYXRlZFRhZ0NsYXNzIiwgX2dlbmVyYXRlZFRhZ0NsYXNzKTsKLSAgICAgICAgb3V0LndyaXRlRWxlbWVudCgiY29uZmlnRXhjbHVkZWQiLCBfY29uZmlnRXhjbHVkZWQpOwotICAgICAgICBvdXQud3JpdGVFbGVtZW50KCJldmFsdWF0ZUVMT25FeGVjdXRpb24iLCBfZXZhbHVhdGVFTE9uRXhlY3V0aW9uKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGQgZGlnZXN0ZXIgcnVsZXMgdG8gcmVwb3B1bGF0ZSBhbiBpbnN0YW5jZSBvZiB0aGlzIHR5cGUgZnJvbSBhbiB4bWwKLSAgICAgKiBmaWxlLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhZGRYbWxSdWxlcyhEaWdlc3RlciBkaWdlc3RlciwgU3RyaW5nIHByZWZpeCkKLSAgICB7Ci0gICAgICAgIFN0cmluZyBuZXdQcmVmaXggPSBwcmVmaXggKyAiL3ZhbGlkYXRvciI7Ci0KLSAgICAgICAgZGlnZXN0ZXIuYWRkT2JqZWN0Q3JlYXRlKG5ld1ByZWZpeCwgVmFsaWRhdG9yTWV0YS5jbGFzcyk7Ci0gICAgICAgIGRpZ2VzdGVyLmFkZFNldE5leHQobmV3UHJlZml4LCAiYWRkVmFsaWRhdG9yIik7Ci0KLSAgICAgICAgVmlld0VudGl0eU1ldGEuYWRkWG1sUnVsZXMoZGlnZXN0ZXIsIG5ld1ByZWZpeCk7Ci0KLSAgICAgICAgZGlnZXN0ZXIuYWRkQmVhblByb3BlcnR5U2V0dGVyKG5ld1ByZWZpeCArICIvdmFsaWRhdG9ySWQiKTsKLSAgICAgICAgZGlnZXN0ZXIuYWRkQmVhblByb3BlcnR5U2V0dGVyKG5ld1ByZWZpeCArICIvYm9keUNvbnRlbnQiKTsKLSAgICAgICAgZGlnZXN0ZXIuYWRkQmVhblByb3BlcnR5U2V0dGVyKG5ld1ByZWZpeCArICIvdGFnQ2xhc3MiKTsKLSAgICAgICAgZGlnZXN0ZXIuYWRkQmVhblByb3BlcnR5U2V0dGVyKG5ld1ByZWZpeCArICIvdGFnU3VwZXJjbGFzcyIpOwotICAgICAgICBkaWdlc3Rlci5hZGRCZWFuUHJvcGVydHlTZXR0ZXIobmV3UHJlZml4ICsgIi90YWdIYW5kbGVyIik7Ci0gICAgICAgIGRpZ2VzdGVyLmFkZEJlYW5Qcm9wZXJ0eVNldHRlcihuZXdQcmVmaXggKyAiL3NlcmlhbHVpZHRhZyIpOwotICAgICAgICBkaWdlc3Rlci5hZGRCZWFuUHJvcGVydHlTZXR0ZXIobmV3UHJlZml4ICsgIi9nZW5lcmF0ZWRDb21wb25lbnRDbGFzcyIpOwotICAgICAgICBkaWdlc3Rlci5hZGRCZWFuUHJvcGVydHlTZXR0ZXIobmV3UHJlZml4ICsgIi9nZW5lcmF0ZWRUYWdDbGFzcyIpOwotICAgICAgICBkaWdlc3Rlci5hZGRCZWFuUHJvcGVydHlTZXR0ZXIobmV3UHJlZml4ICsgIi9jb25maWdFeGNsdWRlZCIpOwotICAgICAgICBkaWdlc3Rlci5hZGRCZWFuUHJvcGVydHlTZXR0ZXIobmV3UHJlZml4ICsgIi9ldmFsdWF0ZUVMT25FeGVjdXRpb24iKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFZhbGlkYXRvck1ldGEoKQotICAgIHsKLSAgICAgICAgc3VwZXIoInZhbGlkYXRvciIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE1lcmdlIHRoZSBkYXRhIGluIHRoZSBzcGVjaWZpZWQgb3RoZXIgcHJvcGVydHkgaW50byB0aGlzIG9uZSwgdGhyb3dpbmcgYW4KLSAgICAgKiBleGNlcHRpb24gaWYgdGhlcmUgaXMgYW4gaW5jb21wYXRpYmlsaXR5LgotICAgICAqIAotICAgICAqIE5vdCB1c2VkIHJpZ2h0IG5vdyBzaW5jZSB0aGVvcmljYWxseSB0aGVyZSBpcyB2ZXJ5IGZldyBpbmhlcml0YW5jZQotICAgICAqIG9uIGNvbnZlcnRlcnMKLSAgICAgKiAKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBtZXJnZShWYWxpZGF0b3JNZXRhIG90aGVyKQotICAgIHsKLSAgICAgICAgc3VwZXIubWVyZ2Uob3RoZXIpOwotCi0gICAgICAgIF9ib2R5Q29udGVudCA9IE1vZGVsVXRpbHMubWVyZ2UodGhpcy5fYm9keUNvbnRlbnQsIG90aGVyLl9ib2R5Q29udGVudCk7Ci0KLSAgICAgICAgLy8gaW5oZXJpdFBhcmVudFRhZyBpcyB0cnVlIGlmIHRoZSB0YWcgY2xhc3MgdG8gYmUgZ2VuZXJhdGVkIGZvciB0aGlzCi0gICAgICAgIC8vIGFydGlmYWN0IGV4dGVuZHMgdGhlIHRhZyBjbGFzcyBnZW5lcmF0ZWQgZm9yIHRoZSBwYXJlbnQgYXJ0aWZhY3QuCi0gICAgICAgIC8vIEluIHRoaXMgY2FzZSwgdGhlIHRhZyBmb3IgdGhpcyBjbGFzcyBhbHJlYWR5IGluaGVyaXRzIHNldHRlciBtZXRob2RzCi0gICAgICAgIC8vIGZyb20gaXRzIHBhcmVudCB0aGF0IGhhbmRsZSBhbGwgdGhlIGluaGVyaXRlZCBwcm9wZXJ0aWVzLCBzbyB0aGUKLSAgICAgICAgLy8gdGFnIGNsYXNzIGZvciB0aGlzIGNvbXBvbmVudCBqdXN0IG5lZWRzIHRvIGhhbmRsZSBpdHMgb3duIHByb3BlcnRpZXMuCi0gICAgICAgIC8vCi0gICAgICAgIC8vIEJ1dCB3aGVuIHRoZSB0YWcgY2xhc3MgZm9yIHRoaXMgY29tcG9uZW50IGRvZXMgbm90IGV4dGVuZCB0aGUgdGFnIGNsYXNzCi0gICAgICAgIC8vIGZvciB0aGUgcGFyZW50IGNvbXBvbmVudCAoYmVjYXVzZSB0aGUgcGFyZW50IGNvbXBvbmVudCBkb2VzIG5vdCBoYXZlCi0gICAgICAgIC8vIGEgdGFnIGNsYXNzKSB0aGVuIHdlIG5lZWQgdG8gCi0gICAgICAgIGJvb2xlYW4gaW5oZXJpdFBhcmVudFRhZyA9IGZhbHNlOwotICAgICAgICBpZiAob3RoZXIuX3RhZ0NsYXNzICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vVGhlIHRhZ1N1cGVyY2xhc3MgaXMgdGhlIHRhZ0NsYXNzIG9mIHRoZSBwYXJlbnQKLSAgICAgICAgICAgIF90YWdTdXBlcmNsYXNzID0gTW9kZWxVdGlscy5tZXJnZSh0aGlzLl90YWdTdXBlcmNsYXNzLAotICAgICAgICAgICAgICAgICAgICBvdGhlci5fdGFnQ2xhc3MpOwotICAgICAgICAgICAgaW5oZXJpdFBhcmVudFRhZyA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICAvL1RoZSB0YWdTdXBlcmNsYXNzIGlzIHRoZSB0YWdTdXBlcmNsYXNzIG9mIHRoZSBwYXJlbnQKLSAgICAgICAgICAgIF90YWdTdXBlcmNsYXNzID0gTW9kZWxVdGlscy5tZXJnZSh0aGlzLl90YWdTdXBlcmNsYXNzLAotICAgICAgICAgICAgICAgICAgICBvdGhlci5fdGFnU3VwZXJjbGFzcyk7ICAgICAgICAgICAgCi0gICAgICAgIH0KLQotICAgICAgICBfdGFnSGFuZGxlciA9IE1vZGVsVXRpbHMubWVyZ2UodGhpcy5fdGFnSGFuZGxlciwgb3RoZXIuX3RhZ0hhbmRsZXIpOwotICAgICAgICBfZXZhbHVhdGVFTE9uRXhlY3V0aW9uID0gTW9kZWxVdGlscy5tZXJnZSh0aGlzLl9ldmFsdWF0ZUVMT25FeGVjdXRpb24sIG90aGVyLl9ldmFsdWF0ZUVMT25FeGVjdXRpb24pOwotICAgICAgICAKLSAgICAgICAgX3ZhbGlkYXRvcklkID0gTW9kZWxVdGlscy5tZXJnZSh0aGlzLl92YWxpZGF0b3JJZCwgb3RoZXIuX3ZhbGlkYXRvcklkKTsKLQotICAgICAgICAvLyBUT0RPOiBfdmFsaWRhdG9yQ2xhc3NNT2RpZmllcnMKLSAgICAgICAgCi0gICAgICAgIGlmIChpbmhlcml0UGFyZW50VGFnKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSB0aGlzLnByb3BlcnRpZXMoKTsgaS5oYXNOZXh0KCk7KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFByb3BlcnR5TWV0YSBzcmNQcm9wID0gKFByb3BlcnR5TWV0YSkgaS5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgUHJvcGVydHlNZXRhIHBhcmVudFByb3AgPSBvdGhlci5nZXRQcm9wZXJ0eShzcmNQcm9wLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgaWYgKHBhcmVudFByb3AgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vVGhlcmUgYXJlIHRocmVlIHBvc3NpYmxlIGJlaGF2aW9yczoKLSAgICAgICAgICAgICAgICAgICAgLy8xLiBUaGUgcHJvcGVydHkgaXMgZGVmaW5lZCBvbiB0aGUgY2hpbGQgYWdhaW4gYW5kCi0gICAgICAgICAgICAgICAgICAgIC8vICAgdGhlIHByb3BlcnR5IHdhcyBhbHJlYWR5IG9uIHRoZSB0YWcgaGllcmFyY2h5LCBzbwotICAgICAgICAgICAgICAgICAgICAvLyAgIGluaGVyaXRlZFRhZyBtdXN0IGJlIHNldCB0byBUUlVFLgotICAgICAgICAgICAgICAgICAgICAvLzIuIFRoZSBwcm9wZXJ0eSBpcyBkZWZpbmVkIG9uIHRoZSBjaGlsZCBhZ2FpbiBhbmQKLSAgICAgICAgICAgICAgICAgICAgLy8gICBpdCBpcyBuZWNlc3NhcnkgdG8gd3JpdGUgYWdhaW4gb24gdGhlIGdlbmVyYXRlZAotICAgICAgICAgICAgICAgICAgICAvLyAgIHRhZywgc28gdGhlIGFubm90YXRpb24gbG9va3MgbGlrZQotICAgICAgICAgICAgICAgICAgICAvLyAgICJASlNGUHJvcGVydHkgaW5oZXJpdGVkVGFnPWZhbHNlIgotICAgICAgICAgICAgICAgICAgICAvLyAgIFRoaXMgY29uZGl0aW9uIG11c3QgcmVtYWluIGFzIEZBTFNFCi0gICAgICAgICAgICAgICAgICAgIC8vMy4gVGhlIHByb3BlcnR5IGlzIHNldCBieSB0aGUgdXNlciBhcyB0cnVlLCBidXQgdGhlcmUKLSAgICAgICAgICAgICAgICAgICAgLy8gICB3YXMgbm90IGRlZmluZWQgcHJldmlvdXNseSBvbiB0aGUgaGllcmFyY2h5LCBzbwotICAgICAgICAgICAgICAgICAgICAvLyAgIHRoaXMgY29uZGl0aW9uIG11c3QgYmUgYXMgaXMgKFRSVUUpIAotICAgICAgICAgICAgICAgICAgICAvLyAgIChza2lwcGVkIG9uIHBhcmVudFByb3AgIT0gbnVsbCkuCi0gICAgICAgICAgICAgICAgICAgIGlmIChzcmNQcm9wLmlzTG9jYWxJbmhlcml0ZWRUYWcoKSA9PSBudWxsIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjUHJvcC5pc0luaGVyaXRlZFRhZygpLmJvb2xlYW5WYWx1ZSgpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzcmNQcm9wLnNldEluaGVyaXRlZFRhZyhCb29sZWFuLlRSVUUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgX3Byb3BlcnR5VGFnTGlzdCA9IG51bGw7Ci0gICAgICAgIH0gICAgICAgIAotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbGlkYXRvciBpZGVudGlmZXIgZm9yIHRoaXMgY29tcG9uZW50LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFZhbGlkYXRvcklkKFN0cmluZyB2YWxpZGF0b3JJZCkKLSAgICB7Ci0gICAgICAgIF92YWxpZGF0b3JJZCA9IHZhbGlkYXRvcklkOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmFsaWRhdG9ySWQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF92YWxpZGF0b3JJZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIGEgSmF2YSBMYW5ndWFnZSBjbGFzcyBtb2RpZmllciB0byB0aGUgdmFsaWRhdG9yIGNsYXNzLgotICAgICAqIDxwPgotICAgICAqIFRPRE86IHdoYXQgaXMgdGhpcyBmb3I/Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkVmFsaWRhdG9yQ2xhc3NNb2RpZmllcihpbnQgbW9kaWZpZXIpCi0gICAgewotICAgICAgICBfdmFsaWRhdG9yQ2xhc3NNb2RpZmllcnMgfD0gbW9kaWZpZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgSmF2YSBMYW5ndWFnZSBjbGFzcyBtb2RpZmllcnMgZm9yIHRoZSB2YWxpZGF0b3IgY2xhc3MuIEJ5Ci0gICAgICogZGVmYXVsdCwgdGhlc2UgbW9kaWZpZXJzIGluY2x1ZGUgTW9kaWZpZXIuUFVCTElDLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIEphdmEgTGFuZ3VhZ2UgY2xhc3MgbW9kaWZpZXJzIGZvciB0aGUgdmFsaWRhdG9yIGNsYXNzCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRWYWxpZGF0b3JDbGFzc01vZGlmaWVycygpCi0gICAgewotICAgICAgICBpbnQgbW9kaWZpZXJzID0gX3ZhbGlkYXRvckNsYXNzTW9kaWZpZXJzOwotCi0gICAgICAgIGlmICghTW9kaWZpZXIuaXNQcml2YXRlKG1vZGlmaWVycykgJiYgIU1vZGlmaWVyLmlzUHJvdGVjdGVkKG1vZGlmaWVycykKLSAgICAgICAgICAgICAgICAmJiAhTW9kaWZpZXIuaXNQdWJsaWMobW9kaWZpZXJzKSkKLSAgICAgICAgewotICAgICAgICAgICAgbW9kaWZpZXJzIHw9IE1vZGlmaWVyLlBVQkxJQzsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBtb2RpZmllcnM7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHNldEJvZHlDb250ZW50KFN0cmluZyBib2R5Q29udGVudCkKLSAgICB7Ci0gICAgICAgIHRoaXMuX2JvZHlDb250ZW50ID0gYm9keUNvbnRlbnQ7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRCb2R5Q29udGVudCgpCi0gICAgewotICAgICAgICByZXR1cm4gX2JvZHlDb250ZW50OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIEpTUCB0YWcgaGFuZGxlciBjbGFzcyBmb3IgdGhpcyBjb21wb25lbnQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VGFnQ2xhc3MoU3RyaW5nIHRhZ0NsYXNzKQotICAgIHsKLSAgICAgICAgX3RhZ0NsYXNzID0gdGFnQ2xhc3M7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRUYWdDbGFzcygpCi0gICAgewotICAgICAgICByZXR1cm4gX3RhZ0NsYXNzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIEpTUCB0YWcgaGFuZGxlciBzdXBlcmNsYXNzIGZvciB0aGlzIGNvbXBvbmVudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRUYWdTdXBlcmNsYXNzKFN0cmluZyB0YWdTdXBlcmNsYXNzKQotICAgIHsKLSAgICAgICAgX3RhZ1N1cGVyY2xhc3MgPSB0YWdTdXBlcmNsYXNzOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGFnU3VwZXJjbGFzcygpCi0gICAgewotICAgICAgICByZXR1cm4gX3RhZ1N1cGVyY2xhc3M7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFNwZWNpZmllcyB0aGUgY2xhc3Mgb2YgdGhlIEZhY2VsZXRzIHRhZyBoYW5kbGVyIChjb21wb25lbnQgaGFuZGxlcikgZm9yCi0gICAgICogdGhpcyBjb21wb25lbnQuCi0gICAgICogPHA+Ci0gICAgICogTm90ZSB0aGF0IGEgRmFjZWxldHMgdGFnIGhhbmRsZXIgY2xhc3MgaXMgbm90IG5lZWRlZCBmb3IgbW9zdCBjb21wb25lbnRzLgotICAgICAqIAotICAgICAqIEBzaW5jZSAxLjAuOAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFRhZ0hhbmRsZXIoU3RyaW5nIHRhZ0hhbmRsZXIpCi0gICAgewotICAgICAgICBfdGFnSGFuZGxlciA9IHRhZ0hhbmRsZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogCi0gICAgICogQHNpbmNlIDEuMC44Ci0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRUYWdIYW5kbGVyKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfdGFnSGFuZGxlcjsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc2V0U2VyaWFsdWlkdGFnKFN0cmluZyBzZXJpYWx1aWR0YWcpCi0gICAgewotICAgICAgICBfc2VyaWFsdWlkdGFnID0gc2VyaWFsdWlkdGFnOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2VyaWFsdWlkdGFnKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfc2VyaWFsdWlkdGFnOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXRHZW5lcmF0ZWRDb21wb25lbnRDbGFzcyhCb29sZWFuIGdlbmVyYXRlZENvbXBvbmVudENsYXNzKQotICAgIHsKLSAgICAgICAgX2dlbmVyYXRlZENvbXBvbmVudENsYXNzID0gZ2VuZXJhdGVkQ29tcG9uZW50Q2xhc3M7Ci0gICAgfQotCi0gICAgcHVibGljIEJvb2xlYW4gaXNHZW5lcmF0ZWRDb21wb25lbnRDbGFzcygpCi0gICAgewotICAgICAgICByZXR1cm4gTW9kZWxVdGlscy5kZWZhdWx0T2YoX2dlbmVyYXRlZENvbXBvbmVudENsYXNzLGZhbHNlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRHZW5lcmF0ZWRUYWdDbGFzcyhCb29sZWFuIGdlbmVyYXRlZFRhZ0NsYXNzKQotICAgIHsKLSAgICAgICAgX2dlbmVyYXRlZFRhZ0NsYXNzID0gZ2VuZXJhdGVkVGFnQ2xhc3M7Ci0gICAgfQotCi0gICAgcHVibGljIEJvb2xlYW4gaXNHZW5lcmF0ZWRUYWdDbGFzcygpCi0gICAgewotICAgICAgICByZXR1cm4gTW9kZWxVdGlscy5kZWZhdWx0T2YoX2dlbmVyYXRlZFRhZ0NsYXNzLGZhbHNlKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc2V0Q29uZmlnRXhjbHVkZWQoQm9vbGVhbiBjb25maWdFeGNsdWRlZCkKLSAgICB7Ci0gICAgICAgIF9jb25maWdFeGNsdWRlZCA9IGNvbmZpZ0V4Y2x1ZGVkOwotICAgIH0KLQotICAgIHB1YmxpYyBCb29sZWFuIGlzQ29uZmlnRXhjbHVkZWQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE1vZGVsVXRpbHMuZGVmYXVsdE9mKF9jb25maWdFeGNsdWRlZCxmYWxzZSk7Ci0gICAgfSAgICAKLQotICAgIC8qKgotICAgICAqIAotICAgICAqIEBzaW5jZSAxLjAuOAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEV2YWx1YXRlRUxPbkV4ZWN1dGlvbihCb29sZWFuIGV2YWx1YXRlRUxPbkV4ZWN1dGlvbikKLSAgICB7Ci0gICAgICAgIHRoaXMuX2V2YWx1YXRlRUxPbkV4ZWN1dGlvbiA9IGV2YWx1YXRlRUxPbkV4ZWN1dGlvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAKLSAgICAgKiBAc2luY2UgMS4wLjgKLSAgICAgKi8KLSAgICBwdWJsaWMgQm9vbGVhbiBpc0V2YWx1YXRlRUxPbkV4ZWN1dGlvbigpCi0gICAgewotICAgICAgICByZXR1cm4gTW9kZWxVdGlscy5kZWZhdWx0T2YoX2V2YWx1YXRlRUxPbkV4ZWN1dGlvbixmYWxzZSk7Ci0gICAgfQotCi0gICAgLy9USElTIE1FVEhPRFMgQVJFIFVTRUQgRk9SIFZFTE9DSVRZIFRPIEdFVCBEQVRBIEFORCBHRU5FUkFURSBDTEFTU0VTCi0KLSAgICAvLyBBIHRyYW5zaWVudCBhdHRyaWJ1dGUgdGhhdCBpcyBjb21wdXRlZCBvbi1kZW1hbmQgZnJvbSB0aGUgbW9kZWwgZGF0YQotICAgIC8vIGJ1dCBpcyBub3QgaXRzZWxmIHN0b3JlZCBpbiB0aGUgbW9kZWwuCi0gICAgLy8KLSAgICAvLyBJdCBob2xkcyBhIGxpc3Qgb2YgYWxsIHRoZSBwcm9wZXJ0aWVzIHdoaWNoIG5lZWQgdG8gYmUgaW1wbGVtZW50ZWQKLSAgICAvLyBvbiB0aGUgdGFnIGNsYXNzLiBUaGlzIGlzIGEgc3Vic2V0IG9mIHRoZSBwcm9wZXJ0aWVzIGF2YWlsYWJsZSBvbgotICAgIC8vIHRoaXMgY29tcG9uZW50IGl0c2VsZiwgYW5kIGRlcGVuZHMgdXBvbiB3aGF0IHRoZSBwYXJlbnQgY2xhc3MKLSAgICAvLyBvZiB0aGUgZ2VuZXJhdGVkIHRhZyBhbHJlYWR5IHN1cHBvcnRzLgotICAgIHByaXZhdGUgTGlzdCBfcHJvcGVydHlUYWdMaXN0ID0gbnVsbDsgCi0gICAgCi0gICAgcHVibGljIENvbGxlY3Rpb24gZ2V0UHJvcGVydHlUYWdMaXN0KCkKLSAgICB7Ci0gICAgICAgIGlmIChfcHJvcGVydHlUYWdMaXN0ID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIF9wcm9wZXJ0eVRhZ0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ID0gZ2V0UHJvcGVydHlMaXN0KCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBQcm9wZXJ0eU1ldGEgcHJvcCA9IChQcm9wZXJ0eU1ldGEpIGl0Lm5leHQoKTsKLSAgICAgICAgICAgICAgICBpZiAoIXByb3AuaXNUYWdFeGNsdWRlZCgpLmJvb2xlYW5WYWx1ZSgpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAhcHJvcC5pc0luaGVyaXRlZFRhZygpLmJvb2xlYW5WYWx1ZSgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgX3Byb3BlcnR5VGFnTGlzdC5hZGQocHJvcCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIF9wcm9wZXJ0eVRhZ0xpc3Q7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBMaXN0IF9wcm9wZXJ0eVZhbGlkYXRvckxpc3QgPSBudWxsOyAKLQotICAgIHB1YmxpYyBDb2xsZWN0aW9uIGdldFByb3BlcnR5VmFsaWRhdG9yTGlzdCgpCi0gICAgewotICAgICAgICBpZiAoX3Byb3BlcnR5VmFsaWRhdG9yTGlzdCA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBfcHJvcGVydHlWYWxpZGF0b3JMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdCA9IGdldFByb3BlcnR5TGlzdCgpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgUHJvcGVydHlNZXRhIHByb3AgPSAoUHJvcGVydHlNZXRhKSBpdC5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgaWYgKCFwcm9wLmlzSW5oZXJpdGVkKCkuYm9vbGVhblZhbHVlKCkgJiYgcHJvcC5pc0dlbmVyYXRlZCgpLmJvb2xlYW5WYWx1ZSgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgX3Byb3BlcnR5VmFsaWRhdG9yTGlzdC5hZGQocHJvcCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIF9wcm9wZXJ0eVZhbGlkYXRvckxpc3Q7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL21vZGVsL1ZpZXdFbnRpdHlNZXRhLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL21vZGVsL1ZpZXdFbnRpdHlNZXRhLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5ODA4NTguLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9tb2RlbC9WaWV3RW50aXR5TWV0YS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk3ICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5idWlsZGVyLm1vZGVsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuZGlnZXN0ZXIuRGlnZXN0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5idWlsZGVyLmlvLlhtbFdyaXRlcjsKLQotCi0vKioKLSAqIEJhc2UgY2xhc3MgZm9yIG1ldGFkYXRhIGFib3V0IGFueSBjbGFzcyB3aG9zZSBpbnN0YW5jZXMgY2FuIGJlIHVzZWQgaW4gYQotICogSlNGIHZpZXcuCi0gKiA8cD4KLSAqIFRoaXMgbWVhbnMgQ29tcG9uZW50cywgQ29udmVydGVycywgVmFsaWRhdG9ycy4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFZpZXdFbnRpdHlNZXRhIGV4dGVuZHMgQ2xhc3NNZXRhIGltcGxlbWVudHMgUHJvcGVydHlIb2xkZXIKLXsKLSAgICBwcml2YXRlIFN0cmluZyBfbmFtZTsKLSAgICBwcml2YXRlIFN0cmluZyBfZGVzY3JpcHRpb247Ci0gICAgcHJpdmF0ZSBTdHJpbmcgX2xvbmdEZXNjcmlwdGlvbjsKLSAgICBwcml2YXRlIE1hcCBfcHJvcGVydGllcyA9IG5ldyBMaW5rZWRIYXNoTWFwKCk7Ci0KLSAgICAvKioKLSAgICAgKiBBZGQgZGlnZXN0ZXIgcnVsZXMgdG8gcmVwb3B1bGF0ZSBhbiBpbnN0YW5jZSBvZiB0aGlzIHR5cGUgZnJvbSBhbiB4bWwKLSAgICAgKiBmaWxlLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhZGRYbWxSdWxlcyhEaWdlc3RlciBkaWdlc3RlciwgU3RyaW5nIHByZWZpeCkKLSAgICB7Ci0gICAgICAgIENsYXNzTWV0YS5hZGRYbWxSdWxlcyhkaWdlc3RlciwgcHJlZml4KTsKLQotICAgICAgICBkaWdlc3Rlci5hZGRCZWFuUHJvcGVydHlTZXR0ZXIocHJlZml4ICsgIi9uYW1lIik7Ci0gICAgICAgIGRpZ2VzdGVyLmFkZEJlYW5Qcm9wZXJ0eVNldHRlcihwcmVmaXggKyAiL2Rlc2MiLCAiZGVzY3JpcHRpb24iKTsKLSAgICAgICAgZGlnZXN0ZXIuYWRkQmVhblByb3BlcnR5U2V0dGVyKHByZWZpeCArICIvbG9uZ0Rlc2MiLAotICAgICAgICAgICAgICAgICJsb25nRGVzY3JpcHRpb24iKTsKLSAgICAgICAgUHJvcGVydHlNZXRhLmFkZFhtbFJ1bGVzKGRpZ2VzdGVyLCBwcmVmaXgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yLgotICAgICAqLwotICAgIHB1YmxpYyBWaWV3RW50aXR5TWV0YShTdHJpbmcgeG1sRWxlbWVudE5hbWUpCi0gICAgewotICAgICAgICBzdXBlcih4bWxFbGVtZW50TmFtZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW1wbGVtZW50IGNhbGxiYWNrIG1ldGhvZCB0byB3cml0ZSBvdXQgdGhlICJzaW1wbGUiIHByb3BlcnRpZXMgb2YKLSAgICAgKiB0aGlzIGNsYXNzIGFzIHhtbC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCB3cml0ZVhtbFNpbXBsZShYbWxXcml0ZXIgb3V0KQotICAgIHsKLSAgICAgICAgc3VwZXIud3JpdGVYbWxTaW1wbGUob3V0KTsKLQotICAgICAgICBvdXQud3JpdGVFbGVtZW50KCJuYW1lIiwgX25hbWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEltcGxlbWVudCBjYWxsYmFjayBtZXRob2QgdG8gd3JpdGUgb3V0IHRoZSAiY29tcGxleCIgcHJvcGVydGllcyBvZgotICAgICAqIHRoaXMgY2xhc3MgYXMgeG1sLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHdyaXRlWG1sQ29tcGxleChYbWxXcml0ZXIgb3V0KQotICAgIHsKLSAgICAgICAgc3VwZXIud3JpdGVYbWxDb21wbGV4KG91dCk7Ci0gICAgICAgIG91dC53cml0ZUVsZW1lbnQoImRlc2MiLCBfZGVzY3JpcHRpb24pOwotICAgICAgICBvdXQud3JpdGVFbGVtZW50KCJsb25nRGVzYyIsIF9sb25nRGVzY3JpcHRpb24pOwotICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBfcHJvcGVydGllcy52YWx1ZXMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgICAgIHsKLSAgICAgICAgICAgIFByb3BlcnR5TWV0YSBwcm9wID0gKFByb3BlcnR5TWV0YSkgaS5uZXh0KCk7Ci0gICAgICAgICAgICBQcm9wZXJ0eU1ldGEud3JpdGVYbWwob3V0LCBwcm9wKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIG1lcmdlKFZpZXdFbnRpdHlNZXRhIG90aGVyKQotICAgIHsKLSAgICAgICAgc3VwZXIubWVyZ2Uob3RoZXIpOwotICAgICAgICAvLyBuYW1lIGNhbm5vdCBiZSBtZXJnZWQKLSAgICAgICAgX2Rlc2NyaXB0aW9uID0gTW9kZWxVdGlscy5tZXJnZSh0aGlzLl9kZXNjcmlwdGlvbiwgb3RoZXIuX2Rlc2NyaXB0aW9uKTsKLSAgICAgICAgX2xvbmdEZXNjcmlwdGlvbiA9IE1vZGVsVXRpbHMubWVyZ2UodGhpcy5fbG9uZ0Rlc2NyaXB0aW9uLAotICAgICAgICAgICAgICAgIG90aGVyLl9sb25nRGVzY3JpcHRpb24pOwotICAgICAgICBNb2RlbFV0aWxzLm1lcmdlUHJvcHModGhpcywgb3RoZXIpOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgbmFtZSB0aGF0IHRoZSB1c2VyIHdpbGwgcmVmZXIgdG8gaW5zdGFuY2VzIG9mIHRoaXMgY29tcG9uZW50IGJ5LgotICAgICAqIDxwPgotICAgICAqIEluIEpTUCB0YWdzLCB0aGlzIHZhbHVlIHdpbGwgYmUgdXNlZCBhcyB0aGUgSlNQIHRhZyBuYW1lLgotICAgICAqIDxwPgotICAgICAqIFRoaXMgcHJvcGVydHkgaXMgb3B0aW9uYWw7IGlmIG5vdCBzZXQgdGhlbiB0aGlzIE1vZGVsIGluc3RhbmNlIHJlcHJlc2VudHMKLSAgICAgKiBhIGJhc2UgY2xhc3MgdGhhdCBjb21wb25lbnRzIGNhbiBiZSBkZXJpdmVkIGZyb20sIGJ1dCB3aGljaCBjYW5ub3QgaXRzZWxmCi0gICAgICogYmUgaW5zdGFudGlhdGVkIGFzIGEgY29tcG9uZW50LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpCi0gICAgewotICAgICAgICBfbmFtZSA9IG5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfbmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBicmllZiBkZXNjcmlwdGlvbiBvZiB0aGlzIHByb3BlcnR5LgotICAgICAqIDxwPgotICAgICAqIFRoaXMgZGVzY3JpcHRpb24gaXMgdXNlZCBpbiB0b29sdGlwcywgZXRjLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyBkZXNjcmlwdGlvbikKLSAgICB7Ci0gICAgICAgIF9kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9kZXNjcmlwdGlvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBsb25nIGRlc2NyaXB0aW9uIG9mIHRoaXMgcHJvcGVydHkuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0TG9uZ0Rlc2NyaXB0aW9uKFN0cmluZyBsb25nRGVzY3JpcHRpb24pCi0gICAgewotICAgICAgICBfbG9uZ0Rlc2NyaXB0aW9uID0gbG9uZ0Rlc2NyaXB0aW9uOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TG9uZ0Rlc2NyaXB0aW9uKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfbG9uZ0Rlc2NyaXB0aW9uOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZHMgYSBwcm9wZXJ0eSB0byB0aGlzIGNvbXBvbmVudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRQcm9wZXJ0eShQcm9wZXJ0eU1ldGEgcHJvcGVydHkpCi0gICAgewotICAgICAgICBfcHJvcGVydGllcy5wdXQocHJvcGVydHkuZ2V0TmFtZSgpLCBwcm9wZXJ0eSk7Ci0gICAgfQotCi0gICAgcHVibGljIFByb3BlcnR5TWV0YSBnZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChQcm9wZXJ0eU1ldGEpIF9wcm9wZXJ0aWVzLmdldChwcm9wZXJ0eU5hbWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE51bWJlciBvZiBwcm9wZXJ0aWVzIGZvciB0aGlzIGNvbXBvbmVudAotICAgICAqLwotICAgIHB1YmxpYyBpbnQgcHJvcGVydGllc1NpemUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9wcm9wZXJ0aWVzLnNpemUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBjb21wb25lbnQgaGFzIGFueSBwcm9wZXJ0aWVzLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGhhc1Byb3BlcnRpZXMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9wcm9wZXJ0aWVzLnNpemUoKSA+IDA7Ci0gICAgfQotCi0gICAgcHVibGljIE1hcCBnZXRQcm9wZXJ0aWVzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfcHJvcGVydGllczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ29sbGVjdGlvbiBnZXRQcm9wZXJ0eUxpc3QoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9wcm9wZXJ0aWVzLnZhbHVlcygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYW4gaXRlcmF0b3IgZm9yIGFsbCBwcm9wZXJ0aWVzCi0gICAgICovCi0gICAgcHVibGljIEl0ZXJhdG9yIHByb3BlcnRpZXMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9wcm9wZXJ0aWVzLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvbW9kZWwvV2ViQ29uZmlnTWV0YS5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9tb2RlbC9XZWJDb25maWdNZXRhLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2YTEzNGMuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9tb2RlbC9XZWJDb25maWdNZXRhLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzQgKzAsMCBAQAotLyoNCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqIA0KLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKiANCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmJ1aWxkZXIubW9kZWw7DQotDQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOw0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuZGlnZXN0ZXIuRGlnZXN0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uYnVpbGRlci5pby5YbWxXcml0ZXI7DQotDQotLyoqDQotICogDQotICogQHNpbmNlIDEuMC40DQotICogQGF1dGhvciBMZW9uYXJkbyBVcmliZSAobGF0ZXN0IG1vZGlmaWNhdGlvbiBieSAkQXV0aG9yOiBsdTQyNDIgJCkNCi0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDc5NjYwNyAkICREYXRlOiAyMDA5LTA3LTIxIDIyOjAwOjMwIC0wNTAwIChtYXIsIDIxIGp1bCAyMDA5KSAkDQotICovDQotcHVibGljIGNsYXNzIFdlYkNvbmZpZ01ldGEgaW1wbGVtZW50cyBXZWJDb25maWdQYXJhbUhvbGRlcg0KLXsNCi0gICAgcHJpdmF0ZSBTdHJpbmcgX3htbEVsZW1lbnROYW1lOw0KLSAgICBwcml2YXRlIFN0cmluZyBfbW9kZWxJZDsNCi0gICAgDQotICAgIHByb3RlY3RlZCBNYXAgX3dlYkNvbmZpZ1BhcmFtZXRlcnMgPSBuZXcgTGlua2VkSGFzaE1hcCgpOw0KLSAgICANCi0gICAgLyoqDQotICAgICAqIEFkZCBkaWdlc3RlciBydWxlcyB0byByZXBvcHVsYXRlIGFuIGluc3RhbmNlIG9mIHRoaXMgdHlwZSBmcm9tIGFuIHhtbA0KLSAgICAgKiBmaWxlLg0KLSAgICAgKi8NCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGFkZFhtbFJ1bGVzKERpZ2VzdGVyIGRpZ2VzdGVyLCBTdHJpbmcgcHJlZml4KQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgbmV3UHJlZml4ID0gcHJlZml4ICsgIi93ZWJDb25maWciOw0KLSAgICAgICAgZGlnZXN0ZXIuYWRkT2JqZWN0Q3JlYXRlKG5ld1ByZWZpeCwgV2ViQ29uZmlnTWV0YS5jbGFzcyk7DQotICAgICAgICBkaWdlc3Rlci5hZGRTZXROZXh0KG5ld1ByZWZpeCwgImFkZFdlYkNvbmZpZyIpOyAgICAgICAgDQotICAgICAgICBkaWdlc3Rlci5hZGRCZWFuUHJvcGVydHlTZXR0ZXIobmV3UHJlZml4ICsgIi9tb2RlbElkIik7DQotICAgICAgICBXZWJDb25maWdQYXJhbU1ldGEuYWRkWG1sUnVsZXMoZGlnZXN0ZXIsIG5ld1ByZWZpeCk7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIENvbnN0cnVjdG9yLg0KLSAgICAgKiANCi0gICAgICogUGFyYW0geG1sRWxlbWVudE5hbWUgaXMgdGhlIG5hbWUgb2YgdGhlIHhtbCBlbGVtZW50IHRoYXQgaXMgY3JlYXRlZA0KLSAgICAgKiB3aGVuIG1ldGhvZCB3cml0ZVhtbCBpcyBpbnZva2VkLg0KLSAgICAgKi8NCi0gICAgcHVibGljIFdlYkNvbmZpZ01ldGEoKQ0KLSAgICB7DQotICAgICAgICBfeG1sRWxlbWVudE5hbWUgPSAid2ViQ29uZmlnIjsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogV3JpdGUgdGhlIHByb3BlcnRpZXMgb2YgdGhpcyBpbnN0YW5jZSBvdXQgYXMgeG1sLg0KLSAgICAgKiA8cD4NCi0gICAgICogVGhlIG5hbWUgb2YgdGhlIHhtbCBlbGVtZW50IHRoYXQgaXMgY3JlYXRlZCB0byBob2xkIHRoZSBwcm9wZXJ0aWVzDQotICAgICAqIHdhcyBzcGVjaWZpZWQgd2hlbiB0aGUgY29uc3RydWN0b3Igd2FzIGNhbGxlZC4NCi0gICAgICogPHA+DQotICAgICAqIFN1YmNsYXNzZXMgdGhhdCB3YW50IHRvIG91dHB1dCB0aGVpciBvd24gcHJvcGVydGllcyBzaG91bGQgbm90DQotICAgICAqIG92ZXJyaWRlIHRoaXMgbWV0aG9kLiBJbnN0ZWFkLCB0aGV5IHNob3VsZCBvdmVycmlkZSB3cml0ZVhtbFNpbXBsZQ0KLSAgICAgKiAoYW5kIGluIHJhcmUgY2FzZXMgd3JpdGVYbWxDb21wbGV4KS4NCi0gICAgICogPHA+DQotICAgICAqIEhhdmluZyB0d28gd3JpdGUgbWV0aG9kcyAod3JpdGVYbWxTaW1wbGUvd3JpdGVYbWxDb21wbGV4KSBnaXZlcyBzb21lIGJhc2ljDQotICAgICAqIGNvbnRyb2wgb3ZlciB0aGUgb3JkZXIgaW4gd2hpY2ggZGF0YSBpcyB3cml0dGVuIHRvIHhtbCwgaW4gb3JkZXIgdG8gbWFrZQ0KLSAgICAgKiB0aGUgZ2VuZXJhdGVkIHhtbCBsb29rIG5pY2UuIEFueSBwcm9wZXJ0aWVzIHdyaXR0ZW4gaW4gd3JpdGVYbWxTaW1wbGUgd2lsbA0KLSAgICAgKiBhcHBlYXIgaW4gdGhlIG91dHB1dCBmaWxlIGJlZm9yZSBwcm9wZXJ0aWVzIHdyaXR0ZW4gYnkgd3JpdGVYbWxDb21wbGV4LiANCi0gICAgICogVGhlcmVmb3JlLCBwcm9wZXJ0aWVzIHdoaWNoIGFyZSAiZWFzaWx5IHJlYWQiIHNob3VsZCBiZSB3cml0dGVuIG91dCBpbg0KLSAgICAgKiBhIHdyaXRlWG1sU2ltcGxlIG1ldGhvZC4gRGF0YSB3aGljaCBoYXMgbGFyZ2UgQ0RBVEEgYmxvY2tzLCBvciBjb21wbGljYXRlZA0KLSAgICAgKiBuZXN0ZWQgc3RydWN0dXJlIHNob3VsZCBiZSB3cml0dGVuIG91dCBpbiBhIHdyaXRlWG1sQ29tcGxleCBtZXRob2Qgc28gdGhhdA0KLSAgICAgKiB0aGUgInNpbXBsZSIgc3R1ZmYgY2FuIGJlIGVhc2lseSByZWFkIGFuZCBpcyBub3QgYnVyaWVkIGluIHRoZSBtaWRkbGUgb2YNCi0gICAgICogdGhlIGhhcmRlci10by1yZWFkIG91dHB1dC4NCi0gICAgICovDQotICAgIHByb3RlY3RlZCB2b2lkIHdyaXRlWG1sKFhtbFdyaXRlciBvdXQpDQotICAgIHsNCi0gICAgICAgIG91dC5iZWdpbkVsZW1lbnQoX3htbEVsZW1lbnROYW1lKTsNCi0gICAgICAgIHdyaXRlWG1sU2ltcGxlKG91dCk7DQotICAgICAgICB3cml0ZVhtbENvbXBsZXgob3V0KTsNCi0gICAgICAgIG91dC5lbmRFbGVtZW50KF94bWxFbGVtZW50TmFtZSk7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIFdyaXRlIHRoaXMgbW9kZWwgb3V0IGFzIHhtbC4NCi0gICAgICogPHA+DQotICAgICAqIFN1YmNsYXNzZXMgdGhhdCB3aXNoIHRvIHdyaXRlIG91dCBwcm9wZXJ0aWVzIGFzIHhtbCBzaG91bGQgb3ZlcnJpZGUNCi0gICAgICogdGhpcyBtZXRob2QsIGNhbGwgdGhlIHN1cGVyIGltcGxlbWVudGF0aW9uLCB0aGVuIGNhbGwgbWV0aG9kcyBvbiB0aGUNCi0gICAgICogWG1sV3JpdGVyIG9iamVjdCB0byBvdXRwdXQgdGhlaXIgZGF0YS4NCi0gICAgICovDQotICAgIHByb3RlY3RlZCB2b2lkIHdyaXRlWG1sU2ltcGxlKFhtbFdyaXRlciBvdXQpDQotICAgIHsNCi0gICAgICAgIG91dC53cml0ZUVsZW1lbnQoIm1vZGVsSWQiLCBfbW9kZWxJZCk7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIFNlZSBkb2N1bWVudGF0aW9uIGZvciB3cml0ZVhtbCBhbmQgd3JpdGVYbWxTaW1wbGUgbWV0aG9kcy4NCi0gICAgICovDQotICAgIHByb3RlY3RlZCB2b2lkIHdyaXRlWG1sQ29tcGxleChYbWxXcml0ZXIgb3V0KQ0KLSAgICB7DQotICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBfd2ViQ29uZmlnUGFyYW1ldGVycy52YWx1ZXMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspDQotICAgICAgICB7DQotICAgICAgICAgICAgV2ViQ29uZmlnUGFyYW1NZXRhIHByb3AgPSAoV2ViQ29uZmlnUGFyYW1NZXRhKSBpLm5leHQoKTsNCi0gICAgICAgICAgICBXZWJDb25maWdQYXJhbU1ldGEud3JpdGVYbWwob3V0LCBwcm9wKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogTWVyZ2UgYW55IGluaGVyaXRhYmxlIGRhdGEgZnJvbSB0aGUgc3BlY2lmaWVkICJvdGhlciIgaW5zdGFuY2UgaW50bw0KLSAgICAgKiB0aGUgbWV0YWRhdGEgaGVsZCBieSB0aGlzIGluc3RhbmNlLg0KLSAgICAgKi8NCi0gICAgcHJvdGVjdGVkIHZvaWQgbWVyZ2UoQ2xhc3NNZXRhIG90aGVyKQ0KLSAgICB7DQotICAgICAgICAvLyBUaGVyZSBpcyBub3RoaW5nIHRvIG1lcmdlIGJldHdlZW4gdHdvIENsYXNzTWV0YSBvYmplY3RzOw0KLSAgICAgICAgLy8gbm9uZSBvZiB0aGUgcHJvcGVydGllcyBvbiB0aGlzIGNsYXNzIGFyZSBpbmhlcml0YWJsZS4NCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogSW5kaWNhdGVzIHdoaWNoICJncm91cCIgb2YgbWV0YWRhdGEgdGhpcyBjbGFzcyBiZWxvbmdzIHRvLg0KLSAgICAgKiA8cD4NCi0gICAgICogUHJvamVjdHMgY2FuIGluaGVyaXQgbWV0YWRhdGEgZnJvbSBvdGhlciBwcm9qZWN0cywgaW4gd2hpY2ggY2FzZQ0KLSAgICAgKiBhbGwgdGhlIENsYXNzTWV0YSBvYmplY3RzIGVuZCB1cCBpbiBvbmUgYmlnIGNvbGxlY3Rpb24uIEJ1dCBmb3INCi0gICAgICogc29tZSBwdXJwb3NlcyBpdCBpcyBuZWNlc3NhcnkgdG8gaXRlcmF0ZSBvdmVyIHRoZSBvYmplY3RzIGJlbG9uZ2luZw0KLSAgICAgKiB0byBvbmx5IG9uZSBwcm9qZWN0IChlZyB3aGVuIGdlbmVyYXRpbmcgY29tcG9uZW50cykuIFRoaXMgcmV0dXJuDQotICAgICAqIHZhbHVlIGNhbiBiZSB0ZXN0ZWQgdG8gY2hlY2sgd2hpY2ggImdyb3VwIiAocHJvamVjdCkgYSBwYXJ0aWN1bGFyDQotICAgICAqIGluc3RhbmNlIGJlbG9uZ3MgdG8uDQotICAgICAqLw0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE1vZGVsSWQoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gX21vZGVsSWQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0TW9kZWxJZChTdHJpbmcgbW9kZWxJZCkNCi0gICAgew0KLSAgICAgICAgdGhpcy5fbW9kZWxJZCA9IG1vZGVsSWQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgYWRkV2ViQ29uZmlnUGFyYW0oV2ViQ29uZmlnUGFyYW1NZXRhIHdjcCkNCi0gICAgew0KLSAgICAgICAgX3dlYkNvbmZpZ1BhcmFtZXRlcnMucHV0KHdjcC5nZXROYW1lKCksIHdjcCk7DQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyBpbnQgd2ViQ29uZmlnUGFyYW1ldGVyc1NpemUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gX3dlYkNvbmZpZ1BhcmFtZXRlcnMuc2l6ZSgpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBXZWJDb25maWdQYXJhbU1ldGEgZ2V0V2ViQ29uZmlnUGFyYW0oU3RyaW5nIG5hbWUpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAoV2ViQ29uZmlnUGFyYW1NZXRhKV93ZWJDb25maWdQYXJhbWV0ZXJzLmdldChuYW1lKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgSXRlcmF0b3Igd2ViQ29uZmlnUGFyYW1ldGVycygpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBfd2ViQ29uZmlnUGFyYW1ldGVycy52YWx1ZXMoKS5pdGVyYXRvcigpOw0KLSAgICB9DQotICAgIA0KLSAgICAvL1RISVMgTUVUSE9EUyBBUkUgVVNFRCBGT1IgVkVMT0NJVFkgVE8gR0VUIERBVEEgQU5EIEdFTkVSQVRFIENMQVNTRVMNCi0gICAgDQotICAgIHB1YmxpYyBDb2xsZWN0aW9uIGdldFdlYkNvbmZpZ1BhcmFtZXRlcnNMaXN0KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIF93ZWJDb25maWdQYXJhbWV0ZXJzLnZhbHVlcygpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvbW9kZWwvV2ViQ29uZmlnUGFyYW1Ib2xkZXIuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvbW9kZWwvV2ViQ29uZmlnUGFyYW1Ib2xkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjExNmM5NS4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL21vZGVsL1dlYkNvbmZpZ1BhcmFtSG9sZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKg0KLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICogDQotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqIA0KLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqICB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uYnVpbGRlci5tb2RlbDsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOw0KLQ0KLS8qKg0KLSAqIA0KLSAqIEBzaW5jZSAxLjAuNA0KLSAqIEBhdXRob3IgTGVvbmFyZG8gVXJpYmUgKGxhdGVzdCBtb2RpZmljYXRpb24gYnkgJEF1dGhvcjogbHU0MjQyICQpDQotICogQHZlcnNpb24gJFJldmlzaW9uOiA3OTY2MDcgJCAkRGF0ZTogMjAwOS0wNy0yMSAyMjowMDozMCAtMDUwMCAobWFyLCAyMSBqdWwgMjAwOSkgJA0KLSAqLw0KLXB1YmxpYyBpbnRlcmZhY2UgV2ViQ29uZmlnUGFyYW1Ib2xkZXINCi17DQotICAgIEl0ZXJhdG9yIHdlYkNvbmZpZ1BhcmFtZXRlcnMoKTsNCi0NCi0gICAgV2ViQ29uZmlnUGFyYW1NZXRhIGdldFdlYkNvbmZpZ1BhcmFtKFN0cmluZyBuYW1lKTsNCi0NCi0gICAgdm9pZCBhZGRXZWJDb25maWdQYXJhbShXZWJDb25maWdQYXJhbU1ldGEgd2NwKTsNCi19DQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9tb2RlbC9XZWJDb25maWdQYXJhbU1ldGEuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvbW9kZWwvV2ViQ29uZmlnUGFyYW1NZXRhLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlZDE1YTYuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9tb2RlbC9XZWJDb25maWdQYXJhbU1ldGEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyNyArMCwwIEBACi0vKg0KLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICogDQotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqIA0KLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqICB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uYnVpbGRlci5tb2RlbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmRpZ2VzdGVyLkRpZ2VzdGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZy5TdHJpbmdVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5idWlsZGVyLmlvLlhtbFdyaXRlcjsNCi0NCi0vKioNCi0gKiANCi0gKiBAc2luY2UgMS4wLjQNCi0gKiBAYXV0aG9yIExlb25hcmRvIFVyaWJlIChsYXRlc3QgbW9kaWZpY2F0aW9uIGJ5ICRBdXRob3I6IGx1NDI0MiAkKQ0KLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogNzk2NjA3ICQgJERhdGU6IDIwMDktMDctMjEgMjI6MDA6MzAgLTA1MDAgKG1hciwgMjEganVsIDIwMDkpICQNCi0gKi8NCi1wdWJsaWMgY2xhc3MgV2ViQ29uZmlnUGFyYW1NZXRhDQotew0KLSAgICBwcml2YXRlIFN0cmluZyBfbmFtZTsNCi0gICAgcHJpdmF0ZSBTdHJpbmcgX2ZpZWxkTmFtZTsNCi0gICAgcHJpdmF0ZSBTdHJpbmcgICBfZGVmYXVsdFZhbHVlOw0KLSAgICBwcml2YXRlIFN0cmluZyBfZGVzY3JpcHRpb247DQotICAgIHByaXZhdGUgU3RyaW5nIF9sb25nRGVzY3JpcHRpb247DQotICAgIHByaXZhdGUgU3RyaW5nIF9leHBlY3RlZFZhbHVlczsNCi0gICAgcHJpdmF0ZSBTdHJpbmcgX3NvdXJjZUNsYXNzTmFtZTsNCi0gICAgcHJpdmF0ZSBTdHJpbmcgX3NpbmNlOw0KLQ0KLSAgICBwdWJsaWMgV2ViQ29uZmlnUGFyYW1NZXRhKCkNCi0gICAgew0KLSAgICAgICAgDQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyBXZWJDb25maWdQYXJhbU1ldGEoV2ViQ29uZmlnUGFyYW1NZXRhIHBtKQ0KLSAgICB7DQotICAgICAgICBfbmFtZSA9IHBtLl9uYW1lOw0KLSAgICAgICAgX2ZpZWxkTmFtZSA9IHBtLl9maWVsZE5hbWU7ICAgIA0KLSAgICAgICAgX2Rlc2NyaXB0aW9uID0gcG0uX2Rlc2NyaXB0aW9uOw0KLSAgICAgICAgX2xvbmdEZXNjcmlwdGlvbiA9IHBtLl9sb25nRGVzY3JpcHRpb247DQotICAgICAgICBfZGVmYXVsdFZhbHVlID0gcG0uX2RlZmF1bHRWYWx1ZTsNCi0gICAgICAgIF9leHBlY3RlZFZhbHVlcyA9IHBtLl9leHBlY3RlZFZhbHVlczsNCi0gICAgICAgIF9zaW5jZSA9IHBtLl9zaW5jZTsNCi0gICAgfQ0KLSAgICANCi0gICAgLyoqDQotICAgICAqIFdyaXRlIHRoaXMgbW9kZWwgb3V0IGFzIHhtbC4NCi0gICAgICovDQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB3cml0ZVhtbChYbWxXcml0ZXIgb3V0LCBXZWJDb25maWdQYXJhbU1ldGEgcG0pDQotICAgIHsNCi0gICAgICAgIG91dC5iZWdpbkVsZW1lbnQoIndlYkNvbmZpZ1BhcmFtIik7DQotICAgICAgICBvdXQud3JpdGVFbGVtZW50KCJuYW1lIiwgcG0uX25hbWUpOw0KLSAgICAgICAgb3V0LndyaXRlRWxlbWVudCgiZmllbGROYW1lIiwgcG0uX2ZpZWxkTmFtZSk7DQotICAgICAgICBvdXQud3JpdGVFbGVtZW50KCJkZXNjIiwgcG0uX2Rlc2NyaXB0aW9uKTsNCi0gICAgICAgIG91dC53cml0ZUVsZW1lbnQoImxvbmdEZXNjIiwgcG0uX2xvbmdEZXNjcmlwdGlvbik7DQotICAgICAgICBvdXQud3JpdGVFbGVtZW50KCJkZWZhdWx0VmFsdWUiLCBwbS5fZGVmYXVsdFZhbHVlKTsNCi0gICAgICAgIG91dC53cml0ZUVsZW1lbnQoImV4cGVjdGVkVmFsdWVzIiwgcG0uX2V4cGVjdGVkVmFsdWVzKTsNCi0gICAgICAgIG91dC53cml0ZUVsZW1lbnQoInNvdXJjZUNsYXNzTmFtZSIsIHBtLl9zb3VyY2VDbGFzc05hbWUpOw0KLSAgICAgICAgb3V0LndyaXRlRWxlbWVudCgic2luY2UiLCBwbS5fc2luY2UpOw0KLSAgICAgICAgb3V0LmVuZEVsZW1lbnQoIndlYkNvbmZpZ1BhcmFtIik7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIEFkZCBkaWdlc3RlciBydWxlcyB0byByZXBvcHVsYXRlIGEgTW9kZWwgaW5zdGFuY2UgZnJvbSBhbiB4bWwgZmlsZS4NCi0gICAgICovDQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhZGRYbWxSdWxlcyhEaWdlc3RlciBkaWdlc3RlciwgU3RyaW5nIHByZWZpeCkNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIG5ld1ByZWZpeCA9IHByZWZpeCArICIvd2ViQ29uZmlnUGFyYW0iOw0KLQ0KLSAgICAgICAgZGlnZXN0ZXIuYWRkT2JqZWN0Q3JlYXRlKG5ld1ByZWZpeCwgV2ViQ29uZmlnUGFyYW1NZXRhLmNsYXNzKTsNCi0gICAgICAgIGRpZ2VzdGVyLmFkZFNldE5leHQobmV3UHJlZml4LCAiYWRkV2ViQ29uZmlnUGFyYW0iKTsNCi0NCi0gICAgICAgIGRpZ2VzdGVyLmFkZEJlYW5Qcm9wZXJ0eVNldHRlcihuZXdQcmVmaXggKyAiL25hbWUiKTsNCi0gICAgICAgIGRpZ2VzdGVyLmFkZEJlYW5Qcm9wZXJ0eVNldHRlcihuZXdQcmVmaXggKyAiL2ZpZWxkTmFtZSIpOw0KLSAgICAgICAgZGlnZXN0ZXIuYWRkQmVhblByb3BlcnR5U2V0dGVyKG5ld1ByZWZpeCArICIvc291cmNlQ2xhc3NOYW1lIik7DQotICAgICAgICBkaWdlc3Rlci5hZGRCZWFuUHJvcGVydHlTZXR0ZXIobmV3UHJlZml4ICsgIi9zaW5jZSIpOw0KLSAgICAgICAgZGlnZXN0ZXIuYWRkQmVhblByb3BlcnR5U2V0dGVyKG5ld1ByZWZpeCArICIvZGVzYyIsICJkZXNjcmlwdGlvbiIpOw0KLSAgICAgICAgZGlnZXN0ZXIuYWRkQmVhblByb3BlcnR5U2V0dGVyKG5ld1ByZWZpeCArICIvbG9uZ0Rlc2MiLCAibG9uZ0Rlc2NyaXB0aW9uIik7DQotICAgICAgICBkaWdlc3Rlci5hZGRCZWFuUHJvcGVydHlTZXR0ZXIobmV3UHJlZml4ICsgIi9kZWZhdWx0VmFsdWUiLCAiZGVmYXVsdFZhbHVlIik7DQotICAgICAgICBkaWdlc3Rlci5hZGRCZWFuUHJvcGVydHlTZXR0ZXIobmV3UHJlZml4ICsgIi9leHBlY3RlZFZhbHVlcyIsICJleHBlY3RlZFZhbHVlcyIpOw0KLSAgICAgICAgTWV0aG9kU2lnbmF0dXJlTWV0YS5hZGRYbWxSdWxlcyhkaWdlc3RlciwgbmV3UHJlZml4KTsNCi0gICAgICAgIA0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBNZXJnZSB0aGUgZGF0YSBpbiB0aGUgc3BlY2lmaWVkIG90aGVyIHByb3BlcnR5IGludG8gdGhpcyBvbmUsIHRocm93aW5nIGFuDQotICAgICAqIGV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhbiBpbmNvbXBhdGliaWxpdHkuDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCBtZXJnZShXZWJDb25maWdQYXJhbU1ldGEgb3RoZXIpDQotICAgIHsNCi0gICAgICAgIC8vIE1lcmdlIGNsYXNzTmFtZSBkb2VzIG5vdCBoYXJtLCBzaW5jZSB5b3UgY2Fubm90DQotICAgICAgICAvL3VzZSBwb2x5bW9ycGhpc20gb24gYSBqc2YgY29tcG9uZW50LiAgDQotICAgICAgICBfbmFtZSA9IE1vZGVsVXRpbHMubWVyZ2UodGhpcy5fbmFtZSwgb3RoZXIuX25hbWUpOw0KLSAgICAgICAgX2ZpZWxkTmFtZSA9IE1vZGVsVXRpbHMubWVyZ2UodGhpcy5fZmllbGROYW1lLCBvdGhlci5fZmllbGROYW1lKTsNCi0gICAgICAgIF9kZXNjcmlwdGlvbiA9IE1vZGVsVXRpbHMubWVyZ2UodGhpcy5fZGVzY3JpcHRpb24sIG90aGVyLl9kZXNjcmlwdGlvbik7DQotICAgICAgICBfbG9uZ0Rlc2NyaXB0aW9uID0gTW9kZWxVdGlscy5tZXJnZSh0aGlzLl9sb25nRGVzY3JpcHRpb24sIG90aGVyLl9sb25nRGVzY3JpcHRpb24pOw0KLSAgICAgICAgX2RlZmF1bHRWYWx1ZSA9IE1vZGVsVXRpbHMubWVyZ2UodGhpcy5fZGVmYXVsdFZhbHVlLCBvdGhlci5fZGVmYXVsdFZhbHVlKTsNCi0gICAgICAgIF9zb3VyY2VDbGFzc05hbWUgPSBNb2RlbFV0aWxzLm1lcmdlKHRoaXMuX3NvdXJjZUNsYXNzTmFtZSwgb3RoZXIuX3NvdXJjZUNsYXNzTmFtZSk7DQotICAgICAgICBfc2luY2UgPSBNb2RlbFV0aWxzLm1lcmdlKHRoaXMuX3NpbmNlLCBvdGhlci5fc2luY2UpOw0KLSAgICAgICAgc2V0RXhwZWN0ZWRWYWx1ZXMoTW9kZWxVdGlscy5tZXJnZSh0aGlzLl9leHBlY3RlZFZhbHVlcywgb3RoZXIuX2V4cGVjdGVkVmFsdWVzKSk7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIFNldCB0aGUgbmFtZSB0aGF0IHVzZXJzIHJlZmVyIHRvIHRoaXMgcHJvcGVydHkgYnkuDQotICAgICAqIDxwPg0KLSAgICAgKiBUaGlzIHNldHMgdGhlIG5hbWUgb2YgeG1sIHRhZyBhdHRyaWJ1dGVzLCBhbmQgdGhlIGJhc2UgbmFtZXMgb2YgZ2VuZXJhdGVkDQotICAgICAqIGdldHRlci9zZXR0ZXIgbWV0aG9kcy4NCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpDQotICAgIHsNCi0gICAgICAgIF9uYW1lID0gbmFtZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gX25hbWU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIGRlc2MpDQotICAgIHsNCi0gICAgICAgIF9kZXNjcmlwdGlvbiA9IGRlc2M7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBfZGVzY3JpcHRpb247DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0TG9uZ0Rlc2NyaXB0aW9uKFN0cmluZyBkZXNjKQ0KLSAgICB7DQotICAgICAgICBfbG9uZ0Rlc2NyaXB0aW9uID0gZGVzYzsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldExvbmdEZXNjcmlwdGlvbigpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBfbG9uZ0Rlc2NyaXB0aW9uOw0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogU2V0cyB0aGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGlzIGF0dHJpYnV0ZS4NCi0gICAgICoNCi0gICAgICogQHBhcmFtIGRlZmF1bHRWYWx1ZSAgdGhlIGF0dHJpYnV0ZSBkZWZhdWx0IHZhbHVlDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCBzZXREZWZhdWx0VmFsdWUoU3RyaW5nIGRlZmF1bHRWYWx1ZSkNCi0gICAgew0KLSAgICAgIF9kZWZhdWx0VmFsdWUgPSBkZWZhdWx0VmFsdWU7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIFJldHVybnMgdGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhpcyBhdHRyaWJ1dGUuDQotICAgICAqDQotICAgICAqIEByZXR1cm4gIHRoZSBhdHRyaWJ1dGUgZGVmYXVsdCB2YWx1ZQ0KLSAgICAgKi8NCi0gICAgcHVibGljIFN0cmluZyBnZXREZWZhdWx0VmFsdWUoKQ0KLSAgICB7DQotICAgICAgcmV0dXJuIF9kZWZhdWx0VmFsdWU7DQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyB2b2lkIHNldEZpZWxkTmFtZShTdHJpbmcgZmllbGROYW1lKQ0KLSAgICB7DQotICAgICAgX2ZpZWxkTmFtZSA9IGZpZWxkTmFtZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEZpZWxkTmFtZSgpDQotICAgIHsNCi0gICAgICByZXR1cm4gX2ZpZWxkTmFtZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRFeHBlY3RlZFZhbHVlcyhTdHJpbmcgZXhwZWN0ZWRWYWx1ZXMpDQotICAgIHsNCi0gICAgICAgIF9leHBlY3RlZFZhbHVlcyA9IGV4cGVjdGVkVmFsdWVzOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RXhwZWN0ZWRWYWx1ZXMoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gX2V4cGVjdGVkVmFsdWVzOw0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogVXRpbGl0eSBtZXRob2QgdG8gcmV0dXJuIGp1c3QgdGhlIHBhY2thZ2VuYW1lIHBhcnQgb2YgdGhlIGNsYXNzTmFtZQ0KLSAgICAgKiBhdHRyaWJ1dGUuDQotICAgICAqLw0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFNvdXJjZVBhY2thZ2VOYW1lKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIFN0cmluZ1V0aWxzLnN1YnN0cmluZyhnZXRTb3VyY2VDbGFzc05hbWUoKSwgMCwgU3RyaW5nVXRpbHMubGFzdEluZGV4T2YoZ2V0U291cmNlQ2xhc3NOYW1lKCksICcuJykpOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBSZXR1cm4gdGhlIGNsYXNzTmFtZSBvZiB0aGUgcmVhbCBqYXZhIGNsYXNzIGZyb20gd2hpY2ggdGhpcyBtZXRhZGF0YSB3YXMgZ2F0aGVyZWQuDQotICAgICAqIDxwPg0KLSAgICAgKiBUaGlzIGlzIG1vc3RseSB1c2VkIGZvciBkb2N1bWVudGF0aW9uLiBIb3dldmVyIHdoZW4gZ2VuZXJhdGluZyBjb2RlIGluICJ0ZW1wbGF0ZSBtb2RlIiwNCi0gICAgICogdGhpcyBpcyB1c2VkIHRvIGxvY2F0ZSB0aGUgb3JpZ2luYWwgY2xhc3MgaW4gb3JkZXIgdG8gZmluZCB0aGUgc291cmNlIGNvZGUgdG8gY29weS4NCi0gICAgICogSXQgaXMgYWxzbyB1c2VkIGZvciBzb21lIHJlYXNvbiBpbiBNYWtlQ29tcG9uZW50c01vam8gd2hlbiBkZXRlcm1pbmluZyB3aGV0aGVyIHRvDQotICAgICAqIGdlbmVyYXRlIGEgY2xhc3Mgb3Igbm90IC0gdGhpcyBpcyBwcm9iYWJseSB3cm9uZy4NCi0gICAgICovDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U291cmNlQ2xhc3NOYW1lKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIF9zb3VyY2VDbGFzc05hbWU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0U291cmNlQ2xhc3NOYW1lKFN0cmluZyBzb3VyY2VDbGFzc05hbWUpDQotICAgIHsNCi0gICAgICAgIHRoaXMuX3NvdXJjZUNsYXNzTmFtZSA9IHNvdXJjZUNsYXNzTmFtZTsNCi0gICAgfQ0KLSAgICANCi0gICAgcHVibGljIFN0cmluZyBnZXRTaW5jZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBfc2luY2U7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0U2luY2UoU3RyaW5nIHNpbmNlKQ0KLSAgICB7DQotICAgICAgICBfc2luY2UgPSBzaW5jZTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL3Fkb3gvQ29tcG9zaXRlQ29tcG9uZW50TW9kZWxCdWlsZGVyLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL3Fkb3gvQ29tcG9zaXRlQ29tcG9uZW50TW9kZWxCdWlsZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmZjYwYWIuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9xZG94L0NvbXBvc2l0ZUNvbXBvbmVudE1vZGVsQnVpbGRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjE2ICswLDAgQEAKLS8qDQotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKiANCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICogDQotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5idWlsZGVyLnFkb3g7DQotDQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRJbnB1dFN0cmVhbTsNCi1pbXBvcnQgamF2YS5pby5GaWxlOw0KLWltcG9ydCBqYXZhLmlvLkZpbGVGaWx0ZXI7DQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247DQotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07DQotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS5uZXQuVVJMOw0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLQ0KLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5QYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXI7DQotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlNBWFBhcnNlckZhY3Rvcnk7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nLkNsYXNzVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5idWlsZGVyLk1vZGVsUGFyYW1zOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmJ1aWxkZXIubW9kZWwuQ29tcG9uZW50TWV0YTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5idWlsZGVyLm1vZGVsLkZhY2V0TWV0YTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5idWlsZGVyLm1vZGVsLk1ldGhvZFNpZ25hdHVyZU1ldGE7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uYnVpbGRlci5tb2RlbC5Nb2RlbDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5idWlsZGVyLm1vZGVsLlByb3BlcnR5TWV0YTsNCi1pbXBvcnQgb3JnLnhtbC5zYXguQXR0cmlidXRlczsNCi1pbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7DQotaW1wb3J0IG9yZy54bWwuc2F4LkxvY2F0b3I7DQotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLnhtbC5zYXguU0FYUGFyc2VFeGNlcHRpb247DQotaW1wb3J0IG9yZy54bWwuc2F4LlhNTFJlYWRlcjsNCi1pbXBvcnQgb3JnLnhtbC5zYXguZXh0LkxleGljYWxIYW5kbGVyOw0KLWltcG9ydCBvcmcueG1sLnNheC5oZWxwZXJzLkRlZmF1bHRIYW5kbGVyOw0KLQ0KLXB1YmxpYyBjbGFzcyBDb21wb3NpdGVDb21wb25lbnRNb2RlbEJ1aWxkZXINCi17DQotICAgIHByaXZhdGUgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKENvbXBvc2l0ZUNvbXBvbmVudE1vZGVsQnVpbGRlci5jbGFzcyk7DQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTVBPU0lURV9MSUJSQVJZX05BTUUgPSAiaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvY29tcG9zaXRlIjsNCi0gICAgDQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElOVEVSRkFDRV9OQU1FID0gImludGVyZmFjZSI7DQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJJQlVURV9OQU1FID0gImF0dHJpYnV0ZSI7DQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZBQ0VUX05BTUUgPSAiZmFjZXQiOw0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBDb21wb3NpdGVDb21wb25lbnRNZXRhZGF0YUhhbmRsZXIgZXh0ZW5kcw0KLSAgICAgICAgICAgIERlZmF1bHRIYW5kbGVyIGltcGxlbWVudHMgTGV4aWNhbEhhbmRsZXINCi0gICAgew0KLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBNb2RlbCBtb2RlbDsNCi0gICAgICAgIA0KLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgYWxpYXM7DQotICAgICAgICANCi0gICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIGNvbXBvbmVudE5hbWU7DQotICAgICAgICANCi0gICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIGxpYnJhcnlOYW1lOw0KLSAgICAgICAgDQotICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyByZXNvdXJjZU5hbWU7DQotDQotICAgICAgICBwcml2YXRlIGJvb2xlYW4gaW5Eb2N1bWVudCA9IGZhbHNlOw0KLQ0KLSAgICAgICAgcHJpdmF0ZSBMb2NhdG9yIGxvY2F0b3I7DQotDQotICAgICAgICBwcml2YXRlIGJvb2xlYW4gaW5Db21wb3NpdGVJbnRlcmZhY2UgPSBmYWxzZTsNCi0gICAgICAgIA0KLSAgICAgICAgcHJpdmF0ZSBDb21wb25lbnRNZXRhIGNvbXBvbmVudCA9IG51bGw7DQotDQotICAgICAgICBwdWJsaWMgQ29tcG9zaXRlQ29tcG9uZW50TWV0YWRhdGFIYW5kbGVyKE1vZGVsIG1vZGVsLCBTdHJpbmcgYWxpYXMsIFN0cmluZyBjb21wb25lbnROYW1lLA0KLSAgICAgICAgICAgICAgICBTdHJpbmcgbGlicmFyeU5hbWUsIFN0cmluZyByZXNvdXJjZU5hbWUpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhpcy5tb2RlbCA9IG1vZGVsOw0KLSAgICAgICAgICAgIHRoaXMuYWxpYXMgPSBhbGlhczsNCi0gICAgICAgICAgICB0aGlzLmNvbXBvbmVudE5hbWUgPSBjb21wb25lbnROYW1lOw0KLSAgICAgICAgICAgIHRoaXMubGlicmFyeU5hbWUgPSBsaWJyYXJ5TmFtZTsNCi0gICAgICAgICAgICB0aGlzLnJlc291cmNlTmFtZSA9IHJlc291cmNlTmFtZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHB1YmxpYyB2b2lkIGNoYXJhY3RlcnMoY2hhcltdIGNoLCBpbnQgc3RhcnQsIGludCBsZW5ndGgpIHRocm93cyBTQVhFeGNlcHRpb24NCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAodGhpcy5pbkRvY3VtZW50ICYmIGluQ29tcG9zaXRlSW50ZXJmYWNlKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICBwdWJsaWMgdm9pZCBjb21tZW50KGNoYXJbXSBjaCwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB0aHJvd3MgU0FYRXhjZXB0aW9uDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKHRoaXMuaW5Eb2N1bWVudCAmJiBpbkNvbXBvc2l0ZUludGVyZmFjZSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcHJvdGVjdGVkIF9UYWdBdHRyaWJ1dGVzIGNyZWF0ZUF0dHJpYnV0ZXMoQXR0cmlidXRlcyBhdHRycykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpbnQgbGVuID0gYXR0cnMuZ2V0TGVuZ3RoKCk7DQotICAgICAgICAgICAgX1RhZ0F0dHJpYnV0ZVtdIHRhID0gbmV3IF9UYWdBdHRyaWJ1dGVbbGVuXTsNCi0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdGFbaV0gPSBuZXcgX1RhZ0F0dHJpYnV0ZSh0aGlzLmNyZWF0ZUxvY2F0aW9uKCksIGF0dHJzLmdldFVSSShpKSwgYXR0cnMuZ2V0TG9jYWxOYW1lKGkpLCBhdHRycw0KLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRRTmFtZShpKSwgYXR0cnMuZ2V0VmFsdWUoaSkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICByZXR1cm4gbmV3IF9UYWdBdHRyaWJ1dGVzKHRhKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHByb3RlY3RlZCBfTG9jYXRpb24gY3JlYXRlTG9jYXRpb24oKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBuZXcgX0xvY2F0aW9uKHRoaXMuYWxpYXMsIHRoaXMubG9jYXRvci5nZXRMaW5lTnVtYmVyKCksIHRoaXMubG9jYXRvci5nZXRDb2x1bW5OdW1iZXIoKSk7DQotICAgICAgICB9DQotDQotICAgICAgICBwdWJsaWMgdm9pZCBlbmRDREFUQSgpIHRocm93cyBTQVhFeGNlcHRpb24NCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAodGhpcy5pbkRvY3VtZW50ICYmIGluQ29tcG9zaXRlSW50ZXJmYWNlKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICBwdWJsaWMgdm9pZCBlbmREb2N1bWVudCgpIHRocm93cyBTQVhFeGNlcHRpb24NCi0gICAgICAgIHsNCi0gICAgICAgICAgICBzdXBlci5lbmREb2N1bWVudCgpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcHVibGljIHZvaWQgZW5kRFREKCkgdGhyb3dzIFNBWEV4Y2VwdGlvbg0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRoaXMuaW5Eb2N1bWVudCA9IHRydWU7DQotICAgICAgICB9DQotDQotICAgICAgICBwdWJsaWMgdm9pZCBlbmRFbGVtZW50KFN0cmluZyB1cmksIFN0cmluZyBsb2NhbE5hbWUsIFN0cmluZyBxTmFtZSkgdGhyb3dzIFNBWEV4Y2VwdGlvbg0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmIChDT01QT1NJVEVfTElCUkFSWV9OQU1FLmVxdWFscyh1cmkpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgaWYgKElOVEVSRkFDRV9OQU1FLmVxdWFscyhsb2NhbE5hbWUpKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICB0aGlzLmluQ29tcG9zaXRlSW50ZXJmYWNlPWZhbHNlOw0KLSAgICAgICAgICAgICAgICAgICAgdGhpcy5jb21wb25lbnQgPSBudWxsOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcHVibGljIHZvaWQgZW5kRW50aXR5KFN0cmluZyBuYW1lKSB0aHJvd3MgU0FYRXhjZXB0aW9uDQotICAgICAgICB7DQotICAgICAgICB9DQotDQotICAgICAgICBwdWJsaWMgdm9pZCBlbmRQcmVmaXhNYXBwaW5nKFN0cmluZyBwcmVmaXgpIHRocm93cyBTQVhFeGNlcHRpb24NCi0gICAgICAgIHsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHB1YmxpYyB2b2lkIGZhdGFsRXJyb3IoU0FYUGFyc2VFeGNlcHRpb24gZSkgdGhyb3dzIFNBWEV4Y2VwdGlvbg0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmICh0aGlzLmxvY2F0b3IgIT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBTQVhFeGNlcHRpb24oIkVycm9yIFRyYWNlZFtsaW5lOiAiICsgdGhpcy5sb2NhdG9yLmdldExpbmVOdW1iZXIoKSArICJdICIgKyBlLmdldE1lc3NhZ2UoKSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHRocm93IGU7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcHVibGljIHZvaWQgaWdub3JhYmxlV2hpdGVzcGFjZShjaGFyW10gY2gsIGludCBzdGFydCwgaW50IGxlbmd0aCkgdGhyb3dzIFNBWEV4Y2VwdGlvbg0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmICh0aGlzLmluRG9jdW1lbnQgJiYgaW5Db21wb3NpdGVJbnRlcmZhY2UpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHB1YmxpYyBJbnB1dFNvdXJjZSByZXNvbHZlRW50aXR5KFN0cmluZyBwdWJsaWNJZCwgU3RyaW5nIHN5c3RlbUlkKSB0aHJvd3MgU0FYRXhjZXB0aW9uDQotICAgICAgICB7DQotICAgICAgICAgICAgU3RyaW5nIGR0ZCA9ICJvcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvcWRveC9kZWZhdWx0LmR0ZCI7DQotICAgICAgICAgICAgLyoNCi0gICAgICAgICAgICAgKiBpZiAoIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIi5lcXVhbHMocHVibGljSWQpKSB7IGR0ZCA9ICJ4aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI7IH0gZWxzZQ0KLSAgICAgICAgICAgICAqIGlmIChzeXN0ZW1JZCAhPSBudWxsICYmIHN5c3RlbUlkLnN0YXJ0c1dpdGgoImZpbGU6LyIpKSB7IHJldHVybiBuZXcgSW5wdXRTb3VyY2Uoc3lzdGVtSWQpOyB9DQotICAgICAgICAgICAgICovDQotICAgICAgICAgICAgVVJMIHVybCA9IGdldFJlc291cmNlKGR0ZCk7DQotICAgICAgICAgICAgcmV0dXJuIG5ldyBJbnB1dFNvdXJjZSh1cmwudG9TdHJpbmcoKSk7DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgVVJMIGdldFJlc291cmNlKFN0cmluZyByZXNvdXJjZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBVUkwgdXJsID0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKS5nZXRSZXNvdXJjZShyZXNvdXJjZSk7DQotICAgICAgICAgICAgaWYgKHVybCA9PSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdXJsID0gQ2xhc3NVdGlscy5jbGFzcy5nZXRDbGFzc0xvYWRlcigpLmdldFJlc291cmNlKHJlc291cmNlKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcmV0dXJuIHVybDsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldERvY3VtZW50TG9jYXRvcihMb2NhdG9yIGxvY2F0b3IpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhpcy5sb2NhdG9yID0gbG9jYXRvcjsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHB1YmxpYyB2b2lkIHN0YXJ0Q0RBVEEoKSB0aHJvd3MgU0FYRXhjZXB0aW9uDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKHRoaXMuaW5Eb2N1bWVudCAmJiBpbkNvbXBvc2l0ZUludGVyZmFjZSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcHVibGljIHZvaWQgc3RhcnREb2N1bWVudCgpIHRocm93cyBTQVhFeGNlcHRpb24NCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aGlzLmluRG9jdW1lbnQgPSB0cnVlOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcHVibGljIHZvaWQgc3RhcnREVEQoU3RyaW5nIG5hbWUsIFN0cmluZyBwdWJsaWNJZCwgU3RyaW5nIHN5c3RlbUlkKSB0aHJvd3MgU0FYRXhjZXB0aW9uDQotICAgICAgICB7DQotICAgICAgICAgICAgLy8gbWV0YWRhdGEgZG9lcyBub3QgcmVxdWlyZSBvdXRwdXQgZG9jdHlwZQ0KLSAgICAgICAgICAgIHRoaXMuaW5Eb2N1bWVudCA9IGZhbHNlOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcHVibGljIHZvaWQgc3RhcnRFbGVtZW50KFN0cmluZyB1cmksIFN0cmluZyBsb2NhbE5hbWUsIFN0cmluZyBxTmFtZSwgQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB0aHJvd3MgU0FYRXhjZXB0aW9uDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKENPTVBPU0lURV9MSUJSQVJZX05BTUUuZXF1YWxzKHVyaSkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBpZiAoSU5URVJGQUNFX05BTUUuZXF1YWxzKGxvY2FsTmFtZSkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIHRoaXMuaW5Db21wb3NpdGVJbnRlcmZhY2U9dHJ1ZTsNCi0gICAgICAgICAgICAgICAgICAgIF9UYWdBdHRyaWJ1dGVzIGF0dHJzID0gdGhpcy5jcmVhdGVBdHRyaWJ1dGVzKGF0dHJpYnV0ZXMpOw0KLSAgICAgICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbXBvbmVudCA9IG51bGw7DQotICAgICAgICAgICAgICAgICAgICAvLzEuIFVzZSBjb21wb25lbnRUeXBlIGF0dHJpYnV0ZSB0byBmaW5kIHRoZSBjbGFzcyBpbiB0aGUgbW9kZWwuDQotICAgICAgICAgICAgICAgICAgICBfVGFnQXR0cmlidXRlIHR5cGUgPSBhdHRycy5nZXQoImNvbXBvbmVudFR5cGUiKTsNCi0gICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gc2V0Q29tcG9uZW50VHlwZSA9IGZhbHNlOw0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUgIT0gbnVsbCkNCi0gICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbXBvbmVudCA9IG1vZGVsLmZpbmRDb21wb25lbnRCeVR5cGUodHlwZS5nZXRWYWx1ZSgpKTsgICAgICAgICAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5jb21wb25lbnQgPT0gbnVsbCkNCi0gICAgICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vQ29tcG9uZW50IG5vdCBmb3VuZCwgc2V0IGNvbXBvbmVudCB0eXBlIHdoZW4gY3JlYXRlZA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRDb21wb25lbnRUeXBlID0gdHJ1ZTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5jb21wb25lbnQgPT0gbnVsbCkNCi0gICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAvLzIuIFVzZSBsaWJyYXJ5TmFtZSArICcuJyArIGNvbXBvbmVudE5hbWUNCi0gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbXBvbmVudCA9IG1vZGVsLmZpbmRDb21wb25lbnRCeUNsYXNzTmFtZShhbGlhcyk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5jb21wb25lbnQgPT0gbnVsbCkNCi0gICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAvL05vIGNsYXNzIGJvdW5kLCBjcmVhdGUNCi0gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbXBvbmVudCA9IG5ldyBDb21wb25lbnRNZXRhKCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2V0IGFzIGNsYXNzIG5hbWUgdGhlIGFzc2lnbmVkIGJ5IEFwcGxpY2F0aW9uLmNyZWF0ZVJlc291cmNlLCANCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBldmVuIGlmIG5vdCBleGlzdHMuDQotICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb21wb25lbnQuc2V0Q2xhc3NOYW1lKGFsaWFzKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXNldENvbXBvbmVudFR5cGUpDQotICAgICAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbXBvbmVudC5zZXRQYXJlbnRDbGFzc05hbWUoImphdmF4LmZhY2VzLmNvbXBvbmVudC5VSU5hbWluZ0NvbnRhaW5lciIpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eU1ldGEgaWRQcm9wID0gbmV3IFByb3BlcnR5TWV0YSgpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZFByb3Auc2V0TmFtZSgiaWQiKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRQcm9wLnNldFJlcXVpcmVkKGZhbHNlKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb21wb25lbnQuYWRkUHJvcGVydHkoaWRQcm9wKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb21wb25lbnQuc2V0TW9kZWxJZChtb2RlbC5nZXRNb2RlbElkKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgLy9jb21wb25lbnRUeXBlDQotICAgICAgICAgICAgICAgICAgICBpZiAoc2V0Q29tcG9uZW50VHlwZSkNCi0gICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQuc2V0VHlwZSh0eXBlLmdldFZhbHVlKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgICAgICAgICAvL01hcmsgaXQgYXMgY29tcG9zaXRlDQotICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQuc2V0Q29tcG9zaXRlKEJvb2xlYW4uVFJVRSk7DQotICAgICAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC5zZXRDY0xpYnJhcnlOYW1lKGxpYnJhcnlOYW1lKTsNCi0gICAgICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50LnNldENjUmVzb3VyY2VOYW1lKHJlc291cmNlTmFtZSk7DQotICAgICAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICAgICAgIC8vbmFtZTogRm9yY2UgbmFtZSB0byBiZSB0aGUgb25lIGRlcml2ZWQgYnkgdGhlIGNvbXBvc2l0ZSBjb21wb25lbnQNCi0gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC5zZXROYW1lKGNvbXBvbmVudE5hbWUpOw0KLQ0KLSAgICAgICAgICAgICAgICAgICAgLy9zaG9ydERlc2NyaXB0aW9uDQotICAgICAgICAgICAgICAgICAgICBfVGFnQXR0cmlidXRlIHNob3J0RGVzY3JpcHRpb24gPSBhdHRycy5nZXQoInNob3J0RGVzY3JpcHRpb24iKTsNCi0gICAgICAgICAgICAgICAgICAgIGlmIChzaG9ydERlc2NyaXB0aW9uICE9IG51bGwpDQotICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50LnNldERlc2NyaXB0aW9uKHNob3J0RGVzY3JpcHRpb24uZ2V0VmFsdWUoKSk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICAgICAgIC8vIElnbm9yZWQgcHJvcGVydGllczoNCi0gICAgICAgICAgICAgICAgICAgIC8vIGRpc3BsYXlOYW1lDQotICAgICAgICAgICAgICAgICAgICAvLyBwcmVmZXJyZWQNCi0gICAgICAgICAgICAgICAgICAgIC8vIGV4cGVydA0KLSAgICAgICAgICAgICAgICAgICAgLy8gaGlkZGVuDQotICAgICAgICAgICAgICAgICAgICBtb2RlbC5hZGRDb21wb25lbnQoY29tcG9uZW50KTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBpZiAoQVRUUklCVVRFX05BTUUuZXF1YWxzKGxvY2FsTmFtZSkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIF9UYWdBdHRyaWJ1dGVzIGF0dHJzID0gdGhpcy5jcmVhdGVBdHRyaWJ1dGVzKGF0dHJpYnV0ZXMpOw0KLSAgICAgICAgICAgICAgICAgICAgLy9uYW1lDQotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IGF0dHJzLmdldCgibmFtZSIpLmdldFZhbHVlKCk7DQotICAgICAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICAgICAgIFByb3BlcnR5TWV0YSBwcm9wZXJ0eSA9IGNvbXBvbmVudC5nZXRQcm9wZXJ0eShuYW1lKTsNCi0gICAgICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BlcnR5ID09IG51bGwpDQotICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHkgPSBuZXcgUHJvcGVydHlNZXRhKCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHkuc2V0TmFtZShuYW1lKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQuYWRkUHJvcGVydHkocHJvcGVydHkpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgICAgICAgICAvL2RlZmF1bHQNCi0gICAgICAgICAgICAgICAgICAgIF9UYWdBdHRyaWJ1dGUgZGVmYXVsdFZhbHVlID0gYXR0cnMuZ2V0KCJkZWZhdWx0Iik7DQotICAgICAgICAgICAgICAgICAgICBpZiAoZGVmYXVsdFZhbHVlICE9IG51bGwpDQotICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHkuc2V0RGVmYXVsdFZhbHVlKGRlZmF1bHRWYWx1ZS5nZXRWYWx1ZSgpKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIC8vcmVxdWlyZWQNCi0gICAgICAgICAgICAgICAgICAgIF9UYWdBdHRyaWJ1dGUgcmVxdWlyZWQgPSBhdHRycy5nZXQoInJlcXVpcmVkIik7DQotICAgICAgICAgICAgICAgICAgICBpZiAocmVxdWlyZWQgIT0gbnVsbCkNCi0gICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eS5zZXRSZXF1aXJlZChCb29sZWFuLnZhbHVlT2YocmVxdWlyZWQuZ2V0VmFsdWUoKSkpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgLy9zaG9ydERlc2NyaXB0aW9uDQotICAgICAgICAgICAgICAgICAgICBfVGFnQXR0cmlidXRlIHNob3J0RGVzY3JpcHRpb24gPSBhdHRycy5nZXQoInNob3J0RGVzY3JpcHRpb24iKTsNCi0gICAgICAgICAgICAgICAgICAgIGlmIChzaG9ydERlc2NyaXB0aW9uICE9IG51bGwpDQotICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHkuc2V0RGVzY3JpcHRpb24oc2hvcnREZXNjcmlwdGlvbi5nZXRWYWx1ZSgpKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIC8vdHlwZQ0KLSAgICAgICAgICAgICAgICAgICAgX1RhZ0F0dHJpYnV0ZSB0eXBlID0gYXR0cnMuZ2V0KCJ0eXBlIik7DQotICAgICAgICAgICAgICAgICAgICBpZiAodHlwZSAhPSBudWxsKQ0KLSAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5LnNldERlZmVycmVkVmFsdWVUeXBlKHR5cGUuZ2V0VmFsdWUoKSk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAvL21ldGhvZC1zaWduYXR1cmUNCi0gICAgICAgICAgICAgICAgICAgIF9UYWdBdHRyaWJ1dGUgbWV0aG9kU2lnbmF0dXJlID0gYXR0cnMuZ2V0KCJtZXRob2Qtc2lnbmF0dXJlIik7DQotICAgICAgICAgICAgICAgICAgICBpZiAobWV0aG9kU2lnbmF0dXJlICE9IG51bGwpDQotICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHNpZ25hdHVyZSA9IG1ldGhvZFNpZ25hdHVyZS5nZXRWYWx1ZSgpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIHRyeQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0aG9kU2lnbmF0dXJlTWV0YSBtc20gPSBuZXcgTWV0aG9kU2lnbmF0dXJlTWV0YSgpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0IHBhcmFtc0xpc3QgPSBfZ2V0UGFyYW1ldGVycyhzaWduYXR1cmUpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhcmFtc0xpc3Quc2l6ZSgpOyBpKyspDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zbS5hZGRQYXJhbWV0ZXJUeXBlKChTdHJpbmcpcGFyYW1zTGlzdC5nZXQoaSkpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zbS5zZXRSZXR1cm5UeXBlKF9nZXRSZXR1cm5UeXBlKHNpZ25hdHVyZSkpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eS5zZXRNZXRob2RCaW5kaW5nU2lnbmF0dXJlKG1zbSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkNCi0gICAgICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBTQVhFeGNlcHRpb24oZSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICAgICAgLy8gSWdub3JlZCBwcm9wZXJ0aWVzOg0KLSAgICAgICAgICAgICAgICAgICAgLy8gcHJlZmVycmVkDQotICAgICAgICAgICAgICAgICAgICAvLyBleHBlcnQNCi0gICAgICAgICAgICAgICAgICAgIC8vIGhpZGRlbg0KLSAgICAgICAgICAgICAgICAgICAgLy8gdGFyZ2V0cw0KLSAgICAgICAgICAgICAgICAgICAgLy8gZGlzcGxheU5hbWUNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBpZiAoRkFDRVRfTkFNRS5lcXVhbHMobG9jYWxOYW1lKSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgX1RhZ0F0dHJpYnV0ZXMgYXR0cnMgPSB0aGlzLmNyZWF0ZUF0dHJpYnV0ZXMoYXR0cmlidXRlcyk7DQotICAgICAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lID0gYXR0cnMuZ2V0KCJuYW1lIikuZ2V0VmFsdWUoKTsNCi0gICAgICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgICAgICAgRmFjZXRNZXRhIGZhY2V0ID0gY29tcG9uZW50LmdldEZhY2V0KG5hbWUpOw0KLSAgICAgICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgICAgICAgICBpZiAoZmFjZXQgPT0gbnVsbCkNCi0gICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBmYWNldCA9IG5ldyBGYWNldE1ldGEoKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBmYWNldC5zZXROYW1lKG5hbWUpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC5hZGRGYWNldChmYWNldCk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICAgICAgIC8vcmVxdWlyZWQNCi0gICAgICAgICAgICAgICAgICAgIF9UYWdBdHRyaWJ1dGUgcmVxdWlyZWQgPSBhdHRycy5nZXQoInJlcXVpcmVkIik7DQotICAgICAgICAgICAgICAgICAgICBpZiAocmVxdWlyZWQgIT0gbnVsbCkNCi0gICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBmYWNldC5zZXRSZXF1aXJlZChCb29sZWFuLnZhbHVlT2YocmVxdWlyZWQuZ2V0VmFsdWUoKSkpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgICAgICAgICAvL3Nob3J0RGVzY3JpcHRpb24NCi0gICAgICAgICAgICAgICAgICAgIF9UYWdBdHRyaWJ1dGUgc2hvcnREZXNjcmlwdGlvbiA9IGF0dHJzLmdldCgic2hvcnREZXNjcmlwdGlvbiIpOw0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHNob3J0RGVzY3JpcHRpb24gIT0gbnVsbCkNCi0gICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBmYWNldC5zZXREZXNjcmlwdGlvbihzaG9ydERlc2NyaXB0aW9uLmdldFZhbHVlKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgICAgICAgICAvLyBJZ25vcmVkIHByb3BlcnRpZXM6DQotICAgICAgICAgICAgICAgICAgICAvLyBwcmVmZXJyZWQNCi0gICAgICAgICAgICAgICAgICAgIC8vIGV4cGVydA0KLSAgICAgICAgICAgICAgICAgICAgLy8gaGlkZGVuDQotICAgICAgICAgICAgICAgICAgICAvLyBkaXNwbGF5TmFtZQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgX2dldFJldHVyblR5cGUoU3RyaW5nIHNpZ25hdHVyZSkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGludCBlbmROYW1lID0gc2lnbmF0dXJlLmluZGV4T2YoJygnKTsNCi0gICAgICAgICAgICBpZiAoZW5kTmFtZSA8IDApDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJJbnZhbGlkIG1ldGhvZCBzaWduYXR1cmU6IiArIHNpZ25hdHVyZSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGludCBlbmQgPSBzaWduYXR1cmUubGFzdEluZGV4T2YoJyAnLCBlbmROYW1lKTsNCi0gICAgICAgICAgICBpZiAoZW5kIDwgMCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIkludmFsaWQgbWV0aG9kIHNpZ25hdHVyZToiICsgc2lnbmF0dXJlKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcmV0dXJuIHNpZ25hdHVyZS5zdWJzdHJpbmcoMCxlbmQpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLyoqDQotICAgICAgICAgKiBHZXQgdGhlIHBhcmFtZXRlcnMgdHlwZXMgZnJvbSB0aGUgZnVuY3Rpb24gc2lnbmF0dXJlLg0KLSAgICAgICAgICogDQotICAgICAgICAgKiBAcmV0dXJuIEFuIGFycmF5IG9mIHBhcmFtZXRlciBjbGFzcyBuYW1lcw0KLSAgICAgICAgICovDQotICAgICAgICBwcml2YXRlIExpc3QgX2dldFBhcmFtZXRlcnMoU3RyaW5nIHNpZ25hdHVyZSkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICAgICAgew0KLSAgICAgICAgICAgIEFycmF5TGlzdCBwYXJhbXMgPSBuZXcgQXJyYXlMaXN0KCk7DQotICAgICAgICAgICAgLy8gU2lnbmF0dXJlIGlzIG9mIHRoZSBmb3JtDQotICAgICAgICAgICAgLy8gPHJldHVybi10eXBlPiBTIDxtZXRob2QtbmFtZSBTPyAnKCcNCi0gICAgICAgICAgICAvLyA8IDxhcmctdHlwZT4gKCAnLCcgPGFyZy10eXBlPiApKiApPyAnKScNCi0gICAgICAgICAgICBpbnQgc3RhcnQgPSBzaWduYXR1cmUuaW5kZXhPZignKCcpICsgMTsNCi0gICAgICAgICAgICBib29sZWFuIGxhc3RBcmcgPSBmYWxzZTsNCi0gICAgICAgICAgICB3aGlsZSAodHJ1ZSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGludCBwID0gc2lnbmF0dXJlLmluZGV4T2YoJywnLCBzdGFydCk7DQotICAgICAgICAgICAgICAgIGlmIChwIDwgMCkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgcCA9IHNpZ25hdHVyZS5pbmRleE9mKCcpJywgc3RhcnQpOw0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHAgPCAwKQ0KLSAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIkludmFsaWQgbWV0aG9kIHNpZ25hdHVyZToiK3NpZ25hdHVyZSk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBsYXN0QXJnID0gdHJ1ZTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBTdHJpbmcgYXJnID0gc2lnbmF0dXJlLnN1YnN0cmluZyhzdGFydCwgcCkudHJpbSgpOw0KLSAgICAgICAgICAgICAgICBpZiAoISIiLmVxdWFscyhhcmcpKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBwYXJhbXMuYWRkKGFyZyk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgaWYgKGxhc3RBcmcpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIHN0YXJ0ID0gcCArIDE7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHJldHVybiBwYXJhbXM7DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgICAgIHB1YmxpYyB2b2lkIHN0YXJ0RW50aXR5KFN0cmluZyBuYW1lKSB0aHJvd3MgU0FYRXhjZXB0aW9uDQotICAgICAgICB7DQotICAgICAgICB9DQotDQotICAgICAgICBwdWJsaWMgdm9pZCBzdGFydFByZWZpeE1hcHBpbmcoU3RyaW5nIHByZWZpeCwgU3RyaW5nIHVyaSkgdGhyb3dzIFNBWEV4Y2VwdGlvbg0KLSAgICAgICAgew0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcHVibGljIHZvaWQgcHJvY2Vzc2luZ0luc3RydWN0aW9uKFN0cmluZyB0YXJnZXQsIFN0cmluZyBkYXRhKSB0aHJvd3MgU0FYRXhjZXB0aW9uDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKHRoaXMuaW5Eb2N1bWVudCAmJiBpbkNvbXBvc2l0ZUludGVyZmFjZSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfSAgDQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyB2b2lkIGJ1aWxkTW9kZWwoTW9kZWwgbW9kZWwsIE1vZGVsUGFyYW1zIHBhcmFtZXRlcnMpDQotICAgIHsNCi0gICAgICAgIGlmIChwYXJhbWV0ZXJzLmdldENvbXBvc2l0ZUNvbXBvbmVudERpcmVjdG9yaWVzKCkgIT0gbnVsbCAmJg0KLSAgICAgICAgICAgIHBhcmFtZXRlcnMuZ2V0Q29tcG9zaXRlQ29tcG9uZW50TGlicmFyaWVzKCkgIT0gbnVsbCAmJg0KLSAgICAgICAgICAgICFwYXJhbWV0ZXJzLmdldENvbXBvc2l0ZUNvbXBvbmVudERpcmVjdG9yaWVzKCkuaXNFbXB0eSgpICYmDQotICAgICAgICAgICAgIXBhcmFtZXRlcnMuZ2V0Q29tcG9zaXRlQ29tcG9uZW50TGlicmFyaWVzKCkuaXNFbXB0eSgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXQgPSBwYXJhbWV0ZXJzLmdldENvbXBvc2l0ZUNvbXBvbmVudERpcmVjdG9yaWVzKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIE9iamVjdCBvZGlyID0gaXQubmV4dCgpOw0KLSAgICAgICAgICAgICAgICBGaWxlIGRpciA9IG51bGw7DQotICAgICAgICAgICAgICAgIGlmIChvZGlyIGluc3RhbmNlb2YgRmlsZSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgZGlyID0gKEZpbGUpIG9kaXI7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgZWxzZQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBkaXIgPSBuZXcgRmlsZShvZGlyLnRvU3RyaW5nKCkpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGlmIChkaXIgIT0gbnVsbCAmJiBkaXIuZXhpc3RzKCkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXQyID0gcGFyYW1ldGVycy5nZXRDb21wb3NpdGVDb21wb25lbnRMaWJyYXJpZXMoKS5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IA0KLSAgICAgICAgICAgICAgICAgICAgICAgICBpdDIuaGFzTmV4dCgpOykNCi0gICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpdDIubmV4dCgpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzaG9ydFRhZ0xpYnJhcnlOYW1lID0gKFN0cmluZykgZW50cnkuZ2V0S2V5KCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGxpYnJhcnlOYW1lID0gKFN0cmluZykgZW50cnkuZ2V0VmFsdWUoKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBGaWxlIGRpclRvU2NhbiA9IG5ldyBGaWxlKGRpcixsaWJyYXJ5TmFtZSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRpclRvU2NhbiAhPSBudWxsICYmIGRpclRvU2Nhbi5leGlzdHMoKSAmJiBkaXJUb1NjYW4uaXNEaXJlY3RvcnkoKSApDQotICAgICAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmdbXSBmaWxlRXh0ZW5zaW9ucyA9IHBhcmFtZXRlcnMuZ2V0Q29tcG9zaXRlQ29tcG9uZW50RmlsZUV4dGVuc2lvbnMoKSAhPSBudWxsID8gDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMuZ2V0Q29tcG9zaXRlQ29tcG9uZW50RmlsZUV4dGVuc2lvbnMoKS5zcGxpdCgiICIpIDogbmV3IFN0cmluZ1tdeyIueGh0bWwifTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVGaWx0ZXIgZmlsZUZpbHRlciA9IG5ldyBGaWxlRmlsdGVyKCkNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBhY2NlcHQoRmlsZSBmaWxlKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChTdHJpbmcgZXh0ZW5zaW9uIDogZmlsZUV4dGVuc2lvbnMpDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaWxlLmdldE5hbWUoKS5lbmRzV2l0aChleHRlbnNpb24pKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ow0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZVtdIGZpbGVzID0gZGlyVG9TY2FuLmxpc3RGaWxlcyhmaWxlRmlsdGVyKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaWxlcyAhPSBudWxsKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZmlsZUV4dGVuc2lvbiA9IG51bGw7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoU3RyaW5nIGV4dGVuc2lvbiA6IGZpbGVFeHRlbnNpb25zKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZXNbaV0uZ2V0TmFtZSgpLmVuZHNXaXRoKGV4dGVuc2lvbikpDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZUV4dGVuc2lvbiA9IGV4dGVuc2lvbjsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgY29tcG9uZW50TmFtZSA9IGZpbGVzW2ldLmdldE5hbWUoKS5zdWJzdHJpbmcoDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIGZpbGVzW2ldLmdldE5hbWUoKS5sZW5ndGgoKS1maWxlRXh0ZW5zaW9uLmxlbmd0aCgpKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb1BhcnNlTWV0YWRhdGEobW9kZWwsIGZpbGVzW2ldLnRvVVJMKCksIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3J0VGFnTGlicmFyeU5hbWUsIGxpYnJhcnlOYW1lLCBmaWxlc1tpXS5nZXROYW1lKCksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50TmFtZSwgbGlicmFyeU5hbWUrJy4nKyBjb21wb25lbnROYW1lKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmVycm9yKCJFcnJvciB3aGlsZSBwcm9jZXNzaW5nIGNvbXBvc2l0ZSBjb21wb25lbnQ6ICIrDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlicmFyeU5hbWUrJy8nK2NvbXBvbmVudE5hbWUsIGUpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5lcnJvcigiRXJyb3Igd2hpbGUgcHJvY2Vzc2luZyBjb21wb3NpdGUgY29tcG9uZW50OiAiKw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpYnJhcnlOYW1lKycvJytjb21wb25lbnROYW1lLCBlKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKFNBWEV4Y2VwdGlvbiBlKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmVycm9yKCJFcnJvciB3aGlsZSBwcm9jZXNzaW5nIGNvbXBvc2l0ZSBjb21wb25lbnQ6ICIrDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlicmFyeU5hbWUrJy8nK2NvbXBvbmVudE5hbWUsIGUpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXRjaCAoUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBlKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmVycm9yKCJFcnJvciB3aGlsZSBwcm9jZXNzaW5nIGNvbXBvc2l0ZSBjb21wb25lbnQ6ICIrDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlicmFyeU5hbWUrJy8nK2NvbXBvbmVudE5hbWUsIGUpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCB2b2lkIGRvUGFyc2VNZXRhZGF0YShNb2RlbCBtb2RlbCwgDQotICAgICAgICAgICAgVVJMIHNyYywgU3RyaW5nIHNob3J0TGlicmFyeU5hbWUsIA0KLSAgICAgICAgICAgIFN0cmluZyBsaWJyYXJ5TmFtZSwgU3RyaW5nIHJlc291cmNlTmFtZSwgU3RyaW5nIGNvbXBvbmVudE5hbWUsIFN0cmluZyBhbGlhcykgDQotICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU0FYRXhjZXB0aW9uLA0KLSAgICAgICAgICAgIFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgSW5wdXRTdHJlYW0gaXMgPSBudWxsOw0KLSAgICAgICAgdHJ5DQotICAgICAgICB7DQotICAgICAgICAgICAgaXMgPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShzcmMub3BlblN0cmVhbSgpLCAxMDI0KTsNCi0gICAgICAgICAgICBDb21wb3NpdGVDb21wb25lbnRNZXRhZGF0YUhhbmRsZXIgaGFuZGxlciA9IA0KLSAgICAgICAgICAgICAgICBuZXcgQ29tcG9zaXRlQ29tcG9uZW50TWV0YWRhdGFIYW5kbGVyKG1vZGVsLCBhbGlhcywgc2hvcnRMaWJyYXJ5TmFtZSArICc6JyArIA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudE5hbWUsIGxpYnJhcnlOYW1lLCByZXNvdXJjZU5hbWUpOw0KLSAgICAgICAgICAgIFNBWFBhcnNlciBwYXJzZXIgPSB0aGlzLmNyZWF0ZVNBWFBhcnNlcihoYW5kbGVyKTsNCi0gICAgICAgICAgICBwYXJzZXIucGFyc2UoaXMsIGhhbmRsZXIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZmluYWxseQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmIChpcyAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgaXMuY2xvc2UoKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBmaW5hbCBTQVhQYXJzZXIgY3JlYXRlU0FYUGFyc2VyKERlZmF1bHRIYW5kbGVyIGhhbmRsZXIpDQotICAgICAgICAgICAgdGhyb3dzIFNBWEV4Y2VwdGlvbiwgUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBTQVhQYXJzZXJGYWN0b3J5IGZhY3RvcnkgPSBTQVhQYXJzZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7DQotICAgICAgICBmYWN0b3J5LnNldE5hbWVzcGFjZUF3YXJlKHRydWUpOw0KLSAgICAgICAgZmFjdG9yeS5zZXRGZWF0dXJlKCJodHRwOi8veG1sLm9yZy9zYXgvZmVhdHVyZXMvbmFtZXNwYWNlLXByZWZpeGVzIiwNCi0gICAgICAgICAgICAgICAgdHJ1ZSk7DQotICAgICAgICBmYWN0b3J5LnNldEZlYXR1cmUoImh0dHA6Ly94bWwub3JnL3NheC9mZWF0dXJlcy92YWxpZGF0aW9uIiwgZmFsc2UpOw0KLSAgICAgICAgZmFjdG9yeS5zZXRWYWxpZGF0aW5nKGZhbHNlKTsNCi0gICAgICAgIFNBWFBhcnNlciBwYXJzZXIgPSBmYWN0b3J5Lm5ld1NBWFBhcnNlcigpOw0KLSAgICAgICAgWE1MUmVhZGVyIHJlYWRlciA9IHBhcnNlci5nZXRYTUxSZWFkZXIoKTsNCi0gICAgICAgIHJlYWRlci5zZXRQcm9wZXJ0eSgiaHR0cDovL3htbC5vcmcvc2F4L3Byb3BlcnRpZXMvbGV4aWNhbC1oYW5kbGVyIiwNCi0gICAgICAgICAgICAgICAgaGFuZGxlcik7DQotICAgICAgICByZWFkZXIuc2V0RXJyb3JIYW5kbGVyKGhhbmRsZXIpOw0KLSAgICAgICAgcmVhZGVyLnNldEVudGl0eVJlc29sdmVyKGhhbmRsZXIpOw0KLSAgICAgICAgcmV0dXJuIHBhcnNlcjsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL3Fkb3gvUGFyc2luZ0NvbnRleHQuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvcWRveC9QYXJzaW5nQ29udGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwM2JkZmRjLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvcWRveC9QYXJzaW5nQ29udGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoNCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqIA0KLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKiANCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmJ1aWxkZXIucWRveDsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uYnVpbGRlci5tb2RlbC5Nb2RlbDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5idWlsZGVyLnFkb3gucGFyc2UuSmF2YUNsYXNzUGFyc2luZ1N0cmF0ZWd5Ow0KLQ0KLWltcG9ydCBjb20udGhvdWdodHdvcmtzLnFkb3gubW9kZWwuSmF2YUNsYXNzOw0KLQ0KLS8qKg0KLSAqIA0KLSAqIEBhdXRob3IgTGVvbmFyZG8gVXJpYmUNCi0gKiBAc2luY2UgMS4wLjkNCi0gKg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBQYXJzaW5nQ29udGV4dA0KLXsNCi0gICAgcHJpdmF0ZSBMaXN0IHN0cmF0ZWdpZXM7DQotICAgIA0KLSAgICBwdWJsaWMgUGFyc2luZ0NvbnRleHQoKQ0KLSAgICB7DQotICAgICAgICBzdHJhdGVnaWVzID0gbmV3IEFycmF5TGlzdCgpOw0KLSAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgdm9pZCBhZGRTdHJhdGVneShKYXZhQ2xhc3NQYXJzaW5nU3RyYXRlZ3kgcykNCi0gICAgew0KLSAgICAgICAgc3RyYXRlZ2llcy5hZGQocyk7DQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyB2b2lkIHBhcnNlQ2xhc3MoSmF2YUNsYXNzIGNsYXp6LCBNb2RlbCBtb2RlbCkNCi0gICAgew0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzdHJhdGVnaWVzLnNpemUoKTsgaSsrKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgICgoSmF2YUNsYXNzUGFyc2luZ1N0cmF0ZWd5KXN0cmF0ZWdpZXMuZ2V0KGkpKS5wYXJzZUNsYXNzKGNsYXp6LCBtb2RlbCk7DQotICAgICAgICAgICAgDQotICAgICAgICB9DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9xZG94L1Fkb3hIZWxwZXIuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvcWRveC9RZG94SGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3NGI4OWEuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9xZG94L1Fkb3hIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyNyArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uYnVpbGRlci5xZG94OwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nLlN0cmluZ1V0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uYnVpbGRlci5JT1V0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uYnVpbGRlci5tb2RlbC5CZWhhdmlvck1ldGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5idWlsZGVyLm1vZGVsLkNsYXNzTWV0YTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmJ1aWxkZXIubW9kZWwuQ29tcG9uZW50TWV0YTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmJ1aWxkZXIubW9kZWwuQ29udmVydGVyTWV0YTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmJ1aWxkZXIubW9kZWwuRmFjZWxldFRhZ01ldGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5idWlsZGVyLm1vZGVsLk1vZGVsOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uYnVpbGRlci5tb2RlbC5WYWxpZGF0b3JNZXRhOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMuY29tcG9uZW50cy5pby5maWxlc2VsZWN0b3JzLkZpbGVJbmZvOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMuY29tcG9uZW50cy5pby5maWxlc2VsZWN0b3JzLkZpbGVTZWxlY3RvcjsKLWltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLmNvbXBvbmVudHMuaW8uZmlsZXNlbGVjdG9ycy5JbmNsdWRlRXhjbHVkZUZpbGVTZWxlY3RvcjsKLQotaW1wb3J0IGNvbS50aG91Z2h0d29ya3MucWRveC5KYXZhRG9jQnVpbGRlcjsKLWltcG9ydCBjb20udGhvdWdodHdvcmtzLnFkb3gubW9kZWwuQWJzdHJhY3RKYXZhRW50aXR5OwotaW1wb3J0IGNvbS50aG91Z2h0d29ya3MucWRveC5tb2RlbC5Bbm5vdGF0aW9uOwotaW1wb3J0IGNvbS50aG91Z2h0d29ya3MucWRveC5tb2RlbC5KYXZhQ2xhc3M7Ci0KLS8qKgotICogSGVscGVyIGNsYXNzIHVzZWQgYnkgUWRveE1vZGVsQnVpbGRlciBhbmQgcHJvdmlkZSB1dGlsaXR5IG1ldGhvZHMuIAotICogCi0gKiBAc2luY2UgMS4wLjQKLSAqIEBhdXRob3IgTGVvbmFyZG8gVXJpYmUgKGxhdGVzdCBtb2RpZmljYXRpb24gYnkgJEF1dGhvciQpCi0gKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAotICovCi1wdWJsaWMgY2xhc3MgUWRveEhlbHBlcgotewotCi0gICAgLyoqCi0gICAgICogQ29udmVydCBhIG1ldGhvZCBuYW1lIHRvIGEgcHJvcGVydHkgbmFtZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBtZXRob2RUb1Byb3BOYW1lKFN0cmluZyBtZXRob2ROYW1lKQotICAgIHsKLSAgICAgICAgU3RyaW5nQnVmZmVyIG5hbWUgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgIGlmIChtZXRob2ROYW1lLnN0YXJ0c1dpdGgoImdldCIpIHx8IG1ldGhvZE5hbWUuc3RhcnRzV2l0aCgic2V0IikpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG5hbWUuYXBwZW5kKG1ldGhvZE5hbWUuc3Vic3RyaW5nKDMpKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChtZXRob2ROYW1lLnN0YXJ0c1dpdGgoImlzIikpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG5hbWUuYXBwZW5kKG1ldGhvZE5hbWUuc3Vic3RyaW5nKDIpKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkludmFsaWQgYW5ub3RhdGVkIG1ldGhvZCBuYW1lICIKLSAgICAgICAgICAgICAgICAgICAgKyBtZXRob2ROYW1lKTsKLSAgICAgICAgfQotICAgIAotICAgICAgICAvLyBIYW5kbGUgZm9sbG93aW5nIHN0eWxlcyBvZiBwcm9wZXJ0eSBuYW1lCi0gICAgICAgIC8vIGdldGZvb0JhciAtLT4gZm9vQmFyCi0gICAgICAgIC8vIGdldEZvb0JhciAtLT4gZm9vQmFyCi0gICAgICAgIC8vIGdldFVSTCAtLT4gdXJsCi0gICAgICAgIC8vIGdldFVSTExvY2F0aW9uIC0tPiB1cmxMb2NhdGlvbgotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5hbWUubGVuZ3RoKCk7ICsraSkKLSAgICAgICAgewotICAgICAgICAgICAgY2hhciBjID0gbmFtZS5jaGFyQXQoaSk7Ci0gICAgICAgICAgICBpZiAoQ2hhcmFjdGVyLmlzVXBwZXJDYXNlKGMpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG5hbWUuc2V0Q2hhckF0KGksIENoYXJhY3Rlci50b0xvd2VyQ2FzZShjKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKGkgPiAxKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gcmVzZXQgdGhlIHByZXZpb3VzIGNoYXIgdG8gdXBwZXJjYXNlCi0gICAgICAgICAgICAgICAgICAgIGMgPSBuYW1lLmNoYXJBdChpIC0gMSk7Ci0gICAgICAgICAgICAgICAgICAgIG5hbWUuc2V0Q2hhckF0KGkgLSAxLCBDaGFyYWN0ZXIudG9VcHBlckNhc2UoYykpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbmFtZS50b1N0cmluZygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdpdmVuIHRoZSBmdWxsIGphdmFkb2MgZm9yIGEgY29tcG9uZW50LCBleHRyYWN0IGp1c3QgdGhlICJmaXJzdAotICAgICAqIHNlbnRlbmNlIi4KLSAgICAgKiA8cD4KLSAgICAgKiBJbml0aWFsbHksIGp1c3QgZmluZCB0aGUgZmlyc3QgZG90LCBhbmQgc3RyaXAgb3V0IGFueSBsaW5lZmVlZHMuIExhdGVyLAotICAgICAqIHRyeSB0byBoYW5kbGUgImUuZy4iIGFuZCBzaW1pbGFyIChzZWUgamF2YWRvYyBhbGdvcml0aG0gZm9yIHNlbnRlbmNlCi0gICAgICogZGV0ZWN0aW9uKS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRGaXJzdFNlbnRlbmNlKFN0cmluZyBkb2MpCi0gICAgewotICAgICAgICBpZiAoZG9jID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgCi0gICAgICAgIGludCBpbmRleCA9IGRvYy5pbmRleE9mKCcuJyk7Ci0gICAgICAgIGlmIChpbmRleCA9PSAtMSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGRvYzsKLSAgICAgICAgfQotICAgICAgICAvLyBhYmMuCi0gICAgICAgIHJldHVybiBkb2Muc3Vic3RyaW5nKDAsIGluZGV4KTsKLSAgICB9Ci0gICAgCi0gICAgCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RnVsbHlRdWFsaWZpZWRDbGFzc05hbWUoSmF2YUNsYXNzIGNsYXp6LCBTdHJpbmcgZnFuKQotICAgIHsKLSAgICAgICAgLy9RRG94IDEuOSBidWcuIGdldEZ1bGx5UXVhbGlmaWVkTmFtZSBkb2VzIG5vdCByZXNvbHZlIAotICAgICAgICAvL2NvcnJlY3RseSBjbGFzc2VzIGxpa2UgamF2YXguc2VydmxldC5qc3AudGFnZXh0LlRhZ1N1cHBvcnQgYXMgcGFyZW50Ci0gICAgICAgIC8vb2YgYSBjbGFzcyB3aXRoIEBKU0ZKc3BUYWcuIFRoZSB0ZW1wb3JhbCBzb2x1dGlvbiBpcyBzY2FuCi0gICAgICAgIC8vdGhlIGltcG9ydHMsIGxvb2tpbmcgZm9yIHRoaXMgdHlwZSBhbmQgaWYgaXQgaXMgZm91bmQgcmVwbGFjZSBpdC4KLSAgICAgICAgLy9GaXhlZCBvbiAxLjkuMSwgYnV0IGJldHRlciBsZXQgdGhlIGNvZGUgYXMgaXMgCi0gICAgICAgIC8qCi0gICAgICAgIGlmIChmcW4uaW5kZXhPZignLicpID09IC0xKQotICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmcgW10gaW1wb3J0cyA9IGNsYXp6LmdldFNvdXJjZSgpLmdldEltcG9ydHMoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW1wb3J0cy5sZW5ndGg7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoaW1wb3J0c1tpXS5lbmRzV2l0aChmcW4pKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZnFuID0gaW1wb3J0c1tpXTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0qLwotICAgICAgICByZXR1cm4gZnFuOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBGb3IgZWFjaCBjb21wb25lbnQsIHRyeSB0byBmaW5kIGl0cyAibG9naWNhbCIgcGFyZW50IGNvbXBvbmVudCwKLSAgICAgKiBpZSB0aGUgbmVhcmVzdCBzdXBlcmNsYXNzIHRoYXQgaXMgYWxzbyBhbm5vdGF0ZWQgYXMgYSBjb21wb25lbnQKLSAgICAgKiBhbmQgdGhlcmVmb3JlIGhhcyBhbiBlbnRyeSBpbiB0aGUgbW9kZWwuCi0gICAgICogPHA+Ci0gICAgICogSW4gbW9zdCBjYXNlcyB0aGlzIGNvdWxkIGJlIGRvbmUgYXQgdGhlIHRpbWUgdGhlIGNvbXBvbmVudCBpcwotICAgICAqIHByb2Nlc3NlZC4gVGhlIHByb2Nlc3NDbGFzcygpIG1ldGhvZCBkb2VzIHRyeSB0byBwcm9jZXNzIHRoZQotICAgICAqIGNsYXNzZXMgdGhhdCBxZG94IGRpc2NvdmVycyBpbiBhbmNlc3Rvci0+ZGVzY2VuZGFudCBvcmRlci4KLSAgICAgKiA8cD4KLSAgICAgKiBIb3dldmVyIHRoZXJlIGlzIG9uZSBjYXNlIHdoZXJlIHRoaXMganVzdCBkb2Vzbid0IHdvcmsuIFRoZXJlZm9yZQotICAgICAqIGEgdHdvLXBhc3MgYXBwcm9hY2ggaXMgdXNlZDogZmlyc3QgY3JlYXRlIGEgQ29tcG9uZW50TWV0YSBmb3IKLSAgICAgKiBlYWNoIGNvbXBvbmVudCwgYW5kIHRoZW4gb24gYSBzZWNvbmQgcGFzcyBmaW5kIHRoZSBtYXRjaGluZwotICAgICAqIHBhcmVudCBmb3IgZWFjaCBvbmUuCi0gICAgICogPHA+Ci0gICAgICogVGhlIHByb2JsZW0gY2FzZSBpcyB3aGVyZSBhbiBhbm5vdGF0ZWQgamF2YSBjbGFzcyBleHRlbmRzIGEKLSAgICAgKiBnZW5lcmF0ZWQgb25lLiBJbiB0aGlzIGNhc2Ugd2hlbiB3YWxraW5nIHVwIHRoZSBhbmNlc3RyeSB0cmVlIG9mCi0gICAgICogdGhlIGhhbmQtd3JpdHRlbiBjbGFzcyB3ZSBmaW5kIGFuIGVudHJ5IGZvciB3aGljaCB0aGVyZSBpcyBubwotICAgICAqIENvbXBvbmVudE1ldGEgZW50cnkuIFdlIGRvIG5vdCBrbm93IHdoZXRoZXIgdGhpcyBpcyBiZWNhdXNlIHRoZQotICAgICAqIHBhcmVudCBleGlzdHMgYnV0IGlzIG5vdCBhbm5vdGF0ZWQsIG9yIHdoZXRoZXIgYSBDb21wb25lbnRNZXRhCi0gICAgICogZm9yIHRoYXQgcGFyZW50IHdpbGwgYmUgZ2VuZXJhdGVkIG9uY2Ugd2UgaGF2ZSBwcm9jZXNzZWQgc29tZQotICAgICAqIG90aGVyIGNsYXNzIHRoYXQgaGFwcGVucyB0byBoYXZlIHRoZSBtYXRjaGluZyBhbm5vdGF0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBpbml0Q29tcG9uZW50QW5jZXN0cnkoTWFwIGphdmFDbGFzc0J5TmFtZSwgTW9kZWwgbW9kZWwsIENsYXNzTWV0YSBtb2RlbEl0ZW0pCi0gICAgewotICAgICAgICBKYXZhQ2xhc3MgY2xhenogPSAoSmF2YUNsYXNzKSBqYXZhQ2xhc3NCeU5hbWUuZ2V0KG1vZGVsSXRlbS5nZXRTb3VyY2VDbGFzc05hbWUoKSk7Ci0gICAgICAgIEphdmFDbGFzcyBwYXJlbnRDbGF6eiA9IGNsYXp6LmdldFN1cGVySmF2YUNsYXNzKCk7Ci0gICAgICAgIHdoaWxlIChwYXJlbnRDbGF6eiAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmcgcGFyZW50Q2xhenpOYW1lID0gcGFyZW50Q2xhenouZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHBhcmVudENsYXp6TmFtZSA9IGdldEZ1bGx5UXVhbGlmaWVkQ2xhc3NOYW1lKGNsYXp6LHBhcmVudENsYXp6TmFtZSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIENvbXBvbmVudE1ldGEgcGFyZW50Q29tcG9uZW50ID0gbW9kZWwKLSAgICAgICAgICAgICAgICAgICAgLmZpbmRDb21wb25lbnRCeUNsYXNzTmFtZShwYXJlbnRDbGF6ek5hbWUpOwotICAgICAgICAgICAgaWYgKHBhcmVudENvbXBvbmVudCAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG1vZGVsSXRlbS5zZXRQYXJlbnRDbGFzc05hbWUocGFyZW50Q29tcG9uZW50LmdldENsYXNzTmFtZSgpKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBhcmVudENsYXp6ID0gcGFyZW50Q2xhenouZ2V0U3VwZXJKYXZhQ2xhc3MoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNhbWUgYXMgaW5pdENvbXBvbmVudEFuY2VzdHJ5IGJ1dCBmb3IgdmFsaWRhdG9ycy4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgaW5pdFZhbGlkYXRvckFuY2VzdHJ5KE1hcCBqYXZhQ2xhc3NCeU5hbWUsIE1vZGVsIG1vZGVsLCBDbGFzc01ldGEgbW9kZWxJdGVtKQotICAgIHsKLSAgICAgICAgSmF2YUNsYXNzIGNsYXp6ID0gKEphdmFDbGFzcykgamF2YUNsYXNzQnlOYW1lLmdldChtb2RlbEl0ZW0uZ2V0U291cmNlQ2xhc3NOYW1lKCkpOwotICAgICAgICBKYXZhQ2xhc3MgcGFyZW50Q2xhenogPSBjbGF6ei5nZXRTdXBlckphdmFDbGFzcygpOwotICAgICAgICB3aGlsZSAocGFyZW50Q2xhenogIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIHBhcmVudENsYXp6TmFtZSA9IHBhcmVudENsYXp6LmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBwYXJlbnRDbGF6ek5hbWUgPSBnZXRGdWxseVF1YWxpZmllZENsYXNzTmFtZShjbGF6eixwYXJlbnRDbGF6ek5hbWUpOwotCi0gICAgICAgICAgICBWYWxpZGF0b3JNZXRhIHBhcmVudENvbXBvbmVudCA9IG1vZGVsCi0gICAgICAgICAgICAgICAgICAgIC5maW5kVmFsaWRhdG9yQnlDbGFzc05hbWUocGFyZW50Q2xhenpOYW1lKTsKLSAgICAgICAgICAgIGlmIChwYXJlbnRDb21wb25lbnQgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBtb2RlbEl0ZW0uc2V0UGFyZW50Q2xhc3NOYW1lKHBhcmVudENvbXBvbmVudC5nZXRDbGFzc05hbWUoKSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwYXJlbnRDbGF6eiA9IHBhcmVudENsYXp6LmdldFN1cGVySmF2YUNsYXNzKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogU2FtZSBhcyBpbml0Q29tcG9uZW50QW5jZXN0cnkgYnV0IGZvciBjb252ZXJ0ZXJzCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGluaXRDb252ZXJ0ZXJBbmNlc3RyeShNYXAgamF2YUNsYXNzQnlOYW1lLCBNb2RlbCBtb2RlbCwgQ2xhc3NNZXRhIG1vZGVsSXRlbSkKLSAgICB7Ci0gICAgICAgIEphdmFDbGFzcyBjbGF6eiA9IChKYXZhQ2xhc3MpIGphdmFDbGFzc0J5TmFtZS5nZXQobW9kZWxJdGVtLmdldFNvdXJjZUNsYXNzTmFtZSgpKTsKLSAgICAgICAgSmF2YUNsYXNzIHBhcmVudENsYXp6ID0gY2xhenouZ2V0U3VwZXJKYXZhQ2xhc3MoKTsKLSAgICAgICAgd2hpbGUgKHBhcmVudENsYXp6ICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyBwYXJlbnRDbGF6ek5hbWUgPSBwYXJlbnRDbGF6ei5nZXRGdWxseVF1YWxpZmllZE5hbWUoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgcGFyZW50Q2xhenpOYW1lID0gZ2V0RnVsbHlRdWFsaWZpZWRDbGFzc05hbWUoY2xhenoscGFyZW50Q2xhenpOYW1lKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgQ29udmVydGVyTWV0YSBwYXJlbnRDb21wb25lbnQgPSBtb2RlbAotICAgICAgICAgICAgICAgICAgICAuZmluZENvbnZlcnRlckJ5Q2xhc3NOYW1lKHBhcmVudENsYXp6TmFtZSk7Ci0gICAgICAgICAgICBpZiAocGFyZW50Q29tcG9uZW50ICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbW9kZWxJdGVtLnNldFBhcmVudENsYXNzTmFtZShwYXJlbnRDb21wb25lbnQuZ2V0Q2xhc3NOYW1lKCkpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcGFyZW50Q2xhenogPSBwYXJlbnRDbGF6ei5nZXRTdXBlckphdmFDbGFzcygpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBBbm5vdGF0aW9uIGdldEFubm90YXRpb24oQWJzdHJhY3RKYXZhRW50aXR5IGVudGl0eSwgU3RyaW5nIGFubm9OYW1lKQotICAgIHsKLSAgICAgICAgQW5ub3RhdGlvbltdIGFubm9zID0gZW50aXR5LmdldEFubm90YXRpb25zKCk7Ci0gICAgICAgIGlmIChhbm5vcyA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICAvLyBTdHJpbmcgd2FudGVkID0gQU5OT1RBVElPTl9CQVNFICsgIi4iICsgYW5ub05hbWU7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYW5ub3MubGVuZ3RoOyArK2kpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEFubm90YXRpb24gdGhpc0Fubm8gPSBhbm5vc1tpXTsKLSAgICAgICAgICAgIC8vIElkZWFsbHksIGhlcmUgd2Ugd291bGQgY2hlY2sgd2hldGhlciB0aGUgZnVsbHktcXVhbGlmaWVkIG5hbWUgb2YKLSAgICAgICAgICAgIC8vIHRoZSBhbm5vdGF0aW9uCi0gICAgICAgICAgICAvLyBjbGFzcyBtYXRjaGVzIEFOTk9UQVRJT05fQkFTRSArICIuIiArIGFubm9OYW1lLiBIb3dldmVyIGl0Ci0gICAgICAgICAgICAvLyBhcHBlYXJzIHRoYXQgcWRveCAxLjYuMwotICAgICAgICAgICAgLy8gZG9lcyBub3QgY29ycmVjdGx5IGV4cGFuZCBARm9vIHVzaW5nIHRoZSBjbGFzcyBpbXBvcnQgc3RhdGVtZW50czsKLSAgICAgICAgICAgIC8vIG1ldGhvZAotICAgICAgICAgICAgLy8gQW5ub3RhdGlvbi5nZXRUeXBlLmdldEphdmFDbGFzcy5nZXRGdWxseVF1YWxpZmllZE5hbWUgc3RpbGwganVzdAotICAgICAgICAgICAgLy8gcmV0dXJucyB0aGUgc2hvcnQKLSAgICAgICAgICAgIC8vIGNsYXNzIG5hbWUuIFNvIGZvciBub3csIGp1c3QgY2hlY2sgZm9yIHRoZSBzaG9ydCBuYW1lLgotICAgICAgICAgICAgU3RyaW5nIHRoaXNBbm5vTmFtZSA9IHRoaXNBbm5vLmdldFR5cGUoKS5nZXRKYXZhQ2xhc3MoKS5nZXROYW1lKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vTWFrZSBzaG9ydCBuYW1lIGZvciByZWNvZ25pemluZywgaWYgcmV0dXJucyBsb25nCi0gICAgICAgICAgICBpbnQgY29udGFpbnNQb2ludCA9IHRoaXNBbm5vTmFtZS5sYXN0SW5kZXhPZignLicpOwotICAgICAgICAgICAgaWYgKGNvbnRhaW5zUG9pbnQgIT0gLTEpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhpc0Fubm9OYW1lID0gdGhpc0Fubm9OYW1lLnN1YnN0cmluZyhjb250YWluc1BvaW50KzEpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHRoaXNBbm5vTmFtZS5lcXVhbHMoYW5ub05hbWUpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiB0aGlzQW5ubzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogU2FtZSBhcyBpbml0Q29tcG9uZW50QW5jZXN0cnkgYnV0IGZvciBjb252ZXJ0ZXJzCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGluaXRCZWhhdmlvckFuY2VzdHJ5KE1hcCBqYXZhQ2xhc3NCeU5hbWUsIE1vZGVsIG1vZGVsLCBDbGFzc01ldGEgbW9kZWxJdGVtKQotICAgIHsKLSAgICAgICAgSmF2YUNsYXNzIGNsYXp6ID0gKEphdmFDbGFzcykgamF2YUNsYXNzQnlOYW1lLmdldChtb2RlbEl0ZW0uZ2V0U291cmNlQ2xhc3NOYW1lKCkpOwotICAgICAgICBKYXZhQ2xhc3MgcGFyZW50Q2xhenogPSBjbGF6ei5nZXRTdXBlckphdmFDbGFzcygpOwotICAgICAgICB3aGlsZSAocGFyZW50Q2xhenogIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIHBhcmVudENsYXp6TmFtZSA9IHBhcmVudENsYXp6LmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBwYXJlbnRDbGF6ek5hbWUgPSBnZXRGdWxseVF1YWxpZmllZENsYXNzTmFtZShjbGF6eixwYXJlbnRDbGF6ek5hbWUpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBCZWhhdmlvck1ldGEgcGFyZW50Q29tcG9uZW50ID0gbW9kZWwKLSAgICAgICAgICAgICAgICAgICAgLmZpbmRCZWhhdmlvckJ5Q2xhc3NOYW1lKHBhcmVudENsYXp6TmFtZSk7Ci0gICAgICAgICAgICBpZiAocGFyZW50Q29tcG9uZW50ICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbW9kZWxJdGVtLnNldFBhcmVudENsYXNzTmFtZShwYXJlbnRDb21wb25lbnQuZ2V0Q2xhc3NOYW1lKCkpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcGFyZW50Q2xhenogPSBwYXJlbnRDbGF6ei5nZXRTdXBlckphdmFDbGFzcygpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBpbml0RmFjZWxldFRhZ0hhbmRsZXJBbmNlc3RyeShNYXAgamF2YUNsYXNzQnlOYW1lLCBNb2RlbCBtb2RlbCwgQ2xhc3NNZXRhIG1vZGVsSXRlbSkKLSAgICB7Ci0gICAgICAgIEphdmFDbGFzcyBjbGF6eiA9IChKYXZhQ2xhc3MpIGphdmFDbGFzc0J5TmFtZS5nZXQobW9kZWxJdGVtLmdldFNvdXJjZUNsYXNzTmFtZSgpKTsKLSAgICAgICAgSmF2YUNsYXNzIHBhcmVudENsYXp6ID0gY2xhenouZ2V0U3VwZXJKYXZhQ2xhc3MoKTsKLSAgICAgICAgd2hpbGUgKHBhcmVudENsYXp6ICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyBwYXJlbnRDbGF6ek5hbWUgPSBwYXJlbnRDbGF6ei5nZXRGdWxseVF1YWxpZmllZE5hbWUoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgcGFyZW50Q2xhenpOYW1lID0gZ2V0RnVsbHlRdWFsaWZpZWRDbGFzc05hbWUoY2xhenoscGFyZW50Q2xhenpOYW1lKTsKLQotICAgICAgICAgICAgRmFjZWxldFRhZ01ldGEgcGFyZW50Q29tcG9uZW50ID0gbW9kZWwKLSAgICAgICAgICAgICAgICAgICAgLmZpbmRGYWNlbGV0VGFnQnlDbGFzc05hbWUocGFyZW50Q2xhenpOYW1lKTsKLSAgICAgICAgICAgIGlmIChwYXJlbnRDb21wb25lbnQgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBtb2RlbEl0ZW0uc2V0UGFyZW50Q2xhc3NOYW1lKHBhcmVudENvbXBvbmVudC5nZXRDbGFzc05hbWUoKSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwYXJlbnRDbGF6eiA9IHBhcmVudENsYXp6LmdldFN1cGVySmF2YUNsYXNzKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZXZhbHVhdGVQYXJhbWV0ZXJJbml0aWFsaXphdGlvbkV4cHJlc3Npb24oU3RyaW5nIHZhbHVlKQotICAgIHsKLSAgICAgICAgaWYgKHZhbHVlLmNoYXJBdCgwKSA9PSAnIicgJiYgdmFsdWUuY2hhckF0KHZhbHVlLmxlbmd0aCgpLTEpID09ICciJyAmJiB2YWx1ZS5pbmRleE9mKCcrJykgPT0gLTEpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiB2YWx1ZS5zdWJzdHJpbmcoMSx2YWx1ZS5sZW5ndGgoKS0xKTsKLSAgICAgICAgfSAgICAgICAgICAgIAotICAgICAgICByZXR1cm4gdmFsdWU7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhZGRGaWxlVG9KYXZhRG9jQnVpbGRlcihKYXZhRG9jQnVpbGRlciBidWlsZGVyLAotICAgICAgICAgICAgRmlsZVNlbGVjdG9yIHNlbGVjdG9yLCBGaWxlIHBhdGgpCi0gICAgewotICAgICAgICBhZGRGaWxlVG9KYXZhRG9jQnVpbGRlcihidWlsZGVyLHNlbGVjdG9yLCBwYXRoLCBwYXRoLmdldFBhdGgoKSk7Ci0gICAgfQotICAgIAotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhZGRGaWxlVG9KYXZhRG9jQnVpbGRlcihKYXZhRG9jQnVpbGRlciBidWlsZGVyLAotICAgICAgICAgICAgRmlsZVNlbGVjdG9yIHNlbGVjdG9yLCBGaWxlIHBhdGgsIFN0cmluZyBiYXNlUGF0aCkKLSAgICB7Ci0gICAgICAgIGlmIChwYXRoLmlzRGlyZWN0b3J5KCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEZpbGVbXSBmaWxlcyA9IHBhdGgubGlzdEZpbGVzKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vU2NhbiBhbGwgZmlsZXMgaW4gZGlyZWN0b3J5Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFkZEZpbGVUb0phdmFEb2NCdWlsZGVyKGJ1aWxkZXIsIHNlbGVjdG9yLCBmaWxlc1tpXSwgYmFzZVBhdGgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgRmlsZSBmaWxlID0gcGF0aDsKLQotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBmaWxlLmdldFBhdGgoKTsKLSAgICAgICAgICAgICAgICB3aGlsZSAobmFtZS5zdGFydHNXaXRoKCIvIikpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBuYW1lID0gbmFtZS5zdWJzdHJpbmcoMSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHdoaWxlIChuYW1lLnN0YXJ0c1dpdGgoIlxcIikpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBuYW1lID0gbmFtZS5zdWJzdHJpbmcoMSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIFNvdXJjZUZpbGVJbmZvIGZpbGVJbmZvID0gbmV3IFNvdXJjZUZpbGVJbmZvKGZpbGUsbmFtZSk7Ci0gICAgICAgICAgICAgICAgaWYgKHNlbGVjdG9yLmlzU2VsZWN0ZWQoZmlsZUluZm8pKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oImZpbGU6IituYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hZGRTb3VyY2UoZmlsZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhRZG94SGVscGVyLmNsYXNzKTsKLSAgICAgICAgICAgICAgICBsb2cuZXJyb3IoIkVycm9yIHJlYWRpbmcgZmlsZTogIitmaWxlLmdldE5hbWUoKSsiICIrZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKFFkb3hIZWxwZXIuY2xhc3MpOwotICAgICAgICAgICAgICAgIGxvZy5lcnJvcigiRXJyb3IgcmVhZGluZyBmaWxlOiAiK2ZpbGUuZ2V0TmFtZSgpKyIgIitlLmdldE1lc3NhZ2UoKSk7ICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFJlbW92ZSBhbGwgbGVhZGluZyB3aGl0ZXNwYWNlIGFuZCBhIHF1b3RlbWFyayBpZiBpdCBleGlzdHMuCi0gICAgICogPHA+Ci0gICAgICogUWRveCBjb21tZW50cyBsaWtlIDxjb2RlPmZvbyB2YWw9ICJiYXIiPC9jb2RlPiByZXR1cm4gYSB2YWx1ZSB3aXRoCi0gICAgICogbGVhZGluZyB3aGl0ZXNwYWNlIGFuZCBxdW90ZXMsIHNvIHJlbW92ZSB0aGVtLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGNsZWFuKE9iamVjdCBzcmNPYmopCi0gICAgewotICAgICAgICBpZiAoc3JjT2JqID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIHNyYyA9IHNyY09iai50b1N0cmluZygpOwotICAgICAgICBpbnQgc3RhcnQgPSAwOwotICAgICAgICBpbnQgZW5kID0gc3JjLmxlbmd0aCgpOwotICAgICAgICAKLSAgICAgICAgaWYgKGVuZCA9PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gc3JjOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZiAoc3JjLmVxdWFscygiXCJcIiIpKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gIlwiXCIiOwotICAgICAgICB9Ci0KLSAgICAgICAgd2hpbGUgKHN0YXJ0IDw9IGVuZCkKLSAgICAgICAgewotICAgICAgICAgICAgY2hhciBjID0gc3JjLmNoYXJBdChzdGFydCk7Ci0gICAgICAgICAgICBpZiAoIUNoYXJhY3Rlci5pc1doaXRlc3BhY2UoYykgJiYgKGMgIT0gJyInKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgICsrc3RhcnQ7Ci0gICAgICAgIH0KLSAgICAgICAgd2hpbGUgKGVuZCA+PSBzdGFydCkKLSAgICAgICAgewotICAgICAgICAgICAgY2hhciBjID0gc3JjLmNoYXJBdChlbmQgLSAxKTsKLSAgICAgICAgICAgIGlmICghQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZShjKSAmJiAoYyAhPSAnIicpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLS1lbmQ7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHNyYy5zdWJzdHJpbmcoc3RhcnQsIGVuZCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBuYW1lZCBhdHRyaWJ1dGUgZnJvbSBhIGRvYy1hbm5vdGF0aW9uLgotICAgICAqIAotICAgICAqIFBhcmFtIGNsYXp6IGlzIHRoZSBjbGFzcyB0aGUgYW5ub3RhdGlvbiBpcyBhdHRhY2hlZCB0bzsgb25seSB1c2VkIHdoZW4KLSAgICAgKiByZXBvcnRpbmcgZXJyb3JzLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFN0cmluZyhKYXZhQ2xhc3MgY2xhenosIFN0cmluZyBrZXksIE1hcCBtYXAsIFN0cmluZyBkZmx0KQotICAgIHsKLSAgICAgICAgU3RyaW5nIHZhbCA9IGNsZWFuKG1hcC5nZXQoa2V5KSk7Ci0gICAgICAgIGlmICh2YWwgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHZhbDsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBkZmx0OwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBuYW1lZCBhdHRyaWJ1dGUgZnJvbSBhIGRvYy1hbm5vdGF0aW9uIGFuZCBjb252ZXJ0IHRvIGEgYm9vbGVhbi4KLSAgICAgKiAKLSAgICAgKiBQYXJhbSBjbGF6eiBpcyB0aGUgY2xhc3MgdGhlIGFubm90YXRpb24gaXMgYXR0YWNoZWQgdG87IG9ubHkgdXNlZCB3aGVuCi0gICAgICogcmVwb3J0aW5nIGVycm9ycy4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIEJvb2xlYW4gZ2V0Qm9vbGVhbihKYXZhQ2xhc3MgY2xhenosIFN0cmluZyBrZXksIE1hcCBtYXAsCi0gICAgICAgICAgICBCb29sZWFuIGRmbHQpCi0gICAgewotICAgICAgICBTdHJpbmcgdmFsID0gY2xlYW4obWFwLmdldChrZXkpKTsKLSAgICAgICAgaWYgKHZhbCA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gZGZsdDsKLSAgICAgICAgfQotICAgICAgICAvLyBUT0RPOiByZXBvcnQgcHJvYmxlbSBpZiB0aGUgdmFsdWUgZG9lcyBub3QgbG9vayBsaWtlICJ0cnVlIiBvcgotICAgICAgICAvLyAiZmFsc2UiLAotICAgICAgICAvLyByYXRoZXIgdGhhbiBzaWxlbnRseSBjb252ZXJ0aW5nIGl0IHRvIGZhbHNlLgotICAgICAgICByZXR1cm4gQm9vbGVhbi52YWx1ZU9mKHZhbCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSB0YWdDbGFzc05hbWUgaXMgbm90IG51bGwsIGJ1dCB0aGUgY29ycmVzcG9uZGluZwotICAgICAqIHNvdXJjZSBmaWxlIGNhbm5vdCBiZSBmb3VuZCBpbiB0aGUgc3BlY2lmaWVkIHNvdXJjZSBkaXJzLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1RhZ0NsYXNzTWlzc2luZyhTdHJpbmcgdGFnQ2xhc3NOYW1lLCBMaXN0IHNvdXJjZURpcnMpCi0gICAgewotICAgICAgICBpZiAodGFnQ2xhc3NOYW1lID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBTdHJpbmcgdGFnQ2xhc3NGaWxlID0gU3RyaW5nVXRpbHMucmVwbGFjZSh0YWdDbGFzc05hbWUsIi4iLCIvIikrIi5qYXZhIjsKLSAgICAgICAgcmV0dXJuICFJT1V0aWxzLmV4aXN0c1NvdXJjZUZpbGUodGFnQ2xhc3NGaWxlLCBzb3VyY2VEaXJzKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgU291cmNlRmlsZUluZm8gaW1wbGVtZW50cyBGaWxlSW5mbwotICAgIHsKLSAgICAgICAgcHJpdmF0ZSBGaWxlIGZpbGU7Ci0gICAgICAgIAotICAgICAgICBwcml2YXRlIFN0cmluZyBuYW1lOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIFNvdXJjZUZpbGVJbmZvKCBGaWxlIGZpbGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzKCBmaWxlLCBmaWxlLmdldFBhdGgoKS5yZXBsYWNlKCAnXFwnLCAnLycgKSApOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgU291cmNlRmlsZUluZm8oIEZpbGUgZmlsZSwgU3RyaW5nIG5hbWUgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLmZpbGUgPSBmaWxlOwotICAgICAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFNldHMgdGhlIHJlc291cmNlcyBmaWxlLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgc2V0RmlsZSggRmlsZSBmaWxlICkKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5maWxlID0gZmlsZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBSZXR1cm5zIHRoZSByZXNvdXJjZXMgZmlsZS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBGaWxlIGdldEZpbGUoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gZmlsZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTZXRzIHRoZSByZXNvdXJjZXMgbmFtZS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoIFN0cmluZyBuYW1lICkKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBuYW1lOwotICAgICAgICB9ICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBJbnB1dFN0cmVhbSBnZXRDb250ZW50cygpIHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IEZpbGVJbnB1dFN0cmVhbSggZ2V0RmlsZSgpICk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0RpcmVjdG9yeSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBmaWxlLmlzRGlyZWN0b3J5KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0ZpbGUoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gZmlsZS5pc0ZpbGUoKTsKLSAgICAgICAgfSAgICAgICAgCi0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgSmF2YUNsYXNzW10gZ2V0U291cmNlQ2xhc3NlcyhMaXN0IHNvdXJjZURpcnMsIFN0cmluZyBpbmNsdWRlcywgU3RyaW5nIGV4Y2x1ZGVzKQotICAgIHsKLSAgICAgICAgaWYgKFN0cmluZ1V0aWxzLmlzTm90RW1wdHkoaW5jbHVkZXMpIHx8IAotICAgICAgICAgICAgICAgIFN0cmluZ1V0aWxzLmlzTm90RW1wdHkoZXhjbHVkZXMpKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0SW5uZXJTb3VyY2VDbGFzc2VzKHNvdXJjZURpcnMsIGluY2x1ZGVzLCBleGNsdWRlcyk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0SW5uZXJTb3VyY2VDbGFzc2VzKHNvdXJjZURpcnMpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIEphdmFDbGFzc1tdIGdldElubmVyU291cmNlQ2xhc3NlcyhMaXN0IHNvdXJjZURpcnMsIFN0cmluZyBpbmNsdWRlcywgU3RyaW5nIGV4Y2x1ZGVzKQotICAgIHsKLSAgICAgICAgSmF2YURvY0J1aWxkZXIgYnVpbGRlciA9IG5ldyBKYXZhRG9jQnVpbGRlcigpOwotICAgICAgICBJbmNsdWRlRXhjbHVkZUZpbGVTZWxlY3RvciBzZWxlY3RvciA9IAotICAgICAgICAgICAgbmV3IEluY2x1ZGVFeGNsdWRlRmlsZVNlbGVjdG9yKCk7IAotICAgICAgICBpZiAoU3RyaW5nVXRpbHMuaXNOb3RFbXB0eShleGNsdWRlcykpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHNlbGVjdG9yLnNldEV4Y2x1ZGVzKGV4Y2x1ZGVzLnNwbGl0KCIsIikpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChTdHJpbmdVdGlscy5pc05vdEVtcHR5KGluY2x1ZGVzKSkKLSAgICAgICAgewotICAgICAgICAgICAgc2VsZWN0b3Iuc2V0SW5jbHVkZXMoaW5jbHVkZXMuc3BsaXQoIiwiKSk7ICAgICAgICAgICAgCi0gICAgICAgIH0KLSAgICAgICAgZm9yIChJdGVyYXRvciBpID0gc291cmNlRGlycy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgICAgIHsKLSAgICAgICAgICAgIE9iamVjdCBkaXIgPSBpLm5leHQoKTsKLSAgICAgICAgICAgIEZpbGUgc3JjRGlyID0gbnVsbDsKLSAgICAgICAgICAgIGlmIChkaXIgaW5zdGFuY2VvZiBGaWxlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHNyY0RpciA9IChGaWxlKSBkaXI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlICAgICAgICAgCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbmV3IEZpbGUoKFN0cmluZykgaS5uZXh0KCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy9TY2FuIGFsbCBmaWxlcyBvbiBkaXJlY3RvcnkgYW5kIGFkZCB0byBidWlsZGVyCi0gICAgICAgICAgICBRZG94SGVscGVyLmFkZEZpbGVUb0phdmFEb2NCdWlsZGVyKGJ1aWxkZXIsIHNlbGVjdG9yLCBzcmNEaXIpOwotICAgICAgICB9ICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIHJldHVybiBidWlsZGVyLmdldENsYXNzZXMoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBKYXZhQ2xhc3NbXSBnZXRJbm5lclNvdXJjZUNsYXNzZXMoTGlzdCBzb3VyY2VEaXJzKQotICAgIHsKLSAgICAgICAgSmF2YURvY0J1aWxkZXIgYnVpbGRlciA9IG5ldyBKYXZhRG9jQnVpbGRlcigpOwotICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBzb3VyY2VEaXJzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIHNyY0RpciA9IChTdHJpbmcpIGkubmV4dCgpOwotICAgICAgICAgICAgYnVpbGRlci5hZGRTb3VyY2VUcmVlKG5ldyBGaWxlKHNyY0RpcikpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBidWlsZGVyLmdldENsYXNzZXMoKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBKYXZhQ2xhc3NDb21wYXJhdG9yIGltcGxlbWVudHMgQ29tcGFyYXRvcgotICAgIHsKLSAgICAgICAgcHVibGljIGludCBjb21wYXJlKE9iamVjdCBhcmcwLCBPYmplY3QgYXJnMSkKLSAgICAgICAgewotICAgICAgICAgICAgSmF2YUNsYXNzIGMwID0gKEphdmFDbGFzcykgYXJnMDsKLSAgICAgICAgICAgIEphdmFDbGFzcyBjMSA9IChKYXZhQ2xhc3MpIGFyZzE7Ci0gICAgICAgICAgICByZXR1cm4gKGMwLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpLmNvbXBhcmVUbyhjMS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKSkpOwotICAgICAgICB9Ci0gICAgfQotCi0KLQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9xZG94L1Fkb3hNb2RlbEJ1aWxkZXIuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvcWRveC9RZG94TW9kZWxCdWlsZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhOWJmMmIuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9xZG94L1Fkb3hNb2RlbEJ1aWxkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2MiArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uYnVpbGRlci5xZG94OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nLlN0cmluZ1V0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLk1vam9FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5idWlsZGVyLklPVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5idWlsZGVyLk1vZGVsQnVpbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmJ1aWxkZXIuTW9kZWxQYXJhbXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5idWlsZGVyLm1vZGVsLkJlaGF2aW9yTWV0YTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmJ1aWxkZXIubW9kZWwuQ29tcG9uZW50TWV0YTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmJ1aWxkZXIubW9kZWwuQ29udmVydGVyTWV0YTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmJ1aWxkZXIubW9kZWwuRmFjZWxldFRhZ01ldGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5idWlsZGVyLm1vZGVsLk1vZGVsOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uYnVpbGRlci5tb2RlbC5UYWdNZXRhOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uYnVpbGRlci5tb2RlbC5WYWxpZGF0b3JNZXRhOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uYnVpbGRlci5xZG94LnBhcnNlLkJlaGF2aW9yUGFyc2luZ1N0cmF0ZWd5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uYnVpbGRlci5xZG94LnBhcnNlLkNsaWVudEJlaGF2aW9yUGFyc2luZ1N0cmF0ZWd5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uYnVpbGRlci5xZG94LnBhcnNlLkNsaWVudEJlaGF2aW9yUmVuZGVyZXJQYXJzaW5nU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5idWlsZGVyLnFkb3gucGFyc2UuQ29tcG9uZW50UGFyc2luZ1N0cmF0ZWd5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uYnVpbGRlci5xZG94LnBhcnNlLkNvbnZlcnRlclBhcnNpbmdTdHJhdGVneTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmJ1aWxkZXIucWRveC5wYXJzZS5GYWNlbGV0VGFnUGFyc2luZ1N0cmF0ZWd5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uYnVpbGRlci5xZG94LnBhcnNlLkpzcFRhZ1BhcnNpbmdTdHJhdGVneTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmJ1aWxkZXIucWRveC5wYXJzZS5SZW5kZXJLaXRQYXJzaW5nU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5idWlsZGVyLnFkb3gucGFyc2UuUmVuZGVyZXJQYXJzaW5nU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5idWlsZGVyLnFkb3gucGFyc2UuVmFsaWRhdG9yUGFyc2luZ1N0cmF0ZWd5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uYnVpbGRlci5xZG94LnBhcnNlLldlYkNvbmZpZ1BhcmFtUGFyc2luZ1N0cmF0ZWd5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uYnVpbGRlci50cmluaWRhZC5UcmluaWRhZE1hdmVuRmFjZXNQbHVnaW5Nb2RlbEJ1aWxkZXI7Ci0KLWltcG9ydCBjb20udGhvdWdodHdvcmtzLnFkb3gubW9kZWwuSmF2YUNsYXNzOwotCi0vKioKLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBNb2RlbEJ1aWxkZXIgaW50ZXJmYWNlIHRoYXQgdXNlcyB0aGUgUWRveCBqYXZhCi0gKiBzb3VyY2UtcGFyc2luZyBsaWJyYXJ5IHRvIHNjYW4gYSBsaXN0IG9mIHNwZWNpZmllZCBzb3VyY2UgZGlyZWN0b3JpZXMgZm9yCi0gKiBqYXZhIGZpbGVzLgotICogPHA+Ci0gKiBUaGUgamF2YSBzb3VyY2UgZmlsZXMgZm91bmQgY2FuIHVzZSBlaXRoZXIgamF2YTE1IGFubm90YXRpb25zIG9yIGRvY2xldAotICogYW5ub3RhdGlvbnMgdG8gaW5kaWNhdGUgd2hhdCBkYXRhIHNob3VsZCBiZSBhZGRlZCB0byB0aGUgTW9kZWwuCi0gKi8KLXB1YmxpYyBjbGFzcyBRZG94TW9kZWxCdWlsZGVyIGltcGxlbWVudHMgTW9kZWxCdWlsZGVyCi17Ci0gICAgcHJpdmF0ZSBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coUWRveE1vZGVsQnVpbGRlci5jbGFzcyk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogU2NhbiB0aGUgc291cmNlIHRyZWUgZm9yIGRvYy1hbm5vdGF0aW9ucywgYW5kIGJ1aWxkIE1vZGVsIG9iamVjdHMKLSAgICAgKiBjb250YWluaW5nIGluZm8gZXh0cmFjdGVkIGZyb20gdGhlIGRvYy1hbm5vdGF0aW9uIGF0dHJpYnV0ZXMgYW5kCi0gICAgICogaW50cm9zcGVjdGVkIGluZm8gYWJvdXQgdGhlIGl0ZW0gdGhlIGFubm90YXRpb24gaXMgYXR0YWNoZWQgdG8uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYnVpbGRNb2RlbChNb2RlbCBtb2RlbCwgTW9kZWxQYXJhbXMgcGFyYW1ldGVycykKLSAgICAgICAgICAgIHRocm93cyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uCi0gICAgewotICAgICAgICBTdHJpbmcgY3Vyck1vZGVsSWQgPSBtb2RlbC5nZXRNb2RlbElkKCk7Ci0gICAgICAgIGlmIChjdXJyTW9kZWxJZCA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbigiTW9kZWwgbXVzdCBoYXZlIGlkIHNldCIpOwotICAgICAgICB9Ci0gICAgICAgIEphdmFDbGFzc1tdIGNsYXNzZXMgPSBRZG94SGVscGVyLmdldFNvdXJjZUNsYXNzZXMocGFyYW1ldGVycy5nZXRTb3VyY2VEaXJzKCksIAotICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMuZ2V0SW5jbHVkZXMoKSwgcGFyYW1ldGVycy5nZXRFeGNsdWRlcygpKTsKLSAgICAgICAgYnVpbGRNb2RlbChtb2RlbCwgcGFyYW1ldGVycy5nZXRTb3VyY2VEaXJzKCksIGNsYXNzZXMpOwotICAgICAgICBDb21wb3NpdGVDb21wb25lbnRNb2RlbEJ1aWxkZXIgcWNjbWIgPSBuZXcgQ29tcG9zaXRlQ29tcG9uZW50TW9kZWxCdWlsZGVyKCk7Ci0gICAgICAgIHFjY21iLmJ1aWxkTW9kZWwobW9kZWwsIHBhcmFtZXRlcnMpOwotICAgICAgICBUcmluaWRhZE1hdmVuRmFjZXNQbHVnaW5Nb2RlbEJ1aWxkZXIgdG1mcG1iID0gbmV3IFRyaW5pZGFkTWF2ZW5GYWNlc1BsdWdpbk1vZGVsQnVpbGRlcigpOwotICAgICAgICB0bWZwbWIuYnVpbGRNb2RlbChtb2RlbCwgcGFyYW1ldGVycyk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgYnVpbGRNb2RlbChNb2RlbCBtb2RlbCwgTGlzdCBzb3VyY2VEaXJzLCBKYXZhQ2xhc3NbXSBjbGFzc2VzKQotICAgICAgICB0aHJvd3MgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgU3RyaW5nIGN1cnJNb2RlbElkID0gbW9kZWwuZ2V0TW9kZWxJZCgpOwotICAgICAgICAvLyBTb3J0IHRoZSBjbGFzcyBhcnJheSBzbyB0aGF0IHRoZXkgYXJlIHByb2Nlc3NlZCBpbiBhCi0gICAgICAgIC8vIHByZWRpY3RhYmxlIG9yZGVyLCByZWdhcmRsZXNzIG9mIGhvdyB0aGUgc291cmNlIHNjYW5uaW5nCi0gICAgICAgIC8vIHJldHVybmVkIHRoZW0uCi0gICAgICAgIEFycmF5cy5zb3J0KGNsYXNzZXMsIG5ldyBRZG94SGVscGVyLkphdmFDbGFzc0NvbXBhcmF0b3IoKSk7Ci0gICAgICAgIE1hcCBwcm9jZXNzZWRDbGFzc2VzID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjbGFzc2VzLmxlbmd0aDsgKytpKQotICAgICAgICB7Ci0gICAgICAgICAgICBKYXZhQ2xhc3MgY2xhenogPSBjbGFzc2VzW2ldOwotICAgICAgICAgICAgcHJvY2Vzc0NsYXNzKHByb2Nlc3NlZENsYXNzZXMsIGNsYXp6LCBtb2RlbCk7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gUG9zdC1wcm9jZXNzIHRoZSBsaXN0IG9mIGNvbXBvbmVudHMgd2hpY2ggd2UgYWRkZWQgaW4gdGhpcyBydW4uCi0gICAgICAgIC8vIE5vdGUgdGhhdCBtb2RlbCBoYXMgYWxsIHRoZSBpbmhlcml0ZWQgY29tcG9uZW50cyBpbiBpdCB0b28sIHNvCi0gICAgICAgIC8vIHdlIG5lZWQgdG8gc2tpcCB0aGVtLgotICAgICAgICAvLwotICAgICAgICAvLyBIbW0uLmFzIG5vdGVkIGVsc2V3aGVyZSwgSmF2YUNsYXNzIG9iamVjdHMgcmVwcmVzZW50aW5nIHBhcmVudAotICAgICAgICAvLyBjbGFzc2VzIGFyZSBhY2Nlc3NhYmxlIHZpYSBnZXRQYXJlbnRDbGF6eigpLiBQcmVzdW1hYmx5IHRoZXkgYXJlCi0gICAgICAgIC8vIG5vdCBpbiB0aGUgYXJyYXkgcmV0dXJuZWQgYnkgYnVpbGRlci5nZXRDbGFzc2VzKCkgdGhvdWdoLi4KLSAgICAgICAgZm9yIChJdGVyYXRvciBpdCA9IG1vZGVsLmdldENvbXBvbmVudHMoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KQotICAgICAgICB7Ci0gICAgICAgICAgICBDb21wb25lbnRNZXRhIGNvbXBvbmVudCA9IChDb21wb25lbnRNZXRhKSBpdC5uZXh0KCk7Ci0gICAgICAgICAgICBpZiAoIWNvbXBvbmVudC5nZXRNb2RlbElkKCkuZXF1YWxzKGN1cnJNb2RlbElkKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFFkb3hIZWxwZXIuaW5pdENvbXBvbmVudEFuY2VzdHJ5KHByb2Nlc3NlZENsYXNzZXMsIG1vZGVsLCBjb21wb25lbnQpOwotCi0gICAgICAgICAgICAvL0NoZWNrIGlmIHRoZSBjb21wb25lbnQgY2xhc3MgamF2YSBmaWxlIGV4aXN0cyBpbiB0aGUgc291cmNlIGRpcnMKLSAgICAgICAgICAgIFN0cmluZyBjbGFzc25hbWUgPSBjb21wb25lbnQuZ2V0Q2xhc3NOYW1lKCk7Ci0gICAgICAgICAgICBTdHJpbmcgY2xhc3NmaWxlID0gU3RyaW5nVXRpbHMucmVwbGFjZShjbGFzc25hbWUsIi4iLCIvIikrIi5qYXZhIjsKLSAgICAgICAgICAgIGlmICghSU9VdGlscy5leGlzdHNTb3VyY2VGaWxlKGNsYXNzZmlsZSwgc291cmNlRGlycykpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY29tcG9uZW50LnNldEdlbmVyYXRlZENvbXBvbmVudENsYXNzKEJvb2xlYW4uVFJVRSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSB0YWcgY2xhc3MgamF2YSBmaWxlIGV4aXN0cyBpbiB0aGUgc291cmNlIGRpcnMKLSAgICAgICAgICAgIGlmIChRZG94SGVscGVyLmlzVGFnQ2xhc3NNaXNzaW5nKGNvbXBvbmVudC5nZXRUYWdDbGFzcygpLCBzb3VyY2VEaXJzKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjb21wb25lbnQuc2V0R2VuZXJhdGVkVGFnQ2xhc3MoQm9vbGVhbi5UUlVFKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIHBvc3QtcHJvY2VzcyB0aGUgbGlzdCBvZiBjb252ZXJ0ZXJzCi0gICAgICAgIGZvciAoSXRlcmF0b3IgaXQgPSBtb2RlbC5nZXRDb252ZXJ0ZXJzKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykKLSAgICAgICAgewotICAgICAgICAgICAgQ29udmVydGVyTWV0YSBjb252ZXJ0ZXIgPSAoQ29udmVydGVyTWV0YSkgaXQubmV4dCgpOwotICAgICAgICAgICAgaWYgKCFjb252ZXJ0ZXIuZ2V0TW9kZWxJZCgpLmVxdWFscyhjdXJyTW9kZWxJZCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBRZG94SGVscGVyLmluaXRDb252ZXJ0ZXJBbmNlc3RyeShwcm9jZXNzZWRDbGFzc2VzLCBtb2RlbCwgY29udmVydGVyKTsKLQotICAgICAgICAgICAgLy9DaGVjayBpZiB0aGUgY29udmVydGVyIGNsYXNzIGZpbGUgZXhpc3RzCi0gICAgICAgICAgICBpZiAoIUlPVXRpbHMuZXhpc3RzU291cmNlRmlsZShTdHJpbmdVdGlscy5yZXBsYWNlKAotICAgICAgICAgICAgICAgICAgICBjb252ZXJ0ZXIuZ2V0Q2xhc3NOYW1lKCksIi4iLCIvIikrIi5qYXZhIiwgc291cmNlRGlycykpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY29udmVydGVyLnNldEdlbmVyYXRlZENvbXBvbmVudENsYXNzKEJvb2xlYW4uVFJVRSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSB0YWcgY2xhc3MgamF2YSBmaWxlIGV4aXN0cyBpbiB0aGUgc291cmNlIGRpcnMKLSAgICAgICAgICAgIGlmIChRZG94SGVscGVyLmlzVGFnQ2xhc3NNaXNzaW5nKGNvbnZlcnRlci5nZXRUYWdDbGFzcygpLCBzb3VyY2VEaXJzKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjb252ZXJ0ZXIuc2V0R2VuZXJhdGVkVGFnQ2xhc3MoQm9vbGVhbi5UUlVFKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIHBvc3QtcHJvY2VzcyB0aGUgbGlzdCBvZiB2YWxpZGF0b3JzCi0gICAgICAgIGZvciAoSXRlcmF0b3IgaXQgPSBtb2RlbC5nZXRWYWxpZGF0b3JzKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykKLSAgICAgICAgewotICAgICAgICAgICAgVmFsaWRhdG9yTWV0YSB2YWxpZGF0b3IgPSAoVmFsaWRhdG9yTWV0YSkgaXQubmV4dCgpOwotICAgICAgICAgICAgaWYgKCF2YWxpZGF0b3IuZ2V0TW9kZWxJZCgpLmVxdWFscyhjdXJyTW9kZWxJZCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBRZG94SGVscGVyLmluaXRWYWxpZGF0b3JBbmNlc3RyeShwcm9jZXNzZWRDbGFzc2VzLCBtb2RlbCwgdmFsaWRhdG9yKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy9DaGVjayBpZiB0aGUgdmFsaWRhdG9yIGNsYXNzIGZpbGUgZXhpc3RzCi0gICAgICAgICAgICBpZiAoIUlPVXRpbHMuZXhpc3RzU291cmNlRmlsZShTdHJpbmdVdGlscy5yZXBsYWNlKAotICAgICAgICAgICAgICAgICAgICB2YWxpZGF0b3IuZ2V0Q2xhc3NOYW1lKCksIi4iLCIvIikrIi5qYXZhIiwgc291cmNlRGlycykpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmFsaWRhdG9yLnNldEdlbmVyYXRlZENvbXBvbmVudENsYXNzKEJvb2xlYW4uVFJVRSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSB0YWcgY2xhc3MgamF2YSBmaWxlIGV4aXN0cyBpbiB0aGUgc291cmNlIGRpcnMKLSAgICAgICAgICAgIGlmIChRZG94SGVscGVyLmlzVGFnQ2xhc3NNaXNzaW5nKHZhbGlkYXRvci5nZXRUYWdDbGFzcygpLCBzb3VyY2VEaXJzKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB2YWxpZGF0b3Iuc2V0R2VuZXJhdGVkVGFnQ2xhc3MoQm9vbGVhbi5UUlVFKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIHBvc3QtcHJvY2VzcyB0aGUgbGlzdCBvZiBiZWhhdmlvcnMKLSAgICAgICAgZm9yIChJdGVyYXRvciBpdCA9IG1vZGVsLmdldEJlaGF2aW9ycygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspCi0gICAgICAgIHsKLSAgICAgICAgICAgIEJlaGF2aW9yTWV0YSBiZWhhdmlvciA9IChCZWhhdmlvck1ldGEpIGl0Lm5leHQoKTsKLSAgICAgICAgICAgIGlmICghYmVoYXZpb3IuZ2V0TW9kZWxJZCgpLmVxdWFscyhjdXJyTW9kZWxJZCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBRZG94SGVscGVyLmluaXRCZWhhdmlvckFuY2VzdHJ5KHByb2Nlc3NlZENsYXNzZXMsIG1vZGVsLCBiZWhhdmlvcik7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vQ2hlY2sgaWYgdGhlIGJlaGF2aW9yIGNsYXNzIGZpbGUgZXhpc3RzCi0gICAgICAgICAgICBpZiAoIUlPVXRpbHMuZXhpc3RzU291cmNlRmlsZShTdHJpbmdVdGlscy5yZXBsYWNlKAotICAgICAgICAgICAgICAgICAgICBiZWhhdmlvci5nZXRDbGFzc05hbWUoKSwiLiIsIi8iKSsiLmphdmEiLCBzb3VyY2VEaXJzKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBiZWhhdmlvci5zZXRHZW5lcmF0ZWRDb21wb25lbnRDbGFzcyhCb29sZWFuLlRSVUUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gcG9zdC1wcm9jZXNzIHRoZSBsaXN0IG9mIHRhZ3MKLSAgICAgICAgZm9yIChJdGVyYXRvciBpdCA9IG1vZGVsLmdldFRhZ3MoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KQotICAgICAgICB7Ci0gICAgICAgICAgICBUYWdNZXRhIHRhZyA9IChUYWdNZXRhKSBpdC5uZXh0KCk7Ci0gICAgICAgICAgICAvLyBub3RoaW5nIHRvIGRvIGF0IHRoZSBtb21lbnQgCi0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGZvciAoSXRlcmF0b3IgaXQgPSBtb2RlbC5nZXRGYWNlbGV0VGFncygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspCi0gICAgICAgIHsKLSAgICAgICAgICAgIEZhY2VsZXRUYWdNZXRhIHRhZyA9IChGYWNlbGV0VGFnTWV0YSkgaXQubmV4dCgpOwotICAgICAgICAgICAgaWYgKCF0YWcuZ2V0TW9kZWxJZCgpLmVxdWFscyhjdXJyTW9kZWxJZCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBRZG94SGVscGVyLmluaXRGYWNlbGV0VGFnSGFuZGxlckFuY2VzdHJ5KHByb2Nlc3NlZENsYXNzZXMsIG1vZGVsLCB0YWcpOyAgICAgICAgICAgIAotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBwYXJlbnRDbGFzc05hbWUgYW5kIGludGVyZmFjZUNsYXNzTmFtZXMgcHJvcGVydGllcyBvZiB0aGUKLSAgICAgKiBwcm92aWRlZCBtb2RlbEl0ZW0gb2JqZWN0LgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzQ2xhc3MoTWFwIHByb2Nlc3NlZENsYXNzZXMsIEphdmFDbGFzcyBjbGF6eiwgTW9kZWwgbW9kZWwpIHRocm93cyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uCi0gICAgewotICAgICAgICBpZiAocHJvY2Vzc2VkQ2xhc3Nlcy5jb250YWluc0tleShjbGF6ei5nZXRGdWxseVF1YWxpZmllZE5hbWUoKSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICAvLyBmaXJzdCwgY2hlY2sgdGhhdCB0aGUgcGFyZW50IHR5cGUgYW5kIGFsbCBpbnRlcmZhY2VzIGhhdmUgYmVlbgotICAgICAgICAvLyBwcm9jZXNzZWQuCi0gICAgICAgIEphdmFDbGFzcyBwYXJlbnRDbGF6eiA9IGNsYXp6LmdldFN1cGVySmF2YUNsYXNzKCk7Ci0gICAgICAgIGlmIChwYXJlbnRDbGF6eiAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBwcm9jZXNzQ2xhc3MocHJvY2Vzc2VkQ2xhc3NlcywgcGFyZW50Q2xhenosIG1vZGVsKTsKLSAgICAgICAgfQotICAgICAgICBKYXZhQ2xhc3NbXSBjbGFzc2VzID0gY2xhenouZ2V0SW1wbGVtZW50ZWRJbnRlcmZhY2VzKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2xhc3Nlcy5sZW5ndGg7ICsraSkKLSAgICAgICAgewotICAgICAgICAgICAgSmF2YUNsYXNzIGljbGF6eiA9IGNsYXNzZXNbaV07Ci0gICAgICAgICAgICBwcm9jZXNzQ2xhc3MocHJvY2Vzc2VkQ2xhc3NlcywgaWNsYXp6LCBtb2RlbCk7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gb2ssIG5vdyB3ZSBjYW4gbWFyayB0aGlzIGNsYXNzIGFzIHByb2Nlc3NlZC4KLSAgICAgICAgcHJvY2Vzc2VkQ2xhc3Nlcy5wdXQoY2xhenouZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCksIGNsYXp6KTsKLSAgICAgICAgbG9nLmluZm8oInByb2Nlc3NlZCBjbGFzczoiICsgY2xhenouZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkpOwotICAgICAgICAKLSAgICAgICAgUGFyc2luZ0NvbnRleHQgY29udGV4dCA9IG5ldyBQYXJzaW5nQ29udGV4dCgpOwotICAgICAgICAKLSAgICAgICAgY29udGV4dC5hZGRTdHJhdGVneShuZXcgQmVoYXZpb3JQYXJzaW5nU3RyYXRlZ3koKSk7Ci0gICAgICAgIGNvbnRleHQuYWRkU3RyYXRlZ3kobmV3IENsaWVudEJlaGF2aW9yUGFyc2luZ1N0cmF0ZWd5KCkpOwotICAgICAgICBjb250ZXh0LmFkZFN0cmF0ZWd5KG5ldyBDbGllbnRCZWhhdmlvclJlbmRlcmVyUGFyc2luZ1N0cmF0ZWd5KCkpOwotICAgICAgICBjb250ZXh0LmFkZFN0cmF0ZWd5KG5ldyBDb21wb25lbnRQYXJzaW5nU3RyYXRlZ3koKSk7Ci0gICAgICAgIGNvbnRleHQuYWRkU3RyYXRlZ3kobmV3IENvbnZlcnRlclBhcnNpbmdTdHJhdGVneSgpKTsKLSAgICAgICAgY29udGV4dC5hZGRTdHJhdGVneShuZXcgRmFjZWxldFRhZ1BhcnNpbmdTdHJhdGVneSgpKTsKLSAgICAgICAgY29udGV4dC5hZGRTdHJhdGVneShuZXcgSnNwVGFnUGFyc2luZ1N0cmF0ZWd5KCkpOwotICAgICAgICBjb250ZXh0LmFkZFN0cmF0ZWd5KG5ldyBSZW5kZXJlclBhcnNpbmdTdHJhdGVneSgpKTsKLSAgICAgICAgY29udGV4dC5hZGRTdHJhdGVneShuZXcgUmVuZGVyS2l0UGFyc2luZ1N0cmF0ZWd5KCkpOwotICAgICAgICBjb250ZXh0LmFkZFN0cmF0ZWd5KG5ldyBWYWxpZGF0b3JQYXJzaW5nU3RyYXRlZ3koKSk7Ci0gICAgICAgIGNvbnRleHQuYWRkU3RyYXRlZ3kobmV3IFdlYkNvbmZpZ1BhcmFtUGFyc2luZ1N0cmF0ZWd5KCkpOwotICAgICAgICAKLSAgICAgICAgY29udGV4dC5wYXJzZUNsYXNzKGNsYXp6LCBtb2RlbCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9xZG94L19Mb2NhdGlvbi5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9xZG94L19Mb2NhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMWMyMjk4Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvcWRveC9fTG9jYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qDQotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKiANCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICogDQotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5idWlsZGVyLnFkb3g7DQotDQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOw0KLQ0KLXB1YmxpYyBjbGFzcyBfTG9jYXRpb24gaW1wbGVtZW50cyBTZXJpYWxpemFibGUNCi17DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOw0KLQ0KLSAgICBwcml2YXRlIGludCBjb2x1bW47DQotICAgIHByaXZhdGUgaW50IGxpbmU7DQotICAgIHByaXZhdGUgU3RyaW5nIHBhdGg7DQotICAgIA0KLSAgICBwdWJsaWMgX0xvY2F0aW9uKFN0cmluZyBwYXRoLCBpbnQgbGluZSwgaW50IGNvbHVtbikNCi0gICAgew0KLSAgICAgICAgdGhpcy5jb2x1bW4gPSBjb2x1bW47DQotICAgICAgICB0aGlzLmxpbmUgPSBsaW5lOw0KLSAgICAgICAgdGhpcy5wYXRoID0gcGF0aDsgICAgICAgIA0KLSAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgaW50IGdldENvbHVtbigpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBjb2x1bW47DQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyBpbnQgZ2V0TGluZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBsaW5lOw0KLSAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFBhdGgoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gcGF0aDsNCi0gICAgfQ0KLSAgICANCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBwYXRoICsgIiBhdCBsaW5lICIgKyBsaW5lICsgIiBhbmQgY29sdW1uICIgKyBjb2x1bW47DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9xZG94L19UYWdBdHRyaWJ1dGUuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvcWRveC9fVGFnQXR0cmlidXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhYzRmOGYuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9xZG94L19UYWdBdHRyaWJ1dGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNSArMCwwIEBACi0vKg0KLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICogDQotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqIA0KLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqICB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uYnVpbGRlci5xZG94Ow0KLQ0KLQ0KLS8qKg0KLSAqIFJlcHJlc2VudGF0aW9uIG9mIGEgVGFnJ3MgYXR0cmlidXRlIGluIGEgRmFjZWxldCBGaWxlDQotICogDQotICogQGF1dGhvciBKYWNvYiBIb29rb20NCi0gKiBAdmVyc2lvbiAkSWQ6IFRhZ0F0dHJpYnV0ZS5qYXZhLHYgMS45IDIwMDgvMDcvMTMgMTk6MDE6MzUgcmx1YmtlIEV4cCAkDQotICovDQotcHVibGljIGZpbmFsIGNsYXNzIF9UYWdBdHRyaWJ1dGUNCi17DQotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIGxvY2FsTmFtZTsNCi0NCi0gICAgcHJpdmF0ZSBmaW5hbCBfTG9jYXRpb24gbG9jYXRpb247DQotDQotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG5hbWVzcGFjZTsNCi0NCi0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgcU5hbWU7DQotDQotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIHZhbHVlOw0KLQ0KLSAgICBwcml2YXRlIFN0cmluZyBzdHJpbmc7DQotDQotICAgIHB1YmxpYyBfVGFnQXR0cmlidXRlKF9Mb2NhdGlvbiBsb2NhdGlvbiwgU3RyaW5nIG5zLCBTdHJpbmcgbG9jYWxOYW1lLCBTdHJpbmcgcU5hbWUsIFN0cmluZyB2YWx1ZSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5sb2NhdGlvbiA9IGxvY2F0aW9uOw0KLSAgICAgICAgdGhpcy5uYW1lc3BhY2UgPSBuczsNCi0gICAgICAgIHRoaXMubG9jYWxOYW1lID0gbG9jYWxOYW1lOw0KLSAgICAgICAgdGhpcy5xTmFtZSA9IHFOYW1lOw0KLSAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBMb2NhbCBuYW1lIG9mIHRoaXMgYXR0cmlidXRlDQotICAgICAqIA0KLSAgICAgKiBAcmV0dXJuIGxvY2FsIG5hbWUgb2YgdGhpcyBhdHRyaWJ1dGUNCi0gICAgICovDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TG9jYWxOYW1lKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRoaXMubG9jYWxOYW1lOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBUaGUgbG9jYXRpb24gb2YgdGhpcyBhdHRyaWJ1dGUgaW4gdGhlIEZhY2VsZXRDb250ZXh0DQotICAgICAqIA0KLSAgICAgKiBAcmV0dXJuIHRoZSBUYWdBdHRyaWJ1dGUncyBsb2NhdGlvbg0KLSAgICAgKi8NCi0gICAgcHVibGljIF9Mb2NhdGlvbiBnZXRMb2NhdGlvbigpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0aGlzLmxvY2F0aW9uOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBUaGUgcmVzb2x2ZWQgTmFtZXNwYWNlIGZvciB0aGlzIGF0dHJpYnV0ZQ0KLSAgICAgKiANCi0gICAgICogQHJldHVybiByZXNvbHZlZCBOYW1lc3BhY2UNCi0gICAgICovDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRoaXMubmFtZXNwYWNlOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBUaGUgcXVhbGlmaWVkIG5hbWUgZm9yIHRoaXMgYXR0cmlidXRlDQotICAgICAqIA0KLSAgICAgKiBAcmV0dXJuIHRoZSBxdWFsaWZpZWQgbmFtZSBmb3IgdGhpcyBhdHRyaWJ1dGUNCi0gICAgICovDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UU5hbWUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdGhpcy5xTmFtZTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogUmV0dXJuIHRoZSBsaXRlcmFsIHZhbHVlIG9mIHRoaXMgYXR0cmlidXRlDQotICAgICAqIA0KLSAgICAgKiBAcmV0dXJuIGxpdGVyYWwgdmFsdWUNCi0gICAgICovDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdGhpcy52YWx1ZTsNCi0gICAgfQ0KLQ0KLSAgICAvKg0KLSAgICAgKiAobm9uLUphdmFkb2MpDQotICAgICAqIA0KLSAgICAgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjdG9TdHJpbmcoKQ0KLSAgICAgKi8NCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpDQotICAgIHsNCi0gICAgICAgIGlmICh0aGlzLnN0cmluZyA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRoaXMuc3RyaW5nID0gdGhpcy5sb2NhdGlvbiArICIgIiArIHRoaXMucU5hbWUgKyAiPVwiIiArIHRoaXMudmFsdWUgKyAiXCIiOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIHRoaXMuc3RyaW5nOw0KLSAgICB9DQotDQotfQ0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvcWRveC9fVGFnQXR0cmlidXRlcy5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9xZG94L19UYWdBdHRyaWJ1dGVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4ODM0NmYuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9xZG94L19UYWdBdHRyaWJ1dGVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDggKzAsMCBAQAotLyoNCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqIA0KLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKiANCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmJ1aWxkZXIucWRveDsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuU2V0Ow0KLQ0KLS8qKg0KLSAqIEEgc2V0IG9mIFRhZ0F0dHJpYnV0ZXMsIHVzdWFsbHkgcmVwcmVzZW50aW5nIGFsbCBhdHRyaWJ1dGVzIG9uIGEgVGFnLg0KLSAqIA0KLSAqIFRPRE86IFBST0ZJTEUgLSBFeHBsb3JlIHRoZSBwb3NzaWJpbGl0eSBvZiB1c2luZyBIYXNoTWFwIGluc3RlYWQgb2Ygc29ydGVkIGFycmF5cy4gDQotICogICAgICAgVGhlIGZvb3RwcmludCBzaG91bGQgYmUgaGlnaGVyLCBidXQgdGhlIGluc3RhbmNpYXRpb24gYW5kIGFjY2VzcyBzcGVlZCBzaG91bGQgYmUgZmFzdGVyIA0KLSAqICAgICAgIEluc3RhbmNpYXRpb246IGZyb20gTyhuIGxvZyBuKSB0byBPKDEpDQotICogICAgICAgQWNjZXNzOiBmcm9tIE8obG9nIG4pIHRvIE8oMSkNCi0gKiANCi0gKiBAc2VlIG9yZy5hcGFjaGUubXlmYWNlcy52aWV3LmZhY2VsZXRzLnRhZy5UYWcNCi0gKiBAc2VlIG9yZy5hcGFjaGUubXlmYWNlcy52aWV3LmZhY2VsZXRzLnRhZy5UYWdBdHRyaWJ1dGVJbXBsDQotICogQGF1dGhvciBKYWNvYiBIb29rb20NCi0gKiBAdmVyc2lvbiAkSWQ6IFRhZ0F0dHJpYnV0ZXMuamF2YSx2IDEuMyAyMDA4LzA3LzEzIDE5OjAxOjM1IHJsdWJrZSBFeHAgJA0KLSAqLw0KLXB1YmxpYyBmaW5hbCBjbGFzcyBfVGFnQXR0cmlidXRlcw0KLXsNCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgX1RhZ0F0dHJpYnV0ZVtdIEVNUFRZID0gbmV3IF9UYWdBdHRyaWJ1dGVbMF07DQotDQotICAgIHByaXZhdGUgZmluYWwgX1RhZ0F0dHJpYnV0ZVtdIF9hdHRyaWJ1dGVzOw0KLQ0KLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZ1tdIF9uYW1lc3BhY2VzOw0KLQ0KLSAgICBwcml2YXRlIGZpbmFsIExpc3QgX25zYXR0cnM7DQotDQotICAgIC8qKg0KLSAgICAgKiANCi0gICAgICovDQotICAgIHB1YmxpYyBfVGFnQXR0cmlidXRlcyhfVGFnQXR0cmlidXRlW10gYXR0cnMpDQotICAgIHsNCi0gICAgICAgIF9hdHRyaWJ1dGVzID0gYXR0cnM7DQotDQotICAgICAgICAvLyBncmFiIG5hbWVzcGFjZXMNCi0gICAgICAgIFNldCBzZXQgPSBuZXcgSGFzaFNldCgpOw0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBfYXR0cmlidXRlcy5sZW5ndGg7IGkrKykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBfVGFnQXR0cmlidXRlIGF0dHJpYnV0ZSA9IF9hdHRyaWJ1dGVzW2ldOw0KLSAgICAgICAgICAgIHNldC5hZGQoYXR0cmlidXRlLmdldE5hbWVzcGFjZSgpKTsNCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgX25hbWVzcGFjZXMgPSAoU3RyaW5nW10pIHNldC50b0FycmF5KG5ldyBTdHJpbmdbc2V0LnNpemUoKV0pOw0KLSAgICAgICAgQXJyYXlzLnNvcnQoX25hbWVzcGFjZXMpOw0KLQ0KLSAgICAgICAgLy8gYXNzaWduIGF0dHJzDQotICAgICAgICBpbnQgc2l6ZSA9IF9uYW1lc3BhY2VzLmxlbmd0aDsNCi0gICAgICAgIC8vTGlzdDxMaXN0PFRhZ0F0dHJpYnV0ZT4+IHRlbXAgPSBuZXcgQXJyYXlMaXN0PExpc3Q8VGFnQXR0cmlidXRlPj4oc2l6ZSk7DQotICAgICAgICBMaXN0IHRlbXAgPSBuZXcgQXJyYXlMaXN0KHNpemUpOw0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspDQotICAgICAgICB7DQotICAgICAgICAgICAgLy90ZW1wLmFkZChuZXcgQXJyYXlMaXN0PFRhZ0F0dHJpYnV0ZT4oKSk7DQotICAgICAgICAgICAgdGVtcC5hZGQobmV3IEFycmF5TGlzdCgpKTsNCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBfYXR0cmlidXRlcy5sZW5ndGg7IGkrKykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBfVGFnQXR0cmlidXRlIGF0dHJpYnV0ZSA9IF9hdHRyaWJ1dGVzW2ldOw0KLSAgICAgICAgICAgICgoTGlzdCl0ZW1wLmdldChBcnJheXMuYmluYXJ5U2VhcmNoKF9uYW1lc3BhY2VzLCBhdHRyaWJ1dGUuZ2V0TmFtZXNwYWNlKCkpKSkuYWRkKGF0dHJpYnV0ZSk7DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgICAgIC8vX25zYXR0cnMgPSBuZXcgQXJyYXlMaXN0PFRhZ0F0dHJpYnV0ZVtdPihzaXplKTsNCi0gICAgICAgIF9uc2F0dHJzID0gbmV3IEFycmF5TGlzdChzaXplKTsNCi0gICAgICAgIA0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0ZW1wLnNpemUoKTsgaSsrKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIExpc3QgbCA9IChMaXN0KSB0ZW1wLmdldChpKTsNCi0gICAgICAgICAgICBfbnNhdHRycy5hZGQobC50b0FycmF5KG5ldyBfVGFnQXR0cmlidXRlW2wuc2l6ZSgpXSkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBSZXR1cm4gYW4gYXJyYXkgb2YgYWxsIFRhZ0F0dHJpYnV0ZXMgaW4gdGhpcyBzZXQNCi0gICAgICogDQotICAgICAqIEByZXR1cm4gYSBub24tbnVsbCBhcnJheSBvZiBUYWdBdHRyaWJ1dGVzDQotICAgICAqLw0KLSAgICBwdWJsaWMgX1RhZ0F0dHJpYnV0ZVtdIGdldEFsbCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBfYXR0cmlidXRlczsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogVXNpbmcgbm8gbmFtZXNwYWNlLCBmaW5kIHRoZSBUYWdBdHRyaWJ1dGUNCi0gICAgICogDQotICAgICAqIEBzZWUgI2dldChTdHJpbmcsIFN0cmluZykNCi0gICAgICogQHBhcmFtIGxvY2FsTmFtZQ0KLSAgICAgKiAgICAgICAgICAgIHRhZyBhdHRyaWJ1dGUgbmFtZQ0KLSAgICAgKiBAcmV0dXJuIHRoZSBUYWdBdHRyaWJ1dGUgZm91bmQsIG90aGVyd2lzZSBudWxsDQotICAgICAqLw0KLSAgICBwdWJsaWMgX1RhZ0F0dHJpYnV0ZSBnZXQoU3RyaW5nIGxvY2FsTmFtZSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGdldCgiIiwgbG9jYWxOYW1lKTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogRmluZCBhIFRhZ0F0dHJpYnV0ZSB0aGF0IG1hdGNoZXMgdGhlIHBhc3NlZCBuYW1lc3BhY2UgYW5kIGxvY2FsIG5hbWUuDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gbnMNCi0gICAgICogICAgICAgICAgICBuYW1lc3BhY2Ugb2YgdGhlIGRlc2lyZWQgYXR0cmlidXRlDQotICAgICAqIEBwYXJhbSBsb2NhbE5hbWUNCi0gICAgICogICAgICAgICAgICBsb2NhbCBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUNCi0gICAgICogQHJldHVybiBhIFRhZ0F0dHJpYnV0ZSBmb3VuZCwgb3RoZXJ3aXNlIG51bGwNCi0gICAgICovDQotICAgIHB1YmxpYyBfVGFnQXR0cmlidXRlIGdldChTdHJpbmcgbnMsIFN0cmluZyBsb2NhbE5hbWUpDQotICAgIHsNCi0gICAgICAgIGlmIChucyAhPSBudWxsICYmIGxvY2FsTmFtZSAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGludCBpZHggPSBBcnJheXMuYmluYXJ5U2VhcmNoKF9uYW1lc3BhY2VzLCBucyk7DQotICAgICAgICAgICAgaWYgKGlkeCA+PSAwKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgX1RhZ0F0dHJpYnV0ZVtdIGFycmF5ID0gKF9UYWdBdHRyaWJ1dGVbXSkgX25zYXR0cnMuZ2V0KGlkeCk7DQotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoIDsgaSsrKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBfVGFnQXR0cmlidXRlIGF0dHJpYnV0ZSA9IGFycmF5W2ldOw0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2FsTmFtZS5lcXVhbHMoYXR0cmlidXRlLmdldExvY2FsTmFtZSgpKSkNCi0gICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXR0cmlidXRlOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogR2V0IGFsbCBUYWdBdHRyaWJ1dGVzIGZvciB0aGUgcGFzc2VkIG5hbWVzcGFjZQ0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIG5hbWVzcGFjZQ0KLSAgICAgKiAgICAgICAgICAgIG5hbWVzcGFjZSB0byBzZWFyY2gNCi0gICAgICogQHJldHVybiBhIG5vbi1udWxsIGFycmF5IG9mIFRhZ0F0dHJpYnV0ZXMNCi0gICAgICovDQotICAgIHB1YmxpYyBfVGFnQXR0cmlidXRlW10gZ2V0QWxsKFN0cmluZyBuYW1lc3BhY2UpDQotICAgIHsNCi0gICAgICAgIGludCBpZHggPSAwOw0KLSAgICAgICAgaWYgKG5hbWVzcGFjZSA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlkeCA9IEFycmF5cy5iaW5hcnlTZWFyY2goX25hbWVzcGFjZXMsICIiKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZHggPSBBcnJheXMuYmluYXJ5U2VhcmNoKF9uYW1lc3BhY2VzLCBuYW1lc3BhY2UpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICBpZiAoaWR4ID49IDApDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIChfVGFnQXR0cmlidXRlW10pIF9uc2F0dHJzLmdldChpZHgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICByZXR1cm4gRU1QVFk7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIEEgbGlzdCBvZiBOYW1lc3BhY2VzIGZvdW5kIGluIHRoaXMgc2V0DQotICAgICAqIA0KLSAgICAgKiBAcmV0dXJuIGEgbGlzdCBvZiBOYW1lc3BhY2VzIGZvdW5kIGluIHRoaXMgc2V0DQotICAgICAqLw0KLSAgICBwdWJsaWMgU3RyaW5nW10gZ2V0TmFtZXNwYWNlcygpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBfbmFtZXNwYWNlczsNCi0gICAgfQ0KLQ0KLSAgICAvKg0KLSAgICAgKiAobm9uLUphdmFkb2MpDQotICAgICAqIA0KLSAgICAgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjdG9TdHJpbmcoKQ0KLSAgICAgKi8NCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpDQotICAgIHsNCi0gICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsNCi0gICAgICAgIA0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBfYXR0cmlidXRlcy5sZW5ndGg7IGkrKykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBfVGFnQXR0cmlidXRlIGF0dHJpYnV0ZSA9IF9hdHRyaWJ1dGVzW2ldOw0KLSAgICAgICAgICAgIHNiLmFwcGVuZChhdHRyaWJ1dGUpOw0KLSAgICAgICAgICAgIHNiLmFwcGVuZCgnICcpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICBpZiAoc2IubGVuZ3RoKCkgPiAxKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHNiLnNldExlbmd0aChzYi5sZW5ndGgoKSAtIDEpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL3Fkb3gvcGFyc2UvQmVoYXZpb3JQYXJzaW5nU3RyYXRlZ3kuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvcWRveC9wYXJzZS9CZWhhdmlvclBhcnNpbmdTdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlY2E1MTg0Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvcWRveC9wYXJzZS9CZWhhdmlvclBhcnNpbmdTdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEyICswLDAgQEAKLS8qDQotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKiANCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICogDQotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5idWlsZGVyLnFkb3gucGFyc2U7DQotDQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uYnVpbGRlci5tb2RlbC5CZWhhdmlvck1ldGE7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uYnVpbGRlci5tb2RlbC5Nb2RlbDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5idWlsZGVyLnFkb3guUWRveEhlbHBlcjsNCi0NCi1pbXBvcnQgY29tLnRob3VnaHR3b3Jrcy5xZG94Lm1vZGVsLkFic3RyYWN0SmF2YUVudGl0eTsNCi1pbXBvcnQgY29tLnRob3VnaHR3b3Jrcy5xZG94Lm1vZGVsLkFubm90YXRpb247DQotaW1wb3J0IGNvbS50aG91Z2h0d29ya3MucWRveC5tb2RlbC5Eb2NsZXRUYWc7DQotaW1wb3J0IGNvbS50aG91Z2h0d29ya3MucWRveC5tb2RlbC5KYXZhQ2xhc3M7DQotaW1wb3J0IGNvbS50aG91Z2h0d29ya3MucWRveC5tb2RlbC5KYXZhRmllbGQ7DQotDQotLyoqDQotICogDQotICogQGF1dGhvciBMZW9uYXJkbyBVcmliZQ0KLSAqIEBzaW5jZSAxLjAuOQ0KLSAqDQotICovDQotcHVibGljIGNsYXNzIEJlaGF2aW9yUGFyc2luZ1N0cmF0ZWd5IGV4dGVuZHMgQ2xhc3NNZXRhUHJvcGVydHlQYXJzaW5nU3RyYXRlZ3kNCi17DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBET0NfQkVIQVZJT1IgPSAiSlNGQmVoYXZpb3IiOw0KLQ0KLSAgICBwdWJsaWMgdm9pZCBwYXJzZUNsYXNzKEphdmFDbGFzcyBjbGF6eiwgTW9kZWwgbW9kZWwpDQotICAgIHsNCi0gICAgICAgIERvY2xldFRhZyB0YWc7DQotICAgICAgICBBbm5vdGF0aW9uIGFubm87DQotICAgICAgICAvLyBiZWhhdmlvcnMNCi0gICAgICAgIHRhZyA9IGNsYXp6LmdldFRhZ0J5TmFtZShET0NfQkVIQVZJT1IsIGZhbHNlKTsNCi0gICAgICAgIGlmICh0YWcgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBNYXAgcHJvcHMgPSB0YWcuZ2V0TmFtZWRQYXJhbWV0ZXJNYXAoKTsNCi0gICAgICAgICAgICBwcm9jZXNzQmVoYXZpb3IocHJvcHMsIChBYnN0cmFjdEphdmFFbnRpdHkpdGFnLmdldENvbnRleHQoKSwgY2xhenosIG1vZGVsKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGFubm8gPSBRZG94SGVscGVyLmdldEFubm90YXRpb24oY2xhenosIERPQ19CRUhBVklPUik7DQotICAgICAgICBpZiAoYW5ubyAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIE1hcCBwcm9wcyA9IGFubm8uZ2V0TmFtZWRQYXJhbWV0ZXJNYXAoKTsNCi0gICAgICAgICAgICBwcm9jZXNzQmVoYXZpb3IocHJvcHMsIChBYnN0cmFjdEphdmFFbnRpdHkpYW5uby5nZXRDb250ZXh0KCksIGNsYXp6LCBtb2RlbCk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NCZWhhdmlvcihNYXAgcHJvcHMsIEFic3RyYWN0SmF2YUVudGl0eSBjdHgsDQotICAgICAgICAgICAgSmF2YUNsYXNzIGNsYXp6LCBNb2RlbCBtb2RlbCkNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIGxvbmdEZXNjcmlwdGlvbiA9IGNsYXp6LmdldENvbW1lbnQoKTsNCi0gICAgICAgIFN0cmluZyBkZXNjRGZsdCA9IFFkb3hIZWxwZXIuZ2V0Rmlyc3RTZW50ZW5jZShsb25nRGVzY3JpcHRpb24pOw0KLSAgICAgICAgaWYgKChkZXNjRGZsdCA9PSBudWxsKSB8fCAoZGVzY0RmbHQubGVuZ3RoKCkgPCAyKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBkZXNjRGZsdCA9ICJubyBkZXNjcmlwdGlvbiI7DQotICAgICAgICB9DQotICAgICAgICBTdHJpbmcgc2hvcnREZXNjcmlwdGlvbiA9IFFkb3hIZWxwZXIuZ2V0U3RyaW5nKGNsYXp6LCAiZGVzYyIsIHByb3BzLCBkZXNjRGZsdCk7DQotDQotICAgICAgICBTdHJpbmcgYmVoYXZpb3JJZERmbHQgPSBudWxsOw0KLSAgICAgICAgSmF2YUZpZWxkIGZpZWxkQmVoYXZpb3JJZCA9IGNsYXp6DQotICAgICAgICAgICAgICAgIC5nZXRGaWVsZEJ5TmFtZSgiQkVIQVZJT1JfSUQiKTsNCi0gICAgICAgIGlmIChmaWVsZEJlaGF2aW9ySWQgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBmaWVsZEJlaGF2aW9ySWQuZ2V0SW5pdGlhbGl6YXRpb25FeHByZXNzaW9uKCk7DQotICAgICAgICAgICAgYmVoYXZpb3JJZERmbHQgPSBRZG94SGVscGVyLmNsZWFuKHZhbHVlLnN1YnN0cmluZyh2YWx1ZS5pbmRleE9mKCciJykpKTsNCi0gICAgICAgIH0gICAgICAgIA0KLSAgICAgICAgU3RyaW5nIGJlaGF2aW9ySWQgPSBRZG94SGVscGVyLmdldFN0cmluZyhjbGF6eiwgImlkIiwgcHJvcHMsIGJlaGF2aW9ySWREZmx0KTsNCi0NCi0gICAgICAgIC8vIENoZWNrIGZvciBib3RoICJjbGFzcyIgYW5kICJjbGF6eiIgaW4gb3JkZXIgdG8gc3VwcG9ydA0KLSAgICAgICAgLy8gZG9jbGV0IGFuZCByZWFsIGFubm90YXRpb25zLg0KLSAgICAgICAgU3RyaW5nIGNsYXNzTmFtZU92ZXJyaWRlID0gUWRveEhlbHBlci5nZXRTdHJpbmcoY2xhenosICJjbGFzcyIsIHByb3BzLCBudWxsKTsNCi0gICAgICAgIGNsYXNzTmFtZU92ZXJyaWRlID0gUWRveEhlbHBlci5nZXRTdHJpbmcoY2xhenosImNsYXp6Iixwcm9wcyxjbGFzc05hbWVPdmVycmlkZSk7DQotICAgICAgICANCi0gICAgICAgIFN0cmluZyBjb21wb25lbnROYW1lID0gUWRveEhlbHBlci5nZXRTdHJpbmcoY2xhenosICJuYW1lIiwgcHJvcHMsIG51bGwpOw0KLSAgICAgICAgU3RyaW5nIGJvZHlDb250ZW50ID0gUWRveEhlbHBlci5nZXRTdHJpbmcoY2xhenosICJib2R5Q29udGVudCIsIHByb3BzLCBudWxsKTsNCi0gICAgICAgIFN0cmluZyB0YWdIYW5kbGVyID0gUWRveEhlbHBlci5nZXRTdHJpbmcoY2xhenosICJ0YWdIYW5kbGVyIiwgcHJvcHMsIG51bGwpOw0KLSAgICAgICAgQm9vbGVhbiBjb25maWdFeGNsdWRlZCA9IFFkb3hIZWxwZXIuZ2V0Qm9vbGVhbihjbGF6eiwiY29uZmlnRXhjbHVkZWQiLHByb3BzLG51bGwpOw0KLSAgICAgICAgQm9vbGVhbiBldmFsdWF0ZUVMT25FeGVjdXRpb24gPSBRZG94SGVscGVyLmdldEJvb2xlYW4oY2xhenosImV2YWx1YXRlRUxPbkV4ZWN1dGlvbiIscHJvcHMsbnVsbCk7DQotDQotICAgICAgICBCZWhhdmlvck1ldGEgYmVoYXZpb3IgPSBuZXcgQmVoYXZpb3JNZXRhKCk7DQotICAgICAgICBpbml0Q2xhc3NNZXRhKG1vZGVsLCBjbGF6eiwgYmVoYXZpb3IsIGNsYXNzTmFtZU92ZXJyaWRlKTsNCi0gICAgICAgIGJlaGF2aW9yLnNldE5hbWUoY29tcG9uZW50TmFtZSk7DQotICAgICAgICBiZWhhdmlvci5zZXRCb2R5Q29udGVudChib2R5Q29udGVudCk7DQotICAgICAgICBiZWhhdmlvci5zZXRCZWhhdmlvcklkKGJlaGF2aW9ySWQpOw0KLSAgICAgICAgYmVoYXZpb3Iuc2V0RGVzY3JpcHRpb24oc2hvcnREZXNjcmlwdGlvbik7DQotICAgICAgICBiZWhhdmlvci5zZXRMb25nRGVzY3JpcHRpb24obG9uZ0Rlc2NyaXB0aW9uKTsNCi0gICAgICAgIGJlaGF2aW9yLnNldFRhZ0hhbmRsZXIodGFnSGFuZGxlcik7DQotICAgICAgICBiZWhhdmlvci5zZXRDb25maWdFeGNsdWRlZChjb25maWdFeGNsdWRlZCk7DQotICAgICAgICBiZWhhdmlvci5zZXRFdmFsdWF0ZUVMT25FeGVjdXRpb24oZXZhbHVhdGVFTE9uRXhlY3V0aW9uKTsNCi0NCi0gICAgICAgIA0KLSAgICAgICAgLy8gTm93IGhlcmUgd2FsayB0aGUgY29tcG9uZW50IGxvb2tpbmcgZm9yIHByb3BlcnR5IGFubm90YXRpb25zLg0KLSAgICAgICAgcHJvY2Vzc0NvbXBvbmVudFByb3BlcnRpZXMoY2xhenosIGJlaGF2aW9yKTsNCi0gICAgICAgIA0KLSAgICAgICAgbW9kZWwuYWRkQmVoYXZpb3IoYmVoYXZpb3IpOw0KLSAgICB9DQotDQotfQ0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvcWRveC9wYXJzZS9DbGFzc01ldGFQYXJzaW5nU3RyYXRlZ3kuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvcWRveC9wYXJzZS9DbGFzc01ldGFQYXJzaW5nU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzAxYmVjNS4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL3Fkb3gvcGFyc2UvQ2xhc3NNZXRhUGFyc2luZ1N0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vKg0KLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICogDQotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqIA0KLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqICB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uYnVpbGRlci5xZG94LnBhcnNlOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmcuU3RyaW5nVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uYnVpbGRlci5tb2RlbC5DbGFzc01ldGE7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uYnVpbGRlci5tb2RlbC5Db21wb25lbnRNZXRhOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmJ1aWxkZXIubW9kZWwuTW9kZWw7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uYnVpbGRlci5xZG94LlFkb3hIZWxwZXI7DQotDQotaW1wb3J0IGNvbS50aG91Z2h0d29ya3MucWRveC5tb2RlbC5KYXZhQ2xhc3M7DQotDQotLyoqDQotICogDQotICogQGF1dGhvciBMZW9uYXJkbyBVcmliZQ0KLSAqIEBzaW5jZSAxLjAuOQ0KLSAqDQotICovDQotcHVibGljIGFic3RyYWN0IGNsYXNzIENsYXNzTWV0YVBhcnNpbmdTdHJhdGVneSBpbXBsZW1lbnRzIEphdmFDbGFzc1BhcnNpbmdTdHJhdGVneQ0KLXsNCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBTZXQgdGhlIGJhc2ljIGRhdGEgb24gYSBDbGFzc01ldGEuDQotICAgICAqIDxwPg0KLSAgICAgKiBUaGVyZSBpcyBvbmUgcHJvcGVydHkgbm90IHNldCBoZXJlOiB0aGUgcGFyZW50Q2xhc3NOYW1lLiBTZWUgbWV0aG9kDQotICAgICAqIGluaXRDb21wb25lbnRBbmNlc3RyeSBmb3IgZnVydGhlciBkZXRhaWxzLg0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgaW5pdENsYXNzTWV0YShNb2RlbCBtb2RlbCwgSmF2YUNsYXNzIGNsYXp6LA0KLSAgICAgICAgICAgIENsYXNzTWV0YSBtb2RlbEl0ZW0sIFN0cmluZyBjbGFzc05hbWVPdmVycmlkZSkNCi0gICAgew0KLSAgICAgICAgbW9kZWxJdGVtLnNldE1vZGVsSWQobW9kZWwuZ2V0TW9kZWxJZCgpKTsNCi0gICAgICAgIG1vZGVsSXRlbS5zZXRTb3VyY2VDbGFzc05hbWUoY2xhenouZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkpOw0KLSAgICAgICAgSmF2YUNsYXNzIHJlYWxQYXJlbnRDbGFzcyA9IGNsYXp6LmdldFN1cGVySmF2YUNsYXNzKCk7DQotICAgICAgICBpZiAocmVhbFBhcmVudENsYXNzICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgU3RyaW5nIGZxbiA9IHJlYWxQYXJlbnRDbGFzcy5nZXRGdWxseVF1YWxpZmllZE5hbWUoKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICBpZiAoKGZxbiAhPSBudWxsKSAmJiAhZnFuLnN0YXJ0c1dpdGgoImphdmEubGFuZyIpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgZnFuID0gUWRveEhlbHBlci5nZXRGdWxseVF1YWxpZmllZENsYXNzTmFtZShjbGF6eixmcW4pOw0KLSAgICAgICAgICAgICAgICBtb2RlbEl0ZW0uc2V0U291cmNlQ2xhc3NQYXJlbnRDbGFzc05hbWUoZnFuKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICAvLyBKU0YgRW50aXR5IGNsYXNzLg0KLSAgICAgICAgaWYgKFN0cmluZ1V0aWxzLmlzRW1wdHkoY2xhc3NOYW1lT3ZlcnJpZGUpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIG1vZGVsSXRlbS5zZXRDbGFzc05hbWUoY2xhenouZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIG1vZGVsSXRlbS5zZXRDbGFzc05hbWUoY2xhc3NOYW1lT3ZlcnJpZGUpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLy8gaW50ZXJmYWNlcyBtZXRhZGF0YSBpcyBpbmhlcml0ZWQgZnJvbQ0KLSAgICAgICAgSmF2YUNsYXNzW10gY2xhc3NlcyA9IGNsYXp6LmdldEltcGxlbWVudGVkSW50ZXJmYWNlcygpOw0KLSAgICAgICAgTGlzdCBpZmFjZU5hbWVzID0gbmV3IEFycmF5TGlzdCgpOw0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjbGFzc2VzLmxlbmd0aDsgKytpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIEphdmFDbGFzcyBpY2xhenogPSBjbGFzc2VzW2ldOw0KLQ0KLSAgICAgICAgICAgIENvbXBvbmVudE1ldGEgaWZhY2VDb21wb25lbnQgPSBtb2RlbA0KLSAgICAgICAgICAgICAgICAgICAgLmZpbmRDb21wb25lbnRCeUNsYXNzTmFtZShpY2xhenouZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkpOw0KLSAgICAgICAgICAgIGlmIChpZmFjZUNvbXBvbmVudCAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgaWZhY2VOYW1lcy5hZGQoaWZhY2VDb21wb25lbnQuZ2V0Q2xhc3NOYW1lKCkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIG1vZGVsSXRlbS5zZXRJbnRlcmZhY2VDbGFzc05hbWVzKGlmYWNlTmFtZXMpOw0KLSAgICB9DQotDQotfQ0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvcWRveC9wYXJzZS9DbGFzc01ldGFQcm9wZXJ0eVBhcnNpbmdTdHJhdGVneS5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9xZG94L3BhcnNlL0NsYXNzTWV0YVByb3BlcnR5UGFyc2luZ1N0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxYTg4ODIuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9xZG94L3BhcnNlL0NsYXNzTWV0YVByb3BlcnR5UGFyc2luZ1N0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjUgKzAsMCBAQAotLyoNCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqIA0KLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKiANCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmJ1aWxkZXIucWRveC5wYXJzZTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nLlN0cmluZ1V0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmJ1aWxkZXIubW9kZWwuTWV0aG9kU2lnbmF0dXJlTWV0YTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5idWlsZGVyLm1vZGVsLlByb3BlcnR5SG9sZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmJ1aWxkZXIubW9kZWwuUHJvcGVydHlNZXRhOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmJ1aWxkZXIucWRveC5RZG94SGVscGVyOw0KLQ0KLWltcG9ydCBjb20udGhvdWdodHdvcmtzLnFkb3gubW9kZWwuQWJzdHJhY3RKYXZhRW50aXR5Ow0KLWltcG9ydCBjb20udGhvdWdodHdvcmtzLnFkb3gubW9kZWwuQW5ub3RhdGlvbjsNCi1pbXBvcnQgY29tLnRob3VnaHR3b3Jrcy5xZG94Lm1vZGVsLkRvY2xldFRhZzsNCi1pbXBvcnQgY29tLnRob3VnaHR3b3Jrcy5xZG94Lm1vZGVsLkphdmFDbGFzczsNCi1pbXBvcnQgY29tLnRob3VnaHR3b3Jrcy5xZG94Lm1vZGVsLkphdmFNZXRob2Q7DQotaW1wb3J0IGNvbS50aG91Z2h0d29ya3MucWRveC5tb2RlbC5UeXBlOw0KLQ0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBDbGFzc01ldGFQcm9wZXJ0eVBhcnNpbmdTdHJhdGVneSBleHRlbmRzIENsYXNzTWV0YVBhcnNpbmdTdHJhdGVneQ0KLXsNCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRE9DX0NPTVBPTkVOVCA9ICJKU0ZDb21wb25lbnQiOw0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBET0NfUFJPUEVSVFkgPSAiSlNGUHJvcGVydHkiOw0KLSAgICAvL1RoaXMgcHJvcGVydHkgaXMgdXNlZCBpbiBzcGVjaWFsIGNhc2VzIHdoZXJlIHByb3BlcnRpZXMgDQotICAgIC8vZG9lcyBub3QgaGF2ZSBtZXRob2RzIGRlZmluZWQgb24gY29tcG9uZW50IGNsYXNzLCBsaWtlIGJpbmRpbmcNCi0gICAgLy9pbiBqc2YgMS4xIChpbiAxLjIgaGFzIGNvbXBvbmVudCBjb3VudGVycGFydCkuIEluIGZhY3QsIGFsbA0KLSAgICAvL3Byb3BlcnRpZXMgbXVzdCBiZSBkZWZpbmVkIHdpdGggSlNGUHJvcGVydHkNCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRE9DX0pTUF9QUk9QRVJUWSA9ICJKU0ZKc3BQcm9wZXJ0eSI7DQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERPQ19KU1BfUFJPUEVSVElFUyA9ICJKU0ZKc3BQcm9wZXJ0aWVzIjsNCi0NCi0gICAgLyoqDQotICAgICAqIExvb2sgZm9yIGFueSBtZXRob2RzIG9uIHRoZSBzcGVjaWZpZWQgY2xhc3MgdGhhdCBhcmUgYW5ub3RhdGVkIGFzIGJlaW5nDQotICAgICAqIGNvbXBvbmVudCBwcm9wZXJ0aWVzLCBhbmQgYWRkIG1ldGFkYXRhIGFib3V0IHRoZW0gdG8gdGhlIG1vZGVsLg0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgcHJvY2Vzc0NvbXBvbmVudFByb3BlcnRpZXMoSmF2YUNsYXNzIGNsYXp6LA0KLSAgICAgICAgICAgIFByb3BlcnR5SG9sZGVyIGNvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgSmF2YU1ldGhvZFtdIG1ldGhvZHMgPSBjbGF6ei5nZXRNZXRob2RzKCk7DQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1ldGhvZHMubGVuZ3RoOyArK2kpDQotICAgICAgICB7DQotICAgICAgICAgICAgSmF2YU1ldGhvZCBtZXRob2QgPSBtZXRob2RzW2ldOw0KLQ0KLSAgICAgICAgICAgIERvY2xldFRhZyB0YWcgPSBtZXRob2QuZ2V0VGFnQnlOYW1lKERPQ19QUk9QRVJUWSk7DQotICAgICAgICAgICAgaWYgKHRhZyAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgTWFwIHByb3BzID0gdGFnLmdldE5hbWVkUGFyYW1ldGVyTWFwKCk7DQotICAgICAgICAgICAgICAgIHByb2Nlc3NDb21wb25lbnRQcm9wZXJ0eShwcm9wcywgKEFic3RyYWN0SmF2YUVudGl0eSl0YWcuZ2V0Q29udGV4dCgpLCBjbGF6eiwNCi0gICAgICAgICAgICAgICAgICAgICAgICBtZXRob2QsIGNvbXBvbmVudCk7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIEFubm90YXRpb24gYW5ubyA9IFFkb3hIZWxwZXIuZ2V0QW5ub3RhdGlvbihtZXRob2QsIERPQ19QUk9QRVJUWSk7DQotICAgICAgICAgICAgaWYgKGFubm8gIT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIE1hcCBwcm9wcyA9IGFubm8uZ2V0TmFtZWRQYXJhbWV0ZXJNYXAoKTsNCi0gICAgICAgICAgICAgICAgcHJvY2Vzc0NvbXBvbmVudFByb3BlcnR5KHByb3BzLCAoQWJzdHJhY3RKYXZhRW50aXR5KWFubm8uZ2V0Q29udGV4dCgpLCBjbGF6eiwNCi0gICAgICAgICAgICAgICAgICAgICAgICBtZXRob2QsIGNvbXBvbmVudCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICBUeXBlIFtdIGludGVyZmFjZXMgPSBjbGF6ei5nZXRJbXBsZW1lbnRzKCk7DQotICAgICAgICANCi0gICAgICAgIC8vU2NhbiBpbnRlcmZhY2VzIGZvciBwcm9wZXJ0aWVzIHRvIGJlIGFkZGVkIHRvIHRoaXMgY29tcG9uZW50DQotICAgICAgICAvL1RoaXMgZmVhdHVyZSBhbGxvdyB1cyB0byBoYXZlIGdyb3VwcyBvZiBmdW5jdGlvbnMuDQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGludGVyZmFjZXMubGVuZ3RoOysraSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBKYXZhQ2xhc3MgaW50ZiA9IGludGVyZmFjZXNbaV0uZ2V0SmF2YUNsYXNzKCk7DQotDQotICAgICAgICAgICAgLy9JZiB0aGUgaW50ZXJmYWNlcyBoYXMgYSBKU0ZDb21wb25lbnQgRG9jbGV0LA0KLSAgICAgICAgICAgIC8vdGhpcyBpcyBtYW5hZ2VkIGluIG90aGVyIHdheQ0KLSAgICAgICAgICAgIGlmIChpbnRmLmdldFRhZ0J5TmFtZShET0NfQ09NUE9ORU5ULCBmYWxzZSkgPT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIEphdmFNZXRob2RbXSBpbnRmbWV0aG9kcyA9IGludGYuZ2V0TWV0aG9kcygpOw0KLSAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGludGZtZXRob2RzLmxlbmd0aDsgKytqKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBKYXZhTWV0aG9kIGludGZtZXRob2QgPSBpbnRmbWV0aG9kc1tqXTsNCi0NCi0gICAgICAgICAgICAgICAgICAgIERvY2xldFRhZyB0YWcgPSBpbnRmbWV0aG9kLmdldFRhZ0J5TmFtZShET0NfUFJPUEVSVFkpOw0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHRhZyAhPSBudWxsKQ0KLSAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIE1hcCBwcm9wcyA9IHRhZy5nZXROYW1lZFBhcmFtZXRlck1hcCgpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NJbnRlcmZhY2VDb21wb25lbnRQcm9wZXJ0eShwcm9wcywgKEFic3RyYWN0SmF2YUVudGl0eSl0YWcuZ2V0Q29udGV4dCgpLCANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXp6LCBpbnRmbWV0aG9kLCBjb21wb25lbnQpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICAgICAgQW5ub3RhdGlvbiBhbm5vID0gUWRveEhlbHBlci5nZXRBbm5vdGF0aW9uKGludGZtZXRob2QsIERPQ19QUk9QRVJUWSk7DQotICAgICAgICAgICAgICAgICAgICBpZiAoYW5ubyAhPSBudWxsKQ0KLSAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIE1hcCBwcm9wcyA9IGFubm8uZ2V0TmFtZWRQYXJhbWV0ZXJNYXAoKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzSW50ZXJmYWNlQ29tcG9uZW50UHJvcGVydHkocHJvcHMsIChBYnN0cmFjdEphdmFFbnRpdHkpYW5uby5nZXRDb250ZXh0KCksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGF6eiwgaW50Zm1ldGhvZCwgY29tcG9uZW50KTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8vU2NhbiBmb3IgcHJvcGVydGllcyBkZWZpbmVkIG9ubHkgb24ganNwIChzcGVjaWFsIGNhc2Ugb24gbXlmYWNlcyAxLjEsDQotICAgICAgICAvL3RoaXMgZmVhdHVyZSBzaG91bGQgbm90IGJlIHVzZWQgb24gdHlwaWNhbCBzaXR1YXRpb25zKQ0KLSAgICAgICAgRG9jbGV0VGFnW10ganNwUHJvcGVydGllcyA9IGNsYXp6LmdldFRhZ3NCeU5hbWUoRE9DX0pTUF9QUk9QRVJUWSk7DQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGpzcFByb3BlcnRpZXMubGVuZ3RoOyArK2kpDQotICAgICAgICB7DQotICAgICAgICAgICAgLy9XZSBoYXZlIGhlcmUgb25seSBkb2NsZXRzLCBiZWNhdXNlIHRoaXMgcGFydCBpcyBvbmx5IGZvcg0KLSAgICAgICAgICAgIC8vc29sdmUgcHJvYmxlbXMgd2l0aCBiaW5kaW5nIHByb3BlcnR5IG9uIDEuMQ0KLSAgICAgICAgICAgIERvY2xldFRhZyB0YWcgPSBqc3BQcm9wZXJ0aWVzW2ldOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIE1hcCBwcm9wcyA9IHRhZy5nZXROYW1lZFBhcmFtZXRlck1hcCgpOw0KLSAgICAgICAgICAgIHByb2Nlc3NDb21wb25lbnRKc3BQcm9wZXJ0eShwcm9wcywgKEFic3RyYWN0SmF2YUVudGl0eSl0YWcuZ2V0Q29udGV4dCgpLCBjbGF6eiwNCi0gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudCk7DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgICAgIEFubm90YXRpb24ganNwUHJvcGVydHlBbm5vID0gUWRveEhlbHBlci5nZXRBbm5vdGF0aW9uKGNsYXp6LCBET0NfSlNQX1BST1BFUlRZKTsNCi0gICAgICAgIGlmIChqc3BQcm9wZXJ0eUFubm8gIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBNYXAgcHJvcHMgPSBqc3BQcm9wZXJ0eUFubm8uZ2V0TmFtZWRQYXJhbWV0ZXJNYXAoKTsNCi0gICAgICAgICAgICBwcm9jZXNzQ29tcG9uZW50SnNwUHJvcGVydHkocHJvcHMsIChBYnN0cmFjdEphdmFFbnRpdHkpanNwUHJvcGVydHlBbm5vLmdldENvbnRleHQoKSwNCi0gICAgICAgICAgICAgICAgICAgIGNsYXp6LCBjb21wb25lbnQpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICANCi0gICAgICAgIEFubm90YXRpb24ganNwQW5ubyA9IFFkb3hIZWxwZXIuZ2V0QW5ub3RhdGlvbihjbGF6eiwgRE9DX0pTUF9QUk9QRVJUSUVTKTsgICAgICAgIA0KLSAgICAgICAgaWYgKGpzcEFubm8gIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBPYmplY3QganNwUHJvcHMgPSBqc3BBbm5vLmdldE5hbWVkUGFyYW1ldGVyKCJwcm9wZXJ0aWVzIik7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgaWYgKGpzcFByb3BzIGluc3RhbmNlb2YgQW5ub3RhdGlvbikNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIEFubm90YXRpb24ganNwUHJvcGVydGllc0Fubm8gPSAoQW5ub3RhdGlvbikganNwUHJvcHM7DQotICAgICAgICAgICAgICAgIE1hcCBwcm9wcyA9IGpzcFByb3BlcnRpZXNBbm5vLmdldE5hbWVkUGFyYW1ldGVyTWFwKCk7DQotICAgICAgICAgICAgICAgIHByb2Nlc3NDb21wb25lbnRKc3BQcm9wZXJ0eShwcm9wcywgKEFic3RyYWN0SmF2YUVudGl0eSlqc3BBbm5vLmdldENvbnRleHQoKSwgY2xhenosDQotICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50KTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZWxzZQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgTGlzdCBqc3BQcm9wc0xpc3QgPSAoTGlzdCkganNwUHJvcHM7DQotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwganNwUHJvcHNMaXN0LnNpemUoKTtpKyspDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIEFubm90YXRpb24gYW5ubyA9IChBbm5vdGF0aW9uKSBqc3BQcm9wc0xpc3QuZ2V0KGkpOw0KLQ0KLSAgICAgICAgICAgICAgICAgICAgTWFwIHByb3BzID0gYW5uby5nZXROYW1lZFBhcmFtZXRlck1hcCgpOw0KLSAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc0NvbXBvbmVudEpzcFByb3BlcnR5KHByb3BzLCAoQWJzdHJhY3RKYXZhRW50aXR5KWpzcEFubm8uZ2V0Q29udGV4dCgpLCBjbGF6eiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50KTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICANCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICANCi0gICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NDb21wb25lbnRQcm9wZXJ0eShNYXAgcHJvcHMsIEFic3RyYWN0SmF2YUVudGl0eSBjdHgsDQotICAgICAgICAgICAgSmF2YUNsYXNzIGNsYXp6LCBKYXZhTWV0aG9kIG1ldGhvZCwgUHJvcGVydHlIb2xkZXIgY29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICBCb29sZWFuIHJlcXVpcmVkID0gUWRveEhlbHBlci5nZXRCb29sZWFuKGNsYXp6LCAicmVxdWlyZWQiLCBwcm9wcywgbnVsbCk7DQotICAgICAgICBCb29sZWFuIHRyYW5zaWVudFByb3AgPSBRZG94SGVscGVyLmdldEJvb2xlYW4oY2xhenosICJ0cmFuc2llbnQiLCBwcm9wcywgbnVsbCk7DQotICAgICAgICB0cmFuc2llbnRQcm9wID0gUWRveEhlbHBlci5nZXRCb29sZWFuKGNsYXp6LCAiaXN0cmFuc2llbnQiLCBwcm9wcywgdHJhbnNpZW50UHJvcCk7DQotICAgICAgICBCb29sZWFuIHN0YXRlSG9sZGVyID0gUWRveEhlbHBlci5nZXRCb29sZWFuKGNsYXp6LCAic3RhdGVIb2xkZXIiLCBwcm9wcywgbnVsbCk7DQotICAgICAgICBCb29sZWFuIHBhcnRpYWxTdGF0ZUhvbGRlciA9IFFkb3hIZWxwZXIuZ2V0Qm9vbGVhbihjbGF6eiwgInBhcnRpYWxTdGF0ZUhvbGRlciIsIHByb3BzLCBudWxsKTsNCi0gICAgICAgIEJvb2xlYW4gbGl0ZXJhbE9ubHkgPSBRZG94SGVscGVyLmdldEJvb2xlYW4oY2xhenosICJsaXRlcmFsT25seSIsIHByb3BzLCBudWxsKTsNCi0gICAgICAgIEJvb2xlYW4gdGFnRXhjbHVkZWQgPSBRZG94SGVscGVyLmdldEJvb2xlYW4oY2xhenosICJ0YWdFeGNsdWRlZCIsIHByb3BzLCBudWxsKTsNCi0gICAgICAgIEJvb2xlYW4gbG9jYWxNZXRob2QgPSBRZG94SGVscGVyLmdldEJvb2xlYW4oY2xhenosICJsb2NhbE1ldGhvZCIscHJvcHMsbnVsbCk7DQotICAgICAgICBCb29sZWFuIHNldE1ldGhvZCA9IFFkb3hIZWxwZXIuZ2V0Qm9vbGVhbihjbGF6eiwgInNldE1ldGhvZCIscHJvcHMsbnVsbCk7DQotICAgICAgICBTdHJpbmcgbG9jYWxNZXRob2RTY29wZSA9IFFkb3hIZWxwZXIuZ2V0U3RyaW5nKGNsYXp6LCAibG9jYWxNZXRob2RTY29wZSIscHJvcHMsbnVsbCk7DQotICAgICAgICBTdHJpbmcgc2V0TWV0aG9kU2NvcGUgPSBRZG94SGVscGVyLmdldFN0cmluZyhjbGF6eiwgInNldE1ldGhvZFNjb3BlIixwcm9wcyxudWxsKTsNCi0gICAgICAgIEJvb2xlYW4gaW5oZXJpdGVkVGFnID0gUWRveEhlbHBlci5nZXRCb29sZWFuKGNsYXp6LCAiaW5oZXJpdGVkVGFnIixwcm9wcyxudWxsKTsNCi0NCi0gICAgICAgIFN0cmluZyBsb25nRGVzY3JpcHRpb24gPSBjdHguZ2V0Q29tbWVudCgpOw0KLSAgICAgICAgU3RyaW5nIGRlc2NEZmx0ID0gUWRveEhlbHBlci5nZXRGaXJzdFNlbnRlbmNlKGxvbmdEZXNjcmlwdGlvbik7DQotICAgICAgICBpZiAoKGRlc2NEZmx0ID09IG51bGwpIHx8IChkZXNjRGZsdC5sZW5ndGgoKSA8IDIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGRlc2NEZmx0ID0gIm5vIGRlc2NyaXB0aW9uIjsNCi0gICAgICAgIH0NCi0gICAgICAgIFN0cmluZyBzaG9ydERlc2NyaXB0aW9uID0gUWRveEhlbHBlci5nZXRTdHJpbmcoY2xhenosICJkZXNjIiwgcHJvcHMsIGRlc2NEZmx0KTsNCi0gICAgICAgIFN0cmluZyByZXR1cm5TaWduYXR1cmUgPSBRZG94SGVscGVyLmdldFN0cmluZyhjbGF6eiwgInJldHVyblNpZ25hdHVyZSIsIHByb3BzLCBudWxsKTsNCi0gICAgICAgIFN0cmluZyBtZXRob2RTaWduYXR1cmUgPSBRZG94SGVscGVyLmdldFN0cmluZyhjbGF6eiwgIm1ldGhvZFNpZ25hdHVyZSIsIHByb3BzLCBudWxsKTsNCi0gICAgICAgIFN0cmluZyBkZWZhdWx0VmFsdWUgPSBRZG94SGVscGVyLmdldFN0cmluZyhjbGF6eiwiZGVmYXVsdFZhbHVlIixwcm9wcyxudWxsKTsNCi0gICAgICAgIFN0cmluZyBqc3BOYW1lID0gUWRveEhlbHBlci5nZXRTdHJpbmcoY2xhenosImpzcE5hbWUiLHByb3BzLG51bGwpOw0KLSAgICAgICAgQm9vbGVhbiBydGV4cHJ2YWx1ZSA9IFFkb3hIZWxwZXIuZ2V0Qm9vbGVhbihjbGF6eiwgInJ0ZXhwcnZhbHVlIixwcm9wcyxudWxsKTsNCi0gICAgICAgIFN0cmluZyBjbGllbnRFdmVudCA9IFFkb3hIZWxwZXIuZ2V0U3RyaW5nKGNsYXp6LCAiY2xpZW50RXZlbnQiLHByb3BzLG51bGwpOw0KLSAgICAgICAgU3RyaW5nIGRlZmVycmVkVmFsdWVUeXBlID0gUWRveEhlbHBlci5nZXRTdHJpbmcoY2xhenosICJkZWZlcnJlZFZhbHVlVHlwZSIsIHByb3BzLCBudWxsKTsNCi0gICAgICAgIEJvb2xlYW4gZmFjZWxldHNPbmx5ID0gUWRveEhlbHBlci5nZXRCb29sZWFuKGNsYXp6LCAiZmFjZWxldHNPbmx5IiwgcHJvcHMsIG51bGwpOw0KLQ0KLSAgICAgICAgVHlwZSByZXR1cm5UeXBlID0gbnVsbDsNCi0gICAgICAgIA0KLSAgICAgICAgaWYgKG1ldGhvZC5nZXROYW1lKCkuc3RhcnRzV2l0aCgic2V0IikpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuVHlwZSA9IG1ldGhvZC5nZXRQYXJhbWV0ZXJzKClbMF0uZ2V0VHlwZSgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVyblR5cGUgPSBtZXRob2QuZ2V0UmV0dXJucygpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICBTdHJpbmcgZnVsbHlRdWFsaWZpZWRSZXR1cm5UeXBlID0gcmV0dXJuVHlwZS5nZXRKYXZhQ2xhc3MoKS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKTsNCi0gICAgICAgIA0KLSAgICAgICAgZnVsbHlRdWFsaWZpZWRSZXR1cm5UeXBlID0gUWRveEhlbHBlci5nZXRGdWxseVF1YWxpZmllZENsYXNzTmFtZShjbGF6eiwgZnVsbHlRdWFsaWZpZWRSZXR1cm5UeXBlKTsNCi0gICAgICAgIA0KLSAgICAgICAgaWYgKHJldHVyblR5cGUuaXNBcnJheSgpICYmIChmdWxseVF1YWxpZmllZFJldHVyblR5cGUuaW5kZXhPZignWycpID09IC0xKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJldHVyblR5cGUuZ2V0RGltZW5zaW9ucygpO2krKykNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGZ1bGx5UXVhbGlmaWVkUmV0dXJuVHlwZSA9IGZ1bGx5UXVhbGlmaWVkUmV0dXJuVHlwZSArICJbXSI7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICBQcm9wZXJ0eU1ldGEgcCA9IG5ldyBQcm9wZXJ0eU1ldGEoKTsNCi0gICAgICAgIHAuc2V0TmFtZShRZG94SGVscGVyLm1ldGhvZFRvUHJvcE5hbWUobWV0aG9kLmdldE5hbWUoKSkpOw0KLSAgICAgICAgcC5zZXRDbGFzc05hbWUoZnVsbHlRdWFsaWZpZWRSZXR1cm5UeXBlKTsNCi0gICAgICAgIHAuc2V0UmVxdWlyZWQocmVxdWlyZWQpOw0KLSAgICAgICAgcC5zZXRUcmFuc2llbnQodHJhbnNpZW50UHJvcCk7DQotICAgICAgICBwLnNldFN0YXRlSG9sZGVyKHN0YXRlSG9sZGVyKTsNCi0gICAgICAgIHAuc2V0UGFydGlhbFN0YXRlSG9sZGVyKHBhcnRpYWxTdGF0ZUhvbGRlcik7DQotICAgICAgICBwLnNldExpdGVyYWxPbmx5KGxpdGVyYWxPbmx5KTsNCi0gICAgICAgIHAuc2V0VGFnRXhjbHVkZWQodGFnRXhjbHVkZWQpOw0KLSAgICAgICAgcC5zZXREZXNjcmlwdGlvbihzaG9ydERlc2NyaXB0aW9uKTsNCi0gICAgICAgIHAuc2V0TG9uZ0Rlc2NyaXB0aW9uKGxvbmdEZXNjcmlwdGlvbik7DQotICAgICAgICBwLnNldERlZmF1bHRWYWx1ZShkZWZhdWx0VmFsdWUpOw0KLSAgICAgICAgcC5zZXRMb2NhbE1ldGhvZChsb2NhbE1ldGhvZCk7DQotICAgICAgICBwLnNldExvY2FsTWV0aG9kU2NvcGUobG9jYWxNZXRob2RTY29wZSk7DQotICAgICAgICBwLnNldFNldE1ldGhvZChzZXRNZXRob2QpOw0KLSAgICAgICAgcC5zZXRTZXRNZXRob2RTY29wZShzZXRNZXRob2RTY29wZSk7DQotICAgICAgICBwLnNldEpzcE5hbWUoanNwTmFtZSk7DQotICAgICAgICBwLnNldFJ0ZXhwcnZhbHVlKHJ0ZXhwcnZhbHVlKTsNCi0gICAgICAgIHAuc2V0RGVmZXJyZWRWYWx1ZVR5cGUoZGVmZXJyZWRWYWx1ZVR5cGUpOw0KLSAgICAgICAgcC5zZXRDbGllbnRFdmVudChjbGllbnRFdmVudCk7DQotICAgICAgICBwLnNldEluaGVyaXRlZFRhZyhpbmhlcml0ZWRUYWcpOw0KLSAgICAgICAgcC5zZXRGYWNlbGV0c09ubHkoZmFjZWxldHNPbmx5KTsNCi0gICAgICAgIA0KLSAgICAgICAgaWYgKHJldHVyblNpZ25hdHVyZSAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIE1ldGhvZFNpZ25hdHVyZU1ldGEgc2lnbmF0dXJlID0gbmV3IE1ldGhvZFNpZ25hdHVyZU1ldGEoKTsNCi0gICAgICAgICAgICBzaWduYXR1cmUuc2V0UmV0dXJuVHlwZShyZXR1cm5TaWduYXR1cmUpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIGlmIChtZXRob2RTaWduYXR1cmUgIT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIFN0cmluZ1tdIHBhcmFtcyA9IFN0cmluZ1V0aWxzLnNwbGl0KG1ldGhvZFNpZ25hdHVyZSwnLCcpOw0KLSAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICAgaWYgKHBhcmFtcyAhPSBudWxsKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhcmFtcy5sZW5ndGg7IGkrKykNCi0gICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBzaWduYXR1cmUuYWRkUGFyYW1ldGVyVHlwZShwYXJhbXNbaV0udHJpbSgpKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBwLnNldE1ldGhvZEJpbmRpbmdTaWduYXR1cmUoc2lnbmF0dXJlKTsNCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgLy9JZiB0aGUgbWV0aG9kIGlzIGFic3RyYWN0IHRoaXMgc2hvdWxkIGJlIGdlbmVyYXRlZA0KLSAgICAgICAgaWYgKG1ldGhvZC5pc0Fic3RyYWN0KCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcC5zZXRHZW5lcmF0ZWQoQm9vbGVhbi5UUlVFKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGNvbXBvbmVudC5hZGRQcm9wZXJ0eShwKTsNCi0gICAgfQ0KLSAgICANCi0gICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NJbnRlcmZhY2VDb21wb25lbnRQcm9wZXJ0eShNYXAgcHJvcHMsIEFic3RyYWN0SmF2YUVudGl0eSBjdHgsDQotICAgICAgICAgICAgSmF2YUNsYXNzIGNsYXp6LCBKYXZhTWV0aG9kIG1ldGhvZCwgUHJvcGVydHlIb2xkZXIgY29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICB0aGlzLnByb2Nlc3NDb21wb25lbnRQcm9wZXJ0eShwcm9wcywgY3R4LCBjbGF6eiwgbWV0aG9kLCBjb21wb25lbnQpOw0KLSAgICAgICAgDQotICAgICAgICBQcm9wZXJ0eU1ldGEgcHJvcGVydHkgPSBjb21wb25lbnQuZ2V0UHJvcGVydHkoUWRveEhlbHBlci5tZXRob2RUb1Byb3BOYW1lKG1ldGhvZC5nZXROYW1lKCkpKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy9UcnkgdG8gZ2V0IHRoZSBtZXRob2QgZnJvbSB0aGUgY29tcG9uZW50IGNsYXp6IHRvIHNlZSBpZiB0aGlzDQotICAgICAgICAvL2hhcyBhbiBpbXBsZW1lbnRhdGlvbg0KLSAgICAgICAgSmF2YU1ldGhvZCBjbGF6ek1ldGhvZCA9IGNsYXp6LmdldE1ldGhvZEJ5U2lnbmF0dXJlKG1ldGhvZC5nZXROYW1lKCksIG51bGwgLCBmYWxzZSk7DQotICAgICAgICANCi0gICAgICAgIGlmIChjbGF6ek1ldGhvZCA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIC8vVGhlIG1ldGhvZCBzaG91bGQgYmUgZ2VuZXJhdGVkIQ0KLSAgICAgICAgICAgIHByb3BlcnR5LnNldEdlbmVyYXRlZChCb29sZWFuLlRSVUUpOw0KLSAgICAgICAgfSAgICAgICAgICAgIA0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzQ29tcG9uZW50SnNwUHJvcGVydHkoTWFwIHByb3BzLCBBYnN0cmFjdEphdmFFbnRpdHkgY3R4LA0KLSAgICAgICAgICAgIEphdmFDbGFzcyBjbGF6eiwgUHJvcGVydHlIb2xkZXIgY29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICBCb29sZWFuIHJlcXVpcmVkID0gUWRveEhlbHBlci5nZXRCb29sZWFuKGNsYXp6LCAicmVxdWlyZWQiLCBwcm9wcywgbnVsbCk7DQotICAgICAgICBCb29sZWFuIHRyYW5zaWVudFByb3AgPSBRZG94SGVscGVyLmdldEJvb2xlYW4oY2xhenosICJ0cmFuc2llbnQiLCBwcm9wcywgbnVsbCk7DQotICAgICAgICBCb29sZWFuIHN0YXRlSG9sZGVyID0gUWRveEhlbHBlci5nZXRCb29sZWFuKGNsYXp6LCAic3RhdGVIb2xkZXIiLCBwcm9wcywgbnVsbCk7DQotICAgICAgICBCb29sZWFuIGxpdGVyYWxPbmx5ID0gUWRveEhlbHBlci5nZXRCb29sZWFuKGNsYXp6LCAibGl0ZXJhbE9ubHkiLCBwcm9wcywgbnVsbCk7DQotICAgICAgICBCb29sZWFuIHRhZ0V4Y2x1ZGVkID0gUWRveEhlbHBlci5nZXRCb29sZWFuKGNsYXp6LCAidGFnRXhjbHVkZWQiLCBwcm9wcywgbnVsbCk7DQotICAgICAgICBCb29sZWFuIGluaGVyaXRlZFRhZyA9IFFkb3hIZWxwZXIuZ2V0Qm9vbGVhbihjbGF6eiwgImluaGVyaXRlZFRhZyIsIHByb3BzLCBudWxsKTsNCi0NCi0gICAgICAgIFN0cmluZyBsb25nRGVzY3JpcHRpb24gPSBRZG94SGVscGVyLmdldFN0cmluZyhjbGF6eiwgImxvbmdEZXNjIiwgcHJvcHMsIG51bGwpOw0KLSAgICAgICAgDQotICAgICAgICBTdHJpbmcgZGVzY0RmbHQgPSBsb25nRGVzY3JpcHRpb247DQotICAgICAgICBpZiAoKGRlc2NEZmx0ID09IG51bGwpIHx8IChkZXNjRGZsdC5sZW5ndGgoKSA8IDIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGRlc2NEZmx0ID0gIm5vIGRlc2NyaXB0aW9uIjsNCi0gICAgICAgIH0NCi0gICAgICAgIFN0cmluZyBzaG9ydERlc2NyaXB0aW9uID0gUWRveEhlbHBlci5nZXRTdHJpbmcoY2xhenosICJkZXNjIiwgcHJvcHMsIGRlc2NEZmx0KTsNCi0gICAgICAgIFN0cmluZyByZXR1cm5UeXBlID0gUWRveEhlbHBlci5nZXRTdHJpbmcoY2xhenosICJyZXR1cm5UeXBlIiwgcHJvcHMsIG51bGwpOw0KLSAgICAgICAgU3RyaW5nIG5hbWUgPSBRZG94SGVscGVyLmdldFN0cmluZyhjbGF6eiwgIm5hbWUiLCBwcm9wcywgbnVsbCk7DQotICAgICAgICANCi0gICAgICAgIFByb3BlcnR5TWV0YSBwID0gbmV3IFByb3BlcnR5TWV0YSgpOw0KLSAgICAgICAgcC5zZXROYW1lKG5hbWUpOw0KLSAgICAgICAgcC5zZXRDbGFzc05hbWUocmV0dXJuVHlwZSk7DQotICAgICAgICBwLnNldFJlcXVpcmVkKHJlcXVpcmVkKTsNCi0gICAgICAgIHAuc2V0VHJhbnNpZW50KHRyYW5zaWVudFByb3ApOw0KLSAgICAgICAgcC5zZXRTdGF0ZUhvbGRlcihzdGF0ZUhvbGRlcik7DQotICAgICAgICBwLnNldExpdGVyYWxPbmx5KGxpdGVyYWxPbmx5KTsNCi0gICAgICAgIHAuc2V0VGFnRXhjbHVkZWQodGFnRXhjbHVkZWQpOw0KLSAgICAgICAgcC5zZXRJbmhlcml0ZWRUYWcoaW5oZXJpdGVkVGFnKTsNCi0gICAgICAgIHAuc2V0RGVzY3JpcHRpb24oc2hvcnREZXNjcmlwdGlvbik7DQotICAgICAgICBwLnNldExvbmdEZXNjcmlwdGlvbihsb25nRGVzY3JpcHRpb24pOw0KLSAgICAgICAgcC5zZXRHZW5lcmF0ZWQoQm9vbGVhbi5GQUxTRSk7DQotICAgICAgICBjb21wb25lbnQuYWRkUHJvcGVydHkocCk7DQotICAgIH0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9xZG94L3BhcnNlL0NsaWVudEJlaGF2aW9yUGFyc2luZ1N0cmF0ZWd5LmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL3Fkb3gvcGFyc2UvQ2xpZW50QmVoYXZpb3JQYXJzaW5nU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZThiNWMzMS4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL3Fkb3gvcGFyc2UvQ2xpZW50QmVoYXZpb3JQYXJzaW5nU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMiArMCwwIEBACi0vKg0KLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICogDQotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqIA0KLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqICB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uYnVpbGRlci5xZG94LnBhcnNlOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmJ1aWxkZXIubW9kZWwuQ2xpZW50QmVoYXZpb3JNZXRhOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmJ1aWxkZXIubW9kZWwuTW9kZWw7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uYnVpbGRlci5xZG94LlFkb3hIZWxwZXI7DQotDQotaW1wb3J0IGNvbS50aG91Z2h0d29ya3MucWRveC5tb2RlbC5BYnN0cmFjdEphdmFFbnRpdHk7DQotaW1wb3J0IGNvbS50aG91Z2h0d29ya3MucWRveC5tb2RlbC5Bbm5vdGF0aW9uOw0KLWltcG9ydCBjb20udGhvdWdodHdvcmtzLnFkb3gubW9kZWwuRG9jbGV0VGFnOw0KLWltcG9ydCBjb20udGhvdWdodHdvcmtzLnFkb3gubW9kZWwuSmF2YUNsYXNzOw0KLWltcG9ydCBjb20udGhvdWdodHdvcmtzLnFkb3gubW9kZWwuSmF2YUZpZWxkOw0KLQ0KLS8qKg0KLSAqIA0KLSAqIEBhdXRob3IgTGVvbmFyZG8gVXJpYmUNCi0gKiBAc2luY2UgMS4wLjkNCi0gKg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBDbGllbnRCZWhhdmlvclBhcnNpbmdTdHJhdGVneSBleHRlbmRzIENsYXNzTWV0YVByb3BlcnR5UGFyc2luZ1N0cmF0ZWd5DQotew0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRE9DX0NMSUVOVF9CRUhBVklPUiA9ICJKU0ZDbGllbnRCZWhhdmlvciI7DQotDQotICAgIHB1YmxpYyB2b2lkIHBhcnNlQ2xhc3MoSmF2YUNsYXNzIGNsYXp6LCBNb2RlbCBtb2RlbCkNCi0gICAgew0KLSAgICAgICAgRG9jbGV0VGFnIHRhZzsNCi0gICAgICAgIEFubm90YXRpb24gYW5ubzsNCi0gICAgICAgIC8vIGNsaWVudCBiZWhhdmlvcnMNCi0gICAgICAgIHRhZyA9IGNsYXp6LmdldFRhZ0J5TmFtZShET0NfQ0xJRU5UX0JFSEFWSU9SLCBmYWxzZSk7DQotICAgICAgICBpZiAodGFnICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgTWFwIHByb3BzID0gdGFnLmdldE5hbWVkUGFyYW1ldGVyTWFwKCk7DQotICAgICAgICAgICAgcHJvY2Vzc0NsaWVudEJlaGF2aW9yKHByb3BzLCAoQWJzdHJhY3RKYXZhRW50aXR5KXRhZy5nZXRDb250ZXh0KCksIGNsYXp6LCBtb2RlbCk7DQotICAgICAgICB9DQotICAgICAgICBhbm5vID0gUWRveEhlbHBlci5nZXRBbm5vdGF0aW9uKGNsYXp6LCBET0NfQ0xJRU5UX0JFSEFWSU9SKTsNCi0gICAgICAgIGlmIChhbm5vICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgTWFwIHByb3BzID0gYW5uby5nZXROYW1lZFBhcmFtZXRlck1hcCgpOw0KLSAgICAgICAgICAgIHByb2Nlc3NDbGllbnRCZWhhdmlvcihwcm9wcywgKEFic3RyYWN0SmF2YUVudGl0eSlhbm5vLmdldENvbnRleHQoKSwgY2xhenosIG1vZGVsKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc0NsaWVudEJlaGF2aW9yKE1hcCBwcm9wcywgQWJzdHJhY3RKYXZhRW50aXR5IGN0eCwNCi0gICAgICAgICAgICBKYXZhQ2xhc3MgY2xhenosIE1vZGVsIG1vZGVsKQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgbG9uZ0Rlc2NyaXB0aW9uID0gY2xhenouZ2V0Q29tbWVudCgpOw0KLSAgICAgICAgU3RyaW5nIGRlc2NEZmx0ID0gUWRveEhlbHBlci5nZXRGaXJzdFNlbnRlbmNlKGxvbmdEZXNjcmlwdGlvbik7DQotICAgICAgICBpZiAoKGRlc2NEZmx0ID09IG51bGwpIHx8IChkZXNjRGZsdC5sZW5ndGgoKSA8IDIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGRlc2NEZmx0ID0gIm5vIGRlc2NyaXB0aW9uIjsNCi0gICAgICAgIH0NCi0gICAgICAgIFN0cmluZyBzaG9ydERlc2NyaXB0aW9uID0gUWRveEhlbHBlci5nZXRTdHJpbmcoY2xhenosICJkZXNjIiwgcHJvcHMsIGRlc2NEZmx0KTsNCi0NCi0gICAgICAgIFN0cmluZyBiZWhhdmlvcklkRGZsdCA9IG51bGw7DQotICAgICAgICBKYXZhRmllbGQgZmllbGRCZWhhdmlvcklkID0gY2xhenoNCi0gICAgICAgICAgICAgICAgLmdldEZpZWxkQnlOYW1lKCJCRUhBVklPUl9JRCIpOw0KLSAgICAgICAgaWYgKGZpZWxkQmVoYXZpb3JJZCAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IGZpZWxkQmVoYXZpb3JJZC5nZXRJbml0aWFsaXphdGlvbkV4cHJlc3Npb24oKTsNCi0gICAgICAgICAgICBiZWhhdmlvcklkRGZsdCA9IFFkb3hIZWxwZXIuY2xlYW4odmFsdWUuc3Vic3RyaW5nKHZhbHVlLmluZGV4T2YoJyInKSkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICBTdHJpbmcgcmVuZGVyZXJUeXBlRGZsdCA9IG51bGw7DQotICAgICAgICBKYXZhRmllbGQgZmllbGRSZW5kZXJlclR5cGUgPSBjbGF6eg0KLSAgICAgICAgICAgICAgICAuZ2V0RmllbGRCeU5hbWUoIlJFTkRFUkVSX1RZUEUiKTsNCi0gICAgICAgIGlmIChmaWVsZFJlbmRlcmVyVHlwZSAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlbmRlcmVyVHlwZURmbHQgPSBRZG94SGVscGVyLmNsZWFuKGZpZWxkUmVuZGVyZXJUeXBlDQotICAgICAgICAgICAgICAgICAgICAuZ2V0SW5pdGlhbGl6YXRpb25FeHByZXNzaW9uKCkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICBTdHJpbmcgYmVoYXZpb3JJZCA9IFFkb3hIZWxwZXIuZ2V0U3RyaW5nKGNsYXp6LCAiaWQiLCBwcm9wcywgYmVoYXZpb3JJZERmbHQpOw0KLQ0KLSAgICAgICAgLy8gQ2hlY2sgZm9yIGJvdGggImNsYXNzIiBhbmQgImNsYXp6IiBpbiBvcmRlciB0byBzdXBwb3J0DQotICAgICAgICAvLyBkb2NsZXQgYW5kIHJlYWwgYW5ub3RhdGlvbnMuDQotICAgICAgICBTdHJpbmcgY2xhc3NOYW1lT3ZlcnJpZGUgPSBRZG94SGVscGVyLmdldFN0cmluZyhjbGF6eiwgImNsYXNzIiwgcHJvcHMsIG51bGwpOw0KLSAgICAgICAgY2xhc3NOYW1lT3ZlcnJpZGUgPSBRZG94SGVscGVyLmdldFN0cmluZyhjbGF6eiwiY2xhenoiLHByb3BzLGNsYXNzTmFtZU92ZXJyaWRlKTsNCi0gICAgICAgIA0KLSAgICAgICAgU3RyaW5nIGNvbXBvbmVudE5hbWUgPSBRZG94SGVscGVyLmdldFN0cmluZyhjbGF6eiwgIm5hbWUiLCBwcm9wcywgbnVsbCk7DQotICAgICAgICBTdHJpbmcgYm9keUNvbnRlbnQgPSBRZG94SGVscGVyLmdldFN0cmluZyhjbGF6eiwgImJvZHlDb250ZW50IiwgcHJvcHMsIG51bGwpOw0KLSAgICAgICAgU3RyaW5nIHRhZ0hhbmRsZXIgPSBRZG94SGVscGVyLmdldFN0cmluZyhjbGF6eiwgInRhZ0hhbmRsZXIiLCBwcm9wcywgbnVsbCk7DQotICAgICAgICBCb29sZWFuIGNvbmZpZ0V4Y2x1ZGVkID0gUWRveEhlbHBlci5nZXRCb29sZWFuKGNsYXp6LCJjb25maWdFeGNsdWRlZCIscHJvcHMsbnVsbCk7DQotICAgICAgICBCb29sZWFuIGV2YWx1YXRlRUxPbkV4ZWN1dGlvbiA9IFFkb3hIZWxwZXIuZ2V0Qm9vbGVhbihjbGF6eiwiZXZhbHVhdGVFTE9uRXhlY3V0aW9uIixwcm9wcyxudWxsKTsNCi0gICAgICAgIFN0cmluZyByZW5kZXJlclR5cGUgPSBRZG94SGVscGVyLmdldFN0cmluZyhjbGF6eiwgInJlbmRlcmVyVHlwZSIsIHByb3BzLCByZW5kZXJlclR5cGVEZmx0KTsNCi0NCi0gICAgICAgIENsaWVudEJlaGF2aW9yTWV0YSBiZWhhdmlvciA9IG5ldyBDbGllbnRCZWhhdmlvck1ldGEoKTsNCi0gICAgICAgIGluaXRDbGFzc01ldGEobW9kZWwsIGNsYXp6LCBiZWhhdmlvciwgY2xhc3NOYW1lT3ZlcnJpZGUpOw0KLSAgICAgICAgYmVoYXZpb3Iuc2V0TmFtZShjb21wb25lbnROYW1lKTsNCi0gICAgICAgIGJlaGF2aW9yLnNldEJvZHlDb250ZW50KGJvZHlDb250ZW50KTsNCi0gICAgICAgIGJlaGF2aW9yLnNldEJlaGF2aW9ySWQoYmVoYXZpb3JJZCk7DQotICAgICAgICBiZWhhdmlvci5zZXREZXNjcmlwdGlvbihzaG9ydERlc2NyaXB0aW9uKTsNCi0gICAgICAgIGJlaGF2aW9yLnNldExvbmdEZXNjcmlwdGlvbihsb25nRGVzY3JpcHRpb24pOw0KLSAgICAgICAgYmVoYXZpb3Iuc2V0VGFnSGFuZGxlcih0YWdIYW5kbGVyKTsNCi0gICAgICAgIGJlaGF2aW9yLnNldENvbmZpZ0V4Y2x1ZGVkKGNvbmZpZ0V4Y2x1ZGVkKTsNCi0gICAgICAgIGJlaGF2aW9yLnNldEV2YWx1YXRlRUxPbkV4ZWN1dGlvbihldmFsdWF0ZUVMT25FeGVjdXRpb24pOw0KLSAgICAgICAgYmVoYXZpb3Iuc2V0UmVuZGVyZXJUeXBlKHJlbmRlcmVyVHlwZSk7DQotICAgICAgICANCi0gICAgICAgIC8vIE5vdyBoZXJlIHdhbGsgdGhlIGNvbXBvbmVudCBsb29raW5nIGZvciBwcm9wZXJ0eSBhbm5vdGF0aW9ucy4NCi0gICAgICAgIHByb2Nlc3NDb21wb25lbnRQcm9wZXJ0aWVzKGNsYXp6LCBiZWhhdmlvcik7DQotICAgICAgICANCi0gICAgICAgIG1vZGVsLmFkZEJlaGF2aW9yKGJlaGF2aW9yKTsNCi0gICAgfSAgICANCi19DQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9xZG94L3BhcnNlL0NsaWVudEJlaGF2aW9yUmVuZGVyZXJQYXJzaW5nU3RyYXRlZ3kuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvcWRveC9wYXJzZS9DbGllbnRCZWhhdmlvclJlbmRlcmVyUGFyc2luZ1N0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2YmIwMjcuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9xZG94L3BhcnNlL0NsaWVudEJlaGF2aW9yUmVuZGVyZXJQYXJzaW5nU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOCArMCwwIEBACi0vKg0KLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICogDQotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqIA0KLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqICB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uYnVpbGRlci5xZG94LnBhcnNlOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5idWlsZGVyLm1vZGVsLkNsaWVudEJlaGF2aW9yUmVuZGVyZXJNZXRhOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmJ1aWxkZXIubW9kZWwuTW9kZWw7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uYnVpbGRlci5tb2RlbC5SZW5kZXJLaXRNZXRhOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmJ1aWxkZXIucWRveC5RZG94SGVscGVyOw0KLQ0KLWltcG9ydCBjb20udGhvdWdodHdvcmtzLnFkb3gubW9kZWwuQWJzdHJhY3RKYXZhRW50aXR5Ow0KLWltcG9ydCBjb20udGhvdWdodHdvcmtzLnFkb3gubW9kZWwuQW5ub3RhdGlvbjsNCi1pbXBvcnQgY29tLnRob3VnaHR3b3Jrcy5xZG94Lm1vZGVsLkRvY2xldFRhZzsNCi1pbXBvcnQgY29tLnRob3VnaHR3b3Jrcy5xZG94Lm1vZGVsLkphdmFDbGFzczsNCi0NCi0vKioNCi0gKiANCi0gKiBAYXV0aG9yIExlb25hcmRvIFVyaWJlDQotICogQHNpbmNlIDEuMC45DQotICoNCi0gKi8NCi1wdWJsaWMgY2xhc3MgQ2xpZW50QmVoYXZpb3JSZW5kZXJlclBhcnNpbmdTdHJhdGVneSBpbXBsZW1lbnRzIEphdmFDbGFzc1BhcnNpbmdTdHJhdGVneQ0KLXsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERPQ19DTElFTlRfQkVIQVZJT1JfUkVOREVSRVIgPSAiSlNGQ2xpZW50QmVoYXZpb3JSZW5kZXJlciI7DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBET0NfQ0xJRU5UX0JFSEFWSU9SX1JFTkRFUkVSUyA9ICJKU0ZDbGllbnRCZWhhdmlvclJlbmRlcmVycyI7DQotDQotICAgIHB1YmxpYyB2b2lkIHBhcnNlQ2xhc3MoSmF2YUNsYXNzIGNsYXp6LCBNb2RlbCBtb2RlbCkNCi0gICAgew0KLSAgICAgICAgRG9jbGV0VGFnIHRhZyA9IG51bGw7DQotICAgICAgICBBbm5vdGF0aW9uIGFubm8gPSBudWxsOw0KLSAgICAgICAgLy8gcmVuZGVyZXINCi0gICAgICAgIERvY2xldFRhZyBbXSB0YWdzID0gY2xhenouZ2V0VGFnc0J5TmFtZShET0NfQ0xJRU5UX0JFSEFWSU9SX1JFTkRFUkVSLCBmYWxzZSk7DQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRhZ3MubGVuZ3RoOyBpKyspDQotICAgICAgICB7DQotICAgICAgICAgICAgdGFnID0gdGFnc1tpXTsNCi0gICAgICAgICAgICBpZiAodGFnICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBNYXAgcHJvcHMgPSB0YWcuZ2V0TmFtZWRQYXJhbWV0ZXJNYXAoKTsNCi0gICAgICAgICAgICAgICAgcHJvY2Vzc0NsaWVudEJlaGF2aW9yUmVuZGVyZXIocHJvcHMsIChBYnN0cmFjdEphdmFFbnRpdHkpdGFnLmdldENvbnRleHQoKSwgY2xhenosIG1vZGVsKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBhbm5vID0gUWRveEhlbHBlci5nZXRBbm5vdGF0aW9uKGNsYXp6LCBET0NfQ0xJRU5UX0JFSEFWSU9SX1JFTkRFUkVSKTsNCi0gICAgICAgIGlmIChhbm5vICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgTWFwIHByb3BzID0gYW5uby5nZXROYW1lZFBhcmFtZXRlck1hcCgpOw0KLSAgICAgICAgICAgIHByb2Nlc3NDbGllbnRCZWhhdmlvclJlbmRlcmVyKHByb3BzLCAoQWJzdHJhY3RKYXZhRW50aXR5KWFubm8uZ2V0Q29udGV4dCgpLCBjbGF6eiwgbW9kZWwpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgYW5ubyA9IFFkb3hIZWxwZXIuZ2V0QW5ub3RhdGlvbihjbGF6eiwgRE9DX0NMSUVOVF9CRUhBVklPUl9SRU5ERVJFUlMpOw0KLSAgICAgICAgaWYgKGFubm8gIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBPYmplY3QganNwUHJvcHMgPSBhbm5vLmdldE5hbWVkUGFyYW1ldGVyKCJyZW5kZXJlcnMiKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICBpZiAoanNwUHJvcHMgaW5zdGFuY2VvZiBBbm5vdGF0aW9uKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgQW5ub3RhdGlvbiBqc3BQcm9wZXJ0aWVzQW5ubyA9IChBbm5vdGF0aW9uKSBqc3BQcm9wczsNCi0gICAgICAgICAgICAgICAgTWFwIHByb3BzID0ganNwUHJvcGVydGllc0Fubm8uZ2V0TmFtZWRQYXJhbWV0ZXJNYXAoKTsNCi0gICAgICAgICAgICAgICAgcHJvY2Vzc0NsaWVudEJlaGF2aW9yUmVuZGVyZXIocHJvcHMsIChBYnN0cmFjdEphdmFFbnRpdHkpYW5uby5nZXRDb250ZXh0KCksIGNsYXp6LCBtb2RlbCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIExpc3QganNwUHJvcHNMaXN0ID0gKExpc3QpIGpzcFByb3BzOw0KLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGpzcFByb3BzTGlzdC5zaXplKCk7aSsrKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBBbm5vdGF0aW9uIHJhbm5vID0gKEFubm90YXRpb24pIGpzcFByb3BzTGlzdC5nZXQoaSk7DQotICAgICAgICAgICAgICAgICAgICBNYXAgcHJvcHMgPSByYW5uby5nZXROYW1lZFBhcmFtZXRlck1hcCgpOw0KLSAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc0NsaWVudEJlaGF2aW9yUmVuZGVyZXIocHJvcHMsIChBYnN0cmFjdEphdmFFbnRpdHkpYW5uby5nZXRDb250ZXh0KCksIGNsYXp6LCBtb2RlbCk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NDbGllbnRCZWhhdmlvclJlbmRlcmVyKE1hcCBwcm9wcywgQWJzdHJhY3RKYXZhRW50aXR5IGN0eCwNCi0gICAgICAgICAgICBKYXZhQ2xhc3MgY2xhenosIE1vZGVsIG1vZGVsKQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgbG9uZ0Rlc2NyaXB0aW9uID0gY2xhenouZ2V0Q29tbWVudCgpOw0KLSAgICAgICAgU3RyaW5nIGRlc2NEZmx0ID0gUWRveEhlbHBlci5nZXRGaXJzdFNlbnRlbmNlKGxvbmdEZXNjcmlwdGlvbik7DQotICAgICAgICBpZiAoKGRlc2NEZmx0ID09IG51bGwpIHx8IChkZXNjRGZsdC5sZW5ndGgoKSA8IDIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGRlc2NEZmx0ID0gIm5vIGRlc2NyaXB0aW9uIjsNCi0gICAgICAgIH0NCi0gICAgICAgIFN0cmluZyBzaG9ydERlc2NyaXB0aW9uID0gUWRveEhlbHBlci5nZXRTdHJpbmcoY2xhenosICJkZXNjIiwgcHJvcHMsIGRlc2NEZmx0KTsNCi0gICAgICAgIFN0cmluZyByZW5kZXJLaXRJZCA9IFFkb3hIZWxwZXIuZ2V0U3RyaW5nKGNsYXp6LCAicmVuZGVyS2l0SWQiLCBwcm9wcywgbnVsbCk7DQotICAgICAgICBTdHJpbmcgcmVuZGVyZXJDbGFzcyA9IFFkb3hIZWxwZXIuZ2V0U3RyaW5nKGNsYXp6LCAiY2xhc3MiLCBwcm9wcywgY2xhenoNCi0gICAgICAgICAgICAgICAgLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpKTsNCi0gICAgICAgIHJlbmRlcmVyQ2xhc3MgPSBRZG94SGVscGVyLmdldFN0cmluZyhjbGF6eiwiY2xhenoiLHByb3BzLHJlbmRlcmVyQ2xhc3MpOw0KLSAgICAgICAgU3RyaW5nIHJlbmRlcmVyVHlwZSA9IFFkb3hIZWxwZXIuZ2V0U3RyaW5nKGNsYXp6LCJ0eXBlIiwgcHJvcHMsbnVsbCk7DQotICAgICAgICBSZW5kZXJLaXRNZXRhIHJlbmRlcktpdCA9IG1vZGVsLmZpbmRSZW5kZXJLaXRCeUlkKHJlbmRlcktpdElkKTsNCi0gICAgICAgIGlmIChyZW5kZXJLaXQgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZW5kZXJLaXQgPSBuZXcgUmVuZGVyS2l0TWV0YSgpOw0KLSAgICAgICAgICAgIHJlbmRlcktpdC5zZXRSZW5kZXJLaXRJZChyZW5kZXJLaXRJZCk7DQotICAgICAgICAgICAgbW9kZWwuYWRkUmVuZGVyS2l0KHJlbmRlcktpdCk7ICAgICAgICAgICAgDQotICAgICAgICB9DQotICAgICAgICBDbGllbnRCZWhhdmlvclJlbmRlcmVyTWV0YSByZW5kZXJlciA9IG5ldyBDbGllbnRCZWhhdmlvclJlbmRlcmVyTWV0YSgpOw0KLSAgICAgICAgcmVuZGVyZXIuc2V0Q2xhc3NOYW1lKHJlbmRlcmVyQ2xhc3MpOw0KLSAgICAgICAgcmVuZGVyZXIuc2V0RGVzY3JpcHRpb24oc2hvcnREZXNjcmlwdGlvbik7DQotICAgICAgICByZW5kZXJlci5zZXRSZW5kZXJlclR5cGUocmVuZGVyZXJUeXBlKTsNCi0gICAgICAgIHJlbmRlcktpdC5hZGRDbGllbnRCZWhhdmlvclJlbmRlcmVyKHJlbmRlcmVyKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL3Fkb3gvcGFyc2UvQ29tcG9uZW50UGFyc2luZ1N0cmF0ZWd5LmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL3Fkb3gvcGFyc2UvQ29tcG9uZW50UGFyc2luZ1N0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjNjIxNTIuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9xZG94L3BhcnNlL0NvbXBvbmVudFBhcnNpbmdTdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQxICswLDAgQEAKLS8qDQotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKiANCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICogDQotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5idWlsZGVyLnFkb3gucGFyc2U7DQotDQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nLlN0cmluZ1V0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmJ1aWxkZXIubW9kZWwuQ29tcG9uZW50TWV0YTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5idWlsZGVyLm1vZGVsLkZhY2V0SG9sZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmJ1aWxkZXIubW9kZWwuRmFjZXRNZXRhOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmJ1aWxkZXIubW9kZWwuTGlzdGVuZXJIb2xkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uYnVpbGRlci5tb2RlbC5MaXN0ZW5lck1ldGE7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uYnVpbGRlci5tb2RlbC5Nb2RlbDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5idWlsZGVyLnFkb3guUWRveEhlbHBlcjsNCi0NCi1pbXBvcnQgY29tLnRob3VnaHR3b3Jrcy5xZG94Lm1vZGVsLkFic3RyYWN0SmF2YUVudGl0eTsNCi1pbXBvcnQgY29tLnRob3VnaHR3b3Jrcy5xZG94Lm1vZGVsLkFubm90YXRpb247DQotaW1wb3J0IGNvbS50aG91Z2h0d29ya3MucWRveC5tb2RlbC5Eb2NsZXRUYWc7DQotaW1wb3J0IGNvbS50aG91Z2h0d29ya3MucWRveC5tb2RlbC5KYXZhQ2xhc3M7DQotaW1wb3J0IGNvbS50aG91Z2h0d29ya3MucWRveC5tb2RlbC5KYXZhRmllbGQ7DQotaW1wb3J0IGNvbS50aG91Z2h0d29ya3MucWRveC5tb2RlbC5KYXZhTWV0aG9kOw0KLWltcG9ydCBjb20udGhvdWdodHdvcmtzLnFkb3gubW9kZWwuVHlwZTsNCi0NCi0vKioNCi0gKiANCi0gKiBAYXV0aG9yIExlb25hcmRvIFVyaWJlDQotICogQHNpbmNlIDEuMC45DQotICoNCi0gKi8NCi1wdWJsaWMgY2xhc3MgQ29tcG9uZW50UGFyc2luZ1N0cmF0ZWd5IGV4dGVuZHMgQ2xhc3NNZXRhUHJvcGVydHlQYXJzaW5nU3RyYXRlZ3kNCi17DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBET0NfRkFDRVQgPSAiSlNGRmFjZXQiOw0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRE9DX0xJU1RFTkVSID0gIkpTRkxpc3RlbmVyIjsNCi0NCi0gICAgcHVibGljIHZvaWQgcGFyc2VDbGFzcyhKYXZhQ2xhc3MgY2xhenosIE1vZGVsIG1vZGVsKQ0KLSAgICB7DQotICAgICAgICBEb2NsZXRUYWcgdGFnOw0KLSAgICAgICAgQW5ub3RhdGlvbiBhbm5vOw0KLSAgICAgICAgLy8gY29tcG9uZW50cw0KLSAgICAgICAgdGFnID0gY2xhenouZ2V0VGFnQnlOYW1lKERPQ19DT01QT05FTlQsIGZhbHNlKTsNCi0gICAgICAgIGlmICh0YWcgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBNYXAgcHJvcHMgPSB0YWcuZ2V0TmFtZWRQYXJhbWV0ZXJNYXAoKTsNCi0gICAgICAgICAgICBwcm9jZXNzQ29tcG9uZW50KHByb3BzLCAoQWJzdHJhY3RKYXZhRW50aXR5KXRhZy5nZXRDb250ZXh0KCksIGNsYXp6LCBtb2RlbCk7DQotICAgICAgICB9DQotICAgICAgICBhbm5vID0gUWRveEhlbHBlci5nZXRBbm5vdGF0aW9uKGNsYXp6LCBET0NfQ09NUE9ORU5UKTsNCi0gICAgICAgIGlmIChhbm5vICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgTWFwIHByb3BzID0gYW5uby5nZXROYW1lZFBhcmFtZXRlck1hcCgpOw0KLSAgICAgICAgICAgIHByb2Nlc3NDb21wb25lbnQocHJvcHMsIChBYnN0cmFjdEphdmFFbnRpdHkpYW5uby5nZXRDb250ZXh0KCksIGNsYXp6LCBtb2RlbCk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NDb21wb25lbnQoTWFwIHByb3BzLCBBYnN0cmFjdEphdmFFbnRpdHkgY3R4LA0KLSAgICAgICAgICAgIEphdmFDbGFzcyBjbGF6eiwgTW9kZWwgbW9kZWwpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBjb21wb25lbnRUeXBlRGZsdCA9IG51bGw7DQotICAgICAgICBKYXZhRmllbGQgZmllbGRDb21wb25lbnRUeXBlID0gY2xhenouZ2V0RmllbGRCeU5hbWUoIkNPTVBPTkVOVF9UWVBFIik7DQotICAgICAgICBpZiAoZmllbGRDb21wb25lbnRUeXBlICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgY29tcG9uZW50VHlwZURmbHQgPSBRZG94SGVscGVyLmNsZWFuKGZpZWxkQ29tcG9uZW50VHlwZQ0KLSAgICAgICAgICAgICAgICAgICAgLmdldEluaXRpYWxpemF0aW9uRXhwcmVzc2lvbigpKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIFN0cmluZyBjb21wb25lbnRUeXBlRmFtaWx5ID0gbnVsbDsNCi0gICAgICAgIEphdmFGaWVsZCBmaWVsZENvbXBvbmVudEZhbWlseSA9IGNsYXp6DQotICAgICAgICAgICAgICAgIC5nZXRGaWVsZEJ5TmFtZSgiQ09NUE9ORU5UX0ZBTUlMWSIpOw0KLSAgICAgICAgaWYgKGZpZWxkQ29tcG9uZW50RmFtaWx5ICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgY29tcG9uZW50VHlwZUZhbWlseSA9IFFkb3hIZWxwZXIuY2xlYW4oZmllbGRDb21wb25lbnRGYW1pbHkNCi0gICAgICAgICAgICAgICAgICAgIC5nZXRJbml0aWFsaXphdGlvbkV4cHJlc3Npb24oKSk7DQotICAgICAgICB9DQotDQotICAgICAgICBTdHJpbmcgcmVuZGVyZXJUeXBlRGZsdCA9IG51bGw7DQotICAgICAgICBKYXZhRmllbGQgZmllbGRSZW5kZXJlclR5cGUgPSBjbGF6eg0KLSAgICAgICAgICAgICAgICAuZ2V0RmllbGRCeU5hbWUoIkRFRkFVTFRfUkVOREVSRVJfVFlQRSIpOw0KLSAgICAgICAgaWYgKGZpZWxkUmVuZGVyZXJUeXBlICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVuZGVyZXJUeXBlRGZsdCA9IFFkb3hIZWxwZXIuY2xlYW4oZmllbGRSZW5kZXJlclR5cGUNCi0gICAgICAgICAgICAgICAgICAgIC5nZXRJbml0aWFsaXphdGlvbkV4cHJlc3Npb24oKSk7DQotICAgICAgICB9DQotDQotICAgICAgICBTdHJpbmcgY29tcG9uZW50TmFtZSA9IFFkb3hIZWxwZXIuZ2V0U3RyaW5nKGNsYXp6LCAibmFtZSIsIHByb3BzLCBudWxsKTsNCi0NCi0gICAgICAgIC8vIENoZWNrIGZvciBib3RoICJjbGFzcyIgYW5kICJjbGF6eiIgaW4gb3JkZXIgdG8gc3VwcG9ydA0KLSAgICAgICAgLy8gZG9jbGV0IGFuZCByZWFsIGFubm90YXRpb25zLg0KLSAgICAgICAgU3RyaW5nIGNsYXNzTmFtZU92ZXJyaWRlID0gUWRveEhlbHBlci5nZXRTdHJpbmcoY2xhenosICJjbGFzcyIsIHByb3BzLCBudWxsKTsNCi0gICAgICAgIGNsYXNzTmFtZU92ZXJyaWRlID0gUWRveEhlbHBlci5nZXRTdHJpbmcoY2xhenosImNsYXp6Iixwcm9wcyxjbGFzc05hbWVPdmVycmlkZSk7DQotICAgICAgICAgICAgICAgIA0KLSAgICAgICAgQm9vbGVhbiB0ZW1wbGF0ZSA9IFFkb3hIZWxwZXIuZ2V0Qm9vbGVhbihjbGF6eiwidGVtcGxhdGUiLHByb3BzLCBudWxsKTsNCi0gICAgICAgICAgICAgICAgDQotICAgICAgICBTdHJpbmcgbG9uZ0Rlc2NyaXB0aW9uID0gY2xhenouZ2V0Q29tbWVudCgpOw0KLSAgICAgICAgU3RyaW5nIGRlc2NEZmx0ID0gUWRveEhlbHBlci5nZXRGaXJzdFNlbnRlbmNlKGxvbmdEZXNjcmlwdGlvbik7DQotICAgICAgICBpZiAoKGRlc2NEZmx0ID09IG51bGwpIHx8IChkZXNjRGZsdC5sZW5ndGgoKSA8IDIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGRlc2NEZmx0ID0gIm5vIGRlc2NyaXB0aW9uIjsNCi0gICAgICAgIH0NCi0gICAgICAgIFN0cmluZyBzaG9ydERlc2NyaXB0aW9uID0gUWRveEhlbHBlci5nZXRTdHJpbmcoY2xhenosICJkZXNjIiwgcHJvcHMsIGRlc2NEZmx0KTsNCi0NCi0gICAgICAgIFN0cmluZyBib2R5Q29udGVudCA9IFFkb3hIZWxwZXIuZ2V0U3RyaW5nKGNsYXp6LCAiYm9keUNvbnRlbnQiLCBwcm9wcywgbnVsbCk7DQotICAgICAgICANCi0gICAgICAgIFN0cmluZyBjb21wb25lbnRGYW1pbHkgPSBRZG94SGVscGVyLmdldFN0cmluZyhjbGF6eiwgImZhbWlseSIsIHByb3BzLA0KLSAgICAgICAgICAgICAgICBjb21wb25lbnRUeXBlRmFtaWx5KTsNCi0gICAgICAgIFN0cmluZyBjb21wb25lbnRUeXBlID0gUWRveEhlbHBlci5nZXRTdHJpbmcoY2xhenosICJ0eXBlIiwgcHJvcHMsDQotICAgICAgICAgICAgICAgIGNvbXBvbmVudFR5cGVEZmx0KTsNCi0gICAgICAgIFN0cmluZyByZW5kZXJlclR5cGUgPSBRZG94SGVscGVyLmdldFN0cmluZyhjbGF6eiwgImRlZmF1bHRSZW5kZXJlclR5cGUiLCBwcm9wcywNCi0gICAgICAgICAgICAgICAgcmVuZGVyZXJUeXBlRGZsdCk7DQotICAgICAgICBCb29sZWFuIGNhbkhhdmVDaGlsZHJlbiA9IFFkb3hIZWxwZXIuZ2V0Qm9vbGVhbihjbGF6eiwgImNhbkhhdmVDaGlsZHJlbiIsIHByb3BzLCBudWxsKTsNCi0gICAgICAgIEJvb2xlYW4gY29uZmlnRXhjbHVkZWQgPSBRZG94SGVscGVyLmdldEJvb2xlYW4oY2xhenosImNvbmZpZ0V4Y2x1ZGVkIixwcm9wcyxudWxsKTsgICAgICAgIA0KLQ0KLSAgICAgICAgU3RyaW5nIHRhZ0NsYXNzID0gUWRveEhlbHBlci5nZXRTdHJpbmcoY2xhenosICJ0YWdDbGFzcyIsIHByb3BzLCBudWxsKTsNCi0gICAgICAgIFN0cmluZyB0YWdTdXBlcmNsYXNzID0gUWRveEhlbHBlci5nZXRTdHJpbmcoY2xhenosICJ0YWdTdXBlcmNsYXNzIiwgcHJvcHMsIG51bGwpOw0KLSAgICAgICAgU3RyaW5nIHRhZ0hhbmRsZXIgPSBRZG94SGVscGVyLmdldFN0cmluZyhjbGF6eiwgInRhZ0hhbmRsZXIiLCBwcm9wcywgbnVsbCk7DQotICAgICAgICBTdHJpbmcgZGVmYXVsdEV2ZW50TmFtZSA9IFFkb3hIZWxwZXIuZ2V0U3RyaW5nKGNsYXp6LCAiZGVmYXVsdEV2ZW50TmFtZSIsIHByb3BzLCBudWxsKTsNCi0gICAgICAgIFN0cmluZyBzZXJpYWx1aWQgPSBRZG94SGVscGVyLmdldFN0cmluZyhjbGF6eiwgInNlcmlhbHVpZCIsIHByb3BzLCBudWxsKTsNCi0gICAgICAgIFN0cmluZyBpbXBsZW1lbnRzVmFsdWUgPSBRZG94SGVscGVyLmdldFN0cmluZyhjbGF6eiwgImltcGxlbWVudHMiLCBwcm9wcywgbnVsbCk7DQotICAgICAgICBpbXBsZW1lbnRzVmFsdWUgPSBRZG94SGVscGVyLmdldFN0cmluZyhjbGF6eiwgImltcGxlbWVudHoiLCBwcm9wcywgaW1wbGVtZW50c1ZhbHVlKTsNCi0gICAgICAgIA0KLSAgICAgICAgQm9vbGVhbiBjb21wb3NpdGUgPSBRZG94SGVscGVyLmdldEJvb2xlYW4oY2xhenosICJjb21wb3NpdGUiLCBwcm9wcywgbnVsbCk7DQotDQotICAgICAgICBDb21wb25lbnRNZXRhIGNvbXBvbmVudCA9IG5ldyBDb21wb25lbnRNZXRhKCk7DQotICAgICAgICBpbml0Q2xhc3NNZXRhKG1vZGVsLCBjbGF6eiwgY29tcG9uZW50LCBjbGFzc05hbWVPdmVycmlkZSk7DQotICAgICAgICBjb21wb25lbnQuc2V0TmFtZShjb21wb25lbnROYW1lKTsNCi0gICAgICAgIGNvbXBvbmVudC5zZXRCb2R5Q29udGVudChib2R5Q29udGVudCk7DQotICAgICAgICBjb21wb25lbnQuc2V0RGVzY3JpcHRpb24oc2hvcnREZXNjcmlwdGlvbik7DQotICAgICAgICBjb21wb25lbnQuc2V0TG9uZ0Rlc2NyaXB0aW9uKGxvbmdEZXNjcmlwdGlvbik7DQotICAgICAgICBjb21wb25lbnQuc2V0Q29uZmlnRXhjbHVkZWQoY29uZmlnRXhjbHVkZWQpOw0KLSAgICAgICAgY29tcG9uZW50LnNldFR5cGUoY29tcG9uZW50VHlwZSk7DQotICAgICAgICBjb21wb25lbnQuc2V0RmFtaWx5KGNvbXBvbmVudEZhbWlseSk7DQotICAgICAgICBjb21wb25lbnQuc2V0UmVuZGVyZXJUeXBlKHJlbmRlcmVyVHlwZSk7DQotICAgICAgICBjb21wb25lbnQuc2V0Q2hpbGRyZW4oY2FuSGF2ZUNoaWxkcmVuKTsNCi0gICAgICAgIGNvbXBvbmVudC5zZXRTZXJpYWx1aWQoc2VyaWFsdWlkKTsNCi0gICAgICAgIGNvbXBvbmVudC5zZXRJbXBsZW1lbnRzKGltcGxlbWVudHNWYWx1ZSk7DQotICAgICAgICBjb21wb25lbnQuc2V0VGVtcGxhdGUodGVtcGxhdGUpOw0KLSAgICAgICAgY29tcG9uZW50LnNldERlZmF1bHRFdmVudE5hbWUoZGVmYXVsdEV2ZW50TmFtZSk7DQotICAgICAgICBpZiAoZGVmYXVsdEV2ZW50TmFtZSAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGNvbXBvbmVudC5zZXRPdmVycmlkZURlZmF1bHRFdmVudE5hbWUoQm9vbGVhbi5UUlVFKTsNCi0gICAgICAgIH0NCi0gICAgICAgIEphdmFDbGFzc1tdIGludGVyZmFjZXMgPSBjbGF6ei5nZXRJbXBsZW1lbnRlZEludGVyZmFjZXMoKTsNCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW50ZXJmYWNlcy5sZW5ndGg7ICsraSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBKYXZhQ2xhc3MgaWZhY2UgPSBpbnRlcmZhY2VzW2ldOw0KLSAgICAgICAgICAgIGlmIChpZmFjZS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKS5lcXVhbHMoDQotICAgICAgICAgICAgICAgICAgICAiamF2YXguZmFjZXMuY29tcG9uZW50Lk5hbWluZ0NvbnRhaW5lciIpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgY29tcG9uZW50LnNldE5hbWluZ0NvbnRhaW5lcihCb29sZWFuLlRSVUUpOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgaWYgKGlmYWNlLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpLmVxdWFscygNCi0gICAgICAgICAgICAgICAgICAgICJqYXZheC5mYWNlcy5jb21wb25lbnQuYmVoYXZpb3IuQ2xpZW50QmVoYXZpb3JIb2xkZXIiKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGNvbXBvbmVudC5zZXRDbGllbnRCZWhhdmlvckhvbGRlcihCb29sZWFuLlRSVUUpOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgaWYgKCEodGVtcGxhdGUgIT0gbnVsbCAmJiB0ZW1wbGF0ZS5ib29sZWFuVmFsdWUoKSkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBjb21wb25lbnQuYWRkSW1wbGVtZW50ZWRJbnRlcmZhY2VDbGFzc05hbWUoDQotICAgICAgICAgICAgICAgICAgICAgICAgUWRveEhlbHBlci5nZXRGdWxseVF1YWxpZmllZENsYXNzTmFtZShpZmFjZSwgaWZhY2UuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkpKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBpZiAoaW1wbGVtZW50c1ZhbHVlICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKFN0cmluZ1V0aWxzLmNvbnRhaW5zKGltcGxlbWVudHNWYWx1ZSwgImphdmF4LmZhY2VzLmNvbXBvbmVudC5iZWhhdmlvci5DbGllbnRCZWhhdmlvckhvbGRlciIpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgY29tcG9uZW50LnNldENsaWVudEJlaGF2aW9ySG9sZGVyKEJvb2xlYW4uVFJVRSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIFN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoaW1wbGVtZW50c1ZhbHVlLCIsIik7DQotICAgICAgICAgICAgd2hpbGUgKHN0Lmhhc01vcmVUb2tlbnMoKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGNvbXBvbmVudC5hZGRJbXBsZW1lbnRlZEludGVyZmFjZUNsYXNzTmFtZShzdC5uZXh0VG9rZW4oKSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgY29tcG9uZW50LnNldFRhZ0NsYXNzKHRhZ0NsYXNzKTsNCi0gICAgICAgIGNvbXBvbmVudC5zZXRUYWdTdXBlcmNsYXNzKHRhZ1N1cGVyY2xhc3MpOw0KLSAgICAgICAgY29tcG9uZW50LnNldFRhZ0hhbmRsZXIodGFnSGFuZGxlcik7DQotICAgICAgICBjb21wb25lbnQuc2V0Q29tcG9zaXRlKGNvbXBvc2l0ZSk7DQotDQotICAgICAgICAvLyBOb3cgaGVyZSB3YWxrIHRoZSBjb21wb25lbnQgbG9va2luZyBmb3IgcHJvcGVydHkgYW5ub3RhdGlvbnMuDQotICAgICAgICBwcm9jZXNzQ29tcG9uZW50UHJvcGVydGllcyhjbGF6eiwgY29tcG9uZW50KTsNCi0gICAgICAgIHByb2Nlc3NDb21wb25lbnRGYWNldHMoY2xhenosIGNvbXBvbmVudCk7DQotICAgICAgICBwcm9jZXNzQ29tcG9uZW50TGlzdGVuZXJzKGNsYXp6LCBjb21wb25lbnQpOw0KLQ0KLSAgICAgICAgbW9kZWwuYWRkQ29tcG9uZW50KGNvbXBvbmVudCk7DQotICAgIH0NCi0gICAgDQotICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzQ29tcG9uZW50RmFjZXRzKEphdmFDbGFzcyBjbGF6eiwNCi0gICAgICAgICAgICBGYWNldEhvbGRlciBjb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIEphdmFNZXRob2RbXSBtZXRob2RzID0gY2xhenouZ2V0TWV0aG9kcygpOw0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtZXRob2RzLmxlbmd0aDsgKytpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIEphdmFNZXRob2QgbWV0aG9kID0gbWV0aG9kc1tpXTsNCi0NCi0gICAgICAgICAgICBEb2NsZXRUYWcgdGFnID0gbWV0aG9kLmdldFRhZ0J5TmFtZShET0NfRkFDRVQpOw0KLSAgICAgICAgICAgIGlmICh0YWcgIT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIE1hcCBwcm9wcyA9IHRhZy5nZXROYW1lZFBhcmFtZXRlck1hcCgpOw0KLSAgICAgICAgICAgICAgICBwcm9jZXNzQ29tcG9uZW50RmFjZXQocHJvcHMsIChBYnN0cmFjdEphdmFFbnRpdHkpdGFnLmdldENvbnRleHQoKSwgY2xhenosDQotICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kLCBjb21wb25lbnQpOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBBbm5vdGF0aW9uIGFubm8gPSBRZG94SGVscGVyLmdldEFubm90YXRpb24obWV0aG9kLCBET0NfRkFDRVQpOw0KLSAgICAgICAgICAgIGlmIChhbm5vICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBNYXAgcHJvcHMgPSBhbm5vLmdldE5hbWVkUGFyYW1ldGVyTWFwKCk7DQotICAgICAgICAgICAgICAgIHByb2Nlc3NDb21wb25lbnRGYWNldChwcm9wcywgKEFic3RyYWN0SmF2YUVudGl0eSlhbm5vLmdldENvbnRleHQoKSwgY2xhenosDQotICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kLCBjb21wb25lbnQpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgVHlwZSBbXSBpbnRlcmZhY2VzID0gY2xhenouZ2V0SW1wbGVtZW50cygpOw0KLSAgICAgICAgDQotICAgICAgICAvL1NjYW4gaW50ZXJmYWNlcyBmb3IgcHJvcGVydGllcyB0byBiZSBhZGRlZCB0byB0aGlzIGNvbXBvbmVudA0KLSAgICAgICAgLy9UaGlzIGZlYXR1cmUgYWxsb3cgdXMgdG8gaGF2ZSBncm91cHMgb2YgZnVuY3Rpb25zLg0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbnRlcmZhY2VzLmxlbmd0aDsrK2kpDQotICAgICAgICB7DQotICAgICAgICAgICAgSmF2YUNsYXNzIGludGYgPSBpbnRlcmZhY2VzW2ldLmdldEphdmFDbGFzcygpOw0KLQ0KLSAgICAgICAgICAgIC8vSWYgdGhlIGludGVyZmFjZXMgaGFzIGEgSlNGQ29tcG9uZW50IERvY2xldCwNCi0gICAgICAgICAgICAvL3RoaXMgaXMgbWFuYWdlZCBpbiBvdGhlciB3YXkNCi0gICAgICAgICAgICBpZiAoaW50Zi5nZXRUYWdCeU5hbWUoRE9DX0NPTVBPTkVOVCwgZmFsc2UpID09IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBKYXZhTWV0aG9kW10gaW50Zm1ldGhvZHMgPSBpbnRmLmdldE1ldGhvZHMoKTsNCi0gICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBpbnRmbWV0aG9kcy5sZW5ndGg7ICsraikNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgSmF2YU1ldGhvZCBpbnRmbWV0aG9kID0gaW50Zm1ldGhvZHNbal07DQotDQotICAgICAgICAgICAgICAgICAgICBEb2NsZXRUYWcgdGFnID0gaW50Zm1ldGhvZC5nZXRUYWdCeU5hbWUoRE9DX0ZBQ0VUKTsNCi0gICAgICAgICAgICAgICAgICAgIGlmICh0YWcgIT0gbnVsbCkNCi0gICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBNYXAgcHJvcHMgPSB0YWcuZ2V0TmFtZWRQYXJhbWV0ZXJNYXAoKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzSW50ZXJmYWNlQ29tcG9uZW50RmFjZXQocHJvcHMsIChBYnN0cmFjdEphdmFFbnRpdHkpdGFnLmdldENvbnRleHQoKSwgDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGF6eiwgaW50Zm1ldGhvZCwgY29tcG9uZW50KTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgICAgIEFubm90YXRpb24gYW5ubyA9IFFkb3hIZWxwZXIuZ2V0QW5ub3RhdGlvbihpbnRmbWV0aG9kLCBET0NfRkFDRVQpOw0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGFubm8gIT0gbnVsbCkNCi0gICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBNYXAgcHJvcHMgPSBhbm5vLmdldE5hbWVkUGFyYW1ldGVyTWFwKCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc0ludGVyZmFjZUNvbXBvbmVudEZhY2V0KHByb3BzLCAoQWJzdHJhY3RKYXZhRW50aXR5KWFubm8uZ2V0Q29udGV4dCgpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhenosIGludGZtZXRob2QsIGNvbXBvbmVudCk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0gICAgDQotICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzSW50ZXJmYWNlQ29tcG9uZW50RmFjZXQoTWFwIHByb3BzLCBBYnN0cmFjdEphdmFFbnRpdHkgY3R4LA0KLSAgICAgICAgICAgIEphdmFDbGFzcyBjbGF6eiwgSmF2YU1ldGhvZCBtZXRob2QsIEZhY2V0SG9sZGVyIGNvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgdGhpcy5wcm9jZXNzQ29tcG9uZW50RmFjZXQocHJvcHMsIGN0eCwgY2xhenosIG1ldGhvZCwgY29tcG9uZW50KTsNCi0gICAgICAgICAgICAgICAgDQotICAgICAgICBGYWNldE1ldGEgZmFjZXQgPSBjb21wb25lbnQuZ2V0RmFjZXQoUWRveEhlbHBlci5tZXRob2RUb1Byb3BOYW1lKG1ldGhvZC5nZXROYW1lKCkpKTsNCi0gICAgICAgICAgICAgICAgDQotICAgICAgICAvL1RyeSB0byBnZXQgdGhlIG1ldGhvZCBmcm9tIHRoZSBjb21wb25lbnQgY2xhenogdG8gc2VlIGlmIHRoaXMNCi0gICAgICAgIC8vaGFzIGFuIGltcGxlbWVudGF0aW9uDQotICAgICAgICBKYXZhTWV0aG9kIGNsYXp6TWV0aG9kID0gY2xhenouZ2V0TWV0aG9kQnlTaWduYXR1cmUobWV0aG9kLmdldE5hbWUoKSwgbnVsbCAsIGZhbHNlKTsNCi0gICAgICAgICAgICAgICAgDQotICAgICAgICBpZiAoY2xhenpNZXRob2QgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvL1RoZSBtZXRob2Qgc2hvdWxkIGJlIGdlbmVyYXRlZCENCi0gICAgICAgICAgICBmYWNldC5zZXRHZW5lcmF0ZWQoQm9vbGVhbi5UUlVFKTsNCi0gICAgICAgIH0gICAgICAgICAgICANCi0gICAgfQ0KLSAgICANCi0gICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NJbnRlcmZhY2VDb21wb25lbnRMaXN0ZW5lcihNYXAgcHJvcHMsIEFic3RyYWN0SmF2YUVudGl0eSBjdHgsDQotICAgICAgICAgICAgSmF2YUNsYXNzIGNsYXp6LCBKYXZhTWV0aG9kIG1ldGhvZCwgTGlzdGVuZXJIb2xkZXIgY29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICB0aGlzLnByb2Nlc3NDb21wb25lbnRMaXN0ZW5lcihwcm9wcywgY3R4LCBjbGF6eiwgbWV0aG9kLCBjb21wb25lbnQpOw0KLSAgICAgICAgICAgICAgICANCi0gICAgICAgIExpc3RlbmVyTWV0YSBsaXN0ZW5lciA9IGNvbXBvbmVudC5nZXRMaXN0ZW5lcihRZG94SGVscGVyLm1ldGhvZFRvUHJvcE5hbWUobWV0aG9kLmdldE5hbWUoKSkpOw0KLSAgICAgICAgICAgICAgICANCi0gICAgICAgIC8vVHJ5IHRvIGdldCB0aGUgbWV0aG9kIGZyb20gdGhlIGNvbXBvbmVudCBjbGF6eiB0byBzZWUgaWYgdGhpcw0KLSAgICAgICAgLy9oYXMgYW4gaW1wbGVtZW50YXRpb24NCi0gICAgICAgIEphdmFNZXRob2QgY2xhenpNZXRob2QgPSBjbGF6ei5nZXRNZXRob2RCeVNpZ25hdHVyZShtZXRob2QuZ2V0TmFtZSgpLCBudWxsICwgZmFsc2UpOw0KLSAgICAgICAgICAgICAgICANCi0gICAgICAgIGlmIChjbGF6ek1ldGhvZCA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIC8vVGhlIG1ldGhvZCBzaG91bGQgYmUgZ2VuZXJhdGVkIQ0KLSAgICAgICAgICAgIGxpc3RlbmVyLnNldEdlbmVyYXRlZChCb29sZWFuLlRSVUUpOw0KLSAgICAgICAgfSAgICAgICAgICAgIA0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzQ29tcG9uZW50TGlzdGVuZXJzKEphdmFDbGFzcyBjbGF6eiwNCi0gICAgICAgICAgICBMaXN0ZW5lckhvbGRlciBjb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIEphdmFNZXRob2RbXSBtZXRob2RzID0gY2xhenouZ2V0TWV0aG9kcygpOw0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtZXRob2RzLmxlbmd0aDsgKytpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIEphdmFNZXRob2QgbWV0aG9kID0gbWV0aG9kc1tpXTsNCi0NCi0gICAgICAgICAgICBEb2NsZXRUYWcgdGFnID0gbWV0aG9kLmdldFRhZ0J5TmFtZShET0NfTElTVEVORVIpOw0KLSAgICAgICAgICAgIGlmICh0YWcgIT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIE1hcCBwcm9wcyA9IHRhZy5nZXROYW1lZFBhcmFtZXRlck1hcCgpOw0KLSAgICAgICAgICAgICAgICBwcm9jZXNzQ29tcG9uZW50TGlzdGVuZXIocHJvcHMsIChBYnN0cmFjdEphdmFFbnRpdHkpdGFnLmdldENvbnRleHQoKSwgY2xhenosDQotICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kLCBjb21wb25lbnQpOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBBbm5vdGF0aW9uIGFubm8gPSBRZG94SGVscGVyLmdldEFubm90YXRpb24obWV0aG9kLCBET0NfTElTVEVORVIpOw0KLSAgICAgICAgICAgIGlmIChhbm5vICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBNYXAgcHJvcHMgPSBhbm5vLmdldE5hbWVkUGFyYW1ldGVyTWFwKCk7DQotICAgICAgICAgICAgICAgIHByb2Nlc3NDb21wb25lbnRMaXN0ZW5lcihwcm9wcywgKEFic3RyYWN0SmF2YUVudGl0eSlhbm5vLmdldENvbnRleHQoKSwgY2xhenosDQotICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kLCBjb21wb25lbnQpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgVHlwZSBbXSBpbnRlcmZhY2VzID0gY2xhenouZ2V0SW1wbGVtZW50cygpOw0KLSAgICAgICAgDQotICAgICAgICAvL1NjYW4gaW50ZXJmYWNlcyBmb3IgcHJvcGVydGllcyB0byBiZSBhZGRlZCB0byB0aGlzIGNvbXBvbmVudA0KLSAgICAgICAgLy9UaGlzIGZlYXR1cmUgYWxsb3cgdXMgdG8gaGF2ZSBncm91cHMgb2YgZnVuY3Rpb25zLg0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbnRlcmZhY2VzLmxlbmd0aDsrK2kpDQotICAgICAgICB7DQotICAgICAgICAgICAgSmF2YUNsYXNzIGludGYgPSBpbnRlcmZhY2VzW2ldLmdldEphdmFDbGFzcygpOw0KLQ0KLSAgICAgICAgICAgIC8vSWYgdGhlIGludGVyZmFjZXMgaGFzIGEgSlNGQ29tcG9uZW50IERvY2xldCwNCi0gICAgICAgICAgICAvL3RoaXMgaXMgbWFuYWdlZCBpbiBvdGhlciB3YXkNCi0gICAgICAgICAgICBpZiAoaW50Zi5nZXRUYWdCeU5hbWUoRE9DX0NPTVBPTkVOVCwgZmFsc2UpID09IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBKYXZhTWV0aG9kW10gaW50Zm1ldGhvZHMgPSBpbnRmLmdldE1ldGhvZHMoKTsNCi0gICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBpbnRmbWV0aG9kcy5sZW5ndGg7ICsraikNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgSmF2YU1ldGhvZCBpbnRmbWV0aG9kID0gaW50Zm1ldGhvZHNbal07DQotDQotICAgICAgICAgICAgICAgICAgICBEb2NsZXRUYWcgdGFnID0gaW50Zm1ldGhvZC5nZXRUYWdCeU5hbWUoRE9DX0xJU1RFTkVSKTsNCi0gICAgICAgICAgICAgICAgICAgIGlmICh0YWcgIT0gbnVsbCkNCi0gICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBNYXAgcHJvcHMgPSB0YWcuZ2V0TmFtZWRQYXJhbWV0ZXJNYXAoKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzSW50ZXJmYWNlQ29tcG9uZW50TGlzdGVuZXIocHJvcHMsIChBYnN0cmFjdEphdmFFbnRpdHkpdGFnLmdldENvbnRleHQoKSwgDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGF6eiwgaW50Zm1ldGhvZCwgY29tcG9uZW50KTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgICAgIEFubm90YXRpb24gYW5ubyA9IFFkb3hIZWxwZXIuZ2V0QW5ub3RhdGlvbihpbnRmbWV0aG9kLCBET0NfTElTVEVORVIpOw0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGFubm8gIT0gbnVsbCkNCi0gICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBNYXAgcHJvcHMgPSBhbm5vLmdldE5hbWVkUGFyYW1ldGVyTWFwKCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc0ludGVyZmFjZUNvbXBvbmVudExpc3RlbmVyKHByb3BzLCAoQWJzdHJhY3RKYXZhRW50aXR5KWFubm8uZ2V0Q29udGV4dCgpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhenosIGludGZtZXRob2QsIGNvbXBvbmVudCk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0gICAgDQotICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzQ29tcG9uZW50RmFjZXQoTWFwIHByb3BzLCBBYnN0cmFjdEphdmFFbnRpdHkgY3R4LA0KLSAgICAgICAgICAgIEphdmFDbGFzcyBjbGF6eiwgSmF2YU1ldGhvZCBtZXRob2QsIEZhY2V0SG9sZGVyIGNvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgQm9vbGVhbiByZXF1aXJlZCA9IFFkb3hIZWxwZXIuZ2V0Qm9vbGVhbihjbGF6eiwgInJlcXVpcmVkIiwgcHJvcHMsIG51bGwpOw0KLQ0KLSAgICAgICAgU3RyaW5nIGxvbmdEZXNjcmlwdGlvbiA9IGN0eC5nZXRDb21tZW50KCk7DQotICAgICAgICBTdHJpbmcgZGVzY0RmbHQgPSBRZG94SGVscGVyLmdldEZpcnN0U2VudGVuY2UobG9uZ0Rlc2NyaXB0aW9uKTsNCi0gICAgICAgIGlmICgoZGVzY0RmbHQgPT0gbnVsbCkgfHwgKGRlc2NEZmx0Lmxlbmd0aCgpIDwgMikpDQotICAgICAgICB7DQotICAgICAgICAgICAgZGVzY0RmbHQgPSAibm8gZGVzY3JpcHRpb24iOw0KLSAgICAgICAgfQ0KLSAgICAgICAgU3RyaW5nIHNob3J0RGVzY3JpcHRpb24gPSBRZG94SGVscGVyLmdldFN0cmluZyhjbGF6eiwgImRlc2MiLCBwcm9wcywgZGVzY0RmbHQpOw0KLSAgICAgICAgDQotICAgICAgICBGYWNldE1ldGEgcCA9IG5ldyBGYWNldE1ldGEoKTsNCi0gICAgICAgIHAuc2V0TmFtZShRZG94SGVscGVyLm1ldGhvZFRvUHJvcE5hbWUobWV0aG9kLmdldE5hbWUoKSkpOw0KLSAgICAgICAgcC5zZXRSZXF1aXJlZChyZXF1aXJlZCk7DQotICAgICAgICBwLnNldERlc2NyaXB0aW9uKHNob3J0RGVzY3JpcHRpb24pOw0KLSAgICAgICAgcC5zZXRMb25nRGVzY3JpcHRpb24obG9uZ0Rlc2NyaXB0aW9uKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy9JZiB0aGUgbWV0aG9kIGlzIGFic3RyYWN0IHRoaXMgc2hvdWxkIGJlIGdlbmVyYXRlZA0KLSAgICAgICAgaWYgKG1ldGhvZC5pc0Fic3RyYWN0KCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcC5zZXRHZW5lcmF0ZWQoQm9vbGVhbi5UUlVFKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGNvbXBvbmVudC5hZGRGYWNldChwKTsNCi0gICAgfQ0KLSAgICANCi0gICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NDb21wb25lbnRMaXN0ZW5lcihNYXAgcHJvcHMsIEFic3RyYWN0SmF2YUVudGl0eSBjdHgsDQotICAgICAgICAgICAgSmF2YUNsYXNzIGNsYXp6LCBKYXZhTWV0aG9kIG1ldGhvZCwgTGlzdGVuZXJIb2xkZXIgY29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICBCb29sZWFuIHJlcXVpcmVkID0gUWRveEhlbHBlci5nZXRCb29sZWFuKGNsYXp6LCAicmVxdWlyZWQiLCBwcm9wcywgbnVsbCk7DQotDQotICAgICAgICBTdHJpbmcgbG9uZ0Rlc2NyaXB0aW9uID0gY3R4LmdldENvbW1lbnQoKTsNCi0gICAgICAgIFN0cmluZyBkZXNjRGZsdCA9IFFkb3hIZWxwZXIuZ2V0Rmlyc3RTZW50ZW5jZShsb25nRGVzY3JpcHRpb24pOw0KLSAgICAgICAgaWYgKChkZXNjRGZsdCA9PSBudWxsKSB8fCAoZGVzY0RmbHQubGVuZ3RoKCkgPCAyKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBkZXNjRGZsdCA9ICJubyBkZXNjcmlwdGlvbiI7DQotICAgICAgICB9DQotICAgICAgICBTdHJpbmcgc2hvcnREZXNjcmlwdGlvbiA9IFFkb3hIZWxwZXIuZ2V0U3RyaW5nKGNsYXp6LCAiZGVzYyIsIHByb3BzLCBkZXNjRGZsdCk7DQotICAgICAgICANCi0gICAgICAgIFR5cGUgcmV0dXJuVHlwZSA9IG51bGw7DQotICAgICAgICANCi0gICAgICAgIGlmIChtZXRob2QuZ2V0TmFtZSgpLnN0YXJ0c1dpdGgoInNldCIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVyblR5cGUgPSBtZXRob2QuZ2V0UGFyYW1ldGVycygpWzBdLmdldFR5cGUoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm5UeXBlID0gbWV0aG9kLmdldFJldHVybnMoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgU3RyaW5nIGZ1bGx5UXVhbGlmaWVkUmV0dXJuVHlwZSA9IHJldHVyblR5cGUuZ2V0SmF2YUNsYXNzKCkuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCk7DQotICAgICAgICBmdWxseVF1YWxpZmllZFJldHVyblR5cGUgPSBRZG94SGVscGVyLmdldEZ1bGx5UXVhbGlmaWVkQ2xhc3NOYW1lKGNsYXp6LCBmdWxseVF1YWxpZmllZFJldHVyblR5cGUpOw0KLSAgICAgICAgZnVsbHlRdWFsaWZpZWRSZXR1cm5UeXBlID0gUWRveEhlbHBlci5nZXRTdHJpbmcoY2xhenosICJjbGF6eiIsIHByb3BzLCBmdWxseVF1YWxpZmllZFJldHVyblR5cGUpOw0KLSAgICAgICAgDQotICAgICAgICBTdHJpbmcgcGhhc2VzID0gUWRveEhlbHBlci5nZXRTdHJpbmcoY2xhenosICJwaGFzZXMiLCBwcm9wcywgbnVsbCk7DQotICAgICAgICBTdHJpbmcgZXZlbnRDbGFzc05hbWUgPSBRZG94SGVscGVyLmdldFN0cmluZyhjbGF6eiwgImV2ZW50IiwgcHJvcHMsIG51bGwpOw0KLSAgICAgICAgU3RyaW5nIG5hbWUgPSBRZG94SGVscGVyLmdldFN0cmluZyhjbGF6eiwgIm5hbWUiLCBwcm9wcywgUWRveEhlbHBlci5tZXRob2RUb1Byb3BOYW1lKG1ldGhvZC5nZXROYW1lKCkpKTsNCi0gICAgICAgIA0KLSAgICAgICAgTGlzdGVuZXJNZXRhIHAgPSBuZXcgTGlzdGVuZXJNZXRhKCk7DQotICAgICAgICBwLnNldE5hbWUobmFtZSk7DQotICAgICAgICBwLnNldENsYXNzTmFtZShmdWxseVF1YWxpZmllZFJldHVyblR5cGUpOw0KLSAgICAgICAgcC5zZXRFdmVudENsYXNzTmFtZShldmVudENsYXNzTmFtZSk7DQotICAgICAgICBwLnNldFJlcXVpcmVkKHJlcXVpcmVkKTsNCi0gICAgICAgIHAuc2V0RGVzY3JpcHRpb24oc2hvcnREZXNjcmlwdGlvbik7DQotICAgICAgICBwLnNldExvbmdEZXNjcmlwdGlvbihsb25nRGVzY3JpcHRpb24pOw0KLSAgICAgICAgcC5zZXRQaGFzZXMocGhhc2VzKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy9JZiB0aGUgbWV0aG9kIGlzIGFic3RyYWN0IHRoaXMgc2hvdWxkIGJlIGdlbmVyYXRlZA0KLSAgICAgICAgaWYgKG1ldGhvZC5pc0Fic3RyYWN0KCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcC5zZXRHZW5lcmF0ZWQoQm9vbGVhbi5UUlVFKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGNvbXBvbmVudC5hZGRMaXN0ZW5lcihwKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL3Fkb3gvcGFyc2UvQ29udmVydGVyUGFyc2luZ1N0cmF0ZWd5LmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL3Fkb3gvcGFyc2UvQ29udmVydGVyUGFyc2luZ1N0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwY2I5NTAuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9xZG94L3BhcnNlL0NvbnZlcnRlclBhcnNpbmdTdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE2ICswLDAgQEAKLS8qDQotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKiANCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICogDQotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5idWlsZGVyLnFkb3gucGFyc2U7DQotDQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uYnVpbGRlci5tb2RlbC5Db252ZXJ0ZXJNZXRhOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmJ1aWxkZXIubW9kZWwuTW9kZWw7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uYnVpbGRlci5xZG94LlFkb3hIZWxwZXI7DQotDQotaW1wb3J0IGNvbS50aG91Z2h0d29ya3MucWRveC5tb2RlbC5BYnN0cmFjdEphdmFFbnRpdHk7DQotaW1wb3J0IGNvbS50aG91Z2h0d29ya3MucWRveC5tb2RlbC5Bbm5vdGF0aW9uOw0KLWltcG9ydCBjb20udGhvdWdodHdvcmtzLnFkb3gubW9kZWwuRG9jbGV0VGFnOw0KLWltcG9ydCBjb20udGhvdWdodHdvcmtzLnFkb3gubW9kZWwuSmF2YUNsYXNzOw0KLWltcG9ydCBjb20udGhvdWdodHdvcmtzLnFkb3gubW9kZWwuSmF2YUZpZWxkOw0KLQ0KLS8qKg0KLSAqIA0KLSAqIEBhdXRob3IgTGVvbmFyZG8gVXJpYmUNCi0gKiBAc2luY2UgMS4wLjkNCi0gKg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBDb252ZXJ0ZXJQYXJzaW5nU3RyYXRlZ3kgZXh0ZW5kcyBDbGFzc01ldGFQcm9wZXJ0eVBhcnNpbmdTdHJhdGVneQ0KLXsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERPQ19DT05WRVJURVIgPSAiSlNGQ29udmVydGVyIjsNCi0NCi0gICAgcHVibGljIHZvaWQgcGFyc2VDbGFzcyhKYXZhQ2xhc3MgY2xhenosIE1vZGVsIG1vZGVsKQ0KLSAgICB7DQotICAgICAgICBEb2NsZXRUYWcgdGFnOw0KLSAgICAgICAgQW5ub3RhdGlvbiBhbm5vOw0KLSAgICAgICAgLy8gY29udmVydGVycw0KLSAgICAgICAgdGFnID0gY2xhenouZ2V0VGFnQnlOYW1lKERPQ19DT05WRVJURVIsIGZhbHNlKTsNCi0gICAgICAgIGlmICh0YWcgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBNYXAgcHJvcHMgPSB0YWcuZ2V0TmFtZWRQYXJhbWV0ZXJNYXAoKTsNCi0gICAgICAgICAgICBwcm9jZXNzQ29udmVydGVyKHByb3BzLCAoQWJzdHJhY3RKYXZhRW50aXR5KXRhZy5nZXRDb250ZXh0KCksIGNsYXp6LCBtb2RlbCk7DQotICAgICAgICB9DQotICAgICAgICBhbm5vID0gUWRveEhlbHBlci5nZXRBbm5vdGF0aW9uKGNsYXp6LCBET0NfQ09OVkVSVEVSKTsNCi0gICAgICAgIGlmIChhbm5vICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgTWFwIHByb3BzID0gYW5uby5nZXROYW1lZFBhcmFtZXRlck1hcCgpOw0KLSAgICAgICAgICAgIHByb2Nlc3NDb252ZXJ0ZXIocHJvcHMsIChBYnN0cmFjdEphdmFFbnRpdHkpYW5uby5nZXRDb250ZXh0KCksIGNsYXp6LCBtb2RlbCk7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgDQotICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzQ29udmVydGVyKE1hcCBwcm9wcywgQWJzdHJhY3RKYXZhRW50aXR5IGN0eCwNCi0gICAgICAgICAgICBKYXZhQ2xhc3MgY2xhenosIE1vZGVsIG1vZGVsKQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgbG9uZ0Rlc2NyaXB0aW9uID0gY2xhenouZ2V0Q29tbWVudCgpOw0KLSAgICAgICAgU3RyaW5nIGRlc2NEZmx0ID0gUWRveEhlbHBlci5nZXRGaXJzdFNlbnRlbmNlKGxvbmdEZXNjcmlwdGlvbik7DQotICAgICAgICBpZiAoKGRlc2NEZmx0ID09IG51bGwpIHx8IChkZXNjRGZsdC5sZW5ndGgoKSA8IDIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGRlc2NEZmx0ID0gIm5vIGRlc2NyaXB0aW9uIjsNCi0gICAgICAgIH0NCi0gICAgICAgIFN0cmluZyBzaG9ydERlc2NyaXB0aW9uID0gUWRveEhlbHBlci5nZXRTdHJpbmcoY2xhenosICJkZXNjIiwgcHJvcHMsIGRlc2NEZmx0KTsNCi0NCi0gICAgICAgIFN0cmluZyBjb252ZXJ0ZXJJZERmbHQgPSBudWxsOw0KLSAgICAgICAgSmF2YUZpZWxkIGZpZWxkQ29udmVydGVySWQgPSBjbGF6eg0KLSAgICAgICAgICAgICAgICAuZ2V0RmllbGRCeU5hbWUoIkNPTlZFUlRFUl9JRCIpOw0KLSAgICAgICAgaWYgKGZpZWxkQ29udmVydGVySWQgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBmaWVsZENvbnZlcnRlcklkLmdldEluaXRpYWxpemF0aW9uRXhwcmVzc2lvbigpOw0KLSAgICAgICAgICAgIGNvbnZlcnRlcklkRGZsdCA9IFFkb3hIZWxwZXIuY2xlYW4odmFsdWUuc3Vic3RyaW5nKHZhbHVlLmluZGV4T2YoJyInKSkpOw0KLSAgICAgICAgfSAgICAgICAgDQotICAgICAgICBTdHJpbmcgY29udmVydGVySWQgPSBRZG94SGVscGVyLmdldFN0cmluZyhjbGF6eiwgImlkIiwgcHJvcHMsIGNvbnZlcnRlcklkRGZsdCk7DQotDQotICAgICAgICAvLyBDaGVjayBmb3IgYm90aCAiY2xhc3MiIGFuZCAiY2xhenoiIGluIG9yZGVyIHRvIHN1cHBvcnQNCi0gICAgICAgIC8vIGRvY2xldCBhbmQgcmVhbCBhbm5vdGF0aW9ucy4NCi0gICAgICAgIFN0cmluZyBjbGFzc05hbWVPdmVycmlkZSA9IFFkb3hIZWxwZXIuZ2V0U3RyaW5nKGNsYXp6LCAiY2xhc3MiLCBwcm9wcywgbnVsbCk7DQotICAgICAgICBjbGFzc05hbWVPdmVycmlkZSA9IFFkb3hIZWxwZXIuZ2V0U3RyaW5nKGNsYXp6LCJjbGF6eiIscHJvcHMsY2xhc3NOYW1lT3ZlcnJpZGUpOw0KLSAgICAgICAgDQotICAgICAgICBTdHJpbmcgY29tcG9uZW50TmFtZSA9IFFkb3hIZWxwZXIuZ2V0U3RyaW5nKGNsYXp6LCAibmFtZSIsIHByb3BzLCBudWxsKTsNCi0gICAgICAgIFN0cmluZyBib2R5Q29udGVudCA9IFFkb3hIZWxwZXIuZ2V0U3RyaW5nKGNsYXp6LCAiYm9keUNvbnRlbnQiLCBwcm9wcywgbnVsbCk7DQotICAgICAgICBTdHJpbmcgdGFnQ2xhc3MgPSBRZG94SGVscGVyLmdldFN0cmluZyhjbGF6eiwgInRhZ0NsYXNzIiwgcHJvcHMsIG51bGwpOw0KLSAgICAgICAgU3RyaW5nIHRhZ1N1cGVyY2xhc3MgPSBRZG94SGVscGVyLmdldFN0cmluZyhjbGF6eiwgInRhZ1N1cGVyY2xhc3MiLCBwcm9wcywgbnVsbCk7DQotICAgICAgICBTdHJpbmcgdGFnSGFuZGxlciA9IFFkb3hIZWxwZXIuZ2V0U3RyaW5nKGNsYXp6LCAidGFnSGFuZGxlciIsIHByb3BzLCBudWxsKTsNCi0gICAgICAgIFN0cmluZyBzZXJpYWx1aWR0YWcgPSBRZG94SGVscGVyLmdldFN0cmluZyhjbGF6eiwgInNlcmlhbHVpZHRhZyIsIHByb3BzLCBudWxsKTsNCi0gICAgICAgIEJvb2xlYW4gY29uZmlnRXhjbHVkZWQgPSBRZG94SGVscGVyLmdldEJvb2xlYW4oY2xhenosImNvbmZpZ0V4Y2x1ZGVkIixwcm9wcyxudWxsKTsgICANCi0gICAgICAgIEJvb2xlYW4gZXZhbHVhdGVFTE9uRXhlY3V0aW9uID0gUWRveEhlbHBlci5nZXRCb29sZWFuKGNsYXp6LCJldmFsdWF0ZUVMT25FeGVjdXRpb24iLHByb3BzLG51bGwpOw0KLQ0KLSAgICAgICAgQ29udmVydGVyTWV0YSBjb252ZXJ0ZXIgPSBuZXcgQ29udmVydGVyTWV0YSgpOw0KLSAgICAgICAgaW5pdENsYXNzTWV0YShtb2RlbCwgY2xhenosIGNvbnZlcnRlciwgY2xhc3NOYW1lT3ZlcnJpZGUpOw0KLSAgICAgICAgY29udmVydGVyLnNldE5hbWUoY29tcG9uZW50TmFtZSk7DQotICAgICAgICBjb252ZXJ0ZXIuc2V0Qm9keUNvbnRlbnQoYm9keUNvbnRlbnQpOw0KLSAgICAgICAgY29udmVydGVyLnNldFRhZ0NsYXNzKHRhZ0NsYXNzKTsNCi0gICAgICAgIGNvbnZlcnRlci5zZXRUYWdTdXBlcmNsYXNzKHRhZ1N1cGVyY2xhc3MpOw0KLSAgICAgICAgY29udmVydGVyLnNldFRhZ0hhbmRsZXIodGFnSGFuZGxlcik7DQotICAgICAgICBjb252ZXJ0ZXIuc2V0Q29udmVydGVySWQoY29udmVydGVySWQpOw0KLSAgICAgICAgY29udmVydGVyLnNldERlc2NyaXB0aW9uKHNob3J0RGVzY3JpcHRpb24pOw0KLSAgICAgICAgY29udmVydGVyLnNldExvbmdEZXNjcmlwdGlvbihsb25nRGVzY3JpcHRpb24pOw0KLSAgICAgICAgY29udmVydGVyLnNldFNlcmlhbHVpZHRhZyhzZXJpYWx1aWR0YWcpOw0KLSAgICAgICAgY29udmVydGVyLnNldENvbmZpZ0V4Y2x1ZGVkKGNvbmZpZ0V4Y2x1ZGVkKTsNCi0gICAgICAgIGNvbnZlcnRlci5zZXRFdmFsdWF0ZUVMT25FeGVjdXRpb24oZXZhbHVhdGVFTE9uRXhlY3V0aW9uKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gTm93IGhlcmUgd2FsayB0aGUgY29tcG9uZW50IGxvb2tpbmcgZm9yIHByb3BlcnR5IGFubm90YXRpb25zLg0KLSAgICAgICAgcHJvY2Vzc0NvbXBvbmVudFByb3BlcnRpZXMoY2xhenosIGNvbnZlcnRlcik7DQotICAgICAgICANCi0gICAgICAgIG1vZGVsLmFkZENvbnZlcnRlcihjb252ZXJ0ZXIpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvcWRveC9wYXJzZS9GYWNlbGV0VGFnUGFyc2luZ1N0cmF0ZWd5LmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL3Fkb3gvcGFyc2UvRmFjZWxldFRhZ1BhcnNpbmdTdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNzE5MTMyLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvcWRveC9wYXJzZS9GYWNlbGV0VGFnUGFyc2luZ1N0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNDkgKzAsMCBAQAotLyoNCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqIA0KLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKiANCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmJ1aWxkZXIucWRveC5wYXJzZTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uYnVpbGRlci5tb2RlbC5BdHRyaWJ1dGVNZXRhOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmJ1aWxkZXIubW9kZWwuRmFjZWxldFRhZ01ldGE7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uYnVpbGRlci5tb2RlbC5Nb2RlbDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5idWlsZGVyLnFkb3guUWRveEhlbHBlcjsNCi0NCi1pbXBvcnQgY29tLnRob3VnaHR3b3Jrcy5xZG94Lm1vZGVsLkFic3RyYWN0SmF2YUVudGl0eTsNCi1pbXBvcnQgY29tLnRob3VnaHR3b3Jrcy5xZG94Lm1vZGVsLkFubm90YXRpb247DQotaW1wb3J0IGNvbS50aG91Z2h0d29ya3MucWRveC5tb2RlbC5Eb2NsZXRUYWc7DQotaW1wb3J0IGNvbS50aG91Z2h0d29ya3MucWRveC5tb2RlbC5KYXZhQ2xhc3M7DQotaW1wb3J0IGNvbS50aG91Z2h0d29ya3MucWRveC5tb2RlbC5KYXZhRmllbGQ7DQotaW1wb3J0IGNvbS50aG91Z2h0d29ya3MucWRveC5tb2RlbC5KYXZhTWV0aG9kOw0KLWltcG9ydCBjb20udGhvdWdodHdvcmtzLnFkb3gubW9kZWwuVHlwZTsNCi0NCi0vKioNCi0gKiANCi0gKiBAYXV0aG9yIExlb25hcmRvIFVyaWJlDQotICogQHNpbmNlIDEuMC45DQotICoNCi0gKi8NCi1wdWJsaWMgY2xhc3MgRmFjZWxldFRhZ1BhcnNpbmdTdHJhdGVneSBleHRlbmRzIENsYXNzTWV0YVBhcnNpbmdTdHJhdGVneQ0KLXsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERPQ19GQUNFTEVUX1RBRyA9ICJKU0ZGYWNlbGV0VGFnIjsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERPQ19GQUNFTEVUX1RBR1MgPSAiSlNGRmFjZWxldFRhZ3MiOw0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRE9DX0ZBQ0VMRVRfVEFHX0FUVFJJQlVURSA9ICJKU0ZGYWNlbGV0QXR0cmlidXRlIjsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERPQ19GQUNFTEVUX1RBR19BVFRSSUJVVEVTID0gIkpTRkZhY2VsZXRBdHRyaWJ1dGVzIjsNCi0NCi0gICAgcHVibGljIHZvaWQgcGFyc2VDbGFzcyhKYXZhQ2xhc3MgY2xhenosIE1vZGVsIG1vZGVsKQ0KLSAgICB7DQotICAgICAgICBEb2NsZXRUYWcgdGFnID0gbnVsbDsNCi0gICAgICAgIEFubm90YXRpb24gYW5ubyA9IG51bGw7DQotICAgICAgICAvL2ZhY2VsZXQgdGFnSGFuZGxlcg0KLSAgICAgICAgdGFnID0gY2xhenouZ2V0VGFnQnlOYW1lKERPQ19GQUNFTEVUX1RBRywgZmFsc2UpOw0KLSAgICAgICAgaWYgKHRhZyAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIE1hcCBwcm9wcyA9IHRhZy5nZXROYW1lZFBhcmFtZXRlck1hcCgpOw0KLSAgICAgICAgICAgIHByb2Nlc3NGYWNlbGV0VGFnKHByb3BzLCAoQWJzdHJhY3RKYXZhRW50aXR5KXRhZy5nZXRDb250ZXh0KCksIGNsYXp6LCBtb2RlbCk7DQotICAgICAgICB9DQotICAgICAgICBhbm5vID0gUWRveEhlbHBlci5nZXRBbm5vdGF0aW9uKGNsYXp6LCBET0NfRkFDRUxFVF9UQUcpOw0KLSAgICAgICAgaWYgKGFubm8gIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBNYXAgcHJvcHMgPSBhbm5vLmdldE5hbWVkUGFyYW1ldGVyTWFwKCk7DQotICAgICAgICAgICAgcHJvY2Vzc0ZhY2VsZXRUYWcocHJvcHMsIChBYnN0cmFjdEphdmFFbnRpdHkpYW5uby5nZXRDb250ZXh0KCksIGNsYXp6LCBtb2RlbCk7DQotICAgICAgICB9ICAgICAgICANCi0gICAgICAgIGFubm8gPSBRZG94SGVscGVyLmdldEFubm90YXRpb24oY2xhenosIERPQ19GQUNFTEVUX1RBR1MpOw0KLSAgICAgICAgaWYgKGFubm8gIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBPYmplY3QganNwUHJvcHMgPSBhbm5vLmdldE5hbWVkUGFyYW1ldGVyKCJ0YWdzIik7DQotICAgICAgICAgICAgaWYgKGpzcFByb3BzIGluc3RhbmNlb2YgQW5ub3RhdGlvbikNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIEFubm90YXRpb24ganNwUHJvcGVydGllc0Fubm8gPSAoQW5ub3RhdGlvbikganNwUHJvcHM7DQotICAgICAgICAgICAgICAgIE1hcCBwcm9wcyA9IGpzcFByb3BlcnRpZXNBbm5vLmdldE5hbWVkUGFyYW1ldGVyTWFwKCk7DQotICAgICAgICAgICAgICAgIHByb2Nlc3NGYWNlbGV0VGFnKHByb3BzLCAoQWJzdHJhY3RKYXZhRW50aXR5KWFubm8uZ2V0Q29udGV4dCgpLCBjbGF6eiwgbW9kZWwpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlbHNlDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBMaXN0IGpzcFByb3BzTGlzdCA9IChMaXN0KSBqc3BQcm9wczsNCi0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBqc3BQcm9wc0xpc3Quc2l6ZSgpO2krKykNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgQW5ub3RhdGlvbiByYW5ubyA9IChBbm5vdGF0aW9uKSBqc3BQcm9wc0xpc3QuZ2V0KGkpOw0KLSAgICAgICAgICAgICAgICAgICAgTWFwIHByb3BzID0gcmFubm8uZ2V0TmFtZWRQYXJhbWV0ZXJNYXAoKTsNCi0gICAgICAgICAgICAgICAgICAgIHByb2Nlc3NGYWNlbGV0VGFnKHByb3BzLCAoQWJzdHJhY3RKYXZhRW50aXR5KWFubm8uZ2V0Q29udGV4dCgpLCBjbGF6eiwgbW9kZWwpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfSAgICAgICAgDQotICAgIH0NCi0gICAgDQotICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzRmFjZWxldFRhZyhNYXAgcHJvcHMsIEFic3RyYWN0SmF2YUVudGl0eSBjdHgsDQotICAgICAgICAgICAgSmF2YUNsYXNzIGNsYXp6LCBNb2RlbCBtb2RlbCkNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIGxvbmdEZXNjcmlwdGlvbiA9IGNsYXp6LmdldENvbW1lbnQoKTsNCi0gICAgICAgIFN0cmluZyBkZXNjRGZsdCA9IFFkb3hIZWxwZXIuZ2V0Rmlyc3RTZW50ZW5jZShsb25nRGVzY3JpcHRpb24pOw0KLSAgICAgICAgaWYgKChkZXNjRGZsdCA9PSBudWxsKSB8fCAoZGVzY0RmbHQubGVuZ3RoKCkgPCAyKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBkZXNjRGZsdCA9ICJubyBkZXNjcmlwdGlvbiI7DQotICAgICAgICB9DQotICAgICAgICBTdHJpbmcgc2hvcnREZXNjcmlwdGlvbiA9IFFkb3hIZWxwZXIuZ2V0U3RyaW5nKGNsYXp6LCAiZGVzYyIsIHByb3BzLCBkZXNjRGZsdCk7DQotICAgICAgICANCi0gICAgICAgIGxvbmdEZXNjcmlwdGlvbiA9IFFkb3hIZWxwZXIuZ2V0U3RyaW5nKGNsYXp6LCJsb25nRGVzY3JpcHRpb24iLHByb3BzLCBsb25nRGVzY3JpcHRpb24pOw0KLQ0KLSAgICAgICAgU3RyaW5nIHRhZ05hbWUgPSBRZG94SGVscGVyLmdldFN0cmluZyhjbGF6eiwgIm5hbWUiLCBwcm9wcywgbnVsbCk7DQotICAgICAgICBTdHJpbmcgY2xhc3NOYW1lT3ZlcnJpZGUgPSBRZG94SGVscGVyLmdldFN0cmluZyhjbGF6eiwgImNsYXNzIiwgcHJvcHMsIG51bGwpOw0KLSAgICAgICAgY2xhc3NOYW1lT3ZlcnJpZGUgPSBRZG94SGVscGVyLmdldFN0cmluZyhjbGF6eiwiY2xhenoiLHByb3BzLGNsYXNzTmFtZU92ZXJyaWRlKTsNCi0gICAgICAgIA0KLSAgICAgICAgU3RyaW5nIGJvZHlDb250ZW50ID0gUWRveEhlbHBlci5nZXRTdHJpbmcoY2xhenosICJib2R5Q29udGVudCIsIHByb3BzLCAiSlNQIik7DQotICAgICAgICBTdHJpbmcgY29tcG9uZW50Q2xhc3MgPSBRZG94SGVscGVyLmdldFN0cmluZyhjbGF6eiwgImNvbXBvbmVudENsYXNzIiwgcHJvcHMsIG51bGwpOw0KLSAgICAgICAgU3RyaW5nIHRhZ0NsYXNzID0gUWRveEhlbHBlci5nZXRTdHJpbmcoY2xhenosICJ0YWdDbGFzcyIsIHByb3BzLCBudWxsKTsNCi0gICAgICAgIFN0cmluZyBjb252ZXJ0ZXJDbGFzcyA9IFFkb3hIZWxwZXIuZ2V0U3RyaW5nKGNsYXp6LCAiY29udmVydGVyQ2xhc3MiLCBwcm9wcywgbnVsbCk7DQotICAgICAgICBTdHJpbmcgdmFsaWRhdG9yQ2xhc3MgPSBRZG94SGVscGVyLmdldFN0cmluZyhjbGF6eiwgInZhbGlkYXRvckNsYXNzIiwgcHJvcHMsIG51bGwpOw0KLSAgICAgICAgU3RyaW5nIGJlaGF2aW9yQ2xhc3MgPSBRZG94SGVscGVyLmdldFN0cmluZyhjbGF6eiwgImJlaGF2aW9yQ2xhc3MiLCBwcm9wcywgbnVsbCk7DQotDQotICAgICAgICBGYWNlbGV0VGFnTWV0YSB0YWcgPSBuZXcgRmFjZWxldFRhZ01ldGEoKTsNCi0gICAgICAgIGluaXRDbGFzc01ldGEobW9kZWwsIGNsYXp6LCB0YWcsIGNsYXNzTmFtZU92ZXJyaWRlKTsNCi0gICAgICAgIHRhZy5zZXROYW1lKHRhZ05hbWUpOw0KLSAgICAgICAgdGFnLnNldEJvZHlDb250ZW50KGJvZHlDb250ZW50KTsNCi0gICAgICAgIHRhZy5zZXREZXNjcmlwdGlvbihzaG9ydERlc2NyaXB0aW9uKTsNCi0gICAgICAgIHRhZy5zZXRMb25nRGVzY3JpcHRpb24obG9uZ0Rlc2NyaXB0aW9uKTsNCi0gICAgICAgIHRhZy5zZXRDb21wb25lbnRDbGFzcyhjb21wb25lbnRDbGFzcyk7DQotICAgICAgICB0YWcuc2V0VGFnQ2xhc3ModGFnQ2xhc3MpOw0KLSAgICAgICAgdGFnLnNldENvbnZlcnRlckNsYXNzKGNvbnZlcnRlckNsYXNzKTsNCi0gICAgICAgIHRhZy5zZXRWYWxpZGF0b3JDbGFzcyh2YWxpZGF0b3JDbGFzcyk7DQotICAgICAgICB0YWcuc2V0QmVoYXZpb3JDbGFzcyhiZWhhdmlvckNsYXNzKTsNCi0gICAgICAgIA0KLSAgICAgICAgcHJvY2Vzc0ZhY2VsZXRUYWdBdHRyaWJ1dGVzKGNsYXp6LCB0YWcpOw0KLSAgICAgICAgbW9kZWwuYWRkRmFjZWxldFRhZyh0YWcpOw0KLSAgICB9DQotICAgIA0KLQ0KLSAgICANCi0gICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NGYWNlbGV0VGFnQXR0cmlidXRlcyhKYXZhQ2xhc3MgY2xhenosDQotICAgICAgICAgICAgRmFjZWxldFRhZ01ldGEgY3RhZykNCi0gICAgew0KLSAgICAgICAgSmF2YU1ldGhvZFtdIG1ldGhvZHMgPSBjbGF6ei5nZXRNZXRob2RzKCk7DQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1ldGhvZHMubGVuZ3RoOyArK2kpDQotICAgICAgICB7DQotICAgICAgICAgICAgSmF2YU1ldGhvZCBtZXRob2QgPSBtZXRob2RzW2ldOw0KLQ0KLSAgICAgICAgICAgIERvY2xldFRhZyB0YWcgPSBtZXRob2QuZ2V0VGFnQnlOYW1lKERPQ19GQUNFTEVUX1RBR19BVFRSSUJVVEUpOw0KLSAgICAgICAgICAgIGlmICh0YWcgIT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIE1hcCBwcm9wcyA9IHRhZy5nZXROYW1lZFBhcmFtZXRlck1hcCgpOw0KLSAgICAgICAgICAgICAgICBwcm9jZXNzRmFjZWxldFRhZ0F0dHJpYnV0ZShwcm9wcywgKEFic3RyYWN0SmF2YUVudGl0eSl0YWcuZ2V0Q29udGV4dCgpLCBjbGF6eiwNCi0gICAgICAgICAgICAgICAgICAgICAgICBtZXRob2QsIGN0YWcpOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBBbm5vdGF0aW9uIGFubm8gPSBRZG94SGVscGVyLmdldEFubm90YXRpb24obWV0aG9kLCBET0NfRkFDRUxFVF9UQUdfQVRUUklCVVRFKTsNCi0gICAgICAgICAgICBpZiAoYW5ubyAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgTWFwIHByb3BzID0gYW5uby5nZXROYW1lZFBhcmFtZXRlck1hcCgpOw0KLSAgICAgICAgICAgICAgICBwcm9jZXNzRmFjZWxldFRhZ0F0dHJpYnV0ZShwcm9wcywgKEFic3RyYWN0SmF2YUVudGl0eSlhbm5vLmdldENvbnRleHQoKSwgY2xhenosDQotICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kLCBjdGFnKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgICAgIEphdmFGaWVsZFtdIGZpZWxkcyA9IGNsYXp6LmdldEZpZWxkcygpOw0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWVsZHMubGVuZ3RoOyArK2kpDQotICAgICAgICB7DQotICAgICAgICAgICAgSmF2YUZpZWxkIGZpZWxkID0gZmllbGRzW2ldOw0KLSAgICAgICAgICAgIERvY2xldFRhZyB0YWcgPSBmaWVsZC5nZXRUYWdCeU5hbWUoRE9DX0ZBQ0VMRVRfVEFHX0FUVFJJQlVURSk7DQotICAgICAgICAgICAgaWYgKHRhZyAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgTWFwIHByb3BzID0gdGFnLmdldE5hbWVkUGFyYW1ldGVyTWFwKCk7DQotICAgICAgICAgICAgICAgIHByb2Nlc3NGYWNlbGV0VGFnQXR0cmlidXRlKHByb3BzLCAoQWJzdHJhY3RKYXZhRW50aXR5KXRhZy5nZXRDb250ZXh0KCksIGNsYXp6LCBmaWVsZCwgY3RhZyk7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIEFubm90YXRpb24gYW5ubyA9IFFkb3hIZWxwZXIuZ2V0QW5ub3RhdGlvbihmaWVsZCwgRE9DX0ZBQ0VMRVRfVEFHX0FUVFJJQlVURSk7DQotICAgICAgICAgICAgaWYgKGFubm8gIT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIE1hcCBwcm9wcyA9IGFubm8uZ2V0TmFtZWRQYXJhbWV0ZXJNYXAoKTsNCi0gICAgICAgICAgICAgICAgcHJvY2Vzc0ZhY2VsZXRUYWdBdHRyaWJ1dGUocHJvcHMsIChBYnN0cmFjdEphdmFFbnRpdHkpYW5uby5nZXRDb250ZXh0KCksIGNsYXp6LCBmaWVsZCwgY3RhZyk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICBEb2NsZXRUYWdbXSBqc3BQcm9wZXJ0aWVzID0gY2xhenouZ2V0VGFnc0J5TmFtZShET0NfRkFDRUxFVF9UQUdfQVRUUklCVVRFKTsNCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwganNwUHJvcGVydGllcy5sZW5ndGg7ICsraSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvL1dlIGhhdmUgaGVyZSBvbmx5IGRvY2xldHMsIGJlY2F1c2UgdGhpcyBwYXJ0IGlzIG9ubHkgZm9yDQotICAgICAgICAgICAgLy9zb2x2ZSBwcm9ibGVtcyB3aXRoIGJpbmRpbmcgcHJvcGVydHkgb24gMS4xDQotICAgICAgICAgICAgRG9jbGV0VGFnIHRhZyA9IGpzcFByb3BlcnRpZXNbaV07DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgTWFwIHByb3BzID0gdGFnLmdldE5hbWVkUGFyYW1ldGVyTWFwKCk7DQotICAgICAgICAgICAgcHJvY2Vzc0ZhY2VsZXRUYWdBdHRyaWJ1dGUocHJvcHMsIChBYnN0cmFjdEphdmFFbnRpdHkpdGFnLmdldENvbnRleHQoKSwgY2xhenosDQotICAgICAgICAgICAgICAgICAgICBjdGFnKTsNCi0gICAgICAgICAgICANCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgQW5ub3RhdGlvbiBqc3BQcm9wZXJ0eUFubm8gPSBRZG94SGVscGVyLmdldEFubm90YXRpb24oY2xhenosIERPQ19GQUNFTEVUX1RBR19BVFRSSUJVVEUpOw0KLSAgICAgICAgaWYgKGpzcFByb3BlcnR5QW5ubyAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIE1hcCBwcm9wcyA9IGpzcFByb3BlcnR5QW5uby5nZXROYW1lZFBhcmFtZXRlck1hcCgpOw0KLSAgICAgICAgICAgIHByb2Nlc3NGYWNlbGV0VGFnQXR0cmlidXRlKHByb3BzLCAoQWJzdHJhY3RKYXZhRW50aXR5KWpzcFByb3BlcnR5QW5uby5nZXRDb250ZXh0KCksDQotICAgICAgICAgICAgICAgICAgICBjbGF6eiwgY3RhZyk7DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgICAgIEFubm90YXRpb24ganNwQW5ubyA9IFFkb3hIZWxwZXIuZ2V0QW5ub3RhdGlvbihjbGF6eiwgRE9DX0ZBQ0VMRVRfVEFHX0FUVFJJQlVURVMpOyAgICAgICAgDQotICAgICAgICBpZiAoanNwQW5ubyAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIE9iamVjdCBqc3BQcm9wcyA9IGpzcEFubm8uZ2V0TmFtZWRQYXJhbWV0ZXIoImF0dHJpYnV0ZXMiKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICBpZiAoanNwUHJvcHMgaW5zdGFuY2VvZiBBbm5vdGF0aW9uKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgQW5ub3RhdGlvbiBqc3BQcm9wZXJ0aWVzQW5ubyA9IChBbm5vdGF0aW9uKSBqc3BQcm9wczsNCi0gICAgICAgICAgICAgICAgTWFwIHByb3BzID0ganNwUHJvcGVydGllc0Fubm8uZ2V0TmFtZWRQYXJhbWV0ZXJNYXAoKTsNCi0gICAgICAgICAgICAgICAgcHJvY2Vzc0ZhY2VsZXRUYWdBdHRyaWJ1dGUocHJvcHMsIChBYnN0cmFjdEphdmFFbnRpdHkpanNwQW5uby5nZXRDb250ZXh0KCksIGNsYXp6LA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGN0YWcpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlbHNlDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBMaXN0IGpzcFByb3BzTGlzdCA9IChMaXN0KSBqc3BQcm9wczsNCi0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBqc3BQcm9wc0xpc3Quc2l6ZSgpO2krKykNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgQW5ub3RhdGlvbiBhbm5vID0gKEFubm90YXRpb24pIGpzcFByb3BzTGlzdC5nZXQoaSk7DQotDQotICAgICAgICAgICAgICAgICAgICBNYXAgcHJvcHMgPSBhbm5vLmdldE5hbWVkUGFyYW1ldGVyTWFwKCk7DQotICAgICAgICAgICAgICAgICAgICBwcm9jZXNzRmFjZWxldFRhZ0F0dHJpYnV0ZShwcm9wcywgKEFic3RyYWN0SmF2YUVudGl0eSlqc3BBbm5vLmdldENvbnRleHQoKSwgY2xhenosDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0YWcpOyAgICAgICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0gICAgDQotDQotICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzRmFjZWxldFRhZ0F0dHJpYnV0ZShNYXAgcHJvcHMsIEFic3RyYWN0SmF2YUVudGl0eSBjdHgsDQotICAgICAgICAgICAgSmF2YUNsYXNzIGNsYXp6LCBKYXZhTWV0aG9kIG1ldGhvZCwgRmFjZWxldFRhZ01ldGEgdGFnKQ0KLSAgICB7DQotICAgICAgICBCb29sZWFuIHJlcXVpcmVkID0gUWRveEhlbHBlci5nZXRCb29sZWFuKGNsYXp6LCAicmVxdWlyZWQiLCBwcm9wcywgbnVsbCk7DQotICAgICAgICBCb29sZWFuIHJ0ZXhwcnZhbHVlID0gUWRveEhlbHBlci5nZXRCb29sZWFuKGNsYXp6LCAicnRleHBydmFsdWUiLCBwcm9wcywgbnVsbCk7DQotDQotICAgICAgICBTdHJpbmcgbG9uZ0Rlc2NyaXB0aW9uID0gY3R4LmdldENvbW1lbnQoKTsNCi0gICAgICAgIFN0cmluZyBkZXNjRGZsdCA9IFFkb3hIZWxwZXIuZ2V0Rmlyc3RTZW50ZW5jZShsb25nRGVzY3JpcHRpb24pOw0KLSAgICAgICAgaWYgKChkZXNjRGZsdCA9PSBudWxsKSB8fCAoZGVzY0RmbHQubGVuZ3RoKCkgPCAyKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBkZXNjRGZsdCA9ICJubyBkZXNjcmlwdGlvbiI7DQotICAgICAgICB9DQotICAgICAgICBTdHJpbmcgc2hvcnREZXNjcmlwdGlvbiA9IFFkb3hIZWxwZXIuZ2V0U3RyaW5nKGNsYXp6LCAiZGVzYyIsIHByb3BzLCBkZXNjRGZsdCk7DQotICAgICAgICAgICAgICAgIA0KLSAgICAgICAgVHlwZSByZXR1cm5UeXBlID0gbnVsbDsNCi0gICAgICAgIA0KLSAgICAgICAgaWYgKG1ldGhvZC5nZXROYW1lKCkuc3RhcnRzV2l0aCgic2V0IikpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuVHlwZSA9IG1ldGhvZC5nZXRQYXJhbWV0ZXJzKClbMF0uZ2V0VHlwZSgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVyblR5cGUgPSBtZXRob2QuZ2V0UmV0dXJucygpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgU3RyaW5nIGZ1bGx5UXVhbGlmaWVkUmV0dXJuVHlwZSA9IHJldHVyblR5cGUuZ2V0SmF2YUNsYXNzKCkuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCk7DQotICAgICAgICANCi0gICAgICAgIGZ1bGx5UXVhbGlmaWVkUmV0dXJuVHlwZSA9IFFkb3hIZWxwZXIuZ2V0RnVsbHlRdWFsaWZpZWRDbGFzc05hbWUoY2xhenosZnVsbHlRdWFsaWZpZWRSZXR1cm5UeXBlKTsNCi0gICAgICAgIA0KLSAgICAgICAgaWYgKHJldHVyblR5cGUuaXNBcnJheSgpICYmIChmdWxseVF1YWxpZmllZFJldHVyblR5cGUuaW5kZXhPZignWycpID09IC0xKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJldHVyblR5cGUuZ2V0RGltZW5zaW9ucygpO2krKykNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGZ1bGx5UXVhbGlmaWVkUmV0dXJuVHlwZSA9IGZ1bGx5UXVhbGlmaWVkUmV0dXJuVHlwZSArICJbXSI7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICANCi0gICAgICAgIFN0cmluZyBjbGFzc05hbWUgPSBRZG94SGVscGVyLmdldFN0cmluZyhjbGF6eiwiY2xhc3NOYW1lIixwcm9wcywgZnVsbHlRdWFsaWZpZWRSZXR1cm5UeXBlKTsNCi0gICAgICAgIFN0cmluZyBkZWZlcnJlZFZhbHVlVHlwZSA9IFFkb3hIZWxwZXIuZ2V0U3RyaW5nKGNsYXp6LCAiZGVmZXJyZWRWYWx1ZVR5cGUiLCBwcm9wcywgbnVsbCk7DQotICAgICAgICBTdHJpbmcgZGVmZXJyZWRNZXRob2RTaWduYXR1cmUgPSBRZG94SGVscGVyLmdldFN0cmluZyhjbGF6eiwgImRlZmVycmVkTWV0aG9kU2lnbmF0dXJlIiwgcHJvcHMsIG51bGwpOw0KLSAgICAgICAgQm9vbGVhbiBleGNsdWRlID0gUWRveEhlbHBlci5nZXRCb29sZWFuKGNsYXp6LCAiZXhjbHVkZSIsIHByb3BzLCBudWxsKTsNCi0gICAgICAgIA0KLSAgICAgICAgQXR0cmlidXRlTWV0YSBhID0gbmV3IEF0dHJpYnV0ZU1ldGEoKTsNCi0gICAgICAgIGEuc2V0TmFtZShRZG94SGVscGVyLm1ldGhvZFRvUHJvcE5hbWUobWV0aG9kLmdldE5hbWUoKSkpOw0KLSAgICAgICAgYS5zZXRDbGFzc05hbWUoY2xhc3NOYW1lKTsNCi0gICAgICAgIGEuc2V0UmVxdWlyZWQocmVxdWlyZWQpOw0KLSAgICAgICAgYS5zZXRSdGV4cHJ2YWx1ZShydGV4cHJ2YWx1ZSk7DQotICAgICAgICBhLnNldERlc2NyaXB0aW9uKHNob3J0RGVzY3JpcHRpb24pOw0KLSAgICAgICAgYS5zZXRMb25nRGVzY3JpcHRpb24obG9uZ0Rlc2NyaXB0aW9uKTsNCi0gICAgICAgIGEuc2V0RGVmZXJyZWRWYWx1ZVR5cGUoZGVmZXJyZWRWYWx1ZVR5cGUpOw0KLSAgICAgICAgYS5zZXREZWZlcnJlZE1ldGhvZFNpZ25hdHVyZShkZWZlcnJlZE1ldGhvZFNpZ25hdHVyZSk7DQotICAgICAgICBhLnNldEV4Y2x1ZGUoZXhjbHVkZSk7DQotICAgICAgICANCi0gICAgICAgIHRhZy5hZGRBdHRyaWJ1dGUoYSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NGYWNlbGV0VGFnQXR0cmlidXRlKE1hcCBwcm9wcywgQWJzdHJhY3RKYXZhRW50aXR5IGN0eCwNCi0gICAgICAgICAgICBKYXZhQ2xhc3MgY2xhenosIEZhY2VsZXRUYWdNZXRhIHRhZykNCi0gICAgew0KLSAgICAgICAgQm9vbGVhbiByZXF1aXJlZCA9IFFkb3hIZWxwZXIuZ2V0Qm9vbGVhbihjbGF6eiwgInJlcXVpcmVkIiwgcHJvcHMsIG51bGwpOw0KLSAgICAgICAgQm9vbGVhbiBydGV4cHJ2YWx1ZSA9IFFkb3hIZWxwZXIuZ2V0Qm9vbGVhbihjbGF6eiwgInJ0ZXhwcnZhbHVlIiwgcHJvcHMsIG51bGwpOw0KLQ0KLSAgICAgICAgU3RyaW5nIGxvbmdEZXNjcmlwdGlvbiA9IFFkb3hIZWxwZXIuZ2V0U3RyaW5nKGNsYXp6LCAibG9uZ0Rlc2NyaXB0aW9uIiwgcHJvcHMsIG51bGwpOw0KLSAgICAgICAgU3RyaW5nIGRlc2NEZmx0ID0gbG9uZ0Rlc2NyaXB0aW9uOw0KLSAgICAgICAgaWYgKChkZXNjRGZsdCA9PSBudWxsKSB8fCAoZGVzY0RmbHQubGVuZ3RoKCkgPCAyKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBkZXNjRGZsdCA9ICJubyBkZXNjcmlwdGlvbiI7DQotICAgICAgICB9DQotICAgICAgICBTdHJpbmcgc2hvcnREZXNjcmlwdGlvbiA9IFFkb3hIZWxwZXIuZ2V0U3RyaW5nKGNsYXp6LCAiZGVzYyIsIHByb3BzLCBkZXNjRGZsdCk7DQotICAgICAgICAgICAgICAgIA0KLSAgICAgICAgU3RyaW5nIG5hbWUgPSBRZG94SGVscGVyLmdldFN0cmluZyhjbGF6eiwgIm5hbWUiLCBwcm9wcywgbnVsbCk7DQotICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gUWRveEhlbHBlci5nZXRTdHJpbmcoY2xhenosICJjbGFzc05hbWUiLCBwcm9wcywgbnVsbCk7DQotICAgICAgICBTdHJpbmcgZGVmZXJyZWRWYWx1ZVR5cGUgPSBRZG94SGVscGVyLmdldFN0cmluZyhjbGF6eiwgImRlZmVycmVkVmFsdWVUeXBlIiwgcHJvcHMsIG51bGwpOw0KLSAgICAgICAgU3RyaW5nIGRlZmVycmVkTWV0aG9kU2lnbmF0dXJlID0gUWRveEhlbHBlci5nZXRTdHJpbmcoY2xhenosICJkZWZlcnJlZE1ldGhvZFNpZ25hdHVyZSIsIHByb3BzLCBudWxsKTsNCi0gICAgICAgIEJvb2xlYW4gZXhjbHVkZSA9IFFkb3hIZWxwZXIuZ2V0Qm9vbGVhbihjbGF6eiwgImV4Y2x1ZGUiLCBwcm9wcywgbnVsbCk7DQotICAgICAgICAgICAgICAgIA0KLSAgICAgICAgQXR0cmlidXRlTWV0YSBhID0gbmV3IEF0dHJpYnV0ZU1ldGEoKTsNCi0gICAgICAgIGEuc2V0TmFtZShuYW1lKTsNCi0gICAgICAgIGEuc2V0Q2xhc3NOYW1lKGNsYXNzTmFtZSk7DQotICAgICAgICBhLnNldFJlcXVpcmVkKHJlcXVpcmVkKTsNCi0gICAgICAgIGEuc2V0UnRleHBydmFsdWUocnRleHBydmFsdWUpOw0KLSAgICAgICAgYS5zZXREZXNjcmlwdGlvbihzaG9ydERlc2NyaXB0aW9uKTsNCi0gICAgICAgIGEuc2V0TG9uZ0Rlc2NyaXB0aW9uKGxvbmdEZXNjcmlwdGlvbik7DQotICAgICAgICBhLnNldERlZmVycmVkVmFsdWVUeXBlKGRlZmVycmVkVmFsdWVUeXBlKTsNCi0gICAgICAgIGEuc2V0RGVmZXJyZWRNZXRob2RTaWduYXR1cmUoZGVmZXJyZWRNZXRob2RTaWduYXR1cmUpOw0KLSAgICAgICAgYS5zZXRFeGNsdWRlKGV4Y2x1ZGUpOw0KLSAgICAgICAgDQotICAgICAgICB0YWcuYWRkQXR0cmlidXRlKGEpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzRmFjZWxldFRhZ0F0dHJpYnV0ZShNYXAgcHJvcHMsIEFic3RyYWN0SmF2YUVudGl0eSBjdHgsDQotICAgICAgICAgICAgSmF2YUNsYXNzIGNsYXp6LCBKYXZhRmllbGQgZmllbGQsIEZhY2VsZXRUYWdNZXRhIHRhZykNCi0gICAgew0KLSAgICAgICAgQm9vbGVhbiByZXF1aXJlZCA9IFFkb3hIZWxwZXIuZ2V0Qm9vbGVhbihjbGF6eiwgInJlcXVpcmVkIiwgcHJvcHMsIG51bGwpOw0KLSAgICAgICAgQm9vbGVhbiBydGV4cHJ2YWx1ZSA9IFFkb3hIZWxwZXIuZ2V0Qm9vbGVhbihjbGF6eiwgInJ0ZXhwcnZhbHVlIiwgcHJvcHMsIG51bGwpOw0KLQ0KLSAgICAgICAgU3RyaW5nIGxvbmdEZXNjcmlwdGlvbiA9IGN0eC5nZXRDb21tZW50KCk7DQotICAgICAgICBTdHJpbmcgZGVzY0RmbHQgPSBRZG94SGVscGVyLmdldEZpcnN0U2VudGVuY2UobG9uZ0Rlc2NyaXB0aW9uKTsNCi0gICAgICAgIGlmICgoZGVzY0RmbHQgPT0gbnVsbCkgfHwgKGRlc2NEZmx0Lmxlbmd0aCgpIDwgMikpDQotICAgICAgICB7DQotICAgICAgICAgICAgZGVzY0RmbHQgPSAibm8gZGVzY3JpcHRpb24iOw0KLSAgICAgICAgfQ0KLSAgICAgICAgU3RyaW5nIHNob3J0RGVzY3JpcHRpb24gPSBRZG94SGVscGVyLmdldFN0cmluZyhjbGF6eiwgImRlc2MiLCBwcm9wcywgZGVzY0RmbHQpOw0KLSAgICAgICAgICAgICAgICANCi0gICAgICAgIFN0cmluZyBuYW1lID0gUWRveEhlbHBlci5nZXRTdHJpbmcoY2xhenosICJuYW1lIiwgcHJvcHMsIGZpZWxkLmdldE5hbWUoKSk7DQotICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gUWRveEhlbHBlci5nZXRTdHJpbmcoY2xhenosICJjbGFzc05hbWUiLCBwcm9wcywgbnVsbCk7DQotICAgICAgICBTdHJpbmcgZGVmZXJyZWRWYWx1ZVR5cGUgPSBRZG94SGVscGVyLmdldFN0cmluZyhjbGF6eiwgImRlZmVycmVkVmFsdWVUeXBlIiwgcHJvcHMsIG51bGwpOw0KLSAgICAgICAgU3RyaW5nIGRlZmVycmVkTWV0aG9kU2lnbmF0dXJlID0gUWRveEhlbHBlci5nZXRTdHJpbmcoY2xhenosICJkZWZlcnJlZE1ldGhvZFNpZ25hdHVyZSIsIHByb3BzLCBudWxsKTsNCi0gICAgICAgIEJvb2xlYW4gZXhjbHVkZSA9IFFkb3hIZWxwZXIuZ2V0Qm9vbGVhbihjbGF6eiwgImV4Y2x1ZGUiLCBwcm9wcywgbnVsbCk7DQotICAgICAgICAgICAgICAgIA0KLSAgICAgICAgQXR0cmlidXRlTWV0YSBhID0gbmV3IEF0dHJpYnV0ZU1ldGEoKTsNCi0gICAgICAgIGEuc2V0TmFtZShuYW1lKTsNCi0gICAgICAgIGEuc2V0Q2xhc3NOYW1lKGNsYXNzTmFtZSk7DQotICAgICAgICBhLnNldFJlcXVpcmVkKHJlcXVpcmVkKTsNCi0gICAgICAgIGEuc2V0UnRleHBydmFsdWUocnRleHBydmFsdWUpOw0KLSAgICAgICAgYS5zZXREZXNjcmlwdGlvbihzaG9ydERlc2NyaXB0aW9uKTsNCi0gICAgICAgIGEuc2V0TG9uZ0Rlc2NyaXB0aW9uKGxvbmdEZXNjcmlwdGlvbik7DQotICAgICAgICBhLnNldERlZmVycmVkVmFsdWVUeXBlKGRlZmVycmVkVmFsdWVUeXBlKTsNCi0gICAgICAgIGEuc2V0RGVmZXJyZWRNZXRob2RTaWduYXR1cmUoZGVmZXJyZWRNZXRob2RTaWduYXR1cmUpOw0KLSAgICAgICAgYS5zZXRFeGNsdWRlKGV4Y2x1ZGUpOw0KLSAgICAgICAgDQotICAgICAgICB0YWcuYWRkQXR0cmlidXRlKGEpOw0KLSAgICB9DQotICAgIA0KLX0NCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL3Fkb3gvcGFyc2UvSmF2YUNsYXNzUGFyc2luZ1N0cmF0ZWd5LmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL3Fkb3gvcGFyc2UvSmF2YUNsYXNzUGFyc2luZ1N0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1MTVkZjUuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9xZG94L3BhcnNlL0phdmFDbGFzc1BhcnNpbmdTdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoNCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqIA0KLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKiANCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmJ1aWxkZXIucWRveC5wYXJzZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5idWlsZGVyLm1vZGVsLk1vZGVsOw0KLQ0KLWltcG9ydCBjb20udGhvdWdodHdvcmtzLnFkb3gubW9kZWwuSmF2YUNsYXNzOw0KLQ0KLS8qKg0KLSAqIA0KLSAqIEBhdXRob3IgTGVvbmFyZG8gVXJpYmUNCi0gKiBAc2luY2UgMS4wLjkNCi0gKg0KLSAqLw0KLXB1YmxpYyBpbnRlcmZhY2UgSmF2YUNsYXNzUGFyc2luZ1N0cmF0ZWd5DQotew0KLSAgICBwdWJsaWMgdm9pZCBwYXJzZUNsYXNzKEphdmFDbGFzcyBjbGF6eiwgTW9kZWwgbW9kZWwpOw0KLX0NCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL3Fkb3gvcGFyc2UvSnNwVGFnUGFyc2luZ1N0cmF0ZWd5LmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL3Fkb3gvcGFyc2UvSnNwVGFnUGFyc2luZ1N0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjNTQxZGYuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9xZG94L3BhcnNlL0pzcFRhZ1BhcnNpbmdTdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI4ICswLDAgQEAKLS8qDQotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKiANCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICogDQotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5idWlsZGVyLnFkb3gucGFyc2U7DQotDQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uYnVpbGRlci5tb2RlbC5BdHRyaWJ1dGVNZXRhOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmJ1aWxkZXIubW9kZWwuTW9kZWw7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uYnVpbGRlci5tb2RlbC5UYWdNZXRhOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmJ1aWxkZXIucWRveC5RZG94SGVscGVyOw0KLQ0KLWltcG9ydCBjb20udGhvdWdodHdvcmtzLnFkb3gubW9kZWwuQWJzdHJhY3RKYXZhRW50aXR5Ow0KLWltcG9ydCBjb20udGhvdWdodHdvcmtzLnFkb3gubW9kZWwuQW5ub3RhdGlvbjsNCi1pbXBvcnQgY29tLnRob3VnaHR3b3Jrcy5xZG94Lm1vZGVsLkRvY2xldFRhZzsNCi1pbXBvcnQgY29tLnRob3VnaHR3b3Jrcy5xZG94Lm1vZGVsLkphdmFDbGFzczsNCi1pbXBvcnQgY29tLnRob3VnaHR3b3Jrcy5xZG94Lm1vZGVsLkphdmFNZXRob2Q7DQotaW1wb3J0IGNvbS50aG91Z2h0d29ya3MucWRveC5tb2RlbC5UeXBlOw0KLQ0KLS8qKg0KLSAqIA0KLSAqIEBhdXRob3IgTGVvbmFyZG8gVXJpYmUNCi0gKiBAc2luY2UgMS4wLjkNCi0gKg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBKc3BUYWdQYXJzaW5nU3RyYXRlZ3kgZXh0ZW5kcyBDbGFzc01ldGFQYXJzaW5nU3RyYXRlZ3kNCi17DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBET0NfVEFHID0gIkpTRkpzcFRhZyI7DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBET0NfSlNQX0FUVFJJQlVURSA9ICJKU0ZKc3BBdHRyaWJ1dGUiOw0KLQ0KLSAgICBwdWJsaWMgdm9pZCBwYXJzZUNsYXNzKEphdmFDbGFzcyBjbGF6eiwgTW9kZWwgbW9kZWwpDQotICAgIHsNCi0gICAgICAgIERvY2xldFRhZyB0YWc7DQotICAgICAgICBBbm5vdGF0aW9uIGFubm87DQotICAgICAgICAvL3RhZw0KLSAgICAgICAgdGFnID0gY2xhenouZ2V0VGFnQnlOYW1lKERPQ19UQUcsIGZhbHNlKTsNCi0gICAgICAgIGlmICh0YWcgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBNYXAgcHJvcHMgPSB0YWcuZ2V0TmFtZWRQYXJhbWV0ZXJNYXAoKTsNCi0gICAgICAgICAgICBwcm9jZXNzVGFnKHByb3BzLCAoQWJzdHJhY3RKYXZhRW50aXR5KXRhZy5nZXRDb250ZXh0KCksIGNsYXp6LCBtb2RlbCk7DQotICAgICAgICB9DQotICAgICAgICBhbm5vID0gUWRveEhlbHBlci5nZXRBbm5vdGF0aW9uKGNsYXp6LCBET0NfVEFHKTsNCi0gICAgICAgIGlmIChhbm5vICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgTWFwIHByb3BzID0gYW5uby5nZXROYW1lZFBhcmFtZXRlck1hcCgpOw0KLSAgICAgICAgICAgIHByb2Nlc3NUYWcocHJvcHMsIChBYnN0cmFjdEphdmFFbnRpdHkpYW5uby5nZXRDb250ZXh0KCksIGNsYXp6LCBtb2RlbCk7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgDQotICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzVGFnKE1hcCBwcm9wcywgQWJzdHJhY3RKYXZhRW50aXR5IGN0eCwNCi0gICAgICAgICAgICBKYXZhQ2xhc3MgY2xhenosIE1vZGVsIG1vZGVsKQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgbG9uZ0Rlc2NyaXB0aW9uID0gY2xhenouZ2V0Q29tbWVudCgpOw0KLSAgICAgICAgU3RyaW5nIGRlc2NEZmx0ID0gUWRveEhlbHBlci5nZXRGaXJzdFNlbnRlbmNlKGxvbmdEZXNjcmlwdGlvbik7DQotICAgICAgICBpZiAoKGRlc2NEZmx0ID09IG51bGwpIHx8IChkZXNjRGZsdC5sZW5ndGgoKSA8IDIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGRlc2NEZmx0ID0gIm5vIGRlc2NyaXB0aW9uIjsNCi0gICAgICAgIH0NCi0gICAgICAgIFN0cmluZyBzaG9ydERlc2NyaXB0aW9uID0gUWRveEhlbHBlci5nZXRTdHJpbmcoY2xhenosICJkZXNjIiwgcHJvcHMsIGRlc2NEZmx0KTsNCi0NCi0gICAgICAgIFN0cmluZyB0YWdOYW1lID0gUWRveEhlbHBlci5nZXRTdHJpbmcoY2xhenosICJuYW1lIiwgcHJvcHMsIG51bGwpOw0KLSAgICAgICAgU3RyaW5nIGNsYXNzTmFtZU92ZXJyaWRlID0gUWRveEhlbHBlci5nZXRTdHJpbmcoY2xhenosICJjbGFzcyIsIHByb3BzLCBudWxsKTsNCi0gICAgICAgIGNsYXNzTmFtZU92ZXJyaWRlID0gUWRveEhlbHBlci5nZXRTdHJpbmcoY2xhenosImNsYXp6Iixwcm9wcyxjbGFzc05hbWVPdmVycmlkZSk7DQotICAgICAgICANCi0gICAgICAgIFN0cmluZyBib2R5Q29udGVudCA9IFFkb3hIZWxwZXIuZ2V0U3RyaW5nKGNsYXp6LCAiYm9keUNvbnRlbnQiLCBwcm9wcywgIkpTUCIpOw0KLSAgICAgICAgU3RyaW5nIHRhZ0hhbmRsZXIgPSBRZG94SGVscGVyLmdldFN0cmluZyhjbGF6eiwgInRhZ0hhbmRsZXIiLCBwcm9wcywgbnVsbCk7DQotDQotICAgICAgICBUYWdNZXRhIHRhZyA9IG5ldyBUYWdNZXRhKCk7DQotICAgICAgICBpbml0Q2xhc3NNZXRhKG1vZGVsLCBjbGF6eiwgdGFnLCBjbGFzc05hbWVPdmVycmlkZSk7DQotICAgICAgICB0YWcuc2V0TmFtZSh0YWdOYW1lKTsNCi0gICAgICAgIHRhZy5zZXRCb2R5Q29udGVudChib2R5Q29udGVudCk7DQotICAgICAgICB0YWcuc2V0RGVzY3JpcHRpb24oc2hvcnREZXNjcmlwdGlvbik7DQotICAgICAgICB0YWcuc2V0TG9uZ0Rlc2NyaXB0aW9uKGxvbmdEZXNjcmlwdGlvbik7DQotICAgICAgICB0YWcuc2V0VGFnSGFuZGxlcih0YWdIYW5kbGVyKTsNCi0gICAgICAgIA0KLSAgICAgICAgcHJvY2Vzc1RhZ0F0dHJpYnV0ZXMoY2xhenosIHRhZyk7DQotICAgICAgICBtb2RlbC5hZGRUYWcodGFnKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc1RhZ0F0dHJpYnV0ZXMoSmF2YUNsYXNzIGNsYXp6LA0KLSAgICAgICAgICAgIFRhZ01ldGEgY3RhZykNCi0gICAgew0KLSAgICAgICAgSmF2YU1ldGhvZFtdIG1ldGhvZHMgPSBjbGF6ei5nZXRNZXRob2RzKCk7DQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1ldGhvZHMubGVuZ3RoOyArK2kpDQotICAgICAgICB7DQotICAgICAgICAgICAgSmF2YU1ldGhvZCBtZXRob2QgPSBtZXRob2RzW2ldOw0KLQ0KLSAgICAgICAgICAgIERvY2xldFRhZyB0YWcgPSBtZXRob2QuZ2V0VGFnQnlOYW1lKERPQ19KU1BfQVRUUklCVVRFKTsNCi0gICAgICAgICAgICBpZiAodGFnICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBNYXAgcHJvcHMgPSB0YWcuZ2V0TmFtZWRQYXJhbWV0ZXJNYXAoKTsNCi0gICAgICAgICAgICAgICAgcHJvY2Vzc1RhZ0F0dHJpYnV0ZShwcm9wcywgKEFic3RyYWN0SmF2YUVudGl0eSl0YWcuZ2V0Q29udGV4dCgpLCBjbGF6eiwNCi0gICAgICAgICAgICAgICAgICAgICAgICBtZXRob2QsIGN0YWcpOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBBbm5vdGF0aW9uIGFubm8gPSBRZG94SGVscGVyLmdldEFubm90YXRpb24obWV0aG9kLCBET0NfSlNQX0FUVFJJQlVURSk7DQotICAgICAgICAgICAgaWYgKGFubm8gIT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIE1hcCBwcm9wcyA9IGFubm8uZ2V0TmFtZWRQYXJhbWV0ZXJNYXAoKTsNCi0gICAgICAgICAgICAgICAgcHJvY2Vzc1RhZ0F0dHJpYnV0ZShwcm9wcywgKEFic3RyYWN0SmF2YUVudGl0eSlhbm5vLmdldENvbnRleHQoKSwgY2xhenosDQotICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kLCBjdGFnKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgICAgIERvY2xldFRhZ1tdIGpzcFByb3BlcnRpZXMgPSBjbGF6ei5nZXRUYWdzQnlOYW1lKERPQ19KU1BfQVRUUklCVVRFKTsNCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwganNwUHJvcGVydGllcy5sZW5ndGg7ICsraSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvL1dlIGhhdmUgaGVyZSBvbmx5IGRvY2xldHMsIGJlY2F1c2UgdGhpcyBwYXJ0IGlzIG9ubHkgZm9yDQotICAgICAgICAgICAgLy9zb2x2ZSBwcm9ibGVtcyB3aXRoIGJpbmRpbmcgcHJvcGVydHkgb24gMS4xDQotICAgICAgICAgICAgRG9jbGV0VGFnIHRhZyA9IGpzcFByb3BlcnRpZXNbaV07DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgTWFwIHByb3BzID0gdGFnLmdldE5hbWVkUGFyYW1ldGVyTWFwKCk7DQotICAgICAgICAgICAgcHJvY2Vzc1RhZ0F0dHJpYnV0ZShwcm9wcywgKEFic3RyYWN0SmF2YUVudGl0eSl0YWcuZ2V0Q29udGV4dCgpLCBjbGF6eiwNCi0gICAgICAgICAgICAgICAgICAgIGN0YWcpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgfSAgICAgICAgICAgICAgICANCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc1RhZ0F0dHJpYnV0ZShNYXAgcHJvcHMsIEFic3RyYWN0SmF2YUVudGl0eSBjdHgsDQotICAgICAgICAgICAgSmF2YUNsYXNzIGNsYXp6LCBKYXZhTWV0aG9kIG1ldGhvZCwgVGFnTWV0YSB0YWcpDQotICAgIHsNCi0gICAgICAgIEJvb2xlYW4gcmVxdWlyZWQgPSBRZG94SGVscGVyLmdldEJvb2xlYW4oY2xhenosICJyZXF1aXJlZCIsIHByb3BzLCBudWxsKTsNCi0gICAgICAgIEJvb2xlYW4gcnRleHBydmFsdWUgPSBRZG94SGVscGVyLmdldEJvb2xlYW4oY2xhenosICJydGV4cHJ2YWx1ZSIsIHByb3BzLCBudWxsKTsNCi0NCi0gICAgICAgIFN0cmluZyBsb25nRGVzY3JpcHRpb24gPSBjdHguZ2V0Q29tbWVudCgpOw0KLSAgICAgICAgU3RyaW5nIGRlc2NEZmx0ID0gUWRveEhlbHBlci5nZXRGaXJzdFNlbnRlbmNlKGxvbmdEZXNjcmlwdGlvbik7DQotICAgICAgICBpZiAoKGRlc2NEZmx0ID09IG51bGwpIHx8IChkZXNjRGZsdC5sZW5ndGgoKSA8IDIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGRlc2NEZmx0ID0gIm5vIGRlc2NyaXB0aW9uIjsNCi0gICAgICAgIH0NCi0gICAgICAgIFN0cmluZyBzaG9ydERlc2NyaXB0aW9uID0gUWRveEhlbHBlci5nZXRTdHJpbmcoY2xhenosICJkZXNjIiwgcHJvcHMsIGRlc2NEZmx0KTsNCi0gICAgICAgICAgICAgICAgDQotICAgICAgICBUeXBlIHJldHVyblR5cGUgPSBudWxsOw0KLSAgICAgICAgDQotICAgICAgICBpZiAobWV0aG9kLmdldE5hbWUoKS5zdGFydHNXaXRoKCJzZXQiKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm5UeXBlID0gbWV0aG9kLmdldFBhcmFtZXRlcnMoKVswXS5nZXRUeXBlKCk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuVHlwZSA9IG1ldGhvZC5nZXRSZXR1cm5zKCk7DQotICAgICAgICB9DQotDQotICAgICAgICBTdHJpbmcgZnVsbHlRdWFsaWZpZWRSZXR1cm5UeXBlID0gcmV0dXJuVHlwZS5nZXRKYXZhQ2xhc3MoKS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKTsNCi0gICAgICAgIA0KLSAgICAgICAgZnVsbHlRdWFsaWZpZWRSZXR1cm5UeXBlID0gUWRveEhlbHBlci5nZXRGdWxseVF1YWxpZmllZENsYXNzTmFtZShjbGF6eixmdWxseVF1YWxpZmllZFJldHVyblR5cGUpOw0KLSAgICAgICAgDQotICAgICAgICBpZiAocmV0dXJuVHlwZS5pc0FycmF5KCkgJiYgKGZ1bGx5UXVhbGlmaWVkUmV0dXJuVHlwZS5pbmRleE9mKCdbJykgPT0gLTEpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmV0dXJuVHlwZS5nZXREaW1lbnNpb25zKCk7aSsrKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgZnVsbHlRdWFsaWZpZWRSZXR1cm5UeXBlID0gZnVsbHlRdWFsaWZpZWRSZXR1cm5UeXBlICsgIltdIjsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICAgICAgICAgIA0KLSAgICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9IFFkb3hIZWxwZXIuZ2V0U3RyaW5nKGNsYXp6LCJjbGFzc05hbWUiLHByb3BzLCBmdWxseVF1YWxpZmllZFJldHVyblR5cGUpOw0KLSAgICAgICAgU3RyaW5nIGRlZmVycmVkVmFsdWVUeXBlID0gUWRveEhlbHBlci5nZXRTdHJpbmcoY2xhenosICJkZWZlcnJlZFZhbHVlVHlwZSIsIHByb3BzLCBudWxsKTsNCi0gICAgICAgIFN0cmluZyBkZWZlcnJlZE1ldGhvZFNpZ25hdHVyZSA9IFFkb3hIZWxwZXIuZ2V0U3RyaW5nKGNsYXp6LCAiZGVmZXJyZWRNZXRob2RTaWduYXR1cmUiLCBwcm9wcywgbnVsbCk7DQotICAgICAgICBCb29sZWFuIGV4Y2x1ZGUgPSBRZG94SGVscGVyLmdldEJvb2xlYW4oY2xhenosICJleGNsdWRlIiwgcHJvcHMsIG51bGwpOw0KLSAgICAgICAgQm9vbGVhbiBmYWNlbGV0c09ubHkgPSBRZG94SGVscGVyLmdldEJvb2xlYW4oY2xhenosICJmYWNlbGV0c09ubHkiLCBwcm9wcywgbnVsbCk7DQotICAgICAgICANCi0gICAgICAgIEF0dHJpYnV0ZU1ldGEgYSA9IG5ldyBBdHRyaWJ1dGVNZXRhKCk7DQotICAgICAgICBhLnNldE5hbWUoUWRveEhlbHBlci5tZXRob2RUb1Byb3BOYW1lKG1ldGhvZC5nZXROYW1lKCkpKTsNCi0gICAgICAgIGEuc2V0Q2xhc3NOYW1lKGNsYXNzTmFtZSk7DQotICAgICAgICBhLnNldFJlcXVpcmVkKHJlcXVpcmVkKTsNCi0gICAgICAgIGEuc2V0UnRleHBydmFsdWUocnRleHBydmFsdWUpOw0KLSAgICAgICAgYS5zZXREZXNjcmlwdGlvbihzaG9ydERlc2NyaXB0aW9uKTsNCi0gICAgICAgIGEuc2V0TG9uZ0Rlc2NyaXB0aW9uKGxvbmdEZXNjcmlwdGlvbik7DQotICAgICAgICBhLnNldERlZmVycmVkVmFsdWVUeXBlKGRlZmVycmVkVmFsdWVUeXBlKTsNCi0gICAgICAgIGEuc2V0RGVmZXJyZWRNZXRob2RTaWduYXR1cmUoZGVmZXJyZWRNZXRob2RTaWduYXR1cmUpOw0KLSAgICAgICAgYS5zZXRFeGNsdWRlKGV4Y2x1ZGUpOw0KLSAgICAgICAgYS5zZXRGYWNlbGV0c09ubHkoZmFjZWxldHNPbmx5KTsNCi0gICAgICAgIA0KLSAgICAgICAgdGFnLmFkZEF0dHJpYnV0ZShhKTsNCi0gICAgfQ0KLSAgICANCi0gICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NUYWdBdHRyaWJ1dGUoTWFwIHByb3BzLCBBYnN0cmFjdEphdmFFbnRpdHkgY3R4LA0KLSAgICAgICAgICAgIEphdmFDbGFzcyBjbGF6eiwgVGFnTWV0YSB0YWcpDQotICAgIHsNCi0gICAgICAgIEJvb2xlYW4gcmVxdWlyZWQgPSBRZG94SGVscGVyLmdldEJvb2xlYW4oY2xhenosICJyZXF1aXJlZCIsIHByb3BzLCBudWxsKTsNCi0gICAgICAgIEJvb2xlYW4gcnRleHBydmFsdWUgPSBRZG94SGVscGVyLmdldEJvb2xlYW4oY2xhenosICJydGV4cHJ2YWx1ZSIsIHByb3BzLCBudWxsKTsNCi0NCi0gICAgICAgIFN0cmluZyBsb25nRGVzY3JpcHRpb24gPSBRZG94SGVscGVyLmdldFN0cmluZyhjbGF6eiwgImxvbmdEZXNjcmlwdGlvbiIsIHByb3BzLCBudWxsKTsNCi0gICAgICAgIFN0cmluZyBkZXNjRGZsdCA9IGxvbmdEZXNjcmlwdGlvbjsNCi0gICAgICAgIGlmICgoZGVzY0RmbHQgPT0gbnVsbCkgfHwgKGRlc2NEZmx0Lmxlbmd0aCgpIDwgMikpDQotICAgICAgICB7DQotICAgICAgICAgICAgZGVzY0RmbHQgPSAibm8gZGVzY3JpcHRpb24iOw0KLSAgICAgICAgfQ0KLSAgICAgICAgU3RyaW5nIHNob3J0RGVzY3JpcHRpb24gPSBRZG94SGVscGVyLmdldFN0cmluZyhjbGF6eiwgImRlc2MiLCBwcm9wcywgZGVzY0RmbHQpOw0KLSAgICAgICAgICAgICAgICANCi0gICAgICAgIFN0cmluZyBuYW1lID0gUWRveEhlbHBlci5nZXRTdHJpbmcoY2xhenosICJuYW1lIiwgcHJvcHMsIG51bGwpOw0KLSAgICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9IFFkb3hIZWxwZXIuZ2V0U3RyaW5nKGNsYXp6LCAiY2xhc3NOYW1lIiwgcHJvcHMsIG51bGwpOw0KLSAgICAgICAgU3RyaW5nIGRlZmVycmVkVmFsdWVUeXBlID0gUWRveEhlbHBlci5nZXRTdHJpbmcoY2xhenosICJkZWZlcnJlZFZhbHVlVHlwZSIsIHByb3BzLCBudWxsKTsNCi0gICAgICAgIFN0cmluZyBkZWZlcnJlZE1ldGhvZFNpZ25hdHVyZSA9IFFkb3hIZWxwZXIuZ2V0U3RyaW5nKGNsYXp6LCAiZGVmZXJyZWRNZXRob2RTaWduYXR1cmUiLCBwcm9wcywgbnVsbCk7DQotICAgICAgICBCb29sZWFuIGV4Y2x1ZGUgPSBRZG94SGVscGVyLmdldEJvb2xlYW4oY2xhenosICJleGNsdWRlIiwgcHJvcHMsIG51bGwpOw0KLSAgICAgICAgQm9vbGVhbiBmYWNlbGV0c09ubHkgPSBRZG94SGVscGVyLmdldEJvb2xlYW4oY2xhenosICJmYWNlbGV0c09ubHkiLCBwcm9wcywgbnVsbCk7DQotICAgICAgICAgICAgICAgIA0KLSAgICAgICAgQXR0cmlidXRlTWV0YSBhID0gbmV3IEF0dHJpYnV0ZU1ldGEoKTsNCi0gICAgICAgIGEuc2V0TmFtZShuYW1lKTsNCi0gICAgICAgIGEuc2V0Q2xhc3NOYW1lKGNsYXNzTmFtZSk7DQotICAgICAgICBhLnNldFJlcXVpcmVkKHJlcXVpcmVkKTsNCi0gICAgICAgIGEuc2V0UnRleHBydmFsdWUocnRleHBydmFsdWUpOw0KLSAgICAgICAgYS5zZXREZXNjcmlwdGlvbihzaG9ydERlc2NyaXB0aW9uKTsNCi0gICAgICAgIGEuc2V0TG9uZ0Rlc2NyaXB0aW9uKGxvbmdEZXNjcmlwdGlvbik7DQotICAgICAgICBhLnNldERlZmVycmVkVmFsdWVUeXBlKGRlZmVycmVkVmFsdWVUeXBlKTsNCi0gICAgICAgIGEuc2V0RGVmZXJyZWRNZXRob2RTaWduYXR1cmUoZGVmZXJyZWRNZXRob2RTaWduYXR1cmUpOw0KLSAgICAgICAgYS5zZXRFeGNsdWRlKGV4Y2x1ZGUpOw0KLSAgICAgICAgYS5zZXRGYWNlbGV0c09ubHkoZmFjZWxldHNPbmx5KTsNCi0gICAgICAgIA0KLSAgICAgICAgdGFnLmFkZEF0dHJpYnV0ZShhKTsNCi0gICAgfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL3Fkb3gvcGFyc2UvUmVuZGVyS2l0UGFyc2luZ1N0cmF0ZWd5LmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL3Fkb3gvcGFyc2UvUmVuZGVyS2l0UGFyc2luZ1N0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0MGFkMzkuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9xZG94L3BhcnNlL1JlbmRlcktpdFBhcnNpbmdTdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyoNCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqIA0KLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKiANCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmJ1aWxkZXIucWRveC5wYXJzZTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5idWlsZGVyLm1vZGVsLk1vZGVsOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmJ1aWxkZXIubW9kZWwuUmVuZGVyS2l0TWV0YTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5idWlsZGVyLnFkb3guUWRveEhlbHBlcjsNCi0NCi1pbXBvcnQgY29tLnRob3VnaHR3b3Jrcy5xZG94Lm1vZGVsLkFic3RyYWN0SmF2YUVudGl0eTsNCi1pbXBvcnQgY29tLnRob3VnaHR3b3Jrcy5xZG94Lm1vZGVsLkFubm90YXRpb247DQotaW1wb3J0IGNvbS50aG91Z2h0d29ya3MucWRveC5tb2RlbC5Eb2NsZXRUYWc7DQotaW1wb3J0IGNvbS50aG91Z2h0d29ya3MucWRveC5tb2RlbC5KYXZhQ2xhc3M7DQotDQotLyoqDQotICogDQotICogQGF1dGhvciBMZW9uYXJkbyBVcmliZQ0KLSAqIEBzaW5jZSAxLjAuOQ0KLSAqDQotICovDQotcHVibGljIGNsYXNzIFJlbmRlcktpdFBhcnNpbmdTdHJhdGVneSBpbXBsZW1lbnRzIEphdmFDbGFzc1BhcnNpbmdTdHJhdGVneQ0KLXsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERPQ19SRU5ERVJLSVQgPSAiSlNGUmVuZGVyS2l0IjsNCi0NCi0gICAgcHVibGljIHZvaWQgcGFyc2VDbGFzcyhKYXZhQ2xhc3MgY2xhenosIE1vZGVsIG1vZGVsKQ0KLSAgICB7DQotICAgICAgICBEb2NsZXRUYWcgdGFnID0gbnVsbDsNCi0gICAgICAgIEFubm90YXRpb24gYW5ubyA9IG51bGw7DQotICAgICAgICAvLyByZW5kZXJLaXQNCi0gICAgICAgIHRhZyA9IGNsYXp6LmdldFRhZ0J5TmFtZShET0NfUkVOREVSS0lULCBmYWxzZSk7DQotICAgICAgICBpZiAodGFnICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgTWFwIHByb3BzID0gdGFnLmdldE5hbWVkUGFyYW1ldGVyTWFwKCk7DQotICAgICAgICAgICAgcHJvY2Vzc1JlbmRlcktpdChwcm9wcywgKEFic3RyYWN0SmF2YUVudGl0eSl0YWcuZ2V0Q29udGV4dCgpLCBjbGF6eiwgbW9kZWwpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgYW5ubyA9IFFkb3hIZWxwZXIuZ2V0QW5ub3RhdGlvbihjbGF6eiwgRE9DX1JFTkRFUktJVCk7DQotICAgICAgICBpZiAoYW5ubyAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIE1hcCBwcm9wcyA9IGFubm8uZ2V0TmFtZWRQYXJhbWV0ZXJNYXAoKTsNCi0gICAgICAgICAgICBwcm9jZXNzUmVuZGVyS2l0KHByb3BzLCAoQWJzdHJhY3RKYXZhRW50aXR5KWFubm8uZ2V0Q29udGV4dCgpLCBjbGF6eiwgbW9kZWwpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIA0KLSAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc1JlbmRlcktpdChNYXAgcHJvcHMsIEFic3RyYWN0SmF2YUVudGl0eSBjdHgsDQotICAgICAgICAgICAgSmF2YUNsYXNzIGNsYXp6LCBNb2RlbCBtb2RlbCkNCi0gICAgew0KLQ0KLSAgICAgICAgU3RyaW5nIHJlbmRlcktpdElkID0gUWRveEhlbHBlci5nZXRTdHJpbmcoY2xhenosICJyZW5kZXJLaXRJZCIsIHByb3BzLCBudWxsKTsNCi0gICAgICAgIFN0cmluZyByZW5kZXJLaXRDbGFzcyA9IFFkb3hIZWxwZXIuZ2V0U3RyaW5nKGNsYXp6LCAiY2xhc3MiLCBwcm9wcywgY2xhenoNCi0gICAgICAgICAgICAgICAgLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpKTsNCi0gICAgICAgIHJlbmRlcktpdENsYXNzID0gUWRveEhlbHBlci5nZXRTdHJpbmcoY2xhenosImNsYXp6Iixwcm9wcyxyZW5kZXJLaXRDbGFzcyk7DQotDQotICAgICAgICBSZW5kZXJLaXRNZXRhIHJlbmRlcktpdCA9IG1vZGVsLmZpbmRSZW5kZXJLaXRCeUlkKHJlbmRlcktpdElkKTsNCi0gICAgICAgIA0KLSAgICAgICAgaWYgKHJlbmRlcktpdCA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlbmRlcktpdCA9IG5ldyBSZW5kZXJLaXRNZXRhKCk7DQotICAgICAgICAgICAgcmVuZGVyS2l0LnNldENsYXNzTmFtZShyZW5kZXJLaXRDbGFzcyk7DQotICAgICAgICAgICAgcmVuZGVyS2l0LnNldFJlbmRlcktpdElkKHJlbmRlcktpdElkKTsNCi0gICAgICAgICAgICBtb2RlbC5hZGRSZW5kZXJLaXQocmVuZGVyS2l0KTsgICAgICAgIA0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlbmRlcktpdC5zZXRDbGFzc05hbWUocmVuZGVyS2l0Q2xhc3MpOw0KLSAgICAgICAgICAgIHJlbmRlcktpdC5zZXRSZW5kZXJLaXRJZChyZW5kZXJLaXRJZCk7ICAgICAgICAgICAgDQotICAgICAgICB9DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9xZG94L3BhcnNlL1JlbmRlcmVyUGFyc2luZ1N0cmF0ZWd5LmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL3Fkb3gvcGFyc2UvUmVuZGVyZXJQYXJzaW5nU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjcxN2EzOC4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL3Fkb3gvcGFyc2UvUmVuZGVyZXJQYXJzaW5nU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNSArMCwwIEBACi0vKg0KLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICogDQotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqIA0KLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqICB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uYnVpbGRlci5xZG94LnBhcnNlOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5idWlsZGVyLm1vZGVsLk1vZGVsOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmJ1aWxkZXIubW9kZWwuUmVuZGVyS2l0TWV0YTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5idWlsZGVyLm1vZGVsLlJlbmRlcmVyTWV0YTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5idWlsZGVyLnFkb3guUWRveEhlbHBlcjsNCi0NCi1pbXBvcnQgY29tLnRob3VnaHR3b3Jrcy5xZG94Lm1vZGVsLkFic3RyYWN0SmF2YUVudGl0eTsNCi1pbXBvcnQgY29tLnRob3VnaHR3b3Jrcy5xZG94Lm1vZGVsLkFubm90YXRpb247DQotaW1wb3J0IGNvbS50aG91Z2h0d29ya3MucWRveC5tb2RlbC5Eb2NsZXRUYWc7DQotaW1wb3J0IGNvbS50aG91Z2h0d29ya3MucWRveC5tb2RlbC5KYXZhQ2xhc3M7DQotDQotLyoqDQotICogDQotICogQGF1dGhvciBMZW9uYXJkbyBVcmliZQ0KLSAqIEBzaW5jZSAxLjAuOQ0KLSAqDQotICovDQotcHVibGljIGNsYXNzIFJlbmRlcmVyUGFyc2luZ1N0cmF0ZWd5IGltcGxlbWVudHMgSmF2YUNsYXNzUGFyc2luZ1N0cmF0ZWd5DQotew0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRE9DX1JFTkRFUkVSID0gIkpTRlJlbmRlcmVyIjsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERPQ19SRU5ERVJFUlMgPSAiSlNGUmVuZGVyZXJzIjsNCi0NCi0gICAgcHVibGljIHZvaWQgcGFyc2VDbGFzcyhKYXZhQ2xhc3MgY2xhenosIE1vZGVsIG1vZGVsKQ0KLSAgICB7DQotICAgICAgICBEb2NsZXRUYWcgdGFnID0gbnVsbDsNCi0gICAgICAgIEFubm90YXRpb24gYW5ubyA9IG51bGw7DQotICAgICAgICAvLyByZW5kZXJlcg0KLSAgICAgICAgRG9jbGV0VGFnIFtdIHRhZ3MgPSBjbGF6ei5nZXRUYWdzQnlOYW1lKERPQ19SRU5ERVJFUiwgZmFsc2UpOw0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0YWdzLmxlbmd0aDsgaSsrKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRhZyA9IHRhZ3NbaV07DQotICAgICAgICAgICAgaWYgKHRhZyAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgTWFwIHByb3BzID0gdGFnLmdldE5hbWVkUGFyYW1ldGVyTWFwKCk7DQotICAgICAgICAgICAgICAgIHByb2Nlc3NSZW5kZXJlcihwcm9wcywgKEFic3RyYWN0SmF2YUVudGl0eSl0YWcuZ2V0Q29udGV4dCgpLCBjbGF6eiwgbW9kZWwpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIGFubm8gPSBRZG94SGVscGVyLmdldEFubm90YXRpb24oY2xhenosIERPQ19SRU5ERVJFUik7DQotICAgICAgICBpZiAoYW5ubyAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIE1hcCBwcm9wcyA9IGFubm8uZ2V0TmFtZWRQYXJhbWV0ZXJNYXAoKTsNCi0gICAgICAgICAgICBwcm9jZXNzUmVuZGVyZXIocHJvcHMsIChBYnN0cmFjdEphdmFFbnRpdHkpYW5uby5nZXRDb250ZXh0KCksIGNsYXp6LCBtb2RlbCk7DQotICAgICAgICB9DQotICAgICAgICBhbm5vID0gUWRveEhlbHBlci5nZXRBbm5vdGF0aW9uKGNsYXp6LCBET0NfUkVOREVSRVJTKTsNCi0gICAgICAgIGlmIChhbm5vICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgT2JqZWN0IGpzcFByb3BzID0gYW5uby5nZXROYW1lZFBhcmFtZXRlcigicmVuZGVyZXJzIik7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgaWYgKGpzcFByb3BzIGluc3RhbmNlb2YgQW5ub3RhdGlvbikNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIEFubm90YXRpb24ganNwUHJvcGVydGllc0Fubm8gPSAoQW5ub3RhdGlvbikganNwUHJvcHM7DQotICAgICAgICAgICAgICAgIE1hcCBwcm9wcyA9IGpzcFByb3BlcnRpZXNBbm5vLmdldE5hbWVkUGFyYW1ldGVyTWFwKCk7DQotICAgICAgICAgICAgICAgIHByb2Nlc3NSZW5kZXJlcihwcm9wcywgKEFic3RyYWN0SmF2YUVudGl0eSlhbm5vLmdldENvbnRleHQoKSwgY2xhenosIG1vZGVsKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZWxzZQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgTGlzdCBqc3BQcm9wc0xpc3QgPSAoTGlzdCkganNwUHJvcHM7DQotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwganNwUHJvcHNMaXN0LnNpemUoKTtpKyspDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIEFubm90YXRpb24gcmFubm8gPSAoQW5ub3RhdGlvbikganNwUHJvcHNMaXN0LmdldChpKTsNCi0gICAgICAgICAgICAgICAgICAgIE1hcCBwcm9wcyA9IHJhbm5vLmdldE5hbWVkUGFyYW1ldGVyTWFwKCk7DQotICAgICAgICAgICAgICAgICAgICBwcm9jZXNzUmVuZGVyZXIocHJvcHMsIChBYnN0cmFjdEphdmFFbnRpdHkpYW5uby5nZXRDb250ZXh0KCksIGNsYXp6LCBtb2RlbCk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0gICAgDQotICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzUmVuZGVyZXIoTWFwIHByb3BzLCBBYnN0cmFjdEphdmFFbnRpdHkgY3R4LA0KLSAgICAgICAgICAgIEphdmFDbGFzcyBjbGF6eiwgTW9kZWwgbW9kZWwpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBsb25nRGVzY3JpcHRpb24gPSBjbGF6ei5nZXRDb21tZW50KCk7DQotICAgICAgICBTdHJpbmcgZGVzY0RmbHQgPSBRZG94SGVscGVyLmdldEZpcnN0U2VudGVuY2UobG9uZ0Rlc2NyaXB0aW9uKTsNCi0gICAgICAgIGlmICgoZGVzY0RmbHQgPT0gbnVsbCkgfHwgKGRlc2NEZmx0Lmxlbmd0aCgpIDwgMikpDQotICAgICAgICB7DQotICAgICAgICAgICAgZGVzY0RmbHQgPSAibm8gZGVzY3JpcHRpb24iOw0KLSAgICAgICAgfQ0KLSAgICAgICAgU3RyaW5nIHNob3J0RGVzY3JpcHRpb24gPSBRZG94SGVscGVyLmdldFN0cmluZyhjbGF6eiwgImRlc2MiLCBwcm9wcywgZGVzY0RmbHQpOw0KLSAgIA0KLSAgICAgICAgU3RyaW5nIHJlbmRlcktpdElkID0gUWRveEhlbHBlci5nZXRTdHJpbmcoY2xhenosICJyZW5kZXJLaXRJZCIsIHByb3BzLCBudWxsKTsNCi0gICAgICAgIFN0cmluZyByZW5kZXJlckNsYXNzID0gUWRveEhlbHBlci5nZXRTdHJpbmcoY2xhenosICJjbGFzcyIsIHByb3BzLCBjbGF6eg0KLSAgICAgICAgICAgICAgICAuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkpOw0KLSAgICAgICAgcmVuZGVyZXJDbGFzcyA9IFFkb3hIZWxwZXIuZ2V0U3RyaW5nKGNsYXp6LCJjbGF6eiIscHJvcHMscmVuZGVyZXJDbGFzcyk7DQotICAgICAgICANCi0gICAgICAgIFN0cmluZyBjb21wb25lbnRGYW1pbHkgPSBRZG94SGVscGVyLmdldFN0cmluZyhjbGF6eiwiZmFtaWx5IiwgcHJvcHMsbnVsbCk7DQotICAgICAgICBTdHJpbmcgcmVuZGVyZXJUeXBlID0gUWRveEhlbHBlci5nZXRTdHJpbmcoY2xhenosInR5cGUiLCBwcm9wcyxudWxsKTsNCi0gICAgICAgIA0KLSAgICAgICAgUmVuZGVyS2l0TWV0YSByZW5kZXJLaXQgPSBtb2RlbC5maW5kUmVuZGVyS2l0QnlJZChyZW5kZXJLaXRJZCk7DQotICAgICAgICANCi0gICAgICAgIGlmIChyZW5kZXJLaXQgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZW5kZXJLaXQgPSBuZXcgUmVuZGVyS2l0TWV0YSgpOw0KLSAgICAgICAgICAgIHJlbmRlcktpdC5zZXRSZW5kZXJLaXRJZChyZW5kZXJLaXRJZCk7DQotICAgICAgICAgICAgbW9kZWwuYWRkUmVuZGVyS2l0KHJlbmRlcktpdCk7ICAgICAgICAgICAgDQotICAgICAgICB9DQotDQotICAgICAgICBSZW5kZXJlck1ldGEgcmVuZGVyZXIgPSBuZXcgUmVuZGVyZXJNZXRhKCk7DQotICAgICAgICByZW5kZXJlci5zZXRDbGFzc05hbWUocmVuZGVyZXJDbGFzcyk7DQotICAgICAgICByZW5kZXJlci5zZXREZXNjcmlwdGlvbihzaG9ydERlc2NyaXB0aW9uKTsNCi0gICAgICAgIHJlbmRlcmVyLnNldENvbXBvbmVudEZhbWlseShjb21wb25lbnRGYW1pbHkpOw0KLSAgICAgICAgcmVuZGVyZXIuc2V0UmVuZGVyZXJUeXBlKHJlbmRlcmVyVHlwZSk7DQotICAgICAgICByZW5kZXJLaXQuYWRkUmVuZGVyZXIocmVuZGVyZXIpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvcWRveC9wYXJzZS9WYWxpZGF0b3JQYXJzaW5nU3RyYXRlZ3kuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvcWRveC9wYXJzZS9WYWxpZGF0b3JQYXJzaW5nU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmMyMmI2MS4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL3Fkb3gvcGFyc2UvVmFsaWRhdG9yUGFyc2luZ1N0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTcgKzAsMCBAQAotLyoNCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqIA0KLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKiANCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmJ1aWxkZXIucWRveC5wYXJzZTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5idWlsZGVyLm1vZGVsLk1vZGVsOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmJ1aWxkZXIubW9kZWwuVmFsaWRhdG9yTWV0YTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5idWlsZGVyLnFkb3guUWRveEhlbHBlcjsNCi0NCi1pbXBvcnQgY29tLnRob3VnaHR3b3Jrcy5xZG94Lm1vZGVsLkFic3RyYWN0SmF2YUVudGl0eTsNCi1pbXBvcnQgY29tLnRob3VnaHR3b3Jrcy5xZG94Lm1vZGVsLkFubm90YXRpb247DQotaW1wb3J0IGNvbS50aG91Z2h0d29ya3MucWRveC5tb2RlbC5Eb2NsZXRUYWc7DQotaW1wb3J0IGNvbS50aG91Z2h0d29ya3MucWRveC5tb2RlbC5KYXZhQ2xhc3M7DQotaW1wb3J0IGNvbS50aG91Z2h0d29ya3MucWRveC5tb2RlbC5KYXZhRmllbGQ7DQotDQotLyoqDQotICogDQotICogQGF1dGhvciBMZW9uYXJkbyBVcmliZQ0KLSAqIEBzaW5jZSAxLjAuOQ0KLSAqDQotICovDQotcHVibGljIGNsYXNzIFZhbGlkYXRvclBhcnNpbmdTdHJhdGVneSBleHRlbmRzIENsYXNzTWV0YVByb3BlcnR5UGFyc2luZ1N0cmF0ZWd5DQotew0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRE9DX1ZBTElEQVRPUiA9ICJKU0ZWYWxpZGF0b3IiOw0KLQ0KLSAgICBwdWJsaWMgdm9pZCBwYXJzZUNsYXNzKEphdmFDbGFzcyBjbGF6eiwgTW9kZWwgbW9kZWwpDQotICAgIHsNCi0gICAgICAgIERvY2xldFRhZyB0YWc7DQotICAgICAgICBBbm5vdGF0aW9uIGFubm87DQotICAgICAgICAvLyB2YWxpZGF0b3JzDQotICAgICAgICB0YWcgPSBjbGF6ei5nZXRUYWdCeU5hbWUoRE9DX1ZBTElEQVRPUiwgZmFsc2UpOw0KLSAgICAgICAgaWYgKHRhZyAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIE1hcCBwcm9wcyA9IHRhZy5nZXROYW1lZFBhcmFtZXRlck1hcCgpOw0KLSAgICAgICAgICAgIHByb2Nlc3NWYWxpZGF0b3IocHJvcHMsIChBYnN0cmFjdEphdmFFbnRpdHkpdGFnLmdldENvbnRleHQoKSwgY2xhenosIG1vZGVsKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGFubm8gPSBRZG94SGVscGVyLmdldEFubm90YXRpb24oY2xhenosIERPQ19WQUxJREFUT1IpOw0KLSAgICAgICAgaWYgKGFubm8gIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBNYXAgcHJvcHMgPSBhbm5vLmdldE5hbWVkUGFyYW1ldGVyTWFwKCk7DQotICAgICAgICAgICAgcHJvY2Vzc1ZhbGlkYXRvcihwcm9wcywgKEFic3RyYWN0SmF2YUVudGl0eSlhbm5vLmdldENvbnRleHQoKSwgY2xhenosIG1vZGVsKTsNCi0gICAgICAgIH0NCi0NCi0gICAgfQ0KLSAgICANCi0gICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NWYWxpZGF0b3IoTWFwIHByb3BzLCBBYnN0cmFjdEphdmFFbnRpdHkgY3R4LA0KLSAgICAgICAgICAgIEphdmFDbGFzcyBjbGF6eiwgTW9kZWwgbW9kZWwpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBsb25nRGVzY3JpcHRpb24gPSBjbGF6ei5nZXRDb21tZW50KCk7DQotICAgICAgICBTdHJpbmcgZGVzY0RmbHQgPSBRZG94SGVscGVyLmdldEZpcnN0U2VudGVuY2UobG9uZ0Rlc2NyaXB0aW9uKTsNCi0gICAgICAgIGlmICgoZGVzY0RmbHQgPT0gbnVsbCkgfHwgKGRlc2NEZmx0Lmxlbmd0aCgpIDwgMikpDQotICAgICAgICB7DQotICAgICAgICAgICAgZGVzY0RmbHQgPSAibm8gZGVzY3JpcHRpb24iOw0KLSAgICAgICAgfQ0KLSAgICAgICAgU3RyaW5nIHNob3J0RGVzY3JpcHRpb24gPSBRZG94SGVscGVyLmdldFN0cmluZyhjbGF6eiwgImRlc2MiLCBwcm9wcywgZGVzY0RmbHQpOw0KLQ0KLSAgICAgICAgU3RyaW5nIHZhbGlkYXRvcklkRGZsdCA9IG51bGw7DQotICAgICAgICBKYXZhRmllbGQgZmllbGRDb252ZXJ0ZXJJZCA9IGNsYXp6DQotICAgICAgICAgICAgICAgIC5nZXRGaWVsZEJ5TmFtZSgiVkFMSURBVE9SX0lEIik7DQotICAgICAgICBpZiAoZmllbGRDb252ZXJ0ZXJJZCAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IGZpZWxkQ29udmVydGVySWQuZ2V0SW5pdGlhbGl6YXRpb25FeHByZXNzaW9uKCk7DQotICAgICAgICAgICAgdmFsaWRhdG9ySWREZmx0ID0gUWRveEhlbHBlci5jbGVhbih2YWx1ZS5zdWJzdHJpbmcodmFsdWUuaW5kZXhPZignIicpKSk7DQotICAgICAgICB9ICAgICAgICANCi0gICAgICAgIFN0cmluZyB2YWxpZGF0b3JJZCA9IFFkb3hIZWxwZXIuZ2V0U3RyaW5nKGNsYXp6LCAiaWQiLCBwcm9wcywgdmFsaWRhdG9ySWREZmx0KTsNCi0NCi0gICAgICAgIC8vIENoZWNrIGZvciBib3RoICJjbGFzcyIgYW5kICJjbGF6eiIgaW4gb3JkZXIgdG8gc3VwcG9ydA0KLSAgICAgICAgLy8gZG9jbGV0IGFuZCByZWFsIGFubm90YXRpb25zLg0KLSAgICAgICAgU3RyaW5nIGNsYXNzTmFtZU92ZXJyaWRlID0gUWRveEhlbHBlci5nZXRTdHJpbmcoY2xhenosICJjbGFzcyIsIHByb3BzLCBudWxsKTsNCi0gICAgICAgIGNsYXNzTmFtZU92ZXJyaWRlID0gUWRveEhlbHBlci5nZXRTdHJpbmcoY2xhenosImNsYXp6Iixwcm9wcyxjbGFzc05hbWVPdmVycmlkZSk7DQotICAgICAgICANCi0gICAgICAgIFN0cmluZyBjb21wb25lbnROYW1lID0gUWRveEhlbHBlci5nZXRTdHJpbmcoY2xhenosICJuYW1lIiwgcHJvcHMsIG51bGwpOw0KLSAgICAgICAgU3RyaW5nIGJvZHlDb250ZW50ID0gUWRveEhlbHBlci5nZXRTdHJpbmcoY2xhenosICJib2R5Q29udGVudCIsIHByb3BzLCBudWxsKTsNCi0gICAgICAgIFN0cmluZyB0YWdDbGFzcyA9IFFkb3hIZWxwZXIuZ2V0U3RyaW5nKGNsYXp6LCAidGFnQ2xhc3MiLCBwcm9wcywgbnVsbCk7ICAgICAgICANCi0gICAgICAgIFN0cmluZyB0YWdTdXBlcmNsYXNzID0gUWRveEhlbHBlci5nZXRTdHJpbmcoY2xhenosICJ0YWdTdXBlcmNsYXNzIiwgcHJvcHMsIG51bGwpOw0KLSAgICAgICAgU3RyaW5nIHRhZ0hhbmRsZXIgPSBRZG94SGVscGVyLmdldFN0cmluZyhjbGF6eiwgInRhZ0hhbmRsZXIiLCBwcm9wcywgbnVsbCk7DQotICAgICAgICBTdHJpbmcgc2VyaWFsdWlkdGFnID0gUWRveEhlbHBlci5nZXRTdHJpbmcoY2xhenosICJzZXJpYWx1aWR0YWciLCBwcm9wcywgbnVsbCk7DQotICAgICAgICBCb29sZWFuIGNvbmZpZ0V4Y2x1ZGVkID0gUWRveEhlbHBlci5nZXRCb29sZWFuKGNsYXp6LCJjb25maWdFeGNsdWRlZCIscHJvcHMsbnVsbCk7DQotICAgICAgICBCb29sZWFuIGV2YWx1YXRlRUxPbkV4ZWN1dGlvbiA9IFFkb3hIZWxwZXIuZ2V0Qm9vbGVhbihjbGF6eiwiZXZhbHVhdGVFTE9uRXhlY3V0aW9uIixwcm9wcyxudWxsKTsNCi0gICAgICAgIA0KLSAgICAgICAgVmFsaWRhdG9yTWV0YSB2YWxpZGF0b3IgPSBuZXcgVmFsaWRhdG9yTWV0YSgpOw0KLSAgICAgICAgaW5pdENsYXNzTWV0YShtb2RlbCwgY2xhenosIHZhbGlkYXRvciwgY2xhc3NOYW1lT3ZlcnJpZGUpOw0KLSAgICAgICAgdmFsaWRhdG9yLnNldE5hbWUoY29tcG9uZW50TmFtZSk7DQotICAgICAgICB2YWxpZGF0b3Iuc2V0Qm9keUNvbnRlbnQoYm9keUNvbnRlbnQpOw0KLSAgICAgICAgdmFsaWRhdG9yLnNldFRhZ0NsYXNzKHRhZ0NsYXNzKTsNCi0gICAgICAgIHZhbGlkYXRvci5zZXRUYWdTdXBlcmNsYXNzKHRhZ1N1cGVyY2xhc3MpOw0KLSAgICAgICAgdmFsaWRhdG9yLnNldFRhZ0hhbmRsZXIodGFnSGFuZGxlcik7DQotICAgICAgICB2YWxpZGF0b3Iuc2V0VmFsaWRhdG9ySWQodmFsaWRhdG9ySWQpOw0KLSAgICAgICAgdmFsaWRhdG9yLnNldERlc2NyaXB0aW9uKHNob3J0RGVzY3JpcHRpb24pOw0KLSAgICAgICAgdmFsaWRhdG9yLnNldExvbmdEZXNjcmlwdGlvbihsb25nRGVzY3JpcHRpb24pOw0KLSAgICAgICAgdmFsaWRhdG9yLnNldFNlcmlhbHVpZHRhZyhzZXJpYWx1aWR0YWcpOw0KLSAgICAgICAgdmFsaWRhdG9yLnNldENvbmZpZ0V4Y2x1ZGVkKGNvbmZpZ0V4Y2x1ZGVkKTsNCi0gICAgICAgIHZhbGlkYXRvci5zZXRFdmFsdWF0ZUVMT25FeGVjdXRpb24oZXZhbHVhdGVFTE9uRXhlY3V0aW9uKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gTm93IGhlcmUgd2FsayB0aGUgY29tcG9uZW50IGxvb2tpbmcgZm9yIHByb3BlcnR5IGFubm90YXRpb25zLg0KLSAgICAgICAgcHJvY2Vzc0NvbXBvbmVudFByb3BlcnRpZXMoY2xhenosIHZhbGlkYXRvcik7DQotICAgICAgICANCi0gICAgICAgIG1vZGVsLmFkZFZhbGlkYXRvcih2YWxpZGF0b3IpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvcWRveC9wYXJzZS9XZWJDb25maWdQYXJhbVBhcnNpbmdTdHJhdGVneS5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9xZG94L3BhcnNlL1dlYkNvbmZpZ1BhcmFtUGFyc2luZ1N0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2ZmQyNGEuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9xZG94L3BhcnNlL1dlYkNvbmZpZ1BhcmFtUGFyc2luZ1N0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotLyoNCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqIA0KLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKiANCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmJ1aWxkZXIucWRveC5wYXJzZTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5idWlsZGVyLm1vZGVsLk1vZGVsOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmJ1aWxkZXIubW9kZWwuV2ViQ29uZmlnTWV0YTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5idWlsZGVyLm1vZGVsLldlYkNvbmZpZ1BhcmFtTWV0YTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5idWlsZGVyLnFkb3guUWRveEhlbHBlcjsNCi0NCi1pbXBvcnQgY29tLnRob3VnaHR3b3Jrcy5xZG94Lm1vZGVsLkFic3RyYWN0SmF2YUVudGl0eTsNCi1pbXBvcnQgY29tLnRob3VnaHR3b3Jrcy5xZG94Lm1vZGVsLkFubm90YXRpb247DQotaW1wb3J0IGNvbS50aG91Z2h0d29ya3MucWRveC5tb2RlbC5Eb2NsZXRUYWc7DQotaW1wb3J0IGNvbS50aG91Z2h0d29ya3MucWRveC5tb2RlbC5KYXZhQ2xhc3M7DQotaW1wb3J0IGNvbS50aG91Z2h0d29ya3MucWRveC5tb2RlbC5KYXZhRmllbGQ7DQotDQotLyoqDQotICogDQotICogQGF1dGhvciBMZW9uYXJkbyBVcmliZQ0KLSAqIEBzaW5jZSAxLjAuOQ0KLSAqDQotICovDQotcHVibGljIGNsYXNzIFdlYkNvbmZpZ1BhcmFtUGFyc2luZ1N0cmF0ZWd5IGltcGxlbWVudHMgSmF2YUNsYXNzUGFyc2luZ1N0cmF0ZWd5DQotew0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRE9DX1dFQl9DT05GSUdfUEFSQU0gPSAiSlNGV2ViQ29uZmlnUGFyYW0iOw0KLQ0KLSAgICBwdWJsaWMgdm9pZCBwYXJzZUNsYXNzKEphdmFDbGFzcyBjbGF6eiwgTW9kZWwgbW9kZWwpDQotICAgIHsNCi0gICAgICAgIERvY2xldFRhZyB0YWc7DQotICAgICAgICBBbm5vdGF0aW9uIGFubm87DQotICAgICAgICBXZWJDb25maWdNZXRhIHdlYkNvbmZpZyA9IG1vZGVsLmZpbmRXZWJDb25maWdzQnlNb2RlbElkKG1vZGVsLmdldE1vZGVsSWQoKSk7DQotICAgICAgICBib29sZWFuIGNyZWF0ZVdlYkNvbmZpZyA9IGZhbHNlOw0KLSAgICAgICAgaWYgKHdlYkNvbmZpZyA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGNyZWF0ZVdlYkNvbmZpZyA9IHRydWU7DQotICAgICAgICAgICAgd2ViQ29uZmlnID0gbmV3IFdlYkNvbmZpZ01ldGEoKTsNCi0gICAgICAgICAgICB3ZWJDb25maWcuc2V0TW9kZWxJZChtb2RlbC5nZXRNb2RlbElkKCkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgLy9XZWIgQ29uZmlnIFBhcmFtcw0KLSAgICAgICAgSmF2YUZpZWxkW10gZmllbGRzID0gY2xhenouZ2V0RmllbGRzKCk7DQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpZWxkcy5sZW5ndGg7ICsraSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBKYXZhRmllbGQgZmllbGQgPSBmaWVsZHNbaV07DQotICAgICAgICAgICAgdGFnID0gZmllbGQuZ2V0VGFnQnlOYW1lKERPQ19XRUJfQ09ORklHX1BBUkFNKTsNCi0gICAgICAgICAgICBpZiAodGFnICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBNYXAgcHJvcHMgPSB0YWcuZ2V0TmFtZWRQYXJhbWV0ZXJNYXAoKTsNCi0gICAgICAgICAgICAgICAgcHJvY2Vzc1dlYkNvbmZpZ1BhcmFtKHByb3BzLCAoQWJzdHJhY3RKYXZhRW50aXR5KXRhZy5nZXRDb250ZXh0KCksIA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNsYXp6LCBmaWVsZCwgd2ViQ29uZmlnKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgYW5ubyA9IFFkb3hIZWxwZXIuZ2V0QW5ub3RhdGlvbihmaWVsZCwgRE9DX1dFQl9DT05GSUdfUEFSQU0pOw0KLSAgICAgICAgICAgIGlmIChhbm5vICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBNYXAgcHJvcHMgPSBhbm5vLmdldE5hbWVkUGFyYW1ldGVyTWFwKCk7DQotICAgICAgICAgICAgICAgIHByb2Nlc3NXZWJDb25maWdQYXJhbShwcm9wcywgKEFic3RyYWN0SmF2YUVudGl0eSlhbm5vLmdldENvbnRleHQoKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICBjbGF6eiwgZmllbGQsIHdlYkNvbmZpZyk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKHdlYkNvbmZpZy53ZWJDb25maWdQYXJhbWV0ZXJzU2l6ZSgpID4gMCAmJiBjcmVhdGVXZWJDb25maWcpDQotICAgICAgICB7DQotICAgICAgICAgICAgbW9kZWwuYWRkV2ViQ29uZmlnKHdlYkNvbmZpZyk7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgDQotICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzV2ViQ29uZmlnUGFyYW0oTWFwIHByb3BzLCBBYnN0cmFjdEphdmFFbnRpdHkgY3R4LA0KLSAgICAgICAgICAgIEphdmFDbGFzcyBjbGF6eiwgSmF2YUZpZWxkIGZpZWxkLCBXZWJDb25maWdNZXRhIHdlYkNvbmZpZykNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIGxvbmdEZXNjcmlwdGlvbiA9IGZpZWxkLmdldENvbW1lbnQoKTsNCi0gICAgICAgIFN0cmluZyBkZXNjRGZsdCA9IFFkb3hIZWxwZXIuZ2V0Rmlyc3RTZW50ZW5jZShsb25nRGVzY3JpcHRpb24pOw0KLSAgICAgICAgaWYgKChkZXNjRGZsdCA9PSBudWxsKSB8fCAoZGVzY0RmbHQubGVuZ3RoKCkgPCAyKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBkZXNjRGZsdCA9ICJubyBkZXNjcmlwdGlvbiI7DQotICAgICAgICB9DQotICAgICAgICBTdHJpbmcgc2hvcnREZXNjcmlwdGlvbiA9IFFkb3hIZWxwZXIuZ2V0U3RyaW5nKGNsYXp6LCAiZGVzYyIsIHByb3BzLCBkZXNjRGZsdCk7DQotICAgICAgICANCi0gICAgICAgIFN0cmluZyBuYW1lID0gUWRveEhlbHBlci5nZXRTdHJpbmcoY2xhenosICJuYW1lIiwgcHJvcHMsIA0KLSAgICAgICAgICAgICAgICBRZG94SGVscGVyLmV2YWx1YXRlUGFyYW1ldGVySW5pdGlhbGl6YXRpb25FeHByZXNzaW9uKA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLmdldEluaXRpYWxpemF0aW9uRXhwcmVzc2lvbigpKSk7DQotICAgICAgICBTdHJpbmcgZGVmYXVsdFZhbHVlID0gUWRveEhlbHBlci5nZXRTdHJpbmcoY2xhenosImRlZmF1bHRWYWx1ZSIscHJvcHMsbnVsbCk7DQotICAgICAgICBTdHJpbmcgZXhwZWN0ZWRWYWx1ZXMgPSBRZG94SGVscGVyLmdldFN0cmluZyhjbGF6eiwiZXhwZWN0ZWRWYWx1ZXMiLHByb3BzLG51bGwpOw0KLSAgICAgICAgU3RyaW5nIHNpbmNlID0gUWRveEhlbHBlci5nZXRTdHJpbmcoY2xhenosInNpbmNlIixwcm9wcyxudWxsKTsNCi0gICAgICAgIA0KLSAgICAgICAgV2ViQ29uZmlnUGFyYW1NZXRhIHdjcCA9IG5ldyBXZWJDb25maWdQYXJhbU1ldGEoKTsNCi0gICAgICAgIHdjcC5zZXROYW1lKG5hbWUpOw0KLSAgICAgICAgd2NwLnNldEZpZWxkTmFtZShmaWVsZC5nZXROYW1lKCkpOw0KLSAgICAgICAgd2NwLnNldFNvdXJjZUNsYXNzTmFtZShjbGF6ei5nZXRGdWxseVF1YWxpZmllZE5hbWUoKSk7DQotICAgICAgICB3Y3Auc2V0RGVmYXVsdFZhbHVlKGRlZmF1bHRWYWx1ZSk7DQotICAgICAgICB3Y3Auc2V0RXhwZWN0ZWRWYWx1ZXMoZXhwZWN0ZWRWYWx1ZXMpOw0KLSAgICAgICAgd2NwLnNldExvbmdEZXNjcmlwdGlvbihsb25nRGVzY3JpcHRpb24pOw0KLSAgICAgICAgd2NwLnNldERlc2NyaXB0aW9uKHNob3J0RGVzY3JpcHRpb24pOw0KLSAgICAgICAgd2NwLnNldFNpbmNlKHNpbmNlKTsNCi0gICAgICAgIHdlYkNvbmZpZy5hZGRXZWJDb25maWdQYXJhbSh3Y3ApOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvdHJpbmlkYWQvVHJpbmlkYWRNYXZlbkZhY2VzUGx1Z2luTW9kZWxCdWlsZGVyLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL3RyaW5pZGFkL1RyaW5pZGFkTWF2ZW5GYWNlc1BsdWdpbk1vZGVsQnVpbGRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkN2YxZjU0Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvdHJpbmlkYWQvVHJpbmlkYWRNYXZlbkZhY2VzUGx1Z2luTW9kZWxCdWlsZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0ODcgKzAsMCBAQAotLyoNCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqIA0KLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKiANCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmJ1aWxkZXIudHJpbmlkYWQ7DQotDQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCi0NCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5idWlsZGVyLk1vZGVsUGFyYW1zOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmJ1aWxkZXIubW9kZWwuQ29tcG9uZW50TWV0YTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5idWlsZGVyLm1vZGVsLkNvbnZlcnRlck1ldGE7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uYnVpbGRlci5tb2RlbC5GYWNldE1ldGE7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uYnVpbGRlci5tb2RlbC5MaXN0ZW5lck1ldGE7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uYnVpbGRlci5tb2RlbC5NZXRob2RTaWduYXR1cmVNZXRhOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmJ1aWxkZXIubW9kZWwuTW9kZWw7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uYnVpbGRlci5tb2RlbC5Qcm9wZXJ0eUhvbGRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5idWlsZGVyLm1vZGVsLlByb3BlcnR5TWV0YTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5idWlsZGVyLm1vZGVsLlJlbmRlcktpdE1ldGE7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uYnVpbGRlci5tb2RlbC5SZW5kZXJlck1ldGE7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uYnVpbGRlci5tb2RlbC5WYWxpZGF0b3JNZXRhOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmJ1aWxkZXIudHJpbmlkYWQucGFyc2UuQWJzdHJhY3RUYWdCZWFuOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmJ1aWxkZXIudHJpbmlkYWQucGFyc2UuQ29tcG9uZW50QmVhbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5idWlsZGVyLnRyaW5pZGFkLnBhcnNlLkNvbnZlcnRlckJlYW47DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uYnVpbGRlci50cmluaWRhZC5wYXJzZS5FdmVudEJlYW47DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uYnVpbGRlci50cmluaWRhZC5wYXJzZS5FdmVudFJlZkJlYW47DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uYnVpbGRlci50cmluaWRhZC5wYXJzZS5GYWNlc0NvbmZpZ0JlYW47DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uYnVpbGRlci50cmluaWRhZC5wYXJzZS5GYWNldEJlYW47DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uYnVpbGRlci50cmluaWRhZC5wYXJzZS5NZXRob2RTaWduYXR1cmVCZWFuOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmJ1aWxkZXIudHJpbmlkYWQucGFyc2UuUHJvcGVydHlCZWFuOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmJ1aWxkZXIudHJpbmlkYWQucGFyc2UuUmVuZGVyS2l0QmVhbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5idWlsZGVyLnRyaW5pZGFkLnBhcnNlLlJlbmRlcmVyQmVhbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5idWlsZGVyLnRyaW5pZGFkLnBhcnNlLlZhbGlkYXRvckJlYW47DQotDQotcHVibGljIGNsYXNzIFRyaW5pZGFkTWF2ZW5GYWNlc1BsdWdpbk1vZGVsQnVpbGRlcg0KLXsNCi0gICAgDQotICAgIHB1YmxpYyB2b2lkIGJ1aWxkTW9kZWwoTW9kZWwgbW9kZWwsIE1vZGVsUGFyYW1zIHBhcmFtZXRlcnMpDQotICAgICAgICAgICAgdGhyb3dzIE1vam9FeGVjdXRpb25FeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgRmFjZXNDb25maWdCZWFuIGZhY2VzQ29uZmlnQmVhbiA9IHBhcmFtZXRlcnMuZ2V0RmFjZXNDb25maWdCZWFuKCk7DQotICAgICAgICANCi0gICAgICAgIGlmIChmYWNlc0NvbmZpZ0JlYW4gPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm47DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgICAgIGZvciAoSXRlcmF0b3I8Q29tcG9uZW50QmVhbj4gaXQgPSBmYWNlc0NvbmZpZ0JlYW4uY29tcG9uZW50cygpOyBpdC5oYXNOZXh0KCk7KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIENvbXBvbmVudEJlYW4gc291cmNlQ29tcG9uZW50ID0gaXQubmV4dCgpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIFN0cmluZyBjb21wb25lbnRUeXBlID0gc291cmNlQ29tcG9uZW50LmdldENvbXBvbmVudFR5cGUoKTsNCi0gICAgICAgICAgICBpZiAoY29tcG9uZW50VHlwZS5zdGFydHNXaXRoKCJqYXZheC5mYWNlcy4iKSB8fCBzb3VyY2VDb21wb25lbnQuZ2V0Q29tcG9uZW50Q2xhc3MoKS5zdGFydHNXaXRoKCJqYXZheC5mYWNlcy4iKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIC8vIENvbXBvbmVudHMgaW4gamF2YXguZmFjZXMgcGFja2FnZSB3ZXJlIGFscmVhZHkgbG9hZGVkLCBzbw0KLSAgICAgICAgICAgICAgICAvLyB0aGVyZSBpcyBubyBuZWVkIHRvIGxvYWQgdGhlbSBhZ2Fpbg0KLSAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgYm9vbGVhbiBjcmVhdGVkID0gZmFsc2U7DQotICAgICAgICAgICAgQ29tcG9uZW50TWV0YSB0YXJnZXRDb21wb25lbnQgPSBtb2RlbC5maW5kQ29tcG9uZW50QnlDbGFzc05hbWUoc291cmNlQ29tcG9uZW50LmdldENvbXBvbmVudENsYXNzKCkpOw0KLSAgICAgICAgICAgIGlmICh0YXJnZXRDb21wb25lbnQgPT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHRhcmdldENvbXBvbmVudCA9IG5ldyBDb21wb25lbnRNZXRhKCk7DQotICAgICAgICAgICAgICAgIGNyZWF0ZWQgPSB0cnVlOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICB0YXJnZXRDb21wb25lbnQuc2V0TW9kZWxJZChtb2RlbC5nZXRNb2RlbElkKCkpOw0KLSAgICAgICAgICAgIC8vIGNsYXNzTmFtZQ0KLSAgICAgICAgICAgIHRhcmdldENvbXBvbmVudC5zZXRDbGFzc05hbWUoc291cmNlQ29tcG9uZW50LmdldENvbXBvbmVudENsYXNzKCkpOw0KLSAgICAgICAgICAgIC8vIHNvdXJjZUNsYXNzTmFtZQ0KLSAgICAgICAgICAgIHRhcmdldENvbXBvbmVudC5zZXRTb3VyY2VDbGFzc05hbWUoc291cmNlQ29tcG9uZW50LmdldENvbXBvbmVudENsYXNzKCkpOw0KLSAgICAgICAgICAgIC8vIHBhcmVudENsYXNzTmFtZQ0KLSAgICAgICAgICAgIC8vIHNvdXJjZUNsYXNzUGFyZW50Q2xhc3NOYW1lDQotICAgICAgICAgICAgLy8gVHJpbmlkYWQgTWF2ZW4gRmFjZXMgcGx1Z2luIHVzZXMgaGllYXJhcmNoeSBieSB0eXBlLCBidXQgTXlGYWNlcw0KLSAgICAgICAgICAgIC8vIEJ1aWxkZXIgUGx1Z2luIGRvIGl0IHBlciBjbGFzcyBuYW1lLiAgDQotICAgICAgICAgICAgU3RyaW5nIGNvbXBvbmVudFN1cGVyY2xhc3MgPSBzb3VyY2VDb21wb25lbnQuZmluZENvbXBvbmVudFN1cGVyY2xhc3MoKTsgDQotICAgICAgICAgICAgaWYgKGNvbXBvbmVudFN1cGVyY2xhc3MgIT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGlmIChjb21wb25lbnRTdXBlcmNsYXNzLmVxdWFscygiVUlYQ29sbGVjdGlvbiIpKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRTdXBlcmNsYXNzID0gIm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5jb21wb25lbnQuVUlYQ29sbGVjdGlvbiI7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgdGFyZ2V0Q29tcG9uZW50LnNldFBhcmVudENsYXNzTmFtZShjb21wb25lbnRTdXBlcmNsYXNzKTsNCi0gICAgICAgICAgICAgICAgdGFyZ2V0Q29tcG9uZW50LnNldFNvdXJjZUNsYXNzUGFyZW50Q2xhc3NOYW1lKGNvbXBvbmVudFN1cGVyY2xhc3MpOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAvLyB0eXBlDQotICAgICAgICAgICAgdGFyZ2V0Q29tcG9uZW50LnNldFR5cGUoc291cmNlQ29tcG9uZW50LmdldENvbXBvbmVudFR5cGUoKSk7DQotICAgICAgICAgICAgLy8gbmFtZQ0KLSAgICAgICAgICAgIGlmIChzb3VyY2VDb21wb25lbnQuZ2V0VGFnTmFtZSgpICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB0YXJnZXRDb21wb25lbnQuc2V0TmFtZShnZXRUYWdQcmVmaXgoc291cmNlQ29tcG9uZW50LmdldFRhZ05hbWUoKSkrJzonK3NvdXJjZUNvbXBvbmVudC5nZXRUYWdOYW1lKCkuZ2V0TG9jYWxQYXJ0KCkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAvLyBkZXNjcmlwdGlvbg0KLSAgICAgICAgICAgIHRhcmdldENvbXBvbmVudC5zZXREZXNjcmlwdGlvbihzb3VyY2VDb21wb25lbnQuZ2V0RGVzY3JpcHRpb24oKSk7DQotICAgICAgICAgICAgLy8gbG9uZ0Rlc2NyaXB0aW9uDQotICAgICAgICAgICAgdGFyZ2V0Q29tcG9uZW50LnNldExvbmdEZXNjcmlwdGlvbihzb3VyY2VDb21wb25lbnQuZ2V0TG9uZ0Rlc2NyaXB0aW9uKCkpOw0KLSAgICAgICAgICAgIC8vIGZhbWlseQ0KLSAgICAgICAgICAgIHRhcmdldENvbXBvbmVudC5zZXRGYW1pbHkoc291cmNlQ29tcG9uZW50LmdldENvbXBvbmVudEZhbWlseSgpKTsNCi0gICAgICAgICAgICAvLyByZW5kZXJlclR5cGUNCi0gICAgICAgICAgICB0YXJnZXRDb21wb25lbnQuc2V0UmVuZGVyZXJUeXBlKHNvdXJjZUNvbXBvbmVudC5nZXRSZW5kZXJlclR5cGUoKSk7DQotICAgICAgICAgICAgLy8gdGFnQ2xhc3MNCi0gICAgICAgICAgICB0YXJnZXRDb21wb25lbnQuc2V0VGFnQ2xhc3Moc291cmNlQ29tcG9uZW50LmdldFRhZ0NsYXNzKCkpOw0KLSAgICAgICAgICAgIC8vIHRhZ0hhbmRsZXINCi0gICAgICAgICAgICB0YXJnZXRDb21wb25lbnQuc2V0VGFnSGFuZGxlcihzb3VyY2VDb21wb25lbnQuZ2V0VGFnSGFuZGxlcigpKTsNCi0gICAgICAgICAgICAvLyB0YWdTdXBlcmNsYXNzOw0KLSAgICAgICAgICAgIHRhcmdldENvbXBvbmVudC5zZXRUYWdTdXBlcmNsYXNzKHNvdXJjZUNvbXBvbmVudC5nZXRUYWdTdXBlcmNsYXNzKCkpOw0KLSAgICAgICAgICAgIC8vIG5hbWluZ0NvbnRhaW5lcg0KLSAgICAgICAgICAgIGlmIChzb3VyY2VDb21wb25lbnQuaXNOYW1pbmdDb250YWluZXIoKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHRhcmdldENvbXBvbmVudC5zZXROYW1pbmdDb250YWluZXIoc291cmNlQ29tcG9uZW50LmlzTmFtaW5nQ29udGFpbmVyKCkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAvLyBjbGllbnRCZWhhdmlvckhvbGRlcg0KLSAgICAgICAgICAgIGlmIChzb3VyY2VDb21wb25lbnQuaXNDbGllbnRCZWhhdmlvckhvbGRlcigpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdGFyZ2V0Q29tcG9uZW50LnNldENsaWVudEJlaGF2aW9ySG9sZGVyKHNvdXJjZUNvbXBvbmVudC5pc0NsaWVudEJlaGF2aW9ySG9sZGVyKCkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAvLyBjaGlsZHJlbg0KLSAgICAgICAgICAgIHRhcmdldENvbXBvbmVudC5zZXRDaGlsZHJlbihzb3VyY2VDb21wb25lbnQuaGFzQ2hpbGRyZW4oKSk7DQotICAgICAgICAgICAgLy8gZGVmYXVsdEV2ZW50TmFtZQ0KLSAgICAgICAgICAgIHRhcmdldENvbXBvbmVudC5zZXREZWZhdWx0RXZlbnROYW1lKHNvdXJjZUNvbXBvbmVudC5nZXREZWZhdWx0RXZlbnROYW1lKCkpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIC8vIEF0dHJpYnV0ZXMgd2l0aG91dCBtYXRjaA0KLSAgICAgICAgICAgIC8vIGJvZHlDb250ZW50DQotICAgICAgICAgICAgLy8gY29uZmlnRXhjbHVkZWQNCi0gICAgICAgICAgICAvLyBzZXJpYWx1aWQNCi0gICAgICAgICAgICAvLyBpbXBsZW1lbnRzDQotICAgICAgICAgICAgLy8gY29tcG9zaXRlDQotICAgICAgICAgICAgLy8gb3ZlcnJpZGVEZWZhdWx0RXZlbnROYW1lDQotICAgICAgICAgICAgLy8gY2NMaWJyYXJ5TmFtZTsNCi0gICAgICAgICAgICAvLyBjY1Jlc291cmNlTmFtZTsNCi0gICAgICAgICAgICAvLyBnZW5lcmF0ZWRDb21wb25lbnRDbGFzcw0KLSAgICAgICAgICAgIC8vIGdlbmVyYXRlZFRhZ0NsYXNzDQotICAgICAgICAgICAgLy8gdGVtcGxhdGU7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgdmlzaXRQcm9wZXJ0aWVzKHNvdXJjZUNvbXBvbmVudCwgdGFyZ2V0Q29tcG9uZW50KTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICBmb3IgKEl0ZXJhdG9yPEZhY2V0QmVhbj4gZmFjZXRJdGVyYXRvciA9IHNvdXJjZUNvbXBvbmVudC5mYWNldHMoKTsgZmFjZXRJdGVyYXRvci5oYXNOZXh0KCk7KQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgRmFjZXRCZWFuIGZhY2V0ID0gZmFjZXRJdGVyYXRvci5uZXh0KCk7DQotICAgICAgICAgICAgICAgIEZhY2V0TWV0YSBmYWNldE1ldGEgPSB0YXJnZXRDb21wb25lbnQuZ2V0RmFjZXQoZmFjZXQuZ2V0RmFjZXROYW1lKCkpOw0KLSAgICAgICAgICAgICAgICBib29sZWFuIGZhY2V0Q3JlYXRlZCA9IGZhbHNlOw0KLSAgICAgICAgICAgICAgICBpZiAoZmFjZXRNZXRhID09IG51bGwpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGZhY2V0TWV0YSA9IG5ldyBGYWNldE1ldGEoKTsNCi0gICAgICAgICAgICAgICAgICAgIGZhY2V0Q3JlYXRlZCA9IHRydWU7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgICAgIGZhY2V0TWV0YS5zZXROYW1lKGZhY2V0LmdldEZhY2V0TmFtZSgpKTsNCi0gICAgICAgICAgICAgICAgZmFjZXRNZXRhLnNldERlc2NyaXB0aW9uKGZhY2V0LmdldERlc2NyaXB0aW9uKCkpOw0KLSAgICAgICAgICAgICAgICBmYWNldE1ldGEuc2V0TG9uZ0Rlc2NyaXB0aW9uKGZhY2V0LmdldERlc2NyaXB0aW9uKCkpOw0KLSAgICAgICAgICAgICAgICBpZiAoZmFjZXQuaXNSZXF1aXJlZCgpKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBmYWNldE1ldGEuc2V0UmVxdWlyZWQoZmFjZXQuaXNSZXF1aXJlZCgpKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICAgaWYgKGZhY2V0Q3JlYXRlZCkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgdGFyZ2V0Q29tcG9uZW50LmFkZEZhY2V0KGZhY2V0TWV0YSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgZm9yIChJdGVyYXRvcjxFdmVudFJlZkJlYW4+IGV2ZW50SXRlcmF0b3IgPSBzb3VyY2VDb21wb25lbnQuZXZlbnRzKCk7IGV2ZW50SXRlcmF0b3IuaGFzTmV4dCgpOykNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIEV2ZW50UmVmQmVhbiBldmVudCA9IGV2ZW50SXRlcmF0b3IubmV4dCgpOw0KLSAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICAgU3RyaW5nIGxpc3RlbmVyTmFtZSA9IGV2ZW50LmdldEV2ZW50TmFtZSgpKyJMaXN0ZW5lciI7DQotICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgICBMaXN0ZW5lck1ldGEgbGlzdGVuZXJNZXRhID0gdGFyZ2V0Q29tcG9uZW50LmdldExpc3RlbmVyKGxpc3RlbmVyTmFtZSk7DQotICAgICAgICAgICAgICAgIGJvb2xlYW4gbGlzdGVuZXJDcmVhdGVkID0gZmFsc2U7DQotICAgICAgICAgICAgICAgIGlmIChsaXN0ZW5lck1ldGEgPT0gbnVsbCkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXJNZXRhID0gbmV3IExpc3RlbmVyTWV0YSgpOw0KLSAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXJDcmVhdGVkID0gdHJ1ZTsNCi0gICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICBsaXN0ZW5lck1ldGEuc2V0RXZlbnRDbGFzc05hbWUoZXZlbnQuZ2V0RXZlbnRUeXBlKCkpOw0KLSAgICAgICAgICAgICAgICBsaXN0ZW5lck1ldGEuc2V0TmFtZShsaXN0ZW5lck5hbWUpOw0KLSAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICAgaWYgKGV2ZW50LmdldEV2ZW50RGVsaXZlcnlQaGFzZXMoKSAhPSBudWxsKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIHBoYXNlcyA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7DQotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGV2ZW50LmdldEV2ZW50RGVsaXZlcnlQaGFzZXMoKS5sZW5ndGg7IGkrKykNCi0gICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBwaGFzZXMuYXBwZW5kKGV2ZW50LmdldEV2ZW50RGVsaXZlcnlQaGFzZXMoKVtpXSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkrMSA8IGV2ZW50LmdldEV2ZW50RGVsaXZlcnlQaGFzZXMoKS5sZW5ndGgpDQotICAgICAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaGFzZXMuYXBwZW5kKCIgLCIpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyTWV0YS5zZXRQaGFzZXMocGhhc2VzLnRvU3RyaW5nKCkpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgICBFdmVudEJlYW4gZXZlbnRCZWFuID0gZXZlbnQucmVzb2x2ZUV2ZW50VHlwZSgpOw0KLSAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICAgaWYgKGV2ZW50QmVhbiAhPSBudWxsKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lck1ldGEuc2V0Q2xhc3NOYW1lKGV2ZW50QmVhbi5nZXRFdmVudExpc3RlbmVyQ2xhc3MoKSk7DQotICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lck1ldGEuc2V0RGVzY3JpcHRpb24oZXZlbnRCZWFuLmdldERlc2NyaXB0aW9uKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXJNZXRhLnNldExvbmdEZXNjcmlwdGlvbihldmVudEJlYW4uZ2V0RGVzY3JpcHRpb24oKSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgICAgIGlmIChsaXN0ZW5lckNyZWF0ZWQpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIHRhcmdldENvbXBvbmVudC5hZGRMaXN0ZW5lcihsaXN0ZW5lck1ldGEpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIGlmIChjcmVhdGVkKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgbW9kZWwuYWRkQ29tcG9uZW50KHRhcmdldENvbXBvbmVudCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICBmb3IgKEl0ZXJhdG9yPENvbnZlcnRlckJlYW4+IGl0ID0gZmFjZXNDb25maWdCZWFuLmNvbnZlcnRlcnMoKTsgaXQuaGFzTmV4dCgpOykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBDb252ZXJ0ZXJCZWFuIHNvdXJjZUNvbXBvbmVudCA9IGl0Lm5leHQoKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICBTdHJpbmcgY29udmVydGVySWQgPSBzb3VyY2VDb21wb25lbnQuZ2V0Q29udmVydGVySWQoKTsNCi0gICAgICAgICAgICBpZiAoY29udmVydGVySWQuc3RhcnRzV2l0aCgiamF2YXguZmFjZXMuIikgfHwgc291cmNlQ29tcG9uZW50LmdldENvbnZlcnRlckNsYXNzKCkuc3RhcnRzV2l0aCgiamF2YXguZmFjZXMuIikpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAvLyBDb21wb25lbnRzIGluIGphdmF4LmZhY2VzIHBhY2thZ2Ugd2VyZSBhbHJlYWR5IGxvYWRlZCwgc28NCi0gICAgICAgICAgICAgICAgLy8gdGhlcmUgaXMgbm8gbmVlZCB0byBsb2FkIHRoZW0gYWdhaW4NCi0gICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIGJvb2xlYW4gY3JlYXRlZCA9IGZhbHNlOw0KLSAgICAgICAgICAgIENvbnZlcnRlck1ldGEgdGFyZ2V0Q29tcG9uZW50ID0gbW9kZWwuZmluZENvbnZlcnRlckJ5Q2xhc3NOYW1lKHNvdXJjZUNvbXBvbmVudC5nZXRDb252ZXJ0ZXJDbGFzcygpKTsNCi0gICAgICAgICAgICBpZiAodGFyZ2V0Q29tcG9uZW50ID09IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB0YXJnZXRDb21wb25lbnQgPSBuZXcgQ29udmVydGVyTWV0YSgpOw0KLSAgICAgICAgICAgICAgICBjcmVhdGVkID0gdHJ1ZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgdGFyZ2V0Q29tcG9uZW50LnNldE1vZGVsSWQobW9kZWwuZ2V0TW9kZWxJZCgpKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICB0YXJnZXRDb21wb25lbnQuc2V0Q2xhc3NOYW1lKHNvdXJjZUNvbXBvbmVudC5nZXRDb252ZXJ0ZXJDbGFzcygpKTsNCi0gICAgICAgICAgICB0YXJnZXRDb21wb25lbnQuc2V0U291cmNlQ2xhc3NOYW1lKHNvdXJjZUNvbXBvbmVudC5nZXRDb252ZXJ0ZXJDbGFzcygpKTsNCi0gICAgICAgICAgICB0YXJnZXRDb21wb25lbnQuc2V0UGFyZW50Q2xhc3NOYW1lKHNvdXJjZUNvbXBvbmVudC5nZXRDb252ZXJ0ZXJTdXBlckNsYXNzKCkpOw0KLSAgICAgICAgICAgIHRhcmdldENvbXBvbmVudC5zZXRTb3VyY2VDbGFzc1BhcmVudENsYXNzTmFtZShzb3VyY2VDb21wb25lbnQuZ2V0Q29udmVydGVyU3VwZXJDbGFzcygpKTsNCi0NCi0gICAgICAgICAgICAvLyBuYW1lDQotICAgICAgICAgICAgaWYgKHNvdXJjZUNvbXBvbmVudC5nZXRUYWdOYW1lKCkgIT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHRhcmdldENvbXBvbmVudC5zZXROYW1lKGdldFRhZ1ByZWZpeChzb3VyY2VDb21wb25lbnQuZ2V0VGFnTmFtZSgpKSsnOicrc291cmNlQ29tcG9uZW50LmdldFRhZ05hbWUoKS5nZXRMb2NhbFBhcnQoKSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIHRhcmdldENvbXBvbmVudC5zZXREZXNjcmlwdGlvbihzb3VyY2VDb21wb25lbnQuZ2V0RGVzY3JpcHRpb24oKSk7DQotICAgICAgICAgICAgdGFyZ2V0Q29tcG9uZW50LnNldExvbmdEZXNjcmlwdGlvbihzb3VyY2VDb21wb25lbnQuZ2V0TG9uZ0Rlc2NyaXB0aW9uKCkpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIHRhcmdldENvbXBvbmVudC5zZXRDb252ZXJ0ZXJJZChzb3VyY2VDb21wb25lbnQuZ2V0Q29udmVydGVySWQoKSk7DQotICAgICAgICAgICAgdGFyZ2V0Q29tcG9uZW50LnNldFRhZ0NsYXNzKHNvdXJjZUNvbXBvbmVudC5nZXRUYWdDbGFzcygpKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICB2aXNpdFByb3BlcnRpZXMoc291cmNlQ29tcG9uZW50LCB0YXJnZXRDb21wb25lbnQpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIGlmIChjcmVhdGVkKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgbW9kZWwuYWRkQ29udmVydGVyKHRhcmdldENvbXBvbmVudCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICBmb3IgKEl0ZXJhdG9yPFZhbGlkYXRvckJlYW4+IGl0ID0gZmFjZXNDb25maWdCZWFuLnZhbGlkYXRvcnMoKTsgaXQuaGFzTmV4dCgpOykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBWYWxpZGF0b3JCZWFuIHNvdXJjZUNvbXBvbmVudCA9IGl0Lm5leHQoKTsNCi0NCi0gICAgICAgICAgICBTdHJpbmcgdmFsaWRhdG9ySWQgPSBzb3VyY2VDb21wb25lbnQuZ2V0VmFsaWRhdG9ySWQoKTsNCi0gICAgICAgICAgICBpZiAodmFsaWRhdG9ySWQuc3RhcnRzV2l0aCgiamF2YXguZmFjZXMuIikgfHwgc291cmNlQ29tcG9uZW50LmdldFZhbGlkYXRvckNsYXNzKCkuc3RhcnRzV2l0aCgiamF2YXguZmFjZXMuIikpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAvLyBDb21wb25lbnRzIGluIGphdmF4LmZhY2VzIHBhY2thZ2Ugd2VyZSBhbHJlYWR5IGxvYWRlZCwgc28NCi0gICAgICAgICAgICAgICAgLy8gdGhlcmUgaXMgbm8gbmVlZCB0byBsb2FkIHRoZW0gYWdhaW4NCi0gICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIGJvb2xlYW4gY3JlYXRlZCA9IGZhbHNlOw0KLSAgICAgICAgICAgIFZhbGlkYXRvck1ldGEgdGFyZ2V0Q29tcG9uZW50ID0gbW9kZWwuZmluZFZhbGlkYXRvckJ5Q2xhc3NOYW1lKHNvdXJjZUNvbXBvbmVudC5nZXRWYWxpZGF0b3JDbGFzcygpKTsNCi0gICAgICAgICAgICBpZiAodGFyZ2V0Q29tcG9uZW50ID09IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB0YXJnZXRDb21wb25lbnQgPSBuZXcgVmFsaWRhdG9yTWV0YSgpOw0KLSAgICAgICAgICAgICAgICBjcmVhdGVkID0gdHJ1ZTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgdGFyZ2V0Q29tcG9uZW50LnNldE1vZGVsSWQobW9kZWwuZ2V0TW9kZWxJZCgpKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICB0YXJnZXRDb21wb25lbnQuc2V0Q2xhc3NOYW1lKHNvdXJjZUNvbXBvbmVudC5nZXRWYWxpZGF0b3JDbGFzcygpKTsNCi0gICAgICAgICAgICB0YXJnZXRDb21wb25lbnQuc2V0U291cmNlQ2xhc3NOYW1lKHNvdXJjZUNvbXBvbmVudC5nZXRWYWxpZGF0b3JDbGFzcygpKTsNCi0gICAgICAgICAgICB0YXJnZXRDb21wb25lbnQuc2V0UGFyZW50Q2xhc3NOYW1lKHNvdXJjZUNvbXBvbmVudC5nZXRWYWxpZGF0b3JTdXBlckNsYXNzKCkpOw0KLSAgICAgICAgICAgIHRhcmdldENvbXBvbmVudC5zZXRTb3VyY2VDbGFzc1BhcmVudENsYXNzTmFtZShzb3VyY2VDb21wb25lbnQuZ2V0VmFsaWRhdG9yU3VwZXJDbGFzcygpKTsNCi0NCi0gICAgICAgICAgICAvLyBuYW1lDQotICAgICAgICAgICAgaWYgKHNvdXJjZUNvbXBvbmVudC5nZXRUYWdOYW1lKCkgIT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHRhcmdldENvbXBvbmVudC5zZXROYW1lKGdldFRhZ1ByZWZpeChzb3VyY2VDb21wb25lbnQuZ2V0VGFnTmFtZSgpKSsnOicrc291cmNlQ29tcG9uZW50LmdldFRhZ05hbWUoKS5nZXRMb2NhbFBhcnQoKSk7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIHRhcmdldENvbXBvbmVudC5zZXREZXNjcmlwdGlvbihzb3VyY2VDb21wb25lbnQuZ2V0RGVzY3JpcHRpb24oKSk7DQotICAgICAgICAgICAgdGFyZ2V0Q29tcG9uZW50LnNldExvbmdEZXNjcmlwdGlvbihzb3VyY2VDb21wb25lbnQuZ2V0TG9uZ0Rlc2NyaXB0aW9uKCkpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIHRhcmdldENvbXBvbmVudC5zZXRWYWxpZGF0b3JJZChzb3VyY2VDb21wb25lbnQuZ2V0VmFsaWRhdG9ySWQoKSk7DQotICAgICAgICAgICAgdGFyZ2V0Q29tcG9uZW50LnNldFRhZ0NsYXNzKHNvdXJjZUNvbXBvbmVudC5nZXRUYWdDbGFzcygpKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICB2aXNpdFByb3BlcnRpZXMoc291cmNlQ29tcG9uZW50LCB0YXJnZXRDb21wb25lbnQpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIGlmIChjcmVhdGVkKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgbW9kZWwuYWRkVmFsaWRhdG9yKHRhcmdldENvbXBvbmVudCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICBmb3IgKEl0ZXJhdG9yPFJlbmRlcktpdEJlYW4+IGl0ID0gZmFjZXNDb25maWdCZWFuLnJlbmRlcktpdHMoKTsgaXQuaGFzTmV4dCgpOykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBSZW5kZXJLaXRCZWFuIHNvdXJjZUNvbXBvbmVudCA9IGl0Lm5leHQoKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICBib29sZWFuIGNyZWF0ZWQgPSBmYWxzZTsNCi0gICAgICAgICAgICBSZW5kZXJLaXRNZXRhIHRhcmdldENvbXBvbmVudCA9IG1vZGVsLmZpbmRSZW5kZXJLaXRCeUlkKHNvdXJjZUNvbXBvbmVudC5nZXRSZW5kZXJLaXRJZCgpKTsNCi0gICAgICAgICAgICBpZiAodGFyZ2V0Q29tcG9uZW50ID09IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB0YXJnZXRDb21wb25lbnQgPSBuZXcgUmVuZGVyS2l0TWV0YSgpOw0KLSAgICAgICAgICAgICAgICBjcmVhdGVkID0gdHJ1ZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgdGFyZ2V0Q29tcG9uZW50LnNldFJlbmRlcktpdElkKHNvdXJjZUNvbXBvbmVudC5nZXRSZW5kZXJLaXRJZCgpKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICBmb3IgKEl0ZXJhdG9yPFJlbmRlcmVyQmVhbj4gcmVuZGVyZXJJdGVyYXRvciA9IHNvdXJjZUNvbXBvbmVudC5yZW5kZXJlcnMoKTsgcmVuZGVyZXJJdGVyYXRvci5oYXNOZXh0KCk7ICkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIFJlbmRlcmVyQmVhbiByZW5kZXJlciA9IHJlbmRlcmVySXRlcmF0b3IubmV4dCgpOw0KLSAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICAgYm9vbGVhbiByZW5kZXJlckNyZWF0ZWQgPSBmYWxzZTsNCi0gICAgICAgICAgICAgICAgUmVuZGVyZXJNZXRhIHJlbmRlcmVyTWV0YSA9IHRhcmdldENvbXBvbmVudC5maW5kUmVuZGVyZXIocmVuZGVyZXIuZ2V0Q29tcG9uZW50RmFtaWx5KCksIHJlbmRlcmVyLmdldFJlbmRlcmVyVHlwZSgpKTsNCi0gICAgICAgICAgICAgICAgaWYgKHJlbmRlcmVyTWV0YSA9PSBudWxsKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICByZW5kZXJlck1ldGEgPSBuZXcgUmVuZGVyZXJNZXRhKCk7DQotICAgICAgICAgICAgICAgICAgICByZW5kZXJlckNyZWF0ZWQgPSB0cnVlOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgICByZW5kZXJlck1ldGEuc2V0TW9kZWxJZChtb2RlbC5nZXRNb2RlbElkKCkpOw0KLSAgICAgICAgICAgICAgICByZW5kZXJlck1ldGEuc2V0Q2xhc3NOYW1lKHJlbmRlcmVyLmdldFJlbmRlcmVyQ2xhc3MoKSk7DQotICAgICAgICAgICAgICAgIHJlbmRlcmVyTWV0YS5zZXRQYXJlbnRDbGFzc05hbWUocmVuZGVyZXIuZ2V0UmVuZGVyZXJTdXBlcmNsYXNzKCkpOw0KLSAgICAgICAgICAgICAgICByZW5kZXJlck1ldGEuc2V0Q29tcG9uZW50RmFtaWx5KHJlbmRlcmVyLmdldENvbXBvbmVudEZhbWlseSgpKTsNCi0gICAgICAgICAgICAgICAgcmVuZGVyZXJNZXRhLnNldFJlbmRlcmVyVHlwZShyZW5kZXJlci5nZXRSZW5kZXJlclR5cGUoKSk7DQotICAgICAgICAgICAgICAgIHJlbmRlcmVyTWV0YS5zZXREZXNjcmlwdGlvbihyZW5kZXJlci5nZXREZXNjcmlwdGlvbigpKTsNCi0NCi0gICAgICAgICAgICAgICAgaWYgKHJlbmRlcmVyQ3JlYXRlZCkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgdGFyZ2V0Q29tcG9uZW50LmFkZFJlbmRlcmVyKHJlbmRlcmVyTWV0YSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgaWYgKGNyZWF0ZWQpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBtb2RlbC5hZGRSZW5kZXJLaXQodGFyZ2V0Q29tcG9uZW50KTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0gICAgDQotICAgIHByaXZhdGUgU3RyaW5nIGdldFRhZ1ByZWZpeChRTmFtZSB0YWdOYW1lKQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgcHJlZml4ID0gdGFnTmFtZS5nZXRQcmVmaXgoKTsNCi0gICAgICAgIA0KLSAgICAgICAgaWYgKHByZWZpeCAhPSBudWxsICYmIHByZWZpeC5sZW5ndGgoKSA+IDApDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHByZWZpeDsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAoImh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvdHJpbmlkYWQiLmVxdWFscyh0YWdOYW1lLmdldE5hbWVzcGFjZVVSSSgpKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiAidHIiOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlbHNlIGlmICgiaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy90cmluaWRhZC9odG1sIi5lcXVhbHModGFnTmFtZS5nZXROYW1lc3BhY2VVUkkoKSkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gInRyaCI7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiB0YWdOYW1lLmdldE5hbWVzcGFjZVVSSSgpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICANCi0gICAgcHJpdmF0ZSB2b2lkIHZpc2l0UHJvcGVydGllcyhBYnN0cmFjdFRhZ0JlYW4gc291cmNlQ29tcG9uZW50LCBQcm9wZXJ0eUhvbGRlciB0YXJnZXRDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIGZvciAoSXRlcmF0b3I8UHJvcGVydHlCZWFuPiBwcm9wZXJ0eUl0ZXJhdG9yID0gc291cmNlQ29tcG9uZW50LnByb3BlcnRpZXMoKTsgcHJvcGVydHlJdGVyYXRvci5oYXNOZXh0KCk7KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIFByb3BlcnR5QmVhbiBwcm9wZXJ0eSA9IHByb3BlcnR5SXRlcmF0b3IubmV4dCgpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIFByb3BlcnR5TWV0YSBwcm9wZXJ0eU1ldGEgPSB0YXJnZXRDb21wb25lbnQuZ2V0UHJvcGVydHkocHJvcGVydHkuZ2V0UHJvcGVydHlOYW1lKCkpOw0KLSAgICAgICAgICAgIGJvb2xlYW4gcHJvcGVydHlDcmVhdGVkID0gZmFsc2U7DQotICAgICAgICAgICAgaWYgKHByb3BlcnR5TWV0YSA9PSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcHJvcGVydHlNZXRhID0gbmV3IFByb3BlcnR5TWV0YSgpOw0KLSAgICAgICAgICAgICAgICBwcm9wZXJ0eUNyZWF0ZWQgPSB0cnVlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAvLyBuYW1lDQotICAgICAgICAgICAgcHJvcGVydHlNZXRhLnNldE5hbWUocHJvcGVydHkuZ2V0UHJvcGVydHlOYW1lKCkpOw0KLSAgICAgICAgICAgIC8vIGNsYXNzTmFtZQ0KLSAgICAgICAgICAgIHByb3BlcnR5TWV0YS5zZXRDbGFzc05hbWUocHJvcGVydHkuZ2V0UHJvcGVydHlDbGFzcygpKTsNCi0gICAgICAgICAgICAvLyBqc3BOYW1lDQotICAgICAgICAgICAgcHJvcGVydHlNZXRhLnNldEpzcE5hbWUocHJvcGVydHkuZ2V0SnNwUHJvcGVydHlOYW1lKCkpOw0KLSAgICAgICAgICAgIC8vIGZpZWxkTmFtZQ0KLSAgICAgICAgICAgIHByb3BlcnR5TWV0YS5zZXRGaWVsZE5hbWUocHJvcGVydHkuZ2V0RmllbGRQcm9wZXJ0eU5hbWUoKSk7DQotICAgICAgICAgICAgLy8gcmVxdWlyZWQNCi0gICAgICAgICAgICBpZiAocHJvcGVydHkuaXNSZXF1aXJlZCgpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcHJvcGVydHlNZXRhLnNldFJlcXVpcmVkKHByb3BlcnR5LmlzUmVxdWlyZWQoKSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIC8vIGxpdGVyYWxPbmx5DQotICAgICAgICAgICAgaWYgKHByb3BlcnR5LmlzTGl0ZXJhbE9ubHkoKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHByb3BlcnR5TWV0YS5zZXRMaXRlcmFsT25seShwcm9wZXJ0eS5pc0xpdGVyYWxPbmx5KCkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAvLyB0cmFuc2llbnQNCi0gICAgICAgICAgICBpZiAocHJvcGVydHkuaXNUcmFuc2llbnQoKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHByb3BlcnR5TWV0YS5zZXRUcmFuc2llbnQocHJvcGVydHkuaXNUcmFuc2llbnQoKSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIC8vIHN0YXRlSG9sZGVyDQotICAgICAgICAgICAgaWYocHJvcGVydHkuaXNTdGF0ZUhvbGRlcigpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcHJvcGVydHlNZXRhLnNldFN0YXRlSG9sZGVyKHByb3BlcnR5LmlzU3RhdGVIb2xkZXIoKSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIC8vIGRlc2NyaXB0aW9uDQotICAgICAgICAgICAgcHJvcGVydHlNZXRhLnNldERlc2NyaXB0aW9uKHByb3BlcnR5LmdldERlc2NyaXB0aW9uKCkpOw0KLSAgICAgICAgICAgIC8vIGxvbmdEZXNjcmlwdGlvbg0KLSAgICAgICAgICAgIHByb3BlcnR5TWV0YS5zZXRMb25nRGVzY3JpcHRpb24ocHJvcGVydHkuZ2V0RGVzY3JpcHRpb24oKSk7DQotICAgICAgICAgICAgLy8gZGVmYXVsdFZhbHVlOw0KLSAgICAgICAgICAgIHByb3BlcnR5TWV0YS5zZXREZWZhdWx0VmFsdWUocHJvcGVydHkuZ2V0RGVmYXVsdFZhbHVlKCkpOw0KLSAgICAgICAgICAgIC8vIHJ0ZXhwcnZhbHVlOw0KLSAgICAgICAgICAgIGlmIChwcm9wZXJ0eS5pc1J0ZXhwcnZhbHVlKCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBwcm9wZXJ0eU1ldGEuc2V0UnRleHBydmFsdWUocHJvcGVydHkuaXNSdGV4cHJ2YWx1ZSgpKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgTWV0aG9kU2lnbmF0dXJlQmVhbiBtc2IgPSBwcm9wZXJ0eS5nZXRNZXRob2RCaW5kaW5nU2lnbmF0dXJlKCk7DQotICAgICAgICAgICAgaWYgKG1zYiAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgTWV0aG9kU2lnbmF0dXJlTWV0YSBtc20gPSBuZXcgTWV0aG9kU2lnbmF0dXJlTWV0YSgpOw0KLSAgICAgICAgICAgICAgICBtc20uc2V0UmV0dXJuVHlwZShtc2IuZ2V0UmV0dXJuVHlwZSgpKTsNCi0gICAgICAgICAgICAgICAgZm9yIChTdHJpbmcgcGFyYW1UeXBlIDogbXNiLmdldFBhcmFtZXRlclR5cGVzKCkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIG1zbS5hZGRQYXJhbWV0ZXJUeXBlKHBhcmFtVHlwZSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgcHJvcGVydHlNZXRhLnNldE1ldGhvZEJpbmRpbmdTaWduYXR1cmUobXNtKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgaWYgKHByb3BlcnR5LmlzVGFnQXR0cmlidXRlRXhjbHVkZWQoKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHByb3BlcnR5TWV0YS5zZXRUYWdFeGNsdWRlZChCb29sZWFuLlRSVUUpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAvKg0KLSAgICAgICAgICAgIHBhcnRpYWxTdGF0ZUhvbGRlcg0KLSAgICAgICAgICAgIGluaGVyaXRlZA0KLSAgICAgICAgICAgIGluaGVyaXRlZFRhZw0KLSAgICAgICAgICAgIHRhZ0V4Y2x1ZGVkDQotICAgICAgICAgICAgZ2VuZXJhdGVkDQotICAgICAgICAgICAgbG9jYWxNZXRob2RTY29wZQ0KLSAgICAgICAgICAgIGxvY2FsTWV0aG9kDQotICAgICAgICAgICAgc2V0TWV0aG9kU2NvcGUNCi0gICAgICAgICAgICBzZXRNZXRob2QNCi0gICAgICAgICAgICBjbGllbnRFdmVudA0KLSAgICAgICAgICAgIGRlZmVycmVkVmFsdWVUeXBlDQotICAgICAgICAgICAgZmFjZWxldHNPbmx5DQotICAgICAgICAgICAgKi8NCi0gICAgICAgICAgICBpZiAocHJvcGVydHlDcmVhdGVkKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdGFyZ2V0Q29tcG9uZW50LmFkZFByb3BlcnR5KHByb3BlcnR5TWV0YSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvdHJpbmlkYWQvcGFyc2UvQWJzdHJhY3RUYWdCZWFuLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL3RyaW5pZGFkL3BhcnNlL0Fic3RyYWN0VGFnQmVhbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5M2UzNDljLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvdHJpbmlkYWQvcGFyc2UvQWJzdHJhY3RUYWdCZWFuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOTUgKzAsMCBAQAotLyoNCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqIA0KLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKiANCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmJ1aWxkZXIudHJpbmlkYWQucGFyc2U7DQotDQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1vZGlmaWVyOw0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsNCi0NCi1wdWJsaWMgY2xhc3MgQWJzdHJhY3RUYWdCZWFuIGV4dGVuZHMgT2JqZWN0QmVhbiB7DQotICBwcml2YXRlIExpc3Q8U3RyaW5nPiBfYWNjZXNzaWJpbGl0eUd1aWRlbGluZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsNCi0gIHByaXZhdGUgU3RyaW5nICAgICAgIF9kZXNjcmlwdGlvbjsNCi0gIHByaXZhdGUgU3RyaW5nICAgICAgIF9sb25nRGVzY3JpcHRpb247DQotICBwcml2YXRlIFFOYW1lICAgICAgICBfdGFnTmFtZTsNCi0gIHByaXZhdGUgU3RyaW5nICAgICAgIF90YWdDbGFzczsNCi0gIHByb3RlY3RlZCBNYXA8U3RyaW5nLCBQcm9wZXJ0eUJlYW4+IF9wcm9wZXJ0aWVzOw0KLSAgcHJpdmF0ZSBpbnQgICAgICAgICAgX3RhZ0NsYXNzTW9kaWZpZXJzOw0KLSAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBFeGFtcGxlQmVhbj4gICAgX2V4YW1wbGVzOw0KLSAgcHJpdmF0ZSBpbnQgICAgICAgICAgX2V4YW1wbGVJZHggPSAwOw0KLSAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBTY3JlZW5zaG90QmVhbj4gX3NjcmVlbnNob3RzOw0KLSAgcHJpdmF0ZSBpbnQgICAgICAgICAgX3NjcmVlbnNob3RJZHggPSAwOw0KLSAgDQotICBwdWJsaWMgQWJzdHJhY3RUYWdCZWFuKCkgDQotICB7DQotICAgIHRoaXMoZmFsc2UpOw0KLSAgfQ0KLQ0KLSAgcHVibGljIEFic3RyYWN0VGFnQmVhbihib29sZWFuIGlzQ29tcG9uZW50QmVhbikgDQotICB7DQotICAgIC8vIENvbXBvbmVudCBCZWFuIGRvZXMgaXRzIG93biB0aGluZw0KLSAgICAvLyB3aXRoIHByb3BlcnRpZXMuICBUaGUgb3RoZXIgYmVhbg0KLSAgICAvLyB0eXBlcywgaS5lLiBDb252ZXJ0ZXJzIGFuZCBWYWxpZGF0b3JzDQotICAgIC8vIHVzZSB0aGUgc2FtZSBwcm9wZXJ0aWVzLg0KLSAgICBpZiAoIWlzQ29tcG9uZW50QmVhbikNCi0gICAgew0KLSAgICAgIF9wcm9wZXJ0aWVzID0gbmV3IExpbmtlZEhhc2hNYXA8U3RyaW5nLCBQcm9wZXJ0eUJlYW4+KCk7DQotICAgIH0NCi0gICAgX2V4YW1wbGVzICAgPSBuZXcgTGlua2VkSGFzaE1hcDxTdHJpbmcsIEV4YW1wbGVCZWFuPigpOyAgICAgIA0KLSAgICBfc2NyZWVuc2hvdHMgPSBuZXcgTGlua2VkSGFzaE1hcDxTdHJpbmcsIFNjcmVlbnNob3RCZWFuPigpOyAgIA0KLSAgfQ0KLQ0KLSAgLyoqDQotICAgKiBTZXRzIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGlzIHByb3BlcnR5Lg0KLSAgICoNCi0gICAqIEBwYXJhbSBkZXNjcmlwdGlvbiAgdGhlIHByb3BlcnR5IGRlc2NyaXB0aW9uDQotICAgKi8NCi0gIHB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKA0KLSAgICBTdHJpbmcgZGVzY3JpcHRpb24pDQotICB7DQotICAgIF9kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOw0KLSAgfQ0KLQ0KLSAgLyoqDQotICAgKiBSZXR1cm5zIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGlzIHByb3BlcnR5Lg0KLSAgICoNCi0gICAqIEByZXR1cm4gIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdGlvbg0KLSAgICovDQotICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkNCi0gIHsNCi0gICAgcmV0dXJuIF9kZXNjcmlwdGlvbjsNCi0gIH0NCi0NCi0gIC8qKg0KLSAgICogU2V0cyB0aGUgbG9uZyBkZXNjcmlwdGlvbiBvZiB0aGlzIHByb3BlcnR5Lg0KLSAgICoNCi0gICAqIEBwYXJhbSBsb25nRGVzY3JpcHRpb24gIHRoZSBsb25nIHByb3BlcnR5IGRlc2NyaXB0aW9uDQotICAgKi8NCi0gIHB1YmxpYyB2b2lkIHNldExvbmdEZXNjcmlwdGlvbigNCi0gICAgU3RyaW5nIGxvbmdEZXNjcmlwdGlvbikNCi0gIHsNCi0gICAgX2xvbmdEZXNjcmlwdGlvbiA9IGxvbmdEZXNjcmlwdGlvbjsNCi0gIH0NCi0NCi0gIC8qKg0KLSAgICogUmV0dXJucyB0aGUgbG9uZyBkZXNjcmlwdGlvbiBvZiB0aGlzIHByb3BlcnR5Lg0KLSAgICoNCi0gICAqIEByZXR1cm4gIHRoZSBsb25nIHByb3BlcnR5IGRlc2NyaXB0aW9uDQotICAgKi8NCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TG9uZ0Rlc2NyaXB0aW9uKCkNCi0gIHsNCi0gICAgcmV0dXJuIF9sb25nRGVzY3JpcHRpb247DQotICB9DQotDQotICAvKioNCi0gICAqIFNldHMgdGhlIEpTUCB0YWcgaGFuZGxlciBjbGFzcyBmb3IgdGhpcyBjb21wb25lbnQuDQotICAgKg0KLSAgICogQHBhcmFtIHRhZ0NsYXNzICB0aGUgSlNQIHRhZyBoYW5kbGVyIGNsYXNzDQotICAgKi8NCi0gIHB1YmxpYyB2b2lkIHNldFRhZ0NsYXNzKA0KLSAgICBTdHJpbmcgdGFnQ2xhc3MpDQotICB7DQotICAgIF90YWdDbGFzcyA9IHRhZ0NsYXNzOw0KLSAgfQ0KLQ0KLSAgLyoqDQotICAgKiBSZXR1cm5zIHRoZSBKU1AgdGFnIGhhbmRsZXIgY2xhc3MgZm9yIHRoaXMgY29tcG9uZW50Lg0KLSAgICoNCi0gICAqIEByZXR1cm4gIHRoZSBKU1AgdGFnIGhhbmRsZXIgY2xhc3MNCi0gICAqLw0KLSAgcHVibGljIFN0cmluZyBnZXRUYWdDbGFzcygpDQotICB7DQotICAgIHJldHVybiBfdGFnQ2xhc3M7DQotICB9DQotDQotICAvKioNCi0gICAqIFNldHMgdGhlIEpTUCB0YWcgbmFtZSBmb3IgdGhpcyBjb21wb25lbnQuDQotICAgKg0KLSAgICogQHBhcmFtIHRhZ05hbWUgIHRoZSBKU1AgdGFnIG5hbWUNCi0gICAqLw0KLSAgcHVibGljIHZvaWQgc2V0VGFnTmFtZSgNCi0gICAgICBRTmFtZSB0YWdOYW1lKQ0KLSAgew0KLSAgICBfdGFnTmFtZSA9IHRhZ05hbWU7DQotICB9DQotDQotDQotICAvKioNCi0gICAqIFJldHVybnMgdGhlIEpTUCB0YWcgbmFtZSBmb3IgdGhpcyBjb21wb25lbnQuDQotICAgKg0KLSAgICogQHJldHVybiAgdGhlIEpTUCB0YWcgbmFtZQ0KLSAgICovDQotICBwdWJsaWMgUU5hbWUgZ2V0VGFnTmFtZSgpDQotICB7DQotICAgIHJldHVybiBfdGFnTmFtZTsNCi0gIH0NCi0NCi0gIC8qKg0KLSAgICogQWRkcyBhIHByb3BlcnR5IHRvIHRoaXMgY29tcG9uZW50Lg0KLSAgICoNCi0gICAqIEBwYXJhbSBwcm9wZXJ0eSAgdGhlIHByb3BlcnR5IHRvIGFkZA0KLSAgICovDQotICBwdWJsaWMgdm9pZCBhZGRQcm9wZXJ0eSgNCi0gICAgUHJvcGVydHlCZWFuIHByb3BlcnR5KQ0KLSAgew0KLSAgICBfcHJvcGVydGllcy5wdXQocHJvcGVydHkuZ2V0UHJvcGVydHlOYW1lKCksIHByb3BlcnR5KTsNCi0gIH0NCi0NCi0gIC8qKg0KLSAgICogUmV0dXJucyB0aGUgcHJvcGVydHkgZm9yIHRoaXMgcHJvcGVydHkgbmFtZS4NCi0gICAqDQotICAgKiBAcGFyYW0gcHJvcGVydHlOYW1lICB0aGUgcHJvcGVydHkgbmFtZSB0byBmaW5kDQotICAgKi8NCi0gIHB1YmxpYyBQcm9wZXJ0eUJlYW4gZmluZFByb3BlcnR5KA0KLSAgICBTdHJpbmcgcHJvcGVydHlOYW1lKQ0KLSAgew0KLSAgICByZXR1cm4gX3Byb3BlcnRpZXMuZ2V0KHByb3BlcnR5TmFtZSk7DQotICB9DQotDQotICAvKioNCi0gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGNvbXBvbmVudCBoYXMgYW55IHByb3BlcnRpZXMuDQotICAgKg0KLSAgICogQHJldHVybiAgdHJ1ZSAgIGlmIHRoaXMgY29tcG9uZW50IGhhcyBhbnkgcHJvcGVydGllcywNCi0gICAqICAgICAgICAgIGZhbHNlICBvdGhlcndpc2UNCi0gICAqLw0KLSAgcHVibGljIGJvb2xlYW4gaGFzUHJvcGVydGllcygpDQotICB7DQotICAgIHJldHVybiAhX3Byb3BlcnRpZXMuaXNFbXB0eSgpOw0KLSAgfQ0KLQ0KLSAgLyoqDQotICAgKiBSZXR1cm5zIGFuIGl0ZXJhdG9yIGZvciBhbGwgcHJvcGVydGllcyBvbiB0aGlzIGNvbXBvbmVudCBvbmx5Lg0KLSAgICoNCi0gICAqIEByZXR1cm4gIHRoZSBwcm9wZXJ0eSBpdGVyYXRvcg0KLSAgICovDQotICBwdWJsaWMgSXRlcmF0b3I8UHJvcGVydHlCZWFuPiBwcm9wZXJ0aWVzKCkNCi0gIHsNCi0gICAgcmV0dXJuIF9wcm9wZXJ0aWVzLnZhbHVlcygpLml0ZXJhdG9yKCk7DQotICB9DQotDQotICAvKioNCi0gICAqIEFkZHMgYSBFeGFtcGxlIHRvIHRoaXMgY29tcG9uZW50Lg0KLSAgICoNCi0gICAqIEBwYXJhbSBleGFtcGxlICB0aGUgZXhhbXBsZSB0byBhZGQNCi0gICAqLw0KLSAgcHVibGljIHZvaWQgYWRkRXhhbXBsZSgNCi0gICAgRXhhbXBsZUJlYW4gZXhhbXBsZSkNCi0gIHsNCi0gICAgU3RyaW5nIGtleSA9IF9nZW5lcmF0ZUV4YW1wbGVLZXkoKTsNCi0gICAgZXhhbXBsZS5zZXRLZXkoa2V5KTsNCi0gICAgX2V4YW1wbGVzLnB1dChrZXksIGV4YW1wbGUpOw0KLSAgfQ0KLQ0KLSAgLyoqDQotICAgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBjb21wb25lbnQgaGFzIGFueSBleGFtcGxlcy4NCi0gICAqDQotICAgKiBAcmV0dXJuICB0cnVlICAgaWYgdGhpcyBjb21wb25lbnQgaGFzIGFueSBleGFtcGxlcywNCi0gICAqICAgICAgICAgIGZhbHNlICBvdGhlcndpc2UNCi0gICAqLw0KLSAgcHVibGljIGJvb2xlYW4gaGFzRXhhbXBsZXMoKQ0KLSAgew0KLSAgICByZXR1cm4gIV9leGFtcGxlcy5pc0VtcHR5KCk7DQotICB9DQotDQotICAvKioNCi0gICAqIFJldHVybnMgdGhlIGV4YW1wbGUgZm9yIHRoaXMgZXhhbXBsZSBrZXkuDQotICAgKg0KLSAgICogQHBhcmFtIGtleSAgdGhlIGhhc2htYXAgZXhhbXBsZSBrZXkNCi0gICAqLw0KLSAgcHVibGljIEV4YW1wbGVCZWFuIGZpbmRFeGFtcGxlKA0KLSAgICBTdHJpbmcga2V5KQ0KLSAgew0KLSAgICByZXR1cm4gX2V4YW1wbGVzLmdldChrZXkpOw0KLSAgfQ0KLQ0KLSAgLyoqDQotICAgKiBSZXR1cm5zIGFuIGl0ZXJhdG9yIGZvciBhbGwgZXhhbXBsZXMgb24gdGhpcyBjb21wb25lbnQgb25seS4NCi0gICAqDQotICAgKiBAcmV0dXJuICB0aGUgZXhhbXBsZSBpdGVyYXRvcg0KLSAgICovDQotICBwdWJsaWMgSXRlcmF0b3I8RXhhbXBsZUJlYW4+IGV4YW1wbGVzKCkNCi0gIHsNCi0gICAgcmV0dXJuIF9leGFtcGxlcy52YWx1ZXMoKS5pdGVyYXRvcigpOw0KLSAgfQ0KLQ0KLSAgLyoqDQotICAgKiBBZGRzIGEgU2NyZWVuc2hvdCB0byB0aGlzIGNvbXBvbmVudC4NCi0gICAqDQotICAgKiBAcGFyYW0gc2NyZWVuc2hvdCAgdGhlIHNjcmVlbnNob3QgdG8gYWRkDQotICAgKi8NCi0gIHB1YmxpYyB2b2lkIGFkZFNjcmVlbnNob3QoDQotICAgIFNjcmVlbnNob3RCZWFuIHNjcmVlbnNob3QpDQotICB7DQotICAgIFN0cmluZyBrZXkgPSBfZ2VuZXJhdGVTY3JlZW5zaG90S2V5KCk7DQotICAgIHNjcmVlbnNob3Quc2V0S2V5KGtleSk7DQotICAgIF9zY3JlZW5zaG90cy5wdXQoa2V5LCBzY3JlZW5zaG90KTsNCi0gIH0NCi0NCi0gIC8qKg0KLSAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgY29tcG9uZW50IGhhcyBhbnkgc2NyZWVuc2hvdHMuDQotICAgKg0KLSAgICogQHJldHVybiAgdHJ1ZSAgIGlmIHRoaXMgY29tcG9uZW50IGhhcyBhbnkgc2NyZWVuc2hvdHMsDQotICAgKiAgICAgICAgICBmYWxzZSAgb3RoZXJ3aXNlDQotICAgKi8NCi0gIHB1YmxpYyBib29sZWFuIGhhc1NjcmVlbnNob3RzKCkNCi0gIHsNCi0gICAgcmV0dXJuICFfc2NyZWVuc2hvdHMuaXNFbXB0eSgpOw0KLSAgfQ0KLQ0KLSAgLyoqDQotICAgKiBSZXR1cm5zIHRoZSBzY3JlZW5zaG90IGZvciB0aGlzIHNjcmVlbnNob3Qga2V5Lg0KLSAgICoNCi0gICAqIEBwYXJhbSBrZXkgIHRoZSBoYXNobWFwIHNjcmVlbnNob3Qga2V5DQotICAgKi8NCi0gIHB1YmxpYyBTY3JlZW5zaG90QmVhbiBmaW5kU2NyZWVuc2hvdCgNCi0gICAgU3RyaW5nIGtleSkNCi0gIHsNCi0gICAgcmV0dXJuIF9zY3JlZW5zaG90cy5nZXQoa2V5KTsNCi0gIH0NCi0NCi0gIC8qKg0KLSAgKiBSZXR1cm5zIGFuIGl0ZXJhdG9yIGZvciBhbGwgc2NyZWVuc2hvdHMgb24gdGhpcyBjb21wb25lbnQgb25seS4NCi0gICoNCi0gICogQHJldHVybiAgdGhlIHNjcmVlbnNob3QgaXRlcmF0b3INCi0gICovDQotICBwdWJsaWMgSXRlcmF0b3I8U2NyZWVuc2hvdEJlYW4+IHNjcmVlbnNob3RzKCkNCi0gIHsNCi0gICAgcmV0dXJuIF9zY3JlZW5zaG90cy52YWx1ZXMoKS5pdGVyYXRvcigpOw0KLSAgfQ0KLQ0KLSAgLyoqDQotICAgKiBBZGRzIGFuIEFjY2Vzc2liaWxpdHkgKGUuZy4gc2VjdGlvbiA1MDggY29tcGxpYW5jZSkgR3VpZGVsaW5lIHRvIHRoaXMgY29tcG9uZW50LiBUaGUNCi0gICAqIGFjY2Vzc2liaWxpdHkgZ3VpZGVsaW5lcyBhcmUgdXNlZCBkdXJpbmcgdGFnIGRvYyBnZW5lcmF0aW9uIHRvIGdpdmUgdGhlIGFwcGxpY2F0aW9uDQotICAgKiBkZXZlbG9wZXIgaGludHMgb24gaG93IHRvIGNvbmZpZ3VyZSB0aGUgY29tcG9uZW50IHRvIGJlIGFjY2Vzc2liaWxpdHktY29tcGxpYW50Lg0KLSAgICoNCi0gICAqIEBwYXJhbSBhY2Nlc3NpYmlsaXR5R3VpZGVsaW5lICB0aGUgYWNjZXNzaWJpbGl0eSBndWlkZWxpbmUgdG8gYWRkDQotICAgKi8NCi0gIHB1YmxpYyB2b2lkIGFkZEFjY2Vzc2liaWxpdHlHdWlkZWxpbmUoDQotICAgIFN0cmluZyBhY2Nlc3NpYmlsaXR5R3VpZGVsaW5lKQ0KLSAgew0KLSAgICBfYWNjZXNzaWJpbGl0eUd1aWRlbGluZXMuYWRkKGFjY2Vzc2liaWxpdHlHdWlkZWxpbmUpOyAgICANCi0gIH0NCi0NCi0gIC8qKg0KLSAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgY29tcG9uZW50IGhhcyBhbnkgYWNjZXNzaWJpbGl0eSBndWlkZWxpbmVzLg0KLSAgICoNCi0gICAqIEByZXR1cm4gIHRydWUgICBpZiB0aGlzIGNvbXBvbmVudCBoYXMgYW55IGFjY2Vzc2liaWxpdHkgZ3VpZGVsaW5lcywNCi0gICAqICAgICAgICAgIGZhbHNlICBvdGhlcndpc2UNCi0gICAqLw0KLSAgcHVibGljIGJvb2xlYW4gaGFzQWNjZXNzaWJpbGl0eUd1aWRlbGluZXMoKQ0KLSAgew0KLSAgICByZXR1cm4gIV9hY2Nlc3NpYmlsaXR5R3VpZGVsaW5lcy5pc0VtcHR5KCk7DQotICB9DQotDQotICAvKioNCi0gICAqIFJldHVybnMgYW4gaXRlcmF0b3IgZm9yIGFsbCBhY2Nlc3NpYmlsaXR5IGd1aWRlbGluZXMgb24gdGhpcyBjb21wb25lbnQgb25seS4NCi0gICAqDQotICAgKiBAcmV0dXJuICB0aGUgYWNjZXNzaWJpbGl0eSBndWlkZWxpbmVzIGl0ZXJhdG9yDQotICAgKi8NCi0gIHB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGFjY2Vzc2liaWxpdHlHdWlkZWxpbmVzKCkNCi0gIHsNCi0gICAgcmV0dXJuIF9hY2Nlc3NpYmlsaXR5R3VpZGVsaW5lcy5pdGVyYXRvcigpOw0KLSAgfQ0KLQ0KLSAgcHVibGljIHZvaWQgcGFyc2VUYWdDbGFzc01vZGlmaWVyKA0KLSAgICBTdHJpbmcgbW9kaWZpZXIpDQotICB7DQotICAgIGFkZFRhZ0NsYXNzTW9kaWZpZXIoX3BhcnNlTW9kaWZpZXIobW9kaWZpZXIpKTsNCi0gIH0NCi0NCi0gIHByb3RlY3RlZCBpbnQgX3BhcnNlTW9kaWZpZXIoDQotICAgIFN0cmluZyB0ZXh0KQ0KLSAgew0KLSAgICBpZiAoInB1YmxpYyIuZXF1YWxzKHRleHQpKQ0KLSAgICAgIHJldHVybiBNb2RpZmllci5QVUJMSUM7DQotICAgIGVsc2UgaWYgKCJwcm90ZWN0ZWQiLmVxdWFscyh0ZXh0KSkNCi0gICAgICByZXR1cm4gTW9kaWZpZXIuUFJPVEVDVEVEOw0KLSAgICBlbHNlIGlmICgicHJpdmF0ZSIuZXF1YWxzKHRleHQpKQ0KLSAgICAgIHJldHVybiBNb2RpZmllci5QUklWQVRFOw0KLSAgICBlbHNlIGlmICgiYWJzdHJhY3QiLmVxdWFscyh0ZXh0KSkNCi0gICAgICByZXR1cm4gTW9kaWZpZXIuQUJTVFJBQ1Q7DQotICAgIGVsc2UgaWYgKCJmaW5hbCIuZXF1YWxzKHRleHQpKQ0KLSAgICAgIHJldHVybiBNb2RpZmllci5GSU5BTDsNCi0NCi0gICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVW5yZWNvZ25pemVkIG1vZGlmaWVyOiAiICsgdGV4dCk7DQotICB9DQotDQotICAvKioNCi0gICAqIEFkZHMgYSBKYXZhIExhbmd1YWdlIGNsYXNzIG1vZGlmaWVyIHRvIHRoZSB0YWcgY2xhc3MuDQotICAgKg0KLSAgICogQHBhcmFtIG1vZGlmaWVyICB0aGUgbW9kaWZpZXIgdG8gYmUgYWRkZWQNCi0gICAqLw0KLSAgcHVibGljIHZvaWQgYWRkVGFnQ2xhc3NNb2RpZmllcigNCi0gICAgaW50IG1vZGlmaWVyKQ0KLSAgew0KLSAgICBfdGFnQ2xhc3NNb2RpZmllcnMgfD0gbW9kaWZpZXI7DQotICB9DQotDQotICAvKioNCi0gICAqIFJldHVybnMgdGhlIEphdmEgTGFuZ3VhZ2UgY2xhc3MgbW9kaWZpZXJzIGZvciB0aGUgdGFnIGNsYXNzLg0KLSAgICogQnkgZGVmYXVsdCwgdGhlc2UgbW9kaWZpZXJzIGluY2x1ZGUgTW9kaWZpZXIuUFVCTElDLg0KLSAgICoNCi0gICAqIEByZXR1cm4gIHRoZSBKYXZhIExhbmd1YWdlIGNsYXNzIG1vZGlmaWVycyBmb3IgdGhlIHRhZyBjbGFzcw0KLSAgICovDQotICBwdWJsaWMgaW50IGdldFRhZ0NsYXNzTW9kaWZpZXJzKCkNCi0gIHsNCi0gICAgaW50IG1vZGlmaWVycyA9IF90YWdDbGFzc01vZGlmaWVyczsNCi0NCi0gICAgaWYgKCFNb2RpZmllci5pc1ByaXZhdGUobW9kaWZpZXJzKSAmJg0KLSAgICAgICAgIU1vZGlmaWVyLmlzUHJvdGVjdGVkKG1vZGlmaWVycykgJiYNCi0gICAgICAgICFNb2RpZmllci5pc1B1YmxpYyhtb2RpZmllcnMpKQ0KLSAgICB7DQotICAgICAgbW9kaWZpZXJzIHw9IE1vZGlmaWVyLlBVQkxJQzsNCi0gICAgfQ0KLQ0KLSAgICByZXR1cm4gbW9kaWZpZXJzOw0KLSAgfQ0KLQ0KLSAvKioNCi0gICogTnVtYmVyIG9mIHByb3BlcnRpZXMgZm9yIHRoaXMgY29tcG9uZW50DQotICAqIEByZXR1cm4gbnVtIG9mIHByb3BlcnRpZXMNCi0gICovDQotICBwdWJsaWMgaW50IHByb3BlcnRpZXNTaXplKCkNCi0gIHsNCi0gICAgcmV0dXJuIF9wcm9wZXJ0aWVzLnNpemUoKTsNCi0gIH0NCi0gDQotICAvKiBHZXQgYSBnZW5lcmF0ZWQga2V5IHRvIHVzZSBpbiBzdG9yaW5nDQotICAgKiB0aGlzIGV4YW1wbGUgYmVhbiBpbiBpdHMgaGFzaG1hcC4NCi0gICAqLw0KLSAgcHJpdmF0ZSBTdHJpbmcgX2dlbmVyYXRlRXhhbXBsZUtleSgpDQotICB7DQotICAgIFN0cmluZyBrZXkgPSAiRXhhbXBsZSIgKyBJbnRlZ2VyLnRvU3RyaW5nKF9leGFtcGxlSWR4KTsNCi0gICAgX2V4YW1wbGVJZHgrKzsNCi0gICAgcmV0dXJuIGtleTsNCi0gIH0NCi0gIA0KLSAgLyogR2V0IGEgZ2VuZXJhdGVkIGtleSB0byB1c2UgaW4gc3RvcmluZw0KLSAgICogdGhpcyBzY3JlZW4gc2hvdCBiZWFuIGluIGl0cyBoYXNobWFwLg0KLSAgICovDQotICBwcml2YXRlIFN0cmluZyBfZ2VuZXJhdGVTY3JlZW5zaG90S2V5KCkNCi0gIHsNCi0gICAgU3RyaW5nIGtleSA9ICJTY3JlZW5zaG90IiArIEludGVnZXIudG9TdHJpbmcoX3NjcmVlbnNob3RJZHgpOw0KLSAgICBfc2NyZWVuc2hvdElkeCsrOw0KLSAgICByZXR1cm4ga2V5Ow0KLSAgfSAgDQotfQ0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvdHJpbmlkYWQvcGFyc2UvQWNjZXNzaWJpbGl0eUd1aWRlbGluZUJlYW4uamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvdHJpbmlkYWQvcGFyc2UvQWNjZXNzaWJpbGl0eUd1aWRlbGluZUJlYW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmQyN2JkMC4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL3RyaW5pZGFkL3BhcnNlL0FjY2Vzc2liaWxpdHlHdWlkZWxpbmVCZWFuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKg0KLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICogDQotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqIA0KLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqICB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uYnVpbGRlci50cmluaWRhZC5wYXJzZTsNCi0NCi0vKioNCi0gKiBBY2Nlc3NpYmlsaXR5R3VpZGVsaW5lQmVhbiBpcyBhIEphdmEgcmVwcmVzZW50YXRpb24gb2YgdGhlIGZhY2VzLWNvbmZpZyBtZnA6YWNjZXNzaWJpbGl0eUd1aWRlbGluZXMNCi0gKiBYTUwgZWxlbWVudC4NCi0gKiBBbiBleGFtcGxlIG9mIGhvdyB0aGUgQWNjZXNzaWJpbGl0eUd1aWRlbGluZUJlYW4gd291bGQgYmUgcmVwcmVzZW50ZWQgYXMgYW4gWE1MIGVsZW1lbnQgaXM6DQotICogPG1mcDphY2Nlc3NpYmlsaXR5R3VpZGVsaW5lPg0KLSAqICAgPG1mcDp0eXBlPnJlcXVpcmVkPC9tZnA6dHlwZT4NCi0gKiAgIDxtZnA6ZGVzY3JpcHRpb24+DQotICogICAgIFRpdGxlIGF0dHJpYnV0ZSBtdXN0IGJlIHNldCBpbiBvcmRlciBmb3IgYSBzY3JlZW5yZWFkZXIgdXNlciB0byBpZGVudGlmeSB0aGUgcHVycG9zZSBvZiB0aGUgcG9wdXAgZGlhbG9nLg0KLSAqICAgPC9tZnA6ZGVzY3JpcHRpb24+DQotICogPC9tZnA6YWNjZXNzaWJpbGl0eUd1aWRlbGluZT4NCi0gKi8NCi1wdWJsaWMgY2xhc3MgQWNjZXNzaWJpbGl0eUd1aWRlbGluZUJlYW4gZXh0ZW5kcyBPYmplY3RCZWFuDQotew0KLSAgLyoqDQotICAgKiBHZXQgRGVzY3JpcHRpb24gVGV4dC4gVGhlIGRlc2NyaXB0aW9uIHRleHQgZm9yIHRoZSBhY2Nlc3NpYmlsaXR5IGd1aWRlbGluZS4NCi0gICAqIA0KLSAgICogQHJldHVybiBBY2Nlc3NpYmlsaXR5IEd1aWRlbGluZSBEZXNjcmlwdGlvbiBUZXh0DQotICAgKi8NCi0gIHB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKQ0KLSAgew0KLSAgICByZXR1cm4gX2Rlc2NyaXB0aW9uOw0KLSAgfQ0KLQ0KLSAgLyoqDQotICAgKiBTZXQgYWNjZXNzaWJpbGl0eSBndWlkZWxpbmUgRGVzY3JpcHRpb24gVGV4dC4gIA0KLSAgICoNCi0gICAqIEBwYXJhbSBkZXNjcmlwdGlvbiAgIEFjY2Vzc2liaWxpdHkgR3VpZGVsaW5lIERlc2NyaXB0aW9uIFRleHQuDQotICAgKi8NCi0gIHB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKCBTdHJpbmcgZGVzY3JpcHRpb24gKQ0KLSAgew0KLSAgICBfZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsNCi0gIH0NCi0NCi0gIC8qKg0KLSAgICogUmV0dXJucyB0aGUgdHlwZSBvZiB0aGUgQWNjZXNzaWJpbGl0eSBHdWlkZWxpbmUgKGUuZy4gcmVxdWlyZWQsIHN1Z2dlc3RlZCwgZGlzY291cmFnZWQpLg0KLSAgICoNCi0gICAqIEByZXR1cm4gdHlwZSBvZiBBY2Nlc3NpYmlsaXR5IEd1aWRlbGluZQ0KLSAgICovDQotICBwdWJsaWMgU3RyaW5nIGdldFR5cGUoKQ0KLSAgew0KLSAgICByZXR1cm4gX3R5cGU7DQotICB9DQotDQotICAvKioNCi0gICAqIFNldCBpZiBlbGVtZW50IGlzIHJlcXVpcmVkIHRvIG1lZXQgQWNjZXNzaWJpbGl0eSBHdWlkZWxpbmVzDQotICAgKg0KLSAgICogQHBhcmFtIHJlcXVpcmVkICB3aGV0aGVyIG9yIG5vdCB0aGUgZWxlbWVudCBpcyByZXF1aXJlZCB0byBtZWV0IGFjY2Vzc2liaWxpdHkgZ3VpZGVsaW5lcw0KLSAgICovDQotICBwdWJsaWMgdm9pZCBzZXRUeXBlKCBTdHJpbmcgdHlwZSApDQotICB7DQotICAgIF90eXBlID0gdHlwZTsNCi0gIH0NCi0NCi0gIC8qKg0KLSAgICogUmV0dXJucyBBY2Nlc3NpYmlsaXR5R3VpZGVsaW5lIGhhc2htYXAga2V5Lg0KLSAgICoNCi0gICAqIEByZXR1cm4gQWNjZXNzaWJpbGl0eUd1aWRlbGluZSBoYXNobWFwIGtleQ0KLSAgICovDQotICBwdWJsaWMgU3RyaW5nIGdldEtleSgpDQotICB7DQotICAgIHJldHVybiBfa2V5Ow0KLSAgfQ0KLQ0KLSAgLyoqDQotICAgKiBTZXQgaGFzaG1hcCBrZXkgZm9yIHRoaXMgYWNjZXNzaWJpbGl0eSBndWlkZWxpbmUuDQotICAgKg0KLSAgICogQHBhcmFtIGtleSBTZXQga2V5IGZvciB0aGlzIGFjY2Vzc2liaWxpdHkgZ3VpZGVsaW5lIHB1dCBpbiANCi0gICAqICAgICAgICBDb21wb25lbnRCZWFuIF9hY2Nlc3NpYmlsaXR5R3VpZGVsaW5lcyBoYXNobWFwLg0KLSAgICovDQotICBwcm90ZWN0ZWQgdm9pZCBzZXRLZXkoIFN0cmluZyBrZXkgKQ0KLSAgew0KLSAgICBfa2V5ID0ga2V5Ow0KLSAgfQ0KLQ0KLSAgcHJpdmF0ZSBTdHJpbmcgX2Rlc2NyaXB0aW9uICA9IG51bGw7DQotICBwcml2YXRlIFN0cmluZyBfdHlwZSAgICAgICAgID0gbnVsbDsNCi0gIHByaXZhdGUgU3RyaW5nIF9rZXkgICAgICAgICAgPSBudWxsOw0KLX0NCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL3RyaW5pZGFkL3BhcnNlL0F0dHJpYnV0ZUJlYW4uamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvdHJpbmlkYWQvcGFyc2UvQXR0cmlidXRlQmVhbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOTQxZjIwLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvdHJpbmlkYWQvcGFyc2UvQXR0cmlidXRlQmVhbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYzICswLDAgQEAKLS8qDQotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKiANCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICogDQotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5idWlsZGVyLnRyaW5pZGFkLnBhcnNlOw0KLQ0KLWltcG9ydCBqYXZhLmxhbmcuQ29tcGFyYWJsZTsNCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOw0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLnJlZ2V4Lk1hdGNoZXI7DQotaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOw0KLQ0KLS8qKg0KLSAqIEF0dHJpYnV0ZUJlYW4gaXMgYSBKYXZhIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBmYWNlcy1jb25maWcgY29tcG9uZW50IG9yDQotICogcmVuZGVyZXIgYXR0cmlidXRlIFhNTCBlbGVtZW50Lg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBBdHRyaWJ1dGVCZWFuIGV4dGVuZHMgT2JqZWN0QmVhbiBpbXBsZW1lbnRzIENvbXBhcmFibGUNCi17DQotICAvKioNCi0gICAqIFNldHMgdGhlIG5hbWUgb2YgdGhpcyBhdHRyaWJ1dGUuDQotICAgKg0KLSAgICogQHBhcmFtIGF0dHJpYnV0ZU5hbWUgIHRoZSBhdHRyaWJ1dGUgbmFtZQ0KLSAgICovDQotICBwdWJsaWMgdm9pZCBzZXRBdHRyaWJ1dGVOYW1lKA0KLSAgICBTdHJpbmcgYXR0cmlidXRlTmFtZSkNCi0gIHsNCi0gICAgX2F0dHJpYnV0ZU5hbWUgPSBhdHRyaWJ1dGVOYW1lOw0KLSAgfQ0KLQ0KLSAgLyoqDQotICAgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoaXMgYXR0cmlidXRlLg0KLSAgICoNCi0gICAqIEByZXR1cm4gIHRoZSBhdHRyaWJ1dGUgbmFtZQ0KLSAgICovDQotICBwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZU5hbWUoKQ0KLSAgew0KLSAgICByZXR1cm4gX2F0dHJpYnV0ZU5hbWU7DQotICB9DQotDQotICAvKioNCi0gICAqIFNldHMgdGhlIGF0dHJpYnV0ZSBjbGFzcyBmb3IgdGhpcyBhdHRyaWJ1dGUuDQotICAgKg0KLSAgICogQHBhcmFtIGF0dHJpYnV0ZUNsYXNzICB0aGUgYXR0cmlidXRlIGNsYXNzDQotICAgKi8NCi0gIHB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZUNsYXNzKA0KLSAgICBTdHJpbmcgYXR0cmlidXRlQ2xhc3MpDQotICB7DQotICAgIE1hdGNoZXIgbWF0Y2hlciA9IF9HRU5FUklDX1RZUEUubWF0Y2hlcihhdHRyaWJ1dGVDbGFzcyk7DQotDQotICAgIGlmIChtYXRjaGVyLm1hdGNoZXMoKSkNCi0gICAgew0KLSAgICAgIF9hdHRyaWJ1dGVDbGFzcyA9IG1hdGNoZXIuZ3JvdXAoMSk7DQotICAgICAgX2F0dHJpYnV0ZUNsYXNzUGFyYW1ldGVycyA9IG1hdGNoZXIuZ3JvdXAoMikuc3BsaXQoIiwiKTsNCi0gICAgfQ0KLSAgICBlbHNlDQotICAgIHsNCi0gICAgICBfYXR0cmlidXRlQ2xhc3MgPSBhdHRyaWJ1dGVDbGFzczsNCi0gICAgICBfYXR0cmlidXRlQ2xhc3NQYXJhbWV0ZXJzID0gX0VNUFRZX0FSUkFZOw0KLSAgICB9DQotICB9DQotDQotICAvKioNCi0gICAqIFJldHVybnMgdGhlIGFycmF5IG9mIHBhcmFtZXRlcml6ZWQgdHlwZXMgZm9yIHRoaXMgYXR0cmlidXRlDQotICAgKiBpZiBpdCB1c2VzIGdlbmVyaWNzLg0KLSAgICoNCi0gICAqIEByZXR1cm4gdGhlIGFycmF5IG9mIHBhcmFtZXRlcml6ZWQgdHlwZXMgZm9yIHRoaXMgYXR0cmlidXRlDQotICAgKi8NCi0gIHB1YmxpYyBTdHJpbmdbXSBnZXRBdHRyaWJ1dGVDbGFzc1BhcmFtZXRlcnMoKQ0KLSAgew0KLSAgICByZXR1cm4gX2F0dHJpYnV0ZUNsYXNzUGFyYW1ldGVyczsNCi0gIH0NCi0NCi0gIC8qKg0KLSAgICogUmV0dXJucyB0aGUgYXR0cmlidXRlIGNsYXNzIGZvciB0aGlzIGF0dHJpYnV0ZS4NCi0gICAqDQotICAgKiBAcmV0dXJuICB0aGUgYXR0cmlidXRlIGNsYXNzDQotICAgKi8NCi0gIHB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlQ2xhc3MoKQ0KLSAgew0KLSAgICByZXR1cm4gX2F0dHJpYnV0ZUNsYXNzOw0KLSAgfQ0KLQ0KLSAgLyoqDQotICAgKiBTZXRzIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGlzIGF0dHJpYnV0ZS4NCi0gICAqDQotICAgKiBAcGFyYW0gZGVzY3JpcHRpb24gIHRoZSBhdHRyaWJ1dGUgZGVzY3JpcHRpb24NCi0gICAqLw0KLSAgcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb24oDQotICAgIFN0cmluZyBkZXNjcmlwdGlvbikNCi0gIHsNCi0gICAgX2Rlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247DQotICB9DQotDQotICAvKioNCi0gICAqIFJldHVybnMgdGhlIGRlc2NyaXB0aW9uIG9mIHRoaXMgYXR0cmlidXRlLg0KLSAgICoNCi0gICAqIEByZXR1cm4gIHRoZSBhdHRyaWJ1dGUgZGVzY3JpcHRpb24NCi0gICAqLw0KLSAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpDQotICB7DQotICAgIHJldHVybiBfZGVzY3JpcHRpb247DQotICB9DQotDQotICAvKioNCi0gICAqIFNldHMgdGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhpcyBhdHRyaWJ1dGUuDQotICAgKg0KLSAgICogQHBhcmFtIGRlZmF1bHRWYWx1ZSAgdGhlIGF0dHJpYnV0ZSBkZWZhdWx0IHZhbHVlDQotICAgKi8NCi0gIHB1YmxpYyB2b2lkIHNldERlZmF1bHRWYWx1ZSgNCi0gICAgU3RyaW5nIGRlZmF1bHRWYWx1ZSkNCi0gIHsNCi0gICAgX2RlZmF1bHRWYWx1ZSA9IGRlZmF1bHRWYWx1ZTsNCi0gIH0NCi0NCi0gIC8qKg0KLSAgICogUmV0dXJucyB0aGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGlzIGF0dHJpYnV0ZS4NCi0gICAqDQotICAgKiBAcmV0dXJuICB0aGUgYXR0cmlidXRlIGRlZmF1bHQgdmFsdWUNCi0gICAqLw0KLSAgcHVibGljIFN0cmluZyBnZXREZWZhdWx0VmFsdWUoKQ0KLSAgew0KLSAgICByZXR1cm4gX2RlZmF1bHRWYWx1ZTsNCi0gIH0NCi0NCi0gIC8qKg0KLSAgICogU2V0cyB0aGUgYWx0ZXJuYXRpdmUgY2xhc3MgZm9yIHRoaXMgcHJvcGVydHkuDQotICAgKg0KLSAgICogQHBhcmFtIGFsdGVybmF0ZUNsYXNzICB0aGUgYWx0ZXJuYXRpdmUgY2xhc3MNCi0gICAqLw0KLSAgcHVibGljIHZvaWQgc2V0QWx0ZXJuYXRlQ2xhc3MoDQotICAgIFN0cmluZyBhbHRlcm5hdGVDbGFzcykNCi0gIHsNCi0gICAgX2FsdGVybmF0ZUNsYXNzID0gYWx0ZXJuYXRlQ2xhc3M7DQotICB9DQotDQotICAvKioNCi0gICAqIFJldHVybnMgdGhlIGFsdGVybmF0aXZlIGNsYXNzIGZvciB0aGlzIHByb3BlcnR5Lg0KLSAgICoNCi0gICAqIEByZXR1cm4gIHRoZSBhbHRlcm5hdGl2ZSBjbGFzcw0KLSAgICovDQotICBwdWJsaWMgU3RyaW5nIGdldEFsdGVybmF0ZUNsYXNzKCkNCi0gIHsNCi0gICAgcmV0dXJuIF9hbHRlcm5hdGVDbGFzczsNCi0gIH0NCi0NCi0gIC8qKg0KLSAgICogU2V0cyB0aGUgbWV0aG9kIGJpbmRpbmcgc2lnbmF0dXJlIG9mIHRoaXMgcHJvcGVydHkuDQotICAgKg0KLSAgICogQHBhcmFtIHNpZ25hdHVyZSAgdGhlIG1ldGhvZCBiaW5kaW5nIHNpZ25hdHVyZSBvZiB0aGlzIHByb3BlcnR5DQotICAgKi8NCi0gIHB1YmxpYyB2b2lkIHNldE1ldGhvZEJpbmRpbmdTaWduYXR1cmUoDQotICAgIE1ldGhvZFNpZ25hdHVyZUJlYW4gc2lnbmF0dXJlKQ0KLSAgew0KLSAgICBfc2lnbmF0dXJlID0gc2lnbmF0dXJlOw0KLSAgfQ0KLQ0KLSAgLyoqDQotICAgKiBSZXR1cm5zIHRoZSBtZXRob2QgYmluZGluZyBzaWduYXR1cmUgb2YgdGhpcyBwcm9wZXJ0eS4NCi0gICAqDQotICAgKiBAcmV0dXJuIHRoZSBtZXRob2QgYmluZGluZyBzaWduYXR1cmUgb2YgdGhpcyBwcm9wZXJ0eQ0KLSAgICovDQotICBwdWJsaWMgTWV0aG9kU2lnbmF0dXJlQmVhbiBnZXRNZXRob2RCaW5kaW5nU2lnbmF0dXJlKCkNCi0gIHsNCi0gICAgcmV0dXJuIF9zaWduYXR1cmU7DQotICB9DQotDQotICAvKioNCi0gICAqIEFkZHMgYW4gQWNjZXNzaWJpbGl0eSAoZS5nLiBzZWN0aW9uIDUwOCBjb21wbGlhbmNlKSBHdWlkZWxpbmUgdG8gdGhpcyBhdHRyaWJ1dGUuIFRoZQ0KLSAgICogYWNjZXNzaWJpbGl0eSBndWlkZWxpbmVzIGFyZSB1c2VkIGR1cmluZyB0YWcgZG9jIGdlbmVyYXRpb24gdG8gZ2l2ZSB0aGUgYXBwbGljYXRpb24NCi0gICAqIGRldmVsb3BlciBoaW50cyBvbiBob3cgdG8gY29uZmlndXJlIHRoZSBhdHRyaWJ1dGUgdG8gYmUgYWNjZXNzaWJpbGl0eS1jb21wbGlhbnQuDQotICAgKg0KLSAgICogQHBhcmFtIGFjY2Vzc2liaWxpdHlHdWlkZWxpbmUgIHRoZSBhY2Nlc3NpYmlsaXR5IGd1aWRlbGluZSB0byBhZGQNCi0gICAqLw0KLSAgcHVibGljIHZvaWQgYWRkQWNjZXNzaWJpbGl0eUd1aWRlbGluZSgNCi0gICAgU3RyaW5nIGFjY2Vzc2liaWxpdHlHdWlkZWxpbmUpDQotICB7DQotICAgIF9hY2Nlc3NpYmlsaXR5R3VpZGVsaW5lcy5hZGQoYWNjZXNzaWJpbGl0eUd1aWRlbGluZSk7ICAgICAgDQotICB9DQotDQotICAvKioNCi0gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGF0dHJpYnV0ZSBoYXMgYW55IGFjY2Vzc2liaWxpdHkgZ3VpZGVsaW5lcy4NCi0gICAqDQotICAgKiBAcmV0dXJuICB0cnVlICAgaWYgdGhpcyBjb21wb25lbnQgaGFzIGFueSBhY2Nlc3NpYmlsaXR5IGd1aWRlbGluZXMsDQotICAgKiAgICAgICAgICBmYWxzZSAgb3RoZXJ3aXNlDQotICAgKi8NCi0gIHB1YmxpYyBib29sZWFuIGhhc0FjY2Vzc2liaWxpdHlHdWlkZWxpbmVzKCkNCi0gIHsNCi0gICAgcmV0dXJuICFfYWNjZXNzaWJpbGl0eUd1aWRlbGluZXMuaXNFbXB0eSgpOw0KLSAgfQ0KLQ0KLSAgLyoqDQotICAgKiBSZXR1cm5zIGFuIGl0ZXJhdG9yIGZvciBhbGwgYWNjZXNzaWJpbGl0eSBndWlkZWxpbmVzIG9uIHRoaXMgY29tcG9uZW50IG9ubHkuDQotICAgKg0KLSAgICogQHJldHVybiAgdGhlIGFjY2Vzc2liaWxpdHkgZ3VpZGVsaW5lcyBpdGVyYXRvcg0KLSAgICovDQotICBwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBhY2Nlc3NpYmlsaXR5R3VpZGVsaW5lcygpDQotICB7DQotICAgIHJldHVybiBfYWNjZXNzaWJpbGl0eUd1aWRlbGluZXMuaXRlcmF0b3IoKTsNCi0gIH0NCi0NCi0gIC8qKg0KLSAgICogU2V0cyB0aGUgdmlydHVhbCBmbGFnIG9mIHRoaXMgcHJvcGVydHkuDQotICAgKg0KLSAgICogQHBhcmFtIHZpcnR1YWwgIHRoZSBwcm9wZXJ0eSByZXF1aXJlZCBmbGFnDQotICAgKi8NCi0gIHB1YmxpYyB2b2lkIHNldFZpcnR1YWwoDQotICAgIGJvb2xlYW4gdmlydHVhbCkNCi0gIHsNCi0gICAgX3ZpcnR1YWwgPSB2aXJ0dWFsOw0KLSAgfQ0KLQ0KLSAgLyoqDQotICAgKiBSZXR1cm5zIHZpcnR1YWwgZmxhZyBvZiB0aGlzIHByb3BlcnR5Lg0KLSAgICoNCi0gICAqIEByZXR1cm4gIHRoZSBwcm9wZXJ0eSB2aXJ0dWFsIGZsYWcNCi0gICAqLw0KLSAgcHVibGljIGJvb2xlYW4gaXNWaXJ0dWFsKCkNCi0gIHsNCi0gICAgcmV0dXJuIF92aXJ0dWFsOw0KLSAgfQ0KLQ0KLSAgcHVibGljIGludCBjb21wYXJlVG8oT2JqZWN0IG8pDQotICB7DQotICAgIGlmKG8gaW5zdGFuY2VvZiBBdHRyaWJ1dGVCZWFuKQ0KLSAgICB7DQotICAgICAgQXR0cmlidXRlQmVhbiBhdHRyID0gKEF0dHJpYnV0ZUJlYW4pbzsNCi0gICAgICByZXR1cm4gX2F0dHJpYnV0ZU5hbWUuY29tcGFyZVRvKGF0dHIuX2F0dHJpYnV0ZU5hbWUpOw0KLSAgICB9DQotICAgIGVsc2UNCi0gICAgew0KLSAgICAgIHJldHVybiAxOw0KLSAgICB9DQotICB9DQotDQotICBwcml2YXRlIFN0cmluZyAgIF9hdHRyaWJ1dGVOYW1lOw0KLSAgcHJpdmF0ZSBTdHJpbmcgICBfYXR0cmlidXRlQ2xhc3M7DQotICBwcml2YXRlIFN0cmluZ1tdIF9hdHRyaWJ1dGVDbGFzc1BhcmFtZXRlcnM7DQotICBwcml2YXRlIFN0cmluZyAgIF9kZXNjcmlwdGlvbjsNCi0gIHByaXZhdGUgU3RyaW5nICAgX2RlZmF1bHRWYWx1ZTsNCi0gIC8vIEZJWE1FOiBBbHRlcm5hdGUgdHlwZSBkb2VzIG5vdCBzZWVtIHRvIHN1cHBvcnQgZ2VuZXJpYyB0eXBlcw0KLSAgcHJpdmF0ZSBTdHJpbmcgICBfYWx0ZXJuYXRlQ2xhc3M7DQotICBwcml2YXRlIGJvb2xlYW4gIF92aXJ0dWFsOw0KLSAgcHJpdmF0ZSBNZXRob2RTaWduYXR1cmVCZWFuIF9zaWduYXR1cmU7DQotICBwcml2YXRlIExpc3Q8U3RyaW5nPiBfYWNjZXNzaWJpbGl0eUd1aWRlbGluZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsNCi0NCi0gIHN0YXRpYyBwcml2YXRlIGZpbmFsIFBhdHRlcm4gX0dFTkVSSUNfVFlQRSA9IFBhdHRlcm4uY29tcGlsZSgiKFtePF0rKTwoLispPiIpOw0KLSAgc3RhdGljIHByaXZhdGUgZmluYWwgU3RyaW5nW10gX0VNUFRZX0FSUkFZID0gbmV3IFN0cmluZ1swXTsNCi19DQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci90cmluaWRhZC9wYXJzZS9Db21wb25lbnRCZWFuLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL3RyaW5pZGFkL3BhcnNlL0NvbXBvbmVudEJlYW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmIyMDRkNC4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL3RyaW5pZGFkL3BhcnNlL0NvbXBvbmVudEJlYW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNjYgKzAsMCBAQAotLyoNCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqIA0KLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKiANCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmJ1aWxkZXIudHJpbmlkYWQucGFyc2U7DQotDQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1vZGlmaWVyOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOw0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOw0KLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaE1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5idWlsZGVyLnRyaW5pZGFkLnV0aWwuQ29tcG91bmRJdGVyYXRvcjsNCi0NCi0NCi0vKioNCi0gKiBDb21wb25lbnRCZWFuIGlzIGEgSmF2YSByZXByZXNlbnRhdGlvbiBvZiB0aGUgZmFjZXMtY29uZmlnIGNvbXBvbmVudA0KLSAqIFhNTCBlbGVtZW50Lg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBDb21wb25lbnRCZWFuIGV4dGVuZHMgQWJzdHJhY3RUYWdCZWFuDQotew0KLSAgLyoqDQotICAgKiBDcmVhdGVzIGEgbmV3IENvbXBvbmVudEJlYW4uDQotICAgKi8NCi0gIHB1YmxpYyBDb21wb25lbnRCZWFuKCkNCi0gIHsNCi0gICAgc3VwZXIodHJ1ZSk7DQotICAgIF9wcm9wZXJ0aWVzID0gbmV3IExpbmtlZEhhc2hNYXA8U3RyaW5nLCBQcm9wZXJ0eUJlYW4+KCk7DQotICAgIF9mYWNldHMgPSBuZXcgTGlua2VkSGFzaE1hcDxTdHJpbmcsIEZhY2V0QmVhbj4oKTsNCi0gICAgX2V2ZW50cyA9IG5ldyBMaW5rZWRIYXNoTWFwPFN0cmluZywgRXZlbnRSZWZCZWFuPigpOw0KLSAgfQ0KLQ0KLSAgLyoqDQotICAgKiBTZXRzIHRoZSBVSVgyIGxvY2FsIG5hbWUgZm9yIHRoaXMgY29tcG9uZW50Lg0KLSAgICoNCi0gICAqIEBwYXJhbSBsb2NhbE5hbWUgIHRoZSBsb2NhbCBuYW1lDQotICAgKg0KLSAgICogQGRlcHJlY2F0ZWQgcmVtb3ZlIHdoZW4gInVpIiBwYWNrYWdlIGlzIGdvbmUNCi0gICAqLw0KLSAgcHVibGljIHZvaWQgc2V0TG9jYWxOYW1lKA0KLSAgICBTdHJpbmcgbG9jYWxOYW1lKQ0KLSAgew0KLSAgICBfbG9jYWxOYW1lID0gbG9jYWxOYW1lOw0KLSAgfQ0KLQ0KLSAgLyoqDQotICAgKiBSZXR1cm5zIHRoZSBVSVgyIGxvY2FsIG5hbWUgZm9yIHRoaXMgY29tcG9uZW50Lg0KLSAgICoNCi0gICAqIEByZXR1cm4gIHRoZSBsb2NhbCBuYW1lDQotICAgKi8NCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TG9jYWxOYW1lKCkNCi0gIHsNCi0gICAgcmV0dXJuIF9sb2NhbE5hbWU7DQotICB9DQotDQotICAvKioNCi0gICAqIFNldHMgdGhlIFVJWDIgbm9kZSBjbGFzcyBmb3IgdGhpcyBjb21wb25lbnQuDQotICAgKg0KLSAgICogQHBhcmFtIG5vZGVDbGFzcyAgdGhlIG5vZGUgY2xhc3MNCi0gICAqDQotICAgKiBAZGVwcmVjYXRlZCByZW1vdmUgd2hlbiAidWkiIHBhY2thZ2UgaXMgZ29uZQ0KLSAgICovDQotICBwdWJsaWMgdm9pZCBzZXROb2RlQ2xhc3MoDQotICAgIFN0cmluZyBub2RlQ2xhc3MpDQotICB7DQotICAgIF9ub2RlQ2xhc3MgPSBub2RlQ2xhc3M7DQotICB9DQotDQotICAvKioNCi0gICAqIFJldHVybnMgdGhlIFVJWDIgbm9kZSBjbGFzcyBmb3IgdGhpcyBjb21wb25lbnQuDQotICAgKg0KLSAgICogQHJldHVybiAgdGhlIG5vZGUgY2xhc3MNCi0gICAqLw0KLSAgcHVibGljIFN0cmluZyBnZXROb2RlQ2xhc3MoKQ0KLSAgew0KLSAgICByZXR1cm4gX25vZGVDbGFzczsNCi0gIH0NCi0NCi0gIC8qKg0KLSAgICogU2V0cyB0aGUgY29tcG9uZW50IHR5cGUgZm9yIHRoaXMgY29tcG9uZW50Lg0KLSAgICoNCi0gICAqIEBwYXJhbSBjb21wb25lbnRUeXBlICB0aGUgY29tcG9uZW50IHR5cGUNCi0gICAqLw0KLSAgcHVibGljIHZvaWQgc2V0Q29tcG9uZW50VHlwZSgNCi0gICAgU3RyaW5nIGNvbXBvbmVudFR5cGUpDQotICB7DQotICAgIF9jb21wb25lbnRUeXBlID0gY29tcG9uZW50VHlwZTsNCi0gIH0NCi0NCi0gIC8qKg0KLSAgICogUmV0dXJucyB0aGUgY29tcG9uZW50IHR5cGUgZm9yIHRoaXMgY29tcG9uZW50Lg0KLSAgICoNCi0gICAqIEByZXR1cm4gIHRoZSBjb21wb25lbnQgdHlwZQ0KLSAgICovDQotICBwdWJsaWMgU3RyaW5nIGdldENvbXBvbmVudFR5cGUoKQ0KLSAgew0KLSAgICByZXR1cm4gX2NvbXBvbmVudFR5cGU7DQotICB9DQotDQotICAvKioNCi0gICAqIFNldHMgdGhlIGNvbXBvbmVudCBmYW1pbHkgZm9yIHRoaXMgY29tcG9uZW50Lg0KLSAgICoNCi0gICAqIEBwYXJhbSBjb21wb25lbnRGYW1pbHkgIHRoZSBjb21wb25lbnQgZmFtaWx5DQotICAgKi8NCi0gIHB1YmxpYyB2b2lkIHNldENvbXBvbmVudEZhbWlseSgNCi0gICAgU3RyaW5nIGNvbXBvbmVudEZhbWlseSkNCi0gIHsNCi0gICAgX2NvbXBvbmVudEZhbWlseSA9IGNvbXBvbmVudEZhbWlseTsNCi0gIH0NCi0NCi0gIC8qKg0KLSAgICogUmV0dXJucyB0aGUgY29tcG9uZW50IGZhbWlseSBmb3IgdGhpcyBjb21wb25lbnQuDQotICAgKg0KLSAgICogQHJldHVybiAgdGhlIGNvbXBvbmVudCBmYW1pbHkNCi0gICAqLw0KLSAgcHVibGljIFN0cmluZyBnZXRDb21wb25lbnRGYW1pbHkoKQ0KLSAgew0KLSAgICByZXR1cm4gX2NvbXBvbmVudEZhbWlseTsNCi0gIH0NCi0NCi0gIC8qKg0KLSAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBjb21wb25lbnQgZmFtaWx5IGV4aXN0cyBmb3IgdGhpcyBjb21wb25lbnQuDQotICAgKg0KLSAgICogQHJldHVybiAgdHJ1ZSAgaWYgdGhlIGNvbXBvbmVudCBmYW1pbHkgZXhpc3RzLA0KLSAgICogICAgICAgICAgZmFsc2Ugb3RoZXJ3aXNlDQotICAgKi8NCi0gIHB1YmxpYyBib29sZWFuIGhhc0NvbXBvbmVudEZhbWlseSgpDQotICB7DQotICAgIHJldHVybiAoX2NvbXBvbmVudEZhbWlseSAhPSBudWxsKTsNCi0gIH0NCi0NCi0gIC8qKg0KLSAgICogU2V0cyB0aGUgY29tcG9uZW50IGNsYXNzIGZvciB0aGlzIGNvbXBvbmVudC4NCi0gICAqDQotICAgKiBAcGFyYW0gY29tcG9uZW50Q2xhc3MgIHRoZSBjb21wb25lbnQgY2xhc3MNCi0gICAqLw0KLSAgcHVibGljIHZvaWQgc2V0Q29tcG9uZW50Q2xhc3MoDQotICAgIFN0cmluZyBjb21wb25lbnRDbGFzcykNCi0gIHsNCi0gICAgX2NvbXBvbmVudENsYXNzID0gY29tcG9uZW50Q2xhc3M7DQotICB9DQotDQotICAvKioNCi0gICAqIFJldHVybnMgdGhlIGNvbXBvbmVudCBjbGFzcyBmb3IgdGhpcyBjb21wb25lbnQuDQotICAgKg0KLSAgICogQHJldHVybiAgdGhlIGNvbXBvbmVudCBjbGFzcw0KLSAgICovDQotICBwdWJsaWMgU3RyaW5nIGdldENvbXBvbmVudENsYXNzKCkNCi0gIHsNCi0gICAgcmV0dXJuIF9jb21wb25lbnRDbGFzczsNCi0gIH0NCi0NCi0gIC8qKg0KLSAgICogU2V0cyB0aGUgSmF2YSBTY3JpcHQgY29tcG9uZW50IGNsYXNzIGZvciB0aGlzIGNvbXBvbmVudC4NCi0gICAqDQotICAgKiBAcGFyYW0ganNDb21wb25lbnRDbGFzcyAgdGhlIEphdmFTY3JpcHQgY29tcG9uZW50IGNsYXNzDQotICAgKi8NCi0gIHB1YmxpYyB2b2lkIHNldEpzQ29tcG9uZW50Q2xhc3MoDQotICAgIFN0cmluZyBqc0NvbXBvbmVudENsYXNzKQ0KLSAgew0KLSAgICBfanNDb21wb25lbnRDbGFzcyA9IGpzQ29tcG9uZW50Q2xhc3M7DQotICB9DQotDQotICAvKioNCi0gICAqIFJldHVybnMgdGhlIEphdmFTY3JpcHQgY29tcG9uZW50IGNsYXNzIGZvciB0aGlzIGNvbXBvbmVudC4NCi0gICAqDQotICAgKiBAcmV0dXJuICB0aGUgSmF2YSBTY3JpcHQgY29tcG9uZW50IGNsYXNzDQotICAgKi8NCi0gIHB1YmxpYyBTdHJpbmcgZ2V0SnNDb21wb25lbnRDbGFzcygpDQotICB7DQotICAgIHJldHVybiBfanNDb21wb25lbnRDbGFzczsNCi0gIH0NCi0NCi0gIC8qKg0KLSAgICogU2V0cyB0aGUgZGVzY3JpcHRpb24gb2YgdGhpcyBwcm9wZXJ0eS4NCi0gICAqDQotICAgKiBAcGFyYW0gZGVzY3JpcHRpb24gIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdGlvbg0KLSAgICovDQotICBwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbigNCi0gICAgU3RyaW5nIGRlc2NyaXB0aW9uKQ0KLSAgew0KLSAgICBfZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsNCi0gIH0NCi0NCi0gIC8qKg0KLSAgICogUmV0dXJucyB0aGUgZGVzY3JpcHRpb24gb2YgdGhpcyBwcm9wZXJ0eS4NCi0gICAqDQotICAgKiBAcmV0dXJuICB0aGUgcHJvcGVydHkgZGVzY3JpcHRpb24NCi0gICAqLw0KLSAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpDQotICB7DQotICAgIHJldHVybiBfZGVzY3JpcHRpb247DQotICB9DQotDQotICAvKioNCi0gICAqIFNldHMgdGhlIGxvbmcgZGVzY3JpcHRpb24gb2YgdGhpcyBwcm9wZXJ0eS4NCi0gICAqDQotICAgKiBAcGFyYW0gbG9uZ0Rlc2NyaXB0aW9uICB0aGUgbG9uZyBwcm9wZXJ0eSBkZXNjcmlwdGlvbg0KLSAgICovDQotICBwdWJsaWMgdm9pZCBzZXRMb25nRGVzY3JpcHRpb24oDQotICAgIFN0cmluZyBsb25nRGVzY3JpcHRpb24pDQotICB7DQotICAgIF9sb25nRGVzY3JpcHRpb24gPSBsb25nRGVzY3JpcHRpb247DQotICB9DQotDQotICAvKioNCi0gICAqIFJldHVybnMgdGhlIGxvbmcgZGVzY3JpcHRpb24gb2YgdGhpcyBwcm9wZXJ0eS4NCi0gICAqDQotICAgKiBAcmV0dXJuICB0aGUgbG9uZyBwcm9wZXJ0eSBkZXNjcmlwdGlvbg0KLSAgICovDQotICBwdWJsaWMgU3RyaW5nIGdldExvbmdEZXNjcmlwdGlvbigpDQotICB7DQotICAgIHJldHVybiBfbG9uZ0Rlc2NyaXB0aW9uOw0KLSAgfQ0KLQ0KLSAgLyoqDQotICAgKiBTZXRzIHRoZSB1bnN1cHBvcnRlZCBhZ2VudHMgZm9yIHRoaXMgY29tcG9uZW50Lg0KLSAgICoNCi0gICAqIEBwYXJhbSB1bnN1cHBvcnRlZEFnZW50cyAgdGhlIHVuc3VwcG9ydGVkIGFnZW50cw0KLSAgICovDQotICBwdWJsaWMgdm9pZCBzZXRVbnN1cHBvcnRlZEFnZW50cygNCi0gICAgU3RyaW5nW10gdW5zdXBwb3J0ZWRBZ2VudHMpDQotICB7DQotICAgIGlmICh1bnN1cHBvcnRlZEFnZW50cyA9PSBudWxsKQ0KLSAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigidW5zdXBwb3J0ZWRBZ2VudHMiKTsNCi0NCi0gICAgX3Vuc3VwcG9ydGVkQWdlbnRzID0gdW5zdXBwb3J0ZWRBZ2VudHM7DQotICB9DQotDQotICAvKioNCi0gICAqIFJldHVybnMgdW5zdXBwb3J0ZWQgYWdlbnRzIGZvciB0aGlzIGNvbXBvbmVudC4NCi0gICAqDQotICAgKiBAcmV0dXJuICB0aGUgdW5zdXBwb3J0ZWQgYWdlbnRzDQotICAgKi8NCi0gIHB1YmxpYyBTdHJpbmdbXSBnZXRVbnN1cHBvcnRlZEFnZW50cygpDQotICB7DQotICAgIHJldHVybiBfdW5zdXBwb3J0ZWRBZ2VudHM7DQotICB9DQotDQotICAgLyoqDQotICAgKiBTZXRzIHRoZSBKU1AgdGFnIGhhbmRsZXIgc3VwZXJjbGFzcyBmb3IgdGhpcyBjb21wb25lbnQuDQotICAgKg0KLSAgICogQHBhcmFtIHRhZ1N1cGVyY2xhc3MgIHRoZSBKU1AgdGFnIGhhbmRsZXIgc3VwZXJjbGFzcw0KLSAgICovDQotICBwdWJsaWMgdm9pZCBzZXRUYWdTdXBlcmNsYXNzKA0KLSAgICBTdHJpbmcgdGFnU3VwZXJjbGFzcykNCi0gIHsNCi0gICAgX3RhZ1N1cGVyY2xhc3MgPSB0YWdTdXBlcmNsYXNzOw0KLSAgfQ0KLQ0KLSAgLyoqDQotICAgKiBSZXR1cm5zIHRoZSBKU1AgdGFnIGhhbmRsZXIgc3VwZXJjbGFzcyBmb3IgdGhpcyBjb21wb25lbnQuDQotICAgKg0KLSAgICogQHJldHVybiAgdGhlIEpTUCB0YWcgaGFuZGxlciBzdXBlcmNsYXNzDQotICAgKi8NCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VGFnU3VwZXJjbGFzcygpDQotICB7DQotICAgIHJldHVybiBfdGFnU3VwZXJjbGFzczsNCi0gIH0NCi0NCi0gIC8qKg0KLSAgKiBTZXRzIHRoZSBGYWNlbGV0cyB0YWcgaGFuZGxlciAoY29tcG9uZW50IGhhbmRsZXIpIHRoaXMgY29tcG9uZW50Lg0KLSAgKg0KLSAgKiBAcGFyYW0gdGFnSGFuZGxlciB0aGUgRmFjZWxldHMgdGFnIGhhbmRsZXIgY2xhc3MNCi0gICovDQotIHB1YmxpYyB2b2lkIHNldFRhZ0hhbmRsZXIoDQotICAgU3RyaW5nIHRhZ0hhbmRsZXIpDQotIHsNCi0gICBfdGFnSGFuZGxlciA9IHRhZ0hhbmRsZXI7DQotIH0NCi0NCi0gLyoqDQotICAqIFJldHVybnMgdGhlIEZhY2VsZXRzIHRhZyBoYW5kbGVyIGZvciB0aGlzIGNvbXBvbmVudA0KLSAgKg0KLSAgKiBAcmV0dXJuICB0aGUgRmFjZWxldHMgdGFnIGhhbmRsZXINCi0gICovDQotIHB1YmxpYyBTdHJpbmcgZ2V0VGFnSGFuZGxlcigpDQotIHsNCi0gICByZXR1cm4gX3RhZ0hhbmRsZXI7DQotIH0NCi0NCi0gIC8qKg0KLSAgICogU2V0cyB0aGUgbmFtaW5nQ29udGFpbmVyIGZsYWcgb2YgdGhpcyBwcm9wZXJ0eS4NCi0gICAqDQotICAgKiBAcGFyYW0gbmFtaW5nQ29udGFpbmVyICB0aGUgY29tcG9uZW50IG5hbWluZ0NvbnRhaW5lciBmbGFnDQotICAgKi8NCi0gIHB1YmxpYyB2b2lkIHNldE5hbWluZ0NvbnRhaW5lcigNCi0gICAgYm9vbGVhbiBuYW1pbmdDb250YWluZXIpDQotICB7DQotICAgIF9uYW1pbmdDb250YWluZXIgPSBuYW1pbmdDb250YWluZXI7DQotICB9DQotDQotICAvKioNCi0gICAqIFJldHVybnMgbmFtaW5nQ29udGFpbmVyIGZsYWcgb2YgdGhpcyBjb21wb25lbnQuDQotICAgKg0KLSAgICogQHJldHVybiAgdGhlIGNvbXBvbmVudCBuYW1pbmdDb250YWluZXIgZmxhZw0KLSAgICovDQotICBwdWJsaWMgYm9vbGVhbiBpc05hbWluZ0NvbnRhaW5lcigpDQotICB7DQotICAgIHJldHVybiBfbmFtaW5nQ29udGFpbmVyOw0KLSAgfQ0KLQ0KLSAgcHVibGljIGJvb2xlYW4gaXNDbGllbnRCZWhhdmlvckhvbGRlcigpDQotICB7DQotICAgIHJldHVybiBfZXZlbnROYW1lcyAhPSBudWxsICYmIF9ldmVudE5hbWVzLmxlbmd0aCA+IDA7DQotICB9DQotDQotICBwdWJsaWMgdm9pZCBzZXREZWZhdWx0RXZlbnROYW1lKFN0cmluZyBkZWZhdWx0RXZlbnROYW1lKQ0KLSAgew0KLSAgICB0aGlzLl9kZWZhdWx0RXZlbnROYW1lID0gZGVmYXVsdEV2ZW50TmFtZTsNCi0gIH0NCi0NCi0gIHB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdEV2ZW50TmFtZSgpDQotICB7DQotICAgIHJldHVybiBfZGVmYXVsdEV2ZW50TmFtZTsNCi0gIH0NCi0NCi0gIHB1YmxpYyB2b2lkIHNldEV2ZW50TmFtZXMoU3RyaW5nW10gZXZlbnROYW1lcykNCi0gIHsNCi0gICAgdGhpcy5fZXZlbnROYW1lcyA9IGV2ZW50TmFtZXM7DQotICB9DQotDQotICBwdWJsaWMgU3RyaW5nW10gZ2V0RXZlbnROYW1lcygpDQotICB7DQotICAgIHJldHVybiBfZXZlbnROYW1lczsNCi0gIH0NCi0NCi0gIHB1YmxpYyB2b2lkIHBhcnNlRXZlbnROYW1lcyhTdHJpbmcgdmFsdWUpDQotICB7DQotICAgIGlmICh2YWx1ZSAhPSBudWxsKQ0KLSAgICB7DQotICAgICAgU3RyaW5nW10gbmFtZXMgPSB2YWx1ZS50cmltKCkuc3BsaXQoIlxccysiKTsNCi0gICAgICAvLyBjb21iaW5lIGV2ZW50IG5hbWVzIGlmIGdpdmVuIG1vcmUgdGhhbiBvbmNlICh0byBtYWtlIGltcG9ydGluZyBmcm9tIGFub3RoZXIgWE1MIGZpbGUgbW9yZSBlYXN5KQ0KLSAgICAgIGlmIChfZXZlbnROYW1lcyA9PSBudWxsKQ0KLSAgICAgIHsNCi0gICAgICAgIF9ldmVudE5hbWVzID0gbmFtZXM7DQotICAgICAgfQ0KLSAgICAgIGVsc2UNCi0gICAgICB7DQotICAgICAgICBTdHJpbmdbXSBjdXJyRXZlbnROYW1lcyA9IF9ldmVudE5hbWVzOw0KLSAgICAgICAgX2V2ZW50TmFtZXMgPSBuZXcgU3RyaW5nW19ldmVudE5hbWVzLmxlbmd0aCArIG5hbWVzLmxlbmd0aF07DQotICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGN1cnJFdmVudE5hbWVzLCAwLCBfZXZlbnROYW1lcywgMCwgY3VyckV2ZW50TmFtZXMubGVuZ3RoKTsNCi0gICAgICAgIFN5c3RlbS5hcnJheWNvcHkobmFtZXMsIDAsIF9ldmVudE5hbWVzLCBjdXJyRXZlbnROYW1lcy5sZW5ndGgsIG5hbWVzLmxlbmd0aCk7DQotICAgICAgfQ0KLSAgICB9DQotICB9DQotDQotICAvKioNCi0gICAqIFNldHMgdGhlIGNvbXBvbmVudCBzdXBlcnR5cGUgZm9yIHRoaXMgY29tcG9uZW50Lg0KLSAgICoNCi0gICAqIEBwYXJhbSBjb21wb25lbnRTdXBlcnR5cGUgIHRoZSBjb21wb25lbnQgc3VwZXIgdHlwZQ0KLSAgICovDQotICBwdWJsaWMgdm9pZCBzZXRDb21wb25lbnRTdXBlcnR5cGUoDQotICAgIFN0cmluZyBjb21wb25lbnRTdXBlcnR5cGUpDQotICB7DQotICAgIF9jb21wb25lbnRTdXBlcnR5cGUgPSBjb21wb25lbnRTdXBlcnR5cGU7DQotICB9DQotDQotICAvKioNCi0gICAqIFJldHVybnMgdGhlIGNvbXBvbmVudCBzdXBlcnR5cGUgZm9yIHRoaXMgY29tcG9uZW50Lg0KLSAgICoNCi0gICAqIEByZXR1cm4gIHRoZSBjb21wb25lbnQgc3VwZXJ0eXBlDQotICAgKi8NCi0gIHB1YmxpYyBTdHJpbmcgZ2V0Q29tcG9uZW50U3VwZXJ0eXBlKCkNCi0gIHsNCi0gICAgcmV0dXJuIF9jb21wb25lbnRTdXBlcnR5cGU7DQotICB9DQotDQotICAvKioNCi0gICAqIFNldHMgdGhlIGNvbXBvbmVudCBzdXBlciBjbGFzcyBmb3IgdGhpcyBjb21wb25lbnQuDQotICAgKg0KLSAgICogQHBhcmFtIGNvbXBvbmVudFN1cGVyY2xhc3MgIHRoZSBjb21wb25lbnQgc3VwZXIgY2xhc3MNCi0gICAqLw0KLSAgcHVibGljIHZvaWQgc2V0Q29tcG9uZW50U3VwZXJjbGFzcygNCi0gICAgU3RyaW5nIGNvbXBvbmVudFN1cGVyY2xhc3MpDQotICB7DQotICAgIF9jb21wb25lbnRTdXBlcmNsYXNzID0gY29tcG9uZW50U3VwZXJjbGFzczsNCi0gIH0NCi0NCi0gIC8qKg0KLSAgICogUmV0dXJucyB0aGUgY29tcG9uZW50IHN1cGVyIGNsYXNzIGZvciB0aGlzIGNvbXBvbmVudC4NCi0gICAqDQotICAgKiBAcmV0dXJuICB0aGUgY29tcG9uZW50IHN1cGVyIGNsYXNzDQotICAgKi8NCi0gIHB1YmxpYyBTdHJpbmcgZ2V0Q29tcG9uZW50U3VwZXJjbGFzcygpDQotICB7DQotICAgIHJldHVybiBfY29tcG9uZW50U3VwZXJjbGFzczsNCi0gIH0NCi0NCi0gIC8qKg0KLSAgICogU2V0cyB0aGUgcmVuZGVyZXIgdHlwZSBmb3IgdGhpcyBjb21wb25lbnQuDQotICAgKg0KLSAgICogQHBhcmFtIHJlbmRlcmVyVHlwZSAgdGhlIHJlbmRlcmVyIHR5cGUNCi0gICAqLw0KLSAgcHVibGljIHZvaWQgc2V0UmVuZGVyZXJUeXBlKA0KLSAgICBTdHJpbmcgcmVuZGVyZXJUeXBlKQ0KLSAgew0KLSAgICBfcmVuZGVyZXJUeXBlID0gcmVuZGVyZXJUeXBlOw0KLSAgfQ0KLQ0KLSAgLyoqDQotICAgKiBSZXR1cm5zIHRoZSByZW5kZXJlciB0eXBlIGZvciB0aGlzIGNvbXBvbmVudC4NCi0gICAqDQotICAgKiBAcmV0dXJuICB0aGUgcmVuZGVyZXIgdHlwZQ0KLSAgICovDQotICBwdWJsaWMgU3RyaW5nIGdldFJlbmRlcmVyVHlwZSgpDQotICB7DQotICAgIHJldHVybiBfcmVuZGVyZXJUeXBlOw0KLSAgfQ0KLQ0KLSAgLyoqDQotICAgKiBSZXR1cm5zIHRoZSBkZWZhdWx0IHJlbmRlcmVyIHR5cGUgZm9yIHRoaXMgY29tcG9uZW50Lg0KLSAgICoNCi0gICAqIEByZXR1cm4gIHRoZSBkZWZhdWx0IHJlbmRlcmVyIHR5cGUNCi0gICAqLw0KLSAgcHVibGljIFN0cmluZyBnZXREZWZhdWx0UmVuZGVyZXJUeXBlKCkNCi0gIHsNCi0gICAgQ29tcG9uZW50QmVhbiBwYXJlbnQgPSByZXNvbHZlU3VwZXJ0eXBlKCk7DQotICAgIHJldHVybiAocGFyZW50ICE9IG51bGwpID8gcGFyZW50LmZpbmRSZW5kZXJlclR5cGUoKSA6IG51bGw7DQotICB9DQotDQotICBwdWJsaWMgU3RyaW5nIGdldEltcGxlbWVudGF0aW9uVHlwZSgpDQotICB7DQotICAgIHJldHVybiBfaW1wbGVtZW50YXRpb25UeXBlOw0KLSAgfQ0KLQ0KLSAgcHVibGljIHZvaWQgc2V0SW1wbGVtZW50YXRpb25UeXBlKFN0cmluZyBpbXBsZW1lbnRhdGlvblR5cGUpDQotICB7DQotICAgIF9pbXBsZW1lbnRhdGlvblR5cGUgPSBpbXBsZW1lbnRhdGlvblR5cGU7DQotICB9DQotDQotICAvKioNCi0gICAqIEFkZHMgYSBwcm9wZXJ0eSB0byB0aGlzIGNvbXBvbmVudC4NCi0gICAqDQotICAgKiBAcGFyYW0gcHJvcGVydHkgIHRoZSBwcm9wZXJ0eSB0byBhZGQNCi0gICAqLw0KLSAgcHVibGljIHZvaWQgYWRkUHJvcGVydHkoDQotICAgIFByb3BlcnR5QmVhbiBwcm9wZXJ0eSkNCi0gIHsNCi0gICAgX3Byb3BlcnRpZXMucHV0KHByb3BlcnR5LmdldFByb3BlcnR5TmFtZSgpLCBwcm9wZXJ0eSk7DQotICB9DQotDQotICAvKioNCi0gICAqIFJldHVybnMgdGhlIHByb3BlcnR5IGZvciB0aGlzIHByb3BlcnR5IG5hbWUuDQotICAgKg0KLSAgICogQHBhcmFtIHByb3BlcnR5TmFtZSAgdGhlIHByb3BlcnR5IG5hbWUgdG8gZmluZA0KLSAgICovDQotICBwdWJsaWMgUHJvcGVydHlCZWFuIGZpbmRQcm9wZXJ0eSgNCi0gICAgU3RyaW5nIHByb3BlcnR5TmFtZSkNCi0gIHsNCi0gICAgcmV0dXJuIF9wcm9wZXJ0aWVzLmdldChwcm9wZXJ0eU5hbWUpOw0KLSAgfQ0KLQ0KLSAgLyoqDQotICAgKiBSZXR1cm5zIHRoZSBwcm9wZXJ0eSBmb3IgdGhpcyBwcm9wZXJ0eSBuYW1lLg0KLSAgICoNCi0gICAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUgIHRoZSBwcm9wZXJ0eSBuYW1lIHRvIGZpbmQNCi0gICAqLw0KLSAgcHVibGljIFByb3BlcnR5QmVhbiBmaW5kUHJvcGVydHkoDQotICAgIFN0cmluZyBwcm9wZXJ0eU5hbWUsDQotICAgIGJvb2xlYW4gZmxhdHRlbikNCi0gIHsNCi0gICAgUHJvcGVydHlCZWFuIHByb3AgPSBmaW5kUHJvcGVydHkocHJvcGVydHlOYW1lKTsNCi0gICAgaWYgKHByb3AgPT0gbnVsbCAmJiBmbGF0dGVuKQ0KLSAgICB7DQotICAgICAgQ29tcG9uZW50QmVhbiBwYXJlbnQgPSByZXNvbHZlU3VwZXJ0eXBlKCk7DQotICAgICAgaWYgKHBhcmVudCAhPSBudWxsKQ0KLSAgICAgICAgcHJvcCA9IHBhcmVudC5maW5kUHJvcGVydHkocHJvcGVydHlOYW1lLCBmbGF0dGVuKTsNCi0gICAgfQ0KLQ0KLSAgICByZXR1cm4gcHJvcDsNCi0gIH0NCi0NCi0gIC8qKg0KLSAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgY29tcG9uZW50IGhhcyBhbnkgcHJvcGVydGllcy4NCi0gICAqDQotICAgKiBAcmV0dXJuICB0cnVlICAgaWYgdGhpcyBjb21wb25lbnQgaGFzIGFueSBwcm9wZXJ0aWVzLA0KLSAgICogICAgICAgICAgZmFsc2UgIG90aGVyd2lzZQ0KLSAgICovDQotICBwdWJsaWMgYm9vbGVhbiBoYXNQcm9wZXJ0aWVzKCkNCi0gIHsNCi0gICAgcmV0dXJuIGhhc1Byb3BlcnRpZXMoZmFsc2UpOw0KLSAgfQ0KLQ0KLSAgLyoqDQotICAgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBjb21wb25lbnQgb3IgYW55IGNvbXBvbmVudCBzdXBlcnR5cGUNCi0gICAqIGhhcyBhbnkgcHJvcGVydGllcy4NCi0gICAqDQotICAgKiBAcmV0dXJuICB0cnVlICAgaWYgdGhpcyBjb21wb25lbnQgb3IgYW55IHN1cGVydHlwZSBoYXMgYW55IHByb3BlcnRpZXMsDQotICAgKiAgICAgICAgICBmYWxzZSAgb3RoZXJ3aXNlDQotICAgKi8NCi0gIHB1YmxpYyBib29sZWFuIGhhc1Byb3BlcnRpZXMoDQotICAgIGJvb2xlYW4gZmxhdHRlbikNCi0gIHsNCi0gICAgYm9vbGVhbiBoYXNQcm9wZXJ0aWVzID0gIV9wcm9wZXJ0aWVzLmlzRW1wdHkoKTsNCi0NCi0gICAgaWYgKCFoYXNQcm9wZXJ0aWVzICYmIGZsYXR0ZW4pDQotICAgIHsNCi0gICAgICBDb21wb25lbnRCZWFuIHBhcmVudCA9IHJlc29sdmVTdXBlcnR5cGUoKTsNCi0gICAgICBpZiAocGFyZW50ICE9IG51bGwpDQotICAgICAgICBoYXNQcm9wZXJ0aWVzIHw9IHBhcmVudC5oYXNQcm9wZXJ0aWVzKGZsYXR0ZW4pOw0KLSAgICB9DQotDQotICAgIHJldHVybiBoYXNQcm9wZXJ0aWVzOw0KLSAgfQ0KLQ0KLSAgLyoqDQotICAgKiBSZXR1cm5zIGFuIGl0ZXJhdG9yIGZvciBhbGwgcHJvcGVydGllcyBvbiB0aGlzIGNvbXBvbmVudCBvbmx5Lg0KLSAgICoNCi0gICAqIEByZXR1cm4gIHRoZSBwcm9wZXJ0eSBpdGVyYXRvcg0KLSAgICovDQotICBwdWJsaWMgSXRlcmF0b3I8UHJvcGVydHlCZWFuPiBwcm9wZXJ0aWVzKCkNCi0gIHsNCi0gICAgcmV0dXJuIF9wcm9wZXJ0aWVzLnZhbHVlcygpLml0ZXJhdG9yKCk7DQotICB9DQotDQotICAvKioNCi0gICAqIFJldHVybnMgYW4gaXRlcmF0b3IgZm9yIHByb3BlcnRpZXMgb24gdGhpcyBjb21wb25lbnQuDQotICAgKg0KLSAgICogQHBhcmFtIGZsYXR0ZW4gIHRydWUgICBpZiB0aGUgaXRlcmF0b3Igc2hvdWxkIGJlIGEgY29tYmluZWQgbGlzdCBvZg0KLSAgICogICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzIG9mIHRoaXMgY29tcG9uZW50IGFuZCBpdHMgc3VwZXJ0eXBlLA0KLSAgICogICAgICAgICAgICAgICAgIGZhbHNlICBvdGhlcndpc2UNCi0gICAqDQotICAgKiBAcmV0dXJuICB0aGUgcHJvcGVydHkgaXRlcmF0b3INCi0gICAqLw0KLSAgcHVibGljIEl0ZXJhdG9yPFByb3BlcnR5QmVhbj4gcHJvcGVydGllcygNCi0gICAgYm9vbGVhbiBmbGF0dGVuKQ0KLSAgew0KLSAgICBpZiAoZmxhdHRlbikNCi0gICAgew0KLSAgICAgIHJldHVybiBnZXRGbGF0dGVuZWRQcm9wZXJ0aWVzKCkudmFsdWVzKCkuaXRlcmF0b3IoKTsNCi0gICAgfQ0KLSAgICBlbHNlDQotICAgIHsNCi0gICAgICByZXR1cm4gcHJvcGVydGllcygpOw0KLSAgICB9DQotICB9DQotDQotICBwcm90ZWN0ZWQgTWFwIGdldEZsYXR0ZW5lZFByb3BlcnRpZXMoKQ0KLSAgew0KLSAgICBNYXAgcHJvcHMgPSBuZXcgSGFzaE1hcChfcHJvcGVydGllcyk7DQotICAgIENvbXBvbmVudEJlYW4gcGFyZW50ID0gcmVzb2x2ZVN1cGVydHlwZSgpOw0KLSAgICBpZiAocGFyZW50ICE9IG51bGwpDQotICAgIHsNCi0gICAgICBNYXAgc3VwZXJQcm9wcyA9IHBhcmVudC5nZXRGbGF0dGVuZWRQcm9wZXJ0aWVzKCk7DQotICAgICAgZm9yIChJdGVyYXRvcjxNYXAuRW50cnk+IGl0ZXIgPSBzdXBlclByb3BzLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7ICkNCi0gICAgICB7DQotICAgICAgICBNYXAuRW50cnkgZW50cnkgPSBpdGVyLm5leHQoKTsNCi0gICAgICAgIGlmICghcHJvcHMuY29udGFpbnNLZXkoZW50cnkuZ2V0S2V5KCkpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICBwcm9wcy5wdXQoZW50cnkuZ2V0S2V5KCksIGVudHJ5LmdldFZhbHVlKCkpOw0KLSAgICAgICAgfQ0KLSAgICAgIH0NCi0gICAgfQ0KLSAgICByZXR1cm4gcHJvcHM7DQotICB9DQotDQotIC8qKg0KLSAgKiBOdW1iZXIgb2YgcHJvcGVydGllcyBmb3IgdGhpcyBjb21wb25lbnQNCi0gICogQHJldHVybiBudW0gb2YgcHJvcGVydGllcw0KLSAgKi8NCi0gIHB1YmxpYyBpbnQgcHJvcGVydGllc1NpemUoKQ0KLSAgew0KLSAgICByZXR1cm4gX3Byb3BlcnRpZXMuc2l6ZSgpOw0KLSAgfQ0KLQ0KLSAgLyoqDQotICAgKiBBZGRzIGEgZmFjZXQgdG8gdGhpcyBjb21wb25lbnQuDQotICAgKg0KLSAgICogQHBhcmFtIGZhY2V0ICB0aGUgZmFjZXQgdG8gYWRkDQotICAgKi8NCi0gIHB1YmxpYyB2b2lkIGFkZEZhY2V0KA0KLSAgICBGYWNldEJlYW4gZmFjZXQpDQotICB7DQotICAgIF9mYWNldHMucHV0KGZhY2V0LmdldEZhY2V0TmFtZSgpLCBmYWNldCk7DQotICB9DQotDQotICAvKioNCi0gICAqIFJldHVybnMgdGhlIGZhY2V0IGZvciB0aGlzIGZhY2V0IG5hbWUuDQotICAgKg0KLSAgICogQHBhcmFtIGZhY2V0TmFtZSAgdGhlIGZhY2V0IG5hbWUgdG8gZmluZA0KLSAgICovDQotICBwdWJsaWMgRmFjZXRCZWFuIGZpbmRGYWNldCgNCi0gICAgU3RyaW5nIGZhY2V0TmFtZSkNCi0gIHsNCi0gICAgcmV0dXJuIF9mYWNldHMuZ2V0KGZhY2V0TmFtZSk7DQotICB9DQotDQotICBwdWJsaWMgRmFjZXRCZWFuIGZpbmRGYWNldCgNCi0gICAgU3RyaW5nIGZhY2V0TmFtZSwNCi0gICAgYm9vbGVhbiBmbGF0dGVuKQ0KLSAgew0KLSAgICBGYWNldEJlYW4gZmFjZXQgPSBmaW5kRmFjZXQoZmFjZXROYW1lKTsNCi0gICAgaWYgKGZhY2V0ID09IG51bGwgJiYgZmxhdHRlbikNCi0gICAgew0KLSAgICAgIENvbXBvbmVudEJlYW4gcGFyZW50ID0gcmVzb2x2ZVN1cGVydHlwZSgpOw0KLSAgICAgIGlmIChwYXJlbnQgIT0gbnVsbCkNCi0gICAgICAgIGZhY2V0ID0gcGFyZW50LmZpbmRGYWNldChmYWNldE5hbWUsIGZsYXR0ZW4pOw0KLSAgICB9DQotDQotICAgIHJldHVybiBmYWNldDsNCi0gIH0NCi0NCi0gIC8qKg0KLSAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgY29tcG9uZW50IGhhcyBhbnkgZmFjZXRzLg0KLSAgICoNCi0gICAqIEByZXR1cm4gIHRydWUgICBpZiB0aGlzIGNvbXBvbmVudCBoYXMgYW55IGZhY2V0cywNCi0gICAqICAgICAgICAgIGZhbHNlICBvdGhlcndpc2UNCi0gICAqLw0KLSAgcHVibGljIGJvb2xlYW4gaGFzRmFjZXRzKCkNCi0gIHsNCi0gICAgcmV0dXJuIGhhc0ZhY2V0cyhmYWxzZSk7DQotICB9DQotDQotICAvKioNCi0gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGNvbXBvbmVudCBvciBhbnkgY29tcG9uZW50IHN1cGVydHlwZQ0KLSAgICogaGFzIGFueSBmYWNldHMuDQotICAgKg0KLSAgICogQHJldHVybiAgdHJ1ZSAgIGlmIHRoaXMgY29tcG9uZW50IG9yIGFueSBzdXBlcnR5cGUgaGFzIGFueSBmYWNldHMsDQotICAgKiAgICAgICAgICBmYWxzZSAgb3RoZXJ3aXNlDQotICAgKi8NCi0gIHB1YmxpYyBib29sZWFuIGhhc0ZhY2V0cygNCi0gICAgYm9vbGVhbiBmbGF0dGVuKQ0KLSAgew0KLSAgICBib29sZWFuIGhhc0ZhY2V0cyA9ICFfZmFjZXRzLmlzRW1wdHkoKTsNCi0NCi0gICAgaWYgKCFoYXNGYWNldHMgJiYgZmxhdHRlbikNCi0gICAgew0KLSAgICAgIENvbXBvbmVudEJlYW4gcGFyZW50ID0gcmVzb2x2ZVN1cGVydHlwZSgpOw0KLSAgICAgIGlmIChwYXJlbnQgIT0gbnVsbCkNCi0gICAgICAgIGhhc0ZhY2V0cyB8PSBwYXJlbnQuaGFzRmFjZXRzKGZsYXR0ZW4pOw0KLSAgICB9DQotDQotICAgIHJldHVybiBoYXNGYWNldHM7DQotICB9DQotDQotICAvKioNCi0gICAqIFJldHVybnMgYW4gaXRlcmF0b3IgZm9yIGFsbCBmYWNldHMgb24gdGhpcyBjb21wb25lbnQgb25seS4NCi0gICAqDQotICAgKiBAcmV0dXJuICB0aGUgZmFjZXQgaXRlcmF0b3INCi0gICAqLw0KLSAgcHVibGljIEl0ZXJhdG9yPEZhY2V0QmVhbj4gZmFjZXRzKCkNCi0gIHsNCi0gICAgcmV0dXJuIF9mYWNldHMudmFsdWVzKCkuaXRlcmF0b3IoKTsNCi0gIH0NCi0NCi0gIC8qKg0KLSAgICogUmV0dXJucyBhbiBpdGVyYXRvciBmb3IgZmFjZXRzIG9uIHRoaXMgY29tcG9uZW50Lg0KLSAgICoNCi0gICogQHBhcmFtIGZsYXR0ZW4gIHRydWUgICBpZiB0aGUgaXRlcmF0b3Igc2hvdWxkIGJlIGEgY29tYmluZWQgbGlzdCBvZg0KLSAgKiAgICAgICAgICAgICAgICAgICAgICAgIGZhY2V0cyBvZiB0aGlzIGNvbXBvbmVudCBhbmQgaXRzIHN1cGVydHlwZSwNCi0gICogICAgICAgICAgICAgICAgIGZhbHNlICBvdGhlcndpc2UNCi0gICoNCi0gICogQHJldHVybiAgdGhlIGZhY2V0IGl0ZXJhdG9yDQotICAqLw0KLSAgcHVibGljIEl0ZXJhdG9yPEZhY2V0QmVhbj4gZmFjZXRzKA0KLSAgIGJvb2xlYW4gZmxhdHRlbikNCi0gIHsNCi0gICAgaWYgKGZsYXR0ZW4pDQotICAgIHsNCi0gICAgICByZXR1cm4gZ2V0RmxhdHRlbmVkRmFjZXRzKCkudmFsdWVzKCkuaXRlcmF0b3IoKTsNCi0gICAgfQ0KLSAgICBlbHNlDQotICAgIHsNCi0gICAgICByZXR1cm4gZmFjZXRzKCk7DQotICAgIH0NCi0gIH0NCi0NCi0gIHByb3RlY3RlZCBNYXAgZ2V0RmxhdHRlbmVkRmFjZXRzKCkNCi0gIHsNCi0gICAgTWFwIGZhY2V0cyA9IG5ldyBIYXNoTWFwKF9mYWNldHMpOw0KLSAgICBDb21wb25lbnRCZWFuIHBhcmVudCA9IHJlc29sdmVTdXBlcnR5cGUoKTsNCi0gICAgaWYgKHBhcmVudCAhPSBudWxsKQ0KLSAgICB7DQotICAgICAgTWFwIHN1cGVyRmFjZXRzID0gcGFyZW50LmdldEZsYXR0ZW5lZEZhY2V0cygpOw0KLSAgICAgIGZvciAoSXRlcmF0b3I8TWFwLkVudHJ5PiBpdGVyID0gc3VwZXJGYWNldHMuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTsgKQ0KLSAgICAgIHsNCi0gICAgICAgIE1hcC5FbnRyeSBlbnRyeSA9IGl0ZXIubmV4dCgpOw0KLSAgICAgICAgaWYgKCFmYWNldHMuY29udGFpbnNLZXkoZW50cnkuZ2V0S2V5KCkpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICBmYWNldHMucHV0KGVudHJ5LmdldEtleSgpLCBlbnRyeS5nZXRWYWx1ZSgpKTsNCi0gICAgICAgIH0NCi0gICAgICB9DQotICAgIH0NCi0gICAgcmV0dXJuIGZhY2V0czsNCi0gIH0NCi0NCi0gIC8qKg0KLSAgICogU3BlY2lmaWVzIGlmIHRoZSBjb21wb25lbnQgY2FuIGhhdmUgY2hpbGRyZW4uDQotICAgKg0KLSAgICogQHBhcmFtIGNoaWxkcmVuICB0cnVlICBpZiB0aGUgY29tcG9uZW50IGNhbiBoYXZlIGNoaWxkcmVuLg0KLSAgICogICAgICAgICAgICAgICAgICBmYWxzZSBvdGhlcndpc2UNCi0gICAqLw0KLSAgcHVibGljIHZvaWQgc2V0Q2hpbGRyZW4oDQotICAgIGJvb2xlYW4gY2hpbGRyZW4pDQotICB7DQotICAgIF9jaGlsZHJlbiA9IGNoaWxkcmVuOw0KLSAgfQ0KLQ0KLSAgLyoqDQotICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGNvbXBvbmVudCBjYW4gaGF2ZSBjaGlsZHJlbi4NCi0gICAqDQotICAgKiBAcmV0dXJuICB0cnVlICBpZiB0aGUgY29tcG9uZW50IGNhbiBoYXZlIGNoaWxkcmVuLg0KLSAgICogICAgICAgICAgZmFsc2Ugb3RoZXJ3aXNlDQotICAgKi8NCi0gIHB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKCkNCi0gIHsNCi0gICAgcmV0dXJuIF9jaGlsZHJlbjsNCi0gIH0NCi0NCi0gIC8qKg0KLSAgICogQWRkcyBhIEphdmEgTGFuZ3VhZ2UgY2xhc3MgbW9kaWZpZXIgdG8gdGhlIGNvbXBvbmVudCBjbGFzcy4NCi0gICAqDQotICAgKiBAcGFyYW0gbW9kaWZpZXIgIHRoZSBtb2RpZmllciB0byBiZSBhZGRlZA0KLSAgICovDQotICBwdWJsaWMgdm9pZCBhZGRDb21wb25lbnRDbGFzc01vZGlmaWVyKA0KLSAgICBpbnQgbW9kaWZpZXIpDQotICB7DQotICAgIF9jb21wb25lbnRDbGFzc01vZGlmaWVycyB8PSBtb2RpZmllcjsNCi0gIH0NCi0NCi0gIC8qKg0KLSAgICogUmV0dXJucyB0aGUgSmF2YSBMYW5ndWFnZSBjbGFzcyBtb2RpZmllcnMgZm9yIHRoZSBjb21wb25lbnQgY2xhc3MuDQotICAgKiBCeSBkZWZhdWx0LCB0aGVzZSBtb2RpZmllcnMgaW5jbHVkZSBNb2RpZmllci5QVUJMSUMuDQotICAgKg0KLSAgICogQHJldHVybiAgdGhlIEphdmEgTGFuZ3VhZ2UgY2xhc3MgbW9kaWZpZXJzIGZvciB0aGUgY29tcG9uZW50IGNsYXNzDQotICAgKi8NCi0gIHB1YmxpYyBpbnQgZ2V0Q29tcG9uZW50Q2xhc3NNb2RpZmllcnMoKQ0KLSAgew0KLSAgICBpbnQgbW9kaWZpZXJzID0gX2NvbXBvbmVudENsYXNzTW9kaWZpZXJzOw0KLQ0KLSAgICBpZiAoIU1vZGlmaWVyLmlzUHJpdmF0ZShtb2RpZmllcnMpICYmDQotICAgICAgICAhTW9kaWZpZXIuaXNQcm90ZWN0ZWQobW9kaWZpZXJzKSAmJg0KLSAgICAgICAgIU1vZGlmaWVyLmlzUHVibGljKG1vZGlmaWVycykpDQotICAgIHsNCi0gICAgICBtb2RpZmllcnMgfD0gTW9kaWZpZXIuUFVCTElDOw0KLSAgICB9DQotDQotICAgIHJldHVybiBtb2RpZmllcnM7DQotICB9DQotDQotICBwdWJsaWMgdm9pZCBwYXJzZUNvbXBvbmVudENsYXNzTW9kaWZpZXIoDQotICAgIFN0cmluZyBtb2RpZmllcikNCi0gIHsNCi0gICAgYWRkQ29tcG9uZW50Q2xhc3NNb2RpZmllcihfcGFyc2VNb2RpZmllcihtb2RpZmllcikpOw0KLSAgfQ0KLQ0KLSAgcHVibGljIHZvaWQgcGFyc2VUYWdDbGFzc01vZGlmaWVyKA0KLSAgICBTdHJpbmcgbW9kaWZpZXIpDQotICB7DQotICAgIGFkZFRhZ0NsYXNzTW9kaWZpZXIoX3BhcnNlTW9kaWZpZXIobW9kaWZpZXIpKTsNCi0gIH0NCi0NCi0gIC8qKg0KLSAgICogUGFyc2VzIHRoZSB1bnN1cHBvcnRlZCBhZ2VudHMgZm9yIHRoaXMgY29tcG9uZW50IGludG8gYSBTdHJpbmcgYXJyYXkNCi0gICAqIHVzaW5nIHNwYWNlIGFzIHRoZSBzZXBhcmF0b3IgYmV0d2VlbiB2YWx1ZXMuDQotICAgKg0KLSAgICogQHBhcmFtIHVuc3VwcG9ydGVkQWdlbnRzICB0aGUgdW5zdXBwb3J0ZWQgYWdlbnRzDQotICAgKi8NCi0gIHB1YmxpYyB2b2lkIHBhcnNlVW5zdXBwb3J0ZWRBZ2VudHMoDQotICAgIFN0cmluZyB1bnN1cHBvcnRlZEFnZW50cykNCi0gIHsNCi0gICAgc2V0VW5zdXBwb3J0ZWRBZ2VudHModW5zdXBwb3J0ZWRBZ2VudHMuc3BsaXQoIiAiKSk7DQotICB9DQotDQotICAvKioNCi0gICAqIFBhcnNlcyB0aGUgc3RyaW5nIG9mIHNhdGlzZmllZCBjb250cmFjdHMgaW50byBhIFN0cmluZyBhcnJheQ0KLSAgICogdXNpbmcgc3BhY2UgYXMgdGhlIHNlcGFyYXRvciBiZXR3ZWVuIHZhbHVlcy4NCi0gICAqIEluIHRoZSBjb21wb25lbnQgbWV0YWRhdGEgZmlsZSwgdGhlIHNhdGlzZmllZCBjb250cmFjdHMgYXJlIG5vdGVkDQotICAgKiB3aXRoIHNhdGlzZmllZC1jb250cmFjdHMgbWFya3VwLiAgQXMgYW4gZXhhbXBsZSwgYWY6cG9wdXANCi0gICAqIChvcmFjbGUuYWRmLnZpZXcucmljaC5jb21wb25lbnQucmljaC5SaWNoUG9wdXApIHN1cHBvcnRzDQotICAgKiBvcmFjbGUtYWRmLXJpY2htZW51LWhvbGRlciwgb3JhY2xlLWFkZi1yaWNoZGlhbG9nLWhvbGRlciwNCi0gICAqIG9yYWNsZS1hZGYtcmljaG5vdGV3aW5kb3ctaG9sZGVyLCBhbmQgb3JhY2xlLWFkZi1yaWNocGFuZWx3aW5kb3ctaG9sZGVyDQotICAgKiBjb250cmFjdHMuICBUaGUgc2F0aXNmaWVkIGNvbnRyYWN0cyBvZiBhIGdpdmVuIGNvbXBvbmVudCBhcmUgbWF0Y2hlZA0KLSAgICogd2l0aCB0aGUgcmVxdWlyZWQgYW5jZXN0b3IgY29udHJhY3RzIG9mIG90aGVyIGNvbXBvbmVudHMgdG8gZGV0ZXJtaW5lDQotICAgKiBpZiBhIGNvbXBvbmVudCBoaWVyYXJjaHkgaXMgbGVnYWxseSBhc3NlbWJsZWQuDQotICAgKg0KLSAgICogQHBhcmFtIHNhdGlzZmllZENvbnRyYWN0cyAgYSBzcGFjZSBkZWxpbWl0ZWQgc3RyaW5nIG9mIHNhdGlzaWZlZCBjb250cmFjdHMNCi0gICAqLw0KLSAgcHVibGljIHZvaWQgcGFyc2VTYXRpc2ZpZWRDb250cmFjdHMoDQotICAgIFN0cmluZyBzYXRpc2ZpZWRDb250cmFjdHMpDQotICB7DQotICAgIHNldFNhdGlzZmllZENvbnRyYWN0cyhzYXRpc2ZpZWRDb250cmFjdHMuc3BsaXQoIiAiKSk7DQotICB9DQotDQotICAvKioNCi0gICAqIFNldHMgdGhlIHBvc3NpYmxlIHZhbHVlcyBmb3IgdGhpcyBwcm9wZXJ0eS4NCi0gICAqIEluIHRoZSBjb21wb25lbnQgbWV0YWRhdGEgZmlsZSwgdGhlIHNhdGlzZmllZCBjb250cmFjdHMgYXJlIG5vdGVkDQotICAgKiB3aXRoIHNhdGlzZmllZC1jb250cmFjdHMgbWFya3VwLiAgQXMgYW4gZXhhbXBsZSwgYWY6cG9wdXANCi0gICAqIChvcmFjbGUuYWRmLnZpZXcucmljaC5jb21wb25lbnQucmljaC5SaWNoUG9wdXApIHN1cHBvcnRzDQotICAgKiBvcmFjbGUtYWRmLXJpY2htZW51LWhvbGRlciwgb3JhY2xlLWFkZi1yaWNoZGlhbG9nLWhvbGRlciwNCi0gICAqIG9yYWNsZS1hZGYtcmljaG5vdGV3aW5kb3ctaG9sZGVyLCBhbmQgb3JhY2xlLWFkZi1yaWNocGFuZWx3aW5kb3ctaG9sZGVyDQotICAgKiBjb250cmFjdHMuICBUaGUgc2F0aXNmaWVkIGNvbnRyYWN0cyBvZiBhIGdpdmVuIGNvbXBvbmVudCBhcmUgbWF0Y2hlZA0KLSAgICogd2l0aCB0aGUgcmVxdWlyZWQgYW5jZXN0b3IgY29udHJhY3RzIG9mIG90aGVyIGNvbXBvbmVudHMgdG8gZGV0ZXJtaW5lDQotICAgKiBpZiBhIGNvbXBvbmVudCBoaWVyYXJjaHkgaXMgbGVnYWxseSBhc3NlbWJsZWQuDQotICAgKg0KLSAgICogQHBhcmFtIHNhdGlzZmllZENvbnRyYWN0cyAgYSBzdHJpbmcgYXJyYXkgb2YgdGhlIHNhdGlzZmllZCBjb250cmFjdHMNCi0gICAqLw0KLSAgcHVibGljIHZvaWQgc2V0U2F0aXNmaWVkQ29udHJhY3RzKA0KLSAgICBTdHJpbmdbXSBzYXRpc2ZpZWRDb250cmFjdHMpDQotICB7DQotICAgIF9zYXRpc2ZpZWRDb250cmFjdHMgPSBBcnJheXMuYXNMaXN0KHNhdGlzZmllZENvbnRyYWN0cyk7DQotICB9DQotDQotICAvKioNCi0gICAqIFJldHVybnMgYW4gaXRlcmF0b3Igb2YgdGhlIHNhdGlzZmllZCBjb250cmFjdHMgZm9yIHRoaXMgY29tcG9uZW50Lg0KLSAgICogSW4gdGhlIGNvbXBvbmVudCBtZXRhZGF0YSBmaWxlLCB0aGUgc2F0aXNmaWVkIGNvbnRyYWN0cyBhcmUgbm90ZWQNCi0gICAqIHdpdGggc2F0aXNmaWVkLWNvbnRyYWN0cyBtYXJrdXAuICBBcyBhbiBleGFtcGxlLCBhZjpwb3B1cA0KLSAgICogKG9yYWNsZS5hZGYudmlldy5yaWNoLmNvbXBvbmVudC5yaWNoLlJpY2hQb3B1cCkgc3VwcG9ydHMNCi0gICAqIG9yYWNsZS1hZGYtcmljaG1lbnUtaG9sZGVyLCBvcmFjbGUtYWRmLXJpY2hkaWFsb2ctaG9sZGVyLA0KLSAgICogb3JhY2xlLWFkZi1yaWNobm90ZXdpbmRvdy1ob2xkZXIsIGFuZCBvcmFjbGUtYWRmLXJpY2hwYW5lbHdpbmRvdy1ob2xkZXINCi0gICAqIGNvbnRyYWN0cy4gIFRoZSBzYXRpc2ZpZWQgY29udHJhY3RzIG9mIGEgZ2l2ZW4gY29tcG9uZW50IGFyZSBtYXRjaGVkDQotICAgKiB3aXRoIHRoZSByZXF1aXJlZCBhbmNlc3RvciBjb250cmFjdHMgb2Ygb3RoZXIgY29tcG9uZW50cyB0byBkZXRlcm1pbmUNCi0gICAqIGlmIGEgY29tcG9uZW50IGhpZXJhcmNoeSBpcyBsZWdhbGx5IGFzc2VtYmxlZC4NCi0gICAqDQotICAgKiBAcmV0dXJuICBhIGphdmEudXRpbC5JdGVyYXRvciBvZiBTdHJpbmdzLCB3aGVyZSBlYWNoIHN0cmluZyBpcyB0aGUgbmFtZSBvZiBhDQotICAgKiAgICAgICAgICBzYXRpc2ZpZWQgY29udHJhY3QNCi0gICAqLw0KLSAgcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gc2F0aXNmaWVkQ29udHJhY3RzKCkNCi0gIHsNCi0gICAgcmV0dXJuIF9zYXRpc2ZpZWRDb250cmFjdHMuaXRlcmF0b3IoKTsNCi0gIH0NCi0NCi0gIC8qKg0KLSAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgY29tcG9uZW50IGhhcyBhbnkgc2F0aXNmaWVkIGNvbnRyYWN0cy4NCi0gICAqDQotICAgKiBAcmV0dXJuICB0cnVlICAgaWYgdGhpcyBjb21wb25lbnQgaGFzIGFueSBzYXRpc2ZpZWQgY29udHJhY3RzLA0KLSAgICogICAgICAgICAgZmFsc2UgIG90aGVyd2lzZQ0KLSAgICovDQotICBwdWJsaWMgYm9vbGVhbiBoYXNTYXRpc2ZpZWRDb250cmFjdHMoKQ0KLSAgew0KLSAgICByZXR1cm4gKCFfc2F0aXNmaWVkQ29udHJhY3RzLmlzRW1wdHkoKSk7DQotICB9DQotDQotICAvKioNCi0gICAqIFBhcnNlcyB0aGUgc3RyaW5nIG9mIHJlcXVpcmVkIGFuY2VzdG9yIGNvbnRyYWN0cyBpbnRvIGEgU3RyaW5nIGFycmF5DQotICAgKiB1c2luZyBzcGFjZSBhcyB0aGUgc2VwYXJhdG9yIGJldHdlZW4gdmFsdWVzLg0KLSAgICogSW4gdGhlIGNvbXBvbmVudCBtZXRhZGF0YSBmaWxlLCB0aGUgcmVxdWlyZWQgYW5jZXN0b3JzIGFyZSBub3RlZA0KLSAgICogd2l0aCByZXF1aXJlZC1hbmNlc3Rvci1jb250cmFjdHMgbWFya3VwLiBUaGlzIGluZGljYXRlcyB0aGF0IGFuDQotICAgKiBhbmNlc3RvciAoZS5nLiBwYXJlbnQgb3IgZ3JhbmRwYXJlbnQpIHRhZyBtdXN0IGJlIGhhdmUgc2F0aXNmaWVkLWNvbnRyYWN0cw0KLSAgICogbWV0YWRhdGEgbWF0Y2hpbmcgdGhlIHJlcXVpcmVkLWFuY2VzdG9yLWNvbnRyYWN0cyBtZXRhZGF0YSBvZiB0aGlzIHRhZy4NCi0gICAqIEFzIGFuIGV4YW1wbGUsIGFmOmRpYWxvZw0KLSAgICogKG9yYWNsZS5hZGYudmlldy5yaWNoLmNvbXBvbmVudC5yaWNoLlJpY2hEaWFsb2cpIGxpc3RzDQotICAgKiBvcmFjbGUtYWRmLXJpY2hkaWFsb2ctaG9sZGVyIGFzIGEgcmVxdWlyZWQgYW5jZXN0b3IgY29udHJhY3QsIGFuZA0KLSAgICogYWY6cG9wdXAgKG9yYWNsZS5hZGYudmlldy5yaWNoLmNvbXBvbmVudC5yaWNoLlJpY2hQb3B1cCkgbGlzdHMNCi0gICAqIG9yYWNsZS1hZGYtcmljaGRpYWxvZy1ob2xkZXIgYXMgYSBzYXRpc2lmaWVkIGNvbnRyYWN0Lg0KLSAgICoNCi0gICAqIEBwYXJhbSByZXF1aXJlZEFuY2VzdG9yQ29udHJhY3RzICBhIHNwYWNlIGRlbGltaXRlZCBzdHJpbmcgb2YgcmVxdWlyZWQgYW5jZXN0b3IgY29udHJhY3RzDQotICAgKi8NCi0gIHB1YmxpYyB2b2lkIHBhcnNlUmVxdWlyZWRBbmNlc3RvckNvbnRyYWN0cygNCi0gICAgU3RyaW5nIHJlcXVpcmVkQW5jZXN0b3JDb250cmFjdHMpDQotICB7DQotICAgIHNldFJlcXVpcmVkQW5jZXN0b3JDb250cmFjdHMocmVxdWlyZWRBbmNlc3RvckNvbnRyYWN0cy5zcGxpdCgiICIpKTsNCi0gIH0NCi0NCi0gIC8qKg0KLSAgICogU2V0cyB0aGUgcG9zc2libGUgdmFsdWVzIGZvciB0aGlzIHByb3BlcnR5Lg0KLSAgICogSW4gdGhlIGNvbXBvbmVudCBtZXRhZGF0YSBmaWxlLCB0aGUgcmVxdWlyZWQgYW5jZXN0b3JzIGFyZSBub3RlZA0KLSAgICogd2l0aCByZXF1aXJlZC1hbmNlc3Rvci1jb250cmFjdHMgbWFya3VwLiBUaGlzIGluZGljYXRlcyB0aGF0IGFuDQotICAgKiBhbmNlc3RvciAoZS5nLiBwYXJlbnQgb3IgZ3JhbmRwYXJlbnQpIHRhZyBtdXN0IGJlIGhhdmUgc2F0aXNmaWVkLWNvbnRyYWN0cw0KLSAgICogbWV0YWRhdGEgbWF0Y2hpbmcgdGhlIHJlcXVpcmVkLWFuY2VzdG9yLWNvbnRyYWN0cyBtZXRhZGF0YSBvZiB0aGlzIHRhZy4NCi0gICAqIEFzIGFuIGV4YW1wbGUsIGFmOmRpYWxvZw0KLSAgICogKG9yYWNsZS5hZGYudmlldy5yaWNoLmNvbXBvbmVudC5yaWNoLlJpY2hEaWFsb2cpIGxpc3RzDQotICAgKiBvcmFjbGUtYWRmLXJpY2hkaWFsb2ctaG9sZGVyIGFzIGEgcmVxdWlyZWQgYW5jZXN0b3IgY29udHJhY3QsIGFuZA0KLSAgICogYWY6cG9wdXAgKG9yYWNsZS5hZGYudmlldy5yaWNoLmNvbXBvbmVudC5yaWNoLlJpY2hQb3B1cCkgbGlzdHMNCi0gICAqIG9yYWNsZS1hZGYtcmljaGRpYWxvZy1ob2xkZXIgYXMgYSBzYXRpc2lmaWVkIGNvbnRyYWN0Lg0KLSAgICoNCi0gICAqIEBwYXJhbSByZXF1aXJlZEFuY2VzdG9yQ29udHJhY3RzICBhIHN0cmluZyBhcnJheSBvZiB0aGUgcmVxdWlyZWQgYW5jZXN0b3IgY29udHJhY3RzDQotICAgKi8NCi0gIHB1YmxpYyB2b2lkIHNldFJlcXVpcmVkQW5jZXN0b3JDb250cmFjdHMoDQotICAgIFN0cmluZ1tdIHJlcXVpcmVkQW5jZXN0b3JDb250cmFjdHMpDQotICB7DQotICAgIF9yZXF1aXJlZEFuY2VzdG9yQ29udHJhY3RzID0gQXJyYXlzLmFzTGlzdChyZXF1aXJlZEFuY2VzdG9yQ29udHJhY3RzKTsNCi0gIH0NCi0NCi0gIC8qKg0KLSAgICogUmV0dXJucyB0aGUgcmVxdWlyZWQgYW5jZXN0b3IgY29udHJhY3RzIGZvciB0aGlzIGNvbXBvbmVudC4NCi0gICAqIEluIHRoZSBjb21wb25lbnQgbWV0YWRhdGEgZmlsZSwgdGhlIHJlcXVpcmVkIGFuY2VzdG9ycyBhcmUgbm90ZWQNCi0gICAqIHdpdGggcmVxdWlyZWQtYW5jZXN0b3ItY29udHJhY3RzIG1hcmt1cC4gVGhpcyBpbmRpY2F0ZXMgdGhhdCBhbg0KLSAgICogYW5jZXN0b3IgKGUuZy4gcGFyZW50IG9yIGdyYW5kcGFyZW50KSB0YWcgbXVzdCBiZSBoYXZlIHNhdGlzZmllZC1jb250cmFjdHMNCi0gICAqIG1ldGFkYXRhIG1hdGNoaW5nIHRoZSByZXF1aXJlZC1hbmNlc3Rvci1jb250cmFjdHMgbWV0YWRhdGEgb2YgdGhpcyB0YWcuDQotICAgKiBBcyBhbiBleGFtcGxlLCBhZjpkaWFsb2cNCi0gICAqIChvcmFjbGUuYWRmLnZpZXcucmljaC5jb21wb25lbnQucmljaC5SaWNoRGlhbG9nKSBsaXN0cw0KLSAgICogb3JhY2xlLWFkZi1yaWNoZGlhbG9nLWhvbGRlciBhcyBhIHJlcXVpcmVkIGFuY2VzdG9yIGNvbnRyYWN0LCBhbmQNCi0gICAqIGFmOnBvcHVwIChvcmFjbGUuYWRmLnZpZXcucmljaC5jb21wb25lbnQucmljaC5SaWNoUG9wdXApIGxpc3RzDQotICAgKiBvcmFjbGUtYWRmLXJpY2hkaWFsb2ctaG9sZGVyIGFzIGEgc2F0aXNpZmllZCBjb250cmFjdC4NCi0gICAqDQotICAgKiBAcmV0dXJuICBhIGphdmEudXRpbC5JdGVyYXRvciBvZiBzdHJpbmdzLCB3aGVyZSBlYWNoIHN0cmluZyBpcyB0aGUgbmFtZQ0KLSAgICogICAgICAgICAgb2YgYSByZXF1aXJlZCBhbmNlc3RvciBjb250cmFjdA0KLSAgICovDQotICBwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiByZXF1aXJlZEFuY2VzdG9yQ29udHJhY3RzKCkNCi0gIHsNCi0gICAgcmV0dXJuIF9yZXF1aXJlZEFuY2VzdG9yQ29udHJhY3RzLml0ZXJhdG9yKCk7DQotICB9DQotDQotICAvKioNCi0gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGNvbXBvbmVudCBoYXMgYW55IHJlcXVpcmVkIGFuY2VzdG9yIGNvbnRyYWN0cy4NCi0gICAqDQotICAgKiBAcmV0dXJuICB0cnVlICAgaWYgdGhpcyBjb21wb25lbnQgaGFzIGFueSByZXF1aXJlZCBhbmNlc3RvciBjb250cmFjdHMsDQotICAgKiAgICAgICAgICBmYWxzZSAgb3RoZXJ3aXNlDQotICAgKi8NCi0gIHB1YmxpYyBib29sZWFuIGhhc1JlcXVpcmVkQW5jZXN0b3JDb250cmFjdHMoKQ0KLSAgew0KLSAgICByZXR1cm4gKCFfcmVxdWlyZWRBbmNlc3RvckNvbnRyYWN0cy5pc0VtcHR5KCkpOw0KLSAgfQ0KLQ0KLSAgLyoqDQotICAgKiBBZGRzIGEgSmF2YSBMYW5ndWFnZSBjbGFzcyBtb2RpZmllciB0byB0aGUgdGFnIGNsYXNzLg0KLSAgICoNCi0gICAqIEBwYXJhbSBtb2RpZmllciAgdGhlIG1vZGlmaWVyIHRvIGJlIGFkZGVkDQotICAgKi8NCi0gIHB1YmxpYyB2b2lkIGFkZFRhZ0NsYXNzTW9kaWZpZXIoDQotICAgIGludCBtb2RpZmllcikNCi0gIHsNCi0gICAgX3RhZ0NsYXNzTW9kaWZpZXJzIHw9IG1vZGlmaWVyOw0KLSAgfQ0KLQ0KLSAgLyoqDQotICAgKiBSZXR1cm5zIHRoZSBKYXZhIExhbmd1YWdlIGNsYXNzIG1vZGlmaWVycyBmb3IgdGhlIHRhZyBjbGFzcy4NCi0gICAqIEJ5IGRlZmF1bHQsIHRoZXNlIG1vZGlmaWVycyBpbmNsdWRlIE1vZGlmaWVyLlBVQkxJQy4NCi0gICAqDQotICAgKiBAcmV0dXJuICB0aGUgSmF2YSBMYW5ndWFnZSBjbGFzcyBtb2RpZmllcnMgZm9yIHRoZSB0YWcgY2xhc3MNCi0gICAqLw0KLSAgcHVibGljIGludCBnZXRUYWdDbGFzc01vZGlmaWVycygpDQotICB7DQotICAgIGludCBtb2RpZmllcnMgPSBfdGFnQ2xhc3NNb2RpZmllcnM7DQotDQotICAgIGlmICghTW9kaWZpZXIuaXNQcml2YXRlKG1vZGlmaWVycykgJiYNCi0gICAgICAgICFNb2RpZmllci5pc1Byb3RlY3RlZChtb2RpZmllcnMpICYmDQotICAgICAgICAhTW9kaWZpZXIuaXNQdWJsaWMobW9kaWZpZXJzKSkNCi0gICAgew0KLSAgICAgIG1vZGlmaWVycyB8PSBNb2RpZmllci5QVUJMSUM7DQotICAgIH0NCi0NCi0gICAgcmV0dXJuIG1vZGlmaWVyczsNCi0gIH0NCi0NCi0gIC8qKg0KLSAgICogQWRkcyBhbiBldmVudCB0byB0aGlzIGNvbXBvbmVudC4NCi0gICAqDQotICAgKiBAcGFyYW0gZXZlbnRSZWYgIHRoZSBldmVudCB0byBhZGQNCi0gICAqLw0KLSAgcHVibGljIHZvaWQgYWRkRXZlbnQoDQotICAgIEV2ZW50UmVmQmVhbiBldmVudFJlZikNCi0gIHsNCi0gICAgaWYgKGV2ZW50UmVmLmdldEV2ZW50VHlwZSgpID09IG51bGwpDQotICAgIHsNCi0gICAgICBfTE9HLndhcm5pbmcoIk1pc3NpbmcgZXZlbnQgdHlwZSBpbiBjb21wb25lbnQgXCIiICsNCi0gICAgICAgICAgICAgICAgICAgX2NvbXBvbmVudFR5cGUgKyAiXCIiKTsNCi0gICAgfQ0KLSAgICBlbHNlDQotICAgIHsNCi0gICAgICBfZXZlbnRzLnB1dChldmVudFJlZi5nZXRFdmVudFR5cGUoKSwgZXZlbnRSZWYpOw0KLSAgICB9DQotICB9DQotDQotICAvKioNCi0gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGNvbXBvbmVudCBoYXMgYW55IGV2ZW50cy4NCi0gICAqDQotICAgKiBAcmV0dXJuICB0cnVlICAgaWYgdGhpcyBjb21wb25lbnQgaGFzIGFueSBldmVudHMsDQotICAgKiAgICAgICAgICBmYWxzZSAgb3RoZXJ3aXNlDQotICAgKi8NCi0gIHB1YmxpYyBib29sZWFuIGhhc0V2ZW50cygpDQotICB7DQotICAgIHJldHVybiBoYXNFdmVudHMoZmFsc2UpOw0KLSAgfQ0KLQ0KLSAgLyoqDQotICAgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBjb21wb25lbnQgb3IgYW55IGNvbXBvbmVudCBzdXBlcnR5cGUNCi0gICAqIGhhcyBhbnkgZXZlbnRzLg0KLSAgICoNCi0gICAqIEByZXR1cm4gIHRydWUgICBpZiB0aGlzIGNvbXBvbmVudCBvciBhbnkgc3VwZXJ0eXBlIGhhcyBhbnkgZXZlbnRzLA0KLSAgICogICAgICAgICAgZmFsc2UgIG90aGVyd2lzZQ0KLSAgICovDQotICBwdWJsaWMgYm9vbGVhbiBoYXNFdmVudHMoDQotICAgIGJvb2xlYW4gZmxhdHRlbikNCi0gIHsNCi0gICAgYm9vbGVhbiBoYXNFdmVudHMgPSAhX2V2ZW50cy5pc0VtcHR5KCk7DQotDQotICAgIGlmICghaGFzRXZlbnRzICYmIGZsYXR0ZW4pDQotICAgIHsNCi0gICAgICBDb21wb25lbnRCZWFuIHBhcmVudCA9IHJlc29sdmVTdXBlcnR5cGUoKTsNCi0gICAgICBpZiAocGFyZW50ICE9IG51bGwpDQotICAgICAgICBoYXNFdmVudHMgfD0gcGFyZW50Lmhhc0V2ZW50cyhmbGF0dGVuKTsNCi0gICAgfQ0KLQ0KLSAgICByZXR1cm4gaGFzRXZlbnRzOw0KLSAgfQ0KLQ0KLSAgLyoqDQotICAgKiBSZXR1cm5zIHRoZSBldmVudCBmb3IgdGhpcyBldmVudCBuYW1lLg0KLSAgICoNCi0gICAqIEBwYXJhbSBldmVudE5hbWUgIHRoZSBldmVudCBuYW1lIHRvIGZpbmQNCi0gICAqLw0KLSAgcHVibGljIEV2ZW50UmVmQmVhbiBmaW5kRXZlbnQoDQotICAgIFN0cmluZyBldmVudE5hbWUpDQotICB7DQotICAgIHJldHVybiBfZXZlbnRzLmdldChldmVudE5hbWUpOw0KLSAgfQ0KLQ0KLSAgcHVibGljIEV2ZW50UmVmQmVhbiBmaW5kRXZlbnQoDQotICAgIFN0cmluZyBldmVudE5hbWUsDQotICAgIGJvb2xlYW4gZmxhdHRlbikNCi0gIHsNCi0gICAgRXZlbnRSZWZCZWFuIGV2ZW50ID0gZmluZEV2ZW50KGV2ZW50TmFtZSk7DQotICAgIGlmIChldmVudCA9PSBudWxsICYmIGZsYXR0ZW4pDQotICAgIHsNCi0gICAgICBDb21wb25lbnRCZWFuIHBhcmVudCA9IHJlc29sdmVTdXBlcnR5cGUoKTsNCi0gICAgICBpZiAocGFyZW50ICE9IG51bGwpDQotICAgICAgICBldmVudCA9IHBhcmVudC5maW5kRXZlbnQoZXZlbnROYW1lLCBmbGF0dGVuKTsNCi0gICAgfQ0KLQ0KLSAgICByZXR1cm4gZXZlbnQ7DQotICB9DQotDQotICAvKioNCi0gICAqIFJldHVybnMgYW4gaXRlcmF0b3IgZm9yIGFsbCBldmVudHMgb24gdGhpcyBjb21wb25lbnQgb25seS4NCi0gICAqDQotICAgKiBAcmV0dXJuICB0aGUgZXZlbnQgaXRlcmF0b3INCi0gICAqLw0KLSAgcHVibGljIEl0ZXJhdG9yPEV2ZW50UmVmQmVhbj4gZXZlbnRzKCkNCi0gIHsNCi0gICAgcmV0dXJuIF9ldmVudHMudmFsdWVzKCkuaXRlcmF0b3IoKTsNCi0gIH0NCi0NCi0gIC8qKg0KLSAgICogUmV0dXJucyBhbiBpdGVyYXRvciBmb3IgZXZlbnRzIG9uIHRoaXMgY29tcG9uZW50Lg0KLSAgICoNCi0gICogQHBhcmFtIGZsYXR0ZW4gIHRydWUgICBpZiB0aGUgaXRlcmF0b3Igc2hvdWxkIGJlIGEgY29tYmluZWQgbGlzdCBvZg0KLSAgKiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50cyBvZiB0aGlzIGNvbXBvbmVudCBhbmQgaXRzIHN1cGVydHlwZSwNCi0gICogICAgICAgICAgICAgICAgIGZhbHNlICBvdGhlcndpc2UNCi0gICoNCi0gICogQHJldHVybiAgdGhlIGV2ZW50IGl0ZXJhdG9yDQotICAqLw0KLSAgcHVibGljIEl0ZXJhdG9yPEV2ZW50UmVmQmVhbj4gZXZlbnRzKA0KLSAgIGJvb2xlYW4gZmxhdHRlbikNCi0gIHsNCi0gICAgSXRlcmF0b3I8RXZlbnRSZWZCZWFuPiBldmVudHMgPSBldmVudHMoKTsNCi0gICAgaWYgKGZsYXR0ZW4pDQotICAgIHsNCi0gICAgICBDb21wb25lbnRCZWFuIHBhcmVudCA9IHJlc29sdmVTdXBlcnR5cGUoKTsNCi0gICAgICBpZiAocGFyZW50ICE9IG51bGwpDQotICAgICAgICBldmVudHMgPSBuZXcgQ29tcG91bmRJdGVyYXRvcihldmVudHMsIHBhcmVudC5ldmVudHModHJ1ZSkpOw0KLSAgICB9DQotICAgIHJldHVybiBldmVudHM7DQotICB9DQotDQotICAvKioNCi0gICAqIEZpbmRzIHRoZSBjb21wb25lbnQgZmFtaWx5IGluIHRoZSBjb21wb25lbnQgaW5oZXJpdGFuY2UNCi0gICAqIGhpZXJhcmNoeS4NCi0gICAqDQotICAgKiBAcmV0dXJuICB0aGUgY29tcG9uZW50IGZhbWlseQ0KLSAgICovDQotICBwdWJsaWMgU3RyaW5nIGZpbmRDb21wb25lbnRGYW1pbHkoKQ0KLSAgew0KLSAgICBpZiAoX2NvbXBvbmVudEZhbWlseSAhPSBudWxsKQ0KLSAgICAgIHJldHVybiBfY29tcG9uZW50RmFtaWx5Ow0KLQ0KLSAgICBDb21wb25lbnRCZWFuIHBhcmVudCA9IHJlc29sdmVTdXBlcnR5cGUoKTsNCi0gICAgcmV0dXJuIChwYXJlbnQgIT0gbnVsbCkgPyBwYXJlbnQuZmluZENvbXBvbmVudEZhbWlseSgpIDogbnVsbDsNCi0gIH0NCi0NCi0gIC8qKg0KLSAgICogRmluZHMgdGhlIGJlaGF2aW9yYWwgY29tcG9uZW50IGNvbXBvbmVudCBpbmhlcml0YW5jZQ0KLSAgICogaGllcmFyY2h5Lg0KLSAgICoNCi0gICAqIEByZXR1cm4gIHRoZSBiZWhhdmlvcmFsIGNvbXBvbmVudA0KLSAgICovDQotICBwdWJsaWMgQ29tcG9uZW50QmVhbiBmaW5kQmVoYXZpb3JhbENvbXBvbmVudCgpDQotICB7DQotICAgIGlmIChfY29tcG9uZW50RmFtaWx5ICE9IG51bGwpDQotICAgICAgcmV0dXJuIHRoaXM7DQotDQotICAgIENvbXBvbmVudEJlYW4gY29tcG9uZW50ID0gcmVzb2x2ZVN1cGVydHlwZSgpOw0KLSAgICByZXR1cm4gKGNvbXBvbmVudCAhPSBudWxsKSA/IGNvbXBvbmVudC5maW5kQmVoYXZpb3JhbENvbXBvbmVudCgpIDogdGhpczsNCi0gIH0NCi0NCi0gIC8qKg0KLSAgICogRmluZHMgdGhlIHJlbmRlcmVyIHR5cGUgaW4gdGhlIGNvbXBvbmVudCBpbmhlcml0YW5jZQ0KLSAgICogaGllcmFyY2h5Lg0KLSAgICoNCi0gICAqIEByZXR1cm4gIHRoZSByZW5kZXJlciB0eXBlDQotICAgKi8NCi0gIHB1YmxpYyBTdHJpbmcgZmluZFJlbmRlcmVyVHlwZSgpDQotICB7DQotICAgIGlmIChfcmVuZGVyZXJUeXBlICE9IG51bGwpDQotICAgICAgcmV0dXJuIF9yZW5kZXJlclR5cGU7DQotDQotICAgIENvbXBvbmVudEJlYW4gcGFyZW50ID0gcmVzb2x2ZVN1cGVydHlwZSgpOw0KLSAgICByZXR1cm4gKHBhcmVudCAhPSBudWxsKSA/IHBhcmVudC5maW5kUmVuZGVyZXJUeXBlKCkgOiBudWxsOw0KLSAgfQ0KLQ0KLSAgLyoqDQotICAgKiBGaW5kcyB0aGUgY29tcG9uZW50IHN1cGVyY2xhc3MgaW4gdGhlIGNvbXBvbmVudCBpbmhlcml0YW5jZQ0KLSAgICogaGllcmFyY2h5Lg0KLSAgICoNCi0gICAqIEByZXR1cm4gIHRoZSBjb21wb25lbnQgc3VwZXJjbGFzcw0KLSAgICovDQotICBwdWJsaWMgU3RyaW5nIGZpbmRDb21wb25lbnRTdXBlcmNsYXNzKCkNCi0gIHsNCi0gICAgaWYgKF9jb21wb25lbnRTdXBlcmNsYXNzICE9IG51bGwpDQotICAgICAgcmV0dXJuIF9jb21wb25lbnRTdXBlcmNsYXNzOw0KLQ0KLSAgICBDb21wb25lbnRCZWFuIHBhcmVudCA9IHJlc29sdmVTdXBlcnR5cGUoKTsNCi0gICAgcmV0dXJuIChwYXJlbnQgIT0gbnVsbCkgPyBwYXJlbnQuZmluZENvbXBvbmVudENsYXNzKCkNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBfVFJJTklEQURfQ09NUE9ORU5UX0JBU0U7DQotICB9DQotDQotICAvKioNCi0gICAqIEZpbmRzIHRoZSB0YWcgc3VwZXJjbGFzcyBpbiB0aGUgY29tcG9uZW50IGluaGVyaXRhbmNlDQotICAgKiBoaWVyYXJjaHkuDQotICAgKg0KLSAgICogQHJldHVybiAgdGhlIHRhZyBzdXBlcmNsYXNzDQotICAgKi8NCi0gIHB1YmxpYyBTdHJpbmcgZmluZEpzcFRhZ1N1cGVyY2xhc3MoKQ0KLSAgew0KLSAgICBpZiAoX3RhZ1N1cGVyY2xhc3MgIT0gbnVsbCkNCi0gICAgICByZXR1cm4gX3RhZ1N1cGVyY2xhc3M7DQotDQotICAgIENvbXBvbmVudEJlYW4gcGFyZW50ID0gcmVzb2x2ZVN1cGVydHlwZSgpOw0KLSAgICByZXR1cm4gKHBhcmVudCAhPSBudWxsKSA/IHBhcmVudC5maW5kSnNwVGFnQ2xhc3MoKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IF9UUklOSURBRF9DT01QT05FTlRfVEFHOw0KLSAgfQ0KLQ0KLSAgLyoqDQotICAgKiBSZXR1cm5zIHRoZSBjb21wb25lbnQgc3VwZXJ0eXBlIGluc3RhbmNlLg0KLSAgICoNCi0gICAqIEByZXR1cm4gIHRoZSBjb21wb25lbnQgc3VwZXJ0eXBlIGluc3RhbmNlDQotICAgKi8NCi0gIHB1YmxpYyBDb21wb25lbnRCZWFuIHJlc29sdmVTdXBlcnR5cGUoKQ0KLSAgew0KLSAgICBpZiAoX2NvbXBvbmVudFN1cGVydHlwZSA9PSBudWxsKQ0KLSAgICAgIHJldHVybiBudWxsOw0KLQ0KLSAgICBGYWNlc0NvbmZpZ0JlYW4gb3duZXIgPSBnZXRPd25lcigpOw0KLSAgICByZXR1cm4gKG93bmVyICE9IG51bGwpID8gb3duZXIuZmluZENvbXBvbmVudChfY29tcG9uZW50U3VwZXJ0eXBlKSA6IG51bGw7DQotICB9DQotDQotICAvKioNCi0gICAqIENoZWNrcyBpZiBhbnkgb2YgdGhlIGNvbXBvbmVudCBzdXBlcmNsYXNzZXMgaXMgVUlYQ29tcG9uZW50QmFzZQ0KLSAgICovDQotICBwdWJsaWMgYm9vbGVhbiBpc1RyaW5pZGFkQ29tcG9uZW50KCkNCi0gIHsNCi0gICAgU3RyaW5nIGltcGxlbWVudGF0aW9uVHlwZSA9IGdldEltcGxlbWVudGF0aW9uVHlwZSgpOw0KLSAgICBpZiAoaW1wbGVtZW50YXRpb25UeXBlICE9IG51bGwpDQotICAgICAgcmV0dXJuICJ0cmluaWRhZCIuZXF1YWxzKGltcGxlbWVudGF0aW9uVHlwZSk7DQotDQotICAgIENvbXBvbmVudEJlYW4gY29tcG9uZW50U3VwZXJ0eXBlID0gcmVzb2x2ZVN1cGVydHlwZSgpOw0KLSAgICBpZiAoY29tcG9uZW50U3VwZXJ0eXBlICE9IG51bGwpDQotICAgIHsNCi0gICAgICBpZiAoX1RSSU5JREFEX0NPTVBPTkVOVF9CQVNFLmVxdWFscyhjb21wb25lbnRTdXBlcnR5cGUuZ2V0Q29tcG9uZW50Q2xhc3MoKSkpDQotICAgICAgew0KLSAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgfQ0KLSAgICAgIGVsc2UNCi0gICAgICB7DQotICAgICAgICByZXR1cm4gY29tcG9uZW50U3VwZXJ0eXBlLmlzVHJpbmlkYWRDb21wb25lbnQoKTsNCi0gICAgICB9DQotICAgIH0NCi0NCi0gICAgcmV0dXJuIGZhbHNlOw0KLSAgfQ0KLQ0KLSAgLyoqDQotICAgKiBGaW5kcyB0aGUgY29tcG9uZW50IGNsYXNzIGluIHRoZSBjb21wb25lbnQgaW5oZXJpdGFuY2UNCi0gICAqIGhpZXJhcmNoeS4NCi0gICAqDQotICAgKiBAcmV0dXJuICB0aGUgY29tcG9uZW50IGNsYXNzDQotICAgKi8NCi0gIHByb3RlY3RlZCBTdHJpbmcgZmluZENvbXBvbmVudENsYXNzKCkNCi0gIHsNCi0gICAgaWYgKF9jb21wb25lbnRDbGFzcyAhPSBudWxsKQ0KLSAgICAgIHJldHVybiBfY29tcG9uZW50Q2xhc3M7DQotDQotICAgIENvbXBvbmVudEJlYW4gcGFyZW50ID0gcmVzb2x2ZVN1cGVydHlwZSgpOw0KLSAgICByZXR1cm4gKHBhcmVudCAhPSBudWxsKSA/IHBhcmVudC5maW5kQ29tcG9uZW50Q2xhc3MoKSA6IG51bGw7DQotICB9DQotDQotICAvKioNCi0gICAqIEZpbmRzIHRoZSB0YWcgY2xhc3MgaW4gdGhlIGNvbXBvbmVudCBpbmhlcml0YW5jZQ0KLSAgICogaGllcmFyY2h5Lg0KLSAgICoNCi0gICAqIEByZXR1cm4gIHRoZSB0YWcgY2xhc3MNCi0gICAqLw0KLSAgcHJvdGVjdGVkIFN0cmluZyBmaW5kSnNwVGFnQ2xhc3MoKQ0KLSAgew0KLSAgICBTdHJpbmcgdGFnQ2xhc3MgPSBnZXRUYWdDbGFzcygpOw0KLSAgICBpZiAodGFnQ2xhc3MgIT0gbnVsbCkNCi0gICAgICByZXR1cm4gdGFnQ2xhc3M7DQotDQotICAgIENvbXBvbmVudEJlYW4gcGFyZW50ID0gcmVzb2x2ZVN1cGVydHlwZSgpOw0KLSAgICByZXR1cm4gKHBhcmVudCAhPSBudWxsKSA/IHBhcmVudC5maW5kSnNwVGFnQ2xhc3MoKSA6IG51bGw7DQotICB9DQotDQotICAvKioNCi0gICAqIEF0dGFjaGVzIHRoZSBjb21wb25lbnQgYW5kIGFsbCBldmVudCByZWZlcmVuY2VzLg0KLSAgICoNCi0gICAqIEBwYXJhbSBvd25lciAgdGhlIGZhY2VzIGNvbmZpZyBvd25lcg0KLSAgICovDQotICBwcm90ZWN0ZWQgdm9pZCBhdHRhY2goDQotICAgIEZhY2VzQ29uZmlnQmVhbiBvd25lcikNCi0gIHsNCi0gICAgc3VwZXIuYXR0YWNoKG93bmVyKTsNCi0gICAgSXRlcmF0b3I8RXZlbnRSZWZCZWFuPiBldmVudHMgPSBldmVudHMoZmFsc2UpOw0KLSAgICB3aGlsZSAoZXZlbnRzLmhhc05leHQoKSkNCi0gICAgew0KLSAgICAgIEV2ZW50UmVmQmVhbiBldmVudFJlZiA9IGV2ZW50cy5uZXh0KCk7DQotICAgICAgZXZlbnRSZWYuYXR0YWNoKG93bmVyKTsNCi0gICAgfQ0KLSAgfQ0KLQ0KLSAgcHJpdmF0ZSBTdHJpbmcgIF9kZXNjcmlwdGlvbjsNCi0gIHByaXZhdGUgU3RyaW5nICBfbG9uZ0Rlc2NyaXB0aW9uOw0KLSAgcHJpdmF0ZSBTdHJpbmcgIF9jb21wb25lbnRUeXBlOw0KLSAgcHJpdmF0ZSBTdHJpbmcgIF9jb21wb25lbnRGYW1pbHk7DQotICBwcml2YXRlIFN0cmluZyAgX2NvbXBvbmVudENsYXNzOw0KLSAgcHJpdmF0ZSBTdHJpbmcgIF9qc0NvbXBvbmVudENsYXNzOw0KLSAgcHJpdmF0ZSBTdHJpbmcgIF9jb21wb25lbnRTdXBlcnR5cGU7DQotICBwcml2YXRlIFN0cmluZyAgX2NvbXBvbmVudFN1cGVyY2xhc3M7DQotICBwcml2YXRlIFN0cmluZyAgX3JlbmRlcmVyVHlwZTsNCi0gIHByaXZhdGUgU3RyaW5nICBfaW1wbGVtZW50YXRpb25UeXBlOw0KLSAgcHJpdmF0ZSBTdHJpbmcgIF90YWdIYW5kbGVyOw0KLSAgcHJpdmF0ZSBTdHJpbmcgIF90YWdTdXBlcmNsYXNzOw0KLSAgcHJpdmF0ZSBTdHJpbmcgIF9sb2NhbE5hbWU7DQotICBwcml2YXRlIFN0cmluZyAgX25vZGVDbGFzczsNCi0gIHByaXZhdGUgU3RyaW5nICBfZGVmYXVsdEV2ZW50TmFtZTsNCi0gIHByaXZhdGUgYm9vbGVhbiBfbmFtaW5nQ29udGFpbmVyOw0KLSAgcHJpdmF0ZSBib29sZWFuIF9jaGlsZHJlbiA9IHRydWU7DQotICBwcml2YXRlIE1hcDxTdHJpbmcsIFByb3BlcnR5QmVhbj4gX3Byb3BlcnRpZXM7DQotICBwcml2YXRlIE1hcDxTdHJpbmcsIEZhY2V0QmVhbj4gICAgX2ZhY2V0czsNCi0gIHByaXZhdGUgTWFwPFN0cmluZywgRXZlbnRSZWZCZWFuPiAgICBfZXZlbnRzOw0KLSAgcHJpdmF0ZSBpbnQgICAgIF9jb21wb25lbnRDbGFzc01vZGlmaWVyczsNCi0gIHByaXZhdGUgaW50ICAgICBfdGFnQ2xhc3NNb2RpZmllcnM7DQotICBwcml2YXRlIFN0cmluZ1tdIF91bnN1cHBvcnRlZEFnZW50cyA9IG5ldyBTdHJpbmdbMF07DQotICBwcml2YXRlIExpc3Q8U3RyaW5nPiBfcmVxdWlyZWRBbmNlc3RvckNvbnRyYWN0cyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOw0KLSAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gX3NhdGlzZmllZENvbnRyYWN0cyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOw0KLQ0KLSAgcHJpdmF0ZSBTdHJpbmdbXSBfZXZlbnROYW1lczsNCi0NCi0gIHN0YXRpYyBwcml2YXRlIGZpbmFsIFN0cmluZyBfVFJJTklEQURfQ09NUE9ORU5UX0JBU0UgPQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLmNvbXBvbmVudC5VSVhDb21wb25lbnRCYXNlIjsNCi0NCi0gIHN0YXRpYyBwcml2YXRlIGZpbmFsIFN0cmluZyBfVFJJTklEQURfQ09NUE9ORU5UX1RBRyA9DQotICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQud2ViYXBwLlVJWENvbXBvbmVudFRhZyI7DQotDQotICBzdGF0aWMgcHJpdmF0ZSBmaW5hbCBMb2dnZXIgX0xPRyA9IExvZ2dlci5nZXRMb2dnZXIoQ29tcG9uZW50QmVhbi5jbGFzcy5nZXROYW1lKCkpOw0KLX0NCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL3RyaW5pZGFkL3BhcnNlL0NvbnZlcnRlckJlYW4uamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvdHJpbmlkYWQvcGFyc2UvQ29udmVydGVyQmVhbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMWFiNzY4Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvdHJpbmlkYWQvcGFyc2UvQ29udmVydGVyQmVhbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcyICswLDAgQEAKLS8qDQotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKiANCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICogDQotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5idWlsZGVyLnRyaW5pZGFkLnBhcnNlOw0KLQ0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllcjsNCi1pbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOw0KLQ0KLS8qKg0KLSAqIENvbnZlcnRlckJlYW4gaXMgYSBKYXZhIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBmYWNlcy1jb25maWcgY29udmVydGVyDQotICogWE1MIGVsZW1lbnQuDQotICovDQotcHVibGljIGNsYXNzIENvbnZlcnRlckJlYW4gZXh0ZW5kcyBBYnN0cmFjdFRhZ0JlYW4gew0KLQ0KLSAgLyoqDQotICAgKiBTZXRzIHRoZSBjb252ZXJ0ZXIgaWRlbnRpZmVyIGZvciB0aGlzIGNvbXBvbmVudC4NCi0gICAqDQotICAgKiBAcGFyYW0gY29udmVydGVySWQgIGNvbnZlcnRlciBpZGVudGlmZXINCi0gICAqLw0KLSAgcHVibGljIHZvaWQgc2V0Q29udmVydGVySWQoDQotICAgIFN0cmluZyBjb252ZXJ0ZXJJZCkNCi0gIHsNCi0gICAgX2NvbnZlcnRlcklkID0gY29udmVydGVySWQ7DQotICB9DQotDQotICAvKioNCi0gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgY29udmVydGVyIGlkZW50aWZpZXIgaXMgc3BlY2lmaWVkLCBvdGhlcndpc2UgZmFsc2UuDQotICAgKg0KLSAgICogQHJldHVybiAgdHJ1ZSBpZiB0aGUgY29udmVydGVyIGlkZW50aWZpZXIgaXMgc3BlY2lmaWVkLA0KLSAgICogICAgICAgICAgb3RoZXJ3aXNlIGZhbHNlLg0KLSAgICovDQotICBwdWJsaWMgYm9vbGVhbiBoYXNDb252ZXJ0ZXJJZCgpDQotICB7DQotICAgIHJldHVybiAoX2NvbnZlcnRlcklkICE9IG51bGwpOw0KLSAgfQ0KLQ0KLSAgLyoqDQotICAgKiBSZXR1cm5zIHRoZSBjb252ZXJ0ZXIgaWRlbnRpZmllciBmb3IgdGhpcyBjb21wb25lbnQuDQotICAgKg0KLSAgICogQHJldHVybiAgdGhlIGNvbnZlcnRlciBpZGVudGlmaWVyDQotICAgKi8NCi0gIHB1YmxpYyBTdHJpbmcgZ2V0Q29udmVydGVySWQoKQ0KLSAgew0KLSAgICByZXR1cm4gX2NvbnZlcnRlcklkOw0KLSAgfQ0KLSAgDQotICAvKioNCi0gICAqIFNldHMgdGhlICJyb290IiBjb252ZXJ0ZXIgSWQgcmVwcmVzZW50aW5nIHRoZSBJRCBkZWZpbmVkIGluIGZhY2VzLWNvbmZpZw0KLSAgICogVGhlIHJvb3QgaWQgd2lsbCBiZSB1c2VkIHdoaWxlIHRoZSB0YWcgZGVmaW5pdGlvbiBpcyB3cml0dGVuIG91dCwNCi0gICAqIHdoaWxlIHRoZSByZWd1bGFyIElkIGlzIHVzZWQgZm9yIHRoZSBsb29rdXAgb2YgZXhpc3RpbmcgY29udmVydGVycy4NCi0gICAqIFRoaXMgYWxsb3dzIHVzIHRvIGRlZmluZSBuZXcgdGFncyBmb3IgdGhlIGV4aXN0aW5nIGNvbnZlcnRlciBJRHMNCi0gICAqIEBwYXJhbSBpZCByb290IGNvbnZlcnRlciBpZA0KLSAgICovDQotICBwdWJsaWMgdm9pZCBzZXRSb290Q29udmVydGVySWQoU3RyaW5nIGlkKQ0KLSAgew0KLSAgICBfcm9vdENvbnZlcnRlcklkID0gaWQ7DQotICB9DQotICANCi0gIC8qKg0KLSAgICogUmV0dXJucyB0aGUgcm9vdCBjb252ZXJ0ZXIgaWQNCi0gICAqIEByZXR1cm4gcm9vdCBjb252ZXJ0ZXIgaWQNCi0gICAqLw0KLSAgcHVibGljIFN0cmluZyBnZXRSb290Q29udmVydGVySWQoKQ0KLSAgew0KLSAgICByZXR1cm4gX3Jvb3RDb252ZXJ0ZXJJZDsNCi0gIH0NCi0NCi0gIC8qKg0KLSAgICogU2V0cyB0aGUgY29udmVydGVyIGNsYXNzIGZvciB0aGlzIGNvbXBvbmVudC4NCi0gICAqDQotICAgKiBAcGFyYW0gY29udmVydGVyQ2xhc3MgIHRoZSBjb252ZXJ0ZXIgY2xhc3MNCi0gICAqLw0KLSAgcHVibGljIHZvaWQgc2V0Q29udmVydGVyQ2xhc3MoDQotICAgIFN0cmluZyBjb252ZXJ0ZXJDbGFzcykNCi0gIHsNCi0gICAgX2NvbnZlcnRlckNsYXNzID0gY29udmVydGVyQ2xhc3M7DQotICB9DQotDQotICAvKioNCi0gICAqIFJldHVybnMgdGhlIGNvbnZlcnRlciBjbGFzcyBmb3IgdGhpcyBjb21wb25lbnQuDQotICAgKg0KLSAgICogQHJldHVybiAgdGhlIGNvbnZlcnRlciBjbGFzcw0KLSAgICovDQotICBwdWJsaWMgU3RyaW5nIGdldENvbnZlcnRlckNsYXNzKCkNCi0gIHsNCi0gICAgcmV0dXJuIF9jb252ZXJ0ZXJDbGFzczsNCi0gIH0NCi0NCi0gIC8qKg0KLSAgICogU2V0cyB0aGUgY29udmVydGVyIHN1cGVyIGNsYXNzIGZvciB0aGlzIGNvbXBvbmVudC4NCi0gICAqDQotICAgKiBAcGFyYW0gY29udmVydGVyU3VwZXJDbGFzcyAgdGhlIGNvbnZlcnRlciBzdXBlciBjbGFzcw0KLSAgICovDQotICBwdWJsaWMgdm9pZCBzZXRDb252ZXJ0ZXJTdXBlckNsYXNzKA0KLSAgICBTdHJpbmcgY29udmVydGVyU3VwZXJDbGFzcykNCi0gIHsNCi0gICAgX2NvbnZlcnRlclN1cGVyQ2xhc3MgPSBjb252ZXJ0ZXJTdXBlckNsYXNzOw0KLSAgfQ0KLQ0KLSAgLyoqDQotICAgKiBSZXR1cm5zIHRoZSBjb252ZXJ0ZXIgc3VwZXIgY2xhc3MgZm9yIHRoaXMgY29tcG9uZW50Lg0KLSAgICoNCi0gICAqIEByZXR1cm4gIHRoZSBjb252ZXJ0ZXIgc3VwZXIgY2xhc3MNCi0gICAqLw0KLSAgcHVibGljIFN0cmluZyBnZXRDb252ZXJ0ZXJTdXBlckNsYXNzKCkNCi0gIHsNCi0gICAgcmV0dXJuIF9jb252ZXJ0ZXJTdXBlckNsYXNzOw0KLSAgfQ0KLQ0KLSAgLyoqDQotICAgKiBBZGRzIGEgSmF2YSBMYW5ndWFnZSBjbGFzcyBtb2RpZmllciB0byB0aGUgY29udmVydGVyIGNsYXNzLg0KLSAgICoNCi0gICAqIEBwYXJhbSBtb2RpZmllciAgdGhlIG1vZGlmaWVyIHRvIGJlIGFkZGVkDQotICAgKi8NCi0gIHB1YmxpYyB2b2lkIGFkZENvbnZlcnRlckNsYXNzTW9kaWZpZXIoDQotICAgIGludCBtb2RpZmllcikNCi0gIHsNCi0gICAgX2NvbnZlcnRlckNsYXNzTW9kaWZpZXJzIHw9IG1vZGlmaWVyOw0KLSAgfQ0KLQ0KLSAgLyoqDQotICAgKiBSZXR1cm5zIHRoZSBKYXZhIExhbmd1YWdlIGNsYXNzIG1vZGlmaWVycyBmb3IgdGhlIGNvbnZlcnRlciBjbGFzcy4NCi0gICAqIEJ5IGRlZmF1bHQsIHRoZXNlIG1vZGlmaWVycyBpbmNsdWRlIE1vZGlmaWVyLlBVQkxJQy4NCi0gICAqDQotICAgKiBAcmV0dXJuICB0aGUgSmF2YSBMYW5ndWFnZSBjbGFzcyBtb2RpZmllcnMgZm9yIHRoZSBjb252ZXJ0ZXIgY2xhc3MNCi0gICAqLw0KLSAgcHVibGljIGludCBnZXRDb252ZXJ0ZXJDbGFzc01vZGlmaWVycygpDQotICB7DQotICAgIGludCBtb2RpZmllcnMgPSBfY29udmVydGVyQ2xhc3NNb2RpZmllcnM7DQotDQotICAgIGlmICghTW9kaWZpZXIuaXNQcml2YXRlKG1vZGlmaWVycykgJiYNCi0gICAgICAgICFNb2RpZmllci5pc1Byb3RlY3RlZChtb2RpZmllcnMpICYmDQotICAgICAgICAhTW9kaWZpZXIuaXNQdWJsaWMobW9kaWZpZXJzKSkNCi0gICAgew0KLSAgICAgIG1vZGlmaWVycyB8PSBNb2RpZmllci5QVUJMSUM7DQotICAgIH0NCi0NCi0gICAgcmV0dXJuIG1vZGlmaWVyczsNCi0gIH0NCi0NCi0gIHB1YmxpYyB2b2lkIHBhcnNlQ29udmVydGVyQ2xhc3NNb2RpZmllcigNCi0gICAgU3RyaW5nIG1vZGlmaWVyKQ0KLSAgew0KLSAgICBhZGRDb252ZXJ0ZXJDbGFzc01vZGlmaWVyKF9wYXJzZU1vZGlmaWVyKG1vZGlmaWVyKSk7DQotICB9DQotDQotDQotDQotICBwcml2YXRlIFN0cmluZyAgX2NvbnZlcnRlcklkOw0KLSAgcHJpdmF0ZSBTdHJpbmcgIF9yb290Q29udmVydGVySWQ7DQotICBwcml2YXRlIFN0cmluZyAgX2NvbnZlcnRlckNsYXNzOw0KLSAgcHJpdmF0ZSBTdHJpbmcgIF9jb252ZXJ0ZXJTdXBlckNsYXNzOw0KLSAgcHJpdmF0ZSBpbnQgICAgIF9jb252ZXJ0ZXJDbGFzc01vZGlmaWVyczsNCi0NCi0NCi0gIHN0YXRpYyBwcml2YXRlIGZpbmFsIExvZ2dlciBfTE9HID0gTG9nZ2VyLmdldExvZ2dlcihDb252ZXJ0ZXJCZWFuLmNsYXNzLmdldE5hbWUoKSk7DQotfQ0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvdHJpbmlkYWQvcGFyc2UvRXZlbnRCZWFuLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL3RyaW5pZGFkL3BhcnNlL0V2ZW50QmVhbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNGIwM2Y1Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvdHJpbmlkYWQvcGFyc2UvRXZlbnRCZWFuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDMgKzAsMCBAQAotLyoNCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqIA0KLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKiANCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmJ1aWxkZXIudHJpbmlkYWQucGFyc2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uYnVpbGRlci50cmluaWRhZC51dGlsLlV0aWw7DQotDQotLyoqDQotICogRXZlbnRCZWFuIGlzIGEgSmF2YSByZXByZXNlbnRhdGlvbiBvZiB0aGUgZmFjZXMtY29uZmlnLWV4dGVuc2lvbg0KLSAqIGV2ZW50IFhNTCBlbGVtZW50Lg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBFdmVudEJlYW4gZXh0ZW5kcyBPYmplY3RCZWFuDQotew0KLSAgcHVibGljIFN0cmluZyBnZXRFdmVudE5hbWUoKQ0KLSAgew0KLSAgICByZXR1cm4gVXRpbC5nZXRFdmVudE5hbWVGcm9tRXZlbnRUeXBlKF9ldmVudFR5cGUpOw0KLSAgfQ0KLQ0KLSAgLyoqDQotICAgKiBTZXRzIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGlzIHByb3BlcnR5Lg0KLSAgICoNCi0gICAqIEBwYXJhbSBkZXNjcmlwdGlvbiAgdGhlIHByb3BlcnR5IGRlc2NyaXB0aW9uDQotICAgKi8NCi0gIHB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKA0KLSAgICBTdHJpbmcgZGVzY3JpcHRpb24pDQotICB7DQotICAgIF9kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOw0KLSAgfQ0KLQ0KLSAgLyoqDQotICAgKiBSZXR1cm5zIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGlzIHByb3BlcnR5Lg0KLSAgICoNCi0gICAqIEByZXR1cm4gIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdGlvbg0KLSAgICovDQotICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkNCi0gIHsNCi0gICAgcmV0dXJuIF9kZXNjcmlwdGlvbjsNCi0gIH0NCi0NCi0gIC8qKg0KLSAgICogU2V0cyB0aGUgZXZlbnQgdHlwZSBmb3IgdGhpcyBldmVudC4NCi0gICAqDQotICAgKiBAcGFyYW0gZXZlbnRUeXBlICB0aGUgZXZlbnQgdHlwZQ0KLSAgICovDQotICBwdWJsaWMgdm9pZCBzZXRFdmVudFR5cGUoDQotICAgIFN0cmluZyBldmVudFR5cGUpDQotICB7DQotICAgIF9ldmVudFR5cGUgPSBldmVudFR5cGU7DQotICB9DQotDQotICAvKioNCi0gICAqIFJldHVybnMgdGhlIGV2ZW50IHR5cGUgZm9yIHRoaXMgZXZlbnQuDQotICAgKg0KLSAgICogQHJldHVybiAgdGhlIGV2ZW50IHR5cGUNCi0gICAqLw0KLSAgcHVibGljIFN0cmluZyBnZXRFdmVudFR5cGUoKQ0KLSAgew0KLSAgICByZXR1cm4gX2V2ZW50VHlwZTsNCi0gIH0NCi0NCi0gIC8qKg0KLSAgICogU2V0cyB0aGUgZXZlbnQgY2xhc3MgZm9yIHRoaXMgZXZlbnQuDQotICAgKg0KLSAgICogQHBhcmFtIGV2ZW50TmFtZSAgdGhlIGV2ZW50IGNsYXNzDQotICAgKi8NCi0gIHB1YmxpYyB2b2lkIHNldEV2ZW50Q2xhc3MoDQotICAgIFN0cmluZyBldmVudENsYXNzKQ0KLSAgew0KLSAgICBfZXZlbnRDbGFzcyA9IGV2ZW50Q2xhc3M7DQotICB9DQotDQotICAvKioNCi0gICAqIFJldHVybnMgdGhlIGV2ZW50IGNsYXNzIGZvciB0aGlzIGV2ZW50Lg0KLSAgICoNCi0gICAqIEByZXR1cm4gIHRoZSBldmVudCBjbGFzcw0KLSAgICovDQotICBwdWJsaWMgU3RyaW5nIGdldEV2ZW50Q2xhc3MoKQ0KLSAgew0KLSAgICByZXR1cm4gX2V2ZW50Q2xhc3M7DQotICB9DQotDQotICAvKioNCi0gICAqIFNldHMgdGhlIGV2ZW50IGxpc3RlbmVyIGNsYXNzIGZvciB0aGlzIGV2ZW50Lg0KLSAgICoNCi0gICAqIEBwYXJhbSBldmVudExpc3RlbmVyQ2xhc3MgIHRoZSBldmVudCBsaXN0ZW5lciBjbGFzcw0KLSAgICovDQotICBwdWJsaWMgdm9pZCBzZXRFdmVudExpc3RlbmVyQ2xhc3MoDQotICAgIFN0cmluZyBldmVudExpc3RlbmVyQ2xhc3MpDQotICB7DQotICAgIF9ldmVudExpc3RlbmVyQ2xhc3MgPSBldmVudExpc3RlbmVyQ2xhc3M7DQotICB9DQotDQotICAvKioNCi0gICAqIFJldHVybnMgdGhlIGV2ZW50IGxpc3RlbmVyIGNsYXNzIGZvciB0aGlzIGV2ZW50Lg0KLSAgICoNCi0gICAqIEByZXR1cm4gIHRoZSBldmVudCBsaXN0ZW5lciBjbGFzcw0KLSAgICovDQotICBwdWJsaWMgU3RyaW5nIGdldEV2ZW50TGlzdGVuZXJDbGFzcygpDQotICB7DQotICAgIHJldHVybiBfZXZlbnRMaXN0ZW5lckNsYXNzOw0KLSAgfQ0KLQ0KLSAgLyoqDQotICAgKiBTZXRzIHRoZSBldmVudCBzb3VyY2UgaW50ZXJmYWNlIGZvciB0aGlzIGV2ZW50Lg0KLSAgICoNCi0gICAqIEBwYXJhbSBldmVudFNvdXJjZUludGVyZmFjZSAgdGhlIGV2ZW50IHNvdXJjZSBpbnRlcmZhY2UNCi0gICAqLw0KLSAgcHVibGljIHZvaWQgc2V0RXZlbnRTb3VyY2VJbnRlcmZhY2UoDQotICAgIFN0cmluZyBldmVudFNvdXJjZUludGVyZmFjZSkNCi0gIHsNCi0gICAgX2V2ZW50U291cmNlSW50ZXJmYWNlID0gZXZlbnRTb3VyY2VJbnRlcmZhY2U7DQotICB9DQotDQotICAvKioNCi0gICAqIFJldHVybnMgdGhlIGV2ZW50IHNvdXJjZSBpbnRlcmZhY2UgZm9yIHRoaXMgZXZlbnQuDQotICAgKg0KLSAgICogQHJldHVybiAgdGhlIGV2ZW50IHNvdXJjZSBpbnRlcmZhY2UNCi0gICAqLw0KLSAgcHVibGljIFN0cmluZyBnZXRFdmVudFNvdXJjZUludGVyZmFjZSgpDQotICB7DQotICAgIHJldHVybiBfZXZlbnRTb3VyY2VJbnRlcmZhY2U7DQotICB9DQotDQotICBwcml2YXRlIFN0cmluZyBfZGVzY3JpcHRpb247DQotICBwcml2YXRlIFN0cmluZyBfZXZlbnRUeXBlOw0KLSAgcHJpdmF0ZSBTdHJpbmcgX2V2ZW50Q2xhc3M7DQotICBwcml2YXRlIFN0cmluZyBfZXZlbnRMaXN0ZW5lckNsYXNzOw0KLSAgcHJpdmF0ZSBTdHJpbmcgX2V2ZW50U291cmNlSW50ZXJmYWNlOw0KLX0NCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL3RyaW5pZGFkL3BhcnNlL0V2ZW50UmVmQmVhbi5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci90cmluaWRhZC9wYXJzZS9FdmVudFJlZkJlYW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjQ4YjlmMi4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL3RyaW5pZGFkL3BhcnNlL0V2ZW50UmVmQmVhbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI3ICswLDAgQEAKLS8qDQotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKiANCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICogDQotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5idWlsZGVyLnRyaW5pZGFkLnBhcnNlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmJ1aWxkZXIudHJpbmlkYWQudXRpbC5VdGlsOw0KLQ0KLS8qKg0KLSAqIEV2ZW50QmVhbiBpcyBhIEphdmEgcmVwcmVzZW50YXRpb24gb2YgdGhlIGZhY2VzLWNvbmZpZyBjb21wb25lbnQtZXh0ZW5zaW9uDQotICogZXZlbnQgWE1MIGVsZW1lbnQuDQotICovDQotcHVibGljIGNsYXNzIEV2ZW50UmVmQmVhbiBleHRlbmRzIE9iamVjdEJlYW4NCi17DQotICBwdWJsaWMgU3RyaW5nIGdldEV2ZW50TmFtZSgpDQotICB7DQotICAgIHJldHVybiBVdGlsLmdldEV2ZW50TmFtZUZyb21FdmVudFR5cGUoX2V2ZW50VHlwZSk7DQotICB9DQotDQotICAvKioNCi0gICAqIFNldHMgdGhlIGV2ZW50IHR5cGUgZm9yIHRoaXMgZXZlbnQgcmVmZXJlbmNlLg0KLSAgICoNCi0gICAqIEBwYXJhbSBldmVudFR5cGUgIHRoZSBldmVudCB0eXBlDQotICAgKi8NCi0gIHB1YmxpYyB2b2lkIHNldEV2ZW50VHlwZSgNCi0gICAgU3RyaW5nIGV2ZW50VHlwZSkNCi0gIHsNCi0gICAgX2V2ZW50VHlwZSA9IGV2ZW50VHlwZTsNCi0gIH0NCi0NCi0gIC8qKg0KLSAgICogUmV0dXJucyB0aGUgZXZlbnQgdHlwZSBmb3IgdGhpcyBldmVudC4NCi0gICAqDQotICAgKiBAcmV0dXJuICB0aGUgZXZlbnQgdHlwZQ0KLSAgICovDQotICBwdWJsaWMgU3RyaW5nIGdldEV2ZW50VHlwZSgpDQotICB7DQotICAgIHJldHVybiBfZXZlbnRUeXBlOw0KLSAgfQ0KLQ0KLSAgLyoqDQotICAgKiBTZXRzIHRoZSBkZWxpdmVyeSBwaGFzZXMgZm9yIHRoaXMgZXZlbnQuDQotICAgKg0KLSAgICogQHBhcmFtIGRlbGl2ZXJ5UGhhc2VzICB0aGUgZXZlbnQgZGVsaXZlcnkgcGhhc2VzDQotICAgKi8NCi0gIHB1YmxpYyB2b2lkIHNldEV2ZW50RGVsaXZlcnlQaGFzZXMoDQotICAgIFN0cmluZ1tdIGRlbGl2ZXJ5UGhhc2VzKQ0KLSAgew0KLSAgICBpZiAoKF9kZWxpdmVyeVBoYXNlcyAhPSBudWxsKSAmJiAoX2RlbGl2ZXJ5UGhhc2VzLmxlbmd0aCA+IDApKQ0KLSAgICB7DQotICAgICAgaW50IG9sZExlbiA9IF9kZWxpdmVyeVBoYXNlcy5sZW5ndGg7DQotICAgICAgaW50IG5ld0xlbiA9IGRlbGl2ZXJ5UGhhc2VzLmxlbmd0aDsNCi0gICAgICBTdHJpbmdbXSBuZXdEZWxpdmVyeVBoYXNlcyA9IG5ldyBTdHJpbmdbb2xkTGVuICsgbmV3TGVuXTsNCi0gICAgICBTeXN0ZW0uYXJyYXljb3B5KF9kZWxpdmVyeVBoYXNlcywgMCwgbmV3RGVsaXZlcnlQaGFzZXMsIDAsIG9sZExlbik7DQotICAgICAgU3lzdGVtLmFycmF5Y29weShkZWxpdmVyeVBoYXNlcywgMCwgbmV3RGVsaXZlcnlQaGFzZXMsIG9sZExlbiwgbmV3TGVuKTsNCi0gICAgICBfZGVsaXZlcnlQaGFzZXMgPSBuZXdEZWxpdmVyeVBoYXNlczsNCi0gICAgfQ0KLSAgICBlbHNlDQotICAgIHsNCi0gICAgICBfZGVsaXZlcnlQaGFzZXMgPSBkZWxpdmVyeVBoYXNlczsNCi0gICAgfQ0KLSAgICANCi0gIH0NCi0NCi0gIC8qKg0KLSAgICogUmV0dXJucyB0aGUgZGVsaXZlcnkgcGhhc2VzIGZvciB0aGlzIGV2ZW50Lg0KLSAgICoNCi0gICAqIEByZXR1cm4gIHRoZSBldmVudCBkZWxpdmVyeSBwaGFzZXMNCi0gICAqLw0KLSAgcHVibGljIFN0cmluZ1tdIGdldEV2ZW50RGVsaXZlcnlQaGFzZXMoKQ0KLSAgew0KLSAgICByZXR1cm4gX2RlbGl2ZXJ5UGhhc2VzOw0KLSAgfQ0KLQ0KLSAgLyoqDQotICAgKiBTZXRzIGEgZmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgb3Igbm90IHRvIGF1dG9tYXRpY2FsbHkgaW1wbGVtZW50DQotICAgKiB0aGUgZXZlbnQgc291cmNlIGludGVyZmFjZSBvbiB0aGUgZ2VuZXJhdGVkIGNvbXBvbmVudCBzb3VyY2UuDQotICAgKg0KLSAgICogQHBhcmFtIGlnbm9yZVNvdXJjZUludGVyZmFjZSAgdHJ1ZSwgIHRvIGlnbm9yZSB0aGUgZXZlbnQgc291cmNlIGludGVyZmFjZTsNCi0gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCBvdGhlcndpc2UNCi0gICAqLw0KLSAgcHVibGljIHZvaWQgc2V0SWdub3JlU291cmNlSW50ZXJmYWNlKA0KLSAgICBib29sZWFuIGlnbm9yZVNvdXJjZUludGVyZmFjZSkNCi0gIHsNCi0gICAgX2lnbm9yZVNvdXJjZUludGVyZmFjZSA9IGlnbm9yZVNvdXJjZUludGVyZmFjZTsNCi0gIH0NCi0NCi0gIC8qKg0KLSAgICogUmV0dXJucyBhIGZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIG9yIG5vdCB0byBhdXRvbWF0aWNhbGx5IGltcGxlbWVudA0KLSAgICogdGhlIGV2ZW50IHNvdXJjZSBpbnRlcmZhY2Ugb24gdGhlIGdlbmVyYXRlZCBjb21wb25lbnQgc291cmNlLg0KLSAgICoNCi0gICAqIEByZXR1cm4gIHRydWUsICB0byBpZ25vcmUgdGhlIGV2ZW50IHNvdXJjZSBpbnRlcmZhY2U7DQotICAgKiAgICAgICAgICBmYWxzZSwgb3RoZXJ3aXNlDQotICAgKi8NCi0gIHB1YmxpYyBib29sZWFuIGlzSWdub3JlU291cmNlSW50ZXJmYWNlKCkNCi0gIHsNCi0gICAgcmV0dXJuIF9pZ25vcmVTb3VyY2VJbnRlcmZhY2U7DQotICB9DQotDQotICAvKioNCi0gICAqIFJlc29sdmVzIHRoZSBldmVudCB0eXBlLg0KLSAgICoNCi0gICAqIEByZXR1cm4gIHRoZSBldmVudCB3aXRoIHRoZSByZWZlcmVuY2luZyBldmVudCB0eXBlLA0KLSAgICogICAgICAgICAgb3IgbnVsbCBpZiBub3QgZm91bmQNCi0gICAqLw0KLSAgcHVibGljIEV2ZW50QmVhbiByZXNvbHZlRXZlbnRUeXBlKCkNCi0gIHsNCi0gICAgcmV0dXJuIGdldE93bmVyKCkuZmluZEV2ZW50KF9ldmVudFR5cGUpOw0KLSAgfQ0KLQ0KLSAgcHJpdmF0ZSBTdHJpbmcgICBfZXZlbnRUeXBlOw0KLSAgcHJpdmF0ZSBTdHJpbmdbXSBfZGVsaXZlcnlQaGFzZXM7DQotICBwcml2YXRlIGJvb2xlYW4gIF9pZ25vcmVTb3VyY2VJbnRlcmZhY2U7DQotfQ0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvdHJpbmlkYWQvcGFyc2UvRXhhbXBsZUJlYW4uamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvdHJpbmlkYWQvcGFyc2UvRXhhbXBsZUJlYW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzkxODNkMC4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL3RyaW5pZGFkL3BhcnNlL0V4YW1wbGVCZWFuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vKg0KLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICogDQotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqIA0KLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqICB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uYnVpbGRlci50cmluaWRhZC5wYXJzZTsNCi0NCi0vKioNCi0gKiBFeGFtcGxlQmVhbiBpcyBhIEphdmEgcmVwcmVzZW50YXRpb24gb2YgdGhlIGZhY2VzLWNvbmZpZyBjb21wb25lbnQgb3INCi0gKiByZW5kZXJlciBFeGFtcGxlIFhNTCBlbGVtZW50Lg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBFeGFtcGxlQmVhbiBleHRlbmRzIE9iamVjdEJlYW4NCi17DQotICAvKioNCi0gICAqIEdldCBzb3VyY2UgRXhhbXBsZSBEZXNjcmlwdGlvbiBUZXh0DQotICAgKiANCi0gICAqIEByZXR1cm4gc291cmNlIEV4YW1wbGUgRGVzY3JpcHRpb24gVGV4dA0KLSAgICovDQotICBwdWJsaWMgU3RyaW5nIGdldFNvdXJjZURlc2NyaXB0aW9uKCkNCi0gIHsNCi0gICAgcmV0dXJuIF9zb3VyY2VEZXNjcmlwdGlvbjsNCi0gIH0NCi0NCi0gIC8qKg0KLSAgICogU2V0IHNvdXJjZSBleGFtcGxlIERlc2NyaXB0aW9uIFRleHQuDQotICAgKg0KLSAgICogQHBhcmFtIHNvdXJjZURlc2NyaXB0aW9uICBzb3VyY2UgZXhhbXBsZSBEZXNjcmlwdGlvbiBUZXh0Lg0KLSAgICovDQotICBwdWJsaWMgdm9pZCBzZXRTb3VyY2VEZXNjcmlwdGlvbiggU3RyaW5nIHNvdXJjZURlc2NyaXB0aW9uICkNCi0gIHsNCi0gICAgX3NvdXJjZURlc2NyaXB0aW9uID0gc291cmNlRGVzY3JpcHRpb247DQotICB9DQotDQotICAvKioNCi0gICAqIFJldHVybnMgc291cmNlIEV4YW1wbGUuDQotICAgKg0KLSAgICogQHJldHVybiBzb3VyY2UgRXhhbXBsZQ0KLSAgICovDQotICBwdWJsaWMgU3RyaW5nIGdldFNvdXJjZUNvZGUoKQ0KLSAgew0KLSAgICByZXR1cm4gX3NvdXJjZTsNCi0gIH0NCi0NCi0gIC8qKg0KLSAgICogU2V0IHNvdXJjZSBleGFtcGxlLg0KLSAgICoNCi0gICAqIEBwYXJhbSBzb3VyY2UgIHNvdXJjZSBleGFtcGxlIHRvIGJlIGFkZGVkIHRvIHRoZSBsaXN0Lg0KLSAgICovDQotICBwdWJsaWMgdm9pZCBzZXRTb3VyY2VDb2RlKCBTdHJpbmcgc291cmNlICkNCi0gIHsNCi0gICAgX3NvdXJjZSA9IHNvdXJjZTsNCi0gIH0NCi0NCi0gIC8qKg0KLSAgICogUmV0dXJucyBFeGFtcGxlIGhhc2htYXAga2V5Lg0KLSAgICoNCi0gICAqIEByZXR1cm4gRXhhbXBsZSBoYXNobWFwIGtleQ0KLSAgICovDQotICBwdWJsaWMgU3RyaW5nIGdldEtleSgpDQotICB7DQotICAgIHJldHVybiBfa2V5Ow0KLSAgfQ0KLQ0KLSAgLyoqDQotICAgKiBTZXQgc291cmNlIGV4YW1wbGUuDQotICAgKg0KLSAgICogQHBhcmFtIGtleSBTZXQga2V5IGZvciB0aGlzIGV4YW1wbGUgcHV0IGluIA0KLSAgICogICAgICAgIENvbXBvbmVudEJlYW4gX2V4YW1wbGVzIGhhc2htYXAuDQotICAgKi8NCi0gIHByb3RlY3RlZCB2b2lkIHNldEtleSggU3RyaW5nIGtleSApDQotICB7DQotICAgIF9rZXkgPSBrZXk7DQotICB9DQotDQotICBwcml2YXRlIFN0cmluZyBfc291cmNlRGVzY3JpcHRpb24gPSBudWxsOw0KLSAgcHJpdmF0ZSBTdHJpbmcgX3NvdXJjZSAgICAgICAgICAgID0gbnVsbDsNCi0gIHByaXZhdGUgU3RyaW5nIF9rZXkgICAgICAgICAgICAgICA9IG51bGw7DQotfQ0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvdHJpbmlkYWQvcGFyc2UvRmFjZXNDb25maWdCZWFuLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL3RyaW5pZGFkL3BhcnNlL0ZhY2VzQ29uZmlnQmVhbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDBlMzMxLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvdHJpbmlkYWQvcGFyc2UvRmFjZXNDb25maWdCZWFuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNTAgKzAsMCBAQAotLyoNCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqIA0KLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKiANCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmJ1aWxkZXIudHJpbmlkYWQucGFyc2U7DQotDQotaW1wb3J0IGphdmEubmV0LlVSTDsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOw0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuVHJlZU1hcDsNCi1pbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOw0KLQ0KLQ0KLS8qKg0KLSAqIEZhY2VzQ29uZmlnQmVhbiBpcyBhIEphdmEgcmVwcmVzZW50YXRpb24gb2YgdGhlIGZhY2VzLWNvbmZpZyBYTUwgZWxlbWVudC4NCi0gKi8NCi1wdWJsaWMgY2xhc3MgRmFjZXNDb25maWdCZWFuIGV4dGVuZHMgT2JqZWN0QmVhbg0KLXsNCi0gIC8qKg0KLSAgICogQWRkcyBhIGNvbnZlcnRlciB0byB0aGlzIGZhY2VzIGNvbmZpZyBkb2N1bWVudC4NCi0gICAqDQotICAgKiBAcGFyYW0gY29udmVydGVyICB0aGUgY29udmVydGVyIHRvIGFkZA0KLSAgICovDQotICBwdWJsaWMgdm9pZCBhZGRDb252ZXJ0ZXIoDQotICAgIENvbnZlcnRlckJlYW4gY29udmVydGVyKQ0KLSAgew0KLSAgICBjb252ZXJ0ZXIuYXR0YWNoKHRoaXMpOw0KLSAgICBpZiAoY29udmVydGVyLmhhc0NvbnZlcnRlcklkKCkpDQotICAgICAgX2NvbnZlcnRlcnMucHV0KGNvbnZlcnRlci5nZXRDb252ZXJ0ZXJJZCgpLCBjb252ZXJ0ZXIpOw0KLSAgfQ0KLQ0KLSAgLyoqDQotICAgKiBSZXR1cm5zIHRoZSBjb252ZXJ0ZXIgZm9yIHRoaXMgY29udmVydGVyIHR5cGUuDQotICAgKg0KLSAgICogQHBhcmFtIGNvbnZlcnRlcklkICB0aGUgY29udmVydGVyIHR5cGUgdG8gZmluZA0KLSAgICovDQotICBwdWJsaWMgQ29udmVydGVyQmVhbiBmaW5kQ29udmVydGVyKA0KLSAgICBTdHJpbmcgY29udmVydGVySWQpDQotICB7DQotICAgIHJldHVybiBfY29udmVydGVycy5nZXQoY29udmVydGVySWQpOw0KLSAgfQ0KLQ0KLSAgLyoqDQotICAgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBmYWNlcyBjb25maWcgaGFzIGFueSBjb252ZXJ0ZXJzLg0KLSAgICoNCi0gICAqIEByZXR1cm4gdHJ1ZSAgaWYgdGhpcyBmYWNlcyBjb25maWcgaGFzIGFueSBjb252ZXJ0ZXJzLA0KLSAgICogICAgICAgICBvdGhlcndpc2UgZmFsc2UNCi0gICAqLw0KLSAgcHVibGljIGJvb2xlYW4gaGFzQ29udmVydGVycygpDQotICB7DQotICAgIHJldHVybiAhX2NvbnZlcnRlcnMuaXNFbXB0eSgpOw0KLSAgfQ0KLQ0KLSAgLyoqDQotICAgKiBSZXR1cm5zIGFuIGl0ZXJhdG9yIGZvciBhbGwgY29udmVydGVycyBpbiB0aGlzIGZhY2VzDQotICAgKiBjb25maWcuDQotICAgKg0KLSAgICogQHJldHVybiAgdGhlIGNvbnZlcnRlciBpdGVyYXRvcg0KLSAgICovDQotICBwdWJsaWMgSXRlcmF0b3I8Q29udmVydGVyQmVhbj4gY29udmVydGVycygpDQotICB7DQotICAgIHJldHVybiBfY29udmVydGVycy52YWx1ZXMoKS5pdGVyYXRvcigpOw0KLSAgfQ0KLQ0KLSAgLyoqDQotICAgKiBBZGRzIGEgdmFsaWRhdG9yIHRvIHRoaXMgZmFjZXMgY29uZmlnIGRvY3VtZW50Lg0KLSAgICoNCi0gICAqIEBwYXJhbSB2YWxpZGF0b3IgIHRoZSB2YWxpZGF0b3IgdG8gYWRkDQotICAgKi8NCi0gIHB1YmxpYyB2b2lkIGFkZFZhbGlkYXRvcigNCi0gICAgVmFsaWRhdG9yQmVhbiB2YWxpZGF0b3IpDQotICB7DQotICAgIHZhbGlkYXRvci5hdHRhY2godGhpcyk7DQotICAgIGlmICh2YWxpZGF0b3IuaGFzVmFsaWRhdG9ySWQoKSkNCi0gICAgICBfdmFsaWRhdG9ycy5wdXQodmFsaWRhdG9yLmdldFZhbGlkYXRvcklkKCksIHZhbGlkYXRvcik7DQotICB9DQotDQotICAvKioNCi0gICAqIFJldHVybnMgdGhlIHZhbGlkYXRvciBmb3IgdGhpcyB2YWxpZGF0b3IgdHlwZS4NCi0gICAqDQotICAgKiBAcGFyYW0gdmFsaWRhdG9ySWQgIHRoZSB2YWxpZGF0b3IgdHlwZSB0byBmaW5kDQotICAgKi8NCi0gIHB1YmxpYyBWYWxpZGF0b3JCZWFuIGZpbmRWYWxpZGF0b3IoDQotICAgIFN0cmluZyB2YWxpZGF0b3JJZCkNCi0gIHsNCi0gICAgcmV0dXJuIF92YWxpZGF0b3JzLmdldCh2YWxpZGF0b3JJZCk7DQotICB9DQotDQotICAvKioNCi0gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGZhY2VzIGNvbmZpZyBoYXMgYW55IHZhbGlkYXRvcnMuDQotICAgKg0KLSAgICogQHJldHVybiB0cnVlICBpZiB0aGlzIGZhY2VzIGNvbmZpZyBoYXMgYW55IHZhbGlkYXRvcnMsDQotICAgKiAgICAgICAgIG90aGVyd2lzZSBmYWxzZQ0KLSAgICovDQotICBwdWJsaWMgYm9vbGVhbiBoYXNWYWxpZGF0b3JzKCkNCi0gIHsNCi0gICAgcmV0dXJuICFfdmFsaWRhdG9ycy5pc0VtcHR5KCk7DQotICB9DQotDQotICAvKioNCi0gICAqIFJldHVybnMgYW4gaXRlcmF0b3IgZm9yIGFsbCB2YWxpZGF0b3JzIGluIHRoaXMgZmFjZXMNCi0gICAqIGNvbmZpZy4NCi0gICAqDQotICAgKiBAcmV0dXJuICB0aGUgdmFsaWRhdG9yIGl0ZXJhdG9yDQotICAgKi8NCi0gIHB1YmxpYyBJdGVyYXRvcjxWYWxpZGF0b3JCZWFuPiB2YWxpZGF0b3JzKCkNCi0gIHsNCi0gICAgcmV0dXJuIF92YWxpZGF0b3JzLnZhbHVlcygpLml0ZXJhdG9yKCk7DQotICB9DQotDQotICAvKioNCi0gICAqIEFkZHMgYSBjb21wb25lbnQgdG8gdGhpcyBmYWNlcyBjb25maWcgZG9jdW1lbnQuDQotICAgKg0KLSAgICogQHBhcmFtIGNvbXBvbmVudCAgdGhlIGNvbXBvbmVudCB0byBhZGQNCi0gICAqLw0KLSAgcHVibGljIHZvaWQgYWRkQ29tcG9uZW50KA0KLSAgICBDb21wb25lbnRCZWFuIGNvbXBvbmVudCkNCi0gIHsNCi0gICAgLy8gR2VuZXJpYyAiaW5jbHVkZXMiIHdpbGwgbm90IGhhdmUgYSBjb21wb25lbnQgdHlwZQ0KLSAgICBpZiAoY29tcG9uZW50LmdldENvbXBvbmVudFR5cGUoKSAhPSBudWxsKQ0KLSAgICB7DQotICAgICAgY29tcG9uZW50LmF0dGFjaCh0aGlzKTsNCi0gICAgICBfY29tcG9uZW50cy5wdXQoY29tcG9uZW50LmdldENvbXBvbmVudFR5cGUoKSwgY29tcG9uZW50KTsNCi0gICAgfQ0KLSAgfQ0KLQ0KLSAgLyoqDQotICAgKiBSZXR1cm5zIHRoZSBjb21wb25lbnQgZm9yIHRoaXMgY29tcG9uZW50IHR5cGUuDQotICAgKg0KLSAgICogQHBhcmFtIGNvbXBvbmVudFR5cGUgIHRoZSBjb21wb25lbnQgdHlwZSB0byBmaW5kDQotICAgKi8NCi0gIHB1YmxpYyBDb21wb25lbnRCZWFuIGZpbmRDb21wb25lbnQoDQotICAgIFN0cmluZyBjb21wb25lbnRUeXBlKQ0KLSAgew0KLSAgICByZXR1cm4gX2NvbXBvbmVudHMuZ2V0KGNvbXBvbmVudFR5cGUpOw0KLSAgfQ0KLQ0KLSAgLyoqDQotICAgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBmYWNlcyBjb25maWcgaGFzIGFueSBjb21wb25lbnRzLg0KLSAgICoNCi0gICAqIEByZXR1cm4gdHJ1ZSAgaWYgdGhpcyBmYWNlcyBjb25maWcgaGFzIGFueSBjb21wb25lbnRzLA0KLSAgICogICAgICAgICBvdGhlcndpc2UgZmFsc2UNCi0gICAqLw0KLSAgcHVibGljIGJvb2xlYW4gaGFzQ29tcG9uZW50cygpDQotICB7DQotICAgIHJldHVybiAhX2NvbXBvbmVudHMuaXNFbXB0eSgpOw0KLSAgfQ0KLQ0KLSAgLyoqDQotICAgKiBSZXR1cm5zIGFuIGl0ZXJhdG9yIGZvciBhbGwgY29tcG9uZW50cyBpbiB0aGlzIGZhY2VzDQotICAgKiBjb25maWcuDQotICAgKg0KLSAgICogQHJldHVybiAgdGhlIGNvbXBvbmVudCBpdGVyYXRvcg0KLSAgICovDQotICBwdWJsaWMgSXRlcmF0b3I8Q29tcG9uZW50QmVhbj4gY29tcG9uZW50cygpDQotICB7DQotICAgIHJldHVybiBfY29tcG9uZW50cy52YWx1ZXMoKS5pdGVyYXRvcigpOw0KLSAgfQ0KLQ0KLSAgLyoqDQotICAgKiBBZGRzIGFuIGV2ZW50IHRvIHRoaXMgZmFjZXMgY29uZmlnIGRvY3VtZW50Lg0KLSAgICoNCi0gICAqIEBwYXJhbSBldmVudCAgdGhlIGV2ZW50IHRvIGFkZA0KLSAgICovDQotICBwdWJsaWMgdm9pZCBhZGRFdmVudCgNCi0gICAgRXZlbnRCZWFuIGV2ZW50KQ0KLSAgew0KLSAgICBpZiAoZXZlbnQuZ2V0RXZlbnRUeXBlKCkgPT0gbnVsbCkNCi0gICAgew0KLSAgICAgIF93YXJuaW5nKCJNaXNzaW5nIGV2ZW50IHR5cGUiKTsNCi0gICAgfQ0KLSAgICBlbHNlIGlmIChldmVudC5nZXRFdmVudExpc3RlbmVyQ2xhc3MoKSA9PSBudWxsKQ0KLSAgICB7DQotICAgICAgX3dhcm5pbmcoIkV2ZW50IFwiIiArIGV2ZW50LmdldEV2ZW50VHlwZSgpICsgIlwiICIgKw0KLSAgICAgICAgICAgICAgICAgICAiaGFzIG5vIGxpc3RlbmVyIGNsYXNzIik7DQotICAgIH0NCi0gICAgZWxzZSBpZiAoZXZlbnQuZ2V0RXZlbnRDbGFzcygpID09IG51bGwpDQotICAgIHsNCi0gICAgICBfd2FybmluZygiRXZlbnQgXCIiICsgZXZlbnQuZ2V0RXZlbnRUeXBlKCkgKyAiXCIgIiArDQotICAgICAgICAgICAgICAgICAgICJoYXMgbm8gZXZlbnQgY2xhc3MiKTsNCi0gICAgfQ0KLSAgICBlbHNlDQotICAgIHsNCi0gICAgICBldmVudC5hdHRhY2godGhpcyk7DQotICAgICAgX2V2ZW50cy5wdXQoZXZlbnQuZ2V0RXZlbnRUeXBlKCksIGV2ZW50KTsNCi0gICAgfQ0KLSAgfQ0KLQ0KLSAgcHJpdmF0ZSB2b2lkIF93YXJuaW5nKFN0cmluZyBzKQ0KLSAgew0KLSAgICBfTE9HLndhcm5pbmcocysiXG4gIHBhcnNpbmcgcmVzb3VyY2U6IitnZXRDdXJyZW50UmVzb3VyY2UoKSk7DQotICB9DQotDQotICAvKioNCi0gICAqIFJldHVybnMgdGhlIGV2ZW50IGZvciB0aGlzIGV2ZW50IHR5cGUuDQotICAgKg0KLSAgICogQHBhcmFtIGV2ZW50VHlwZSAgdGhlIGV2ZW50IHR5cGUgdG8gZmluZA0KLSAgICovDQotICBwdWJsaWMgRXZlbnRCZWFuIGZpbmRFdmVudCgNCi0gICAgU3RyaW5nIGV2ZW50VHlwZSkNCi0gIHsNCi0gICAgcmV0dXJuIChFdmVudEJlYW4pX2V2ZW50cy5nZXQoZXZlbnRUeXBlKTsNCi0gIH0NCi0NCi0gIC8qKg0KLSAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgZmFjZXMgY29uZmlnIGhhcyBhbnkgZXZlbnRzLg0KLSAgICoNCi0gICAqIEByZXR1cm4gdHJ1ZSAgaWYgdGhpcyBmYWNlcyBjb25maWcgaGFzIGFueSBldmVudHMsDQotICAgKiAgICAgICAgIG90aGVyd2lzZSBmYWxzZQ0KLSAgICovDQotICBwdWJsaWMgYm9vbGVhbiBoYXNFdmVudHMoKQ0KLSAgew0KLSAgICByZXR1cm4gIV9ldmVudHMuaXNFbXB0eSgpOw0KLSAgfQ0KLQ0KLSAgLyoqDQotICAgKiBSZXR1cm5zIGFuIGl0ZXJhdG9yIGZvciBhbGwgZXZlbnRzIGluIHRoaXMgZmFjZXMNCi0gICAqIGNvbmZpZy4NCi0gICAqDQotICAgKiBAcmV0dXJuICB0aGUgZXZlbnQgaXRlcmF0b3INCi0gICAqLw0KLSAgcHVibGljIEl0ZXJhdG9yPEV2ZW50QmVhbj4gZXZlbnRzKCkNCi0gIHsNCi0gICAgcmV0dXJuIF9ldmVudHMudmFsdWVzKCkuaXRlcmF0b3IoKTsNCi0gIH0NCi0NCi0gIC8qKg0KLSAgICogQWRkcyBhIHJlbmRlciBraXQgdG8gdGhpcyBmYWNlcyBjb25maWcgZG9jdW1lbnQuDQotICAgKg0KLSAgICogQHBhcmFtIHJlbmRlcktpdCAgdGhlIHJlbmRlciBraXQgdG8gYWRkDQotICAgKi8NCi0gIHB1YmxpYyB2b2lkIGFkZFJlbmRlcktpdCgNCi0gICAgUmVuZGVyS2l0QmVhbiByZW5kZXJLaXQpDQotICB7DQotICAgIFN0cmluZyByZW5kZXJLaXRJZCA9IHJlbmRlcktpdC5nZXRSZW5kZXJLaXRJZCgpOw0KLSAgICBSZW5kZXJLaXRCZWFuIGV4aXN0aW5nID0gZmluZFJlbmRlcktpdChyZW5kZXJLaXRJZCk7DQotDQotICAgIGlmIChleGlzdGluZyA9PSBudWxsKQ0KLSAgICB7DQotICAgICAgcmVuZGVyS2l0LmF0dGFjaCh0aGlzKTsNCi0gICAgICBfcmVuZGVyS2l0cy5wdXQocmVuZGVyS2l0SWQsIHJlbmRlcktpdCk7DQotICAgIH0NCi0gICAgZWxzZQ0KLSAgICB7DQotICAgICAgZXhpc3RpbmcuYWRkQWxsUmVuZGVyZXJzKHJlbmRlcktpdCk7DQotICAgIH0NCi0gIH0NCi0NCi0gIC8qKg0KLSAgICogUmV0dXJucyB0aGUgcmVuZGVyIGtpdCBmb3IgdGhpcyByZW5kZXIga2l0IGlkLg0KLSAgICoNCi0gICAqIEBwYXJhbSByZW5kZXJLaXRJZCAgdGhlIHJlbmRlciBraXQgaWQgdG8gZmluZA0KLSAgICovDQotICBwdWJsaWMgUmVuZGVyS2l0QmVhbiBmaW5kUmVuZGVyS2l0KA0KLSAgICBTdHJpbmcgcmVuZGVyS2l0SWQpDQotICB7DQotICAgIHJldHVybiAoUmVuZGVyS2l0QmVhbilfcmVuZGVyS2l0cy5nZXQocmVuZGVyS2l0SWQpOw0KLSAgfQ0KLQ0KLSAgLyoqDQotICAgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBmYWNlcyBjb25maWcgaGFzIGFueSByZW5kZXIga2l0cy4NCi0gICAqDQotICAgKiBAcmV0dXJuIHRydWUgIGlmIHRoaXMgZmFjZXMgY29uZmlnIGhhcyBhbnkgcmVuZGVyIGtpdHMsDQotICAgKiAgICAgICAgIG90aGVyd2lzZSBmYWxzZQ0KLSAgICovDQotICBwdWJsaWMgYm9vbGVhbiBoYXNSZW5kZXJLaXRzKCkNCi0gIHsNCi0gICAgcmV0dXJuICFfcmVuZGVyS2l0cy5pc0VtcHR5KCk7DQotICB9DQotDQotICAvKioNCi0gICAqIFJldHVybnMgYW4gaXRlcmF0b3IgZm9yIGFsbCByZW5kZXIga2l0cyBpbiB0aGlzIGZhY2VzDQotICAgKiBjb25maWcuDQotICAgKg0KLSAgICogQHJldHVybiAgdGhlIHJlbmRlciBraXQgaXRlcmF0b3INCi0gICAqLw0KLSAgcHVibGljIEl0ZXJhdG9yIHJlbmRlcktpdHMoKQ0KLSAgew0KLSAgICByZXR1cm4gX3JlbmRlcktpdHMudmFsdWVzKCkuaXRlcmF0b3IoKTsNCi0gIH0NCi0NCi0gIHB1YmxpYyBVUkwgZ2V0Q3VycmVudFJlc291cmNlKCkNCi0gIHsNCi0gICAgcmV0dXJuIF9jdXJyZW50UmVzb3VyY2U7DQotICB9DQotDQotICBwdWJsaWMgVVJMIHNldEN1cnJlbnRSZXNvdXJjZShVUkwgcmVzb3VyY2UpDQotICB7DQotICAgIFVSTCBfY3VyID0gX2N1cnJlbnRSZXNvdXJjZTsNCi0gICAgX2N1cnJlbnRSZXNvdXJjZSA9IHJlc291cmNlOw0KLSAgICByZXR1cm4gX2N1cjsNCi0gIH0NCi0NCi0gIC8qKg0KLSAgICogUGVyZm9ybXMgYW55IHByb2Nlc3Npbmcgb2YgdGhlIG1ldGEtZGF0YSB0aGF0IG11c3QgYmUgcGVyZm9ybWVkIGFmdGVyIGFsbCBvZiB0aGUNCi0gICAqIG1ldGEtZGF0YSBoYXMgYmVlbiBjb2xsZWN0ZWQuIFRoaXMgaW5jbHVkZXMgcHJvY2Vzc2luZyBvbiBzdXBlci1jbGFzcyBkYXRhIGFuZCBvdGhlcg0KLSAgICogaW50ZXItcmVsYXRlZCBjb21wdXRhdGlvbnMgdGhhdCBjYW5ub3QgYmUgZG9uZSBhcyB0aGUgZGF0YSBpcyBiZWluZyBwYXJzZWQuDQotICAgKi8NCi0gIHB1YmxpYyB2b2lkIHBlcmZvcm1Qb3N0UHJvY2Vzc2luZygpDQotICB7DQotICAgIF9pZGVudGlmeU92ZXJyaWRkZW5Qcm9wZXJpZXMoKTsNCi0gIH0NCi0NCi0gIHByaXZhdGUgdm9pZCBfaWRlbnRpZnlPdmVycmlkZGVuUHJvcGVyaWVzKCkNCi0gIHsNCi0gICAgZm9yIChDb21wb25lbnRCZWFuIGNvbXBvbmVudCA6IF9jb21wb25lbnRzLnZhbHVlcygpKQ0KLSAgICB7DQotICAgICAgQ29tcG9uZW50QmVhbiBwYXJlbnRDb21wb25lbnQgPSBjb21wb25lbnQucmVzb2x2ZVN1cGVydHlwZSgpOw0KLSAgICAgIGlmIChwYXJlbnRDb21wb25lbnQgPT0gbnVsbCkNCi0gICAgICB7DQotICAgICAgICBjb250aW51ZTsNCi0gICAgICB9DQotDQotICAgICAgZm9yIChJdGVyYXRvcjxQcm9wZXJ0eUJlYW4+IGl0ZXIgPSBjb21wb25lbnQucHJvcGVydGllcygpOyBpdGVyLmhhc05leHQoKTspDQotICAgICAgew0KLSAgICAgICAgUHJvcGVydHlCZWFuIHByb3BlcnR5ID0gaXRlci5uZXh0KCk7DQotICAgICAgICBQcm9wZXJ0eUJlYW4gcGFyZW50UHJvcGVydHkgPSBwYXJlbnRDb21wb25lbnQuZmluZFByb3BlcnR5KHByb3BlcnR5LmdldFByb3BlcnR5TmFtZSgpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlKTsNCi0gICAgICAgIGlmIChwYXJlbnRQcm9wZXJ0eSAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICBwcm9wZXJ0eS5zZXRPdmVycmlkZSh0cnVlKTsNCi0gICAgICAgIH0NCi0gICAgICB9DQotICAgIH0NCi0gIH0NCi0NCi0gIHByaXZhdGUgTWFwPFN0cmluZywgQ29udmVydGVyQmVhbj4gX2NvbnZlcnRlcnMgPSBuZXcgVHJlZU1hcDxTdHJpbmcsIENvbnZlcnRlckJlYW4+KCk7DQotICBwcml2YXRlIE1hcDxTdHJpbmcsIFZhbGlkYXRvckJlYW4+IF92YWxpZGF0b3JzID0gbmV3IFRyZWVNYXA8U3RyaW5nLCBWYWxpZGF0b3JCZWFuPigpOw0KLSAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBDb21wb25lbnRCZWFuPiBfY29tcG9uZW50cyA9IG5ldyBUcmVlTWFwPFN0cmluZywgQ29tcG9uZW50QmVhbj4oKTsNCi0gIHByaXZhdGUgTWFwPFN0cmluZywgRXZlbnRCZWFuPiBfZXZlbnRzID0gbmV3IFRyZWVNYXA8U3RyaW5nLCBFdmVudEJlYW4+KCk7DQotICBwcml2YXRlIE1hcDxTdHJpbmcsIFJlbmRlcktpdEJlYW4+IF9yZW5kZXJLaXRzID0gbmV3IFRyZWVNYXA8U3RyaW5nLCBSZW5kZXJLaXRCZWFuPigpOw0KLSAgcHJpdmF0ZSBVUkwgX2N1cnJlbnRSZXNvdXJjZSA9IG51bGw7DQotDQotICBzdGF0aWMgcHJpdmF0ZSBmaW5hbCBMb2dnZXIgX0xPRyA9IExvZ2dlci5nZXRMb2dnZXIoRmFjZXNDb25maWdCZWFuLmNsYXNzLmdldE5hbWUoKSk7DQotfQ0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvdHJpbmlkYWQvcGFyc2UvRmFjZXNDb25maWdQYXJzZXIuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvdHJpbmlkYWQvcGFyc2UvRmFjZXNDb25maWdQYXJzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzI1OTdlZC4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL3RyaW5pZGFkL3BhcnNlL0ZhY2VzQ29uZmlnUGFyc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1ODcgKzAsMCBAQAotLyoNCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqIA0KLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKiANCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmJ1aWxkZXIudHJpbmlkYWQucGFyc2U7DQotDQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247DQotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07DQotDQotaW1wb3J0IGphdmEubmV0LlVSTDsNCi1pbXBvcnQgamF2YS5uZXQuVVJMQ29ubmVjdGlvbjsNCi0NCi1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyRmFjdG9yeTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmRpZ2VzdGVyLkFic3RyYWN0T2JqZWN0Q3JlYXRpb25GYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuZGlnZXN0ZXIuRGlnZXN0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLk1vam9FeGVjdXRpb25FeGNlcHRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uYnVpbGRlci50cmluaWRhZC5wYXJzZS5ydWxlcy5CZWFuUHJvcGVydHlTZXR0ZXJSdWxlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmJ1aWxkZXIudHJpbmlkYWQudXRpbC5YSW5jbHVkZUZpbHRlcjsNCi0NCi1pbXBvcnQgb3JnLnhtbC5zYXguQXR0cmlidXRlczsNCi1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOw0KLQ0KLQ0KLXB1YmxpYyBjbGFzcyBGYWNlc0NvbmZpZ1BhcnNlcg0KLXsNCi0gIHB1YmxpYyB2b2lkIG1lcmdlKA0KLSAgICBGYWNlc0NvbmZpZ0JlYW4gb3duZXIsDQotICAgIFVSTCAgICAgICAgICAgICB1cmwpIHRocm93cyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uDQotICB7DQotICAgIHRyeQ0KLSAgICB7DQotICAgICAgVVJMQ29ubmVjdGlvbiBjb25uID0gdXJsLm9wZW5Db25uZWN0aW9uKCk7DQotICAgICAgbG9uZyBsYXN0TW9kaWZpZWQgPSBjb25uLmdldExhc3RNb2RpZmllZCgpOw0KLSAgICAgIElucHV0U3RyZWFtIGlzID0gY29ubi5nZXRJbnB1dFN0cmVhbSgpOw0KLQ0KLSAgICAgIGlmIChpcyAhPSBudWxsKQ0KLSAgICAgIHsNCi0gICAgICAgIC8vIEVzdGFibGlzaCB0aGUgY3VycmVudCBsYXN0LW1vZGlmaWVkIHZhbHVlDQotICAgICAgICAvLyBBcyBuZXcgY29tcG9uZW50cyBhcmUgYWRkZWQsIHRoZXkgd2lsbCByZW1lbWJlcg0KLSAgICAgICAgLy8gdGhpcyBjdXJyZW50IHZhbHVlIGFzIHRoZWlyIG93biBsYXN0LW1vZGlmaWVkDQotICAgICAgICBvd25lci50b3VjaChsYXN0TW9kaWZpZWQpOw0KLQ0KLSAgICAgICAgRGlnZXN0ZXIgZGlnZXN0ZXIgPSBjcmVhdGVEaWdlc3RlcigpOw0KLSAgICAgICAgZGlnZXN0ZXIucHVzaCh1cmwpOw0KLSAgICAgICAgZGlnZXN0ZXIucHVzaChvd25lcik7DQotICAgICAgICBkaWdlc3Rlci5wYXJzZShpcyk7DQotICAgICAgICBpcy5jbG9zZSgpOw0KLSAgICAgIH0NCi0gICAgfQ0KLSAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkNCi0gICAgew0KLSAgICAgIHRocm93IG5ldyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uKCJGYWlsZWQgdG8gcGFyc2UgIiArIHVybCwgZSk7DQotICAgIH0NCi0gICAgY2F0Y2ggKFNBWEV4Y2VwdGlvbiBlKQ0KLSAgICB7DQotICAgICAgdGhyb3cgbmV3IE1vam9FeGVjdXRpb25FeGNlcHRpb24oIkZhaWxlZCB0byBwYXJzZSAiICsgdXJsLCBlKTsNCi0gICAgfQ0KLSAgICBjYXRjaCAoUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBlKQ0KLSAgICB7DQotICAgICAgdGhyb3cgbmV3IE1vam9FeGVjdXRpb25FeGNlcHRpb24oIkZhaWxlZCB0byBwYXJzZSAiICsgdXJsLCBlKTsNCi0gICAgfQ0KLSAgfQ0KLQ0KLQ0KLSAgc3RhdGljIHByb3RlY3RlZCBEaWdlc3RlciBjcmVhdGVFbXB0eURpZ2VzdGVyKCkNCi0gICAgdGhyb3dzIFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24sIFNBWEV4Y2VwdGlvbg0KLSAgew0KLSAgICBTQVhQYXJzZXJGYWN0b3J5IHNwZiA9IFNBWFBhcnNlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsNCi0gICAgc3BmLnNldE5hbWVzcGFjZUF3YXJlKHRydWUpOw0KLSAgICAvLyByZXF1aXJlcyBKQVhQIDEuMywgaW4gSmF2YVNFIDUuMA0KLSAgICAvL3NwZi5zZXRYSW5jbHVkZUF3YXJlKHRydWUpOw0KLSAgICBEaWdlc3RlciBkaWdlc3RlciA9IG5ldyBEaWdlc3RlcihzcGYubmV3U0FYUGFyc2VyKCkpOw0KLSAgICBkaWdlc3Rlci5zZXROYW1lc3BhY2VBd2FyZSh0cnVlKTsNCi0NCi0gICAgcmV0dXJuIGRpZ2VzdGVyOw0KLSAgfQ0KLQ0KLSAgc3RhdGljIHByb3RlY3RlZCB2b2lkIGFkZENvbXBvbmVudERpZ2VzdGVyUnVsZXMoRGlnZXN0ZXIgZGlnZXN0ZXIsIGJvb2xlYW4gd2l0aENyZWF0ZSkNCi0gIHsNCi0gICAgZGlnZXN0ZXIuc2V0UnVsZU5hbWVzcGFjZVVSSSgiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIik7DQotDQotICAgIC8vIGZhY2VzLWNvbmZpZy9jb21wb25lbnQNCi0gICAgLy8gT25seSB1c2UgaWYgd2UncmUgY3JlYXRpbmcgdGhlIGNvbXBvbmVudDsgIHR1cm4gdGhpcyBvZmYNCi0gICAgLy8gd2hlbiB3ZSdyZSBzaW1wbHkgaW5jbHVkaW5nIGNvbnRlbnQNCi0gICAgaWYgKHdpdGhDcmVhdGUpDQotICAgIHsNCi0gICAgICAvLyBmYWNlcy1jb25maWcvY29tcG9uZW50DQotICAgICAgZGlnZXN0ZXIuYWRkT2JqZWN0Q3JlYXRlKCJmYWNlcy1jb25maWcvY29tcG9uZW50IiwgQ29tcG9uZW50QmVhbi5jbGFzcyk7DQotICAgICAgZGlnZXN0ZXIuYWRkQmVhblByb3BlcnR5U2V0dGVyKCJmYWNlcy1jb25maWcvY29tcG9uZW50L2NvbXBvbmVudC10eXBlIiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbXBvbmVudFR5cGUiKTsNCi0gICAgICBkaWdlc3Rlci5hZGRCZWFuUHJvcGVydHlTZXR0ZXIoImZhY2VzLWNvbmZpZy9jb21wb25lbnQvY29tcG9uZW50LWNsYXNzIiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbXBvbmVudENsYXNzIik7DQotICAgICAgZGlnZXN0ZXIuYWRkQmVhblByb3BlcnR5U2V0dGVyKCJmYWNlcy1jb25maWcvY29tcG9uZW50L2pzLWNvbXBvbmVudC1jbGFzcyIsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJqc0NvbXBvbmVudENsYXNzIik7DQotICAgICAgZGlnZXN0ZXIuYWRkQmVhblByb3BlcnR5U2V0dGVyKCJmYWNlcy1jb25maWcvY29tcG9uZW50L2Rlc2NyaXB0aW9uIik7DQotICAgICAgZGlnZXN0ZXIuYWRkU2V0TmV4dCgiZmFjZXMtY29uZmlnL2NvbXBvbmVudCIsICJhZGRDb21wb25lbnQiLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9uZW50QmVhbi5jbGFzcy5nZXROYW1lKCkpOw0KLSAgICB9DQotDQotICAgIC8vIGZhY2VzLWNvbmZpZy9jb21wb25lbnQvcHJvcGVydHkNCi0gICAgZGlnZXN0ZXIuYWRkT2JqZWN0Q3JlYXRlKCJmYWNlcy1jb25maWcvY29tcG9uZW50L3Byb3BlcnR5IiwgUHJvcGVydHlCZWFuLmNsYXNzKTsNCi0gICAgYWRkQ29tcG9uZW50UHJvcGVydHlEaWdlc3RlclJ1bGVzKGRpZ2VzdGVyKTsNCi0gICAgZGlnZXN0ZXIuYWRkU2V0TmV4dCgiZmFjZXMtY29uZmlnL2NvbXBvbmVudC9wcm9wZXJ0eSIsICJhZGRQcm9wZXJ0eSIsDQotICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlCZWFuLmNsYXNzLmdldE5hbWUoKSk7DQotDQotDQotICAgIC8vIGZhY2VzLWNvbmZpZy9jb21wb25lbnQvZmFjZXQNCi0gICAgZGlnZXN0ZXIuYWRkT2JqZWN0Q3JlYXRlKCJmYWNlcy1jb25maWcvY29tcG9uZW50L2ZhY2V0IiwgRmFjZXRCZWFuLmNsYXNzKTsNCi0gICAgZGlnZXN0ZXIuYWRkQmVhblByb3BlcnR5U2V0dGVyKCJmYWNlcy1jb25maWcvY29tcG9uZW50L2ZhY2V0L2ZhY2V0LW5hbWUiLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZhY2V0TmFtZSIpOw0KLSAgICBkaWdlc3Rlci5hZGRCZWFuUHJvcGVydHlTZXR0ZXIoImZhY2VzLWNvbmZpZy9jb21wb25lbnQvZmFjZXQvZGVzY3JpcHRpb24iKTsNCi0gICAgZGlnZXN0ZXIuYWRkU2V0TmV4dCgiZmFjZXMtY29uZmlnL2NvbXBvbmVudC9mYWNldCIsICJhZGRGYWNldCIsDQotICAgICAgICAgICAgICAgICAgICAgICAgRmFjZXRCZWFuLmNsYXNzLmdldE5hbWUoKSk7DQotDQotICAgIC8vIE1hdmVuIEZhY2VzIFBsdWdpbg0KLSAgICBkaWdlc3Rlci5zZXRSdWxlTmFtZXNwYWNlVVJJKCJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL21hdmVuLWZhY2VzLXBsdWdpbiIpOw0KLQ0KLSAgICAvLyBmYWNlcy1jb25maWcvY29tcG9uZW50L2ZhY2V0L2ZhY2V0LWV4dGVuc2lvbg0KLSAgICBkaWdlc3Rlci5hZGRCZWFuUHJvcGVydHlTZXR0ZXIoImZhY2VzLWNvbmZpZy9jb21wb25lbnQvZmFjZXQvZmFjZXQtZXh0ZW5zaW9uL2hpZGRlbiIpOw0KLQ0KLSAgICAvLyBmYWNlcy1jb25maWcvY29tcG9uZW50L2ZhY2V0L2ZhY2V0LWV4dGVuc2lvbi9mYWNldC1tZXRhZGF0YS9hY2Nlc3NpYmlsaXR5LWd1aWRlbGluZQ0KLSAgICBkaWdlc3Rlci5hZGRDYWxsTWV0aG9kKCJmYWNlcy1jb25maWcvY29tcG9uZW50L2ZhY2V0L2ZhY2V0LWV4dGVuc2lvbi9mYWNldC1tZXRhZGF0YS9hY2Nlc3NpYmlsaXR5LWd1aWRlbGluZSIsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgImFkZEFjY2Vzc2liaWxpdHlHdWlkZWxpbmUiLCAxKTsNCi0gICAgZGlnZXN0ZXIuYWRkQ2FsbFBhcmFtKCJmYWNlcy1jb25maWcvY29tcG9uZW50L2ZhY2V0L2ZhY2V0LWV4dGVuc2lvbi9mYWNldC1tZXRhZGF0YS9hY2Nlc3NpYmlsaXR5LWd1aWRlbGluZSIsIDApOw0KLQ0KLSAgICAvLyBmYWNlcy1jb25maWcvY29tcG9uZW50L2ZhY2V0L2V4YW1wbGUNCi0gICAgZGlnZXN0ZXIuYWRkT2JqZWN0Q3JlYXRlKCJmYWNlcy1jb25maWcvY29tcG9uZW50L2ZhY2V0L2V4YW1wbGUiLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhhbXBsZUJlYW4uY2xhc3MpOw0KLSAgICBkaWdlc3Rlci5hZGRCZWFuUHJvcGVydHlTZXR0ZXIoImZhY2VzLWNvbmZpZy9jb21wb25lbnQvZmFjZXQvZXhhbXBsZS9zb3VyY2UtZGVzY3JpcHRpb24iLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNvdXJjZURlc2NyaXB0aW9uIik7DQotICAgIGRpZ2VzdGVyLmFkZEJlYW5Qcm9wZXJ0eVNldHRlcigiZmFjZXMtY29uZmlnL2NvbXBvbmVudC9mYWNldC9leGFtcGxlL3NvdXJjZS1jb2RlIiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzb3VyY2VDb2RlIik7DQotICAgIGRpZ2VzdGVyLmFkZFNldE5leHQoImZhY2VzLWNvbmZpZy9jb21wb25lbnQvZmFjZXQvZXhhbXBsZSIsDQotICAgICAgICAgICAgICAgICAgICAgICAgImFkZEV4YW1wbGUiLCBFeGFtcGxlQmVhbi5jbGFzcy5nZXROYW1lKCkpOw0KLQ0KLSAgICAvLyBmYWNlcy1jb25maWcvY29tcG9uZW50L2NvbXBvbmVudC1leHRlbnNpb24NCi0gICAgZGlnZXN0ZXIuYWRkQmVhblByb3BlcnR5U2V0dGVyKCJmYWNlcy1jb25maWcvY29tcG9uZW50L2NvbXBvbmVudC1leHRlbnNpb24vbG9uZy1kZXNjcmlwdGlvbiIsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibG9uZ0Rlc2NyaXB0aW9uIik7DQotICAgIGRpZ2VzdGVyLmFkZEJlYW5Qcm9wZXJ0eVNldHRlcigiZmFjZXMtY29uZmlnL2NvbXBvbmVudC9jb21wb25lbnQtZXh0ZW5zaW9uL2NvbXBvbmVudC1mYW1pbHkiLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbXBvbmVudEZhbWlseSIpOw0KLSAgICBkaWdlc3Rlci5hZGRCZWFuUHJvcGVydHlTZXR0ZXIoImZhY2VzLWNvbmZpZy9jb21wb25lbnQvY29tcG9uZW50LWV4dGVuc2lvbi9jb21wb25lbnQtc3VwZXJ0eXBlIiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb21wb25lbnRTdXBlcnR5cGUiKTsNCi0gICAgZGlnZXN0ZXIuYWRkQmVhblByb3BlcnR5U2V0dGVyKCJmYWNlcy1jb25maWcvY29tcG9uZW50L2NvbXBvbmVudC1leHRlbnNpb24vY29tcG9uZW50LXN1cGVyY2xhc3MiLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbXBvbmVudFN1cGVyY2xhc3MiKTsNCi0gICAgZGlnZXN0ZXIuYWRkQmVhblByb3BlcnR5U2V0dGVyKCJmYWNlcy1jb25maWcvY29tcG9uZW50L2NvbXBvbmVudC1leHRlbnNpb24vcmVuZGVyZXItdHlwZSIsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmVuZGVyZXJUeXBlIik7DQotICAgIGRpZ2VzdGVyLmFkZEJlYW5Qcm9wZXJ0eVNldHRlcigiZmFjZXMtY29uZmlnL2NvbXBvbmVudC9jb21wb25lbnQtZXh0ZW5zaW9uL25hbWluZy1jb250YWluZXIiLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5hbWluZ0NvbnRhaW5lciIpOw0KLSAgICBkaWdlc3Rlci5hZGRCZWFuUHJvcGVydHlTZXR0ZXIoImZhY2VzLWNvbmZpZy9jb21wb25lbnQvY29tcG9uZW50LWV4dGVuc2lvbi9hY2NlcHRzLWNoaWxkLWNvbXBvbmVudHMiLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNoaWxkcmVuIik7DQotICAgIGRpZ2VzdGVyLmFkZEJlYW5Qcm9wZXJ0eVNldHRlcigiZmFjZXMtY29uZmlnL2NvbXBvbmVudC9jb21wb25lbnQtZXh0ZW5zaW9uL3RhZy1jbGFzcyIsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGFnQ2xhc3MiKTsNCi0gICAgZGlnZXN0ZXIuYWRkQmVhblByb3BlcnR5U2V0dGVyKCJmYWNlcy1jb25maWcvY29tcG9uZW50L2NvbXBvbmVudC1leHRlbnNpb24vdGFnLXN1cGVyY2xhc3MiLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRhZ1N1cGVyY2xhc3MiKTsNCi0gICAgZGlnZXN0ZXIuYWRkQmVhblByb3BlcnR5U2V0dGVyKCJmYWNlcy1jb25maWcvY29tcG9uZW50L2NvbXBvbmVudC1leHRlbnNpb24vdGFnLWhhbmRsZXIiLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRhZ0hhbmRsZXIiKTsNCi0gICAgZGlnZXN0ZXIuYWRkQmVhblByb3BlcnR5U2V0dGVyKCJmYWNlcy1jb25maWcvY29tcG9uZW50L2NvbXBvbmVudC1leHRlbnNpb24vaW1wbGVtZW50YXRpb24tdHlwZSIsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW1wbGVtZW50YXRpb25UeXBlIik7DQotICAgIGRpZ2VzdGVyLmFkZENhbGxNZXRob2QoImZhY2VzLWNvbmZpZy9jb21wb25lbnQvY29tcG9uZW50LWV4dGVuc2lvbi90YWctY2xhc3MtbW9kaWZpZXIiLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJwYXJzZVRhZ0NsYXNzTW9kaWZpZXIiLCAxKTsNCi0gICAgZGlnZXN0ZXIuYWRkQ2FsbFBhcmFtKCJmYWNlcy1jb25maWcvY29tcG9uZW50L2NvbXBvbmVudC1leHRlbnNpb24vdGFnLWNsYXNzLW1vZGlmaWVyIiwgMCk7DQotICAgIGRpZ2VzdGVyLmFkZENhbGxNZXRob2QoImZhY2VzLWNvbmZpZy9jb21wb25lbnQvY29tcG9uZW50LWV4dGVuc2lvbi91bnN1cHBvcnRlZC1hZ2VudHMiLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJwYXJzZVVuc3VwcG9ydGVkQWdlbnRzIiwgMSk7DQotICAgIGRpZ2VzdGVyLmFkZENhbGxQYXJhbSgiZmFjZXMtY29uZmlnL2NvbXBvbmVudC9jb21wb25lbnQtZXh0ZW5zaW9uL3Vuc3VwcG9ydGVkLWFnZW50cyIsIDApOw0KLQ0KLSAgICBkaWdlc3Rlci5hZGRDYWxsTWV0aG9kKCJmYWNlcy1jb25maWcvY29tcG9uZW50L2NvbXBvbmVudC1leHRlbnNpb24vY29tcG9uZW50LWNsYXNzLW1vZGlmaWVyIiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAicGFyc2VDb21wb25lbnRDbGFzc01vZGlmaWVyIiwgMSk7DQotICAgIGRpZ2VzdGVyLmFkZENhbGxQYXJhbSgiZmFjZXMtY29uZmlnL2NvbXBvbmVudC9jb21wb25lbnQtZXh0ZW5zaW9uL2NvbXBvbmVudC1jbGFzcy1tb2RpZmllciIsIDApOw0KLSAgICBkaWdlc3Rlci5hZGRSdWxlKCJmYWNlcy1jb25maWcvY29tcG9uZW50L2NvbXBvbmVudC1leHRlbnNpb24vdGFnLW5hbWUiLA0KLSAgICAgICAgICAgICAgICAgICAgIG5ldyBCZWFuUHJvcGVydHlTZXR0ZXJSdWxlKCJ0YWdOYW1lIikpOw0KLSAgICBkaWdlc3Rlci5hZGRCZWFuUHJvcGVydHlTZXR0ZXIoImZhY2VzLWNvbmZpZy9jb21wb25lbnQvY29tcG9uZW50LWV4dGVuc2lvbi91aXgyLWxvY2FsLW5hbWUiLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxvY2FsTmFtZSIpOw0KLSAgICBkaWdlc3Rlci5hZGRCZWFuUHJvcGVydHlTZXR0ZXIoImZhY2VzLWNvbmZpZy9jb21wb25lbnQvY29tcG9uZW50LWV4dGVuc2lvbi91aXgyLW5vZGUtY2xhc3MiLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5vZGVDbGFzcyIpOw0KLQ0KLSAgICAvLyBmYWNlcy1jb25maWcvY29tcG9uZW50L2NvbXBvbmVudC1leHRlbnNpb24vYWNjZXNzaWJpbGl0eS1ndWlkZWxpbmUNCi0gICAgZGlnZXN0ZXIuYWRkQ2FsbE1ldGhvZCgiZmFjZXMtY29uZmlnL2NvbXBvbmVudC9jb21wb25lbnQtZXh0ZW5zaW9uL2FjY2Vzc2liaWxpdHktZ3VpZGVsaW5lIiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAiYWRkQWNjZXNzaWJpbGl0eUd1aWRlbGluZSIsIDEpOw0KLSAgICBkaWdlc3Rlci5hZGRDYWxsUGFyYW0oImZhY2VzLWNvbmZpZy9jb21wb25lbnQvY29tcG9uZW50LWV4dGVuc2lvbi9hY2Nlc3NpYmlsaXR5LWd1aWRlbGluZSIsIDApOw0KLQ0KLSAgICAvLyBmYWNlcy1jb25maWcvY29tcG9uZW50L2NvbXBvbmVudC1leHRlbnNpb24vZXhhbXBsZQ0KLSAgICBkaWdlc3Rlci5hZGRPYmplY3RDcmVhdGUoImZhY2VzLWNvbmZpZy9jb21wb25lbnQvY29tcG9uZW50LWV4dGVuc2lvbi9leGFtcGxlIiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4YW1wbGVCZWFuLmNsYXNzKTsNCi0gICAgZGlnZXN0ZXIuYWRkQmVhblByb3BlcnR5U2V0dGVyKCJmYWNlcy1jb25maWcvY29tcG9uZW50L2NvbXBvbmVudC1leHRlbnNpb24vZXhhbXBsZS9zb3VyY2UtZGVzY3JpcHRpb24iLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNvdXJjZURlc2NyaXB0aW9uIik7DQotICAgIGRpZ2VzdGVyLmFkZEJlYW5Qcm9wZXJ0eVNldHRlcigiZmFjZXMtY29uZmlnL2NvbXBvbmVudC9jb21wb25lbnQtZXh0ZW5zaW9uL2V4YW1wbGUvc291cmNlLWNvZGUiLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNvdXJjZUNvZGUiKTsNCi0gICAgZGlnZXN0ZXIuYWRkU2V0TmV4dCgiZmFjZXMtY29uZmlnL2NvbXBvbmVudC9jb21wb25lbnQtZXh0ZW5zaW9uL2V4YW1wbGUiLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICJhZGRFeGFtcGxlIiwgRXhhbXBsZUJlYW4uY2xhc3MuZ2V0TmFtZSgpKTsNCi0NCi0gICAgLy8gZmFjZXMtY29uZmlnL2NvbXBvbmVudC9jb21wb25lbnQtZXh0ZW5zaW9uL3NjcmVlbnNob3QNCi0gICAgZGlnZXN0ZXIuYWRkT2JqZWN0Q3JlYXRlKCJmYWNlcy1jb25maWcvY29tcG9uZW50L2NvbXBvbmVudC1leHRlbnNpb24vc2NyZWVuc2hvdCIsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTY3JlZW5zaG90QmVhbi5jbGFzcyk7DQotICAgIGRpZ2VzdGVyLmFkZEJlYW5Qcm9wZXJ0eVNldHRlcigiZmFjZXMtY29uZmlnL2NvbXBvbmVudC9jb21wb25lbnQtZXh0ZW5zaW9uL3NjcmVlbnNob3QvZGVzY3JpcHRpb24iLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIik7DQotICAgIGRpZ2VzdGVyLmFkZEJlYW5Qcm9wZXJ0eVNldHRlcigiZmFjZXMtY29uZmlnL2NvbXBvbmVudC9jb21wb25lbnQtZXh0ZW5zaW9uL3NjcmVlbnNob3QvaW1hZ2UiLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImltYWdlIik7DQotICAgIGRpZ2VzdGVyLmFkZFNldE5leHQoImZhY2VzLWNvbmZpZy9jb21wb25lbnQvY29tcG9uZW50LWV4dGVuc2lvbi9zY3JlZW5zaG90IiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAiYWRkU2NyZWVuc2hvdCIsIFNjcmVlbnNob3RCZWFuLmNsYXNzLmdldE5hbWUoKSk7DQotDQotICAgIC8vIGZhY2VzLWNvbmZpZy9jb21wb25lbnQvY29tcG9uZW50LWV4dGVuc2lvbi9ldmVudA0KLSAgICBkaWdlc3Rlci5hZGRPYmplY3RDcmVhdGUoImZhY2VzLWNvbmZpZy9jb21wb25lbnQvY29tcG9uZW50LWV4dGVuc2lvbi9ldmVudCIsIEV2ZW50UmVmQmVhbi5jbGFzcyk7DQotICAgIGRpZ2VzdGVyLmFkZEJlYW5Qcm9wZXJ0eVNldHRlcigiZmFjZXMtY29uZmlnL2NvbXBvbmVudC9jb21wb25lbnQtZXh0ZW5zaW9uL2V2ZW50L2V2ZW50LXR5cGUiLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImV2ZW50VHlwZSIpOw0KLSAgICBkaWdlc3Rlci5hZGRCZWFuUHJvcGVydHlTZXR0ZXIoImZhY2VzLWNvbmZpZy9jb21wb25lbnQvY29tcG9uZW50LWV4dGVuc2lvbi9ldmVudC9ldmVudC1kZWxpdmVyeS1waGFzZSIsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXZlbnREZWxpdmVyeVBoYXNlcyIpOw0KLSAgICBkaWdlc3Rlci5hZGRCZWFuUHJvcGVydHlTZXR0ZXIoImZhY2VzLWNvbmZpZy9jb21wb25lbnQvY29tcG9uZW50LWV4dGVuc2lvbi9ldmVudC9pZ25vcmUtc291cmNlLWludGVyZmFjZSIsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaWdub3JlU291cmNlSW50ZXJmYWNlIik7DQotICAgIGRpZ2VzdGVyLmFkZFNldE5leHQoImZhY2VzLWNvbmZpZy9jb21wb25lbnQvY29tcG9uZW50LWV4dGVuc2lvbi9ldmVudCIsICJhZGRFdmVudCIsDQotICAgICAgICAgICAgICAgICAgICAgICAgRXZlbnRSZWZCZWFuLmNsYXNzLmdldE5hbWUoKSk7DQotDQotICAgIC8vIGpzci0yNzYgbWV0YWRhdGEgcnVsZXMNCi0gICAgZGlnZXN0ZXIuc2V0UnVsZU5hbWVzcGFjZVVSSSgiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL2ZhY2VzL2Rlc2lnbi10aW1lLW1ldGFkYXRhIik7DQotICAgIGRpZ2VzdGVyLmFkZEJlYW5Qcm9wZXJ0eVNldHRlcigiZmFjZXMtY29uZmlnL2NvbXBvbmVudC9wcm9wZXJ0eS9wcm9wZXJ0eS1leHRlbnNpb24vcHJvcGVydHktbWV0YWRhdGEvcmVxdWlyZWQiKTsNCi0gICAgZGlnZXN0ZXIuYWRkQmVhblByb3BlcnR5U2V0dGVyKCJmYWNlcy1jb25maWcvY29tcG9uZW50L3Byb3BlcnR5L3Byb3BlcnR5LWV4dGVuc2lvbi9wcm9wZXJ0eS1tZXRhZGF0YS92YWx1ZS1leHByZXNzaW9uIiwgInZhbHVlRXhwcmVzc2lvbiIpOw0KLSAgICBkaWdlc3Rlci5hZGRCZWFuUHJvcGVydHlTZXR0ZXIoImZhY2VzLWNvbmZpZy9jb21wb25lbnQvY29tcG9uZW50LWV4dGVuc2lvbi9jb21wb25lbnQtbWV0YWRhdGEvZGVmYXVsdC1ldmVudC1uYW1lIiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0RXZlbnROYW1lIik7DQotICAgIGRpZ2VzdGVyLmFkZEJlYW5Qcm9wZXJ0eVNldHRlcigiZmFjZXMtY29uZmlnL2NvbXBvbmVudC9mYWNldC9mYWNldC1leHRlbnNpb24vZmFjZXQtbWV0YWRhdGEvaGlkZGVuIik7DQotICAgIGRpZ2VzdGVyLmFkZENhbGxNZXRob2QoImZhY2VzLWNvbmZpZy9jb21wb25lbnQvY29tcG9uZW50LWV4dGVuc2lvbi9jb21wb25lbnQtbWV0YWRhdGEvZXZlbnQtbmFtZXMiLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJwYXJzZUV2ZW50TmFtZXMiLCAxKTsNCi0gICAgZGlnZXN0ZXIuYWRkQ2FsbFBhcmFtKCJmYWNlcy1jb25maWcvY29tcG9uZW50L2NvbXBvbmVudC1leHRlbnNpb24vY29tcG9uZW50LW1ldGFkYXRhL2V2ZW50LW5hbWVzIiwgMCk7DQotDQotICAgIC8vIGZhY2VzLWNvbmZpZy9jb21wb25lbnQvZmFjZXQvZmFjZXQtZXh0ZW5zaW9uL2ZhY2V0LW1ldGFkYXRhL2FsbG93ZWQtY2hpbGQtY29tcG9uZW50cw0KLSAgICBkaWdlc3Rlci5hZGRDYWxsTWV0aG9kKCJmYWNlcy1jb25maWcvY29tcG9uZW50L2ZhY2V0L2ZhY2V0LWV4dGVuc2lvbi9mYWNldC1tZXRhZGF0YS9hbGxvd2VkLWNoaWxkLWNvbXBvbmVudHMiLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJwYXJzZUFsbG93ZWRDaGlsZENvbXBvbmVudHMiLCAxKTsNCi0gICAgZGlnZXN0ZXIuYWRkQ2FsbFBhcmFtKCJmYWNlcy1jb25maWcvY29tcG9uZW50L2ZhY2V0L2ZhY2V0LWV4dGVuc2lvbi9mYWNldC1tZXRhZGF0YS9hbGxvd2VkLWNoaWxkLWNvbXBvbmVudHMiLCAwKTsNCi0NCi0gICAgLy8gZmFjZXMtY29uZmlnL2NvbXBvbmVudC9jb21wb25lbnQtZXh0ZW5zaW9uL2NvbXBvbmVudC1tZXRhZGF0YS9yZXF1aXJlZC1hbmNlc3Rvci1jb250cmFjdHMNCi0gICAgZGlnZXN0ZXIuYWRkQ2FsbE1ldGhvZCgiZmFjZXMtY29uZmlnL2NvbXBvbmVudC9jb21wb25lbnQtZXh0ZW5zaW9uL2NvbXBvbmVudC1tZXRhZGF0YS9yZXF1aXJlZC1hbmNlc3Rvci1jb250cmFjdHMiLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJwYXJzZVJlcXVpcmVkQW5jZXN0b3JDb250cmFjdHMiLCAxKTsNCi0gICAgZGlnZXN0ZXIuYWRkQ2FsbFBhcmFtKCJmYWNlcy1jb25maWcvY29tcG9uZW50L2NvbXBvbmVudC1leHRlbnNpb24vY29tcG9uZW50LW1ldGFkYXRhL3JlcXVpcmVkLWFuY2VzdG9yLWNvbnRyYWN0cyIsIDApOw0KLQ0KLSAgICAvLyBmYWNlcy1jb25maWcvY29tcG9uZW50L2NvbXBvbmVudC1leHRlbnNpb24vY29tcG9uZW50LW1ldGFkYXRhL3NhdGlzZmllZC1jb250cmFjdHMNCi0gICAgZGlnZXN0ZXIuYWRkQ2FsbE1ldGhvZCgiZmFjZXMtY29uZmlnL2NvbXBvbmVudC9jb21wb25lbnQtZXh0ZW5zaW9uL2NvbXBvbmVudC1tZXRhZGF0YS9zYXRpc2ZpZWQtY29udHJhY3RzIiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAicGFyc2VTYXRpc2ZpZWRDb250cmFjdHMiLCAxKTsNCi0gICAgZGlnZXN0ZXIuYWRkQ2FsbFBhcmFtKCJmYWNlcy1jb25maWcvY29tcG9uZW50L2NvbXBvbmVudC1leHRlbnNpb24vY29tcG9uZW50LW1ldGFkYXRhL3NhdGlzZmllZC1jb250cmFjdHMiLCAwKTsNCi0NCi0gICAgLy8gWEluY2x1ZGUgcnVsZXMNCi0gICAgZGlnZXN0ZXIuc2V0UnVsZU5hbWVzcGFjZVVSSShYSW5jbHVkZUZpbHRlci5YSU5DTFVERV9OQU1FU1BBQ0UpOw0KLSAgICBkaWdlc3Rlci5hZGRGYWN0b3J5Q3JlYXRlKCJmYWNlcy1jb25maWcvY29tcG9uZW50L2luY2x1ZGUiLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvbmVudEluY2x1ZGVGYWN0b3J5LmNsYXNzKTsNCi0gICAgZGlnZXN0ZXIuYWRkRmFjdG9yeUNyZWF0ZSgiZmFjZXMtY29uZmlnL2NvbXBvbmVudC9wcm9wZXJ0eS9pbmNsdWRlIiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb25lbnRQcm9wZXJ0eUluY2x1ZGVGYWN0b3J5LmNsYXNzKTsNCi0gICAgZGlnZXN0ZXIuYWRkRmFjdG9yeUNyZWF0ZSgiZmFjZXMtY29uZmlnL2NvbXBvbmVudC9jb21wb25lbnQtZXh0ZW5zaW9uL2luY2x1ZGUiLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvbmVudEluY2x1ZGVGYWN0b3J5LmNsYXNzKTsNCi0gICAgZGlnZXN0ZXIuYWRkRmFjdG9yeUNyZWF0ZSgiZmFjZXMtY29uZmlnL2NvbXBvbmVudC9jb21wb25lbnQtZXh0ZW5zaW9uL2NvbXBvbmVudC1tZXRhZGF0YS9pbmNsdWRlIiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb25lbnRJbmNsdWRlRmFjdG9yeS5jbGFzcyk7DQotICB9DQotDQotICAvLyBBZGQgY29tcG9uZW50IHByb3BlcnR5LXJlbGF0ZWQgZGlnc3RlciBydWxlcw0KLSAgcHJvdGVjdGVkIHN0YXRpYyB2b2lkIGFkZENvbXBvbmVudFByb3BlcnR5RGlnZXN0ZXJSdWxlcyhEaWdlc3RlciBkaWdlc3RlcikNCi0gIHsNCi0gICAgU3RyaW5nIG9sZE5hbWVzcGFjZSA9IGRpZ2VzdGVyLmdldFJ1bGVOYW1lc3BhY2VVUkkoKTsNCi0NCi0gICAgZGlnZXN0ZXIuc2V0UnVsZU5hbWVzcGFjZVVSSSgiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIik7DQotDQotICAgIGRpZ2VzdGVyLmFkZEJlYW5Qcm9wZXJ0eVNldHRlcigiZmFjZXMtY29uZmlnL2NvbXBvbmVudC9wcm9wZXJ0eS9wcm9wZXJ0eS1uYW1lIiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwcm9wZXJ0eU5hbWUiKTsNCi0gICAgZGlnZXN0ZXIuYWRkQmVhblByb3BlcnR5U2V0dGVyKCJmYWNlcy1jb25maWcvY29tcG9uZW50L3Byb3BlcnR5L3Byb3BlcnR5LWNsYXNzIiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwcm9wZXJ0eUNsYXNzIik7DQotICAgIGRpZ2VzdGVyLmFkZEJlYW5Qcm9wZXJ0eVNldHRlcigiZmFjZXMtY29uZmlnL2NvbXBvbmVudC9wcm9wZXJ0eS9kZXNjcmlwdGlvbiIpOw0KLSAgICBkaWdlc3Rlci5hZGRCZWFuUHJvcGVydHlTZXR0ZXIoImZhY2VzLWNvbmZpZy9jb21wb25lbnQvcHJvcGVydHkvZGVmYXVsdC12YWx1ZSIsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdFZhbHVlIik7DQotDQotICAgIC8vIE1hdmVuIEZhY2VzIFBsdWdpbg0KLSAgICBkaWdlc3Rlci5zZXRSdWxlTmFtZXNwYWNlVVJJKCJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL21hdmVuLWZhY2VzLXBsdWdpbiIpOw0KLQ0KLSAgICAvLyBmYWNlcy1jb25maWcvY29tcG9uZW50L3Byb3BlcnR5L3Byb3BlcnR5LWV4dGVuc2lvbg0KLSAgICBkaWdlc3Rlci5hZGRCZWFuUHJvcGVydHlTZXR0ZXIoImZhY2VzLWNvbmZpZy9jb21wb25lbnQvcHJvcGVydHkvcHJvcGVydHktZXh0ZW5zaW9uL3N0YXRlLWhvbGRlciIsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3RhdGVIb2xkZXIiKTsNCi0gICAgZGlnZXN0ZXIuYWRkQmVhblByb3BlcnR5U2V0dGVyKCJmYWNlcy1jb25maWcvY29tcG9uZW50L3Byb3BlcnR5L3Byb3BlcnR5LWV4dGVuc2lvbi9qc3AtcHJvcGVydHktbmFtZSIsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAianNwUHJvcGVydHlOYW1lIik7DQotICAgIGRpZ2VzdGVyLmFkZEJlYW5Qcm9wZXJ0eVNldHRlcigiZmFjZXMtY29uZmlnL2NvbXBvbmVudC9wcm9wZXJ0eS9wcm9wZXJ0eS1leHRlbnNpb24vbGlzdCIsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibGlzdCIpOw0KLSAgICBkaWdlc3Rlci5hZGRCZWFuUHJvcGVydHlTZXR0ZXIoImZhY2VzLWNvbmZpZy9jb21wb25lbnQvcHJvcGVydHkvcHJvcGVydHktZXh0ZW5zaW9uL3JlcXVpcmVkIik7DQotICAgIGRpZ2VzdGVyLmFkZEJlYW5Qcm9wZXJ0eVNldHRlcigiZmFjZXMtY29uZmlnL2NvbXBvbmVudC9wcm9wZXJ0eS9wcm9wZXJ0eS1leHRlbnNpb24vYWxpYXMtb2YiLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFsaWFzT2YiKTsNCi0gICAgZGlnZXN0ZXIuYWRkQmVhblByb3BlcnR5U2V0dGVyKCJmYWNlcy1jb25maWcvY29tcG9uZW50L3Byb3BlcnR5L3Byb3BlcnR5LWV4dGVuc2lvbi92aXJ0dWFsIik7DQotICAgIGRpZ2VzdGVyLmFkZEJlYW5Qcm9wZXJ0eVNldHRlcigiZmFjZXMtY29uZmlnL2NvbXBvbmVudC9wcm9wZXJ0eS9wcm9wZXJ0eS1leHRlbnNpb24vdHJhbnNpZW50Iik7DQotICAgIGRpZ2VzdGVyLmFkZEJlYW5Qcm9wZXJ0eVNldHRlcigiZmFjZXMtY29uZmlnL2NvbXBvbmVudC9wcm9wZXJ0eS9wcm9wZXJ0eS1leHRlbnNpb24vbGl0ZXJhbC1vbmx5IiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsaXRlcmFsT25seSIpOw0KLSAgICBkaWdlc3Rlci5hZGRCZWFuUHJvcGVydHlTZXR0ZXIoImZhY2VzLWNvbmZpZy9jb21wb25lbnQvcHJvcGVydHkvcHJvcGVydHktZXh0ZW5zaW9uL2VudW0iLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImVudW0iKTsNCi0gICAgZGlnZXN0ZXIuYWRkQmVhblByb3BlcnR5U2V0dGVyKCJmYWNlcy1jb25maWcvY29tcG9uZW50L3Byb3BlcnR5L3Byb3BlcnR5LWV4dGVuc2lvbi9hbHRlcm5hdGUtY2xhc3MiLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFsdGVybmF0ZUNsYXNzIik7DQotICAgIGRpZ2VzdGVyLmFkZEJlYW5Qcm9wZXJ0eVNldHRlcigiZmFjZXMtY29uZmlnL2NvbXBvbmVudC9wcm9wZXJ0eS9wcm9wZXJ0eS1leHRlbnNpb24vdGFnLWF0dHJpYnV0ZS1leGNsdWRlZCIsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGFnQXR0cmlidXRlRXhjbHVkZWQiKTsNCi0gICAgZGlnZXN0ZXIuYWRkQmVhblByb3BlcnR5U2V0dGVyKCJmYWNlcy1jb25maWcvY29tcG9uZW50L3Byb3BlcnR5L3Byb3BlcnR5LWV4dGVuc2lvbi9oaWRkZW4iKTsNCi0gICAgZGlnZXN0ZXIuYWRkQ2FsbE1ldGhvZCgiZmFjZXMtY29uZmlnL2NvbXBvbmVudC9wcm9wZXJ0eS9wcm9wZXJ0eS1leHRlbnNpb24vcHJvcGVydHktdmFsdWVzIiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAicGFyc2VQcm9wZXJ0eVZhbHVlcyIsIDEpOw0KLSAgICBkaWdlc3Rlci5hZGRDYWxsUGFyYW0oImZhY2VzLWNvbmZpZy9jb21wb25lbnQvcHJvcGVydHkvcHJvcGVydHktZXh0ZW5zaW9uL3Byb3BlcnR5LXZhbHVlcyIsIDApOw0KLSAgICBkaWdlc3Rlci5hZGRDYWxsTWV0aG9kKCJmYWNlcy1jb25maWcvY29tcG9uZW50L3Byb3BlcnR5L3Byb3BlcnR5LWV4dGVuc2lvbi91bnN1cHBvcnRlZC1hZ2VudHMiLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJwYXJzZVVuc3VwcG9ydGVkQWdlbnRzIiwgMSk7DQotICAgIGRpZ2VzdGVyLmFkZENhbGxQYXJhbSgiZmFjZXMtY29uZmlnL2NvbXBvbmVudC9wcm9wZXJ0eS9wcm9wZXJ0eS1leHRlbnNpb24vdW5zdXBwb3J0ZWQtYWdlbnRzIiwgMCk7DQotICAgIGRpZ2VzdGVyLmFkZENhbGxNZXRob2QoImZhY2VzLWNvbmZpZy9jb21wb25lbnQvcHJvcGVydHkvcHJvcGVydHktZXh0ZW5zaW9uL3Vuc3VwcG9ydGVkLXJlbmRlci1raXRzIiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAicGFyc2VVbnN1cHBvcnRlZFJlbmRlcktpdHMiLCAxKTsNCi0gICAgZGlnZXN0ZXIuYWRkQ2FsbFBhcmFtKCJmYWNlcy1jb25maWcvY29tcG9uZW50L3Byb3BlcnR5L3Byb3BlcnR5LWV4dGVuc2lvbi91bnN1cHBvcnRlZC1yZW5kZXIta2l0cyIsIDApOw0KLQ0KLSAgICBkaWdlc3Rlci5hZGRPYmplY3RDcmVhdGUoImZhY2VzLWNvbmZpZy9jb21wb25lbnQvcHJvcGVydHkvcHJvcGVydHktZXh0ZW5zaW9uL21ldGhvZC1iaW5kaW5nLXNpZ25hdHVyZSIsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRob2RTaWduYXR1cmVCZWFuLmNsYXNzKTsNCi0gICAgZGlnZXN0ZXIuYWRkQmVhblByb3BlcnR5U2V0dGVyKCJmYWNlcy1jb25maWcvY29tcG9uZW50L3Byb3BlcnR5L3Byb3BlcnR5LWV4dGVuc2lvbi9tZXRob2QtYmluZGluZy1zaWduYXR1cmUvcmV0dXJuLXR5cGUiLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJldHVyblR5cGUiKTsNCi0gICAgZGlnZXN0ZXIuYWRkQ2FsbE1ldGhvZCgiZmFjZXMtY29uZmlnL2NvbXBvbmVudC9wcm9wZXJ0eS9wcm9wZXJ0eS1leHRlbnNpb24vbWV0aG9kLWJpbmRpbmctc2lnbmF0dXJlL3BhcmFtZXRlci10eXBlIiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAiYWRkUGFyYW1ldGVyVHlwZSIsIDEpOw0KLSAgICBkaWdlc3Rlci5hZGRDYWxsUGFyYW0oImZhY2VzLWNvbmZpZy9jb21wb25lbnQvcHJvcGVydHkvcHJvcGVydHktZXh0ZW5zaW9uL21ldGhvZC1iaW5kaW5nLXNpZ25hdHVyZS9wYXJhbWV0ZXItdHlwZSIsIDApOw0KLSAgICBkaWdlc3Rlci5hZGRTZXROZXh0KCJmYWNlcy1jb25maWcvY29tcG9uZW50L3Byb3BlcnR5L3Byb3BlcnR5LWV4dGVuc2lvbi9tZXRob2QtYmluZGluZy1zaWduYXR1cmUiLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICJzZXRNZXRob2RCaW5kaW5nU2lnbmF0dXJlIiwNCi0gICAgICAgICAgICAgICAgICAgICAgICBNZXRob2RTaWduYXR1cmVCZWFuLmNsYXNzLmdldE5hbWUoKSk7DQotDQotICAgIC8vIGZhY2VzLWNvbmZpZy9jb21wb25lbnQvcHJvcGVydHkvcHJvcGVydHktZXh0ZW5zaW9uL3Byb3BlcnR5LW1ldGFkYXRhDQotICAgIGRpZ2VzdGVyLmFkZEJlYW5Qcm9wZXJ0eVNldHRlcigiZmFjZXMtY29uZmlnL2NvbXBvbmVudC9wcm9wZXJ0eS9wcm9wZXJ0eS1leHRlbnNpb24vcHJvcGVydHktbWV0YWRhdGEvdXNlLW1heC10aW1lIiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1c2VNYXhUaW1lIik7DQotICAgIGRpZ2VzdGVyLmFkZEJlYW5Qcm9wZXJ0eVNldHRlcigiZmFjZXMtY29uZmlnL2NvbXBvbmVudC9wcm9wZXJ0eS9wcm9wZXJ0eS1leHRlbnNpb24vcHJvcGVydHktbWV0YWRhdGEvZGVwcmVjYXRlZCIpOw0KLSAgICBkaWdlc3Rlci5hZGRDYWxsTWV0aG9kKCJmYWNlcy1jb25maWcvY29tcG9uZW50L3Byb3BlcnR5L3Byb3BlcnR5LWV4dGVuc2lvbi9wcm9wZXJ0eS1tZXRhZGF0YS9uby1vcCIsICJtYWtlTm9PcCIpOw0KLQ0KLSAgICAvLyBmYWNlcy1jb25maWcvY29tcG9uZW50L3Byb3BlcnR5L3Byb3BlcnR5LWV4dGVuc2lvbi9wcm9wZXJ0eS1tZXRhZGF0YS9hY2Nlc3NpYmlsaXR5LWd1aWRlbGluZQ0KLSAgICBkaWdlc3Rlci5hZGRDYWxsTWV0aG9kKCJmYWNlcy1jb25maWcvY29tcG9uZW50L3Byb3BlcnR5L3Byb3BlcnR5LWV4dGVuc2lvbi9wcm9wZXJ0eS1tZXRhZGF0YS9hY2Nlc3NpYmlsaXR5LWd1aWRlbGluZSIsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgImFkZEFjY2Vzc2liaWxpdHlHdWlkZWxpbmUiLCAxKTsNCi0gICAgZGlnZXN0ZXIuYWRkQ2FsbFBhcmFtKCJmYWNlcy1jb25maWcvY29tcG9uZW50L3Byb3BlcnR5L3Byb3BlcnR5LWV4dGVuc2lvbi9wcm9wZXJ0eS1tZXRhZGF0YS9hY2Nlc3NpYmlsaXR5LWd1aWRlbGluZSIsIDApOw0KLQ0KLSAgICAvLyBqc3ItMjc2IG1ldGFkYXRhIHJ1bGVzDQotICAgIGRpZ2VzdGVyLnNldFJ1bGVOYW1lc3BhY2VVUkkoImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS9mYWNlcy9kZXNpZ24tdGltZS1tZXRhZGF0YSIpOw0KLSAgICBkaWdlc3Rlci5hZGRDYWxsTWV0aG9kKCJmYWNlcy1jb25maWcvY29tcG9uZW50L3Byb3BlcnR5L3Byb3BlcnR5LWV4dGVuc2lvbi9wcm9wZXJ0eS1tZXRhZGF0YS9wcm9wZXJ0eS12YWx1ZXMiLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJwYXJzZVByb3BlcnR5VmFsdWVzIiwgMSk7DQotICAgIGRpZ2VzdGVyLmFkZENhbGxQYXJhbSgiZmFjZXMtY29uZmlnL2NvbXBvbmVudC9wcm9wZXJ0eS9wcm9wZXJ0eS1leHRlbnNpb24vcHJvcGVydHktbWV0YWRhdGEvcHJvcGVydHktdmFsdWVzIiwgMCk7DQotICAgIGRpZ2VzdGVyLmFkZEJlYW5Qcm9wZXJ0eVNldHRlcigiZmFjZXMtY29uZmlnL2NvbXBvbmVudC9wcm9wZXJ0eS9wcm9wZXJ0eS1leHRlbnNpb24vcHJvcGVydHktbWV0YWRhdGEvZGVwcmVjYXRlZCIpOw0KLSAgICBkaWdlc3Rlci5hZGRCZWFuUHJvcGVydHlTZXR0ZXIoImZhY2VzLWNvbmZpZy9jb21wb25lbnQvcHJvcGVydHkvcHJvcGVydHktZXh0ZW5zaW9uL3Byb3BlcnR5LW1ldGFkYXRhL2hpZGRlbiIpOw0KLQ0KLSAgICBkaWdlc3Rlci5zZXRSdWxlTmFtZXNwYWNlVVJJKG9sZE5hbWVzcGFjZSk7DQotICB9DQotDQotICBwcm90ZWN0ZWQgc3RhdGljIHZvaWQgYWRkQ29udmVydGVyRGlnZXN0ZXJSdWxlcyhEaWdlc3RlciBkaWdlc3RlcikNCi0gIHsNCi0gICAgZGlnZXN0ZXIuc2V0UnVsZU5hbWVzcGFjZVVSSSgiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIik7DQotDQotICAgIC8vIGZhY2VzLWNvbmZpZy9jb252ZXJ0ZXINCi0gICAgZGlnZXN0ZXIuYWRkT2JqZWN0Q3JlYXRlKCJmYWNlcy1jb25maWcvY29udmVydGVyIiwgQ29udmVydGVyQmVhbi5jbGFzcyk7DQotICAgIGRpZ2VzdGVyLmFkZEJlYW5Qcm9wZXJ0eVNldHRlcigiZmFjZXMtY29uZmlnL2NvbnZlcnRlci9jb252ZXJ0ZXItaWQiLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbnZlcnRlcklkIik7DQotICAgIGRpZ2VzdGVyLmFkZEJlYW5Qcm9wZXJ0eVNldHRlcigiZmFjZXMtY29uZmlnL2NvbnZlcnRlci9jb252ZXJ0ZXItY2xhc3MiLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbnZlcnRlckNsYXNzIik7DQotICAgIGRpZ2VzdGVyLmFkZEJlYW5Qcm9wZXJ0eVNldHRlcigiZmFjZXMtY29uZmlnL2NvbnZlcnRlci9kZXNjcmlwdGlvbiIpOw0KLSAgICBkaWdlc3Rlci5hZGRTZXROZXh0KCJmYWNlcy1jb25maWcvY29udmVydGVyIiwgImFkZENvbnZlcnRlciIsDQotICAgICAgICAgICAgICAgICAgICAgICAgQ29udmVydGVyQmVhbi5jbGFzcy5nZXROYW1lKCkpOw0KLQ0KLSAgICAvLyBmYWNlcy1jb25maWcvY29udmVydGVyL3Byb3BlcnR5DQotICAgIGRpZ2VzdGVyLmFkZE9iamVjdENyZWF0ZSgiZmFjZXMtY29uZmlnL2NvbnZlcnRlci9wcm9wZXJ0eSIsIFByb3BlcnR5QmVhbi5jbGFzcyk7DQotICAgIGRpZ2VzdGVyLmFkZEJlYW5Qcm9wZXJ0eVNldHRlcigiZmFjZXMtY29uZmlnL2NvbnZlcnRlci9wcm9wZXJ0eS9wcm9wZXJ0eS1uYW1lIiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwcm9wZXJ0eU5hbWUiKTsNCi0gICAgZGlnZXN0ZXIuYWRkQmVhblByb3BlcnR5U2V0dGVyKCJmYWNlcy1jb25maWcvY29udmVydGVyL3Byb3BlcnR5L3Byb3BlcnR5LWNsYXNzIiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwcm9wZXJ0eUNsYXNzIik7DQotICAgIGRpZ2VzdGVyLmFkZEJlYW5Qcm9wZXJ0eVNldHRlcigiZmFjZXMtY29uZmlnL2NvbnZlcnRlci9wcm9wZXJ0eS9kZXNjcmlwdGlvbiIpOw0KLSAgICBkaWdlc3Rlci5hZGRCZWFuUHJvcGVydHlTZXR0ZXIoImZhY2VzLWNvbmZpZy9jb252ZXJ0ZXIvcHJvcGVydHkvZGVmYXVsdC12YWx1ZSIsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdFZhbHVlIik7DQotICAgIGRpZ2VzdGVyLmFkZFNldE5leHQoImZhY2VzLWNvbmZpZy9jb252ZXJ0ZXIvcHJvcGVydHkiLCAiYWRkUHJvcGVydHkiLA0KLSAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5QmVhbi5jbGFzcy5nZXROYW1lKCkpOw0KLQ0KLSAgICAvLyBNYXZlbiBGYWNlcyBQbHVnaW4NCi0gICAgZGlnZXN0ZXIuc2V0UnVsZU5hbWVzcGFjZVVSSSgiaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9tYXZlbi1mYWNlcy1wbHVnaW4iKTsNCi0NCi0gICAgLy8gZmFjZXMtY29uZmlnL2NvbnZlcnRlci9jb252ZXJ0ZXItZXh0ZW5zaW9uDQotICAgIGRpZ2VzdGVyLmFkZEJlYW5Qcm9wZXJ0eVNldHRlcigiZmFjZXMtY29uZmlnL2NvbnZlcnRlci9jb252ZXJ0ZXItZXh0ZW5zaW9uL3Jvb3QtY29udmVydGVyLWlkIiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyb290Q29udmVydGVySWQiKTsNCi0gICAgZGlnZXN0ZXIuYWRkQmVhblByb3BlcnR5U2V0dGVyKCJmYWNlcy1jb25maWcvY29udmVydGVyL2NvbnZlcnRlci1leHRlbnNpb24vbG9uZy1kZXNjcmlwdGlvbiIsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibG9uZ0Rlc2NyaXB0aW9uIik7DQotICAgIGRpZ2VzdGVyLmFkZEJlYW5Qcm9wZXJ0eVNldHRlcigiZmFjZXMtY29uZmlnL2NvbnZlcnRlci9jb252ZXJ0ZXItZXh0ZW5zaW9uL3RhZy1jbGFzcyIsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGFnQ2xhc3MiKTsNCi0gICAgZGlnZXN0ZXIuYWRkUnVsZSgiZmFjZXMtY29uZmlnL2NvbnZlcnRlci9jb252ZXJ0ZXItZXh0ZW5zaW9uL3RhZy1uYW1lIiwNCi0gICAgICAgICAgICAgICAgICAgICBuZXcgQmVhblByb3BlcnR5U2V0dGVyUnVsZSgidGFnTmFtZSIpKTsNCi0gICAgZGlnZXN0ZXIuYWRkQ2FsbE1ldGhvZCgiZmFjZXMtY29uZmlnL2NvbnZlcnRlci9jb252ZXJ0ZXItZXh0ZW5zaW9uL3RhZy1jbGFzcy1tb2RpZmllciIsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgInBhcnNlVGFnQ2xhc3NNb2RpZmllciIsIDEpOw0KLSAgICBkaWdlc3Rlci5hZGRDYWxsUGFyYW0oImZhY2VzLWNvbmZpZy9jb252ZXJ0ZXIvY29udmVydGVyLWV4dGVuc2lvbi90YWctY2xhc3MtbW9kaWZpZXIiLCAwKTsNCi0NCi0gICAgLy8gZmFjZXMtY29uZmlnL2NvbnZlcnRlci9jb252ZXJ0ZXItZXh0ZW5zaW9uL2V4YW1wbGUNCi0gICAgZGlnZXN0ZXIuYWRkT2JqZWN0Q3JlYXRlKCJmYWNlcy1jb25maWcvY29udmVydGVyL2NvbnZlcnRlci1leHRlbnNpb24vZXhhbXBsZSIsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeGFtcGxlQmVhbi5jbGFzcyk7DQotICAgIGRpZ2VzdGVyLmFkZEJlYW5Qcm9wZXJ0eVNldHRlcigiZmFjZXMtY29uZmlnL2NvbnZlcnRlci9jb252ZXJ0ZXItZXh0ZW5zaW9uL2V4YW1wbGUvc291cmNlLWRlc2NyaXB0aW9uIiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzb3VyY2VEZXNjcmlwdGlvbiIpOw0KLSAgICBkaWdlc3Rlci5hZGRCZWFuUHJvcGVydHlTZXR0ZXIoImZhY2VzLWNvbmZpZy9jb252ZXJ0ZXIvY29udmVydGVyLWV4dGVuc2lvbi9leGFtcGxlL3NvdXJjZS1jb2RlIiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzb3VyY2VDb2RlIik7DQotICAgIGRpZ2VzdGVyLmFkZFNldE5leHQoImZhY2VzLWNvbmZpZy9jb252ZXJ0ZXIvY29udmVydGVyLWV4dGVuc2lvbi9leGFtcGxlIiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAiYWRkRXhhbXBsZSIsIEV4YW1wbGVCZWFuLmNsYXNzLmdldE5hbWUoKSk7DQotDQotICAgIC8vIGZhY2VzLWNvbmZpZy9jb252ZXJ0ZXIvcHJvcGVydHkvcHJvcGVydHktZXh0ZW5zaW9uDQotICAgIGRpZ2VzdGVyLmFkZEJlYW5Qcm9wZXJ0eVNldHRlcigiZmFjZXMtY29uZmlnL2NvbnZlcnRlci9wcm9wZXJ0eS9wcm9wZXJ0eS1leHRlbnNpb24vdGFnLWF0dHJpYnV0ZS1leGNsdWRlZCIsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGFnQXR0cmlidXRlRXhjbHVkZWQiKTsNCi0gIH0NCi0NCi0gIHByb3RlY3RlZCBzdGF0aWMgdm9pZCBhZGRWYWxpZGF0b3JEaWdlc3RlclJ1bGVzKERpZ2VzdGVyIGRpZ2VzdGVyKQ0KLSAgew0KLSAgICAvLyBKYXZhIEVudGVycHJpc2UgNS4wDQotICAgIGRpZ2VzdGVyLnNldFJ1bGVOYW1lc3BhY2VVUkkoImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIpOw0KLQ0KLSAgICAvLyBmYWNlcy1jb25maWcvdmFsaWRhdG9yDQotICAgIGRpZ2VzdGVyLmFkZE9iamVjdENyZWF0ZSgiZmFjZXMtY29uZmlnL3ZhbGlkYXRvciIsIFZhbGlkYXRvckJlYW4uY2xhc3MpOw0KLSAgICBkaWdlc3Rlci5hZGRCZWFuUHJvcGVydHlTZXR0ZXIoImZhY2VzLWNvbmZpZy92YWxpZGF0b3IvdmFsaWRhdG9yLWlkIiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2YWxpZGF0b3JJZCIpOw0KLSAgICBkaWdlc3Rlci5hZGRCZWFuUHJvcGVydHlTZXR0ZXIoImZhY2VzLWNvbmZpZy92YWxpZGF0b3IvdmFsaWRhdG9yLWNsYXNzIiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2YWxpZGF0b3JDbGFzcyIpOw0KLSAgICBkaWdlc3Rlci5hZGRCZWFuUHJvcGVydHlTZXR0ZXIoImZhY2VzLWNvbmZpZy92YWxpZGF0b3IvZGVzY3JpcHRpb24iKTsNCi0gICAgZGlnZXN0ZXIuYWRkU2V0TmV4dCgiZmFjZXMtY29uZmlnL3ZhbGlkYXRvciIsICJhZGRWYWxpZGF0b3IiLA0KLSAgICAgICAgICAgICAgICAgICAgICAgIFZhbGlkYXRvckJlYW4uY2xhc3MuZ2V0TmFtZSgpKTsNCi0NCi0gICAgLy8gZmFjZXMtY29uZmlnL3ZhbGlkYXRvci9wcm9wZXJ0eQ0KLSAgICBkaWdlc3Rlci5hZGRPYmplY3RDcmVhdGUoImZhY2VzLWNvbmZpZy92YWxpZGF0b3IvcHJvcGVydHkiLCBQcm9wZXJ0eUJlYW4uY2xhc3MpOw0KLSAgICBkaWdlc3Rlci5hZGRCZWFuUHJvcGVydHlTZXR0ZXIoImZhY2VzLWNvbmZpZy92YWxpZGF0b3IvcHJvcGVydHkvcHJvcGVydHktbmFtZSIsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHJvcGVydHlOYW1lIik7DQotICAgIGRpZ2VzdGVyLmFkZEJlYW5Qcm9wZXJ0eVNldHRlcigiZmFjZXMtY29uZmlnL3ZhbGlkYXRvci9wcm9wZXJ0eS9wcm9wZXJ0eS1jbGFzcyIsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHJvcGVydHlDbGFzcyIpOw0KLSAgICBkaWdlc3Rlci5hZGRCZWFuUHJvcGVydHlTZXR0ZXIoImZhY2VzLWNvbmZpZy92YWxpZGF0b3IvcHJvcGVydHkvZGVzY3JpcHRpb24iKTsNCi0gICAgZGlnZXN0ZXIuYWRkQmVhblByb3BlcnR5U2V0dGVyKCJmYWNlcy1jb25maWcvdmFsaWRhdG9yL3Byb3BlcnR5L2RlZmF1bHQtdmFsdWUiLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHRWYWx1ZSIpOw0KLSAgICBkaWdlc3Rlci5hZGRTZXROZXh0KCJmYWNlcy1jb25maWcvdmFsaWRhdG9yL3Byb3BlcnR5IiwgImFkZFByb3BlcnR5IiwNCi0gICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eUJlYW4uY2xhc3MuZ2V0TmFtZSgpKTsNCi0NCi0gICAgLy8gTWF2ZW4gRmFjZXMgUGx1Z2luDQotICAgIGRpZ2VzdGVyLnNldFJ1bGVOYW1lc3BhY2VVUkkoImh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvbWF2ZW4tZmFjZXMtcGx1Z2luIik7DQotDQotICAgIC8vIGZhY2VzLWNvbmZpZy92YWxpZGF0b3IvdmFsaWRhdG9yLWV4dGVuc2lvbg0KLSAgICBkaWdlc3Rlci5hZGRCZWFuUHJvcGVydHlTZXR0ZXIoImZhY2VzLWNvbmZpZy92YWxpZGF0b3IvdmFsaWRhdG9yLWV4dGVuc2lvbi9yb290LXZhbGlkYXRvci1pZCIsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicm9vdFZhbGlkYXRvcklkIik7DQotICAgIGRpZ2VzdGVyLmFkZEJlYW5Qcm9wZXJ0eVNldHRlcigiZmFjZXMtY29uZmlnL3ZhbGlkYXRvci92YWxpZGF0b3ItZXh0ZW5zaW9uL2xvbmctZGVzY3JpcHRpb24iLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxvbmdEZXNjcmlwdGlvbiIpOw0KLSAgICBkaWdlc3Rlci5hZGRCZWFuUHJvcGVydHlTZXR0ZXIoImZhY2VzLWNvbmZpZy92YWxpZGF0b3IvdmFsaWRhdG9yLWV4dGVuc2lvbi90YWctY2xhc3MiLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRhZ0NsYXNzIik7DQotICAgIGRpZ2VzdGVyLmFkZFJ1bGUoImZhY2VzLWNvbmZpZy92YWxpZGF0b3IvdmFsaWRhdG9yLWV4dGVuc2lvbi90YWctbmFtZSIsDQotICAgICAgICAgICAgICAgICAgICAgbmV3IEJlYW5Qcm9wZXJ0eVNldHRlclJ1bGUoInRhZ05hbWUiKSk7DQotICAgIGRpZ2VzdGVyLmFkZENhbGxNZXRob2QoImZhY2VzLWNvbmZpZy92YWxpZGF0b3IvdmFsaWRhdG9yLWV4dGVuc2lvbi90YWctY2xhc3MtbW9kaWZpZXIiLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJwYXJzZVRhZ0NsYXNzTW9kaWZpZXIiLCAxKTsNCi0gICAgZGlnZXN0ZXIuYWRkQ2FsbFBhcmFtKCJmYWNlcy1jb25maWcvdmFsaWRhdG9yL3ZhbGlkYXRvci1leHRlbnNpb24vdGFnLWNsYXNzLW1vZGlmaWVyIiwgMCk7DQotDQotICAgIC8vIGZhY2VzLWNvbmZpZy92YWxpZGF0b3IvdmFsaWRhdG9yLWV4dGVuc2lvbi9leGFtcGxlDQotICAgIGRpZ2VzdGVyLmFkZE9iamVjdENyZWF0ZSgiZmFjZXMtY29uZmlnL3ZhbGlkYXRvci92YWxpZGF0b3ItZXh0ZW5zaW9uL2V4YW1wbGUiLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhhbXBsZUJlYW4uY2xhc3MpOw0KLSAgICBkaWdlc3Rlci5hZGRCZWFuUHJvcGVydHlTZXR0ZXIoImZhY2VzLWNvbmZpZy92YWxpZGF0b3IvdmFsaWRhdG9yLWV4dGVuc2lvbi9leGFtcGxlL3NvdXJjZS1kZXNjcmlwdGlvbiIsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic291cmNlRGVzY3JpcHRpb24iKTsNCi0gICAgZGlnZXN0ZXIuYWRkQmVhblByb3BlcnR5U2V0dGVyKCJmYWNlcy1jb25maWcvdmFsaWRhdG9yL3ZhbGlkYXRvci1leHRlbnNpb24vZXhhbXBsZS9zb3VyY2UtY29kZSIsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic291cmNlQ29kZSIpOw0KLSAgICBkaWdlc3Rlci5hZGRTZXROZXh0KCJmYWNlcy1jb25maWcvdmFsaWRhdG9yL3ZhbGlkYXRvci1leHRlbnNpb24vZXhhbXBsZSIsDQotICAgICAgICAgICAgICAgICAgICAgICAgImFkZEV4YW1wbGUiLCBFeGFtcGxlQmVhbi5jbGFzcy5nZXROYW1lKCkpOw0KLQ0KLSAgICAvLyBmYWNlcy1jb25maWcvdmFsaWRhdG9yL3Byb3BlcnR5L3Byb3BlcnR5LWV4dGVuc2lvbg0KLSAgICBkaWdlc3Rlci5hZGRCZWFuUHJvcGVydHlTZXR0ZXIoImZhY2VzLWNvbmZpZy92YWxpZGF0b3IvcHJvcGVydHkvcHJvcGVydHktZXh0ZW5zaW9uL3RhZy1hdHRyaWJ1dGUtZXhjbHVkZWQiLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRhZ0F0dHJpYnV0ZUV4Y2x1ZGVkIik7DQotICAgIC8vIGZhY2VzLWNvbmZpZy92YWxpZGF0b3IvcHJvcGVydHkvcHJvcGVydHktZXh0ZW5zaW9uL3Byb3BlcnR5LW1ldGFkYQ0KLSAgICBkaWdlc3Rlci5hZGRCZWFuUHJvcGVydHlTZXR0ZXIoImZhY2VzLWNvbmZpZy92YWxpZGF0b3IvcHJvcGVydHkvcHJvcGVydHktZXh0ZW5zaW9uL3Byb3BlcnR5LW1ldGFkYXRhL3VzZS1tYXgtdGltZSIsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVzZU1heFRpbWUiKTsNCi0gIH0NCi0NCi0gIHByb3RlY3RlZCBzdGF0aWMgdm9pZCBhZGRSZW5kZXJLaXREaWdlc3RlclJ1bGVzKERpZ2VzdGVyIGRpZ2VzdGVyKQ0KLSAgew0KLSAgICAvLyBKYXZhIEVudGVycHJpc2UgNS4wDQotICAgIGRpZ2VzdGVyLnNldFJ1bGVOYW1lc3BhY2VVUkkoImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIpOw0KLQ0KLSAgICAvLyBmYWNlcy1jb25maWcvcmVuZGVyLWtpdA0KLSAgICBkaWdlc3Rlci5hZGRPYmplY3RDcmVhdGUoImZhY2VzLWNvbmZpZy9yZW5kZXIta2l0IiwgUmVuZGVyS2l0QmVhbi5jbGFzcyk7DQotICAgIGRpZ2VzdGVyLmFkZEJlYW5Qcm9wZXJ0eVNldHRlcigiZmFjZXMtY29uZmlnL3JlbmRlci1raXQvcmVuZGVyLWtpdC1pZCIsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmVuZGVyS2l0SWQiKTsNCi0gICAgZGlnZXN0ZXIuYWRkU2V0TmV4dCgiZmFjZXMtY29uZmlnL3JlbmRlci1raXQiLCAiYWRkUmVuZGVyS2l0IiwNCi0gICAgICAgICAgICAgICAgICAgICAgICBSZW5kZXJLaXRCZWFuLmNsYXNzLmdldE5hbWUoKSk7DQotDQotICAgIC8vIGZhY2VzLWNvbmZpZy9yZW5kZXIta2l0L3JlbmRlcmVyDQotICAgIGRpZ2VzdGVyLmFkZE9iamVjdENyZWF0ZSgiZmFjZXMtY29uZmlnL3JlbmRlci1raXQvcmVuZGVyZXIiLCBSZW5kZXJlckJlYW4uY2xhc3MpOw0KLSAgICBkaWdlc3Rlci5hZGRCZWFuUHJvcGVydHlTZXR0ZXIoImZhY2VzLWNvbmZpZy9yZW5kZXIta2l0L3JlbmRlcmVyL2Rlc2NyaXB0aW9uIik7DQotICAgIGRpZ2VzdGVyLmFkZEJlYW5Qcm9wZXJ0eVNldHRlcigiZmFjZXMtY29uZmlnL3JlbmRlci1raXQvcmVuZGVyZXIvY29tcG9uZW50LWZhbWlseSIsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29tcG9uZW50RmFtaWx5Iik7DQotICAgIGRpZ2VzdGVyLmFkZEJlYW5Qcm9wZXJ0eVNldHRlcigiZmFjZXMtY29uZmlnL3JlbmRlci1raXQvcmVuZGVyZXIvcmVuZGVyZXItdHlwZSIsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmVuZGVyZXJUeXBlIik7DQotICAgIGRpZ2VzdGVyLmFkZEJlYW5Qcm9wZXJ0eVNldHRlcigiZmFjZXMtY29uZmlnL3JlbmRlci1raXQvcmVuZGVyZXIvcmVuZGVyZXItY2xhc3MiLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlbmRlcmVyQ2xhc3MiKTsNCi0gICAgZGlnZXN0ZXIuYWRkU2V0TmV4dCgiZmFjZXMtY29uZmlnL3JlbmRlci1raXQvcmVuZGVyZXIiLCAiYWRkUmVuZGVyZXIiLA0KLSAgICAgICAgICAgICAgICAgICAgICAgIFJlbmRlcmVyQmVhbi5jbGFzcy5nZXROYW1lKCkpOw0KLQ0KLSAgICAvLyBNYXZlbiBGYWNlcyBQbHVnaW4NCi0gICAgZGlnZXN0ZXIuc2V0UnVsZU5hbWVzcGFjZVVSSSgiaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9tYXZlbi1mYWNlcy1wbHVnaW4iKTsNCi0NCi0gICAgLy8gZmFjZXMtY29uZmlnL3JlbmRlci1raXQvcmVuZGVyZXIvcmVuZGVyZXItZXh0ZW5zaW9uDQotICAgIGRpZ2VzdGVyLmFkZEJlYW5Qcm9wZXJ0eVNldHRlcigiZmFjZXMtY29uZmlnL3JlbmRlci1raXQvcmVuZGVyZXIvcmVuZGVyZXItZXh0ZW5zaW9uL2NvbXBvbmVudC10eXBlIiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb21wb25lbnRUeXBlIik7DQotICAgIGRpZ2VzdGVyLmFkZEJlYW5Qcm9wZXJ0eVNldHRlcigiZmFjZXMtY29uZmlnL3JlbmRlci1raXQvcmVuZGVyZXIvcmVuZGVyZXItZXh0ZW5zaW9uL3JlbmRlcmVyLXN1cGVyY2xhc3MiLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlbmRlcmVyU3VwZXJjbGFzcyIpOw0KLSAgfQ0KLQ0KLSAgcHJvdGVjdGVkIHN0YXRpYyB2b2lkIGFkZEV2ZW50RGlnZXN0ZXJSdWxlcyhEaWdlc3RlciBkaWdlc3RlcikNCi0gIHsNCi0gICAgLy8gSmF2YSBFbnRlcnByaXNlIDUuMA0KLSAgICAvLyBkaWdlc3Rlci5zZXRSdWxlTmFtZXNwYWNlVVJJKCJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiKTsNCi0NCi0gICAgLy8gTWF2ZW4gRmFjZXMgUGx1Z2luDQotICAgIGRpZ2VzdGVyLnNldFJ1bGVOYW1lc3BhY2VVUkkoImh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvbWF2ZW4tZmFjZXMtcGx1Z2luIik7DQotDQotICAgIC8vIGZhY2VzLWNvbmZpZy9mYWNlcy1jb25maWctZXh0ZW5zaW9uL2V2ZW50DQotICAgIGRpZ2VzdGVyLmFkZE9iamVjdENyZWF0ZSgiZmFjZXMtY29uZmlnL2ZhY2VzLWNvbmZpZy1leHRlbnNpb24vZXZlbnQiLCBFdmVudEJlYW4uY2xhc3MpOw0KLSAgICBkaWdlc3Rlci5hZGRCZWFuUHJvcGVydHlTZXR0ZXIoImZhY2VzLWNvbmZpZy9mYWNlcy1jb25maWctZXh0ZW5zaW9uL2V2ZW50L2Rlc2NyaXB0aW9uIik7DQotICAgIGRpZ2VzdGVyLmFkZEJlYW5Qcm9wZXJ0eVNldHRlcigiZmFjZXMtY29uZmlnL2ZhY2VzLWNvbmZpZy1leHRlbnNpb24vZXZlbnQvZXZlbnQtdHlwZSIsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXZlbnRUeXBlIik7DQotICAgIGRpZ2VzdGVyLmFkZEJlYW5Qcm9wZXJ0eVNldHRlcigiZmFjZXMtY29uZmlnL2ZhY2VzLWNvbmZpZy1leHRlbnNpb24vZXZlbnQvZXZlbnQtY2xhc3MiLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImV2ZW50Q2xhc3MiKTsNCi0gICAgZGlnZXN0ZXIuYWRkQmVhblByb3BlcnR5U2V0dGVyKCJmYWNlcy1jb25maWcvZmFjZXMtY29uZmlnLWV4dGVuc2lvbi9ldmVudC9ldmVudC1saXN0ZW5lci1jbGFzcyIsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXZlbnRMaXN0ZW5lckNsYXNzIik7DQotICAgIGRpZ2VzdGVyLmFkZEJlYW5Qcm9wZXJ0eVNldHRlcigiZmFjZXMtY29uZmlnL2ZhY2VzLWNvbmZpZy1leHRlbnNpb24vZXZlbnQvZXZlbnQtc291cmNlLWludGVyZmFjZSIsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXZlbnRTb3VyY2VJbnRlcmZhY2UiKTsNCi0gICAgZGlnZXN0ZXIuYWRkU2V0TmV4dCgiZmFjZXMtY29uZmlnL2ZhY2VzLWNvbmZpZy1leHRlbnNpb24vZXZlbnQiLCAiYWRkRXZlbnQiLA0KLSAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50QmVhbi5jbGFzcy5nZXROYW1lKCkpOw0KLSAgfQ0KLQ0KLSAgcHJvdGVjdGVkIERpZ2VzdGVyIGNyZWF0ZURpZ2VzdGVyKCkgdGhyb3dzIFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24sIFNBWEV4Y2VwdGlvbg0KLSAgew0KLSAgICBEaWdlc3RlciBkaWdlc3RlciA9IGNyZWF0ZUVtcHR5RGlnZXN0ZXIoKTsNCi0NCi0gICAgYWRkQ29tcG9uZW50RGlnZXN0ZXJSdWxlcyhkaWdlc3RlciwgdHJ1ZSk7DQotDQotICAgLy9kaWdlc3Rlci5hZGRPYmplY3RDcmVhdGUoImZhY2VzLWNvbmZpZyIsIEZhY2VzQ29uZmlnQmVhbi5jbGFzcyk7DQotDQotICAgIGFkZENvbnZlcnRlckRpZ2VzdGVyUnVsZXMoZGlnZXN0ZXIpOw0KLSAgICBhZGRWYWxpZGF0b3JEaWdlc3RlclJ1bGVzKGRpZ2VzdGVyKTsNCi0gICAgYWRkUmVuZGVyS2l0RGlnZXN0ZXJSdWxlcyhkaWdlc3Rlcik7DQotICAgIGFkZEV2ZW50RGlnZXN0ZXJSdWxlcyhkaWdlc3Rlcik7DQotDQotICAgIC8vIFRCRDogSlNSLTI3NiBtZXRhZGF0YSAoYXNrIEplZmYgU3RlcGhlbnNvbikNCi0NCi0gICAgcmV0dXJuIGRpZ2VzdGVyOw0KLSAgfQ0KLQ0KLSAgLy8gQmFzZSBjbGFzcyBmb3IgaW5jbHVkZSBmYWN0b3JpZXMNCi0gIGFic3RyYWN0IHN0YXRpYyBwdWJsaWMgY2xhc3MgQWJzdHJhY3RJbmNsdWRlRmFjdG9yeSBleHRlbmRzIEFic3RyYWN0T2JqZWN0Q3JlYXRpb25GYWN0b3J5DQotICB7DQotICAgIHB1YmxpYyBPYmplY3QgY3JlYXRlT2JqZWN0KA0KLSAgICAgIEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgU3RyaW5nIGhyZWYgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCJocmVmIik7DQotICAgICAgaWYgKGhyZWYgPT0gbnVsbCkNCi0gICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIk1pc3NpbmcgaHJlZiBhdHRyaWJ1dGUiKTsNCi0NCi0gICAgICBVUkwgbWFzdGVyID0gKFVSTClkaWdlc3Rlci5nZXRSb290KCk7DQotICAgICAgVVJMIGluY2x1ZGVkID0gbmV3IFVSTChtYXN0ZXIsIGhyZWYpOw0KLQ0KLSAgICAgIERpZ2VzdGVyIGluY2x1ZGVkRGlnZXN0ZXIgPSBjcmVhdGVFbXB0eURpZ2VzdGVyKCk7DQotICAgICAgYWRkRGlnZXN0ZXJSdWxlcyhpbmNsdWRlZERpZ2VzdGVyKTsNCi0gICAgICBpbmNsdWRlZERpZ2VzdGVyLnB1c2goaW5jbHVkZWQpOw0KLSAgICAgIGluY2x1ZGVkRGlnZXN0ZXIucHVzaChkaWdlc3Rlci5wZWVrKCkpOw0KLQ0KLSAgICAgIFVSTENvbm5lY3Rpb24gY29ubiA9IGluY2x1ZGVkLm9wZW5Db25uZWN0aW9uKCk7DQotICAgICAgSW5wdXRTdHJlYW0gaXMgPSBjb25uLmdldElucHV0U3RyZWFtKCk7DQotICAgICAgaW5jbHVkZWREaWdlc3Rlci5wYXJzZShpcyk7DQotICAgICAgaXMuY2xvc2UoKTsNCi0NCi0gICAgICAvLyBXZSBkb24ndCByZWFsbHkgd2FudCB0aGUgaW5jbHVkZWQgb2JqZWN0IC0gYnV0IHJldHVybiBpdCBhbnl3YXkNCi0gICAgICByZXR1cm4gaW5jbHVkZWQ7DQotICAgIH0NCi0NCi0gICAgYWJzdHJhY3QgcHVibGljIHZvaWQgYWRkRGlnZXN0ZXJSdWxlcyhEaWdlc3RlciBpbmNsdWRlZERpZ2VzdGVyKTsNCi0gIH0NCi0NCi0gIC8vIEZhY3RvcnkgZm9yIGNvbXBvbmVudCBpbmNsdWRlcw0KLSAgc3RhdGljIHB1YmxpYyBjbGFzcyBDb21wb25lbnRJbmNsdWRlRmFjdG9yeSBleHRlbmRzIEFic3RyYWN0SW5jbHVkZUZhY3RvcnkNCi0gIHsNCi0gICAgcHVibGljIHZvaWQgYWRkRGlnZXN0ZXJSdWxlcyhEaWdlc3RlciBkaWdlc3Rlcikgew0KLSAgICAgIGFkZENvbXBvbmVudERpZ2VzdGVyUnVsZXMoZGlnZXN0ZXIsIGZhbHNlKTsNCi0gICAgfQ0KLSAgfQ0KLQ0KLSAgLy8gRmFjdG9yeSBmb3IgY29tcG9uZW50IHByb3BlcnR5IGluY2x1ZGVzDQotICBzdGF0aWMgcHVibGljIGNsYXNzIENvbXBvbmVudFByb3BlcnR5SW5jbHVkZUZhY3RvcnkgZXh0ZW5kcyBBYnN0cmFjdEluY2x1ZGVGYWN0b3J5DQotICB7DQotICAgIHB1YmxpYyB2b2lkIGFkZERpZ2VzdGVyUnVsZXMoRGlnZXN0ZXIgZGlnZXN0ZXIpIHsNCi0gICAgICBhZGRDb21wb25lbnRQcm9wZXJ0eURpZ2VzdGVyUnVsZXMoZGlnZXN0ZXIpOw0KLSAgICB9DQotICB9DQotDQotfQ0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvdHJpbmlkYWQvcGFyc2UvRmFjZXRCZWFuLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL3RyaW5pZGFkL3BhcnNlL0ZhY2V0QmVhbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YzJiNTgwLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvdHJpbmlkYWQvcGFyc2UvRmFjZXRCZWFuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTggKzAsMCBAQAotLyoNCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqIA0KLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKiANCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmJ1aWxkZXIudHJpbmlkYWQucGFyc2U7DQotDQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7DQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotDQotLyoqDQotICogRmFjZXRCZWFuIGlzIGEgSmF2YSByZXByZXNlbnRhdGlvbiBvZiB0aGUgZmFjZXMtY29uZmlnIGNvbXBvbmVudCBvcg0KLSAqIHJlbmRlcmVyIGZhY2V0IFhNTCBlbGVtZW50Lg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBGYWNldEJlYW4gZXh0ZW5kcyBPYmplY3RCZWFuDQotew0KLSAgLyoqDQotICAgKiBTZXRzIHRoZSBmYWNldCBuYW1lIGZvciB0aGlzIGZhY2V0Lg0KLSAgICoNCi0gICAqIEBwYXJhbSBmYWNldE5hbWUgIHRoZSBmYWNldCBuYW1lDQotICAgKi8NCi0gIHB1YmxpYyB2b2lkIHNldEZhY2V0TmFtZSgNCi0gICAgU3RyaW5nIGZhY2V0TmFtZSkNCi0gIHsNCi0gICAgX2ZhY2V0TmFtZSA9IGZhY2V0TmFtZTsNCi0gIH0NCi0NCi0gIC8qKg0KLSAgICogUmV0dXJucyB0aGUgZmFjZXQgbmFtZSBmb3IgdGhpcyBmYWNldC4NCi0gICAqDQotICAgKiBAcmV0dXJuICB0aGUgZmFjZXQgbmFtZQ0KLSAgICovDQotICBwdWJsaWMgU3RyaW5nIGdldEZhY2V0TmFtZSgpDQotICB7DQotICAgIHJldHVybiBfZmFjZXROYW1lOw0KLSAgfQ0KLQ0KLSAgLyoqDQotICAgKiBTZXRzIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGlzIHByb3BlcnR5Lg0KLSAgICoNCi0gICAqIEBwYXJhbSBkZXNjcmlwdGlvbiAgdGhlIHByb3BlcnR5IGRlc2NyaXB0aW9uDQotICAgKi8NCi0gIHB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKA0KLSAgICBTdHJpbmcgZGVzY3JpcHRpb24pDQotICB7DQotICAgIF9kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOw0KLSAgfQ0KLQ0KLSAgLyoqDQotICAgKiBSZXR1cm5zIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGlzIHByb3BlcnR5Lg0KLSAgICoNCi0gICAqIEByZXR1cm4gIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdGlvbg0KLSAgICovDQotICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkNCi0gIHsNCi0gICAgcmV0dXJuIF9kZXNjcmlwdGlvbjsNCi0gIH0NCi0NCi0gIC8qKg0KLSAgICogU2V0cyB0aGUgcmVxdWlyZWQgZmxhZyBvZiB0aGlzIGZhY2V0Lg0KLSAgICoNCi0gICAqIEBwYXJhbSByZXF1aXJlZCAgdGhlIGZhY2V0IHJlcXVpcmVkIGZsYWcNCi0gICAqLw0KLSAgcHVibGljIHZvaWQgc2V0UmVxdWlyZWQoDQotICAgIGJvb2xlYW4gcmVxdWlyZWQpDQotICB7DQotICAgIF9yZXF1aXJlZCA9IHJlcXVpcmVkOw0KLSAgfQ0KLQ0KLSAgLyoqDQotICAgKiBSZXR1cm5zIHJlcXVpcmVkIGZsYWcgb2YgdGhpcyBmYWNldC4NCi0gICAqDQotICAgKiBAcmV0dXJuICB0aGUgZmFjZXQgcmVxdWlyZWQgZmxhZw0KLSAgICovDQotICBwdWJsaWMgYm9vbGVhbiBpc1JlcXVpcmVkKCkNCi0gIHsNCi0gICAgcmV0dXJuIF9yZXF1aXJlZDsNCi0gIH0NCi0NCi0gIC8qKg0KLSAgICogSWYgdGhlIGZhY2V0IHNob3VsZCBiZSBoaWRkZW4gZnJvbSBkb2N1bWVudGF0aW9uDQotICAgKiBAcmV0dXJuIElmIHRoZSBmYWNldCBzaG91bGQgYmUgaGlkZGVuDQotICAgKi8NCi0gIHB1YmxpYyBib29sZWFuIGlzSGlkZGVuKCkNCi0gIHsNCi0gICAgcmV0dXJuIF9oaWRkZW47DQotICB9ICANCi0NCi0gIC8qKg0KLSAgICogU2V0IGlmIHRoaXMgZmFjZXQgc2hvdWxkIGJlIGhpZGRlbiBmcm9tIGRvY3VtZW50YXRpb24NCi0gICAqIEBwYXJhbSBoaWRkZW4gSWYgdGhlIGZhY2V0IHNob3VsZCBiZSBoaWRkZW4NCi0gICAqLw0KLSAgcHVibGljIHZvaWQgc2V0SGlkZGVuKGJvb2xlYW4gaGlkZGVuKQ0KLSAgew0KLSAgICB0aGlzLl9oaWRkZW4gPSBoaWRkZW47DQotICB9DQotIA0KLSAgLyoqDQotICAgKiBBZGRzIGFuIEFjY2Vzc2liaWxpdHkgKGUuZy4gc2VjdGlvbiA1MDggY29tcGxpYW5jZSkgR3VpZGVsaW5lIHRvIHRoaXMgZmFjZXQuIFRoZQ0KLSAgICogYWNjZXNzaWJpbGl0eSBndWlkZWxpbmVzIGFyZSB1c2VkIGR1cmluZyB0YWcgZG9jIGdlbmVyYXRpb24gdG8gZ2l2ZSB0aGUgYXBwbGljYXRpb24NCi0gICAqIGRldmVsb3BlciBoaW50cyBvbiBob3cgdG8gY29uZmlndXJlIHRoZSBmYWNldCB0byBiZSBhY2Nlc3NpYmlsaXR5LWNvbXBsaWFudC4NCi0gICAqDQotICAgKiBAcGFyYW0gYWNjR3VpZGVsaW5lcyAgdGhlIGFjY2Vzc2liaWxpdHkgZ3VpZGVsaW5lIHRvIGFkZA0KLSAgICovDQotICBwdWJsaWMgdm9pZCBhZGRBY2Nlc3NpYmlsaXR5R3VpZGVsaW5lKA0KLSAgICBTdHJpbmcgYWNjZXNzaWJpbGl0eUd1aWRlbGluZSkNCi0gIHsNCi0gICAgX2FjY2Vzc2liaWxpdHlHdWlkZWxpbmVzLmFkZChhY2Nlc3NpYmlsaXR5R3VpZGVsaW5lKTsgICAgICAgDQotICB9DQotDQotICAvKioNCi0gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGNvbXBvbmVudCBoYXMgYW55IGFjY2Vzc2liaWxpdHkgZ3VpZGVsaW5lcy4NCi0gICAqDQotICAgKiBAcmV0dXJuICB0cnVlICAgaWYgdGhpcyBjb21wb25lbnQgaGFzIGFueSBhY2Nlc3NpYmlsaXR5IGd1aWRlbGluZXMsDQotICAgKiAgICAgICAgICBmYWxzZSAgb3RoZXJ3aXNlDQotICAgKi8NCi0gIHB1YmxpYyBib29sZWFuIGhhc0FjY2Vzc2liaWxpdHlHdWlkZWxpbmVzKCkNCi0gIHsNCi0gICAgcmV0dXJuICFfYWNjZXNzaWJpbGl0eUd1aWRlbGluZXMuaXNFbXB0eSgpOw0KLSAgfQ0KLQ0KLSAgLyoqDQotICAgKiBSZXR1cm5zIGFuIGl0ZXJhdG9yIGZvciBhbGwgYWNjZXNzaWJpbGl0eSBndWlkZWxpbmVzIG9uIHRoaXMgY29tcG9uZW50IG9ubHkuDQotICAgKg0KLSAgICogQHJldHVybiAgdGhlIGFjY2Vzc2liaWxpdHkgZ3VpZGVsaW5lcyBpdGVyYXRvcg0KLSAgICovDQotICBwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBhY2Nlc3NpYmlsaXR5R3VpZGVsaW5lcygpDQotICB7DQotICAgIHJldHVybiBfYWNjZXNzaWJpbGl0eUd1aWRlbGluZXMuaXRlcmF0b3IoKTsNCi0gIH0NCi0NCi0gIC8qKg0KLSAgICogUGFyc2VzIHRoZSBzdHJpbmcgb2YgYWxsb3dlZCBjaGlsZCBjbGFzcyBuYW1lcyBpbnRvIGEgU3RyaW5nIGFycmF5DQotICAgKiB1c2luZyBzcGFjZSBhcyB0aGUgc2VwYXJhdG9yIGJldHdlZW4gdmFsdWVzLg0KLSAgICogSW4gdGhlIGNvbXBvbmVudCBtZXRhZGF0YSBmaWxlLCB0aGUgYWxsb3dlZCBjaGlsZCBjb21wb25lbnRzDQotICAgKiBhcmUgZGVub3RlZCB3aXRoIGFsbG93ZWQtY2hpbGQtY29tcG9uZW50cyBtYXJrdXAuICBBcyBhbiBleGFtcGxlLA0KLSAgICogb3JhY2xlLmFkZi5SaWNoTWVudSBpcyBhbiBhbGxvd2VkIGNoaWxkIGNvbXBvbmVudCBvZiANCi0gICAqIGFmOnBhbmVsQ29sbGVjdGlvbidzIChvcmFjbGUuYWRmLnZpZXcucmljaC5jb21wb25lbnQucmljaC5vdXRwdXQuUmljaFBhbmVsQ29sbGVjdGlvbikgDQotICAgKiBtZW51IGZhY2V0LiBUaGUgYWxsb3dlZCBjaGlsZCBjb21wb25lbnRzIG9mIG9uZSBjb21wb25lbnQgYXJlIG1hdGNoZWQgd2l0aCB0aGUNCi0gICAqIGNvbXBvbmVudCB0eXBlIGF0dHJpYnV0ZSBvZiBvdGhlciBjb21wb25lbnRzIHRvIGRldGVybWluZSB3aGljaCBjaGlsZCB0YWdzDQotICAgKiBhcmUgYWxsb3dlZCBpbiB0aGUgY29tcG9uZW50IGhpZXJhcmNoeS4NCi0gICAqDQotICAgKiBAcGFyYW0gYWxsb3dlZENoaWxkQ29tcG9uZW50cyAgYSBzcGFjZSBkZWxpbWl0ZWQgc3RyaW5nIG9mIGFsbG93ZWQgY2hpbGQgY29tcG9uZW50IGNsYXNzIG5hbWVzDQotICAgKi8NCi0gIHB1YmxpYyB2b2lkIHBhcnNlQWxsb3dlZENoaWxkQ29tcG9uZW50cygNCi0gICAgU3RyaW5nIGFsbG93ZWRDaGlsZENvbXBvbmVudHMpDQotICB7DQotICAgIHNldEFsbG93ZWRDaGlsZENvbXBvbmVudHMoYWxsb3dlZENoaWxkQ29tcG9uZW50cy5zcGxpdCgiICIpKTsNCi0gIH0NCi0NCi0gIC8qKg0KLSAgICogU2V0cyB0aGUgcG9zc2libGUgdmFsdWVzIGZvciB0aGlzIHByb3BlcnR5Lg0KLSAgICogSW4gdGhlIGNvbXBvbmVudCBtZXRhZGF0YSBmaWxlLCB0aGUgYWxsb3dlZCBjaGlsZCBjb21wb25lbnRzDQotICAgKiBhcmUgZGVub3RlZCB3aXRoIGFsbG93ZWQtY2hpbGQtY29tcG9uZW50cyBtYXJrdXAuICBBcyBhbiBleGFtcGxlLA0KLSAgICogb3JhY2xlLmFkZi5SaWNoTWVudSBpcyBhbiBhbGxvd2VkIGNoaWxkIGNvbXBvbmVudCBvZiANCi0gICAqIGFmOnBhbmVsQ29sbGVjdGlvbidzIChvcmFjbGUuYWRmLnZpZXcucmljaC5jb21wb25lbnQucmljaC5vdXRwdXQuUmljaFBhbmVsQ29sbGVjdGlvbikNCi0gICAqIG1lbnUgZmFjZXQuIFRoZSBhbGxvd2VkIGNoaWxkIGNvbXBvbmVudHMgb2Ygb25lIGNvbXBvbmVudCBhcmUgbWF0Y2hlZCB3aXRoIHRoZQ0KLSAgICogY29tcG9uZW50IHR5cGUgYXR0cmlidXRlIG9mIG90aGVyIGNvbXBvbmVudHMgdG8gZGV0ZXJtaW5lIHdoaWNoIGNoaWxkIHRhZ3MNCi0gICAqIGFyZSBhbGxvd2VkIGluIHRoZSBjb21wb25lbnQgaGllcmFyY2h5Lg0KLSAgICoNCi0gICAqIEBwYXJhbSBhbGxvd2VkQ2hpbGRDb21wb25lbnRzICBhIHN0cmluZyBhcnJheSBvZiB0aGUgYWxsb3dlZCBjaGlsZCBjb21wb25lbnQgY2xhc3MgbmFtZXMNCi0gICAqLw0KLSAgcHVibGljIHZvaWQgc2V0QWxsb3dlZENoaWxkQ29tcG9uZW50cygNCi0gICAgU3RyaW5nW10gYWxsb3dlZENoaWxkQ29tcG9uZW50cykNCi0gIHsNCi0gICAgX2FsbG93ZWRDaGlsZENvbXBvbmVudHMgPSBBcnJheXMuYXNMaXN0KGFsbG93ZWRDaGlsZENvbXBvbmVudHMpOw0KLSAgfQ0KLQ0KLSAgLyoqDQotICAgKiBSZXR1cm5zIHRoZSBhbGxvd2VkIGNoaWxkIGNvbXBvbmVudHMgZm9yIHRoaXMgZmFjZXQuDQotICAgKiBJbiB0aGUgY29tcG9uZW50IG1ldGFkYXRhIGZpbGUsIHRoZSBhbGxvd2VkIGNoaWxkIGNvbXBvbmVudHMNCi0gICAqIGFyZSBkZW5vdGVkIHdpdGggYWxsb3dlZC1jaGlsZC1jb21wb25lbnRzIG1hcmt1cC4gIEFzIGFuIGV4YW1wbGUsDQotICAgKiBvcmFjbGUuYWRmLlJpY2hNZW51IGlzIGFuIGFsbG93ZWQgY2hpbGQgY29tcG9uZW50IG9mIA0KLSAgICogYWY6cGFuZWxDb2xsZWN0aW9uJ3MgKG9yYWNsZS5hZGYudmlldy5yaWNoLmNvbXBvbmVudC5yaWNoLm91dHB1dC5SaWNoUGFuZWxDb2xsZWN0aW9uKQ0KLSAgICogbWVudSBmYWNldC4gVGhlIGFsbG93ZWQgY2hpbGQgY29tcG9uZW50cyBvZiBvbmUgY29tcG9uZW50IGFyZSBtYXRjaGVkIHdpdGggdGhlDQotICAgKiBjb21wb25lbnQgdHlwZSBhdHRyaWJ1dGUgb2Ygb3RoZXIgY29tcG9uZW50cyB0byBkZXRlcm1pbmUgd2hpY2ggY2hpbGQgdGFncw0KLSAgICogYXJlIGFsbG93ZWQgaW4gdGhlIGNvbXBvbmVudCBoaWVyYXJjaHkuDQotICAgKiANCi0gICAqIEByZXR1cm4gIGFuIGl0ZXJhdG9yIG9mIGFsbG93ZWQgY2hpbGQgY29tcG9uZW50IGNsYXNzIG5hbWUgc3RyaW5ncw0KLSAgICovDQotICBwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBhbGxvd2VkQ2hpbGRDb21wb25lbnRzKCkNCi0gIHsNCi0gICAgcmV0dXJuIChfYWxsb3dlZENoaWxkQ29tcG9uZW50cy5pdGVyYXRvcigpKTsNCi0gIH0gIA0KLQ0KLSAgLyoqDQotICAgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBjb21wb25lbnQgaGFzIGFueSBhbGxvd2VkIGNoaWxkIGNvbXBvbmVudHMuDQotICAgKg0KLSAgICogQHJldHVybiAgdHJ1ZSAgIGlmIHRoaXMgY29tcG9uZW50IGhhcyBhbnkgYWxsb3dlZCBjaGlsZCBjb21wb25lbnRzLA0KLSAgICogICAgICAgICAgZmFsc2UgIG90aGVyd2lzZQ0KLSAgICovDQotICBwdWJsaWMgYm9vbGVhbiBoYXNBbGxvd2VkQ2hpbGRDb21wb25lbnRzKCkNCi0gIHsNCi0gICAgcmV0dXJuICghX2FsbG93ZWRDaGlsZENvbXBvbmVudHMuaXNFbXB0eSgpKTsNCi0gIH0NCi0NCi0gIHByaXZhdGUgU3RyaW5nICAgICAgIF9kZXNjcmlwdGlvbjsNCi0gIHByaXZhdGUgU3RyaW5nICAgICAgIF9mYWNldE5hbWU7DQotICBwcml2YXRlIGJvb2xlYW4gICAgICBfcmVxdWlyZWQ7DQotICBwcml2YXRlIGJvb2xlYW4gICAgICBfaGlkZGVuOw0KLSAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gX2FjY2Vzc2liaWxpdHlHdWlkZWxpbmVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7DQotICBwcml2YXRlIExpc3Q8U3RyaW5nPiBfYWxsb3dlZENoaWxkQ29tcG9uZW50cyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOw0KLX0NCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL3RyaW5pZGFkL3BhcnNlL01ldGhvZFNpZ25hdHVyZUJlYW4uamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvdHJpbmlkYWQvcGFyc2UvTWV0aG9kU2lnbmF0dXJlQmVhbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjJhODczLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvdHJpbmlkYWQvcGFyc2UvTWV0aG9kU2lnbmF0dXJlQmVhbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoNCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqIA0KLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKiANCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmJ1aWxkZXIudHJpbmlkYWQucGFyc2U7DQotDQotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi0NCi0vKioNCi0gKiBNZXRob2RTaWduYXR1cmVCZWFuIGlzIGEgSmF2YSByZXByZXNlbnRhdGlvbiBvZiB0aGUgZmFjZXMtY29uZmlnIGNvbXBvbmVudA0KLSAqIHByb3BlcnR5LWV4dGVuc2lvbiBtZXRob2Qtc2lnbmF0dXJlIFhNTCBlbGVtZW50Lg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBNZXRob2RTaWduYXR1cmVCZWFuIGV4dGVuZHMgT2JqZWN0QmVhbg0KLXsNCi0gIC8qKg0KLSAgICogQ3JlYXRlcyBhIG5ldyBNZXRob2RTaWduYXR1cmVCZWFuLg0KLSAgICovDQotICBwdWJsaWMgTWV0aG9kU2lnbmF0dXJlQmVhbigpDQotICB7DQotICAgIF9wYXJhbWV0ZXJUeXBlcyA9IG5ldyBMaW5rZWRMaXN0KCk7DQotICB9DQotDQotICAvKioNCi0gICAqIEFkZHMgYSBuZXcgcGFyYW1ldGVyIHR5cGUgdG8gdGhpcyBtZXRob2Qgc2lnbmF0dXJlLg0KLSAgICoNCi0gICAqIEBwYXJhbSBwYXJhbWV0ZXJUeXBlICB0aGUgcGFyYW1ldGVyIHR5cGUNCi0gICAqLw0KLSAgcHVibGljIHZvaWQgYWRkUGFyYW1ldGVyVHlwZSgNCi0gICAgU3RyaW5nIHBhcmFtZXRlclR5cGUpDQotICB7DQotICAgIF9wYXJhbWV0ZXJUeXBlcy5hZGQocGFyYW1ldGVyVHlwZSk7DQotICB9DQotDQotICAvKioNCi0gICAqIFJldHVybnMgdGhlIGxpc3Qgb2YgcGFyYW1ldGVyIHR5cGVzIGFzIGFuIGFycmF5Lg0KLSAgICoNCi0gICAqIEByZXR1cm4gIHRoZSBwYXJhbWV0ZXIgdHlwZSBsaXN0DQotICAgKi8NCi0gIHB1YmxpYyBTdHJpbmdbXSBnZXRQYXJhbWV0ZXJUeXBlcygpDQotICB7DQotICAgIHJldHVybiAoU3RyaW5nW10pX3BhcmFtZXRlclR5cGVzLnRvQXJyYXkobmV3IFN0cmluZ1swXSk7DQotICB9DQotDQotICAvKioNCi0gICAqIFNldHMgdGhlIHJldHVybiB0eXBlIG9mIHRoaXMgbWV0aG9kIHNpZ25hdHVyZS4NCi0gICAqDQotICAgKiBAcGFyYW0gcmV0dXJuVHlwZSAgdGhlIG1ldGhvZCBzaWduYXR1cmUgcmV0dXJuIHR5cGUNCi0gICAqLw0KLSAgcHVibGljIHZvaWQgc2V0UmV0dXJuVHlwZSgNCi0gICAgU3RyaW5nIHJldHVyblR5cGUpDQotICB7DQotICAgIF9yZXR1cm5UeXBlID0gcmV0dXJuVHlwZTsNCi0gIH0NCi0NCi0gIC8qKg0KLSAgICogUmV0dXJucyB0aGUgcmV0dXJuIHR5cGUgb2YgdGhpcyBtZXRob2Qgc2lnbmF0dXJlLg0KLSAgICoNCi0gICAqIEByZXR1cm4gIHRoZSBtZXRob2Qgc2lnbmF0dXJlIHJldHVybiB0eXBlDQotICAgKi8NCi0gIHB1YmxpYyBTdHJpbmcgZ2V0UmV0dXJuVHlwZSgpDQotICB7DQotICAgIHJldHVybiBfcmV0dXJuVHlwZTsNCi0gIH0NCi0NCi0gIHByaXZhdGUgU3RyaW5nIF9yZXR1cm5UeXBlOw0KLSAgcHJpdmF0ZSBMaXN0ICAgX3BhcmFtZXRlclR5cGVzOw0KLX0NCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL3RyaW5pZGFkL3BhcnNlL09iamVjdEJlYW4uamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvdHJpbmlkYWQvcGFyc2UvT2JqZWN0QmVhbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MjY1ZDhlLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvdHJpbmlkYWQvcGFyc2UvT2JqZWN0QmVhbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyoNCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqIA0KLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKiANCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmJ1aWxkZXIudHJpbmlkYWQucGFyc2U7DQotDQotLyoqDQotICogT2JqZWN0QmVhbiBpcyB0aGUgYmFzZSBjbGFzcyBmb3IgYWxsIHBhcnNlZCBiZWFucy4NCi0gKi8NCi1wdWJsaWMgY2xhc3MgT2JqZWN0QmVhbg0KLXsNCi0gIC8qKg0KLSAgICogQ3JlYXRlcyBhIG5ldyBPYmplY3RCZWFuLg0KLSAgICovDQotICBwdWJsaWMgT2JqZWN0QmVhbigpDQotICB7DQotICB9DQotDQotICAvKioNCi0gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGZhY2VzIGNvbmZpZyBkb2N1bWVudCBoYXMgYmVlbiBtb2RpZmllZCBzaW5jZQ0KLSAgICogdGhlIHNwZWNpZmllZCB0aW1lc3RhbXAuDQotICAgKg0KLSAgICogQHBhcmFtIHRpbWVzdGFtcCAgdGhlIHRpbWVzdGFtcCBpbiBVVEMgbWlsbGlzDQotICAgKg0KLSAgICogQHJldHVybiB0cnVlICBpZiB0aGlzIGZhY2VzIGNvbmZpZyBkb2N1bWVudCBoYXMgYmVlbiBtb2RpZmllZCwNCi0gICAqICAgICAgICAgb3RoZXJ3aXNlIGZhbHNlDQotICAgKi8NCi0gIHB1YmxpYyBib29sZWFuIGlzTW9kaWZpZWRTaW5jZSgNCi0gICAgbG9uZyB0aW1lc3RhbXApDQotICB7DQotICAgIHJldHVybiAoX2xhc3RNb2RpZmllZCA+IHRpbWVzdGFtcCk7DQotICB9DQotDQotICBwcm90ZWN0ZWQgRmFjZXNDb25maWdCZWFuIGdldE93bmVyKCkNCi0gIHsNCi0gICAgcmV0dXJuIF9vd25lcjsNCi0gIH0NCi0NCi0gIC8qKg0KLSAgICogQXR0YWNoZXMgdGhlIG9iamVjdC4NCi0gICAqDQotICAgKiBAcGFyYW0gb3duZXIgIHRoZSBmYWNlcyBjb25maWcgb3duZXINCi0gICAqLw0KLSAgcHJvdGVjdGVkIHZvaWQgYXR0YWNoKA0KLSAgICBGYWNlc0NvbmZpZ0JlYW4gb3duZXIpDQotICB7DQotICAgIF9vd25lciA9IG93bmVyOw0KLSAgICBPYmplY3RCZWFuIG9iamVjdCA9IG93bmVyOw0KLSAgICB0b3VjaChvYmplY3QuX2xhc3RNb2RpZmllZCk7DQotICB9DQotDQotICAvKioNCi0gICAqIFNldHMgdGhlIGxhc3QgbW9kaWZpZWQgdGltZXN0YW1wIGZvciB0aGUgcGFyc2VkIGZhY2VzIGNvbmZpZyBkb2N1bWVudA0KLSAgICogaWYgaXQgaXMgbmV3ZXIgdGhhbiB0aGUgZXhpc3RpbmcgbGFzdCBtb2RpZmllZCB0aW1lc3RhbXAuDQotICAgKg0KLSAgICogQHBhcmFtIGxhc3RNb2RpZmllZCAgdGhlIGxhc3QgbW9kaWZpZWQgdGltZSBpbiBVVEMgbWlsbGlzDQotICAgKi8NCi0gIHZvaWQgdG91Y2goDQotICAgIGxvbmcgbGFzdE1vZGlmaWVkKQ0KLSAgew0KLSAgICBfbGFzdE1vZGlmaWVkID0gTWF0aC5tYXgoX2xhc3RNb2RpZmllZCwgbGFzdE1vZGlmaWVkKTsNCi0gIH0NCi0NCi0gIHByaXZhdGUgbG9uZyBfbGFzdE1vZGlmaWVkOw0KLSAgcHJpdmF0ZSBGYWNlc0NvbmZpZ0JlYW4gX293bmVyOw0KLX0NCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL3RyaW5pZGFkL3BhcnNlL1Byb3BlcnR5QmVhbi5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci90cmluaWRhZC9wYXJzZS9Qcm9wZXJ0eUJlYW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGEzOWU0ZS4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL3RyaW5pZGFkL3BhcnNlL1Byb3BlcnR5QmVhbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTY4ICswLDAgQEAKLS8qDQotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKiANCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICogDQotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5idWlsZGVyLnRyaW5pZGFkLnBhcnNlOw0KLQ0KLS8qKg0KLSAqIFByb3BlcnR5QmVhbiBpcyBhIEphdmEgcmVwcmVzZW50YXRpb24gb2YgdGhlIGZhY2VzLWNvbmZpZyBjb21wb25lbnQgcHJvcGVydHkNCi0gKiBYTUwgZWxlbWVudC4NCi0gKi8NCi1wdWJsaWMgY2xhc3MgUHJvcGVydHlCZWFuIGV4dGVuZHMgQXR0cmlidXRlQmVhbg0KLXsNCi0gICAgcHVibGljIHZvaWQgc2V0VXNlTWF4VGltZShib29sZWFuIF91c2VNYXhUaW1lKQ0KLSAgICB7DQotICAgICAgdGhpcy5fdXNlTWF4VGltZSA9IF91c2VNYXhUaW1lOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBib29sZWFuIGdldFVzZU1heFRpbWUoKQ0KLSAgICB7DQotICAgICAgcmV0dXJuIF91c2VNYXhUaW1lOw0KLSAgICB9DQotDQotICAvKioNCi0gICAqIFNldHMgdGhlIG5hbWUgb2YgdGhpcyBwcm9wZXJ0eS4NCi0gICAqDQotICAgKiBAcGFyYW0gcHJvcGVydHlOYW1lICB0aGUgcHJvcGVydHkgbmFtZQ0KLSAgICovDQotICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eU5hbWUoDQotICAgIFN0cmluZyBwcm9wZXJ0eU5hbWUpDQotICB7DQotICAgIHNldEF0dHJpYnV0ZU5hbWUocHJvcGVydHlOYW1lKTsNCi0gIH0NCi0NCi0gIC8qKg0KLSAgICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGlzIHByb3BlcnR5Lg0KLSAgICoNCi0gICAqIEByZXR1cm4gIHRoZSBwcm9wZXJ0eSBuYW1lDQotICAgKi8NCi0gIHB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHlOYW1lKCkNCi0gIHsNCi0gICAgcmV0dXJuIGdldEF0dHJpYnV0ZU5hbWUoKTsNCi0gIH0NCi0NCi0gIC8qKg0KLSAgICogU2V0cyB0aGUgcHJvcGVydHkgY2xhc3MgZm9yIHRoaXMgcHJvcGVydHkuDQotICAgKg0KLSAgICogQHBhcmFtIHByb3BlcnR5Q2xhc3MgIHRoZSBwcm9wZXJ0eSBjbGFzcw0KLSAgICovDQotICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eUNsYXNzKA0KLSAgICBTdHJpbmcgcHJvcGVydHlDbGFzcykNCi0gIHsNCi0gICAgc2V0QXR0cmlidXRlQ2xhc3MocHJvcGVydHlDbGFzcyk7DQotICB9DQotDQotICAvKioNCi0gICAqIFJldHVybnMgdGhlIHByb3BlcnR5IGNsYXNzIGZvciB0aGlzIHByb3BlcnR5Lg0KLSAgICoNCi0gICAqIEByZXR1cm4gIHRoZSBwcm9wZXJ0eSBjbGFzcw0KLSAgICovDQotICBwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5Q2xhc3MoKQ0KLSAgew0KLSAgICByZXR1cm4gZ2V0QXR0cmlidXRlQ2xhc3MoKTsNCi0gIH0NCi0NCi0gIC8qKg0KLSAgICogUmV0dXJucyB0aGUgYXJyYXkgb2YgcGFyYW1ldGVyaXplZCB0eXBlcyBmb3IgdGhpcyBwcm9wZXJ0eQ0KLSAgICogaWYgaXQgdXNlcyBnZW5lcmljcy4NCi0gICAqDQotICAgKiBAcmV0dXJuIHRoZSBhcnJheSBvZiBwYXJhbWV0ZXJpemVkIHR5cGVzIGZvciB0aGlzIHByb3BlcnR5DQotICAgKi8NCi0gIHB1YmxpYyBTdHJpbmdbXSBnZXRQcm9wZXJ0eUNsYXNzUGFyYW1ldGVycygpDQotICB7DQotICAgIHJldHVybiBnZXRBdHRyaWJ1dGVDbGFzc1BhcmFtZXRlcnMoKTsNCi0gIH0NCi0NCi0gIC8qKg0KLSAgICogU2V0cyB0aGUgcG9zc2libGUgdmFsdWVzIGZvciB0aGlzIHByb3BlcnR5Lg0KLSAgICoNCi0gICAqIEBwYXJhbSBwcm9wZXJ0eVZhbHVlcyAgdGhlIHByb3BlcnR5IHZhbHVlcw0KLSAgICovDQotICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eVZhbHVlcygNCi0gICAgU3RyaW5nW10gcHJvcGVydHlWYWx1ZXMpDQotICB7DQotICAgIF9wcm9wZXJ0eVZhbHVlcyA9IHByb3BlcnR5VmFsdWVzOw0KLSAgfQ0KLQ0KLSAgLyoqDQotICAgKiBSZXR1cm5zIHBvc3NpYmxlIHZhbHVlcyBmb3IgdGhpcyBwcm9wZXJ0eS4NCi0gICAqDQotICAgKiBAcmV0dXJuICB0aGUgcHJvcGVydHkgdmFsdWVzDQotICAgKi8NCi0gIHB1YmxpYyBTdHJpbmdbXSBnZXRQcm9wZXJ0eVZhbHVlcygpDQotICB7DQotICAgIHJldHVybiBfcHJvcGVydHlWYWx1ZXM7DQotICB9DQotDQotICAvKioNCi0gICAqIFNldHMgdGhlIHN0YXRlSG9sZGVyIGZsYWcgb2YgdGhpcyBwcm9wZXJ0eS4NCi0gICAqDQotICAgKiBAcGFyYW0gc3RhdGVIb2xkZXIgIHRoZSBwcm9wZXJ0eSBzdGF0ZUhvbGRlciBmbGFnDQotICAgKi8NCi0gIHB1YmxpYyB2b2lkIHNldFN0YXRlSG9sZGVyKA0KLSAgICBib29sZWFuIHN0YXRlSG9sZGVyKQ0KLSAgew0KLSAgICBfc3RhdGVIb2xkZXIgPSBzdGF0ZUhvbGRlcjsNCi0gIH0NCi0NCi0gIC8qKg0KLSAgICogUmV0dXJucyBzdGF0ZUhvbGRlciBmbGFnIG9mIHRoaXMgcHJvcGVydHkuDQotICAgKg0KLSAgICogQHJldHVybiAgdGhlIHByb3BlcnR5IHN0YXRlSG9sZGVyIGZsYWcNCi0gICAqLw0KLSAgcHVibGljIGJvb2xlYW4gaXNTdGF0ZUhvbGRlcigpDQotICB7DQotICAgIHJldHVybiBfc3RhdGVIb2xkZXI7DQotICB9DQotDQotICAvKioNCi0gICAqIFNldHMgdGhlIHRyYW5zaWVudCBmbGFnIG9mIHRoaXMgcHJvcGVydHkuDQotICAgKg0KLSAgICogQHBhcmFtIHRyYW5zaWVudF8gdGhlIHByb3BlcnR5IHRyYW5zaWVudCBmbGFnDQotICAgKi8NCi0gIHB1YmxpYyB2b2lkIHNldFRyYW5zaWVudCgNCi0gICAgYm9vbGVhbiB0cmFuc2llbnRfKQ0KLSAgew0KLSAgICBfdHJhbnNpZW50ID0gdHJhbnNpZW50XzsNCi0gIH0NCi0NCi0gIC8qKg0KLSAgICogUmV0dXJucyB0cmFuc2llbnQgZmxhZyBvZiB0aGlzIHByb3BlcnR5Lg0KLSAgICoNCi0gICAqIEByZXR1cm4gIHRoZSBwcm9wZXJ0eSB0cmFuc2llbnQgZmxhZw0KLSAgICovDQotICBwdWJsaWMgYm9vbGVhbiBpc1RyYW5zaWVudCgpDQotICB7DQotICAgIHJldHVybiBfdHJhbnNpZW50Ow0KLSAgfQ0KLQ0KLQ0KLSAgLyoqDQotICAgKiBTZXRzIHRoZSBsaXN0IGZsYWcgb2YgdGhpcyBwcm9wZXJ0eS4NCi0gICAqDQotICAgKiBAcGFyYW0gbGlzdF8gdGhlIHByb3BlcnR5IGxpc3QgZmxhZw0KLSAgICovDQotICBwdWJsaWMgdm9pZCBzZXRMaXN0KA0KLSAgICBib29sZWFuIGxpc3RfKQ0KLSAgew0KLSAgICBfbGlzdCA9IGxpc3RfOw0KLSAgfQ0KLQ0KLSAgLyoqDQotICAgKiBSZXR1cm5zIGxpc3QgZmxhZyBvZiB0aGlzIHByb3BlcnR5Lg0KLSAgICoNCi0gICAqIEByZXR1cm4gIHRoZSBwcm9wZXJ0eSBsaXN0IGZsYWcNCi0gICAqLw0KLSAgcHVibGljIGJvb2xlYW4gaXNMaXN0KCkNCi0gIHsNCi0gICAgcmV0dXJuIF9saXN0Ow0KLSAgfQ0KLQ0KLSAgLyoqDQotICAgKiBTZXRzIHRoZSByZXF1aXJlZCBmbGFnIG9mIHRoaXMgcHJvcGVydHkuDQotICAgKg0KLSAgICogQHBhcmFtIHJlcXVpcmVkICB0aGUgcHJvcGVydHkgcmVxdWlyZWQgZmxhZw0KLSAgICovDQotICBwdWJsaWMgdm9pZCBzZXRSZXF1aXJlZCgNCi0gICAgYm9vbGVhbiByZXF1aXJlZCkNCi0gIHsNCi0gICAgX3JlcXVpcmVkID0gcmVxdWlyZWQ7DQotICB9DQotDQotICAvKioNCi0gICAqIFJldHVybnMgcmVxdWlyZWQgZmxhZyBvZiB0aGlzIHByb3BlcnR5Lg0KLSAgICoNCi0gICAqIEByZXR1cm4gIHRoZSBwcm9wZXJ0eSByZXF1aXJlZCBmbGFnDQotICAgKi8NCi0gIHB1YmxpYyBib29sZWFuIGlzUmVxdWlyZWQoKQ0KLSAgew0KLSAgICByZXR1cm4gX3JlcXVpcmVkOw0KLSAgfQ0KLQ0KLSAgLyoqDQotICAgKiBTZXRzIHRoZSBsaXRlcmFsT25seSBmbGFnIG9mIHRoaXMgcHJvcGVydHkuDQotICAgKg0KLSAgICogQHBhcmFtIGxpdGVyYWxPbmx5ICB0aGUgcHJvcGVydHkgbGl0ZXJhbE9ubHkgZmxhZw0KLSAgICovDQotICBwdWJsaWMgdm9pZCBzZXRMaXRlcmFsT25seSgNCi0gICAgYm9vbGVhbiBsaXRlcmFsT25seSkNCi0gIHsNCi0gICAgX2xpdGVyYWxPbmx5ID0gbGl0ZXJhbE9ubHk7DQotICB9DQotDQotICAvKioNCi0gICAqIFJldHVybnMgbGl0ZXJhbE9ubHkgZmxhZyBvZiB0aGlzIHByb3BlcnR5Lg0KLSAgICoNCi0gICAqIEByZXR1cm4gIHRoZSBwcm9wZXJ0eSBsaXRlcmFsT25seSBmbGFnDQotICAgKi8NCi0gIHB1YmxpYyBib29sZWFuIGlzTGl0ZXJhbE9ubHkoKQ0KLSAgew0KLSAgICByZXR1cm4gX2xpdGVyYWxPbmx5Ow0KLSAgfQ0KLQ0KLSAgLyoqDQotICAgKiBTZXQgdGhlIHByb3BlcnR5IGFzIGFsbG93aW5nICR7fSBzeW50YXgNCi0gICAqIEBwYXJhbSBydGV4cHJ2YWx1ZSB0aGUgcnRleHJ2YWx1ZSB2YWx1ZQ0KLSAgICovDQotICBwdWJsaWMgdm9pZCBzZXRSdGV4cHJ2YWx1ZShib29sZWFuIHJ0ZXhwcnZhbHVlKQ0KLSAgew0KLSAgICBfcnRleHBydmFsdWUgPSBydGV4cHJ2YWx1ZTsNCi0gIH0NCi0NCi0gIC8qKg0KLSAgICogUmV0dXJuIHRoZSBydGV4cnZhbHVlIGZsYWcNCi0gICAqLw0KLSAgcHVibGljIGJvb2xlYW4gaXNSdGV4cHJ2YWx1ZSgpDQotICB7DQotICAgIHJldHVybiBfcnRleHBydmFsdWU7DQotICB9DQotDQotICAvKioNCi0gICAqIFNldHMgdGhlIGFsaWFzIG9mIHRoaXMgcHJvcGVydHkuDQotICAgKg0KLSAgICogQHBhcmFtIGFsaWFzT2YgIHRoZSBwcm9wZXJ0eSBhbGlhcw0KLSAgICovDQotICBwdWJsaWMgdm9pZCBzZXRBbGlhc09mKA0KLSAgICBTdHJpbmcgYWxpYXNPZikNCi0gIHsNCi0gICAgX2FsaWFzT2YgPSBhbGlhc09mOw0KLSAgfQ0KLQ0KLSAgLyoqDQotICAgKiBSZXR1cm5zIHRoZSBhbGlhcyBvZiB0aGlzIHByb3BlcnR5Lg0KLSAgICoNCi0gICAqIEByZXR1cm4gIHRoZSBwcm9wZXJ0eSBhbGlhcw0KLSAgICovDQotICBwdWJsaWMgU3RyaW5nIGdldEFsaWFzT2YoKQ0KLSAgew0KLSAgICByZXR1cm4gX2FsaWFzT2Y7DQotICB9DQotDQotICAvKioNCi0gICAqIFNldHMgdGhlIHVuc3VwcG9ydGVkIGFnZW50cyBmb3IgdGhpcyBwcm9wZXJ0eS4NCi0gICAqDQotICAgKiBAcGFyYW0gdW5zdXBwb3J0ZWRBZ2VudHMgIHRoZSB1bnN1cHBvcnRlZCBhZ2VudHMNCi0gICAqLw0KLSAgcHVibGljIHZvaWQgc2V0VW5zdXBwb3J0ZWRBZ2VudHMoDQotICAgIFN0cmluZ1tdIHVuc3VwcG9ydGVkQWdlbnRzKQ0KLSAgew0KLSAgICBpZiAodW5zdXBwb3J0ZWRBZ2VudHMgPT0gbnVsbCkNCi0gICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oInVuc3VwcG9ydGVkQWdlbnRzIik7DQotDQotICAgIF91bnN1cHBvcnRlZEFnZW50cyA9IHVuc3VwcG9ydGVkQWdlbnRzOw0KLSAgfQ0KLQ0KLSAgLyoqDQotICAgKiBSZXR1cm5zIHVuc3VwcG9ydGVkIGFnZW50cyBmb3IgdGhpcyBwcm9wZXJ0eS4NCi0gICAqDQotICAgKiBAcmV0dXJuICB0aGUgdW5zdXBwb3J0ZWQgYWdlbnRzDQotICAgKi8NCi0gIHB1YmxpYyBTdHJpbmdbXSBnZXRVbnN1cHBvcnRlZEFnZW50cygpDQotICB7DQotICAgIHJldHVybiBfdW5zdXBwb3J0ZWRBZ2VudHM7DQotICB9DQotDQotICAvKioNCi0gICAqIFNldHMgdGhlIHVuc3VwcG9ydGVkIFJlbmRlcktpdHMgZm9yIHRoaXMgcHJvcGVydHkuDQotICAgKg0KLSAgICogQHBhcmFtIHVuc3VwcG9ydGVkUmVuZGVyS2l0cyAgdGhlIHVuc3VwcG9ydGVkIFJlbmRlcktpdHMNCi0gICAqLw0KLSAgcHVibGljIHZvaWQgc2V0VW5zdXBwb3J0ZWRSZW5kZXJLaXRzKA0KLSAgICBTdHJpbmdbXSB1bnN1cHBvcnRlZFJlbmRlcktpdHMpDQotICB7DQotICAgIGlmICh1bnN1cHBvcnRlZFJlbmRlcktpdHMgPT0gbnVsbCkNCi0gICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oInVuc3VwcG9ydGVkUmVuZGVyS2l0cyIpOw0KLQ0KLSAgICBfdW5zdXBwb3J0ZWRSZW5kZXJLaXRzID0gdW5zdXBwb3J0ZWRSZW5kZXJLaXRzOw0KLSAgfQ0KLQ0KLSAgLyoqDQotICAgKiBSZXR1cm5zIHVuc3VwcG9ydGVkIFJlbmRlcktpdHMgZm9yIHRoaXMgcHJvcGVydHkuDQotICAgKg0KLSAgICogQHJldHVybiAgdGhlIHVuc3VwcG9ydGVkIFJlbmRlcktpdHMNCi0gICAqLw0KLSAgcHVibGljIFN0cmluZ1tdIGdldFVuc3VwcG9ydGVkUmVuZGVyS2l0cygpDQotICB7DQotICAgIHJldHVybiBfdW5zdXBwb3J0ZWRSZW5kZXJLaXRzOw0KLSAgfQ0KLQ0KLSAgLyoqDQotICAgKiBTZXRzIHRoZSB0YWcgYXR0cmlidXRlIGV4Y2x1ZGVkIGZsYWcgZm9yIHRoaXMgcHJvcGVydHkuDQotICAgKg0KLSAgICogQHBhcmFtIGV4Y2x1ZGVkICB0cnVlLCAgaWYgdGhlIHRhZyBhdHRyaWJ1dGUgc2hvdWxkIGJlIGV4Y2x1ZGVkOw0KLSAgICogICAgICAgICAgICAgICAgICBmYWxzZSwgb3RoZXJ3aXNlDQotICAgKi8NCi0gIHB1YmxpYyB2b2lkIHNldFRhZ0F0dHJpYnV0ZUV4Y2x1ZGVkKA0KLSAgICBib29sZWFuIGV4Y2x1ZGVkKQ0KLSAgew0KLSAgICBfdGFnQXR0cmlidXRlRXhjbHVkZWQgPSBleGNsdWRlZDsNCi0gIH0NCi0NCi0gIC8qKg0KLSAgICogUmV0dXJucyB0aGUgdGFnIGF0dHJpYnV0ZSBleGNsdWRlZCBmbGFnIGZvciB0aGlzIHByb3BlcnR5Lg0KLSAgICoNCi0gICAqIEByZXR1cm4gdHJ1ZSwgIGlmIHRoZSB0YWcgYXR0cmlidXRlIHNob3VsZCBiZSBleGNsdWRlZDsNCi0gICAqICAgICAgICAgZmFsc2UsIG90aGVyd2lzZQ0KLSAgICovDQotICBwdWJsaWMgYm9vbGVhbiBpc1RhZ0F0dHJpYnV0ZUV4Y2x1ZGVkKCkNCi0gIHsNCi0gICAgcmV0dXJuIF90YWdBdHRyaWJ1dGVFeGNsdWRlZDsNCi0gIH0NCi0NCi0gIC8qKg0KLSAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBwcm9wZXJ0eSBpcyBhbiBlbnVtZXJhdGVkIEphdmEgdHlwZS4NCi0gICAqLw0KLSAgcHVibGljIGJvb2xlYW4gaXNFbnVtKCkNCi0gIHsNCi0gICAgcmV0dXJuIF9lbnVtOw0KLSAgfQ0KLQ0KLSAgLyoqDQotICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHByb3BlcnR5IGlzIGFuIGVudW1lcmF0ZWQgSmF2YSB0eXBlLg0KLSAgICovDQotICBwdWJsaWMgdm9pZCBzZXRFbnVtKGJvb2xlYW4gaXNFbnVtKQ0KLSAgew0KLSAgICBfZW51bSA9IGlzRW51bTsNCi0gIH0NCi0NCi0gIC8qKg0KLSAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgcHJvcGVydHkgaXMgYSBtZXRob2QgYmluZGluZy4NCi0gICAqDQotICAgKiBAcmV0dXJuIHRydWUgIGlmIHRoaXMgcHJvcGVydHkgaXMgYSBtZXRob2QgYmluZGluZywNCi0gICAqICAgICAgICAgb3RoZXJ3aXNlIGZhbHNlDQotICAgKi8NCi0gIHB1YmxpYyBib29sZWFuIGlzTWV0aG9kQmluZGluZygpDQotICB7DQotICAgIHJldHVybiAoImphdmF4LmZhY2VzLmVsLk1ldGhvZEJpbmRpbmciLmVxdWFscyhnZXRQcm9wZXJ0eUNsYXNzKCkpKTsNCi0gIH0NCi0NCi0NCi0gIC8qKg0KLSAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgcHJvcGVydHkgaXMgYSBtZXRob2QgYmluZGluZy4NCi0gICAqDQotICAgKiBAcmV0dXJuIHRydWUgIGlmIHRoaXMgcHJvcGVydHkgaXMgYSBtZXRob2QgYmluZGluZywNCi0gICAqICAgICAgICAgb3RoZXJ3aXNlIGZhbHNlDQotICAgKi8NCi0gIHB1YmxpYyBib29sZWFuIGlzTWV0aG9kRXhwcmVzc2lvbigpDQotICB7DQotICAgIHJldHVybiAoImphdmF4LmVsLk1ldGhvZEV4cHJlc3Npb24iLmVxdWFscyhnZXRQcm9wZXJ0eUNsYXNzKCkpKTsNCi0gIH0NCi0NCi0gIC8qKg0KLSAgICogUGFyc2VzIHRoZSBwb3NzaWJsZSB2YWx1ZXMgZm9yIHRoaXMgcHJvcGVydHkgaW50byBhIFN0cmluZyBhcnJheQ0KLSAgICogdXNpbmcgc3BhY2UgYXMgdGhlIHNlcGFyYXRvciBiZXR3ZWVuIHZhbHVlcy4NCi0gICAqDQotICAgKiBAcGFyYW0gcHJvcGVydHlWYWx1ZXMgIHRoZSBwcm9wZXJ0eSB2YWx1ZXMNCi0gICAqLw0KLSAgcHVibGljIHZvaWQgcGFyc2VQcm9wZXJ0eVZhbHVlcygNCi0gICAgU3RyaW5nIHByb3BlcnR5VmFsdWVzKQ0KLSAgew0KLSAgICBzZXRQcm9wZXJ0eVZhbHVlcyhwcm9wZXJ0eVZhbHVlcy5zcGxpdCgiICIpKTsNCi0gIH0NCi0NCi0gIC8qKg0KLSAgICogUGFyc2VzIHRoZSB1bnN1cHBvcnRlZCBhZ2VudHMgZm9yIHRoaXMgcHJvcGVydHkgaW50byBhIFN0cmluZyBhcnJheQ0KLSAgICogdXNpbmcgc3BhY2UgYXMgdGhlIHNlcGFyYXRvciBiZXR3ZWVuIHZhbHVlcy4NCi0gICAqDQotICAgKiBAcGFyYW0gdW5zdXBwb3J0ZWRBZ2VudHMgIHRoZSB1bnN1cHBvcnRlZCBhZ2VudHMNCi0gICAqLw0KLSAgcHVibGljIHZvaWQgcGFyc2VVbnN1cHBvcnRlZEFnZW50cygNCi0gICAgU3RyaW5nIHVuc3VwcG9ydGVkQWdlbnRzKQ0KLSAgew0KLSAgICBzZXRVbnN1cHBvcnRlZEFnZW50cyh1bnN1cHBvcnRlZEFnZW50cy5zcGxpdCgiICIpKTsNCi0gIH0NCi0NCi0gIC8qKg0KLSAgICogUGFyc2VzIHRoZSB1bnN1cHBvcnRlZCBSZW5kZXJLaXRzIGZvciB0aGlzIHByb3BlcnR5IGludG8gYSBTdHJpbmcgYXJyYXkNCi0gICAqIHVzaW5nIHNwYWNlIGFzIHRoZSBzZXBhcmF0b3IgYmV0d2VlbiB2YWx1ZXMuDQotICAgKg0KLSAgICogQHBhcmFtIHVuc3VwcG9ydGVkUmVuZGVyS2l0cyAgdGhlIHVuc3VwcG9ydGVkIFJlbmRlcktpdHMNCi0gICAqLw0KLSAgcHVibGljIHZvaWQgcGFyc2VVbnN1cHBvcnRlZFJlbmRlcktpdHMoDQotICAgIFN0cmluZyB1bnN1cHBvcnRlZFJlbmRlcktpdHMpDQotICB7DQotICAgIHNldFVuc3VwcG9ydGVkUmVuZGVyS2l0cyh1bnN1cHBvcnRlZFJlbmRlcktpdHMuc3BsaXQoIiAiKSk7DQotICB9DQotDQotICAvKioNCi0gICAqIFNldHMgdGhlIEpTUCBuYW1lIG9mIHRoaXMgcHJvcGVydHkuDQotICAgKg0KLSAgICogQHBhcmFtIGpzcFByb3BlcnR5TmFtZSAgdGhlIEpTUCBwcm9wZXJ0eSBuYW1lDQotICAgKi8NCi0gIHB1YmxpYyB2b2lkIHNldEpzcFByb3BlcnR5TmFtZSgNCi0gICAgU3RyaW5nIGpzcFByb3BlcnR5TmFtZSkNCi0gIHsNCi0gICAgX2pzcFByb3BlcnR5TmFtZSA9IGpzcFByb3BlcnR5TmFtZTsNCi0gIH0NCi0NCi0gIC8qKg0KLSAgICogUmV0dXJucyB0aGUgSlNQIG5hbWUgb2YgdGhpcyBwcm9wZXJ0eS4NCi0gICAqDQotICAgKiBAcmV0dXJuICB0aGUgSlNQIHByb3BlcnR5IG5hbWUNCi0gICAqLw0KLSAgcHVibGljIFN0cmluZyBnZXRKc3BQcm9wZXJ0eU5hbWUoKQ0KLSAgew0KLSAgICBpZiAoX2pzcFByb3BlcnR5TmFtZSA9PSBudWxsKQ0KLSAgICAgIHJldHVybiBnZXRQcm9wZXJ0eU5hbWUoKTsNCi0NCi0gICAgcmV0dXJuIF9qc3BQcm9wZXJ0eU5hbWU7DQotICB9DQotDQotICAvKioNCi0gICAqIFNldHMgdGhlIGZpZWxkIG5hbWUgb2YgdGhpcyBwcm9wZXJ0eSwgd2hlbiBub3QgZ2VuZXJhdGluZyBUcmluaWRhZCBjb21wb25lbnRzDQotICAgKg0KLSAgICogQHBhcmFtIGZpZWxkUHJvcGVydHlOYW1lICB0aGUgZmllbGQgcHJvcGVydHkgbmFtZQ0KLSAgICovDQotICBwdWJsaWMgdm9pZCBzZXRGaWVsZFByb3BlcnR5TmFtZSgNCi0gICAgU3RyaW5nIGZpZWxkUHJvcGVydHlOYW1lKQ0KLSAgew0KLSAgICBfZmllbGRQcm9wZXJ0eU5hbWUgPSBmaWVsZFByb3BlcnR5TmFtZTsNCi0gIH0NCi0NCi0gIC8qKg0KLSAgICogUmV0dXJucyB0aGUgZmllbGQgbmFtZSBvZiB0aGlzIHByb3BlcnR5LCB3aGVuIG5vdCBnZW5lcmF0aW5nIFRyaW5pZGFkIGNvbXBvbmVudHMNCi0gICAqDQotICAgKiBAcmV0dXJuICB0aGUgZmllbGQgcHJvcGVydHkgbmFtZQ0KLSAgICovDQotICBwdWJsaWMgU3RyaW5nIGdldEZpZWxkUHJvcGVydHlOYW1lKCkNCi0gIHsNCi0gICAgaWYgKF9maWVsZFByb3BlcnR5TmFtZSA9PSBudWxsKQ0KLSAgICAgIHJldHVybiAiXyIrZ2V0UHJvcGVydHlOYW1lKCk7DQotDQotICAgIHJldHVybiBfZmllbGRQcm9wZXJ0eU5hbWU7DQotICB9DQotDQotICAvKioNCi0gICAqIElmIHRoZSBwcm9wZXJ0eSBzaG91bGQgYmUgaGlkZGVuIGZyb20gZG9jdW1lbnRhdGlvbg0KLSAgICogQHJldHVybiBJZiB0aGUgZmFjZXQgc2hvdWxkIGJlIGhpZGRlbg0KLSAgICovDQotICBwdWJsaWMgYm9vbGVhbiBpc0hpZGRlbigpDQotICB7DQotICAgIHJldHVybiBfaGlkZGVuOw0KLSAgfQ0KLQ0KLSAgLyoqDQotICAgKiBTZXQgaWYgdGhpcyBmYWNldCBzaG91bGQgYmUgaGlkZGVuIGZyb20gZG9jdW1lbnRhdGlvbg0KLSAgICogQHBhcmFtIGhpZGRlbiBJZiB0aGUgZmFjZXQgc2hvdWxkIGJlIGhpZGRlbg0KLSAgICovDQotICBwdWJsaWMgdm9pZCBzZXRIaWRkZW4oYm9vbGVhbiBoaWRkZW4pDQotICB7DQotICAgIHRoaXMuX2hpZGRlbiA9IGhpZGRlbjsNCi0gIH0NCi0NCi0gIC8qKg0KLSAgICogU2V0cyB0aGUgcHJvcGVydHkgZGVwcmVjYXRlZCBmbGFnDQotICAgKiBAcGFyYW0gZGVwcmVjYXRlZA0KLSAgICovDQotICBwdWJsaWMgdm9pZCBzZXREZXByZWNhdGVkKFN0cmluZyBkZXByZWNhdGVkKQ0KLSAgew0KLSAgICB0aGlzLl9kZXByZWNhdGVkID0gZGVwcmVjYXRlZDsNCi0gIH0NCi0NCi0gIC8qKg0KLSAgICogVmFsdWUgaXMgcHJvdmlkZWQgdGhyb3VnaCB0aGUgZGVwcmVjYXRlZCBleHRlbmRlZCBwcm9wZXJ0eSBtZXRhZGF0YS4NCi0gICAqIEByZXR1cm4gZGVwcmVjYXRlZCBkZXNjcmlwdGlvbiBpZiB0aGUgY29tcG9uZW50IHByb3BlcnR5IHNob3VsZCBiZSBkZXByZWNhdGVkDQotICAgKi8NCi0gIHB1YmxpYyBTdHJpbmcgZ2V0RGVwcmVjYXRlZCgpIHsNCi0gICAgcmV0dXJuIF9kZXByZWNhdGVkOw0KLSAgfQ0KLQ0KLQ0KLSAgLyoqDQotICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBwcm9wZXJ0eSBzaG91bGQgYmUgZ2VuZXJhdGVkIHdpdGggYSBuby1vcA0KLSAgICogICAgc2V0dGVyLg0KLSAgICovDQotICBwdWJsaWMgYm9vbGVhbiBpc05vT3AoKQ0KLSAgew0KLSAgICByZXR1cm4gX25vT3A7DQotICB9DQotDQotICAvKioNCi0gICAqIEludm9rZWQgaWYgdGhlIG5vLW9wIGV4dGVuZGVkIHByb3BlcnR5IG1ldGEtZGF0YSBpcyBwcm92aWRlZCBmb3IgdGhlIGNvbXBvbmVudA0KLSAgICogcHJvcGVydHkuDQotICAgKi8NCi0gIHB1YmxpYyB2b2lkIG1ha2VOb09wKCkNCi0gIHsNCi0gICAgdGhpcy5fbm9PcCA9IHRydWU7DQotICB9DQotDQotICAvKioNCi0gICAqIFNldHMgdGhlIHByb3BlcnR5IHZhbHVlRXhwcmVzc2lvbg0KLSAgICogQHBhcmFtIHZhbHVlRXhwcmVzc2lvbg0KLSAgICovDQotICBwdWJsaWMgdm9pZCBzZXRWYWx1ZUV4cHJlc3Npb24oU3RyaW5nIHZhbHVlRXhwcmVzc2lvbikNCi0gIHsNCi0gICAgdGhpcy5fdmFsdWVFeHByZXNzaW9uID0gdmFsdWVFeHByZXNzaW9uOw0KLSAgICAvLyBUaGlzIGlzIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IGZyb20ganNyLTI3NiBtZXRhZGF0YS4gIFRoZSBvbGQgZWxlbWVudA0KLSAgICAvLyA8bWZwOmxpdGVyYWwtb25seT50cnVlPC9tZnA6bGl0ZXJhbC1vbmx5PiBpcyBub3cNCi0gICAgLy8gPGZtZDp2YWx1ZS1leHByZXNzaW9uPlBST0hJQklURUQ8L2ZtZDp2YWx1ZS1leHByZXNzaW9uPi4gIFRoZXJlIGFyZSBhIG51bWJlciBvZiBwbGFjZXMNCi0gICAgLy8gdGhhdCBsb29rIGF0IGxpdGVyYWxPbmx5LCBzbyB3ZSBqdXN0IG1ha2UgaXQgdHJhbnNwYXJlbnQgYXQgdGhlIGxvd2VzdCBsZXZlbC4NCi0gICAgaWYgKHZhbHVlRXhwcmVzc2lvbi5lcXVhbHMoIlBST0hJQklURUQiKSkNCi0gICAgICBzZXRMaXRlcmFsT25seSh0cnVlKTsNCi0gIH0NCi0NCi0gIC8qKg0KLSAgICogVmFsdWUgaXMgcHJvdmlkZWQgdGhyb3VnaCB0aGUgdmFsdWVFeHByZXNzaW9uIHByb3BlcnR5IG1ldGFkYXRhLg0KLSAgICogQHJldHVybiB2YWx1ZUV4cHJlc3Npb24gb2YgdGhlIHByb3BlcnR5DQotICAgKi8NCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VmFsdWVFeHByZXNzaW9uKCkNCi0gIHsNCi0gICAgcmV0dXJuIF92YWx1ZUV4cHJlc3Npb247DQotICB9DQotDQotICAvKioNCi0gICAqIFNldCBpZiB0aGlzIHByb3BlcnR5IGlzIG92ZXJyaWRkaW5nIGEgcHJvcGVydHkgaW4gYW4gYW5jZXN0b3IgY2xhc3MuDQotICAgKiBAcGFyYW0gb3ZlcnJpZGUgaWYgb3ZlcnJpZGRpbmcgYSBwcm9wZXJ0eQ0KLSAgICovDQotICBwdWJsaWMgdm9pZCBzZXRPdmVycmlkZShib29sZWFuIG92ZXJyaWRlKQ0KLSAgew0KLSAgICB0aGlzLl9vdmVycmlkZSA9IG92ZXJyaWRlOw0KLSAgfQ0KLQ0KLSAgLyoqDQotICAgKiBHZXQgaWYgdGhpcyBwcm9wZXJ0eSBpcyBvdmVycmlkZGluZyBhIHByb3BlcnR5IGluIGFuIGFuY2VzdG9yIGNsYXNzLg0KLSAgICogQHJldHVybiBJZiB0aGUgcHJvcGVydHkgaXMgYW4gb3ZlcmlkZQ0KLSAgICovDQotICBwdWJsaWMgYm9vbGVhbiBpc092ZXJyaWRlKCkNCi0gIHsNCi0gICAgcmV0dXJuIF9vdmVycmlkZTsNCi0gIH0NCi0NCi0gIHByaXZhdGUgU3RyaW5nICBfYWxpYXNPZjsNCi0gIHByaXZhdGUgU3RyaW5nICBfanNwUHJvcGVydHlOYW1lOw0KLSAgcHJpdmF0ZSBTdHJpbmcgIF9maWVsZFByb3BlcnR5TmFtZTsNCi0gIHByaXZhdGUgYm9vbGVhbiBfcmVxdWlyZWQ7DQotICBwcml2YXRlIGJvb2xlYW4gX2xpdGVyYWxPbmx5Ow0KLSAgcHJpdmF0ZSBib29sZWFuIF9ydGV4cHJ2YWx1ZTsNCi0gIHByaXZhdGUgYm9vbGVhbiBfc3RhdGVIb2xkZXI7DQotICBwcml2YXRlIGJvb2xlYW4gX3RyYW5zaWVudDsNCi0gIHByaXZhdGUgYm9vbGVhbiBfbGlzdDsNCi0gIHByaXZhdGUgYm9vbGVhbiBfdGFnQXR0cmlidXRlRXhjbHVkZWQ7DQotICBwcml2YXRlIGJvb2xlYW4gX2VudW07DQotICBwcml2YXRlIGJvb2xlYW4gX3VzZU1heFRpbWU7DQotICBwcml2YXRlIGJvb2xlYW4gX2hpZGRlbjsNCi0gIHByaXZhdGUgYm9vbGVhbiBfb3ZlcnJpZGU7DQotICBwcml2YXRlIFN0cmluZ1tdIF9wcm9wZXJ0eVZhbHVlczsNCi0gIHByaXZhdGUgU3RyaW5nW10gX3Vuc3VwcG9ydGVkQWdlbnRzID0gX0VNUFRZX0FSUkFZOw0KLSAgcHJpdmF0ZSBTdHJpbmdbXSBfdW5zdXBwb3J0ZWRSZW5kZXJLaXRzID0gX0VNUFRZX0FSUkFZOw0KLSAgcHJpdmF0ZSBTdHJpbmcgX2RlcHJlY2F0ZWQ7DQotICBwcml2YXRlIGJvb2xlYW4gX25vT3AgPSBmYWxzZTsNCi0gIHByaXZhdGUgU3RyaW5nIF92YWx1ZUV4cHJlc3Npb247DQotDQotICBzdGF0aWMgcHJpdmF0ZSBTdHJpbmdbXSBfRU1QVFlfQVJSQVkgPSBuZXcgU3RyaW5nWzBdOw0KLQ0KLX0NCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL3RyaW5pZGFkL3BhcnNlL1JlbmRlcktpdEJlYW4uamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvdHJpbmlkYWQvcGFyc2UvUmVuZGVyS2l0QmVhbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYjk2MjRiLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvdHJpbmlkYWQvcGFyc2UvUmVuZGVyS2l0QmVhbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQzICswLDAgQEAKLS8qDQotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKiANCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICogDQotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5idWlsZGVyLnRyaW5pZGFkLnBhcnNlOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotaW1wb3J0IGphdmEudXRpbC5UcmVlTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7DQotDQotLyoqDQotICogUmVuZGVyS2l0QmVhbiBpcyBhIEphdmEgcmVwcmVzZW50YXRpb24gb2YgdGhlIGZhY2VzLWNvbmZpZyByZW5kZXIta2l0DQotICogWE1MIGVsZW1lbnQuDQotICovDQotcHVibGljIGNsYXNzIFJlbmRlcktpdEJlYW4gZXh0ZW5kcyBPYmplY3RCZWFuDQotew0KLSAgLyoqDQotICAgKiBDcmVhdGVzIGEgbmV3IFJlbmRlcktpdEJlYW4uDQotICAgKi8NCi0gIHB1YmxpYyBSZW5kZXJLaXRCZWFuKCkNCi0gIHsNCi0gICAgX3JlbmRlcmVycyA9IG5ldyBUcmVlTWFwKCk7DQotICB9DQotDQotICAvKioNCi0gICAqIFNldHMgdGhlIHJlbmRlciBraXQgaWQgZm9yIHRoaXMgY29tcG9uZW50Lg0KLSAgICoNCi0gICAqIEBwYXJhbSByZW5kZXJLaXRJZCAgdGhlIHJlbmRlciBraXQgaWQNCi0gICAqLw0KLSAgcHVibGljIHZvaWQgc2V0UmVuZGVyS2l0SWQoDQotICAgIFN0cmluZyByZW5kZXJLaXRJZCkNCi0gIHsNCi0gICAgX3JlbmRlcktpdElkID0gcmVuZGVyS2l0SWQ7DQotICB9DQotDQotICAvKioNCi0gICAqIFJldHVybnMgdGhlIHJlbmRlciBraXQgaWQgdHlwZSBmb3IgdGhpcyBjb21wb25lbnQuDQotICAgKg0KLSAgICogQHJldHVybiAgdGhlIHJlbmRlciBraXQgaWQNCi0gICAqLw0KLSAgcHVibGljIFN0cmluZyBnZXRSZW5kZXJLaXRJZCgpDQotICB7DQotICAgIHJldHVybiBfcmVuZGVyS2l0SWQ7DQotICB9DQotDQotICAvKioNCi0gICAqIEFkZHMgYSByZW5kZXJlciB0byB0aGlzIHJlbmRlciBraXQuDQotICAgKg0KLSAgICogQHBhcmFtIHJlbmRlcmVyICB0aGUgcmVuZGVyZXIgdG8gYWRkDQotICAgKi8NCi0gIHB1YmxpYyB2b2lkIGFkZFJlbmRlcmVyKA0KLSAgICBSZW5kZXJlckJlYW4gcmVuZGVyZXIpDQotICB7DQotICAgIFN0cmluZyBjb21wb25lbnRGYW1pbHkgPSByZW5kZXJlci5nZXRDb21wb25lbnRGYW1pbHkoKTsNCi0gICAgU3RyaW5nIHJlbmRlcmVyVHlwZSA9IHJlbmRlcmVyLmdldFJlbmRlcmVyVHlwZSgpOw0KLSAgICBTdHJpbmcgY29tcG9zaXRlS2V5ID0gY29tcG9uZW50RmFtaWx5ICsgInwiICsgcmVuZGVyZXJUeXBlOw0KLSAgICBfcmVuZGVyZXJzLnB1dChjb21wb3NpdGVLZXksIHJlbmRlcmVyKTsNCi0NCi0gICAgRmFjZXNDb25maWdCZWFuIG93bmVyID0gZ2V0T3duZXIoKTsNCi0gICAgaWYgKG93bmVyICE9IG51bGwpDQotICAgICAgcmVuZGVyZXIuYXR0YWNoKG93bmVyKTsNCi0gIH0NCi0NCi0gIC8qKg0KLSAgICogUmV0dXJucyB0aGUgcmVuZGVyZXIgZm9yIHRoaXMgY29tcG9uZW50IGZhbWlseSBhbmQgcmVuZGVyZXIgdHlwZS4NCi0gICAqDQotICAgKiBAcGFyYW0gY29tcG9uZW50RmFtaWx5ICB0aGUgY29tcG9uZW50IGZhbWlseQ0KLSAgICogQHBhcmFtIHJlbmRlcmVyVHlwZSAgICAgdGhlIHJlbmRlcmVyIHR5cGUNCi0gICAqLw0KLSAgcHVibGljIFJlbmRlcmVyQmVhbiBmaW5kUmVuZGVyZXIoDQotICAgIFN0cmluZyBjb21wb25lbnRGYW1pbHksDQotICAgIFN0cmluZyByZW5kZXJlclR5cGUpDQotICB7DQotICAgIFN0cmluZyBjb21wb3NpdGVLZXkgPSBjb21wb25lbnRGYW1pbHkgKyAifCIgKyByZW5kZXJlclR5cGU7DQotICAgIHJldHVybiBfcmVuZGVyZXJzLmdldChjb21wb3NpdGVLZXkpOw0KLSAgfQ0KLQ0KLSAgLyoqDQotICAgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyByZW5kZXIga2l0IGhhcyBhbnkgcmVuZGVyZXJzLg0KLSAgICoNCi0gICAqIEByZXR1cm4gIHRydWUgICBpZiB0aGlzIHJlbmRlciBraXQgaGFzIGFueSByZW5kZXJlcnMsDQotICAgKiAgICAgICAgICBmYWxzZSAgb3RoZXJ3aXNlDQotICAgKi8NCi0gIHB1YmxpYyBib29sZWFuIGhhc1JlbmRlcmVycygpDQotICB7DQotICAgIHJldHVybiAhX3JlbmRlcmVycy5pc0VtcHR5KCk7DQotICB9DQotDQotICAvKioNCi0gICAqIFJldHVybnMgYW4gaXRlcmF0b3IgZm9yIGFsbCByZW5kZXJlcnMgaW4gdGhpcyByZW5kZXIga2l0Lg0KLSAgICoNCi0gICAqIEByZXR1cm4gIHRoZSByZW5kZXJlciBpdGVyYXRvcg0KLSAgICovDQotICBwdWJsaWMgSXRlcmF0b3I8UmVuZGVyZXJCZWFuPiByZW5kZXJlcnMoKQ0KLSAgew0KLSAgICByZXR1cm4gX3JlbmRlcmVycy52YWx1ZXMoKS5pdGVyYXRvcigpOw0KLSAgfQ0KLQ0KLSAgLyoqDQotICAgKiBBdHRhY2hlcyB0aGUgY29tcG9uZW50IGFuZCBhbGwgZXZlbnQgcmVmZXJlbmNlcy4NCi0gICAqDQotICAgKiBAcGFyYW0gb3duZXIgIHRoZSBmYWNlcyBjb25maWcgb3duZXINCi0gICAqLw0KLSAgcHJvdGVjdGVkIHZvaWQgYXR0YWNoKA0KLSAgICBGYWNlc0NvbmZpZ0JlYW4gb3duZXIpDQotICB7DQotICAgIHN1cGVyLmF0dGFjaChvd25lcik7DQotICAgIEl0ZXJhdG9yPFJlbmRlcmVyQmVhbj4gcmVuZGVyZXJzID0gcmVuZGVyZXJzKCk7DQotICAgIHdoaWxlIChyZW5kZXJlcnMuaGFzTmV4dCgpKQ0KLSAgICB7DQotICAgICAgUmVuZGVyZXJCZWFuIHJlbmRlcmVyID0gcmVuZGVyZXJzLm5leHQoKTsNCi0gICAgICByZW5kZXJlci5hdHRhY2gob3duZXIpOw0KLSAgICB9DQotICB9DQotDQotICB2b2lkIGFkZEFsbFJlbmRlcmVycygNCi0gICAgUmVuZGVyS2l0QmVhbiByZW5kZXJLaXQpDQotICB7DQotICAgIGZvciAoSXRlcmF0b3I8UmVuZGVyZXJCZWFuPiBpID0gcmVuZGVyS2l0Ll9yZW5kZXJlcnMudmFsdWVzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQ0KLSAgICB7DQotICAgICAgLy8gdXNlIGFkZFJlbmRlcmVyIHRvIGVzdGFibGlzaCBvd25lcg0KLSAgICAgIGFkZFJlbmRlcmVyKGkubmV4dCgpKTsNCi0gICAgfQ0KLSAgfQ0KLQ0KLSAgcHJpdmF0ZSBTdHJpbmcgIF9yZW5kZXJLaXRJZCA9ICIiOw0KLSAgcHJpdmF0ZSBNYXA8U3RyaW5nLFJlbmRlcmVyQmVhbj4gICBfcmVuZGVyZXJzOw0KLX0NCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL3RyaW5pZGFkL3BhcnNlL1JlbmRlcmVyQmVhbi5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci90cmluaWRhZC9wYXJzZS9SZW5kZXJlckJlYW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDI4NzA2MC4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL3RyaW5pZGFkL3BhcnNlL1JlbmRlcmVyQmVhbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQzICswLDAgQEAKLS8qDQotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKiANCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICogDQotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5idWlsZGVyLnRyaW5pZGFkLnBhcnNlOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotaW1wb3J0IGphdmEudXRpbC5UcmVlTWFwOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmJ1aWxkZXIudHJpbmlkYWQudXRpbC5Db21wb3VuZEl0ZXJhdG9yOw0KLQ0KLS8qKg0KLSAqIFJlbmRlcktpdEJlYW4gaXMgYSBKYXZhIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBmYWNlcy1jb25maWcgcmVuZGVyLWtpdA0KLSAqIFhNTCBlbGVtZW50Lg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBSZW5kZXJlckJlYW4gZXh0ZW5kcyBPYmplY3RCZWFuDQotew0KLSAgLyoqDQotICAgKiBDcmVhdGVzIGEgbmV3IFJlbmRlcmVyQmVhbi4NCi0gICAqLw0KLSAgcHVibGljIFJlbmRlcmVyQmVhbigpDQotICB7DQotICAgIF9hdHRyaWJ1dGVzID0gbmV3IFRyZWVNYXAoKTsNCi0gICAgX2ZhY2V0cyA9IG5ldyBUcmVlTWFwKCk7DQotICB9DQotDQotICAvKioNCi0gICAqIFNldHMgdGhlIGNvbXBvbmVudCBmYW1pbHkgZm9yIHRoaXMgY29tcG9uZW50Lg0KLSAgICoNCi0gICAqIEBwYXJhbSBjb21wb25lbnRGYW1pbHkgIHRoZSBjb21wb25lbnQgZmFtaWx5DQotICAgKi8NCi0gIHB1YmxpYyB2b2lkIHNldENvbXBvbmVudEZhbWlseSgNCi0gICAgU3RyaW5nIGNvbXBvbmVudEZhbWlseSkNCi0gIHsNCi0gICAgX2NvbXBvbmVudEZhbWlseSA9IGNvbXBvbmVudEZhbWlseTsNCi0gIH0NCi0NCi0gIC8qKg0KLSAgICogUmV0dXJucyB0aGUgY29tcG9uZW50IGZhbWlseSBmb3IgdGhpcyBjb21wb25lbnQuDQotICAgKg0KLSAgICogQHJldHVybiAgdGhlIGNvbXBvbmVudCBmYW1pbHkNCi0gICAqLw0KLSAgcHVibGljIFN0cmluZyBnZXRDb21wb25lbnRGYW1pbHkoKQ0KLSAgew0KLSAgICByZXR1cm4gX2NvbXBvbmVudEZhbWlseTsNCi0gIH0NCi0NCi0gIC8qKg0KLSAgICogU2V0cyB0aGUgcmVuZGVyZXIgdHlwZSBmb3IgdGhpcyBjb21wb25lbnQuDQotICAgKg0KLSAgICogQHBhcmFtIHJlbmRlcmVyVHlwZSAgdGhlIHJlbmRlcmVyIHR5cGUNCi0gICAqLw0KLSAgcHVibGljIHZvaWQgc2V0UmVuZGVyZXJUeXBlKA0KLSAgICBTdHJpbmcgcmVuZGVyZXJUeXBlKQ0KLSAgew0KLSAgICBfcmVuZGVyZXJUeXBlID0gcmVuZGVyZXJUeXBlOw0KLSAgfQ0KLQ0KLSAgLyoqDQotICAgKiBSZXR1cm5zIHRoZSByZW5kZXJlciB0eXBlIGZvciB0aGlzIGNvbXBvbmVudC4NCi0gICAqDQotICAgKiBAcmV0dXJuICB0aGUgcmVuZGVyZXIgdHlwZQ0KLSAgICovDQotICBwdWJsaWMgU3RyaW5nIGdldFJlbmRlcmVyVHlwZSgpDQotICB7DQotICAgIHJldHVybiBfcmVuZGVyZXJUeXBlOw0KLSAgfQ0KLQ0KLSAgLyoqDQotICAgKiBTZXRzIHRoZSByZW5kZXJlciBjbGFzcyBmb3IgdGhpcyByZW5kZXJlci4NCi0gICAqDQotICAgKiBAcGFyYW0gcmVuZGVyZXJDbGFzcyAgdGhlIHJlbmRlcmVyIGNsYXNzDQotICAgKi8NCi0gIHB1YmxpYyB2b2lkIHNldFJlbmRlcmVyQ2xhc3MoDQotICAgIFN0cmluZyByZW5kZXJlckNsYXNzKQ0KLSAgew0KLSAgICBfcmVuZGVyZXJDbGFzcyA9IHJlbmRlcmVyQ2xhc3M7DQotICB9DQotDQotICAvKioNCi0gICAqIFJldHVybnMgdGhlIHJlbmRlcmVyIGNsYXNzIGZvciB0aGlzIHJlbmRlcmVyLg0KLSAgICoNCi0gICAqIEByZXR1cm4gIHRoZSByZW5kZXJlciBjbGFzcw0KLSAgICovDQotICBwdWJsaWMgU3RyaW5nIGdldFJlbmRlcmVyQ2xhc3MoKQ0KLSAgew0KLSAgICByZXR1cm4gX3JlbmRlcmVyQ2xhc3M7DQotICB9DQotDQotICAvKioNCi0gICAqIFNldHMgdGhlIGRlc2NyaXB0aW9uIG9mIHRoaXMgYXR0cmlidXRlLg0KLSAgICoNCi0gICAqIEBwYXJhbSBkZXNjcmlwdGlvbiAgdGhlIGF0dHJpYnV0ZSBkZXNjcmlwdGlvbg0KLSAgICovDQotICBwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbigNCi0gICAgU3RyaW5nIGRlc2NyaXB0aW9uKQ0KLSAgew0KLSAgICBfZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsNCi0gIH0NCi0NCi0gIC8qKg0KLSAgICogUmV0dXJucyB0aGUgZGVzY3JpcHRpb24gb2YgdGhpcyBhdHRyaWJ1dGUuDQotICAgKg0KLSAgICogQHJldHVybiAgdGhlIGF0dHJpYnV0ZSBkZXNjcmlwdGlvbg0KLSAgICovDQotICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkNCi0gIHsNCi0gICAgcmV0dXJuIF9kZXNjcmlwdGlvbjsNCi0gIH0NCi0NCi0gIC8qKg0KLSAgICogU2V0cyB0aGUgY29tcG9uZW50IHR5cGUgZm9yIHRoaXMgY29tcG9uZW50Lg0KLSAgICoNCi0gICAqIEBwYXJhbSBjb21wb25lbnRUeXBlICB0aGUgY29tcG9uZW50IHR5cGUNCi0gICAqLw0KLSAgcHVibGljIHZvaWQgc2V0Q29tcG9uZW50VHlwZSgNCi0gICAgU3RyaW5nIGNvbXBvbmVudFR5cGUpDQotICB7DQotICAgIF9jb21wb25lbnRUeXBlID0gY29tcG9uZW50VHlwZTsNCi0gIH0NCi0NCi0gIC8qKg0KLSAgICogUmV0dXJucyB0aGUgY29tcG9uZW50IHR5cGUgZm9yIHRoaXMgY29tcG9uZW50Lg0KLSAgICoNCi0gICAqIEByZXR1cm4gIHRoZSBjb21wb25lbnQgdHlwZQ0KLSAgICovDQotICBwdWJsaWMgU3RyaW5nIGdldENvbXBvbmVudFR5cGUoKQ0KLSAgew0KLSAgICByZXR1cm4gX2NvbXBvbmVudFR5cGU7DQotICB9DQotDQotICAvKioNCi0gICAqIFNldHMgdGhlIHJlbmRlcmVyIHN1cGVyY2xhc3MgZm9yIHRoaXMgcmVuZGVyZXIuDQotICAgKg0KLSAgICogQHBhcmFtIHJlbmRlcmVyU3VwZXJjbGFzcyAgdGhlIHJlbmRlcmVyIHN1cGVyY2xhc3MNCi0gICAqLw0KLSAgcHVibGljIHZvaWQgc2V0UmVuZGVyZXJTdXBlcmNsYXNzKA0KLSAgICBTdHJpbmcgcmVuZGVyZXJTdXBlcmNsYXNzKQ0KLSAgew0KLSAgICBfcmVuZGVyZXJTdXBlcmNsYXNzID0gcmVuZGVyZXJTdXBlcmNsYXNzOw0KLSAgfQ0KLQ0KLSAgLyoqDQotICAgKiBSZXR1cm5zIHRoZSByZW5kZXJlciBzdXBlcmNsYXNzIGZvciB0aGlzIGNvbXBvbmVudC4NCi0gICAqDQotICAgKiBAcmV0dXJuICB0aGUgcmVuZGVyZXIgc3VwZXJjbGFzcw0KLSAgICovDQotICBwdWJsaWMgU3RyaW5nIGdldFJlbmRlcmVyU3VwZXJjbGFzcygpDQotICB7DQotICAgIHJldHVybiBfcmVuZGVyZXJTdXBlcmNsYXNzOw0KLSAgfQ0KLQ0KLSAgLyoqDQotICAgKiBGaW5kcyB0aGUgcmVuZGVyZXItc3BlY2lmaWMgY29tcG9uZW50IGNsYXNzIGZvciB0aGlzIHJlbmRlcmVyLg0KLSAgICoNCi0gICAqIEByZXR1cm4gIHRoZSByZW5kZXJlci1zcGVjaWZjIGNvbXBvbmVudCBjbGFzcw0KLSAgICovDQotICBwdWJsaWMgU3RyaW5nIGZpbmRDb21wb25lbnRDbGFzcygpDQotICB7DQotICAgIENvbXBvbmVudEJlYW4gY29tcG9uZW50ID0gcmVzb2x2ZUNvbXBvbmVudFR5cGUoKTsNCi0gICAgcmV0dXJuIChjb21wb25lbnQgIT0gbnVsbCkgPyBjb21wb25lbnQuZ2V0Q29tcG9uZW50Q2xhc3MoKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICJvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuY29tcG9uZW50LlVJWENvbXBvbmVudCI7DQotICB9DQotDQotICAvKioNCi0gICAqIEZpbmRzIHRoZSBiZWhhdmlvcmFsIGNvbXBvbmVudCBjbGFzcyBmb3IgdGhpcyByZW5kZXJlci4NCi0gICAqDQotICAgKiBAcmV0dXJuICB0aGUgYmVoYXZpb3JhbCBjb21wb25lbnQgY2xhc3MNCi0gICAqLw0KLSAgcHVibGljIFN0cmluZyBmaW5kQ29tcG9uZW50RmFtaWx5Q2xhc3MoKQ0KLSAgew0KLSAgICBDb21wb25lbnRCZWFuIGNvbXBvbmVudCA9IHJlc29sdmVDb21wb25lbnRUeXBlKCk7DQotICAgIENvbXBvbmVudEJlYW4gYmVoYXZpb3JhbCA9IChjb21wb25lbnQgIT0gbnVsbCkNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBjb21wb25lbnQuZmluZEJlaGF2aW9yYWxDb21wb25lbnQoKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IG51bGw7DQotICAgIHJldHVybiAoYmVoYXZpb3JhbCAhPSBudWxsKSA/IGJlaGF2aW9yYWwuZ2V0Q29tcG9uZW50Q2xhc3MoKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAib3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLmNvbXBvbmVudC5VSVhDb21wb25lbnQiOw0KLSAgfQ0KLQ0KLSAgLyoqDQotICAgKiBBZGRzIGEgYXR0cmlidXRlIHRvIHRoaXMgY29tcG9uZW50Lg0KLSAgICoNCi0gICAqIEBwYXJhbSBhdHRyaWJ1dGUgIHRoZSBhdHRyaWJ1dGUgdG8gYWRkDQotICAgKi8NCi0gIHB1YmxpYyB2b2lkIGFkZEF0dHJpYnV0ZSgNCi0gICAgQXR0cmlidXRlQmVhbiBhdHRyaWJ1dGUpDQotICB7DQotICAgIF9hdHRyaWJ1dGVzLnB1dChhdHRyaWJ1dGUuZ2V0QXR0cmlidXRlTmFtZSgpLCBhdHRyaWJ1dGUpOw0KLSAgfQ0KLQ0KLSAgLyoqDQotICAgKiBSZXR1cm5zIHRoZSBhdHRyaWJ1dGUgZm9yIHRoaXMgYXR0cmlidXRlIG5hbWUuDQotICAgKg0KLSAgICogQHBhcmFtIGF0dHJpYnV0ZU5hbWUgIHRoZSBhdHRyaWJ1dGUgbmFtZSB0byBmaW5kDQotICAgKi8NCi0gIHB1YmxpYyBBdHRyaWJ1dGVCZWFuIGZpbmRBdHRyaWJ1dGUoDQotICAgIFN0cmluZyBhdHRyaWJ1dGVOYW1lKQ0KLSAgew0KLSAgICBBdHRyaWJ1dGVCZWFuIGF0dHJpYnV0ZSA9IChBdHRyaWJ1dGVCZWFuKV9hdHRyaWJ1dGVzLmdldChhdHRyaWJ1dGVOYW1lKTsNCi0NCi0gICAgaWYgKGF0dHJpYnV0ZSA9PSBudWxsKQ0KLSAgICB7DQotICAgICAgQ29tcG9uZW50QmVhbiBjb21wb25lbnQgPSByZXNvbHZlQ29tcG9uZW50VHlwZSgpOw0KLSAgICAgIGlmIChjb21wb25lbnQgIT0gbnVsbCkNCi0gICAgICAgIGF0dHJpYnV0ZSA9IGNvbXBvbmVudC5maW5kUHJvcGVydHkoYXR0cmlidXRlTmFtZSk7DQotICAgIH0NCi0NCi0gICAgcmV0dXJuIGF0dHJpYnV0ZTsNCi0gIH0NCi0NCi0gIC8qKg0KLSAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgY29tcG9uZW50IGhhcyBhbnkgYXR0cmlidXRlcy4NCi0gICAqDQotICAgKiBAcmV0dXJuICB0cnVlICAgaWYgdGhpcyBjb21wb25lbnQgaGFzIGFueSBhdHRyaWJ1dGVzLA0KLSAgICogICAgICAgICAgZmFsc2UgIG90aGVyd2lzZQ0KLSAgICovDQotICBwdWJsaWMgYm9vbGVhbiBoYXNBdHRyaWJ1dGVzKCkNCi0gIHsNCi0gICAgYm9vbGVhbiBoYXNBdHRyaWJ1dGVzID0gIV9hdHRyaWJ1dGVzLmlzRW1wdHkoKTsNCi0NCi0gICAgaWYgKCFoYXNBdHRyaWJ1dGVzKQ0KLSAgICB7DQotICAgICAgQ29tcG9uZW50QmVhbiBjb21wb25lbnQgPSByZXNvbHZlQ29tcG9uZW50VHlwZSgpOw0KLSAgICAgIGlmIChjb21wb25lbnQgIT0gbnVsbCkNCi0gICAgICAgIGhhc0F0dHJpYnV0ZXMgfD0gY29tcG9uZW50Lmhhc1Byb3BlcnRpZXMoKTsNCi0gICAgfQ0KLQ0KLSAgICByZXR1cm4gaGFzQXR0cmlidXRlczsNCi0gIH0NCi0NCi0gIC8qKg0KLSAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgY29tcG9uZW50IG9yIGFueSBjb21wb25lbnQgc3VwZXJ0eXBlDQotICAgKiBoYXMgYW55IGF0dHJpYnV0ZXMuDQotICAgKg0KLSAgICogQHJldHVybiAgdHJ1ZSAgIGlmIHRoaXMgY29tcG9uZW50IG9yIGFueSBzdXBlcnR5cGUgaGFzIGFueSBhdHRyaWJ1dGVzLA0KLSAgICogICAgICAgICAgZmFsc2UgIG90aGVyd2lzZQ0KLSAgICovDQotICBwdWJsaWMgYm9vbGVhbiBoYXNBdHRyaWJ1dGVzKA0KLSAgICBib29sZWFuIGZsYXR0ZW4pDQotICB7DQotICAgIGJvb2xlYW4gaGFzQXR0cmlidXRlcyA9IGhhc0F0dHJpYnV0ZXMoKTsNCi0NCi0gICAgaWYgKCFoYXNBdHRyaWJ1dGVzICYmIGZsYXR0ZW4pDQotICAgIHsNCi0gICAgICBDb21wb25lbnRCZWFuIGNvbXBvbmVudCA9IHJlc29sdmVDb21wb25lbnRUeXBlKCk7DQotICAgICAgaWYgKGNvbXBvbmVudCAhPSBudWxsKQ0KLSAgICAgIHsNCi0gICAgICAgIENvbXBvbmVudEJlYW4gcGFyZW50ID0gY29tcG9uZW50LnJlc29sdmVTdXBlcnR5cGUoKTsNCi0gICAgICAgIGlmIChwYXJlbnQgIT0gbnVsbCkNCi0gICAgICAgICAgaGFzQXR0cmlidXRlcyB8PSBwYXJlbnQuaGFzUHJvcGVydGllcyh0cnVlKTsNCi0gICAgICB9DQotICAgIH0NCi0NCi0gICAgcmV0dXJuIGhhc0F0dHJpYnV0ZXM7DQotICB9DQotDQotICAvKioNCi0gICAqIFJldHVybnMgYW4gaXRlcmF0b3IgZm9yIGFsbCBhdHRyaWJ1dGVzIG9uIHRoaXMgY29tcG9uZW50IG9ubHkuDQotICAgKg0KLSAgICogQHJldHVybiAgdGhlIGF0dHJpYnV0ZSBpdGVyYXRvcg0KLSAgICovDQotICBwdWJsaWMgSXRlcmF0b3IgYXR0cmlidXRlcygpDQotICB7DQotICAgIEl0ZXJhdG9yIGF0dHJpYnV0ZXMgPSBfYXR0cmlidXRlcy52YWx1ZXMoKS5pdGVyYXRvcigpOw0KLQ0KLSAgICBDb21wb25lbnRCZWFuIGNvbXBvbmVudCA9IHJlc29sdmVDb21wb25lbnRUeXBlKCk7DQotICAgIGlmIChjb21wb25lbnQgIT0gbnVsbCkNCi0gICAgICAgIGF0dHJpYnV0ZXMgPSBuZXcgQ29tcG91bmRJdGVyYXRvcihhdHRyaWJ1dGVzLCBjb21wb25lbnQucHJvcGVydGllcygpKTsNCi0NCi0gICAgcmV0dXJuIGF0dHJpYnV0ZXM7DQotICB9DQotDQotICAvKioNCi0gICAqIFJldHVybnMgYW4gaXRlcmF0b3IgZm9yIGF0dHJpYnV0ZXMgb24gdGhpcyBjb21wb25lbnQuDQotICAgKg0KLSAgICogQHBhcmFtIGZsYXR0ZW4gIHRydWUgICBpZiB0aGUgaXRlcmF0b3Igc2hvdWxkIGJlIGEgY29tYmluZWQgbGlzdCBvZg0KLSAgICogICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzIG9mIHRoaXMgY29tcG9uZW50IGFuZCBpdHMgc3VwZXJ0eXBlLA0KLSAgICogICAgICAgICAgICAgICAgIGZhbHNlICBvdGhlcndpc2UNCi0gICAqDQotICAgKiBAcmV0dXJuICB0aGUgYXR0cmlidXRlIGl0ZXJhdG9yDQotICAgKi8NCi0gIHB1YmxpYyBJdGVyYXRvciBhdHRyaWJ1dGVzKA0KLSAgICBib29sZWFuIGZsYXR0ZW4pDQotICB7DQotICAgIEl0ZXJhdG9yIGF0dHJpYnV0ZXMgPSBhdHRyaWJ1dGVzKCk7DQotICAgIGlmIChmbGF0dGVuKQ0KLSAgICB7DQotICAgICAgQ29tcG9uZW50QmVhbiBjb21wb25lbnQgPSByZXNvbHZlQ29tcG9uZW50VHlwZSgpOw0KLSAgICAgIGlmIChjb21wb25lbnQgIT0gbnVsbCkNCi0gICAgICB7DQotICAgICAgICBDb21wb25lbnRCZWFuIHBhcmVudCA9IGNvbXBvbmVudC5yZXNvbHZlU3VwZXJ0eXBlKCk7DQotICAgICAgICBpZiAocGFyZW50ICE9IG51bGwpDQotICAgICAgICAgIGF0dHJpYnV0ZXMgPSBuZXcgQ29tcG91bmRJdGVyYXRvcihhdHRyaWJ1dGVzLCBwYXJlbnQucHJvcGVydGllcyh0cnVlKSk7DQotICAgICAgfQ0KLSAgICB9DQotICAgIHJldHVybiBhdHRyaWJ1dGVzOw0KLSAgfQ0KLQ0KLSAgLyoqDQotICAgKiBBZGRzIGEgZmFjZXQgdG8gdGhpcyBjb21wb25lbnQuDQotICAgKg0KLSAgICogQHBhcmFtIGZhY2V0ICB0aGUgZmFjZXQgdG8gYWRkDQotICAgKi8NCi0gIHB1YmxpYyB2b2lkIGFkZEZhY2V0KA0KLSAgICBGYWNldEJlYW4gZmFjZXQpDQotICB7DQotICAgIF9mYWNldHMucHV0KGZhY2V0LmdldEZhY2V0TmFtZSgpLCBmYWNldCk7DQotICB9DQotDQotICAvKioNCi0gICAqIFJldHVybnMgdGhlIGZhY2V0IGZvciB0aGlzIGZhY2V0IG5hbWUuDQotICAgKg0KLSAgICogQHBhcmFtIGZhY2V0TmFtZSAgdGhlIGZhY2V0IG5hbWUgdG8gZmluZA0KLSAgICovDQotICBwdWJsaWMgRmFjZXRCZWFuIGZpbmRGYWNldCgNCi0gICAgU3RyaW5nIGZhY2V0TmFtZSkNCi0gIHsNCi0gICAgcmV0dXJuIChGYWNldEJlYW4pX2ZhY2V0cy5nZXQoZmFjZXROYW1lKTsNCi0gIH0NCi0NCi0gIC8qKg0KLSAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgY29tcG9uZW50IGhhcyBhbnkgZmFjZXRzLg0KLSAgICoNCi0gICAqIEByZXR1cm4gIHRydWUgICBpZiB0aGlzIGNvbXBvbmVudCBoYXMgYW55IGZhY2V0cywNCi0gICAqICAgICAgICAgIGZhbHNlICBvdGhlcndpc2UNCi0gICAqLw0KLSAgcHVibGljIGJvb2xlYW4gaGFzRmFjZXRzKCkNCi0gIHsNCi0gICAgYm9vbGVhbiBoYXNGYWNldHMgPSAhX2ZhY2V0cy5pc0VtcHR5KCk7DQotDQotICAgIENvbXBvbmVudEJlYW4gY29tcG9uZW50ID0gcmVzb2x2ZUNvbXBvbmVudFR5cGUoKTsNCi0gICAgaWYgKGNvbXBvbmVudCAhPSBudWxsKQ0KLSAgICAgIGhhc0ZhY2V0cyB8PSBjb21wb25lbnQuaGFzRmFjZXRzKCk7DQotDQotICAgIHJldHVybiBoYXNGYWNldHM7DQotICB9DQotDQotICAvKioNCi0gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGNvbXBvbmVudCBvciBhbnkgY29tcG9uZW50IHN1cGVydHlwZQ0KLSAgICogaGFzIGFueSBmYWNldHMuDQotICAgKg0KLSAgICogQHJldHVybiAgdHJ1ZSAgIGlmIHRoaXMgY29tcG9uZW50IG9yIGFueSBzdXBlcnR5cGUgaGFzIGFueSBmYWNldHMsDQotICAgKiAgICAgICAgICBmYWxzZSAgb3RoZXJ3aXNlDQotICAgKi8NCi0gIHB1YmxpYyBib29sZWFuIGhhc0ZhY2V0cygNCi0gICAgYm9vbGVhbiBmbGF0dGVuKQ0KLSAgew0KLSAgICBib29sZWFuIGhhc0ZhY2V0cyA9IGhhc0ZhY2V0cygpOw0KLQ0KLSAgICBpZiAoIWhhc0ZhY2V0cyAmJiBmbGF0dGVuKQ0KLSAgICB7DQotICAgICAgQ29tcG9uZW50QmVhbiBjb21wb25lbnQgPSByZXNvbHZlQ29tcG9uZW50VHlwZSgpOw0KLSAgICAgIGlmIChjb21wb25lbnQgIT0gbnVsbCkNCi0gICAgICB7DQotICAgICAgICBDb21wb25lbnRCZWFuIHBhcmVudCA9IGNvbXBvbmVudC5yZXNvbHZlU3VwZXJ0eXBlKCk7DQotICAgICAgICBpZiAocGFyZW50ICE9IG51bGwpDQotICAgICAgICAgIGhhc0ZhY2V0cyB8PSBwYXJlbnQuaGFzRmFjZXRzKHRydWUpOw0KLSAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICByZXR1cm4gaGFzRmFjZXRzOw0KLSAgfQ0KLQ0KLSAgLyoqDQotICAgKiBSZXR1cm5zIGFuIGl0ZXJhdG9yIGZvciBhbGwgZmFjZXRzIG9uIHRoaXMgY29tcG9uZW50IG9ubHkuDQotICAgKg0KLSAgICogQHJldHVybiAgdGhlIGZhY2V0IGl0ZXJhdG9yDQotICAgKi8NCi0gIHB1YmxpYyBJdGVyYXRvciBmYWNldHMoKQ0KLSAgew0KLSAgICBJdGVyYXRvciBmYWNldHMgPSBfZmFjZXRzLnZhbHVlcygpLml0ZXJhdG9yKCk7DQotDQotICAgIENvbXBvbmVudEJlYW4gY29tcG9uZW50ID0gcmVzb2x2ZUNvbXBvbmVudFR5cGUoKTsNCi0gICAgaWYgKGNvbXBvbmVudCAhPSBudWxsKQ0KLSAgICAgICAgZmFjZXRzID0gbmV3IENvbXBvdW5kSXRlcmF0b3IoZmFjZXRzLCBjb21wb25lbnQuZmFjZXRzKCkpOw0KLQ0KLSAgICByZXR1cm4gZmFjZXRzOw0KLSAgfQ0KLQ0KLSAgLyoqDQotICAgKiBSZXR1cm5zIGFuIGl0ZXJhdG9yIGZvciBmYWNldHMgb24gdGhpcyBjb21wb25lbnQuDQotICAgKg0KLSAgKiBAcGFyYW0gZmxhdHRlbiAgdHJ1ZSAgIGlmIHRoZSBpdGVyYXRvciBzaG91bGQgYmUgYSBjb21iaW5lZCBsaXN0IG9mDQotICAqICAgICAgICAgICAgICAgICAgICAgICAgZmFjZXRzIG9mIHRoaXMgY29tcG9uZW50IGFuZCBpdHMgc3VwZXJ0eXBlLA0KLSAgKiAgICAgICAgICAgICAgICAgZmFsc2UgIG90aGVyd2lzZQ0KLSAgKg0KLSAgKiBAcmV0dXJuICB0aGUgZmFjZXQgaXRlcmF0b3INCi0gICovDQotICBwdWJsaWMgSXRlcmF0b3IgZmFjZXRzKA0KLSAgICBib29sZWFuIGZsYXR0ZW4pDQotICB7DQotICAgIEl0ZXJhdG9yIGZhY2V0cyA9IGZhY2V0cygpOw0KLSAgICBpZiAoZmxhdHRlbikNCi0gICAgew0KLSAgICAgIENvbXBvbmVudEJlYW4gY29tcG9uZW50ID0gcmVzb2x2ZUNvbXBvbmVudFR5cGUoKTsNCi0gICAgICBpZiAoY29tcG9uZW50ICE9IG51bGwpDQotICAgICAgew0KLSAgICAgICAgQ29tcG9uZW50QmVhbiBwYXJlbnQgPSBjb21wb25lbnQucmVzb2x2ZVN1cGVydHlwZSgpOw0KLSAgICAgICAgaWYgKHBhcmVudCAhPSBudWxsKQ0KLSAgICAgICAgICBmYWNldHMgPSBuZXcgQ29tcG91bmRJdGVyYXRvcihmYWNldHMsIHBhcmVudC5mYWNldHModHJ1ZSkpOw0KLSAgICAgIH0NCi0gICAgfQ0KLSAgICByZXR1cm4gZmFjZXRzOw0KLSAgfQ0KLQ0KLSAgLyoqDQotICAgKiBSZXR1cm5zIHRoZSBjb21wb25lbnQgdHlwZSBpbnN0YW5jZS4NCi0gICAqDQotICAgKiBAcmV0dXJuICB0aGUgY29tcG9uZW50IHR5cGUgaW5zdGFuY2UNCi0gICAqLw0KLSAgcHVibGljIENvbXBvbmVudEJlYW4gcmVzb2x2ZUNvbXBvbmVudFR5cGUoKQ0KLSAgew0KLSAgICBpZiAoX2NvbXBvbmVudFR5cGUgPT0gbnVsbCkNCi0gICAgICByZXR1cm4gbnVsbDsNCi0NCi0gICAgRmFjZXNDb25maWdCZWFuIG93bmVyID0gZ2V0T3duZXIoKTsNCi0gICAgcmV0dXJuIChvd25lciAhPSBudWxsKSA/IG93bmVyLmZpbmRDb21wb25lbnQoX2NvbXBvbmVudFR5cGUpIDogbnVsbDsNCi0gIH0NCi0NCi0gIHByaXZhdGUgU3RyaW5nICBfZGVzY3JpcHRpb247DQotICBwcml2YXRlIFN0cmluZyAgX2NvbXBvbmVudEZhbWlseTsNCi0gIHByaXZhdGUgU3RyaW5nICBfcmVuZGVyZXJUeXBlOw0KLSAgcHJpdmF0ZSBTdHJpbmcgIF9yZW5kZXJlckNsYXNzOw0KLSAgcHJpdmF0ZSBTdHJpbmcgIF9yZW5kZXJlclN1cGVyY2xhc3M7DQotICBwcml2YXRlIFN0cmluZyAgX2NvbXBvbmVudFR5cGU7DQotICBwcml2YXRlIE1hcCAgICAgX2F0dHJpYnV0ZXM7DQotICBwcml2YXRlIE1hcCAgICAgX2ZhY2V0czsNCi19DQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci90cmluaWRhZC9wYXJzZS9TY3JlZW5zaG90QmVhbi5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci90cmluaWRhZC9wYXJzZS9TY3JlZW5zaG90QmVhbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTcyZmViLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvdHJpbmlkYWQvcGFyc2UvU2NyZWVuc2hvdEJlYW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi0vKg0KLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICogDQotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqIA0KLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqICB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uYnVpbGRlci50cmluaWRhZC5wYXJzZTsNCi0NCi0vKioNCi0gKiBTY3JlZW5zaG90QmVhbiBpcyBhIEphdmEgcmVwcmVzZW50YXRpb24gb2YgdGhlIGZhY2VzLWNvbmZpZyBtZnA6c2NyZWVuc2hvdA0KLSAqIFhNTCBlbGVtZW50Lg0KLSAqIEFuIGV4YW1wbGUgb2YgaG93IHRoZSBTY3JlZW5zaG90QmVhbiB3b3VsZCBiZSByZXByZXNlbnRlZCBhcyBhbiBYTUwgZWxlbWVudCBpczoNCi0gKiA8bWZwOnNjcmVlbnNob3Q+DQotICogICA8bWZwOmltYWdlPg0KLSAqICAgICA8IVtDREFUQVsNCi0gKiAgICAgPGltZyBzcmM9Ii4uL2ltYWdlcy9pbnB1dERhdGUucG5nIiBhbHQ9ImlucHV0RGF0ZSBzY3JlZW5zaG90Ij48L2ltZz4NCi0gKiAgICAgXV0+IA0KLSAqICAgPC9tZnA6aW1hZ2U+DQotICogICA8bWZwOmRlc2NyaXB0aW9uPg0KLSAqICAgICBpbnB1dERhdGUgY29tcG9uZW50IGFzIHNob3duIHdoZW4gcmVuZGVyZWQgaW4gYSBzaW1wbGUgZm9ybQ0KLSAqICAgPC9tZnA6ZGVzY3JpcHRpb24+DQotICogPC9tZnA6c2NyZWVuc2hvdD4NCi0gKi8NCi1wdWJsaWMgY2xhc3MgU2NyZWVuc2hvdEJlYW4gZXh0ZW5kcyBPYmplY3RCZWFuDQotew0KLSAgLyoqDQotICAgKiBHZXQgRGVzY3JpcHRpb24gVGV4dC4gVGhlIGRlc2NyaXB0aW9uIHRleHQgaXMgdXNlZCBhcyBhIGNhcHRpb24gZm9yIHRoZSBzY3JlZW4NCi0gICAqIHNob3QgaW1hZ2UgaW4gdGhlIGdlbmVyYXRlZCB0YWcgZG9jLg0KLSAgICogDQotICAgKiBAcmV0dXJuIFNjcmVlbnNob3QgRGVzY3JpcHRpb24gVGV4dA0KLSAgICovDQotICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkNCi0gIHsNCi0gICAgcmV0dXJuIF9kZXNjcmlwdGlvbjsNCi0gIH0NCi0NCi0gIC8qKg0KLSAgICogU2V0IHNjcmVlbnNob3QgRGVzY3JpcHRpb24gVGV4dC4gIFRoZSBkZXNjcmlwdGlvbiB0ZXh0IGlzIHVzZWQgYXMgYSBjYXB0aW9uIGZvciB0aGUgc2NyZWVuDQotICAgKiBzaG90IGltYWdlIGluIHRoZSBnZW5lcmF0ZWQgdGFnIGRvYy4NCi0gICAqDQotICAgKiBAcGFyYW0gZGVzY3JpcHRpb24gICBzY3JlZW5zaG90IERlc2NyaXB0aW9uIFRleHQuDQotICAgKi8NCi0gIHB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKCBTdHJpbmcgZGVzY3JpcHRpb24gKQ0KLSAgew0KLSAgICBfZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsNCi0gIH0NCi0NCi0gIC8qKg0KLSAgICogUmV0dXJucyBpbWFnZSBTY3JlZW5zaG90Lg0KLSAgICoNCi0gICAqIEByZXR1cm4gaW1hZ2UgU2NyZWVuc2hvdA0KLSAgICovDQotICBwdWJsaWMgU3RyaW5nIGdldEltYWdlKCkNCi0gIHsNCi0gICAgcmV0dXJuIF9pbWFnZTsNCi0gIH0NCi0NCi0gIC8qKg0KLSAgICogU2V0IGltYWdlIGZvciBzY3JlZW5zaG90LiANCi0gICAqDQotICAgKiBAcGFyYW0gaW1hZ2UgIGltYWdlIHNjcmVlbnNob3QgdG8gYmUgYWRkZWQgdG8gdGhlIGxpc3QuDQotICAgKi8NCi0gIHB1YmxpYyB2b2lkIHNldEltYWdlKCBTdHJpbmcgaW1hZ2UgKQ0KLSAgew0KLSAgICBfaW1hZ2UgPSBpbWFnZTsNCi0gIH0NCi0NCi0gIC8qKg0KLSAgICogUmV0dXJucyBTY3JlZW5zaG90IGhhc2htYXAga2V5Lg0KLSAgICoNCi0gICAqIEByZXR1cm4gU2NyZWVuc2hvdCBoYXNobWFwIGtleQ0KLSAgICovDQotICBwdWJsaWMgU3RyaW5nIGdldEtleSgpDQotICB7DQotICAgIHJldHVybiBfa2V5Ow0KLSAgfQ0KLQ0KLSAgLyoqDQotICAgKiBTZXQgaGFzaG1hcCBrZXkgZm9yIHRoaXMgc2NyZWVuc2hvdC4NCi0gICAqDQotICAgKiBAcGFyYW0ga2V5IFNldCBrZXkgZm9yIHRoaXMgc2NyZWVuc2hvdCBwdXQgaW4gDQotICAgKiAgICAgICAgQ29tcG9uZW50QmVhbiBfc2NyZWVuc2hvdHMgaGFzaG1hcC4NCi0gICAqLw0KLSAgcHJvdGVjdGVkIHZvaWQgc2V0S2V5KCBTdHJpbmcga2V5ICkNCi0gIHsNCi0gICAgX2tleSA9IGtleTsNCi0gIH0NCi0NCi0gIHByaXZhdGUgU3RyaW5nIF9kZXNjcmlwdGlvbiAgPSBudWxsOw0KLSAgcHJpdmF0ZSBTdHJpbmcgX2ltYWdlICAgICAgICA9IG51bGw7DQotICBwcml2YXRlIFN0cmluZyBfa2V5ICAgICAgICAgID0gbnVsbDsNCi19DQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci90cmluaWRhZC9wYXJzZS9WYWxpZGF0b3JCZWFuLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL3RyaW5pZGFkL3BhcnNlL1ZhbGlkYXRvckJlYW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjEzM2E1ZS4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL3RyaW5pZGFkL3BhcnNlL1ZhbGlkYXRvckJlYW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MCArMCwwIEBACi0vKg0KLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICogDQotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqIA0KLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqICB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uYnVpbGRlci50cmluaWRhZC5wYXJzZTsNCi0NCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTW9kaWZpZXI7DQotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsNCi0NCi0vKioNCi0gKiBWYWxpZGF0b3JCZWFuIGlzIGEgSmF2YSByZXByZXNlbnRhdGlvbiBvZiB0aGUgZmFjZXMtY29uZmlnIHZhbGlkYXRvcg0KLSAqIFhNTCBlbGVtZW50Lg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBWYWxpZGF0b3JCZWFuIGV4dGVuZHMgQWJzdHJhY3RUYWdCZWFuIHsNCi0NCi0gIC8qKg0KLSAgICogU2V0cyB0aGUgdmFsaWRhdG9yIGlkZW50aWZlciBmb3IgdGhpcyBjb21wb25lbnQuDQotICAgKg0KLSAgICogQHBhcmFtIHZhbGlkYXRvcklkICB2YWxpZGF0b3IgaWRlbnRpZmVyDQotICAgKi8NCi0gIHB1YmxpYyB2b2lkIHNldFZhbGlkYXRvcklkKA0KLSAgICBTdHJpbmcgdmFsaWRhdG9ySWQpDQotICB7DQotICAgIF92YWxpZGF0b3JJZCA9IHZhbGlkYXRvcklkOw0KLSAgfQ0KLSAgDQotICAvKioNCi0gICAqIFNldHMgdGhlICJyb290IiB2YWxpZGF0b3IgSWQgcmVwcmVzZW50aW5nIHRoZSBJRCBkZWZpbmVkIGluIGZhY2VzLWNvbmZpZw0KLSAgICogVGhlIHJvb3QgaWQgd2lsbCBiZSB1c2VkIHdoaWxlIHRoZSB0YWcgZGVmaW5pdGlvbiBpcyB3cml0dGVuIG91dCwNCi0gICAqIHdoaWxlIHRoZSByZWd1bGFyIElkIGlzIHVzZWQgZm9yIHRoZSBsb29rdXAgb2YgZXhpc3RpbmcgdmFsaWRhdG9ycy4NCi0gICAqIFRoaXMgYWxsb3dzIHVzIHRvIGRlZmluZSBuZXcgdGFncyBmb3IgdGhlIGV4aXN0aW5nIHZhbGlkYXRvciBJRHMNCi0gICAqIEBwYXJhbSBpZCByb290IHZhbGlkYXRvciBpZA0KLSAgICovDQotICBwdWJsaWMgdm9pZCBzZXRSb290VmFsaWRhdG9ySWQoU3RyaW5nIGlkKQ0KLSAgew0KLSAgICBfcm9vdFZhbGlkYXRvcklkID0gaWQ7DQotICB9DQotICANCi0gIC8qKg0KLSAgICogUmV0dXJucyB0aGUgcm9vdCB2YWxpZGF0b3IgaWQNCi0gICAqIEByZXR1cm4gcm9vdCB2YWxpZGF0b3IgaWQNCi0gICAqLw0KLSAgcHVibGljIFN0cmluZyBnZXRSb290VmFsaWRhdG9ySWQoKQ0KLSAgew0KLSAgICByZXR1cm4gX3Jvb3RWYWxpZGF0b3JJZDsNCi0gIH0NCi0NCi0gIC8qKg0KLSAgICogUmV0dXJucyB0cnVlIGlmIHRoZSB2YWxpZGF0b3IgaWRlbnRpZmllciBpcyBzcGVjaWZpZWQsIG90aGVyd2lzZSBmYWxzZS4NCi0gICAqDQotICAgKiBAcmV0dXJuICB0cnVlIGlmIHRoZSB2YWxpZGF0b3IgaWRlbnRpZmllciBpcyBzcGVjaWZpZWQsDQotICAgKiAgICAgICAgICBvdGhlcndpc2UgZmFsc2UuDQotICAgKi8NCi0gIHB1YmxpYyBib29sZWFuIGhhc1ZhbGlkYXRvcklkKCkNCi0gIHsNCi0gICAgcmV0dXJuIChfdmFsaWRhdG9ySWQgIT0gbnVsbCk7DQotICB9DQotDQotICAvKioNCi0gICAqIFJldHVybnMgdGhlIHZhbGlkYXRvciBpZGVudGlmaWVyIGZvciB0aGlzIGNvbXBvbmVudC4NCi0gICAqDQotICAgKiBAcmV0dXJuICB0aGUgdmFsaWRhdG9yIGlkZW50aWZpZXINCi0gICAqLw0KLSAgcHVibGljIFN0cmluZyBnZXRWYWxpZGF0b3JJZCgpDQotICB7DQotICAgIHJldHVybiBfdmFsaWRhdG9ySWQ7DQotICB9DQotDQotICAvKioNCi0gICAqIFNldHMgdGhlIHZhbGlkYXRvciBjbGFzcyBmb3IgdGhpcyBjb21wb25lbnQuDQotICAgKg0KLSAgICogQHBhcmFtIHZhbGlkYXRvckNsYXNzICB0aGUgdmFsaWRhdG9yIGNsYXNzDQotICAgKi8NCi0gIHB1YmxpYyB2b2lkIHNldFZhbGlkYXRvckNsYXNzKA0KLSAgICBTdHJpbmcgdmFsaWRhdG9yQ2xhc3MpDQotICB7DQotICAgIF92YWxpZGF0b3JDbGFzcyA9IHZhbGlkYXRvckNsYXNzOw0KLSAgfQ0KLQ0KLSAgLyoqDQotICAgKiBSZXR1cm5zIHRoZSB2YWxpZGF0b3IgY2xhc3MgZm9yIHRoaXMgY29tcG9uZW50Lg0KLSAgICoNCi0gICAqIEByZXR1cm4gIHRoZSB2YWxpZGF0b3IgY2xhc3MNCi0gICAqLw0KLSAgcHVibGljIFN0cmluZyBnZXRWYWxpZGF0b3JDbGFzcygpDQotICB7DQotICAgIHJldHVybiBfdmFsaWRhdG9yQ2xhc3M7DQotICB9DQotDQotICAvKioNCi0gICAqIFNldHMgdGhlIHZhbGlkYXRvciBzdXBlciBjbGFzcyBmb3IgdGhpcyBjb21wb25lbnQuDQotICAgKg0KLSAgICogQHBhcmFtIHZhbGlkYXRvclN1cGVyQ2xhc3MgIHRoZSB2YWxpZGF0b3Igc3VwZXIgY2xhc3MNCi0gICAqLw0KLSAgcHVibGljIHZvaWQgc2V0VmFsaWRhdG9yU3VwZXJDbGFzcygNCi0gICAgU3RyaW5nIHZhbGlkYXRvclN1cGVyQ2xhc3MpDQotICB7DQotICAgIF92YWxpZGF0b3JTdXBlckNsYXNzID0gdmFsaWRhdG9yU3VwZXJDbGFzczsNCi0gIH0NCi0NCi0gIC8qKg0KLSAgICogUmV0dXJucyB0aGUgdmFsaWRhdG9yIHN1cGVyIGNsYXNzIGZvciB0aGlzIGNvbXBvbmVudC4NCi0gICAqDQotICAgKiBAcmV0dXJuICB0aGUgdmFsaWRhdG9yIHN1cGVyIGNsYXNzDQotICAgKi8NCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VmFsaWRhdG9yU3VwZXJDbGFzcygpDQotICB7DQotICAgIHJldHVybiBfdmFsaWRhdG9yU3VwZXJDbGFzczsNCi0gIH0NCi0NCi0gIC8qKg0KLSAgICogQWRkcyBhIEphdmEgTGFuZ3VhZ2UgY2xhc3MgbW9kaWZpZXIgdG8gdGhlIHZhbGlkYXRvciBjbGFzcy4NCi0gICAqDQotICAgKiBAcGFyYW0gbW9kaWZpZXIgIHRoZSBtb2RpZmllciB0byBiZSBhZGRlZA0KLSAgICovDQotICBwdWJsaWMgdm9pZCBhZGRWYWxpZGF0b3JDbGFzc01vZGlmaWVyKA0KLSAgICBpbnQgbW9kaWZpZXIpDQotICB7DQotICAgIF92YWxpZGF0b3JDbGFzc01vZGlmaWVycyB8PSBtb2RpZmllcjsNCi0gIH0NCi0NCi0gIC8qKg0KLSAgICogUmV0dXJucyB0aGUgSmF2YSBMYW5ndWFnZSBjbGFzcyBtb2RpZmllcnMgZm9yIHRoZSB2YWxpZGF0b3IgY2xhc3MuDQotICAgKiBCeSBkZWZhdWx0LCB0aGVzZSBtb2RpZmllcnMgaW5jbHVkZSBNb2RpZmllci5QVUJMSUMuDQotICAgKg0KLSAgICogQHJldHVybiAgdGhlIEphdmEgTGFuZ3VhZ2UgY2xhc3MgbW9kaWZpZXJzIGZvciB0aGUgdmFsaWRhdG9yIGNsYXNzDQotICAgKi8NCi0gIHB1YmxpYyBpbnQgZ2V0VmFsaWRhdG9yQ2xhc3NNb2RpZmllcnMoKQ0KLSAgew0KLSAgICBpbnQgbW9kaWZpZXJzID0gX3ZhbGlkYXRvckNsYXNzTW9kaWZpZXJzOw0KLQ0KLSAgICBpZiAoIU1vZGlmaWVyLmlzUHJpdmF0ZShtb2RpZmllcnMpICYmDQotICAgICAgICAhTW9kaWZpZXIuaXNQcm90ZWN0ZWQobW9kaWZpZXJzKSAmJg0KLSAgICAgICAgIU1vZGlmaWVyLmlzUHVibGljKG1vZGlmaWVycykpDQotICAgIHsNCi0gICAgICBtb2RpZmllcnMgfD0gTW9kaWZpZXIuUFVCTElDOw0KLSAgICB9DQotDQotICAgIHJldHVybiBtb2RpZmllcnM7DQotICB9DQotDQotICBwdWJsaWMgdm9pZCBwYXJzZVZhbGlkYXRvckNsYXNzTW9kaWZpZXIoDQotICAgIFN0cmluZyBtb2RpZmllcikNCi0gIHsNCi0gICAgYWRkVmFsaWRhdG9yQ2xhc3NNb2RpZmllcihfcGFyc2VNb2RpZmllcihtb2RpZmllcikpOw0KLSAgfQ0KLQ0KLSAgcHJpdmF0ZSBTdHJpbmcgIF92YWxpZGF0b3JJZDsNCi0gIHByaXZhdGUgU3RyaW5nICBfcm9vdFZhbGlkYXRvcklkOw0KLSAgcHJpdmF0ZSBTdHJpbmcgIF92YWxpZGF0b3JDbGFzczsNCi0gIHByaXZhdGUgU3RyaW5nICBfdmFsaWRhdG9yU3VwZXJDbGFzczsNCi0gIHByaXZhdGUgaW50ICAgICBfdmFsaWRhdG9yQ2xhc3NNb2RpZmllcnM7DQotDQotDQotICBzdGF0aWMgcHJpdmF0ZSBmaW5hbCBMb2dnZXIgX0xPRyA9IExvZ2dlci5nZXRMb2dnZXIoVmFsaWRhdG9yQmVhbi5jbGFzcy5nZXROYW1lKCkpOw0KLX0NCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL3RyaW5pZGFkL3BhcnNlL2NvbnZlcnRlcnMvUU5hbWVDb252ZXJ0ZXIuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvdHJpbmlkYWQvcGFyc2UvY29udmVydGVycy9RTmFtZUNvbnZlcnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjBjMWMyLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvdHJpbmlkYWQvcGFyc2UvY29udmVydGVycy9RTmFtZUNvbnZlcnRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoNCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqIA0KLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKiANCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmJ1aWxkZXIudHJpbmlkYWQucGFyc2UuY29udmVydGVyczsNCi0NCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmJlYW51dGlscy5Db252ZXJzaW9uRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuYmVhbnV0aWxzLkNvbnZlcnRVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmJlYW51dGlscy5Db252ZXJ0ZXI7DQotDQotcHVibGljIGZpbmFsIGNsYXNzIFFOYW1lQ29udmVydGVyIGltcGxlbWVudHMgQ29udmVydGVyDQotew0KLSAgcHVibGljIE9iamVjdCBjb252ZXJ0KA0KLSAgICBDbGFzcyAgdHlwZSwNCi0gICAgT2JqZWN0IHZhbHVlKQ0KLSAgew0KLSAgICBpZiAodmFsdWUgPT0gbnVsbCkNCi0gICAgICB0aHJvdyBuZXcgQ29udmVyc2lvbkV4Y2VwdGlvbigiTWlzc2luZyB2YWx1ZSIpOw0KLQ0KLSAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBRTmFtZSkNCi0gICAgICByZXR1cm4gdmFsdWU7DQotDQotICAgIHRyeQ0KLSAgICB7DQotICAgICAgcmV0dXJuIFFOYW1lLnZhbHVlT2YodmFsdWUudG9TdHJpbmcoKSk7DQotICAgIH0NCi0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQ0KLSAgICB7DQotICAgICAgdGhyb3cgbmV3IENvbnZlcnNpb25FeGNlcHRpb24oZSk7DQotICAgIH0NCi0gIH0NCi0NCi0gIHN0YXRpYyBwdWJsaWMgdm9pZCByZWdpc3RlcigpDQotICB7DQotICAgIENvbnZlcnRVdGlscy5yZWdpc3RlcihuZXcgUU5hbWVDb252ZXJ0ZXIoKSwgUU5hbWUuY2xhc3MpOw0KLSAgfQ0KLX0NCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL3RyaW5pZGFkL3BhcnNlL3J1bGVzL0JlYW5Qcm9wZXJ0eVNldHRlclJ1bGUuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvdHJpbmlkYWQvcGFyc2UvcnVsZXMvQmVhblByb3BlcnR5U2V0dGVyUnVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZDA2NzMxLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvdHJpbmlkYWQvcGFyc2UvcnVsZXMvQmVhblByb3BlcnR5U2V0dGVyUnVsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLyoNCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqIA0KLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKiANCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmJ1aWxkZXIudHJpbmlkYWQucGFyc2UucnVsZXM7DQotDQotaW1wb3J0IGphdmEuYmVhbnMuUHJvcGVydHlEZXNjcmlwdG9yOw0KLQ0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmJ1aWxkZXIudHJpbmlkYWQucGFyc2UuY29udmVydGVycy5RTmFtZUNvbnZlcnRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmJlYW51dGlscy5CZWFuVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5iZWFudXRpbHMuUHJvcGVydHlVdGlsczsNCi0NCi0NCi0vKioNCi0gKiBFeHRlbmRzIEFwYWNoZSBDb21tb25zIERpZ2VzdGVyIEJlYW5Qcm9wZXJ0eVNldHRlclJ1bGUgdG8gYWRkIFFOYW1lIHN1cHBvcnQuDQotICoNCi0gKiBBIFFOYW1lIGNvbnZldGVyIGlzIG5vdCBzdWZmaWNpZW50IGJlY2F1c2UgaXQgcmVxdWlyZXMgY29udGV4dHVhbA0KLSAqIGtub3dsZWRnZSBvZiB0aGUgY3VycmVudCBwcmVmaXgtdG8tbmFtZXNwYWNlIG1hcHBpbmdzLg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBCZWFuUHJvcGVydHlTZXR0ZXJSdWxlDQotICAgICAgIGV4dGVuZHMgb3JnLmFwYWNoZS5jb21tb25zLmRpZ2VzdGVyLkJlYW5Qcm9wZXJ0eVNldHRlclJ1bGUNCi17DQotICBwdWJsaWMgQmVhblByb3BlcnR5U2V0dGVyUnVsZSgNCi0gICAgU3RyaW5nIHByb3BlcnR5TmFtZSkNCi0gIHsNCi0gICAgc3VwZXIocHJvcGVydHlOYW1lKTsNCi0gIH0NCi0NCi0gIHB1YmxpYyB2b2lkIGVuZCgNCi0gICAgU3RyaW5nIG5hbWVzcGFjZSwNCi0gICAgU3RyaW5nIG5hbWUpIHRocm93cyBFeGNlcHRpb24NCi0gIHsNCi0gICAgT2JqZWN0IHRvcCA9IGRpZ2VzdGVyLnBlZWsoKTsNCi0NCi0gICAgUHJvcGVydHlEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPQ0KLSAgICAgICAgICBQcm9wZXJ0eVV0aWxzLmdldFByb3BlcnR5RGVzY3JpcHRvcih0b3AsIHByb3BlcnR5TmFtZSk7DQotDQotICAgIGlmIChkZXNjcmlwdG9yID09IG51bGwpDQotICAgIHsNCi0gICAgICB0aHJvdyBuZXcgTm9TdWNoTWV0aG9kRXhjZXB0aW9uKCJNaXNzaW5nIGJlYW4gcHJvcGVydHkgXCIiICsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5TmFtZSArICJcIiIpOw0KLSAgICB9DQotDQotICAgIENsYXNzIHByb3BlcnR5VHlwZSA9IGRlc2NyaXB0b3IuZ2V0UHJvcGVydHlUeXBlKCk7DQotDQotICAgIGlmIChRTmFtZS5jbGFzcy5lcXVhbHMocHJvcGVydHlUeXBlKSkNCi0gICAgew0KLSAgICAgIGludCBjb2xvbiA9IGJvZHlUZXh0LmluZGV4T2YoJzonKTsNCi0gICAgICBpZiAoY29sb24gIT0gLTEpDQotICAgICAgew0KLSAgICAgICAgU3RyaW5nIG5hbWVzcGFjZVVSSSA9IGRpZ2VzdGVyLmZpbmROYW1lc3BhY2VVUkkoYm9keVRleHQuc3Vic3RyaW5nKDAsIGNvbG9uKSk7DQotICAgICAgICBib2R5VGV4dCA9ICJ7IiArIG5hbWVzcGFjZVVSSSArICJ9IiArIGJvZHlUZXh0LnN1YnN0cmluZyhjb2xvbiArIDEpOw0KLSAgICAgIH0NCi0gICAgICBlbHNlIGlmIChib2R5VGV4dC5pbmRleE9mKCd7JykgPT0gLTEpDQotICAgICAgew0KLSAgICAgICAgU3RyaW5nIG5hbWVzcGFjZVVSSSA9IGRpZ2VzdGVyLmZpbmROYW1lc3BhY2VVUkkoIiIpOw0KLSAgICAgICAgYm9keVRleHQgPSAieyIgKyBuYW1lc3BhY2VVUkkgKyAifSIgKyBib2R5VGV4dC5zdWJzdHJpbmcoY29sb24gKyAxKTsNCi0gICAgICB9DQotICAgICAgQmVhblV0aWxzLnNldFByb3BlcnR5KHRvcCwgcHJvcGVydHlOYW1lLCBib2R5VGV4dCk7DQotICAgIH0NCi0gICAgZWxzZQ0KLSAgICB7DQotICAgICAgc3VwZXIuZW5kKG5hbWVzcGFjZSwgbmFtZSk7DQotICAgIH0NCi0gIH0NCi0NCi0gIHN0YXRpYw0KLSAgew0KLSAgICBRTmFtZUNvbnZlcnRlci5yZWdpc3RlcigpOw0KLSAgfQ0KLX0NCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL3RyaW5pZGFkL3V0aWwvQXR0cmlidXRlRmlsdGVyLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL3RyaW5pZGFkL3V0aWwvQXR0cmlidXRlRmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4NDVjOTMuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci90cmluaWRhZC91dGlsL0F0dHJpYnV0ZUZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoNCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqIA0KLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKiANCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmJ1aWxkZXIudHJpbmlkYWQudXRpbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5idWlsZGVyLnRyaW5pZGFkLnBhcnNlLkF0dHJpYnV0ZUJlYW47DQotDQotYWJzdHJhY3QgcHVibGljIGNsYXNzIEF0dHJpYnV0ZUZpbHRlciBpbXBsZW1lbnRzIEZpbHRlcg0KLXsNCi0gIGZpbmFsIHB1YmxpYyBib29sZWFuIGFjY2VwdCgNCi0gICAgT2JqZWN0IG9iaikNCi0gIHsNCi0gICAgcmV0dXJuIGFjY2VwdCgoQXR0cmlidXRlQmVhbilvYmopOw0KLSAgfQ0KLQ0KLSAgYWJzdHJhY3QgcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KA0KLSAgICBBdHRyaWJ1dGVCZWFuIGF0dHJpYnV0ZSk7DQotfQ0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvdHJpbmlkYWQvdXRpbC9Db21wb25lbnRGaWx0ZXIuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvdHJpbmlkYWQvdXRpbC9Db21wb25lbnRGaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODIxN2ExOC4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL3RyaW5pZGFkL3V0aWwvQ29tcG9uZW50RmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKg0KLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICogDQotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqIA0KLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqICB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uYnVpbGRlci50cmluaWRhZC51dGlsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmJ1aWxkZXIudHJpbmlkYWQucGFyc2UuQ29tcG9uZW50QmVhbjsNCi0NCi1hYnN0cmFjdCBwdWJsaWMgY2xhc3MgQ29tcG9uZW50RmlsdGVyIGltcGxlbWVudHMgRmlsdGVyDQotew0KLSAgZmluYWwgcHVibGljIGJvb2xlYW4gYWNjZXB0KA0KLSAgICBPYmplY3Qgb2JqKQ0KLSAgew0KLSAgICByZXR1cm4gYWNjZXB0KChDb21wb25lbnRCZWFuKW9iaik7DQotICB9DQotDQotICBhYnN0cmFjdCBwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHQoDQotICAgIENvbXBvbmVudEJlYW4gY29tcG9uZW50KTsNCi19DQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci90cmluaWRhZC91dGlsL0NvbXBvdW5kSXRlcmF0b3IuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvdHJpbmlkYWQvdXRpbC9Db21wb3VuZEl0ZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwMDY4NWMuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci90cmluaWRhZC91dGlsL0NvbXBvdW5kSXRlcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qDQotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKiANCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICogDQotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5idWlsZGVyLnRyaW5pZGFkLnV0aWw7DQotDQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCi1pbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247DQotDQotLyoqDQotICogQ29tcG91bmRJdGVyYXRvciBjb25zdW1lcyB0aGUgaW5pdGlhbCBpdGVyYXRvciBiZWZvcmUNCi0gKiBvYnNlcnZpbmcgdGhlIG5leHQgaXRlcmF0b3IuDQotICovDQotcHVibGljIGNsYXNzIENvbXBvdW5kSXRlcmF0b3IgaW1wbGVtZW50cyBJdGVyYXRvcg0KLXsNCi0gIHB1YmxpYyBDb21wb3VuZEl0ZXJhdG9yKA0KLSAgICBJdGVyYXRvciBwcmltYXJ5LA0KLSAgICBJdGVyYXRvciBzZWNvbmRhcnkpDQotICB7DQotICAgIHRoaXMobmV3IEl0ZXJhdG9yW10ge3ByaW1hcnksIHNlY29uZGFyeX0pOw0KLSAgfQ0KLQ0KLSAgcHVibGljIENvbXBvdW5kSXRlcmF0b3IoDQotICAgIEl0ZXJhdG9yW10gaXRlcmF0b3JzKQ0KLSAgew0KLSAgICBfaXRlcmF0b3JzID0gaXRlcmF0b3JzOw0KLSAgICBfaW5kZXggPSAwOw0KLSAgICBfYWR2YW5jZSgpOw0KLSAgfQ0KLQ0KLSAgcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpDQotICB7DQotICAgIHJldHVybiAoX25leHQgIT0gbnVsbCk7DQotICB9DQotDQotICBwdWJsaWMgT2JqZWN0IG5leHQoKQ0KLSAgew0KLSAgICBpZiAoX25leHQgPT0gbnVsbCkNCi0gICAgICB0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpOw0KLQ0KLSAgICBPYmplY3Qgb2JqID0gX25leHQ7DQotICAgIF9hZHZhbmNlKCk7DQotICAgIHJldHVybiBvYmo7DQotICB9DQotDQotICBwdWJsaWMgdm9pZCByZW1vdmUoKQ0KLSAgew0KLSAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsNCi0gIH0NCi0NCi0gIHByaXZhdGUgdm9pZCBfYWR2YW5jZSgpDQotICB7DQotICAgIEl0ZXJhdG9yIGN1cnJlbnQgPSBfaXRlcmF0b3JzW19pbmRleF07DQotICAgIGlmIChjdXJyZW50ICE9IG51bGwgJiYgIWN1cnJlbnQuaGFzTmV4dCgpKQ0KLSAgICB7DQotICAgICAgX2luZGV4ICsrOw0KLSAgICAgIGN1cnJlbnQgPSAoX2luZGV4IDwgX2l0ZXJhdG9ycy5sZW5ndGgpID8gX2l0ZXJhdG9yc1tfaW5kZXhdIDogbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBfbmV4dCA9IChjdXJyZW50ICE9IG51bGwgJiYgY3VycmVudC5oYXNOZXh0KCkpID8gY3VycmVudC5uZXh0KCkgOiBudWxsOw0KLSAgfQ0KLQ0KLSAgcHJpdmF0ZSBPYmplY3QgX25leHQ7DQotICBwcml2YXRlIEl0ZXJhdG9yW10gX2l0ZXJhdG9yczsNCi0gIHByaXZhdGUgaW50IF9pbmRleDsNCi19DQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci90cmluaWRhZC91dGlsL0NvbnZlcnRlckZpbHRlci5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci90cmluaWRhZC91dGlsL0NvbnZlcnRlckZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MWFiY2Y1Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvdHJpbmlkYWQvdXRpbC9Db252ZXJ0ZXJGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qDQotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKiANCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICogDQotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5idWlsZGVyLnRyaW5pZGFkLnV0aWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uYnVpbGRlci50cmluaWRhZC5wYXJzZS5Db252ZXJ0ZXJCZWFuOw0KLQ0KLWFic3RyYWN0IHB1YmxpYyBjbGFzcyBDb252ZXJ0ZXJGaWx0ZXIgaW1wbGVtZW50cyBGaWx0ZXINCi17DQotICBmaW5hbCBwdWJsaWMgYm9vbGVhbiBhY2NlcHQoDQotICAgIE9iamVjdCBvYmopDQotICB7DQotICAgIHJldHVybiBhY2NlcHQoKENvbnZlcnRlckJlYW4pb2JqKTsNCi0gIH0NCi0NCi0gIGFic3RyYWN0IHByb3RlY3RlZCBib29sZWFuIGFjY2VwdCgNCi0gICAgQ29udmVydGVyQmVhbiBjb252ZXJ0ZXIpOw0KLX0NCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL3RyaW5pZGFkL3V0aWwvRmFjZXRGaWx0ZXIuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvdHJpbmlkYWQvdXRpbC9GYWNldEZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODNlY2ZkLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvdHJpbmlkYWQvdXRpbC9GYWNldEZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoNCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqIA0KLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKiANCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmJ1aWxkZXIudHJpbmlkYWQudXRpbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5idWlsZGVyLnRyaW5pZGFkLnBhcnNlLkZhY2V0QmVhbjsNCi0NCi1hYnN0cmFjdCBwdWJsaWMgY2xhc3MgRmFjZXRGaWx0ZXIgaW1wbGVtZW50cyBGaWx0ZXINCi17DQotICBmaW5hbCBwdWJsaWMgYm9vbGVhbiBhY2NlcHQoDQotICAgIE9iamVjdCBvYmopDQotICB7DQotICAgIHJldHVybiBhY2NlcHQoKEZhY2V0QmVhbilvYmopOw0KLSAgfQ0KLQ0KLSAgYWJzdHJhY3QgcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KA0KLSAgICBGYWNldEJlYW4gZmFjZXQpOw0KLX0NCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL3RyaW5pZGFkL3V0aWwvRmlsdGVyLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL3RyaW5pZGFkL3V0aWwvRmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3OTA5MWYuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci90cmluaWRhZC91dGlsL0ZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoNCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqIA0KLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKiANCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmJ1aWxkZXIudHJpbmlkYWQudXRpbDsNCi0NCi1wdWJsaWMgaW50ZXJmYWNlIEZpbHRlcg0KLXsNCi0gIGFic3RyYWN0IHB1YmxpYyBib29sZWFuIGFjY2VwdCgNCi0gICAgT2JqZWN0IG9iaik7DQotfQ0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvdHJpbmlkYWQvdXRpbC9GaWx0ZXJlZEl0ZXJhdG9yLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL3RyaW5pZGFkL3V0aWwvRmlsdGVyZWRJdGVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NWI5MTQ4Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvdHJpbmlkYWQvdXRpbC9GaWx0ZXJlZEl0ZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKg0KLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICogDQotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqIA0KLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqICB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uYnVpbGRlci50cmluaWRhZC51dGlsOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQotaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOw0KLQ0KLXB1YmxpYyBjbGFzcyBGaWx0ZXJlZEl0ZXJhdG9yIGltcGxlbWVudHMgSXRlcmF0b3INCi17DQotICBwdWJsaWMgRmlsdGVyZWRJdGVyYXRvcigNCi0gICAgSXRlcmF0b3IgaXRlciwNCi0gICAgRmlsdGVyICAgZmlsdGVyKQ0KLSAgew0KLSAgICBfaXRlciA9IGl0ZXI7DQotICAgIF9maWx0ZXIgPSBmaWx0ZXI7DQotICAgIF9hZHZhbmNlKCk7DQotICB9DQotDQotICBwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkNCi0gIHsNCi0gICAgcmV0dXJuIChfbmV4dCAhPSBudWxsKTsNCi0gIH0NCi0NCi0gIHB1YmxpYyBPYmplY3QgbmV4dCgpDQotICB7DQotICAgIGlmIChfbmV4dCA9PSBudWxsKQ0KLSAgICAgIHRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCk7DQotDQotICAgIE9iamVjdCBvYmogPSBfbmV4dDsNCi0gICAgX2FkdmFuY2UoKTsNCi0gICAgcmV0dXJuIG9iajsNCi0gIH0NCi0NCi0gIHB1YmxpYyB2b2lkIHJlbW92ZSgpDQotICB7DQotICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOw0KLSAgfQ0KLQ0KLSAgcHJpdmF0ZSB2b2lkIF9hZHZhbmNlKCkNCi0gIHsNCi0gICAgd2hpbGUgKF9pdGVyLmhhc05leHQoKSkNCi0gICAgew0KLSAgICAgIE9iamVjdCBvYmogPSBfaXRlci5uZXh0KCk7DQotICAgICAgaWYgKF9maWx0ZXIuYWNjZXB0KG9iaikpDQotICAgICAgew0KLSAgICAgICAgX25leHQgPSBvYmo7DQotICAgICAgICByZXR1cm47DQotICAgICAgfQ0KLSAgICB9DQotDQotICAgIF9uZXh0ID0gbnVsbDsNCi0gIH0NCi0NCi0gIHByaXZhdGUgZmluYWwgSXRlcmF0b3IgX2l0ZXI7DQotICBwcml2YXRlIGZpbmFsIEZpbHRlciBfZmlsdGVyOw0KLSAgcHJpdmF0ZSBPYmplY3QgX25leHQ7DQotfQ0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvdHJpbmlkYWQvdXRpbC9Qcm9wZXJ0eUZpbHRlci5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci90cmluaWRhZC91dGlsL1Byb3BlcnR5RmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3MTZjNDAuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci90cmluaWRhZC91dGlsL1Byb3BlcnR5RmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKg0KLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICogDQotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqIA0KLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqICB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uYnVpbGRlci50cmluaWRhZC51dGlsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmJ1aWxkZXIudHJpbmlkYWQucGFyc2UuUHJvcGVydHlCZWFuOw0KLQ0KLWFic3RyYWN0IHB1YmxpYyBjbGFzcyBQcm9wZXJ0eUZpbHRlciBpbXBsZW1lbnRzIEZpbHRlcg0KLXsNCi0gIGZpbmFsIHB1YmxpYyBib29sZWFuIGFjY2VwdCgNCi0gICAgT2JqZWN0IG9iaikNCi0gIHsNCi0gICAgcmV0dXJuIGFjY2VwdCgoUHJvcGVydHlCZWFuKW9iaik7DQotICB9DQotDQotICBhYnN0cmFjdCBwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHQoDQotICAgIFByb3BlcnR5QmVhbiBwcm9wZXJ0eSk7DQotfQ0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvdHJpbmlkYWQvdXRpbC9SZW5kZXJlckZpbHRlci5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci90cmluaWRhZC91dGlsL1JlbmRlcmVyRmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3NmNkOTkuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci90cmluaWRhZC91dGlsL1JlbmRlcmVyRmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKg0KLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICogDQotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqIA0KLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqICB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uYnVpbGRlci50cmluaWRhZC51dGlsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmJ1aWxkZXIudHJpbmlkYWQucGFyc2UuUmVuZGVyZXJCZWFuOw0KLQ0KLWFic3RyYWN0IHB1YmxpYyBjbGFzcyBSZW5kZXJlckZpbHRlciBpbXBsZW1lbnRzIEZpbHRlcg0KLXsNCi0gIGZpbmFsIHB1YmxpYyBib29sZWFuIGFjY2VwdCgNCi0gICAgT2JqZWN0IG9iaikNCi0gIHsNCi0gICAgcmV0dXJuIGFjY2VwdCgoUmVuZGVyZXJCZWFuKW9iaik7DQotICB9DQotDQotICBhYnN0cmFjdCBwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHQoDQotICAgIFJlbmRlcmVyQmVhbiByZW5kZXJlcik7DQotfQ0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvdHJpbmlkYWQvdXRpbC9Tb3J0ZWRJdGVyYXRvci5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci90cmluaWRhZC91dGlsL1NvcnRlZEl0ZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5YzY4MWMuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci90cmluaWRhZC91dGlsL1NvcnRlZEl0ZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKg0KLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICogDQotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqIA0KLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqICB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uYnVpbGRlci50cmluaWRhZC51dGlsOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsNCi0NCi0vKioNCi0gKiBTb3J0ZWRJdGVyYXRvciBwcmVzZW50cyB0aGUgZWxlbWVudHMgb2YgYW5vdGhlciBpdGVyYXRvciBpbiBhIHNvcnRlZCBvcmRlci4NCi0gKi8NCi1wdWJsaWMgY2xhc3MgU29ydGVkSXRlcmF0b3IgaW1wbGVtZW50cyBJdGVyYXRvcg0KLXsNCi0gIHB1YmxpYyBTb3J0ZWRJdGVyYXRvcigNCi0gICAgSXRlcmF0b3IgdW5zb3J0ZWQpDQotICB7DQotICAgICAvLyB0aGlzIGltcGxlbWVudGF0aW9uIGp1c3QgcHVsbHMgdGhlIGVudGlyZSBjb250ZW50cyBpbnRvIGEgbGlzdCAtLQ0KLSAgICAgLy8gaXQgd2lsbCBiZSBhd2t3YXJkIGlmIHRoZSB1bnNvcnRlZCBpdGVyYXRvciBpcyBpbmZpbml0ZQ0KLSAgICAgQXJyYXlMaXN0IHNvcnRlZExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7DQotICAgICB3aGlsZSh1bnNvcnRlZC5oYXNOZXh0KCkpDQotICAgICB7DQotICAgICAgIHNvcnRlZExpc3QuYWRkKHVuc29ydGVkLm5leHQoKSk7DQotICAgICB9DQotICAgICBDb2xsZWN0aW9ucy5zb3J0KHNvcnRlZExpc3QpOw0KLSAgICAgX3NvcnRlZCA9IHNvcnRlZExpc3QuaXRlcmF0b3IoKTsNCi0gIH0NCi0NCi0gIHB1YmxpYyBib29sZWFuIGhhc05leHQoKQ0KLSAgew0KLSAgICByZXR1cm4gX3NvcnRlZC5oYXNOZXh0KCk7DQotICB9DQotDQotICBwdWJsaWMgT2JqZWN0IG5leHQoKQ0KLSAgew0KLSAgICByZXR1cm4gX3NvcnRlZC5uZXh0KCk7DQotICB9DQotDQotICBwdWJsaWMgdm9pZCByZW1vdmUoKQ0KLSAgew0KLSAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsNCi0gIH0NCi0NCi0gIHByaXZhdGUgZmluYWwgSXRlcmF0b3IgX3NvcnRlZDsNCi0NCi19DQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci90cmluaWRhZC91dGlsL1V0aWwuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvdHJpbmlkYWQvdXRpbC9VdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmZmI5ODYuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci90cmluaWRhZC91dGlsL1V0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3MyArMCwwIEBACi0vKg0KLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICogDQotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqIA0KLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqICB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uYnVpbGRlci50cmluaWRhZC51dGlsOw0KLQ0KLWltcG9ydCBqYXZhLmlvLkZpbGU7DQotDQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsNCi1pbXBvcnQgamF2YS51dGlsLlNldDsNCi1pbXBvcnQgamF2YS51dGlsLlRyZWVTZXQ7DQotaW1wb3J0IGphdmEudXRpbC5yZWdleC5NYXRjaGVyOw0KLWltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5idWlsZGVyLnRyaW5pZGFkLnBhcnNlLlByb3BlcnR5QmVhbjsNCi0NCi0NCi1wdWJsaWMgY2xhc3MgVXRpbA0KLXsNCi0gIHN0YXRpYyBwdWJsaWMgU3RyaW5nIGNvbnZlcnRDbGFzc1RvU291cmNlUGF0aCgNCi0gICAgU3RyaW5nIGNsYXNzTmFtZSwNCi0gICAgU3RyaW5nIGZpbGVFeHRlbnNpb24pDQotICB7DQotICAgIHJldHVybiAoY2xhc3NOYW1lLnJlcGxhY2UoJy4nLCBGaWxlLnNlcGFyYXRvckNoYXIpICsgZmlsZUV4dGVuc2lvbik7DQotICB9DQotDQotICBzdGF0aWMgcHVibGljIGJvb2xlYW4gaXNGdWxsQ2xhc3MoDQotICAgIFN0cmluZyBjbGFzc05hbWUpDQotICB7DQotICAgIHJldHVybiAoY2xhc3NOYW1lICE9IG51bGwgJiYgY2xhc3NOYW1lLmluZGV4T2YoJy4nKSAhPSAtMSk7DQotICB9DQotDQotICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRHZW5lcmljc0Zyb21Qcm9wZXJ0eShQcm9wZXJ0eUJlYW4gcHJvcGVydHkpew0KLSAgICAgIFN0cmluZyBnZW4gPSAiIjsNCi0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IHByb3BlcnR5LmdldEF0dHJpYnV0ZUNsYXNzUGFyYW1ldGVycygpLmxlbmd0aDsgaSsrKSB7DQotICAgICAgICAgIGlmIChpPjApew0KLSAgICAgICAgICAgICAgZ2VuICs9ICIsIjsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBnZW4gKz0gZ2V0Q2xhc3NGcm9tRnVsbENsYXNzKHByb3BlcnR5LmdldEF0dHJpYnV0ZUNsYXNzUGFyYW1ldGVycygpW2ldKTsNCi0gICAgICB9DQotICAgICAgcmV0dXJuIChnZW4ubGVuZ3RoKCkgPiAwPyI8IitnZW4rIj4iOmdlbik7DQotICB9DQotDQotICBzdGF0aWMgcHVibGljIFN0cmluZyBnZXRDbGFzc0Zyb21GdWxsQ2xhc3MoDQotICAgIFN0cmluZyBmdWxsQ2xhc3MpDQotICB7DQotICAgIGlmIChmdWxsQ2xhc3MgPT0gbnVsbCkNCi0gICAgICByZXR1cm4gbnVsbDsNCi0NCi0gICAgaW50IGxhc3RTZXAgPSBmdWxsQ2xhc3MubGFzdEluZGV4T2YoJy4nKTsNCi0gICAgLy8gTm90ZTogdGhpcyBjb2RlIGFsc28gd29ya3MgZm9yIHRoZSBlbXB0eSBwYWNrYWdlDQotICAgIHJldHVybiAoZnVsbENsYXNzLnN1YnN0cmluZyhsYXN0U2VwICsgMSkpOw0KLSAgfQ0KLQ0KLSAgc3RhdGljIHB1YmxpYyBTdHJpbmcgZ2V0UGFja2FnZUZyb21GdWxsQ2xhc3MoDQotICAgIFN0cmluZyBmdWxsQ2xhc3MpDQotICB7DQotICAgIGlmIChmdWxsQ2xhc3MgPT0gbnVsbCkNCi0gICAgICByZXR1cm4gbnVsbDsNCi0NCi0gICAgaW50IGxhc3RTZXAgPSBmdWxsQ2xhc3MubGFzdEluZGV4T2YoJy4nKTsNCi0NCi0gICAgLy8gZGV0ZWN0IHRoZSBlbXB0eSBwYWNrYWdlDQotICAgIGlmIChsYXN0U2VwID09IC0xKQ0KLSAgICAgIHJldHVybiAiIjsNCi0NCi0gICAgcmV0dXJuIChmdWxsQ2xhc3Muc3Vic3RyaW5nKDAsIGxhc3RTZXApKTsNCi0gIH0NCi0NCi0gIHN0YXRpYyBwdWJsaWMgU3RyaW5nIGdldENvbnN0YW50TmFtZUZyb21Qcm9wZXJ0eSgNCi0gICAgU3RyaW5nIHByb3BlcnR5TmFtZSkNCi0gIHsNCi0gICAgcmV0dXJuIGdldENvbnN0YW50TmFtZUZyb21Qcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIG51bGwpOw0KLSAgfQ0KLQ0KLSAgc3RhdGljIHB1YmxpYyBTdHJpbmcgZ2V0Q29uc3RhbnROYW1lRnJvbVByb3BlcnR5KA0KLSAgICBTdHJpbmcgcHJvcGVydHlOYW1lLA0KLSAgICBTdHJpbmcgY29uc3RhbnRTdWZmaXgpDQotICB7DQotICAgIFN0cmluZ0J1ZmZlciBjb25zdGFudE5hbWUgPSBuZXcgU3RyaW5nQnVmZmVyKCk7DQotDQotICAgIGZvciAoaW50IGk9MDsgaSA8IHByb3BlcnR5TmFtZS5sZW5ndGgoKTsgaSsrKQ0KLSAgICB7DQotICAgICAgY2hhciBjaCA9IHByb3BlcnR5TmFtZS5jaGFyQXQoaSk7DQotICAgICAgaWYgKCFDaGFyYWN0ZXIuaXNMZXR0ZXJPckRpZ2l0KGNoKSkNCi0gICAgICB7DQotICAgICAgICAvLyBjb252ZXJ0IG5vbi1hbHBoYW51bWVyaWMgY2hhcmFjdGVycyB0byB1bmRlcnNjb3Jlcw0KLSAgICAgICAgY2ggPSAnXyc7DQotICAgICAgfQ0KLSAgICAgIGlmIChpID4gMCAmJg0KLSAgICAgICAgICBDaGFyYWN0ZXIuaXNVcHBlckNhc2UoY2gpICYmDQotICAgICAgICAgIENoYXJhY3Rlci5pc0xvd2VyQ2FzZShwcm9wZXJ0eU5hbWUuY2hhckF0KGktMSkpKQ0KLSAgICAgIHsNCi0gICAgICAgIGNvbnN0YW50TmFtZS5hcHBlbmQoJ18nKTsNCi0gICAgICB9DQotICAgICAgY2ggPSBDaGFyYWN0ZXIudG9VcHBlckNhc2UoY2gpOw0KLSAgICAgIGNvbnN0YW50TmFtZS5hcHBlbmQoY2gpOw0KLSAgICB9DQotDQotICAgIGlmIChjb25zdGFudFN1ZmZpeCAhPSBudWxsKQ0KLSAgICAgIGNvbnN0YW50TmFtZS5hcHBlbmQoY29uc3RhbnRTdWZmaXgpOw0KLQ0KLSAgICByZXR1cm4gY29uc3RhbnROYW1lLnRvU3RyaW5nKCk7DQotICB9DQotDQotICBzdGF0aWMgcHVibGljIFN0cmluZyBnZXRQcmVmaXhlZFByb3BlcnR5TmFtZSgNCi0gICAgU3RyaW5nIHByZWZpeCwNCi0gICAgU3RyaW5nIHByb3BlcnR5TmFtZSkNCi0gIHsNCi0gICAgcmV0dXJuIHByZWZpeCArIENoYXJhY3Rlci50b1VwcGVyQ2FzZShwcm9wZXJ0eU5hbWUuY2hhckF0KDApKSArDQotICAgICAgICAgICBwcm9wZXJ0eU5hbWUuc3Vic3RyaW5nKDEpOw0KLSAgfQ0KLQ0KLSAgc3RhdGljIHB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHlDbGFzcyhQcm9wZXJ0eUJlYW4gcHJvcGVydHkpDQotICB7DQotICAgIFN0cmluZyBwcm9wZXJ0eUZ1bGxDbGFzcyA9IHByb3BlcnR5LmdldFByb3BlcnR5Q2xhc3MoKTsNCi0gICAgU3RyaW5nIHByb3BlcnR5Q2xhc3MgPSBVdGlsLmdldENsYXNzRnJvbUZ1bGxDbGFzcyhwcm9wZXJ0eUZ1bGxDbGFzcyk7DQotICAgIFN0cmluZ1tdIGdlbmVyaWNUeXBlcyA9IHByb3BlcnR5LmdldFByb3BlcnR5Q2xhc3NQYXJhbWV0ZXJzKCk7DQotICAgIGlmKGdlbmVyaWNUeXBlcyAhPSBudWxsICYmIGdlbmVyaWNUeXBlcy5sZW5ndGggPiAwKQ0KLSAgICB7DQotICAgICAgU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoNjApOw0KLSAgICAgIGJ1ZmZlci5hcHBlbmQocHJvcGVydHlDbGFzcyk7DQotICAgICAgYnVmZmVyLmFwcGVuZCgnPCcpOw0KLSAgICAgIGludCBtYXggPSBnZW5lcmljVHlwZXMubGVuZ3RoIC0gMTsNCi0gICAgICBmb3IoaW50IGkgPSAwOyBpIDw9IG1heDsgaSsrKQ0KLSAgICAgIHsNCi0gICAgICAgIF9idWlsZFByb3BlcnR5Q2xhc3MoYnVmZmVyLCBnZW5lcmljVHlwZXNbaV0pOw0KLSAgICAgICAgaWYoaSA8IG1heCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgYnVmZmVyLmFwcGVuZCgiLCAiKTsNCi0gICAgICAgIH0NCi0gICAgICB9DQotICAgICAgYnVmZmVyLmFwcGVuZCgnPicpOw0KLQ0KLSAgICAgIHByb3BlcnR5Q2xhc3MgPSBidWZmZXIudG9TdHJpbmcoKTsNCi0gICAgfQ0KLQ0KLSAgICByZXR1cm4gcHJvcGVydHlDbGFzczsNCi0gIH0NCi0NCi0gIHN0YXRpYyBwdWJsaWMgU3RyaW5nIGdldE1ldGhvZE5hbWVGcm9tRXZlbnQoDQotICAgIFN0cmluZyBtZXRob2RQcmVmaXgsDQotICAgIFN0cmluZyBldmVudE5hbWUsDQotICAgIFN0cmluZyBtZXRob2RTdWZmaXgpDQotICB7DQotICAgIHJldHVybiBtZXRob2RQcmVmaXggKw0KLSAgICAgICAgICAgQ2hhcmFjdGVyLnRvVXBwZXJDYXNlKGV2ZW50TmFtZS5jaGFyQXQoMCkpICsNCi0gICAgICAgICAgIGV2ZW50TmFtZS5zdWJzdHJpbmcoMSkgKw0KLSAgICAgICAgICAgbWV0aG9kU3VmZml4Ow0KLSAgfQ0KLQ0KLSAgc3RhdGljIHB1YmxpYyBTdHJpbmcgZ2V0TWV0aG9kUmVhZGVyRnJvbVByb3BlcnR5KA0KLSAgICBTdHJpbmcgcHJvcGVydHlOYW1lLA0KLSAgICBTdHJpbmcgcHJvcGVydHlDbGFzcykNCi0gIHsNCi0gICAgU3RyaW5nIG1ldGhvZFByZWZpeCA9ICgiYm9vbGVhbiIuZXF1YWxzKHByb3BlcnR5Q2xhc3MpID8gImlzIiA6ICJnZXQiKTsNCi0gICAgcmV0dXJuIGdldFByZWZpeGVkUHJvcGVydHlOYW1lKG1ldGhvZFByZWZpeCwgcHJvcGVydHlOYW1lKTsNCi0gIH0NCi0NCi0gIHN0YXRpYyBwdWJsaWMgU3RyaW5nIGdldEV2ZW50TmFtZUZyb21FdmVudFR5cGUoDQotICAgIFN0cmluZyBldmVudEZ1bGxDbGFzcykNCi0gIHsNCi0gICAgU3RyaW5nIGV2ZW50TmFtZSA9IGdldENsYXNzRnJvbUZ1bGxDbGFzcyhldmVudEZ1bGxDbGFzcyk7DQotICAgIHJldHVybiBDaGFyYWN0ZXIudG9Mb3dlckNhc2UoZXZlbnROYW1lLmNoYXJBdCgwKSkgKw0KLSAgICAgICAgICAgZXZlbnROYW1lLnN1YnN0cmluZygxLCBldmVudE5hbWUubGVuZ3RoKCkpOw0KLSAgfQ0KLQ0KLSAgc3RhdGljIHB1YmxpYyBib29sZWFuIGlzUHJpbWl0aXZlQ2xhc3MoDQotICAgIFN0cmluZyBjbGFzc05hbWUpDQotICB7DQotICAgIHJldHVybiAiYm9vbGVhbiIuZXF1YWxzKGNsYXNzTmFtZSkgfHwNCi0gICAgICAgICAgICJieXRlIi5lcXVhbHMoY2xhc3NOYW1lKSB8fA0KLSAgICAgICAgICAgImNoYXIiLmVxdWFscyhjbGFzc05hbWUpIHx8DQotICAgICAgICAgICAiZG91YmxlIi5lcXVhbHMoY2xhc3NOYW1lKSB8fA0KLSAgICAgICAgICAgImZsb2F0Ii5lcXVhbHMoY2xhc3NOYW1lKSB8fA0KLSAgICAgICAgICAgImludCIuZXF1YWxzKGNsYXNzTmFtZSkgfHwNCi0gICAgICAgICAgICJsb25nIi5lcXVhbHMoY2xhc3NOYW1lKSB8fA0KLSAgICAgICAgICAgInNob3J0Ii5lcXVhbHMoY2xhc3NOYW1lKTsNCi0gIH0NCi0NCi0gIHN0YXRpYyBwdWJsaWMgU3RyaW5nIGdldEFsdGVybmF0ZVByb3BlcnR5Q2xhc3MoUHJvcGVydHlCZWFuIHByb3BlcnR5KQ0KLSAgew0KLSAgICBTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcig2MCk7DQotICAgIF9idWlsZFByb3BlcnR5Q2xhc3MoYnVmZmVyLCBwcm9wZXJ0eS5nZXRBbHRlcm5hdGVDbGFzcygpKTsNCi0NCi0gICAgcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOw0KLSAgfQ0KLQ0KLSAgc3RhdGljIHB1YmxpYyBTdHJpbmcgZ2V0Qm94ZWRDbGFzcygNCi0gICAgU3RyaW5nIGNsYXNzTmFtZSkNCi0gIHsNCi0gICAgaWYgKCJib29sZWFuIi5lcXVhbHMoY2xhc3NOYW1lKSkNCi0gICAgICByZXR1cm4gIkJvb2xlYW4iOw0KLSAgICBlbHNlIGlmICgiYnl0ZSIuZXF1YWxzKGNsYXNzTmFtZSkpDQotICAgICAgcmV0dXJuICJCeXRlIjsNCi0gICAgZWxzZSBpZiAoImNoYXIiLmVxdWFscyhjbGFzc05hbWUpKQ0KLSAgICAgIHJldHVybiAiQ2hhcmFjdGVyIjsNCi0gICAgZWxzZSBpZiAoImRvdWJsZSIuZXF1YWxzKGNsYXNzTmFtZSkpDQotICAgICAgcmV0dXJuICJEb3VibGUiOw0KLSAgICBlbHNlIGlmICgiZmxvYXQiLmVxdWFscyhjbGFzc05hbWUpKQ0KLSAgICAgIHJldHVybiAiRmxvYXQiOw0KLSAgICBlbHNlIGlmICgiaW50Ii5lcXVhbHMoY2xhc3NOYW1lKSkNCi0gICAgICByZXR1cm4gIkludGVnZXIiOw0KLSAgICBlbHNlIGlmICgibG9uZyIuZXF1YWxzKGNsYXNzTmFtZSkpDQotICAgICAgcmV0dXJuICJMb25nIjsNCi0gICAgZWxzZSBpZiAoInNob3J0Ii5lcXVhbHMoY2xhc3NOYW1lKSkNCi0gICAgICByZXR1cm4gIlNob3J0IjsNCi0gICAgZWxzZQ0KLSAgICAgIHJldHVybiBjbGFzc05hbWU7DQotICB9DQotDQotICBzdGF0aWMgcHVibGljIFN0cmluZyBwcmltaXRpdmVEZWZhdWx0VmFsdWUoU3RyaW5nIGNsYXNzTmFtZSkNCi0gIHsNCi0gICAgIGlmICgiYm9vbGVhbiIuZXF1YWxzKGNsYXNzTmFtZSkpDQotICAgICAgcmV0dXJuICJmYWxzZSI7DQotICAgIGVsc2UgaWYgKCJieXRlIi5lcXVhbHMoY2xhc3NOYW1lKSkNCi0gICAgICByZXR1cm4gIjAiOw0KLSAgICBlbHNlIGlmICgiY2hhciIuZXF1YWxzKGNsYXNzTmFtZSkpDQotICAgICAgcmV0dXJuICInJyI7DQotICAgIGVsc2UgaWYgKCJkb3VibGUiLmVxdWFscyhjbGFzc05hbWUpKQ0KLSAgICAgIHJldHVybiAiMC4wZCI7DQotICAgIGVsc2UgaWYgKCJmbG9hdCIuZXF1YWxzKGNsYXNzTmFtZSkpDQotICAgICAgcmV0dXJuICIwLjBmIjsNCi0gICAgZWxzZSBpZiAoImludCIuZXF1YWxzKGNsYXNzTmFtZSkpDQotICAgICAgcmV0dXJuICIwIjsNCi0gICAgZWxzZSBpZiAoImxvbmciLmVxdWFscyhjbGFzc05hbWUpKQ0KLSAgICAgIHJldHVybiAiMEwiOw0KLSAgICBlbHNlIGlmICgic2hvcnQiLmVxdWFscyhjbGFzc05hbWUpKQ0KLSAgICAgIHJldHVybiAiMCI7DQotICAgIGVsc2UNCi0gICAgICByZXR1cm4gY2xhc3NOYW1lOw0KLSAgfQ0KLQ0KLSAgc3RhdGljIHB1YmxpYyBTdHJpbmcgZmlsbCgNCi0gICAgU3RyaW5nIGJhc2UsDQotICAgIGludCAgICBsZW5ndGgpDQotICB7DQotICAgIGlmIChiYXNlID09IG51bGwgfHwgYmFzZS5sZW5ndGgoKSA+IGxlbmd0aCkNCi0gICAgICByZXR1cm4gYmFzZTsNCi0NCi0gICAgU3RyaW5nQnVmZmVyIGZpbGxlZCA9IG5ldyBTdHJpbmdCdWZmZXIoYmFzZSk7DQotICAgIGZvciAoaW50IGk9YmFzZS5sZW5ndGgoKTsgaSA8IGxlbmd0aDsgaSsrKQ0KLSAgICB7DQotICAgICAgZmlsbGVkLmFwcGVuZCgnICcpOw0KLSAgICB9DQotICAgIHJldHVybiBmaWxsZWQudG9TdHJpbmcoKTsNCi0gIH0NCi0NCi0gIHN0YXRpYyBwdWJsaWMgU3RyaW5nIGdldFZhcmlhYmxlRnJvbUNsYXNzKA0KLSAgICBTdHJpbmcgY2xhc3NOYW1lKQ0KLSAgew0KLSAgICBpZiAoY2xhc3NOYW1lID09IG51bGwpDQotICAgICAgcmV0dXJuIG51bGw7DQotDQotICAgIGZvciAoaW50IGk9MDsgaSA8IGNsYXNzTmFtZS5sZW5ndGgoKTsgaSsrKQ0KLSAgICB7DQotICAgICAgY2hhciBjaCA9IGNsYXNzTmFtZS5jaGFyQXQoaSk7DQotICAgICAgaWYgKENoYXJhY3Rlci5pc0xvd2VyQ2FzZShjaCkpDQotICAgICAgew0KLSAgICAgICAgaWYgKGkgPiAwKQ0KLSAgICAgICAgew0KLSAgICAgICAgICByZXR1cm4gQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKGNsYXNzTmFtZS5jaGFyQXQoaSAtIDEpKSArDQotICAgICAgICAgICAgICAgICBjbGFzc05hbWUuc3Vic3RyaW5nKGkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgYnJlYWs7DQotICAgICAgfQ0KLSAgICB9DQotDQotICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkNsYXNzIG5hbWUgXCIiICsgY2xhc3NOYW1lICsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXCIgZG9lcyBub3QgdXNlIGluaXRjYXBzIik7DQotICB9DQotDQotICBzdGF0aWMgcHVibGljIFN0cmluZyBnZXRWYXJpYWJsZUZyb21OYW1lKA0KLSAgICBTdHJpbmcgbmFtZSkNCi0gIHsNCi0gICAgaWYgKG5hbWUgPT0gbnVsbCkNCi0gICAgICByZXR1cm4gbnVsbDsNCi0NCi0gICAgaWYgKFJFU0VSVkVEX1dPUkRTLmNvbnRhaW5zKG5hbWUpKQ0KLSAgICAgIG5hbWUgPSBuYW1lICsgIlBhcmFtIjsNCi0NCi0gICAgcmV0dXJuIG5hbWU7DQotICB9DQotDQotICBzdGF0aWMgcHVibGljIFN0cmluZyBjb252ZXJ0U3RyaW5nVG9MaXRlcmFsKFN0cmluZyB2YWx1ZSkNCi0gIHsNCi0gICAgcmV0dXJuIGNvbnZlcnRTdHJpbmdUb0xpdGVyYWwoIlN0cmluZyIsIHZhbHVlKTsNCi0gIH0NCi0NCi0gIHN0YXRpYyBwdWJsaWMgU3RyaW5nIGNvbnZlcnRTdHJpbmdUb0xpdGVyYWwoU3RyaW5nIGNsYXNzTmFtZSwgU3RyaW5nIHZhbHVlKQ0KLSAgew0KLSAgICBpZiAodmFsdWUgPT0gbnVsbCkNCi0gICAgew0KLSAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotICAgIGVsc2UgaWYgKCJTdHJpbmciLmVxdWFscyhjbGFzc05hbWUpKQ0KLSAgICB7DQotICAgICAgcmV0dXJuICJcIiIgKyB2YWx1ZS5yZXBsYWNlQWxsKCJcJyIsICJcXCciKSArICJcIiI7DQotICAgIH0NCi0gICAgZWxzZSBpZiAoIk51bWJlciIuZXF1YWxzKGNsYXNzTmFtZSkpDQotICAgIHsNCi0gICAgICAvLyBEb3VibGUgdnMuIEludGVnZXIuDQotICAgICAgaWYodmFsdWUuaW5kZXhPZigiLiIpID09IC0xKQ0KLSAgICAgIHsNCi0gICAgICAgIHJldHVybiAiSW50ZWdlci52YWx1ZU9mKCIgKyB2YWx1ZSArICIpIjsNCi0gICAgICB9DQotICAgICAgZWxzZQ0KLSAgICAgIHsNCi0gICAgICAgIHJldHVybiAiRG91YmxlLnZhbHVlT2YoIiArIHZhbHVlICsgIikiOw0KLSAgICAgIH0NCi0gICAgfQ0KLSAgICBlbHNlDQotICAgIHsNCi0gICAgICByZXR1cm4gdmFsdWU7DQotICAgIH0NCi0gIH0NCi0NCi0gICAgc3RhdGljIHB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFZhbHVlKFByb3BlcnR5QmVhbiBwcm9wZXJ0eSl7DQotICAgICAgICBTdHJpbmcgcHJvcGVydHlGdWxsQ2xhc3MgPSBwcm9wZXJ0eS5nZXRQcm9wZXJ0eUNsYXNzKCk7DQotICAgICAgICBTdHJpbmcgZGVmID0gcHJvcGVydHkuZ2V0RGVmYXVsdFZhbHVlKCk7DQotICAgICAgICBpZiAoZGVmID09IG51bGwgfHwgZGVmLmxlbmd0aCgpID09IDApew0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKGlzUHJpbWl0aXZlQ2xhc3MocHJvcGVydHlGdWxsQ2xhc3MpKXsNCi0gICAgICAgICAgICByZXR1cm4gZGVmOw0KLSAgICAgICAgfSBlbHNlIGlmICgiamF2YS5sYW5nLlN0cmluZyIuZXF1YWxzKHByb3BlcnR5RnVsbENsYXNzKSl7DQotICAgICAgICAgICAgaWYgKGRlZi5zdGFydHNXaXRoKCJcIiIpICYmIGRlZi5lbmRzV2l0aCgiXCIiKSl7DQotICAgICAgICAgICAgICAgIHJldHVybiBkZWY7DQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuICJcIiIrZGVmKyJcIiI7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgc3RhdGljIHByaXZhdGUgdm9pZCBfYnVpbGRQcm9wZXJ0eUNsYXNzKFN0cmluZ0J1ZmZlciBidWZmZXIsIFN0cmluZyB0eXBlKQ0KLSAgew0KLSAgICBNYXRjaGVyIG1hdGNoZXIgPSBfR0VORVJJQ19UWVBFLm1hdGNoZXIodHlwZSk7DQotICAgIGlmKG1hdGNoZXIubWF0Y2hlcygpKQ0KLSAgICB7DQotICAgICAgLy8gR2VuZXJpYyB0eXBlDQotICAgICAgYnVmZmVyLmFwcGVuZChVdGlsLmdldENsYXNzRnJvbUZ1bGxDbGFzcyhtYXRjaGVyLmdyb3VwKDEpKSk7DQotICAgICAgYnVmZmVyLmFwcGVuZCgnPCcpOw0KLSAgICAgIFN0cmluZ1tdIHR5cGVzID0gbWF0Y2hlci5ncm91cCgyKS5zcGxpdCgiLCIpOw0KLSAgICAgIGludCBtYXggPSB0eXBlcy5sZW5ndGggLSAxOw0KLSAgICAgIGZvcihpbnQgaSA9IDA7IGkgPD0gbWF4OyBpKyspDQotICAgICAgew0KLSAgICAgICAgX2J1aWxkUHJvcGVydHlDbGFzcyhidWZmZXIsIHR5cGVzW2ldKTsNCi0gICAgICAgIGlmKGkgPCBtYXgpDQotICAgICAgICB7DQotICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoIiwgIik7DQotICAgICAgICB9DQotICAgICAgfQ0KLSAgICAgIGJ1ZmZlci5hcHBlbmQoJz4nKTsNCi0gICAgfQ0KLSAgICBlbHNlDQotICAgIHsNCi0gICAgICAvLyBOb24tZ2VuZXJpYyB0eXBlDQotICAgICAgYnVmZmVyLmFwcGVuZChVdGlsLmdldENsYXNzRnJvbUZ1bGxDbGFzcyh0eXBlKSk7DQotICAgIH0NCi0gIH0NCi0NCi0gIHN0YXRpYyBwcml2YXRlIFNldCBfY3JlYXRlUHJpbWl0aXZlVHlwZXNTZXQoKQ0KLSAgew0KLSAgICBTZXQgcHJpbWl0aXZlcyA9IG5ldyBUcmVlU2V0KCk7DQotICAgIGZvciAoaW50IGk9MDsgaSA8IF9QUklNSVRJVkVfVFlQRVMubGVuZ3RoOyBpKyspDQotICAgIHsNCi0gICAgICBTdHJpbmcgdHlwZSA9IF9QUklNSVRJVkVfVFlQRVNbaV07DQotICAgICAgcHJpbWl0aXZlcy5hZGQodHlwZSk7DQotICAgICAgcHJpbWl0aXZlcy5hZGQodHlwZSArICJbXSIpOw0KLSAgICB9DQotICAgIHJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVTZXQocHJpbWl0aXZlcyk7DQotICB9DQotDQotICBzdGF0aWMgcHJpdmF0ZSBTZXQgX2NyZWF0ZVJlc2VydmVkV29yZHNTZXQoKQ0KLSAgew0KLSAgICBTZXQgcmVzZXJ2ZWQgPSBuZXcgVHJlZVNldCgpOw0KLSAgICBmb3IgKGludCBpPTA7IGkgPCBfUkVTRVJWRURfV09SRFMubGVuZ3RoOyBpKyspDQotICAgIHsNCi0gICAgICBTdHJpbmcga2V5d29yZCA9IF9SRVNFUlZFRF9XT1JEU1tpXTsNCi0gICAgICByZXNlcnZlZC5hZGQoa2V5d29yZCk7DQotICAgIH0NCi0gICAgcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZVNldChyZXNlcnZlZCk7DQotICB9DQotDQotICBzdGF0aWMgcHJpdmF0ZSBmaW5hbCBTdHJpbmdbXSBfUFJJTUlUSVZFX1RZUEVTID0gbmV3IFN0cmluZ1tdDQotICB7Ly8gVE9ETzogU2hvdWxkbid0IGphdmEubGFuZy4qIGJlIHNwZWNpZmllZCBpbiB0aGF0IGxpc3QgYXMgd2VsbD8NCi0gICAgImJvb2xlYW4iLA0KLSAgICAiYnl0ZSIsDQotICAgICJjaGFyIiwNCi0gICAgImZsb2F0IiwNCi0gICAgImRvdWJsZSIsDQotICAgICJpbnQiLA0KLSAgICAic2hvcnQiLA0KLSAgICAibG9uZyIsDQotICB9Ow0KLQ0KLSAgc3RhdGljIHByaXZhdGUgZmluYWwgU3RyaW5nW10gX1JFU0VSVkVEX1dPUkRTID0gbmV3IFN0cmluZ1tdDQotICB7DQotICAgICJhYnN0cmFjdCIsDQotICAgICJhc3NlcnQiLA0KLSAgICAiYm9vbGVhbiIsDQotICAgICJicmVhayIsDQotICAgICJieXRlIiwNCi0gICAgImNhc2UiLA0KLSAgICAiY2F0Y2giLA0KLSAgICAiY2hhciIsDQotICAgICJjbGFzcyIsDQotICAgICJjb25zdCIsDQotICAgICJjb250aW51ZSIsDQotICAgICJkZWZhdWx0IiwNCi0gICAgImRvIiwNCi0gICAgImRvdWJsZSIsDQotICAgICJlbHNlIiwNCi0gICAgImV4dGVuZHMiLA0KLSAgICAiZmluYWwiLA0KLSAgICAiZmluYWxseSIsDQotICAgICJmbG9hdCIsDQotICAgICJmb3IiLA0KLSAgICAiZ290byIsDQotICAgICJpZiIsDQotICAgICJpbXBsZW1lbnRzIiwNCi0gICAgImltcG9ydCIsDQotICAgICJpbnN0YW5jZW9mIiwNCi0gICAgImludCIsDQotICAgICJpbnRlcmZhY2UiLA0KLSAgICAibG9uZyIsDQotICAgICJuYXRpdmUiLA0KLSAgICAibmV3IiwNCi0gICAgInBhY2thZ2UiLA0KLSAgICAicHJpdmF0ZSIsDQotICAgICJwcm90ZWN0ZWQiLA0KLSAgICAicHVibGljIiwNCi0gICAgInJldHVybiIsDQotICAgICJzaG9ydCIsDQotICAgICJzdGF0aWMiLA0KLSAgICAic3VwZXIiLA0KLSAgICAic3dpdGNoIiwNCi0gICAgInN5bmNocm9uaXplZCIsDQotICAgICJ0aGlzIiwNCi0gICAgInRocm93IiwNCi0gICAgInRocm93cyIsDQotICAgICJ0cmFuc2llbnQiLA0KLSAgICAidHJ5IiwNCi0gICAgInZvaWQiLA0KLSAgICAidm9sYXRpbGUiLA0KLSAgICAid2hpbGUiLA0KLSAgfTsNCi0NCi0gIHN0YXRpYyBwdWJsaWMgZmluYWwgU2V0IFJFU0VSVkVEX1dPUkRTID0gX2NyZWF0ZVJlc2VydmVkV29yZHNTZXQoKTsNCi0gIHN0YXRpYyBwdWJsaWMgZmluYWwgU2V0IFBSSU1JVElWRV9UWVBFUyA9IF9jcmVhdGVQcmltaXRpdmVUeXBlc1NldCgpOw0KLQ0KLSAgc3RhdGljIHByaXZhdGUgZmluYWwgUGF0dGVybiBfR0VORVJJQ19UWVBFID0gUGF0dGVybi5jb21waWxlKCIoW148XSspPCguKyk+Iik7DQotDQotICAvLyBubyBpbnN0YW5jZXMNCi0gIHByaXZhdGUgVXRpbCgpDQotICB7DQotICB9DQotfQ0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvdHJpbmlkYWQvdXRpbC9WYWxpZGF0b3JGaWx0ZXIuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvdHJpbmlkYWQvdXRpbC9WYWxpZGF0b3JGaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2M3OGIwZi4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL3RyaW5pZGFkL3V0aWwvVmFsaWRhdG9yRmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKg0KLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICogDQotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqIA0KLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqICB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uYnVpbGRlci50cmluaWRhZC51dGlsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmJ1aWxkZXIudHJpbmlkYWQucGFyc2UuVmFsaWRhdG9yQmVhbjsNCi0NCi1hYnN0cmFjdCBwdWJsaWMgY2xhc3MgVmFsaWRhdG9yRmlsdGVyIGltcGxlbWVudHMgRmlsdGVyDQotew0KLSAgZmluYWwgcHVibGljIGJvb2xlYW4gYWNjZXB0KA0KLSAgICBPYmplY3Qgb2JqKQ0KLSAgew0KLSAgICByZXR1cm4gYWNjZXB0KChWYWxpZGF0b3JCZWFuKW9iaik7DQotICB9DQotDQotICBhYnN0cmFjdCBwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHQoDQotICAgIFZhbGlkYXRvckJlYW4gdmFsaWRhdG9yKTsNCi19DQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci90cmluaWRhZC91dGlsL1hJbmNsdWRlRmlsdGVyLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL3RyaW5pZGFkL3V0aWwvWEluY2x1ZGVGaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTEzMzk2YS4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL3RyaW5pZGFkL3V0aWwvWEluY2x1ZGVGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NiArMCwwIEBACi0vKg0KLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICogDQotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqIA0KLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqICB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uYnVpbGRlci50cmluaWRhZC51dGlsOw0KLQ0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOw0KLQ0KLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247DQotaW1wb3J0IGphdmEubmV0LlVSTDsNCi0NCi1pbXBvcnQgamF2YS51dGlsLlN0YWNrOw0KLQ0KLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5QYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXI7DQotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlNBWFBhcnNlckZhY3Rvcnk7DQotDQotaW1wb3J0IG9yZy54bWwuc2F4LkF0dHJpYnV0ZXM7DQotaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOw0KLWltcG9ydCBvcmcueG1sLnNheC5Mb2NhdG9yOw0KLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247DQotaW1wb3J0IG9yZy54bWwuc2F4LlhNTFJlYWRlcjsNCi1pbXBvcnQgb3JnLnhtbC5zYXguaGVscGVycy5OYW1lc3BhY2VTdXBwb3J0Ow0KLWltcG9ydCBvcmcueG1sLnNheC5oZWxwZXJzLlhNTEZpbHRlckltcGw7DQotDQotcHVibGljIGZpbmFsIGNsYXNzIFhJbmNsdWRlRmlsdGVyIGV4dGVuZHMgWE1MRmlsdGVySW1wbA0KLXsNCi0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFhJTkNMVURFX05BTUVTUEFDRSA9ICJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hJbmNsdWRlIjsNCi0NCi0gIHB1YmxpYyBYSW5jbHVkZUZpbHRlcigNCi0gICAgWE1MUmVhZGVyIHBhcmVudCwNCi0gICAgVVJMICAgICAgIGJhc2UpDQotICB7DQotICAgIHN1cGVyKHBhcmVudCk7DQotICAgIGJhc2VzLnB1c2goYmFzZSk7DQotICB9DQotDQotICBwdWJsaWMgdm9pZCBzZXREb2N1bWVudExvY2F0b3IoDQotICAgIExvY2F0b3IgbG9jYXRvcikNCi0gIHsNCi0gICAgbG9jYXRvcnMucHVzaChsb2NhdG9yKTsNCi0gICAgc3VwZXIuc2V0RG9jdW1lbnRMb2NhdG9yKGxvY2F0b3IpOw0KLSAgfQ0KLQ0KLSAgcHVibGljIHZvaWQgc3RhcnRQcmVmaXhNYXBwaW5nKA0KLSAgICBTdHJpbmcgcHJlZml4LA0KLSAgICBTdHJpbmcgbmFtZXNwYWNlVVJJKSB0aHJvd3MgU0FYRXhjZXB0aW9uDQotICB7DQotICAgIGlmICghbmFtZXNwYWNlVVJJLmVxdWFscyhYSU5DTFVERV9OQU1FU1BBQ0UpKQ0KLSAgICB7DQotICAgICAgbmFtZXNwYWNlcy5kZWNsYXJlUHJlZml4KHByZWZpeCwgbmFtZXNwYWNlVVJJKTsNCi0gICAgICBzdXBlci5zdGFydFByZWZpeE1hcHBpbmcocHJlZml4LCBuYW1lc3BhY2VVUkkpOw0KLSAgICB9DQotICB9DQotDQotICBwdWJsaWMgdm9pZCBzdGFydEVsZW1lbnQoDQotICAgIFN0cmluZyAgICAgbmFtZXNwYWNlVVJJLA0KLSAgICBTdHJpbmcgICAgIGxvY2FsTmFtZSwNCi0gICAgU3RyaW5nICAgICBxdWFsaWZpZWROYW1lLA0KLSAgICBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHRocm93cyBTQVhFeGNlcHRpb24NCi0gIHsNCi0gICAgbmFtZXNwYWNlcy5wdXNoQ29udGV4dCgpOw0KLSAgICAvLyBzdXBwb3J0IGJvdGggRFREIGFuZCBTY2hlbWENCi0gICAgaWYgKG5hbWVzcGFjZVVSSS5lcXVhbHMoWElOQ0xVREVfTkFNRVNQQUNFKSAmJg0KLSAgICAgICAgbG9jYWxOYW1lLmVxdWFscygiaW5jbHVkZSIpKQ0KLSAgICB7DQotICAgICAgLy8gaHJlZiBhdHRyaWJ1dGUgaXMgcmVxdWlyZWQNCi0gICAgICBTdHJpbmcgaHJlZiA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoImhyZWYiKTsNCi0gICAgICBpZiAoaHJlZiA9PSBudWxsKQ0KLSAgICAgICAgdGhyb3cgbmV3IFNBWEV4Y2VwdGlvbigiTWlzc2luZyBocmVmIGF0dHJpYnV0ZSIpOw0KLQ0KLSAgICAgIC8vIHhwb2ludGVyIGF0dHJpYnV0ZSBpcyBvcHRpb25hbA0KLSAgICAgIFN0cmluZyB4cG9pbnRlciA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoInhwb2ludGVyIik7DQotDQotICAgICAgZG9YSW5jbHVkZShocmVmLCB4cG9pbnRlcik7DQotICAgIH0NCi0gICAgZWxzZQ0KLSAgICB7DQotICAgICAgc3VwZXIuc3RhcnRFbGVtZW50KG5hbWVzcGFjZVVSSSwgbG9jYWxOYW1lLCBxdWFsaWZpZWROYW1lLCBhdHRyaWJ1dGVzKTsNCi0gICAgfQ0KLSAgfQ0KLQ0KLSAgcHVibGljIHZvaWQgZW5kRWxlbWVudCgNCi0gICAgU3RyaW5nICAgICBuYW1lc3BhY2VVUkksDQotICAgIFN0cmluZyAgICAgbG9jYWxOYW1lLA0KLSAgICBTdHJpbmcgICAgIHF1YWxpZmllZE5hbWUpIHRocm93cyBTQVhFeGNlcHRpb24NCi0gIHsNCi0gICAgaWYgKCFuYW1lc3BhY2VVUkkuZXF1YWxzKFhJTkNMVURFX05BTUVTUEFDRSkpDQotICAgICAgc3VwZXIuZW5kRWxlbWVudChuYW1lc3BhY2VVUkksIGxvY2FsTmFtZSwgcXVhbGlmaWVkTmFtZSk7DQotDQotICAgIG5hbWVzcGFjZXMucG9wQ29udGV4dCgpOw0KLSAgfQ0KLQ0KLSAgcHVibGljIHZvaWQgc3RhcnREb2N1bWVudCgpIHRocm93cyBTQVhFeGNlcHRpb24NCi0gIHsNCi0gICAgaWYgKGRlcHRoID09IDApDQotICAgICAgc3VwZXIuc3RhcnREb2N1bWVudCgpOw0KLQ0KLSAgICBkZXB0aCsrOw0KLSAgfQ0KLQ0KLSAgcHVibGljIHZvaWQgZW5kRG9jdW1lbnQoKSB0aHJvd3MgU0FYRXhjZXB0aW9uDQotICB7DQotICAgIGxvY2F0b3JzLnBvcCgpOw0KLSAgICBkZXB0aC0tOw0KLQ0KLSAgICBpZiAoZGVwdGggPT0gMCkNCi0gICAgICBzdXBlci5lbmREb2N1bWVudCgpOw0KLSAgfQ0KLQ0KLSAgcHJpdmF0ZSB2b2lkIGRvWEluY2x1ZGUoDQotICAgIFN0cmluZyBocmVmLA0KLSAgICBTdHJpbmcgeHBvaW50ZXIpIHRocm93cyBTQVhFeGNlcHRpb24NCi0gIHsNCi0gICAgVVJMIHRhcmdldCA9IHJlc29sdmVVUkwoaHJlZik7DQotDQotICAgIHRyeQ0KLSAgICB7DQotICAgICAgU0FYUGFyc2VyRmFjdG9yeSBzYXhGYWN0b3J5ID0gU0FYUGFyc2VyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOw0KLSAgICAgIFNBWFBhcnNlciBzYXhQYXJzZXIgPSBzYXhGYWN0b3J5Lm5ld1NBWFBhcnNlcigpOw0KLSAgICAgIFhNTFJlYWRlciByZWFkZXIgPSBzYXhQYXJzZXIuZ2V0WE1MUmVhZGVyKCk7DQotICAgICAgaWYgKHhwb2ludGVyICE9IG51bGwpDQotICAgICAgew0KLSAgICAgICAgLy8gcGFzcyBhbGwgcGFyc2VkIFNBWCBldmVudHMgdGhyb3VnaCBYUG9pbnRlckZpbHRlcg0KLSAgICAgICAgcmVhZGVyID0gbmV3IFhQb2ludGVyRmlsdGVyKHJlYWRlciwgbmFtZXNwYWNlcywgeHBvaW50ZXIpOw0KLSAgICAgIH0NCi0gICAgICAvLyBwYXNzIGFsbCBzZWxlY3RlZCBYUG9pbnRlciBTQVggZXZlbnRzIHRvIFhJbmNsdWRlRmlsdGVyDQotICAgICAgcmVhZGVyLnNldENvbnRlbnRIYW5kbGVyKHRoaXMpOw0KLSAgICAgIHJlYWRlci5zZXRFbnRpdHlSZXNvbHZlcih0aGlzKTsNCi0gICAgICByZWFkZXIuc2V0RXJyb3JIYW5kbGVyKHRoaXMpOw0KLSAgICAgIHJlYWRlci5zZXREVERIYW5kbGVyKHRoaXMpOw0KLQ0KLSAgICAgIC8vIHB1c2ggb24gbmV3IGJhc2UgVVJMIGluIGNhc2Ugb2YgbmVzdGVkIHhpOmluY2x1ZGUNCi0gICAgICBiYXNlcy5wdXNoKHRhcmdldCk7DQotICAgICAgcmVhZGVyLnBhcnNlKG5ldyBJbnB1dFNvdXJjZSh0YXJnZXQub3BlblN0cmVhbSgpKSk7DQotICAgICAgYmFzZXMucG9wKCk7DQotICAgIH0NCi0gICAgY2F0Y2ggKFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZSkNCi0gICAgew0KLSAgICAgIHRocm93IG5ldyBTQVhFeGNlcHRpb24oIkVycm9yIGR1cmluZyB4aW5jbHVkZSBvZiAiICsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldC50b0V4dGVybmFsRm9ybSgpLCBlKTsNCi0gICAgfQ0KLSAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkNCi0gICAgew0KLSAgICAgIHRocm93IG5ldyBTQVhFeGNlcHRpb24oIkVycm9yIGR1cmluZyB4aW5jbHVkZSBvZiAiICsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldC50b0V4dGVybmFsRm9ybSgpLCBlKTsNCi0gICAgfQ0KLSAgfQ0KLQ0KLSAgcHJpdmF0ZSBVUkwgcmVzb2x2ZVVSTCgNCi0gICAgU3RyaW5nIGhyZWYpIHRocm93cyBTQVhFeGNlcHRpb24NCi0gIHsNCi0gICAgVVJMIGJhc2UgPSAoVVJMKSBiYXNlcy5wZWVrKCk7DQotDQotICAgIHRyeQ0KLSAgICB7DQotICAgICAgcmV0dXJuIG5ldyBVUkwoYmFzZSwgaHJlZik7DQotICAgIH0NCi0gICAgY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKQ0KLSAgICB7DQotICAgICAgdGhyb3cgbmV3IFNBWEV4Y2VwdGlvbigiRXJyb3IgcmVzb2x2aW5nIGhyZWYgXCIiICsgaHJlZiArICJcIiAiICsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhdCBiYXNlIFwiIiArIGJhc2UgKyAiXCIiLCBlKTsNCi0gICAgfQ0KLSAgfQ0KLQ0KLSAgcHJpdmF0ZSBpbnQgZGVwdGggPSAwOw0KLQ0KLSAgcHJpdmF0ZSBTdGFjayBiYXNlcyA9IG5ldyBTdGFjaygpOw0KLSAgcHJpdmF0ZSBTdGFjayBsb2NhdG9ycyA9IG5ldyBTdGFjaygpOw0KLSAgcHJpdmF0ZSBOYW1lc3BhY2VTdXBwb3J0IG5hbWVzcGFjZXMgPSBuZXcgTmFtZXNwYWNlU3VwcG9ydCgpOw0KLX0NCi0NCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL3RyaW5pZGFkL3V0aWwvWFBvaW50ZXJGaWx0ZXIuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvdHJpbmlkYWQvdXRpbC9YUG9pbnRlckZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OThhOWFjLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvdHJpbmlkYWQvdXRpbC9YUG9pbnRlckZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLS8qDQotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKiANCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICogDQotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5idWlsZGVyLnRyaW5pZGFkLnV0aWw7DQotDQotaW1wb3J0IG9yZy54bWwuc2F4LkF0dHJpYnV0ZXM7DQotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLnhtbC5zYXguWE1MUmVhZGVyOw0KLWltcG9ydCBvcmcueG1sLnNheC5oZWxwZXJzLk5hbWVzcGFjZVN1cHBvcnQ7DQotaW1wb3J0IG9yZy54bWwuc2F4LmhlbHBlcnMuWE1MRmlsdGVySW1wbDsNCi0NCi0vKioNCi0gKiBGb3Igbm93LCBqdXN0IHNraXAgdGhlIHJvb3QgZWxlbWVudCBzaW5jZSB0aGF0J3Mgb3VyIHVzZWNhc2UuDQotICovDQotcHVibGljIGZpbmFsIGNsYXNzIFhQb2ludGVyRmlsdGVyIGV4dGVuZHMgWE1MRmlsdGVySW1wbA0KLXsNCi0gIHB1YmxpYyBYUG9pbnRlckZpbHRlcigNCi0gICAgWE1MUmVhZGVyICAgICAgICBwYXJlbnQsDQotICAgIE5hbWVzcGFjZVN1cHBvcnQgbmFtZXNwYWNlcywNCi0gICAgU3RyaW5nICAgICAgICAgICB4cG9pbnRlcikNCi0gIHsNCi0gICAgc3VwZXIocGFyZW50KTsNCi0NCi0gICAgLy8gV2Ugc3VwcG9ydCBhIHZlcnkgcnVkaW1lbnRhcnkgLSBidXQgdG90YWxseSBzdWZmaWNpZW50IC0gWFBvaW50ZXIgc3ludGF4LA0KLSAgICAvLyB3aGljaCBpcyBqdXN0IC9lbGVtZW50L290aGVyZWxlbWVudC9vdGhlcm90aGVyZWxlbWVudC8qDQotICAgIGlmICgheHBvaW50ZXIuc3RhcnRzV2l0aCgiLyIpIHx8ICF4cG9pbnRlci5lbmRzV2l0aCgiLyoiKSkNCi0gICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJVbnN1cHBvcnRlZCB4cG9pbnRlciBzeW50YXg6ICIgKw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeHBvaW50ZXIpOw0KLQ0KLSAgICB4cG9pbnRlciA9IHhwb2ludGVyLnN1YnN0cmluZygwLCB4cG9pbnRlci5sZW5ndGgoKSAtIDIpLnN1YnN0cmluZygxKTsNCi0gICAgU3RyaW5nW10gZWxlbWVudHMgPSB4cG9pbnRlci5zcGxpdCgiLyIpOw0KLSAgICBpbnQgY291bnQgPSBlbGVtZW50cy5sZW5ndGg7DQotDQotICAgIF9yb290TmFtZXNwYWNlVVJJID0gbmV3IFN0cmluZ1tjb3VudF07DQotICAgIF9yb290TG9jYWxOYW1lID0gbmV3IFN0cmluZ1tjb3VudF07DQotICAgIF9hY2NlcHRDaGlsZE5vZGVzID0gbmV3IGJvb2xlYW5bY291bnRdOw0KLQ0KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspDQotICAgIHsNCi0gICAgICBTdHJpbmdbXSBwYXJ0cyA9IGVsZW1lbnRzW2ldLnNwbGl0KCI6Iik7DQotICAgICAgU3RyaW5nIHByZWZpeCA9IChwYXJ0cy5sZW5ndGggPT0gMSkgPyAiIiA6IHBhcnRzWzBdOw0KLSAgICAgIFN0cmluZyBuYW1lc3BhY2VVUkkgPSBuYW1lc3BhY2VzLmdldFVSSShwcmVmaXgpOw0KLSAgICAgIF9yb290TmFtZXNwYWNlVVJJW2ldID0gKG5hbWVzcGFjZVVSSSAhPSBudWxsKSA/IG5hbWVzcGFjZVVSSSA6ICIiOw0KLSAgICAgIF9yb290TG9jYWxOYW1lW2ldID0gKHBhcnRzLmxlbmd0aCA9PSAxKSA/IHBhcnRzWzBdIDogcGFydHNbMV07DQotICAgICAgX2FjY2VwdENoaWxkTm9kZXNbaV0gPSBmYWxzZTsNCi0gICAgfQ0KLSAgfQ0KLQ0KLSAgcHVibGljIHZvaWQgc3RhcnRFbGVtZW50KA0KLSAgICBTdHJpbmcgICAgIG5hbWVzcGFjZVVSSSwNCi0gICAgU3RyaW5nICAgICBsb2NhbE5hbWUsDQotICAgIFN0cmluZyAgICAgcXVhbGlmaWVkTmFtZSwNCi0gICAgQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB0aHJvd3MgU0FYRXhjZXB0aW9uDQotICB7DQotICAgIGlmIChfZGVwdGggPCBfYWNjZXB0Q2hpbGROb2Rlcy5sZW5ndGgpDQotICAgIHsNCi0gICAgICBfYWNjZXB0Q2hpbGROb2Rlc1tfZGVwdGhdID0NCi0gICAgICAgICAgIChfcm9vdE5hbWVzcGFjZVVSSVtfZGVwdGhdLmVxdWFscyhuYW1lc3BhY2VVUkkpICYmDQotICAgICAgICAgICAgX3Jvb3RMb2NhbE5hbWVbX2RlcHRoXS5lcXVhbHMobG9jYWxOYW1lKSk7DQotICAgIH0NCi0gICAgZWxzZSBpZiAoX2FjY2VwdGluZ0NoaWxkTm9kZXMoKSkNCi0gICAgew0KLSAgICAgIHN1cGVyLnN0YXJ0RWxlbWVudChuYW1lc3BhY2VVUkksIGxvY2FsTmFtZSwgcXVhbGlmaWVkTmFtZSwgYXR0cmlidXRlcyk7DQotICAgIH0NCi0NCi0gICAgX2RlcHRoKys7DQotICB9DQotDQotICBwdWJsaWMgdm9pZCBlbmRFbGVtZW50KA0KLSAgICBTdHJpbmcgbmFtZXNwYWNlVVJJLA0KLSAgICBTdHJpbmcgbG9jYWxOYW1lLA0KLSAgICBTdHJpbmcgcXVhbGlmaWVkTmFtZSkgdGhyb3dzIFNBWEV4Y2VwdGlvbg0KLSAgew0KLSAgICBfZGVwdGgtLTsNCi0NCi0gICAgaWYgKF9kZXB0aCA+PSBfYWNjZXB0Q2hpbGROb2Rlcy5sZW5ndGggJiYgX2FjY2VwdGluZ0NoaWxkTm9kZXMoKSkNCi0gICAgICBzdXBlci5lbmRFbGVtZW50KG5hbWVzcGFjZVVSSSwgbG9jYWxOYW1lLCBxdWFsaWZpZWROYW1lKTsNCi0gIH0NCi0NCi0gIA0KLSAgcHJpdmF0ZSBib29sZWFuIF9hY2NlcHRpbmdDaGlsZE5vZGVzKCkNCi0gIHsNCi0gICAgZm9yIChpbnQgaSA9IF9hY2NlcHRDaGlsZE5vZGVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKQ0KLSAgICB7DQotICAgICAgaWYgKCFfYWNjZXB0Q2hpbGROb2Rlc1tpXSkNCi0gICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgfQ0KLQ0KLSAgICByZXR1cm4gdHJ1ZTsNCi0gIH0NCi0NCi0gIHByaXZhdGUgaW50ICAgICBfZGVwdGg7DQotICBwcml2YXRlIGJvb2xlYW5bXSBfYWNjZXB0Q2hpbGROb2RlczsNCi0gIHByaXZhdGUgU3RyaW5nW10gIF9yb290TmFtZXNwYWNlVVJJOw0KLSAgcHJpdmF0ZSBTdHJpbmdbXSAgX3Jvb3RMb2NhbE5hbWU7DQotfQ0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvdW5wYWNrL0Fic3RyYWN0RGVwZW5kZW5jeU1vam8uamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvdW5wYWNrL0Fic3RyYWN0RGVwZW5kZW5jeU1vam8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODZhOWEzYS4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL3VucGFjay9BYnN0cmFjdERlcGVuZGVuY3lNb2pvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MzcgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uYnVpbGRlci51bnBhY2s7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLmFydGlmYWN0LmZhY3RvcnkuQXJ0aWZhY3RGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4uYXJ0aWZhY3QubWV0YWRhdGEuQXJ0aWZhY3RNZXRhZGF0YVNvdXJjZTsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLmFydGlmYWN0LnJlcG9zaXRvcnkuQXJ0aWZhY3RSZXBvc2l0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4uYXJ0aWZhY3QucmVzb2x2ZXIuQXJ0aWZhY3RDb2xsZWN0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5hcnRpZmFjdC5yZXNvbHZlci5BcnRpZmFjdFJlc29sdmVyOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLkFic3RyYWN0TW9qbzsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5Nb2pvRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmRlcGVuZGVuY3kudXRpbHMuRGVwZW5kZW5jeVNpbGVudExvZzsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnByb2plY3QuTWF2ZW5Qcm9qZWN0OwotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMuYXJjaGl2ZXIuQXJjaGl2ZXJFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy5hcmNoaXZlci5VbkFyY2hpdmVyOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMuYXJjaGl2ZXIubWFuYWdlci5BcmNoaXZlck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy5hcmNoaXZlci5tYW5hZ2VyLk5vU3VjaEFyY2hpdmVyRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMuY29tcG9uZW50cy5pby5maWxlc2VsZWN0b3JzLkluY2x1ZGVFeGNsdWRlRmlsZVNlbGVjdG9yOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMudXRpbC5GaWxlVXRpbHM7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy51dGlsLlJlZmxlY3Rpb25VdGlsczsKLWltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLnV0aWwuU3RyaW5nVXRpbHM7Ci0KLS8qKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86YnJpYW5mQGFwYWNoZS5vcmciPkJyaWFuIEZveDwvYT4KLSAqIEB2ZXJzaW9uICRJZDogQWJzdHJhY3REZXBlbmRlbmN5TW9qby5qYXZhIDU1MjUyOAotICogICAgICAgICAgMjAwNy0wNy0wMiAxNjoxMjo0N1ogbWFya2ggJAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3REZXBlbmRlbmN5TW9qbwotICAgIGV4dGVuZHMgQWJzdHJhY3RNb2pvCi17Ci0gICAgLyoqCi0gICAgICogVXNlZCB0byBsb29rIHVwIEFydGlmYWN0cyBpbiB0aGUgcmVtb3RlIHJlcG9zaXRvcnkuCi0gICAgICoKLSAgICAgKiBAY29tcG9uZW50Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIEFydGlmYWN0RmFjdG9yeSBmYWN0b3J5OwotCi0gICAgLyoqCi0gICAgICogVXNlZCB0byBsb29rIHVwIEFydGlmYWN0cyBpbiB0aGUgcmVtb3RlIHJlcG9zaXRvcnkuCi0gICAgICoKLSAgICAgKiBAY29tcG9uZW50Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIEFydGlmYWN0UmVzb2x2ZXIgcmVzb2x2ZXI7Ci0KLSAgICAvKioKLSAgICAgKiBBcnRpZmFjdCBjb2xsZWN0b3IsIG5lZWRlZCB0byByZXNvbHZlIGRlcGVuZGVuY2llcy4KLSAgICAgKgotICAgICAqIEBjb21wb25lbnQgcm9sZT0ib3JnLmFwYWNoZS5tYXZlbi5hcnRpZmFjdC5yZXNvbHZlci5BcnRpZmFjdENvbGxlY3RvciIKLSAgICAgKiBAcmVxdWlyZWQKLSAgICAgKiBAcmVhZG9ubHkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQXJ0aWZhY3RDb2xsZWN0b3IgYXJ0aWZhY3RDb2xsZWN0b3I7Ci0KLSAgICAvKioKLSAgICAgKiBAY29tcG9uZW50IHJvbGU9Im9yZy5hcGFjaGUubWF2ZW4uYXJ0aWZhY3QubWV0YWRhdGEuQXJ0aWZhY3RNZXRhZGF0YVNvdXJjZSIKLSAgICAgKiAgICAgICAgICAgIGhpbnQ9Im1hdmVuIgotICAgICAqIEByZXF1aXJlZAotICAgICAqIEByZWFkb25seQotICAgICAqLwotICAgIHByb3RlY3RlZCBBcnRpZmFjdE1ldGFkYXRhU291cmNlIGFydGlmYWN0TWV0YWRhdGFTb3VyY2U7Ci0KLSAgICAvKioKLSAgICAgKiBMb2NhdGlvbiBvZiB0aGUgbG9jYWwgcmVwb3NpdG9yeS4KLSAgICAgKgotICAgICAqIEBwYXJhbWV0ZXIgZXhwcmVzc2lvbj0iJHtsb2NhbFJlcG9zaXRvcnl9IgotICAgICAqIEByZWFkb25seQotICAgICAqIEByZXF1aXJlZAotICAgICAqLwotICAgIHByaXZhdGUgQXJ0aWZhY3RSZXBvc2l0b3J5IGxvY2FsOwotCi0gICAgLyoqCi0gICAgICogTGlzdCBvZiBSZW1vdGUgUmVwb3NpdG9yaWVzIHVzZWQgYnkgdGhlIHJlc29sdmVyCi0gICAgICoKLSAgICAgKiBAcGFyYW1ldGVyIGV4cHJlc3Npb249IiR7cHJvamVjdC5yZW1vdGVBcnRpZmFjdFJlcG9zaXRvcmllc30iCi0gICAgICogQHJlYWRvbmx5Ci0gICAgICogQHJlcXVpcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIExpc3Q8QXJ0aWZhY3RSZXBvc2l0b3J5PiByZW1vdGVSZXBvczsKLQotICAgIC8qKgotICAgICAqIFRvIGxvb2sgdXAgQXJjaGl2ZXIvVW5BcmNoaXZlciBpbXBsZW1lbnRhdGlvbnMKLSAgICAgKgotICAgICAqIEBjb21wb25lbnQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQXJjaGl2ZXJNYW5hZ2VyIGFyY2hpdmVyTWFuYWdlcjsKLQotICAgIC8qKgotICAgICAqIFBPTQotICAgICAqCi0gICAgICogQHBhcmFtZXRlciBleHByZXNzaW9uPSIke3Byb2plY3R9IgotICAgICAqIEByZWFkb25seQotICAgICAqIEByZXF1aXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBNYXZlblByb2plY3QgcHJvamVjdDsKLQotICAgIC8qKgotICAgICAqIENvbnRhaW5zIHRoZSBmdWxsIGxpc3Qgb2YgcHJvamVjdHMgaW4gdGhlIHJlYWN0b3IuCi0gICAgICoKLSAgICAgKiBAcGFyYW1ldGVyIGV4cHJlc3Npb249IiR7cmVhY3RvclByb2plY3RzfSIKLSAgICAgKiBAcmVxdWlyZWQKLSAgICAgKiBAcmVhZG9ubHkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgTGlzdDxNYXZlblByb2plY3Q+IHJlYWN0b3JQcm9qZWN0czsKLQotICAgIC8qKgotICAgICAqIElmIHRoZSBwbHVnaW4gc2hvdWxkIGJlIHNpbGVudC4KLSAgICAgKgotICAgICAqIEBvcHRpb25hbAotICAgICAqIEBzaW5jZSAyLjAKLSAgICAgKiBAcGFyYW1ldGVyIGV4cHJlc3Npb249IiR7c2lsZW50fSIKLSAgICAgKiAgICAgICAgICAgIGRlZmF1bHQtdmFsdWU9ImZhbHNlIgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHNpbGVudDsKLQotICAgIC8qKgotICAgICAqIE91dHB1dCBhYnNvbHV0ZSBmaWxlbmFtZSBmb3IgcmVzb2x2ZWQgYXJ0aWZhY3RzCi0gICAgICoKLSAgICAgKiBAb3B0aW9uYWwKLSAgICAgKiBAc2luY2UgMi4wCi0gICAgICogQHBhcmFtZXRlciBleHByZXNzaW9uPSIke291dHB1dEFic29sdXRlQXJ0aWZhY3RGaWxlbmFtZX0iCi0gICAgICogICAgICAgICAgICBkZWZhdWx0LXZhbHVlPSJmYWxzZSIKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBvdXRwdXRBYnNvbHV0ZUFydGlmYWN0RmlsZW5hbWU7Ci0KLSAgICBwcml2YXRlIExvZyBsb2c7Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGxvZy4KLSAgICAgKi8KLSAgICBwdWJsaWMgTG9nIGdldExvZygpCi0gICAgewotICAgICAgICBpZiAoIHNpbGVudCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvZyA9IG5ldyBEZXBlbmRlbmN5U2lsZW50TG9nKCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBsb2cgPSBzdXBlci5nZXRMb2coKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB0aGlzLmxvZzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGFyY2hpdmVyTWFuYWdlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgQXJjaGl2ZXJNYW5hZ2VyIGdldEFyY2hpdmVyTWFuYWdlcigpCi0gICAgewotICAgICAgICByZXR1cm4gdGhpcy5hcmNoaXZlck1hbmFnZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRG9lcyB0aGUgYWN0dWFsIGNvcHkgb2YgdGhlIGZpbGUgYW5kIGxvZ2dpbmcuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYXJ0aWZhY3QgcmVwcmVzZW50cyB0aGUgZmlsZSB0byBjb3B5LgotICAgICAqIEBwYXJhbSBkZXN0RmlsZSBmaWxlIG5hbWUgb2YgZGVzdGluYXRpb24gZmlsZS4KLSAgICAgKgotICAgICAqIEB0aHJvd3MgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbiB3aXRoIGEgbWVzc2FnZSBpZiBhbgotICAgICAqICAgICAgICAgICAgIGVycm9yIG9jY3Vycy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBjb3B5RmlsZSggRmlsZSBhcnRpZmFjdCwgRmlsZSBkZXN0RmlsZSApCi0gICAgICAgIHRocm93cyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uCi0gICAgewotICAgICAgICBMb2cgdGhlTG9nID0gdGhpcy5nZXRMb2coKTsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHRoZUxvZy5pbmZvKCAiQ29weWluZyAiCi0gICAgICAgICAgICAgICAgKyAoIHRoaXMub3V0cHV0QWJzb2x1dGVBcnRpZmFjdEZpbGVuYW1lID8gYXJ0aWZhY3QuZ2V0QWJzb2x1dGVQYXRoKCkgOiBhcnRpZmFjdC5nZXROYW1lKCkgKSArICIgdG8gIgotICAgICAgICAgICAgICAgICsgZGVzdEZpbGUgKTsKLSAgICAgICAgICAgIEZpbGVVdGlscy5jb3B5RmlsZSggYXJ0aWZhY3QsIGRlc3RGaWxlICk7Ci0KLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoIEV4Y2VwdGlvbiBlICkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IE1vam9FeGVjdXRpb25FeGNlcHRpb24oICJFcnJvciBjb3B5aW5nIGFydGlmYWN0IGZyb20gIiArIGFydGlmYWN0ICsgIiB0byAiICsgZGVzdEZpbGUsIGUgKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHVucGFjayggRmlsZSBmaWxlLCBGaWxlIGxvY2F0aW9uICkKLSAgICAgICAgdGhyb3dzIE1vam9FeGVjdXRpb25FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHVucGFjayggZmlsZSwgbG9jYXRpb24sIG51bGwsIG51bGwgKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBVbnBhY2tzIHRoZSBhcmNoaXZlIGZpbGUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZmlsZSBGaWxlIHRvIGJlIHVucGFja2VkLgotICAgICAqIEBwYXJhbSBsb2NhdGlvbiBMb2NhdGlvbiB3aGVyZSB0byBwdXQgdGhlIHVucGFja2VkIGZpbGVzLgotICAgICAqIEBwYXJhbSBpbmNsdWRlcyBDb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiBmaWxlIHBhdHRlcm5zIHRvIGluY2x1ZGUgaS5lLiA8Y29kZT4qKiYjNDc7LnhtbCwKLSAgICAgKiAgICAgICAgICAgICoqJiM0NzsqLnByb3BlcnRpZXM8L2NvZGU+Ci0gICAgICogQHBhcmFtIGV4Y2x1ZGVzIENvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIGZpbGUgcGF0dGVybnMgdG8gZXhjbHVkZSBpLmUuIDxjb2RlPioqJiM0NzsqLnhtbCwKLSAgICAgKiAgICAgICAgICAgICoqJiM0NzsqLnByb3BlcnRpZXM8L2NvZGU+Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgdW5wYWNrKCBGaWxlIGZpbGUsIEZpbGUgbG9jYXRpb24sIFN0cmluZyBpbmNsdWRlcywgU3RyaW5nIGV4Y2x1ZGVzICkKLSAgICAgICAgdGhyb3dzIE1vam9FeGVjdXRpb25FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBsb2dVbnBhY2soIGZpbGUsIGxvY2F0aW9uLCBpbmNsdWRlcywgZXhjbHVkZXMgKTsKLQotICAgICAgICAgICAgbG9jYXRpb24ubWtkaXJzKCk7Ci0KLSAgICAgICAgICAgIFVuQXJjaGl2ZXIgdW5BcmNoaXZlcjsKLQotICAgICAgICAgICAgdW5BcmNoaXZlciA9IGFyY2hpdmVyTWFuYWdlci5nZXRVbkFyY2hpdmVyKCBmaWxlICk7Ci0KLSAgICAgICAgICAgIHVuQXJjaGl2ZXIuc2V0U291cmNlRmlsZSggZmlsZSApOwotCi0gICAgICAgICAgICB1bkFyY2hpdmVyLnNldERlc3REaXJlY3RvcnkoIGxvY2F0aW9uICk7Ci0KLSAgICAgICAgICAgIGlmICggU3RyaW5nVXRpbHMuaXNOb3RFbXB0eSggZXhjbHVkZXMgKSB8fCBTdHJpbmdVdGlscy5pc05vdEVtcHR5KCBpbmNsdWRlcyApICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyBDcmVhdGUgdGhlIHNlbGVjdG9ycyB0aGF0IHdpbGwgZmlsdGVyCi0gICAgICAgICAgICAgICAgLy8gYmFzZWQgb24gaW5jbHVkZS9leGNsdWRlIHBhcmFtZXRlcnMKLSAgICAgICAgICAgICAgICAvLyBNREVQLTQ3Ci0gICAgICAgICAgICAgICAgSW5jbHVkZUV4Y2x1ZGVGaWxlU2VsZWN0b3JbXSBzZWxlY3RvcnMgPSBuZXcgSW5jbHVkZUV4Y2x1ZGVGaWxlU2VsZWN0b3JbXSB7IG5ldyBJbmNsdWRlRXhjbHVkZUZpbGVTZWxlY3RvcigpIH07Ci0KLSAgICAgICAgICAgICAgICBpZiAoIFN0cmluZ1V0aWxzLmlzTm90RW1wdHkoIGV4Y2x1ZGVzICkgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3JzWzBdLnNldEV4Y2x1ZGVzKCBleGNsdWRlcy5zcGxpdCggIiwiICkgKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoIFN0cmluZ1V0aWxzLmlzTm90RW1wdHkoIGluY2x1ZGVzICkgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3JzWzBdLnNldEluY2x1ZGVzKCBpbmNsdWRlcy5zcGxpdCggIiwiICkgKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICB1bkFyY2hpdmVyLnNldEZpbGVTZWxlY3RvcnMoIHNlbGVjdG9ycyApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCB0aGlzLnNpbGVudCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc2lsZW5jZVVuYXJjaGl2ZXIoIHVuQXJjaGl2ZXIgKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdW5BcmNoaXZlci5leHRyYWN0KCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKCBOb1N1Y2hBcmNoaXZlckV4Y2VwdGlvbiBlICkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IE1vam9FeGVjdXRpb25FeGNlcHRpb24oICJVbmtub3duIGFyY2hpdmVyIHR5cGUiLCBlICk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKCBBcmNoaXZlckV4Y2VwdGlvbiBlICkKLSAgICAgICAgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIHRocm93IG5ldyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uKCAiRXJyb3IgdW5wYWNraW5nIGZpbGU6ICIgKyBmaWxlICsgIiB0bzogIiArIGxvY2F0aW9uICsgIlxyXG4iCi0gICAgICAgICAgICAgICAgKyBlLnRvU3RyaW5nKCksIGUgKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBzaWxlbmNlVW5hcmNoaXZlciggVW5BcmNoaXZlciB1bkFyY2hpdmVyICkKLSAgICB7Ci0gICAgICAgIC8vIGRhbmdlcm91cyBidXQgaGFuZGxlIGFueSBlcnJvcnMuIEl0J3MgdGhlIG9ubHkgd2F5IHRvIHNpbGVuY2UgdGhlIHVuQXJjaGl2ZXIuCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBGaWVsZCBmaWVsZCA9IFJlZmxlY3Rpb25VdGlscy5nZXRGaWVsZEJ5TmFtZUluY2x1ZGluZ1N1cGVyY2xhc3NlcyggImxvZ2dlciIsIHVuQXJjaGl2ZXIuZ2V0Q2xhc3MoKSApOwotCi0gICAgICAgICAgICBmaWVsZC5zZXRBY2Nlc3NpYmxlKCB0cnVlICk7Ci0KLSAgICAgICAgICAgIGZpZWxkLnNldCggdW5BcmNoaXZlciwgdGhpcy5nZXRMb2coKSApOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoICggRXhjZXB0aW9uIGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyB3YXMgYSBuaWNlIHRyeS4gRG9uJ3QgYm90aGVyIGxvZ2dpbmcgYmVjYXVzZSB0aGUgbG9nIGlzIHNpbGVudC4KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgZmFjdG9yeS4KLSAgICAgKi8KLSAgICBwdWJsaWMgQXJ0aWZhY3RGYWN0b3J5IGdldEZhY3RvcnkoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuZmFjdG9yeTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gZmFjdG9yeSBUaGUgZmFjdG9yeSB0byBzZXQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RmFjdG9yeSggQXJ0aWZhY3RGYWN0b3J5IGZhY3RvcnkgKQotICAgIHsKLSAgICAgICAgdGhpcy5mYWN0b3J5ID0gZmFjdG9yeTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHByb2plY3QuCi0gICAgICovCi0gICAgcHVibGljIE1hdmVuUHJvamVjdCBnZXRQcm9qZWN0KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzLnByb2plY3Q7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBsb2NhbC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQXJ0aWZhY3RSZXBvc2l0b3J5IGdldExvY2FsKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzLmxvY2FsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBsb2NhbCBUaGUgbG9jYWwgdG8gc2V0LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldExvY2FsKCBBcnRpZmFjdFJlcG9zaXRvcnkgbG9jYWwgKQotICAgIHsKLSAgICAgICAgdGhpcy5sb2NhbCA9IGxvY2FsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgcmVtb3RlUmVwb3MuCi0gICAgICovCi0gICAgcHVibGljIExpc3Q8QXJ0aWZhY3RSZXBvc2l0b3J5PiBnZXRSZW1vdGVSZXBvcygpCi0gICAgewotICAgICAgICByZXR1cm4gdGhpcy5yZW1vdGVSZXBvczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gcmVtb3RlUmVwb3MgVGhlIHJlbW90ZVJlcG9zIHRvIHNldC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRSZW1vdGVSZXBvcyggTGlzdDxBcnRpZmFjdFJlcG9zaXRvcnk+IHJlbW90ZVJlcG9zICkKLSAgICB7Ci0gICAgICAgIHRoaXMucmVtb3RlUmVwb3MgPSByZW1vdGVSZXBvczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHJlc29sdmVyLgotICAgICAqLwotICAgIHB1YmxpYyBvcmcuYXBhY2hlLm1hdmVuLmFydGlmYWN0LnJlc29sdmVyLkFydGlmYWN0UmVzb2x2ZXIgZ2V0UmVzb2x2ZXIoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRoaXMucmVzb2x2ZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIHJlc29sdmVyIFRoZSByZXNvbHZlciB0byBzZXQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UmVzb2x2ZXIoIEFydGlmYWN0UmVzb2x2ZXIgcmVzb2x2ZXIgKQotICAgIHsKLSAgICAgICAgdGhpcy5yZXNvbHZlciA9IHJlc29sdmVyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBhcmNoaXZlck1hbmFnZXIgVGhlIGFyY2hpdmVyTWFuYWdlciB0byBzZXQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0QXJjaGl2ZXJNYW5hZ2VyKCBBcmNoaXZlck1hbmFnZXIgYXJjaGl2ZXJNYW5hZ2VyICkKLSAgICB7Ci0gICAgICAgIHRoaXMuYXJjaGl2ZXJNYW5hZ2VyID0gYXJjaGl2ZXJNYW5hZ2VyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgYXJ0aWZhY3RDb2xsZWN0b3IuCi0gICAgICovCi0gICAgcHVibGljIEFydGlmYWN0Q29sbGVjdG9yIGdldEFydGlmYWN0Q29sbGVjdG9yKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzLmFydGlmYWN0Q29sbGVjdG9yOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSB0aGVBcnRpZmFjdENvbGxlY3RvciBUaGUgYXJ0aWZhY3RDb2xsZWN0b3IgdG8gc2V0LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEFydGlmYWN0Q29sbGVjdG9yKCBBcnRpZmFjdENvbGxlY3RvciB0aGVBcnRpZmFjdENvbGxlY3RvciApCi0gICAgewotICAgICAgICB0aGlzLmFydGlmYWN0Q29sbGVjdG9yID0gdGhlQXJ0aWZhY3RDb2xsZWN0b3I7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBhcnRpZmFjdE1ldGFkYXRhU291cmNlLgotICAgICAqLwotICAgIHB1YmxpYyBBcnRpZmFjdE1ldGFkYXRhU291cmNlIGdldEFydGlmYWN0TWV0YWRhdGFTb3VyY2UoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuYXJ0aWZhY3RNZXRhZGF0YVNvdXJjZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gdGhlQXJ0aWZhY3RNZXRhZGF0YVNvdXJjZSBUaGUgYXJ0aWZhY3RNZXRhZGF0YVNvdXJjZSB0byBzZXQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0QXJ0aWZhY3RNZXRhZGF0YVNvdXJjZSggQXJ0aWZhY3RNZXRhZGF0YVNvdXJjZSB0aGVBcnRpZmFjdE1ldGFkYXRhU291cmNlICkKLSAgICB7Ci0gICAgICAgIHRoaXMuYXJ0aWZhY3RNZXRhZGF0YVNvdXJjZSA9IHRoZUFydGlmYWN0TWV0YWRhdGFTb3VyY2U7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGxvZ1VucGFjayggRmlsZSBmaWxlLCBGaWxlIGxvY2F0aW9uLCBTdHJpbmcgaW5jbHVkZXMsIFN0cmluZyBleGNsdWRlcyApCi0gICAgewotICAgICAgICBpZiAoICFnZXRMb2coKS5pc0luZm9FbmFibGVkKCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmdCdWZmZXIgbXNnID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICBtc2cuYXBwZW5kKCAiVW5wYWNraW5nICIgKTsKLSAgICAgICAgbXNnLmFwcGVuZCggZmlsZSApOwotICAgICAgICBtc2cuYXBwZW5kKCAiIHRvICIgKTsKLSAgICAgICAgbXNnLmFwcGVuZCggbG9jYXRpb24gKTsKLQotICAgICAgICBpZiAoIGluY2x1ZGVzICE9IG51bGwgJiYgZXhjbHVkZXMgIT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1zZy5hcHBlbmQoICIgd2l0aCBpbmNsdWRlcyBcIiIgKTsKLSAgICAgICAgICAgIG1zZy5hcHBlbmQoIGluY2x1ZGVzICk7Ci0gICAgICAgICAgICBtc2cuYXBwZW5kKCAiXCIgYW5kIGV4Y2x1ZGVzIFwiIiApOwotICAgICAgICAgICAgbXNnLmFwcGVuZCggZXhjbHVkZXMgKTsKLSAgICAgICAgICAgIG1zZy5hcHBlbmQoICJcIiIgKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmICggaW5jbHVkZXMgIT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1zZy5hcHBlbmQoICIgd2l0aCBpbmNsdWRlcyBcIiIgKTsKLSAgICAgICAgICAgIG1zZy5hcHBlbmQoIGluY2x1ZGVzICk7Ci0gICAgICAgICAgICBtc2cuYXBwZW5kKCAiXCIiICk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoIGV4Y2x1ZGVzICE9IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBtc2cuYXBwZW5kKCAiIHdpdGggZXhjbHVkZXMgXCIiICk7Ci0gICAgICAgICAgICBtc2cuYXBwZW5kKCBleGNsdWRlcyApOwotICAgICAgICAgICAgbXNnLmFwcGVuZCggIlwiIiApOwotICAgICAgICB9Ci0KLSAgICAgICAgZ2V0TG9nKCkuaW5mbyggbXNnLnRvU3RyaW5nKCkgKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL3VucGFjay9BYnN0cmFjdEZyb21Db25maWd1cmF0aW9uTW9qby5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci91bnBhY2svQWJzdHJhY3RGcm9tQ29uZmlndXJhdGlvbk1vam8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTA1ZDhkNC4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL3VucGFjay9BYnN0cmFjdEZyb21Db25maWd1cmF0aW9uTW9qby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQwICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmJ1aWxkZXIudW5wYWNrOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5hcnRpZmFjdC5BcnRpZmFjdDsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLmFydGlmYWN0LnJlcG9zaXRvcnkuQXJ0aWZhY3RSZXBvc2l0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4uYXJ0aWZhY3QucmVwb3NpdG9yeS5BcnRpZmFjdFJlcG9zaXRvcnlGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4uYXJ0aWZhY3QucmVzb2x2ZXIuQXJ0aWZhY3ROb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLmFydGlmYWN0LnJlc29sdmVyLkFydGlmYWN0UmVzb2x1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLmFydGlmYWN0LnZlcnNpb25pbmcuSW52YWxpZFZlcnNpb25TcGVjaWZpY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4uYXJ0aWZhY3QudmVyc2lvbmluZy5WZXJzaW9uUmFuZ2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5tb2RlbC5EZXBlbmRlbmN5OwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLk1vam9FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uZGVwZW5kZW5jeS51dGlscy5EZXBlbmRlbmN5VXRpbDsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5kZXBlbmRlbmN5LnV0aWxzLmZpbHRlcnMuQXJ0aWZhY3RJdGVtRmlsdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucHJvamVjdC5NYXZlblByb2plY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5zaGFyZWQuYXJ0aWZhY3QuZmlsdGVyLmNvbGxlY3Rpb24uQXJ0aWZhY3RGaWx0ZXJFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy51dGlsLlN0cmluZ1V0aWxzOwotCi0vKioKLSAqIEFic3RyYWN0IFBhcmVudCBjbGFzcyB1c2VkIGJ5IG1vam9zIHRoYXQgZ2V0IEFydGlmYWN0IGluZm9ybWF0aW9uIGZyb20gdGhlIHBsdWdpbiBjb25maWd1cmF0aW9uIGFzIGFuIEFycmF5TGlzdCBvZgotICogQXJ0aWZhY3RJdGVtcwotICogCi0gKiBAc2VlIEFydGlmYWN0SXRlbQotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86YnJpYW5mQGFwYWNoZS5vcmciPkJyaWFuIEZveDwvYT4KLSAqIEB2ZXJzaW9uICRJZCQKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0RnJvbUNvbmZpZ3VyYXRpb25Nb2pvCi0gICAgZXh0ZW5kcyBBYnN0cmFjdERlcGVuZGVuY3lNb2pvCi17Ci0gICAgLyoqCi0gICAgICogU2tpcCB0aGUgZXhlY3V0aW9uCi0gICAgICogCi0gICAgICogQG9wdGlvbmFsCi0gICAgICogQHNpbmNlIDIuMgotICAgICAqIEBwYXJhbWV0ZXIgZXhwcmVzc2lvbj0iJHttZGVwLnNraXB9IiBkZWZhdWx0LXZhbHVlPSJmYWxzZSIKLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gc2tpcDsKLQotICAgIC8qKgotICAgICAqIERlZmF1bHQgbG9jYXRpb24gdXNlZCBmb3IgbW9qbyB1bmxlc3Mgb3ZlcnJpZGRlbiBpbiBBcnRpZmFjdEl0ZW0KLSAgICAgKiAKLSAgICAgKiBAcGFyYW1ldGVyIGV4cHJlc3Npb249IiR7b3V0cHV0RGlyZWN0b3J5fSIgZGVmYXVsdC12YWx1ZT0iJHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vZGVwZW5kZW5jeSIKLSAgICAgKiBAb3B0aW9uYWwKLSAgICAgKiBAc2luY2UgMS4wCi0gICAgICovCi0gICAgcHJpdmF0ZSBGaWxlIG91dHB1dERpcmVjdG9yeTsKLQotICAgIC8qKgotICAgICAqIE92ZXJ3cml0ZSByZWxlYXNlIGFydGlmYWN0cwotICAgICAqIAotICAgICAqIEBvcHRpb25hbAotICAgICAqIEBzaW5jZSAxLjAKLSAgICAgKiBAcGFyYW1ldGVyIGV4cHJlc3Npb249IiR7bWRlcC5vdmVyV3JpdGVSZWxlYXNlc30iIGRlZmF1bHQtdmFsdWU9ImZhbHNlIgotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBvdmVyV3JpdGVSZWxlYXNlczsKLQotICAgIC8qKgotICAgICAqIE92ZXJ3cml0ZSBzbmFwc2hvdCBhcnRpZmFjdHMKLSAgICAgKiAKLSAgICAgKiBAb3B0aW9uYWwKLSAgICAgKiBAc2luY2UgMS4wCi0gICAgICogQHBhcmFtZXRlciBleHByZXNzaW9uPSIke21kZXAub3ZlcldyaXRlU25hcHNob3RzfSIgZGVmYXVsdC12YWx1ZT0iZmFsc2UiCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIG92ZXJXcml0ZVNuYXBzaG90czsKLQotICAgIC8qKgotICAgICAqIE92ZXJ3cml0ZSBpZiBuZXdlcgotICAgICAqIAotICAgICAqIEBvcHRpb25hbAotICAgICAqIEBzaW5jZSAyLjAKLSAgICAgKiBAcGFyYW1ldGVyIGV4cHJlc3Npb249IiR7bWRlcC5vdmVySWZOZXdlcn0iIGRlZmF1bHQtdmFsdWU9InRydWUiCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIG92ZXJXcml0ZUlmTmV3ZXI7Ci0KLSAgICAvKioKLSAgICAgKiBUbyBzZWFyY2ggZm9yIGFydGlmYWN0cyB3aXRoaW4gdGhlIHJlYWN0b3IgYW5kIGVuc3VyZSBjb25zaXN0ZW50IGJlaGF2aW91ciBiZXR3ZWVuIE1hdmVuIDIgYW5kIE1hdmVuIDMuCi0gICAgICoKLSAgICAgKiBAcGFyYW1ldGVyIGV4cHJlc3Npb249IiR7cmVhY3RvclByb2plY3RzfSIKLSAgICAgKiBAcmVxdWlyZWQKLSAgICAgKiBAcmVhZG9ubHkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgTGlzdDxNYXZlblByb2plY3Q+IHJlYWN0b3JQcm9qZWN0czsKLQotICAgIC8qKgotICAgICAqIENvbGxlY3Rpb24gb2YgQXJ0aWZhY3RJdGVtcyB0byB3b3JrIG9uLiAoQXJ0aWZhY3RJdGVtIGNvbnRhaW5zIGdyb3VwSWQsIGFydGlmYWN0SWQsIHZlcnNpb24sIHR5cGUsIGNsYXNzaWZpZXIsCi0gICAgICogbG9jYXRpb24sIGRlc3RGaWxlTmFtZSwgbWFya2VyRmlsZSBhbmQgb3ZlcndyaXRlLikgU2VlIDxhIGhyZWY9Ii4vdXNhZ2UuaHRtbCI+VXNhZ2U8L2E+IGZvciBkZXRhaWxzLgotICAgICAqIAotICAgICAqIEBwYXJhbWV0ZXIKLSAgICAgKiBAcmVxdWlyZWQKLSAgICAgKiBAc2luY2UgMS4wCi0gICAgICovCi0gICAgcHJpdmF0ZSBMaXN0PEFydGlmYWN0SXRlbT4gYXJ0aWZhY3RJdGVtczsKLQotICAgIC8qKgotICAgICAqIFRvIGxvb2sgdXAgQXJ0aWZhY3RSZXBvc2l0b3J5IGltcGxlbWVudGF0aW9uCi0gICAgICogCi0gICAgICogQGNvbXBvbmVudAotICAgICAqIEByZWFkb25seQotICAgICAqLwotICAgIHByaXZhdGUgQXJ0aWZhY3RSZXBvc2l0b3J5RmFjdG9yeSBhcnRpZmFjdFJlcG9zaXRvcnlNYW5hZ2VyOwotCi0gICAgLyoqCi0gICAgICogUGF0aCB0byBvdmVycmlkZSBkZWZhdWx0IGxvY2FsIHJlcG9zaXRvcnkgZHVyaW5nIHBsdWdpbidzIGV4ZWN1dGlvbi4gVG8gcmVtb3ZlIGFsbCBkb3dubG9hZGVkIGFydGlmYWN0cyBhcyBwYXJ0Ci0gICAgICogb2YgdGhlIGJ1aWxkLCBzZXQgdGhpcyB2YWx1ZSB0byBhIGxvY2F0aW9uIHVuZGVyIHlvdXIgcHJvamVjdCdzIHRhcmdldCBkaXJlY3RvcnkKLSAgICAgKiAKLSAgICAgKiBAcGFyYW1ldGVyCi0gICAgICogQHNpbmNlIDIuMgotICAgICAqLwotICAgIHByaXZhdGUgRmlsZSBsb2NhbFJlcG9zaXRvcnlEaXJlY3Rvcnk7Ci0KLSAgICAvKioKLSAgICAgKiBUbyBob3N0IGFuZCBjYWNoZSBsb2NhbFJlcG9zaXRvcnlEaXJlY3RvcnkKLSAgICAgKi8KLSAgICBwcml2YXRlIEFydGlmYWN0UmVwb3NpdG9yeSBvdmVycmlkZUxvY2FsUmVwb3NpdG9yeTsKLQotICAgIGFic3RyYWN0IEFydGlmYWN0SXRlbUZpbHRlciBnZXRNYXJrZWRBcnRpZmFjdEZpbHRlciggQXJ0aWZhY3RJdGVtIGl0ZW0gKTsKLQotICAgIC8qKgotICAgICAqIFByZXByb2Nlc3NlcyB0aGUgbGlzdCBvZiBBcnRpZmFjdEl0ZW1zLiBUaGlzIG1ldGhvZCBkZWZhdWx0cyB0aGUgb3V0cHV0RGlyZWN0b3J5IGlmIG5vdCBzZXQgYW5kIGNyZWF0ZXMgdGhlCi0gICAgICogb3V0cHV0IERpcmVjdG9yeSBpZiBpdCBkb2Vzbid0IGV4aXN0LgotICAgICAqIAotICAgICAqIEBwYXJhbSByZW1vdmVWZXJzaW9uIHJlbW92ZSB0aGUgdmVyc2lvbiBmcm9tIHRoZSBmaWxlbmFtZS4KLSAgICAgKiBAcmV0dXJuIEFuIEFycmF5TGlzdCBvZiBwcmVwcm9jZXNzZWQgQXJ0aWZhY3RJdGVtcwotICAgICAqIEB0aHJvd3MgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbiB3aXRoIGEgbWVzc2FnZSBpZiBhbiBlcnJvciBvY2N1cnMuCi0gICAgICogQHNlZSBBcnRpZmFjdEl0ZW0KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgTGlzdDxBcnRpZmFjdEl0ZW0+IGdldFByb2Nlc3NlZEFydGlmYWN0SXRlbXMoIGJvb2xlYW4gcmVtb3ZlVmVyc2lvbiApCi0gICAgICAgIHRocm93cyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uCi0gICAgewotICAgICAgICBpZiAoIGFydGlmYWN0SXRlbXMgPT0gbnVsbCB8fCBhcnRpZmFjdEl0ZW1zLnNpemUoKSA8IDEgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbiggIlRoZXJlIGFyZSBubyBhcnRpZmFjdEl0ZW1zIGNvbmZpZ3VyZWQuIiApOwotICAgICAgICB9Ci0KLSAgICAgICAgZm9yICggQXJ0aWZhY3RJdGVtIGFydGlmYWN0SXRlbSA6IGFydGlmYWN0SXRlbXMgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLmdldExvZygpLmluZm8oICJDb25maWd1cmVkIEFydGlmYWN0OiAiICsgYXJ0aWZhY3RJdGVtLnRvU3RyaW5nKCkgKTsKLQotICAgICAgICAgICAgaWYgKCBhcnRpZmFjdEl0ZW0uZ2V0T3V0cHV0RGlyZWN0b3J5KCkgPT0gbnVsbCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYXJ0aWZhY3RJdGVtLnNldE91dHB1dERpcmVjdG9yeSggdGhpcy5vdXRwdXREaXJlY3RvcnkgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGFydGlmYWN0SXRlbS5nZXRPdXRwdXREaXJlY3RvcnkoKS5ta2RpcnMoKTsKLQotICAgICAgICAgICAgLy8gbWFrZSBzdXJlIHdlIGhhdmUgYSB2ZXJzaW9uLgotICAgICAgICAgICAgaWYgKCBTdHJpbmdVdGlscy5pc0VtcHR5KCBhcnRpZmFjdEl0ZW0uZ2V0VmVyc2lvbigpICkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZpbGxNaXNzaW5nQXJ0aWZhY3RWZXJzaW9uKCBhcnRpZmFjdEl0ZW0gKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYXJ0aWZhY3RJdGVtLnNldEFydGlmYWN0KCB0aGlzLmdldEFydGlmYWN0KCBhcnRpZmFjdEl0ZW0gKSApOwotCi0gICAgICAgICAgICBpZiAoIFN0cmluZ1V0aWxzLmlzRW1wdHkoIGFydGlmYWN0SXRlbS5nZXREZXN0RmlsZU5hbWUoKSApICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhcnRpZmFjdEl0ZW0uc2V0RGVzdEZpbGVOYW1lKCBEZXBlbmRlbmN5VXRpbC5nZXRGb3JtYXR0ZWRGaWxlTmFtZSggYXJ0aWZhY3RJdGVtLmdldEFydGlmYWN0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZVZlcnNpb24gKSApOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhcnRpZmFjdEl0ZW0uc2V0TmVlZHNQcm9jZXNzaW5nKCBjaGVja0lmUHJvY2Vzc2luZ05lZWRlZCggYXJ0aWZhY3RJdGVtICkgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoICggQXJ0aWZhY3RGaWx0ZXJFeGNlcHRpb24gZSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IE1vam9FeGVjdXRpb25FeGNlcHRpb24oIGUuZ2V0TWVzc2FnZSgpLCBlICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGFydGlmYWN0SXRlbXM7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGNoZWNrSWZQcm9jZXNzaW5nTmVlZGVkKCBBcnRpZmFjdEl0ZW0gaXRlbSApCi0gICAgICAgIHRocm93cyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uLCBBcnRpZmFjdEZpbHRlckV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLSAgICAgICAgaWYgKCBTdHJpbmdVdGlscy5lcXVhbHNJZ25vcmVDYXNlKCBpdGVtLmdldE92ZXJXcml0ZSgpLCAidHJ1ZSIgKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBBcnRpZmFjdEl0ZW1GaWx0ZXIgZmlsdGVyID0gZ2V0TWFya2VkQXJ0aWZhY3RGaWx0ZXIoIGl0ZW0gKTsKLSAgICAgICAgICAgIHJlc3VsdCA9IGZpbHRlci5pc0FydGlmYWN0SW5jbHVkZWQoIGl0ZW0gKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlc29sdmVzIHRoZSBBcnRpZmFjdCBmcm9tIHRoZSByZW1vdGUgcmVwb3NpdG9yeSBpZiBuZWNlc3NhcnkuIElmIG5vIHZlcnNpb24gaXMgc3BlY2lmaWVkLCBpdCB3aWxsIGJlIHJldHJpZXZlZAotICAgICAqIGZyb20gdGhlIGRlcGVuZGVuY3kgbGlzdCBvciBmcm9tIHRoZSBEZXBlbmRlbmN5TWFuYWdlbWVudCBzZWN0aW9uIG9mIHRoZSBwb20uCi0gICAgICogCi0gICAgICogQHBhcmFtIGFydGlmYWN0SXRlbSBjb250YWluaW5nIGluZm9ybWF0aW9uIGFib3V0IGFydGlmYWN0IGZyb20gcGx1Z2luIGNvbmZpZ3VyYXRpb24uCi0gICAgICogQHJldHVybiBBcnRpZmFjdCBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBzcGVjaWZpZWQgZmlsZS4KLSAgICAgKiBAdGhyb3dzIE1vam9FeGVjdXRpb25FeGNlcHRpb24gd2l0aCBhIG1lc3NhZ2UgaWYgdGhlIHZlcnNpb24gY2FuJ3QgYmUgZm91bmQgaW4gRGVwZW5kZW5jeU1hbmFnZW1lbnQuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIEFydGlmYWN0IGdldEFydGlmYWN0KCBBcnRpZmFjdEl0ZW0gYXJ0aWZhY3RJdGVtICkKLSAgICAgICAgdGhyb3dzIE1vam9FeGVjdXRpb25FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIEFydGlmYWN0IGFydGlmYWN0OwotCi0gICAgICAgIC8vIE1hcCBtYW5hZ2VkVmVyc2lvbnMgPSBjcmVhdGVNYW5hZ2VkVmVyc2lvbk1hcCggZmFjdG9yeSwKLSAgICAgICAgLy8gcHJvamVjdC5nZXRJZCgpLCBwcm9qZWN0LmdldERlcGVuZGVuY3lNYW5hZ2VtZW50KCkgKTsKLSAgICAgICAgVmVyc2lvblJhbmdlIHZyOwotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgdnIgPSBWZXJzaW9uUmFuZ2UuY3JlYXRlRnJvbVZlcnNpb25TcGVjKCBhcnRpZmFjdEl0ZW0uZ2V0VmVyc2lvbigpICk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKCBJbnZhbGlkVmVyc2lvblNwZWNpZmljYXRpb25FeGNlcHRpb24gZTEgKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCi0gICAgICAgICAgICBlMS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIHZyID0gVmVyc2lvblJhbmdlLmNyZWF0ZUZyb21WZXJzaW9uKCBhcnRpZmFjdEl0ZW0uZ2V0VmVyc2lvbigpICk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIFN0cmluZ1V0aWxzLmlzRW1wdHkoIGFydGlmYWN0SXRlbS5nZXRDbGFzc2lmaWVyKCkgKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFydGlmYWN0ID0KLSAgICAgICAgICAgICAgICBmYWN0b3J5LmNyZWF0ZURlcGVuZGVuY3lBcnRpZmFjdCggYXJ0aWZhY3RJdGVtLmdldEdyb3VwSWQoKSwgYXJ0aWZhY3RJdGVtLmdldEFydGlmYWN0SWQoKSwgdnIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFydGlmYWN0SXRlbS5nZXRUeXBlKCksIG51bGwsIEFydGlmYWN0LlNDT1BFX0NPTVBJTEUgKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFydGlmYWN0ID0KLSAgICAgICAgICAgICAgICBmYWN0b3J5LmNyZWF0ZURlcGVuZGVuY3lBcnRpZmFjdCggYXJ0aWZhY3RJdGVtLmdldEdyb3VwSWQoKSwgYXJ0aWZhY3RJdGVtLmdldEFydGlmYWN0SWQoKSwgdnIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFydGlmYWN0SXRlbS5nZXRUeXBlKCksIGFydGlmYWN0SXRlbS5nZXRDbGFzc2lmaWVyKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFydGlmYWN0LlNDT1BFX0NPTVBJTEUgKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIE1hdmVuIDMgd2lsbCBzZWFyY2ggdGhlIHJlYWN0b3IgZm9yIHRoZSBhcnRpZmFjdCBidXQgTWF2ZW4gMiBkb2VzIG5vdAotICAgICAgICAvLyB0byBrZWVwIGNvbnNpc3RlbnQgYmVoYXZpb3VyLCB3ZSBzZWFyY2ggdGhlIHJlYWN0b3Igb3Vyc2VsdmVzLgotICAgICAgICBBcnRpZmFjdCByZXN1bHQgPSBnZXRBcnRpZmFjdEZvbVJlYWN0b3IoIGFydGlmYWN0ICk7Ci0gICAgICAgIGlmICggcmVzdWx0ICE9IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBtZGVwLTUwIC0gcm9sbGVkYmFjayBmb3Igbm93IGJlY2F1c2UgaXQncyBicmVha2luZyBzb21lIGZ1bmN0aW9uYWxpdHkuCi0gICAgICAgICAgICAvKgotICAgICAgICAgICAgICogTGlzdCBsaXN0ZW5lcnMgPSBuZXcgQXJyYXlMaXN0KCk7IFNldCB0aGVTZXQgPSBuZXcgSGFzaFNldCgpOyB0aGVTZXQuYWRkKCBhcnRpZmFjdCApOwotICAgICAgICAgICAgICogQXJ0aWZhY3RSZXNvbHV0aW9uUmVzdWx0IGFydGlmYWN0UmVzb2x1dGlvblJlc3VsdCA9IGFydGlmYWN0Q29sbGVjdG9yLmNvbGxlY3QoIHRoZVNldCwgcHJvamVjdAotICAgICAgICAgICAgICogLmdldEFydGlmYWN0KCksIG1hbmFnZWRWZXJzaW9ucywgdGhpcy5sb2NhbCwgcHJvamVjdC5nZXRSZW1vdGVBcnRpZmFjdFJlcG9zaXRvcmllcygpLAotICAgICAgICAgICAgICogYXJ0aWZhY3RNZXRhZGF0YVNvdXJjZSwgbnVsbCwgbGlzdGVuZXJzICk7IEl0ZXJhdG9yIGl0ZXIgPQotICAgICAgICAgICAgICogYXJ0aWZhY3RSZXNvbHV0aW9uUmVzdWx0LmdldEFydGlmYWN0UmVzb2x1dGlvbk5vZGVzKCkuaXRlcmF0b3IoKTsgd2hpbGUgKCBpdGVyLmhhc05leHQoKSApIHsKLSAgICAgICAgICAgICAqIFJlc29sdXRpb25Ob2RlIG5vZGUgPSAoUmVzb2x1dGlvbk5vZGUpIGl0ZXIubmV4dCgpOyBhcnRpZmFjdCA9IG5vZGUuZ2V0QXJ0aWZhY3QoKTsgfQotICAgICAgICAgICAgICovCi0KLSAgICAgICAgICAgIHJlc29sdmVyLnJlc29sdmUoIGFydGlmYWN0LCByZW1vdGVSZXBvcywgZ2V0TG9jYWwoKSApOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoICggQXJ0aWZhY3RSZXNvbHV0aW9uRXhjZXB0aW9uIGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbiggIlVuYWJsZSB0byByZXNvbHZlIGFydGlmYWN0LiIsIGUgKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoIEFydGlmYWN0Tm90Rm91bmRFeGNlcHRpb24gZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uKCAiVW5hYmxlIHRvIGZpbmQgYXJ0aWZhY3QuIiwgZSApOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGFydGlmYWN0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENoZWNrcyB0byBzZWUgaWYgdGhlIHNwZWNpZmllZCBhcnRpZmFjdCBpcyBhdmFpbGFibGUgZnJvbSB0aGUgcmVhY3Rvci4KLSAgICAgKiBAcGFyYW0gYXJ0aWZhY3QgVGhlIGFydGlmYWN0IHdlIGFyZSBsb29raW5nIGZvci4KLSAgICAgKiBAcmV0dXJuIFRoZSByZXNvbHZlZCBhcnRpZmFjdCB0aGF0IGlzIHRoZSBzYW1lIGFzIHRoZSBvbmUgd2Ugd2VyZSBsb29raW5nIGZvciBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBvbmUgY291bGQKLSAgICAgKiBub3QgYmUgZm91bmQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBBcnRpZmFjdCBnZXRBcnRpZmFjdEZvbVJlYWN0b3IoIEFydGlmYWN0IGFydGlmYWN0ICkKLSAgICB7Ci0gICAgICAgIC8vIGNoZWNrIHByb2plY3QgZGVwZW5kZW5jaWVzIGZpcnN0IG9mZgotICAgICAgICBmb3IgKCBBcnRpZmFjdCBhIDogKFNldDxBcnRpZmFjdD4pIHByb2plY3QuZ2V0QXJ0aWZhY3RzKCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIGVxdWFscyggYXJ0aWZhY3QsIGEgKSAmJiBoYXNGaWxlKCBhICkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBhOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vIGNoZWNrIHJlYWN0b3IgcHJvamVjdHMKLSAgICAgICAgZm9yICggTWF2ZW5Qcm9qZWN0IHAgOiByZWFjdG9yUHJvamVjdHMgPT0gbnVsbCA/IENvbGxlY3Rpb25zLjxNYXZlblByb2plY3Q+ZW1wdHlMaXN0KCkgOiByZWFjdG9yUHJvamVjdHMgKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBjaGVjayB0aGUgbWFpbiBhcnRpZmFjdAotICAgICAgICAgICAgaWYgKCBlcXVhbHMoIGFydGlmYWN0LCBwLmdldEFydGlmYWN0KCkgKSAmJiBoYXNGaWxlKCBwLmdldEFydGlmYWN0KCkgKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHAuZ2V0QXJ0aWZhY3QoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIGNoZWNrIGFueSBzaWRlIGFydGlmYWN0cwotICAgICAgICAgICAgZm9yICggQXJ0aWZhY3QgYSA6IChMaXN0PEFydGlmYWN0PikgcC5nZXRBdHRhY2hlZEFydGlmYWN0cygpICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoIGVxdWFscyggYXJ0aWZhY3QsIGEgKSAmJiBoYXNGaWxlKCBhICkgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vIG5vdCBhdmFpbGFibGUKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgYXJ0aWZhY3QgaGFzIGEgZmlsZS4KLSAgICAgKiBAcGFyYW0gYXJ0aWZhY3QgdGhlIGFydGlmYWN0IChtYXkgYmUgbnVsbCkKLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIGFuZCBvbmx5IGlmIHRoZSBhcnRpZmFjdCBpcyBub24tbnVsbCBhbmQgaGFzIGEgZmlsZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGhhc0ZpbGUoIEFydGlmYWN0IGFydGlmYWN0ICkKLSAgICB7Ci0gICAgICAgIHJldHVybiBhcnRpZmFjdCAhPSBudWxsICYmIGFydGlmYWN0LmdldEZpbGUoKSAhPSBudWxsICYmIGFydGlmYWN0LmdldEZpbGUoKS5pc0ZpbGUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBOdWxsLXNhZmUgY29tcGFyZSBvZiB0d28gYXJ0aWZhY3RzIGJhc2VkIG9uIGdyb3VwSWQsIGFydGlmYWN0SWQsIHZlcnNpb24sIHR5cGUgYW5kIGNsYXNzaWZpZXIuCi0gICAgICogQHBhcmFtIGEgdGhlIGZpcnN0IGFydGlmYWN0LgotICAgICAqIEBwYXJhbSBiIHRoZSBzZWNvbmQgYXJ0aWZhY3QuCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBhbmQgb25seSBpZiB0aGUgdHdvIGFydGlmYWN0cyBoYXZlIHRoZSBzYW1lIGdyb3VwSWQsIGFydGlmYWN0SWQsIHZlcnNpb24sCi0gICAgICogdHlwZSBhbmQgY2xhc3NpZmllci4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGVxdWFscyggQXJ0aWZhY3QgYSwgQXJ0aWZhY3QgYiApCi0gICAgewotICAgICAgICByZXR1cm4gYSA9PSBiCi0gICAgICAgICAgICB8fCAhKCBhID09IG51bGwgfHwgYiA9PSBudWxsICkKLSAgICAgICAgICAgICYmIFN0cmluZ1V0aWxzLmVxdWFscyggYS5nZXRHcm91cElkKCksIGIuZ2V0R3JvdXBJZCgpICkKLSAgICAgICAgICAgICYmIFN0cmluZ1V0aWxzLmVxdWFscyggYS5nZXRBcnRpZmFjdElkKCksIGIuZ2V0QXJ0aWZhY3RJZCgpICkKLSAgICAgICAgICAgICYmIFN0cmluZ1V0aWxzLmVxdWFscyggYS5nZXRWZXJzaW9uKCksIGIuZ2V0VmVyc2lvbigpICkKLSAgICAgICAgICAgICYmIFN0cmluZ1V0aWxzLmVxdWFscyggYS5nZXRUeXBlKCksIGIuZ2V0VHlwZSgpICkKLSAgICAgICAgICAgICYmIFN0cmluZ1V0aWxzLmVxdWFscyggYS5nZXRDbGFzc2lmaWVyKCksIGIuZ2V0Q2xhc3NpZmllcigpICk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVHJpZXMgdG8gZmluZCBtaXNzaW5nIHZlcnNpb24gZnJvbSBkZXBlbmRlbmN5IGxpc3QgYW5kIGRlcGVuZGVuY3kgbWFuYWdlbWVudC4gSWYgZm91bmQsIHRoZSBhcnRpZmFjdCBpcyB1cGRhdGVkCi0gICAgICogd2l0aCB0aGUgY29ycmVjdCB2ZXJzaW9uLiBJdCB3aWxsIGZpcnN0IGxvb2sgZm9yIGFuIGV4YWN0IG1hdGNoIG9uIGFydGlmYWN0SWQvZ3JvdXBJZC9jbGFzc2lmaWVyL3R5cGUgYW5kIGlmIGl0Ci0gICAgICogZG9lc24ndCBmaW5kIGEgbWF0Y2gsIGl0IHdpbGwgdHJ5IGFnYWluIGxvb2tpbmcgZm9yIGFydGlmYWN0SWQgYW5kIGdyb3VwSWQgb25seS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gYXJ0aWZhY3QgcmVwcmVzZW50aW5nIGNvbmZpZ3VyZWQgZmlsZS4KLSAgICAgKiBAdGhyb3dzIE1vam9FeGVjdXRpb25FeGNlcHRpb24KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgZmlsbE1pc3NpbmdBcnRpZmFjdFZlcnNpb24oIEFydGlmYWN0SXRlbSBhcnRpZmFjdCApCi0gICAgICAgIHRocm93cyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uCi0gICAgewotICAgICAgICBMaXN0PERlcGVuZGVuY3k+IGRlcHMgPSBwcm9qZWN0LmdldERlcGVuZGVuY2llcygpOwotICAgICAgICBMaXN0PERlcGVuZGVuY3k+IGRlcE1uZ3QgPSBwcm9qZWN0LmdldERlcGVuZGVuY3lNYW5hZ2VtZW50KCkgPT0gbnVsbAotICAgICAgICAgICAgPyBDb2xsZWN0aW9ucy48RGVwZW5kZW5jeT5lbXB0eUxpc3QoKQotICAgICAgICAgICAgOiBwcm9qZWN0LmdldERlcGVuZGVuY3lNYW5hZ2VtZW50KCkuZ2V0RGVwZW5kZW5jaWVzKCk7Ci0KLSAgICAgICAgaWYgKCAhZmluZERlcGVuZGVuY3lWZXJzaW9uKCBhcnRpZmFjdCwgZGVwcywgZmFsc2UgKQotICAgICAgICAgICAgJiYgKCBwcm9qZWN0LmdldERlcGVuZGVuY3lNYW5hZ2VtZW50KCkgPT0gbnVsbCB8fCAhZmluZERlcGVuZGVuY3lWZXJzaW9uKCBhcnRpZmFjdCwgZGVwTW5ndCwgZmFsc2UgKSApCi0gICAgICAgICAgICAmJiAhZmluZERlcGVuZGVuY3lWZXJzaW9uKCBhcnRpZmFjdCwgZGVwcywgdHJ1ZSApCi0gICAgICAgICAgICAmJiAoIHByb2plY3QuZ2V0RGVwZW5kZW5jeU1hbmFnZW1lbnQoKSA9PSBudWxsIHx8ICFmaW5kRGVwZW5kZW5jeVZlcnNpb24oIGFydGlmYWN0LCBkZXBNbmd0LCB0cnVlICkgKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uKCAiVW5hYmxlIHRvIGZpbmQgYXJ0aWZhY3QgdmVyc2lvbiBvZiAiICsgYXJ0aWZhY3QuZ2V0R3JvdXBJZCgpICsgIjoiCi0gICAgICAgICAgICAgICAgKyBhcnRpZmFjdC5nZXRBcnRpZmFjdElkKCkgKyAiIGluIGVpdGhlciBkZXBlbmRlbmN5IGxpc3Qgb3IgaW4gcHJvamVjdCdzIGRlcGVuZGVuY3kgbWFuYWdlbWVudC4iICk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUcmllcyB0byBmaW5kIG1pc3NpbmcgdmVyc2lvbiBmcm9tIGEgbGlzdCBvZiBkZXBlbmRlbmNpZXMuIElmIGZvdW5kLCB0aGUgYXJ0aWZhY3QgaXMgdXBkYXRlZCB3aXRoIHRoZSBjb3JyZWN0Ci0gICAgICogdmVyc2lvbi4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gYXJ0aWZhY3QgcmVwcmVzZW50aW5nIGNvbmZpZ3VyZWQgZmlsZS4KLSAgICAgKiBAcGFyYW0gZGVwZW5kZW5jaWVzIGxpc3Qgb2YgZGVwZW5kZW5jaWVzIHRvIHNlYXJjaC4KLSAgICAgKiBAcGFyYW0gbG9vc2VNYXRjaCBvbmx5IGxvb2sgYXQgYXJ0aWZhY3RJZCBhbmQgZ3JvdXBJZAotICAgICAqIEByZXR1cm4gdGhlIGZvdW5kIGRlcGVuZGVuY3kKLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gZmluZERlcGVuZGVuY3lWZXJzaW9uKCBBcnRpZmFjdEl0ZW0gYXJ0aWZhY3QsIExpc3Q8RGVwZW5kZW5jeT4gZGVwZW5kZW5jaWVzLCBib29sZWFuIGxvb3NlTWF0Y2ggKQotICAgIHsKLSAgICAgICAgZm9yICggRGVwZW5kZW5jeSBkZXBlbmRlbmN5IDogZGVwZW5kZW5jaWVzICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCBTdHJpbmdVdGlscy5lcXVhbHMoIGRlcGVuZGVuY3kuZ2V0QXJ0aWZhY3RJZCgpLCBhcnRpZmFjdC5nZXRBcnRpZmFjdElkKCkgKQotICAgICAgICAgICAgICAgICYmIFN0cmluZ1V0aWxzLmVxdWFscyggZGVwZW5kZW5jeS5nZXRHcm91cElkKCksIGFydGlmYWN0LmdldEdyb3VwSWQoKSApCi0gICAgICAgICAgICAgICAgJiYgKCBsb29zZU1hdGNoIHx8IFN0cmluZ1V0aWxzLmVxdWFscyggZGVwZW5kZW5jeS5nZXRDbGFzc2lmaWVyKCksIGFydGlmYWN0LmdldENsYXNzaWZpZXIoKSApICkKLSAgICAgICAgICAgICAgICAmJiAoIGxvb3NlTWF0Y2ggfHwgU3RyaW5nVXRpbHMuZXF1YWxzKCBkZXBlbmRlbmN5LmdldFR5cGUoKSwgYXJ0aWZhY3QuZ2V0VHlwZSgpICkgKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYXJ0aWZhY3Quc2V0VmVyc2lvbiggZGVwZW5kZW5jeS5nZXRWZXJzaW9uKCkgKTsKLQotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8qCi0gICAgICogcHJpdmF0ZSBNYXAgY3JlYXRlTWFuYWdlZFZlcnNpb25NYXAoIEFydGlmYWN0RmFjdG9yeSBhcnRpZmFjdEZhY3RvcnksIFN0cmluZyBwcm9qZWN0SWQsIERlcGVuZGVuY3lNYW5hZ2VtZW50Ci0gICAgICogZGVwZW5kZW5jeU1hbmFnZW1lbnQgKSB0aHJvd3MgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbiB7IE1hcCBtYXA7IGlmICggZGVwZW5kZW5jeU1hbmFnZW1lbnQgIT0gbnVsbCAmJgotICAgICAqIGRlcGVuZGVuY3lNYW5hZ2VtZW50LmdldERlcGVuZGVuY2llcygpICE9IG51bGwgKSB7IG1hcCA9IG5ldyBIYXNoTWFwKCk7IGZvciAoIEl0ZXJhdG9yIGkgPQotICAgICAqIGRlcGVuZGVuY3lNYW5hZ2VtZW50LmdldERlcGVuZGVuY2llcygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApIHsgRGVwZW5kZW5jeSBkID0gKERlcGVuZGVuY3kpIGkubmV4dCgpOyB0cnkgewotICAgICAqIFZlcnNpb25SYW5nZSB2ZXJzaW9uUmFuZ2UgPSBWZXJzaW9uUmFuZ2UuY3JlYXRlRnJvbVZlcnNpb25TcGVjKCBkLmdldFZlcnNpb24oKSApOyBBcnRpZmFjdCBhcnRpZmFjdCA9Ci0gICAgICogYXJ0aWZhY3RGYWN0b3J5LmNyZWF0ZURlcGVuZGVuY3lBcnRpZmFjdCggZC5nZXRHcm91cElkKCksIGQuZ2V0QXJ0aWZhY3RJZCgpLCB2ZXJzaW9uUmFuZ2UsIGQuZ2V0VHlwZSgpLCBkCi0gICAgICogLmdldENsYXNzaWZpZXIoKSwgZC5nZXRTY29wZSgpLCBkIC5pc09wdGlvbmFsKCkgKTsgbWFwLnB1dCggZC5nZXRNYW5hZ2VtZW50S2V5KCksIGFydGlmYWN0ICk7IH0gY2F0Y2ggKAotICAgICAqIEludmFsaWRWZXJzaW9uU3BlY2lmaWNhdGlvbkV4Y2VwdGlvbiBlICkgeyB0aHJvdyBuZXcgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbiggIlVuYWJsZSB0byBwYXJzZSB2ZXJzaW9uIiwgZSApOyB9IH0KLSAgICAgKiB9IGVsc2UgeyBtYXAgPSBDb2xsZWN0aW9ucy5FTVBUWV9NQVA7IH0gcmV0dXJuIG1hcDsgfQotICAgICAqLwotCi0gICAgLyoqCi0gICAgICogT3ZlcnJpZGUgdGhlIGJhc2UgdG8KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGxvY2FsLgotICAgICAqLwotICAgIHByb3RlY3RlZCBBcnRpZmFjdFJlcG9zaXRvcnkgZ2V0TG9jYWwoKQotICAgIHsKLSAgICAgICAgaWYgKCB0aGlzLm92ZXJyaWRlTG9jYWxSZXBvc2l0b3J5ICE9IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gdGhpcy5vdmVycmlkZUxvY2FsUmVwb3NpdG9yeTsKLSAgICAgICAgfQotCi0gICAgICAgIEFydGlmYWN0UmVwb3NpdG9yeSBsb2NhbCA9IHN1cGVyLmdldExvY2FsKCk7Ci0KLSAgICAgICAgaWYgKCB0aGlzLmxvY2FsUmVwb3NpdG9yeURpcmVjdG9yeSAhPSBudWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gY3JlYXRlIGEgbmV3IGxvY2FsIHJlcG8gdXNpbmcgZXhpc3RpbmcgbGF5b3V0LCBzbmFwc2hvdHMsIGFuZCByZWxlYXNlcyBwb2xpY3kKLSAgICAgICAgICAgIFN0cmluZyB1cmwgPSAiZmlsZTovLyIgKyB0aGlzLmxvY2FsUmVwb3NpdG9yeURpcmVjdG9yeS5nZXRBYnNvbHV0ZVBhdGgoKTsKLSAgICAgICAgICAgIHRoaXMub3ZlcnJpZGVMb2NhbFJlcG9zaXRvcnkgPQotICAgICAgICAgICAgICAgIGFydGlmYWN0UmVwb3NpdG9yeU1hbmFnZXIuY3JlYXRlQXJ0aWZhY3RSZXBvc2l0b3J5KCBsb2NhbC5nZXRJZCgpLCB1cmwsIGxvY2FsLmdldExheW91dCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbC5nZXRTbmFwc2hvdHMoKSwgbG9jYWwuZ2V0UmVsZWFzZXMoKSApOwotCi0gICAgICAgICAgICB0aGlzLmdldExvZygpLmRlYnVnKCAiRXhlY3V0aW9uIGxvY2FsIHJlcG9zaXRvcnkgaXMgYXQ6ICIgKyB0aGlzLm92ZXJyaWRlTG9jYWxSZXBvc2l0b3J5LmdldEJhc2VkaXIoKSApOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5vdmVycmlkZUxvY2FsUmVwb3NpdG9yeSA9IGxvY2FsOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHRoaXMub3ZlcnJpZGVMb2NhbFJlcG9zaXRvcnk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBhcnRpZmFjdEl0ZW1zLgotICAgICAqLwotICAgIHB1YmxpYyBMaXN0PEFydGlmYWN0SXRlbT4gZ2V0QXJ0aWZhY3RJdGVtcygpCi0gICAgewotICAgICAgICByZXR1cm4gdGhpcy5hcnRpZmFjdEl0ZW1zOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSB0aGVBcnRpZmFjdEl0ZW1zIFRoZSBhcnRpZmFjdEl0ZW1zIHRvIHNldC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRBcnRpZmFjdEl0ZW1zKCBMaXN0PEFydGlmYWN0SXRlbT4gdGhlQXJ0aWZhY3RJdGVtcyApCi0gICAgewotICAgICAgICB0aGlzLmFydGlmYWN0SXRlbXMgPSB0aGVBcnRpZmFjdEl0ZW1zOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgb3V0cHV0RGlyZWN0b3J5LgotICAgICAqLwotICAgIHB1YmxpYyBGaWxlIGdldE91dHB1dERpcmVjdG9yeSgpCi0gICAgewotICAgICAgICByZXR1cm4gdGhpcy5vdXRwdXREaXJlY3Rvcnk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIHRoZU91dHB1dERpcmVjdG9yeSBUaGUgb3V0cHV0RGlyZWN0b3J5IHRvIHNldC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRPdXRwdXREaXJlY3RvcnkoIEZpbGUgdGhlT3V0cHV0RGlyZWN0b3J5ICkKLSAgICB7Ci0gICAgICAgIHRoaXMub3V0cHV0RGlyZWN0b3J5ID0gdGhlT3V0cHV0RGlyZWN0b3J5OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgb3ZlcldyaXRlSWZOZXdlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc092ZXJXcml0ZUlmTmV3ZXIoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRoaXMub3ZlcldyaXRlSWZOZXdlcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gdGhlT3ZlcldyaXRlSWZOZXdlciBUaGUgb3ZlcldyaXRlSWZOZXdlciB0byBzZXQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0T3ZlcldyaXRlSWZOZXdlciggYm9vbGVhbiB0aGVPdmVyV3JpdGVJZk5ld2VyICkKLSAgICB7Ci0gICAgICAgIHRoaXMub3ZlcldyaXRlSWZOZXdlciA9IHRoZU92ZXJXcml0ZUlmTmV3ZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBvdmVyV3JpdGVSZWxlYXNlcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc092ZXJXcml0ZVJlbGVhc2VzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzLm92ZXJXcml0ZVJlbGVhc2VzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSB0aGVPdmVyV3JpdGVSZWxlYXNlcyBUaGUgb3ZlcldyaXRlUmVsZWFzZXMgdG8gc2V0LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE92ZXJXcml0ZVJlbGVhc2VzKCBib29sZWFuIHRoZU92ZXJXcml0ZVJlbGVhc2VzICkKLSAgICB7Ci0gICAgICAgIHRoaXMub3ZlcldyaXRlUmVsZWFzZXMgPSB0aGVPdmVyV3JpdGVSZWxlYXNlczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIG92ZXJXcml0ZVNuYXBzaG90cy4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc092ZXJXcml0ZVNuYXBzaG90cygpCi0gICAgewotICAgICAgICByZXR1cm4gdGhpcy5vdmVyV3JpdGVTbmFwc2hvdHM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIHRoZU92ZXJXcml0ZVNuYXBzaG90cyBUaGUgb3ZlcldyaXRlU25hcHNob3RzIHRvIHNldC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRPdmVyV3JpdGVTbmFwc2hvdHMoIGJvb2xlYW4gdGhlT3ZlcldyaXRlU25hcHNob3RzICkKLSAgICB7Ci0gICAgICAgIHRoaXMub3ZlcldyaXRlU25hcHNob3RzID0gdGhlT3ZlcldyaXRlU25hcHNob3RzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldExvY2FsUmVwb3NpdG9yeURpcmVjdG9yeSggRmlsZSBsb2NhbFJlcG9zaXRvcnlEaXJlY3RvcnkgKQotICAgIHsKLSAgICAgICAgdGhpcy5sb2NhbFJlcG9zaXRvcnlEaXJlY3RvcnkgPSBsb2NhbFJlcG9zaXRvcnlEaXJlY3Rvcnk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNTa2lwKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBza2lwOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFNraXAoIGJvb2xlYW4gc2tpcCApCi0gICAgewotICAgICAgICB0aGlzLnNraXAgPSBza2lwOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvdW5wYWNrL0FydGlmYWN0SXRlbS5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci91bnBhY2svQXJ0aWZhY3RJdGVtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyN2YxODQuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci91bnBhY2svQXJ0aWZhY3RJdGVtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNTkgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uYnVpbGRlci51bnBhY2s7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLmFydGlmYWN0LkFydGlmYWN0OwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmRlcGVuZGVuY3kudXRpbHMuRGVwZW5kZW5jeVV0aWw7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy51dGlsLlN0cmluZ1V0aWxzOwotCi0vKioKLSAqIEFydGlmYWN0SXRlbSByZXByZXNlbnRzIGluZm9ybWF0aW9uIHNwZWNpZmllZCBpbiB0aGUgcGx1Z2luIGNvbmZpZ3VyYXRpb24KLSAqIHNlY3Rpb24gZm9yIGVhY2ggYXJ0aWZhY3QuCi0gKgotICogQHNpbmNlIDEuMAotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86YnJpYW5mQGFwYWNoZS5vcmciPkJyaWFuIEZveDwvYT4KLSAqIEB2ZXJzaW9uICRJZCQKLSAqLwotcHVibGljIGNsYXNzIEFydGlmYWN0SXRlbSBleHRlbmRzIG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmRlcGVuZGVuY3kuZnJvbUNvbmZpZ3VyYXRpb24uQXJ0aWZhY3RJdGVtCi17Ci0gICAgLyoqCi0gICAgICogR3JvdXAgSWQgb2YgQXJ0aWZhY3QKLSAgICAgKgotICAgICAqIEBwYXJhbWV0ZXIKLSAgICAgKiBAcmVxdWlyZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBncm91cElkOwotCi0gICAgLyoqCi0gICAgICogTmFtZSBvZiBBcnRpZmFjdAotICAgICAqCi0gICAgICogQHBhcmFtZXRlcgotICAgICAqIEByZXF1aXJlZAotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIGFydGlmYWN0SWQ7Ci0KLSAgICAvKioKLSAgICAgKiBWZXJzaW9uIG9mIEFydGlmYWN0Ci0gICAgICoKLSAgICAgKiBAcGFyYW1ldGVyCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgdmVyc2lvbiA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiBUeXBlIG9mIEFydGlmYWN0IChXYXIsSmFyLGV0YykKLSAgICAgKgotICAgICAqIEBwYXJhbWV0ZXIKLSAgICAgKiBAcmVxdWlyZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyB0eXBlID0gImphciI7Ci0KLSAgICAvKioKLSAgICAgKiBDbGFzc2lmaWVyIGZvciBBcnRpZmFjdCAodGVzdHMsc291cmNlcyxldGMpCi0gICAgICoKLSAgICAgKiBAcGFyYW1ldGVyCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgY2xhc3NpZmllcjsKLQotICAgIC8qKgotICAgICAqIExvY2F0aW9uIHRvIHVzZSBmb3IgdGhpcyBBcnRpZmFjdC4gT3ZlcnJpZGVzIGRlZmF1bHQgbG9jYXRpb24uCi0gICAgICoKLSAgICAgKiBAcGFyYW1ldGVyCi0gICAgICovCi0gICAgcHJpdmF0ZSBGaWxlIG91dHB1dERpcmVjdG9yeTsKLQotICAgIC8qKgotICAgICAqIFByb3ZpZGVzIGFiaWxpdHkgdG8gY2hhbmdlIGRlc3RpbmF0aW9uIGZpbGUgbmFtZQotICAgICAqCi0gICAgICogQHBhcmFtZXRlcgotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIGRlc3RGaWxlTmFtZTsKLQotICAgIC8qKgotICAgICAqIEZvcmNlIE92ZXJ3cml0ZS4udGhpcyBpcyB0aGUgb25lIHRvIHNldCBpbiBwb20KLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBvdmVyV3JpdGU7Ci0KLSAgICAvKioKLSAgICAgKiBGb3JjZSBPdmVyd3JpdGUKLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gbmVlZHNQcm9jZXNzaW5nOwotCi0gICAgLyoqCi0gICAgICogQXJ0aWZhY3QgSXRlbQotICAgICAqLwotICAgIHByaXZhdGUgQXJ0aWZhY3QgYXJ0aWZhY3Q7Ci0KLSAgICAvKioKLSAgICAgKiBBIGNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIGZpbGUgcGF0dGVybnMgdG8gaW5jbHVkZSB3aGVuIHVucGFja2luZyB0aGUKLSAgICAgKiBhcnRpZmFjdC4KLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBpbmNsdWRlczsKLQotICAgIC8qKgotICAgICAqIEEgY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgZmlsZSBwYXR0ZXJucyB0byBleGNsdWRlIHdoZW4gdW5wYWNraW5nIHRoZQotICAgICAqIGFydGlmYWN0LgotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIGV4Y2x1ZGVzOwotCi0gICAgcHVibGljIEFydGlmYWN0SXRlbSgpCi0gICAgewotICAgICAgICAvLyBkZWZhdWx0IGNvbnN0cnVjdG9yCi0gICAgfQotCi0gICAgcHVibGljIEFydGlmYWN0SXRlbSggQXJ0aWZhY3QgYXJ0aWZhY3QgKQotICAgIHsKLSAgICAgICAgdGhpcy5zZXRBcnRpZmFjdCggYXJ0aWZhY3QgKTsKLSAgICAgICAgdGhpcy5zZXRBcnRpZmFjdElkKCBhcnRpZmFjdC5nZXRBcnRpZmFjdElkKCkgKTsKLSAgICAgICAgdGhpcy5zZXRDbGFzc2lmaWVyKCBhcnRpZmFjdC5nZXRDbGFzc2lmaWVyKCkgKTsKLSAgICAgICAgdGhpcy5zZXRHcm91cElkKCBhcnRpZmFjdC5nZXRHcm91cElkKCkgKTsKLSAgICAgICAgdGhpcy5zZXRUeXBlKCBhcnRpZmFjdC5nZXRUeXBlKCkgKTsKLSAgICAgICAgdGhpcy5zZXRWZXJzaW9uKCBhcnRpZmFjdC5nZXRWZXJzaW9uKCkgKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBmaWx0ZXJFbXB0eVN0cmluZyggU3RyaW5nIGluICkKLSAgICB7Ci0gICAgICAgIGlmICggIiIuZXF1YWxzKCBpbiApICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGluOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgYXJ0aWZhY3RJZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldEFydGlmYWN0SWQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGFydGlmYWN0SWQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIGFydGlmYWN0SWQKLSAgICAgKiAgICAgICAgICAgIFRoZSBhcnRpZmFjdElkIHRvIHNldC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRBcnRpZmFjdElkKCBTdHJpbmcgYXJ0aWZhY3QgKQotICAgIHsKLSAgICAgICAgdGhpcy5hcnRpZmFjdElkID0gZmlsdGVyRW1wdHlTdHJpbmcoIGFydGlmYWN0ICk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBncm91cElkLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0R3JvdXBJZCgpCi0gICAgewotICAgICAgICByZXR1cm4gZ3JvdXBJZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gZ3JvdXBJZAotICAgICAqICAgICAgICAgICAgVGhlIGdyb3VwSWQgdG8gc2V0LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEdyb3VwSWQoIFN0cmluZyBncm91cElkICkKLSAgICB7Ci0gICAgICAgIHRoaXMuZ3JvdXBJZCA9IGZpbHRlckVtcHR5U3RyaW5nKCBncm91cElkICk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBSZXR1cm5zIHRoZSB0eXBlLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpCi0gICAgewotICAgICAgICByZXR1cm4gdHlwZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gdHlwZQotICAgICAqICAgICAgICAgICAgVGhlIHR5cGUgdG8gc2V0LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFR5cGUoIFN0cmluZyB0eXBlICkKLSAgICB7Ci0gICAgICAgIHRoaXMudHlwZSA9IGZpbHRlckVtcHR5U3RyaW5nKCB0eXBlICk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBSZXR1cm5zIHRoZSB2ZXJzaW9uLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmVyc2lvbigpCi0gICAgewotICAgICAgICByZXR1cm4gdmVyc2lvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gdmVyc2lvbgotICAgICAqICAgICAgICAgICAgVGhlIHZlcnNpb24gdG8gc2V0LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFZlcnNpb24oIFN0cmluZyB2ZXJzaW9uICkKLSAgICB7Ci0gICAgICAgIHRoaXMudmVyc2lvbiA9IGZpbHRlckVtcHR5U3RyaW5nKCB2ZXJzaW9uICk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBDbGFzc2lmaWVyLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2xhc3NpZmllcigpCi0gICAgewotICAgICAgICByZXR1cm4gY2xhc3NpZmllcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gY2xhc3NpZmllcgotICAgICAqICAgICAgICAgICAgQ2xhc3NpZmllci4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRDbGFzc2lmaWVyKCBTdHJpbmcgY2xhc3NpZmllciApCi0gICAgewotICAgICAgICB0aGlzLmNsYXNzaWZpZXIgPSBmaWx0ZXJFbXB0eVN0cmluZyggY2xhc3NpZmllciApOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotICAgIHsKLSAgICAgICAgaWYgKCB0aGlzLmNsYXNzaWZpZXIgPT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBncm91cElkICsgIjoiICsgYXJ0aWZhY3RJZCArICI6IiArIFN0cmluZ1V0aWxzLmRlZmF1bHRTdHJpbmcoIHZlcnNpb24sICI/IiApICsgIjoiICsgdHlwZTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBncm91cElkICsgIjoiICsgYXJ0aWZhY3RJZCArICI6IiArIGNsYXNzaWZpZXIgKyAiOiIgKyBTdHJpbmdVdGlscy5kZWZhdWx0U3RyaW5nKCB2ZXJzaW9uLCAiPyIgKQotICAgICAgICAgICAgICAgICsgIjoiICsgdHlwZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgbG9jYXRpb24uCi0gICAgICovCi0gICAgcHVibGljIEZpbGUgZ2V0T3V0cHV0RGlyZWN0b3J5KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBvdXRwdXREaXJlY3Rvcnk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIGxvY2F0aW9uCi0gICAgICogICAgICAgICAgICBUaGUgbG9jYXRpb24gdG8gc2V0LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE91dHB1dERpcmVjdG9yeSggRmlsZSBvdXRwdXREaXJlY3RvcnkgKQotICAgIHsKLSAgICAgICAgdGhpcy5vdXRwdXREaXJlY3RvcnkgPSBvdXRwdXREaXJlY3Rvcnk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBsb2NhdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldERlc3RGaWxlTmFtZSgpCi0gICAgewotICAgICAgICByZXR1cm4gZGVzdEZpbGVOYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBkZXN0RmlsZU5hbWUKLSAgICAgKiAgICAgICAgICAgIFRoZSBkZXN0RmlsZU5hbWUgdG8gc2V0LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldERlc3RGaWxlTmFtZSggU3RyaW5nIGRlc3RGaWxlTmFtZSApCi0gICAgewotICAgICAgICB0aGlzLmRlc3RGaWxlTmFtZSA9IGZpbHRlckVtcHR5U3RyaW5nKCBkZXN0RmlsZU5hbWUgKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIG5lZWRzUHJvY2Vzc2luZy4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc05lZWRzUHJvY2Vzc2luZygpCi0gICAgewotICAgICAgICByZXR1cm4gdGhpcy5uZWVkc1Byb2Nlc3Npbmc7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIG5lZWRzUHJvY2Vzc2luZwotICAgICAqICAgICAgICAgICAgVGhlIG5lZWRzUHJvY2Vzc2luZyB0byBzZXQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0TmVlZHNQcm9jZXNzaW5nKCBib29sZWFuIG5lZWRzUHJvY2Vzc2luZyApCi0gICAgewotICAgICAgICB0aGlzLm5lZWRzUHJvY2Vzc2luZyA9IG5lZWRzUHJvY2Vzc2luZzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIG92ZXJXcml0ZVNuYXBzaG90cy4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldE92ZXJXcml0ZSgpCi0gICAgewotICAgICAgICByZXR1cm4gdGhpcy5vdmVyV3JpdGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIG92ZXJXcml0ZVNuYXBzaG90cwotICAgICAqICAgICAgICAgICAgVGhlIG92ZXJXcml0ZVNuYXBzaG90cyB0byBzZXQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0T3ZlcldyaXRlKCBTdHJpbmcgb3ZlcldyaXRlICkKLSAgICB7Ci0gICAgICAgIHRoaXMub3ZlcldyaXRlID0gb3ZlcldyaXRlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgYXJ0aWZhY3QuCi0gICAgICovCi0gICAgcHVibGljIEFydGlmYWN0IGdldEFydGlmYWN0KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzLmFydGlmYWN0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBhcnRpZmFjdAotICAgICAqICAgICAgICAgICAgVGhlIGFydGlmYWN0IHRvIHNldC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRBcnRpZmFjdCggQXJ0aWZhY3QgYXJ0aWZhY3QgKQotICAgIHsKLSAgICAgICAgdGhpcy5hcnRpZmFjdCA9IGFydGlmYWN0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gUmV0dXJucyBhIGNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIGV4Y2x1ZGVkIGl0ZW1zCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRFeGNsdWRlcyAoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIERlcGVuZGVuY3lVdGlsLmNsZWFuVG9CZVRva2VuaXplZFN0cmluZyggdGhpcy5leGNsdWRlcyApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBleGNsdWRlcwotICAgICAqICAgICAgICAgIEEgY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgaXRlbXMgdG8gZXhjbHVkZQotICAgICAqICAgICAgICAgIGkuZS4gIDxjb2RlPioqXC8qLnhtbCwgKipcLyoucHJvcGVydGllczwvY29kZT4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRFeGNsdWRlcyAoIFN0cmluZyBleGNsdWRlcyApCi0gICAgewotICAgICAgICB0aGlzLmV4Y2x1ZGVzID0gZXhjbHVkZXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBSZXR1cm5zIGEgY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgaW5jbHVkZWQgaXRlbXMKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldEluY2x1ZGVzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBEZXBlbmRlbmN5VXRpbC5jbGVhblRvQmVUb2tlbml6ZWRTdHJpbmcoIHRoaXMuaW5jbHVkZXMgKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gaW5jbHVkZXMKLSAgICAgKiAgICAgICAgICBBIGNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIGl0ZW1zIHRvIGluY2x1ZGUKLSAgICAgKiAgICAgICAgICBpLmUuICA8Y29kZT4qKlwvKi54bWwsICoqXC8qLnByb3BlcnRpZXM8L2NvZGU+Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0SW5jbHVkZXMgKCBTdHJpbmcgaW5jbHVkZXMgKQotICAgIHsKLSAgICAgICAgdGhpcy5pbmNsdWRlcyA9IGluY2x1ZGVzOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvdW5wYWNrL1VucGFja01vam8uamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvdW5wYWNrL1VucGFja01vam8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWEyMWEwYy4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL3VucGFjay9VbnBhY2tNb2pvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NjEgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uYnVpbGRlci51bnBhY2s7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5Nb2pvRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmRlcGVuZGVuY3kudXRpbHMuZmlsdGVycy5BcnRpZmFjdEl0ZW1GaWx0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uZGVwZW5kZW5jeS51dGlscy5maWx0ZXJzLk1hcmtlckZpbGVGaWx0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uZGVwZW5kZW5jeS51dGlscy5tYXJrZXJzLk1hcmtlckhhbmRsZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uZGVwZW5kZW5jeS51dGlscy5tYXJrZXJzLlVucGFja0ZpbGVNYXJrZXJIYW5kbGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uYnVpbGRlci5JT1V0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uYnVpbGRlci5tb2RlbC5CZWhhdmlvck1ldGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5idWlsZGVyLm1vZGVsLkNvbXBvbmVudE1ldGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5idWlsZGVyLm1vZGVsLkNvbnZlcnRlck1ldGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5idWlsZGVyLm1vZGVsLk1vZGVsOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMudXRpbC5TdHJpbmdVdGlsczsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uYnVpbGRlci5tb2RlbC5WYWxpZGF0b3JNZXRhOwotCi0vKioKLSAqIEdvYWwgdGhhdCByZXRyaWV2ZXMgYSBsaXN0IG9mIGFydGlmYWN0cyBmcm9tIHRoZSByZXBvc2l0b3J5IGFuZCB1bnBhY2tzIHRoZW0KLSAqIGluIGEgZGVmaW5lZCBsb2NhdGlvbi4KLSAqIDxwPgotICogVGhpcyBtb2pvIHJldXRpbGl6ZSBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5kZXBlbmRlbmN5LmZyb21Db25maWd1cmF0aW9uLlVucGFja01vam8KLSAqIGZyb20gbWF2ZW4tZGVwZW5kZW5jeS1wbHVnaW4uCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIFRoZSBpZGVhIG9mIHRoaXMgcGx1Z2luLCBpbnN0ZWFkIGp1c3QgdW5wYWNrIGEgbGlzdCBvZiBhcnRpZmFjdHMgaXMgYWRkIHNvbWUgbmV3IAotICogZmVhdHVyZXMgbmVjZXNzYXJ5IHRvIG1ha2UgZWFzaWVyIG1haW50YWluIDEuMSBhbmQgMS4yIGNvZGUgb24gbXlmYWNlcyBwcm9qZWN0cyBsaWtlCi0gKiB0b21haGF3ay4KLSAqIDwvcD4KLSAqIDxwPgotICogVGhpcyBwbHVnaW4gd29ya3MgYXMgdW5wYWNrIGdvYWwgb2YgbWF2ZW4tZGVwZW5kZW5jeS1wbHVnaW4gd2l0aCAyIGFkZGl0aW9uYWwgCi0gKiBlbmhhbmNlbWVudHM6Ci0gKiA8L3A+Ci0gKiA8b2w+Ci0gKiAgPGxpPklmIHNvbWUgZmlsZSBleGlzdHMgb24gdGhlIGJhc2UgZGlyZWN0b3JpZXMsIGl0IGlzIGFkZGVkIGFzIGV4Y2x1ZGVkLCBzbyBpdCBpcwotICogbm90IGNvcGllZCB0byB0aGUgb3V0cHV0IGRpcmVjdG9yeS4gVGhpcyBtYWtlcyBlYXNpZXIgdG8gbWFuYWdlIHRoZSBjb2RlIGFuZCBtYWludGFpbiBpdC48L2xpPgotICogIDxsaT5JZiBhIGZpbGUgaXMgZ2VuZXJhdGVkIGZyb20gdGhlIG1vZGVsIChyZWFkaW5nIHRoZSBteWZhY2VzLW1ldGFkYXRhLnhtbCkgaXQgaXMgbm90Ci0gKiBjb3BpZWQsIHNpbmNlIHRoaXMgc2hvdWxkIGJlIGdlbmVyYXRlZCBhZ2Fpbi48L2xpPgotICogPC9vbD4KLSAqICAKLSAqIEBzaW5jZSAxLjAKLSAqIEBnb2FsIHVucGFjawotICogQHBoYXNlIHByb2Nlc3Mtc291cmNlcwotICogQGF1dGhvciBMZW9uYXJkbyBVcmliZQotICogQHZlcnNpb24gJElkJAotICovCi1wdWJsaWMgY2xhc3MgVW5wYWNrTW9qbyBleHRlbmRzIEFic3RyYWN0RnJvbUNvbmZpZ3VyYXRpb25Nb2pvCi17Ci0gICAgLyoqCi0gICAgICogRGlyZWN0b3J5IHdoZXJlIGhlIHNob3VsZCBjaGVjayBpZiBhIGZpbGUgZXhpc3RzIG9yIG5vdC4gSWYgCi0gICAgICogZXhpc3RzLCBoZSBkb2VzIG5vdCBjb3B5IHRvICwgaWYgbm90IGhlIGNvcHkgaXQgdG8gdGhlIG91dHB1dAotICAgICAqIGRpcmVjdG9yeS4KLSAgICAgKiAKLSAgICAgKiBUaGlzIGlzIHBvc3NpYmxlIGJlY2F1c2UgYWxsIGZpbGVzIG9uIHRoaXMgZGlyZWN0b3J5IGFyZSBhZGRlZAotICAgICAqIGFzIGV4Y2x1ZGVkIHBhcmFtLgotICAgICAqIAotICAgICAqIEBwYXJhbWV0ZXIgZXhwcmVzc2lvbj0ic3JjL21haW4vamF2YSIKLSAgICAgKi8KLSAgICBwcml2YXRlIEZpbGUgYmFzZURpcmVjdG9yeTE7Ci0gICAgCi0gICAgLyoqCi0gICAgICogRGlyZWN0b3J5IHdoZXJlIGhlIHNob3VsZCBjaGVjayBpZiBhIGZpbGUgZXhpc3RzIG9yIG5vdC4gSWYgCi0gICAgICogZXhpc3RzLCBoZSBkb2VzIG5vdCBjb3B5IHRvICwgaWYgbm90IGhlIGNvcHkgaXQgdG8gdGhlIG91dHB1dAotICAgICAqIGRpcmVjdG9yeS4KLSAgICAgKiAKLSAgICAgKiBUaGlzIGlzIHBvc3NpYmxlIGJlY2F1c2UgYWxsIGZpbGVzIG9uIHRoaXMgZGlyZWN0b3J5IGFyZSBhZGRlZAotICAgICAqIGFzIGV4Y2x1ZGVkIHBhcmFtLgotICAgICAqIAotICAgICAqIEBwYXJhbWV0ZXIgCi0gICAgICovICAgIAotICAgIHByaXZhdGUgRmlsZSBiYXNlRGlyZWN0b3J5MjsKLSAgICAgICAgCi0gICAgLyoqCi0gICAgICogSWYgdGhlIHBsdWdpbiBzaG91bGQgc2NhbiB0aGUgbW9kZWwKLSAgICAgKiAKLSAgICAgKiBAb3B0aW9uYWwKLSAgICAgKiBAcGFyYW1ldGVyIGV4cHJlc3Npb249IiR7c2Nhbk1vZGVsfSIKLSAgICAgKiAgICAgICAgICAgIGRlZmF1bHQtdmFsdWU9ImZhbHNlIgotICAgICAqLyAgICAKLSAgICBwcml2YXRlIGJvb2xlYW4gc2Nhbk1vZGVsOwotICAgIAotICAgIC8qKgotICAgICAqIERpcmVjdG9yeSB0byBzdG9yZSBmbGFnIGZpbGVzIGFmdGVyIHVucGFjawotICAgICAqIAotICAgICAqIEBwYXJhbWV0ZXIgZXhwcmVzc2lvbj0iJHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vZGVwZW5kZW5jeS1tYXZlbi1wbHVnaW4tbWFya2VycyIKLSAgICAgKi8KLSAgICBwcml2YXRlIEZpbGUgbWFya2Vyc0RpcmVjdG9yeTsKLQotICAgIC8qKgotICAgICAqIEEgY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgZmlsZSBwYXR0ZXJucyB0byBpbmNsdWRlIHdoZW4gdW5wYWNraW5nIHRoZSBhcnRpZmFjdC4gaS5lLiAqKlwvKi54bWwsKipcLyoucHJvcGVydGllcwotICAgICAqIE5PVEU6IEV4Y2x1ZGVzIHBhdHRlcm5zIG92ZXJyaWRlIHRoZSBpbmNsdWRlcy4gKGNvbXBvbmVudCBjb2RlID0gcmV0dXJuIGlzSW5jbHVkZWQoIG5hbWUgKSBBTkQgIWlzRXhjbHVkZWQoIG5hbWUKLSAgICAgKiApOykKLSAgICAgKiAKLSAgICAgKiBAc2luY2UgMi4wLWFscGhhLTUKLSAgICAgKiBAcGFyYW1ldGVyIGV4cHJlc3Npb249IiR7bWRlcC51bnBhY2suaW5jbHVkZXN9IgotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIGluY2x1ZGVzOwotCi0gICAgLyoqCi0gICAgICogQSBjb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiBmaWxlIHBhdHRlcm5zIHRvIGV4Y2x1ZGUgd2hlbiB1bnBhY2tpbmcgdGhlIGFydGlmYWN0LiBpLmUuICoqXC8qLnhtbCwqKlwvKi5wcm9wZXJ0aWVzCi0gICAgICogTk9URTogRXhjbHVkZXMgcGF0dGVybnMgb3ZlcnJpZGUgdGhlIGluY2x1ZGVzLiAoY29tcG9uZW50IGNvZGUgPSByZXR1cm4gaXNJbmNsdWRlZCggbmFtZSApIEFORCAhaXNFeGNsdWRlZCggbmFtZQotICAgICAqICk7KQotICAgICAqIAotICAgICAqIEBzaW5jZSAyLjAtYWxwaGEtNQotICAgICAqIEBwYXJhbWV0ZXIgZXhwcmVzc2lvbj0iJHttZGVwLnVucGFjay5leGNsdWRlc30iCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgZXhjbHVkZXM7Ci0KLSAgICAvKioKLSAgICAgKiBNYWluIGVudHJ5IGludG8gbW9qby4gVGhpcyBtZXRob2QgZ2V0cyB0aGUgQXJ0aWZhY3RJdGVtcyBhbmQgaXRlcmF0ZXMgdGhyb3VnaCBlYWNoIG9uZSBwYXNzaW5nIGl0IHRvCi0gICAgICogdW5wYWNrQXJ0aWZhY3QuCi0gICAgICogCi0gICAgICogQHRocm93cyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uIHdpdGggYSBtZXNzYWdlIGlmIGFuIGVycm9yIG9jY3Vycy4KLSAgICAgKiBAc2VlIEFydGlmYWN0SXRlbQotICAgICAqIEBzZWUgI2dldEFydGlmYWN0SXRlbXMKLSAgICAgKiBAc2VlICN1bnBhY2tBcnRpZmFjdChBcnRpZmFjdEl0ZW0pCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpCi0gICAgICAgIHRocm93cyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uCi0gICAgewotICAgICAgICBpZiAoIGlzU2tpcCgpICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIGV4aXN0aW5nRmlsZXMgPSBzY2FuQW5kQWRkRXhpc3RpbmdGaWxlc0FzRXhjbHVkZWQoCi0gICAgICAgICAgICAgICAgYmFzZURpcmVjdG9yeTEsIGJhc2VEaXJlY3RvcnkyKTsKLSAgICAgICAgCi0gICAgICAgIFN0cmluZyBleGNsdWRlZEZpbGVzID0gbnVsbDsKLSAgICAgICAgCi0gICAgICAgIExpc3Q8QXJ0aWZhY3RJdGVtPiBwcm9jZXNzZWRJdGVtcyA9IGdldFByb2Nlc3NlZEFydGlmYWN0SXRlbXMoIGZhbHNlICk7Ci0gICAgICAgIGZvciAoIEFydGlmYWN0SXRlbSBhcnRpZmFjdEl0ZW0gOiBwcm9jZXNzZWRJdGVtcyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICggYXJ0aWZhY3RJdGVtLmlzTmVlZHNQcm9jZXNzaW5nKCkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChzY2FuTW9kZWwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZ2VuZXJhdGVkRmlsZXMgPSB0aGlzLnNjYW5Nb2RlbEFuZEFkZEdlbmVyYXRlZEZpbGVzKGFydGlmYWN0SXRlbSk7ICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgZXhjbHVkZWRGaWxlcyA9IGV4aXN0aW5nRmlsZXMgKyAnLCcrIGdlbmVyYXRlZEZpbGVzOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBleGNsdWRlZEZpbGVzID0gZXhpc3RpbmdGaWxlczsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLy9FeGNsdWRlIGV4aXN0aW5nIGZpbGVzIG9uIGJhc2VEaXJlY3RvcnkxIGFuZCBiYXNlRGlyZWN0b3J5MgotICAgICAgICAgICAgICAgIGlmIChhcnRpZmFjdEl0ZW0uZ2V0RXhjbHVkZXMoKSAhPSBudWxsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgYXJ0aWZhY3RJdGVtLnNldEV4Y2x1ZGVzKGFydGlmYWN0SXRlbS5nZXRFeGNsdWRlcygpKycsJytleGNsdWRlZEZpbGVzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgYXJ0aWZhY3RJdGVtLnNldEV4Y2x1ZGVzKGV4Y2x1ZGVkRmlsZXMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvL1VucGFjawotICAgICAgICAgICAgICAgIHVucGFja0FydGlmYWN0KCBhcnRpZmFjdEl0ZW0gKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aGlzLmdldExvZygpLmluZm8oIGFydGlmYWN0SXRlbS5nZXRBcnRpZmFjdCgpLmdldEZpbGUoKS5nZXROYW1lKCkgKyAiIGFscmVhZHkgdW5wYWNrZWQuIiApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyBtZXRob2QgZ2V0cyB0aGUgQXJ0aWZhY3Qgb2JqZWN0IGFuZCBjYWxscyBEZXBlbmRlbmN5VXRpbC51bnBhY2tGaWxlLgotICAgICAqIAotICAgICAqIEBwYXJhbSBhcnRpZmFjdEl0ZW0gY29udGFpbmluZyB0aGUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIEFydGlmYWN0IHRvIHVucGFjay4KLSAgICAgKiBAdGhyb3dzIE1vam9FeGVjdXRpb25FeGNlcHRpb24gd2l0aCBhIG1lc3NhZ2UgaWYgYW4gZXJyb3Igb2NjdXJzLgotICAgICAqIEBzZWUgI2dldEFydGlmYWN0Ci0gICAgICogQHNlZSBEZXBlbmRlbmN5VXRpbCN1bnBhY2tGaWxlKEFydGlmYWN0LCBGaWxlLCBGaWxlLCBBcmNoaXZlck1hbmFnZXIsIExvZykKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgdW5wYWNrQXJ0aWZhY3QoIEFydGlmYWN0SXRlbSBhcnRpZmFjdEl0ZW0gKQotICAgICAgICB0aHJvd3MgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgTWFya2VySGFuZGxlciBoYW5kbGVyID0gbmV3IFVucGFja0ZpbGVNYXJrZXJIYW5kbGVyKCBhcnRpZmFjdEl0ZW0sIHRoaXMubWFya2Vyc0RpcmVjdG9yeSApOwotCi0gICAgICAgIHVucGFjayggYXJ0aWZhY3RJdGVtLmdldEFydGlmYWN0KCkuZ2V0RmlsZSgpLCBhcnRpZmFjdEl0ZW0uZ2V0T3V0cHV0RGlyZWN0b3J5KCksIGFydGlmYWN0SXRlbS5nZXRJbmNsdWRlcygpLAotICAgICAgICAgICAgICAgIGFydGlmYWN0SXRlbS5nZXRFeGNsdWRlcygpICk7Ci0gICAgICAgIGhhbmRsZXIuc2V0TWFya2VyKCk7Ci0gICAgfQotCi0gICAgQXJ0aWZhY3RJdGVtRmlsdGVyIGdldE1hcmtlZEFydGlmYWN0RmlsdGVyKCBBcnRpZmFjdEl0ZW0gaXRlbSApCi0gICAgewotICAgICAgICBNYXJrZXJIYW5kbGVyIGhhbmRsZXIgPSBuZXcgVW5wYWNrRmlsZU1hcmtlckhhbmRsZXIoIGl0ZW0sIHRoaXMubWFya2Vyc0RpcmVjdG9yeSApOwotCi0gICAgICAgIHJldHVybiBuZXcgTWFya2VyRmlsZUZpbHRlciggdGhpcy5pc092ZXJXcml0ZVJlbGVhc2VzKCksIHRoaXMuaXNPdmVyV3JpdGVTbmFwc2hvdHMoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmlzT3ZlcldyaXRlSWZOZXdlcigpLCBoYW5kbGVyICk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIExpc3Q8QXJ0aWZhY3RJdGVtPiBnZXRQcm9jZXNzZWRBcnRpZmFjdEl0ZW1zKCBib29sZWFuIHJlbW92ZVZlcnNpb24gKQotICAgICAgICB0aHJvd3MgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgTGlzdDxBcnRpZmFjdEl0ZW0+IGl0ZW1zID0gc3VwZXIuZ2V0UHJvY2Vzc2VkQXJ0aWZhY3RJdGVtcyggcmVtb3ZlVmVyc2lvbiApOwotICAgICAgICBmb3IgKCBBcnRpZmFjdEl0ZW0gYXJ0aWZhY3RJdGVtIDogaXRlbXMgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIFN0cmluZ1V0aWxzLmlzRW1wdHkoIGFydGlmYWN0SXRlbS5nZXRJbmNsdWRlcygpICkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFydGlmYWN0SXRlbS5zZXRJbmNsdWRlcyggZ2V0SW5jbHVkZXMoKSApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCBTdHJpbmdVdGlscy5pc0VtcHR5KCBhcnRpZmFjdEl0ZW0uZ2V0RXhjbHVkZXMoKSApICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhcnRpZmFjdEl0ZW0uc2V0RXhjbHVkZXMoIGdldEV4Y2x1ZGVzKCkgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaXRlbXM7Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCBTdHJpbmcgc2Nhbk1vZGVsQW5kQWRkR2VuZXJhdGVkRmlsZXMoQXJ0aWZhY3RJdGVtIGFydGlmYWN0SXRlbSkKLSAgICAgICAgdGhyb3dzIE1vam9FeGVjdXRpb25FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIAotICAgICAgICBBcnJheUxpc3QgZXhjbHVzaW9ucyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgCi0gICAgICAgIE1vZGVsIG1vZGVsID0gSU9VdGlscy5nZXRNb2RlbEZyb21BcnRpZmFjdChhcnRpZmFjdEl0ZW0uZ2V0QXJ0aWZhY3QoKSk7Ci0gICAgICAgIAotICAgICAgICBpZiAobW9kZWwgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdCA9IG1vZGVsLmNvbXBvbmVudHMoKTsgaXQuaGFzTmV4dCgpOykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBDb21wb25lbnRNZXRhIGNvbXBvbmVudCA9IChDb21wb25lbnRNZXRhKSBpdC5uZXh0KCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoY29tcG9uZW50LmdldE1vZGVsSWQoKS5lcXVhbHMobW9kZWwuZ2V0TW9kZWxJZCgpKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjb21wb25lbnQuaXNHZW5lcmF0ZWRDb21wb25lbnRDbGFzcygpLmJvb2xlYW5WYWx1ZSgpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBnZXRMb2coKS5pbmZvKCJBZGRpbmcgR2VuZXJhdGVkOiAiKyBjb21wb25lbnQuZ2V0Q2xhc3NOYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgZXhjbHVzaW9ucy5hZGQoU3RyaW5nVXRpbHMucmVwbGFjZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50LmdldENsYXNzTmFtZSgpLCAiLiIsICIvIikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLmphdmEiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAoY29tcG9uZW50LmlzR2VuZXJhdGVkVGFnQ2xhc3MoKS5ib29sZWFuVmFsdWUoKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TG9nKCkuaW5mbygiQWRkaW5nIEdlbmVyYXRlZDogIisgY29tcG9uZW50LmdldFRhZ0NsYXNzKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgZXhjbHVzaW9ucy5hZGQoU3RyaW5nVXRpbHMucmVwbGFjZShjb21wb25lbnQuZ2V0VGFnQ2xhc3MoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi4iLCAiLyIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIi5qYXZhIik7Ci0gICAgICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdCA9IG1vZGVsLmNvbnZlcnRlcnMoKTsgaXQuaGFzTmV4dCgpOykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBDb252ZXJ0ZXJNZXRhIGNvbnZlcnRlciA9IChDb252ZXJ0ZXJNZXRhKSBpdC5uZXh0KCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoY29udmVydGVyLmdldE1vZGVsSWQoKS5lcXVhbHMobW9kZWwuZ2V0TW9kZWxJZCgpKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjb252ZXJ0ZXIuaXNHZW5lcmF0ZWRDb21wb25lbnRDbGFzcygpLmJvb2xlYW5WYWx1ZSgpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBnZXRMb2coKS5pbmZvKCJBZGRpbmcgR2VuZXJhdGVkOiAiKyBjb252ZXJ0ZXIuZ2V0Q2xhc3NOYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgZXhjbHVzaW9ucy5hZGQoU3RyaW5nVXRpbHMucmVwbGFjZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udmVydGVyLmdldENsYXNzTmFtZSgpLCAiLiIsICIvIikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLmphdmEiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAoY29udmVydGVyLmlzR2VuZXJhdGVkVGFnQ2xhc3MoKS5ib29sZWFuVmFsdWUoKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TG9nKCkuaW5mbygiQWRkaW5nIEdlbmVyYXRlZDogIisgY29udmVydGVyLmdldFRhZ0NsYXNzKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgZXhjbHVzaW9ucy5hZGQoU3RyaW5nVXRpbHMucmVwbGFjZShjb252ZXJ0ZXIuZ2V0VGFnQ2xhc3MoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi4iLCAiLyIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIi5qYXZhIik7Ci0gICAgICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdCA9IG1vZGVsLnZhbGlkYXRvcnMoKTsgaXQuaGFzTmV4dCgpOykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBWYWxpZGF0b3JNZXRhIHZhbGlkYXRvciA9IChWYWxpZGF0b3JNZXRhKSBpdC5uZXh0KCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAodmFsaWRhdG9yLmdldE1vZGVsSWQoKS5lcXVhbHMobW9kZWwuZ2V0TW9kZWxJZCgpKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh2YWxpZGF0b3IuaXNHZW5lcmF0ZWRDb21wb25lbnRDbGFzcygpLmJvb2xlYW5WYWx1ZSgpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBnZXRMb2coKS5pbmZvKCJBZGRpbmcgR2VuZXJhdGVkOiAiKyB2YWxpZGF0b3IuZ2V0Q2xhc3NOYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgZXhjbHVzaW9ucy5hZGQoU3RyaW5nVXRpbHMucmVwbGFjZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdG9yLmdldENsYXNzTmFtZSgpLCAiLiIsICIvIikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLmphdmEiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAodmFsaWRhdG9yLmlzR2VuZXJhdGVkVGFnQ2xhc3MoKS5ib29sZWFuVmFsdWUoKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TG9nKCkuaW5mbygiQWRkaW5nIEdlbmVyYXRlZDogIisgdmFsaWRhdG9yLmdldFRhZ0NsYXNzKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgZXhjbHVzaW9ucy5hZGQoU3RyaW5nVXRpbHMucmVwbGFjZSh2YWxpZGF0b3IuZ2V0VGFnQ2xhc3MoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi4iLCAiLyIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIi5qYXZhIik7Ci0gICAgICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdCA9IG1vZGVsLmJlaGF2aW9ycygpOyBpdC5oYXNOZXh0KCk7KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEJlaGF2aW9yTWV0YSBiZWhhdmlvciA9IChCZWhhdmlvck1ldGEpIGl0Lm5leHQoKTsKLQotICAgICAgICAgICAgICAgIGlmIChiZWhhdmlvci5nZXRNb2RlbElkKCkuZXF1YWxzKG1vZGVsLmdldE1vZGVsSWQoKSkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAoYmVoYXZpb3IuaXNHZW5lcmF0ZWRDb21wb25lbnRDbGFzcygpLmJvb2xlYW5WYWx1ZSgpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBnZXRMb2coKS5pbmZvKCJBZGRpbmcgR2VuZXJhdGVkOiAiKyBiZWhhdmlvci5nZXRDbGFzc05hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBleGNsdXNpb25zLmFkZChTdHJpbmdVdGlscy5yZXBsYWNlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWhhdmlvci5nZXRDbGFzc05hbWUoKSwgIi4iLCAiLyIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIi5qYXZhIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldExvZygpLmluZm8oIk5vIG15ZmFjZXMtbWV0YWRhdGEueG1sIGZvdW5kIG9uIGFydGlmYWN0LiIpOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nQnVmZmVyIGV4aXN0aW5nRmlsZXMgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXhjbHVzaW9ucy5zaXplKCk7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgZXhpc3RpbmdGaWxlcy5hcHBlbmQoZXhjbHVzaW9ucy5nZXQoaSkpOwotICAgICAgICAgICAgaWYgKGkgIT0gZXhjbHVzaW9ucy5zaXplKCkgLSAxKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGV4aXN0aW5nRmlsZXMuYXBwZW5kKCcsJyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiBleGlzdGluZ0ZpbGVzLnRvU3RyaW5nKCk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFRoaXMgbWV0aG9kIHNjYW4gb24gYm90aCBkaXJlY3RvcmllcyBhbmQgYWRkIGFsbCBmaWxlcyBhcyBleGNsdWRlZCBmaWxlcyB0byBiZSAKLSAgICAgKiB1bnBhY2tlZC4gUmV0dXJuIHRoZSByZXN1bHRpbmcgZmlsdGVyLgotICAgICAqIAotICAgICAqIEBwYXJhbSBleGNsdXNpb25zCi0gICAgICogQHBhcmFtIGRpcjEKLSAgICAgKiBAcGFyYW0gZGlyMgotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIHNjYW5BbmRBZGRFeGlzdGluZ0ZpbGVzQXNFeGNsdWRlZChGaWxlIGRpcjEsIEZpbGUgZGlyMikKLSAgICB7Ci0gICAgICAgIEFycmF5TGlzdCBleGNsdXNpb25zID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAKLSAgICAgICAgaWYgKGRpcjEgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgYWRkRXhjbHVkZXMoZGlyMS5nZXRQYXRoKCksIGRpcjEsIGV4Y2x1c2lvbnMpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZiAoZGlyMiAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBhZGRFeGNsdWRlcyhkaXIyLmdldFBhdGgoKSwgZGlyMiwgZXhjbHVzaW9ucyk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIFN0cmluZ0J1ZmZlciBleGlzdGluZ0ZpbGVzID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGV4Y2x1c2lvbnMuc2l6ZSgpOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGV4aXN0aW5nRmlsZXMuYXBwZW5kKGV4Y2x1c2lvbnMuZ2V0KGkpKTsKLSAgICAgICAgICAgIGlmIChpICE9IGV4Y2x1c2lvbnMuc2l6ZSgpIC0gMSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBleGlzdGluZ0ZpbGVzLmFwcGVuZCgnLCcpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gZXhpc3RpbmdGaWxlcy50b1N0cmluZygpOwotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgdm9pZCBhZGRFeGNsdWRlcyhTdHJpbmcgYmFzZVBhdGgsIEZpbGUgZiwgTGlzdCBleGNsdXNpb25zKQotICAgIHsKLSAgICAgICAgCi0gICAgICAgIGlmICggZi5pc0RpcmVjdG9yeSgpICkKLSAgICAgICAgewotICAgICAgICAgICAgRmlsZSBbXSBmaWxlTGlzdCA9IGYubGlzdEZpbGVzKCk7Ci0KLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZUxpc3QubGVuZ3RoOyArK2kpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKCFmaWxlTGlzdFtpXS5nZXROYW1lKCkuZXF1YWxzKCIuc3ZuIikpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBhZGRFeGNsdWRlcyhiYXNlUGF0aCxmaWxlTGlzdFtpXSwgZXhjbHVzaW9ucyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIHBhdGggPSBmLmdldFBhdGgoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy9wYXRoID0gcGF0aC5yZXBsYWNlKGJhc2VQYXRoLCIiKTsKLSAgICAgICAgICAgIHBhdGggPSBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZy5TdHJpbmdVdGlscy5yZXBsYWNlKHBhdGgsIGJhc2VQYXRoLCAiIik7Ci0gICAgICAgICAgICB3aGlsZSAocGF0aC5zdGFydHNXaXRoKCIvIikpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcGF0aCA9IHBhdGguc3Vic3RyaW5nKDEpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgd2hpbGUgKHBhdGguc3RhcnRzV2l0aCgiXFwiKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwYXRoID0gcGF0aC5zdWJzdHJpbmcoMSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwYXRoID0gU3RyaW5nVXRpbHMucmVwbGFjZSggcGF0aCwgIlxcIiwgIi8iICk7Ci0gICAgICAgICAgICBleGNsdXNpb25zLmFkZChwYXRoKTsKLSAgICAgICAgICAgIGdldExvZygpLmluZm8oIkFkZGluZzogIitwYXRoKTsKLSAgICAgICAgfSAgICAgICAgCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBtYXJrZXJzRGlyZWN0b3J5LgotICAgICAqLwotICAgIHB1YmxpYyBGaWxlIGdldE1hcmtlcnNEaXJlY3RvcnkoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRoaXMubWFya2Vyc0RpcmVjdG9yeTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gdGhlTWFya2Vyc0RpcmVjdG9yeSBUaGUgbWFya2Vyc0RpcmVjdG9yeSB0byBzZXQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0TWFya2Vyc0RpcmVjdG9yeSggRmlsZSB0aGVNYXJrZXJzRGlyZWN0b3J5ICkKLSAgICB7Ci0gICAgICAgIHRoaXMubWFya2Vyc0RpcmVjdG9yeSA9IHRoZU1hcmtlcnNEaXJlY3Rvcnk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBSZXR1cm5zIGEgY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgZXhjbHVkZWQgaXRlbXMKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldEV4Y2x1ZGVzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzLmV4Y2x1ZGVzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBleGNsdWRlcyBBIGNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIGl0ZW1zIHRvIGV4Y2x1ZGUgaS5lLiAqKlwvKi54bWwsICoqXC8qLnByb3BlcnRpZXMKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRFeGNsdWRlcyggU3RyaW5nIGV4Y2x1ZGVzICkKLSAgICB7Ci0gICAgICAgIHRoaXMuZXhjbHVkZXMgPSBleGNsdWRlczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgYSBjb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiBpbmNsdWRlZCBpdGVtcwotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0SW5jbHVkZXMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuaW5jbHVkZXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIGluY2x1ZGVzIEEgY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgaXRlbXMgdG8gaW5jbHVkZSBpLmUuICoqXC8qLnhtbCwgKipcLyoucHJvcGVydGllcwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEluY2x1ZGVzKCBTdHJpbmcgaW5jbHVkZXMgKQotICAgIHsKLSAgICAgICAgdGhpcy5pbmNsdWRlcyA9IGluY2x1ZGVzOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvdXRpbHMvQnVpbGRFeGNlcHRpb24uamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvdXRpbHMvQnVpbGRFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmYwYzY4Mi4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL3V0aWxzL0J1aWxkRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uYnVpbGRlci51dGlsczsKLQotCi0vKioKLSAqIEFuIHVuY2hlY2tlZCBleGNlcHRpb24gdGhhdCBjYW4gYmUgdGhyb3duIHdoZW5ldmVyIHNvbWV0aGluZyBnb2VzIHdyb25nLgotICogPHA+Ci0gKiBBbiB1bmNoZWNrZWQgZXhjZXB0aW9uIGlzIHVzZWZ1bCBpbiB0aGlzIHBhcnRpY3VsYXIgYXBwbGljYXRpb24gYmVjYXVzZQotICogd2UgZG9uJ3QgbmVlZCB0byBib3RoZXIgZGVjbGFyaW5nIGl0IGV2ZXJ5d2hlcmUuIENoZWNrZWQgZXhjZXB0aW9ucyBhcmUKLSAqIGZpbmUgaGVyZSBiZWNhdXNlIHRoZXJlIGlzIG5vIHNlbnNpYmxlICJyZWNvdmVyeSBzdHJhdGVneSIgZm9yIGEgYnVpbGQKLSAqIGZhaWx1cmUgZXhjZXB0IHRlcm1pbmF0aW5nIHRoZSBidWlsZC4KLSAqLwotcHVibGljIGNsYXNzIEJ1aWxkRXhjZXB0aW9uIGV4dGVuZHMgUnVudGltZUV4Y2VwdGlvbgotewotICAgIHB1YmxpYyBCdWlsZEV4Y2VwdGlvbihTdHJpbmcgbXNnKQotICAgIHsKLSAgICAgICAgc3VwZXIobXNnKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIEJ1aWxkRXhjZXB0aW9uKFN0cmluZyBtc2csIEV4Y2VwdGlvbiBjYXVzZSkKLSAgICB7Ci0gICAgICAgIHN1cGVyKG1zZywgY2F1c2UpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvdXRpbHMvQ29uc29sZUxvZ1N5c3RlbS5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci91dGlscy9Db25zb2xlTG9nU3lzdGVtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjYzYxZGIuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci91dGlscy9Db25zb2xlTG9nU3lzdGVtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uYnVpbGRlci51dGlsczsKLQotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOwotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUudmVsb2NpdHkucnVudGltZS5SdW50aW1lU2VydmljZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS52ZWxvY2l0eS5ydW50aW1lLmxvZy5Mb2dDaHV0ZTsKLQotcHVibGljIGNsYXNzIENvbnNvbGVMb2dTeXN0ZW0gaW1wbGVtZW50cyBMb2dDaHV0ZQotewotCi0gICAgZmluYWwgTG9nZ2VyIGxvZyA9IExvZ2dlci5nZXRMb2dnZXIoQ29uc29sZUxvZ1N5c3RlbS5jbGFzcy5nZXROYW1lKCkpOwotICAgIAotICAgIHB1YmxpYyBMb2dnZXIgZ2V0TG9nZ2VyKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBsb2c7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIGluaXQoUnVudGltZVNlcnZpY2VzIHJ1bnRpbWVzZXJ2aWNlcykgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzTGV2ZWxFbmFibGVkKGludCBpKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgbG9nKGludCBsZXZlbCwgU3RyaW5nIG1lc3NhZ2UpCi0gICAgewotICAgICAgICBzd2l0Y2ggKCBsZXZlbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgTG9nQ2h1dGUuV0FSTl9JRDoKLSAgICAgICAgICAgICAgICBnZXRMb2dnZXIoKS5sb2coTGV2ZWwuV0FSTklORywgbWVzc2FnZSApOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBMb2dDaHV0ZS5JTkZPX0lEOgotICAgICAgICAgICAgICAgIC8vIHZlbG9jaXR5IGluZm8gbWVzc2FnZXMgYXJlIHRvbyB2ZXJib3NlLCBqdXN0IGNvbnNpZGVyIHRoZW0gYXMgZGVidWcgbWVzc2FnZXMuLi4KLSAgICAgICAgICAgICAgICBnZXRMb2dnZXIoKS5sb2coTGV2ZWwuSU5GTywgbWVzc2FnZSApOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBMb2dDaHV0ZS5ERUJVR19JRDoKLSAgICAgICAgICAgICAgICBnZXRMb2dnZXIoKS5sb2coTGV2ZWwuRklORSwgbWVzc2FnZSApOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBMb2dDaHV0ZS5FUlJPUl9JRDoKLSAgICAgICAgICAgICAgICBnZXRMb2dnZXIoKS5sb2coTGV2ZWwuU0VWRVJFLCBtZXNzYWdlICk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIGdldExvZ2dlcigpLmxvZyhMZXZlbC5BTEwsIG1lc3NhZ2UgKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfSAgICAgICAgCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgbG9nKGludCBsZXZlbCwgU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSB0aHJvd2FibGUpCi0gICAgewotICAgICAgICBsb2cobGV2ZWwsbWVzc2FnZSk7Ci0gICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKHRocm93YWJsZSk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL3V0aWxzL01hdmVuUGx1Z2luQ29uc29sZUxvZ1N5c3RlbS5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci91dGlscy9NYXZlblBsdWdpbkNvbnNvbGVMb2dTeXN0ZW0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGE5ZWQ5OC4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL3V0aWxzL01hdmVuUGx1Z2luQ29uc29sZUxvZ1N5c3RlbS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoNCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqIA0KLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKiANCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmJ1aWxkZXIudXRpbHM7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLnZlbG9jaXR5LnJ1bnRpbWUuUnVudGltZVNlcnZpY2VzOw0KLWltcG9ydCBvcmcuYXBhY2hlLnZlbG9jaXR5LnJ1bnRpbWUubG9nLkxvZ0NodXRlOw0KLQ0KLXB1YmxpYyBjbGFzcyBNYXZlblBsdWdpbkNvbnNvbGVMb2dTeXN0ZW0gaW1wbGVtZW50cyBMb2dDaHV0ZQ0KLXsNCi0NCi0gICAgZmluYWwgTG9nIGxvZzsNCi0gICAgDQotICAgIHB1YmxpYyBNYXZlblBsdWdpbkNvbnNvbGVMb2dTeXN0ZW0oTG9nIGwpDQotICAgIHsNCi0gICAgICAgIGxvZyA9IGw7DQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyBMb2cgZ2V0TG9nZ2VyKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGxvZzsNCi0gICAgfQ0KLSAgICANCi0gICAgcHVibGljIHZvaWQgaW5pdChSdW50aW1lU2VydmljZXMgcnVudGltZXNlcnZpY2VzKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0xldmVsRW5hYmxlZChpbnQgaSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRydWU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgbG9nKGludCBsZXZlbCwgU3RyaW5nIG1lc3NhZ2UpDQotICAgIHsNCi0gICAgICAgIHN3aXRjaCAoIGxldmVsICkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBjYXNlIExvZ0NodXRlLldBUk5fSUQ6DQotICAgICAgICAgICAgICAgIGdldExvZ2dlcigpLndhcm4obWVzc2FnZSApOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBjYXNlIExvZ0NodXRlLklORk9fSUQ6DQotICAgICAgICAgICAgICAgIC8vIHZlbG9jaXR5IGluZm8gbWVzc2FnZXMgYXJlIHRvbyB2ZXJib3NlLCBqdXN0IGNvbnNpZGVyIHRoZW0gYXMgZGVidWcgbWVzc2FnZXMuLi4NCi0gICAgICAgICAgICAgICAgZ2V0TG9nZ2VyKCkuaW5mbyhtZXNzYWdlICk7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgTG9nQ2h1dGUuREVCVUdfSUQ6DQotICAgICAgICAgICAgICAgIGdldExvZ2dlcigpLmRlYnVnKG1lc3NhZ2UgKTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSBMb2dDaHV0ZS5FUlJPUl9JRDoNCi0gICAgICAgICAgICAgICAgZ2V0TG9nZ2VyKCkuZXJyb3IobWVzc2FnZSApOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBkZWZhdWx0Og0KLSAgICAgICAgICAgICAgICBnZXRMb2dnZXIoKS53YXJuKG1lc3NhZ2UgKTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICB9ICAgICAgICANCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBsb2coaW50IGxldmVsLCBTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIHRocm93YWJsZSkNCi0gICAgew0KLSAgICAgICAgbG9nKGxldmVsLG1lc3NhZ2UpOw0KLSAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24odGhyb3dhYmxlKTsNCi0gICAgfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL3V0aWxzL015ZmFjZXNVdGlscy5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci91dGlscy9NeWZhY2VzVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTY1M2M1Yy4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL3V0aWxzL015ZmFjZXNVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQ2ICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5idWlsZGVyLnV0aWxzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwuVHJlZVNldDsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguTWF0Y2hlcjsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nLlN0cmluZ1V0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uYnVpbGRlci5tb2RlbC5Db21wb25lbnRNZXRhOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uYnVpbGRlci5tb2RlbC5NZXRob2RTaWduYXR1cmVNZXRhOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uYnVpbGRlci5tb2RlbC5Qcm9wZXJ0eU1ldGE7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmJ1aWxkZXIubW9kZWwuUHJvcGVydHlIb2xkZXI7Ci0KLS8qKgotICogQ29sbGVjdGlvbiBvZiB1c2VmdWwgdXRpbGl0eSBtZXRob2RzLgotICogPHA+Ci0gKiBBbiBpbnN0YW5jZSBvZiB0aGlzIHR5cGUgaXMgbWFkZSBhdmFpbGFibGUgdG8gdGhlIHRlbXBsYXRlcyB1c2VkIHRvIGdlbmVyYXRlCi0gKiBvdXRwdXQgZmlsZXMsIHNvIHRoYXQgdGhleSBjYW4gY2FsbCB0aGVzZSB1c2VmdWwgbWV0aG9kcy4KLSAqLwotcHVibGljIGNsYXNzIE15ZmFjZXNVdGlscwotewotICAgIHB1YmxpYyBNeWZhY2VzVXRpbHMoKQotICAgIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRQcmVmaXhlZFByb3BlcnR5TmFtZShTdHJpbmcgcHJlZml4LAotICAgICAgICAgICAgU3RyaW5nIHByb3BlcnR5TmFtZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBwcmVmaXggKyBDaGFyYWN0ZXIudG9VcHBlckNhc2UocHJvcGVydHlOYW1lLmNoYXJBdCgwKSkKLSAgICAgICAgICAgICAgICArIHByb3BlcnR5TmFtZS5zdWJzdHJpbmcoMSk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIENvbnZlcnQgaDpjb21tYW5kQnV0dG9uIHRvIGNvbW1hbmRCdXR0b24KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcHJlZml4ZWROYW1lCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFRhZ05hbWUoU3RyaW5nIHByZWZpeGVkTmFtZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBwcmVmaXhlZE5hbWUuc3Vic3RyaW5nKHByZWZpeGVkTmFtZS5pbmRleE9mKCc6JykrMSk7IAotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRUYWdQcmVmaXgoU3RyaW5nIHByZWZpeGVkTmFtZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBwcmVmaXhlZE5hbWUuc3Vic3RyaW5nKDAscHJlZml4ZWROYW1lLmluZGV4T2YoJzonKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0SnNwUHJvcGVydHlUeXBlMTEoUHJvcGVydHlNZXRhIHByb3BlcnR5KQotICAgIHsKLS8vICAgICAgICBpZiAocHJvcGVydHkuaXNNZXRob2RFeHByZXNzaW9uKCkpCi0vLyAgICAgICAgICAgIHJldHVybiAiTWV0aG9kQmluZGluZyI7Ci0KLS8vICAgICAgICBpZiAocHJvcGVydHkuaXNNZXRob2RCaW5kaW5nKCkpCi0vLyAgICAgICAgICAgIHJldHVybiAiTWV0aG9kQmluZGluZyI7Ci0gICAgICAgIC8vT24gMS4xIGFsbCBwcm9wZXJ0aWVzIGlzIG1hcHBlZCBhcyBTdHJpbmcKLSAgICAgICAgcmV0dXJuICJTdHJpbmciOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRGdWxsSnNwUHJvcGVydHlUeXBlMTEoUHJvcGVydHlNZXRhIHByb3BlcnR5KQotICAgIHsKLSAgICAgICAgaWYgKHByb3BlcnR5LmlzTWV0aG9kRXhwcmVzc2lvbigpKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gImphdmF4LmZhY2VzLmVsLk1ldGhvZEJpbmRpbmciOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHByb3BlcnR5LmlzTWV0aG9kQmluZGluZygpKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gImphdmF4LmZhY2VzLmVsLk1ldGhvZEJpbmRpbmciOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuICJqYXZhLmxhbmcuU3RyaW5nIjsKLSAgICB9Ci0gICAgCi0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRKc3BQcm9wZXJ0eVR5cGUxMihQcm9wZXJ0eU1ldGEgcHJvcGVydHkpCi0gICAgewotICAgICAgICBpZiAocHJvcGVydHkuZ2V0SnNwTmFtZSgpLmVxdWFscygiYWN0aW9uTGlzdGVuZXIiKSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuICJqYXZheC5lbC5NZXRob2RFeHByZXNzaW9uIjsKLSAgICAgICAgfQotICAgICAgICBpZiAocHJvcGVydHkuZ2V0SnNwTmFtZSgpLmVxdWFscygidmFsaWRhdG9yIikpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiAiamF2YXguZWwuTWV0aG9kRXhwcmVzc2lvbiI7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHByb3BlcnR5LmdldEpzcE5hbWUoKS5lcXVhbHMoInZhbHVlQ2hhbmdlTGlzdGVuZXIiKSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuICJqYXZheC5lbC5NZXRob2RFeHByZXNzaW9uIjsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYgKHByb3BlcnR5LmlzTWV0aG9kRXhwcmVzc2lvbigpKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gIk1ldGhvZEV4cHJlc3Npb24iOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHByb3BlcnR5LmlzTWV0aG9kQmluZGluZygpKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gIk1ldGhvZEJpbmRpbmciOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFwcm9wZXJ0eS5pc0xpdGVyYWxPbmx5KCkuYm9vbGVhblZhbHVlKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiAiVmFsdWVFeHByZXNzaW9uIjsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBwcm9wZXJ0eS5nZXRDbGFzc05hbWUoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFZhcmlhYmxlRnJvbU5hbWUoU3RyaW5nIG5hbWUpCi0gICAgewotICAgICAgICBpZiAobmFtZSA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChSRVNFUlZFRF9XT1JEUy5jb250YWlucyhuYW1lKSkKLSAgICAgICAgewotICAgICAgICAgICAgbmFtZSA9IG5hbWUgKyAiUGFyYW0iOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG5hbWU7Ci0gICAgfQotCi0gICAgLy8gVE9ETzogcGVyaGFwcyB0aGlzIGNvdWxkIGp1c3QgcmV0dXJuIGEgbGlzdCBvZiBjbGFzcyBuYW1lcyBmb3IKLSAgICAvLyB0ZW1wbGF0ZXMgdG8gaXRlcmF0ZSBvdmVyLCByYXRoZXIgdGhhbiBidWlsZGluZyB0aGUgdGV4dCBpdHNlbGY/Ci0gICAgLy8KLSAgICAvLyBUT0RPOiB3aHkgYXJlIHdlIGltcG9ydGluZyB0YWcgY2xhc3NlcyBpbnRvIGNvbXBvbmVudHMgYW55d2F5PwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGltcG9ydFRhZ0NsYXNzZXMoUHJvcGVydHlIb2xkZXIgY29tcG9uZW50KQotICAgIHsKLSAgICAgICAgU2V0IGltcG9ydHMgPSBuZXcgSGFzaFNldCgpOwotICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ID0gY29tcG9uZW50LnByb3BlcnRpZXMoKTsgaXQuaGFzTmV4dCgpOykKLSAgICAgICAgewotICAgICAgICAgICAgUHJvcGVydHlNZXRhIHByb3BlcnR5ID0gKFByb3BlcnR5TWV0YSkgaXQubmV4dCgpOwotICAgICAgICAgICAgaWYgKHByb3BlcnR5LmdldENsYXNzTmFtZSgpICE9IG51bGwgJiYgCi0gICAgICAgICAgICAgICAgICAgICFQUklNSVRJVkVfVFlQRVMuY29udGFpbnMocHJvcGVydHkuZ2V0Q2xhc3NOYW1lKCkpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmICghcHJvcGVydHkuZ2V0Q2xhc3NOYW1lKCkuc3RhcnRzV2l0aCgiamF2YS5sYW5nIikpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpbXBvcnRzLmFkZChwcm9wZXJ0eS5nZXRDbGFzc05hbWUoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nQnVmZmVyIHZhbHVlID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCi0gICAgICAgIGZvciAoSXRlcmF0b3IgaW1wb3J0SXRlcmF0b3IgPSBpbXBvcnRzLml0ZXJhdG9yKCk7IGltcG9ydEl0ZXJhdG9yCi0gICAgICAgICAgICAgICAgLmhhc05leHQoKTspCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhbHVlLmFwcGVuZCgiaW1wb3J0ICIpOwotICAgICAgICAgICAgdmFsdWUuYXBwZW5kKChTdHJpbmcpIGltcG9ydEl0ZXJhdG9yLm5leHQoKSk7Ci0gICAgICAgICAgICB2YWx1ZS5hcHBlbmQoJzsnKTsKLSAgICAgICAgICAgIHZhbHVlLmFwcGVuZCgnXG4nKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB2YWx1ZS50b1N0cmluZygpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBpbXBvcnRUYWdDbGFzc2VzMTIoQ29tcG9uZW50TWV0YSBjb21wb25lbnQpCi0gICAgewotICAgICAgICBTZXQgaW1wb3J0cyA9IG5ldyBIYXNoU2V0KCk7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaXQgPSBjb21wb25lbnQucHJvcGVydGllcygpOyBpdC5oYXNOZXh0KCk7KQotICAgICAgICB7Ci0gICAgICAgICAgICBQcm9wZXJ0eU1ldGEgcHJvcGVydHkgPSAoUHJvcGVydHlNZXRhKSBpdC5uZXh0KCk7Ci0gICAgICAgICAgICBpZiAocHJvcGVydHkuZ2V0Q2xhc3NOYW1lKCkgIT0gbnVsbCAmJiAKLSAgICAgICAgICAgICAgICAgICAgIVBSSU1JVElWRV9UWVBFUy5jb250YWlucyhwcm9wZXJ0eS5nZXRDbGFzc05hbWUoKSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKCFwcm9wZXJ0eS5nZXRDbGFzc05hbWUoKS5zdGFydHNXaXRoKCJqYXZhLmxhbmciKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGltcG9ydHMuYWRkKHByb3BlcnR5LmdldENsYXNzTmFtZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAocHJvcGVydHkuZ2V0SnNwTmFtZSgpLmVxdWFscygiYWN0aW9uTGlzdGVuZXIiKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpbXBvcnRzLmFkZCgiamF2YXguZmFjZXMuZXZlbnQuTWV0aG9kRXhwcmVzc2lvbkFjdGlvbkxpc3RlbmVyIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAocHJvcGVydHkuZ2V0SnNwTmFtZSgpLmVxdWFscygidmFsdWVDaGFuZ2VMaXN0ZW5lciIpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGltcG9ydHMuYWRkKCJqYXZheC5mYWNlcy5ldmVudC5NZXRob2RFeHByZXNzaW9uVmFsdWVDaGFuZ2VMaXN0ZW5lciIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHByb3BlcnR5LmdldEpzcE5hbWUoKS5lcXVhbHMoInZhbGlkYXRvciIpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGltcG9ydHMuYWRkKCJqYXZheC5mYWNlcy52YWxpZGF0b3IuTWV0aG9kRXhwcmVzc2lvblZhbGlkYXRvciIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nQnVmZmVyIHZhbHVlID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCi0gICAgICAgIGZvciAoSXRlcmF0b3IgaW1wb3J0SXRlcmF0b3IgPSBpbXBvcnRzLml0ZXJhdG9yKCk7IGltcG9ydEl0ZXJhdG9yCi0gICAgICAgICAgICAgICAgLmhhc05leHQoKTspCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhbHVlLmFwcGVuZCgiaW1wb3J0ICIpOwotICAgICAgICAgICAgdmFsdWUuYXBwZW5kKChTdHJpbmcpIGltcG9ydEl0ZXJhdG9yLm5leHQoKSk7Ci0gICAgICAgICAgICB2YWx1ZS5hcHBlbmQoJzsnKTsKLSAgICAgICAgICAgIHZhbHVlLmFwcGVuZCgnXG4nKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB2YWx1ZS50b1N0cmluZygpOwotICAgIH0KLSAgICAKLQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0NvbnZlcnRlcihTdHJpbmcgcHJvcENsYXNzKQotICAgIHsKLSAgICAgICAgcmV0dXJuICgiamF2YXguZmFjZXMuY29udmVydC5Db252ZXJ0ZXIiLmVxdWFscyhwcm9wQ2xhc3MpKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzTGlzdChTdHJpbmcgcHJvcENsYXNzKQotICAgIHsKLSAgICAgICAgaWYgKHByb3BDbGFzcyA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZihTdHJpbmdVdGlscy5jb250YWlucyhwcm9wQ2xhc3MsICJMaXN0IikpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGNhc3RJZk5lY2Vzc2FyeShTdHJpbmcgcHJvcENsYXNzKQotICAgIHsKLSAgICAgIGlmIChwcm9wQ2xhc3MuZXF1YWxzKCJPYmplY3QiKSB8fCBwcm9wQ2xhc3MuZXF1YWxzKCJqYXZhLmxhbmcuT2JqZWN0IikpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiAiIjsKLSAgICAgIH0KLQotICAgICAgaWYgKGlzUHJpbWl0aXZlQ2xhc3MocHJvcENsYXNzKSkKLSAgICAgIHsKLSAgICAgICAgcHJvcENsYXNzID0gZ2V0Qm94ZWRDbGFzcyhwcm9wQ2xhc3MpOwotICAgICAgfQotCi0gICAgICByZXR1cm4gIigiICsgcHJvcENsYXNzICsgIikiOwotICAgIH0gICAgCi0gICAgICAgIAotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEJveGVkQ2xhc3MoU3RyaW5nIGNsYXNzTmFtZSkKLSAgICB7Ci0gICAgICAgIGlmICgiYm9vbGVhbiIuZXF1YWxzKGNsYXNzTmFtZSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiAiQm9vbGVhbiI7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoImJ5dGUiLmVxdWFscyhjbGFzc05hbWUpKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gIkJ5dGUiOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKCJjaGFyIi5lcXVhbHMoY2xhc3NOYW1lKSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuICJDaGFyYWN0ZXIiOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKCJkb3VibGUiLmVxdWFscyhjbGFzc05hbWUpKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gIkRvdWJsZSI7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoImZsb2F0Ii5lcXVhbHMoY2xhc3NOYW1lKSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuICJGbG9hdCI7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoImludCIuZXF1YWxzKGNsYXNzTmFtZSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiAiSW50ZWdlciI7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoImxvbmciLmVxdWFscyhjbGFzc05hbWUpKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gIkxvbmciOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKCJzaG9ydCIuZXF1YWxzKGNsYXNzTmFtZSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiAiU2hvcnQiOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGNsYXNzTmFtZTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTaWduYXR1cmVQYXJhbXMoTWV0aG9kU2lnbmF0dXJlTWV0YSBzaWduYXR1cmUpCi0gICAgewotICAgICAgICBTdHJpbmdbXSBwYXJhbVR5cGVzID0gKHNpZ25hdHVyZSAhPSBudWxsKSA/IHNpZ25hdHVyZS5nZXRQYXJhbWV0ZXJUeXBlcygpIDogbnVsbDsKLQotICAgICAgICBTdHJpbmcgY2xhc3NBcnJheTsKLQotICAgICAgICBpZiAocGFyYW1UeXBlcyA9PSBudWxsIHx8IHBhcmFtVHlwZXMubGVuZ3RoID09IDApCi0gICAgICAgIHsKLSAgICAgICAgICBjbGFzc0FycmF5ID0gIm5ldyBDbGFzc1swXSI7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICAgIHNiLmFwcGVuZCgibmV3IENsYXNzW117Iik7Ci0gICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJhbVR5cGVzLmxlbmd0aDsgaSsrKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChpID4gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgc2IuYXBwZW5kKCcsJyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzYi5hcHBlbmQocGFyYW1UeXBlc1tpXSk7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoIi5jbGFzcyIpOwotICAgICAgICAgIH0KLQotICAgICAgICAgIC8vIFRPRE86IHJlbW92ZSB0cmFpbGluZyBjb21tYQotICAgICAgICAgIHNiLmFwcGVuZCgnLCcpOwotCi0gICAgICAgICAgc2IuYXBwZW5kKCd9Jyk7Ci0gICAgICAgICAgY2xhc3NBcnJheSA9IHNiLnRvU3RyaW5nKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNsYXNzQXJyYXk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1N0cmluZ01ldGhvZEJpbmRpbmdSZXR1cm5UeXBlKE1ldGhvZFNpZ25hdHVyZU1ldGEgc2lnKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChzaWcgIT0gbnVsbCAmJiAiamF2YS5sYW5nLlN0cmluZyIuZXF1YWxzKHNpZy5nZXRSZXR1cm5UeXBlKCkpKTsKLSAgICB9Ci0gICAgCi0gICAgc3RhdGljIHB1YmxpYyBTdHJpbmcgZ2V0TWV0aG9kUmVhZGVyRnJvbVByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUsCi0gICAgICAgICAgICBTdHJpbmcgcHJvcGVydHlDbGFzcykKLSAgICB7Ci0gICAgICAgIFN0cmluZyBtZXRob2RQcmVmaXggPSAoImJvb2xlYW4iLmVxdWFscyhwcm9wZXJ0eUNsYXNzKSA/ICJpcyIgOiAiZ2V0Iik7Ci0gICAgICAgIHJldHVybiBnZXRQcmVmaXhlZFByb3BlcnR5TmFtZShtZXRob2RQcmVmaXgsIHByb3BlcnR5TmFtZSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFByaW1pdGl2ZVR5cGUoU3RyaW5nIGNsYXNzTmFtZSkKLSAgICB7Ci0gICAgICAgIGlmIChjbGFzc05hbWUuc3RhcnRzV2l0aCgiamF2YS5sYW5nLiIpKQotICAgICAgICB7Ci0gICAgICAgICAgICBjbGFzc05hbWUgPSBTdHJpbmdVdGlscy5yZXBsYWNlKGNsYXNzTmFtZSwgImphdmEubGFuZy4iLCAiIik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoY2xhc3NOYW1lLmVuZHNXaXRoKCJlZ2VyIikpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNsYXNzTmFtZSA9IFN0cmluZ1V0aWxzLnJlcGxhY2UoY2xhc3NOYW1lLCAiZWdlciIsICIiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChNeWZhY2VzVXRpbHMuaXNQcmltaXRpdmVDbGFzcyhjbGFzc05hbWUudG9Mb3dlckNhc2UoKSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBjbGFzc05hbWUudG9Mb3dlckNhc2UoKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBjbGFzc05hbWU7Ci0gICAgICAgIH0KLSAgICB9ICAgIAotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1ByaW1pdGl2ZUNsYXNzKFN0cmluZyBjbGFzc05hbWUpCi0gICAgewotICAgICAgICByZXR1cm4gImJvb2xlYW4iLmVxdWFscyhjbGFzc05hbWUpIHx8ICJieXRlIi5lcXVhbHMoY2xhc3NOYW1lKQotICAgICAgICAgICAgICAgIHx8ICJjaGFyIi5lcXVhbHMoY2xhc3NOYW1lKSB8fCAiZG91YmxlIi5lcXVhbHMoY2xhc3NOYW1lKQotICAgICAgICAgICAgICAgIHx8ICJmbG9hdCIuZXF1YWxzKGNsYXNzTmFtZSkgfHwgImludCIuZXF1YWxzKGNsYXNzTmFtZSkKLSAgICAgICAgICAgICAgICB8fCAibG9uZyIuZXF1YWxzKGNsYXNzTmFtZSkgfHwgInNob3J0Ii5lcXVhbHMoY2xhc3NOYW1lKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBTZXQgX2NyZWF0ZVByaW1pdGl2ZVR5cGVzU2V0KCkKLSAgICB7Ci0gICAgICAgIFNldCBwcmltaXRpdmVzID0gbmV3IFRyZWVTZXQoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBfUFJJTUlUSVZFX1RZUEVTLmxlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmcgdHlwZSA9IF9QUklNSVRJVkVfVFlQRVNbaV07Ci0gICAgICAgICAgICBwcmltaXRpdmVzLmFkZCh0eXBlKTsKLSAgICAgICAgICAgIHByaW1pdGl2ZXMuYWRkKHR5cGUgKyAiW10iKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlU2V0KHByaW1pdGl2ZXMpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIFNldCBfY3JlYXRlUmVzZXJ2ZWRXb3Jkc1NldCgpCi0gICAgewotICAgICAgICBTZXQgcmVzZXJ2ZWQgPSBuZXcgVHJlZVNldCgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IF9SRVNFUlZFRF9XT1JEUy5sZW5ndGg7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIGtleXdvcmQgPSBfUkVTRVJWRURfV09SRFNbaV07Ci0gICAgICAgICAgICByZXNlcnZlZC5hZGQoa2V5d29yZCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZVNldChyZXNlcnZlZCk7Ci0gICAgfQotCi0gICAgc3RhdGljIHByaXZhdGUgZmluYWwgU3RyaW5nW10gX1BSSU1JVElWRV9UWVBFUyA9IG5ldyBTdHJpbmdbXSB7Ci0gICAgICAgIC8vIFRPRE86IFNob3VsZG4ndCBqYXZhLmxhbmcuKiBiZSBzcGVjaWZpZWQgaW4gdGhhdCBsaXN0IGFzIHdlbGw/Ci0gICAgImJvb2xlYW4iLCAiYnl0ZSIsICJjaGFyIiwgImZsb2F0IiwgImRvdWJsZSIsICJpbnQiLCAic2hvcnQiLCAibG9uZyIsIH07Ci0KLSAgICBzdGF0aWMgcHJpdmF0ZSBmaW5hbCBTdHJpbmdbXSBfUkVTRVJWRURfV09SRFMgPSBuZXcgU3RyaW5nW10geyAiYWJzdHJhY3QiLAotICAgICAgICAgICAgImFzc2VydCIsICJib29sZWFuIiwgImJyZWFrIiwgImJ5dGUiLCAiY2FzZSIsICJjYXRjaCIsICJjaGFyIiwKLSAgICAgICAgICAgICJjbGFzcyIsICJjb25zdCIsICJjb250aW51ZSIsICJkZWZhdWx0IiwgImRvIiwgImRvdWJsZSIsICJlbHNlIiwKLSAgICAgICAgICAgICJleHRlbmRzIiwgImZpbmFsIiwgImZpbmFsbHkiLCAiZmxvYXQiLCAiZm9yIiwgImdvdG8iLCAiaWYiLAotICAgICAgICAgICAgImltcGxlbWVudHMiLCAiaW1wb3J0IiwgImluc3RhbmNlb2YiLCAiaW50IiwgImludGVyZmFjZSIsICJsb25nIiwKLSAgICAgICAgICAgICJuYXRpdmUiLCAibmV3IiwgInBhY2thZ2UiLCAicHJpdmF0ZSIsICJwcm90ZWN0ZWQiLCAicHVibGljIiwKLSAgICAgICAgICAgICJyZXR1cm4iLCAic2hvcnQiLCAic3RhdGljIiwgInN1cGVyIiwgInN3aXRjaCIsICJzeW5jaHJvbml6ZWQiLAotICAgICAgICAgICAgInRoaXMiLCAidGhyb3ciLCAidGhyb3dzIiwgInRyYW5zaWVudCIsICJ0cnkiLCAidm9pZCIsICJ2b2xhdGlsZSIsCi0gICAgICAgICAgICAid2hpbGUiLCB9OwotCi0gICAgc3RhdGljIHB1YmxpYyBmaW5hbCBTZXQgUkVTRVJWRURfV09SRFMgPSBfY3JlYXRlUmVzZXJ2ZWRXb3Jkc1NldCgpOwotICAgIHN0YXRpYyBwdWJsaWMgZmluYWwgU2V0IFBSSU1JVElWRV9UWVBFUyA9IF9jcmVhdGVQcmltaXRpdmVUeXBlc1NldCgpOwotCi0gICAgc3RhdGljIHByaXZhdGUgZmluYWwgUGF0dGVybiBfR0VORVJJQ19UWVBFID0gUGF0dGVybgotICAgICAgICAgICAgLmNvbXBpbGUoIihbXjxdKyk8KC4rKT4iKTsKLSAgICAKLSAgICAvL1VOVVNFRCBNRVRIT0RTCi0KLQotICAgIHN0YXRpYyBwdWJsaWMgU3RyaW5nIGNvbnZlcnRDbGFzc1RvU291cmNlUGF0aChTdHJpbmcgY2xhc3NOYW1lLAotICAgICAgICAgICAgU3RyaW5nIGZpbGVFeHRlbnNpb24pCi0gICAgewotICAgICAgICByZXR1cm4gKGNsYXNzTmFtZS5yZXBsYWNlKCcuJywgRmlsZS5zZXBhcmF0b3JDaGFyKSArIGZpbGVFeHRlbnNpb24pOwotICAgIH0KLQotICAgIHN0YXRpYyBwdWJsaWMgYm9vbGVhbiBpc0Z1bGxDbGFzcyhTdHJpbmcgY2xhc3NOYW1lKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChjbGFzc05hbWUgIT0gbnVsbCAmJiBjbGFzc05hbWUuaW5kZXhPZignLicpICE9IC0xKTsKLSAgICB9Ci0KLSAgICAvKgotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEdlbmVyaWNzRnJvbVByb3BlcnR5KFByb3BlcnR5TWV0YSBwcm9wZXJ0eSl7Ci0gICAgICAgIFN0cmluZyBnZW4gPSAiIjsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9wZXJ0eS5nZXRBdHRyaWJ1dGVDbGFzc1BhcmFtZXRlcnMoKS5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgaWYgKGk+MCl7Ci0gICAgICAgICAgICAgICAgZ2VuICs9ICIsIjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGdlbiArPSBnZXRDbGFzc0Zyb21GdWxsQ2xhc3MocHJvcGVydHkuZ2V0QXR0cmlidXRlQ2xhc3NQYXJhbWV0ZXJzKClbaV0pOyAgICAgICAgICAKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gKGdlbi5sZW5ndGgoKSA+IDA/IjwiK2dlbisiPiI6Z2VuKTsKLSAgICB9Ci0gICAgKi8KLQotICAgIC8qKgotICAgICAqIEV4dHJhY3QgdGhlIHNpbXBsZSBjbGFzcyBuYW1lIGZyb20gYSBmdWxseS1xdWFsaWZpZWQgY2xhc3NuYW1lLgotICAgICAqIDxwPgotICAgICAqIEdpdmVuIGEgc3RyaW5nIGxpa2UgIm9yZy5hcGFjaGUuRm9vIiwgdGhpcyBtZXRob2QgcmV0dXJucyAiRm9vIi4KLSAgICAgKi8KLSAgICBzdGF0aWMgcHVibGljIFN0cmluZyBnZXRDbGFzc0Zyb21GdWxsQ2xhc3MoU3RyaW5nIGZ1bGxDbGFzcykKLSAgICB7Ci0gICAgICAgIGlmIChmdWxsQ2xhc3MgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgbGFzdFNlcCA9IGZ1bGxDbGFzcy5sYXN0SW5kZXhPZignLicpOwotICAgICAgICAvLyBOb3RlOiB0aGlzIGNvZGUgYWxzbyB3b3JrcyBmb3IgdGhlIGVtcHR5IHBhY2thZ2UKLSAgICAgICAgcmV0dXJuIChmdWxsQ2xhc3Muc3Vic3RyaW5nKGxhc3RTZXAgKyAxKSk7Ci0gICAgfQotCi0gICAgc3RhdGljIHB1YmxpYyBTdHJpbmcgZ2V0UGFja2FnZUZyb21GdWxsQ2xhc3MoU3RyaW5nIGZ1bGxDbGFzcykKLSAgICB7Ci0gICAgICAgIGlmIChmdWxsQ2xhc3MgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgbGFzdFNlcCA9IGZ1bGxDbGFzcy5sYXN0SW5kZXhPZignLicpOwotCi0gICAgICAgIC8vIGRldGVjdCB0aGUgZW1wdHkgcGFja2FnZQotICAgICAgICBpZiAobGFzdFNlcCA9PSAtMSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuICIiOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIChmdWxsQ2xhc3Muc3Vic3RyaW5nKDAsIGxhc3RTZXApKTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgcHVibGljIFN0cmluZyBnZXRDb25zdGFudE5hbWVGcm9tUHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBnZXRDb25zdGFudE5hbWVGcm9tUHJvcGVydHkocHJvcGVydHlOYW1lLCBudWxsKTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgcHVibGljIFN0cmluZyBnZXRDb25zdGFudE5hbWVGcm9tUHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSwKLSAgICAgICAgICAgIFN0cmluZyBjb25zdGFudFN1ZmZpeCkKLSAgICB7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBjb25zdGFudE5hbWUgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9wZXJ0eU5hbWUubGVuZ3RoKCk7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgY2hhciBjaCA9IHByb3BlcnR5TmFtZS5jaGFyQXQoaSk7Ci0gICAgICAgICAgICBpZiAoaSA+IDAgJiYgQ2hhcmFjdGVyLmlzVXBwZXJDYXNlKGNoKQotICAgICAgICAgICAgICAgICAgICAmJiBDaGFyYWN0ZXIuaXNMb3dlckNhc2UocHJvcGVydHlOYW1lLmNoYXJBdChpIC0gMSkpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNvbnN0YW50TmFtZS5hcHBlbmQoJ18nKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNoID0gQ2hhcmFjdGVyLnRvVXBwZXJDYXNlKGNoKTsKLSAgICAgICAgICAgIGNvbnN0YW50TmFtZS5hcHBlbmQoY2gpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGNvbnN0YW50U3VmZml4ICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNvbnN0YW50TmFtZS5hcHBlbmQoY29uc3RhbnRTdWZmaXgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGNvbnN0YW50TmFtZS50b1N0cmluZygpOwotICAgIH0KLQotICAgIHN0YXRpYyBwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5Q2xhc3MoUHJvcGVydHlNZXRhIHByb3BlcnR5KQotICAgIHsKLSAgICAgICAgU3RyaW5nIHByb3BlcnR5RnVsbENsYXNzID0gcHJvcGVydHkuZ2V0Q2xhc3NOYW1lKCk7Ci0gICAgICAgIFN0cmluZyBwcm9wZXJ0eUNsYXNzID0gTXlmYWNlc1V0aWxzCi0gICAgICAgICAgICAgICAgLmdldENsYXNzRnJvbUZ1bGxDbGFzcyhwcm9wZXJ0eUZ1bGxDbGFzcyk7Ci0gICAgICAgIC8qCi0gICAgICAgIFN0cmluZ1tdIGdlbmVyaWNUeXBlcyA9IHByb3BlcnR5LmdldFByb3BlcnR5Q2xhc3NQYXJhbWV0ZXJzKCk7Ci0gICAgICAgIGlmKGdlbmVyaWNUeXBlcyAhPSBudWxsICYmIGdlbmVyaWNUeXBlcy5sZW5ndGggPiAwKQotICAgICAgICB7Ci0gICAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoNjApOwotICAgICAgICAgIGJ1ZmZlci5hcHBlbmQocHJvcGVydHlDbGFzcyk7Ci0gICAgICAgICAgYnVmZmVyLmFwcGVuZCgnPCcpOwotICAgICAgICAgIGludCBtYXggPSBnZW5lcmljVHlwZXMubGVuZ3RoIC0gMTsKLSAgICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDw9IG1heDsgaSsrKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIF9idWlsZFByb3BlcnR5Q2xhc3MoYnVmZmVyLCBnZW5lcmljVHlwZXNbaV0pOwotICAgICAgICAgICAgaWYoaSA8IG1heCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgiLCAiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgYnVmZmVyLmFwcGVuZCgnPicpOwotICAgICAgICAgIAotICAgICAgICAgIHByb3BlcnR5Q2xhc3MgPSBidWZmZXIudG9TdHJpbmcoKTsKLSAgICAgICAgfSovCi0KLSAgICAgICAgcmV0dXJuIHByb3BlcnR5Q2xhc3M7Ci0gICAgfQotCi0gICAgc3RhdGljIHB1YmxpYyBTdHJpbmcgZ2V0TWV0aG9kTmFtZUZyb21FdmVudChTdHJpbmcgbWV0aG9kUHJlZml4LAotICAgICAgICAgICAgU3RyaW5nIGV2ZW50TmFtZSwgU3RyaW5nIG1ldGhvZFN1ZmZpeCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBtZXRob2RQcmVmaXggKyBDaGFyYWN0ZXIudG9VcHBlckNhc2UoZXZlbnROYW1lLmNoYXJBdCgwKSkKLSAgICAgICAgICAgICAgICArIGV2ZW50TmFtZS5zdWJzdHJpbmcoMSkgKyBtZXRob2RTdWZmaXg7Ci0gICAgfQotCi0gICAgc3RhdGljIHB1YmxpYyBTdHJpbmcgZ2V0RXZlbnROYW1lRnJvbUV2ZW50VHlwZShTdHJpbmcgZXZlbnRGdWxsQ2xhc3MpCi0gICAgewotICAgICAgICBTdHJpbmcgZXZlbnROYW1lID0gZ2V0Q2xhc3NGcm9tRnVsbENsYXNzKGV2ZW50RnVsbENsYXNzKTsKLSAgICAgICAgcmV0dXJuIENoYXJhY3Rlci50b0xvd2VyQ2FzZShldmVudE5hbWUuY2hhckF0KDApKQotICAgICAgICAgICAgICAgICsgZXZlbnROYW1lLnN1YnN0cmluZygxLCBldmVudE5hbWUubGVuZ3RoKCkpOwotICAgIH0KLSAgICAKLSAgICAvKgotICAgIHN0YXRpYyBwdWJsaWMgU3RyaW5nIGdldEFsdGVybmF0ZVByb3BlcnR5Q2xhc3MoUHJvcGVydHlNZXRhIHByb3BlcnR5KQotICAgIHsKLSAgICAgIFN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKDYwKTsKLSAgICAgIF9idWlsZFByb3BlcnR5Q2xhc3MoYnVmZmVyLCBwcm9wZXJ0eS5nZXRBbHRlcm5hdGVDbGFzcygpKTsKLSAgICAgIAotICAgICAgcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotICAgIH0KLSAgICAqLwotCi0gICAgc3RhdGljIHB1YmxpYyBTdHJpbmcgcHJpbWl0aXZlRGVmYXVsdFZhbHVlKFN0cmluZyBjbGFzc05hbWUpCi0gICAgewotICAgICAgICBpZiAoImJvb2xlYW4iLmVxdWFscyhjbGFzc05hbWUpKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gImZhbHNlIjsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmICgiYnl0ZSIuZXF1YWxzKGNsYXNzTmFtZSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiAiMCI7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoImNoYXIiLmVxdWFscyhjbGFzc05hbWUpKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gIicnIjsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmICgiZG91YmxlIi5lcXVhbHMoY2xhc3NOYW1lKSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuICIwLjBkIjsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmICgiZmxvYXQiLmVxdWFscyhjbGFzc05hbWUpKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gIjAuMGYiOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKCJpbnQiLmVxdWFscyhjbGFzc05hbWUpKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gIjAiOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKCJsb25nIi5lcXVhbHMoY2xhc3NOYW1lKSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuICIwTCI7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoInNob3J0Ii5lcXVhbHMoY2xhc3NOYW1lKSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuICIwIjsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBjbGFzc05hbWU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBzdGF0aWMgcHVibGljIFN0cmluZyBmaWxsKFN0cmluZyBiYXNlLCBpbnQgbGVuZ3RoKQotICAgIHsKLSAgICAgICAgaWYgKGJhc2UgPT0gbnVsbCB8fCBiYXNlLmxlbmd0aCgpID4gbGVuZ3RoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gYmFzZTsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZ0J1ZmZlciBmaWxsZWQgPSBuZXcgU3RyaW5nQnVmZmVyKGJhc2UpOwotICAgICAgICBmb3IgKGludCBpID0gYmFzZS5sZW5ndGgoKTsgaSA8IGxlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBmaWxsZWQuYXBwZW5kKCcgJyk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZpbGxlZC50b1N0cmluZygpOwotICAgIH0KLQotICAgIHN0YXRpYyBwdWJsaWMgU3RyaW5nIGdldFZhcmlhYmxlRnJvbUNsYXNzKFN0cmluZyBjbGFzc05hbWUpCi0gICAgewotICAgICAgICBpZiAoY2xhc3NOYW1lID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjbGFzc05hbWUubGVuZ3RoKCk7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgY2hhciBjaCA9IGNsYXNzTmFtZS5jaGFyQXQoaSk7Ci0gICAgICAgICAgICBpZiAoQ2hhcmFjdGVyLmlzTG93ZXJDYXNlKGNoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoaSA+IDApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKGNsYXNzTmFtZS5jaGFyQXQoaSAtIDEpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgY2xhc3NOYW1lLnN1YnN0cmluZyhpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJDbGFzcyBuYW1lIFwiIiArIGNsYXNzTmFtZQotICAgICAgICAgICAgICAgICsgIlwiIGRvZXMgbm90IHVzZSBpbml0Y2FwcyIpOwotICAgIH0KLQotICAgIHN0YXRpYyBwdWJsaWMgU3RyaW5nIGNvbnZlcnRTdHJpbmdUb0xpdGVyYWwoU3RyaW5nIHZhbHVlKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGNvbnZlcnRTdHJpbmdUb0xpdGVyYWwoIlN0cmluZyIsIHZhbHVlKTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgcHVibGljIFN0cmluZyBjb252ZXJ0U3RyaW5nVG9MaXRlcmFsKFN0cmluZyBjbGFzc05hbWUsIFN0cmluZyB2YWx1ZSkKLSAgICB7Ci0gICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmICgiU3RyaW5nIi5lcXVhbHMoY2xhc3NOYW1lKSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuICJcIiIgKyB2YWx1ZS5yZXBsYWNlQWxsKCJcJyIsICJcXCciKSArICJcIiI7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoIk51bWJlciIuZXF1YWxzKGNsYXNzTmFtZSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIERvdWJsZSB2cy4gSW50ZWdlci4KLSAgICAgICAgICAgIGlmICh2YWx1ZS5pbmRleE9mKCIuIikgPT0gLTEpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJJbnRlZ2VyLnZhbHVlT2YoIiArIHZhbHVlICsgIikiOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiAiRG91YmxlLnZhbHVlT2YoIiArIHZhbHVlICsgIikiOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHZhbHVlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgc3RhdGljIHB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFZhbHVlKFByb3BlcnR5TWV0YSBwcm9wZXJ0eSkKLSAgICB7Ci0gICAgICAgIFN0cmluZyBwcm9wZXJ0eUZ1bGxDbGFzcyA9IHByb3BlcnR5LmdldENsYXNzTmFtZSgpOwotICAgICAgICBTdHJpbmcgZGVmID0gcHJvcGVydHkuZ2V0RGVmYXVsdFZhbHVlKCk7Ci0gICAgICAgIGlmIChkZWYgPT0gbnVsbCB8fCBkZWYubGVuZ3RoKCkgPT0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGlzUHJpbWl0aXZlQ2xhc3MocHJvcGVydHlGdWxsQ2xhc3MpKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gZGVmOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKCJqYXZhLmxhbmcuU3RyaW5nIi5lcXVhbHMocHJvcGVydHlGdWxsQ2xhc3MpKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoZGVmLnN0YXJ0c1dpdGgoIlwiIikgJiYgZGVmLmVuZHNXaXRoKCJcIiIpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBkZWY7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJcIiIgKyBkZWYgKyAiXCIiOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgLy9Bbnkgb3RoZXIgY2xhc3MsIHNvIHdlIHJldHVybiB0aGUgZGVmYXVsdCB2YWx1ZQotICAgICAgICAgICAgcmV0dXJuIGRlZjsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXREZWZhdWx0VmFsdWVGaWVsZChQcm9wZXJ0eU1ldGEgcHJvcGVydHkpCi0gICAgewotICAgICAgICBTdHJpbmcgZGVmID0gIGdldERlZmF1bHRWYWx1ZShwcm9wZXJ0eSk7Ci0KLSAgICAgICAgaWYgKHByb3BlcnR5LmdldENsYXNzTmFtZSgpLmVuZHNXaXRoKCJCb29sZWFuIikgJiYgZGVmICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgICAgICBkZWYgPSAiQm9vbGVhbi52YWx1ZU9mKCIrZGVmKyIpIjsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZGVmOwotICAgIH0KLQotICAgIHN0YXRpYyBwcml2YXRlIHZvaWQgX2J1aWxkUHJvcGVydHlDbGFzcyhTdHJpbmdCdWZmZXIgYnVmZmVyLCBTdHJpbmcgdHlwZSkKLSAgICB7Ci0gICAgICAgIE1hdGNoZXIgbWF0Y2hlciA9IF9HRU5FUklDX1RZUEUubWF0Y2hlcih0eXBlKTsKLSAgICAgICAgaWYgKG1hdGNoZXIubWF0Y2hlcygpKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBHZW5lcmljIHR5cGUKLSAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoTXlmYWNlc1V0aWxzLmdldENsYXNzRnJvbUZ1bGxDbGFzcyhtYXRjaGVyLmdyb3VwKDEpKSk7Ci0gICAgICAgICAgICBidWZmZXIuYXBwZW5kKCc8Jyk7Ci0gICAgICAgICAgICBTdHJpbmdbXSB0eXBlcyA9IG1hdGNoZXIuZ3JvdXAoMikuc3BsaXQoIiwiKTsKLSAgICAgICAgICAgIGludCBtYXggPSB0eXBlcy5sZW5ndGggLSAxOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPD0gbWF4OyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgX2J1aWxkUHJvcGVydHlDbGFzcyhidWZmZXIsIHR5cGVzW2ldKTsKLSAgICAgICAgICAgICAgICBpZiAoaSA8IG1heCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoIiwgIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgnPicpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgLy8gTm9uLWdlbmVyaWMgdHlwZQotICAgICAgICAgICAgYnVmZmVyLmFwcGVuZChNeWZhY2VzVXRpbHMuZ2V0Q2xhc3NGcm9tRnVsbENsYXNzKHR5cGUpKTsKLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci91dGlscy9SZWxhdGl2ZUNsYXNzcGF0aFJlc291cmNlTG9hZGVyLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL3V0aWxzL1JlbGF0aXZlQ2xhc3NwYXRoUmVzb3VyY2VMb2FkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDUzOTQ1MS4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL3V0aWxzL1JlbGF0aXZlQ2xhc3NwYXRoUmVzb3VyY2VMb2FkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uYnVpbGRlci51dGlsczsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLkV4dGVuZGVkUHJvcGVydGllczsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZy5TdHJpbmdVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLnZlbG9jaXR5LmV4Y2VwdGlvbi5SZXNvdXJjZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUudmVsb2NpdHkucnVudGltZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuYXBhY2hlLnZlbG9jaXR5LnJ1bnRpbWUucmVzb3VyY2UubG9hZGVyLlJlc291cmNlTG9hZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUudmVsb2NpdHkudXRpbC5DbGFzc1V0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUudmVsb2NpdHkudXRpbC5FeGNlcHRpb25VdGlsczsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGV4dGVuZHMgQ2xhc3NwYXRoUmVzb3VyY2VMb2FkZXIgYWRkaW5nIHRoZSBmZWF0dXJlCi0gKiBvZiBjb25maWd1cmUgYSBwYXRoIGluc2lkZSB0aGUgY2xhc3NwYXRoIGZvciBsb2FkIHJlc291cmNlcy4KLSAqIAotICogQGF1dGhvciBMZW9uYXJkbwotICoKLSAqLwotcHVibGljIGNsYXNzIFJlbGF0aXZlQ2xhc3NwYXRoUmVzb3VyY2VMb2FkZXIgZXh0ZW5kcyBSZXNvdXJjZUxvYWRlcgotewotCi0gICAgcHJpdmF0ZSBMaXN0IHBhdGhzID0gbmV3IEFycmF5TGlzdCgpOwotCi0gICAgcHVibGljIHZvaWQgaW5pdChFeHRlbmRlZFByb3BlcnRpZXMgY29uZmlndXJhdGlvbikKLSAgICB7Ci0gICAgICAgIGlmIChsb2cuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgbG9nCi0gICAgICAgICAgICAgICAgICAgIC50cmFjZSgiUmVsYXRpdmVDbGFzc3BhdGhSZXNvdXJjZUxvYWRlciA6IGluaXRpYWxpemF0aW9uIGNvbXBsZXRlLiIpOwotICAgICAgICB9Ci0KLSAgICAgICAgcGF0aHMuYWRkQWxsKGNvbmZpZ3VyYXRpb24uZ2V0VmVjdG9yKCJwYXRoIikpOwotCi0gICAgICAgIC8vIHRyaW0gc3BhY2VzIGZyb20gYWxsIHBhdGhzCi0gICAgICAgIG9yZy5hcGFjaGUudmVsb2NpdHkudXRpbC5TdHJpbmdVdGlscy50cmltU3RyaW5ncyhwYXRocyk7Ci0gICAgICAgIGlmIChsb2cuaXNJbmZvRW5hYmxlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyB0aGlzIHNlY3Rpb24gbGV0cyB0ZWxsIHBlb3BsZSB3aGF0IHBhdGhzIHdlIHdpbGwgYmUgdXNpbmcKLSAgICAgICAgICAgIGludCBzeiA9IHBhdGhzLnNpemUoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3o7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb2cuaW5mbygiUmVsYXRpdmVDbGFzc3BhdGhSZXNvdXJjZUxvYWRlciA6IGFkZGluZyBwYXRoICciCi0gICAgICAgICAgICAgICAgICAgICAgICArIChTdHJpbmcpIHBhdGhzLmdldChpKSArICInIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBsb2cKLSAgICAgICAgICAgICAgICAgICAgLnRyYWNlKCJSZWxhdGl2ZUNsYXNzcGF0aFJlc291cmNlTG9hZGVyIDogaW5pdGlhbGl6YXRpb24gY29tcGxldGUuIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0UmVzb3VyY2VTdHJlYW0oU3RyaW5nIG5hbWUpCi0gICAgICAgICAgICB0aHJvd3MgUmVzb3VyY2VOb3RGb3VuZEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgaWYgKFN0cmluZ1V0aWxzLmlzRW1wdHkobmFtZSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSZXNvdXJjZU5vdEZvdW5kRXhjZXB0aW9uKCJObyB0ZW1wbGF0ZSBuYW1lIHByb3ZpZGVkIik7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogbG9vayBmb3IgcmVzb3VyY2UgaW4gdGhyZWFkIGNsYXNzbG9hZGVyIGZpcnN0IChlLmcuIFdFQi1JTkZcbGliIGluCi0gICAgICAgICAqIGEgc2VydmxldCBjb250YWluZXIpIHRoZW4gZmFsbCBiYWNrIHRvIHRoZSBzeXN0ZW0gY2xhc3Nsb2FkZXIuCi0gICAgICAgICAqLwotCi0gICAgICAgIGludCBzaXplID0gcGF0aHMuc2l6ZSgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIHBhdGggPSAoU3RyaW5nKSBwYXRocy5nZXQoaSk7Ci0gICAgICAgICAgICBJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IG51bGw7Ci0KLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlucHV0U3RyZWFtID0gZmluZFRlbXBsYXRlKHBhdGgsIG5hbWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb2cuZXJyb3IoIldoaWxlIGxvYWRpbmcgVGVtcGxhdGUgIiArIG5hbWUgKyAiOiAiLCBpb2UpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoaW5wdXRTdHJlYW0gIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gaW5wdXRTdHJlYW07Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgU3RyaW5nIG1zZyA9ICJDbGFzc3BhdGhSZXNvdXJjZUxvYWRlciBFcnJvcjogY2Fubm90IGZpbmQgcmVzb3VyY2UgIgotICAgICAgICAgICAgICAgICsgbmFtZTsKLQotICAgICAgICB0aHJvdyBuZXcgUmVzb3VyY2VOb3RGb3VuZEV4Y2VwdGlvbihtc2cpOwotICAgIH0KLQotICAgIHByaXZhdGUgSW5wdXRTdHJlYW0gZmluZFRlbXBsYXRlKGZpbmFsIFN0cmluZyBwYXRoLCBmaW5hbCBTdHJpbmcgbmFtZSkKLSAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgSW5wdXRTdHJlYW0gcmVzdWx0ID0gbnVsbDsKLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgcmVzdWx0ID0gQ2xhc3NVdGlscy5nZXRSZXNvdXJjZUFzU3RyZWFtKGdldENsYXNzKCksIHBhdGggKyAiLyIKLSAgICAgICAgICAgICAgICAgICAgKyBuYW1lKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGZuZmUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IChSZXNvdXJjZU5vdEZvdW5kRXhjZXB0aW9uKSBFeGNlcHRpb25VdGlscy5jcmVhdGVXaXRoQ2F1c2UoCi0gICAgICAgICAgICAgICAgICAgIFJlc291cmNlTm90Rm91bmRFeGNlcHRpb24uY2xhc3MsICJwcm9ibGVtIHdpdGggdGVtcGxhdGU6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG5hbWUsIGZuZmUpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmcgbXNnID0gIkNsYXNzcGF0aFJlc291cmNlTG9hZGVyIEVycm9yOiBjYW5ub3QgZmluZCByZXNvdXJjZSAiCi0gICAgICAgICAgICAgICAgICAgICsgbmFtZTsKLQotICAgICAgICAgICAgdGhyb3cgbmV3IFJlc291cmNlTm90Rm91bmRFeGNlcHRpb24obXNnKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNTb3VyY2VNb2RpZmllZChSZXNvdXJjZSByZXNvdXJjZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgbG9uZyBnZXRMYXN0TW9kaWZpZWQoUmVzb3VyY2UgcmVzb3VyY2UpCi0gICAgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL3RhZ2RvYy9UYWdkb2NDb250ZW50TW9qby5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vdGFnZG9jL1RhZ2RvY0NvbnRlbnRNb2pvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjNzk2MmIuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vdGFnZG9jL1RhZ2RvY0NvbnRlbnRNb2pvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjQxICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi50YWdkb2M7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZVJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uV3JpdGVyOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS5uZXQuVVJMQ2xhc3NMb2FkZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwuVHJlZVNldDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5kaWdlc3Rlci5BYnN0cmFjdE9iamVjdENyZWF0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLmFydGlmYWN0LkRlcGVuZGVuY3lSZXNvbHV0aW9uUmVxdWlyZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uQWJzdHJhY3RNb2pvOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLk1vam9FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uTW9qb0ZhaWx1cmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wcm9qZWN0Lk1hdmVuUHJvamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnJlcG9ydGluZy5NYXZlblJlcG9ydEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmJ1aWxkZXIuRmxhdHRlbmVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uYnVpbGRlci5JT1V0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uYnVpbGRlci5tb2RlbC5CZWhhdmlvck1ldGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5idWlsZGVyLm1vZGVsLkNsYXNzTWV0YTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmJ1aWxkZXIubW9kZWwuQ29tcG9uZW50TWV0YTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmJ1aWxkZXIubW9kZWwuQ29udmVydGVyTWV0YTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmJ1aWxkZXIubW9kZWwuRmFjZWxldFRhZ01ldGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5idWlsZGVyLm1vZGVsLk1vZGVsOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uYnVpbGRlci5tb2RlbC5UYWdNZXRhOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uYnVpbGRlci5tb2RlbC5WYWxpZGF0b3JNZXRhOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uYnVpbGRlci51dGlscy5NYXZlblBsdWdpbkNvbnNvbGVMb2dTeXN0ZW07Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5idWlsZGVyLnV0aWxzLk15ZmFjZXNVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLnZlbG9jaXR5LlRlbXBsYXRlOwotaW1wb3J0IG9yZy5hcGFjaGUudmVsb2NpdHkuVmVsb2NpdHlDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUudmVsb2NpdHkuYXBwLlZlbG9jaXR5RW5naW5lOwotaW1wb3J0IG9yZy5hcGFjaGUudmVsb2NpdHkuY29udGV4dC5Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUudmVsb2NpdHkucnVudGltZS5SdW50aW1lQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUudmVsb2NpdHkucnVudGltZS5yZXNvdXJjZS5SZXNvdXJjZU1hbmFnZXJJbXBsOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMudXRpbC5JT1V0aWw7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy51dGlsLnhtbC5YcHAzRG9tOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMudXRpbC54bWwuWHBwM0RvbUJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy51dGlsLnhtbC5YcHAzRG9tV3JpdGVyOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMudXRpbC54bWwucHVsbC5YbWxQdWxsUGFyc2VyRXhjZXB0aW9uOwotaW1wb3J0IG9yZy54bWwuc2F4LkF0dHJpYnV0ZXM7Ci0KLS8qKgotICogCi0gKiBHZW5lcmF0ZSB0aGUgdGFnIGRvYyBjb250ZW50IHBhZ2VzIHVzaW5nIHZlbG9jaXR5LiBUaGlzIGlzIGRvbmUgYmVmb3JlCi0gKiBzaXRlLCBiZWNhdXNlIG1hdmVuLXNpdGUtcGx1Z2luIHVzZSB2ZWxvY2l0eSBhbmQgaWYgd2UgZG8gdGhpcyBpbnNpZGUgCi0gKiByZXBvcnQgZ2VuZXJhdGlvbiwgd2UgY2F1c2UgYSBDbGFzc0xvYWRlciBwcm9ibGVtLgotICogCi0gKiBAYXV0aG9yIExlb25hcmRvIFVyaWJlCi0gKiBAZ29hbCB0YWdkb2MtY29udGVudAotICogQHBoYXNlIGdlbmVyYXRlLXJlc291cmNlcwotICovCi1wdWJsaWMgY2xhc3MgVGFnZG9jQ29udGVudE1vam8gZXh0ZW5kcyBBYnN0cmFjdE1vam8KLXsKLSAgICBwcml2YXRlIE1vZGVsIF9tb2RlbDsKLQotICAgIC8qKgotICAgICAqIFNwZWNpZmllcyB0aGUgZGlyZWN0b3J5IHdoZXJlIHRoZSByZXBvcnQgd2lsbCBiZSBnZW5lcmF0ZWQKLSAgICAgKgotICAgICAqIEBwYXJhbWV0ZXIgZGVmYXVsdC12YWx1ZT0iJHtwcm9qZWN0LnJlcG9ydGluZy5vdXRwdXREaXJlY3Rvcnl9IgotICAgICAqIEByZXF1aXJlZAotICAgICAqLwotICAgIHByaXZhdGUgRmlsZSBvdXRwdXREaXJlY3Rvcnk7Ci0KLSAgICAvKioKLSAgICAgKiBEaXJlY3Rvcnkgd2hlcmUgdGhlIG9yaWdpbmFsIHNpdGUgaXMgcHJlc2VudC4KLSAgICAgKiAoVFJJRUQgdXNpbmcgJHtiYXNlRGlyfS9zcmMvc2l0ZTsgIHRoYXQgaW5zZXJ0ZWQgYSAnbnVsbCcgaW50bwotICAgICAqIHRoZSBzdHJpbmcgZm9yIHNvbWUgcmVhc29uLiAgVFJJRUQgdXNpbmcgJHtzaXRlRGlyZWN0b3J5fSwKLSAgICAgKiB3aGljaCB3YXMgdW5kZWZpbmVkLiAgVFJJRUQgJHtwcm9qZWN0LmRpcmVjdG9yeX1zcmMvc2l0ZTsgd2hpY2ggYWxzbwotICAgICAqIGluc2VydGVkIGEgbnVsbC4gICR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9Ly4uL3NyYy9zaXRlIHNlZW1zIHRvIHdvcmssCi0gICAgICogdGhvdWdoIGl0IGFzc3VtZXMgdGhhdCAke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fSBpcyAKLSAgICAgKiAke3Byb2plY3QuZGlyZWN0b3J5fS90YXJnZXQuCi0gICAgICogCi0gICAgICogQHBhcmFtZXRlciBkZWZhdWx0LXZhbHVlPSIke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS8uLi9zcmMvc2l0ZS8iCi0gICAgICogQHJlcXVpcmVkCi0gICAgICovCi0gICAgcHJpdmF0ZSBGaWxlIHNpdGVEaXJlY3Rvcnk7Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW1ldGVyIGV4cHJlc3Npb249IiR7cHJvamVjdH0iCi0gICAgICogQHJlcXVpcmVkCi0gICAgICogQHJlYWRvbmx5Ci0gICAgICovCi0gICAgcHJpdmF0ZSBNYXZlblByb2plY3QgcHJvamVjdDsKLQotICAgIC8qKgotICAgICAqIEBwYXJhbWV0ZXIKLSAgICAgKi8KLSAgICBwcml2YXRlIE1hcCB0YWdsaWJzOwotICAgICAgICAKLSAgICAvKioKLSAgICAgKiBAcGFyYW1ldGVyIGV4cHJlc3Npb249IiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L2dlbmVyYXRlZC1yZXNvdXJjZXMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbiIKLSAgICAgKi8KLSAgICBwcml2YXRlIEZpbGUgYnVpbGREaXJlY3Rvcnk7Ci0KLSAgICAvKioKLSAgICAgKiBJbmplY3RlZCBuYW1lIG9mIGZpbGUgZ2VuZXJhdGVkIGJ5IGVhcmxpZXIgcnVuIG9mIEJ1aWxkTWV0YURhdGFNb2pvIGdvYWwuCi0gICAgICogCi0gICAgICogQHBhcmFtZXRlcgotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIG1ldGFkYXRhRmlsZSA9ICJNRVRBLUlORi9teWZhY2VzLW1ldGFkYXRhLnhtbCI7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQHBhcmFtZXRlciBleHByZXNzaW9uPSJzcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYiCi0gICAgICovCi0gICAgcHJpdmF0ZSBGaWxlIHRlbXBsYXRlU291cmNlRGlyZWN0b3J5OwotICAgIAotICAgIC8qKgotICAgICAqIEBwYXJhbWV0ZXIgZXhwcmVzc2lvbj0ic3JjL21haW4vdGFnZG9jIgotICAgICAqLyAgICAKLSAgICBwcml2YXRlIEZpbGUgYmFzZUZpbGVzU291cmNlRGlyZWN0b3J5OwotICAgIAotICAgIC8qKgotICAgICAqIEBwYXJhbWV0ZXIKLSAgICAgKi8KLSAgICBwcml2YXRlIExpc3QgbW9kZWxJZHM7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQHBhcmFtZXRlciBleHByZXNzaW9uPSJ4ZG9jLWNvbXBvbmVudC52bSIKLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyB0ZW1wbGF0ZUNvbXBvbmVudDsKLSAgICAKLSAgICAvKioKLSAgICAgKiBAcGFyYW1ldGVyIGV4cHJlc3Npb249Inhkb2MtY29udmVydGVyLnZtIgotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIHRlbXBsYXRlQ29udmVydGVyOwotICAgIAotICAgIC8qKgotICAgICAqIEBwYXJhbWV0ZXIgZXhwcmVzc2lvbj0ieGRvYy12YWxpZGF0b3Iudm0iCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgdGVtcGxhdGVWYWxpZGF0b3I7Ci0KLSAgICAvKioKLSAgICAgKiBAc2luY2UgMS4wLjYKLSAgICAgKiBAcGFyYW1ldGVyIGV4cHJlc3Npb249Inhkb2MtYmVoYXZpb3Iudm0iCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgdGVtcGxhdGVCZWhhdmlvcjsKLSAgICAKLSAgICAvKioKLSAgICAgKiBAcGFyYW1ldGVyIGV4cHJlc3Npb249Inhkb2MtdGFnLnZtIgotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIHRlbXBsYXRlVGFnOwotICAgIAotICAgIC8qKgotICAgICAqIEBzaW5jZSAxLjAuNAotICAgICAqIEBwYXJhbWV0ZXIgZXhwcmVzc2lvbj0ieGRvYy1mYWNlbGV0LXRhZy52bSIKLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyB0ZW1wbGF0ZUZhY2VsZXRUYWc7Ci0gICAgCi0gICAgLyoqCi0gICAgICogRGVmaW5lcyB0aGUganNmIHZlcnNpb24gKDEuMSwgMS4yIG9yIDIuMCksIHVzZWQgdG8gcGFzcyBpdCBhbmQgYWRkIGRlZmF1bHQgCi0gICAgICogcHJvcGVydGllcyBmb3IgY29udmVydGVycyBvciB2YWxpZGF0b3JzIGluIGpzZiAyLjAuCi0gICAgICogCi0gICAgICogQHBhcmFtZXRlcgotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIGpzZlZlcnNpb247Ci0KLSAgICBzdGF0aWMgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgX0RPQ19TVUJESVJFQ1RPUlkgPSAidGFnZG9jIjsKLQotICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbiwgTW9qb0ZhaWx1cmVFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGlmIChtb2RlbElkcyA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBtb2RlbElkcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgICAgIG1vZGVsSWRzLmFkZChwcm9qZWN0LmdldEFydGlmYWN0SWQoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGlmICh0YWdsaWJzID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRhZ2xpYnMgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICAgICAgdGFnbGlicy5wdXQoInQiLCAiaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy90b21haGF3ayIpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgX21vZGVsID0gSU9VdGlscy5sb2FkTW9kZWwobmV3IEZpbGUoYnVpbGREaXJlY3RvcnksCi0gICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhRmlsZSkpOwotICAgICAgICAgICAgbmV3IEZsYXR0ZW5lcihfbW9kZWwpLmZsYXR0ZW4oKTsgICAgICAgICAgICAKLSAgICAgICAgICAgIF9nZW5lcmF0ZVRhZ0RvY3MoKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uKCJDb3VsZG4ndCBnZW5lcmF0ZSB0YWdkb2MiLCBlKTsKLSAgICAgICAgfSAgICAgICAgCi0gICAgfQotICAgIAotICAgIHB1YmxpYyBib29sZWFuIGNhbkdlbmVyYXRlKENsYXNzTWV0YSBjb21wb25lbnQpCi0gICAgewotICAgICAgICBpZiAoIG1vZGVsSWRzLmNvbnRhaW5zKGNvbXBvbmVudC5nZXRNb2RlbElkKCkpKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgY2xhc3MgQ3VzdG9tUmVzb3VyY2VNYW5hZ2VySW1wbCBleHRlbmRzIFJlc291cmNlTWFuYWdlckltcGwKLSAgICB7Ci0gICAgICAgIHB1YmxpYyBDdXN0b21SZXNvdXJjZU1hbmFnZXJJbXBsKCkKLSAgICAgICAgewotICAgICAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIFZlbG9jaXR5RW5naW5lIGluaXRWZWxvY2l0eSgpIHRocm93cyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uCi0gICAgeyAgICAgICAgCi0gICAgICAgIFZlbG9jaXR5RW5naW5lIHZlbG9jaXR5RW5naW5lID0gbmV3IFZlbG9jaXR5RW5naW5lKCk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICB2ZWxvY2l0eUVuZ2luZS5zZXRQcm9wZXJ0eSggInJlc291cmNlLmxvYWRlciIsICJmaWxlLCBjbGFzcyIgKTsKLSAgICAgICAgICAgIHZlbG9jaXR5RW5naW5lLnNldFByb3BlcnR5KCAiZmlsZS5yZXNvdXJjZS5sb2FkZXIuY2xhc3MiLAotICAgICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS52ZWxvY2l0eS5ydW50aW1lLnJlc291cmNlLmxvYWRlci5GaWxlUmVzb3VyY2VMb2FkZXIiKTsKLSAgICAgICAgICAgIHZlbG9jaXR5RW5naW5lLnNldFByb3BlcnR5KCAiZmlsZS5yZXNvdXJjZS5sb2FkZXIucGF0aCIsIHRlbXBsYXRlU291cmNlRGlyZWN0b3J5LmdldFBhdGgoKSk7Ci0gICAgICAgICAgICB2ZWxvY2l0eUVuZ2luZS5zZXRQcm9wZXJ0eSggImNsYXNzLnJlc291cmNlLmxvYWRlci5jbGFzcyIsCi0gICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmJ1aWxkZXIudXRpbHMuUmVsYXRpdmVDbGFzc3BhdGhSZXNvdXJjZUxvYWRlciIgKTsKLSAgICAgICAgICAgIHZlbG9jaXR5RW5naW5lLnNldFByb3BlcnR5KCAiY2xhc3MucmVzb3VyY2UubG9hZGVyLnBhdGgiLCAiTUVUQS1JTkYiKTsgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgdmVsb2NpdHlFbmdpbmUuc2V0UHJvcGVydHkoICJ2ZWxvY2ltYWNyby5saWJyYXJ5IiwgImNvbXBvbmVudENsYXNzTWFjcm9zMTEudm0iKTsKLSAgICAgICAgICAgIHZlbG9jaXR5RW5naW5lLnNldFByb3BlcnR5KCAidmVsb2NpbWFjcm8ucGVybWlzc2lvbnMuYWxsb3cuaW5saW5lIiwidHJ1ZSIpOwotICAgICAgICAgICAgdmVsb2NpdHlFbmdpbmUuc2V0UHJvcGVydHkoICJ2ZWxvY2ltYWNyby5wZXJtaXNzaW9ucy5hbGxvdy5pbmxpbmUubG9jYWwuc2NvcGUiLCAidHJ1ZSIpOwotICAgICAgICAgICAgdmVsb2NpdHlFbmdpbmUuc2V0UHJvcGVydHkoICJkaXJlY3RpdmUuZm9yZWFjaC5jb3VudGVyLmluaXRpYWwudmFsdWUiLCIwIik7Ci0gICAgICAgICAgICAvL3ZlbG9jaXR5RW5naW5lLnNldFByb3BlcnR5KCBSdW50aW1lQ29uc3RhbnRzLlJVTlRJTUVfTE9HX0xPR1NZU1RFTV9DTEFTUywKLSAgICAgICAgICAgIC8vIm9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uYnVpbGRlci51dGlscy5Db25zb2xlTG9nU3lzdGVtIiApOwotCi0gICAgICAgICAgICB2ZWxvY2l0eUVuZ2luZS5zZXRQcm9wZXJ0eShSdW50aW1lQ29uc3RhbnRzLlJVTlRJTUVfTE9HX0xPR1NZU1RFTSwKLSAgICAgICAgICAgICAgICAgICAgbmV3IE1hdmVuUGx1Z2luQ29uc29sZUxvZ1N5c3RlbSh0aGlzLmdldExvZygpKSk7Ci0gICAgICAgICAgICB2ZWxvY2l0eUVuZ2luZS5pbml0KCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbigiRXJyb3IgY3JlYXRpbmcgVmVsb2NpdHlFbmdpbmUiLCBlKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIHZlbG9jaXR5RW5naW5lOwotICAgICAgICAgICAgICAgIAotICAgIH0KLSAgICAgICAgICAgIAotICAgIHByaXZhdGUgdm9pZCBfZ2VuZXJhdGVUYWdEb2NzKCkgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgTW9kZWwgbW9kZWwgPSBnZXRNb2RlbCgpOwotICAgICAgICBpZiAobW9kZWwuZ2V0Q29tcG9uZW50cygpLnNpemUoKSA9PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBnZXRMb2coKS5pbmZvKCJOb3RoaW5nIHRvIGdlbmVyYXRlIC0gbm8gY29tcG9uZW50cyBmb3VuZCIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBWZWxvY2l0eUVuZ2luZSB2ZWxvY2l0eUVuZ2luZSA9IGluaXRWZWxvY2l0eSgpOwotICAgICAgICAKLSAgICAgICAgVmVsb2NpdHlDb250ZXh0IGJhc2VDb250ZXh0ID0gbmV3IFZlbG9jaXR5Q29udGV4dCgpOwotICAgICAgICBiYXNlQ29udGV4dC5wdXQoInV0aWxzIiwgbmV3IE15ZmFjZXNVdGlscygpKTsKLSAgICAgICAgYmFzZUNvbnRleHQucHV0KCJ0YWdkb2NVdGlscyIsIG5ldyBUYWdkb2NVdGlscygpKTsKLSAgICAgICAgYmFzZUNvbnRleHQucHV0KCJtb2RlbCIsZ2V0TW9kZWwoKSk7Ci0gICAgICAgIGJhc2VDb250ZXh0LnB1dCgianNmMjAiLCBuZXcgQm9vbGVhbihfaXMyMCgpKSk7Ci0gICAgICAgIAotICAgICAgICBJdGVyYXRvciBjb21wb25lbnRzID0gbW9kZWwuY29tcG9uZW50cygpOwotCi0gICAgICAgIEl0ZXJhdG9yIHZhbGlkYXRvcnMgPSBtb2RlbC52YWxpZGF0b3JzKCk7Ci0KLSAgICAgICAgSXRlcmF0b3IgY29udmVydGVycyA9IG1vZGVsLmNvbnZlcnRlcnMoKTsKLSAgICAgICAgCi0gICAgICAgIEl0ZXJhdG9yIGJlaGF2aW9ycyA9IG1vZGVsLmJlaGF2aW9ycygpOwotICAgICAgICAKLSAgICAgICAgSXRlcmF0b3IgdGFncyA9IG1vZGVsLnRhZ3MoKTsKLSAgICAgICAgCi0gICAgICAgIEl0ZXJhdG9yIGZhY2VsZXRUYWdzID0gbW9kZWwuZmFjZWxldFRhZ3MoKTsKLQotICAgICAgICBTZXQgY29tcG9uZW50UGFnZXMgPSBuZXcgVHJlZVNldCgpOwotICAgICAgICBTZXQgY29udmVydGVyUGFnZXMgPSBuZXcgVHJlZVNldCgpOwotICAgICAgICBTZXQgdmFsaWRhdG9yUGFnZXMgPSBuZXcgVHJlZVNldCgpOwotICAgICAgICBTZXQgYmVoYXZpb3JQYWdlcyA9IG5ldyBUcmVlU2V0KCk7Ci0gICAgICAgIFNldCB0YWdzUGFnZXMgPSBuZXcgVHJlZVNldCgpOwotICAgICAgICBTZXQgZmFjZWxldFRhZ3NQYWdlcyA9IG5ldyBUcmVlU2V0KCk7Ci0KLSAgICAgICAgaW50IGNvdW50ID0gMDsKLSAgICAgICAgd2hpbGUgKGNvbXBvbmVudHMuaGFzTmV4dCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBDb21wb25lbnRNZXRhIGNvbXBvbmVudCA9IChDb21wb25lbnRNZXRhKSBjb21wb25lbnRzLm5leHQoKTsKLSAgICAgICAgICAgIGlmIChjYW5HZW5lcmF0ZShjb21wb25lbnQpKQotICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBTdHJpbmcgcGFnZU5hbWUgPSBfZ2VuZXJhdGVDb21wb25lbnREb2ModmVsb2NpdHlFbmdpbmUsYmFzZUNvbnRleHQsbW9kZWwsY29tcG9uZW50KTsKLSAgICAgICAgICAgICAgICBpZiAocGFnZU5hbWUgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudFBhZ2VzLmFkZChwYWdlTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIGNvdW50Kys7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHdoaWxlIChjb252ZXJ0ZXJzLmhhc05leHQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgQ29udmVydGVyTWV0YSBjb252ZXJ0ZXIgPSAoQ29udmVydGVyTWV0YSkgY29udmVydGVycy5uZXh0KCk7Ci0gICAgICAgICAgICBpZiAoY2FuR2VuZXJhdGUoY29udmVydGVyKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgcGFnZU5hbWUgPSBfZ2VuZXJhdGVDb252ZXJ0ZXJEb2ModmVsb2NpdHlFbmdpbmUsYmFzZUNvbnRleHQsbW9kZWwsY29udmVydGVyKTsKLSAgICAgICAgICAgICAgICBpZiAocGFnZU5hbWUgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnZlcnRlclBhZ2VzLmFkZChwYWdlTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIGNvdW50Kys7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHdoaWxlICh2YWxpZGF0b3JzLmhhc05leHQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgVmFsaWRhdG9yTWV0YSB2YWxpZGF0b3IgPSAoVmFsaWRhdG9yTWV0YSkgdmFsaWRhdG9ycy5uZXh0KCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChjYW5HZW5lcmF0ZSh2YWxpZGF0b3IpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFN0cmluZyBwYWdlTmFtZSA9IF9nZW5lcmF0ZVZhbGlkYXRvckRvYyh2ZWxvY2l0eUVuZ2luZSxiYXNlQ29udGV4dCxtb2RlbCx2YWxpZGF0b3IpOwotICAgICAgICAgICAgICAgIGlmIChwYWdlTmFtZSAhPSBudWxsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdmFsaWRhdG9yUGFnZXMuYWRkKHBhZ2VOYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgY291bnQrKzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgd2hpbGUgKGJlaGF2aW9ycy5oYXNOZXh0KCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEJlaGF2aW9yTWV0YSBiZWhhdmlvciA9IChCZWhhdmlvck1ldGEpIGJlaGF2aW9ycy5uZXh0KCk7Ci0gICAgICAgICAgICBpZiAoY2FuR2VuZXJhdGUoYmVoYXZpb3IpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFN0cmluZyBwYWdlTmFtZSA9IF9nZW5lcmF0ZUJlaGF2aW9yRG9jKHZlbG9jaXR5RW5naW5lLGJhc2VDb250ZXh0LG1vZGVsLGJlaGF2aW9yKTsKLSAgICAgICAgICAgICAgICBpZiAocGFnZU5hbWUgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGJlaGF2aW9yUGFnZXMuYWRkKHBhZ2VOYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgY291bnQrKzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgd2hpbGUgKHRhZ3MuaGFzTmV4dCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBUYWdNZXRhIHRhZyA9IChUYWdNZXRhKSB0YWdzLm5leHQoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKGNhbkdlbmVyYXRlKHRhZykpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHBhZ2VOYW1lID0gX2dlbmVyYXRlVGFnRG9jKHZlbG9jaXR5RW5naW5lLGJhc2VDb250ZXh0LG1vZGVsLHRhZyk7Ci0gICAgICAgICAgICAgICAgaWYgKHBhZ2VOYW1lICE9IG51bGwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0YWdzUGFnZXMuYWRkKHBhZ2VOYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgY291bnQrKzsKLSAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHdoaWxlIChmYWNlbGV0VGFncy5oYXNOZXh0KCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEZhY2VsZXRUYWdNZXRhIGZhY2VsZXRUYWcgPSAoRmFjZWxldFRhZ01ldGEpIGZhY2VsZXRUYWdzLm5leHQoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKGNhbkdlbmVyYXRlKGZhY2VsZXRUYWcpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFN0cmluZyBwYWdlTmFtZSA9IF9nZW5lcmF0ZUZhY2VsZXRUYWdEb2ModmVsb2NpdHlFbmdpbmUsYmFzZUNvbnRleHQsbW9kZWwsZmFjZWxldFRhZyk7Ci0gICAgICAgICAgICAgICAgaWYgKHBhZ2VOYW1lICE9IG51bGwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmYWNlbGV0VGFnc1BhZ2VzLmFkZChwYWdlTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIGNvdW50Kys7Ci0gICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIFNldCBvdGhlclBhZ2VzID0gX2dhdGhlck90aGVyVGFncygpOwotCi0gICAgICAgIGdldExvZygpLmluZm8oIkdlbmVyYXRlZCAiICsgY291bnQgKyAiIHBhZ2UocykiKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFNldCBfZ2F0aGVyT3RoZXJUYWdzKCkKLSAgICB7Ci0gICAgICAgIFRyZWVTZXQgc2V0ID0gbmV3IFRyZWVTZXQoKTsKLSAgICAgICAgU3RyaW5nIHN1YkRpciA9IF9wbGF0Zm9ybUFnbm9zdGljUGF0aChfcGxhdGZvcm1BZ25vc3RpY1BhdGgoInhkb2MvIgotICAgICAgICAgICAgICAgICsgX0RPQ19TVUJESVJFQ1RPUlkpKTsKLSAgICAgICAgRmlsZSBzaXRlU3ViRGlyID0gbmV3IEZpbGUoc2l0ZURpcmVjdG9yeSwgc3ViRGlyKTsKLSAgICAgICAgaWYgKHNpdGVTdWJEaXIuZXhpc3RzKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZ1tdIGZpbGVzID0gc2l0ZVN1YkRpci5saXN0KCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFN0cmluZyBmaWxlID0gZmlsZXNbaV07Ci0gICAgICAgICAgICAgICAgaWYgKGZpbGUuZW5kc1dpdGgoIi54bWwiKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHNldC5hZGQoZmlsZS5zdWJzdHJpbmcoMCwgZmlsZS5sZW5ndGgoKSAtIDQpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gc2V0OwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIHVzZVBhZ2VMaW5rQmFyKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBfdG9QYWdlTmFtZShTdHJpbmcgcU5hbWUpCi0gICAgewotICAgICAgICByZXR1cm4gTXlmYWNlc1V0aWxzLmdldFRhZ1ByZWZpeChxTmFtZSkgKyAiXyIgKyBNeWZhY2VzVXRpbHMuZ2V0VGFnTmFtZShxTmFtZSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgX2dlbmVyYXRlQ29tcG9uZW50RG9jKFZlbG9jaXR5RW5naW5lIHZlbG9jaXR5RW5naW5lLCAKLSAgICAgICAgICAgIFZlbG9jaXR5Q29udGV4dCBiYXNlQ29udGV4dCwgTW9kZWwgbW9kZWwsIENvbXBvbmVudE1ldGEgY29tcG9uZW50KQotICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgaWYgKGNvbXBvbmVudC5nZXROYW1lKCkgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgU3RyaW5nIHBhZ2VOYW1lID0gX3RvUGFnZU5hbWUoY29tcG9uZW50LmdldE5hbWUoKSk7Ci0gICAgICAgIAotICAgICAgICBDb250ZXh0IGNvbnRleHQgPSBuZXcgVmVsb2NpdHlDb250ZXh0KGJhc2VDb250ZXh0KTsKLSAgICAgICAgY29udGV4dC5wdXQoImNvbXBvbmVudCIsIGNvbXBvbmVudCk7Ci0gICAgICAgIGNvbnRleHQucHV0KCJqc2YyMCIsIG5ldyBCb29sZWFuKF9pczIwKCkpKTsKLSAgICAgICAgRmFjZWxldFRhZ01ldGEgZmFjZWxldFRhZyA9IG1vZGVsLmZpbmRGYWNlbGV0VGFnQnlOYW1lKGNvbXBvbmVudC5nZXROYW1lKCkpOwotICAgICAgICBpZiAoZmFjZWxldFRhZyA9PSBudWxsICYmIGNvbXBvbmVudC5nZXRUYWdIYW5kbGVyKCkgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgZmFjZWxldFRhZyA9IG1vZGVsLmZpbmRGYWNlbGV0VGFnQnlDbGFzc05hbWUoY29tcG9uZW50LmdldFRhZ0hhbmRsZXIoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGZhY2VsZXRUYWcgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgY29udGV4dC5wdXQoImZhY2VsZXRUYWciLCBmYWNlbGV0VGFnKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgU3RyaW5nIGJhc2VDb250ZW50ID0gIiI7Ci0gICAgICAgIAotICAgICAgICBGaWxlIHhtbEJhc2VGaWxlID0gbmV3IEZpbGUoYmFzZUZpbGVzU291cmNlRGlyZWN0b3J5LCAKLSAgICAgICAgICAgICAgICBfcGxhdGZvcm1BZ25vc3RpY1BhdGgocGFnZU5hbWUgKyAiLWJhc2UueG1sIikpOwotICAgICAgICAKLSAgICAgICAgaWYgKHhtbEJhc2VGaWxlICE9IG51bGwgJiYgeG1sQmFzZUZpbGUuZXhpc3RzKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChnZXRMb2coKS5pc0RlYnVnRW5hYmxlZCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGdldExvZygpLmRlYnVnKCJ1c2luZyBiYXNlIGNvbnRlbnQgZmlsZTogIit4bWxCYXNlRmlsZS5nZXRQYXRoKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBSZWFkZXIgcmVhZGVyID0gbnVsbDsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKHhtbEJhc2VGaWxlKTsKLSAgICAgICAgICAgICAgICBYcHAzRG9tIHJvb3QgPSBYcHAzRG9tQnVpbGRlci5idWlsZChyZWFkZXIpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIFN0cmluZ1dyaXRlciB3cml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgWHBwM0RvbSBbXSBjaGlsZHJlbiA9IHJvb3QuZ2V0Q2hpbGQoImJvZHkiKS5nZXRDaGlsZHJlbigpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFhwcDNEb20gZG9tID0gY2hpbGRyZW5baV07Ci0gICAgICAgICAgICAgICAgICAgIFhwcDNEb21Xcml0ZXIud3JpdGUod3JpdGVyLCBkb20pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBiYXNlQ29udGVudCA9IHdyaXRlci50b1N0cmluZygpOwotICAgICAgICAgICAgICAgIHdyaXRlci5jbG9zZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKFhtbFB1bGxQYXJzZXJFeGNlcHRpb24gZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICJFcnJvciBwYXJzaW5nIGJhc2UgZmlsZTogIiArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZpbmFsbHkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZWFkZXIuY2xvc2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgYmFzZUNvbnRleHQucHV0KCJiYXNlQ29udGVudCIsIGJhc2VDb250ZW50KTsgICAgICAgIAotICAgICAgICAKLSAgICAgICAgV3JpdGVyIG91dCA9IG51bGw7Ci0gICAgICAgIAotICAgICAgICB0cnkKLSAgICAgICAgeyAgICAgICAgCi0gICAgICAgICAgICBGaWxlIHRhcmdldERpciA9IG5ldyBGaWxlKG91dHB1dERpcmVjdG9yeS5nZXRQYXJlbnRGaWxlKCksCi0gICAgICAgICAgICAgICAgICAgIF9wbGF0Zm9ybUFnbm9zdGljUGF0aCgiZ2VuZXJhdGVkLXNpdGUveGRvYy8iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBfRE9DX1NVQkRJUkVDVE9SWSkpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoICF0YXJnZXREaXIuZXhpc3RzKCkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRhcmdldERpci5ta2RpcnMoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEZpbGUgdGFyZ2V0RmlsZSA9IG5ldyBGaWxlKHRhcmdldERpciwgcGFnZU5hbWUgKyAiLnhtbCIpOwotICAgIAotICAgICAgICAgICAgb3V0ID0gbmV3IE91dHB1dFN0cmVhbVdyaXRlcihuZXcgRmlsZU91dHB1dFN0cmVhbSh0YXJnZXRGaWxlKSwKLSAgICAgICAgICAgICAgICAgICAgIlVURi04Iik7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIFRlbXBsYXRlIHRlbXBsYXRlID0gdmVsb2NpdHlFbmdpbmUuZ2V0VGVtcGxhdGUoZ2V0VGVtcGxhdGVDb21wb25lbnQoKSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHRlbXBsYXRlLm1lcmdlKGNvbnRleHQsIG91dCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIG91dC5mbHVzaCgpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IE1vam9FeGVjdXRpb25FeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICJFcnJvciBtZXJnaW5nIHZlbG9jaXR5IHRlbXBsYXRlczogIiArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLSAgICAgICAgfQotICAgICAgICBmaW5hbGx5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIElPVXRpbC5jbG9zZShvdXQpOwotICAgICAgICAgICAgb3V0ID0gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBwYWdlTmFtZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBfZ2VuZXJhdGVDb252ZXJ0ZXJEb2MoVmVsb2NpdHlFbmdpbmUgdmVsb2NpdHlFbmdpbmUsIAotICAgICAgICAgICAgVmVsb2NpdHlDb250ZXh0IGJhc2VDb250ZXh0LCBNb2RlbCBtb2RlbCwgQ29udmVydGVyTWV0YSBjb252ZXJ0ZXIpCi0gICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBpZiAoY29udmVydGVyLmdldE5hbWUoKSA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyBwYWdlTmFtZSA9IF90b1BhZ2VOYW1lKGNvbnZlcnRlci5nZXROYW1lKCkpOwotICAgICAgICAKLSAgICAgICAgQ29udGV4dCBjb250ZXh0ID0gbmV3IFZlbG9jaXR5Q29udGV4dChiYXNlQ29udGV4dCk7Ci0gICAgICAgIGNvbnRleHQucHV0KCJjb252ZXJ0ZXIiLCBjb252ZXJ0ZXIpOwotICAgICAgICBjb250ZXh0LnB1dCgianNmMjAiLCBuZXcgQm9vbGVhbihfaXMyMCgpKSk7Ci0gICAgICAgIEZhY2VsZXRUYWdNZXRhIGZhY2VsZXRUYWcgPSBtb2RlbC5maW5kRmFjZWxldFRhZ0J5TmFtZShjb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLSAgICAgICAgaWYgKGZhY2VsZXRUYWcgPT0gbnVsbCAmJiBjb252ZXJ0ZXIuZ2V0VGFnSGFuZGxlcigpICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZhY2VsZXRUYWcgPSBtb2RlbC5maW5kRmFjZWxldFRhZ0J5Q2xhc3NOYW1lKGNvbnZlcnRlci5nZXRUYWdIYW5kbGVyKCkpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChmYWNlbGV0VGFnICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNvbnRleHQucHV0KCJmYWNlbGV0VGFnIiwgZmFjZWxldFRhZyk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIFN0cmluZyBiYXNlQ29udGVudCA9ICIiOwotICAgICAgICAKLSAgICAgICAgRmlsZSB4bWxCYXNlRmlsZSA9IG5ldyBGaWxlKGJhc2VGaWxlc1NvdXJjZURpcmVjdG9yeSwgCi0gICAgICAgICAgICAgICAgX3BsYXRmb3JtQWdub3N0aWNQYXRoKHBhZ2VOYW1lICsgIi1iYXNlLnhtbCIpKTsKLSAgICAgICAgCi0gICAgICAgIGlmICh4bWxCYXNlRmlsZSAhPSBudWxsICYmIHhtbEJhc2VGaWxlLmV4aXN0cygpKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoZ2V0TG9nKCkuaXNEZWJ1Z0VuYWJsZWQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBnZXRMb2coKS5kZWJ1ZygidXNpbmcgYmFzZSBjb250ZW50IGZpbGU6ICIreG1sQmFzZUZpbGUuZ2V0UGF0aCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgUmVhZGVyIHJlYWRlciA9IG51bGw7Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcih4bWxCYXNlRmlsZSk7Ci0gICAgICAgICAgICAgICAgWHBwM0RvbSByb290ID0gWHBwM0RvbUJ1aWxkZXIuYnVpbGQocmVhZGVyKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBTdHJpbmdXcml0ZXIgd3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIFhwcDNEb20gW10gY2hpbGRyZW4gPSByb290LmdldENoaWxkKCJib2R5IikuZ2V0Q2hpbGRyZW4oKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaTwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBYcHAzRG9tIGRvbSA9IGNoaWxkcmVuW2ldOwotICAgICAgICAgICAgICAgICAgICBYcHAzRG9tV3JpdGVyLndyaXRlKHdyaXRlciwgZG9tKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYmFzZUNvbnRlbnQgPSB3cml0ZXIudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICB3cml0ZXIuY2xvc2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChYbWxQdWxsUGFyc2VyRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IE1vam9FeGVjdXRpb25FeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAiRXJyb3IgcGFyc2luZyBiYXNlIGZpbGU6ICIgKyBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmaW5hbGx5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmVhZGVyLmNsb3NlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGJhc2VDb250ZXh0LnB1dCgiYmFzZUNvbnRlbnQiLCBiYXNlQ29udGVudCk7ICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIFdyaXRlciBvdXQgPSBudWxsOwotICAgICAgICAKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsgICAgICAgIAotICAgICAgICAgICAgRmlsZSB0YXJnZXREaXIgPSBuZXcgRmlsZShvdXRwdXREaXJlY3RvcnkuZ2V0UGFyZW50RmlsZSgpLAotICAgICAgICAgICAgICAgICAgICBfcGxhdGZvcm1BZ25vc3RpY1BhdGgoImdlbmVyYXRlZC1zaXRlL3hkb2MvIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgX0RPQ19TVUJESVJFQ1RPUlkpKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKCAhdGFyZ2V0RGlyLmV4aXN0cygpICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0YXJnZXREaXIubWtkaXJzKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBGaWxlIHRhcmdldEZpbGUgPSBuZXcgRmlsZSh0YXJnZXREaXIsIHBhZ2VOYW1lICsgIi54bWwiKTsKLSAgICAKLSAgICAgICAgICAgIG91dCA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIobmV3IEZpbGVPdXRwdXRTdHJlYW0odGFyZ2V0RmlsZSksCi0gICAgICAgICAgICAgICAgICAgICJVVEYtOCIpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBUZW1wbGF0ZSB0ZW1wbGF0ZSA9IHZlbG9jaXR5RW5naW5lLmdldFRlbXBsYXRlKGdldFRlbXBsYXRlQ29udmVydGVyKCkpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICB0ZW1wbGF0ZS5tZXJnZShjb250ZXh0LCBvdXQpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBvdXQuZmx1c2goKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAiRXJyb3IgbWVyZ2luZyB2ZWxvY2l0eSB0ZW1wbGF0ZXM6ICIgKyBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxseQotICAgICAgICB7Ci0gICAgICAgICAgICBJT1V0aWwuY2xvc2Uob3V0KTsKLSAgICAgICAgICAgIG91dCA9IG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcGFnZU5hbWU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgX2dlbmVyYXRlVmFsaWRhdG9yRG9jKFZlbG9jaXR5RW5naW5lIHZlbG9jaXR5RW5naW5lLCAKLSAgICAgICAgICAgIFZlbG9jaXR5Q29udGV4dCBiYXNlQ29udGV4dCwgTW9kZWwgbW9kZWwsIFZhbGlkYXRvck1ldGEgdmFsaWRhdG9yKQotICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgaWYgKHZhbGlkYXRvci5nZXROYW1lKCkgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgcGFnZU5hbWUgPSBfdG9QYWdlTmFtZSh2YWxpZGF0b3IuZ2V0TmFtZSgpKTsKLSAgICAgICAgCi0gICAgICAgIENvbnRleHQgY29udGV4dCA9IG5ldyBWZWxvY2l0eUNvbnRleHQoYmFzZUNvbnRleHQpOwotICAgICAgICBjb250ZXh0LnB1dCgidmFsaWRhdG9yIiwgdmFsaWRhdG9yKTsKLSAgICAgICAgY29udGV4dC5wdXQoImpzZjIwIiwgbmV3IEJvb2xlYW4oX2lzMjAoKSkpOwotICAgICAgICBGYWNlbGV0VGFnTWV0YSBmYWNlbGV0VGFnID0gbW9kZWwuZmluZEZhY2VsZXRUYWdCeU5hbWUodmFsaWRhdG9yLmdldE5hbWUoKSk7Ci0gICAgICAgIGlmIChmYWNlbGV0VGFnID09IG51bGwgJiYgdmFsaWRhdG9yLmdldFRhZ0hhbmRsZXIoKSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBmYWNlbGV0VGFnID0gbW9kZWwuZmluZEZhY2VsZXRUYWdCeUNsYXNzTmFtZSh2YWxpZGF0b3IuZ2V0VGFnSGFuZGxlcigpKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZmFjZWxldFRhZyAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBjb250ZXh0LnB1dCgiZmFjZWxldFRhZyIsIGZhY2VsZXRUYWcpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBTdHJpbmcgYmFzZUNvbnRlbnQgPSAiIjsKLSAgICAgICAgCi0gICAgICAgIEZpbGUgeG1sQmFzZUZpbGUgPSBuZXcgRmlsZShiYXNlRmlsZXNTb3VyY2VEaXJlY3RvcnksIAotICAgICAgICAgICAgICAgIF9wbGF0Zm9ybUFnbm9zdGljUGF0aChwYWdlTmFtZSArICItYmFzZS54bWwiKSk7Ci0gICAgICAgIAotICAgICAgICBpZiAoeG1sQmFzZUZpbGUgIT0gbnVsbCAmJiB4bWxCYXNlRmlsZS5leGlzdHMoKSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGdldExvZygpLmlzRGVidWdFbmFibGVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZ2V0TG9nKCkuZGVidWcoInVzaW5nIGJhc2UgY29udGVudCBmaWxlOiAiK3htbEJhc2VGaWxlLmdldFBhdGgoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIFJlYWRlciByZWFkZXIgPSBudWxsOwotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoeG1sQmFzZUZpbGUpOwotICAgICAgICAgICAgICAgIFhwcDNEb20gcm9vdCA9IFhwcDNEb21CdWlsZGVyLmJ1aWxkKHJlYWRlcik7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgU3RyaW5nV3JpdGVyIHdyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBYcHAzRG9tIFtdIGNoaWxkcmVuID0gcm9vdC5nZXRDaGlsZCgiYm9keSIpLmdldENoaWxkcmVuKCk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGk8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgWHBwM0RvbSBkb20gPSBjaGlsZHJlbltpXTsKLSAgICAgICAgICAgICAgICAgICAgWHBwM0RvbVdyaXRlci53cml0ZSh3cml0ZXIsIGRvbSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJhc2VDb250ZW50ID0gd3JpdGVyLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgd3JpdGVyLmNsb3NlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoWG1sUHVsbFBhcnNlckV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgIkVycm9yIHBhcnNpbmcgYmFzZSBmaWxlOiAiICsgZS5nZXRNZXNzYWdlKCksIGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZmluYWxseQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJlYWRlci5jbG9zZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBiYXNlQ29udGV4dC5wdXQoImJhc2VDb250ZW50IiwgYmFzZUNvbnRlbnQpOyAgICAgICAgCi0gICAgICAgIAotICAgICAgICBXcml0ZXIgb3V0ID0gbnVsbDsKLSAgICAgICAgCi0gICAgICAgIHRyeQotICAgICAgICB7ICAgICAgICAKLSAgICAgICAgICAgIEZpbGUgdGFyZ2V0RGlyID0gbmV3IEZpbGUob3V0cHV0RGlyZWN0b3J5LmdldFBhcmVudEZpbGUoKSwKLSAgICAgICAgICAgICAgICAgICAgX3BsYXRmb3JtQWdub3N0aWNQYXRoKCJnZW5lcmF0ZWQtc2l0ZS94ZG9jLyIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArIF9ET0NfU1VCRElSRUNUT1JZKSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmICggIXRhcmdldERpci5leGlzdHMoKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGFyZ2V0RGlyLm1rZGlycygpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgRmlsZSB0YXJnZXRGaWxlID0gbmV3IEZpbGUodGFyZ2V0RGlyLCBwYWdlTmFtZSArICIueG1sIik7Ci0gICAgCi0gICAgICAgICAgICBvdXQgPSBuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKG5ldyBGaWxlT3V0cHV0U3RyZWFtKHRhcmdldEZpbGUpLAotICAgICAgICAgICAgICAgICAgICAiVVRGLTgiKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgVGVtcGxhdGUgdGVtcGxhdGUgPSB2ZWxvY2l0eUVuZ2luZS5nZXRUZW1wbGF0ZShnZXRUZW1wbGF0ZVZhbGlkYXRvcigpKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgdGVtcGxhdGUubWVyZ2UoY29udGV4dCwgb3V0KTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgb3V0LmZsdXNoKCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgIkVycm9yIG1lcmdpbmcgdmVsb2NpdHkgdGVtcGxhdGVzOiAiICsgZS5nZXRNZXNzYWdlKCksIGUpOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsbHkKLSAgICAgICAgewotICAgICAgICAgICAgSU9VdGlsLmNsb3NlKG91dCk7Ci0gICAgICAgICAgICBvdXQgPSBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHBhZ2VOYW1lOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIFN0cmluZyBfZ2VuZXJhdGVCZWhhdmlvckRvYyhWZWxvY2l0eUVuZ2luZSB2ZWxvY2l0eUVuZ2luZSwgCi0gICAgICAgICAgICBWZWxvY2l0eUNvbnRleHQgYmFzZUNvbnRleHQsIE1vZGVsIG1vZGVsLCBCZWhhdmlvck1ldGEgYmVoYXZpb3IpCi0gICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBpZiAoYmVoYXZpb3IuZ2V0TmFtZSgpID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIHBhZ2VOYW1lID0gX3RvUGFnZU5hbWUoYmVoYXZpb3IuZ2V0TmFtZSgpKTsKLSAgICAgICAgCi0gICAgICAgIENvbnRleHQgY29udGV4dCA9IG5ldyBWZWxvY2l0eUNvbnRleHQoYmFzZUNvbnRleHQpOwotICAgICAgICBjb250ZXh0LnB1dCgiYmVoYXZpb3IiLCBiZWhhdmlvcik7Ci0gICAgICAgIGNvbnRleHQucHV0KCJqc2YyMCIsIG5ldyBCb29sZWFuKF9pczIwKCkpKTsKLSAgICAgICAgRmFjZWxldFRhZ01ldGEgZmFjZWxldFRhZyA9IG1vZGVsLmZpbmRGYWNlbGV0VGFnQnlOYW1lKGJlaGF2aW9yLmdldE5hbWUoKSk7Ci0gICAgICAgIGlmIChmYWNlbGV0VGFnICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNvbnRleHQucHV0KCJmYWNlbGV0VGFnIiwgZmFjZWxldFRhZyk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIFN0cmluZyBiYXNlQ29udGVudCA9ICIiOwotICAgICAgICAKLSAgICAgICAgRmlsZSB4bWxCYXNlRmlsZSA9IG5ldyBGaWxlKGJhc2VGaWxlc1NvdXJjZURpcmVjdG9yeSwgCi0gICAgICAgICAgICAgICAgX3BsYXRmb3JtQWdub3N0aWNQYXRoKHBhZ2VOYW1lICsgIi1iYXNlLnhtbCIpKTsKLSAgICAgICAgCi0gICAgICAgIGlmICh4bWxCYXNlRmlsZSAhPSBudWxsICYmIHhtbEJhc2VGaWxlLmV4aXN0cygpKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoZ2V0TG9nKCkuaXNEZWJ1Z0VuYWJsZWQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBnZXRMb2coKS5kZWJ1ZygidXNpbmcgYmFzZSBjb250ZW50IGZpbGU6ICIreG1sQmFzZUZpbGUuZ2V0UGF0aCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgUmVhZGVyIHJlYWRlciA9IG51bGw7Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcih4bWxCYXNlRmlsZSk7Ci0gICAgICAgICAgICAgICAgWHBwM0RvbSByb290ID0gWHBwM0RvbUJ1aWxkZXIuYnVpbGQocmVhZGVyKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBTdHJpbmdXcml0ZXIgd3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIFhwcDNEb20gW10gY2hpbGRyZW4gPSByb290LmdldENoaWxkKCJib2R5IikuZ2V0Q2hpbGRyZW4oKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaTwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBYcHAzRG9tIGRvbSA9IGNoaWxkcmVuW2ldOwotICAgICAgICAgICAgICAgICAgICBYcHAzRG9tV3JpdGVyLndyaXRlKHdyaXRlciwgZG9tKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYmFzZUNvbnRlbnQgPSB3cml0ZXIudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICB3cml0ZXIuY2xvc2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChYbWxQdWxsUGFyc2VyRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IE1vam9FeGVjdXRpb25FeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAiRXJyb3IgcGFyc2luZyBiYXNlIGZpbGU6ICIgKyBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmaW5hbGx5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmVhZGVyLmNsb3NlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGJhc2VDb250ZXh0LnB1dCgiYmFzZUNvbnRlbnQiLCBiYXNlQ29udGVudCk7ICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIFdyaXRlciBvdXQgPSBudWxsOwotICAgICAgICAKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsgICAgICAgIAotICAgICAgICAgICAgRmlsZSB0YXJnZXREaXIgPSBuZXcgRmlsZShvdXRwdXREaXJlY3RvcnkuZ2V0UGFyZW50RmlsZSgpLAotICAgICAgICAgICAgICAgICAgICBfcGxhdGZvcm1BZ25vc3RpY1BhdGgoImdlbmVyYXRlZC1zaXRlL3hkb2MvIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgX0RPQ19TVUJESVJFQ1RPUlkpKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKCAhdGFyZ2V0RGlyLmV4aXN0cygpICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0YXJnZXREaXIubWtkaXJzKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBGaWxlIHRhcmdldEZpbGUgPSBuZXcgRmlsZSh0YXJnZXREaXIsIHBhZ2VOYW1lICsgIi54bWwiKTsKLSAgICAKLSAgICAgICAgICAgIG91dCA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIobmV3IEZpbGVPdXRwdXRTdHJlYW0odGFyZ2V0RmlsZSksCi0gICAgICAgICAgICAgICAgICAgICJVVEYtOCIpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBUZW1wbGF0ZSB0ZW1wbGF0ZSA9IHZlbG9jaXR5RW5naW5lLmdldFRlbXBsYXRlKGdldFRlbXBsYXRlQmVoYXZpb3IoKSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHRlbXBsYXRlLm1lcmdlKGNvbnRleHQsIG91dCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIG91dC5mbHVzaCgpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IE1vam9FeGVjdXRpb25FeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICJFcnJvciBtZXJnaW5nIHZlbG9jaXR5IHRlbXBsYXRlczogIiArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLSAgICAgICAgfQotICAgICAgICBmaW5hbGx5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIElPVXRpbC5jbG9zZShvdXQpOwotICAgICAgICAgICAgb3V0ID0gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBwYWdlTmFtZTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBTdHJpbmcgX2dlbmVyYXRlVGFnRG9jKFZlbG9jaXR5RW5naW5lIHZlbG9jaXR5RW5naW5lLCAKLSAgICAgICAgICAgIFZlbG9jaXR5Q29udGV4dCBiYXNlQ29udGV4dCwgTW9kZWwgbW9kZWwsIFRhZ01ldGEgdGFnKQotICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgaWYgKHRhZy5nZXROYW1lKCkgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgcGFnZU5hbWUgPSBfdG9QYWdlTmFtZSh0YWcuZ2V0TmFtZSgpKTsKLSAgICAgICAgCi0gICAgICAgIENvbnRleHQgY29udGV4dCA9IG5ldyBWZWxvY2l0eUNvbnRleHQoYmFzZUNvbnRleHQpOwotICAgICAgICBjb250ZXh0LnB1dCgidGFnIiwgdGFnKTsKLSAgICAgICAgY29udGV4dC5wdXQoImpzZjIwIiwgbmV3IEJvb2xlYW4oX2lzMjAoKSkpOwotICAgICAgICBGYWNlbGV0VGFnTWV0YSBmYWNlbGV0VGFnID0gbW9kZWwuZmluZEZhY2VsZXRUYWdCeU5hbWUodGFnLmdldE5hbWUoKSk7Ci0gICAgICAgIGlmIChmYWNlbGV0VGFnID09IG51bGwgJiYgdGFnLmdldFRhZ0hhbmRsZXIoKSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBmYWNlbGV0VGFnID0gbW9kZWwuZmluZEZhY2VsZXRUYWdCeUNsYXNzTmFtZSh0YWcuZ2V0VGFnSGFuZGxlcigpKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZmFjZWxldFRhZyAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBjb250ZXh0LnB1dCgiZmFjZWxldFRhZyIsIGZhY2VsZXRUYWcpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBTdHJpbmcgYmFzZUNvbnRlbnQgPSAiIjsKLSAgICAgICAgCi0gICAgICAgIEZpbGUgeG1sQmFzZUZpbGUgPSBuZXcgRmlsZShiYXNlRmlsZXNTb3VyY2VEaXJlY3RvcnksIAotICAgICAgICAgICAgICAgIF9wbGF0Zm9ybUFnbm9zdGljUGF0aChwYWdlTmFtZSArICItYmFzZS54bWwiKSk7Ci0gICAgICAgIAotICAgICAgICBpZiAoeG1sQmFzZUZpbGUgIT0gbnVsbCAmJiB4bWxCYXNlRmlsZS5leGlzdHMoKSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGdldExvZygpLmlzRGVidWdFbmFibGVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZ2V0TG9nKCkuZGVidWcoInVzaW5nIGJhc2UgY29udGVudCBmaWxlOiAiK3htbEJhc2VGaWxlLmdldFBhdGgoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIFJlYWRlciByZWFkZXIgPSBudWxsOwotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoeG1sQmFzZUZpbGUpOwotICAgICAgICAgICAgICAgIFhwcDNEb20gcm9vdCA9IFhwcDNEb21CdWlsZGVyLmJ1aWxkKHJlYWRlcik7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgU3RyaW5nV3JpdGVyIHdyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBYcHAzRG9tIFtdIGNoaWxkcmVuID0gcm9vdC5nZXRDaGlsZCgiYm9keSIpLmdldENoaWxkcmVuKCk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGk8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgWHBwM0RvbSBkb20gPSBjaGlsZHJlbltpXTsKLSAgICAgICAgICAgICAgICAgICAgWHBwM0RvbVdyaXRlci53cml0ZSh3cml0ZXIsIGRvbSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJhc2VDb250ZW50ID0gd3JpdGVyLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgd3JpdGVyLmNsb3NlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoWG1sUHVsbFBhcnNlckV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgIkVycm9yIHBhcnNpbmcgYmFzZSBmaWxlOiAiICsgZS5nZXRNZXNzYWdlKCksIGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZmluYWxseQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJlYWRlci5jbG9zZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBiYXNlQ29udGV4dC5wdXQoImJhc2VDb250ZW50IiwgYmFzZUNvbnRlbnQpOyAgICAgICAgCi0gICAgICAgIAotICAgICAgICBXcml0ZXIgb3V0ID0gbnVsbDsKLSAgICAgICAgCi0gICAgICAgIHRyeQotICAgICAgICB7ICAgICAgICAKLSAgICAgICAgICAgIEZpbGUgdGFyZ2V0RGlyID0gbmV3IEZpbGUob3V0cHV0RGlyZWN0b3J5LmdldFBhcmVudEZpbGUoKSwKLSAgICAgICAgICAgICAgICAgICAgX3BsYXRmb3JtQWdub3N0aWNQYXRoKCJnZW5lcmF0ZWQtc2l0ZS94ZG9jLyIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArIF9ET0NfU1VCRElSRUNUT1JZKSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmICggIXRhcmdldERpci5leGlzdHMoKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGFyZ2V0RGlyLm1rZGlycygpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgRmlsZSB0YXJnZXRGaWxlID0gbmV3IEZpbGUodGFyZ2V0RGlyLCBwYWdlTmFtZSArICIueG1sIik7Ci0gICAgCi0gICAgICAgICAgICBvdXQgPSBuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKG5ldyBGaWxlT3V0cHV0U3RyZWFtKHRhcmdldEZpbGUpLAotICAgICAgICAgICAgICAgICAgICAiVVRGLTgiKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgVGVtcGxhdGUgdGVtcGxhdGUgPSB2ZWxvY2l0eUVuZ2luZS5nZXRUZW1wbGF0ZShnZXRUZW1wbGF0ZVRhZygpKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgdGVtcGxhdGUubWVyZ2UoY29udGV4dCwgb3V0KTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgb3V0LmZsdXNoKCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgIkVycm9yIG1lcmdpbmcgdmVsb2NpdHkgdGVtcGxhdGVzOiAiICsgZS5nZXRNZXNzYWdlKCksIGUpOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsbHkKLSAgICAgICAgewotICAgICAgICAgICAgSU9VdGlsLmNsb3NlKG91dCk7Ci0gICAgICAgICAgICBvdXQgPSBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHBhZ2VOYW1lOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIFN0cmluZyBfZ2VuZXJhdGVGYWNlbGV0VGFnRG9jKFZlbG9jaXR5RW5naW5lIHZlbG9jaXR5RW5naW5lLCAKLSAgICAgICAgICAgIFZlbG9jaXR5Q29udGV4dCBiYXNlQ29udGV4dCwgTW9kZWwgbW9kZWwsIEZhY2VsZXRUYWdNZXRhIGZhY2VsZXRUYWcpCi0gICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBTdHJpbmcgbmFtZSA9IGZhY2VsZXRUYWcuZ2V0TmFtZSgpOyAKLSAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGlmIChmYWNlbGV0VGFnLmdldENvbXBvbmVudENsYXNzKCkgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgQ29tcG9uZW50TWV0YSBjb21wID0gbW9kZWwuZmluZENvbXBvbmVudEJ5Q2xhc3NOYW1lKGZhY2VsZXRUYWcuZ2V0Q29tcG9uZW50Q2xhc3MoKSk7Ci0gICAgICAgICAgICBpZiAobmFtZS5lcXVhbHMoY29tcC5nZXROYW1lKCkpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vRXhpc3RzIGluIGpzcCBhbmQgaW4gZmFjZWxldHMsIGJ1dCBoYXMgc3BlY2lmaWMgZmFjZWxldHMgcHJvcGVydGllcwotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChmYWNlbGV0VGFnLmdldENvbnZlcnRlckNsYXNzKCkgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgQ29udmVydGVyTWV0YSBjb21wID0gbW9kZWwuZmluZENvbnZlcnRlckJ5Q2xhc3NOYW1lKGZhY2VsZXRUYWcuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0gICAgICAgICAgICBpZiAobmFtZS5lcXVhbHMoY29tcC5nZXROYW1lKCkpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vRXhpc3RzIGluIGpzcCBhbmQgaW4gZmFjZWxldHMsIGJ1dCBoYXMgc3BlY2lmaWMgZmFjZWxldHMgcHJvcGVydGllcwotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfSAgICAgICAgICAgIAotICAgICAgICB9Ci0gICAgICAgIGlmIChmYWNlbGV0VGFnLmdldFZhbGlkYXRvckNsYXNzKCkgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgVmFsaWRhdG9yTWV0YSBjb21wID0gbW9kZWwuZmluZFZhbGlkYXRvckJ5Q2xhc3NOYW1lKGZhY2VsZXRUYWcuZ2V0VmFsaWRhdG9yQ2xhc3MoKSk7Ci0gICAgICAgICAgICBpZiAobmFtZS5lcXVhbHMoY29tcC5nZXROYW1lKCkpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vRXhpc3RzIGluIGpzcCBhbmQgaW4gZmFjZWxldHMsIGJ1dCBoYXMgc3BlY2lmaWMgZmFjZWxldHMgcHJvcGVydGllcwotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfSAgICAgICAgICAgIAotICAgICAgICB9Ci0gICAgICAgIGlmIChmYWNlbGV0VGFnLmdldEJlaGF2aW9yQ2xhc3MoKSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBCZWhhdmlvck1ldGEgY29tcCA9IG1vZGVsLmZpbmRCZWhhdmlvckJ5Q2xhc3NOYW1lKGZhY2VsZXRUYWcuZ2V0QmVoYXZpb3JDbGFzcygpKTsKLSAgICAgICAgICAgIGlmIChuYW1lLmVxdWFscyhjb21wLmdldE5hbWUoKSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy9FeGlzdHMgaW4ganNwIGFuZCBpbiBmYWNlbGV0cywgYnV0IGhhcyBzcGVjaWZpYyBmYWNlbGV0cyBwcm9wZXJ0aWVzCi0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGZhY2VsZXRUYWcuZ2V0VGFnQ2xhc3MoKSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBUYWdNZXRhIGNvbXAgPSBtb2RlbC5maW5kVGFnQnlDbGFzc05hbWUoZmFjZWxldFRhZy5nZXRUYWdDbGFzcygpKTsKLSAgICAgICAgICAgIGlmIChuYW1lLmVxdWFscyhjb21wLmdldE5hbWUoKSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy9FeGlzdHMgaW4ganNwIGFuZCBpbiBmYWNlbGV0cywgYnV0IGhhcyBzcGVjaWZpYyBmYWNlbGV0cyBwcm9wZXJ0aWVzCi0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgcGFnZU5hbWUgPSBfdG9QYWdlTmFtZShmYWNlbGV0VGFnLmdldE5hbWUoKSk7Ci0gICAgICAgIAotICAgICAgICBDb250ZXh0IGNvbnRleHQgPSBuZXcgVmVsb2NpdHlDb250ZXh0KGJhc2VDb250ZXh0KTsKLSAgICAgICAgY29udGV4dC5wdXQoImZhY2VsZXRUYWciLCBmYWNlbGV0VGFnKTsKLSAgICAgICAgY29udGV4dC5wdXQoImpzZjIwIiwgbmV3IEJvb2xlYW4oX2lzMjAoKSkpOwotICAgICAgICAKLSAgICAgICAgU3RyaW5nIGJhc2VDb250ZW50ID0gIiI7Ci0gICAgICAgIAotICAgICAgICBGaWxlIHhtbEJhc2VGaWxlID0gbmV3IEZpbGUoYmFzZUZpbGVzU291cmNlRGlyZWN0b3J5LCAKLSAgICAgICAgICAgICAgICBfcGxhdGZvcm1BZ25vc3RpY1BhdGgocGFnZU5hbWUgKyAiLWJhc2UueG1sIikpOwotICAgICAgICAKLSAgICAgICAgaWYgKHhtbEJhc2VGaWxlICE9IG51bGwgJiYgeG1sQmFzZUZpbGUuZXhpc3RzKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChnZXRMb2coKS5pc0RlYnVnRW5hYmxlZCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGdldExvZygpLmRlYnVnKCJ1c2luZyBiYXNlIGNvbnRlbnQgZmlsZTogIit4bWxCYXNlRmlsZS5nZXRQYXRoKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBSZWFkZXIgcmVhZGVyID0gbnVsbDsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKHhtbEJhc2VGaWxlKTsKLSAgICAgICAgICAgICAgICBYcHAzRG9tIHJvb3QgPSBYcHAzRG9tQnVpbGRlci5idWlsZChyZWFkZXIpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIFN0cmluZ1dyaXRlciB3cml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgWHBwM0RvbSBbXSBjaGlsZHJlbiA9IHJvb3QuZ2V0Q2hpbGQoImJvZHkiKS5nZXRDaGlsZHJlbigpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFhwcDNEb20gZG9tID0gY2hpbGRyZW5baV07Ci0gICAgICAgICAgICAgICAgICAgIFhwcDNEb21Xcml0ZXIud3JpdGUod3JpdGVyLCBkb20pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBiYXNlQ29udGVudCA9IHdyaXRlci50b1N0cmluZygpOwotICAgICAgICAgICAgICAgIHdyaXRlci5jbG9zZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKFhtbFB1bGxQYXJzZXJFeGNlcHRpb24gZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICJFcnJvciBwYXJzaW5nIGJhc2UgZmlsZTogIiArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZpbmFsbHkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZWFkZXIuY2xvc2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgYmFzZUNvbnRleHQucHV0KCJiYXNlQ29udGVudCIsIGJhc2VDb250ZW50KTsgICAgICAgIAotICAgICAgICAKLSAgICAgICAgV3JpdGVyIG91dCA9IG51bGw7Ci0gICAgICAgIAotICAgICAgICB0cnkKLSAgICAgICAgeyAgICAgICAgCi0gICAgICAgICAgICBGaWxlIHRhcmdldERpciA9IG5ldyBGaWxlKG91dHB1dERpcmVjdG9yeS5nZXRQYXJlbnRGaWxlKCksCi0gICAgICAgICAgICAgICAgICAgIF9wbGF0Zm9ybUFnbm9zdGljUGF0aCgiZ2VuZXJhdGVkLXNpdGUveGRvYy8iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBfRE9DX1NVQkRJUkVDVE9SWSkpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoICF0YXJnZXREaXIuZXhpc3RzKCkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRhcmdldERpci5ta2RpcnMoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEZpbGUgdGFyZ2V0RmlsZSA9IG5ldyBGaWxlKHRhcmdldERpciwgcGFnZU5hbWUgKyAiLnhtbCIpOwotICAgIAotICAgICAgICAgICAgb3V0ID0gbmV3IE91dHB1dFN0cmVhbVdyaXRlcihuZXcgRmlsZU91dHB1dFN0cmVhbSh0YXJnZXRGaWxlKSwKLSAgICAgICAgICAgICAgICAgICAgIlVURi04Iik7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIFRlbXBsYXRlIHRlbXBsYXRlID0gdmVsb2NpdHlFbmdpbmUuZ2V0VGVtcGxhdGUoZ2V0VGVtcGxhdGVGYWNlbGV0VGFnKCkpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICB0ZW1wbGF0ZS5tZXJnZShjb250ZXh0LCBvdXQpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBvdXQuZmx1c2goKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAiRXJyb3IgbWVyZ2luZyB2ZWxvY2l0eSB0ZW1wbGF0ZXM6ICIgKyBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxseQotICAgICAgICB7Ci0gICAgICAgICAgICBJT1V0aWwuY2xvc2Uob3V0KTsKLSAgICAgICAgICAgIG91dCA9IG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcGFnZU5hbWU7Ci0gICAgfSAgICAKLQotICAgIHN0YXRpYyBwcml2YXRlIGZpbmFsIFN0cmluZyBfcGxhdGZvcm1BZ25vc3RpY1BhdGgoU3RyaW5nIHBhdGgpCi0gICAgewotICAgICAgICByZXR1cm4gcGF0aC5yZXBsYWNlKCcvJywgRmlsZS5zZXBhcmF0b3JDaGFyKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgTWF2ZW5Qcm9qZWN0IGdldFByb2plY3QoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHByb2plY3Q7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRPdXRwdXREaXJlY3RvcnkoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG91dHB1dERpcmVjdG9yeS5nZXRBYnNvbHV0ZVBhdGgoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoTG9jYWxlIGxvY2FsZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiAiSlNGIFRhZyBEb2N1bWVudGF0aW9uIjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKExvY2FsZSBsb2NhbGUpCi0gICAgewotICAgICAgICByZXR1cm4gIkRvY3VtZW50YXRpb24gZm9yIEpTRiBUYWdzIjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE91dHB1dE5hbWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuICJ0YWdkb2MiOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBNb2RlbCBnZXRNb2RlbCgpCi0gICAgewotICAgICAgICByZXR1cm4gX21vZGVsOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBMaXN0IGdldE1hc3RlckNvbmZpZ3MoTWF2ZW5Qcm9qZWN0IHByb2plY3QpCi0gICAgICAgICAgICB0aHJvd3MgTWF2ZW5SZXBvcnRFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFN0cmluZyByZXNvdXJjZVBhdGggPSAiTUVUQS1JTkYvbWF2ZW4tZmFjZXMtcGx1Z2luL2ZhY2VzLWNvbmZpZy54bWwiOwotICAgICAgICByZXR1cm4gZ2V0Q29tcGlsZURlcGVuZGVuY3lSZXNvdXJjZXMocHJvamVjdCwgcmVzb3VyY2VQYXRoKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgTGlzdCBnZXRDb21waWxlRGVwZW5kZW5jeVJlc291cmNlcyhNYXZlblByb2plY3QgcHJvamVjdCwKLSAgICAgICAgICAgIFN0cmluZyByZXNvdXJjZVBhdGgpIHRocm93cyBNYXZlblJlcG9ydEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIENsYXNzTG9hZGVyIGNsID0gY3JlYXRlQ29tcGlsZUNsYXNzTG9hZGVyKHByb2plY3QpOwotICAgICAgICAgICAgRW51bWVyYXRpb24gZSA9IGNsLmdldFJlc291cmNlcyhyZXNvdXJjZVBhdGgpOwotICAgICAgICAgICAgTGlzdCB1cmxzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAgICAgd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgVVJMIHVybCA9IChVUkwpIGUubmV4dEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgICB1cmxzLmFkZCh1cmwpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QodXJscyk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBNYXZlblJlcG9ydEV4Y2VwdGlvbigiVW5hYmxlIHRvIGdldCByZXNvdXJjZXMgZm9yIHBhdGggIgotICAgICAgICAgICAgICAgICAgICArICJcIiIgKyByZXNvdXJjZVBhdGggKyAiXCIiLCBlKTsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgcHJpdmF0ZSBDbGFzc0xvYWRlciBjcmVhdGVDb21waWxlQ2xhc3NMb2FkZXIoTWF2ZW5Qcm9qZWN0IHByb2plY3QpCi0gICAgICAgICAgICB0aHJvd3MgTWF2ZW5SZXBvcnRFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFRocmVhZCBjdXJyZW50ID0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKTsKLSAgICAgICAgQ2xhc3NMb2FkZXIgY2wgPSBjdXJyZW50LmdldENvbnRleHRDbGFzc0xvYWRlcigpOwotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBMaXN0IGNsYXNzcGF0aEVsZW1lbnRzID0gcHJvamVjdC5nZXRDb21waWxlQ2xhc3NwYXRoRWxlbWVudHMoKTsKLSAgICAgICAgICAgIGlmICghY2xhc3NwYXRoRWxlbWVudHMuaXNFbXB0eSgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFN0cmluZ1tdIGVudHJpZXMgPSAoU3RyaW5nW10pIGNsYXNzcGF0aEVsZW1lbnRzCi0gICAgICAgICAgICAgICAgICAgICAgICAudG9BcnJheShuZXcgU3RyaW5nWzBdKTsKLSAgICAgICAgICAgICAgICBVUkxbXSB1cmxzID0gbmV3IFVSTFtlbnRyaWVzLmxlbmd0aF07Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB1cmxzLmxlbmd0aDsgaSsrKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdXJsc1tpXSA9IG5ldyBGaWxlKGVudHJpZXNbaV0pLnRvVVJMKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNsID0gbmV3IFVSTENsYXNzTG9hZGVyKHVybHMsIGNsKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRGVwZW5kZW5jeVJlc29sdXRpb25SZXF1aXJlZEV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTWF2ZW5SZXBvcnRFeGNlcHRpb24oIkVycm9yIGNhbGN1bGF0aW5nIHNjb3BlIGNsYXNzcGF0aCIsCi0gICAgICAgICAgICAgICAgICAgIGUpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IE1hdmVuUmVwb3J0RXhjZXB0aW9uKCJFcnJvciBjYWxjdWxhdGluZyBzY29wZSBjbGFzc3BhdGgiLAotICAgICAgICAgICAgICAgICAgICBlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBjbDsKLSAgICB9Ci0KLSAgICBzdGF0aWMgcHVibGljIGNsYXNzIFVSTENyZWF0aW9uRmFjdG9yeSBleHRlbmRzCi0gICAgICAgICAgICBBYnN0cmFjdE9iamVjdENyZWF0aW9uRmFjdG9yeQotICAgIHsKLSAgICAgICAgcHVibGljIE9iamVjdCBjcmVhdGVPYmplY3QoQXR0cmlidXRlcyBhdHRyaWJ1dGVzKQotICAgICAgICAgICAgICAgIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24KLSAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIGhyZWYgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCJocmVmIik7Ci0gICAgICAgICAgICBpZiAoaHJlZiA9PSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIk1pc3NpbmcgaHJlZiBhdHRyaWJ1dGUiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgVVJMIG1hc3RlciA9IChVUkwpIGRpZ2VzdGVyLmdldFJvb3QoKTsKLSAgICAgICAgICAgIHJldHVybiBuZXcgVVJMKG1hc3RlciwgaHJlZik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFRlbXBsYXRlQ29tcG9uZW50KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0ZW1wbGF0ZUNvbXBvbmVudDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFRlbXBsYXRlQ29udmVydGVyKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0ZW1wbGF0ZUNvbnZlcnRlcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFRlbXBsYXRlQmVoYXZpb3IoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRlbXBsYXRlQmVoYXZpb3I7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRUZW1wbGF0ZVZhbGlkYXRvcigpCi0gICAgewotICAgICAgICByZXR1cm4gdGVtcGxhdGVWYWxpZGF0b3I7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRUZW1wbGF0ZVRhZygpCi0gICAgewotICAgICAgICByZXR1cm4gdGVtcGxhdGVUYWc7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRUZW1wbGF0ZUZhY2VsZXRUYWcoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRlbXBsYXRlRmFjZWxldFRhZzsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBib29sZWFuIF9pczEyKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAiMS4yIi5lcXVhbHMoanNmVmVyc2lvbikgfHwgIjEyIi5lcXVhbHMoanNmVmVyc2lvbik7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgYm9vbGVhbiBfaXMyMCgpCi0gICAgewotICAgICAgICByZXR1cm4gIjIuMCIuZXF1YWxzKGpzZlZlcnNpb24pIHx8ICIyMCIuZXF1YWxzKGpzZlZlcnNpb24pOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL3RhZ2RvYy9UYWdkb2NJbmRleFJlcG9ydC5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vdGFnZG9jL1RhZ2RvY0luZGV4UmVwb3J0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0YmY0MjMuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vdGFnZG9jL1RhZ2RvY0luZGV4UmVwb3J0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1ODYgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLnRhZ2RvYzsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5UcmVlU2V0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wcm9qZWN0Lk1hdmVuUHJvamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnJlcG9ydGluZy5BYnN0cmFjdE1hdmVuUmVwb3J0OwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucmVwb3J0aW5nLk1hdmVuUmVwb3J0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uYnVpbGRlci5GbGF0dGVuZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5idWlsZGVyLklPVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5idWlsZGVyLm1vZGVsLkJlaGF2aW9yTWV0YTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmJ1aWxkZXIubW9kZWwuQ2xhc3NNZXRhOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uYnVpbGRlci5tb2RlbC5Db21wb25lbnRNZXRhOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uYnVpbGRlci5tb2RlbC5Db252ZXJ0ZXJNZXRhOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uYnVpbGRlci5tb2RlbC5GYWNlbGV0VGFnTWV0YTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmJ1aWxkZXIubW9kZWwuTW9kZWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5idWlsZGVyLm1vZGVsLlRhZ01ldGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5idWlsZGVyLm1vZGVsLlZhbGlkYXRvck1ldGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5idWlsZGVyLnV0aWxzLk15ZmFjZXNVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLnZlbG9jaXR5LnJ1bnRpbWUucmVzb3VyY2UuUmVzb3VyY2VNYW5hZ2VySW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLmRveGlhLnNpbmsuU2luazsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLmRveGlhLnNpdGVyZW5kZXJlci5SZW5kZXJlcjsKLQotLyoqCi0gKiBSZXBvcnQgZm9yIGdlbmVyYXRpbmcgSlNGIHRhZ2RvYyBpbmRleCBiYXNlZCBvbiBteWZhY2VzLW1ldGFkYXRhLnhtbCBwYXJzaW5nLgotICogVGhlIGNvbnRlbnQgaXMgZ2VuZXJhdGVkIHVzaW5nIHZlbG9jaXR5IGluIHhkb2MgZmlsZXMgKHNlZSBUYWdkb2NDb250ZW50TW9qbykuCi0gKgotICogQGF1dGhvciBMZW9uYXJkbyBVcmliZQotICogQGdvYWwgdGFnZG9jLWluZGV4Ci0gKi8KLXB1YmxpYyBjbGFzcyBUYWdkb2NJbmRleFJlcG9ydCBleHRlbmRzIEFic3RyYWN0TWF2ZW5SZXBvcnQKLXsKLSAgICBwcml2YXRlIE1vZGVsIF9tb2RlbDsKLQotICAgIC8qKgotICAgICAqIFNwZWNpZmllcyB0aGUgZGlyZWN0b3J5IHdoZXJlIHRoZSByZXBvcnQgd2lsbCBiZSBnZW5lcmF0ZWQKLSAgICAgKgotICAgICAqIEBwYXJhbWV0ZXIgZGVmYXVsdC12YWx1ZT0iJHtwcm9qZWN0LnJlcG9ydGluZy5vdXRwdXREaXJlY3Rvcnl9IgotICAgICAqIEByZXF1aXJlZAotICAgICAqLwotICAgIHByaXZhdGUgRmlsZSBvdXRwdXREaXJlY3Rvcnk7Ci0KLSAgICAvKioKLSAgICAgKiBEaXJlY3Rvcnkgd2hlcmUgdGhlIG9yaWdpbmFsIHNpdGUgaXMgcHJlc2VudC4KLSAgICAgKiAoVFJJRUQgdXNpbmcgJHtiYXNlRGlyfS9zcmMvc2l0ZTsgIHRoYXQgaW5zZXJ0ZWQgYSAnbnVsbCcgaW50bwotICAgICAqIHRoZSBzdHJpbmcgZm9yIHNvbWUgcmVhc29uLiAgVFJJRUQgdXNpbmcgJHtzaXRlRGlyZWN0b3J5fSwKLSAgICAgKiB3aGljaCB3YXMgdW5kZWZpbmVkLiAgVFJJRUQgJHtwcm9qZWN0LmRpcmVjdG9yeX1zcmMvc2l0ZTsgd2hpY2ggYWxzbwotICAgICAqIGluc2VydGVkIGEgbnVsbC4gICR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9Ly4uL3NyYy9zaXRlIHNlZW1zIHRvIHdvcmssCi0gICAgICogdGhvdWdoIGl0IGFzc3VtZXMgdGhhdCAke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fSBpcyAKLSAgICAgKiAke3Byb2plY3QuZGlyZWN0b3J5fS90YXJnZXQuCi0gICAgICogCi0gICAgICogQHBhcmFtZXRlciBkZWZhdWx0LXZhbHVlPSIke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS8uLi9zcmMvc2l0ZS8iCi0gICAgICogQHJlcXVpcmVkCi0gICAgICovCi0gICAgcHJpdmF0ZSBGaWxlIHNpdGVEaXJlY3Rvcnk7Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW1ldGVyIGV4cHJlc3Npb249IiR7cHJvamVjdH0iCi0gICAgICogQHJlcXVpcmVkCi0gICAgICogQHJlYWRvbmx5Ci0gICAgICovCi0gICAgcHJpdmF0ZSBNYXZlblByb2plY3QgcHJvamVjdDsKLQotICAgIC8qKgotICAgICAqIEBjb21wb25lbnQKLSAgICAgKi8KLSAgICBwcml2YXRlIFJlbmRlcmVyIHNpdGVSZW5kZXJlcjsKLQotICAgIC8qKgotICAgICAqIEBwYXJhbWV0ZXIKLSAgICAgKi8KLSAgICBwcml2YXRlIE1hcCB0YWdsaWJzOwotCi0gICAgLyoqCi0gICAgICogQHBhcmFtZXRlciBleHByZXNzaW9uPSIke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9nZW5lcmF0ZWQtcmVzb3VyY2VzL215ZmFjZXMtYnVpbGRlci1wbHVnaW4iCi0gICAgICovCi0gICAgcHJpdmF0ZSBGaWxlIGJ1aWxkRGlyZWN0b3J5OwotCi0gICAgLyoqCi0gICAgICogSW5qZWN0ZWQgbmFtZSBvZiBmaWxlIGdlbmVyYXRlZCBieSBlYXJsaWVyIHJ1biBvZiBCdWlsZE1ldGFEYXRhTW9qbyBnb2FsLgotICAgICAqIAotICAgICAqIEBwYXJhbWV0ZXIKLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBtZXRhZGF0YUZpbGUgPSAiTUVUQS1JTkYvbXlmYWNlcy1tZXRhZGF0YS54bWwiOwotCi0gICAgLyoqCi0gICAgICogQHBhcmFtZXRlcgotICAgICAqLwotICAgIHByaXZhdGUgTGlzdCBtb2RlbElkczsKLQotICAgIC8qKgotICAgICAqIGNvbXBvbmVudCByb2xlPSJvcmcuY29kZWhhdXMucGxleHVzLnZlbG9jaXR5LlZlbG9jaXR5Q29tcG9uZW50IiByb2xlSGludD0idGFnZG9jIgotICAgICAqLwotICAgIC8vcHJpdmF0ZSBWZWxvY2l0eUNvbXBvbmVudCB2ZWxvY2l0eUNvbXBvbmVudDsKLSAgICBzdGF0aWMgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgX0RPQ19TVUJESVJFQ1RPUlkgPSAidGFnZG9jIjsKLQotICAgIHByb3RlY3RlZCB2b2lkIGV4ZWN1dGVSZXBvcnQoTG9jYWxlIGxvY2FsZSkgdGhyb3dzIE1hdmVuUmVwb3J0RXhjZXB0aW9uCi0gICAgewotCi0gICAgICAgIGlmIChtb2RlbElkcyA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBtb2RlbElkcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgICAgIG1vZGVsSWRzLmFkZChwcm9qZWN0LmdldEFydGlmYWN0SWQoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAodGFnbGlicyA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICB0YWdsaWJzID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgICAgICAgIHRhZ2xpYnMucHV0KCJ0IiwgImh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvdG9tYWhhd2siKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBfbW9kZWwgPSBJT1V0aWxzLmxvYWRNb2RlbChuZXcgRmlsZShidWlsZERpcmVjdG9yeSwgbWV0YWRhdGFGaWxlKSk7Ci0gICAgICAgICAgICBuZXcgRmxhdHRlbmVyKF9tb2RlbCkuZmxhdHRlbigpOwotICAgICAgICAgICAgX2dlbmVyYXRlVGFnRG9jcygpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IE1hdmVuUmVwb3J0RXhjZXB0aW9uKCJDb3VsZG4ndCBnZW5lcmF0ZSB0YWdkb2MiLCBlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGNhbkdlbmVyYXRlKENsYXNzTWV0YSBjb21wb25lbnQpCi0gICAgewotICAgICAgICBpZiAobW9kZWxJZHMuY29udGFpbnMoY29tcG9uZW50LmdldE1vZGVsSWQoKSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGNsYXNzIEN1c3RvbVJlc291cmNlTWFuYWdlckltcGwgZXh0ZW5kcyBSZXNvdXJjZU1hbmFnZXJJbXBsCi0gICAgewotCi0gICAgICAgIHB1YmxpYyBDdXN0b21SZXNvdXJjZU1hbmFnZXJJbXBsKCkKLSAgICAgICAgewotICAgICAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIF9nZW5lcmF0ZVRhZ0RvY3MoKSB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBNb2RlbCBtb2RlbCA9IGdldE1vZGVsKCk7Ci0gICAgICAgIGlmIChtb2RlbC5nZXRDb21wb25lbnRzKCkuc2l6ZSgpID09IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldExvZygpLmluZm8oIk5vdGhpbmcgdG8gZ2VuZXJhdGUgLSBubyBjb21wb25lbnRzIGZvdW5kIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBJdGVyYXRvciBjb21wb25lbnRzID0gbW9kZWwuY29tcG9uZW50cygpOwotCi0gICAgICAgIEl0ZXJhdG9yIHZhbGlkYXRvcnMgPSBtb2RlbC52YWxpZGF0b3JzKCk7Ci0KLSAgICAgICAgSXRlcmF0b3IgY29udmVydGVycyA9IG1vZGVsLmNvbnZlcnRlcnMoKTsKLSAgICAgICAgCi0gICAgICAgIEl0ZXJhdG9yIGJlaGF2aW9ycyA9IG1vZGVsLmJlaGF2aW9ycygpOwotICAgICAgICAKLSAgICAgICAgSXRlcmF0b3IgdGFncyA9IG1vZGVsLnRhZ3MoKTsKLSAgICAgICAgCi0gICAgICAgIEl0ZXJhdG9yIGZhY2VsZXRUYWdzID0gbW9kZWwuZmFjZWxldFRhZ3MoKTsKLQotICAgICAgICAvLyA9LT1BRVcgTm90ZSB0aGF0IG9ubHkgdXBkYXRpbmcgb3V0LW9mLWRhdGUgY29tcG9uZW50cywgZXRjLiBpcwotICAgICAgICAvLyBwZXJtYW5lbnRseSB0cmlja3ksIGV2ZW4gaWYgd2UgaGFkIHByb3BlciBkZXRlY3Rpb24gaW4gcGxhY2UsCi0gICAgICAgIC8vIGJlY2F1c2UgdGhlIGluZGV4IGFsd2F5cyBoYXMgdG8gaGF2ZSBhbGwgZG9jcwotICAgICAgICAvKgotICAgICAgICBpZiAoIWNvbXBvbmVudHMuaGFzTmV4dCgpICYmICFjb252ZXJ0ZXJzLmhhc05leHQoKSAmJiAhdmFsaWRhdG9ycy5oYXNOZXh0KCkpCi0gICAgICAgIHsKLSAgICAgICAgICBnZXRMb2coKS5pbmZvKCJOb3RoaW5nIHRvIGdlbmVyYXRlIC0gYWxsIGRvY3MgYXJlIHVwIHRvIGRhdGUiKTsKLSAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgKi8KLQotICAgICAgICBTZXQgY29tcG9uZW50UGFnZXMgPSBuZXcgVHJlZVNldCgpOwotICAgICAgICBTZXQgY29udmVydGVyUGFnZXMgPSBuZXcgVHJlZVNldCgpOwotICAgICAgICBTZXQgYmVoYXZpb3JQYWdlcyA9IG5ldyBUcmVlU2V0KCk7Ci0gICAgICAgIFNldCB2YWxpZGF0b3JQYWdlcyA9IG5ldyBUcmVlU2V0KCk7Ci0gICAgICAgIFNldCB0YWdzUGFnZXMgPSBuZXcgVHJlZVNldCgpOwotICAgICAgICBTZXQgZmFjZWxldFRhZ1BhZ2VzID0gbmV3IFRyZWVTZXQoKTsKLQotICAgICAgICBpbnQgY291bnQgPSAwOwotICAgICAgICB3aGlsZSAoY29tcG9uZW50cy5oYXNOZXh0KCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIENvbXBvbmVudE1ldGEgY29tcG9uZW50ID0gKENvbXBvbmVudE1ldGEpIGNvbXBvbmVudHMubmV4dCgpOwotICAgICAgICAgICAgaWYgKGNhbkdlbmVyYXRlKGNvbXBvbmVudCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHBhZ2VOYW1lID0gX2dlbmVyYXRlQ29tcG9uZW50RG9jKGNvbXBvbmVudCk7Ci0gICAgICAgICAgICAgICAgaWYgKHBhZ2VOYW1lICE9IG51bGwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRQYWdlcy5hZGQocGFnZU5hbWUpOwotICAgICAgICAgICAgICAgICAgICBjb3VudCsrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICB3aGlsZSAoY29udmVydGVycy5oYXNOZXh0KCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIENvbnZlcnRlck1ldGEgY29udmVydGVyID0gKENvbnZlcnRlck1ldGEpIGNvbnZlcnRlcnMubmV4dCgpOwotICAgICAgICAgICAgaWYgKGNhbkdlbmVyYXRlKGNvbnZlcnRlcikpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHBhZ2VOYW1lID0gX2dlbmVyYXRlQ29udmVydGVyRG9jKGNvbnZlcnRlcik7Ci0gICAgICAgICAgICAgICAgaWYgKHBhZ2VOYW1lICE9IG51bGwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjb252ZXJ0ZXJQYWdlcy5hZGQocGFnZU5hbWUpOwotICAgICAgICAgICAgICAgICAgICBjb3VudCsrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICB3aGlsZSAodmFsaWRhdG9ycy5oYXNOZXh0KCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFZhbGlkYXRvck1ldGEgdmFsaWRhdG9yID0gKFZhbGlkYXRvck1ldGEpIHZhbGlkYXRvcnMubmV4dCgpOwotCi0gICAgICAgICAgICBpZiAoY2FuR2VuZXJhdGUodmFsaWRhdG9yKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgcGFnZU5hbWUgPSBfZ2VuZXJhdGVWYWxpZGF0b3JEb2ModmFsaWRhdG9yKTsKLSAgICAgICAgICAgICAgICBpZiAocGFnZU5hbWUgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHZhbGlkYXRvclBhZ2VzLmFkZChwYWdlTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIGNvdW50Kys7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHdoaWxlIChiZWhhdmlvcnMuaGFzTmV4dCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBCZWhhdmlvck1ldGEgYmVoYXZpb3IgPSAoQmVoYXZpb3JNZXRhKSBiZWhhdmlvcnMubmV4dCgpOwotICAgICAgICAgICAgaWYgKGNhbkdlbmVyYXRlKGJlaGF2aW9yKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgcGFnZU5hbWUgPSBfZ2VuZXJhdGVCZWhhdmlvckRvYyhiZWhhdmlvcik7Ci0gICAgICAgICAgICAgICAgaWYgKHBhZ2VOYW1lICE9IG51bGwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBiZWhhdmlvclBhZ2VzLmFkZChwYWdlTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIGNvdW50Kys7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgd2hpbGUgKHRhZ3MuaGFzTmV4dCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBUYWdNZXRhIHRhZyA9IChUYWdNZXRhKSB0YWdzLm5leHQoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKGNhbkdlbmVyYXRlKHRhZykpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHBhZ2VOYW1lID0gX2dlbmVyYXRlVGFnRG9jKHRhZyk7Ci0gICAgICAgICAgICAgICAgaWYgKHBhZ2VOYW1lICE9IG51bGwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0YWdzUGFnZXMuYWRkKHBhZ2VOYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgY291bnQrKzsKLSAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICB3aGlsZSAoZmFjZWxldFRhZ3MuaGFzTmV4dCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBGYWNlbGV0VGFnTWV0YSBmYWNlbGV0VGFnID0gKEZhY2VsZXRUYWdNZXRhKSBmYWNlbGV0VGFncy5uZXh0KCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChjYW5HZW5lcmF0ZShmYWNlbGV0VGFnKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgcGFnZU5hbWUgPSBfZ2VuZXJhdGVGYWNlbGV0VGFnRG9jKG1vZGVsLCBmYWNlbGV0VGFnKTsKLSAgICAgICAgICAgICAgICBpZiAocGFnZU5hbWUgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGZhY2VsZXRUYWdQYWdlcy5hZGQocGFnZU5hbWUpOwotICAgICAgICAgICAgICAgICAgICBjb3VudCsrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLQotICAgICAgICBTZXQgb3RoZXJQYWdlcyA9IF9nYXRoZXJPdGhlclRhZ3MoKTsKLQotICAgICAgICBnZXRMb2coKS5pbmZvKCJHZW5lcmF0ZWQgIiArIGNvdW50ICsgIiBwYWdlKHMpIik7Ci0KLSAgICAgICAgU2luayBzaW5rID0gZ2V0U2luaygpOwotICAgICAgICBzaW5rLmhlYWQoKTsKLSAgICAgICAgc2luay50aXRsZSgpOwotICAgICAgICBzaW5rLnRleHQoIlRhZyBsaWJyYXJ5IGRvY3VtZW50YXRpb24iKTsKLSAgICAgICAgc2luay50aXRsZV8oKTsKLSAgICAgICAgc2luay5oZWFkXygpOwotICAgICAgICBzaW5rLmJvZHkoKTsKLQotICAgICAgICBzaW5rLnNlY3Rpb25UaXRsZTEoKTsKLSAgICAgICAgc2luay50ZXh0KCJUYWcgbGlicmFyeSBpbmZvcm1hdGlvbiIpOwotICAgICAgICBzaW5rLnNlY3Rpb25UaXRsZTFfKCk7Ci0gICAgICAgIHNpbmsuc2VjdGlvbjEoKTsKLQotICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSB0YWdsaWJzLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgICAgICB7Ci0gICAgICAgICAgICBNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpLm5leHQoKTsKLSAgICAgICAgICAgIHNpbmsucGFyYWdyYXBoKCk7Ci0KLSAgICAgICAgICAgIHNpbmsuYm9sZCgpOwotICAgICAgICAgICAgc2luay50ZXh0KCJTaG9ydCBuYW1lOiIpOwotICAgICAgICAgICAgc2luay5ib2xkXygpOwotICAgICAgICAgICAgc2luay5ub25CcmVha2luZ1NwYWNlKCk7Ci0gICAgICAgICAgICBzaW5rLnRleHQoZW50cnkuZ2V0S2V5KCkudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICBzaW5rLmxpbmVCcmVhaygpOwotCi0gICAgICAgICAgICBzaW5rLmJvbGQoKTsKLSAgICAgICAgICAgIHNpbmsudGV4dCgiTmFtZXNwYWNlOiIpOwotICAgICAgICAgICAgc2luay5ib2xkXygpOwotICAgICAgICAgICAgc2luay5ub25CcmVha2luZ1NwYWNlKCk7Ci0gICAgICAgICAgICBzaW5rLnRleHQoZW50cnkuZ2V0VmFsdWUoKS50b1N0cmluZygpKTsKLSAgICAgICAgICAgIHNpbmsubGluZUJyZWFrKCk7Ci0KLSAgICAgICAgICAgIHNpbmsucGFyYWdyYXBoXygpOwotICAgICAgICB9Ci0KLSAgICAgICAgc2luay5zZWN0aW9uMV8oKTsKLQotICAgICAgICBfd3JpdGVJbmRleFNlY3Rpb24oc2luaywgY29tcG9uZW50UGFnZXMsICJDb21wb25lbnRzIik7Ci0gICAgICAgIF93cml0ZUluZGV4U2VjdGlvbihzaW5rLCBjb252ZXJ0ZXJQYWdlcywgIkNvbnZlcnRlcnMiKTsKLSAgICAgICAgX3dyaXRlSW5kZXhTZWN0aW9uKHNpbmssIHZhbGlkYXRvclBhZ2VzLCAiVmFsaWRhdG9ycyIpOwotICAgICAgICBfd3JpdGVJbmRleFNlY3Rpb24oc2luaywgYmVoYXZpb3JQYWdlcywgIkJlaGF2aW9ycyIpOwotICAgICAgICBfd3JpdGVJbmRleFNlY3Rpb24oc2luaywgdGFnc1BhZ2VzLCAiSlNGIFRhZ3MiKTsKLSAgICAgICAgX3dyaXRlSW5kZXhTZWN0aW9uKHNpbmssIGZhY2VsZXRUYWdQYWdlcywgIkpTRiBGYWNlbGV0IFRhZ3MiKTsKLSAgICAgICAgX3dyaXRlSW5kZXhTZWN0aW9uKHNpbmssIG90aGVyUGFnZXMsICJNaXNjZWxsYW5lb3VzIik7Ci0KLSAgICAgICAgc2luay5ib2R5XygpOwotICAgIH0KLQotICAgIHByaXZhdGUgU2V0IF9nYXRoZXJPdGhlclRhZ3MoKQotICAgIHsKLSAgICAgICAgVHJlZVNldCBzZXQgPSBuZXcgVHJlZVNldCgpOwotICAgICAgICBTdHJpbmcgc3ViRGlyID0gX3BsYXRmb3JtQWdub3N0aWNQYXRoKF9wbGF0Zm9ybUFnbm9zdGljUGF0aCgieGRvYy8iCi0gICAgICAgICAgICAgICAgKyBfRE9DX1NVQkRJUkVDVE9SWSkpOwotICAgICAgICBGaWxlIHNpdGVTdWJEaXIgPSBuZXcgRmlsZShzaXRlRGlyZWN0b3J5LCBzdWJEaXIpOwotICAgICAgICBpZiAoc2l0ZVN1YkRpci5leGlzdHMoKSkKLSAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nW10gZmlsZXMgPSBzaXRlU3ViRGlyLmxpc3QoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGZpbGUgPSBmaWxlc1tpXTsKLSAgICAgICAgICAgICAgICBpZiAoZmlsZS5lbmRzV2l0aCgiLnhtbCIpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgc2V0LmFkZChmaWxlLnN1YnN0cmluZygwLCBmaWxlLmxlbmd0aCgpIC0gNCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBzZXQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIF93cml0ZUluZGV4U2VjdGlvbihTaW5rIHNpbmssIFNldCBwYWdlcywgU3RyaW5nIHRpdGxlKQotICAgIHsKLSAgICAgICAgaWYgKHBhZ2VzLmlzRW1wdHkoKSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgc2luay5zZWN0aW9uVGl0bGUxKCk7Ci0gICAgICAgIHNpbmsudGV4dCh0aXRsZSk7Ci0gICAgICAgIHNpbmsuc2VjdGlvblRpdGxlMV8oKTsKLSAgICAgICAgc2luay5zZWN0aW9uMSgpOwotICAgICAgICBzaW5rLnRhYmxlKCk7Ci0gICAgICAgIHNpbmsudGFibGVSb3coKTsKLSAgICAgICAgc2luay50YWJsZUhlYWRlckNlbGwoKTsKLSAgICAgICAgc2luay50ZXh0KCJUYWcgTmFtZSIpOwotICAgICAgICBzaW5rLnRhYmxlSGVhZGVyQ2VsbF8oKTsKLSAgICAgICAgc2luay50YWJsZVJvd18oKTsKLQotICAgICAgICBJdGVyYXRvciBpdGVyID0gcGFnZXMuaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBzaW5rLnRhYmxlUm93KCk7Ci0gICAgICAgICAgICBzaW5rLnRhYmxlQ2VsbCgpOwotCi0gICAgICAgICAgICBTdHJpbmcgbmFtZSA9IChTdHJpbmcpIGl0ZXIubmV4dCgpOwotICAgICAgICAgICAgU3RyaW5nIHRhZ05hbWUgPSAiPCIgKyBuYW1lLnJlcGxhY2UoJ18nLCAnOicpICsgIj4iOwotCi0gICAgICAgICAgICBzaW5rLmxpbmsoX0RPQ19TVUJESVJFQ1RPUlkgKyAiLyIgKyBuYW1lICsgIi5odG1sIik7Ci0gICAgICAgICAgICBzaW5rLnRleHQodGFnTmFtZSk7Ci0gICAgICAgICAgICBzaW5rLmxpbmtfKCk7Ci0KLSAgICAgICAgICAgIHNpbmsudGFibGVDZWxsXygpOwotICAgICAgICAgICAgc2luay50YWJsZVJvd18oKTsKLSAgICAgICAgfQotCi0gICAgICAgIHNpbmsudGFibGVfKCk7Ci0gICAgICAgIHNpbmsuc2VjdGlvbjFfKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gdXNlUGFnZUxpbmtCYXIoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIF90b1BhZ2VOYW1lKFN0cmluZyBxTmFtZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBNeWZhY2VzVXRpbHMuZ2V0VGFnUHJlZml4KHFOYW1lKSArICJfIgotICAgICAgICAgICAgICAgICsgTXlmYWNlc1V0aWxzLmdldFRhZ05hbWUocU5hbWUpOwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIF9nZW5lcmF0ZUNvbXBvbmVudERvYyhDb21wb25lbnRNZXRhIGNvbXBvbmVudCkKLSAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGlmIChjb21wb25lbnQuZ2V0TmFtZSgpID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIFN0cmluZyBwYWdlTmFtZSA9IF90b1BhZ2VOYW1lKGNvbXBvbmVudC5nZXROYW1lKCkpOwotCi0gICAgICAgIHJldHVybiBwYWdlTmFtZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBfZ2VuZXJhdGVDb252ZXJ0ZXJEb2MoQ29udmVydGVyTWV0YSBjb252ZXJ0ZXIpCi0gICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGlmIChjb252ZXJ0ZXIuZ2V0TmFtZSgpID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIHBhZ2VOYW1lID0gX3RvUGFnZU5hbWUoY29udmVydGVyLmdldE5hbWUoKSk7Ci0KLSAgICAgICAgcmV0dXJuIHBhZ2VOYW1lOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIFN0cmluZyBfZ2VuZXJhdGVCZWhhdmlvckRvYyhCZWhhdmlvck1ldGEgYmVoYXZpb3IpCi0gICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGlmIChiZWhhdmlvci5nZXROYW1lKCkgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIFN0cmluZyBwYWdlTmFtZSA9IF90b1BhZ2VOYW1lKGJlaGF2aW9yLmdldE5hbWUoKSk7Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gcGFnZU5hbWU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgX2dlbmVyYXRlVmFsaWRhdG9yRG9jKFZhbGlkYXRvck1ldGEgdmFsaWRhdG9yKQotICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBpZiAodmFsaWRhdG9yLmdldE5hbWUoKSA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyBwYWdlTmFtZSA9IF90b1BhZ2VOYW1lKHZhbGlkYXRvci5nZXROYW1lKCkpOwotCi0gICAgICAgIHJldHVybiBwYWdlTmFtZTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBTdHJpbmcgX2dlbmVyYXRlVGFnRG9jKFRhZ01ldGEgdGFnKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGlmICh0YWcuZ2V0TmFtZSgpID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBTdHJpbmcgcGFnZU5hbWUgPSBfdG9QYWdlTmFtZSh0YWcuZ2V0TmFtZSgpKTsKLSAgICAgICAgCi0gICAgICAgIHJldHVybiBwYWdlTmFtZTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBTdHJpbmcgX2dlbmVyYXRlRmFjZWxldFRhZ0RvYyhNb2RlbCBtb2RlbCwgRmFjZWxldFRhZ01ldGEgdGFnKQotICAgIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgU3RyaW5nIG5hbWUgPSB0YWcuZ2V0TmFtZSgpOyAKLSAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGlmICh0YWcuZ2V0Q29tcG9uZW50Q2xhc3MoKSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBDb21wb25lbnRNZXRhIGNvbXAgPSBtb2RlbC5maW5kQ29tcG9uZW50QnlDbGFzc05hbWUodGFnLmdldENvbXBvbmVudENsYXNzKCkpOwotICAgICAgICAgICAgaWYgKG5hbWUuZXF1YWxzKGNvbXAuZ2V0TmFtZSgpKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvL0V4aXN0cyBpbiBqc3AgYW5kIGluIGZhY2VsZXRzLCBidXQgaGFzIHNwZWNpZmljIGZhY2VsZXRzIHByb3BlcnRpZXMKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAodGFnLmdldENvbnZlcnRlckNsYXNzKCkgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgQ29udmVydGVyTWV0YSBjb21wID0gbW9kZWwuZmluZENvbnZlcnRlckJ5Q2xhc3NOYW1lKHRhZy5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLSAgICAgICAgICAgIGlmIChuYW1lLmVxdWFscyhjb21wLmdldE5hbWUoKSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy9FeGlzdHMgaW4ganNwIGFuZCBpbiBmYWNlbGV0cywgYnV0IGhhcyBzcGVjaWZpYyBmYWNlbGV0cyBwcm9wZXJ0aWVzCi0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9ICAgICAgICAgICAgCi0gICAgICAgIH0KLSAgICAgICAgaWYgKHRhZy5nZXRWYWxpZGF0b3JDbGFzcygpICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFZhbGlkYXRvck1ldGEgY29tcCA9IG1vZGVsLmZpbmRWYWxpZGF0b3JCeUNsYXNzTmFtZSh0YWcuZ2V0VmFsaWRhdG9yQ2xhc3MoKSk7Ci0gICAgICAgICAgICBpZiAobmFtZS5lcXVhbHMoY29tcC5nZXROYW1lKCkpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vRXhpc3RzIGluIGpzcCBhbmQgaW4gZmFjZWxldHMsIGJ1dCBoYXMgc3BlY2lmaWMgZmFjZWxldHMgcHJvcGVydGllcwotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfSAgICAgICAgICAgIAotICAgICAgICB9Ci0gICAgICAgIGlmICh0YWcuZ2V0QmVoYXZpb3JDbGFzcygpICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEJlaGF2aW9yTWV0YSBjb21wID0gbW9kZWwuZmluZEJlaGF2aW9yQnlDbGFzc05hbWUodGFnLmdldEJlaGF2aW9yQ2xhc3MoKSk7Ci0gICAgICAgICAgICBpZiAobmFtZS5lcXVhbHMoY29tcC5nZXROYW1lKCkpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vRXhpc3RzIGluIGpzcCBhbmQgaW4gZmFjZWxldHMsIGJ1dCBoYXMgc3BlY2lmaWMgZmFjZWxldHMgcHJvcGVydGllcwotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfSAgICAgICAgICAgIAotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHRhZy5nZXRUYWdDbGFzcygpICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFRhZ01ldGEgY29tcCA9IG1vZGVsLmZpbmRUYWdCeUNsYXNzTmFtZSh0YWcuZ2V0VGFnQ2xhc3MoKSk7Ci0gICAgICAgICAgICBpZiAobmFtZS5lcXVhbHMoY29tcC5nZXROYW1lKCkpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vRXhpc3RzIGluIGpzcCBhbmQgaW4gZmFjZWxldHMsIGJ1dCBoYXMgc3BlY2lmaWMgZmFjZWxldHMgcHJvcGVydGllcwotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBTdHJpbmcgcGFnZU5hbWUgPSBfdG9QYWdlTmFtZSh0YWcuZ2V0TmFtZSgpKTsKLSAgICAgICAgCi0gICAgICAgIHJldHVybiBwYWdlTmFtZTsKLSAgICB9ICAgCi0KLSAgICBzdGF0aWMgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgX3BsYXRmb3JtQWdub3N0aWNQYXRoKFN0cmluZyBwYXRoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHBhdGgucmVwbGFjZSgnLycsIEZpbGUuc2VwYXJhdG9yQ2hhcik7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIE1hdmVuUHJvamVjdCBnZXRQcm9qZWN0KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBwcm9qZWN0OwotICAgIH0KLQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0T3V0cHV0RGlyZWN0b3J5KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBvdXRwdXREaXJlY3RvcnkuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFJlbmRlcmVyIGdldFNpdGVSZW5kZXJlcigpCi0gICAgewotICAgICAgICByZXR1cm4gc2l0ZVJlbmRlcmVyOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZShMb2NhbGUgbG9jYWxlKQotICAgIHsKLSAgICAgICAgcmV0dXJuICJKU0YgVGFnIERvY3VtZW50YXRpb24iOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oTG9jYWxlIGxvY2FsZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiAiRG9jdW1lbnRhdGlvbiBmb3IgSlNGIFRhZ3MiOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0T3V0cHV0TmFtZSgpCi0gICAgewotICAgICAgICByZXR1cm4gInRhZ2RvYyI7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIE1vZGVsIGdldE1vZGVsKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfbW9kZWw7Ci0gICAgfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vdGFnZG9jL1RhZ2RvY1V0aWxzLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi90YWdkb2MvVGFnZG9jVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzRhODk4ZS4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi90YWdkb2MvVGFnZG9jVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4OSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4udGFnZG9jOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLWltcG9ydCBqYXZhLnV0aWwuVHJlZVNldDsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uYnVpbGRlci5tb2RlbC5BdHRyaWJ1dGVIb2xkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5idWlsZGVyLm1vZGVsLkF0dHJpYnV0ZU1ldGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5idWlsZGVyLm1vZGVsLkNvbXBvbmVudE1ldGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5idWlsZGVyLm1vZGVsLkZhY2V0SG9sZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uYnVpbGRlci5tb2RlbC5GYWNldE1ldGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5idWlsZGVyLm1vZGVsLkxpc3RlbmVySG9sZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uYnVpbGRlci5tb2RlbC5MaXN0ZW5lck1ldGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5idWlsZGVyLm1vZGVsLk1vZGVsOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uYnVpbGRlci5tb2RlbC5Qcm9wZXJ0eUhvbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmJ1aWxkZXIubW9kZWwuUHJvcGVydHlNZXRhOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uYnVpbGRlci5tb2RlbC5SZW5kZXJLaXRNZXRhOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uYnVpbGRlci5tb2RlbC5SZW5kZXJlck1ldGE7Ci0KLXB1YmxpYyBjbGFzcyBUYWdkb2NVdGlscwotewotICAgIAotICAgIHN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIHBsYXRmb3JtQWdub3N0aWNQYXRoKFN0cmluZyBwYXRoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHBhdGgucmVwbGFjZSgnLycsIEZpbGUuc2VwYXJhdG9yQ2hhcik7Ci0gICAgfQotICAgIAotICAgIHN0YXRpYyBwdWJsaWMgU3RyaW5nIGdldERpc3BsYXlUeXBlKFN0cmluZyBjbGFzc05hbWUsIFN0cmluZyBuYW1lLAotICAgICAgICAgICAgU3RyaW5nIHR5cGUpCi0gICAgewotICAgICAgICBpZiAodHlwZSAhPSBudWxsICYmIHR5cGUuc3RhcnRzV2l0aCgiamF2YS5sYW5nLiIpKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gdHlwZS5zdWJzdHJpbmcoImphdmEubGFuZy4iLmxlbmd0aCgpKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmICgiYmluZGluZyIuZXF1YWxzKG5hbWUpKQotICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmdUb2tlbml6ZXIgdG9rZW5zID0gbmV3IFN0cmluZ1Rva2VuaXplcihjbGFzc05hbWUsICIuIiwgdHJ1ZSk7Ci0gICAgICAgICAgICBTdHJpbmcgb3V0ID0gIiI7Ci0gICAgICAgICAgICB3aGlsZSAodG9rZW5zLmhhc01vcmVUb2tlbnMoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgdG9rZW4gPSB0b2tlbnMubmV4dFRva2VuKCk7Ci0gICAgICAgICAgICAgICAgb3V0ID0gb3V0ICsgdG9rZW47Ci0gICAgICAgICAgICAgICAgLy8gR2l2ZSBvdXJzZWx2ZXMgYW4gb3Bwb3J0dW5pdHkgZm9yIGEgbGluZSBicmVhayBhZnRlciAiY29tcG9uZW50LiI7Ci0gICAgICAgICAgICAgICAgaWYgKG91dC5lbmRzV2l0aCgiY29tcG9uZW50LiIpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgb3V0ID0gb3V0ICsgIjx3YnIvPiI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gb3V0OwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHR5cGU7Ci0gICAgfQotICAgIAotICAgIHN0YXRpYyBwdWJsaWMgTGlzdCBnZXRTb3J0ZWRQcm9wZXJ0eUxpc3QoUHJvcGVydHlIb2xkZXIgY29tcG9uZW50KQotICAgIHsKLSAgICAgICAgLy8gU29ydCB0aGUgbmFtZXMKLSAgICAgICAgVHJlZVNldCBhdHRyaWJ1dGVzID0gbmV3IFRyZWVTZXQoKTsKLSAgICAgICAgSXRlcmF0b3IgYXR0cnMgPSBjb21wb25lbnQucHJvcGVydGllcygpOwotICAgICAgICB3aGlsZSAoYXR0cnMuaGFzTmV4dCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBQcm9wZXJ0eU1ldGEgcHJvcGVydHkgPSAoUHJvcGVydHlNZXRhKSBhdHRycy5uZXh0KCk7Ci0gICAgICAgICAgICBpZiAoIXByb3BlcnR5LmlzVGFnRXhjbHVkZWQoKS5ib29sZWFuVmFsdWUoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzLmFkZChwcm9wZXJ0eS5nZXROYW1lKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gTm93IGdldCBhIGxpc3Qgb2YgUHJvcGVydHlNZXRhcwotICAgICAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIEl0ZXJhdG9yIGl0ZXIgPSBhdHRyaWJ1dGVzLml0ZXJhdG9yKCk7Ci0gICAgICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIGF0dHJOYW1lID0gKFN0cmluZykgaXRlci5uZXh0KCk7Ci0gICAgICAgICAgICBsaXN0LmFkZChjb21wb25lbnQuZ2V0UHJvcGVydHkoYXR0ck5hbWUpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbGlzdDsgICAgICAgIAotICAgIH0KLSAgICAKLSAgICBzdGF0aWMgcHVibGljIExpc3QgZ2V0U29ydGVkRmFjZXRMaXN0KEZhY2V0SG9sZGVyIGNvbXBvbmVudCkKLSAgICB7Ci0gICAgICAgIFRyZWVTZXQgZmFjZXROYW1lcyA9IG5ldyBUcmVlU2V0KCk7Ci0gICAgICAgIEl0ZXJhdG9yIGl0ZXIgPSBjb21wb25lbnQuZmFjZXRzKCk7Ci0gICAgICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgZmFjZXROYW1lcy5hZGQoKChGYWNldE1ldGEpIGl0ZXIubmV4dCgpKS5nZXROYW1lKCkpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyBOb3cgZ2V0IGEgbGlzdCBvZiBQcm9wZXJ0eU1ldGFzCi0gICAgICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgSXRlcmF0b3IgbmFtZUl0ZXIgPSBmYWNldE5hbWVzLml0ZXJhdG9yKCk7Ci0gICAgICAgIHdoaWxlIChuYW1lSXRlci5oYXNOZXh0KCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyBuYW1lID0gKFN0cmluZykgbmFtZUl0ZXIubmV4dCgpOwotICAgICAgICAgICAgbGlzdC5hZGQoY29tcG9uZW50LmdldEZhY2V0KG5hbWUpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbGlzdDsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQHNpbmNlIDEuMC40Ci0gICAgICogQHBhcmFtIGNvbXBvbmVudAotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBzdGF0aWMgcHVibGljIExpc3QgZ2V0U29ydGVkTGlzdGVuZXJMaXN0KExpc3RlbmVySG9sZGVyIGNvbXBvbmVudCkKLSAgICB7Ci0gICAgICAgIFRyZWVTZXQgZmFjZXROYW1lcyA9IG5ldyBUcmVlU2V0KCk7Ci0gICAgICAgIEl0ZXJhdG9yIGl0ZXIgPSBjb21wb25lbnQubGlzdGVuZXJzKCk7Ci0gICAgICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgZmFjZXROYW1lcy5hZGQoKChMaXN0ZW5lck1ldGEpIGl0ZXIubmV4dCgpKS5nZXRDbGFzc05hbWUoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vIE5vdyBnZXQgYSBsaXN0IG9mIFByb3BlcnR5TWV0YXMKLSAgICAgICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBJdGVyYXRvciBuYW1lSXRlciA9IGZhY2V0TmFtZXMuaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUgKG5hbWVJdGVyLmhhc05leHQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSAoU3RyaW5nKSBuYW1lSXRlci5uZXh0KCk7Ci0gICAgICAgICAgICBsaXN0LmFkZChjb21wb25lbnQuZ2V0TGlzdGVuZXIobmFtZSkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBsaXN0OwotICAgIH0KLSAgICAKLSAgICBzdGF0aWMgcHVibGljIExpc3QgZ2V0U29ydGVkQXR0cmlidXRlTGlzdChBdHRyaWJ1dGVIb2xkZXIgY29tcG9uZW50KQotICAgIHsKLSAgICAgICAgLy8gU29ydCB0aGUgbmFtZXMKLSAgICAgICAgVHJlZVNldCBhdHRyaWJ1dGVzID0gbmV3IFRyZWVTZXQoKTsKLSAgICAgICAgSXRlcmF0b3IgYXR0cnMgPSBjb21wb25lbnQuYXR0cmlidXRlcygpOwotICAgICAgICB3aGlsZSAoYXR0cnMuaGFzTmV4dCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBBdHRyaWJ1dGVNZXRhIGF0dHJpYnV0ZSA9IChBdHRyaWJ1dGVNZXRhKSBhdHRycy5uZXh0KCk7Ci0gICAgICAgICAgICBhdHRyaWJ1dGVzLmFkZChhdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIE5vdyBnZXQgYSBsaXN0IG9mIFByb3BlcnR5TWV0YXMKLSAgICAgICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBJdGVyYXRvciBpdGVyID0gYXR0cmlidXRlcy5pdGVyYXRvcigpOwotICAgICAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyBhdHRyTmFtZSA9IChTdHJpbmcpIGl0ZXIubmV4dCgpOwotICAgICAgICAgICAgbGlzdC5hZGQoY29tcG9uZW50LmdldEF0dHJpYnV0ZShhdHRyTmFtZSkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBsaXN0OyAgICAgICAgCi0gICAgfQotICAgICAgICAKLSAgICBzdGF0aWMgcHVibGljIE1hcCBnZXRSZW5kZXJlckNsYXNzZXMoQ29tcG9uZW50TWV0YSBjb21wb25lbnQsIE1vZGVsIG1vZGVsKQotICAgIHsKLSAgICAgICAgTWFwIGNvbXBvbmVudFJlbmRlcmVycyA9IG5ldyBIYXNoTWFwKCk7IAotICAgICAgICBMaXN0IHJlbmRlcktpdHMgPSBtb2RlbC5nZXRSZW5kZXJLaXRzKCk7Ci0gICAgICAgIGlmIChyZW5kZXJLaXRzICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXQgPSByZW5kZXJLaXRzLml0ZXJhdG9yKCk7aXQuaGFzTmV4dCgpOykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBSZW5kZXJLaXRNZXRhIHJlbmRlcmtpdCA9IChSZW5kZXJLaXRNZXRhKSBpdC5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgUmVuZGVyZXJNZXRhIHJlbmRlcmVyID0gcmVuZGVya2l0LmZpbmRSZW5kZXJlcihjb21wb25lbnQuZ2V0RmFtaWx5KCksIGNvbXBvbmVudC5nZXRSZW5kZXJlclR5cGUoKSk7Ci0gICAgICAgICAgICAgICAgaWYgKHJlbmRlcmVyICE9IG51bGwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRSZW5kZXJlcnMucHV0KHJlbmRlcmtpdC5nZXRSZW5kZXJLaXRJZCgpLCByZW5kZXJlci5nZXRDbGFzc05hbWUoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjb21wb25lbnRSZW5kZXJlcnM7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvTk9USUNFIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvTk9USUNFCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYTNkYmQ2Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL05PVElDRQorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLT09ICBOT1RJQ0UgZmlsZSBjb3JyZXNwb25kaW5nIHRvIHNlY3Rpb24gNChkKSBvZiB0aGUgQXBhY2hlIExpY2Vuc2UsICAgPT0KLT09ICBWZXJzaW9uIDIuMCwgaW4gdGhpcyBjYXNlIGZvciB0aGUgQXBhY2hlIE15RmFjZXMgTWF2ZW4gUGx1Z2lucyAgICAgPT0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSAKLVRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuCi0KLVBvcnRpb25zIG9mIHRoaXMgc29mdHdhcmUgd2VyZSBvcmlnaW5hbGx5IGJhc2VkIG9uIHRoZSBmb2xsb3dpbmc6Ci0KLSAtIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDA2LCBPcmFjbGUgQ29ycCwgPGh0dHA6Ly93d3cub3JhY2xlLmNvbS8+LgotYW5kIGFyZSBsaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gdW5kZXIgdGhlIAotIlNvZnR3YXJlIEdyYW50IGFuZCBDb3Jwb3JhdGUgQ29udHJpYnV0aW9uIExpY2Vuc2UgQWdyZWVtZW50IgotCi1TZWUgdGhlIExJQ0VOU0UudHh0IGZpbGUgZm9yIGluZm9ybWF0aW9uIG9uIGFsbCBsaWNlbnNlcyAKLWFzc29jaWF0ZWQgd2l0aCB0aGlzIHNvZnR3YXJlLgpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvYmVoYXZpb3JDbGFzc01hY3JvczIwLnZtIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvYmVoYXZpb3JDbGFzc01hY3JvczIwLnZtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MzYyZGU3Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL2JlaGF2aW9yQ2xhc3NNYWNyb3MyMC52bQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotIyMgTWFjcm8gZGVmaW5pdGlvbnMgZm9yIGNvbXBvbmVudCBjbGFzcyBkZWZpbml0aW9uDQotIyMNCi0jIyBWZWxvY2l0eSBtYWNyb3MgZGVmaW5lZCBpbiB0aGlzIGZpbGUgd2lsbCBiZSBhdmFpbGFibGUgd2hlbiBleGVjdXRpbmcNCi0jIyB0aGUgY29tcG9uZW50Q2xhc3MxMS52bSB0ZW1wbGF0ZSBmaWxlLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL2NvbXBvbmVudENsYXNzMTEudm0gYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9jb21wb25lbnRDbGFzczExLnZtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZGU5NWJhLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL2NvbXBvbmVudENsYXNzMTEudm0KKysrIC9kZXYvbnVsbApAQCAtMSwyNjUgKzAsMCBAQAotIyMgVmVsb2NpdHkgdGVtcGxhdGUgdXNlZCB0byBnZW5lcmF0ZSBKU0YxLjEtY29tcGF0aWJsZSBjb21wb25lbnQgY2xhc3NlcwotIyMgZnJvbSBjb21wb25lbnQgbWV0YS1kYXRhLgotIyMKLSMjIE5vdGUgdGhhdCB0aGVyZSBhcmUgdHdvIHR5cGVzIG9mIGNvbXBvbmVudCBnZW5lcmF0aW9uOgotIyMgICogInN1YmNsYXNzIG1vZGUiICh1c2UgYW5ub3RhdGVkIGNsYXNzIGFzIGEgcGFyZW50IGNsYXNzKQotIyMgICogInRlbXBsYXRlIG1vZGUiICh1c2UgYW5ub3RhdGVkIGNsYXNzIGFzIGEgdGVtcGxhdGUpCi0jIyBUaGlzIHRlbXBsYXRlIGZpbGUgaXMgdXNlZCBmb3IgYm90aC4KLSMjCi0jIyBWYXJpYWJsZSAkY29tcG9uZW50IHJlZmVycyB0byBhIENvbXBvbmVudE1ldGEgb2JqZWN0IHRvIHByb2Nlc3MKLSMjIFZhcmlhYmxlICR1dGlscyByZWZlcnMgdG8gYW4gaW5zdGFuY2Ugb2YgTXlmYWNlc1V0aWxzLgotIyMKLSMjIFdoZW4gInRlbXBsYXRlIG1vZGUiIGlzIGJlaW5nIHVzZWQgdGhlbiB2YXJpYWJsZSAkaW5uZXJzb3VyY2UKLSMjIGhvbGRzIGEgU3RyaW5nIGNvbnRhaW5pbmcgYWxsIHRoZSBub24tYWJzdHJhY3QgZnVuY3Rpb25zIGRlZmluZWQKLSMjIGluIHRoZSBhbm5vdGF0ZWQgY2xhc3MuCi0jIwotIyMgVGhlIGphdmEgcGFja2FnZSBvZiB0aGUgZ2VuZXJhdGVkIGNsYXNzIGlzIGFsd2F5cyB0aGUgc2FtZSBhcwotIyMgdGhlIHBhY2thZ2UgaW4gd2hpY2ggdGhlIGFubm90YXRlZCBjbGFzcyBleGlzdHMuCi0jIwotIyMgVGhpcyBmaWxlIGlzIG5vdCBhY3R1YWxseSB1c2VkIChleGNlcHQgZm9yIHVuaXQgdGVzdGluZykuIEVhY2gKLSMjIHByb2plY3QgdGhhdCB1c2VzIHRoZSBteWZhY2VzLWJ1aWxkZXItcGx1Z2luIGlzIGV4cGVjdGVkIHRvIGNvcHkKLSMjIHRoaXMgZmlsZSBpbnRvIGl0cyBvd24gTUVUQS1JTkYgZGlyLCBmcm9tIHdoZXJlIHRoZSBidWlsZGVyCi0jIyBwbHVnaW4gd2lsbCByZXRyaWV2ZSBpdC4KLSMjCi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlICR7Y29tcG9uZW50LnBhY2thZ2VOYW1lfTsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsKLWltcG9ydCBqYXZheC5mYWNlcy5lbC5WYWx1ZUJpbmRpbmc7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7Ci1pbXBvcnQgJGNvbXBvbmVudC5wYXJlbnRDbGFzc05hbWU7Ci0kdXRpbHMuaW1wb3J0VGFnQ2xhc3NlcygkY29tcG9uZW50KQotCi0jaWYgKCRjb21wb25lbnQuaXNUZW1wbGF0ZSgpKQotI3NldCAoJGdlbmVyYXRlZENsYXNzUGFyZW50ID0gJGNvbXBvbmVudC5zb3VyY2VDbGFzc1BhcmVudENsYXNzTmFtZSkKLSNlbHNlCi0jc2V0ICgkZ2VuZXJhdGVkQ2xhc3NQYXJlbnQgPSAkY29tcG9uZW50LnNvdXJjZUNsYXNzTmFtZSkKLSNlbmQKLS8vIEdlbmVyYXRlZCBmcm9tIGNsYXNzICR7Y29tcG9uZW50LnNvdXJjZUNsYXNzTmFtZX0uCi0vLwotLy8gV0FSTklORzogVGhpcyBmaWxlIHdhcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZC4gRG8gbm90IGVkaXQgaXQgZGlyZWN0bHksCi0vLyAgICAgICAgICBvciB5b3Ugd2lsbCBsb3NlIHlvdXIgY2hhbmdlcy4KLXB1YmxpYyBjbGFzcyAke3V0aWxzLmdldENsYXNzRnJvbUZ1bGxDbGFzcygkY29tcG9uZW50LmNsYXNzTmFtZSl9IGV4dGVuZHMgJGdlbmVyYXRlZENsYXNzUGFyZW50Ci0jaWYgKCRjb21wb25lbnQuaW1wbGVtZW50cykKLSAgICBpbXBsZW1lbnRzICRjb21wb25lbnQuaW1wbGVtZW50cwotI2VuZAotewotI2lmICgkY29tcG9uZW50LnNlcmlhbHVpZCkKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAke2NvbXBvbmVudC5zZXJpYWx1aWR9OyAKLSNlbmQgIAotCi0jIyAgICBzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBDT01QT05FTlRfRkFNSUxZID0KLSMjICAgICAgICAiJGNvbXBvbmVudC5mYW1pbHkiOwotICAgIHN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIENPTVBPTkVOVF9UWVBFID0KLSAgICAgICAgIiRjb21wb25lbnQudHlwZSI7Ci0KLSNpZiAoJGlubmVyc291cmNlKQotICAgIC8vQkVHSU4gQ09ERSBDT1BJRUQgRlJPTSAkY29tcG9uZW50LnNvdXJjZUNsYXNzTmFtZSAKLSRpbm5lcnNvdXJjZQotICAgIC8vRU5EIENPREUgQ09QSUVEIEZST00gJGNvbXBvbmVudC5zb3VyY2VDbGFzc05hbWUKLSNlbmQKLQotICAgIHB1YmxpYyAke3V0aWxzLmdldENsYXNzRnJvbUZ1bGxDbGFzcygkY29tcG9uZW50LmNsYXNzTmFtZSl9KCkKLSAgICB7Ci0jaWYgKCRjb21wb25lbnQucmVuZGVyZXJUeXBlKQotI2lmICgkY29tcG9uZW50LnJlbmRlcmVyVHlwZSA9PSAiIikKLSAgICAgICAgc2V0UmVuZGVyZXJUeXBlKG51bGwpOwotI2Vsc2UKLSAgICAgICAgc2V0UmVuZGVyZXJUeXBlKCIkY29tcG9uZW50LnJlbmRlcmVyVHlwZSIpOwotI2VuZAotI2Vsc2UKLSAgICAgICAgc2V0UmVuZGVyZXJUeXBlKG51bGwpOwotI2VuZAotICAgIH0KLQotIyMgT24gbXlmYWNlcyAxLjEgdGhlIGZhbWlseSBpcyBpbmhlcml0ZWQsIHNvIHRoaXMgY291bGQgYmUgY29tbWVudGVkICAgIAotIyMgICAgcHVibGljIFN0cmluZyBnZXRGYW1pbHkoKQotIyMgICAgewotIyMgICAgICAgIHJldHVybiBDT01QT05FTlRfRkFNSUxZOwotIyMgICAgfQotICAgIAotI3NldCAoJHByb3BlcnR5TGlzdCA9ICR7Y29tcG9uZW50LnByb3BlcnR5Q29tcG9uZW50TGlzdH0pCi0KLSNmb3JlYWNoKCAkcHJvcGVydHkgaW4gJHByb3BlcnR5TGlzdCApCi0jc2V0ICgkZmllbGQgPSAkcHJvcGVydHkuZmllbGROYW1lKQotI3NldCAoJHR5cGUgPSAkdXRpbHMuZ2V0Q2xhc3NGcm9tRnVsbENsYXNzKCRwcm9wZXJ0eS5jbGFzc05hbWUpKQotI2lmKCR1dGlscy5nZXREZWZhdWx0VmFsdWVGaWVsZCgkcHJvcGVydHkpKSAKLSNzZXQgKCRkZWZhdWx0VmFsdWUgPSAkdXRpbHMuZ2V0RGVmYXVsdFZhbHVlRmllbGQoJHByb3BlcnR5KSkKLSNlbHNlCi0jc2V0ICgkZGVmYXVsdFZhbHVlID0gZmFsc2UpCi0jZW5kCi0gICAgLy8gUHJvcGVydHk6ICRwcm9wZXJ0eS5uYW1lCi0jaWYgKCRwcm9wZXJ0eS5pc0xpdGVyYWxPbmx5KCkgfHwgJHByb3BlcnR5LmlzVGFnRXhjbHVkZWQoKSApCi0gICAgcHJpdmF0ZSAkdHlwZSAkZmllbGQgI2lmKCRkZWZhdWx0VmFsdWUpID0gJGRlZmF1bHRWYWx1ZTsje2Vsc2V9OyN7ZW5kfQotCi0gICAgIAotI2Vsc2UKLSAgICBwcml2YXRlICR0eXBlICRmaWVsZDsKLSAgICAKLSNlbmQKLSNpZigkdXRpbHMuaXNQcmltaXRpdmVDbGFzcygkdHlwZSkgJiYgISRwcm9wZXJ0eS5pc1RhZ0V4Y2x1ZGVkKCkKLSAgICAmJiAhJHByb3BlcnR5LmlzTGl0ZXJhbE9ubHkoKSApCi0gICAgcHJpdmF0ZSBib29sZWFuICR7ZmllbGR9U2V0OwotICAgIAotI2lmICgkcHJvcGVydHkuaXNTZXRNZXRob2QoKSkKLSAgICAkcHJvcGVydHkuc2V0TWV0aG9kU2NvcGUgYm9vbGVhbiAkdXRpbHMuZ2V0UHJlZml4ZWRQcm9wZXJ0eU5hbWUoImlzU2V0IiwgJHByb3BlcnR5Lm5hbWUpKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAke2ZpZWxkfVNldDsKLSAgICB9Ci0jZW5kCi0jZW5kCi0jaWYoJHByb3BlcnR5LmlzTG9jYWxNZXRob2QoKSkKLSNpZigiYm9vbGVhbiIgPT0gJHR5cGUpCi0jc2V0ICgkbWV0aG9kTmFtZSA9ICR1dGlscy5nZXRQcmVmaXhlZFByb3BlcnR5TmFtZSgiaXNMb2NhbCIsICRwcm9wZXJ0eS5uYW1lKSkKLSNlbHNlCi0jc2V0ICgkbWV0aG9kTmFtZSA9ICR1dGlscy5nZXRQcmVmaXhlZFByb3BlcnR5TmFtZSgiZ2V0TG9jYWwiLCAkcHJvcGVydHkubmFtZSkpCi0jZW5kCi0gICAgZmluYWwgJHByb3BlcnR5LmxvY2FsTWV0aG9kU2NvcGUgJHR5cGUgJHttZXRob2ROYW1lfSgpCi0gICAgewotICAgICAgICByZXR1cm4gJGZpZWxkOwotICAgIH0KLSAgICAgCi0jZW5kCi0gICAgcHVibGljICR0eXBlICR1dGlscy5nZXRNZXRob2RSZWFkZXJGcm9tUHJvcGVydHkoJHByb3BlcnR5Lm5hbWUsICR0eXBlKSgpCi0gICAgewotI2lmICgkcHJvcGVydHkuaXNUYWdFeGNsdWRlZCgpIHx8ICRwcm9wZXJ0eS5pc0xpdGVyYWxPbmx5KCkpCi0gICAgICAgIHJldHVybiAkZmllbGQ7Ci0jZWxzZQotI2lmICgkdXRpbHMuaXNQcmltaXRpdmVDbGFzcygkdHlwZSkpCi0gICAgICAgIGlmICgke2ZpZWxkfVNldCkKLSNlbHNlCi0gICAgICAgIGlmICgkZmllbGQgIT0gbnVsbCkKLSNlbmQKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuICRmaWVsZDsKLSAgICAgICAgfQotICAgICAgICBWYWx1ZUJpbmRpbmcgdmIgPSBnZXRWYWx1ZUJpbmRpbmcoIiRwcm9wZXJ0eS5uYW1lIik7Ci0gICAgICAgIGlmICh2YiAhPSBudWxsKQotICAgICAgICB7Ci0jaWYgKCR1dGlscy5pc1ByaW1pdGl2ZUNsYXNzKCR0eXBlKSkKLSAgICAgICAgICAgIHJldHVybiAoJHV0aWxzLmNhc3RJZk5lY2Vzc2FyeSgkdHlwZSkgdmIuZ2V0VmFsdWUoZ2V0RmFjZXNDb250ZXh0KCkpKS4ke3R5cGV9VmFsdWUoKTsKLSNlbHNlCi0jc2V0ICgkcHJpdHlwZSA9ICR1dGlscy5nZXRQcmltaXRpdmVUeXBlKCRwcm9wZXJ0eS5jbGFzc05hbWUpKQotI2lmICgkdXRpbHMuaXNQcmltaXRpdmVDbGFzcygkcHJpdHlwZSkpCi0gICAgICAgICAgICBPYmplY3QgdmFsdWUgPSB2YiA9PSBudWxsID8gbnVsbCA6IHZiLmdldFZhbHVlKGdldEZhY2VzQ29udGV4dCgpKTsKLSAgICAgICAgICAgIGlmICghKHZhbHVlIGluc3RhbmNlb2YgJHR5cGUpKXsKLSAgICAgICAgICAgICAgICB2YWx1ZSA9ICR7dHlwZX0udmFsdWVPZih2YWx1ZS50b1N0cmluZygpKTsKLSAgICAgICAgICAgIH0gICAgICAgICAgICAKLSAgICAgICAgICAgIHJldHVybiAkdXRpbHMuY2FzdElmTmVjZXNzYXJ5KCR0eXBlKSB2YWx1ZTsKLSNlbHNlaWYgKCR0eXBlID09ICJTdHJpbmciKQotIyMgTVlGQUNFUy0yMDA2IHVzZSB0b1N0cmluZygpLCBzbyBOdW1lcmljIFZhbHVlQmluZGluZyBjb3VsZCBiZSBjb252ZXJ0ZWQgYXMKLSMjIFN0cmluZ3MgYW5kIGRvIG5vdCBjYXVzZSBDbGFzc0Nhc3RFeGNlcHRpb24gCi0jIyAob25seSBhcHBsaWVzIGZvciBKU0YgMS4xIGR1ZSB0byBiYWNrd2FyZCBjb21wYXRpYmlsaXR5KSAKLSAgICAgICAgICAgIHJldHVybiAkdXRpbHMuY2FzdElmTmVjZXNzYXJ5KCR0eXBlKSB2Yi5nZXRWYWx1ZShnZXRGYWNlc0NvbnRleHQoKSkudG9TdHJpbmcoKTsKLSNlbHNlCi0gICAgICAgICAgICByZXR1cm4gJHV0aWxzLmNhc3RJZk5lY2Vzc2FyeSgkdHlwZSkgdmIuZ2V0VmFsdWUoZ2V0RmFjZXNDb250ZXh0KCkpOwotI2VuZAotI2VuZAotICAgICAgICB9Ci0jaWYgKCRkZWZhdWx0VmFsdWUpCi0gICAgICAgIHJldHVybiAkZGVmYXVsdFZhbHVlOyAKLSNlbHNlaWYgKCR1dGlscy5pc1ByaW1pdGl2ZUNsYXNzKCR0eXBlKSkKLSAgICAgICAgcmV0dXJuICR1dGlscy5wcmltaXRpdmVEZWZhdWx0VmFsdWUoJHR5cGUpOwotI2Vsc2UgICAgICAgCi0gICAgICAgIHJldHVybiBudWxsOwotI2VuZAotI2VuZAotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkICR1dGlscy5nZXRQcmVmaXhlZFByb3BlcnR5TmFtZSgic2V0IiwgJHByb3BlcnR5Lm5hbWUpKCR0eXBlICR1dGlscy5nZXRWYXJpYWJsZUZyb21OYW1lKCRwcm9wZXJ0eS5uYW1lKSkKLSAgICB7Ci0gICAgICAgIHRoaXMuJGZpZWxkID0gJHV0aWxzLmdldFZhcmlhYmxlRnJvbU5hbWUoJHByb3BlcnR5Lm5hbWUpOwotI2lmICgkdXRpbHMuaXNQcmltaXRpdmVDbGFzcygkdHlwZSkgJiYgISRwcm9wZXJ0eS5pc1RhZ0V4Y2x1ZGVkKCkgCi0gICAgICYmICEkcHJvcGVydHkuaXNMaXRlcmFsT25seSgpKQotICAgICAgICB0aGlzLiR7ZmllbGR9U2V0ID0gdHJ1ZTsgICAgICAgIAotI2VuZAotICAgIH0KLSNlbmQKLQotICAgIHB1YmxpYyBPYmplY3Qgc2F2ZVN0YXRlKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQpCi0gICAgewotI3NldCAoJHByaW1pdGl2ZUNvdW50ID0gJHByb3BlcnR5TGlzdC5zaXplKCkgKyAxKQotI2ZvcmVhY2goICRwcm9wZXJ0eSBpbiAkcHJvcGVydHlMaXN0ICkKLSNpZigkdXRpbHMuaXNQcmltaXRpdmVDbGFzcygkcHJvcGVydHkuY2xhc3NOYW1lKSAmJiAKLSAgICAhJHByb3BlcnR5LmlzTGl0ZXJhbE9ubHkoKSkKLSNzZXQgKCRwcmltaXRpdmVDb3VudCA9ICRwcmltaXRpdmVDb3VudCArIDEpCi0jZW5kCi0jZW5kCi0gICAgICAgIE9iamVjdFtdIHZhbHVlcyA9IG5ldyBPYmplY3RbJHByaW1pdGl2ZUNvdW50XTsKLSAgICAgICAgdmFsdWVzWzBdID0gc3VwZXIuc2F2ZVN0YXRlKGZhY2VzQ29udGV4dCk7Ci0jc2V0ICgkYXJyYXlJbmRleCA9IDApCi0jZm9yZWFjaCggJHByb3BlcnR5IGluICRwcm9wZXJ0eUxpc3QgKQotI3NldCAoJGZpZWxkID0gJHByb3BlcnR5LmZpZWxkTmFtZSkKLSNzZXQgKCR0eXBlID0gJHByb3BlcnR5LmNsYXNzTmFtZSkKLSNzZXQgKCRhcnJheUluZGV4ID0gJGFycmF5SW5kZXggKyAxKQotI2lmICgkcHJvcGVydHkuanNwTmFtZSA9PSAidmFsaWRhdG9yIiAmJiAkcHJvcGVydHkuaXNNZXRob2RCaW5kaW5nKCkgKQotICAgICAgICB2YWx1ZXNbJGFycmF5SW5kZXhdID0gc2F2ZUF0dGFjaGVkU3RhdGUoZmFjZXNDb250ZXh0LCR7ZmllbGR9TGlzdCk7Ci0jZWxzZWlmICggJHByb3BlcnR5LmlzU3RhdGVIb2xkZXIoKSApIyMgfHwgJHV0aWxzLmlzQ29udmVydGVyKCR0eXBlKQotICAgICAgICB2YWx1ZXNbJGFycmF5SW5kZXhdID0gc2F2ZUF0dGFjaGVkU3RhdGUoZmFjZXNDb250ZXh0LCRmaWVsZCk7Ci0jZWxzZWlmKCR1dGlscy5pc1ByaW1pdGl2ZUNsYXNzKCR0eXBlKSkKLSNpZiAoJHR5cGUgPT0gImJvb2xlYW4iKQotICAgICAgICB2YWx1ZXNbJGFycmF5SW5kZXhdID0gJHt1dGlscy5nZXRCb3hlZENsYXNzKCR0eXBlKX0udmFsdWVPZigkZmllbGQpOwotI2Vsc2UKLSAgICAgICAgdmFsdWVzWyRhcnJheUluZGV4XSA9IG5ldyAke3V0aWxzLmdldEJveGVkQ2xhc3MoJHR5cGUpfSgkZmllbGQpOwotI2VuZAotI2Vsc2UKLSAgICAgICAgdmFsdWVzWyRhcnJheUluZGV4XSA9ICRmaWVsZDsKLSNlbmQKLSNpZigkdXRpbHMuaXNQcmltaXRpdmVDbGFzcygkdHlwZSkgJiYgISRwcm9wZXJ0eS5pc1RhZ0V4Y2x1ZGVkKCkKLSAgICAmJiAhJHByb3BlcnR5LmlzTGl0ZXJhbE9ubHkoKSApCi0jc2V0ICgkYXJyYXlJbmRleCA9ICRhcnJheUluZGV4ICsgMSkKLSAgICAgICAgdmFsdWVzWyRhcnJheUluZGV4XSA9IEJvb2xlYW4udmFsdWVPZigke2ZpZWxkfVNldCk7Ci0jZW5kCi0jZW5kCi0gICAgICAgIHJldHVybiB2YWx1ZXM7IAotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlc3RvcmVTdGF0ZShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBPYmplY3Qgc3RhdGUpCi0gICAgewotICAgICAgICBPYmplY3RbXSB2YWx1ZXMgPSAoT2JqZWN0W10pc3RhdGU7Ci0gICAgICAgIHN1cGVyLnJlc3RvcmVTdGF0ZShmYWNlc0NvbnRleHQsdmFsdWVzWzBdKTsKLSNzZXQgKCRhcnJheUluZGV4ID0gMCkKLSNmb3JlYWNoKCAkcHJvcGVydHkgaW4gJHByb3BlcnR5TGlzdCApCi0jc2V0ICgkZmllbGQgPSAkcHJvcGVydHkuZmllbGROYW1lKQotI3NldCAoJHR5cGUgPSAkcHJvcGVydHkuY2xhc3NOYW1lKQotI3NldCAoJGFycmF5SW5kZXggPSAkYXJyYXlJbmRleCArIDEpCi0jaWYgKCAkcHJvcGVydHkuaXNTdGF0ZUhvbGRlcigpICkKLSNpZiAoJHByb3BlcnR5LmpzcE5hbWUgPT0gInZhbGlkYXRvciIgJiYgJHByb3BlcnR5LmlzTWV0aG9kQmluZGluZygpICkKLSAgICAgICAgJHtmaWVsZH1MaXN0ID0gKExpc3Q8VmFsaWRhdG9yPikgcmVzdG9yZUF0dGFjaGVkU3RhdGUoZmFjZXNDb250ZXh0LHZhbHVlc1skYXJyYXlJbmRleF0pOwotI2Vsc2VpZiAoJHV0aWxzLmlzTGlzdCgkdHlwZSkpCi0gICAgICAgICRmaWVsZCA9IChMaXN0KSByZXN0b3JlQXR0YWNoZWRTdGF0ZShmYWNlc0NvbnRleHQsdmFsdWVzWyRhcnJheUluZGV4XSk7Ci0jZWxzZQotICAgICAgICAkZmllbGQgPSAkdXRpbHMuY2FzdElmTmVjZXNzYXJ5KCR0eXBlKSByZXN0b3JlQXR0YWNoZWRTdGF0ZShmYWNlc0NvbnRleHQsdmFsdWVzWyRhcnJheUluZGV4XSk7IAotI2VuZAotI2Vsc2VpZiAoJHV0aWxzLmlzQ29udmVydGVyKCR0eXBlKSkgCi0gICAgICAgICRmaWVsZCA9IChDb252ZXJ0ZXIpIHJlc3RvcmVBdHRhY2hlZFN0YXRlKGZhY2VzQ29udGV4dCx2YWx1ZXNbJGFycmF5SW5kZXhdKTsKLSNlbHNlaWYgKCR1dGlscy5pc1ByaW1pdGl2ZUNsYXNzKCR0eXBlKSkKLSAgICAgICAgJGZpZWxkID0gKCR1dGlscy5jYXN0SWZOZWNlc3NhcnkoJHR5cGUpIHZhbHVlc1skYXJyYXlJbmRleF0pLiR7dHlwZX1WYWx1ZSgpOwotI2Vsc2UKLSAgICAgICAgJGZpZWxkID0gJHV0aWxzLmNhc3RJZk5lY2Vzc2FyeSgkdHlwZSkgdmFsdWVzWyRhcnJheUluZGV4XTsKLSNlbmQKLSNpZigkdXRpbHMuaXNQcmltaXRpdmVDbGFzcygkdHlwZSkgJiYgISRwcm9wZXJ0eS5pc1RhZ0V4Y2x1ZGVkKCkKLSAgICAmJiAhJHByb3BlcnR5LmlzTGl0ZXJhbE9ubHkoKSApCi0jc2V0ICgkYXJyYXlJbmRleCA9ICRhcnJheUluZGV4ICsgMSkKLSAgICAgICAgJHtmaWVsZH1TZXQgPSAoKEJvb2xlYW4pIHZhbHVlc1skYXJyYXlJbmRleF0pLmJvb2xlYW5WYWx1ZSgpOwotI2VuZAotI2VuZAotICAgIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL2NvbXBvbmVudENsYXNzMTIudm0gYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9jb21wb25lbnRDbGFzczEyLnZtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNTgwYzllLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL2NvbXBvbmVudENsYXNzMTIudm0KKysrIC9kZXYvbnVsbApAQCAtMSwyNTYgKzAsMCBAQAotIyMgVmVsb2NpdHkgdGVtcGxhdGUgdXNlZCB0byBnZW5lcmF0ZSBKU0YxLjItY29tcGF0aWJsZSBjb21wb25lbnQgY2xhc3Nlcw0KLSMjIGZyb20gY29tcG9uZW50IG1ldGEtZGF0YS4NCi0jIw0KLSMjIE5vdGUgdGhhdCB0aGVyZSBhcmUgdHdvIHR5cGVzIG9mIGNvbXBvbmVudCBnZW5lcmF0aW9uOg0KLSMjICAqICJzdWJjbGFzcyBtb2RlIiAodXNlIGFubm90YXRlZCBjbGFzcyBhcyBhIHBhcmVudCBjbGFzcykNCi0jIyAgKiAidGVtcGxhdGUgbW9kZSIgKHVzZSBhbm5vdGF0ZWQgY2xhc3MgYXMgYSB0ZW1wbGF0ZSkNCi0jIyBUaGlzIHRlbXBsYXRlIGZpbGUgaXMgdXNlZCBmb3IgYm90aC4NCi0jIw0KLSMjIFZhcmlhYmxlICRjb21wb25lbnQgcmVmZXJzIHRvIGEgQ29tcG9uZW50TWV0YSBvYmplY3QgdG8gcHJvY2Vzcw0KLSMjIFZhcmlhYmxlICR1dGlscyByZWZlcnMgdG8gYW4gaW5zdGFuY2Ugb2YgTXlmYWNlc1V0aWxzLg0KLSMjDQotIyMgV2hlbiAidGVtcGxhdGUgbW9kZSIgaXMgYmVpbmcgdXNlZCB0aGVuIHZhcmlhYmxlICRpbm5lcnNvdXJjZQ0KLSMjIGhvbGRzIGEgU3RyaW5nIGNvbnRhaW5pbmcgYWxsIHRoZSBub24tYWJzdHJhY3QgZnVuY3Rpb25zIGRlZmluZWQNCi0jIyBpbiB0aGUgYW5ub3RhdGVkIGNsYXNzLg0KLSMjDQotIyMgVGhlIGphdmEgcGFja2FnZSBvZiB0aGUgZ2VuZXJhdGVkIGNsYXNzIGlzIGFsd2F5cyB0aGUgc2FtZSBhcw0KLSMjIHRoZSBwYWNrYWdlIGluIHdoaWNoIHRoZSBhbm5vdGF0ZWQgY2xhc3MgZXhpc3RzLg0KLSMjDQotLyoNCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqIA0KLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKiANCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSAke2NvbXBvbmVudC5wYWNrYWdlTmFtZX07DQotDQotaW1wb3J0IGphdmF4LmVsLlZhbHVlRXhwcmVzc2lvbjsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotJHV0aWxzLmltcG9ydFRhZ0NsYXNzZXMoJGNvbXBvbmVudCkNCi0NCi0jaWYgKCRjb21wb25lbnQuaXNUZW1wbGF0ZSgpKQ0KLSNzZXQgKCRnZW5lcmF0ZWRDbGFzc1BhcmVudCA9ICRjb21wb25lbnQuc291cmNlQ2xhc3NQYXJlbnRDbGFzc05hbWUpDQotI2Vsc2UNCi0jc2V0ICgkZ2VuZXJhdGVkQ2xhc3NQYXJlbnQgPSAkY29tcG9uZW50LnNvdXJjZUNsYXNzTmFtZSkNCi0jZW5kDQotLy8gR2VuZXJhdGVkIGZyb20gY2xhc3MgJHtjb21wb25lbnQuc291cmNlQ2xhc3NOYW1lfS4NCi0vLw0KLS8vIFdBUk5JTkc6IFRoaXMgZmlsZSB3YXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQuIERvIG5vdCBlZGl0IGl0IGRpcmVjdGx5LA0KLS8vICAgICAgICAgIG9yIHlvdSB3aWxsIGxvc2UgeW91ciBjaGFuZ2VzLg0KLXB1YmxpYyBjbGFzcyAke3V0aWxzLmdldENsYXNzRnJvbUZ1bGxDbGFzcygkY29tcG9uZW50LmNsYXNzTmFtZSl9IGV4dGVuZHMgJGdlbmVyYXRlZENsYXNzUGFyZW50DQotI2lmICgkY29tcG9uZW50LmltcGxlbWVudHMpDQotICAgIGltcGxlbWVudHMgJGNvbXBvbmVudC5pbXBsZW1lbnRzDQotI2VuZA0KLXsNCi0jaWYgKCRjb21wb25lbnQuc2VyaWFsdWlkKQ0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAke2NvbXBvbmVudC5zZXJpYWx1aWR9OyANCi0jZW5kICANCi0NCi0gICAgc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgQ09NUE9ORU5UX0ZBTUlMWSA9DQotICAgICAgICAiJGNvbXBvbmVudC5mYW1pbHkiOw0KLSAgICBzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBDT01QT05FTlRfVFlQRSA9DQotICAgICAgICAiJGNvbXBvbmVudC50eXBlIjsNCi0jaWYgKCRjb21wb25lbnQucmVuZGVyZXJUeXBlKQ0KLSNpZiAoISgkY29tcG9uZW50LnJlbmRlcmVyVHlwZSA9PSAiIikpDQotICAgIHN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIERFRkFVTFRfUkVOREVSRVJfVFlQRSA9IA0KLSAgICAgICAgIiRjb21wb25lbnQucmVuZGVyZXJUeXBlIjsNCi0jZW5kDQotI2VuZA0KLQ0KLSNpZiAoJGlubmVyc291cmNlKQ0KLSAgICAvL0JFR0lOIENPREUgQ09QSUVEIEZST00gJGNvbXBvbmVudC5zb3VyY2VDbGFzc05hbWUgDQotJGlubmVyc291cmNlDQotICAgIC8vRU5EIENPREUgQ09QSUVEIEZST00gJGNvbXBvbmVudC5zb3VyY2VDbGFzc05hbWUNCi0jZW5kDQotDQotICAgIHB1YmxpYyAke3V0aWxzLmdldENsYXNzRnJvbUZ1bGxDbGFzcygkY29tcG9uZW50LmNsYXNzTmFtZSl9KCkNCi0gICAgew0KLSNpZiAoJGNvbXBvbmVudC5yZW5kZXJlclR5cGUpDQotI2lmICgkY29tcG9uZW50LnJlbmRlcmVyVHlwZSA9PSAiIikNCi0gICAgICAgIHNldFJlbmRlcmVyVHlwZShudWxsKTsNCi0jZWxzZQ0KLSAgICAgICAgc2V0UmVuZGVyZXJUeXBlKCIkY29tcG9uZW50LnJlbmRlcmVyVHlwZSIpOw0KLSNlbmQNCi0jZWxzZQ0KLSAgICAgICAgc2V0UmVuZGVyZXJUeXBlKG51bGwpOw0KLSNlbmQNCi0gICAgfQ0KLQ0KLSMjIE9uIG15ZmFjZXMgMS4xIHRoZSBmYW1pbHkgaXMgaW5oZXJpdGVkLCBzbyB0aGlzIGNvdWxkIGJlIGNvbW1lbnRlZA0KLSMjIE9uIG90aGVyIHRoaXMgc2hvdWxkIG5vdCBiZSBjb21tZW50ZWQgICAgDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RmFtaWx5KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIENPTVBPTkVOVF9GQU1JTFk7DQotICAgIH0NCi0gICAgDQotI3NldCAoJHByb3BlcnR5TGlzdCA9ICR7Y29tcG9uZW50LnByb3BlcnR5Q29tcG9uZW50TGlzdH0pDQotDQotI2ZvcmVhY2goICRwcm9wZXJ0eSBpbiAkcHJvcGVydHlMaXN0ICkNCi0jc2V0ICgkZmllbGQgPSAkcHJvcGVydHkuZmllbGROYW1lKQ0KLSNzZXQgKCR0eXBlID0gJHV0aWxzLmdldENsYXNzRnJvbUZ1bGxDbGFzcygkcHJvcGVydHkuY2xhc3NOYW1lKSkNCi0jaWYoJHV0aWxzLmdldERlZmF1bHRWYWx1ZUZpZWxkKCRwcm9wZXJ0eSkpIA0KLSNzZXQgKCRkZWZhdWx0VmFsdWUgPSAkdXRpbHMuZ2V0RGVmYXVsdFZhbHVlRmllbGQoJHByb3BlcnR5KSkNCi0jZWxzZQ0KLSNzZXQgKCRkZWZhdWx0VmFsdWUgPSBmYWxzZSkNCi0jZW5kDQotICAgIC8vIFByb3BlcnR5OiAkcHJvcGVydHkubmFtZQ0KLSNpZiAoJHByb3BlcnR5LmlzTGl0ZXJhbE9ubHkoKSB8fCAkcHJvcGVydHkuaXNUYWdFeGNsdWRlZCgpICkNCi0gICAgcHJpdmF0ZSAkdHlwZSAkZmllbGQgI2lmKCRkZWZhdWx0VmFsdWUpID0gJGRlZmF1bHRWYWx1ZTsje2Vsc2V9OyN7ZW5kfQ0KLQ0KLSAgICAgDQotI2Vsc2UNCi0gICAgcHJpdmF0ZSAkdHlwZSAkZmllbGQ7DQotICAgIA0KLSNlbmQNCi0jaWYoJHV0aWxzLmlzUHJpbWl0aXZlQ2xhc3MoJHR5cGUpICYmICEkcHJvcGVydHkuaXNUYWdFeGNsdWRlZCgpDQotICAgICYmICEkcHJvcGVydHkuaXNMaXRlcmFsT25seSgpICkNCi0gICAgcHJpdmF0ZSBib29sZWFuICR7ZmllbGR9U2V0Ow0KLSAgICANCi0jaWYgKCRwcm9wZXJ0eS5pc1NldE1ldGhvZCgpKQ0KLSAgICAkcHJvcGVydHkuc2V0TWV0aG9kU2NvcGUgYm9vbGVhbiAkdXRpbHMuZ2V0UHJlZml4ZWRQcm9wZXJ0eU5hbWUoImlzU2V0IiwgJHByb3BlcnR5Lm5hbWUpKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuICR7ZmllbGR9U2V0Ow0KLSAgICB9DQotI2VuZA0KLSNlbmQNCi0jaWYoJHByb3BlcnR5LmlzTG9jYWxNZXRob2QoKSkNCi0jaWYoImJvb2xlYW4iID09ICR0eXBlKQ0KLSNzZXQgKCRtZXRob2ROYW1lID0gJHV0aWxzLmdldFByZWZpeGVkUHJvcGVydHlOYW1lKCJpc0xvY2FsIiwgJHByb3BlcnR5Lm5hbWUpKQ0KLSNlbHNlDQotI3NldCAoJG1ldGhvZE5hbWUgPSAkdXRpbHMuZ2V0UHJlZml4ZWRQcm9wZXJ0eU5hbWUoImdldExvY2FsIiwgJHByb3BlcnR5Lm5hbWUpKQ0KLSNlbmQNCi0gICAgZmluYWwgJHByb3BlcnR5LmxvY2FsTWV0aG9kU2NvcGUgJHR5cGUgJHttZXRob2ROYW1lfSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAkZmllbGQ7DQotICAgIH0NCi0gICAgIA0KLSNlbmQNCi0gICAgcHVibGljICR0eXBlICR1dGlscy5nZXRNZXRob2RSZWFkZXJGcm9tUHJvcGVydHkoJHByb3BlcnR5Lm5hbWUsICR0eXBlKSgpDQotICAgIHsNCi0jaWYgKCRwcm9wZXJ0eS5pc1RhZ0V4Y2x1ZGVkKCkgfHwgJHByb3BlcnR5LmlzTGl0ZXJhbE9ubHkoKSkNCi0gICAgICAgIHJldHVybiAkZmllbGQ7DQotI2Vsc2UNCi0jaWYgKCR1dGlscy5pc1ByaW1pdGl2ZUNsYXNzKCR0eXBlKSkNCi0gICAgICAgIGlmICgke2ZpZWxkfVNldCkNCi0jZWxzZQ0KLSAgICAgICAgaWYgKCRmaWVsZCAhPSBudWxsKQ0KLSNlbmQNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gJGZpZWxkOw0KLSAgICAgICAgfQ0KLSAgICAgICAgVmFsdWVFeHByZXNzaW9uIHZiID0gZ2V0VmFsdWVFeHByZXNzaW9uKCIkcHJvcGVydHkubmFtZSIpOw0KLSAgICAgICAgaWYgKHZiICE9IG51bGwpDQotICAgICAgICB7DQotI2lmICgkdXRpbHMuaXNQcmltaXRpdmVDbGFzcygkdHlwZSkpDQotICAgICAgICAgICAgcmV0dXJuICgkdXRpbHMuY2FzdElmTmVjZXNzYXJ5KCR0eXBlKSB2Yi5nZXRWYWx1ZShnZXRGYWNlc0NvbnRleHQoKS5nZXRFTENvbnRleHQoKSkpLiR7dHlwZX1WYWx1ZSgpOw0KLSNlbHNlDQotI3NldCAoJHByaXR5cGUgPSAkdXRpbHMuZ2V0UHJpbWl0aXZlVHlwZSgkcHJvcGVydHkuY2xhc3NOYW1lKSkNCi0jaWYgKCR1dGlscy5pc1ByaW1pdGl2ZUNsYXNzKCRwcml0eXBlKSkNCi0gICAgICAgICAgICBPYmplY3QgdmFsdWUgPSB2YiA9PSBudWxsID8gbnVsbCA6IHZiLmdldFZhbHVlKGdldEZhY2VzQ29udGV4dCgpLmdldEVMQ29udGV4dCgpKTsNCi0gICAgICAgICAgICBpZiAoISh2YWx1ZSBpbnN0YW5jZW9mICR0eXBlKSl7DQotICAgICAgICAgICAgICAgIHZhbHVlID0gJHt0eXBlfS52YWx1ZU9mKHZhbHVlLnRvU3RyaW5nKCkpOw0KLSAgICAgICAgICAgIH0gICAgICAgICAgICANCi0gICAgICAgICAgICByZXR1cm4gJHV0aWxzLmNhc3RJZk5lY2Vzc2FyeSgkdHlwZSkgdmFsdWU7DQotI2Vsc2UNCi0gICAgICAgICAgICByZXR1cm4gJHV0aWxzLmNhc3RJZk5lY2Vzc2FyeSgkdHlwZSkgdmIuZ2V0VmFsdWUoZ2V0RmFjZXNDb250ZXh0KCkuZ2V0RUxDb250ZXh0KCkpOw0KLSNlbmQNCi0jZW5kDQotICAgICAgICB9DQotI2lmICgkZGVmYXVsdFZhbHVlKQ0KLSAgICAgICAgcmV0dXJuICRkZWZhdWx0VmFsdWU7IA0KLSNlbHNlaWYgKCR1dGlscy5pc1ByaW1pdGl2ZUNsYXNzKCR0eXBlKSkNCi0gICAgICAgIHJldHVybiAkdXRpbHMucHJpbWl0aXZlRGVmYXVsdFZhbHVlKCR0eXBlKTsNCi0jZWxzZSAgICAgICANCi0gICAgICAgIHJldHVybiBudWxsOw0KLSNlbmQNCi0jZW5kDQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgJHV0aWxzLmdldFByZWZpeGVkUHJvcGVydHlOYW1lKCJzZXQiLCAkcHJvcGVydHkubmFtZSkoJHR5cGUgJHV0aWxzLmdldFZhcmlhYmxlRnJvbU5hbWUoJHByb3BlcnR5Lm5hbWUpKQ0KLSAgICB7DQotICAgICAgICB0aGlzLiRmaWVsZCA9ICR1dGlscy5nZXRWYXJpYWJsZUZyb21OYW1lKCRwcm9wZXJ0eS5uYW1lKTsNCi0jaWYgKCR1dGlscy5pc1ByaW1pdGl2ZUNsYXNzKCR0eXBlKSAmJiAhJHByb3BlcnR5LmlzVGFnRXhjbHVkZWQoKSANCi0gICAgICYmICEkcHJvcGVydHkuaXNMaXRlcmFsT25seSgpKQ0KLSAgICAgICAgdGhpcy4ke2ZpZWxkfVNldCA9IHRydWU7ICAgICAgICANCi0jZW5kDQotICAgIH0NCi0jZW5kDQotDQotICAgIHB1YmxpYyBPYmplY3Qgc2F2ZVN0YXRlKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQpDQotICAgIHsNCi0jc2V0ICgkcHJpbWl0aXZlQ291bnQgPSAkcHJvcGVydHlMaXN0LnNpemUoKSArIDEpDQotI2ZvcmVhY2goICRwcm9wZXJ0eSBpbiAkcHJvcGVydHlMaXN0ICkNCi0jaWYoJHV0aWxzLmlzUHJpbWl0aXZlQ2xhc3MoJHByb3BlcnR5LmNsYXNzTmFtZSkgJiYgDQotICAgICEkcHJvcGVydHkuaXNMaXRlcmFsT25seSgpKQ0KLSNzZXQgKCRwcmltaXRpdmVDb3VudCA9ICRwcmltaXRpdmVDb3VudCArIDEpDQotI2VuZA0KLSNlbmQNCi0gICAgICAgIE9iamVjdFtdIHZhbHVlcyA9IG5ldyBPYmplY3RbJHByaW1pdGl2ZUNvdW50XTsNCi0gICAgICAgIHZhbHVlc1swXSA9IHN1cGVyLnNhdmVTdGF0ZShmYWNlc0NvbnRleHQpOw0KLSNzZXQgKCRhcnJheUluZGV4ID0gMCkNCi0jZm9yZWFjaCggJHByb3BlcnR5IGluICRwcm9wZXJ0eUxpc3QgKQ0KLSNzZXQgKCRmaWVsZCA9ICRwcm9wZXJ0eS5maWVsZE5hbWUpDQotI3NldCAoJHR5cGUgPSAkcHJvcGVydHkuY2xhc3NOYW1lKQ0KLSNzZXQgKCRhcnJheUluZGV4ID0gJGFycmF5SW5kZXggKyAxKQ0KLSNpZiAoJHByb3BlcnR5LmpzcE5hbWUgPT0gInZhbGlkYXRvciIgJiYgJHByb3BlcnR5LmlzTWV0aG9kQmluZGluZygpICkNCi0gICAgICAgIHZhbHVlc1skYXJyYXlJbmRleF0gPSBzYXZlQXR0YWNoZWRTdGF0ZShmYWNlc0NvbnRleHQsJHtmaWVsZH1MaXN0KTsNCi0jZWxzZWlmICggJHByb3BlcnR5LmlzU3RhdGVIb2xkZXIoKSApIyMgfHwgJHV0aWxzLmlzQ29udmVydGVyKCR0eXBlKQ0KLSAgICAgICAgdmFsdWVzWyRhcnJheUluZGV4XSA9IHNhdmVBdHRhY2hlZFN0YXRlKGZhY2VzQ29udGV4dCwkZmllbGQpOw0KLSNlbHNlaWYoJHV0aWxzLmlzUHJpbWl0aXZlQ2xhc3MoJHR5cGUpKQ0KLSAgICAgICAgdmFsdWVzWyRhcnJheUluZGV4XSA9ICR7dXRpbHMuZ2V0Qm94ZWRDbGFzcygkdHlwZSl9LnZhbHVlT2YoJGZpZWxkKTsNCi0jZWxzZQ0KLSAgICAgICAgdmFsdWVzWyRhcnJheUluZGV4XSA9ICRmaWVsZDsNCi0jZW5kDQotI2lmKCR1dGlscy5pc1ByaW1pdGl2ZUNsYXNzKCR0eXBlKSAmJiAhJHByb3BlcnR5LmlzVGFnRXhjbHVkZWQoKQ0KLSAgICAmJiAhJHByb3BlcnR5LmlzTGl0ZXJhbE9ubHkoKSApDQotI3NldCAoJGFycmF5SW5kZXggPSAkYXJyYXlJbmRleCArIDEpDQotICAgICAgICB2YWx1ZXNbJGFycmF5SW5kZXhdID0gQm9vbGVhbi52YWx1ZU9mKCR7ZmllbGR9U2V0KTsNCi0jZW5kDQotI2VuZA0KLSAgICAgICAgcmV0dXJuIHZhbHVlczsgDQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgcmVzdG9yZVN0YXRlKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIE9iamVjdCBzdGF0ZSkNCi0gICAgew0KLSAgICAgICAgT2JqZWN0W10gdmFsdWVzID0gKE9iamVjdFtdKXN0YXRlOw0KLSAgICAgICAgc3VwZXIucmVzdG9yZVN0YXRlKGZhY2VzQ29udGV4dCx2YWx1ZXNbMF0pOw0KLSNzZXQgKCRhcnJheUluZGV4ID0gMCkNCi0jZm9yZWFjaCggJHByb3BlcnR5IGluICRwcm9wZXJ0eUxpc3QgKQ0KLSNzZXQgKCRmaWVsZCA9ICRwcm9wZXJ0eS5maWVsZE5hbWUpDQotI3NldCAoJHR5cGUgPSAkcHJvcGVydHkuY2xhc3NOYW1lKQ0KLSNzZXQgKCRhcnJheUluZGV4ID0gJGFycmF5SW5kZXggKyAxKQ0KLSNpZiAoICRwcm9wZXJ0eS5pc1N0YXRlSG9sZGVyKCkgKQ0KLSNpZiAoJHByb3BlcnR5LmpzcE5hbWUgPT0gInZhbGlkYXRvciIgJiYgJHByb3BlcnR5LmlzTWV0aG9kQmluZGluZygpICkNCi0gICAgICAgICR7ZmllbGR9TGlzdCA9IChMaXN0PFZhbGlkYXRvcj4pIHJlc3RvcmVBdHRhY2hlZFN0YXRlKGZhY2VzQ29udGV4dCx2YWx1ZXNbJGFycmF5SW5kZXhdKTsNCi0jZWxzZWlmICgkdXRpbHMuaXNMaXN0KCR0eXBlKSkNCi0gICAgICAgICRmaWVsZCA9IChMaXN0KSByZXN0b3JlQXR0YWNoZWRTdGF0ZShmYWNlc0NvbnRleHQsdmFsdWVzWyRhcnJheUluZGV4XSk7DQotI2Vsc2UNCi0gICAgICAgICRmaWVsZCA9ICR1dGlscy5jYXN0SWZOZWNlc3NhcnkoJHR5cGUpIHJlc3RvcmVBdHRhY2hlZFN0YXRlKGZhY2VzQ29udGV4dCx2YWx1ZXNbJGFycmF5SW5kZXhdKTsgDQotI2VuZA0KLSNlbHNlaWYgKCR1dGlscy5pc0NvbnZlcnRlcigkdHlwZSkpIA0KLSAgICAgICAgJGZpZWxkID0gKENvbnZlcnRlcikgcmVzdG9yZUF0dGFjaGVkU3RhdGUoZmFjZXNDb250ZXh0LHZhbHVlc1skYXJyYXlJbmRleF0pOw0KLSNlbHNlaWYgKCR1dGlscy5pc1ByaW1pdGl2ZUNsYXNzKCR0eXBlKSkNCi0gICAgICAgICRmaWVsZCA9ICgkdXRpbHMuY2FzdElmTmVjZXNzYXJ5KCR0eXBlKSB2YWx1ZXNbJGFycmF5SW5kZXhdKS4ke3R5cGV9VmFsdWUoKTsNCi0jZWxzZQ0KLSAgICAgICAgJGZpZWxkID0gJHV0aWxzLmNhc3RJZk5lY2Vzc2FyeSgkdHlwZSkgdmFsdWVzWyRhcnJheUluZGV4XTsNCi0jZW5kDQotI2lmKCR1dGlscy5pc1ByaW1pdGl2ZUNsYXNzKCR0eXBlKSAmJiAhJHByb3BlcnR5LmlzVGFnRXhjbHVkZWQoKQ0KLSAgICAmJiAhJHByb3BlcnR5LmlzTGl0ZXJhbE9ubHkoKSApDQotI3NldCAoJGFycmF5SW5kZXggPSAkYXJyYXlJbmRleCArIDEpDQotICAgICAgICAke2ZpZWxkfVNldCA9ICgoQm9vbGVhbikgdmFsdWVzWyRhcnJheUluZGV4XSkuYm9vbGVhblZhbHVlKCk7DQotI2VuZA0KLSNlbmQNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9jb21wb25lbnRDbGFzczIwLnZtIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvY29tcG9uZW50Q2xhc3MyMC52bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWMxNzE0Ny4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9jb21wb25lbnRDbGFzczIwLnZtCisrKyAvZGV2L251bGwKQEAgLTEsNTE4ICswLDAgQEAKLSMjIFZlbG9jaXR5IHRlbXBsYXRlIHVzZWQgdG8gZ2VuZXJhdGUgSlNGMS4yLWNvbXBhdGlibGUgY29tcG9uZW50IGNsYXNzZXMNCi0jIyBmcm9tIGNvbXBvbmVudCBtZXRhLWRhdGEuDQotIyMNCi0jIyBOb3RlIHRoYXQgdGhlcmUgYXJlIHR3byB0eXBlcyBvZiBjb21wb25lbnQgZ2VuZXJhdGlvbjoNCi0jIyAgKiAic3ViY2xhc3MgbW9kZSIgKHVzZSBhbm5vdGF0ZWQgY2xhc3MgYXMgYSBwYXJlbnQgY2xhc3MpDQotIyMgICogInRlbXBsYXRlIG1vZGUiICh1c2UgYW5ub3RhdGVkIGNsYXNzIGFzIGEgdGVtcGxhdGUpDQotIyMgVGhpcyB0ZW1wbGF0ZSBmaWxlIGlzIHVzZWQgZm9yIGJvdGguDQotIyMNCi0jIyBWYXJpYWJsZSAkY29tcG9uZW50IHJlZmVycyB0byBhIENvbXBvbmVudE1ldGEgb2JqZWN0IHRvIHByb2Nlc3MNCi0jIyBWYXJpYWJsZSAkdXRpbHMgcmVmZXJzIHRvIGFuIGluc3RhbmNlIG9mIE15ZmFjZXNVdGlscy4NCi0jIw0KLSMjIFdoZW4gInRlbXBsYXRlIG1vZGUiIGlzIGJlaW5nIHVzZWQgdGhlbiB2YXJpYWJsZSAkaW5uZXJzb3VyY2UNCi0jIyBob2xkcyBhIFN0cmluZyBjb250YWluaW5nIGFsbCB0aGUgbm9uLWFic3RyYWN0IGZ1bmN0aW9ucyBkZWZpbmVkDQotIyMgaW4gdGhlIGFubm90YXRlZCBjbGFzcy4NCi0jIw0KLSMjIFRoZSBqYXZhIHBhY2thZ2Ugb2YgdGhlIGdlbmVyYXRlZCBjbGFzcyBpcyBhbHdheXMgdGhlIHNhbWUgYXMNCi0jIyB0aGUgcGFja2FnZSBpbiB3aGljaCB0aGUgYW5ub3RhdGVkIGNsYXNzIGV4aXN0cy4NCi0jIw0KLS8qDQotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKiANCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICogDQotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2UgJHtjb21wb25lbnQucGFja2FnZU5hbWV9Ow0KLQ0KLWltcG9ydCBqYXZheC5lbC5WYWx1ZUV4cHJlc3Npb247DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuUGFydGlhbFN0YXRlSG9sZGVyOw0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuU3RhdGVIb2xkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5jb21wb25lbnQuQXR0YWNoZWREZWx0YVdyYXBwZXI7DQotJHV0aWxzLmltcG9ydFRhZ0NsYXNzZXMoJGNvbXBvbmVudCkNCi0NCi0jaWYgKCRjb21wb25lbnQuaXNUZW1wbGF0ZSgpKQ0KLSNzZXQgKCRnZW5lcmF0ZWRDbGFzc1BhcmVudCA9ICRjb21wb25lbnQuc291cmNlQ2xhc3NQYXJlbnRDbGFzc05hbWUpDQotI2Vsc2UNCi0jc2V0ICgkZ2VuZXJhdGVkQ2xhc3NQYXJlbnQgPSAkY29tcG9uZW50LnNvdXJjZUNsYXNzTmFtZSkNCi0jZW5kDQotLy8gR2VuZXJhdGVkIGZyb20gY2xhc3MgJHtjb21wb25lbnQuc291cmNlQ2xhc3NOYW1lfS4NCi0vLw0KLS8vIFdBUk5JTkc6IFRoaXMgZmlsZSB3YXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQuIERvIG5vdCBlZGl0IGl0IGRpcmVjdGx5LA0KLS8vICAgICAgICAgIG9yIHlvdSB3aWxsIGxvc2UgeW91ciBjaGFuZ2VzLg0KLXB1YmxpYyBjbGFzcyAke3V0aWxzLmdldENsYXNzRnJvbUZ1bGxDbGFzcygkY29tcG9uZW50LmNsYXNzTmFtZSl9IGV4dGVuZHMgJGdlbmVyYXRlZENsYXNzUGFyZW50DQotI2lmICgkY29tcG9uZW50LmltcGxlbWVudHMpDQotICAgIGltcGxlbWVudHMgJGNvbXBvbmVudC5pbXBsZW1lbnRzDQotI2VuZA0KLXsNCi0jaWYgKCRjb21wb25lbnQuc2VyaWFsdWlkKQ0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAke2NvbXBvbmVudC5zZXJpYWx1aWR9OyANCi0jZW5kICANCi0NCi0gICAgc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgQ09NUE9ORU5UX0ZBTUlMWSA9DQotICAgICAgICAiJGNvbXBvbmVudC5mYW1pbHkiOw0KLSAgICBzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBDT01QT05FTlRfVFlQRSA9DQotICAgICAgICAiJGNvbXBvbmVudC50eXBlIjsNCi0jaWYgKCRjb21wb25lbnQucmVuZGVyZXJUeXBlKQ0KLSNpZiAoISgkY29tcG9uZW50LnJlbmRlcmVyVHlwZSA9PSAiIikpDQotICAgIHN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIERFRkFVTFRfUkVOREVSRVJfVFlQRSA9IA0KLSAgICAgICAgIiRjb21wb25lbnQucmVuZGVyZXJUeXBlIjsNCi0jZW5kDQotI2VuZA0KLQ0KLSNpZiAoJGlubmVyc291cmNlKQ0KLSAgICAvL0JFR0lOIENPREUgQ09QSUVEIEZST00gJGNvbXBvbmVudC5zb3VyY2VDbGFzc05hbWUgDQotJGlubmVyc291cmNlDQotICAgIC8vRU5EIENPREUgQ09QSUVEIEZST00gJGNvbXBvbmVudC5zb3VyY2VDbGFzc05hbWUNCi0jZW5kDQotDQotICAgIHB1YmxpYyAke3V0aWxzLmdldENsYXNzRnJvbUZ1bGxDbGFzcygkY29tcG9uZW50LmNsYXNzTmFtZSl9KCkNCi0gICAgew0KLSNpZiAoJGNvbXBvbmVudC5yZW5kZXJlclR5cGUpDQotI2lmICgkY29tcG9uZW50LnJlbmRlcmVyVHlwZSA9PSAiIikNCi0gICAgICAgIHNldFJlbmRlcmVyVHlwZShudWxsKTsNCi0jZWxzZQ0KLSAgICAgICAgc2V0UmVuZGVyZXJUeXBlKCIkY29tcG9uZW50LnJlbmRlcmVyVHlwZSIpOw0KLSNlbmQNCi0jZWxzZQ0KLSAgICAgICAgc2V0UmVuZGVyZXJUeXBlKG51bGwpOw0KLSNlbmQNCi0gICAgfQ0KLQ0KLSMjIE9uIG15ZmFjZXMgMS4xIHRoZSBmYW1pbHkgaXMgaW5oZXJpdGVkLCBzbyB0aGlzIGNvdWxkIGJlIGNvbW1lbnRlZA0KLSMjIE9uIG90aGVyIHRoaXMgc2hvdWxkIG5vdCBiZSBjb21tZW50ZWQgICAgDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RmFtaWx5KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIENPTVBPTkVOVF9GQU1JTFk7DQotICAgIH0NCi0NCi0jIyBJdGVyYXRlIG92ZXIgZnVsbCBjb21wb25lbnQgcHJvcGVydHkgbGlzdA0KLSNzZXQgKCRwcm9wZXJ0eUxpc3QgPSAke2NvbXBvbmVudC5wcm9wZXJ0eUxpc3R9KQ0KLQ0KLSMjIFRPRE86IHRoaXMgY29uZGl0aW9uIHNob3VsZCBiZSBjaGVja2VkIGZvciBwYXJlbnQgY29tcG9uZW50cw0KLSMjIGFuZCBjc3YgaW1wbGVtZW50cw0KLSNpZiAoJGNvbXBvbmVudC5pc0NsaWVudEJlaGF2aW9ySG9sZGVyKCkpDQotI2lmICgkY29tcG9uZW50LmlzT3ZlcnJpZGVFdmVudE5hbWVzKCkpDQotICAgIHN0YXRpYyBwcml2YXRlIGZpbmFsIGphdmEudXRpbC5Db2xsZWN0aW9uPFN0cmluZz4gQ0xJRU5UX0VWRU5UU19MSVNUID0gDQotICAgICAgICBqYXZhLnV0aWwuQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlQ29sbGVjdGlvbigNCi0gICAgICAgICAgICBqYXZhLnV0aWwuQXJyYXlzLmFzTGlzdCgNCi0jc2V0ICgkY29tbWF2YXIgPSAiIikNCi0jZm9yZWFjaCggJHByb3BlcnR5IGluICRwcm9wZXJ0eUxpc3QgKQ0KLSNpZiAoJHByb3BlcnR5LmNsaWVudEV2ZW50KQ0KLSNpZiAoJHByb3BlcnR5LmNsaWVudEV2ZW50ICE9ICIiKQ0KLSAgICAgICAgICAgICRjb21tYXZhciAiJHByb3BlcnR5LmNsaWVudEV2ZW50Ig0KLSNzZXQgKCRjb21tYXZhciA9ICIsIikgICAgICAgICAgICANCi0jZW5kDQotI2VuZA0KLSNlbmQNCi0gICAgICAgICkpOw0KLQ0KLSAgICBwdWJsaWMgamF2YS51dGlsLkNvbGxlY3Rpb248U3RyaW5nPiBnZXRFdmVudE5hbWVzKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIENMSUVOVF9FVkVOVFNfTElTVDsNCi0gICAgfQ0KLSNlbmQNCi0jZW5kDQotI2lmICgkY29tcG9uZW50LmRlZmF1bHRFdmVudE5hbWUpDQotI2lmICgkY29tcG9uZW50LmlzT3ZlcnJpZGVEZWZhdWx0RXZlbnROYW1lKCkpDQotDQotICAgIC8vQ2xpZW50QmVoYXZpb3JIb2xkZXIgZGVmYXVsdDogJGNvbXBvbmVudC5kZWZhdWx0RXZlbnROYW1lDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdEV2ZW50TmFtZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAiJGNvbXBvbmVudC5kZWZhdWx0RXZlbnROYW1lIjsNCi0gICAgfQ0KLSNlbmQNCi0jZW5kDQotDQotI3NldCAoJHByb3BlcnR5TGlzdCA9ICR7Y29tcG9uZW50LnByb3BlcnR5Q29tcG9uZW50TGlzdH0pDQotICAgIA0KLSNmb3JlYWNoKCAkcHJvcGVydHkgaW4gJHByb3BlcnR5TGlzdCApDQotI3NldCAoJGZpZWxkID0gJHByb3BlcnR5LmZpZWxkTmFtZSkNCi0jc2V0ICgkdHlwZSA9ICR1dGlscy5nZXRDbGFzc0Zyb21GdWxsQ2xhc3MoJHByb3BlcnR5LmNsYXNzTmFtZSkpDQotI2lmKCR1dGlscy5nZXREZWZhdWx0VmFsdWVGaWVsZCgkcHJvcGVydHkpKSANCi0jc2V0ICgkZGVmYXVsdFZhbHVlID0gJHV0aWxzLmdldERlZmF1bHRWYWx1ZUZpZWxkKCRwcm9wZXJ0eSkpDQotI2Vsc2UNCi0jc2V0ICgkZGVmYXVsdFZhbHVlID0gZmFsc2UpDQotI2VuZA0KLSAgICAvLyBQcm9wZXJ0eTogJHByb3BlcnR5Lm5hbWUNCi0jaWYgKCRwcm9wZXJ0eS5pc1BhcnRpYWxTdGF0ZUhvbGRlcigpKQ0KLSNpZiAoJHByb3BlcnR5LmlzTGl0ZXJhbE9ubHkoKSB8fCAkcHJvcGVydHkuaXNUYWdFeGNsdWRlZCgpICkNCi0gICAgcHJpdmF0ZSAkdHlwZSAkZmllbGQgI2lmKCRkZWZhdWx0VmFsdWUpID0gJGRlZmF1bHRWYWx1ZTsje2Vsc2V9OyN7ZW5kfQ0KLQ0KLSAgICAgDQotI2Vsc2UNCi0gICAgcHJpdmF0ZSAkdHlwZSAkZmllbGQ7DQotICAgIA0KLSNlbmQNCi0NCi0gICAgcHJpdmF0ZSBib29sZWFuIF8kdXRpbHMuZ2V0UHJlZml4ZWRQcm9wZXJ0eU5hbWUoImlzU2V0IiwgJHByb3BlcnR5Lm5hbWUpKCkNCi0gICAgew0KLSAgICAgICAgQm9vbGVhbiB2YWx1ZSA9IChCb29sZWFuKSBnZXRTdGF0ZUhlbHBlcigpLmdldChQcm9wZXJ0eUtleXMuJHtwcm9wZXJ0eS5uYW1lfVNldCk7DQotICAgICAgICByZXR1cm4gdmFsdWUgPT0gbnVsbCA/IGZhbHNlIDogdmFsdWU7DQotICAgIH0NCi0NCi0jaWYoJHV0aWxzLmlzUHJpbWl0aXZlQ2xhc3MoJHR5cGUpICYmICEkcHJvcGVydHkuaXNUYWdFeGNsdWRlZCgpDQotICAgICYmICEkcHJvcGVydHkuaXNMaXRlcmFsT25seSgpICkNCi0gICAgcHJpdmF0ZSBib29sZWFuICR7ZmllbGR9U2V0Ow0KLSAgICANCi0jaWYgKCRwcm9wZXJ0eS5pc1NldE1ldGhvZCgpKQ0KLSAgICAkcHJvcGVydHkuc2V0TWV0aG9kU2NvcGUgYm9vbGVhbiAkdXRpbHMuZ2V0UHJlZml4ZWRQcm9wZXJ0eU5hbWUoImlzU2V0IiwgJHByb3BlcnR5Lm5hbWUpKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuICR7ZmllbGR9U2V0Ow0KLSAgICB9DQotI2VuZA0KLSNlbmQNCi0jaWYoJHByb3BlcnR5LmlzTG9jYWxNZXRob2QoKSkNCi0jaWYoImJvb2xlYW4iID09ICR0eXBlKQ0KLSNzZXQgKCRtZXRob2ROYW1lID0gJHV0aWxzLmdldFByZWZpeGVkUHJvcGVydHlOYW1lKCJpc0xvY2FsIiwgJHByb3BlcnR5Lm5hbWUpKQ0KLSNlbHNlDQotI3NldCAoJG1ldGhvZE5hbWUgPSAkdXRpbHMuZ2V0UHJlZml4ZWRQcm9wZXJ0eU5hbWUoImdldExvY2FsIiwgJHByb3BlcnR5Lm5hbWUpKQ0KLSNlbmQNCi0gICAgZmluYWwgJHByb3BlcnR5LmxvY2FsTWV0aG9kU2NvcGUgJHR5cGUgJHttZXRob2ROYW1lfSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAkZmllbGQ7DQotICAgIH0NCi0gICAgIA0KLSNlbmQNCi0gICAgcHVibGljICR0eXBlICR1dGlscy5nZXRNZXRob2RSZWFkZXJGcm9tUHJvcGVydHkoJHByb3BlcnR5Lm5hbWUsICR0eXBlKSgpDQotICAgIHsNCi0jaWYgKCRwcm9wZXJ0eS5pc1RhZ0V4Y2x1ZGVkKCkgfHwgJHByb3BlcnR5LmlzTGl0ZXJhbE9ubHkoKSkNCi0gICAgICAgIHJldHVybiAkZmllbGQ7DQotI2Vsc2UNCi0jaWYgKCR1dGlscy5pc1ByaW1pdGl2ZUNsYXNzKCR0eXBlKSkNCi0gICAgICAgIGlmICgke2ZpZWxkfVNldCkNCi0jZWxzZQ0KLSAgICAgICAgaWYgKCRmaWVsZCAhPSBudWxsKQ0KLSNlbmQNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gJGZpZWxkOw0KLSAgICAgICAgfQ0KLSAgICAgICAgVmFsdWVFeHByZXNzaW9uIHZiID0gZ2V0VmFsdWVFeHByZXNzaW9uKCIkcHJvcGVydHkubmFtZSIpOw0KLSAgICAgICAgaWYgKHZiICE9IG51bGwpDQotICAgICAgICB7DQotI2lmICgkdXRpbHMuaXNQcmltaXRpdmVDbGFzcygkdHlwZSkpDQotICAgICAgICAgICAgcmV0dXJuICgkdXRpbHMuY2FzdElmTmVjZXNzYXJ5KCR0eXBlKSB2Yi5nZXRWYWx1ZShnZXRGYWNlc0NvbnRleHQoKS5nZXRFTENvbnRleHQoKSkpLiR7dHlwZX1WYWx1ZSgpOw0KLSNlbHNlDQotI3NldCAoJHByaXR5cGUgPSAkdXRpbHMuZ2V0UHJpbWl0aXZlVHlwZSgkcHJvcGVydHkuY2xhc3NOYW1lKSkNCi0jaWYgKCR1dGlscy5pc1ByaW1pdGl2ZUNsYXNzKCRwcml0eXBlKSkNCi0gICAgICAgICAgICBPYmplY3QgdmFsdWUgPSB2YiA9PSBudWxsID8gbnVsbCA6IHZiLmdldFZhbHVlKGdldEZhY2VzQ29udGV4dCgpLmdldEVMQ29udGV4dCgpKTsNCi0gICAgICAgICAgICBpZiAoISh2YWx1ZSBpbnN0YW5jZW9mICR0eXBlKSl7DQotICAgICAgICAgICAgICAgIHZhbHVlID0gJHt0eXBlfS52YWx1ZU9mKHZhbHVlLnRvU3RyaW5nKCkpOw0KLSAgICAgICAgICAgIH0gICAgICAgICAgICANCi0gICAgICAgICAgICByZXR1cm4gJHV0aWxzLmNhc3RJZk5lY2Vzc2FyeSgkdHlwZSkgdmFsdWU7DQotI2Vsc2UNCi0gICAgICAgICAgICByZXR1cm4gJHV0aWxzLmNhc3RJZk5lY2Vzc2FyeSgkdHlwZSkgdmIuZ2V0VmFsdWUoZ2V0RmFjZXNDb250ZXh0KCkuZ2V0RUxDb250ZXh0KCkpOw0KLSNlbmQNCi0jZW5kDQotICAgICAgICB9DQotI2lmICgkZGVmYXVsdFZhbHVlKQ0KLSAgICAgICAgcmV0dXJuICRkZWZhdWx0VmFsdWU7IA0KLSNlbHNlaWYgKCR1dGlscy5pc1ByaW1pdGl2ZUNsYXNzKCR0eXBlKSkNCi0gICAgICAgIHJldHVybiAkdXRpbHMucHJpbWl0aXZlRGVmYXVsdFZhbHVlKCR0eXBlKTsNCi0jZWxzZSAgICAgICANCi0gICAgICAgIHJldHVybiBudWxsOw0KLSNlbmQNCi0jZW5kDQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgJHV0aWxzLmdldFByZWZpeGVkUHJvcGVydHlOYW1lKCJzZXQiLCAkcHJvcGVydHkubmFtZSkoJHR5cGUgJHV0aWxzLmdldFZhcmlhYmxlRnJvbU5hbWUoJHByb3BlcnR5Lm5hbWUpKQ0KLSAgICB7DQotICAgICAgICB0aGlzLiRmaWVsZCA9ICR1dGlscy5nZXRWYXJpYWJsZUZyb21OYW1lKCRwcm9wZXJ0eS5uYW1lKTsNCi0gICAgICAgIGlmIChpbml0aWFsU3RhdGVNYXJrZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBnZXRTdGF0ZUhlbHBlcigpLnB1dChQcm9wZXJ0eUtleXMuJHtwcm9wZXJ0eS5uYW1lfVNldCxCb29sZWFuLlRSVUUpOw0KLSAgICAgICAgfQ0KLSNpZiAoJHV0aWxzLmlzUHJpbWl0aXZlQ2xhc3MoJHR5cGUpICYmICEkcHJvcGVydHkuaXNUYWdFeGNsdWRlZCgpICkNCi0gICAgICAgIHRoaXMuJHtmaWVsZH1TZXQgPSB0cnVlOyAgICAgICAgDQotI2VuZA0KLSAgICB9DQotI2Vsc2UNCi0jIyBTdGF0ZUhlbHBlciBhd2FyZSBwcm9wZXJ0eQ0KLSNpZiAoJHByb3BlcnR5Lm5hbWUgPT0gImZvciIpDQotIyMgVG8ga2VlcCBjb21wYXRpYmlsaXR5IHdpdGggUkksIHdlIHNob3VsZCBjYWxsIGl0IGZvclZhbA0KLSNzZXQgKCRmaWVsZCA9ICJmb3JWYWwiKQ0KLSNlbHNlDQotI3NldCAoJGZpZWxkID0gJHByb3BlcnR5Lm5hbWUpDQotI2VuZA0KLSNpZiAoJHByb3BlcnR5LmlzU2V0TWV0aG9kKCkpDQotICAgICRwcm9wZXJ0eS5zZXRNZXRob2RTY29wZSBib29sZWFuICR1dGlscy5nZXRQcmVmaXhlZFByb3BlcnR5TmFtZSgiaXNTZXQiLCAkcHJvcGVydHkubmFtZSkoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZ2V0U3RhdGVIZWxwZXIoKS5nZXQoUHJvcGVydHlLZXlzLiRmaWVsZCkgIT0gbnVsbDsNCi0gICAgfQ0KLSNlbmQNCi0jaWYoJHByb3BlcnR5LmlzTG9jYWxNZXRob2QoKSkNCi0jaWYoImJvb2xlYW4iID09ICR0eXBlKQ0KLSNzZXQgKCRtZXRob2ROYW1lID0gJHV0aWxzLmdldFByZWZpeGVkUHJvcGVydHlOYW1lKCJpc0xvY2FsIiwgJHByb3BlcnR5Lm5hbWUpKQ0KLSNlbHNlDQotI3NldCAoJG1ldGhvZE5hbWUgPSAkdXRpbHMuZ2V0UHJlZml4ZWRQcm9wZXJ0eU5hbWUoImdldExvY2FsIiwgJHByb3BlcnR5Lm5hbWUpKQ0KLSNlbmQNCi0gICAgZmluYWwgJHByb3BlcnR5LmxvY2FsTWV0aG9kU2NvcGUgJHR5cGUgJHttZXRob2ROYW1lfSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAkdXRpbHMuY2FzdElmTmVjZXNzYXJ5KCR0eXBlKSBnZXRTdGF0ZUhlbHBlcigpLmdldChQcm9wZXJ0eUtleXMuJGZpZWxkKTsNCi0gICAgfQ0KLSAgICAgDQotI2VuZA0KLSAgICBwdWJsaWMgJHR5cGUgJHV0aWxzLmdldE1ldGhvZFJlYWRlckZyb21Qcm9wZXJ0eSgkcHJvcGVydHkubmFtZSwgJHR5cGUpKCkNCi0gICAgew0KLSNpZiAoJHByb3BlcnR5LmlzTGl0ZXJhbE9ubHkoKSkNCi0jaWYgKCRkZWZhdWx0VmFsdWUpDQotICAgICAgICBPYmplY3QgdmFsdWUgPSBnZXRTdGF0ZUhlbHBlcigpLmdldChQcm9wZXJ0eUtleXMuJGZpZWxkKTsNCi0gICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiAkdXRpbHMuY2FzdElmTmVjZXNzYXJ5KCR0eXBlKSB2YWx1ZTsgICAgICAgIA0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuICRkZWZhdWx0VmFsdWU7ICAgICAgICANCi0jZWxzZWlmICgkdXRpbHMuaXNQcmltaXRpdmVDbGFzcygkdHlwZSkpDQotICAgICAgICBPYmplY3QgdmFsdWUgPSBnZXRTdGF0ZUhlbHBlcigpLmdldChQcm9wZXJ0eUtleXMuJGZpZWxkKTsNCi0gICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiAkdXRpbHMuY2FzdElmTmVjZXNzYXJ5KCR0eXBlKSB2YWx1ZTsgICAgICAgIA0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuICR1dGlscy5wcmltaXRpdmVEZWZhdWx0VmFsdWUoJHR5cGUpOw0KLSNlbHNlDQotICAgICAgICByZXR1cm4gJHV0aWxzLmNhc3RJZk5lY2Vzc2FyeSgkdHlwZSkgZ2V0U3RhdGVIZWxwZXIoKS5nZXQoUHJvcGVydHlLZXlzLiRmaWVsZCk7ICAgICAgICANCi0jZW5kDQotI2Vsc2UNCi0jaWYgKCRkZWZhdWx0VmFsdWUpDQotICAgICAgICByZXR1cm4gJHV0aWxzLmNhc3RJZk5lY2Vzc2FyeSgkdHlwZSkgZ2V0U3RhdGVIZWxwZXIoKS5ldmFsKFByb3BlcnR5S2V5cy4kZmllbGQsICRkZWZhdWx0VmFsdWUpOw0KLSNlbHNlaWYgKCR1dGlscy5pc1ByaW1pdGl2ZUNsYXNzKCR0eXBlKSkNCi0gICAgICAgIE9iamVjdCB2YWx1ZSA9ICR1dGlscy5jYXN0SWZOZWNlc3NhcnkoJHR5cGUpIGdldFN0YXRlSGVscGVyKCkuZXZhbChQcm9wZXJ0eUtleXMuJGZpZWxkKTsNCi0gICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiAkdXRpbHMuY2FzdElmTmVjZXNzYXJ5KCR0eXBlKSB2YWx1ZTsgICAgICAgIA0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuICR1dGlscy5wcmltaXRpdmVEZWZhdWx0VmFsdWUoJHR5cGUpOw0KLSNlbHNlDQotICAgICAgICByZXR1cm4gJHV0aWxzLmNhc3RJZk5lY2Vzc2FyeSgkdHlwZSkgZ2V0U3RhdGVIZWxwZXIoKS5ldmFsKFByb3BlcnR5S2V5cy4kZmllbGQpOw0KLSNlbmQNCi0jZW5kDQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyB2b2lkICR1dGlscy5nZXRQcmVmaXhlZFByb3BlcnR5TmFtZSgic2V0IiwgJHByb3BlcnR5Lm5hbWUpKCR0eXBlICR1dGlscy5nZXRWYXJpYWJsZUZyb21OYW1lKCRwcm9wZXJ0eS5uYW1lKSkNCi0gICAgew0KLSAgICAgICAgZ2V0U3RhdGVIZWxwZXIoKS5wdXQoUHJvcGVydHlLZXlzLiRmaWVsZCwgJHV0aWxzLmdldFZhcmlhYmxlRnJvbU5hbWUoJHByb3BlcnR5Lm5hbWUpICk7IA0KLSAgICB9ICAgIA0KLSNlbmQNCi0jZW5kDQotDQotICAgIHByb3RlY3RlZCBlbnVtIFByb3BlcnR5S2V5cw0KLSAgICB7DQotI3NldCAoJGNvbW1hID0gIiIpDQotI3NldCAoJGFkZGMgPSAiZmFsc2UiKQ0KLSNmb3JlYWNoKCAkcHJvcGVydHkgaW4gJHByb3BlcnR5TGlzdCApDQotI2lmICgkcHJvcGVydHkubmFtZSA9PSAiZm9yIikNCi0jc2V0ICgkYWRkYyA9ICJ0cnVlIikNCi0jIyBUbyBrZWVwIGNvbXBhdGliaWxpdHkgd2l0aCBSSSwgd2Ugc2hvdWxkIGNhbGwgaXQgZm9yVmFsDQotI3NldCAoJGZpZWxkID0gImZvclZhbCIpDQotI2Vsc2UNCi0jc2V0ICgkZmllbGQgPSAkcHJvcGVydHkubmFtZSkNCi0jZW5kDQotI3NldCAoJHR5cGUgPSAkdXRpbHMuZ2V0Q2xhc3NGcm9tRnVsbENsYXNzKCRwcm9wZXJ0eS5jbGFzc05hbWUpKQ0KLSNpZigkdXRpbHMuZ2V0RGVmYXVsdFZhbHVlRmllbGQoJHByb3BlcnR5KSkgDQotI3NldCAoJGRlZmF1bHRWYWx1ZSA9ICR1dGlscy5nZXREZWZhdWx0VmFsdWVGaWVsZCgkcHJvcGVydHkpKQ0KLSNlbHNlDQotI3NldCAoJGRlZmF1bHRWYWx1ZSA9IGZhbHNlKQ0KLSNlbmQNCi0jaWYgKCRwcm9wZXJ0eS5uYW1lID09ICJmb3IiKQ0KLSAgICAgICAgJGNvbW1hICRmaWVsZCgiZm9yIikNCi0jZWxzZQ0KLSNpZiAoJHByb3BlcnR5LmlzUGFydGlhbFN0YXRlSG9sZGVyKCkpDQotICAgICAgICAkY29tbWEgJHtmaWVsZH1TZXQNCi0jZWxzZQ0KLSAgICAgICAgJGNvbW1hICRmaWVsZA0KLSNlbmQNCi0jZW5kDQotI3NldCgkY29tbWEgPSAiLCIpDQotI2VuZA0KLSNpZiAoInRydWUiID09ICRhZGRjKQ0KLSAgICAgICAgOw0KLSAgICAgICAgU3RyaW5nIGM7DQotICAgICAgICANCi0gICAgICAgIFByb3BlcnR5S2V5cygpDQotICAgICAgICB7DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgICAgIC8vQ29uc3RydWN0b3IgbmVlZGVkIGJ5ICJmb3IiIHByb3BlcnR5DQotICAgICAgICBQcm9wZXJ0eUtleXMoU3RyaW5nIGMpDQotICAgICAgICB7IA0KLSAgICAgICAgICAgIHRoaXMuYyA9IGM7DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiAoKHRoaXMuYyAhPSBudWxsKSA/IHRoaXMuYyA6IHN1cGVyLnRvU3RyaW5nKCkpOw0KLSAgICAgICAgfQ0KLSNlbmQNCi0gICAgfQ0KLQ0KLSNzZXQgKCRwcmltaXRpdmVDb3VudCA9IDEpICMjICRwcm9wZXJ0eUxpc3Quc2l6ZSgpICsgMSANCi0jZm9yZWFjaCggJHByb3BlcnR5IGluICRwcm9wZXJ0eUxpc3QgKQ0KLSNpZiAoJHByb3BlcnR5LmlzUGFydGlhbFN0YXRlSG9sZGVyKCkpDQotI3NldCAoJHByaW1pdGl2ZUNvdW50ID0gJHByaW1pdGl2ZUNvdW50ICsgMSkNCi0jaWYoJHV0aWxzLmlzUHJpbWl0aXZlQ2xhc3MoJHByb3BlcnR5LmNsYXNzTmFtZSkpDQotI3NldCAoJHByaW1pdGl2ZUNvdW50ID0gJHByaW1pdGl2ZUNvdW50ICsgMSkNCi0jZW5kDQotI2VuZA0KLSNlbmQNCi0jIyBzYXZlU3RhdGUgYW5kIHJlc3RvcmVTdGF0ZSBtZXRob2RzIG9ubHkgaGFzIHNlbnNlIGlmIHdlIGhhdmUgcHJvcGVydGllcw0KLSMjIHRoYXQgZG9lcyBub3QgdXNlIFN0YXRlSGVscGVyIGNsYXNzLg0KLSNpZiAoJHByaW1pdGl2ZUNvdW50ID4gMSkNCi0NCi0gICAgcHVibGljIHZvaWQgbWFya0luaXRpYWxTdGF0ZSgpDQotICAgIHsNCi0gICAgICAgIHN1cGVyLm1hcmtJbml0aWFsU3RhdGUoKTsNCi0jZm9yZWFjaCggJHByb3BlcnR5IGluICRwcm9wZXJ0eUxpc3QgKQ0KLSNzZXQgKCRmaWVsZCA9ICRwcm9wZXJ0eS5maWVsZE5hbWUpDQotI2lmICgkcHJvcGVydHkuaXNQYXJ0aWFsU3RhdGVIb2xkZXIoKSkgICAgICAgIA0KLSAgICAgICAgaWYgKCRmaWVsZCAhPSBudWxsICYmIA0KLSAgICAgICAgICAgICRmaWVsZCBpbnN0YW5jZW9mIFBhcnRpYWxTdGF0ZUhvbGRlcikNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAoKFBhcnRpYWxTdGF0ZUhvbGRlcikkZmllbGQpLm1hcmtJbml0aWFsU3RhdGUoKTsNCi0gICAgICAgIH0NCi0jZW5kDQotI2VuZA0KLSAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgdm9pZCBjbGVhckluaXRpYWxTdGF0ZSgpDQotICAgIHsNCi0gICAgICAgIGlmIChpbml0aWFsU3RhdGVNYXJrZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBzdXBlci5jbGVhckluaXRpYWxTdGF0ZSgpOw0KLSNmb3JlYWNoKCAkcHJvcGVydHkgaW4gJHByb3BlcnR5TGlzdCApDQotI3NldCAoJGZpZWxkID0gJHByb3BlcnR5LmZpZWxkTmFtZSkNCi0jaWYgKCRwcm9wZXJ0eS5pc1BhcnRpYWxTdGF0ZUhvbGRlcigpKQ0KLSMjICAgICAgICAgIC8vT25seSBoYXMgc2Vuc2UgcHJvcGFnYXRlIHRoaXMgbWV0aG9kIGlmIGlzIGluaXRpYWxTdGF0ZU1hcmtlZA0KLSAgICAgICAgICAgIGlmICgkZmllbGQgIT0gbnVsbCAmJiANCi0gICAgICAgICAgICAgICAgJGZpZWxkIGluc3RhbmNlb2YgUGFydGlhbFN0YXRlSG9sZGVyKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgKChQYXJ0aWFsU3RhdGVIb2xkZXIpJGZpZWxkKS5jbGVhckluaXRpYWxTdGF0ZSgpOw0KLSAgICAgICAgICAgIH0NCi0jZW5kDQotI2VuZA0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgT2JqZWN0IHNhdmVTdGF0ZShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0KQ0KLSAgICB7DQotICAgICAgICBpZiAoaW5pdGlhbFN0YXRlTWFya2VkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgYm9vbGVhbiBudWxsRGVsdGEgPSB0cnVlOw0KLSAgICAgICAgICAgIE9iamVjdCBwYXJlbnRTYXZlZCA9IHN1cGVyLnNhdmVTdGF0ZShmYWNlc0NvbnRleHQpOw0KLSNzZXQgKCRhcnJheUluZGV4ID0gMCkNCi0jZm9yZWFjaCggJHByb3BlcnR5IGluICRwcm9wZXJ0eUxpc3QgKQ0KLSNzZXQgKCRmaWVsZCA9ICRwcm9wZXJ0eS5maWVsZE5hbWUpDQotI3NldCAoJHR5cGUgPSAkcHJvcGVydHkuY2xhc3NOYW1lKQ0KLSNpZiAoJHByb3BlcnR5LmlzUGFydGlhbFN0YXRlSG9sZGVyKCkpDQotI3NldCAoJGFycmF5SW5kZXggPSAkYXJyYXlJbmRleCArIDEpDQotICAgICAgICAgICAgT2JqZWN0ICR7cHJvcGVydHkubmFtZX1TYXZlZCA9IG51bGw7DQotICAgICAgICAgICAgaWYgKCFfJHV0aWxzLmdldFByZWZpeGVkUHJvcGVydHlOYW1lKCJpc1NldCIsICRwcm9wZXJ0eS5uYW1lKSgpICYmDQotICAgICAgICAgICAgICAgICRmaWVsZCAhPSBudWxsICYmICRmaWVsZCBpbnN0YW5jZW9mIFBhcnRpYWxTdGF0ZUhvbGRlcikNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIC8vRGVsdGENCi0gICAgICAgICAgICAgICAgU3RhdGVIb2xkZXIgaG9sZGVyID0gKFN0YXRlSG9sZGVyKSAkZmllbGQ7DQotICAgICAgICAgICAgICAgIGlmICghaG9sZGVyLmlzVHJhbnNpZW50KCkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIE9iamVjdCBhdHRhY2hlZFN0YXRlID0gaG9sZGVyLnNhdmVTdGF0ZShmYWNlc0NvbnRleHQpOw0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGF0dGFjaGVkU3RhdGUgIT0gbnVsbCkNCi0gICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBudWxsRGVsdGEgPSBmYWxzZTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICR7cHJvcGVydHkubmFtZX1TYXZlZCA9IG5ldyBBdHRhY2hlZERlbHRhV3JhcHBlcigke2ZpZWxkfS5nZXRDbGFzcygpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGF0dGFjaGVkU3RhdGUpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2UgaWYgKF8kdXRpbHMuZ2V0UHJlZml4ZWRQcm9wZXJ0eU5hbWUoImlzU2V0IiwgJHByb3BlcnR5Lm5hbWUpKCkgfHwgJGZpZWxkICE9IG51bGwgKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgLy9GdWxsDQotICAgICAgICAgICAgICAgICR7cHJvcGVydHkubmFtZX1TYXZlZCA9IHNhdmVBdHRhY2hlZFN0YXRlKGZhY2VzQ29udGV4dCwkZmllbGQpOw0KLSAgICAgICAgICAgICAgICBudWxsRGVsdGEgPSBmYWxzZTsNCi0gICAgICAgICAgICB9ICAgICAgICANCi0jIyBTdGF0ZUhlbHBlciBQcm9wZXJ0aWVzIGRvZXMgbm90IG5lZWQgc2F2ZSBhbmQgcmVzdG9yZQ0KLSNlbmQNCi0jZW5kDQotICAgICAgICAgICAgaWYgKHBhcmVudFNhdmVkID09IG51bGwgJiYgbnVsbERlbHRhKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgLy9ObyB2YWx1ZXMNCi0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIE9iamVjdFtdIHZhbHVlcyA9IG5ldyBPYmplY3RbJHByaW1pdGl2ZUNvdW50XTsNCi0gICAgICAgICAgICB2YWx1ZXNbMF0gPSBwYXJlbnRTYXZlZDsNCi0jIyBTYXZlIGZ1bGwgc3RhdGUNCi0jc2V0ICgkYXJyYXlJbmRleCA9IDApDQotI2ZvcmVhY2goICRwcm9wZXJ0eSBpbiAkcHJvcGVydHlMaXN0ICkNCi0jc2V0ICgkZmllbGQgPSAkcHJvcGVydHkuZmllbGROYW1lKQ0KLSNzZXQgKCR0eXBlID0gJHByb3BlcnR5LmNsYXNzTmFtZSkNCi0jaWYgKCRwcm9wZXJ0eS5pc1BhcnRpYWxTdGF0ZUhvbGRlcigpKQ0KLSNzZXQgKCRhcnJheUluZGV4ID0gJGFycmF5SW5kZXggKyAxKQ0KLSAgICAgICAgICAgIHZhbHVlc1skYXJyYXlJbmRleF0gPSAke3Byb3BlcnR5Lm5hbWV9U2F2ZWQ7DQotIyMgU3RhdGVIZWxwZXIgUHJvcGVydGllcyBkb2VzIG5vdCBuZWVkIHNhdmUgYW5kIHJlc3RvcmUNCi0jZW5kDQotI2VuZA0KLSAgICAgICAgICAgIHJldHVybiB2YWx1ZXM7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgT2JqZWN0W10gdmFsdWVzID0gbmV3IE9iamVjdFskcHJpbWl0aXZlQ291bnRdOw0KLSAgICAgICAgICAgIHZhbHVlc1swXSA9IHN1cGVyLnNhdmVTdGF0ZShmYWNlc0NvbnRleHQpOw0KLSMjIFNhdmUgZnVsbCBzdGF0ZQ0KLSNzZXQgKCRhcnJheUluZGV4ID0gMCkNCi0jZm9yZWFjaCggJHByb3BlcnR5IGluICRwcm9wZXJ0eUxpc3QgKQ0KLSNzZXQgKCRmaWVsZCA9ICRwcm9wZXJ0eS5maWVsZE5hbWUpDQotI3NldCAoJHR5cGUgPSAkcHJvcGVydHkuY2xhc3NOYW1lKQ0KLSNpZiAoJHByb3BlcnR5LmlzUGFydGlhbFN0YXRlSG9sZGVyKCkpDQotI3NldCAoJGFycmF5SW5kZXggPSAkYXJyYXlJbmRleCArIDEpDQotICAgICAgICAgICAgdmFsdWVzWyRhcnJheUluZGV4XSA9IHNhdmVBdHRhY2hlZFN0YXRlKGZhY2VzQ29udGV4dCwkZmllbGQpOw0KLSMjIFN0YXRlSGVscGVyIFByb3BlcnRpZXMgZG9lcyBub3QgbmVlZCBzYXZlIGFuZCByZXN0b3JlDQotI2VuZA0KLSNlbmQNCi0gICAgICAgICAgICByZXR1cm4gdmFsdWVzOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgdm9pZCByZXN0b3JlU3RhdGUoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgT2JqZWN0IHN0YXRlKQ0KLSAgICB7DQotICAgICAgICBpZiAoc3RhdGUgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm47DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgICAgIE9iamVjdFtdIHZhbHVlcyA9IChPYmplY3RbXSlzdGF0ZTsNCi0gICAgICAgIHN1cGVyLnJlc3RvcmVTdGF0ZShmYWNlc0NvbnRleHQsdmFsdWVzWzBdKTsNCi0jc2V0ICgkYXJyYXlJbmRleCA9IDApDQotI2ZvcmVhY2goICRwcm9wZXJ0eSBpbiAkcHJvcGVydHlMaXN0ICkNCi0jc2V0ICgkZmllbGQgPSAkcHJvcGVydHkuZmllbGROYW1lKQ0KLSNzZXQgKCR0eXBlID0gJHByb3BlcnR5LmNsYXNzTmFtZSkNCi0jaWYgKCRwcm9wZXJ0eS5pc1BhcnRpYWxTdGF0ZUhvbGRlcigpKQ0KLSNzZXQgKCRhcnJheUluZGV4ID0gJGFycmF5SW5kZXggKyAxKQ0KLSAgICAgICAgaWYgKHZhbHVlc1skYXJyYXlJbmRleF0gaW5zdGFuY2VvZiBBdHRhY2hlZERlbHRhV3JhcHBlcikNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvL0RlbHRhDQotICAgICAgICAgICAgKChTdGF0ZUhvbGRlcikkZmllbGQpLnJlc3RvcmVTdGF0ZShmYWNlc0NvbnRleHQsICgoQXR0YWNoZWREZWx0YVdyYXBwZXIpIHZhbHVlc1skYXJyYXlJbmRleF0pLmdldFdyYXBwZWRTdGF0ZU9iamVjdCgpKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvL0Z1bGwNCi0gICAgICAgICAgICAkZmllbGQgPSAkdXRpbHMuY2FzdElmTmVjZXNzYXJ5KCR0eXBlKSByZXN0b3JlQXR0YWNoZWRTdGF0ZShmYWNlc0NvbnRleHQsdmFsdWVzWyRhcnJheUluZGV4XSk7DQotICAgICAgICB9ICAgICAgICAgDQotI2Vsc2UNCi0jIyBTdGF0ZUhlbHBlciBQcm9wZXJ0aWVzIGRvZXMgbm90IG5lZWQgc2F2ZSBhbmQgcmVzdG9yZQ0KLSNlbmQNCi0jZW5kDQotICAgIH0NCi0jZW5kDQotfQ0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL2NvbXBvbmVudENsYXNzTWFjcm9zMTEudm0gYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9jb21wb25lbnRDbGFzc01hY3JvczExLnZtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNWFmNTJiLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL2NvbXBvbmVudENsYXNzTWFjcm9zMTEudm0KKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLSMjIE1hY3JvIGRlZmluaXRpb25zIGZvciBjb21wb25lbnQgY2xhc3MgZGVmaW5pdGlvbgotIyMKLSMjIFZlbG9jaXR5IG1hY3JvcyBkZWZpbmVkIGluIHRoaXMgZmlsZSB3aWxsIGJlIGF2YWlsYWJsZSB3aGVuIGV4ZWN1dGluZwotIyMgdGhlIGNvbXBvbmVudENsYXNzMTEudm0gdGVtcGxhdGUgZmlsZS4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9jb252ZXJ0ZXJDbGFzc01hY3JvczExLnZtIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvY29udmVydGVyQ2xhc3NNYWNyb3MxMS52bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODM2MmRlNy4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9jb252ZXJ0ZXJDbGFzc01hY3JvczExLnZtCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi0jIyBNYWNybyBkZWZpbml0aW9ucyBmb3IgY29tcG9uZW50IGNsYXNzIGRlZmluaXRpb24NCi0jIw0KLSMjIFZlbG9jaXR5IG1hY3JvcyBkZWZpbmVkIGluIHRoaXMgZmlsZSB3aWxsIGJlIGF2YWlsYWJsZSB3aGVuIGV4ZWN1dGluZw0KLSMjIHRoZSBjb21wb25lbnRDbGFzczExLnZtIHRlbXBsYXRlIGZpbGUuClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvZmFjZWxldHMtdGFnbGliLnZtIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvZmFjZWxldHMtdGFnbGliLnZtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NDVmNjBlLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL2ZhY2VsZXRzLXRhZ2xpYi52bQorKysgL2Rldi9udWxsCkBAIC0xLDExMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS0NCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLTwhRE9DVFlQRSBmYWNlbGV0LXRhZ2xpYg0KLSAgUFVCTElDICItLy9TdW4gTWljcm9zeXN0ZW1zLCBJbmMuLy9EVEQgRmFjZWxldCBUYWdsaWIgMS4wLy9FTiIgImh0dHA6Ly9qYXZhLnN1bi5jb20vZHRkL2ZhY2VsZXQtdGFnbGliXzFfMC5kdGQiPg0KLTxmYWNlbGV0LXRhZ2xpYiB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS9KU0YvRmFjZWxldCI+DQotDQotICAgIDxuYW1lc3BhY2U+JHVyaTwvbmFtZXNwYWNlPg0KLQ0KLSRiYXNlQ29udGVudA0KLQ0KLSAgICA8IS0tIENvbXBvbmVudCBUYWdzIC0tPg0KLSNzZXQgKCRjb21wb25lbnRMaXN0ID0gJHttb2RlbC5nZXRDb21wb25lbnRzKCl9KQ0KLSNmb3JlYWNoKCAkY29tcG9uZW50IGluICRjb21wb25lbnRMaXN0ICkNCi0jaWYgKCRtb2RlbElkcy5jb250YWlucygkY29tcG9uZW50Lm1vZGVsSWQpIA0KLSAgICAmJiAoJGNvbXBvbmVudC5uYW1lKSkNCi0jaWYgKCEkY29tcG9uZW50LmlzQ29uZmlnRXhjbHVkZWQoKSkNCi0jaWYgKCR1dGlscy5nZXRUYWdQcmVmaXgoJGNvbXBvbmVudC5uYW1lKSA9PSAkc2hvcnRuYW1lKQ0KLSAgICA8dGFnPg0KLSAgICAgICAgPHRhZy1uYW1lPiR1dGlscy5nZXRUYWdOYW1lKCRjb21wb25lbnQubmFtZSk8L3RhZy1uYW1lPg0KLSAgICAgICAgPGNvbXBvbmVudD4NCi0gICAgICAgICAgICA8Y29tcG9uZW50LXR5cGU+JGNvbXBvbmVudC50eXBlPC9jb21wb25lbnQtdHlwZT4NCi0jaWYgKCRjb21wb25lbnQucmVuZGVyZXJUeXBlKQ0KLSNpZiAoISgkY29tcG9uZW50LnJlbmRlcmVyVHlwZSA9PSAiIikpDQotICAgICAgICAgICAgPHJlbmRlcmVyLXR5cGU+JGNvbXBvbmVudC5yZW5kZXJlclR5cGU8L3JlbmRlcmVyLXR5cGU+DQotI2VuZA0KLSNlbmQNCi0jaWYgKCRjb21wb25lbnQudGFnSGFuZGxlcikNCi0gICAgICAgICAgICA8aGFuZGxlci1jbGFzcz4kY29tcG9uZW50LnRhZ0hhbmRsZXI8L2hhbmRsZXItY2xhc3M+DQotI2VuZA0KLSAgICAgICAgPC9jb21wb25lbnQ+DQotICAgIDwvdGFnPg0KLSNlbmQNCi0jZW5kDQotI2VuZA0KLSNlbmQNCi0NCi0gICA8IS0tIENvbnZlcnRlciB0YWdzIC0tPg0KLSNzZXQgKCRjb21wb25lbnRMaXN0ID0gJHttb2RlbC5nZXRDb252ZXJ0ZXJzKCl9KQ0KLSNmb3JlYWNoKCAkY29tcG9uZW50IGluICRjb21wb25lbnRMaXN0ICkNCi0jaWYgKCRtb2RlbElkcy5jb250YWlucygkY29tcG9uZW50Lm1vZGVsSWQpIA0KLSAgICAmJiAoJGNvbXBvbmVudC5uYW1lKSkNCi0jaWYgKCRjb21wb25lbnQuY29udmVydGVySWQpDQotI2lmICgkdXRpbHMuZ2V0VGFnUHJlZml4KCRjb21wb25lbnQubmFtZSkgPT0gJHNob3J0bmFtZSkgDQotICAgIDx0YWc+DQotICAgICAgICA8dGFnLW5hbWU+JHV0aWxzLmdldFRhZ05hbWUoJGNvbXBvbmVudC5uYW1lKTwvdGFnLW5hbWU+DQotICAgICAgICA8Y29udmVydGVyPg0KLSAgICAgICAgICAgIDxjb252ZXJ0ZXItaWQ+JGNvbXBvbmVudC5jb252ZXJ0ZXJJZDwvY29udmVydGVyLWlkPg0KLSNpZiAoJGNvbXBvbmVudC50YWdIYW5kbGVyKQ0KLSAgICAgICAgICAgIDxoYW5kbGVyLWNsYXNzPiRjb21wb25lbnQudGFnSGFuZGxlcjwvaGFuZGxlci1jbGFzcz4NCi0jZW5kDQotICAgICAgICA8L2NvbnZlcnRlcj4NCi0gICAgPC90YWc+DQotI2VuZA0KLSNlbmQNCi0jZW5kDQotI2VuZA0KLQ0KLSAgIDwhLS0gVmFsaWRhdG9yIHRhZ3MgLS0+DQotI3NldCAoJGNvbXBvbmVudExpc3QgPSAke21vZGVsLmdldFZhbGlkYXRvcnMoKX0pDQotI2ZvcmVhY2goICRjb21wb25lbnQgaW4gJGNvbXBvbmVudExpc3QgKQ0KLSNpZiAoJG1vZGVsSWRzLmNvbnRhaW5zKCRjb21wb25lbnQubW9kZWxJZCkgDQotICAgICYmICgkY29tcG9uZW50Lm5hbWUpKQ0KLSNpZiAoJGNvbXBvbmVudC52YWxpZGF0b3JJZCkNCi0jaWYgKCR1dGlscy5nZXRUYWdQcmVmaXgoJGNvbXBvbmVudC5uYW1lKSA9PSAkc2hvcnRuYW1lKQ0KLSAgICA8dGFnPg0KLSAgICAgICAgPHRhZy1uYW1lPiR1dGlscy5nZXRUYWdOYW1lKCRjb21wb25lbnQubmFtZSk8L3RhZy1uYW1lPg0KLSAgICAgICAgPHZhbGlkYXRvcj4NCi0gICAgICAgICAgICA8dmFsaWRhdG9yLWlkPiRjb21wb25lbnQudmFsaWRhdG9ySWQ8L3ZhbGlkYXRvci1pZD4NCi0jaWYgKCRjb21wb25lbnQudGFnSGFuZGxlcikNCi0gICAgICAgICAgICA8aGFuZGxlci1jbGFzcz4kY29tcG9uZW50LnRhZ0hhbmRsZXI8L2hhbmRsZXItY2xhc3M+DQotI2VuZA0KLSAgICAgICAgPC92YWxpZGF0b3I+DQotICAgIDwvdGFnPg0KLSNlbmQNCi0jZW5kDQotI2VuZA0KLSNlbmQNCi0gICAgDQotICAgPCEtLSBTaW5nbGUgVGFncyAtLT4NCi0jc2V0ICgkdGFnTGlzdCA9ICRtb2RlbC5nZXRUYWdzKCkpDQotI2ZvcmVhY2goICR0YWcgaW4gJHRhZ0xpc3QgKQ0KLSNpZiAoJG1vZGVsSWRzLmNvbnRhaW5zKCR0YWcubW9kZWxJZCkpDQotI2lmICgkdGFnLnRhZ0hhbmRsZXIpDQotI2lmICgkdXRpbHMuZ2V0VGFnUHJlZml4KCR0YWcubmFtZSkgPT0gJHNob3J0bmFtZSkNCi0gICA8dGFnPg0KLSAgICAgIDx0YWctbmFtZT4kdXRpbHMuZ2V0VGFnTmFtZSgkdGFnLm5hbWUpPC90YWctbmFtZT4NCi0gICAgICA8aGFuZGxlci1jbGFzcz4kdGFnLnRhZ0hhbmRsZXI8L2hhbmRsZXItY2xhc3M+DQotICAgPC90YWc+DQotI2VuZA0KLSNlbmQNCi0jZW5kDQotI2VuZA0KLQ0KLTwvZmFjZWxldC10YWdsaWI+DQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvZmFjZWxldHMtdGFnbGliMjAudm0gYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9mYWNlbGV0cy10YWdsaWIyMC52bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGMyNTNhNC4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9mYWNlbGV0cy10YWdsaWIyMC52bQorKysgL2Rldi9udWxsCkBAIC0xLDMwMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS0NCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLTxmYWNlbGV0LXRhZ2xpYiB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIg0KLSAgICAgICAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSINCi0gICAgICAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS93ZWItZmFjZWxldHRhZ2xpYnJhcnlfMl8wLnhzZCINCi0gICAgICAgICAgICAgIHZlcnNpb249IjIuMCI+DQotICAgICAgICAgICAgICANCi0gICAgPG5hbWVzcGFjZT4kdXJpPC9uYW1lc3BhY2U+DQotI2lmICgkY29tcG9zaXRlTGlicmFyeSkNCi0gICAgPGNvbXBvc2l0ZS1saWJyYXJ5LW5hbWU+JGNvbXBvc2l0ZUxpYnJhcnk8L2NvbXBvc2l0ZS1saWJyYXJ5LW5hbWU+DQotI2VuZA0KLQ0KLSRiYXNlQ29udGVudA0KLQ0KLSMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFNUQVJUIE1BQ1JPUyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMjDQotIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMjIHdyaXRlSlNGUHJvcGVydHkNCi0jIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyMNCi0jbWFjcm8gKHdyaXRlSlNGUHJvcGVydHkgJHByb3BlcnR5KQ0KLSNpZiAoISRwcm9wZXJ0eS5pc1RhZ0V4Y2x1ZGVkKCkpDQotICAgICAgICA8YXR0cmlidXRlPg0KLSNpZiAoJHByb3BlcnR5LmxvbmdEZXNjcmlwdGlvbikNCi0gICAgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVskcHJvcGVydHkubG9uZ0Rlc2NyaXB0aW9uXV0+PC9kZXNjcmlwdGlvbj4NCi0jZWxzZQ0KLSAgICAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBW11dPjwvZGVzY3JpcHRpb24+DQotI2VuZA0KLSAgICAgICAgICAgPG5hbWU+JHByb3BlcnR5LmpzcE5hbWU8L25hbWU+DQotI2lmICgkcHJvcGVydHkuaXNSZXF1aXJlZCgpKQ0KLSAgICAgICAgICAgPHJlcXVpcmVkPiRwcm9wZXJ0eS5pc1JlcXVpcmVkKCk8L3JlcXVpcmVkPg0KLSNlbmQNCi0jaWYgKCRwcm9wZXJ0eS5pc01ldGhvZEV4cHJlc3Npb24oKSB8fCAkcHJvcGVydHkuaXNNZXRob2RCaW5kaW5nKCkpDQotI2lmICgkcHJvcGVydHkuZ2V0TWV0aG9kQmluZGluZ1NpZ25hdHVyZSgpKQ0KLSNzZXQgKCRzaWcgPSAkcHJvcGVydHkuZ2V0TWV0aG9kQmluZGluZ1NpZ25hdHVyZSgpKQ0KLSAgICAgICAgICAgPG1ldGhvZC1zaWduYXR1cmU+JHNpZy5yZXR1cm5UeXBlIG15TWV0aG9kKCAkc2lnLnBhcmFtZXRlclR5cGVzQXNTdHJpbmcgKTwvbWV0aG9kLXNpZ25hdHVyZT4NCi0jZW5kDQotI2Vsc2VpZigkcHJvcGVydHkuZGVmZXJyZWRWYWx1ZVR5cGUpDQotICAgICAgICAgICA8dHlwZT4kcHJvcGVydHkuZGVmZXJyZWRWYWx1ZVR5cGU8L3R5cGU+DQotI2Vsc2VpZiAoJHR5cGUgPT0gIlN0cmluZyIpDQotICAgICAgICAgICA8dHlwZT5qYXZhLmxhbmcuU3RyaW5nPC90eXBlPg0KLSNlbHNlDQotICAgICAgICAgICA8dHlwZT4kcHJvcGVydHkuY2xhc3NOYW1lPC90eXBlPg0KLSNlbmQNCi0gICAgICAgIDwvYXR0cmlidXRlPg0KLSNlbmQNCi0jZW5kDQotIyMNCi0jIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyMgd3JpdGVKU0ZBdHRyaWJ1dGUNCi0jIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyMNCi0jbWFjcm8gKHdyaXRlSlNGQXR0cmlidXRlICRhdHRyaWJ1dGUpDQotI2lmICghJGF0dHJpYnV0ZS5pc1RhZ0V4Y2x1ZGVkKCkpDQotICAgICAgICA8YXR0cmlidXRlPg0KLSNpZiAoJGF0dHJpYnV0ZS5sb25nRGVzY3JpcHRpb24pDQotICAgICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbJGF0dHJpYnV0ZS5sb25nRGVzY3JpcHRpb25dXT48L2Rlc2NyaXB0aW9uPg0KLSNlbHNlDQotICAgICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbXV0+PC9kZXNjcmlwdGlvbj4NCi0jZW5kDQotICAgICAgICAgICA8bmFtZT4kYXR0cmlidXRlLmpzcE5hbWU8L25hbWU+DQotI2lmICgkYXR0cmlidXRlLmlzUmVxdWlyZWQoKSkNCi0gICAgICAgICAgIDxyZXF1aXJlZD4kYXR0cmlidXRlLmlzUmVxdWlyZWQoKTwvcmVxdWlyZWQ+DQotI2VuZA0KLSNzZXQgKCR0eXBlID0gJHV0aWxzLmdldENsYXNzRnJvbUZ1bGxDbGFzcygkYXR0cmlidXRlLmNsYXNzTmFtZSkpDQotI2lmICgkdHlwZSA9PSAiTWV0aG9kRXhwcmVzc2lvbiIpDQotICAgICAgICAgICA8bWV0aG9kLXNpZ25hdHVyZT4ke2F0dHJpYnV0ZS5kZWZlcnJlZE1ldGhvZFNpZ25hdHVyZX08L21ldGhvZC1zaWduYXR1cmU+DQotI2Vsc2VpZiAoJHR5cGUgPT0gIlZhbHVlRXhwcmVzc2lvbiIpDQotI2lmKCRhdHRyaWJ1dGUuZGVmZXJyZWRWYWx1ZVR5cGUpDQotICAgICAgICAgICA8dHlwZT4kYXR0cmlidXRlLmRlZmVycmVkVmFsdWVUeXBlPC90eXBlPg0KLSNlbmQNCi0jZWxzZQ0KLSNpZiAoJGF0dHJpYnV0ZS5jbGFzc05hbWUpICAgICAgICAgDQotICAgICAgICAgICA8dHlwZT4kYXR0cmlidXRlLmNsYXNzTmFtZTwvdHlwZT4NCi0jZWxzZQ0KLSAgICAgICAgICAgPHR5cGU+amF2YS5sYW5nLlN0cmluZzwvdHlwZT4NCi0jZW5kDQotI2VuZA0KLSAgICAgICAgPC9hdHRyaWJ1dGU+DQotI2VuZA0KLSNlbmQNCi0jIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBFTkQgTUFDUk9TIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0gICAgPCEtLSBDb21wb25lbnQgVGFncyAtLT4NCi0jc2V0ICgkY29tcG9uZW50TGlzdCA9ICR7bW9kZWwuZ2V0Q29tcG9uZW50cygpfSkNCi0jZm9yZWFjaCggJGNvbXBvbmVudCBpbiAkY29tcG9uZW50TGlzdCApDQotI2lmICgkbW9kZWxJZHMuY29udGFpbnMoJGNvbXBvbmVudC5tb2RlbElkKSANCi0gICAgJiYgKCRjb21wb25lbnQubmFtZSkpDQotI2lmICghJGNvbXBvbmVudC5pc0NvbmZpZ0V4Y2x1ZGVkKCkgJiYgISRjb21wb25lbnQuaXNDb21wb3NpdGUoKSkNCi0jIyBDaGVjayBpZiB3ZSBkb24ndCBoYXZlIGEgZmFjZWxldCB0YWcgdGFraW5nIHByZWNlZGVuY2Ugb3ZlciB0aGlzIGRlc2NyaXB0aW9uDQotI2lmICghICR7bW9kZWwuZmluZEZhY2VsZXRUYWdCeU5hbWUoJGNvbXBvbmVudC5uYW1lKX0pDQotICAgIDx0YWc+DQotI2lmICgkY29tcG9uZW50LmxvbmdEZXNjcmlwdGlvbikNCi0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVskY29tcG9uZW50LmxvbmdEZXNjcmlwdGlvbl1dPjwvZGVzY3JpcHRpb24+DQotI2Vsc2UNCi0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVtdXT48L2Rlc2NyaXB0aW9uPg0KLSNlbmQgICAgDQotICAgICAgICA8dGFnLW5hbWU+JHV0aWxzLmdldFRhZ05hbWUoJGNvbXBvbmVudC5uYW1lKTwvdGFnLW5hbWU+DQotICAgICAgICA8Y29tcG9uZW50Pg0KLSAgICAgICAgICAgIDxjb21wb25lbnQtdHlwZT4kY29tcG9uZW50LnR5cGU8L2NvbXBvbmVudC10eXBlPg0KLSNpZiAoJGNvbXBvbmVudC5yZW5kZXJlclR5cGUpDQotI2lmICghKCRjb21wb25lbnQucmVuZGVyZXJUeXBlID09ICIiKSkNCi0gICAgICAgICAgICA8cmVuZGVyZXItdHlwZT4kY29tcG9uZW50LnJlbmRlcmVyVHlwZTwvcmVuZGVyZXItdHlwZT4NCi0jZW5kDQotI2VuZA0KLSNpZiAoJGNvbXBvbmVudC50YWdIYW5kbGVyKQ0KLSAgICAgICAgICAgIDxoYW5kbGVyLWNsYXNzPiRjb21wb25lbnQudGFnSGFuZGxlcjwvaGFuZGxlci1jbGFzcz4NCi0jZW5kDQotICAgICAgICA8L2NvbXBvbmVudD4NCi0jc2V0ICgkYXR0cmlidXRlTGlzdCA9ICR7Y29tcG9uZW50LnByb3BlcnR5TGlzdH0pDQotI2ZvcmVhY2goICRhdHRyaWJ1dGUgaW4gJGF0dHJpYnV0ZUxpc3QgKQ0KLSN3cml0ZUpTRlByb3BlcnR5KCRhdHRyaWJ1dGUpDQotI2VuZCAgICAgICAgDQotICAgIDwvdGFnPg0KLSNlbmQNCi0jZW5kDQotI2VuZA0KLSNlbmQNCi0NCi0gICA8IS0tIENvbnZlcnRlciB0YWdzIC0tPg0KLSNzZXQgKCRjb21wb25lbnRMaXN0ID0gJHttb2RlbC5nZXRDb252ZXJ0ZXJzKCl9KQ0KLSNmb3JlYWNoKCAkY29tcG9uZW50IGluICRjb21wb25lbnRMaXN0ICkNCi0jaWYgKCRtb2RlbElkcy5jb250YWlucygkY29tcG9uZW50Lm1vZGVsSWQpIA0KLSAgICAmJiAoJGNvbXBvbmVudC5uYW1lKSkNCi0jaWYgKCRjb21wb25lbnQuY29udmVydGVySWQpDQotIyMgQ2hlY2sgaWYgd2UgZG9uJ3QgaGF2ZSBhIGZhY2VsZXQgdGFnIHRha2luZyBwcmVjZWRlbmNlIG92ZXIgdGhpcyBkZXNjcmlwdGlvbg0KLSNpZiAoISAke21vZGVsLmZpbmRGYWNlbGV0VGFnQnlOYW1lKCRjb21wb25lbnQubmFtZSl9KSANCi0gICAgPHRhZz4NCi0jaWYgKCRjb21wb25lbnQubG9uZ0Rlc2NyaXB0aW9uKQ0KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWyRjb21wb25lbnQubG9uZ0Rlc2NyaXB0aW9uXV0+PC9kZXNjcmlwdGlvbj4NCi0jZWxzZQ0KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBW11dPjwvZGVzY3JpcHRpb24+DQotI2VuZCAgICANCi0gICAgICAgIDx0YWctbmFtZT4kdXRpbHMuZ2V0VGFnTmFtZSgkY29tcG9uZW50Lm5hbWUpPC90YWctbmFtZT4NCi0gICAgICAgIDxjb252ZXJ0ZXI+DQotICAgICAgICAgICAgPGNvbnZlcnRlci1pZD4kY29tcG9uZW50LmNvbnZlcnRlcklkPC9jb252ZXJ0ZXItaWQ+DQotI2lmICgkY29tcG9uZW50LnRhZ0hhbmRsZXIpDQotICAgICAgICAgICAgPGhhbmRsZXItY2xhc3M+JGNvbXBvbmVudC50YWdIYW5kbGVyPC9oYW5kbGVyLWNsYXNzPg0KLSNlbmQNCi0gICAgICAgIDwvY29udmVydGVyPg0KLSNzZXQgKCRwcm9wZXJ0eUxpc3QgPSAke2NvbXBvbmVudC5wcm9wZXJ0eUxpc3R9KQ0KLSNmb3JlYWNoKCAkcHJvcGVydHkgaW4gJHByb3BlcnR5TGlzdCApDQotI3dyaXRlSlNGUHJvcGVydHkoJHByb3BlcnR5KQ0KLSNlbmQgICAgICAgIA0KLSAgICA8L3RhZz4NCi0jZW5kDQotI2VuZA0KLSNlbmQNCi0jZW5kDQotDQotICAgPCEtLSBWYWxpZGF0b3IgdGFncyAtLT4NCi0jc2V0ICgkY29tcG9uZW50TGlzdCA9ICR7bW9kZWwuZ2V0VmFsaWRhdG9ycygpfSkNCi0jZm9yZWFjaCggJGNvbXBvbmVudCBpbiAkY29tcG9uZW50TGlzdCApDQotI2lmICgkbW9kZWxJZHMuY29udGFpbnMoJGNvbXBvbmVudC5tb2RlbElkKSANCi0gICAgJiYgKCRjb21wb25lbnQubmFtZSkpDQotI2lmICgkY29tcG9uZW50LnZhbGlkYXRvcklkKQ0KLSMjIENoZWNrIGlmIHdlIGRvbid0IGhhdmUgYSBmYWNlbGV0IHRhZyB0YWtpbmcgcHJlY2VkZW5jZSBvdmVyIHRoaXMgZGVzY3JpcHRpb24NCi0jaWYgKCEgJHttb2RlbC5maW5kRmFjZWxldFRhZ0J5TmFtZSgkY29tcG9uZW50Lm5hbWUpfSkNCi0gICAgPHRhZz4NCi0jaWYgKCRjb21wb25lbnQubG9uZ0Rlc2NyaXB0aW9uKQ0KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWyRjb21wb25lbnQubG9uZ0Rlc2NyaXB0aW9uXV0+PC9kZXNjcmlwdGlvbj4NCi0jZWxzZQ0KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBW11dPjwvZGVzY3JpcHRpb24+DQotI2VuZCAgICANCi0gICAgICAgIDx0YWctbmFtZT4kdXRpbHMuZ2V0VGFnTmFtZSgkY29tcG9uZW50Lm5hbWUpPC90YWctbmFtZT4NCi0gICAgICAgIDx2YWxpZGF0b3I+DQotICAgICAgICAgICAgPHZhbGlkYXRvci1pZD4kY29tcG9uZW50LnZhbGlkYXRvcklkPC92YWxpZGF0b3ItaWQ+DQotI2lmICgkY29tcG9uZW50LnRhZ0hhbmRsZXIpDQotICAgICAgICAgICAgPGhhbmRsZXItY2xhc3M+JGNvbXBvbmVudC50YWdIYW5kbGVyPC9oYW5kbGVyLWNsYXNzPg0KLSNlbmQNCi0gICAgICAgIDwvdmFsaWRhdG9yPg0KLSNzZXQgKCRwcm9wZXJ0eUxpc3QgPSAke2NvbXBvbmVudC5wcm9wZXJ0eUxpc3R9KQ0KLSNmb3JlYWNoKCAkcHJvcGVydHkgaW4gJHByb3BlcnR5TGlzdCApDQotI3dyaXRlSlNGUHJvcGVydHkoJHByb3BlcnR5KQ0KLSNlbmQgICAgICAgIA0KLSAgICA8L3RhZz4NCi0jZW5kDQotI2VuZA0KLSNlbmQNCi0jZW5kDQotDQotICAgPCEtLSBCZWhhdmlvciB0YWdzIC0tPg0KLSNzZXQgKCRiZWhhdmlvckxpc3QgPSAke21vZGVsLmdldEJlaGF2aW9ycygpfSkNCi0jZm9yZWFjaCggJGJlaGF2aW9yIGluICRiZWhhdmlvckxpc3QgKQ0KLSNpZiAoJG1vZGVsSWRzLmNvbnRhaW5zKCRiZWhhdmlvci5tb2RlbElkKSANCi0gICAgJiYgKCRiZWhhdmlvci5uYW1lKSkNCi0jaWYgKCRiZWhhdmlvci5iZWhhdmlvcklkKQ0KLSMjIENoZWNrIGlmIHdlIGRvbid0IGhhdmUgYSBmYWNlbGV0IHRhZyB0YWtpbmcgcHJlY2VkZW5jZSBvdmVyIHRoaXMgZGVzY3JpcHRpb24NCi0jaWYgKCEgJHttb2RlbC5maW5kRmFjZWxldFRhZ0J5TmFtZSgkYmVoYXZpb3IubmFtZSl9KSANCi0gICAgPHRhZz4NCi0jaWYgKCRiZWhhdmlvci5sb25nRGVzY3JpcHRpb24pDQotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbJGJlaGF2aW9yLmxvbmdEZXNjcmlwdGlvbl1dPjwvZGVzY3JpcHRpb24+DQotI2Vsc2UNCi0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVtdXT48L2Rlc2NyaXB0aW9uPg0KLSNlbmQgICAgDQotICAgICAgICA8dGFnLW5hbWU+JHV0aWxzLmdldFRhZ05hbWUoJGJlaGF2aW9yLm5hbWUpPC90YWctbmFtZT4NCi0gICAgICAgIDxiZWhhdmlvcj4NCi0gICAgICAgICAgICA8YmVoYXZpb3ItaWQ+JGJlaGF2aW9yLmJlaGF2aW9ySWQ8L2JlaGF2aW9yLWlkPg0KLSNpZiAoJGJlaGF2aW9yLnRhZ0hhbmRsZXIpDQotICAgICAgICAgICAgPGhhbmRsZXItY2xhc3M+JGJlaGF2aW9yLnRhZ0hhbmRsZXI8L2hhbmRsZXItY2xhc3M+DQotI2VuZA0KLSAgICAgICAgPC9iZWhhdmlvcj4NCi0jc2V0ICgkcHJvcGVydHlMaXN0ID0gJHtiZWhhdmlvci5wcm9wZXJ0eUxpc3R9KQ0KLSNmb3JlYWNoKCAkcHJvcGVydHkgaW4gJHByb3BlcnR5TGlzdCApDQotI3dyaXRlSlNGUHJvcGVydHkoJHByb3BlcnR5KQ0KLSNlbmQgICAgICAgIA0KLSAgICA8L3RhZz4NCi0jZW5kDQotI2VuZA0KLSNlbmQNCi0jZW5kDQotICAgIA0KLSAgIDwhLS0gU2luZ2xlIFRhZ3MgLS0+DQotI3NldCAoJHRhZ0xpc3QgPSAkbW9kZWwuZ2V0VGFncygpKQ0KLSNmb3JlYWNoKCAkdGFnIGluICR0YWdMaXN0ICkNCi0jaWYgKCRtb2RlbElkcy5jb250YWlucygkdGFnLm1vZGVsSWQpKQ0KLSNpZiAoJHRhZy50YWdIYW5kbGVyKQ0KLSMjIENoZWNrIGlmIHdlIGRvbid0IGhhdmUgYSBmYWNlbGV0IHRhZyB0YWtpbmcgcHJlY2VkZW5jZSBvdmVyIHRoaXMgZGVzY3JpcHRpb24NCi0jaWYgKCEgJHttb2RlbC5maW5kRmFjZWxldFRhZ0J5TmFtZSgkdGFnLm5hbWUpfSkNCi0gICA8dGFnPg0KLSNpZiAoJHRhZy5sb25nRGVzY3JpcHRpb24pDQotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbJHRhZy5sb25nRGVzY3JpcHRpb25dXT48L2Rlc2NyaXB0aW9uPg0KLSNlbHNlDQotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbXV0+PC9kZXNjcmlwdGlvbj4NCi0jZW5kICAgIA0KLSAgICAgIDx0YWctbmFtZT4kdXRpbHMuZ2V0VGFnTmFtZSgkdGFnLm5hbWUpPC90YWctbmFtZT4NCi0gICAgICA8aGFuZGxlci1jbGFzcz4kdGFnLnRhZ0hhbmRsZXI8L2hhbmRsZXItY2xhc3M+DQotI2ZvcmVhY2goICRhdHRyaWJ1dGUgaW4gJGF0dHJpYnV0ZUxpc3QgKQ0KLSN3cml0ZUpTRkF0dHJpYnV0ZSgkYXR0cmlidXRlKQ0KLSNlbmQNCi0gICA8L3RhZz4NCi0jZW5kDQotI2VuZA0KLSNlbmQNCi0jZW5kDQotDQotICAgIDwhLS0gRmFjZWxldCBUYWdzIC0tPg0KLSNzZXQgKCRmYWNlbGV0VGFnTGlzdCA9ICRtb2RlbC5nZXRGYWNlbGV0VGFncygpKQ0KLSNmb3JlYWNoKCAkZmFjZWxldFRhZyBpbiAkZmFjZWxldFRhZ0xpc3QgKQ0KLSNpZiAoJG1vZGVsSWRzLmNvbnRhaW5zKCRmYWNlbGV0VGFnLm1vZGVsSWQpICYmICgkZmFjZWxldFRhZy5uYW1lKSkNCi0jaWYgKCR1dGlscy5nZXRUYWdQcmVmaXgoJGZhY2VsZXRUYWcubmFtZSkgPT0gJHNob3J0bmFtZSkNCi0gICA8dGFnPg0KLSNpZiAoJGZhY2VsZXRUYWcubG9uZ0Rlc2NyaXB0aW9uKQ0KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWyRmYWNlbGV0VGFnLmxvbmdEZXNjcmlwdGlvbl1dPjwvZGVzY3JpcHRpb24+DQotI2Vsc2UNCi0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVtdXT48L2Rlc2NyaXB0aW9uPg0KLSNlbmQgICAgDQotDQotICAgICAgPHRhZy1uYW1lPiR1dGlscy5nZXRUYWdOYW1lKCRmYWNlbGV0VGFnLm5hbWUpPC90YWctbmFtZT4NCi0jaWYgKCRmYWNlbGV0VGFnLmNvbXBvbmVudENsYXNzKQ0KLSNzZXQgKCRjb21wb25lbnQgPSAke21vZGVsLmZpbmRDb21wb25lbnRCeUNsYXNzTmFtZSgkZmFjZWxldFRhZy5jb21wb25lbnRDbGFzcyl9KQ0KLSAgICA8Y29tcG9uZW50Pg0KLSAgICAgICAgPGNvbXBvbmVudC10eXBlPiRjb21wb25lbnQudHlwZTwvY29tcG9uZW50LXR5cGU+DQotI2lmICgkY29tcG9uZW50LnJlbmRlcmVyVHlwZSkNCi0jaWYgKCEoJGNvbXBvbmVudC5yZW5kZXJlclR5cGUgPT0gIiIpKQ0KLSAgICAgICAgPHJlbmRlcmVyLXR5cGU+JGNvbXBvbmVudC5yZW5kZXJlclR5cGU8L3JlbmRlcmVyLXR5cGU+DQotI2VuZA0KLSNlbmQNCi0gICAgICAgIDxoYW5kbGVyLWNsYXNzPiRmYWNlbGV0VGFnLmNsYXNzTmFtZTwvaGFuZGxlci1jbGFzcz4NCi0gICAgPC9jb21wb25lbnQ+DQotI2Vsc2VpZiAoJGZhY2VsZXRUYWcuY29udmVydGVyQ2xhc3MpDQotI3NldCAoJGNvbnZlcnRlciA9ICR7bW9kZWwuZmluZENvbnZlcnRlckJ5Q2xhc3NOYW1lKCRmYWNlbGV0VGFnLmNvbnZlcnRlckNsYXNzKX0pDQotICAgIDxjb252ZXJ0ZXI+DQotICAgICAgICA8Y29udmVydGVyLWlkPiRjb252ZXJ0ZXIuY29udmVydGVySWQ8L2NvbnZlcnRlci1pZD4NCi0gICAgICAgIDxoYW5kbGVyLWNsYXNzPiRmYWNlbGV0VGFnLmNsYXNzTmFtZTwvaGFuZGxlci1jbGFzcz4NCi0gICAgPC9jb252ZXJ0ZXI+DQotI2Vsc2VpZiAoJGZhY2VsZXRUYWcuYmVoYXZpb3JDbGFzcykNCi0jc2V0ICgkYmVoYXZpb3IgPSAke21vZGVsLmZpbmRCZWhhdmlvckJ5Q2xhc3NOYW1lKCRmYWNlbGV0VGFnLmJlaGF2aW9yQ2xhc3MpfSkNCi0gICAgPGJlaGF2aW9yPg0KLSAgICAgICAgPGJlaGF2aW9yLWlkPiRiZWhhdmlvci5iZWhhdmlvcklkPC9iZWhhdmlvci1pZD4NCi0gICAgICAgIDxoYW5kbGVyLWNsYXNzPiRmYWNlbGV0VGFnLmNsYXNzTmFtZTwvaGFuZGxlci1jbGFzcz4NCi0gICAgPC9iZWhhdmlvcj4NCi0jZWxzZQ0KLSAgICA8aGFuZGxlci1jbGFzcz4kZmFjZWxldFRhZy5jbGFzc05hbWU8L2hhbmRsZXItY2xhc3M+DQotI2VuZA0KLSNzZXQgKCRhdHRyaWJ1dGVMaXN0ID0gJHt0YWcuYXR0cmlidXRlTGlzdH0pDQotI2ZvcmVhY2goICRhdHRyaWJ1dGUgaW4gJGF0dHJpYnV0ZUxpc3QgKQ0KLSN3cml0ZUpTRkF0dHJpYnV0ZSgkYXR0cmlidXRlKQ0KLSNlbmQNCi0gICA8L3RhZz4NCi0jZW5kDQotI2VuZA0KLSNlbmQNCi08L2ZhY2VsZXQtdGFnbGliPg0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL2ZhY2VzLWNvbmZpZzExLnZtIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvZmFjZXMtY29uZmlnMTEudm0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyZDU3MzEuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvZmFjZXMtY29uZmlnMTEudm0KKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJJU08tODg1OS0xIiA/PgotCi08IURPQ1RZUEUgZmFjZXMtY29uZmlnIFBVQkxJQwotICItLy9TdW4gTWljcm9zeXN0ZW1zLCBJbmMuLy9EVEQgSmF2YVNlcnZlciBGYWNlcyBDb25maWcgMS4xLy9FTiIKLSAiaHR0cDovL2phdmEuc3VuLmNvbS9kdGQvd2ViLWZhY2VzY29uZmlnXzFfMS5kdGQiPgotCi08IS0tCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxmYWNlcy1jb25maWcgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20vSlNGL0NvbmZpZ3VyYXRpb24iPgotCi0kYmFzZUNvbnRlbnQKLQotI3NldCAoJGNvbXBvbmVudExpc3QgPSAke21vZGVsLmdldENvbXBvbmVudHMoKX0pCi0jZm9yZWFjaCggJGNvbXBvbmVudCBpbiAkY29tcG9uZW50TGlzdCApCi0jaWYgKCRtb2RlbElkcy5jb250YWlucygkY29tcG9uZW50Lm1vZGVsSWQpIAotICAgICYmICEoJGNvbXBvbmVudC5jbGFzc05hbWUuY29udGFpbnMoIlVJQ29tcG9uZW50IikpCi0gICAgJiYgISgkY29tcG9uZW50LmlzQ29uZmlnRXhjbHVkZWQoKSkpCi0gIDxjb21wb25lbnQ+Ci0gICAgPGNvbXBvbmVudC10eXBlPiRjb21wb25lbnQudHlwZTwvY29tcG9uZW50LXR5cGU+Ci0gICAgPGNvbXBvbmVudC1jbGFzcz4kY29tcG9uZW50LmNsYXNzTmFtZTwvY29tcG9uZW50LWNsYXNzPgotICA8L2NvbXBvbmVudD4gICAgCi0jZW5kCi0jZW5kCi0jc2V0ICgkY29udmVydGVyTGlzdCA9ICR7bW9kZWwuZ2V0Q29udmVydGVycygpfSkKLSNmb3JlYWNoKCAkY29udmVydGVyIGluICRjb252ZXJ0ZXJMaXN0ICkKLSNpZiAoJG1vZGVsSWRzLmNvbnRhaW5zKCRjb252ZXJ0ZXIubW9kZWxJZCkgJiYKLSAgICAhKCRjb252ZXJ0ZXIuaXNDb25maWdFeGNsdWRlZCgpLmJvb2xlYW5WYWx1ZSgpKSAmJgotICAgICRjb252ZXJ0ZXIuY29udmVydGVySWQpCi0gIDxjb252ZXJ0ZXI+Ci0gICAgPGNvbnZlcnRlci1pZD4kY29udmVydGVyLmNvbnZlcnRlcklkPC9jb252ZXJ0ZXItaWQ+Ci0gICAgPGNvbnZlcnRlci1jbGFzcz4kY29udmVydGVyLmNsYXNzTmFtZTwvY29udmVydGVyLWNsYXNzPgotICA8L2NvbnZlcnRlcj4KLSNlbmQKLSNlbmQKLSNzZXQgKCR2YWxpZGF0b3JMaXN0ID0gJHttb2RlbC5nZXRWYWxpZGF0b3JzKCl9KQotI2ZvcmVhY2goICR2YWxpZGF0b3IgaW4gJHZhbGlkYXRvckxpc3QgKQotI2lmICgkbW9kZWxJZHMuY29udGFpbnMoJHZhbGlkYXRvci5tb2RlbElkKSAmJgotICAgICEoJHZhbGlkYXRvci5pc0NvbmZpZ0V4Y2x1ZGVkKCkuYm9vbGVhblZhbHVlKCkpICYmCi0gICAgJHZhbGlkYXRvci52YWxpZGF0b3JJZCkKLSAgPHZhbGlkYXRvcj4KLSAgICA8dmFsaWRhdG9yLWlkPiR2YWxpZGF0b3IudmFsaWRhdG9ySWQ8L3ZhbGlkYXRvci1pZD4KLSAgICA8dmFsaWRhdG9yLWNsYXNzPiR2YWxpZGF0b3IuY2xhc3NOYW1lPC92YWxpZGF0b3ItY2xhc3M+Ci0gIDwvdmFsaWRhdG9yPgotI2VuZAotI2VuZAotI3NldCAoJHJlbmRlcktpdExpc3QgPSAke21vZGVsLmdldFJlbmRlcktpdHMoKX0pCi0jZm9yZWFjaCggJHJlbmRlcktpdCBpbiAkcmVuZGVyS2l0TGlzdCApCi0gIDxyZW5kZXIta2l0PgotICAgIDxyZW5kZXIta2l0LWlkPiRyZW5kZXJLaXQucmVuZGVyS2l0SWQ8L3JlbmRlci1raXQtaWQ+Ci0jaWYgKCRyZW5kZXJLaXQuY2xhc3NOYW1lKQotICAgIDxyZW5kZXIta2l0LWNsYXNzPiRyZW5kZXJLaXQuY2xhc3NOYW1lPC9yZW5kZXIta2l0LWNsYXNzPgotI2VuZAotI3NldCAoJHJlbmRlcmVyTGlzdCA9ICR7cmVuZGVyS2l0LmdldFJlbmRlcmVycygpfSkKLSNmb3JlYWNoKCAkcmVuZGVyZXIgaW4gJHJlbmRlcmVyTGlzdCApCi0gICAgICA8cmVuZGVyZXI+Ci0gICAgICAgIDxjb21wb25lbnQtZmFtaWx5PiRyZW5kZXJlci5jb21wb25lbnRGYW1pbHk8L2NvbXBvbmVudC1mYW1pbHk+Ci0gICAgICAgIDxyZW5kZXJlci10eXBlPiRyZW5kZXJlci5yZW5kZXJlclR5cGU8L3JlbmRlcmVyLXR5cGU+Ci0gICAgICAgIDxyZW5kZXJlci1jbGFzcz4kcmVuZGVyZXIuY2xhc3NOYW1lPC9yZW5kZXJlci1jbGFzcz4KLSAgICAgIDwvcmVuZGVyZXI+Ci0jZW5kCi0gIDwvcmVuZGVyLWtpdD4KLSNlbmQKLTwvZmFjZXMtY29uZmlnPgpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvZmFjZXMtY29uZmlnMTIudm0gYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9mYWNlcy1jb25maWcxMi52bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmQ1YzdlNy4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9mYWNlcy1jb25maWcxMi52bQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotDQotPCEtLQ0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotDQotPGZhY2VzLWNvbmZpZyB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIiANCi0gICAgICAgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIA0KLSAgICAgICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL3dlYi1mYWNlc2NvbmZpZ18xXzIueHNkIiANCi0gICAgICAgICAgICAgIHZlcnNpb249IjEuMiI+DQotDQotJGJhc2VDb250ZW50DQotDQotI3NldCAoJGNvbXBvbmVudExpc3QgPSAke21vZGVsLmdldENvbXBvbmVudHMoKX0pDQotI2ZvcmVhY2goICRjb21wb25lbnQgaW4gJGNvbXBvbmVudExpc3QgKQ0KLSNpZiAoJG1vZGVsSWRzLmNvbnRhaW5zKCRjb21wb25lbnQubW9kZWxJZCkgDQotICAgICYmICEoJGNvbXBvbmVudC5jbGFzc05hbWUuY29udGFpbnMoIlVJQ29tcG9uZW50IikpDQotICAgICYmICEoJGNvbXBvbmVudC5pc0NvbmZpZ0V4Y2x1ZGVkKCkpKQ0KLSAgPGNvbXBvbmVudD4NCi0gICAgPGNvbXBvbmVudC10eXBlPiRjb21wb25lbnQudHlwZTwvY29tcG9uZW50LXR5cGU+DQotICAgIDxjb21wb25lbnQtY2xhc3M+JGNvbXBvbmVudC5jbGFzc05hbWU8L2NvbXBvbmVudC1jbGFzcz4NCi0gIDwvY29tcG9uZW50PiAgICANCi0jZW5kDQotI2VuZA0KLSNzZXQgKCRjb252ZXJ0ZXJMaXN0ID0gJHttb2RlbC5nZXRDb252ZXJ0ZXJzKCl9KQ0KLSNmb3JlYWNoKCAkY29udmVydGVyIGluICRjb252ZXJ0ZXJMaXN0ICkNCi0jaWYgKCRtb2RlbElkcy5jb250YWlucygkY29udmVydGVyLm1vZGVsSWQpICYmDQotICAgICEoJGNvbnZlcnRlci5pc0NvbmZpZ0V4Y2x1ZGVkKCkuYm9vbGVhblZhbHVlKCkpICYmDQotICAgICRjb252ZXJ0ZXIuY29udmVydGVySWQpDQotICA8Y29udmVydGVyPg0KLSAgICA8Y29udmVydGVyLWlkPiRjb252ZXJ0ZXIuY29udmVydGVySWQ8L2NvbnZlcnRlci1pZD4NCi0gICAgPGNvbnZlcnRlci1jbGFzcz4kY29udmVydGVyLmNsYXNzTmFtZTwvY29udmVydGVyLWNsYXNzPg0KLSAgPC9jb252ZXJ0ZXI+DQotI2VuZA0KLSNlbmQNCi0jc2V0ICgkdmFsaWRhdG9yTGlzdCA9ICR7bW9kZWwuZ2V0VmFsaWRhdG9ycygpfSkNCi0jZm9yZWFjaCggJHZhbGlkYXRvciBpbiAkdmFsaWRhdG9yTGlzdCApDQotI2lmICgkbW9kZWxJZHMuY29udGFpbnMoJHZhbGlkYXRvci5tb2RlbElkKSAmJg0KLSAgICAhKCR2YWxpZGF0b3IuaXNDb25maWdFeGNsdWRlZCgpLmJvb2xlYW5WYWx1ZSgpKSAmJg0KLSAgICAkdmFsaWRhdG9yLnZhbGlkYXRvcklkKQ0KLSAgPHZhbGlkYXRvcj4NCi0gICAgPHZhbGlkYXRvci1pZD4kdmFsaWRhdG9yLnZhbGlkYXRvcklkPC92YWxpZGF0b3ItaWQ+DQotICAgIDx2YWxpZGF0b3ItY2xhc3M+JHZhbGlkYXRvci5jbGFzc05hbWU8L3ZhbGlkYXRvci1jbGFzcz4NCi0gIDwvdmFsaWRhdG9yPg0KLSNlbmQNCi0jZW5kDQotI3NldCAoJHJlbmRlcktpdExpc3QgPSAke21vZGVsLmdldFJlbmRlcktpdHMoKX0pDQotI2ZvcmVhY2goICRyZW5kZXJLaXQgaW4gJHJlbmRlcktpdExpc3QgKQ0KLSAgPHJlbmRlci1raXQ+DQotICAgIDxyZW5kZXIta2l0LWlkPiRyZW5kZXJLaXQucmVuZGVyS2l0SWQ8L3JlbmRlci1raXQtaWQ+DQotI2lmICgkcmVuZGVyS2l0LmNsYXNzTmFtZSkNCi0gICAgPHJlbmRlci1raXQtY2xhc3M+JHJlbmRlcktpdC5jbGFzc05hbWU8L3JlbmRlci1raXQtY2xhc3M+DQotI2VuZA0KLSNzZXQgKCRyZW5kZXJlckxpc3QgPSAke3JlbmRlcktpdC5nZXRSZW5kZXJlcnMoKX0pDQotI2ZvcmVhY2goICRyZW5kZXJlciBpbiAkcmVuZGVyZXJMaXN0ICkNCi0gICAgICA8cmVuZGVyZXI+DQotICAgICAgICA8Y29tcG9uZW50LWZhbWlseT4kcmVuZGVyZXIuY29tcG9uZW50RmFtaWx5PC9jb21wb25lbnQtZmFtaWx5Pg0KLSAgICAgICAgPHJlbmRlcmVyLXR5cGU+JHJlbmRlcmVyLnJlbmRlcmVyVHlwZTwvcmVuZGVyZXItdHlwZT4NCi0gICAgICAgIDxyZW5kZXJlci1jbGFzcz4kcmVuZGVyZXIuY2xhc3NOYW1lPC9yZW5kZXJlci1jbGFzcz4NCi0gICAgICA8L3JlbmRlcmVyPg0KLSNlbmQNCi0gIDwvcmVuZGVyLWtpdD4NCi0jZW5kDQotPC9mYWNlcy1jb25maWc+DQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvZmFjZXMtY29uZmlnMjAudm0gYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9mYWNlcy1jb25maWcyMC52bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmRlZWJmMS4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9mYWNlcy1jb25maWcyMC52bQorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotDQotPCEtLQ0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotDQotPGZhY2VzLWNvbmZpZyB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIiANCi0gICAgICAgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIA0KLSAgICAgICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL3dlYi1mYWNlc2NvbmZpZ18yXzAueHNkIiANCi0gICAgICAgICAgICAgIHZlcnNpb249IjIuMCI+DQotDQotJGJhc2VDb250ZW50DQotDQotI3NldCAoJGNvbXBvbmVudExpc3QgPSAke21vZGVsLmdldENvbXBvbmVudHMoKX0pDQotI2ZvcmVhY2goICRjb21wb25lbnQgaW4gJGNvbXBvbmVudExpc3QgKQ0KLSNpZiAoJG1vZGVsSWRzLmNvbnRhaW5zKCRjb21wb25lbnQubW9kZWxJZCkgDQotICAgICYmICEoJGNvbXBvbmVudC5jbGFzc05hbWUuY29udGFpbnMoIlVJQ29tcG9uZW50IikpDQotICAgICYmICEoJGNvbXBvbmVudC5pc0NvbmZpZ0V4Y2x1ZGVkKCkpKQ0KLSAgPGNvbXBvbmVudD4NCi0gICAgPGNvbXBvbmVudC10eXBlPiRjb21wb25lbnQudHlwZTwvY29tcG9uZW50LXR5cGU+DQotICAgIDxjb21wb25lbnQtY2xhc3M+JGNvbXBvbmVudC5jbGFzc05hbWU8L2NvbXBvbmVudC1jbGFzcz4NCi0gIDwvY29tcG9uZW50PiAgICANCi0jZW5kDQotI2VuZA0KLSNzZXQgKCRjb252ZXJ0ZXJMaXN0ID0gJHttb2RlbC5nZXRDb252ZXJ0ZXJzKCl9KQ0KLSNmb3JlYWNoKCAkY29udmVydGVyIGluICRjb252ZXJ0ZXJMaXN0ICkNCi0jaWYgKCRtb2RlbElkcy5jb250YWlucygkY29udmVydGVyLm1vZGVsSWQpKQ0KLSAgPGNvbnZlcnRlcj4NCi0gICAgPGNvbnZlcnRlci1pZD4kY29udmVydGVyLmNvbnZlcnRlcklkPC9jb252ZXJ0ZXItaWQ+DQotICAgIDxjb252ZXJ0ZXItY2xhc3M+JGNvbnZlcnRlci5jbGFzc05hbWU8L2NvbnZlcnRlci1jbGFzcz4NCi0gIDwvY29udmVydGVyPg0KLSNlbmQNCi0jZW5kDQotI3NldCAoJHZhbGlkYXRvckxpc3QgPSAke21vZGVsLmdldFZhbGlkYXRvcnMoKX0pDQotI2ZvcmVhY2goICR2YWxpZGF0b3IgaW4gJHZhbGlkYXRvckxpc3QgKQ0KLSNpZiAoJG1vZGVsSWRzLmNvbnRhaW5zKCR2YWxpZGF0b3IubW9kZWxJZCkgJiYNCi0gICAgISgkdmFsaWRhdG9yLmlzQ29uZmlnRXhjbHVkZWQoKS5ib29sZWFuVmFsdWUoKSkgJiYNCi0gICAgJHZhbGlkYXRvci52YWxpZGF0b3JJZCkNCi0gIDx2YWxpZGF0b3I+DQotICAgIDx2YWxpZGF0b3ItaWQ+JHZhbGlkYXRvci52YWxpZGF0b3JJZDwvdmFsaWRhdG9yLWlkPg0KLSAgICA8dmFsaWRhdG9yLWNsYXNzPiR2YWxpZGF0b3IuY2xhc3NOYW1lPC92YWxpZGF0b3ItY2xhc3M+DQotICA8L3ZhbGlkYXRvcj4NCi0jZW5kDQotI2VuZA0KLSNzZXQgKCRiZWhhdmlvckxpc3QgPSAke21vZGVsLmdldEJlaGF2aW9ycygpfSkNCi0jZm9yZWFjaCggJGJlaGF2aW9yIGluICRiZWhhdmlvckxpc3QgKQ0KLSNpZiAoJG1vZGVsSWRzLmNvbnRhaW5zKCRiZWhhdmlvci5tb2RlbElkKSkNCi0gIDxiZWhhdmlvcj4NCi0gICAgPGJlaGF2aW9yLWlkPiRiZWhhdmlvci5iZWhhdmlvcklkPC9iZWhhdmlvci1pZD4NCi0gICAgPGJlaGF2aW9yLWNsYXNzPiRiZWhhdmlvci5jbGFzc05hbWU8L2JlaGF2aW9yLWNsYXNzPg0KLSAgPC9iZWhhdmlvcj4NCi0jZW5kDQotI2VuZA0KLSNzZXQgKCRyZW5kZXJLaXRMaXN0ID0gJHttb2RlbC5nZXRSZW5kZXJLaXRzKCl9KQ0KLSNmb3JlYWNoKCAkcmVuZGVyS2l0IGluICRyZW5kZXJLaXRMaXN0ICkNCi0gIDxyZW5kZXIta2l0Pg0KLSAgICA8cmVuZGVyLWtpdC1pZD4kcmVuZGVyS2l0LnJlbmRlcktpdElkPC9yZW5kZXIta2l0LWlkPg0KLSNpZiAoJHJlbmRlcktpdC5jbGFzc05hbWUpDQotICAgIDxyZW5kZXIta2l0LWNsYXNzPiRyZW5kZXJLaXQuY2xhc3NOYW1lPC9yZW5kZXIta2l0LWNsYXNzPg0KLSNlbmQNCi0jc2V0ICgkcmVuZGVyZXJMaXN0ID0gJHtyZW5kZXJLaXQuZ2V0UmVuZGVyZXJzKCl9KQ0KLSNmb3JlYWNoKCAkcmVuZGVyZXIgaW4gJHJlbmRlcmVyTGlzdCApDQotICAgICAgPHJlbmRlcmVyPg0KLSAgICAgICAgPGNvbXBvbmVudC1mYW1pbHk+JHJlbmRlcmVyLmNvbXBvbmVudEZhbWlseTwvY29tcG9uZW50LWZhbWlseT4NCi0gICAgICAgIDxyZW5kZXJlci10eXBlPiRyZW5kZXJlci5yZW5kZXJlclR5cGU8L3JlbmRlcmVyLXR5cGU+DQotICAgICAgICA8cmVuZGVyZXItY2xhc3M+JHJlbmRlcmVyLmNsYXNzTmFtZTwvcmVuZGVyZXItY2xhc3M+DQotICAgICAgPC9yZW5kZXJlcj4NCi0jZW5kDQotI3NldCAoJGNsaWVudEJlaGF2aW9yUmVuZGVyZXJMaXN0ID0gJHtyZW5kZXJLaXQuZ2V0Q2xpZW50QmVoYXZpb3JSZW5kZXJlcnMoKX0pDQotI2ZvcmVhY2goICRjbGllbnRCZWhhdmlvclJlbmRlcmVyIGluICRjbGllbnRCZWhhdmlvclJlbmRlcmVyTGlzdCApDQotICAgICAgPGNsaWVudC1iZWhhdmlvci1yZW5kZXJlcj4NCi0gICAgICAgIDxjbGllbnQtYmVoYXZpb3ItcmVuZGVyZXItdHlwZT4kY2xpZW50QmVoYXZpb3JSZW5kZXJlci5yZW5kZXJlclR5cGU8L2NsaWVudC1iZWhhdmlvci1yZW5kZXJlci10eXBlPg0KLSAgICAgICAgPGNsaWVudC1iZWhhdmlvci1yZW5kZXJlci1jbGFzcz4kY2xpZW50QmVoYXZpb3JSZW5kZXJlci5jbGFzc05hbWU8L2NsaWVudC1iZWhhdmlvci1yZW5kZXJlci1jbGFzcz4NCi0gICAgICA8L2NsaWVudC1iZWhhdmlvci1yZW5kZXJlcj4NCi0jZW5kDQotICA8L3JlbmRlci1raXQ+DQotI2VuZA0KLTwvZmFjZXMtY29uZmlnPg0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL215ZmFjZXNfaHRtbC52bSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL215ZmFjZXNfaHRtbC52bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQ2N2RjZS4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9teWZhY2VzX2h0bWwudm0KKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJJU08tODg1OS0xIj8+Ci08IS0tCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08IURPQ1RZUEUgdGFnbGliIFBVQkxJQyAiLS8vU3VuIE1pY3Jvc3lzdGVtcywgSW5jLi8vRFREIEpTUCBUYWcgTGlicmFyeSAxLjIvL0VOIiAiaHR0cDovL2phdmEuc3VuLmNvbS9kdGQvd2ViLWpzcHRhZ2xpYnJhcnlfMV8yLmR0ZCI+Ci08dGFnbGliIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL0pTUC9UYWdMaWJyYXJ5RGVzY3JpcHRvciI+Ci0KLSRiYXNlQ29udGVudAotCi0jc2V0ICgkY29tcG9uZW50TGlzdCA9ICR7bW9kZWwuZ2V0Q29tcG9uZW50cygpfSkKLSNmb3JlYWNoKCAkY29tcG9uZW50IGluICRjb21wb25lbnRMaXN0ICkKLSNpZiAoJG1vZGVsSWRzLmNvbnRhaW5zKCRjb21wb25lbnQubW9kZWxJZCkgCi0gICAgJiYgKCRjb21wb25lbnQubmFtZSkpCi0jaWYgKCR1dGlscy5nZXRUYWdQcmVmaXgoJGNvbXBvbmVudC5uYW1lKSA9PSAiaCIpIAotICAgPHRhZz4KLSAgICAgIDxuYW1lPiR1dGlscy5nZXRUYWdOYW1lKCRjb21wb25lbnQubmFtZSk8L25hbWU+Ci0gICAgICA8dGFnLWNsYXNzPiRjb21wb25lbnQudGFnQ2xhc3M8L3RhZy1jbGFzcz4KLSAgICAgIDxib2R5LWNvbnRlbnQ+SlNQPC9ib2R5LWNvbnRlbnQ+Ci0gICAgICA8ZGVzY3JpcHRpb24+PC9kZXNjcmlwdGlvbj4KLSAgICAgIAotI3NldCAoJHByb3BlcnR5TGlzdCA9ICR7Y29tcG9uZW50LnByb3BlcnR5TGlzdH0pCi0jZm9yZWFjaCggJHByb3BlcnR5IGluICRwcm9wZXJ0eUxpc3QgKQotI2lmICghJHByb3BlcnR5LnRhZ0V4Y2x1ZGVkKQotICAgICAgPGF0dHJpYnV0ZT4KLSAgICAgICAgIDxuYW1lPiRwcm9wZXJ0eS5uYW1lPC9uYW1lPgotICAgICAgICAgPHJlcXVpcmVkPiRwcm9wZXJ0eS5pc1JlcXVpcmVkKCk8L3JlcXVpcmVkPgotICAgICAgICAgPHJ0ZXhwcnZhbHVlPmZhbHNlPC9ydGV4cHJ2YWx1ZT4KLSAgICAgICAgIDx0eXBlPmphdmEubGFuZy5TdHJpbmc8L3R5cGU+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotI2VuZAotI2VuZAotICAgPC90YWc+Ci0jZW5kCi0jZW5kCi0jZW5kCi08L3RhZ2xpYj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9zY2hlbWFzL21hdmVuLWZhY2VzLXBsdWdpbi54c2QgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9zY2hlbWFzL21hdmVuLWZhY2VzLXBsdWdpbi54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1YzNiMWQuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvc2NoZW1hcy9tYXZlbi1mYWNlcy1wbHVnaW4ueHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTMzICswLDAgQEAKLTw/eG1sIHZlcnNpb24gPSAiMS4wIiBlbmNvZGluZyA9ICJVVEYtOCI/PgotPCEtLQotICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICAgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gICAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICAgIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICAgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gICAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gICAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gICAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICAgIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0tLT4KLTx4c2Q6c2NoZW1hIHhtbG5zOm1mcD0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9tYXZlbi1mYWNlcy1wbHVnaW4iCi0gICAgICAgICAgICB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgICAgICAgICAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL21hdmVuLWZhY2VzLXBsdWdpbiIKLSAgICAgICAgICAgIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIgotICAgICAgICAgICAgYXR0cmlidXRlRm9ybURlZmF1bHQ9InVucXVhbGlmaWVkIgotICAgICAgICAgICAgdmVyc2lvbj0iMS4yIj4KLQotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgJElkOiAkCi0gICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb21wb25lbnQiIHR5cGU9Im1mcDpjb21wb25lbnRUeXBlIiAvPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eSIgdHlwZT0ibWZwOnByb3BlcnR5VHlwZSIgLz4KLQotICAgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icHJvcGVydHlUeXBlIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZXF1aXJlZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6Ym9vbGVhbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSIxIiAvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFsaWFzLW9mIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0iMSIgLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0cmFuc2llbnQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOmJvb2xlYW4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0iMSIgLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzdGF0ZS1ob2xkZXIiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOmJvb2xlYW4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0iMSIgLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZXF1aXJlcy1saXRlcmFsIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ2aXJ0dWFsIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImhpZGRlbiIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtZXRob2QtYmluZGluZy1zaWduYXR1cmUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ibWZwOm1ldGhvZC1iaW5kaW5nLXNpZ25hdHVyZVR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY29tcG9uZW50VHlwZSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29tcG9uZW50LWZhbWlseSIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9IjEiIC8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVuZGVyZXItdHlwZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9IjEiIC8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29tcG9uZW50LXN1cGVydHlwZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9IjEiIC8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29tcG9uZW50LXN1cGVyY2xhc3MiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSIxIiAvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlZmF1bHQtcmVuZGVyZXItdHlwZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9IjEiIC8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtaW5nLWNvbnRhaW5lciIgdHlwZT0ieHNkOmJvb2xlYW4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ianNwLXRhZy1jbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImV2ZW50IgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9Im1mcDpjb21wb25lbnQtZXZlbnRUeXBlIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNvbXBvbmVudC1ldmVudFR5cGUiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImV2ZW50LW5hbWUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjEiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSIxIiAvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImV2ZW50LWxpc3RlbmVyLWNsYXNzIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0iMSIgLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJldmVudC1jbGFzcyIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9IjEiIC8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXZlbnQtc291cmNlLWludGVyZmFjZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9IjEiIC8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXZlbnQtZGVsaXZlcnktcGhhc2VzIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im1ldGhvZC1iaW5kaW5nLXNpZ25hdHVyZVR5cGUiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBhcmFtZXRlci10eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZXR1cm4tdHlwZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTwveHNkOnNjaGVtYT4KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL3RhZ0NsYXNzMTEudm0gYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi90YWdDbGFzczExLnZtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNzY4NjM5Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL3RhZ0NsYXNzMTEudm0KKysrIC9kZXYvbnVsbApAQCAtMSwxNzAgKzAsMCBAQAotLy8gV0FSTklORzogVGhpcyBmaWxlIHdhcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZC4gRG8gbm90IGVkaXQgaXQgZGlyZWN0bHksCi0vLyAgICAgICAgICBvciB5b3Ugd2lsbCBsb3NlIHlvdXIgY2hhbmdlcy4KLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgJHtjb21wb25lbnQudGFnUGFja2FnZX07Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuZWwuVmFsdWVCaW5kaW5nOwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0OwotaW1wb3J0ICR7Y29tcG9uZW50LnRhZ1N1cGVyY2xhc3N9OwotJHV0aWxzLmltcG9ydFRhZ0NsYXNzZXMoJGNvbXBvbmVudCkKLQotLy8gR2VuZXJhdGVkIGZyb20gY2xhc3MgJHtjb21wb25lbnQuc291cmNlQ2xhc3NOYW1lfS4KLS8vCi0vLyBXQVJOSU5HOiBUaGlzIGZpbGUgd2FzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkLiBEbyBub3QgZWRpdCBpdCBkaXJlY3RseSwKLS8vICAgICAgICAgIG9yIHlvdSB3aWxsIGxvc2UgeW91ciBjaGFuZ2VzLgotcHVibGljIGNsYXNzICR1dGlscy5nZXRDbGFzc0Zyb21GdWxsQ2xhc3MoJGNvbXBvbmVudC50YWdDbGFzcykgZXh0ZW5kcyAke3V0aWxzLmdldENsYXNzRnJvbUZ1bGxDbGFzcygkY29tcG9uZW50LnRhZ1N1cGVyY2xhc3MpfXsKLQotICAgIHB1YmxpYyAkdXRpbHMuZ2V0Q2xhc3NGcm9tRnVsbENsYXNzKCRjb21wb25lbnQudGFnQ2xhc3MpKCkKLSAgICB7ICAgIAotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgU3RyaW5nIGdldENvbXBvbmVudFR5cGUoKQotICAgIHsKLSNpZiAoJGNvbXBvbmVudC50eXBlKQotICAgICAgICByZXR1cm4gIiRjb21wb25lbnQudHlwZSI7Ci0jZWxzZQotICAgICAgICByZXR1cm4gbnVsbDsKLSNlbmQKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFJlbmRlcmVyVHlwZSgpCi0gICAgewotI2lmICgkY29tcG9uZW50LnJlbmRlcmVyVHlwZSAmJiAhKCRjb21wb25lbnQucmVuZGVyZXJUeXBlID09ICIiKSkKLSAgICAgICAgcmV0dXJuICIkY29tcG9uZW50LnJlbmRlcmVyVHlwZSI7Ci0jZWxzZQotICAgICAgICByZXR1cm4gbnVsbDsKLSNlbmQKLSAgICB9Ci0KLSNzZXQgKCRwcm9wZXJ0eUxpc3QgPSAke2NvbXBvbmVudC5wcm9wZXJ0eVRhZ0xpc3R9KQotI2ZvcmVhY2goICRwcm9wZXJ0eSBpbiAkcHJvcGVydHlMaXN0ICkKLSNzZXQgKCRmaWVsZCA9ICRwcm9wZXJ0eS5maWVsZE5hbWUpCi0jc2V0ICgkdHlwZSA9ICR1dGlscy5nZXRKc3BQcm9wZXJ0eVR5cGUxMSgkcHJvcGVydHkpKQotIAotICAgIHByaXZhdGUgJHR5cGUgJGZpZWxkOwotICAgIAotI3NldCAoJHZhciA9ICR1dGlscy5nZXRWYXJpYWJsZUZyb21OYW1lKCRwcm9wZXJ0eS5uYW1lKSkKLSAgICBwdWJsaWMgdm9pZCAkdXRpbHMuZ2V0UHJlZml4ZWRQcm9wZXJ0eU5hbWUoInNldCIsICRwcm9wZXJ0eS5qc3BOYW1lKSgkdHlwZSAkdmFyKQotICAgIHsKLSAgICAgICAgJGZpZWxkID0gJHZhcjsKLSAgICB9Ci0jZW5kCi0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRQcm9wZXJ0aWVzKFVJQ29tcG9uZW50IGNvbXBvbmVudCkKLSAgICB7Ci0gICAgICAgIGlmICghKGNvbXBvbmVudCBpbnN0YW5jZW9mICRjb21wb25lbnQuY2xhc3NOYW1lKSkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQ29tcG9uZW50ICIrCi0gICAgICAgICAgICAgICAgY29tcG9uZW50LmdldENsYXNzKCkuZ2V0TmFtZSgpICsiIGlzIG5vICRjb21wb25lbnQuY2xhc3NOYW1lIik7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgICRjb21wb25lbnQuY2xhc3NOYW1lIGNvbXAgPSAoJGNvbXBvbmVudC5jbGFzc05hbWUpIGNvbXBvbmVudDsKLSAgICAgICAgCi0gICAgICAgIHN1cGVyLnNldFByb3BlcnRpZXMoY29tcG9uZW50KTsKLSAgICAgICAgCi0gICAgICAgIEZhY2VzQ29udGV4dCBjb250ZXh0ID0gZ2V0RmFjZXNDb250ZXh0KCk7Ci0KLSNmb3JlYWNoKCAkcHJvcGVydHkgaW4gJHByb3BlcnR5TGlzdCApIyMgICAgICAgICAgICAxCi0jc2V0ICgkZmllbGQgPSAkcHJvcGVydHkuZmllbGROYW1lKQotI3NldCAoJHR5cGUgPSAkdXRpbHMuZ2V0SnNwUHJvcGVydHlUeXBlMTEoJHByb3BlcnR5KSkKLSNpZiAoJHV0aWxzLmlzQ29udmVydGVyKCRwcm9wZXJ0eS5jbGFzc05hbWUpKSMjICAgICAgICAgICAgICAgICAgIDIKLSAgICAgICAgaWYgKCRmaWVsZCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoaXNWYWx1ZVJlZmVyZW5jZSgkZmllbGQpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFZhbHVlQmluZGluZyB2YiA9IGNvbnRleHQuZ2V0QXBwbGljYXRpb24oKS5jcmVhdGVWYWx1ZUJpbmRpbmcoJGZpZWxkKTsKLSAgICAgICAgICAgICAgICBjb21wLnNldFZhbHVlQmluZGluZygiJHByb3BlcnR5Lm5hbWUiLCB2Yik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQ29udmVydGVyIGNvbnZlcnRlciA9IGdldEZhY2VzQ29udGV4dCgpLmdldEFwcGxpY2F0aW9uKCkuY3JlYXRlQ29udmVydGVyKCRmaWVsZCk7Ci0gICAgICAgICAgICAgICAgY29tcC5zZXRDb252ZXJ0ZXIoY29udmVydGVyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotI2Vsc2VpZiAoJHByb3BlcnR5LmlzTWV0aG9kQmluZGluZygpKSMjICAgICAgICAgICAgICAgICAyCi0gICAgICAgIGlmICgkZmllbGQgIT0gbnVsbCkKLSAgICAgICAgewotI2lmICgkdXRpbHMuaXNTdHJpbmdNZXRob2RCaW5kaW5nUmV0dXJuVHlwZSgkcHJvcGVydHkubWV0aG9kQmluZGluZ1NpZ25hdHVyZSkpIyMzCi0gICAgICAgICAgICBNZXRob2RCaW5kaW5nIG1iOwotICAgICAgICAgICAgaWYgKGlzVmFsdWVSZWZlcmVuY2UoJGZpZWxkKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBtYiA9IGNvbnRleHQuZ2V0QXBwbGljYXRpb24oKS5jcmVhdGVNZXRob2RCaW5kaW5nKAotICAgICAgICAgICAgICAgICAgICAkZmllbGQsICR1dGlscy5nZXRTaWduYXR1cmVQYXJhbXMoJHByb3BlcnR5Lm1ldGhvZEJpbmRpbmdTaWduYXR1cmUpKTsgICAgICAgICAgICAKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSNpZiAoJHByb3BlcnR5LmpzcE5hbWUgPT0gImFjdGlvbiIpIyMgICAgICAgICAgICAgICAgICAgICAgNAotICAgICAgICAgICAgICAgIG1iID0gbmV3IG9yZy5hcGFjaGUubXlmYWNlcy5zaGFyZWRfaW1wbC5lbC5TaW1wbGVBY3Rpb25NZXRob2RCaW5kaW5nKCRmaWVsZCk7Ci0jZWxzZSMjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNAotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkludmFsaWQgZXhwcmVzc2lvbiAiICsgJGZpZWxkKTsKLSNlbmQjIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0Ci0gICAgICAgICAgICB9Ci0jZWxzZSMjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMKLSAgICAgICAgICAgIE1ldGhvZEJpbmRpbmcgbWIgPSBjb250ZXh0LmdldEFwcGxpY2F0aW9uKCkuY3JlYXRlTWV0aG9kQmluZGluZygKLSAgICAgICAgICAgICAgICAkZmllbGQsICR1dGlscy5nZXRTaWduYXR1cmVQYXJhbXMoJHByb3BlcnR5Lm1ldGhvZEJpbmRpbmdTaWduYXR1cmUpKTsKLSNlbmQjIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMwotICAgICAgICAgICAgY29tcC4ke3V0aWxzLmdldFByZWZpeGVkUHJvcGVydHlOYW1lKCJzZXQiLCRwcm9wZXJ0eS5uYW1lKX0obWIpOwotICAgICAgICB9Ci0jZWxzZSMjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyCi0gICAgICAgIGlmICgkZmllbGQgIT0gbnVsbCkKLSAgICAgICAgewotI2lmICgkcHJvcGVydHkuaXNMaXRlcmFsT25seSgpKSMjICAgICAgICAgICAgICAgICAgICAgICAgIDMKLSNzZXQgKCRjbGFzc05hbWUgPSAkdXRpbHMuZ2V0UHJpbWl0aXZlVHlwZSgkcHJvcGVydHkuY2xhc3NOYW1lKSkKLSNpZiAoJHV0aWxzLmlzUHJpbWl0aXZlQ2xhc3MoJGNsYXNzTmFtZSkpIyMgICAgICAgICAgICAgICA0Ci0gICAgICAgICAgICBjb21wLmdldEF0dHJpYnV0ZXMoKS5wdXQoIiRwcm9wZXJ0eS5uYW1lIiwgJHt1dGlscy5nZXRCb3hlZENsYXNzKCRjbGFzc05hbWUpfS52YWx1ZU9mKCRmaWVsZCkpOwotI2Vsc2UjIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQKLSAgICAgICAgICAgIGNvbXAuZ2V0QXR0cmlidXRlcygpLnB1dCgiJHByb3BlcnR5Lm5hbWUiLCAkZmllbGQpOwotI2VuZCMjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQKLSNlbHNlIyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMwotICAgICAgICAgICAgaWYgKGlzVmFsdWVSZWZlcmVuY2UoJGZpZWxkKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBWYWx1ZUJpbmRpbmcgdmIgPSBjb250ZXh0LmdldEFwcGxpY2F0aW9uKCkuY3JlYXRlVmFsdWVCaW5kaW5nKCRmaWVsZCk7Ci0gICAgICAgICAgICAgICAgY29tcC5zZXRWYWx1ZUJpbmRpbmcoIiRwcm9wZXJ0eS5uYW1lIiwgdmIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotI3NldCAoJGNsYXNzTmFtZSA9ICR1dGlscy5nZXRQcmltaXRpdmVUeXBlKCRwcm9wZXJ0eS5jbGFzc05hbWUpKQotI2lmICgkdXRpbHMuaXNQcmltaXRpdmVDbGFzcygkY2xhc3NOYW1lKSkjIyAgICAgICAgICAgICAgIDQKLSAgICAgICAgICAgICAgICBjb21wLmdldEF0dHJpYnV0ZXMoKS5wdXQoIiRwcm9wZXJ0eS5uYW1lIiwgJHt1dGlscy5nZXRCb3hlZENsYXNzKCRjbGFzc05hbWUpfS52YWx1ZU9mKCRmaWVsZCkpOwotI2Vsc2UjIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQKLSAgICAgICAgICAgICAgICBjb21wLmdldEF0dHJpYnV0ZXMoKS5wdXQoIiRwcm9wZXJ0eS5uYW1lIiwgJGZpZWxkKTsKLSNlbmQjIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0Ci0gICAgICAgICAgICB9Ci0jZW5kIyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMKLSAgICAgICAgfSAKLSNlbmQjIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIKLSNlbmQjIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVsZWFzZSgpCi0gICAgewotICAgICAgICBzdXBlci5yZWxlYXNlKCk7Ci0jZm9yZWFjaCggJHByb3BlcnR5IGluICRwcm9wZXJ0eUxpc3QgKQotI3NldCAoJGZpZWxkID0gJHByb3BlcnR5LmZpZWxkTmFtZSkKLSNpZigkdXRpbHMuZ2V0SnNwUHJvcGVydHlUeXBlMTEoJHByb3BlcnR5KSA9PSAiYm9vbGVhbiIpCi0jc2V0ICgkZW1wdHkgPSAiZmFsc2UiKQotI2Vsc2UKLSNzZXQgKCRlbXB0eSA9ICJudWxsIikKLSNlbmQKLSAgICAgICAgJGZpZWxkID0gJGVtcHR5OwotI2VuZAotICAgIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL3RhZ0NsYXNzMTIudm0gYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi90YWdDbGFzczEyLnZtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YzlmYjZhLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL3RhZ0NsYXNzMTIudm0KKysrIC9kZXYvbnVsbApAQCAtMSwxNzkgKzAsMCBAQAotLy8gV0FSTklORzogVGhpcyBmaWxlIHdhcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZC4gRG8gbm90IGVkaXQgaXQgZGlyZWN0bHksDQotLy8gICAgICAgICAgb3IgeW91IHdpbGwgbG9zZSB5b3VyIGNoYW5nZXMuDQotLyoNCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqIA0KLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKiANCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSAke2NvbXBvbmVudC50YWdQYWNrYWdlfTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5lbC5WYWx1ZUV4cHJlc3Npb247DQotaW1wb3J0IGphdmF4LmVsLk1ldGhvZEV4cHJlc3Npb247DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLSR1dGlscy5pbXBvcnRUYWdDbGFzc2VzMTIoJGNvbXBvbmVudCkNCi0NCi0vLyBHZW5lcmF0ZWQgZnJvbSBjbGFzcyAke2NvbXBvbmVudC5zb3VyY2VDbGFzc05hbWV9Lg0KLS8vDQotLy8gV0FSTklORzogVGhpcyBmaWxlIHdhcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZC4gRG8gbm90IGVkaXQgaXQgZGlyZWN0bHksDQotLy8gICAgICAgICAgb3IgeW91IHdpbGwgbG9zZSB5b3VyIGNoYW5nZXMuDQotcHVibGljIGNsYXNzICR1dGlscy5nZXRDbGFzc0Zyb21GdWxsQ2xhc3MoJGNvbXBvbmVudC50YWdDbGFzcykNCi0jaWYgKCR7Y29tcG9uZW50LnRhZ1N1cGVyY2xhc3N9KQ0KLSAgICBleHRlbmRzICR7Y29tcG9uZW50LnRhZ1N1cGVyY2xhc3N9DQotI2Vsc2UNCi0gICAgZXh0ZW5kcyBqYXZheC5mYWNlcy53ZWJhcHAuVUlDb21wb25lbnRUYWcNCi0jZW5kDQotew0KLSAgICBwdWJsaWMgJHV0aWxzLmdldENsYXNzRnJvbUZ1bGxDbGFzcygkY29tcG9uZW50LnRhZ0NsYXNzKSgpDQotICAgIHsgICAgDQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29tcG9uZW50VHlwZSgpDQotICAgIHsNCi0jaWYgKCRjb21wb25lbnQudHlwZSkNCi0gICAgICAgIHJldHVybiAiJGNvbXBvbmVudC50eXBlIjsNCi0jZWxzZQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotI2VuZA0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVuZGVyZXJUeXBlKCkNCi0gICAgew0KLSNpZiAoJGNvbXBvbmVudC5yZW5kZXJlclR5cGUgJiYgISgkY29tcG9uZW50LnJlbmRlcmVyVHlwZSA9PSAiIikpDQotICAgICAgICByZXR1cm4gIiRjb21wb25lbnQucmVuZGVyZXJUeXBlIjsNCi0jZWxzZQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotI2VuZA0KLSAgICB9DQotDQotI3NldCAoJHByb3BlcnR5TGlzdCA9ICR7Y29tcG9uZW50LnByb3BlcnR5VGFnTGlzdH0pDQotI2ZvcmVhY2goICRwcm9wZXJ0eSBpbiAkcHJvcGVydHlMaXN0ICkNCi0jc2V0ICgkZmllbGQgPSAkcHJvcGVydHkuZmllbGROYW1lKQ0KLSNzZXQgKCR0eXBlID0gJHV0aWxzLmdldEpzcFByb3BlcnR5VHlwZTEyKCRwcm9wZXJ0eSkpDQotI2lmICgkcHJvcGVydHkuaXNMaXRlcmFsT25seSgpICYmICRwcm9wZXJ0eS5jbGFzc05hbWUgPT0gImJvb2xlYW4iKQ0KLSNzZXQgKCR0eXBlID0gIlN0cmluZyIpDQotI2VuZA0KLSAgICBwcml2YXRlICR0eXBlICRmaWVsZDsNCi0gICAgDQotI3NldCAoJHZhciA9ICR1dGlscy5nZXRWYXJpYWJsZUZyb21OYW1lKCRwcm9wZXJ0eS5uYW1lKSkNCi0gICAgcHVibGljIHZvaWQgJHV0aWxzLmdldFByZWZpeGVkUHJvcGVydHlOYW1lKCJzZXQiLCAkcHJvcGVydHkuanNwTmFtZSkoJHR5cGUgJHZhcikNCi0gICAgew0KLSAgICAgICAgJGZpZWxkID0gJHZhcjsNCi0gICAgfQ0KLSNlbmQNCi0NCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0UHJvcGVydGllcyhVSUNvbXBvbmVudCBjb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIGlmICghKGNvbXBvbmVudCBpbnN0YW5jZW9mICRjb21wb25lbnQuY2xhc3NOYW1lKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJDb21wb25lbnQgIisNCi0gICAgICAgICAgICAgICAgY29tcG9uZW50LmdldENsYXNzKCkuZ2V0TmFtZSgpICsiIGlzIG5vICRjb21wb25lbnQuY2xhc3NOYW1lIik7DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgICAgICRjb21wb25lbnQuY2xhc3NOYW1lIGNvbXAgPSAoJGNvbXBvbmVudC5jbGFzc05hbWUpIGNvbXBvbmVudDsNCi0gICAgICAgIA0KLSAgICAgICAgc3VwZXIuc2V0UHJvcGVydGllcyhjb21wb25lbnQpOw0KLSAgICAgICAgDQotICAgICAgICBGYWNlc0NvbnRleHQgY29udGV4dCA9IGdldEZhY2VzQ29udGV4dCgpOw0KLQ0KLSNmb3JlYWNoKCAkcHJvcGVydHkgaW4gJHByb3BlcnR5TGlzdCApIyMgICAgICAgICAgICAxDQotI3NldCAoJGZpZWxkID0gJHByb3BlcnR5LmZpZWxkTmFtZSkNCi0jc2V0ICgkdHlwZSA9ICR1dGlscy5nZXRKc3BQcm9wZXJ0eVR5cGUxMigkcHJvcGVydHkpKQ0KLSNpZiAoJHByb3BlcnR5LmlzTGl0ZXJhbE9ubHkoKSAmJiAkcHJvcGVydHkuY2xhc3NOYW1lID09ICJib29sZWFuIikNCi0jc2V0ICgkdHlwZSA9ICJTdHJpbmciKQ0KLSNlbmQNCi0jaWYgKCR1dGlscy5pc0NvbnZlcnRlcigkcHJvcGVydHkuY2xhc3NOYW1lKSkjIyAgICAgICAgICAgICAgICAgICAyDQotICAgICAgICBpZiAoJGZpZWxkICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKCEke2ZpZWxkfS5pc0xpdGVyYWxUZXh0KCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBjb21wLnNldFZhbHVlRXhwcmVzc2lvbigiJHByb3BlcnR5Lm5hbWUiLCAkZmllbGQpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlbHNlDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBTdHJpbmcgcyA9ICR7ZmllbGR9LmdldEV4cHJlc3Npb25TdHJpbmcoKTsNCi0gICAgICAgICAgICAgICAgaWYgKHMgIT0gbnVsbCkNCi0gICAgICAgICAgICAgICAgeyAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgICAgICAgQ29udmVydGVyIGNvbnZlcnRlciA9IGdldEZhY2VzQ29udGV4dCgpLmdldEFwcGxpY2F0aW9uKCkuY3JlYXRlQ29udmVydGVyKHMpOw0KLSAgICAgICAgICAgICAgICAgICAgY29tcC5zZXRDb252ZXJ0ZXIoY29udmVydGVyKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0jZWxzZWlmICgkcHJvcGVydHkuaXNNZXRob2RCaW5kaW5nKCkpIyMgICAgICAgICAgICAgICAgIDINCi0gICAgICAgIGlmICgkZmllbGQgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0jaWYgKCRwcm9wZXJ0eS5qc3BOYW1lID09ICJhY3Rpb25MaXN0ZW5lciIpDQotICAgICAgICAgICAgY29tcC5hZGRBY3Rpb25MaXN0ZW5lcihuZXcgTWV0aG9kRXhwcmVzc2lvbkFjdGlvbkxpc3RlbmVyKCRmaWVsZCkpOw0KLSNlbHNlaWYgKCRwcm9wZXJ0eS5qc3BOYW1lID09ICJ2YWx1ZUNoYW5nZUxpc3RlbmVyIikNCi0gICAgICAgICAgICBjb21wLmFkZFZhbHVlQ2hhbmdlTGlzdGVuZXIobmV3IE1ldGhvZEV4cHJlc3Npb25WYWx1ZUNoYW5nZUxpc3RlbmVyKCRmaWVsZCkpOw0KLSNlbHNlaWYgKCRwcm9wZXJ0eS5qc3BOYW1lID09ICJ2YWxpZGF0b3IiKQ0KLSAgICAgICAgICAgIGNvbXAuYWRkVmFsaWRhdG9yKG5ldyBNZXRob2RFeHByZXNzaW9uVmFsaWRhdG9yKCRmaWVsZCkpOw0KLSNlbHNlaWYgKCR1dGlscy5pc1N0cmluZ01ldGhvZEJpbmRpbmdSZXR1cm5UeXBlKCRwcm9wZXJ0eS5tZXRob2RCaW5kaW5nU2lnbmF0dXJlKSkjIzMNCi0gICAgICAgICAgICBNZXRob2RCaW5kaW5nIG1iOw0KLSAgICAgICAgICAgIGlmIChpc1ZhbHVlUmVmZXJlbmNlKCRmaWVsZCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBtYiA9IGNvbnRleHQuZ2V0QXBwbGljYXRpb24oKS5jcmVhdGVNZXRob2RCaW5kaW5nKA0KLSAgICAgICAgICAgICAgICAgICAgJGZpZWxkLCAkdXRpbHMuZ2V0U2lnbmF0dXJlUGFyYW1zKCRwcm9wZXJ0eS5tZXRob2RCaW5kaW5nU2lnbmF0dXJlKSk7ICAgICAgICAgICAgDQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkludmFsaWQgZXhwcmVzc2lvbiAiICsgJGZpZWxkKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgY29tcC4ke3V0aWxzLmdldFByZWZpeGVkUHJvcGVydHlOYW1lKCJzZXQiLCRwcm9wZXJ0eS5uYW1lKX0obWIpOw0KLSNlbHNlIyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMw0KLSAgICAgICAgICAgIE1ldGhvZEJpbmRpbmcgbWIgPSBjb250ZXh0LmdldEFwcGxpY2F0aW9uKCkuY3JlYXRlTWV0aG9kQmluZGluZygNCi0gICAgICAgICAgICAgICAgJGZpZWxkLCAkdXRpbHMuZ2V0U2lnbmF0dXJlUGFyYW1zKCRwcm9wZXJ0eS5tZXRob2RCaW5kaW5nU2lnbmF0dXJlKSk7DQotICAgICAgICAgICAgY29tcC4ke3V0aWxzLmdldFByZWZpeGVkUHJvcGVydHlOYW1lKCJzZXQiLCRwcm9wZXJ0eS5uYW1lKX0obWIpOw0KLSNlbmQjIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMw0KLSAgICAgICAgfQ0KLSNlbHNlaWYgKCRwcm9wZXJ0eS5pc01ldGhvZEV4cHJlc3Npb24oKSkjIyAgICAgICAgICAgIDINCi0gICAgICAgIGlmICgkZmllbGQgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0jaWYgKCRwcm9wZXJ0eS5qc3BOYW1lID09ICJhY3Rpb24iKQ0KLSAgICAgICAgICAgIGNvbXAuc2V0QWN0aW9uRXhwcmVzc2lvbigkZmllbGQpOw0KLSNlbHNlaWYgKCRwcm9wZXJ0eS5qc3BOYW1lID09ICJhY3Rpb25MaXN0ZW5lciIpDQotICAgICAgICAgICAgY29tcC5hZGRBY3Rpb25MaXN0ZW5lcihuZXcgTWV0aG9kRXhwcmVzc2lvbkFjdGlvbkxpc3RlbmVyKCRmaWVsZCkpOw0KLSNlbHNlDQotICAgICAgICAgICAgY29tcC4ke3V0aWxzLmdldFByZWZpeGVkUHJvcGVydHlOYW1lKCJzZXQiLCRwcm9wZXJ0eS5uYW1lKX0oJGZpZWxkKTsNCi0jZW5kICAgICAgICANCi0gICAgICAgIH0gICAgICAgIA0KLSNlbHNlIyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDINCi0gICAgICAgIGlmICgkZmllbGQgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0jaWYgKCRwcm9wZXJ0eS5pc0xpdGVyYWxPbmx5KCkpIyMgICAgICAgICAgICAgICAgICAgICAgICAgMw0KLSNpZiAoJHV0aWxzLmlzUHJpbWl0aXZlQ2xhc3MoJHByb3BlcnR5LmNsYXNzTmFtZSkpIyMgICAgICAgICAgICAgICA0DQotICAgICAgICAgICAgY29tcC5nZXRBdHRyaWJ1dGVzKCkucHV0KCIkcHJvcGVydHkubmFtZSIsICR7dXRpbHMuZ2V0Qm94ZWRDbGFzcygkcHJvcGVydHkuY2xhc3NOYW1lKX0udmFsdWVPZigkZmllbGQpKTsNCi0jZWxzZSMjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNA0KLSAgICAgICAgICAgIGNvbXAuZ2V0QXR0cmlidXRlcygpLnB1dCgiJHByb3BlcnR5Lm5hbWUiLCAkZmllbGQpOw0KLSNlbmQjIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0DQotI2Vsc2UjIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzDQotICAgICAgICAgICAgY29tcC5zZXRWYWx1ZUV4cHJlc3Npb24oIiRwcm9wZXJ0eS5uYW1lIiwgJGZpZWxkKTsNCi0jZW5kIyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMNCi0gICAgICAgIH0gDQotI2VuZCMjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMg0KLSNlbmQjIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxDQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgcmVsZWFzZSgpDQotICAgIHsNCi0gICAgICAgIHN1cGVyLnJlbGVhc2UoKTsNCi0jZm9yZWFjaCggJHByb3BlcnR5IGluICRwcm9wZXJ0eUxpc3QgKQ0KLSNzZXQgKCRmaWVsZCA9ICRwcm9wZXJ0eS5maWVsZE5hbWUpDQotI3NldCAoJGVtcHR5ID0gIm51bGwiKQ0KLSAgICAgICAgJGZpZWxkID0gJGVtcHR5Ow0KLSNlbmQNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi90YWdDbGFzc01hY3JvczExLnZtIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvdGFnQ2xhc3NNYWNyb3MxMS52bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY5ZGUyOS4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi90YWdDbGFzc01hY3JvczExLnZtCisrKyAvZGV2L251bGwKZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL3RsZC1mYWNlbGV0cy10b21haGF3azIwLnZtIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvdGxkLWZhY2VsZXRzLXRvbWFoYXdrMjAudm0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlNDAwYzQuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvdGxkLWZhY2VsZXRzLXRvbWFoYXdrMjAudm0KKysrIC9kZXYvbnVsbApAQCAtMSwzNzYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi08dGFnbGliIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiDQotICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiDQotICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS93ZWItanNwdGFnbGlicmFyeV8yXzEueHNkIg0KLSAgICB2ZXJzaW9uPSIyLjEiPg0KLSAgIDxkZXNjcmlwdGlvbj4kZGVzY3JpcHRpb248L2Rlc2NyaXB0aW9uPg0KLSAgIDxkaXNwbGF5LW5hbWU+JGRpc3BsYXluYW1lPC9kaXNwbGF5LW5hbWU+DQotICAgPHRsaWItdmVyc2lvbj4xLjEuNzwvdGxpYi12ZXJzaW9uPg0KLSAgIDxzaG9ydC1uYW1lPiRzaG9ydG5hbWU8L3Nob3J0LW5hbWU+DQotICAgPHVyaT4kdXJpPC91cmk+DQotICAgDQotICAgDQotDQotJGJhc2VDb250ZW50DQotDQotIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gU1RBUlQgTUFDUk9TIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyMNCi0jIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyMgd3JpdGVKU0ZDb21wb25lbnRQcm9wZXJ0eQ0KLSMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIw0KLSNtYWNybyAod3JpdGVKU0ZDb21wb25lbnRQcm9wZXJ0eSAkcHJvcGVydHkpDQotI2lmICghJHByb3BlcnR5LmlzVGFnRXhjbHVkZWQoKSkNCi0gICAgICA8YXR0cmlidXRlPg0KLSNpZiAoJHByb3BlcnR5LmxvbmdEZXNjcmlwdGlvbikNCi0gICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbJHByb3BlcnR5LmxvbmdEZXNjcmlwdGlvbl1dPjwvZGVzY3JpcHRpb24+DQotI2Vsc2UNCi0gICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbXV0+PC9kZXNjcmlwdGlvbj4NCi0jZW5kDQotICAgICAgICAgPG5hbWU+JHByb3BlcnR5LmpzcE5hbWU8L25hbWU+DQotI2lmICgkcHJvcGVydHkuaXNSZXF1aXJlZCgpKQ0KLSAgICAgICAgIDxyZXF1aXJlZD4kcHJvcGVydHkuaXNSZXF1aXJlZCgpPC9yZXF1aXJlZD4NCi0jZW5kDQotI2lmICgkcHJvcGVydHkuaXNNZXRob2RFeHByZXNzaW9uKCkgfHwgJHByb3BlcnR5LmlzTWV0aG9kQmluZGluZygpKQ0KLSNpZiAoJHByb3BlcnR5LmdldE1ldGhvZEJpbmRpbmdTaWduYXR1cmUoKSkNCi0gICAgICAgIDxkZWZlcnJlZC1tZXRob2Q+DQotI3NldCAoJHNpZyA9ICRwcm9wZXJ0eS5nZXRNZXRob2RCaW5kaW5nU2lnbmF0dXJlKCkpDQotICAgICAgICAgICAgPG1ldGhvZC1zaWduYXR1cmU+JHNpZy5yZXR1cm5UeXBlIG15TWV0aG9kKCAkc2lnLnBhcmFtZXRlclR5cGVzQXNTdHJpbmcgKTwvbWV0aG9kLXNpZ25hdHVyZT4NCi0NCi0gICAgICAgIDwvZGVmZXJyZWQtbWV0aG9kPg0KLSNlbHNlDQotIyMgVGhpcyBpcyBhIHZlcnkgc3BlY2lhbCBjYXNlLiBJZiBhIHByb3BlcnR5IGlzIE1ldGhvZEJpbmRpbmcgb3IgTWV0aG9kRXhwcmVzc2lvbg0KLSMjIHRoaXMgc2hvdWxkIGhhdmUgYSBzaWduYXR1cmUuIElmIG5vdCwgZm9yIGFsbG93IG11bHRpcGxlIE1ldGhvZEJpbmRpbmcNCi0jIyBzaW11bGF0ZSBhIFZhbHVlRXhwcmVzc2lvbiBhbmQgd3JpdGUgYSBjdXN0b20gY29kZSBsaWtlIGluIA0KLSMjIG9yZy5hcGFjaGUubXlmYWNlcy5jdXN0b20uc3VnZ2VzdGFqYXguQWJzdHJhY3RTdWdnZXN0QWpheFRhZw0KLSAgICAgICAgIDxkZWZlcnJlZC12YWx1ZS8+DQotI2VuZA0KLSNlbHNlaWYgKCRwcm9wZXJ0eS5pc0xpdGVyYWxPbmx5KCkpDQotICAgICAgICAgPHJ0ZXhwcnZhbHVlPmZhbHNlPC9ydGV4cHJ2YWx1ZT4NCi0jZWxzZQ0KLSNpZiAoICIkIXByb3BlcnR5LmlzUnRleHBydmFsdWUoKSIgPT0gIiIpDQotI3NldCAoJHR5cGUgPSAkdXRpbHMuZ2V0Q2xhc3NGcm9tRnVsbENsYXNzKCRwcm9wZXJ0eS5jbGFzc05hbWUpKQ0KLSNpZigkcHJvcGVydHkuZGVmZXJyZWRWYWx1ZVR5cGUpDQotICAgICAgICAgPGRlZmVycmVkLXZhbHVlPg0KLSAgICAgICAgICAgICA8dHlwZT4kcHJvcGVydHkuZGVmZXJyZWRWYWx1ZVR5cGU8L3R5cGU+DQotICAgICAgICAgPC9kZWZlcnJlZC12YWx1ZT4NCi0jZWxzZWlmICgkdHlwZSA9PSAiU3RyaW5nIikNCi0gICAgICAgICA8ZGVmZXJyZWQtdmFsdWU+DQotICAgICAgICAgICAgPHR5cGU+amF2YS5sYW5nLlN0cmluZzwvdHlwZT4NCi0gICAgICAgICA8L2RlZmVycmVkLXZhbHVlPg0KLSNlbHNlDQotICAgICAgICAgPGRlZmVycmVkLXZhbHVlPg0KLSAgICAgICAgICAgICA8dHlwZT4kcHJvcGVydHkuY2xhc3NOYW1lPC90eXBlPg0KLSAgICAgICAgIDwvZGVmZXJyZWQtdmFsdWU+DQotI2VuZA0KLSNlbHNlDQotICAgICAgICAgPHJ0ZXhwcnZhbHVlPiRwcm9wZXJ0eS5pc1J0ZXhwcnZhbHVlKCkuYm9vbGVhblZhbHVlKCk8L3J0ZXhwcnZhbHVlPg0KLSNlbmQNCi0jZW5kDQotICAgICAgPC9hdHRyaWJ1dGU+DQotI2VuZA0KLSNlbmQNCi0jIw0KLSMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0jIyB3cml0ZUpTRkF0dGFjaGVkT2JqZWN0UHJvcGVydHkNCi0jIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIyMNCi0jbWFjcm8gKHdyaXRlSlNGQXR0YWNoZWRPYmplY3RQcm9wZXJ0eSAkcHJvcGVydHkpDQotI2lmICghJHByb3BlcnR5LmlzVGFnRXhjbHVkZWQoKSkNCi0gICAgICA8YXR0cmlidXRlPg0KLSNpZiAoJHByb3BlcnR5LmxvbmdEZXNjcmlwdGlvbikNCi0gICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbJHByb3BlcnR5LmxvbmdEZXNjcmlwdGlvbl1dPjwvZGVzY3JpcHRpb24+DQotI2Vsc2UNCi0gICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbXV0+PC9kZXNjcmlwdGlvbj4NCi0jZW5kDQotICAgICAgICAgPG5hbWU+JHByb3BlcnR5Lm5hbWU8L25hbWU+DQotI2lmICgkcHJvcGVydHkuaXNSZXF1aXJlZCgpKQ0KLSAgICAgICAgIDxyZXF1aXJlZD4kcHJvcGVydHkuaXNSZXF1aXJlZCgpPC9yZXF1aXJlZD4NCi0jZW5kDQotI2lmICgkcHJvcGVydHkuaXNMaXRlcmFsT25seSgpKQ0KLSAgICAgICAgIDxydGV4cHJ2YWx1ZT5mYWxzZTwvcnRleHBydmFsdWU+DQotI2Vsc2UNCi0jc2V0ICgkdHlwZSA9ICR1dGlscy5nZXRDbGFzc0Zyb21GdWxsQ2xhc3MoJHByb3BlcnR5LmNsYXNzTmFtZSkpDQotI2lmKCRwcm9wZXJ0eS5kZWZlcnJlZFZhbHVlVHlwZSkNCi0gICAgICAgICA8ZGVmZXJyZWQtdmFsdWU+DQotICAgICAgICAgICAgIDx0eXBlPiRwcm9wZXJ0eS5kZWZlcnJlZFZhbHVlVHlwZTwvdHlwZT4NCi0gICAgICAgICA8L2RlZmVycmVkLXZhbHVlPiAgICAgICAgICAgICANCi0jZWxzZWlmICgkdHlwZSA9PSAiU3RyaW5nIikNCi0gICAgICAgICA8ZGVmZXJyZWQtdmFsdWU+DQotICAgICAgICAgICAgPHR5cGU+amF2YS5sYW5nLlN0cmluZzwvdHlwZT4NCi0gICAgICAgICA8L2RlZmVycmVkLXZhbHVlPg0KLSNlbHNlDQotICAgICAgICAgPGRlZmVycmVkLXZhbHVlPg0KLSAgICAgICAgICAgICA8dHlwZT4kcHJvcGVydHkuY2xhc3NOYW1lPC90eXBlPg0KLSAgICAgICAgIDwvZGVmZXJyZWQtdmFsdWU+DQotI2VuZA0KLSNlbmQNCi0gICAgICA8L2F0dHJpYnV0ZT4NCi0jZW5kDQotI2VuZA0KLSMjDQotIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMjIHdyaXRlSlNGQXR0cmlidXRlDQotIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMjDQotI21hY3JvICh3cml0ZUpTRkF0dHJpYnV0ZSAkYXR0cmlidXRlKQ0KLSAgICAgIDxhdHRyaWJ1dGU+DQotI2lmICgkYXR0cmlidXRlLmxvbmdEZXNjcmlwdGlvbikNCi0gICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbJGF0dHJpYnV0ZS5sb25nRGVzY3JpcHRpb25dXT48L2Rlc2NyaXB0aW9uPg0KLSNlbHNlDQotICAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBW11dPjwvZGVzY3JpcHRpb24+DQotI2VuZA0KLSAgICAgICAgIDxuYW1lPiRhdHRyaWJ1dGUubmFtZTwvbmFtZT4NCi0gICAgICAgICA8cmVxdWlyZWQ+JGF0dHJpYnV0ZS5pc1JlcXVpcmVkKCk8L3JlcXVpcmVkPg0KLSNzZXQgKCR0eXBlID0gJHV0aWxzLmdldENsYXNzRnJvbUZ1bGxDbGFzcygkYXR0cmlidXRlLmNsYXNzTmFtZSkpDQotI2lmICgkdHlwZSA9PSAiTWV0aG9kRXhwcmVzc2lvbiIpDQotICAgICAgICA8ZGVmZXJyZWQtbWV0aG9kPg0KLSAgICAgICAgICA8bWV0aG9kLXNpZ25hdHVyZT4ke2F0dHJpYnV0ZS5kZWZlcnJlZE1ldGhvZFNpZ25hdHVyZX08L21ldGhvZC1zaWduYXR1cmU+DQotICAgICAgICA8L2RlZmVycmVkLW1ldGhvZD4NCi0jZWxzZWlmICgkdHlwZSA9PSAiVmFsdWVFeHByZXNzaW9uIikNCi0gICAgICAgICA8ZGVmZXJyZWQtdmFsdWU+DQotI2lmKCRhdHRyaWJ1dGUuZGVmZXJyZWRWYWx1ZVR5cGUpDQotICAgICAgICAgICAgIDx0eXBlPiRhdHRyaWJ1dGUuZGVmZXJyZWRWYWx1ZVR5cGU8L3R5cGU+DQotI2VuZA0KLSAgICAgICAgIDwvZGVmZXJyZWQtdmFsdWU+DQotI2Vsc2UNCi0gICAgICAgICA8cnRleHBydmFsdWU+JGF0dHJpYnV0ZS5pc1J0ZXhwcnZhbHVlKCk8L3J0ZXhwcnZhbHVlPg0KLSNpZiAoJGF0dHJpYnV0ZS5jbGFzc05hbWUpICAgICAgICAgDQotICAgICAgICAgPHR5cGU+JGF0dHJpYnV0ZS5jbGFzc05hbWU8L3R5cGU+DQotI2Vsc2UNCi0gICAgICAgICA8dHlwZT5qYXZhLmxhbmcuU3RyaW5nPC90eXBlPg0KLSNlbmQNCi0jZW5kDQotICAgICAgPC9hdHRyaWJ1dGU+DQotI2VuZA0KLSMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEVORCBNQUNST1MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSAgICA8IS0tIENvbXBvbmVudCBUYWdzIC0tPg0KLSNzZXQgKCRjb21wb25lbnRMaXN0ID0gJHttb2RlbC5nZXRDb21wb25lbnRzKCl9KQ0KLSNmb3JlYWNoKCAkY29tcG9uZW50IGluICRjb21wb25lbnRMaXN0ICkNCi0jaWYgKCRtb2RlbElkcy5jb250YWlucygkY29tcG9uZW50Lm1vZGVsSWQpIA0KLSAgICAmJiAoJGNvbXBvbmVudC5uYW1lKSkNCi0jaWYgKCR1dGlscy5nZXRUYWdQcmVmaXgoJGNvbXBvbmVudC5uYW1lKSA9PSAkc2hvcnRuYW1lKQ0KLSMjIENoZWNrIGlmIHdlIGRvbid0IGhhdmUgYSBmYWNlbGV0IHRhZyB0YWtpbmcgcHJlY2VkZW5jZSBvdmVyIHRoaXMgZGVzY3JpcHRpb24NCi0jaWYgKCEgJHttb2RlbC5maW5kRmFjZWxldFRhZ0J5TmFtZSgkY29tcG9uZW50Lm5hbWUpfSkNCi0gICA8dGFnPg0KLSAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVskY29tcG9uZW50LmxvbmdEZXNjcmlwdGlvbl1dPjwvZGVzY3JpcHRpb24+DQotICAgICAgPG5hbWU+JHV0aWxzLmdldFRhZ05hbWUoJGNvbXBvbmVudC5uYW1lKTwvbmFtZT4NCi0gICAgICA8dGFnLWNsYXNzPiRjb21wb25lbnQudGFnQ2xhc3M8L3RhZy1jbGFzcz4NCi0jaWYgKCRjb21wb25lbnQuYm9keUNvbnRlbnQpDQotICAgICAgPGJvZHktY29udGVudD4kY29tcG9uZW50LmJvZHlDb250ZW50PC9ib2R5LWNvbnRlbnQ+DQotI2Vsc2UNCi0gICAgICA8Ym9keS1jb250ZW50PkpTUDwvYm9keS1jb250ZW50Pg0KLSNlbmQNCi0gICAgICANCi0jc2V0ICgkcHJvcGVydHlMaXN0ID0gJHtjb21wb25lbnQucHJvcGVydHlMaXN0fSkNCi0jZm9yZWFjaCggJHByb3BlcnR5IGluICRwcm9wZXJ0eUxpc3QgKQ0KLSN3cml0ZUpTRkNvbXBvbmVudFByb3BlcnR5KCRwcm9wZXJ0eSkNCi0jZW5kDQotI2lmICgkY29tcG9uZW50LnRhZ0hhbmRsZXIpDQotI3NldCAoJGZhY2VsZXRUYWcgPSAke21vZGVsLmZpbmRGYWNlbGV0VGFnQnlDbGFzc05hbWUoJGNvbXBvbmVudC50YWdIYW5kbGVyKX0gKQ0KLSNpZiAoJGZhY2VsZXRUYWcpDQotI3NldCAoJGF0dHJpYnV0ZUxpc3QgPSAkZmFjZWxldFRhZy5hdHRyaWJ1dGVMaXN0KQ0KLSNmb3JlYWNoKCAkYXR0cmlidXRlIGluICRhdHRyaWJ1dGVMaXN0ICkNCi0jd3JpdGVKU0ZBdHRyaWJ1dGUoJGF0dHJpYnV0ZSkNCi0jZW5kDQotI2VuZA0KLSNlbmQNCi0gICA8L3RhZz4NCi0jZW5kDQotI2VuZA0KLSNlbmQNCi0jZW5kDQotICAgPCEtLSBDb252ZXJ0ZXIgdGFncyAtLT4NCi0jc2V0ICgkY29tcG9uZW50TGlzdCA9ICR7bW9kZWwuZ2V0Q29udmVydGVycygpfSkNCi0jZm9yZWFjaCggJGNvbXBvbmVudCBpbiAkY29tcG9uZW50TGlzdCApDQotI2lmICgkbW9kZWxJZHMuY29udGFpbnMoJGNvbXBvbmVudC5tb2RlbElkKSANCi0gICAgJiYgKCRjb21wb25lbnQubmFtZSkpDQotI2lmICgkdXRpbHMuZ2V0VGFnUHJlZml4KCRjb21wb25lbnQubmFtZSkgPT0gJHNob3J0bmFtZSkNCi0jIyBDaGVjayBpZiB3ZSBkb24ndCBoYXZlIGEgZmFjZWxldCB0YWcgdGFraW5nIHByZWNlZGVuY2Ugb3ZlciB0aGlzIGRlc2NyaXB0aW9uDQotI2lmICghICR7bW9kZWwuZmluZEZhY2VsZXRUYWdCeU5hbWUoJGNvbXBvbmVudC5uYW1lKX0pIA0KLSAgIDx0YWc+DQotICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWyRjb21wb25lbnQubG9uZ0Rlc2NyaXB0aW9uXV0+PC9kZXNjcmlwdGlvbj4NCi0gICAgICA8bmFtZT4kdXRpbHMuZ2V0VGFnTmFtZSgkY29tcG9uZW50Lm5hbWUpPC9uYW1lPg0KLSAgICAgIDx0YWctY2xhc3M+JGNvbXBvbmVudC50YWdDbGFzczwvdGFnLWNsYXNzPg0KLSNpZiAoJGNvbXBvbmVudC5ib2R5Q29udGVudCkNCi0gICAgICA8Ym9keS1jb250ZW50PiRjb21wb25lbnQuYm9keUNvbnRlbnQ8L2JvZHktY29udGVudD4NCi0jZWxzZQ0KLSAgICAgIDxib2R5LWNvbnRlbnQ+ZW1wdHk8L2JvZHktY29udGVudD4NCi0jZW5kDQotICAgICAgDQotI3NldCAoJHByb3BlcnR5TGlzdCA9ICR7Y29tcG9uZW50LnByb3BlcnR5TGlzdH0pDQotI2ZvcmVhY2goICRwcm9wZXJ0eSBpbiAkcHJvcGVydHlMaXN0ICkNCi0jd3JpdGVKU0ZBdHRhY2hlZE9iamVjdFByb3BlcnR5KCRwcm9wZXJ0eSkNCi0jZW5kDQotI2lmICgkY29tcG9uZW50LnRhZ0hhbmRsZXIpDQotI3NldCAoJGZhY2VsZXRUYWcgPSAke21vZGVsLmZpbmRGYWNlbGV0VGFnQnlDbGFzc05hbWUoJGNvbXBvbmVudC50YWdIYW5kbGVyKX0gKQ0KLSNpZiAoJGZhY2VsZXRUYWcpDQotI3NldCAoJGF0dHJpYnV0ZUxpc3QgPSAkZmFjZWxldFRhZy5hdHRyaWJ1dGVMaXN0KQ0KLSNmb3JlYWNoKCAkYXR0cmlidXRlIGluICRhdHRyaWJ1dGVMaXN0ICkNCi0jd3JpdGVKU0ZBdHRyaWJ1dGUoJGF0dHJpYnV0ZSkNCi0jZW5kDQotI2VuZA0KLSNlbHNlaWYgKCRqc2YyMCkNCi0gICAgICA8YXR0cmlidXRlPg0KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBW11dPjwvZGVzY3JpcHRpb24+DQotICAgICAgICA8bmFtZT5mb3I8L25hbWU+DQotICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPg0KLSAgICAgICAgPGRlZmVycmVkLXZhbHVlPg0KLSAgICAgICAgIDx0eXBlPmphdmEubGFuZy5TdHJpbmc8L3R5cGU+DQotICAgICAgICA8L2RlZmVycmVkLXZhbHVlPg0KLSAgICAgIDwvYXR0cmlidXRlPg0KLSNlbmQNCi0gICA8L3RhZz4NCi0jZW5kDQotI2VuZA0KLSNlbmQNCi0jZW5kDQotICAgPCEtLSBWYWxpZGF0b3IgdGFncyAtLT4NCi0jc2V0ICgkY29tcG9uZW50TGlzdCA9ICR7bW9kZWwuZ2V0VmFsaWRhdG9ycygpfSkNCi0jZm9yZWFjaCggJGNvbXBvbmVudCBpbiAkY29tcG9uZW50TGlzdCApDQotI2lmICgkbW9kZWxJZHMuY29udGFpbnMoJGNvbXBvbmVudC5tb2RlbElkKSANCi0gICAgJiYgKCRjb21wb25lbnQubmFtZSkpDQotI2lmICgkdXRpbHMuZ2V0VGFnUHJlZml4KCRjb21wb25lbnQubmFtZSkgPT0gJHNob3J0bmFtZSkNCi0jIyBDaGVjayBpZiB3ZSBkb24ndCBoYXZlIGEgZmFjZWxldCB0YWcgdGFraW5nIHByZWNlZGVuY2Ugb3ZlciB0aGlzIGRlc2NyaXB0aW9uDQotI2lmICghICR7bW9kZWwuZmluZEZhY2VsZXRUYWdCeU5hbWUoJGNvbXBvbmVudC5uYW1lKX0pIA0KLSAgIDx0YWc+DQotICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWyRjb21wb25lbnQubG9uZ0Rlc2NyaXB0aW9uXV0+PC9kZXNjcmlwdGlvbj4NCi0gICAgICA8bmFtZT4kdXRpbHMuZ2V0VGFnTmFtZSgkY29tcG9uZW50Lm5hbWUpPC9uYW1lPg0KLSAgICAgIDx0YWctY2xhc3M+JGNvbXBvbmVudC50YWdDbGFzczwvdGFnLWNsYXNzPg0KLSNpZiAoJGNvbXBvbmVudC5ib2R5Q29udGVudCkNCi0gICAgICA8Ym9keS1jb250ZW50PiRjb21wb25lbnQuYm9keUNvbnRlbnQ8L2JvZHktY29udGVudD4NCi0jZWxzZQ0KLSAgICAgIDxib2R5LWNvbnRlbnQ+ZW1wdHk8L2JvZHktY29udGVudD4NCi0jZW5kDQotICAgICAgDQotI3NldCAoJHByb3BlcnR5TGlzdCA9ICR7Y29tcG9uZW50LnByb3BlcnR5TGlzdH0pDQotI2ZvcmVhY2goICRwcm9wZXJ0eSBpbiAkcHJvcGVydHlMaXN0ICkNCi0jd3JpdGVKU0ZBdHRhY2hlZE9iamVjdFByb3BlcnR5KCRwcm9wZXJ0eSkNCi0jZW5kDQotI2lmICgkY29tcG9uZW50LnRhZ0hhbmRsZXIpDQotI3NldCAoJGZhY2VsZXRUYWcgPSAke21vZGVsLmZpbmRGYWNlbGV0VGFnQnlDbGFzc05hbWUoJGNvbXBvbmVudC50YWdIYW5kbGVyKX0gKQ0KLSNpZiAoJGZhY2VsZXRUYWcpDQotI3NldCAoJGF0dHJpYnV0ZUxpc3QgPSAkZmFjZWxldFRhZy5hdHRyaWJ1dGVMaXN0KQ0KLSNmb3JlYWNoKCAkYXR0cmlidXRlIGluICRhdHRyaWJ1dGVMaXN0ICkNCi0jd3JpdGVKU0ZBdHRyaWJ1dGUoJGF0dHJpYnV0ZSkNCi0jZW5kDQotI2VuZA0KLSNlbHNlaWYgKCRqc2YyMCkNCi0gICAgICA8YXR0cmlidXRlPg0KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBW11dPjwvZGVzY3JpcHRpb24+DQotICAgICAgICA8bmFtZT5mb3I8L25hbWU+DQotICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPg0KLSAgICAgICAgPGRlZmVycmVkLXZhbHVlPg0KLSAgICAgICAgIDx0eXBlPmphdmEubGFuZy5TdHJpbmc8L3R5cGU+DQotICAgICAgICA8L2RlZmVycmVkLXZhbHVlPg0KLSAgICAgIDwvYXR0cmlidXRlPg0KLSNlbmQNCi0gICA8L3RhZz4NCi0jZW5kDQotI2VuZA0KLSNlbmQNCi0jZW5kDQotDQotICAgPCEtLSBCZWhhdmlvciB0YWdzIC0tPg0KLSNzZXQgKCRiZWhhdmlvckxpc3QgPSAke21vZGVsLmdldEJlaGF2aW9ycygpfSkNCi0jZm9yZWFjaCggJGNvbXBvbmVudCBpbiAkYmVoYXZpb3JMaXN0ICkNCi0jaWYgKCRtb2RlbElkcy5jb250YWlucygkY29tcG9uZW50Lm1vZGVsSWQpIA0KLSAgICAmJiAoJGNvbXBvbmVudC5uYW1lKSkNCi0jaWYgKCRjb21wb25lbnQuYmVoYXZpb3JJZCkNCi0jIyBDaGVjayBpZiB3ZSBkb24ndCBoYXZlIGEgZmFjZWxldCB0YWcgdGFraW5nIHByZWNlZGVuY2Ugb3ZlciB0aGlzIGRlc2NyaXB0aW9uDQotI2lmICghICR7bW9kZWwuZmluZEZhY2VsZXRUYWdCeU5hbWUoJGNvbXBvbmVudC5uYW1lKX0pIA0KLSAgIDx0YWc+DQotICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWyRjb21wb25lbnQubG9uZ0Rlc2NyaXB0aW9uXV0+PC9kZXNjcmlwdGlvbj4NCi0gICAgICA8bmFtZT4kdXRpbHMuZ2V0VGFnTmFtZSgkY29tcG9uZW50Lm5hbWUpPC9uYW1lPg0KLSAgICAgIDx0YWctY2xhc3M+JGNvbXBvbmVudC50YWdDbGFzczwvdGFnLWNsYXNzPg0KLSNpZiAoJGNvbXBvbmVudC5ib2R5Q29udGVudCkNCi0gICAgICA8Ym9keS1jb250ZW50PiRjb21wb25lbnQuYm9keUNvbnRlbnQ8L2JvZHktY29udGVudD4NCi0jZWxzZQ0KLSAgICAgIDxib2R5LWNvbnRlbnQ+ZW1wdHk8L2JvZHktY29udGVudD4NCi0jZW5kDQotI3NldCAoJHByb3BlcnR5TGlzdCA9ICR7Y29tcG9uZW50LnByb3BlcnR5TGlzdH0pDQotI2ZvcmVhY2goICRwcm9wZXJ0eSBpbiAkcHJvcGVydHlMaXN0ICkNCi0jd3JpdGVKU0ZBdHRhY2hlZE9iamVjdFByb3BlcnR5KCRwcm9wZXJ0eSkNCi0jZW5kDQotICAgICAgPGF0dHJpYnV0ZT4NCi0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVtdXT48L2Rlc2NyaXB0aW9uPg0KLSAgICAgICAgPG5hbWU+Zm9yPC9uYW1lPg0KLSAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4NCi0gICAgICAgIDxkZWZlcnJlZC12YWx1ZT4NCi0gICAgICAgICA8dHlwZT5qYXZhLmxhbmcuU3RyaW5nPC90eXBlPg0KLSAgICAgICAgPC9kZWZlcnJlZC12YWx1ZT4NCi0gICAgICA8L2F0dHJpYnV0ZT4NCi0gICA8L3RhZz4NCi0jZW5kDQotI2VuZA0KLSNlbmQNCi0jZW5kDQotDQotICAgPCEtLSBTaW5nbGUgVGFncyAtLT4NCi0jc2V0ICgkdGFnTGlzdCA9ICRtb2RlbC5nZXRUYWdzKCkpDQotI2ZvcmVhY2goICR0YWcgaW4gJHRhZ0xpc3QgKQ0KLSNpZiAoJG1vZGVsSWRzLmNvbnRhaW5zKCR0YWcubW9kZWxJZCkgJiYgKCR0YWcubmFtZSkpDQotI2lmICgkdXRpbHMuZ2V0VGFnUHJlZml4KCR0YWcubmFtZSkgPT0gJHNob3J0bmFtZSkNCi0jIyBDaGVjayBpZiB3ZSBkb24ndCBoYXZlIGEgZmFjZWxldCB0YWcgdGFraW5nIHByZWNlZGVuY2Ugb3ZlciB0aGlzIGRlc2NyaXB0aW9uDQotI2lmICghICR7bW9kZWwuZmluZEZhY2VsZXRUYWdCeU5hbWUoJHRhZy5uYW1lKX0pDQotICAgPHRhZz4NCi0gICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbJHRhZy5sb25nRGVzY3JpcHRpb25dXT48L2Rlc2NyaXB0aW9uPg0KLSAgICAgIDxuYW1lPiR1dGlscy5nZXRUYWdOYW1lKCR0YWcubmFtZSk8L25hbWU+DQotICAgICAgPHRhZy1jbGFzcz4kdGFnLmNsYXNzTmFtZTwvdGFnLWNsYXNzPg0KLSAgICAgIDxib2R5LWNvbnRlbnQ+JHRhZy5ib2R5Q29udGVudDwvYm9keS1jb250ZW50Pg0KLSNzZXQgKCRhdHRyaWJ1dGVMaXN0ID0gJHt0YWcuYXR0cmlidXRlTGlzdH0pDQotI2ZvcmVhY2goICRhdHRyaWJ1dGUgaW4gJGF0dHJpYnV0ZUxpc3QgKQ0KLSN3cml0ZUpTRkF0dHJpYnV0ZSgkYXR0cmlidXRlKQ0KLSNlbmQNCi0jaWYgKCR0YWcudGFnSGFuZGxlcikNCi0jc2V0ICgkZmFjZWxldFRhZyA9ICR7bW9kZWwuZmluZEZhY2VsZXRUYWdCeUNsYXNzTmFtZSgkdGFnLnRhZ0hhbmRsZXIpfSApDQotI2lmICgkZmFjZWxldFRhZykNCi0jc2V0ICgkYXR0cmlidXRlTGlzdCA9ICRmYWNlbGV0VGFnLmF0dHJpYnV0ZUxpc3QpDQotI2ZvcmVhY2goICRhdHRyaWJ1dGUgaW4gJGF0dHJpYnV0ZUxpc3QgKQ0KLSN3cml0ZUpTRkF0dHJpYnV0ZSgkYXR0cmlidXRlKQ0KLSNlbmQNCi0jZW5kDQotI2VuZA0KLSAgIDwvdGFnPg0KLSNlbmQNCi0jZW5kDQotI2VuZA0KLSNlbmQNCi0NCi0gICA8IS0tIEZhY2VsZXRzIFRhZ3MgLS0+DQotI3NldCAoJHRhZ0xpc3QgPSAkbW9kZWwuZ2V0RmFjZWxldFRhZ3MoKSkNCi0jZm9yZWFjaCggJHRhZyBpbiAkdGFnTGlzdCApDQotI2lmICgkbW9kZWxJZHMuY29udGFpbnMoJHRhZy5tb2RlbElkKSAmJiAoJHRhZy5uYW1lKSkNCi0jaWYgKCR1dGlscy5nZXRUYWdQcmVmaXgoJHRhZy5uYW1lKSA9PSAkc2hvcnRuYW1lKQ0KLSAgIDx0YWc+DQotICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWyR0YWcubG9uZ0Rlc2NyaXB0aW9uXV0+PC9kZXNjcmlwdGlvbj4NCi0gICAgICA8bmFtZT4kdXRpbHMuZ2V0VGFnTmFtZSgkdGFnLm5hbWUpPC9uYW1lPg0KLSAgICAgIDx0YWctY2xhc3M+JHRhZy5jbGFzc05hbWU8L3RhZy1jbGFzcz4NCi0gICAgICA8Ym9keS1jb250ZW50PiR0YWcuYm9keUNvbnRlbnQ8L2JvZHktY29udGVudD4NCi0jc2V0ICgkYXR0cmlidXRlTGlzdCA9ICR7dGFnLmF0dHJpYnV0ZUxpc3R9KQ0KLSNmb3JlYWNoKCAkYXR0cmlidXRlIGluICRhdHRyaWJ1dGVMaXN0ICkNCi0jd3JpdGVKU0ZBdHRyaWJ1dGUoJGF0dHJpYnV0ZSkNCi0jZW5kDQotICAgPC90YWc+DQotI2VuZA0KLSNlbmQNCi0jZW5kDQotPC90YWdsaWI+DQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvdGxkLXRvbWFoYXdrMjAudm0gYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi90bGQtdG9tYWhhd2syMC52bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTg5YzQzMC4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi90bGQtdG9tYWhhd2syMC52bQorKysgL2Rldi9udWxsCkBAIC0xLDI1OSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS0NCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLTx0YWdsaWIgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSINCi0gICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSINCi0gICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL3dlYi1qc3B0YWdsaWJyYXJ5XzJfMS54c2QiDQotICAgIHZlcnNpb249IjIuMSI+DQotICAgPGRlc2NyaXB0aW9uPiRkZXNjcmlwdGlvbjwvZGVzY3JpcHRpb24+DQotICAgPGRpc3BsYXktbmFtZT4kZGlzcGxheW5hbWU8L2Rpc3BsYXktbmFtZT4NCi0gICA8dGxpYi12ZXJzaW9uPjEuMS43PC90bGliLXZlcnNpb24+DQotICAgPHNob3J0LW5hbWU+JHNob3J0bmFtZTwvc2hvcnQtbmFtZT4NCi0gICA8dXJpPiR1cmk8L3VyaT4NCi0gICANCi0gICANCi0NCi0kYmFzZUNvbnRlbnQNCi0NCi0gICAgPCEtLSBDb21wb25lbnQgVGFncyAtLT4NCi0jc2V0ICgkY29tcG9uZW50TGlzdCA9ICR7bW9kZWwuZ2V0Q29tcG9uZW50cygpfSkNCi0jZm9yZWFjaCggJGNvbXBvbmVudCBpbiAkY29tcG9uZW50TGlzdCApDQotI2lmICgkbW9kZWxJZHMuY29udGFpbnMoJGNvbXBvbmVudC5tb2RlbElkKSANCi0gICAgJiYgKCRjb21wb25lbnQubmFtZSkpDQotI2lmICgkdXRpbHMuZ2V0VGFnUHJlZml4KCRjb21wb25lbnQubmFtZSkgPT0gJHNob3J0bmFtZSkgDQotICAgPHRhZz4NCi0gICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbJGNvbXBvbmVudC5sb25nRGVzY3JpcHRpb25dXT48L2Rlc2NyaXB0aW9uPg0KLSAgICAgIDxuYW1lPiR1dGlscy5nZXRUYWdOYW1lKCRjb21wb25lbnQubmFtZSk8L25hbWU+DQotICAgICAgPHRhZy1jbGFzcz4kY29tcG9uZW50LnRhZ0NsYXNzPC90YWctY2xhc3M+DQotI2lmICgkY29tcG9uZW50LmJvZHlDb250ZW50KQ0KLSAgICAgIDxib2R5LWNvbnRlbnQ+JGNvbXBvbmVudC5ib2R5Q29udGVudDwvYm9keS1jb250ZW50Pg0KLSNlbHNlDQotICAgICAgPGJvZHktY29udGVudD5KU1A8L2JvZHktY29udGVudD4NCi0jZW5kDQotICAgICAgDQotI3NldCAoJHByb3BlcnR5TGlzdCA9ICR7Y29tcG9uZW50LnByb3BlcnR5TGlzdH0pDQotI2ZvcmVhY2goICRwcm9wZXJ0eSBpbiAkcHJvcGVydHlMaXN0ICkNCi0jaWYgKCEkcHJvcGVydHkuaXNUYWdFeGNsdWRlZCgpICYmICEkcHJvcGVydHkuaXNGYWNlbGV0c09ubHkoKSkNCi0gICAgICA8YXR0cmlidXRlPg0KLSNpZiAoJHByb3BlcnR5LmxvbmdEZXNjcmlwdGlvbikNCi0gICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbJHByb3BlcnR5LmxvbmdEZXNjcmlwdGlvbl1dPjwvZGVzY3JpcHRpb24+DQotI2Vsc2UNCi0gICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbXV0+PC9kZXNjcmlwdGlvbj4NCi0jZW5kDQotICAgICAgICAgPG5hbWU+JHByb3BlcnR5LmpzcE5hbWU8L25hbWU+DQotI2lmICgkcHJvcGVydHkuaXNSZXF1aXJlZCgpKQ0KLSAgICAgICAgIDxyZXF1aXJlZD4kcHJvcGVydHkuaXNSZXF1aXJlZCgpPC9yZXF1aXJlZD4NCi0jZW5kDQotI2lmICgkcHJvcGVydHkuaXNNZXRob2RFeHByZXNzaW9uKCkgfHwgJHByb3BlcnR5LmlzTWV0aG9kQmluZGluZygpKQ0KLSNpZiAoJHByb3BlcnR5LmdldE1ldGhvZEJpbmRpbmdTaWduYXR1cmUoKSkNCi0gICAgICAgIDxkZWZlcnJlZC1tZXRob2Q+DQotI3NldCAoJHNpZyA9ICRwcm9wZXJ0eS5nZXRNZXRob2RCaW5kaW5nU2lnbmF0dXJlKCkpDQotICAgICAgICAgICAgPG1ldGhvZC1zaWduYXR1cmU+JHNpZy5yZXR1cm5UeXBlIG15TWV0aG9kKCAkc2lnLnBhcmFtZXRlclR5cGVzQXNTdHJpbmcgKTwvbWV0aG9kLXNpZ25hdHVyZT4NCi0NCi0gICAgICAgIDwvZGVmZXJyZWQtbWV0aG9kPg0KLSNlbHNlDQotIyMgVGhpcyBpcyBhIHZlcnkgc3BlY2lhbCBjYXNlLiBJZiBhIHByb3BlcnR5IGlzIE1ldGhvZEJpbmRpbmcgb3IgTWV0aG9kRXhwcmVzc2lvbg0KLSMjIHRoaXMgc2hvdWxkIGhhdmUgYSBzaWduYXR1cmUuIElmIG5vdCwgZm9yIGFsbG93IG11bHRpcGxlIE1ldGhvZEJpbmRpbmcNCi0jIyBzaW11bGF0ZSBhIFZhbHVlRXhwcmVzc2lvbiBhbmQgd3JpdGUgYSBjdXN0b20gY29kZSBsaWtlIGluIA0KLSMjIG9yZy5hcGFjaGUubXlmYWNlcy5jdXN0b20uc3VnZ2VzdGFqYXguQWJzdHJhY3RTdWdnZXN0QWpheFRhZw0KLSAgICAgICAgIDxkZWZlcnJlZC12YWx1ZS8+DQotI2VuZA0KLSNlbHNlaWYgKCRwcm9wZXJ0eS5pc0xpdGVyYWxPbmx5KCkpDQotICAgICAgICAgPHJ0ZXhwcnZhbHVlPmZhbHNlPC9ydGV4cHJ2YWx1ZT4NCi0jZWxzZQ0KLSNpZiAoICIkIXByb3BlcnR5LmlzUnRleHBydmFsdWUoKSIgPT0gIiIpDQotI3NldCAoJHR5cGUgPSAkdXRpbHMuZ2V0Q2xhc3NGcm9tRnVsbENsYXNzKCRwcm9wZXJ0eS5jbGFzc05hbWUpKQ0KLSNpZigkcHJvcGVydHkuZGVmZXJyZWRWYWx1ZVR5cGUpDQotICAgICAgICAgPGRlZmVycmVkLXZhbHVlPg0KLSAgICAgICAgICAgICA8dHlwZT4kcHJvcGVydHkuZGVmZXJyZWRWYWx1ZVR5cGU8L3R5cGU+DQotICAgICAgICAgPC9kZWZlcnJlZC12YWx1ZT4NCi0jZWxzZWlmICgkdHlwZSA9PSAiU3RyaW5nIikNCi0gICAgICAgICA8ZGVmZXJyZWQtdmFsdWU+DQotICAgICAgICAgICAgPHR5cGU+amF2YS5sYW5nLlN0cmluZzwvdHlwZT4NCi0gICAgICAgICA8L2RlZmVycmVkLXZhbHVlPg0KLSNlbHNlDQotICAgICAgICAgPGRlZmVycmVkLXZhbHVlPg0KLSAgICAgICAgICAgICA8dHlwZT4kcHJvcGVydHkuY2xhc3NOYW1lPC90eXBlPg0KLSAgICAgICAgIDwvZGVmZXJyZWQtdmFsdWU+DQotI2VuZA0KLSNlbHNlDQotICAgICAgICAgPHJ0ZXhwcnZhbHVlPiRwcm9wZXJ0eS5pc1J0ZXhwcnZhbHVlKCkuYm9vbGVhblZhbHVlKCk8L3J0ZXhwcnZhbHVlPg0KLSNlbmQNCi0jZW5kDQotICAgICAgPC9hdHRyaWJ1dGU+DQotI2VuZA0KLSNlbmQNCi0gICA8L3RhZz4NCi0jZW5kDQotI2VuZA0KLSNlbmQNCi0gICA8IS0tIENvbnZlcnRlciB0YWdzIC0tPg0KLSNzZXQgKCRjb21wb25lbnRMaXN0ID0gJHttb2RlbC5nZXRDb252ZXJ0ZXJzKCl9KQ0KLSNmb3JlYWNoKCAkY29tcG9uZW50IGluICRjb21wb25lbnRMaXN0ICkNCi0jaWYgKCRtb2RlbElkcy5jb250YWlucygkY29tcG9uZW50Lm1vZGVsSWQpIA0KLSAgICAmJiAoJGNvbXBvbmVudC5uYW1lKSAgJiYgKCRjb21wb25lbnQudGFnQ2xhc3MpKQ0KLSNpZiAoJHV0aWxzLmdldFRhZ1ByZWZpeCgkY29tcG9uZW50Lm5hbWUpID09ICRzaG9ydG5hbWUpIA0KLSAgIDx0YWc+DQotICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWyRjb21wb25lbnQubG9uZ0Rlc2NyaXB0aW9uXV0+PC9kZXNjcmlwdGlvbj4NCi0gICAgICA8bmFtZT4kdXRpbHMuZ2V0VGFnTmFtZSgkY29tcG9uZW50Lm5hbWUpPC9uYW1lPg0KLSAgICAgIDx0YWctY2xhc3M+JGNvbXBvbmVudC50YWdDbGFzczwvdGFnLWNsYXNzPg0KLSNpZiAoJGNvbXBvbmVudC5ib2R5Q29udGVudCkNCi0gICAgICA8Ym9keS1jb250ZW50PiRjb21wb25lbnQuYm9keUNvbnRlbnQ8L2JvZHktY29udGVudD4NCi0jZWxzZQ0KLSAgICAgIDxib2R5LWNvbnRlbnQ+ZW1wdHk8L2JvZHktY29udGVudD4NCi0jZW5kDQotICAgICAgDQotI3NldCAoJHByb3BlcnR5TGlzdCA9ICR7Y29tcG9uZW50LnByb3BlcnR5TGlzdH0pDQotI2ZvcmVhY2goICRwcm9wZXJ0eSBpbiAkcHJvcGVydHlMaXN0ICkNCi0jaWYgKCEkcHJvcGVydHkuaXNUYWdFeGNsdWRlZCgpICYmICEkcHJvcGVydHkuaXNGYWNlbGV0c09ubHkoKSkNCi0gICAgICA8YXR0cmlidXRlPg0KLSNpZiAoJHByb3BlcnR5LmxvbmdEZXNjcmlwdGlvbikNCi0gICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbJHByb3BlcnR5LmxvbmdEZXNjcmlwdGlvbl1dPjwvZGVzY3JpcHRpb24+DQotI2Vsc2UNCi0gICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbXV0+PC9kZXNjcmlwdGlvbj4NCi0jZW5kDQotICAgICAgICAgPG5hbWU+JHByb3BlcnR5Lm5hbWU8L25hbWU+DQotI2lmICgkcHJvcGVydHkuaXNSZXF1aXJlZCgpKQ0KLSAgICAgICAgIDxyZXF1aXJlZD4kcHJvcGVydHkuaXNSZXF1aXJlZCgpPC9yZXF1aXJlZD4NCi0jZW5kDQotI2lmICgkcHJvcGVydHkuaXNMaXRlcmFsT25seSgpKQ0KLSAgICAgICAgIDxydGV4cHJ2YWx1ZT5mYWxzZTwvcnRleHBydmFsdWU+DQotI2Vsc2UNCi0jc2V0ICgkdHlwZSA9ICR1dGlscy5nZXRDbGFzc0Zyb21GdWxsQ2xhc3MoJHByb3BlcnR5LmNsYXNzTmFtZSkpDQotI2lmKCRwcm9wZXJ0eS5kZWZlcnJlZFZhbHVlVHlwZSkNCi0gICAgICAgICA8ZGVmZXJyZWQtdmFsdWU+DQotICAgICAgICAgICAgIDx0eXBlPiRwcm9wZXJ0eS5kZWZlcnJlZFZhbHVlVHlwZTwvdHlwZT4NCi0gICAgICAgICA8L2RlZmVycmVkLXZhbHVlPiAgICAgICAgICAgICANCi0jZWxzZWlmICgkdHlwZSA9PSAiU3RyaW5nIikNCi0gICAgICAgICA8ZGVmZXJyZWQtdmFsdWU+DQotICAgICAgICAgICAgPHR5cGU+amF2YS5sYW5nLlN0cmluZzwvdHlwZT4NCi0gICAgICAgICA8L2RlZmVycmVkLXZhbHVlPg0KLSNlbHNlDQotICAgICAgICAgPGRlZmVycmVkLXZhbHVlPg0KLSAgICAgICAgICAgICA8dHlwZT4kcHJvcGVydHkuY2xhc3NOYW1lPC90eXBlPg0KLSAgICAgICAgIDwvZGVmZXJyZWQtdmFsdWU+DQotI2VuZA0KLSNlbmQNCi0gICAgICA8L2F0dHJpYnV0ZT4NCi0jZW5kDQotI2VuZA0KLSAgIDwvdGFnPg0KLSNlbmQNCi0jZW5kDQotI2VuZA0KLSAgIDwhLS0gVmFsaWRhdG9yIHRhZ3MgLS0+DQotI3NldCAoJGNvbXBvbmVudExpc3QgPSAke21vZGVsLmdldFZhbGlkYXRvcnMoKX0pDQotI2ZvcmVhY2goICRjb21wb25lbnQgaW4gJGNvbXBvbmVudExpc3QgKQ0KLSNpZiAoJG1vZGVsSWRzLmNvbnRhaW5zKCRjb21wb25lbnQubW9kZWxJZCkgDQotICAgICYmICgkY29tcG9uZW50Lm5hbWUpICYmICgkY29tcG9uZW50LnRhZ0NsYXNzKSkNCi0jaWYgKCR1dGlscy5nZXRUYWdQcmVmaXgoJGNvbXBvbmVudC5uYW1lKSA9PSAkc2hvcnRuYW1lKSANCi0gICA8dGFnPg0KLSAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVskY29tcG9uZW50LmxvbmdEZXNjcmlwdGlvbl1dPjwvZGVzY3JpcHRpb24+DQotICAgICAgPG5hbWU+JHV0aWxzLmdldFRhZ05hbWUoJGNvbXBvbmVudC5uYW1lKTwvbmFtZT4NCi0gICAgICA8dGFnLWNsYXNzPiRjb21wb25lbnQudGFnQ2xhc3M8L3RhZy1jbGFzcz4NCi0jaWYgKCRjb21wb25lbnQuYm9keUNvbnRlbnQpDQotICAgICAgPGJvZHktY29udGVudD4kY29tcG9uZW50LmJvZHlDb250ZW50PC9ib2R5LWNvbnRlbnQ+DQotI2Vsc2UNCi0gICAgICA8Ym9keS1jb250ZW50PmVtcHR5PC9ib2R5LWNvbnRlbnQ+DQotI2VuZA0KLSAgICAgIA0KLSNzZXQgKCRwcm9wZXJ0eUxpc3QgPSAke2NvbXBvbmVudC5wcm9wZXJ0eUxpc3R9KQ0KLSNmb3JlYWNoKCAkcHJvcGVydHkgaW4gJHByb3BlcnR5TGlzdCApDQotI2lmICghJHByb3BlcnR5LmlzVGFnRXhjbHVkZWQoKSAmJiAhJHByb3BlcnR5LmlzRmFjZWxldHNPbmx5KCkpDQotICAgICAgPGF0dHJpYnV0ZT4NCi0jaWYgKCRwcm9wZXJ0eS5sb25nRGVzY3JpcHRpb24pDQotICAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWyRwcm9wZXJ0eS5sb25nRGVzY3JpcHRpb25dXT48L2Rlc2NyaXB0aW9uPg0KLSNlbHNlDQotICAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBW11dPjwvZGVzY3JpcHRpb24+DQotI2VuZA0KLSAgICAgICAgIDxuYW1lPiRwcm9wZXJ0eS5uYW1lPC9uYW1lPg0KLSNpZiAoJHByb3BlcnR5LmlzUmVxdWlyZWQoKSkNCi0gICAgICAgICA8cmVxdWlyZWQ+JHByb3BlcnR5LmlzUmVxdWlyZWQoKTwvcmVxdWlyZWQ+DQotI2VuZA0KLSNpZiAoJHByb3BlcnR5LmlzTGl0ZXJhbE9ubHkoKSkNCi0gICAgICAgICA8cnRleHBydmFsdWU+ZmFsc2U8L3J0ZXhwcnZhbHVlPg0KLSNlbHNlDQotI3NldCAoJHR5cGUgPSAkdXRpbHMuZ2V0Q2xhc3NGcm9tRnVsbENsYXNzKCRwcm9wZXJ0eS5jbGFzc05hbWUpKQ0KLSNpZigkcHJvcGVydHkuZGVmZXJyZWRWYWx1ZVR5cGUpDQotICAgICAgICAgPGRlZmVycmVkLXZhbHVlPg0KLSAgICAgICAgICAgICA8dHlwZT4kcHJvcGVydHkuZGVmZXJyZWRWYWx1ZVR5cGU8L3R5cGU+DQotICAgICAgICAgPC9kZWZlcnJlZC12YWx1ZT4gICAgICAgICAgICAgDQotI2Vsc2VpZiAoJHR5cGUgPT0gIlN0cmluZyIpDQotICAgICAgICAgPGRlZmVycmVkLXZhbHVlPg0KLSAgICAgICAgICAgICA8dHlwZT5qYXZhLmxhbmcuU3RyaW5nPC90eXBlPg0KLSAgICAgICAgIDwvZGVmZXJyZWQtdmFsdWU+DQotI2Vsc2UNCi0gICAgICAgICA8ZGVmZXJyZWQtdmFsdWU+DQotICAgICAgICAgICAgIDx0eXBlPiRwcm9wZXJ0eS5jbGFzc05hbWU8L3R5cGU+DQotICAgICAgICAgPC9kZWZlcnJlZC12YWx1ZT4NCi0jZW5kDQotI2VuZA0KLSAgICAgIDwvYXR0cmlidXRlPg0KLSNlbmQNCi0jZW5kDQotICAgPC90YWc+DQotI2VuZA0KLSNlbmQNCi0jZW5kDQotICAgPCEtLSBTaW5nbGUgVGFncyAtLT4NCi0jc2V0ICgkdGFnTGlzdCA9ICRtb2RlbC5nZXRUYWdzKCkpDQotI2ZvcmVhY2goICR0YWcgaW4gJHRhZ0xpc3QgKQ0KLSNpZiAoJG1vZGVsSWRzLmNvbnRhaW5zKCR0YWcubW9kZWxJZCkpDQotICAgPHRhZz4NCi0gICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbJHRhZy5sb25nRGVzY3JpcHRpb25dXT48L2Rlc2NyaXB0aW9uPg0KLSAgICAgIDxuYW1lPiR1dGlscy5nZXRUYWdOYW1lKCR0YWcubmFtZSk8L25hbWU+DQotICAgICAgPHRhZy1jbGFzcz4kdGFnLmNsYXNzTmFtZTwvdGFnLWNsYXNzPg0KLSAgICAgIDxib2R5LWNvbnRlbnQ+JHRhZy5ib2R5Q29udGVudDwvYm9keS1jb250ZW50Pg0KLSNzZXQgKCRhdHRyaWJ1dGVMaXN0ID0gJHt0YWcuYXR0cmlidXRlTGlzdH0pDQotI2ZvcmVhY2goICRhdHRyaWJ1dGUgaW4gJGF0dHJpYnV0ZUxpc3QgKQ0KLSNpZiAoISRhdHRyaWJ1dGUuaXNGYWNlbGV0c09ubHkoKSkNCi0gICAgICA8YXR0cmlidXRlPg0KLSNpZiAoJGF0dHJpYnV0ZS5sb25nRGVzY3JpcHRpb24pDQotICAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWyRhdHRyaWJ1dGUubG9uZ0Rlc2NyaXB0aW9uXV0+PC9kZXNjcmlwdGlvbj4NCi0jZWxzZQ0KLSAgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVtdXT48L2Rlc2NyaXB0aW9uPg0KLSNlbmQNCi0gICAgICAgICA8bmFtZT4kYXR0cmlidXRlLm5hbWU8L25hbWU+DQotICAgICAgICAgPHJlcXVpcmVkPiRhdHRyaWJ1dGUuaXNSZXF1aXJlZCgpPC9yZXF1aXJlZD4NCi0jc2V0ICgkdHlwZSA9ICR1dGlscy5nZXRDbGFzc0Zyb21GdWxsQ2xhc3MoJGF0dHJpYnV0ZS5jbGFzc05hbWUpKQ0KLSNpZiAoJHR5cGUgPT0gIk1ldGhvZEV4cHJlc3Npb24iKQ0KLSAgICAgICAgPGRlZmVycmVkLW1ldGhvZD4NCi0gICAgICAgICAgPG1ldGhvZC1zaWduYXR1cmU+JHthdHRyaWJ1dGUuZGVmZXJyZWRNZXRob2RTaWduYXR1cmV9PC9tZXRob2Qtc2lnbmF0dXJlPg0KLSAgICAgICAgPC9kZWZlcnJlZC1tZXRob2Q+DQotI2Vsc2VpZiAoJHR5cGUgPT0gIlZhbHVlRXhwcmVzc2lvbiIpDQotICAgICAgICAgPGRlZmVycmVkLXZhbHVlPg0KLSNpZigkYXR0cmlidXRlLmRlZmVycmVkVmFsdWVUeXBlKQ0KLSAgICAgICAgICAgICA8dHlwZT4kYXR0cmlidXRlLmRlZmVycmVkVmFsdWVUeXBlPC90eXBlPg0KLSNlbmQNCi0gICAgICAgICA8L2RlZmVycmVkLXZhbHVlPg0KLSNlbHNlDQotICAgICAgICAgPHJ0ZXhwcnZhbHVlPiRhdHRyaWJ1dGUuaXNSdGV4cHJ2YWx1ZSgpPC9ydGV4cHJ2YWx1ZT4NCi0jaWYgKCRhdHRyaWJ1dGUuY2xhc3NOYW1lKSAgICAgICAgIA0KLSAgICAgICAgIDx0eXBlPiRhdHRyaWJ1dGUuY2xhc3NOYW1lPC90eXBlPg0KLSNlbHNlDQotICAgICAgICAgPHR5cGU+amF2YS5sYW5nLlN0cmluZzwvdHlwZT4NCi0jZW5kDQotI2VuZA0KLSAgICAgIDwvYXR0cmlidXRlPg0KLSNlbmQNCi0jZW5kDQotICAgPC90YWc+DQotI2VuZA0KLSNlbmQNCi08L3RhZ2xpYj4NCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi90b21haGF3ay52bSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL3RvbWFoYXdrLnZtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMmI5ZTg0Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL3RvbWFoYXdrLnZtCisrKyAvZGV2L251bGwKQEAgLTEsMTY5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IklTTy04ODU5LTEiPz4NCi08IS0tDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi08IURPQ1RZUEUgdGFnbGliIFBVQkxJQyAiLS8vU3VuIE1pY3Jvc3lzdGVtcywgSW5jLi8vRFREIEpTUCBUYWcgTGlicmFyeSAxLjIvL0VOIiAiaHR0cDovL2phdmEuc3VuLmNvbS9kdGQvd2ViLWpzcHRhZ2xpYnJhcnlfMV8yLmR0ZCI+DQotPHRhZ2xpYj4NCi0gICA8dGxpYi12ZXJzaW9uPjEuMDwvdGxpYi12ZXJzaW9uPg0KLSAgIDxqc3AtdmVyc2lvbj4xLjI8L2pzcC12ZXJzaW9uPg0KLSAgIDxzaG9ydC1uYW1lPiRzaG9ydG5hbWU8L3Nob3J0LW5hbWU+DQotICAgPHVyaT4kdXJpPC91cmk+DQotICAgPGRpc3BsYXktbmFtZT4kZGlzcGxheW5hbWU8L2Rpc3BsYXktbmFtZT4NCi0gICA8ZGVzY3JpcHRpb24+JGRlc2NyaXB0aW9uPC9kZXNjcmlwdGlvbj4NCi0NCi0kYmFzZUNvbnRlbnQNCi0NCi0gICAgPCEtLSBDb21wb25lbnQgVGFncyAtLT4NCi0jc2V0ICgkY29tcG9uZW50TGlzdCA9ICR7bW9kZWwuZ2V0Q29tcG9uZW50cygpfSkNCi0jZm9yZWFjaCggJGNvbXBvbmVudCBpbiAkY29tcG9uZW50TGlzdCApDQotI2lmICgkbW9kZWxJZHMuY29udGFpbnMoJGNvbXBvbmVudC5tb2RlbElkKSANCi0gICAgJiYgKCRjb21wb25lbnQubmFtZSkpDQotI2lmICgkdXRpbHMuZ2V0VGFnUHJlZml4KCRjb21wb25lbnQubmFtZSkgPT0gJHNob3J0bmFtZSkgDQotICAgPHRhZz4NCi0gICAgICA8bmFtZT4kdXRpbHMuZ2V0VGFnTmFtZSgkY29tcG9uZW50Lm5hbWUpPC9uYW1lPg0KLSAgICAgIDx0YWctY2xhc3M+JGNvbXBvbmVudC50YWdDbGFzczwvdGFnLWNsYXNzPg0KLSNpZiAoJGNvbXBvbmVudC5ib2R5Q29udGVudCkNCi0gICAgICA8Ym9keS1jb250ZW50PiRjb21wb25lbnQuYm9keUNvbnRlbnQ8L2JvZHktY29udGVudD4NCi0jZWxzZQ0KLSAgICAgIDxib2R5LWNvbnRlbnQ+SlNQPC9ib2R5LWNvbnRlbnQ+DQotI2VuZA0KLSAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVskY29tcG9uZW50LmxvbmdEZXNjcmlwdGlvbl1dPjwvZGVzY3JpcHRpb24+DQotICAgICAgDQotI3NldCAoJHByb3BlcnR5TGlzdCA9ICR7Y29tcG9uZW50LnByb3BlcnR5TGlzdH0pDQotI2ZvcmVhY2goICRwcm9wZXJ0eSBpbiAkcHJvcGVydHlMaXN0ICkNCi0jaWYgKCEkcHJvcGVydHkuaXNUYWdFeGNsdWRlZCgpKQ0KLSAgICAgIDxhdHRyaWJ1dGU+DQotICAgICAgICAgPG5hbWU+JHByb3BlcnR5LmpzcE5hbWU8L25hbWU+DQotICAgICAgICAgPHJlcXVpcmVkPiRwcm9wZXJ0eS5pc1JlcXVpcmVkKCk8L3JlcXVpcmVkPg0KLSAgICAgICAgIDxydGV4cHJ2YWx1ZT5mYWxzZTwvcnRleHBydmFsdWU+DQotICAgICAgICAgPHR5cGU+amF2YS5sYW5nLlN0cmluZzwvdHlwZT4NCi0jaWYgKCRwcm9wZXJ0eS5sb25nRGVzY3JpcHRpb24pDQotICAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWyRwcm9wZXJ0eS5sb25nRGVzY3JpcHRpb25dXT48L2Rlc2NyaXB0aW9uPg0KLSNlbHNlDQotICAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBW11dPjwvZGVzY3JpcHRpb24+DQotI2VuZA0KLSAgICAgIDwvYXR0cmlidXRlPg0KLSNlbmQNCi0jZW5kDQotICAgPC90YWc+DQotI2VuZA0KLSNlbmQNCi0jZW5kDQotICAgPCEtLSBDb252ZXJ0ZXIgdGFncyAtLT4NCi0jc2V0ICgkY29tcG9uZW50TGlzdCA9ICR7bW9kZWwuZ2V0Q29udmVydGVycygpfSkNCi0jZm9yZWFjaCggJGNvbXBvbmVudCBpbiAkY29tcG9uZW50TGlzdCApDQotI2lmICgkbW9kZWxJZHMuY29udGFpbnMoJGNvbXBvbmVudC5tb2RlbElkKSANCi0gICAgJiYgKCRjb21wb25lbnQubmFtZSkpDQotI2lmICgkdXRpbHMuZ2V0VGFnUHJlZml4KCRjb21wb25lbnQubmFtZSkgPT0gJHNob3J0bmFtZSkgDQotICAgPHRhZz4NCi0gICAgICA8bmFtZT4kdXRpbHMuZ2V0VGFnTmFtZSgkY29tcG9uZW50Lm5hbWUpPC9uYW1lPg0KLSAgICAgIDx0YWctY2xhc3M+JGNvbXBvbmVudC50YWdDbGFzczwvdGFnLWNsYXNzPg0KLSNpZiAoJGNvbXBvbmVudC5ib2R5Q29udGVudCkNCi0gICAgICA8Ym9keS1jb250ZW50PiRjb21wb25lbnQuYm9keUNvbnRlbnQ8L2JvZHktY29udGVudD4NCi0jZWxzZQ0KLSAgICAgIDxib2R5LWNvbnRlbnQ+ZW1wdHk8L2JvZHktY29udGVudD4NCi0jZW5kDQotICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWyRjb21wb25lbnQubG9uZ0Rlc2NyaXB0aW9uXV0+PC9kZXNjcmlwdGlvbj4NCi0gICAgICANCi0jc2V0ICgkcHJvcGVydHlMaXN0ID0gJHtjb21wb25lbnQucHJvcGVydHlMaXN0fSkNCi0jZm9yZWFjaCggJHByb3BlcnR5IGluICRwcm9wZXJ0eUxpc3QgKQ0KLSNpZiAoISRwcm9wZXJ0eS5pc1RhZ0V4Y2x1ZGVkKCkpDQotICAgICAgPGF0dHJpYnV0ZT4NCi0gICAgICAgICA8bmFtZT4kcHJvcGVydHkubmFtZTwvbmFtZT4NCi0gICAgICAgICA8cmVxdWlyZWQ+JHByb3BlcnR5LmlzUmVxdWlyZWQoKTwvcmVxdWlyZWQ+DQotICAgICAgICAgPHJ0ZXhwcnZhbHVlPmZhbHNlPC9ydGV4cHJ2YWx1ZT4NCi0gICAgICAgICA8dHlwZT5qYXZhLmxhbmcuU3RyaW5nPC90eXBlPg0KLSNpZiAoJHByb3BlcnR5LmxvbmdEZXNjcmlwdGlvbikNCi0gICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbJHByb3BlcnR5LmxvbmdEZXNjcmlwdGlvbl1dPjwvZGVzY3JpcHRpb24+DQotI2Vsc2UNCi0gICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbXV0+PC9kZXNjcmlwdGlvbj4NCi0jZW5kDQotICAgICAgPC9hdHRyaWJ1dGU+DQotI2VuZA0KLSNlbmQNCi0gICA8L3RhZz4NCi0jZW5kDQotI2VuZA0KLSNlbmQNCi0gICA8IS0tIFZhbGlkYXRvciB0YWdzIC0tPg0KLSNzZXQgKCRjb21wb25lbnRMaXN0ID0gJHttb2RlbC5nZXRWYWxpZGF0b3JzKCl9KQ0KLSNmb3JlYWNoKCAkY29tcG9uZW50IGluICRjb21wb25lbnRMaXN0ICkNCi0jaWYgKCRtb2RlbElkcy5jb250YWlucygkY29tcG9uZW50Lm1vZGVsSWQpIA0KLSAgICAmJiAoJGNvbXBvbmVudC5uYW1lKSkNCi0jaWYgKCR1dGlscy5nZXRUYWdQcmVmaXgoJGNvbXBvbmVudC5uYW1lKSA9PSAkc2hvcnRuYW1lKSANCi0gICA8dGFnPg0KLSAgICAgIDxuYW1lPiR1dGlscy5nZXRUYWdOYW1lKCRjb21wb25lbnQubmFtZSk8L25hbWU+DQotICAgICAgPHRhZy1jbGFzcz4kY29tcG9uZW50LnRhZ0NsYXNzPC90YWctY2xhc3M+DQotI2lmICgkY29tcG9uZW50LmJvZHlDb250ZW50KQ0KLSAgICAgIDxib2R5LWNvbnRlbnQ+JGNvbXBvbmVudC5ib2R5Q29udGVudDwvYm9keS1jb250ZW50Pg0KLSNlbHNlDQotICAgICAgPGJvZHktY29udGVudD5lbXB0eTwvYm9keS1jb250ZW50Pg0KLSNlbmQNCi0gICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbJGNvbXBvbmVudC5sb25nRGVzY3JpcHRpb25dXT48L2Rlc2NyaXB0aW9uPg0KLSAgICAgIA0KLSNzZXQgKCRwcm9wZXJ0eUxpc3QgPSAke2NvbXBvbmVudC5wcm9wZXJ0eUxpc3R9KQ0KLSNmb3JlYWNoKCAkcHJvcGVydHkgaW4gJHByb3BlcnR5TGlzdCApDQotI2lmICghJHByb3BlcnR5LmlzVGFnRXhjbHVkZWQoKSkNCi0gICAgICA8YXR0cmlidXRlPg0KLSAgICAgICAgIDxuYW1lPiRwcm9wZXJ0eS5uYW1lPC9uYW1lPg0KLSAgICAgICAgIDxyZXF1aXJlZD4kcHJvcGVydHkuaXNSZXF1aXJlZCgpPC9yZXF1aXJlZD4NCi0gICAgICAgICA8cnRleHBydmFsdWU+ZmFsc2U8L3J0ZXhwcnZhbHVlPg0KLSAgICAgICAgIDx0eXBlPmphdmEubGFuZy5TdHJpbmc8L3R5cGU+DQotI2lmICgkcHJvcGVydHkubG9uZ0Rlc2NyaXB0aW9uKQ0KLSAgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVskcHJvcGVydHkubG9uZ0Rlc2NyaXB0aW9uXV0+PC9kZXNjcmlwdGlvbj4NCi0jZWxzZQ0KLSAgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVtdXT48L2Rlc2NyaXB0aW9uPg0KLSNlbmQNCi0gICAgICA8L2F0dHJpYnV0ZT4NCi0jZW5kDQotI2VuZA0KLSAgIDwvdGFnPg0KLSNlbmQNCi0jZW5kDQotI2VuZA0KLSAgIDwhLS0gU2luZ2xlIFRhZ3MgLS0+DQotI3NldCAoJHRhZ0xpc3QgPSAkbW9kZWwuZ2V0VGFncygpKQ0KLSNmb3JlYWNoKCAkdGFnIGluICR0YWdMaXN0ICkNCi0jaWYgKCRtb2RlbElkcy5jb250YWlucygkdGFnLm1vZGVsSWQpKQ0KLSAgIDx0YWc+DQotICAgICAgPG5hbWU+JHV0aWxzLmdldFRhZ05hbWUoJHRhZy5uYW1lKTwvbmFtZT4NCi0gICAgICA8dGFnLWNsYXNzPiR0YWcuY2xhc3NOYW1lPC90YWctY2xhc3M+DQotICAgICAgPGJvZHktY29udGVudD4kdGFnLmJvZHlDb250ZW50PC9ib2R5LWNvbnRlbnQ+DQotICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWyR0YWcubG9uZ0Rlc2NyaXB0aW9uXV0+PC9kZXNjcmlwdGlvbj4NCi0jc2V0ICgkYXR0cmlidXRlTGlzdCA9ICR7dGFnLmF0dHJpYnV0ZUxpc3R9KQ0KLSNmb3JlYWNoKCAkYXR0cmlidXRlIGluICRhdHRyaWJ1dGVMaXN0ICkNCi0gICAgICA8YXR0cmlidXRlPg0KLSAgICAgICAgIDxuYW1lPiRhdHRyaWJ1dGUubmFtZTwvbmFtZT4NCi0gICAgICAgICA8cmVxdWlyZWQ+JGF0dHJpYnV0ZS5pc1JlcXVpcmVkKCk8L3JlcXVpcmVkPg0KLSAgICAgICAgIDxydGV4cHJ2YWx1ZT4kYXR0cmlidXRlLmlzUnRleHBydmFsdWUoKTwvcnRleHBydmFsdWU+DQotI2lmICgkYXR0cmlidXRlLmNsYXNzTmFtZSkgICAgICAgICANCi0gICAgICAgICA8dHlwZT4kYXR0cmlidXRlLmNsYXNzTmFtZTwvdHlwZT4NCi0jZWxzZQ0KLSAgICAgICAgIDx0eXBlPmphdmEubGFuZy5TdHJpbmc8L3R5cGU+DQotI2VuZA0KLSNpZiAoJHByb3BlcnR5LmxvbmdEZXNjcmlwdGlvbikNCi0gICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbJHByb3BlcnR5LmxvbmdEZXNjcmlwdGlvbl1dPjwvZGVzY3JpcHRpb24+DQotI2Vsc2UNCi0gICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbXV0+PC9kZXNjcmlwdGlvbj4NCi0jZW5kDQotICAgICAgPC9hdHRyaWJ1dGU+DQotI2VuZA0KLSAgIDwvdGFnPg0KLSNlbmQNCi0jZW5kDQotPC90YWdsaWI+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvdG9tYWhhd2sxMi52bSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL3RvbWFoYXdrMTIudm0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjYjY3Y2QuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvdG9tYWhhd2sxMi52bQorKysgL2Rldi9udWxsCkBAIC0xLDI0MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS0NCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLTx0YWdsaWIgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIgDQotICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiANCi0gICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS93ZWItanNwdGFnbGlicmFyeV8yXzEueHNkIiANCi0gICAgICAgIHZlcnNpb249IjIuMSI+DQotICAgPGRlc2NyaXB0aW9uPiRkZXNjcmlwdGlvbjwvZGVzY3JpcHRpb24+DQotICAgPGRpc3BsYXktbmFtZT4kZGlzcGxheW5hbWU8L2Rpc3BsYXktbmFtZT4NCi0gICA8dGxpYi12ZXJzaW9uPjEuMS43PC90bGliLXZlcnNpb24+DQotICAgPHNob3J0LW5hbWU+JHNob3J0bmFtZTwvc2hvcnQtbmFtZT4NCi0gICA8dXJpPiR1cmk8L3VyaT4NCi0NCi0kYmFzZUNvbnRlbnQNCi0NCi0gICAgPCEtLSBDb21wb25lbnQgVGFncyAtLT4NCi0jc2V0ICgkY29tcG9uZW50TGlzdCA9ICR7bW9kZWwuZ2V0Q29tcG9uZW50cygpfSkNCi0jZm9yZWFjaCggJGNvbXBvbmVudCBpbiAkY29tcG9uZW50TGlzdCApDQotI2lmICgkbW9kZWxJZHMuY29udGFpbnMoJGNvbXBvbmVudC5tb2RlbElkKSANCi0gICAgJiYgKCRjb21wb25lbnQubmFtZSkpDQotI2lmICgkdXRpbHMuZ2V0VGFnUHJlZml4KCRjb21wb25lbnQubmFtZSkgPT0gJHNob3J0bmFtZSkgDQotICAgPHRhZz4NCi0gICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbJGNvbXBvbmVudC5sb25nRGVzY3JpcHRpb25dXT48L2Rlc2NyaXB0aW9uPg0KLSAgICAgIDxuYW1lPiR1dGlscy5nZXRUYWdOYW1lKCRjb21wb25lbnQubmFtZSk8L25hbWU+DQotICAgICAgPHRhZy1jbGFzcz4kY29tcG9uZW50LnRhZ0NsYXNzPC90YWctY2xhc3M+DQotI2lmICgkY29tcG9uZW50LmJvZHlDb250ZW50KQ0KLSAgICAgIDxib2R5LWNvbnRlbnQ+JGNvbXBvbmVudC5ib2R5Q29udGVudDwvYm9keS1jb250ZW50Pg0KLSNlbHNlDQotICAgICAgPGJvZHktY29udGVudD5KU1A8L2JvZHktY29udGVudD4NCi0jZW5kDQotICAgICAgDQotI3NldCAoJHByb3BlcnR5TGlzdCA9ICR7Y29tcG9uZW50LnByb3BlcnR5TGlzdH0pDQotI2ZvcmVhY2goICRwcm9wZXJ0eSBpbiAkcHJvcGVydHlMaXN0ICkNCi0jaWYgKCEkcHJvcGVydHkuaXNUYWdFeGNsdWRlZCgpKQ0KLSAgICAgIDxhdHRyaWJ1dGU+DQotI2lmICgkcHJvcGVydHkubG9uZ0Rlc2NyaXB0aW9uKQ0KLSAgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVskcHJvcGVydHkubG9uZ0Rlc2NyaXB0aW9uXV0+PC9kZXNjcmlwdGlvbj4NCi0jZWxzZQ0KLSAgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVtdXT48L2Rlc2NyaXB0aW9uPg0KLSNlbmQNCi0gICAgICAgICA8bmFtZT4kcHJvcGVydHkuanNwTmFtZTwvbmFtZT4NCi0jaWYgKCRwcm9wZXJ0eS5pc1JlcXVpcmVkKCkpDQotICAgICAgICAgPHJlcXVpcmVkPiRwcm9wZXJ0eS5pc1JlcXVpcmVkKCk8L3JlcXVpcmVkPg0KLSNlbmQNCi0jaWYgKCRwcm9wZXJ0eS5pc01ldGhvZEV4cHJlc3Npb24oKSB8fCAkcHJvcGVydHkuaXNNZXRob2RCaW5kaW5nKCkpDQotI2lmICgkcHJvcGVydHkuZ2V0TWV0aG9kQmluZGluZ1NpZ25hdHVyZSgpKQ0KLSAgICAgICAgPGRlZmVycmVkLW1ldGhvZD4NCi0jc2V0ICgkc2lnID0gJHByb3BlcnR5LmdldE1ldGhvZEJpbmRpbmdTaWduYXR1cmUoKSkNCi0gICAgICAgICAgICA8bWV0aG9kLXNpZ25hdHVyZT4kc2lnLnJldHVyblR5cGUgbXlNZXRob2QoICRzaWcucGFyYW1ldGVyVHlwZXNBc1N0cmluZyApPC9tZXRob2Qtc2lnbmF0dXJlPg0KLQ0KLSAgICAgICAgPC9kZWZlcnJlZC1tZXRob2Q+DQotI2Vsc2UNCi0jIyBUaGlzIGlzIGEgdmVyeSBzcGVjaWFsIGNhc2UuIElmIGEgcHJvcGVydHkgaXMgTWV0aG9kQmluZGluZyBvciBNZXRob2RFeHByZXNzaW9uDQotIyMgdGhpcyBzaG91bGQgaGF2ZSBhIHNpZ25hdHVyZS4gSWYgbm90LCBmb3IgYWxsb3cgbXVsdGlwbGUgTWV0aG9kQmluZGluZw0KLSMjIHNpbXVsYXRlIGEgVmFsdWVFeHByZXNzaW9uIGFuZCB3cml0ZSBhIGN1c3RvbSBjb2RlIGxpa2UgaW4gDQotIyMgb3JnLmFwYWNoZS5teWZhY2VzLmN1c3RvbS5zdWdnZXN0YWpheC5BYnN0cmFjdFN1Z2dlc3RBamF4VGFnDQotICAgICAgICAgPGRlZmVycmVkLXZhbHVlLz4NCi0jZW5kDQotI2Vsc2VpZiAoJHByb3BlcnR5LmlzTGl0ZXJhbE9ubHkoKSkNCi0gICAgICAgICA8cnRleHBydmFsdWU+ZmFsc2U8L3J0ZXhwcnZhbHVlPg0KLSNlbHNlDQotI2lmICggIiQhcHJvcGVydHkuaXNSdGV4cHJ2YWx1ZSgpIiA9PSAiIikNCi0jc2V0ICgkdHlwZSA9ICR1dGlscy5nZXRDbGFzc0Zyb21GdWxsQ2xhc3MoJHByb3BlcnR5LmNsYXNzTmFtZSkpDQotI2lmKCRwcm9wZXJ0eS5kZWZlcnJlZFZhbHVlVHlwZSkNCi0gICAgICAgICA8ZGVmZXJyZWQtdmFsdWU+DQotICAgICAgICAgICAgIDx0eXBlPiRwcm9wZXJ0eS5kZWZlcnJlZFZhbHVlVHlwZTwvdHlwZT4NCi0gICAgICAgICA8L2RlZmVycmVkLXZhbHVlPg0KLSNlbHNlaWYgKCR0eXBlID09ICJTdHJpbmciKQ0KLSAgICAgICAgIDxkZWZlcnJlZC12YWx1ZT48L2RlZmVycmVkLXZhbHVlPg0KLSNlbHNlDQotICAgICAgICAgPGRlZmVycmVkLXZhbHVlPg0KLSAgICAgICAgICAgICA8dHlwZT4kcHJvcGVydHkuY2xhc3NOYW1lPC90eXBlPg0KLSAgICAgICAgIDwvZGVmZXJyZWQtdmFsdWU+DQotI2VuZA0KLSNlbHNlDQotICAgICAgICAgPHJ0ZXhwcnZhbHVlPiRwcm9wZXJ0eS5pc1J0ZXhwcnZhbHVlKCkuYm9vbGVhblZhbHVlKCk8L3J0ZXhwcnZhbHVlPg0KLSNlbmQNCi0jZW5kDQotICAgICAgPC9hdHRyaWJ1dGU+DQotI2VuZA0KLSNlbmQNCi0gICA8L3RhZz4NCi0jZW5kDQotI2VuZA0KLSNlbmQNCi0gICA8IS0tIENvbnZlcnRlciB0YWdzIC0tPg0KLSNzZXQgKCRjb21wb25lbnRMaXN0ID0gJHttb2RlbC5nZXRDb252ZXJ0ZXJzKCl9KQ0KLSNmb3JlYWNoKCAkY29tcG9uZW50IGluICRjb21wb25lbnRMaXN0ICkNCi0jaWYgKCRtb2RlbElkcy5jb250YWlucygkY29tcG9uZW50Lm1vZGVsSWQpIA0KLSAgICAmJiAoJGNvbXBvbmVudC5uYW1lKSkNCi0jaWYgKCR1dGlscy5nZXRUYWdQcmVmaXgoJGNvbXBvbmVudC5uYW1lKSA9PSAkc2hvcnRuYW1lKSANCi0gICA8dGFnPg0KLSAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVskY29tcG9uZW50LmxvbmdEZXNjcmlwdGlvbl1dPjwvZGVzY3JpcHRpb24+DQotICAgICAgPG5hbWU+JHV0aWxzLmdldFRhZ05hbWUoJGNvbXBvbmVudC5uYW1lKTwvbmFtZT4NCi0gICAgICA8dGFnLWNsYXNzPiRjb21wb25lbnQudGFnQ2xhc3M8L3RhZy1jbGFzcz4NCi0jaWYgKCRjb21wb25lbnQuYm9keUNvbnRlbnQpDQotICAgICAgPGJvZHktY29udGVudD4kY29tcG9uZW50LmJvZHlDb250ZW50PC9ib2R5LWNvbnRlbnQ+DQotI2Vsc2UNCi0gICAgICA8Ym9keS1jb250ZW50PmVtcHR5PC9ib2R5LWNvbnRlbnQ+DQotI2VuZA0KLSAgICAgIA0KLSNzZXQgKCRwcm9wZXJ0eUxpc3QgPSAke2NvbXBvbmVudC5wcm9wZXJ0eUxpc3R9KQ0KLSNmb3JlYWNoKCAkcHJvcGVydHkgaW4gJHByb3BlcnR5TGlzdCApDQotI2lmICghJHByb3BlcnR5LmlzVGFnRXhjbHVkZWQoKSkNCi0gICAgICA8YXR0cmlidXRlPg0KLSNpZiAoJHByb3BlcnR5LmxvbmdEZXNjcmlwdGlvbikNCi0gICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbJHByb3BlcnR5LmxvbmdEZXNjcmlwdGlvbl1dPjwvZGVzY3JpcHRpb24+DQotI2Vsc2UNCi0gICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbXV0+PC9kZXNjcmlwdGlvbj4NCi0jZW5kDQotICAgICAgICAgPG5hbWU+JHByb3BlcnR5Lm5hbWU8L25hbWU+DQotI2lmICgkcHJvcGVydHkuaXNSZXF1aXJlZCgpKQ0KLSAgICAgICAgIDxyZXF1aXJlZD4kcHJvcGVydHkuaXNSZXF1aXJlZCgpPC9yZXF1aXJlZD4NCi0jZW5kDQotI2lmICgkcHJvcGVydHkuaXNMaXRlcmFsT25seSgpKQ0KLSAgICAgICAgIDxydGV4cHJ2YWx1ZT5mYWxzZTwvcnRleHBydmFsdWU+DQotI2Vsc2UNCi0jc2V0ICgkdHlwZSA9ICR1dGlscy5nZXRDbGFzc0Zyb21GdWxsQ2xhc3MoJHByb3BlcnR5LmNsYXNzTmFtZSkpDQotI2lmKCRwcm9wZXJ0eS5kZWZlcnJlZFZhbHVlVHlwZSkNCi0gICAgICAgICA8ZGVmZXJyZWQtdmFsdWU+DQotICAgICAgICAgICAgIDx0eXBlPiRwcm9wZXJ0eS5kZWZlcnJlZFZhbHVlVHlwZTwvdHlwZT4NCi0gICAgICAgICA8L2RlZmVycmVkLXZhbHVlPg0KLSNlbHNlaWYgKCR0eXBlID09ICJTdHJpbmciKQ0KLSAgICAgICAgIDxkZWZlcnJlZC12YWx1ZT48L2RlZmVycmVkLXZhbHVlPg0KLSNlbHNlDQotICAgICAgICAgPGRlZmVycmVkLXZhbHVlPg0KLSAgICAgICAgICAgICA8dHlwZT4kcHJvcGVydHkuY2xhc3NOYW1lPC90eXBlPg0KLSAgICAgICAgIDwvZGVmZXJyZWQtdmFsdWU+DQotI2VuZA0KLSNlbmQNCi0gICAgICA8L2F0dHJpYnV0ZT4NCi0jZW5kDQotI2VuZA0KLSAgIDwvdGFnPg0KLSNlbmQNCi0jZW5kDQotI2VuZA0KLSAgIDwhLS0gVmFsaWRhdG9yIHRhZ3MgLS0+DQotI3NldCAoJGNvbXBvbmVudExpc3QgPSAke21vZGVsLmdldFZhbGlkYXRvcnMoKX0pDQotI2ZvcmVhY2goICRjb21wb25lbnQgaW4gJGNvbXBvbmVudExpc3QgKQ0KLSNpZiAoJG1vZGVsSWRzLmNvbnRhaW5zKCRjb21wb25lbnQubW9kZWxJZCkgDQotICAgICYmICgkY29tcG9uZW50Lm5hbWUpKQ0KLSNpZiAoJHV0aWxzLmdldFRhZ1ByZWZpeCgkY29tcG9uZW50Lm5hbWUpID09ICRzaG9ydG5hbWUpIA0KLSAgIDx0YWc+DQotICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWyRjb21wb25lbnQubG9uZ0Rlc2NyaXB0aW9uXV0+PC9kZXNjcmlwdGlvbj4NCi0gICAgICA8bmFtZT4kdXRpbHMuZ2V0VGFnTmFtZSgkY29tcG9uZW50Lm5hbWUpPC9uYW1lPg0KLSAgICAgIDx0YWctY2xhc3M+JGNvbXBvbmVudC50YWdDbGFzczwvdGFnLWNsYXNzPg0KLSNpZiAoJGNvbXBvbmVudC5ib2R5Q29udGVudCkNCi0gICAgICA8Ym9keS1jb250ZW50PiRjb21wb25lbnQuYm9keUNvbnRlbnQ8L2JvZHktY29udGVudD4NCi0jZWxzZQ0KLSAgICAgIDxib2R5LWNvbnRlbnQ+ZW1wdHk8L2JvZHktY29udGVudD4NCi0jZW5kDQotICAgICAgDQotI3NldCAoJHByb3BlcnR5TGlzdCA9ICR7Y29tcG9uZW50LnByb3BlcnR5TGlzdH0pDQotI2ZvcmVhY2goICRwcm9wZXJ0eSBpbiAkcHJvcGVydHlMaXN0ICkNCi0jaWYgKCEkcHJvcGVydHkuaXNUYWdFeGNsdWRlZCgpKQ0KLSAgICAgIDxhdHRyaWJ1dGU+DQotI2lmICgkcHJvcGVydHkubG9uZ0Rlc2NyaXB0aW9uKQ0KLSAgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVskcHJvcGVydHkubG9uZ0Rlc2NyaXB0aW9uXV0+PC9kZXNjcmlwdGlvbj4NCi0jZWxzZQ0KLSAgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVtdXT48L2Rlc2NyaXB0aW9uPg0KLSNlbmQNCi0gICAgICAgICA8bmFtZT4kcHJvcGVydHkubmFtZTwvbmFtZT4NCi0jaWYgKCRwcm9wZXJ0eS5pc1JlcXVpcmVkKCkpDQotICAgICAgICAgPHJlcXVpcmVkPiRwcm9wZXJ0eS5pc1JlcXVpcmVkKCk8L3JlcXVpcmVkPg0KLSNlbmQNCi0jaWYgKCRwcm9wZXJ0eS5pc0xpdGVyYWxPbmx5KCkpDQotICAgICAgICAgPHJ0ZXhwcnZhbHVlPmZhbHNlPC9ydGV4cHJ2YWx1ZT4NCi0jZWxzZQ0KLSNzZXQgKCR0eXBlID0gJHV0aWxzLmdldENsYXNzRnJvbUZ1bGxDbGFzcygkcHJvcGVydHkuY2xhc3NOYW1lKSkNCi0jaWYoJHByb3BlcnR5LmRlZmVycmVkVmFsdWVUeXBlKQ0KLSAgICAgICAgIDxkZWZlcnJlZC12YWx1ZT4NCi0gICAgICAgICAgICAgPHR5cGU+JHByb3BlcnR5LmRlZmVycmVkVmFsdWVUeXBlPC90eXBlPg0KLSAgICAgICAgIDwvZGVmZXJyZWQtdmFsdWU+DQotI2Vsc2VpZiAoJHR5cGUgPT0gIlN0cmluZyIpDQotICAgICAgICAgPGRlZmVycmVkLXZhbHVlPjwvZGVmZXJyZWQtdmFsdWU+DQotI2Vsc2UNCi0gICAgICAgICA8ZGVmZXJyZWQtdmFsdWU+DQotICAgICAgICAgICAgIDx0eXBlPiRwcm9wZXJ0eS5jbGFzc05hbWU8L3R5cGU+DQotICAgICAgICAgPC9kZWZlcnJlZC12YWx1ZT4NCi0jZW5kDQotI2VuZA0KLSAgICAgIDwvYXR0cmlidXRlPg0KLSNlbmQNCi0jZW5kDQotICAgPC90YWc+DQotI2VuZA0KLSNlbmQNCi0jZW5kDQotICAgPCEtLSBTaW5nbGUgVGFncyAtLT4NCi0jc2V0ICgkdGFnTGlzdCA9ICRtb2RlbC5nZXRUYWdzKCkpDQotI2ZvcmVhY2goICR0YWcgaW4gJHRhZ0xpc3QgKQ0KLSNpZiAoJG1vZGVsSWRzLmNvbnRhaW5zKCR0YWcubW9kZWxJZCkpDQotICAgPHRhZz4NCi0gICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbJHRhZy5sb25nRGVzY3JpcHRpb25dXT48L2Rlc2NyaXB0aW9uPg0KLSAgICAgIDxuYW1lPiR1dGlscy5nZXRUYWdOYW1lKCR0YWcubmFtZSk8L25hbWU+DQotICAgICAgPHRhZy1jbGFzcz4kdGFnLmNsYXNzTmFtZTwvdGFnLWNsYXNzPg0KLSAgICAgIDxib2R5LWNvbnRlbnQ+JHRhZy5ib2R5Q29udGVudDwvYm9keS1jb250ZW50Pg0KLSNzZXQgKCRhdHRyaWJ1dGVMaXN0ID0gJHt0YWcuYXR0cmlidXRlTGlzdH0pDQotI2ZvcmVhY2goICRhdHRyaWJ1dGUgaW4gJGF0dHJpYnV0ZUxpc3QgKQ0KLSAgICAgIDxhdHRyaWJ1dGU+DQotI2lmICgkYXR0cmlidXRlLmxvbmdEZXNjcmlwdGlvbikNCi0gICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbJGF0dHJpYnV0ZS5sb25nRGVzY3JpcHRpb25dXT48L2Rlc2NyaXB0aW9uPg0KLSNlbHNlDQotICAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBW11dPjwvZGVzY3JpcHRpb24+DQotI2VuZA0KLSAgICAgICAgIDxuYW1lPiRhdHRyaWJ1dGUubmFtZTwvbmFtZT4NCi0gICAgICAgICA8cmVxdWlyZWQ+JGF0dHJpYnV0ZS5pc1JlcXVpcmVkKCk8L3JlcXVpcmVkPg0KLSNzZXQgKCR0eXBlID0gJHV0aWxzLmdldENsYXNzRnJvbUZ1bGxDbGFzcygkYXR0cmlidXRlLmNsYXNzTmFtZSkpDQotI2lmICgkdHlwZSA9PSAiVmFsdWVFeHByZXNzaW9uIikNCi0gICAgICAgICA8ZGVmZXJyZWQtdmFsdWU+PC9kZWZlcnJlZC12YWx1ZT4NCi0jZWxzZQ0KLSAgICAgICAgIDxydGV4cHJ2YWx1ZT4kYXR0cmlidXRlLmlzUnRleHBydmFsdWUoKTwvcnRleHBydmFsdWU+DQotI2lmICgkYXR0cmlidXRlLmNsYXNzTmFtZSkgICAgICAgICANCi0gICAgICAgICA8dHlwZT4kYXR0cmlidXRlLmNsYXNzTmFtZTwvdHlwZT4NCi0jZWxzZQ0KLSAgICAgICAgIDx0eXBlPmphdmEubGFuZy5TdHJpbmc8L3R5cGU+DQotI2VuZA0KLSNlbmQNCi0gICAgICA8L2F0dHJpYnV0ZT4NCi0jZW5kDQotICAgPC90YWc+DQotI2VuZA0KLSNlbmQNCi08L3RhZ2xpYj4NCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi90cmluaWRhZC1mYWNlcy1jb25maWcxMi52bSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL3RyaW5pZGFkLWZhY2VzLWNvbmZpZzEyLnZtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZjEyODc3Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL3RyaW5pZGFkLWZhY2VzLWNvbmZpZzEyLnZtCisrKyAvZGV2L251bGwKQEAgLTEsMTc2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotDQotPCEtLQ0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotDQotPGZhY2VzLWNvbmZpZyB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIiANCi0gICAgICAgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIA0KLSAgICAgICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL3dlYi1mYWNlc2NvbmZpZ18xXzIueHNkIiANCi0gICAgICAgICAgICAgIHZlcnNpb249IjEuMiI+DQotDQotJGJhc2VDb250ZW50DQotDQotI3NldCAoJGNvbXBvbmVudExpc3QgPSAke21vZGVsLmdldENvbXBvbmVudHMoKX0pDQotI2ZvcmVhY2goICRjb21wb25lbnQgaW4gJGNvbXBvbmVudExpc3QgKQ0KLSNpZiAoJG1vZGVsSWRzLmNvbnRhaW5zKCRjb21wb25lbnQubW9kZWxJZCkNCi0gICAgJiYgISgkY29tcG9uZW50LmlzQ29uZmlnRXhjbHVkZWQoKSkpDQotICA8Y29tcG9uZW50Pg0KLSNpZiAoJGNvbXBvbmVudC5sb25nRGVzY3JpcHRpb24pDQotICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVskY29tcG9uZW50LmxvbmdEZXNjcmlwdGlvbl1dPjwvZGVzY3JpcHRpb24+DQotI2VuZCAgICANCi0gICAgPGNvbXBvbmVudC10eXBlPiRjb21wb25lbnQudHlwZTwvY29tcG9uZW50LXR5cGU+DQotICAgIDxjb21wb25lbnQtY2xhc3M+JGNvbXBvbmVudC5jbGFzc05hbWU8L2NvbXBvbmVudC1jbGFzcz4NCi0jc2V0ICgkZmFjZXRMaXN0ID0gJHtjb21wb25lbnQuZmFjZXRMaXN0fSkNCi0jZm9yZWFjaCggJGZhY2V0IGluICRmYWNldExpc3QgKQ0KLSAgICA8ZmFjZXQ+DQotI2lmICgkZmFjZXQubG9uZ0Rlc2NyaXB0aW9uKQ0KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWyRmYWNldC5sb25nRGVzY3JpcHRpb25dXT48L2Rlc2NyaXB0aW9uPg0KLSNlbmQNCi0gICAgICAgIDxmYWNldC1uYW1lPiRmYWNldC5uYW1lPC9mYWNldC1uYW1lPg0KLSAgICA8L2ZhY2V0Pg0KLSNlbmQNCi0jc2V0ICgkcHJvcGVydHlMaXN0ID0gJHtjb21wb25lbnQucHJvcGVydHlMaXN0fSkNCi0jZm9yZWFjaCggJHByb3BlcnR5IGluICRwcm9wZXJ0eUxpc3QgKQ0KLSMjIFRoZW9yaWNhbGx5LCBpdCBzaG91bGQgb25seSBhZGQgcHJvcGVydGllcyB2aXNpYmxlIG9uIHRsZCBvciB0cmFuc2llbnQNCi0jIyAobm90IHZpc2libGUgb24gdGxkIGJ1dCB1c2VkIG9uIHJlbmRlcmVycyBsaWtlICJ0cmFuc2llbnQiKS4NCi0jIyBPbiBteWZhY2VzIGNvcmUgMS4yLCBvbmx5ICJ0cmFuc2llbnQiIHByb3BlcnR5IHVzZSBpdC4NCi0jIyBCdXQgaW5jbHVzaXZlLCBzb21lIHRhZ0V4Y2x1ZGVkIHByb3BlcnRpZXMgYmVsb25ncyB0byB0aGUNCi0jIyBjb21wb25lbnQgY2xhc3Mgb3IgYXJlIHVzZWQgYnkgc29tZSByZWFzb24gKGZvciBleGFtcGxlIGluIFVJSW5wdXQgDQotIyMgdmFsaWQsIGxvY2FsVmFsdWVTZXQgb3Igc3VibWl0dGVkVmFsdWUpLg0KLSMjIEFueXdheSwgdGhpcyBpbmZvcm1hdGlvbiB3b3JrcyBvbmx5IGFzIG1ldGFkYXRhLg0KLSNpZiAoISRwcm9wZXJ0eS5uYW1lLmVxdWFscygiYmluZGluZyIpKSAgIyMgYmluZGluZyBpcyB1c2VkIG9ubHkgaW4gdGFnIGNsYXNzIG9yIHRhZyBoYW5kbGVyDQotIyMgISRwcm9wZXJ0eS5pc1RhZ0V4Y2x1ZGVkKCkgfHwgJHByb3BlcnR5LmlzVHJhbnNpZW50KCkNCi0jaWYgKCB0cnVlICkNCi0gICAgPHByb3BlcnR5Pg0KLSNpZiAoJHByb3BlcnR5LmxvbmdEZXNjcmlwdGlvbikNCi0gICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbJHByb3BlcnR5LmxvbmdEZXNjcmlwdGlvbl1dPjwvZGVzY3JpcHRpb24+DQotI2VuZA0KLSAgICAgICAgIDxwcm9wZXJ0eS1uYW1lPiRwcm9wZXJ0eS5uYW1lPC9wcm9wZXJ0eS1uYW1lPg0KLSAgICAgICAgIDxwcm9wZXJ0eS1jbGFzcz4kcHJvcGVydHkuY2xhc3NOYW1lPC9wcm9wZXJ0eS1jbGFzcz4NCi0jaWYoJHV0aWxzLmdldERlZmF1bHRWYWx1ZUZpZWxkKCRwcm9wZXJ0eSkpDQotI3NldCAoJGRlZmF1bHRWYWx1ZSA9ICR1dGlscy5nZXREZWZhdWx0VmFsdWVGaWVsZCgkcHJvcGVydHkpKQ0KLSNpZiAoJGRlZmF1bHRWYWx1ZS5jaGFyQXQoMCkgPT0gJyInKQ0KLSNzZXQgKCRkVnNpemUgPSAkZGVmYXVsdFZhbHVlLmxlbmd0aCgpIC0gMSkNCi0jc2V0ICgkZGVmYXVsdFZhbHVlID0gJGRlZmF1bHRWYWx1ZS5zdWJzdHJpbmcoMSwkZFZzaXplKSApIA0KLSNlbmQNCi0gICAgICAgICA8ZGVmYXVsdC12YWx1ZT4kZGVmYXVsdFZhbHVlPC9kZWZhdWx0LXZhbHVlPg0KLSNlbmQNCi0gICAgPC9wcm9wZXJ0eT4NCi0jZW5kDQotI2VuZA0KLSNlbmQNCi0jIyAgICA8Y29tcG9uZW50LWV4dGVuc2lvbj4NCi0jIyAgICAgIDxjb21wb25lbnQtZmFtaWx5PiRjb21wb25lbnQuZmFtaWx5PC9jb21wb25lbnQtZmFtaWx5Pg0KLSMjI2lmICgkY29tcG9uZW50LnJlbmRlcmVyVHlwZSkNCi0jIyNpZiAoISgkY29tcG9uZW50LnJlbmRlcmVyVHlwZSA9PSAiIikpDQotIyMgICAgICA8cmVuZGVyZXItdHlwZT4kY29tcG9uZW50LnJlbmRlcmVyVHlwZTwvcmVuZGVyZXItdHlwZT4NCi0jIyNlbmQNCi0jIyNlbmQNCi0jIyAgICA8L2NvbXBvbmVudC1leHRlbnNpb24+DQotICA8L2NvbXBvbmVudD4gICAgDQotI2VuZA0KLSNlbmQNCi0jc2V0ICgkY29udmVydGVyTGlzdCA9ICR7bW9kZWwuZ2V0Q29udmVydGVycygpfSkNCi0jZm9yZWFjaCggJGNvbnZlcnRlciBpbiAkY29udmVydGVyTGlzdCApDQotI2lmICgkbW9kZWxJZHMuY29udGFpbnMoJGNvbnZlcnRlci5tb2RlbElkKQ0KLSAgICAmJiAhKCRjb252ZXJ0ZXIuaXNDb25maWdFeGNsdWRlZCgpKSkNCi0gIDxjb252ZXJ0ZXI+DQotI2lmICgkY29udmVydGVyLmxvbmdEZXNjcmlwdGlvbikNCi0gICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWyRjb252ZXJ0ZXIubG9uZ0Rlc2NyaXB0aW9uXV0+PC9kZXNjcmlwdGlvbj4NCi0jZW5kICAgIA0KLSAgICA8Y29udmVydGVyLWlkPiRjb252ZXJ0ZXIuY29udmVydGVySWQ8L2NvbnZlcnRlci1pZD4NCi0gICAgPGNvbnZlcnRlci1jbGFzcz4kY29udmVydGVyLmNsYXNzTmFtZTwvY29udmVydGVyLWNsYXNzPg0KLSNzZXQgKCRwcm9wZXJ0eUxpc3QgPSAke2NvbnZlcnRlci5wcm9wZXJ0eUxpc3R9KQ0KLSNmb3JlYWNoKCAkcHJvcGVydHkgaW4gJHByb3BlcnR5TGlzdCApDQotI2lmICghJHByb3BlcnR5Lm5hbWUuZXF1YWxzKCJiaW5kaW5nIikpICAjIyBiaW5kaW5nIGlzIHVzZWQgb25seSBpbiB0YWcgY2xhc3Mgb3IgdGFnIGhhbmRsZXINCi0gICAgPHByb3BlcnR5Pg0KLSNpZiAoJHByb3BlcnR5LmxvbmdEZXNjcmlwdGlvbikNCi0gICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbJHByb3BlcnR5LmxvbmdEZXNjcmlwdGlvbl1dPjwvZGVzY3JpcHRpb24+DQotI2VuZA0KLSAgICAgICAgIDxwcm9wZXJ0eS1uYW1lPiRwcm9wZXJ0eS5uYW1lPC9wcm9wZXJ0eS1uYW1lPg0KLSAgICAgICAgIDxwcm9wZXJ0eS1jbGFzcz4kcHJvcGVydHkuY2xhc3NOYW1lPC9wcm9wZXJ0eS1jbGFzcz4NCi0jaWYoJHV0aWxzLmdldERlZmF1bHRWYWx1ZUZpZWxkKCRwcm9wZXJ0eSkpDQotI3NldCAoJGRlZmF1bHRWYWx1ZSA9ICR1dGlscy5nZXREZWZhdWx0VmFsdWVGaWVsZCgkcHJvcGVydHkpKQ0KLSNpZiAoJGRlZmF1bHRWYWx1ZS5jaGFyQXQoMCkgPT0gJyInKQ0KLSNzZXQgKCRkVnNpemUgPSAkZGVmYXVsdFZhbHVlLmxlbmd0aCgpIC0gMSkNCi0jc2V0ICgkZGVmYXVsdFZhbHVlID0gJGRlZmF1bHRWYWx1ZS5zdWJzdHJpbmcoMSwkZFZzaXplKSApIA0KLSNlbmQNCi0gICAgICAgICA8ZGVmYXVsdC12YWx1ZT4kZGVmYXVsdFZhbHVlPC9kZWZhdWx0LXZhbHVlPg0KLSNlbmQNCi0gICAgPC9wcm9wZXJ0eT4NCi0jZW5kDQotI2VuZA0KLSAgPC9jb252ZXJ0ZXI+DQotI2VuZA0KLSNlbmQNCi0jc2V0ICgkdmFsaWRhdG9yTGlzdCA9ICR7bW9kZWwuZ2V0VmFsaWRhdG9ycygpfSkNCi0jZm9yZWFjaCggJHZhbGlkYXRvciBpbiAkdmFsaWRhdG9yTGlzdCApDQotI2lmICgkbW9kZWxJZHMuY29udGFpbnMoJHZhbGlkYXRvci5tb2RlbElkKSAmJg0KLSAgICAhKCR2YWxpZGF0b3IuaXNDb25maWdFeGNsdWRlZCgpLmJvb2xlYW5WYWx1ZSgpKSAmJg0KLSAgICAkdmFsaWRhdG9yLnZhbGlkYXRvcklkKQ0KLSAgPHZhbGlkYXRvcj4NCi0jaWYgKCR2YWxpZGF0b3IubG9uZ0Rlc2NyaXB0aW9uKQ0KLSAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbJHZhbGlkYXRvci5sb25nRGVzY3JpcHRpb25dXT48L2Rlc2NyaXB0aW9uPg0KLSNlbmQNCi0jaWYgKCR2YWxpZGF0b3IubmFtZSkNCi0gICA8ZGlzcGxheS1uYW1lPiR1dGlscy5nZXRUYWdOYW1lKCR2YWxpZGF0b3IubmFtZSk8L2Rpc3BsYXktbmFtZT4NCi0jZW5kDQotICAgIDx2YWxpZGF0b3ItaWQ+JHZhbGlkYXRvci52YWxpZGF0b3JJZDwvdmFsaWRhdG9yLWlkPg0KLSAgICA8dmFsaWRhdG9yLWNsYXNzPiR2YWxpZGF0b3IuY2xhc3NOYW1lPC92YWxpZGF0b3ItY2xhc3M+DQotI3NldCAoJHByb3BlcnR5TGlzdCA9ICR7dmFsaWRhdG9yLnByb3BlcnR5TGlzdH0pDQotI2ZvcmVhY2goICRwcm9wZXJ0eSBpbiAkcHJvcGVydHlMaXN0ICkNCi0jaWYgKCEkcHJvcGVydHkubmFtZS5lcXVhbHMoImJpbmRpbmciKSkgICMjIGJpbmRpbmcgaXMgdXNlZCBvbmx5IGluIHRhZyBjbGFzcyBvciB0YWcgaGFuZGxlcg0KLSAgICA8cHJvcGVydHk+DQotI2lmICgkcHJvcGVydHkubG9uZ0Rlc2NyaXB0aW9uKQ0KLSAgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVskcHJvcGVydHkubG9uZ0Rlc2NyaXB0aW9uXV0+PC9kZXNjcmlwdGlvbj4NCi0jZW5kDQotICAgICAgICAgPHByb3BlcnR5LW5hbWU+JHByb3BlcnR5Lm5hbWU8L3Byb3BlcnR5LW5hbWU+DQotICAgICAgICAgPHByb3BlcnR5LWNsYXNzPiRwcm9wZXJ0eS5jbGFzc05hbWU8L3Byb3BlcnR5LWNsYXNzPg0KLSNpZigkdXRpbHMuZ2V0RGVmYXVsdFZhbHVlRmllbGQoJHByb3BlcnR5KSkNCi0jc2V0ICgkZGVmYXVsdFZhbHVlID0gJHV0aWxzLmdldERlZmF1bHRWYWx1ZUZpZWxkKCRwcm9wZXJ0eSkpDQotI2lmICgkZGVmYXVsdFZhbHVlLmNoYXJBdCgwKSA9PSAnIicpDQotI3NldCAoJGRWc2l6ZSA9ICRkZWZhdWx0VmFsdWUubGVuZ3RoKCkgLSAxKQ0KLSNzZXQgKCRkZWZhdWx0VmFsdWUgPSAkZGVmYXVsdFZhbHVlLnN1YnN0cmluZygxLCRkVnNpemUpICkgDQotI2VuZA0KLSAgICAgICAgIDxkZWZhdWx0LXZhbHVlPiRkZWZhdWx0VmFsdWU8L2RlZmF1bHQtdmFsdWU+DQotI2VuZA0KLSAgICA8L3Byb3BlcnR5Pg0KLSNlbmQNCi0jZW5kDQotICA8L3ZhbGlkYXRvcj4NCi0jZW5kDQotI2VuZA0KLSNzZXQgKCRyZW5kZXJLaXRMaXN0ID0gJHttb2RlbC5nZXRSZW5kZXJLaXRzKCl9KQ0KLSNmb3JlYWNoKCAkcmVuZGVyS2l0IGluICRyZW5kZXJLaXRMaXN0ICkNCi0gIDxyZW5kZXIta2l0Pg0KLSAgICA8cmVuZGVyLWtpdC1pZD4kcmVuZGVyS2l0LnJlbmRlcktpdElkPC9yZW5kZXIta2l0LWlkPg0KLSNpZiAoJHJlbmRlcktpdC5jbGFzc05hbWUpDQotICAgIDxyZW5kZXIta2l0LWNsYXNzPiRyZW5kZXJLaXQuY2xhc3NOYW1lPC9yZW5kZXIta2l0LWNsYXNzPg0KLSNlbmQNCi0jc2V0ICgkcmVuZGVyZXJMaXN0ID0gJHtyZW5kZXJLaXQuZ2V0UmVuZGVyZXJzKCl9KQ0KLSNmb3JlYWNoKCAkcmVuZGVyZXIgaW4gJHJlbmRlcmVyTGlzdCApDQotICAgICAgPHJlbmRlcmVyPg0KLSAgICAgICAgPGNvbXBvbmVudC1mYW1pbHk+JHJlbmRlcmVyLmNvbXBvbmVudEZhbWlseTwvY29tcG9uZW50LWZhbWlseT4NCi0gICAgICAgIDxyZW5kZXJlci10eXBlPiRyZW5kZXJlci5yZW5kZXJlclR5cGU8L3JlbmRlcmVyLXR5cGU+DQotICAgICAgICA8cmVuZGVyZXItY2xhc3M+JHJlbmRlcmVyLmNsYXNzTmFtZTwvcmVuZGVyZXItY2xhc3M+DQotICAgICAgPC9yZW5kZXJlcj4NCi0jZW5kDQotICA8L3JlbmRlci1raXQ+DQotI2VuZA0KLTwvZmFjZXMtY29uZmlnPg0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL3RyaW5pZGFkLXRsZDEyLnZtIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvdHJpbmlkYWQtdGxkMTIudm0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3N2QwYzguLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvdHJpbmlkYWQtdGxkMTIudm0KKysrIC9kZXYvbnVsbApAQCAtMSwyNDkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi08dGFnbGliIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiIA0KLSAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgDQotICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvd2ViLWpzcHRhZ2xpYnJhcnlfMl8xLnhzZCIgDQotICAgICAgICB2ZXJzaW9uPSIyLjEiPg0KLSAgIDwhLS0NCi0gICA8ZGVzY3JpcHRpb24+JGRlc2NyaXB0aW9uPC9kZXNjcmlwdGlvbj4NCi0gICA8ZGlzcGxheS1uYW1lPiRkaXNwbGF5bmFtZTwvZGlzcGxheS1uYW1lPg0KLSAgIDx0bGliLXZlcnNpb24+JHZlcnNpb248L3RsaWItdmVyc2lvbj4NCi0gICA8c2hvcnQtbmFtZT4kc2hvcnRuYW1lPC9zaG9ydC1uYW1lPg0KLSAgIDx1cmk+JHVyaTwvdXJpPg0KLSAgIC0tPg0KLQ0KLSRiYXNlQ29udGVudA0KLQ0KLSAgICA8IS0tIENvbXBvbmVudCBUYWdzIC0tPg0KLSNzZXQgKCRjb21wb25lbnRMaXN0ID0gJHttb2RlbC5nZXRDb21wb25lbnRzKCl9KQ0KLSNmb3JlYWNoKCAkY29tcG9uZW50IGluICRjb21wb25lbnRMaXN0ICkNCi0jaWYgKCRtb2RlbElkcy5jb250YWlucygkY29tcG9uZW50Lm1vZGVsSWQpIA0KLSAgICAmJiAoJGNvbXBvbmVudC5uYW1lKSkNCi0jaWYgKCR1dGlscy5nZXRUYWdQcmVmaXgoJGNvbXBvbmVudC5uYW1lKSA9PSAkc2hvcnRuYW1lKSANCi0gICA8dGFnPg0KLSAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVskY29tcG9uZW50LmxvbmdEZXNjcmlwdGlvbl1dPjwvZGVzY3JpcHRpb24+DQotICAgICAgPG5hbWU+JHV0aWxzLmdldFRhZ05hbWUoJGNvbXBvbmVudC5uYW1lKTwvbmFtZT4NCi0gICAgICA8dGFnLWNsYXNzPiRjb21wb25lbnQudGFnQ2xhc3M8L3RhZy1jbGFzcz4NCi0jaWYgKCRjb21wb25lbnQuYm9keUNvbnRlbnQpDQotICAgICAgPGJvZHktY29udGVudD4kY29tcG9uZW50LmJvZHlDb250ZW50PC9ib2R5LWNvbnRlbnQ+DQotI2Vsc2UNCi0gICAgICA8Ym9keS1jb250ZW50PkpTUDwvYm9keS1jb250ZW50Pg0KLSNlbmQNCi0gICAgICANCi0jc2V0ICgkcHJvcGVydHlMaXN0ID0gJHtjb21wb25lbnQucHJvcGVydHlMaXN0fSkNCi0jZm9yZWFjaCggJHByb3BlcnR5IGluICRwcm9wZXJ0eUxpc3QgKQ0KLSNpZiAoISRwcm9wZXJ0eS5pc1RhZ0V4Y2x1ZGVkKCkpDQotICAgICAgPGF0dHJpYnV0ZT4NCi0jaWYgKCRwcm9wZXJ0eS5sb25nRGVzY3JpcHRpb24pDQotICAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWyRwcm9wZXJ0eS5sb25nRGVzY3JpcHRpb25dXT48L2Rlc2NyaXB0aW9uPg0KLSNlbHNlDQotICAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBW11dPjwvZGVzY3JpcHRpb24+DQotI2VuZA0KLSAgICAgICAgIDxuYW1lPiRwcm9wZXJ0eS5qc3BOYW1lPC9uYW1lPg0KLSNpZiAoJHByb3BlcnR5LmlzUmVxdWlyZWQoKSkNCi0gICAgICAgICA8cmVxdWlyZWQ+JHByb3BlcnR5LmlzUmVxdWlyZWQoKTwvcmVxdWlyZWQ+DQotI2VuZA0KLSNpZiAoJHByb3BlcnR5LmlzTWV0aG9kRXhwcmVzc2lvbigpIHx8ICRwcm9wZXJ0eS5pc01ldGhvZEJpbmRpbmcoKSkNCi0jaWYgKCRwcm9wZXJ0eS5nZXRNZXRob2RCaW5kaW5nU2lnbmF0dXJlKCkpDQotICAgICAgICA8ZGVmZXJyZWQtbWV0aG9kPg0KLSNzZXQgKCRzaWcgPSAkcHJvcGVydHkuZ2V0TWV0aG9kQmluZGluZ1NpZ25hdHVyZSgpKQ0KLSAgICAgICAgICAgIDxtZXRob2Qtc2lnbmF0dXJlPiRzaWcucmV0dXJuVHlwZSBteU1ldGhvZCgke3NpZy5wYXJhbWV0ZXJUeXBlc0FzU3RyaW5nfSk8L21ldGhvZC1zaWduYXR1cmU+DQotDQotICAgICAgICA8L2RlZmVycmVkLW1ldGhvZD4NCi0jZWxzZQ0KLSMjIFRoaXMgaXMgYSB2ZXJ5IHNwZWNpYWwgY2FzZS4gSWYgYSBwcm9wZXJ0eSBpcyBNZXRob2RCaW5kaW5nIG9yIE1ldGhvZEV4cHJlc3Npb24NCi0jIyB0aGlzIHNob3VsZCBoYXZlIGEgc2lnbmF0dXJlLiBJZiBub3QsIGZvciBhbGxvdyBtdWx0aXBsZSBNZXRob2RCaW5kaW5nDQotIyMgc2ltdWxhdGUgYSBWYWx1ZUV4cHJlc3Npb24gYW5kIHdyaXRlIGEgY3VzdG9tIGNvZGUgbGlrZSBpbiANCi0jIyBvcmcuYXBhY2hlLm15ZmFjZXMuY3VzdG9tLnN1Z2dlc3RhamF4LkFic3RyYWN0U3VnZ2VzdEFqYXhUYWcNCi0gICAgICAgICA8ZGVmZXJyZWQtdmFsdWUvPg0KLSNlbmQNCi0jZWxzZWlmICgkcHJvcGVydHkuaXNMaXRlcmFsT25seSgpKQ0KLSAgICAgICAgIDxydGV4cHJ2YWx1ZT5mYWxzZTwvcnRleHBydmFsdWU+DQotI2Vsc2UNCi0jaWYgKCAiJCFwcm9wZXJ0eS5pc1J0ZXhwcnZhbHVlKCkiID09ICIiKQ0KLSNzZXQgKCR0eXBlID0gJHV0aWxzLmdldENsYXNzRnJvbUZ1bGxDbGFzcygkcHJvcGVydHkuY2xhc3NOYW1lKSkNCi0jaWYgKCR0eXBlID09ICJTdHJpbmciIHx8ICR0eXBlID09ICJTdHJpbmdbXSIgfHwgJHR5cGUgPT0gIk9iamVjdCIgfHwgJHR5cGUgPT0gIkxpc3QiIHx8ICR0eXBlID09ICJEYXRlIiB8fCAkdHlwZSA9PSAiUm93S2V5U2V0IiB8fCAkdHlwZSA9PSAiaW50W10iKQ0KLSAgICAgICAgIDxkZWZlcnJlZC12YWx1ZT48L2RlZmVycmVkLXZhbHVlPg0KLSNlbHNlDQotICAgICAgICAgPGRlZmVycmVkLXZhbHVlPg0KLSAgICAgICAgICAgICA8dHlwZT4kcHJvcGVydHkuY2xhc3NOYW1lPC90eXBlPg0KLSAgICAgICAgIDwvZGVmZXJyZWQtdmFsdWU+DQotI2VuZA0KLSNlbHNlDQotICAgICAgICAgPHJ0ZXhwcnZhbHVlPiRwcm9wZXJ0eS5pc1J0ZXhwcnZhbHVlKCkuYm9vbGVhblZhbHVlKCk8L3J0ZXhwcnZhbHVlPg0KLSNlbmQNCi0jZW5kDQotICAgICAgPC9hdHRyaWJ1dGU+DQotI2VuZA0KLSNlbmQNCi0gICA8L3RhZz4NCi0jZW5kDQotI2VuZA0KLSNlbmQNCi0gICA8IS0tIENvbnZlcnRlciB0YWdzIC0tPg0KLSNzZXQgKCRjb21wb25lbnRMaXN0ID0gJHttb2RlbC5nZXRDb252ZXJ0ZXJzKCl9KQ0KLSNmb3JlYWNoKCAkY29tcG9uZW50IGluICRjb21wb25lbnRMaXN0ICkNCi0jaWYgKCRtb2RlbElkcy5jb250YWlucygkY29tcG9uZW50Lm1vZGVsSWQpIA0KLSAgICAmJiAoJGNvbXBvbmVudC5uYW1lKSkNCi0jaWYgKCR1dGlscy5nZXRUYWdQcmVmaXgoJGNvbXBvbmVudC5uYW1lKSA9PSAkc2hvcnRuYW1lKSANCi0gICA8dGFnPg0KLSNpZiAoJGNvbXBvbmVudC5sb25nRGVzY3JpcHRpb24pDQotICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWyRjb21wb25lbnQubG9uZ0Rlc2NyaXB0aW9uXV0+PC9kZXNjcmlwdGlvbj4NCi0jZW5kDQotICAgICAgPG5hbWU+JHV0aWxzLmdldFRhZ05hbWUoJGNvbXBvbmVudC5uYW1lKTwvbmFtZT4NCi0gICAgICA8dGFnLWNsYXNzPiRjb21wb25lbnQudGFnQ2xhc3M8L3RhZy1jbGFzcz4NCi0jaWYgKCRjb21wb25lbnQuYm9keUNvbnRlbnQpDQotICAgICAgPGJvZHktY29udGVudD4kY29tcG9uZW50LmJvZHlDb250ZW50PC9ib2R5LWNvbnRlbnQ+DQotI2Vsc2UNCi0gICAgICA8Ym9keS1jb250ZW50PmVtcHR5PC9ib2R5LWNvbnRlbnQ+DQotI2VuZA0KLQ0KLSAgICAgIDxhdHRyaWJ1dGU+DQotICAgICAgICA8bmFtZT5pZDwvbmFtZT4NCi0gICAgICA8L2F0dHJpYnV0ZT4NCi0jc2V0ICgkcHJvcGVydHlMaXN0ID0gJHtjb21wb25lbnQucHJvcGVydHlMaXN0fSkNCi0jZm9yZWFjaCggJHByb3BlcnR5IGluICRwcm9wZXJ0eUxpc3QgKQ0KLSNpZiAoISRwcm9wZXJ0eS5pc1RhZ0V4Y2x1ZGVkKCkpDQotICAgICAgPGF0dHJpYnV0ZT4NCi0jaWYgKCRwcm9wZXJ0eS5sb25nRGVzY3JpcHRpb24pDQotICAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWyRwcm9wZXJ0eS5sb25nRGVzY3JpcHRpb25dXT48L2Rlc2NyaXB0aW9uPg0KLSNlbHNlDQotICAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBW11dPjwvZGVzY3JpcHRpb24+DQotI2VuZA0KLSAgICAgICAgIDxuYW1lPiRwcm9wZXJ0eS5uYW1lPC9uYW1lPg0KLSNpZiAoJHByb3BlcnR5LmlzUmVxdWlyZWQoKSkNCi0gICAgICAgICA8cmVxdWlyZWQ+JHByb3BlcnR5LmlzUmVxdWlyZWQoKTwvcmVxdWlyZWQ+DQotI2VuZA0KLSNpZiAoJHByb3BlcnR5LmlzTGl0ZXJhbE9ubHkoKSkNCi0gICAgICAgICA8cnRleHBydmFsdWU+ZmFsc2U8L3J0ZXhwcnZhbHVlPg0KLSNlbHNlDQotI3NldCAoJHR5cGUgPSAkdXRpbHMuZ2V0Q2xhc3NGcm9tRnVsbENsYXNzKCRwcm9wZXJ0eS5jbGFzc05hbWUpKQ0KLSNpZiAoJHR5cGUgPT0gIlN0cmluZyIgfHwgJHR5cGUgPT0gIlN0cmluZ1tdIiB8fCAkdHlwZSA9PSAiT2JqZWN0IiB8fCAkdHlwZSA9PSAiTGlzdCIgfHwgJHR5cGUgPT0gIkRhdGUiIHx8ICR0eXBlID09ICJSb3dLZXlTZXQiIHx8ICR0eXBlID09ICJpbnRbXSIgfHwgJHR5cGUgPT0gIkxvY2FsZSIgfHwgJHR5cGUgPT0gIlRpbWVab25lIikNCi0gICAgICAgICA8ZGVmZXJyZWQtdmFsdWU+PC9kZWZlcnJlZC12YWx1ZT4NCi0jZWxzZQ0KLSAgICAgICAgIDxkZWZlcnJlZC12YWx1ZT4NCi0gICAgICAgICAgICAgPHR5cGU+JHByb3BlcnR5LmNsYXNzTmFtZTwvdHlwZT4NCi0gICAgICAgICA8L2RlZmVycmVkLXZhbHVlPg0KLSNlbmQNCi0jZW5kDQotICAgICAgPC9hdHRyaWJ1dGU+DQotI2VuZA0KLSNlbmQNCi0gICA8L3RhZz4NCi0jZW5kDQotI2VuZA0KLSNlbmQNCi0gICA8IS0tIFZhbGlkYXRvciB0YWdzIC0tPg0KLSNzZXQgKCRjb21wb25lbnRMaXN0ID0gJHttb2RlbC5nZXRWYWxpZGF0b3JzKCl9KQ0KLSNmb3JlYWNoKCAkY29tcG9uZW50IGluICRjb21wb25lbnRMaXN0ICkNCi0jaWYgKCRtb2RlbElkcy5jb250YWlucygkY29tcG9uZW50Lm1vZGVsSWQpIA0KLSAgICAmJiAoJGNvbXBvbmVudC5uYW1lKSkNCi0jaWYgKCR1dGlscy5nZXRUYWdQcmVmaXgoJGNvbXBvbmVudC5uYW1lKSA9PSAkc2hvcnRuYW1lKSANCi0gICA8dGFnPg0KLSAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVskY29tcG9uZW50LmxvbmdEZXNjcmlwdGlvbl1dPjwvZGVzY3JpcHRpb24+DQotICAgICAgPG5hbWU+JHV0aWxzLmdldFRhZ05hbWUoJGNvbXBvbmVudC5uYW1lKTwvbmFtZT4NCi0gICAgICA8dGFnLWNsYXNzPiRjb21wb25lbnQudGFnQ2xhc3M8L3RhZy1jbGFzcz4NCi0jaWYgKCRjb21wb25lbnQuYm9keUNvbnRlbnQpDQotICAgICAgPGJvZHktY29udGVudD4kY29tcG9uZW50LmJvZHlDb250ZW50PC9ib2R5LWNvbnRlbnQ+DQotI2Vsc2UNCi0gICAgICA8Ym9keS1jb250ZW50PmVtcHR5PC9ib2R5LWNvbnRlbnQ+DQotI2VuZA0KLSAgICAgIA0KLSAgICAgIDxhdHRyaWJ1dGU+DQotICAgICAgICA8bmFtZT5pZDwvbmFtZT4NCi0gICAgICA8L2F0dHJpYnV0ZT4NCi0jc2V0ICgkcHJvcGVydHlMaXN0ID0gJHtjb21wb25lbnQucHJvcGVydHlMaXN0fSkNCi0jZm9yZWFjaCggJHByb3BlcnR5IGluICRwcm9wZXJ0eUxpc3QgKQ0KLSNpZiAoISRwcm9wZXJ0eS5pc1RhZ0V4Y2x1ZGVkKCkpDQotICAgICAgPGF0dHJpYnV0ZT4NCi0jaWYgKCRwcm9wZXJ0eS5sb25nRGVzY3JpcHRpb24pDQotICAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWyRwcm9wZXJ0eS5sb25nRGVzY3JpcHRpb25dXT48L2Rlc2NyaXB0aW9uPg0KLSNlbHNlDQotICAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBW11dPjwvZGVzY3JpcHRpb24+DQotI2VuZA0KLSAgICAgICAgIDxuYW1lPiRwcm9wZXJ0eS5uYW1lPC9uYW1lPg0KLSNpZiAoJHByb3BlcnR5LmlzUmVxdWlyZWQoKSkNCi0gICAgICAgICA8cmVxdWlyZWQ+JHByb3BlcnR5LmlzUmVxdWlyZWQoKTwvcmVxdWlyZWQ+DQotI2VuZA0KLSNpZiAoJHByb3BlcnR5LmlzTGl0ZXJhbE9ubHkoKSkNCi0gICAgICAgICA8cnRleHBydmFsdWU+ZmFsc2U8L3J0ZXhwcnZhbHVlPg0KLSNlbHNlDQotI3NldCAoJHR5cGUgPSAkdXRpbHMuZ2V0Q2xhc3NGcm9tRnVsbENsYXNzKCRwcm9wZXJ0eS5jbGFzc05hbWUpKQ0KLSNpZiAoJHR5cGUgPT0gIlN0cmluZyIgfHwgJHR5cGUgPT0gIlN0cmluZ1tdIiB8fCAkdHlwZSA9PSAiT2JqZWN0IiB8fCAkdHlwZSA9PSAiTGlzdCIgfHwgJHR5cGUgPT0gIkRhdGUiIHx8ICR0eXBlID09ICJSb3dLZXlTZXQiIHx8ICR0eXBlID09ICJpbnRbXSIgfHwgJHR5cGUgPT0gIkRhdGVMaXN0UHJvdmlkZXIiKQ0KLSAgICAgICAgIDxkZWZlcnJlZC12YWx1ZT48L2RlZmVycmVkLXZhbHVlPg0KLSNlbHNlDQotICAgICAgICAgPGRlZmVycmVkLXZhbHVlPg0KLSAgICAgICAgICAgICA8dHlwZT4kcHJvcGVydHkuY2xhc3NOYW1lPC90eXBlPg0KLSAgICAgICAgIDwvZGVmZXJyZWQtdmFsdWU+DQotI2VuZA0KLSNlbmQNCi0gICAgICA8L2F0dHJpYnV0ZT4NCi0jZW5kDQotI2VuZA0KLSAgIDwvdGFnPg0KLSNlbmQNCi0jZW5kDQotI2VuZA0KLSAgIDwhLS0gU2luZ2xlIFRhZ3MgLS0+DQotI3NldCAoJHRhZ0xpc3QgPSAkbW9kZWwuZ2V0VGFncygpKQ0KLSNmb3JlYWNoKCAkdGFnIGluICR0YWdMaXN0ICkNCi0jaWYgKCRtb2RlbElkcy5jb250YWlucygkdGFnLm1vZGVsSWQpKQ0KLSAgIDx0YWc+DQotI2lmICgkdGFnLmxvbmdEZXNjcmlwdGlvbikNCi0gICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbJHRhZy5sb25nRGVzY3JpcHRpb25dXT48L2Rlc2NyaXB0aW9uPg0KLSNlbmQNCi0gICAgICA8bmFtZT4kdXRpbHMuZ2V0VGFnTmFtZSgkdGFnLm5hbWUpPC9uYW1lPg0KLSAgICAgIDx0YWctY2xhc3M+JHRhZy5jbGFzc05hbWU8L3RhZy1jbGFzcz4NCi0gICAgICA8Ym9keS1jb250ZW50PiR0YWcuYm9keUNvbnRlbnQ8L2JvZHktY29udGVudD4NCi0jc2V0ICgkYXR0cmlidXRlTGlzdCA9ICR7dGFnLmF0dHJpYnV0ZUxpc3R9KQ0KLSNmb3JlYWNoKCAkYXR0cmlidXRlIGluICRhdHRyaWJ1dGVMaXN0ICkNCi0jaWYgKCEkYXR0cmlidXRlLmlzRXhjbHVkZSgpLmJvb2xlYW5WYWx1ZSgpKQ0KLSAgICAgIDxhdHRyaWJ1dGU+DQotI2lmICgkYXR0cmlidXRlLmxvbmdEZXNjcmlwdGlvbikNCi0gICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbJGF0dHJpYnV0ZS5sb25nRGVzY3JpcHRpb25dXT48L2Rlc2NyaXB0aW9uPg0KLSNlbHNlDQotICAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBW11dPjwvZGVzY3JpcHRpb24+DQotI2VuZA0KLSAgICAgICAgIDxuYW1lPiRhdHRyaWJ1dGUubmFtZTwvbmFtZT4NCi0jaWYgKCRhdHRyaWJ1dGUuaXNSZXF1aXJlZCgpKQ0KLSAgICAgICAgIDxyZXF1aXJlZD4kYXR0cmlidXRlLmlzUmVxdWlyZWQoKTwvcmVxdWlyZWQ+DQotI2VuZA0KLSNzZXQgKCR0eXBlID0gJHV0aWxzLmdldENsYXNzRnJvbUZ1bGxDbGFzcygkYXR0cmlidXRlLmNsYXNzTmFtZSkpDQotI2lmICgkdHlwZSA9PSAiTWV0aG9kRXhwcmVzc2lvbiIpDQotICAgICAgICA8ZGVmZXJyZWQtbWV0aG9kPg0KLSAgICAgICAgICA8bWV0aG9kLXNpZ25hdHVyZT4ke2F0dHJpYnV0ZS5kZWZlcnJlZE1ldGhvZFNpZ25hdHVyZX08L21ldGhvZC1zaWduYXR1cmU+DQotICAgICAgICA8L2RlZmVycmVkLW1ldGhvZD4NCi0jZWxzZWlmICgkdHlwZSA9PSAiVmFsdWVFeHByZXNzaW9uIikNCi0gICAgICAgICA8ZGVmZXJyZWQtdmFsdWU+I2lmKCRhdHRyaWJ1dGUuZGVmZXJyZWRWYWx1ZVR5cGUpJGF0dHJpYnV0ZS5kZWZlcnJlZFZhbHVlVHlwZSNlbmQ8L2RlZmVycmVkLXZhbHVlPg0KLSNlbHNlDQotICAgICAgICAgPHJ0ZXhwcnZhbHVlPiRhdHRyaWJ1dGUuaXNSdGV4cHJ2YWx1ZSgpPC9ydGV4cHJ2YWx1ZT4NCi0jaWYgKCRhdHRyaWJ1dGUuY2xhc3NOYW1lKSAgICAgICAgIA0KLSAgICAgICAgIDx0eXBlPiRhdHRyaWJ1dGUuY2xhc3NOYW1lPC90eXBlPg0KLSNlbHNlDQotICAgICAgICAgPHR5cGU+amF2YS5sYW5nLlN0cmluZzwvdHlwZT4NCi0jZW5kDQotI2VuZA0KLSAgICAgIDwvYXR0cmlidXRlPg0KLSNlbmQNCi0jZW5kDQotICAgPC90YWc+DQotI2VuZA0KLSNlbmQNCi08L3RhZ2xpYj4NCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi90cmluaWRhZENvbXBvbmVudENsYXNzMTIudm0gYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi90cmluaWRhZENvbXBvbmVudENsYXNzMTIudm0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5NDdlMWIuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvdHJpbmlkYWRDb21wb25lbnRDbGFzczEyLnZtCisrKyAvZGV2L251bGwKQEAgLTEsMjEwICswLDAgQEAKLSMjIFZlbG9jaXR5IHRlbXBsYXRlIHVzZWQgdG8gZ2VuZXJhdGUgdHJpbmlkYWQgSlNGMS4yLWNvbXBhdGlibGUgY29tcG9uZW50IGNsYXNzZXMNCi0jIyBmcm9tIGNvbXBvbmVudCBtZXRhLWRhdGEuDQotIyMNCi0jIyBOb3RlIHRoYXQgdGhlcmUgYXJlIHR3byB0eXBlcyBvZiBjb21wb25lbnQgZ2VuZXJhdGlvbjoNCi0jIyAgKiAic3ViY2xhc3MgbW9kZSIgKHVzZSBhbm5vdGF0ZWQgY2xhc3MgYXMgYSBwYXJlbnQgY2xhc3MpDQotIyMgICogInRlbXBsYXRlIG1vZGUiICh1c2UgYW5ub3RhdGVkIGNsYXNzIGFzIGEgdGVtcGxhdGUpDQotIyMgVGhpcyB0ZW1wbGF0ZSBmaWxlIGlzIHVzZWQgZm9yIGJvdGguDQotIyMNCi0jIyBWYXJpYWJsZSAkY29tcG9uZW50IHJlZmVycyB0byBhIENvbXBvbmVudE1ldGEgb2JqZWN0IHRvIHByb2Nlc3MNCi0jIyBWYXJpYWJsZSAkdXRpbHMgcmVmZXJzIHRvIGFuIGluc3RhbmNlIG9mIE15ZmFjZXNVdGlscy4NCi0jIw0KLSMjIFdoZW4gInRlbXBsYXRlIG1vZGUiIGlzIGJlaW5nIHVzZWQgdGhlbiB2YXJpYWJsZSAkaW5uZXJzb3VyY2UNCi0jIyBob2xkcyBhIFN0cmluZyBjb250YWluaW5nIGFsbCB0aGUgbm9uLWFic3RyYWN0IGZ1bmN0aW9ucyBkZWZpbmVkDQotIyMgaW4gdGhlIGFubm90YXRlZCBjbGFzcy4NCi0jIw0KLS8qDQotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKiANCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICogDQotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2UgJHtjb21wb25lbnQucGFja2FnZU5hbWV9Ow0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi0NCi1pbXBvcnQgamF2YXguZWwuVmFsdWVFeHByZXNzaW9uOw0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi0kdXRpbHMuaW1wb3J0VGFnQ2xhc3NlcygkY29tcG9uZW50KQ0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuYmVhbi5GYWNlc0JlYW47DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5iZWFuLlByb3BlcnR5S2V5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQudXRpbC5Db21wb25lbnRVdGlsczsNCi0NCi0jaWYgKCRjb21wb25lbnQuaXNUZW1wbGF0ZSgpKQ0KLSNzZXQgKCRnZW5lcmF0ZWRDbGFzc1BhcmVudCA9ICRjb21wb25lbnQuc291cmNlQ2xhc3NQYXJlbnRDbGFzc05hbWUpDQotI2Vsc2UNCi0jc2V0ICgkZ2VuZXJhdGVkQ2xhc3NQYXJlbnQgPSAkY29tcG9uZW50LnNvdXJjZUNsYXNzTmFtZSkNCi0jZW5kDQotLy8gR2VuZXJhdGVkIGZyb20gY2xhc3MgJHtjb21wb25lbnQuc291cmNlQ2xhc3NOYW1lfS4NCi0vLw0KLS8vIFdBUk5JTkc6IFRoaXMgZmlsZSB3YXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQuIERvIG5vdCBlZGl0IGl0IGRpcmVjdGx5LA0KLS8vICAgICAgICAgIG9yIHlvdSB3aWxsIGxvc2UgeW91ciBjaGFuZ2VzLg0KLXB1YmxpYyBjbGFzcyAke3V0aWxzLmdldENsYXNzRnJvbUZ1bGxDbGFzcygkY29tcG9uZW50LmNsYXNzTmFtZSl9IGV4dGVuZHMgJGdlbmVyYXRlZENsYXNzUGFyZW50DQotI2lmICgkY29tcG9uZW50LmltcGxlbWVudHMpDQotICAgIGltcGxlbWVudHMgJGNvbXBvbmVudC5pbXBsZW1lbnRzDQotI2VuZA0KLXsNCi0jaWYgKCRjb21wb25lbnQuc2VyaWFsdWlkKQ0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAke2NvbXBvbmVudC5zZXJpYWx1aWR9OyANCi0jZW5kICANCi0NCi0gICAgc3RhdGljIHB1YmxpYyBmaW5hbCBGYWNlc0JlYW4uVHlwZSBUWVBFID0gbmV3IEZhY2VzQmVhbi5UeXBlKA0KLSAgICAgICAke2dlbmVyYXRlZENsYXNzUGFyZW50fS5UWVBFKTsNCi0jc2V0ICgkcHJvcGVydHlMaXN0ID0gJHtjb21wb25lbnQucHJvcGVydHlDb21wb25lbnRMaXN0fSkNCi0jZm9yZWFjaCggJHByb3BlcnR5IGluICRwcm9wZXJ0eUxpc3QgKQ0KLSNzZXQgKCRmaWVsZCA9ICRwcm9wZXJ0eS5maWVsZE5hbWUpDQotI3NldCAoJHR5cGUgPSAkdXRpbHMuZ2V0Q2xhc3NGcm9tRnVsbENsYXNzKCRwcm9wZXJ0eS5jbGFzc05hbWUpKQ0KLSNzZXQgKCRrZXkgPSAkdXRpbHMuZ2V0Q29uc3RhbnROYW1lRnJvbVByb3BlcnR5KCRwcm9wZXJ0eS5uYW1lICwgIl9LRVkiKSkNCi0jIw0KLSMjIENBTENVTEFURSBERUZBVUxUIFZBTFVFDQotIyMNCi0jaWYoJHV0aWxzLmdldERlZmF1bHRWYWx1ZUZpZWxkKCRwcm9wZXJ0eSkpIA0KLSNzZXQgKCRkZWZhdWx0VmFsdWUgPSAkdXRpbHMuZ2V0RGVmYXVsdFZhbHVlRmllbGQoJHByb3BlcnR5KSkNCi0jaWYgKCRkZWZhdWx0VmFsdWUgPT0gInRydWUiKQ0KLSNzZXQgKCRkZWZhdWx0VmFsdWUgPSAiQm9vbGVhbi5UUlVFIikNCi0jZW5kDQotI2lmICgkZGVmYXVsdFZhbHVlID09ICJmYWxzZSIpDQotI3NldCAoJGRlZmF1bHRWYWx1ZSA9ICJCb29sZWFuLkZBTFNFIikNCi0jZW5kDQotI2lmICgkdHlwZSA9PSAiY2hhciIpDQotI3NldCAoJGRlZmF1bHRWYWx1ZSA9ICInIiskZGVmYXVsdFZhbHVlKyInIikNCi0jZW5kDQotI2Vsc2UNCi0jc2V0ICgkZGVmYXVsdFZhbHVlID0gZmFsc2UpDQotI2VuZA0KLSMjIENBTENVTEFURSBDQVBBQklMSVRJRVMNCi0jc2V0ICgkY2FwcyA9ICIiKQ0KLSNzZXQgKCRjYXBzQ291bnQgPSAwKQ0KLSNpZiAoJHByb3BlcnR5LmlzTWV0aG9kQmluZGluZygpIHx8ICRwcm9wZXJ0eS5pc0xpdGVyYWxPbmx5KCkpDQotI3NldCAoJGNhcHNDb3VudCA9ICRjYXBzQ291bnQgKyAxKQ0KLSNlbmQNCi0jaWYgKCRwcm9wZXJ0eS5pc1N0YXRlSG9sZGVyKCkpDQotI3NldCAoJGNhcHNDb3VudCA9ICRjYXBzQ291bnQgKyAxKQ0KLSNlbmQNCi0jaWYgKCRwcm9wZXJ0eS5pc1RyYW5zaWVudCgpKQ0KLSNzZXQgKCRjYXBzQ291bnQgPSAkY2Fwc0NvdW50ICsgMSkNCi0jZW5kDQotI2lmICgkcHJvcGVydHkuaXNNZXRob2RCaW5kaW5nKCkgfHwgJHByb3BlcnR5LmlzTGl0ZXJhbE9ubHkoKSkNCi0jc2V0ICgkY2FwcyA9ICRjYXBzICsgIlByb3BlcnR5S2V5LkNBUF9OT1RfQk9VTkQiKQ0KLSNpZiAoJGNhcHNDb3VudCA+IDEpI3NldCgkY2Fwc0NvdW50ID0gJGNhcHNDb3VudCAtIDEpI3NldCgkY2Fwcz0kY2FwcysiIHwgIikjZW5kDQotI2VuZA0KLSNpZiAoJHByb3BlcnR5LmlzU3RhdGVIb2xkZXIoKSkNCi0jc2V0ICgkY2FwcyA9ICRjYXBzICsgIlByb3BlcnR5S2V5LkNBUF9TVEFURV9IT0xERVIiKQ0KLSNpZiAoJGNhcHNDb3VudCA+IDEpI3NldCgkY2Fwc0NvdW50ID0gJGNhcHNDb3VudCAtIDEpI3NldCgkY2Fwcz0kY2FwcysiIHwgIikjZW5kDQotI2VuZA0KLSNpZiAoJHByb3BlcnR5LmlzVHJhbnNpZW50KCkpDQotI3NldCAoJGNhcHMgPSAkY2FwcyArICJQcm9wZXJ0eUtleS5DQVBfVFJBTlNJRU5UIikNCi0jaWYgKCRjYXBzQ291bnQgPiAxKSNzZXQoJGNhcHNDb3VudCA9ICRjYXBzQ291bnQgLSAxKSNzZXQoJGNhcHM9JGNhcHMrIiB8ICIpI2VuZA0KLSNlbmQNCi0jIyBUaGlzIHRlbXBsYXRlIGRvZXMgbm90IGhhbmRsZSBQcm9wZXJ0eUtleS5DQVBfTElTVA0KLQ0KLSAgICBzdGF0aWMgcHVibGljIGZpbmFsIFByb3BlcnR5S2V5ICRrZXkgPQ0KLSAgICAgICAgVFlQRS5yZWdpc3RlcktleSgNCi0gICAgICAgICAgICAiJHByb3BlcnR5Lm5hbWUiLCNpZigkdXRpbHMuaXNQcmltaXRpdmVDbGFzcygkdHlwZSkpJHt1dGlscy5nZXRCb3hlZENsYXNzKCR0eXBlKX0uY2xhc3Mje2Vsc2V9JHt0eXBlfS5jbGFzcyNlbmQNCi0jaWYoJGRlZmF1bHRWYWx1ZSksJHtkZWZhdWx0VmFsdWV9I2VuZA0KLSNpZiAoICEkY2Fwcy5lcXVhbHMoIiIpKSwke2NhcHN9I2VuZCk7DQotI2VuZA0KLQ0KLSAgICBzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBDT01QT05FTlRfRkFNSUxZID0NCi0gICAgICAgICIkY29tcG9uZW50LmZhbWlseSI7DQotICAgIHN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIENPTVBPTkVOVF9UWVBFID0NCi0gICAgICAgICIkY29tcG9uZW50LnR5cGUiOw0KLSMjaWYgKCRjb21wb25lbnQucmVuZGVyZXJUeXBlKQ0KLSMjaWYgKCEoJGNvbXBvbmVudC5yZW5kZXJlclR5cGUgPT0gIiIpKQ0KLSMjICAgIHN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIERFRkFVTFRfUkVOREVSRVJfVFlQRSA9IA0KLSMjICAgICAgICAiJGNvbXBvbmVudC5yZW5kZXJlclR5cGUiOw0KLSMjZW5kDQotIyNlbmQNCi0NCi0jaWYgKCRpbm5lcnNvdXJjZSkNCi0gICAgLy9CRUdJTiBDT0RFIENPUElFRCBGUk9NICRjb21wb25lbnQuc291cmNlQ2xhc3NOYW1lIA0KLSRpbm5lcnNvdXJjZQ0KLSAgICAvL0VORCBDT0RFIENPUElFRCBGUk9NICRjb21wb25lbnQuc291cmNlQ2xhc3NOYW1lDQotI2VuZA0KLQ0KLSAgICBwdWJsaWMgJHt1dGlscy5nZXRDbGFzc0Zyb21GdWxsQ2xhc3MoJGNvbXBvbmVudC5jbGFzc05hbWUpfSgpDQotICAgIHsNCi0jaWYgKCRjb21wb25lbnQucmVuZGVyZXJUeXBlKQ0KLSNpZiAoJGNvbXBvbmVudC5yZW5kZXJlclR5cGUgPT0gIiIpDQotICAgICAgICBzdXBlcihudWxsKTsNCi0jZWxzZQ0KLSAgICAgICAgc3VwZXIoIiRjb21wb25lbnQucmVuZGVyZXJUeXBlIik7DQotI2VuZA0KLSNlbHNlDQotICAgICAgICBzdXBlcihudWxsKTsNCi0jZW5kDQotICAgIH0NCi0NCi0jZm9yZWFjaCggJHByb3BlcnR5IGluICRwcm9wZXJ0eUxpc3QgKQ0KLSNzZXQgKCRmaWVsZCA9ICRwcm9wZXJ0eS5maWVsZE5hbWUpDQotI3NldCAoJHR5cGUgPSAkdXRpbHMuZ2V0Q2xhc3NGcm9tRnVsbENsYXNzKCRwcm9wZXJ0eS5jbGFzc05hbWUpKQ0KLSNzZXQgKCRrZXkgPSAkdXRpbHMuZ2V0Q29uc3RhbnROYW1lRnJvbVByb3BlcnR5KCRwcm9wZXJ0eS5uYW1lICwgIl9LRVkiKSkNCi0NCi0gICAgZmluYWwgcHVibGljICR0eXBlICR1dGlscy5nZXRNZXRob2RSZWFkZXJGcm9tUHJvcGVydHkoJHByb3BlcnR5Lm5hbWUsICR0eXBlKSgpDQotICAgIHsNCi0jaWYgKCR1dGlscy5pc1ByaW1pdGl2ZUNsYXNzKCR0eXBlKSkNCi0jaWYgKCR0eXBlID09ICJjaGFyIikNCi0gICAgICAgIHJldHVybiBDb21wb25lbnRVdGlscy5yZXNvbHZlQ2hhcmFjdGVyKChDaGFyYWN0ZXIpIGdldFByb3BlcnR5KCRrZXkpKTsNCi0jZWxzZWlmICgkdHlwZSA9PSAiYnl0ZSIgfHwgJHR5cGUgPT0gInNob3J0IikNCi0jIyBUaGVyZSBpcyBubyBDb21wb25lbnRVdGlscyByZW1ldGhvZCwgc28gd2UganVzdCBjYXN0IGl0Lg0KLSAgICAgICAgcmV0dXJuICR1dGlscy5jYXN0SWZOZWNlc3NhcnkoJHR5cGUpIGdldFByb3BlcnR5KCRrZXkpOw0KLSNlbHNlDQotICAgICAgICByZXR1cm4gQ29tcG9uZW50VXRpbHMucmVzb2x2ZSR7dXRpbHMuZ2V0Qm94ZWRDbGFzcygkdHlwZSl9KGdldFByb3BlcnR5KCRrZXkpKTsNCi0jZW5kDQotI2Vsc2VpZiAoJHR5cGUgPT0gIlN0cmluZyIgfHwgJHR5cGUgPT0gIkxvY2FsZSIgfHwgJHR5cGUgPT0gIlRpbWVab25lIikNCi0gICAgICAgIHJldHVybiBDb21wb25lbnRVdGlscy5yZXNvbHZlJHt1dGlscy5nZXRCb3hlZENsYXNzKCR0eXBlKX0oZ2V0UHJvcGVydHkoJGtleSkpOw0KLSNlbHNlDQotICAgICAgICByZXR1cm4gJHV0aWxzLmNhc3RJZk5lY2Vzc2FyeSgkdHlwZSkgZ2V0UHJvcGVydHkoJGtleSk7DQotI2VuZA0KLSAgICB9DQotDQotICAgIGZpbmFsIHB1YmxpYyB2b2lkICR1dGlscy5nZXRQcmVmaXhlZFByb3BlcnR5TmFtZSgic2V0IiwgJHByb3BlcnR5Lm5hbWUpKCR0eXBlICR1dGlscy5nZXRWYXJpYWJsZUZyb21OYW1lKCRwcm9wZXJ0eS5uYW1lKSkNCi0gICAgew0KLSNpZiAoJHV0aWxzLmlzUHJpbWl0aXZlQ2xhc3MoJHR5cGUpKQ0KLSNpZiAoJHR5cGUgPT0gImJvb2xlYW4iKQ0KLSAgICAgICAgc2V0UHJvcGVydHkoJGtleSwgJHV0aWxzLmdldFZhcmlhYmxlRnJvbU5hbWUoJHByb3BlcnR5Lm5hbWUpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRSk7DQotI2Vsc2UNCi0gICAgICAgIHNldFByb3BlcnR5KCRrZXksICR7dXRpbHMuZ2V0Qm94ZWRDbGFzcygkdHlwZSl9LnZhbHVlT2YoICR1dGlscy5nZXRWYXJpYWJsZUZyb21OYW1lKCRwcm9wZXJ0eS5uYW1lKSApKTsNCi0jZW5kDQotI2Vsc2UNCi0gICAgICAgIHNldFByb3BlcnR5KCRrZXksICR1dGlscy5nZXRWYXJpYWJsZUZyb21OYW1lKCRwcm9wZXJ0eS5uYW1lKSk7DQotI2VuZA0KLSAgICB9DQotI2VuZA0KLQ0KLSAgICBAT3ZlcnJpZGUgICAgDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RmFtaWx5KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIENPTVBPTkVOVF9GQU1JTFk7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCBGYWNlc0JlYW4uVHlwZSBnZXRCZWFuVHlwZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBUWVBFOw0KLSAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgJHt1dGlscy5nZXRDbGFzc0Zyb21GdWxsQ2xhc3MoJGNvbXBvbmVudC5jbGFzc05hbWUpfShTdHJpbmcgcmVuZGVyZXJUeXBlKQ0KLSAgICB7DQotICAgICAgc3VwZXIocmVuZGVyZXJUeXBlKTsNCi0gICAgfQ0KLSAgDQotICAgIHN0YXRpYw0KLSAgICB7DQotICAgICAgICBUWVBFLmxvY2soKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi90cmluaWRhZENvbXBvbmVudENsYXNzMjAudm0gYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi90cmluaWRhZENvbXBvbmVudENsYXNzMjAudm0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5NDdlMWIuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvdHJpbmlkYWRDb21wb25lbnRDbGFzczIwLnZtCisrKyAvZGV2L251bGwKQEAgLTEsMjEwICswLDAgQEAKLSMjIFZlbG9jaXR5IHRlbXBsYXRlIHVzZWQgdG8gZ2VuZXJhdGUgdHJpbmlkYWQgSlNGMS4yLWNvbXBhdGlibGUgY29tcG9uZW50IGNsYXNzZXMNCi0jIyBmcm9tIGNvbXBvbmVudCBtZXRhLWRhdGEuDQotIyMNCi0jIyBOb3RlIHRoYXQgdGhlcmUgYXJlIHR3byB0eXBlcyBvZiBjb21wb25lbnQgZ2VuZXJhdGlvbjoNCi0jIyAgKiAic3ViY2xhc3MgbW9kZSIgKHVzZSBhbm5vdGF0ZWQgY2xhc3MgYXMgYSBwYXJlbnQgY2xhc3MpDQotIyMgICogInRlbXBsYXRlIG1vZGUiICh1c2UgYW5ub3RhdGVkIGNsYXNzIGFzIGEgdGVtcGxhdGUpDQotIyMgVGhpcyB0ZW1wbGF0ZSBmaWxlIGlzIHVzZWQgZm9yIGJvdGguDQotIyMNCi0jIyBWYXJpYWJsZSAkY29tcG9uZW50IHJlZmVycyB0byBhIENvbXBvbmVudE1ldGEgb2JqZWN0IHRvIHByb2Nlc3MNCi0jIyBWYXJpYWJsZSAkdXRpbHMgcmVmZXJzIHRvIGFuIGluc3RhbmNlIG9mIE15ZmFjZXNVdGlscy4NCi0jIw0KLSMjIFdoZW4gInRlbXBsYXRlIG1vZGUiIGlzIGJlaW5nIHVzZWQgdGhlbiB2YXJpYWJsZSAkaW5uZXJzb3VyY2UNCi0jIyBob2xkcyBhIFN0cmluZyBjb250YWluaW5nIGFsbCB0aGUgbm9uLWFic3RyYWN0IGZ1bmN0aW9ucyBkZWZpbmVkDQotIyMgaW4gdGhlIGFubm90YXRlZCBjbGFzcy4NCi0jIw0KLS8qDQotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKiANCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICogDQotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2UgJHtjb21wb25lbnQucGFja2FnZU5hbWV9Ow0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi0NCi1pbXBvcnQgamF2YXguZWwuVmFsdWVFeHByZXNzaW9uOw0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi0kdXRpbHMuaW1wb3J0VGFnQ2xhc3NlcygkY29tcG9uZW50KQ0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuYmVhbi5GYWNlc0JlYW47DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5iZWFuLlByb3BlcnR5S2V5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQudXRpbC5Db21wb25lbnRVdGlsczsNCi0NCi0jaWYgKCRjb21wb25lbnQuaXNUZW1wbGF0ZSgpKQ0KLSNzZXQgKCRnZW5lcmF0ZWRDbGFzc1BhcmVudCA9ICRjb21wb25lbnQuc291cmNlQ2xhc3NQYXJlbnRDbGFzc05hbWUpDQotI2Vsc2UNCi0jc2V0ICgkZ2VuZXJhdGVkQ2xhc3NQYXJlbnQgPSAkY29tcG9uZW50LnNvdXJjZUNsYXNzTmFtZSkNCi0jZW5kDQotLy8gR2VuZXJhdGVkIGZyb20gY2xhc3MgJHtjb21wb25lbnQuc291cmNlQ2xhc3NOYW1lfS4NCi0vLw0KLS8vIFdBUk5JTkc6IFRoaXMgZmlsZSB3YXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQuIERvIG5vdCBlZGl0IGl0IGRpcmVjdGx5LA0KLS8vICAgICAgICAgIG9yIHlvdSB3aWxsIGxvc2UgeW91ciBjaGFuZ2VzLg0KLXB1YmxpYyBjbGFzcyAke3V0aWxzLmdldENsYXNzRnJvbUZ1bGxDbGFzcygkY29tcG9uZW50LmNsYXNzTmFtZSl9IGV4dGVuZHMgJGdlbmVyYXRlZENsYXNzUGFyZW50DQotI2lmICgkY29tcG9uZW50LmltcGxlbWVudHMpDQotICAgIGltcGxlbWVudHMgJGNvbXBvbmVudC5pbXBsZW1lbnRzDQotI2VuZA0KLXsNCi0jaWYgKCRjb21wb25lbnQuc2VyaWFsdWlkKQ0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAke2NvbXBvbmVudC5zZXJpYWx1aWR9OyANCi0jZW5kICANCi0NCi0gICAgc3RhdGljIHB1YmxpYyBmaW5hbCBGYWNlc0JlYW4uVHlwZSBUWVBFID0gbmV3IEZhY2VzQmVhbi5UeXBlKA0KLSAgICAgICAke2dlbmVyYXRlZENsYXNzUGFyZW50fS5UWVBFKTsNCi0jc2V0ICgkcHJvcGVydHlMaXN0ID0gJHtjb21wb25lbnQucHJvcGVydHlDb21wb25lbnRMaXN0fSkNCi0jZm9yZWFjaCggJHByb3BlcnR5IGluICRwcm9wZXJ0eUxpc3QgKQ0KLSNzZXQgKCRmaWVsZCA9ICRwcm9wZXJ0eS5maWVsZE5hbWUpDQotI3NldCAoJHR5cGUgPSAkdXRpbHMuZ2V0Q2xhc3NGcm9tRnVsbENsYXNzKCRwcm9wZXJ0eS5jbGFzc05hbWUpKQ0KLSNzZXQgKCRrZXkgPSAkdXRpbHMuZ2V0Q29uc3RhbnROYW1lRnJvbVByb3BlcnR5KCRwcm9wZXJ0eS5uYW1lICwgIl9LRVkiKSkNCi0jIw0KLSMjIENBTENVTEFURSBERUZBVUxUIFZBTFVFDQotIyMNCi0jaWYoJHV0aWxzLmdldERlZmF1bHRWYWx1ZUZpZWxkKCRwcm9wZXJ0eSkpIA0KLSNzZXQgKCRkZWZhdWx0VmFsdWUgPSAkdXRpbHMuZ2V0RGVmYXVsdFZhbHVlRmllbGQoJHByb3BlcnR5KSkNCi0jaWYgKCRkZWZhdWx0VmFsdWUgPT0gInRydWUiKQ0KLSNzZXQgKCRkZWZhdWx0VmFsdWUgPSAiQm9vbGVhbi5UUlVFIikNCi0jZW5kDQotI2lmICgkZGVmYXVsdFZhbHVlID09ICJmYWxzZSIpDQotI3NldCAoJGRlZmF1bHRWYWx1ZSA9ICJCb29sZWFuLkZBTFNFIikNCi0jZW5kDQotI2lmICgkdHlwZSA9PSAiY2hhciIpDQotI3NldCAoJGRlZmF1bHRWYWx1ZSA9ICInIiskZGVmYXVsdFZhbHVlKyInIikNCi0jZW5kDQotI2Vsc2UNCi0jc2V0ICgkZGVmYXVsdFZhbHVlID0gZmFsc2UpDQotI2VuZA0KLSMjIENBTENVTEFURSBDQVBBQklMSVRJRVMNCi0jc2V0ICgkY2FwcyA9ICIiKQ0KLSNzZXQgKCRjYXBzQ291bnQgPSAwKQ0KLSNpZiAoJHByb3BlcnR5LmlzTWV0aG9kQmluZGluZygpIHx8ICRwcm9wZXJ0eS5pc0xpdGVyYWxPbmx5KCkpDQotI3NldCAoJGNhcHNDb3VudCA9ICRjYXBzQ291bnQgKyAxKQ0KLSNlbmQNCi0jaWYgKCRwcm9wZXJ0eS5pc1N0YXRlSG9sZGVyKCkpDQotI3NldCAoJGNhcHNDb3VudCA9ICRjYXBzQ291bnQgKyAxKQ0KLSNlbmQNCi0jaWYgKCRwcm9wZXJ0eS5pc1RyYW5zaWVudCgpKQ0KLSNzZXQgKCRjYXBzQ291bnQgPSAkY2Fwc0NvdW50ICsgMSkNCi0jZW5kDQotI2lmICgkcHJvcGVydHkuaXNNZXRob2RCaW5kaW5nKCkgfHwgJHByb3BlcnR5LmlzTGl0ZXJhbE9ubHkoKSkNCi0jc2V0ICgkY2FwcyA9ICRjYXBzICsgIlByb3BlcnR5S2V5LkNBUF9OT1RfQk9VTkQiKQ0KLSNpZiAoJGNhcHNDb3VudCA+IDEpI3NldCgkY2Fwc0NvdW50ID0gJGNhcHNDb3VudCAtIDEpI3NldCgkY2Fwcz0kY2FwcysiIHwgIikjZW5kDQotI2VuZA0KLSNpZiAoJHByb3BlcnR5LmlzU3RhdGVIb2xkZXIoKSkNCi0jc2V0ICgkY2FwcyA9ICRjYXBzICsgIlByb3BlcnR5S2V5LkNBUF9TVEFURV9IT0xERVIiKQ0KLSNpZiAoJGNhcHNDb3VudCA+IDEpI3NldCgkY2Fwc0NvdW50ID0gJGNhcHNDb3VudCAtIDEpI3NldCgkY2Fwcz0kY2FwcysiIHwgIikjZW5kDQotI2VuZA0KLSNpZiAoJHByb3BlcnR5LmlzVHJhbnNpZW50KCkpDQotI3NldCAoJGNhcHMgPSAkY2FwcyArICJQcm9wZXJ0eUtleS5DQVBfVFJBTlNJRU5UIikNCi0jaWYgKCRjYXBzQ291bnQgPiAxKSNzZXQoJGNhcHNDb3VudCA9ICRjYXBzQ291bnQgLSAxKSNzZXQoJGNhcHM9JGNhcHMrIiB8ICIpI2VuZA0KLSNlbmQNCi0jIyBUaGlzIHRlbXBsYXRlIGRvZXMgbm90IGhhbmRsZSBQcm9wZXJ0eUtleS5DQVBfTElTVA0KLQ0KLSAgICBzdGF0aWMgcHVibGljIGZpbmFsIFByb3BlcnR5S2V5ICRrZXkgPQ0KLSAgICAgICAgVFlQRS5yZWdpc3RlcktleSgNCi0gICAgICAgICAgICAiJHByb3BlcnR5Lm5hbWUiLCNpZigkdXRpbHMuaXNQcmltaXRpdmVDbGFzcygkdHlwZSkpJHt1dGlscy5nZXRCb3hlZENsYXNzKCR0eXBlKX0uY2xhc3Mje2Vsc2V9JHt0eXBlfS5jbGFzcyNlbmQNCi0jaWYoJGRlZmF1bHRWYWx1ZSksJHtkZWZhdWx0VmFsdWV9I2VuZA0KLSNpZiAoICEkY2Fwcy5lcXVhbHMoIiIpKSwke2NhcHN9I2VuZCk7DQotI2VuZA0KLQ0KLSAgICBzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBDT01QT05FTlRfRkFNSUxZID0NCi0gICAgICAgICIkY29tcG9uZW50LmZhbWlseSI7DQotICAgIHN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIENPTVBPTkVOVF9UWVBFID0NCi0gICAgICAgICIkY29tcG9uZW50LnR5cGUiOw0KLSMjaWYgKCRjb21wb25lbnQucmVuZGVyZXJUeXBlKQ0KLSMjaWYgKCEoJGNvbXBvbmVudC5yZW5kZXJlclR5cGUgPT0gIiIpKQ0KLSMjICAgIHN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIERFRkFVTFRfUkVOREVSRVJfVFlQRSA9IA0KLSMjICAgICAgICAiJGNvbXBvbmVudC5yZW5kZXJlclR5cGUiOw0KLSMjZW5kDQotIyNlbmQNCi0NCi0jaWYgKCRpbm5lcnNvdXJjZSkNCi0gICAgLy9CRUdJTiBDT0RFIENPUElFRCBGUk9NICRjb21wb25lbnQuc291cmNlQ2xhc3NOYW1lIA0KLSRpbm5lcnNvdXJjZQ0KLSAgICAvL0VORCBDT0RFIENPUElFRCBGUk9NICRjb21wb25lbnQuc291cmNlQ2xhc3NOYW1lDQotI2VuZA0KLQ0KLSAgICBwdWJsaWMgJHt1dGlscy5nZXRDbGFzc0Zyb21GdWxsQ2xhc3MoJGNvbXBvbmVudC5jbGFzc05hbWUpfSgpDQotICAgIHsNCi0jaWYgKCRjb21wb25lbnQucmVuZGVyZXJUeXBlKQ0KLSNpZiAoJGNvbXBvbmVudC5yZW5kZXJlclR5cGUgPT0gIiIpDQotICAgICAgICBzdXBlcihudWxsKTsNCi0jZWxzZQ0KLSAgICAgICAgc3VwZXIoIiRjb21wb25lbnQucmVuZGVyZXJUeXBlIik7DQotI2VuZA0KLSNlbHNlDQotICAgICAgICBzdXBlcihudWxsKTsNCi0jZW5kDQotICAgIH0NCi0NCi0jZm9yZWFjaCggJHByb3BlcnR5IGluICRwcm9wZXJ0eUxpc3QgKQ0KLSNzZXQgKCRmaWVsZCA9ICRwcm9wZXJ0eS5maWVsZE5hbWUpDQotI3NldCAoJHR5cGUgPSAkdXRpbHMuZ2V0Q2xhc3NGcm9tRnVsbENsYXNzKCRwcm9wZXJ0eS5jbGFzc05hbWUpKQ0KLSNzZXQgKCRrZXkgPSAkdXRpbHMuZ2V0Q29uc3RhbnROYW1lRnJvbVByb3BlcnR5KCRwcm9wZXJ0eS5uYW1lICwgIl9LRVkiKSkNCi0NCi0gICAgZmluYWwgcHVibGljICR0eXBlICR1dGlscy5nZXRNZXRob2RSZWFkZXJGcm9tUHJvcGVydHkoJHByb3BlcnR5Lm5hbWUsICR0eXBlKSgpDQotICAgIHsNCi0jaWYgKCR1dGlscy5pc1ByaW1pdGl2ZUNsYXNzKCR0eXBlKSkNCi0jaWYgKCR0eXBlID09ICJjaGFyIikNCi0gICAgICAgIHJldHVybiBDb21wb25lbnRVdGlscy5yZXNvbHZlQ2hhcmFjdGVyKChDaGFyYWN0ZXIpIGdldFByb3BlcnR5KCRrZXkpKTsNCi0jZWxzZWlmICgkdHlwZSA9PSAiYnl0ZSIgfHwgJHR5cGUgPT0gInNob3J0IikNCi0jIyBUaGVyZSBpcyBubyBDb21wb25lbnRVdGlscyByZW1ldGhvZCwgc28gd2UganVzdCBjYXN0IGl0Lg0KLSAgICAgICAgcmV0dXJuICR1dGlscy5jYXN0SWZOZWNlc3NhcnkoJHR5cGUpIGdldFByb3BlcnR5KCRrZXkpOw0KLSNlbHNlDQotICAgICAgICByZXR1cm4gQ29tcG9uZW50VXRpbHMucmVzb2x2ZSR7dXRpbHMuZ2V0Qm94ZWRDbGFzcygkdHlwZSl9KGdldFByb3BlcnR5KCRrZXkpKTsNCi0jZW5kDQotI2Vsc2VpZiAoJHR5cGUgPT0gIlN0cmluZyIgfHwgJHR5cGUgPT0gIkxvY2FsZSIgfHwgJHR5cGUgPT0gIlRpbWVab25lIikNCi0gICAgICAgIHJldHVybiBDb21wb25lbnRVdGlscy5yZXNvbHZlJHt1dGlscy5nZXRCb3hlZENsYXNzKCR0eXBlKX0oZ2V0UHJvcGVydHkoJGtleSkpOw0KLSNlbHNlDQotICAgICAgICByZXR1cm4gJHV0aWxzLmNhc3RJZk5lY2Vzc2FyeSgkdHlwZSkgZ2V0UHJvcGVydHkoJGtleSk7DQotI2VuZA0KLSAgICB9DQotDQotICAgIGZpbmFsIHB1YmxpYyB2b2lkICR1dGlscy5nZXRQcmVmaXhlZFByb3BlcnR5TmFtZSgic2V0IiwgJHByb3BlcnR5Lm5hbWUpKCR0eXBlICR1dGlscy5nZXRWYXJpYWJsZUZyb21OYW1lKCRwcm9wZXJ0eS5uYW1lKSkNCi0gICAgew0KLSNpZiAoJHV0aWxzLmlzUHJpbWl0aXZlQ2xhc3MoJHR5cGUpKQ0KLSNpZiAoJHR5cGUgPT0gImJvb2xlYW4iKQ0KLSAgICAgICAgc2V0UHJvcGVydHkoJGtleSwgJHV0aWxzLmdldFZhcmlhYmxlRnJvbU5hbWUoJHByb3BlcnR5Lm5hbWUpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRSk7DQotI2Vsc2UNCi0gICAgICAgIHNldFByb3BlcnR5KCRrZXksICR7dXRpbHMuZ2V0Qm94ZWRDbGFzcygkdHlwZSl9LnZhbHVlT2YoICR1dGlscy5nZXRWYXJpYWJsZUZyb21OYW1lKCRwcm9wZXJ0eS5uYW1lKSApKTsNCi0jZW5kDQotI2Vsc2UNCi0gICAgICAgIHNldFByb3BlcnR5KCRrZXksICR1dGlscy5nZXRWYXJpYWJsZUZyb21OYW1lKCRwcm9wZXJ0eS5uYW1lKSk7DQotI2VuZA0KLSAgICB9DQotI2VuZA0KLQ0KLSAgICBAT3ZlcnJpZGUgICAgDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RmFtaWx5KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIENPTVBPTkVOVF9GQU1JTFk7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCBGYWNlc0JlYW4uVHlwZSBnZXRCZWFuVHlwZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBUWVBFOw0KLSAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgJHt1dGlscy5nZXRDbGFzc0Zyb21GdWxsQ2xhc3MoJGNvbXBvbmVudC5jbGFzc05hbWUpfShTdHJpbmcgcmVuZGVyZXJUeXBlKQ0KLSAgICB7DQotICAgICAgc3VwZXIocmVuZGVyZXJUeXBlKTsNCi0gICAgfQ0KLSAgDQotICAgIHN0YXRpYw0KLSAgICB7DQotICAgICAgICBUWVBFLmxvY2soKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi90cmluaWRhZFRhZ0NsYXNzMTIudm0gYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi90cmluaWRhZFRhZ0NsYXNzMTIudm0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmYTY2ZjEuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvdHJpbmlkYWRUYWdDbGFzczEyLnZtCisrKyAvZGV2L251bGwKQEAgLTEsMTQyICswLDAgQEAKLS8vIFdBUk5JTkc6IFRoaXMgZmlsZSB3YXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQuIERvIG5vdCBlZGl0IGl0IGRpcmVjdGx5LA0KLS8vICAgICAgICAgIG9yIHlvdSB3aWxsIGxvc2UgeW91ciBjaGFuZ2VzLg0KLS8qDQotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKiANCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICogDQotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2UgJHtjb21wb25lbnQudGFnUGFja2FnZX07DQotDQotaW1wb3J0IGphdmF4LmVsLlZhbHVlRXhwcmVzc2lvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLmJlYW4uRmFjZXNCZWFuOw0KLSMjJHV0aWxzLmltcG9ydFRhZ0NsYXNzZXMxMigkY29tcG9uZW50KQ0KLSNzZXQgKCRhZGRNZU1iID0gZmFsc2UpDQotI3NldCAoJGFkZE1lID0gZmFsc2UpDQotI3NldCAoJHByb3BlcnR5TGlzdCA9ICR7Y29tcG9uZW50LnByb3BlcnR5VGFnTGlzdH0pDQotI2ZvcmVhY2goICRwcm9wZXJ0eSBpbiAkcHJvcGVydHlMaXN0ICkNCi0jaWYgKCRwcm9wZXJ0eS5pc01ldGhvZEV4cHJlc3Npb24oKSkNCi0jc2V0ICgkYWRkTWUgPSB0cnVlKQ0KLSNlbmQNCi0jaWYgKCRwcm9wZXJ0eS5pc01ldGhvZEJpbmRpbmcoKSkNCi0jc2V0ICgkYWRkTWVNYiA9IHRydWUpDQotI2VuZA0KLSNlbmQNCi0jaWYgKCRhZGRNZSkNCi1pbXBvcnQgamF2YXguZWwuTWV0aG9kRXhwcmVzc2lvbjsNCi0jZW5kDQotI2lmICgkYWRkTWVNYikNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkaW50ZXJuYWwudGFnbGliLnV0aWwuTWV0aG9kRXhwcmVzc2lvbk1ldGhvZEJpbmRpbmc7DQotI2VuZA0KLQ0KLS8vIEdlbmVyYXRlZCBmcm9tIGNsYXNzICR7Y29tcG9uZW50LnNvdXJjZUNsYXNzTmFtZX0uDQotLy8NCi0vLyBXQVJOSU5HOiBUaGlzIGZpbGUgd2FzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkLiBEbyBub3QgZWRpdCBpdCBkaXJlY3RseSwNCi0vLyAgICAgICAgICBvciB5b3Ugd2lsbCBsb3NlIHlvdXIgY2hhbmdlcy4NCi1wdWJsaWMgY2xhc3MgJHV0aWxzLmdldENsYXNzRnJvbUZ1bGxDbGFzcygkY29tcG9uZW50LnRhZ0NsYXNzKQ0KLSNpZiAoJHtjb21wb25lbnQudGFnU3VwZXJjbGFzc30pDQotICAgIGV4dGVuZHMgJHtjb21wb25lbnQudGFnU3VwZXJjbGFzc30NCi0jZWxzZQ0KLSAgICBleHRlbmRzIGphdmF4LmZhY2VzLndlYmFwcC5VSUNvbXBvbmVudFRhZw0KLSNlbmQNCi17DQotICAgIHB1YmxpYyAkdXRpbHMuZ2V0Q2xhc3NGcm9tRnVsbENsYXNzKCRjb21wb25lbnQudGFnQ2xhc3MpKCkNCi0gICAgeyAgICANCi0gICAgfQ0KLSAgICANCi0gICAgcHVibGljIFN0cmluZyBnZXRDb21wb25lbnRUeXBlKCkNCi0gICAgew0KLSNpZiAoJGNvbXBvbmVudC50eXBlKQ0KLSAgICAgICAgcmV0dXJuICIkY29tcG9uZW50LnR5cGUiOw0KLSNlbHNlDQotICAgICAgICByZXR1cm4gbnVsbDsNCi0jZW5kDQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRSZW5kZXJlclR5cGUoKQ0KLSAgICB7DQotI2lmICgkY29tcG9uZW50LnJlbmRlcmVyVHlwZSAmJiAhKCRjb21wb25lbnQucmVuZGVyZXJUeXBlID09ICIiKSkNCi0gICAgICAgIHJldHVybiAiJGNvbXBvbmVudC5yZW5kZXJlclR5cGUiOw0KLSNlbHNlDQotICAgICAgICByZXR1cm4gbnVsbDsNCi0jZW5kDQotICAgIH0NCi0NCi0jZm9yZWFjaCggJHByb3BlcnR5IGluICRwcm9wZXJ0eUxpc3QgKQ0KLSNzZXQgKCRmaWVsZCA9ICRwcm9wZXJ0eS5maWVsZE5hbWUpDQotI3NldCAoJHR5cGUgPSAkdXRpbHMuZ2V0SnNwUHJvcGVydHlUeXBlMTIoJHByb3BlcnR5KSkNCi0jaWYgKCRwcm9wZXJ0eS5pc0xpdGVyYWxPbmx5KCkgJiYgJHByb3BlcnR5LmNsYXNzTmFtZSA9PSAiYm9vbGVhbiIpDQotI3NldCAoJHR5cGUgPSAiU3RyaW5nIikNCi0jZW5kDQotICAgIHByaXZhdGUgJHR5cGUgJGZpZWxkOw0KLSAgICANCi0jc2V0ICgkdmFyID0gJHV0aWxzLmdldFZhcmlhYmxlRnJvbU5hbWUoJHByb3BlcnR5Lm5hbWUpKQ0KLSAgICBwdWJsaWMgdm9pZCAkdXRpbHMuZ2V0UHJlZml4ZWRQcm9wZXJ0eU5hbWUoInNldCIsICRwcm9wZXJ0eS5qc3BOYW1lKSgkdHlwZSAkdmFyKQ0KLSAgICB7DQotICAgICAgICAkZmllbGQgPSAkdmFyOw0KLSAgICB9DQotI2VuZA0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0UHJvcGVydGllcygNCi0gICAgICBGYWNlc0JlYW4gYmVhbikNCi0gICAgew0KLSAgICAgICAgc3VwZXIuc2V0UHJvcGVydGllcyhiZWFuKTsNCi0jZm9yZWFjaCggJHByb3BlcnR5IGluICRwcm9wZXJ0eUxpc3QgKQ0KLSNzZXQgKCRmaWVsZCA9ICRwcm9wZXJ0eS5maWVsZE5hbWUpDQotI3NldCAoJHR5cGUgPSAkdXRpbHMuZ2V0Q2xhc3NGcm9tRnVsbENsYXNzKCRwcm9wZXJ0eS5jbGFzc05hbWUpKQ0KLSNzZXQgKCRrZXkgPSAkdXRpbHMuZ2V0Q29uc3RhbnROYW1lRnJvbVByb3BlcnR5KCRwcm9wZXJ0eS5uYW1lICwgIl9LRVkiKSkNCi0jaWYgKCR1dGlscy5pc0NvbnZlcnRlcigkcHJvcGVydHkuY2xhc3NOYW1lKSkjIyAgICAgICAgICAgICAgICAgICAyDQotICAgICAgICBpZiAoJGZpZWxkICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKCEke2ZpZWxkfS5pc0xpdGVyYWxUZXh0KCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBiZWFuLnNldFZhbHVlRXhwcmVzc2lvbigke2NvbXBvbmVudC5jbGFzc05hbWV9LiR7a2V5fSwgJGZpZWxkKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZWxzZQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgU3RyaW5nIHMgPSAke2ZpZWxkfS5nZXRFeHByZXNzaW9uU3RyaW5nKCk7DQotICAgICAgICAgICAgICAgIGlmIChzICE9IG51bGwpDQotICAgICAgICAgICAgICAgIHsgICAgICAgICAgICANCi0gICAgICAgICAgICAgICAgICAgIENvbnZlcnRlciBjb252ZXJ0ZXIgPSBnZXRGYWNlc0NvbnRleHQoKS5nZXRBcHBsaWNhdGlvbigpLmNyZWF0ZUNvbnZlcnRlcihzKTsNCi0gICAgICAgICAgICAgICAgICAgIGJlYW4uc2V0UHJvcGVydHkoJHtjb21wb25lbnQuY2xhc3NOYW1lfS4ke2tleX0sIGNvbnZlcnRlcik7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotI2Vsc2VpZiAoJHByb3BlcnR5LmlzTWV0aG9kRXhwcmVzc2lvbigpKQ0KLSAgICAgICAgYmVhbi5zZXRQcm9wZXJ0eSgke2NvbXBvbmVudC5jbGFzc05hbWV9LiR7a2V5fSwgJGZpZWxkKTsNCi0jZWxzZWlmICgkcHJvcGVydHkuaXNNZXRob2RCaW5kaW5nKCkpDQotICAgICAgICBpZiAoJGZpZWxkICE9IG51bGwpDQotICAgICAgICAgICAgYmVhbi5zZXRQcm9wZXJ0eSgke2NvbXBvbmVudC5jbGFzc05hbWV9LiR7a2V5fSwgbmV3IE1ldGhvZEV4cHJlc3Npb25NZXRob2RCaW5kaW5nKCRmaWVsZCkpDQotI2Vsc2VpZiAoJHByb3BlcnR5LmlzTGl0ZXJhbE9ubHkoKSkNCi0gICAgICAgIGJlYW4uc2V0UHJvcGVydHkoJHtjb21wb25lbnQuY2xhc3NOYW1lfS4ke2tleX0sICRmaWVsZCk7DQotI2Vsc2VpZiAoJHR5cGUgPT0gIlN0cmluZ1tdIikNCi0gICAgICAgIHNldFN0cmluZ0FycmF5UHJvcGVydHkoYmVhbiwgJHtjb21wb25lbnQuY2xhc3NOYW1lfS4ke2tleX0sICRmaWVsZCk7DQotI2Vsc2UNCi0gICAgICAgIHNldFByb3BlcnR5KGJlYW4sICR7Y29tcG9uZW50LmNsYXNzTmFtZX0uJHtrZXl9LCAkZmllbGQpOw0KLSNlbmQNCi0jZW5kDQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyB2b2lkIHJlbGVhc2UoKQ0KLSAgICB7DQotICAgICAgICBzdXBlci5yZWxlYXNlKCk7DQotI2ZvcmVhY2goICRwcm9wZXJ0eSBpbiAkcHJvcGVydHlMaXN0ICkNCi0jc2V0ICgkZmllbGQgPSAkcHJvcGVydHkuZmllbGROYW1lKQ0KLSNzZXQgKCRlbXB0eSA9ICJudWxsIikNCi0gICAgICAgICRmaWVsZCA9ICRlbXB0eTsNCi0jZW5kDQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvdHJpbmlkYWRUYWdDbGFzczIwLnZtIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvdHJpbmlkYWRUYWdDbGFzczIwLnZtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNzkyMDRhLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL3RyaW5pZGFkVGFnQ2xhc3MyMC52bQorKysgL2Rldi9udWxsCkBAIC0xLDI0MyArMCwwIEBACi0vLyBXQVJOSU5HOiBUaGlzIGZpbGUgd2FzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkLiBEbyBub3QgZWRpdCBpdCBkaXJlY3RseSwNCi0vLyAgICAgICAgICBvciB5b3Ugd2lsbCBsb3NlIHlvdXIgY2hhbmdlcy4NCi0NCi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotKi8NCi1wYWNrYWdlICR7Y29tcG9uZW50LnRhZ1BhY2thZ2V9Ow0KLQ0KLWltcG9ydCBqYXZheC5lbC5WYWx1ZUV4cHJlc3Npb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5iZWFuLkZhY2VzQmVhbjsNCi0jIyR1dGlscy5pbXBvcnRUYWdDbGFzc2VzMTIoJGNvbXBvbmVudCkNCi0jc2V0ICgkYWRkTWVNYiA9IGZhbHNlKQ0KLSNzZXQgKCRhZGRNZSA9IGZhbHNlKQ0KLSNzZXQgKCRwcm9wZXJ0eUxpc3QgPSAke2NvbXBvbmVudC5wcm9wZXJ0eVRhZ0xpc3R9KQ0KLSNmb3JlYWNoKCAkcHJvcGVydHkgaW4gJHByb3BlcnR5TGlzdCApDQotI2lmICgkcHJvcGVydHkuaXNNZXRob2RFeHByZXNzaW9uKCkpDQotI3NldCAoJGFkZE1lID0gdHJ1ZSkNCi0jZW5kDQotI2lmICgkcHJvcGVydHkuaXNNZXRob2RCaW5kaW5nKCkpDQotI3NldCAoJGFkZE1lTWIgPSB0cnVlKQ0KLSNzZXQgKCRhZGRNYiA9IHRydWUpDQotI3NldCAoJGFkZE1lID0gdHJ1ZSkNCi0jZW5kDQotI2lmICgkcHJvcGVydHkubmFtZSA9PSAiY29udmVydGVyIikNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udmVydC5Db252ZXJ0ZXI7DQotI2VuZA0KLSNpZiAoJHByb3BlcnR5Lm5hbWUgPT0gInRleHRBbmRBY2Nlc3NLZXkiIHx8ICRwcm9wZXJ0eS5uYW1lID09ICJsYWJlbEFuZEFjY2Vzc0tleSIgfHwgJHByb3BlcnR5Lm5hbWUgPT0gInZhbHVlQW5kQWNjZXNzS2V5IikNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkaW50ZXJuYWwudGFnbGliLnV0aWwuVmlydHVhbEF0dHJpYnV0ZVV0aWxzOw0KLSNlbmQNCi0jZW5kDQotI2lmICgkYWRkTWIpDQotaW1wb3J0IGphdmF4LmZhY2VzLmVsLk1ldGhvZEJpbmRpbmc7DQotI2VuZA0KLSNpZiAoJGFkZE1lKQ0KLWltcG9ydCBqYXZheC5lbC5NZXRob2RFeHByZXNzaW9uOw0KLSNlbmQNCi0jaWYgKCRhZGRNZU1iKQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWRpbnRlcm5hbC50YWdsaWIudXRpbC5NZXRob2RFeHByZXNzaW9uTWV0aG9kQmluZGluZzsNCi0jZW5kDQotaW1wb3J0ICR7Y29tcG9uZW50LmNsYXNzTmFtZX07DQotI2lmICgke2NvbXBvbmVudC50YWdTdXBlcmNsYXNzfSkNCi1pbXBvcnQgJHtjb21wb25lbnQudGFnU3VwZXJjbGFzc307DQotI2VuZA0KLQ0KLS8vIEdlbmVyYXRlZCBmcm9tIGNsYXNzICR7Y29tcG9uZW50LnNvdXJjZUNsYXNzTmFtZX0uDQotLy8NCi0vLyBXQVJOSU5HOiBUaGlzIGZpbGUgd2FzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkLiBEbyBub3QgZWRpdCBpdCBkaXJlY3RseSwNCi0vLyAgICAgICAgICBvciB5b3Ugd2lsbCBsb3NlIHlvdXIgY2hhbmdlcy4NCi1wdWJsaWMgY2xhc3MgJHV0aWxzLmdldENsYXNzRnJvbUZ1bGxDbGFzcygkY29tcG9uZW50LnRhZ0NsYXNzKQ0KLSNpZiAoJHtjb21wb25lbnQudGFnU3VwZXJjbGFzc30pDQotICAgIGV4dGVuZHMgJHV0aWxzLmdldENsYXNzRnJvbUZ1bGxDbGFzcygke2NvbXBvbmVudC50YWdTdXBlcmNsYXNzfSkNCi0jZWxzZQ0KLSAgICBleHRlbmRzIGphdmF4LmZhY2VzLndlYmFwcC5VSUNvbXBvbmVudFRhZw0KLSNlbmQNCi17DQotDQotICAvKioNCi0gICAqIENvbnN0cnVjdCBhbiBpbnN0YW5jZSBvZiB0aGUgJHV0aWxzLmdldENsYXNzRnJvbUZ1bGxDbGFzcygkY29tcG9uZW50LnRhZ0NsYXNzKS4NCi0gICAqLw0KLSAgcHVibGljICR1dGlscy5nZXRDbGFzc0Zyb21GdWxsQ2xhc3MoJGNvbXBvbmVudC50YWdDbGFzcykoKQ0KLSAgew0KLSAgfQ0KLQ0KLSAgcHVibGljIFN0cmluZyBnZXRDb21wb25lbnRUeXBlKCkNCi0gIHsNCi0jaWYgKCRjb21wb25lbnQudHlwZSkNCi0gICAgcmV0dXJuICIkY29tcG9uZW50LnR5cGUiOw0KLSNlbHNlDQotICAgIHJldHVybiBudWxsOw0KLSNlbmQNCi0gIH0NCi0NCi0gIHB1YmxpYyBTdHJpbmcgZ2V0UmVuZGVyZXJUeXBlKCkNCi0gIHsNCi0jaWYgKCRjb21wb25lbnQucmVuZGVyZXJUeXBlICYmICEoJGNvbXBvbmVudC5yZW5kZXJlclR5cGUgPT0gIiIpKQ0KLSAgICByZXR1cm4gIiRjb21wb25lbnQucmVuZGVyZXJUeXBlIjsNCi0jZWxzZQ0KLSAgICByZXR1cm4gbnVsbDsNCi0jZW5kDQotICB9DQotDQotI2ZvcmVhY2goICRwcm9wZXJ0eSBpbiAkcHJvcGVydHlMaXN0ICkNCi0jc2V0ICgkZmllbGQgPSAkcHJvcGVydHkuZmllbGROYW1lKQ0KLSNzZXQgKCR0eXBlID0gJHV0aWxzLmdldEpzcFByb3BlcnR5VHlwZTEyKCRwcm9wZXJ0eSkpDQotIyNpZiAoJHByb3BlcnR5LmlzTGl0ZXJhbE9ubHkoKSAmJiAkcHJvcGVydHkuY2xhc3NOYW1lID09ICJib29sZWFuIikNCi0jI3NldCAoJHR5cGUgPSAiU3RyaW5nIikNCi0jI2VuZA0KLSNpZiAoJHByb3BlcnR5LmlzTWV0aG9kQmluZGluZygpKQ0KLSAgcHJpdmF0ZSBNZXRob2RFeHByZXNzaW9uICRmaWVsZDsNCi0jc2V0ICgkdmFyID0gJHV0aWxzLmdldFZhcmlhYmxlRnJvbU5hbWUoJHByb3BlcnR5Lm5hbWUpKQ0KLSAgZmluYWwgcHVibGljIHZvaWQgJHV0aWxzLmdldFByZWZpeGVkUHJvcGVydHlOYW1lKCJzZXQiLCAkcHJvcGVydHkuanNwTmFtZSkoTWV0aG9kRXhwcmVzc2lvbiAkdmFyKQ0KLSAgew0KLSAgICAkZmllbGQgPSAkdmFyOw0KLSAgfQ0KLQ0KLSNlbHNlDQotICBwcml2YXRlICR0eXBlICRmaWVsZDsNCi0jc2V0ICgkdmFyID0gJHV0aWxzLmdldFZhcmlhYmxlRnJvbU5hbWUoJHByb3BlcnR5Lm5hbWUpKQ0KLSAgZmluYWwgcHVibGljIHZvaWQgJHV0aWxzLmdldFByZWZpeGVkUHJvcGVydHlOYW1lKCJzZXQiLCAkcHJvcGVydHkuanNwTmFtZSkoJHR5cGUgJHZhcikNCi0gIHsNCi0gICAgJGZpZWxkID0gJHZhcjsNCi0gIH0NCi0NCi0jZW5kDQotI2VuZA0KLSAgQE92ZXJyaWRlDQotICBwcm90ZWN0ZWQgdm9pZCBzZXRQcm9wZXJ0aWVzKA0KLSAgICBGYWNlc0JlYW4gYmVhbikNCi0gIHsNCi0gICAgc3VwZXIuc2V0UHJvcGVydGllcyhiZWFuKTsNCi0jZm9yZWFjaCggJHByb3BlcnR5IGluICRwcm9wZXJ0eUxpc3QgKQ0KLSNzZXQgKCRmaWVsZCA9ICRwcm9wZXJ0eS5maWVsZE5hbWUpDQotI3NldCAoJHR5cGUgPSAkdXRpbHMuZ2V0Q2xhc3NGcm9tRnVsbENsYXNzKCRwcm9wZXJ0eS5jbGFzc05hbWUpKQ0KLSNzZXQgKCRrZXkgPSAkdXRpbHMuZ2V0Q29uc3RhbnROYW1lRnJvbVByb3BlcnR5KCRwcm9wZXJ0eS5uYW1lICwgIl9LRVkiKSkNCi0jaWYgKCRwcm9wZXJ0eS5uYW1lID09ICJ0ZXh0QW5kQWNjZXNzS2V5IikNCi0gICAgaWYgKF90ZXh0QW5kQWNjZXNzS2V5ICE9IG51bGwpDQotICAgIHsNCi0gICAgICBpZiAoIV90ZXh0QW5kQWNjZXNzS2V5LmlzTGl0ZXJhbFRleHQoKSkNCi0gICAgICB7DQotICAgICAgICBWaXJ0dWFsQXR0cmlidXRlVXRpbHMuc2V0QWNjZXNzS2V5QXR0cmlidXRlKA0KLSAgICAgICAgICBiZWFuLA0KLSAgICAgICAgICBfdGV4dEFuZEFjY2Vzc0tleSwNCi0gICAgICAgICAgJHt1dGlscy5nZXRDbGFzc0Zyb21GdWxsQ2xhc3MoJGNvbXBvbmVudC5jbGFzc05hbWUpfS5URVhUX0tFWSwNCi0gICAgICAgICAgJHt1dGlscy5nZXRDbGFzc0Zyb21GdWxsQ2xhc3MoJGNvbXBvbmVudC5jbGFzc05hbWUpfS5BQ0NFU1NfS0VZX0tFWSk7DQotICAgICAgfQ0KLSAgICAgIGVsc2UNCi0gICAgICB7DQotICAgICAgICBTdHJpbmcgcyA9IF90ZXh0QW5kQWNjZXNzS2V5LmdldEV4cHJlc3Npb25TdHJpbmcoKTsNCi0gICAgICAgIGlmIChzICE9IG51bGwpDQotICAgICAgICAgIFZpcnR1YWxBdHRyaWJ1dGVVdGlscy5zZXRBY2Nlc3NLZXlBdHRyaWJ1dGUoDQotICAgICAgICAgICAgYmVhbiwNCi0gICAgICAgICAgICBzLA0KLSAgICAgICAgICAgICR7dXRpbHMuZ2V0Q2xhc3NGcm9tRnVsbENsYXNzKCRjb21wb25lbnQuY2xhc3NOYW1lKX0uVEVYVF9LRVksDQotICAgICAgICAgICAgJHt1dGlscy5nZXRDbGFzc0Zyb21GdWxsQ2xhc3MoJGNvbXBvbmVudC5jbGFzc05hbWUpfS5BQ0NFU1NfS0VZX0tFWSk7DQotICAgICAgfQ0KLSAgICB9DQotI2Vsc2VpZiAoJHByb3BlcnR5Lm5hbWUgPT0gImxhYmVsQW5kQWNjZXNzS2V5IikNCi0gICAgaWYgKF9sYWJlbEFuZEFjY2Vzc0tleSAhPSBudWxsKQ0KLSAgICB7DQotICAgICAgaWYgKCFfbGFiZWxBbmRBY2Nlc3NLZXkuaXNMaXRlcmFsVGV4dCgpKQ0KLSAgICAgIHsNCi0gICAgICAgIFZpcnR1YWxBdHRyaWJ1dGVVdGlscy5zZXRBY2Nlc3NLZXlBdHRyaWJ1dGUoDQotICAgICAgICAgIGJlYW4sDQotICAgICAgICAgIF9sYWJlbEFuZEFjY2Vzc0tleSwNCi0gICAgICAgICAgJHt1dGlscy5nZXRDbGFzc0Zyb21GdWxsQ2xhc3MoJGNvbXBvbmVudC5jbGFzc05hbWUpfS5MQUJFTF9LRVksDQotICAgICAgICAgICR7dXRpbHMuZ2V0Q2xhc3NGcm9tRnVsbENsYXNzKCRjb21wb25lbnQuY2xhc3NOYW1lKX0uQUNDRVNTX0tFWV9LRVkpOw0KLSAgICAgIH0NCi0gICAgICBlbHNlDQotICAgICAgew0KLSAgICAgICAgU3RyaW5nIHMgPSBfbGFiZWxBbmRBY2Nlc3NLZXkuZ2V0RXhwcmVzc2lvblN0cmluZygpOw0KLSAgICAgICAgaWYgKHMgIT0gbnVsbCkNCi0gICAgICAgICAgVmlydHVhbEF0dHJpYnV0ZVV0aWxzLnNldEFjY2Vzc0tleUF0dHJpYnV0ZSgNCi0gICAgICAgICAgICBiZWFuLA0KLSAgICAgICAgICAgIHMsDQotICAgICAgICAgICAgJHt1dGlscy5nZXRDbGFzc0Zyb21GdWxsQ2xhc3MoJGNvbXBvbmVudC5jbGFzc05hbWUpfS5MQUJFTF9LRVksDQotICAgICAgICAgICAgJHt1dGlscy5nZXRDbGFzc0Zyb21GdWxsQ2xhc3MoJGNvbXBvbmVudC5jbGFzc05hbWUpfS5BQ0NFU1NfS0VZX0tFWSk7DQotICAgICAgfQ0KLSAgICB9DQotI2Vsc2VpZiAoJHByb3BlcnR5Lm5hbWUgPT0gInZhbHVlQW5kQWNjZXNzS2V5IikNCi0gICAgaWYgKF92YWx1ZUFuZEFjY2Vzc0tleSAhPSBudWxsKQ0KLSAgICB7DQotICAgICAgaWYgKCFfdmFsdWVBbmRBY2Nlc3NLZXkuaXNMaXRlcmFsVGV4dCgpKQ0KLSAgICAgIHsNCi0gICAgICAgIFZpcnR1YWxBdHRyaWJ1dGVVdGlscy5zZXRBY2Nlc3NLZXlBdHRyaWJ1dGUoDQotICAgICAgICAgIGJlYW4sDQotICAgICAgICAgIF92YWx1ZUFuZEFjY2Vzc0tleSwNCi0gICAgICAgICAgJHt1dGlscy5nZXRDbGFzc0Zyb21GdWxsQ2xhc3MoJGNvbXBvbmVudC5jbGFzc05hbWUpfS5WQUxVRV9LRVksDQotICAgICAgICAgICR7dXRpbHMuZ2V0Q2xhc3NGcm9tRnVsbENsYXNzKCRjb21wb25lbnQuY2xhc3NOYW1lKX0uQUNDRVNTX0tFWV9LRVkpOw0KLSAgICAgIH0NCi0gICAgICBlbHNlDQotICAgICAgew0KLSAgICAgICAgU3RyaW5nIHMgPSBfdmFsdWVBbmRBY2Nlc3NLZXkuZ2V0RXhwcmVzc2lvblN0cmluZygpOw0KLSAgICAgICAgaWYgKHMgIT0gbnVsbCkNCi0gICAgICAgICAgVmlydHVhbEF0dHJpYnV0ZVV0aWxzLnNldEFjY2Vzc0tleUF0dHJpYnV0ZSgNCi0gICAgICAgICAgICBiZWFuLA0KLSAgICAgICAgICAgIHMsDQotICAgICAgICAgICAgJHt1dGlscy5nZXRDbGFzc0Zyb21GdWxsQ2xhc3MoJGNvbXBvbmVudC5jbGFzc05hbWUpfS5WQUxVRV9LRVksDQotICAgICAgICAgICAgJHt1dGlscy5nZXRDbGFzc0Zyb21GdWxsQ2xhc3MoJGNvbXBvbmVudC5jbGFzc05hbWUpfS5BQ0NFU1NfS0VZX0tFWSk7DQotICAgICAgfQ0KLSAgICB9DQotI2Vsc2VpZiAoJHV0aWxzLmlzQ29udmVydGVyKCRwcm9wZXJ0eS5jbGFzc05hbWUpKSMjICAgICAgICAgICAgICAgICAgIDINCi0gICAgaWYgKCRmaWVsZCAhPSBudWxsKQ0KLSAgICB7DQotICAgICAgaWYgKCEke2ZpZWxkfS5pc0xpdGVyYWxUZXh0KCkpDQotICAgICAgew0KLSAgICAgICAgYmVhbi5zZXRWYWx1ZUV4cHJlc3Npb24oJHV0aWxzLmdldENsYXNzRnJvbUZ1bGxDbGFzcygke2NvbXBvbmVudC5jbGFzc05hbWV9KS4ke2tleX0sICRmaWVsZCk7DQotICAgICAgfQ0KLSAgICAgIGVsc2UNCi0gICAgICB7DQotICAgICAgICBTdHJpbmcgcyA9ICR7ZmllbGR9LmdldEV4cHJlc3Npb25TdHJpbmcoKTsNCi0gICAgICAgIGlmIChzICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgIENvbnZlcnRlciBjb252ZXJ0ZXIgPSBnZXRGYWNlc0NvbnRleHQoKS5nZXRBcHBsaWNhdGlvbigpLg0KLSAgICAgICAgICAgIGNyZWF0ZUNvbnZlcnRlcihzKTsNCi0gICAgICAgICAgYmVhbi5zZXRQcm9wZXJ0eSgkdXRpbHMuZ2V0Q2xhc3NGcm9tRnVsbENsYXNzKCR7Y29tcG9uZW50LmNsYXNzTmFtZX0pLiR7a2V5fSwgY29udmVydGVyKTsNCi0gICAgICAgIH0NCi0gICAgICB9DQotICAgIH0NCi0jZWxzZWlmICgkcHJvcGVydHkuaXNNZXRob2RFeHByZXNzaW9uKCkpDQotICAgIGJlYW4uc2V0UHJvcGVydHkoJHV0aWxzLmdldENsYXNzRnJvbUZ1bGxDbGFzcygke2NvbXBvbmVudC5jbGFzc05hbWV9KS4ke2tleX0sICRmaWVsZCk7DQotI2Vsc2VpZiAoJHByb3BlcnR5LmlzTWV0aG9kQmluZGluZygpKQ0KLSAgICBpZiAoJGZpZWxkICE9IG51bGwpDQotICAgICAgYmVhbi5zZXRQcm9wZXJ0eSgkdXRpbHMuZ2V0Q2xhc3NGcm9tRnVsbENsYXNzKCR7Y29tcG9uZW50LmNsYXNzTmFtZX0pLiR7a2V5fSwgbmV3IE1ldGhvZEV4cHJlc3Npb25NZXRob2RCaW5kaW5nKCRmaWVsZCkpOw0KLSNlbHNlaWYgKCRwcm9wZXJ0eS5pc0xpdGVyYWxPbmx5KCkpDQotICAgIGJlYW4uc2V0UHJvcGVydHkoJHV0aWxzLmdldENsYXNzRnJvbUZ1bGxDbGFzcygke2NvbXBvbmVudC5jbGFzc05hbWV9KS4ke2tleX0sICRmaWVsZCk7DQotI2Vsc2VpZiAoJHR5cGUgPT0gIlN0cmluZ1tdIikNCi0gICAgc2V0U3RyaW5nQXJyYXlQcm9wZXJ0eShiZWFuLCAkdXRpbHMuZ2V0Q2xhc3NGcm9tRnVsbENsYXNzKCR7Y29tcG9uZW50LmNsYXNzTmFtZX0pLiR7a2V5fSwgJGZpZWxkKTsNCi0jZWxzZQ0KLSAgICBzZXRQcm9wZXJ0eShiZWFuLCAkdXRpbHMuZ2V0Q2xhc3NGcm9tRnVsbENsYXNzKCR7Y29tcG9uZW50LmNsYXNzTmFtZX0pLiR7a2V5fSwgJGZpZWxkKTsNCi0jZW5kDQotI2VuZA0KLSAgfQ0KLQ0KLSAgQE92ZXJyaWRlDQotICBwdWJsaWMgdm9pZCByZWxlYXNlKCkNCi0gIHsNCi0gICAgc3VwZXIucmVsZWFzZSgpOw0KLSNmb3JlYWNoKCAkcHJvcGVydHkgaW4gJHByb3BlcnR5TGlzdCApDQotI3NldCAoJGZpZWxkID0gJHByb3BlcnR5LmZpZWxkTmFtZSkNCi0jc2V0ICgkZW1wdHkgPSAibnVsbCIpDQotI2lmICgkcHJvcGVydHkuaXNMaXRlcmFsT25seSgpICYmICRwcm9wZXJ0eS5jbGFzc05hbWUgPT0gImJvb2xlYW4iKQ0KLSAgICAkZmllbGQgPSBmYWxzZTsNCi0jZWxzZQ0KLSAgICAkZmllbGQgPSAkZW1wdHk7DQotI2VuZA0KLSNlbmQNCi0gIH0NCi19DQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvdmFsaWRhdG9yQ2xhc3MxMS52bSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL3ZhbGlkYXRvckNsYXNzMTEudm0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1ZTJhMWEuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvdmFsaWRhdG9yQ2xhc3MxMS52bQorKysgL2Rldi9udWxsCkBAIC0xLDIyMiArMCwwIEBACi0jIyBWZWxvY2l0eSB0ZW1wbGF0ZSB1c2VkIHRvIGdlbmVyYXRlIEpTRjEuMS1jb21wYXRpYmxlIHZhbGlkYXRvciBjbGFzc2VzDQotIyMgZnJvbSB2YWxpZGF0b3IgbWV0YS1kYXRhLg0KLSMjDQotIyMgTm90ZSB0aGF0IHRoZXJlIGFyZSBvbmx5IG9uZSB0eXBlIG9mIHZhbGlkYXRvciBnZW5lcmF0aW9uOg0KLSMjICAqICJzdWJjbGFzcyBtb2RlIiAodXNlIGFubm90YXRlZCBjbGFzcyBhcyBhIHBhcmVudCBjbGFzcykNCi0jIw0KLSMjIFZhcmlhYmxlICR2YWxpZGF0b3IgcmVmZXJzIHRvIGEgVmFsaWRhdG9yTWV0YSBvYmplY3QgdG8gcHJvY2Vzcw0KLSMjIFZhcmlhYmxlICR1dGlscyByZWZlcnMgdG8gYW4gaW5zdGFuY2Ugb2YgTXlmYWNlc1V0aWxzLg0KLSMjDQotIyMgV2hlbiAidGVtcGxhdGUgbW9kZSIgaXMgYmVpbmcgdXNlZCB0aGVuIHZhcmlhYmxlICRpbm5lcnNvdXJjZQ0KLSMjIGhvbGRzIGEgU3RyaW5nIGNvbnRhaW5pbmcgYWxsIHRoZSBub24tYWJzdHJhY3QgZnVuY3Rpb25zIGRlZmluZWQNCi0jIyBpbiB0aGUgYW5ub3RhdGVkIGNsYXNzLg0KLSMjDQotIyMgVGhlIGphdmEgcGFja2FnZSBvZiB0aGUgZ2VuZXJhdGVkIGNsYXNzIGlzIGFsd2F5cyB0aGUgc2FtZSBhcw0KLSMjIHRoZSBwYWNrYWdlIGluIHdoaWNoIHRoZSBhbm5vdGF0ZWQgY2xhc3MgZXhpc3RzLg0KLSMjDQotLyoNCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqIA0KLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKiANCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSAke3ZhbGlkYXRvci5wYWNrYWdlTmFtZX07DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmVsLlZhbHVlQmluZGluZzsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotJHV0aWxzLmltcG9ydFRhZ0NsYXNzZXMoJHZhbGlkYXRvcikNCi0NCi0jaWYgKCR2YWxpZGF0b3IuaXNUZW1wbGF0ZSgpKQ0KLSNzZXQgKCRnZW5lcmF0ZWRDbGFzc1BhcmVudCA9ICR2YWxpZGF0b3Iuc291cmNlQ2xhc3NQYXJlbnRDbGFzc05hbWUpDQotI2Vsc2UNCi0jc2V0ICgkZ2VuZXJhdGVkQ2xhc3NQYXJlbnQgPSAkdmFsaWRhdG9yLnNvdXJjZUNsYXNzTmFtZSkNCi0jZW5kDQotLy8gR2VuZXJhdGVkIGZyb20gY2xhc3MgJHt2YWxpZGF0b3Iuc291cmNlQ2xhc3NOYW1lfS4NCi0vLw0KLS8vIFdBUk5JTkc6IFRoaXMgZmlsZSB3YXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQuIERvIG5vdCBlZGl0IGl0IGRpcmVjdGx5LA0KLS8vICAgICAgICAgIG9yIHlvdSB3aWxsIGxvc2UgeW91ciBjaGFuZ2VzLg0KLXB1YmxpYyBjbGFzcyAke3V0aWxzLmdldENsYXNzRnJvbUZ1bGxDbGFzcygkdmFsaWRhdG9yLmNsYXNzTmFtZSl9IGV4dGVuZHMgJGdlbmVyYXRlZENsYXNzUGFyZW50DQotI2lmICgkdmFsaWRhdG9yLmltcGxlbWVudHMpDQotICAgIGltcGxlbWVudHMgJHZhbGlkYXRvci5pbXBsZW1lbnRzDQotI2VuZA0KLXsNCi0NCi0jaWYgKCR2YWxpZGF0b3IudmFsaWRhdG9ySWQpDQotICAgIHN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIFZBTElEQVRPUl9JRCA9IA0KLSAgICAgICAgIiR2YWxpZGF0b3IudmFsaWRhdG9ySWQiOw0KLSNlbmQNCi0NCi0gICAgcHVibGljICR7dXRpbHMuZ2V0Q2xhc3NGcm9tRnVsbENsYXNzKCR2YWxpZGF0b3IuY2xhc3NOYW1lKX0oKQ0KLSAgICB7DQotICAgIH0NCi0gICAgDQotI3NldCAoJHByb3BlcnR5TGlzdCA9ICR7dmFsaWRhdG9yLnByb3BlcnR5VmFsaWRhdG9yTGlzdH0pDQotDQotI2ZvcmVhY2goICRwcm9wZXJ0eSBpbiAkcHJvcGVydHlMaXN0ICkNCi0jc2V0ICgkZmllbGQgPSAkcHJvcGVydHkuZmllbGROYW1lKQ0KLSNzZXQgKCR0eXBlID0gJHV0aWxzLmdldENsYXNzRnJvbUZ1bGxDbGFzcygkcHJvcGVydHkuY2xhc3NOYW1lKSkNCi0jaWYoJHV0aWxzLmdldERlZmF1bHRWYWx1ZUZpZWxkKCRwcm9wZXJ0eSkpIA0KLSNzZXQgKCRkZWZhdWx0VmFsdWUgPSAkdXRpbHMuZ2V0RGVmYXVsdFZhbHVlRmllbGQoJHByb3BlcnR5KSkNCi0jZWxzZQ0KLSNzZXQgKCRkZWZhdWx0VmFsdWUgPSBmYWxzZSkNCi0jZW5kDQotICAgIC8vIFByb3BlcnR5OiAkcHJvcGVydHkubmFtZQ0KLSNpZiAoJHByb3BlcnR5LmlzTGl0ZXJhbE9ubHkoKSB8fCAkcHJvcGVydHkuaXNUYWdFeGNsdWRlZCgpICkNCi0gICAgcHJpdmF0ZSAkdHlwZSAkZmllbGQgI2lmKCRkZWZhdWx0VmFsdWUpID0gJGRlZmF1bHRWYWx1ZTsje2Vsc2V9OyN7ZW5kfQ0KLQ0KLSAgICAgDQotI2Vsc2UNCi0gICAgcHJpdmF0ZSAkdHlwZSAkZmllbGQ7DQotICAgIA0KLSNlbmQNCi0jaWYoJHV0aWxzLmlzUHJpbWl0aXZlQ2xhc3MoJHR5cGUpICYmICEkcHJvcGVydHkuaXNUYWdFeGNsdWRlZCgpICkNCi0gICAgcHJpdmF0ZSBib29sZWFuICR7ZmllbGR9U2V0Ow0KLSAgICANCi0jaWYgKCRwcm9wZXJ0eS5pc1NldE1ldGhvZCgpKQ0KLSAgICAkcHJvcGVydHkuc2V0TWV0aG9kU2NvcGUgYm9vbGVhbiAkdXRpbHMuZ2V0UHJlZml4ZWRQcm9wZXJ0eU5hbWUoImlzU2V0IiwgJHByb3BlcnR5Lm5hbWUpKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuICR7ZmllbGR9U2V0Ow0KLSAgICB9DQotI2VuZA0KLSNlbmQNCi0jaWYoJHByb3BlcnR5LmlzTG9jYWxNZXRob2QoKSkNCi0jaWYoImJvb2xlYW4iID09ICR0eXBlKQ0KLSNzZXQgKCRtZXRob2ROYW1lID0gJHV0aWxzLmdldFByZWZpeGVkUHJvcGVydHlOYW1lKCJpc0xvY2FsIiwgJHByb3BlcnR5Lm5hbWUpKQ0KLSNlbHNlDQotI3NldCAoJG1ldGhvZE5hbWUgPSAkdXRpbHMuZ2V0UHJlZml4ZWRQcm9wZXJ0eU5hbWUoImdldExvY2FsIiwgJHByb3BlcnR5Lm5hbWUpKQ0KLSNlbmQNCi0gICAgZmluYWwgJHByb3BlcnR5LmxvY2FsTWV0aG9kU2NvcGUgJHR5cGUgJHttZXRob2ROYW1lfSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAkZmllbGQ7DQotICAgIH0NCi0gICAgIA0KLSNlbmQNCi0gICAgcHVibGljICR0eXBlICR1dGlscy5nZXRNZXRob2RSZWFkZXJGcm9tUHJvcGVydHkoJHByb3BlcnR5Lm5hbWUsICR0eXBlKSgpDQotICAgIHsNCi0jaWYgKCRwcm9wZXJ0eS5pc1RhZ0V4Y2x1ZGVkKCkgfHwgJHByb3BlcnR5LmlzTGl0ZXJhbE9ubHkoKSkNCi0gICAgICAgIHJldHVybiAkZmllbGQ7DQotI2Vsc2UNCi0jaWYgKCR1dGlscy5pc1ByaW1pdGl2ZUNsYXNzKCR0eXBlKSkNCi0gICAgICAgIGlmICgke2ZpZWxkfVNldCkNCi0jZWxzZQ0KLSAgICAgICAgaWYgKCRmaWVsZCAhPSBudWxsKQ0KLSNlbmQNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gJGZpZWxkOw0KLSAgICAgICAgfQ0KLSAgICAgICAgVmFsdWVCaW5kaW5nIHZiID0gZ2V0VmFsdWVCaW5kaW5nKCIkcHJvcGVydHkubmFtZSIpOw0KLSAgICAgICAgaWYgKHZiICE9IG51bGwpDQotICAgICAgICB7DQotI2lmICgkdXRpbHMuaXNQcmltaXRpdmVDbGFzcygkdHlwZSkpDQotICAgICAgICAgICAgcmV0dXJuICgkdXRpbHMuY2FzdElmTmVjZXNzYXJ5KCR0eXBlKSB2Yi5nZXRWYWx1ZShnZXRGYWNlc0NvbnRleHQoKSkpLiR7dHlwZX1WYWx1ZSgpOw0KLSNlbHNlDQotI3NldCAoJHByaXR5cGUgPSAkdXRpbHMuZ2V0UHJpbWl0aXZlVHlwZSgkcHJvcGVydHkuY2xhc3NOYW1lKSkNCi0jaWYgKCR1dGlscy5pc1ByaW1pdGl2ZUNsYXNzKCRwcml0eXBlKSkNCi0gICAgICAgICAgICBPYmplY3QgdmFsdWUgPSB2YiA9PSBudWxsID8gbnVsbCA6IHZiLmdldFZhbHVlKGdldEZhY2VzQ29udGV4dCgpKTsNCi0gICAgICAgICAgICBpZiAoISh2YWx1ZSBpbnN0YW5jZW9mICR0eXBlKSl7DQotICAgICAgICAgICAgICAgIHZhbHVlID0gJHt0eXBlfS52YWx1ZU9mKHZhbHVlLnRvU3RyaW5nKCkpOw0KLSAgICAgICAgICAgIH0gICAgICAgICAgICANCi0gICAgICAgICAgICByZXR1cm4gJHV0aWxzLmNhc3RJZk5lY2Vzc2FyeSgkdHlwZSkgdmFsdWU7DQotI2Vsc2UNCi0gICAgICAgICAgICByZXR1cm4gJHV0aWxzLmNhc3RJZk5lY2Vzc2FyeSgkdHlwZSkgdmIuZ2V0VmFsdWUoZ2V0RmFjZXNDb250ZXh0KCkpOw0KLSNlbmQNCi0jZW5kDQotICAgICAgICB9DQotI2lmICgkZGVmYXVsdFZhbHVlKQ0KLSAgICAgICAgcmV0dXJuICRkZWZhdWx0VmFsdWU7IA0KLSNlbHNlaWYgKCR1dGlscy5pc1ByaW1pdGl2ZUNsYXNzKCR0eXBlKSkNCi0gICAgICAgIHJldHVybiAkdXRpbHMucHJpbWl0aXZlRGVmYXVsdFZhbHVlKCR0eXBlKTsNCi0jZWxzZSAgICAgICANCi0gICAgICAgIHJldHVybiBudWxsOw0KLSNlbmQNCi0jZW5kDQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgJHV0aWxzLmdldFByZWZpeGVkUHJvcGVydHlOYW1lKCJzZXQiLCAkcHJvcGVydHkubmFtZSkoJHR5cGUgJHV0aWxzLmdldFZhcmlhYmxlRnJvbU5hbWUoJHByb3BlcnR5Lm5hbWUpKQ0KLSAgICB7DQotICAgICAgICB0aGlzLiRmaWVsZCA9ICR1dGlscy5nZXRWYXJpYWJsZUZyb21OYW1lKCRwcm9wZXJ0eS5uYW1lKTsNCi0jaWYgKCR1dGlscy5pc1ByaW1pdGl2ZUNsYXNzKCR0eXBlKSAmJiAhJHByb3BlcnR5LmlzVGFnRXhjbHVkZWQoKSApDQotICAgICAgICB0aGlzLiR7ZmllbGR9U2V0ID0gdHJ1ZTsgICAgICAgIA0KLSNlbmQNCi0gICAgfQ0KLSNlbmQNCi0NCi0gICAgcHVibGljIE9iamVjdCBzYXZlU3RhdGUoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCkNCi0gICAgew0KLSNzZXQgKCRwcmltaXRpdmVDb3VudCA9ICRwcm9wZXJ0eUxpc3Quc2l6ZSgpICsgMSkNCi0jZm9yZWFjaCggJHByb3BlcnR5IGluICRwcm9wZXJ0eUxpc3QgKQ0KLSNpZigkdXRpbHMuaXNQcmltaXRpdmVDbGFzcygkcHJvcGVydHkuY2xhc3NOYW1lKSkNCi0jc2V0ICgkcHJpbWl0aXZlQ291bnQgPSAkcHJpbWl0aXZlQ291bnQgKyAxKQ0KLSNlbmQNCi0jZW5kDQotICAgICAgICBPYmplY3RbXSB2YWx1ZXMgPSBuZXcgT2JqZWN0WyRwcmltaXRpdmVDb3VudF07DQotICAgICAgICB2YWx1ZXNbMF0gPSBzdXBlci5zYXZlU3RhdGUoZmFjZXNDb250ZXh0KTsNCi0jc2V0ICgkYXJyYXlJbmRleCA9IDApDQotI2ZvcmVhY2goICRwcm9wZXJ0eSBpbiAkcHJvcGVydHlMaXN0ICkNCi0jc2V0ICgkZmllbGQgPSAkcHJvcGVydHkuZmllbGROYW1lKQ0KLSNzZXQgKCR0eXBlID0gJHByb3BlcnR5LmNsYXNzTmFtZSkNCi0jc2V0ICgkYXJyYXlJbmRleCA9ICRhcnJheUluZGV4ICsgMSkNCi0jaWYgKCRwcm9wZXJ0eS5qc3BOYW1lID09ICJ2YWxpZGF0b3IiICYmICRwcm9wZXJ0eS5pc01ldGhvZEJpbmRpbmcoKSApDQotICAgICAgICB2YWx1ZXNbJGFycmF5SW5kZXhdID0gc2F2ZUF0dGFjaGVkU3RhdGUoZmFjZXNDb250ZXh0LCR7ZmllbGR9TGlzdCk7DQotI2Vsc2VpZiAoICRwcm9wZXJ0eS5pc1N0YXRlSG9sZGVyKCkgKSMjIHx8ICR1dGlscy5pc0NvbnZlcnRlcigkdHlwZSkNCi0gICAgICAgIHZhbHVlc1skYXJyYXlJbmRleF0gPSBzYXZlQXR0YWNoZWRTdGF0ZShmYWNlc0NvbnRleHQsJGZpZWxkKTsNCi0jZWxzZWlmKCR1dGlscy5pc1ByaW1pdGl2ZUNsYXNzKCR0eXBlKSkNCi0jaWYgKCR0eXBlID09ICJib29sZWFuIikNCi0gICAgICAgIHZhbHVlc1skYXJyYXlJbmRleF0gPSAke3V0aWxzLmdldEJveGVkQ2xhc3MoJHR5cGUpfS52YWx1ZU9mKCRmaWVsZCk7DQotI2Vsc2UNCi0gICAgICAgIHZhbHVlc1skYXJyYXlJbmRleF0gPSBuZXcgJHt1dGlscy5nZXRCb3hlZENsYXNzKCR0eXBlKX0oJGZpZWxkKTsNCi0jZW5kDQotI2Vsc2UNCi0gICAgICAgIHZhbHVlc1skYXJyYXlJbmRleF0gPSAkZmllbGQ7DQotI2VuZA0KLSNpZigkdXRpbHMuaXNQcmltaXRpdmVDbGFzcygkdHlwZSkgJiYgISRwcm9wZXJ0eS5pc1RhZ0V4Y2x1ZGVkKCkpDQotI3NldCAoJGFycmF5SW5kZXggPSAkYXJyYXlJbmRleCArIDEpDQotICAgICAgICB2YWx1ZXNbJGFycmF5SW5kZXhdID0gQm9vbGVhbi52YWx1ZU9mKCR7ZmllbGR9U2V0KTsNCi0jZW5kDQotI2VuZA0KLSAgICAgICAgcmV0dXJuIHZhbHVlczsgDQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgcmVzdG9yZVN0YXRlKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIE9iamVjdCBzdGF0ZSkNCi0gICAgew0KLSAgICAgICAgT2JqZWN0W10gdmFsdWVzID0gKE9iamVjdFtdKXN0YXRlOw0KLSAgICAgICAgc3VwZXIucmVzdG9yZVN0YXRlKGZhY2VzQ29udGV4dCx2YWx1ZXNbMF0pOw0KLSNzZXQgKCRhcnJheUluZGV4ID0gMCkNCi0jZm9yZWFjaCggJHByb3BlcnR5IGluICRwcm9wZXJ0eUxpc3QgKQ0KLSNzZXQgKCRmaWVsZCA9ICRwcm9wZXJ0eS5maWVsZE5hbWUpDQotI3NldCAoJHR5cGUgPSAkcHJvcGVydHkuY2xhc3NOYW1lKQ0KLSNzZXQgKCRhcnJheUluZGV4ID0gJGFycmF5SW5kZXggKyAxKQ0KLSNpZiAoICRwcm9wZXJ0eS5pc1N0YXRlSG9sZGVyKCkgKQ0KLSNpZiAoJHByb3BlcnR5LmpzcE5hbWUgPT0gInZhbGlkYXRvciIgJiYgJHByb3BlcnR5LmlzTWV0aG9kQmluZGluZygpICkNCi0gICAgICAgICR7ZmllbGR9TGlzdCA9IChMaXN0PFZhbGlkYXRvcj4pIHJlc3RvcmVBdHRhY2hlZFN0YXRlKGZhY2VzQ29udGV4dCx2YWx1ZXNbJGFycmF5SW5kZXhdKTsNCi0jZWxzZWlmICgkdXRpbHMuaXNMaXN0KCR0eXBlKSkNCi0gICAgICAgICRmaWVsZCA9IChMaXN0KSByZXN0b3JlQXR0YWNoZWRTdGF0ZShmYWNlc0NvbnRleHQsdmFsdWVzWyRhcnJheUluZGV4XSk7DQotI2Vsc2UNCi0gICAgICAgICRmaWVsZCA9ICR1dGlscy5jYXN0SWZOZWNlc3NhcnkoJHR5cGUpIHJlc3RvcmVBdHRhY2hlZFN0YXRlKGZhY2VzQ29udGV4dCx2YWx1ZXNbJGFycmF5SW5kZXhdKTsgDQotI2VuZA0KLSNlbHNlaWYgKCR1dGlscy5pc0NvbnZlcnRlcigkdHlwZSkpIA0KLSAgICAgICAgJGZpZWxkID0gKENvbnZlcnRlcikgcmVzdG9yZUF0dGFjaGVkU3RhdGUoZmFjZXNDb250ZXh0LHZhbHVlc1skYXJyYXlJbmRleF0pOw0KLSNlbHNlaWYgKCR1dGlscy5pc1ByaW1pdGl2ZUNsYXNzKCR0eXBlKSkNCi0gICAgICAgICRmaWVsZCA9ICgkdXRpbHMuY2FzdElmTmVjZXNzYXJ5KCR0eXBlKSB2YWx1ZXNbJGFycmF5SW5kZXhdKS4ke3R5cGV9VmFsdWUoKTsNCi0jZWxzZQ0KLSAgICAgICAgJGZpZWxkID0gJHV0aWxzLmNhc3RJZk5lY2Vzc2FyeSgkdHlwZSkgdmFsdWVzWyRhcnJheUluZGV4XTsNCi0jZW5kDQotI2lmKCR1dGlscy5pc1ByaW1pdGl2ZUNsYXNzKCR0eXBlKSAmJiAhJHByb3BlcnR5LmlzVGFnRXhjbHVkZWQoKSApDQotI3NldCAoJGFycmF5SW5kZXggPSAkYXJyYXlJbmRleCArIDEpDQotICAgICAgICAke2ZpZWxkfVNldCA9ICgoQm9vbGVhbikgdmFsdWVzWyRhcnJheUluZGV4XSkuYm9vbGVhblZhbHVlKCk7DQotI2VuZA0KLSNlbmQNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi92YWxpZGF0b3JDbGFzc01hY3JvczExLnZtIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvdmFsaWRhdG9yQ2xhc3NNYWNyb3MxMS52bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODM2MmRlNy4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi92YWxpZGF0b3JDbGFzc01hY3JvczExLnZtCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi0jIyBNYWNybyBkZWZpbml0aW9ucyBmb3IgY29tcG9uZW50IGNsYXNzIGRlZmluaXRpb24NCi0jIw0KLSMjIFZlbG9jaXR5IG1hY3JvcyBkZWZpbmVkIGluIHRoaXMgZmlsZSB3aWxsIGJlIGF2YWlsYWJsZSB3aGVuIGV4ZWN1dGluZw0KLSMjIHRoZSBjb21wb25lbnRDbGFzczExLnZtIHRlbXBsYXRlIGZpbGUuClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYveGRvYy1iZWhhdmlvci52bSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL3hkb2MtYmVoYXZpb3Iudm0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzMzQ5ZjQuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYveGRvYy1iZWhhdmlvci52bQorKysgL2Rldi9udWxsCkBAIC0xLDExNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgPz4NCi08ZG9jdW1lbnQ+DQotIDxwcm9wZXJ0aWVzPg0KLSAgPHRpdGxlPiZsdDske2JlaGF2aW9yLm5hbWV9Jmd0OzwvdGl0bGU+DQotIDwvcHJvcGVydGllcz4NCi0gPGJvZHk+DQotICA8c2VjdGlvbiBuYW1lPSJTdW1tYXJ5Ij4NCi0gIDxwPg0KLSAgIDxiPlRhZyBuYW1lOjwvYj4gJmx0OyR7YmVoYXZpb3IubmFtZX0mZ3Q7DQotICAgPGJyLz4NCi0jc2V0ICgkamF2YWRvY1BhdGggPSAiLi4vYXBpZG9jcy8iICsgJGJlaGF2aW9yLmdldENsYXNzTmFtZSgpLnJlcGxhY2UoJy4nLCAnLycpICkNCi0gICA8Yj5Db252ZXJ0ZXIgY2xhc3M6PC9iPiA8YSBocmVmPSIke3RhZ2RvY1V0aWxzLnBsYXRmb3JtQWdub3N0aWNQYXRoKCAkamF2YWRvY1BhdGggKX0uaHRtbCI+JHtiZWhhdmlvci5jbGFzc05hbWV9PC9hPg0KLSAgIDxici8+DQotI2lmICgkYmVoYXZpb3IudGFnQ2xhc3MpDQotI3NldCAoJGphdmFkb2NQYXRoID0gIi4uL2FwaWRvY3MvIiArICRiZWhhdmlvci5nZXRUYWdDbGFzcygpLnJlcGxhY2UoJy4nLCAnLycpICkNCi0gICA8Yj5UYWcgY2xhc3M6PC9iPiA8YSBocmVmPSIke3RhZ2RvY1V0aWxzLnBsYXRmb3JtQWdub3N0aWNQYXRoKCAkamF2YWRvY1BhdGggKX0uaHRtbCI+JHtiZWhhdmlvci50YWdDbGFzc308L2E+DQotICAgPGJyLz4NCi0jZW5kDQotI2lmICgkZmFjZWxldFRhZykNCi0gICA8Yj5GYWNlbGV0IFRhZyBIYW5kbGVyOjwvYj4gPGEgaHJlZj0iJHt0YWdkb2NVdGlscy5wbGF0Zm9ybUFnbm9zdGljUGF0aCggJGphdmFkb2NQYXRoICl9Lmh0bWwiPiR7ZmFjZWxldFRhZy5jbGFzc05hbWV9PC9hPg0KLSAgIDxici8+ICANCi0jZW5kDQotICAgPGI+YmVoYXZpb3IgaWQ6PC9iPiAke2JlaGF2aW9yLmJlaGF2aW9ySWR9DQotICAgPGJyLz4NCi0ke2JlaGF2aW9yLmxvbmdEZXNjcmlwdGlvbn0gICANCi0gIDwvcD4NCi0gIDwvc2VjdGlvbj4NCi0jaWYgKCRiYXNlQ29udGVudCkNCi0kYmFzZUNvbnRlbnQNCi0jZW5kDQotI3NldCAoJHByb3BlcnR5TGlzdCA9ICR7dGFnZG9jVXRpbHMuZ2V0U29ydGVkUHJvcGVydHlMaXN0KCRiZWhhdmlvcil9KQ0KLSNpZiAoJHByb3BlcnR5TGlzdC5zaXplKCkgIT0gMCkgIA0KLSAgPHNlY3Rpb24gbmFtZT0iQXR0cmlidXRlcyI+DQotPHRhYmxlPg0KLSA8dHI+DQotICA8dGg+TmFtZTwvdGg+DQotICA8dGg+VHlwZTwvdGg+DQotICA8dGg+U3VwcG9ydHMgRUw/PC90aD4NCi0gIDx0aD5EZXNjcmlwdGlvbjwvdGg+DQotIDwvdHI+DQotI2ZvcmVhY2goICRwcm9wZXJ0eSBpbiAkcHJvcGVydHlMaXN0ICkNCi0jaWYgKCEkcHJvcGVydHkuaXNUYWdFeGNsdWRlZCgpKQ0KLSA8dHI+DQotICA8dGQ+JHByb3BlcnR5LmpzcE5hbWU8L3RkPg0KLSNzZXQgKCR0eXBlID0gJHt0YWdkb2NVdGlscy5nZXREaXNwbGF5VHlwZSgkYmVoYXZpb3IuY2xhc3NOYW1lLCRwcm9wZXJ0eS5qc3BOYW1lLCRwcm9wZXJ0eS5jbGFzc05hbWUpfSkNCi0gIDx0ZD4kdHlwZTwvdGQ+DQotI2lmICgkcHJvcGVydHkuanNwTmFtZSA9PSAiYWN0aW9uIikNCi0gIDx0ZD5ZZXM8L3RkPg0KLSNlbHNlaWYgKCRwcm9wZXJ0eS5pc01ldGhvZEJpbmRpbmcoKSB8fCAkcHJvcGVydHkuaXNNZXRob2RFeHByZXNzaW9uKCkpDQotICA8dGQ+T25seSBFTDwvdGQ+DQotI2Vsc2VpZiAoJHByb3BlcnR5LmpzcE5hbWUgPT0gImJpbmRpbmciKQ0KLSAgPHRkPk9ubHkgRUw8L3RkPg0KLSNlbHNlaWYgKCRwcm9wZXJ0eS5pc0xpdGVyYWxPbmx5KCkpDQotICA8dGQ+Tm88L3RkPg0KLSNlbHNlDQotICA8dGQ+WWVzPC90ZD4NCi0jZW5kDQotI2lmICgkcHJvcGVydHkubG9uZ0Rlc2NyaXB0aW9uKQ0KLSAgPHRkPiRwcm9wZXJ0eS5sb25nRGVzY3JpcHRpb248L3RkPg0KLSNlbHNlDQotICA8dGQ+PC90ZD4NCi0jZW5kDQotIDwvdHI+DQotI2VuZA0KLSNlbmQNCi08L3RhYmxlPg0KLSAgPC9zZWN0aW9uPg0KLSNlbmQNCi0jaWYgKCRmYWNlbGV0VGFnKQ0KLSNzZXQgKCRhdHRyaWJ1dGVMaXN0ID0gJHt0YWdkb2NVdGlscy5nZXRTb3J0ZWRBdHRyaWJ1dGVMaXN0KCRmYWNlbGV0VGFnKX0pDQotI2lmICgkYXR0cmlidXRlTGlzdC5zaXplKCkgIT0gMCkgIA0KLSAgPHNlY3Rpb24gbmFtZT0iRmFjZWxldHMgQXR0cmlidXRlcyI+DQotPHRhYmxlPg0KLSA8dHI+DQotICA8dGg+TmFtZTwvdGg+DQotICA8dGg+VHlwZTwvdGg+DQotICA8dGg+UmVxdWlyZWQ8L3RoPg0KLSAgPHRoPkRlc2NyaXB0aW9uPC90aD4NCi0gPC90cj4NCi0jZm9yZWFjaCggJGF0dHJpYnV0ZSBpbiAkYXR0cmlidXRlTGlzdCApDQotI2lmICghJGF0dHJpYnV0ZS5pc1RhZ0V4Y2x1ZGVkKCkgJiYgJGF0dHJpYnV0ZS5pc0ZhY2VsZXRzT25seSgpKQ0KLSA8dHI+DQotICA8dGQ+JGF0dHJpYnV0ZS5uYW1lPC90ZD4NCi0jc2V0ICgkdHlwZSA9ICR7dGFnZG9jVXRpbHMuZ2V0RGlzcGxheVR5cGUoJGZhY2VsZXRUYWcuY2xhc3NOYW1lLCRhdHRyaWJ1dGUubmFtZSwkYXR0cmlidXRlLmNsYXNzTmFtZSl9KQ0KLSAgPHRkPiR0eXBlPC90ZD4NCi0gIDx0ZD4kYXR0cmlidXRlLmlzUmVxdWlyZWQoKTwvdGQ+DQotI2lmICgkYXR0cmlidXRlLmxvbmdEZXNjcmlwdGlvbikNCi0gIDx0ZD4kYXR0cmlidXRlLmxvbmdEZXNjcmlwdGlvbjwvdGQ+DQotI2Vsc2UNCi0gIDx0ZD48L3RkPg0KLSNlbmQNCi0gPC90cj4NCi0jZW5kDQotI2VuZA0KLTwvdGFibGU+DQotICA8L3NlY3Rpb24+DQotI2VuZA0KLSNlbHNlaWYgKCRqc2YyMCkNCi0gICAgICA8c2VjdGlvbiBuYW1lPSJGYWNlbGV0cyBBdHRyaWJ1dGVzIj4NCi08dGFibGU+DQotIDx0cj4NCi0gIDx0aD5OYW1lPC90aD4NCi0gIDx0aD5UeXBlPC90aD4NCi0gIDx0aD5SZXF1aXJlZDwvdGg+DQotICA8dGg+RGVzY3JpcHRpb248L3RoPg0KLSA8L3RyPg0KLSA8dHI+DQotICA8dGQ+Zm9yPC90ZD4NCi0gIDx0ZD5TdHJpbmc8L3RkPg0KLSAgPHRkPmZhbHNlPC90ZD4NCi0gIDx0ZD48L3RkPg0KLSA8L3RyPg0KLTwvdGFibGU+DQotICA8L3NlY3Rpb24+DQotI2VuZA0KLSA8L2JvZHk+IA0KLTwvZG9jdW1lbnQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYveGRvYy1jb21wb25lbnQudm0gYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi94ZG9jLWNvbXBvbmVudC52bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzg1NThkYS4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi94ZG9jLWNvbXBvbmVudC52bQorKysgL2Rldi9udWxsCkBAIC0xLDE4NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgPz4NCi08ZG9jdW1lbnQ+DQotIDxwcm9wZXJ0aWVzPg0KLSAgPHRpdGxlPiZsdDske2NvbXBvbmVudC5uYW1lfSZndDs8L3RpdGxlPg0KLSA8L3Byb3BlcnRpZXM+DQotIDxib2R5Pg0KLSAgPHNlY3Rpb24gbmFtZT0iU3VtbWFyeSI+DQotICA8cD4NCi0gICA8Yj5UYWcgbmFtZTo8L2I+ICZsdDske2NvbXBvbmVudC5uYW1lfSZndDsNCi0gICA8YnIvPg0KLSNzZXQgKCRqYXZhZG9jUGF0aCA9ICIuLi9hcGlkb2NzLyIgKyAkY29tcG9uZW50LmdldENsYXNzTmFtZSgpLnJlcGxhY2UoJy4nLCAnLycpICkNCi0gICA8Yj5VSUNvbXBvbmVudCBjbGFzczo8L2I+IDxhIGhyZWY9IiR7dGFnZG9jVXRpbHMucGxhdGZvcm1BZ25vc3RpY1BhdGgoICRqYXZhZG9jUGF0aCApfS5odG1sIj4ke2NvbXBvbmVudC5jbGFzc05hbWV9PC9hPg0KLSAgIDxici8+DQotI2lmICgkY29tcG9uZW50LnRhZ0NsYXNzKQ0KLSNzZXQgKCRqYXZhZG9jUGF0aCA9ICIuLi9hcGlkb2NzLyIgKyAkY29tcG9uZW50LmdldFRhZ0NsYXNzKCkucmVwbGFjZSgnLicsICcvJykgKQ0KLSAgIDxiPlRhZyBjbGFzczo8L2I+IDxhIGhyZWY9IiR7dGFnZG9jVXRpbHMucGxhdGZvcm1BZ25vc3RpY1BhdGgoICRqYXZhZG9jUGF0aCApfS5odG1sIj4ke2NvbXBvbmVudC50YWdDbGFzc308L2E+DQotICAgPGJyLz4NCi0jZW5kDQotI2lmICgkZmFjZWxldFRhZykNCi0gICA8Yj5GYWNlbGV0IFRhZyBIYW5kbGVyOjwvYj4gPGEgaHJlZj0iJHt0YWdkb2NVdGlscy5wbGF0Zm9ybUFnbm9zdGljUGF0aCggJGphdmFkb2NQYXRoICl9Lmh0bWwiPiR7ZmFjZWxldFRhZy5jbGFzc05hbWV9PC9hPg0KLSAgIDxici8+ICANCi0jZW5kDQotICAgPGI+Q29tcG9uZW50IHR5cGU6PC9iPiAke2NvbXBvbmVudC50eXBlfQ0KLSAgIDxici8+DQotICAgPGI+Q29tcG9uZW50IGZhbWlseTo8L2I+ICR7Y29tcG9uZW50LmZhbWlseX0NCi0gICA8YnIvPg0KLSNpZiAoJHtjb21wb25lbnQucmVuZGVyZXJUeXBlfSkNCi0gICA8Yj5SZW5kZXJlciB0eXBlOjwvYj4gJHtjb21wb25lbnQucmVuZGVyZXJUeXBlfQ0KLSAgIDxici8+DQotI3NldCAoJHJlbmRlcmVyQ2xhc3NlcyA9ICR0YWdkb2NVdGlscy5nZXRSZW5kZXJlckNsYXNzZXMoJGNvbXBvbmVudCwkbW9kZWwpLnZhbHVlcygpICkNCi0jZm9yZWFjaCAoJHJlbmRlcmVyQ2xhc3MgaW4gJHJlbmRlcmVyQ2xhc3NlcykNCi0jc2V0ICgkamF2YWRvY1BhdGggPSAiLi4vYXBpZG9jcy8iICsgJHJlbmRlcmVyQ2xhc3MucmVwbGFjZSgnLicsICcvJykgKQ0KLSAgIDxiPlJlbmRlcmVyIGNsYXNzOjwvYj4gPGEgaHJlZj0iJHt0YWdkb2NVdGlscy5wbGF0Zm9ybUFnbm9zdGljUGF0aCggJGphdmFkb2NQYXRoICl9Lmh0bWwiPiR7cmVuZGVyZXJDbGFzc308L2E+DQotICAgPGJyLz4NCi0jZW5kDQotI2VuZA0KLSAgIDxici8+ICAgICAgDQotJHtjb21wb25lbnQubG9uZ0Rlc2NyaXB0aW9ufSAgIA0KLSAgPC9wPg0KLSAgPC9zZWN0aW9uPg0KLSNpZiAoJGJhc2VDb250ZW50KQ0KLSRiYXNlQ29udGVudA0KLSNlbmQNCi0jc2V0KCRmYWNldExpc3QgPSAke3RhZ2RvY1V0aWxzLmdldFNvcnRlZEZhY2V0TGlzdCgkY29tcG9uZW50KX0pDQotI2lmICgkZmFjZXRMaXN0LnNpemUoKSAhPSAwKQ0KLSAgPHNlY3Rpb24gbmFtZT0iU3VwcG9ydGVkIEZhY2V0cyI+DQotICAgPHA+DQotICAgPHRhYmxlPg0KLSAgICA8dHI+DQotICAgICA8dGg+TmFtZTwvdGg+DQotICAgICA8dGg+UmVxdWlyZWQ8L3RoPg0KLSAgICAgPHRoPkRlc2NyaXB0aW9uPC90aD4NCi0gICAgPC90cj4NCi0jZm9yZWFjaCggJGZhY2V0IGluICRmYWNldExpc3QgKQ0KLSAgICA8dHI+DQotICAgICA8dGQ+JGZhY2V0Lm5hbWU8L3RkPg0KLSAgICAgPHRkPiRmYWNldC5pc1JlcXVpcmVkKCk8L3RkPg0KLSNpZiAoJGZhY2V0LmxvbmdEZXNjcmlwdGlvbikNCi0gICAgIDx0ZD4kZmFjZXQubG9uZ0Rlc2NyaXB0aW9uPC90ZD4NCi0jZWxzZQ0KLSAgICAgPHRkPjwvdGQ+DQotI2VuZCAgICAgDQotICAgIDwvdHI+DQotI2VuZA0KLSAgIDwvdGFibGU+DQotICAgPC9wPg0KLSAgPC9zZWN0aW9uPg0KLSNlbmQNCi0jc2V0KCRsaXN0ZW5lckxpc3QgPSAke3RhZ2RvY1V0aWxzLmdldFNvcnRlZExpc3RlbmVyTGlzdCgkY29tcG9uZW50KX0pDQotI2lmICgkbGlzdGVuZXJMaXN0LnNpemUoKSAhPSAwKQ0KLSAgPHNlY3Rpb24gbmFtZT0iU3VwcG9ydGVkIExpc3RlbmVycyI+DQotICAgPHA+DQotICAgPHRhYmxlPg0KLSAgICA8dHI+DQotICAgICA8dGg+TmFtZTwvdGg+DQotICAgICA8dGg+TGlzdGVuZXI8L3RoPg0KLSAgICAgPHRoPkV2ZW50PC90aD4NCi0gICAgIDx0aD5QaGFzZXM8L3RoPg0KLSAgICAgPHRoPlJlcXVpcmVkPC90aD4NCi0gICAgIDx0aD5EZXNjcmlwdGlvbjwvdGg+DQotICAgIDwvdHI+DQotI2ZvcmVhY2goICRsaXN0ZW5lciBpbiAkbGlzdGVuZXJMaXN0ICkNCi0gICAgPHRyPg0KLSNpZiAoJGxpc3RlbmVyLm5hbWUpDQotICAgICA8dGQ+JGxpc3RlbmVyLm5hbWU8L3RkPg0KLSNlbHNlDQotICAgICA8dGQ+PC90ZD4NCi0jZW5kDQotI2lmICgkbGlzdGVuZXIuY2xhc3NOYW1lKQ0KLSAgICA8dGQ+JGxpc3RlbmVyLmNsYXNzTmFtZTwvdGQ+DQotI2Vsc2UNCi0gICAgPHRkPjwvdGQ+DQotI2VuZA0KLSNpZiAoJGxpc3RlbmVyLmV2ZW50Q2xhc3NOYW1lKQ0KLSAgICA8dGQ+JGxpc3RlbmVyLmV2ZW50Q2xhc3NOYW1lPC90ZD4NCi0jZWxzZQ0KLSAgICA8dGQ+PC90ZD4NCi0jZW5kDQotI2lmICgkbGlzdGVuZXIucGhhc2VzKQ0KLSAgICAgPHRkPiRsaXN0ZW5lci5waGFzZXM8L3RkPg0KLSNlbHNlDQotICAgICA8dGQ+PC90ZD4NCi0jZW5kDQotICAgICA8dGQ+JGxpc3RlbmVyLmlzUmVxdWlyZWQoKTwvdGQ+DQotI2lmICgkbGlzdGVuZXIubG9uZ0Rlc2NyaXB0aW9uKQ0KLSAgICAgPHRkPiRsaXN0ZW5lci5sb25nRGVzY3JpcHRpb248L3RkPg0KLSNlbHNlDQotICAgICA8dGQ+PC90ZD4NCi0jZW5kICAgICANCi0gICAgPC90cj4NCi0jZW5kDQotICAgPC90YWJsZT4NCi0gICA8L3A+DQotICA8L3NlY3Rpb24+DQotI2VuZCAgDQotI3NldCAoJHByb3BlcnR5TGlzdCA9ICR7dGFnZG9jVXRpbHMuZ2V0U29ydGVkUHJvcGVydHlMaXN0KCRjb21wb25lbnQpfSkNCi0jaWYgKCRwcm9wZXJ0eUxpc3Quc2l6ZSgpICE9IDApICANCi0gIDxzZWN0aW9uIG5hbWU9IkF0dHJpYnV0ZXMiPg0KLTx0YWJsZT4NCi0gPHRyPg0KLSAgPHRoPk5hbWU8L3RoPg0KLSAgPHRoPlR5cGU8L3RoPg0KLSAgPHRoPlN1cHBvcnRzIEVMPzwvdGg+DQotICA8dGg+RGVzY3JpcHRpb248L3RoPg0KLSA8L3RyPg0KLSNmb3JlYWNoKCAkcHJvcGVydHkgaW4gJHByb3BlcnR5TGlzdCApDQotI2lmICghJHByb3BlcnR5LmlzVGFnRXhjbHVkZWQoKSkNCi0gPHRyPg0KLSAgPHRkPiRwcm9wZXJ0eS5qc3BOYW1lPC90ZD4NCi0jc2V0ICgkdHlwZSA9ICR7dGFnZG9jVXRpbHMuZ2V0RGlzcGxheVR5cGUoJGNvbXBvbmVudC5jbGFzc05hbWUsJHByb3BlcnR5LmpzcE5hbWUsJHByb3BlcnR5LmNsYXNzTmFtZSl9KQ0KLSAgPHRkPiR0eXBlPC90ZD4NCi0jaWYgKCRwcm9wZXJ0eS5qc3BOYW1lID09ICJhY3Rpb24iKQ0KLSAgPHRkPlllczwvdGQ+DQotI2Vsc2VpZiAoJHByb3BlcnR5LmlzTWV0aG9kQmluZGluZygpIHx8ICRwcm9wZXJ0eS5pc01ldGhvZEV4cHJlc3Npb24oKSkNCi0gIDx0ZD5Pbmx5IEVMPC90ZD4NCi0jZWxzZWlmICgkcHJvcGVydHkuanNwTmFtZSA9PSAiYmluZGluZyIpDQotICA8dGQ+T25seSBFTDwvdGQ+DQotI2Vsc2VpZiAoJHByb3BlcnR5LmlzTGl0ZXJhbE9ubHkoKSkNCi0gIDx0ZD5ObzwvdGQ+DQotI2Vsc2UNCi0gIDx0ZD5ZZXM8L3RkPg0KLSNlbmQNCi0jaWYgKCRwcm9wZXJ0eS5sb25nRGVzY3JpcHRpb24pDQotICA8dGQ+JHByb3BlcnR5LmxvbmdEZXNjcmlwdGlvbjwvdGQ+DQotI2Vsc2UNCi0gIDx0ZD48L3RkPg0KLSNlbmQNCi0gPC90cj4NCi0jZW5kDQotI2VuZA0KLTwvdGFibGU+DQotICA8L3NlY3Rpb24+DQotI2VuZA0KLSNpZiAoJGZhY2VsZXRUYWcpDQotI3NldCAoJGF0dHJpYnV0ZUxpc3QgPSAke3RhZ2RvY1V0aWxzLmdldFNvcnRlZEF0dHJpYnV0ZUxpc3QoJGZhY2VsZXRUYWcpfSkNCi0jaWYgKCRhdHRyaWJ1dGVMaXN0LnNpemUoKSAhPSAwKSAgDQotICA8c2VjdGlvbiBuYW1lPSJGYWNlbGV0cyBBdHRyaWJ1dGVzIj4NCi08dGFibGU+DQotIDx0cj4NCi0gIDx0aD5OYW1lPC90aD4NCi0gIDx0aD5UeXBlPC90aD4NCi0gIDx0aD5SZXF1aXJlZDwvdGg+DQotICA8dGg+RGVzY3JpcHRpb248L3RoPg0KLSA8L3RyPg0KLSNmb3JlYWNoKCAkYXR0cmlidXRlIGluICRhdHRyaWJ1dGVMaXN0ICkNCi0jaWYgKCEkYXR0cmlidXRlLmlzVGFnRXhjbHVkZWQoKSAmJiAkYXR0cmlidXRlLmlzRmFjZWxldHNPbmx5KCkpDQotIDx0cj4NCi0gIDx0ZD4kYXR0cmlidXRlLm5hbWU8L3RkPg0KLSNzZXQgKCR0eXBlID0gJHt0YWdkb2NVdGlscy5nZXREaXNwbGF5VHlwZSgkZmFjZWxldFRhZy5jbGFzc05hbWUsJGF0dHJpYnV0ZS5uYW1lLCRhdHRyaWJ1dGUuY2xhc3NOYW1lKX0pDQotICA8dGQ+JHR5cGU8L3RkPg0KLSAgPHRkPiRhdHRyaWJ1dGUuaXNSZXF1aXJlZCgpPC90ZD4NCi0jaWYgKCRhdHRyaWJ1dGUubG9uZ0Rlc2NyaXB0aW9uKQ0KLSAgPHRkPiRhdHRyaWJ1dGUubG9uZ0Rlc2NyaXB0aW9uPC90ZD4NCi0jZWxzZQ0KLSAgPHRkPjwvdGQ+DQotI2VuZA0KLSA8L3RyPg0KLSNlbmQNCi0jZW5kDQotPC90YWJsZT4NCi0gIDwvc2VjdGlvbj4NCi0jZW5kDQotI2VuZA0KLSA8L2JvZHk+IA0KLTwvZG9jdW1lbnQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYveGRvYy1jb252ZXJ0ZXIudm0gYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi94ZG9jLWNvbnZlcnRlci52bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjA0NDU2Mi4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi94ZG9jLWNvbnZlcnRlci52bQorKysgL2Rldi9udWxsCkBAIC0xLDExNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgPz4NCi08ZG9jdW1lbnQ+DQotIDxwcm9wZXJ0aWVzPg0KLSAgPHRpdGxlPiZsdDske2NvbnZlcnRlci5uYW1lfSZndDs8L3RpdGxlPg0KLSA8L3Byb3BlcnRpZXM+DQotIDxib2R5Pg0KLSAgPHNlY3Rpb24gbmFtZT0iU3VtbWFyeSI+DQotICA8cD4NCi0gICA8Yj5UYWcgbmFtZTo8L2I+ICZsdDske2NvbnZlcnRlci5uYW1lfSZndDsNCi0gICA8YnIvPg0KLSNzZXQgKCRqYXZhZG9jUGF0aCA9ICIuLi9hcGlkb2NzLyIgKyAkY29udmVydGVyLmdldENsYXNzTmFtZSgpLnJlcGxhY2UoJy4nLCAnLycpICkNCi0gICA8Yj5Db252ZXJ0ZXIgY2xhc3M6PC9iPiA8YSBocmVmPSIke3RhZ2RvY1V0aWxzLnBsYXRmb3JtQWdub3N0aWNQYXRoKCAkamF2YWRvY1BhdGggKX0uaHRtbCI+JHtjb252ZXJ0ZXIuY2xhc3NOYW1lfTwvYT4NCi0gICA8YnIvPg0KLSNpZiAoJGNvbnZlcnRlci50YWdDbGFzcykNCi0jc2V0ICgkamF2YWRvY1BhdGggPSAiLi4vYXBpZG9jcy8iICsgJGNvbnZlcnRlci5nZXRUYWdDbGFzcygpLnJlcGxhY2UoJy4nLCAnLycpICkNCi0gICA8Yj5UYWcgY2xhc3M6PC9iPiA8YSBocmVmPSIke3RhZ2RvY1V0aWxzLnBsYXRmb3JtQWdub3N0aWNQYXRoKCAkamF2YWRvY1BhdGggKX0uaHRtbCI+JHtjb252ZXJ0ZXIudGFnQ2xhc3N9PC9hPg0KLSAgIDxici8+DQotI2VuZA0KLSNpZiAoJGZhY2VsZXRUYWcpDQotICAgPGI+RmFjZWxldCBUYWcgSGFuZGxlcjo8L2I+IDxhIGhyZWY9IiR7dGFnZG9jVXRpbHMucGxhdGZvcm1BZ25vc3RpY1BhdGgoICRqYXZhZG9jUGF0aCApfS5odG1sIj4ke2ZhY2VsZXRUYWcuY2xhc3NOYW1lfTwvYT4NCi0gICA8YnIvPiAgDQotI2VuZA0KLSAgIDxiPmNvbnZlcnRlciBpZDo8L2I+ICR7Y29udmVydGVyLmNvbnZlcnRlcklkfQ0KLSAgIDxici8+DQotJHtjb252ZXJ0ZXIubG9uZ0Rlc2NyaXB0aW9ufSAgIA0KLSAgPC9wPg0KLSAgPC9zZWN0aW9uPg0KLSNpZiAoJGJhc2VDb250ZW50KQ0KLSRiYXNlQ29udGVudA0KLSNlbmQNCi0jc2V0ICgkcHJvcGVydHlMaXN0ID0gJHt0YWdkb2NVdGlscy5nZXRTb3J0ZWRQcm9wZXJ0eUxpc3QoJGNvbnZlcnRlcil9KQ0KLSNpZiAoJHByb3BlcnR5TGlzdC5zaXplKCkgIT0gMCkgIA0KLSAgPHNlY3Rpb24gbmFtZT0iQXR0cmlidXRlcyI+DQotPHRhYmxlPg0KLSA8dHI+DQotICA8dGg+TmFtZTwvdGg+DQotICA8dGg+VHlwZTwvdGg+DQotICA8dGg+U3VwcG9ydHMgRUw/PC90aD4NCi0gIDx0aD5EZXNjcmlwdGlvbjwvdGg+DQotIDwvdHI+DQotI2ZvcmVhY2goICRwcm9wZXJ0eSBpbiAkcHJvcGVydHlMaXN0ICkNCi0jaWYgKCEkcHJvcGVydHkuaXNUYWdFeGNsdWRlZCgpKQ0KLSA8dHI+DQotICA8dGQ+JHByb3BlcnR5LmpzcE5hbWU8L3RkPg0KLSNzZXQgKCR0eXBlID0gJHt0YWdkb2NVdGlscy5nZXREaXNwbGF5VHlwZSgkY29udmVydGVyLmNsYXNzTmFtZSwkcHJvcGVydHkuanNwTmFtZSwkcHJvcGVydHkuY2xhc3NOYW1lKX0pDQotICA8dGQ+JHR5cGU8L3RkPg0KLSNpZiAoJHByb3BlcnR5LmpzcE5hbWUgPT0gImFjdGlvbiIpDQotICA8dGQ+WWVzPC90ZD4NCi0jZWxzZWlmICgkcHJvcGVydHkuaXNNZXRob2RCaW5kaW5nKCkgfHwgJHByb3BlcnR5LmlzTWV0aG9kRXhwcmVzc2lvbigpKQ0KLSAgPHRkPk9ubHkgRUw8L3RkPg0KLSNlbHNlaWYgKCRwcm9wZXJ0eS5qc3BOYW1lID09ICJiaW5kaW5nIikNCi0gIDx0ZD5Pbmx5IEVMPC90ZD4NCi0jZWxzZWlmICgkcHJvcGVydHkuaXNMaXRlcmFsT25seSgpKQ0KLSAgPHRkPk5vPC90ZD4NCi0jZWxzZQ0KLSAgPHRkPlllczwvdGQ+DQotI2VuZA0KLSNpZiAoJHByb3BlcnR5LmxvbmdEZXNjcmlwdGlvbikNCi0gIDx0ZD4kcHJvcGVydHkubG9uZ0Rlc2NyaXB0aW9uPC90ZD4NCi0jZWxzZQ0KLSAgPHRkPjwvdGQ+DQotI2VuZA0KLSA8L3RyPg0KLSNlbmQNCi0jZW5kDQotPC90YWJsZT4NCi0gIDwvc2VjdGlvbj4NCi0jZW5kDQotI2lmICgkZmFjZWxldFRhZykNCi0jc2V0ICgkYXR0cmlidXRlTGlzdCA9ICR7dGFnZG9jVXRpbHMuZ2V0U29ydGVkQXR0cmlidXRlTGlzdCgkZmFjZWxldFRhZyl9KQ0KLSNpZiAoJGF0dHJpYnV0ZUxpc3Quc2l6ZSgpICE9IDApICANCi0gIDxzZWN0aW9uIG5hbWU9IkZhY2VsZXRzIEF0dHJpYnV0ZXMiPg0KLTx0YWJsZT4NCi0gPHRyPg0KLSAgPHRoPk5hbWU8L3RoPg0KLSAgPHRoPlR5cGU8L3RoPg0KLSAgPHRoPlJlcXVpcmVkPC90aD4NCi0gIDx0aD5EZXNjcmlwdGlvbjwvdGg+DQotIDwvdHI+DQotI2ZvcmVhY2goICRhdHRyaWJ1dGUgaW4gJGF0dHJpYnV0ZUxpc3QgKQ0KLSNpZiAoISRhdHRyaWJ1dGUuaXNUYWdFeGNsdWRlZCgpJiYgJGF0dHJpYnV0ZS5pc0ZhY2VsZXRzT25seSgpKQ0KLSA8dHI+DQotICA8dGQ+JGF0dHJpYnV0ZS5uYW1lPC90ZD4NCi0jc2V0ICgkdHlwZSA9ICR7dGFnZG9jVXRpbHMuZ2V0RGlzcGxheVR5cGUoJGZhY2VsZXRUYWcuY2xhc3NOYW1lLCRhdHRyaWJ1dGUubmFtZSwkYXR0cmlidXRlLmNsYXNzTmFtZSl9KQ0KLSAgPHRkPiR0eXBlPC90ZD4NCi0gIDx0ZD4kYXR0cmlidXRlLmlzUmVxdWlyZWQoKTwvdGQ+DQotI2lmICgkYXR0cmlidXRlLmxvbmdEZXNjcmlwdGlvbikNCi0gIDx0ZD4kYXR0cmlidXRlLmxvbmdEZXNjcmlwdGlvbjwvdGQ+DQotI2Vsc2UNCi0gIDx0ZD48L3RkPg0KLSNlbmQNCi0gPC90cj4NCi0jZW5kDQotI2VuZA0KLTwvdGFibGU+DQotICA8L3NlY3Rpb24+DQotI2VuZA0KLSNlbHNlaWYgKCRqc2YyMCkNCi0gICAgICA8c2VjdGlvbiBuYW1lPSJGYWNlbGV0cyBBdHRyaWJ1dGVzIj4NCi08dGFibGU+DQotIDx0cj4NCi0gIDx0aD5OYW1lPC90aD4NCi0gIDx0aD5UeXBlPC90aD4NCi0gIDx0aD5SZXF1aXJlZDwvdGg+DQotICA8dGg+RGVzY3JpcHRpb248L3RoPg0KLSA8L3RyPg0KLSA8dHI+DQotICA8dGQ+Zm9yPC90ZD4NCi0gIDx0ZD5TdHJpbmc8L3RkPg0KLSAgPHRkPmZhbHNlPC90ZD4NCi0gIDx0ZD48L3RkPg0KLSA8L3RyPg0KLTwvdGFibGU+DQotICA8L3NlY3Rpb24+DQotI2VuZA0KLSA8L2JvZHk+IA0KLTwvZG9jdW1lbnQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYveGRvYy1mYWNlbGV0LXRhZy52bSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL3hkb2MtZmFjZWxldC10YWcudm0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmZjM5ZDAuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYveGRvYy1mYWNlbGV0LXRhZy52bQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiA/Pg0KLTxkb2N1bWVudD4NCi0gPHByb3BlcnRpZXM+DQotICA8dGl0bGU+Jmx0OyR7ZmFjZWxldFRhZy5uYW1lfSZndDs8L3RpdGxlPg0KLSA8L3Byb3BlcnRpZXM+DQotIDxib2R5Pg0KLSAgPHNlY3Rpb24gbmFtZT0iU3VtbWFyeSI+DQotICA8cD4NCi0gICA8Yj5GYWNlbGV0IFRhZyBuYW1lOjwvYj4gJmx0OyR7ZmFjZWxldFRhZy5uYW1lfSZndDsNCi0gICA8YnIvPg0KLSNzZXQgKCRqYXZhZG9jUGF0aCA9ICIuLi9hcGlkb2NzLyIgKyAkZmFjZWxldFRhZy5nZXRDbGFzc05hbWUoKS5yZXBsYWNlKCcuJywgJy8nKSApDQotICAgPGI+RmFjZWxldCBUYWcgY2xhc3M6PC9iPiA8YSBocmVmPSIke3RhZ2RvY1V0aWxzLnBsYXRmb3JtQWdub3N0aWNQYXRoKCAkamF2YWRvY1BhdGggKX0uaHRtbCI+JHtmYWNlbGV0VGFnLmNsYXNzTmFtZX08L2E+DQotICAgPGJyLz4NCi0ke2ZhY2VsZXRUYWcubG9uZ0Rlc2NyaXB0aW9ufSAgIA0KLSAgPC9wPg0KLSAgPC9zZWN0aW9uPg0KLSNpZiAoJGJhc2VDb250ZW50KQ0KLSRiYXNlQ29udGVudA0KLSNlbmQNCi0jc2V0ICgkYXR0cmlidXRlTGlzdCA9ICR7dGFnZG9jVXRpbHMuZ2V0U29ydGVkQXR0cmlidXRlTGlzdCgkZmFjZWxldFRhZyl9KQ0KLSNpZiAoJGF0dHJpYnV0ZUxpc3Quc2l6ZSgpICE9IDApICANCi0gIDxzZWN0aW9uIG5hbWU9IkF0dHJpYnV0ZXMiPg0KLTx0YWJsZT4NCi0gPHRyPg0KLSAgPHRoPk5hbWU8L3RoPg0KLSAgPHRoPlR5cGU8L3RoPg0KLSAgPHRoPlJlcXVpcmVkPC90aD4NCi0gIDx0aD5EZXNjcmlwdGlvbjwvdGg+DQotIDwvdHI+DQotI2ZvcmVhY2goICRhdHRyaWJ1dGUgaW4gJGF0dHJpYnV0ZUxpc3QgKQ0KLSNpZiAoISRhdHRyaWJ1dGUuaXNUYWdFeGNsdWRlZCgpKQ0KLSA8dHI+DQotICA8dGQ+JGF0dHJpYnV0ZS5uYW1lPC90ZD4NCi0jc2V0ICgkdHlwZSA9ICR7dGFnZG9jVXRpbHMuZ2V0RGlzcGxheVR5cGUoJGZhY2VsZXRUYWcuY2xhc3NOYW1lLCRhdHRyaWJ1dGUubmFtZSwkYXR0cmlidXRlLmNsYXNzTmFtZSl9KQ0KLSAgPHRkPiR0eXBlPC90ZD4NCi0gIDx0ZD4kYXR0cmlidXRlLmlzUmVxdWlyZWQoKTwvdGQ+DQotI2lmICgkYXR0cmlidXRlLmxvbmdEZXNjcmlwdGlvbikNCi0gIDx0ZD4kYXR0cmlidXRlLmxvbmdEZXNjcmlwdGlvbjwvdGQ+DQotI2Vsc2UNCi0gIDx0ZD48L3RkPg0KLSNlbmQNCi0gPC90cj4NCi0jZW5kDQotI2VuZA0KLTwvdGFibGU+DQotICA8L3NlY3Rpb24+DQotI2VuZA0KLSA8L2JvZHk+IA0KLTwvZG9jdW1lbnQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYveGRvYy10YWcudm0gYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi94ZG9jLXRhZy52bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjEzMjI2Zi4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi94ZG9jLXRhZy52bQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiA/Pg0KLTxkb2N1bWVudD4NCi0gPHByb3BlcnRpZXM+DQotICA8dGl0bGU+Jmx0OyR7dGFnLm5hbWV9Jmd0OzwvdGl0bGU+DQotIDwvcHJvcGVydGllcz4NCi0gPGJvZHk+DQotICA8c2VjdGlvbiBuYW1lPSJTdW1tYXJ5Ij4NCi0gIDxwPg0KLSAgIDxiPlRhZyBuYW1lOjwvYj4gJmx0OyR7dGFnLm5hbWV9Jmd0Ow0KLSAgIDxici8+DQotI3NldCAoJGphdmFkb2NQYXRoID0gIi4uL2FwaWRvY3MvIiArICR0YWcuZ2V0Q2xhc3NOYW1lKCkucmVwbGFjZSgnLicsICcvJykgKQ0KLSAgIDxiPlRhZyBjbGFzczo8L2I+IDxhIGhyZWY9IiR7dGFnZG9jVXRpbHMucGxhdGZvcm1BZ25vc3RpY1BhdGgoICRqYXZhZG9jUGF0aCApfS5odG1sIj4ke3RhZy5jbGFzc05hbWV9PC9hPg0KLSAgIDxici8+DQotI2lmICgkZmFjZWxldFRhZykNCi0gICA8Yj5GYWNlbGV0IFRhZyBIYW5kbGVyOjwvYj4gPGEgaHJlZj0iJHt0YWdkb2NVdGlscy5wbGF0Zm9ybUFnbm9zdGljUGF0aCggJGphdmFkb2NQYXRoICl9Lmh0bWwiPiR7ZmFjZWxldFRhZy5jbGFzc05hbWV9PC9hPg0KLSAgIDxici8+ICANCi0jZW5kDQotJHt0YWcubG9uZ0Rlc2NyaXB0aW9ufSAgIA0KLSAgPC9wPg0KLSAgPC9zZWN0aW9uPg0KLSNpZiAoJGJhc2VDb250ZW50KQ0KLSRiYXNlQ29udGVudA0KLSNlbmQNCi0jc2V0ICgkYXR0cmlidXRlTGlzdCA9ICR7dGFnZG9jVXRpbHMuZ2V0U29ydGVkQXR0cmlidXRlTGlzdCgkdGFnKX0pDQotI2lmICgkYXR0cmlidXRlTGlzdC5zaXplKCkgIT0gMCkgIA0KLSAgPHNlY3Rpb24gbmFtZT0iQXR0cmlidXRlcyI+DQotPHRhYmxlPg0KLSA8dHI+DQotICA8dGg+TmFtZTwvdGg+DQotICA8dGg+VHlwZTwvdGg+DQotICA8dGg+UmVxdWlyZWQ8L3RoPg0KLSAgPHRoPkRlc2NyaXB0aW9uPC90aD4NCi0gPC90cj4NCi0jZm9yZWFjaCggJGF0dHJpYnV0ZSBpbiAkYXR0cmlidXRlTGlzdCApDQotI2lmICghJGF0dHJpYnV0ZS5pc1RhZ0V4Y2x1ZGVkKCkpDQotIDx0cj4NCi0gIDx0ZD4kYXR0cmlidXRlLm5hbWU8L3RkPg0KLSNzZXQgKCR0eXBlID0gJHt0YWdkb2NVdGlscy5nZXREaXNwbGF5VHlwZSgkdGFnLmNsYXNzTmFtZSwkYXR0cmlidXRlLm5hbWUsJGF0dHJpYnV0ZS5jbGFzc05hbWUpfSkNCi0gIDx0ZD4kdHlwZTwvdGQ+DQotICA8dGQ+JGF0dHJpYnV0ZS5pc1JlcXVpcmVkKCk8L3RkPg0KLSNpZiAoJGF0dHJpYnV0ZS5sb25nRGVzY3JpcHRpb24pDQotICA8dGQ+JGF0dHJpYnV0ZS5sb25nRGVzY3JpcHRpb248L3RkPg0KLSNlbHNlDQotICA8dGQ+PC90ZD4NCi0jZW5kDQotIDwvdHI+DQotI2VuZA0KLSNlbmQNCi08L3RhYmxlPg0KLSAgPC9zZWN0aW9uPg0KLSNlbmQNCi0jaWYgKCRmYWNlbGV0VGFnKQ0KLSNzZXQgKCRhdHRyaWJ1dGVMaXN0ID0gJHt0YWdkb2NVdGlscy5nZXRTb3J0ZWRBdHRyaWJ1dGVMaXN0KCRmYWNlbGV0VGFnKX0pDQotI2lmICgkYXR0cmlidXRlTGlzdC5zaXplKCkgIT0gMCkgIA0KLSAgPHNlY3Rpb24gbmFtZT0iRmFjZWxldHMgQXR0cmlidXRlcyI+DQotPHRhYmxlPg0KLSA8dHI+DQotICA8dGg+TmFtZTwvdGg+DQotICA8dGg+VHlwZTwvdGg+DQotICA8dGg+UmVxdWlyZWQ8L3RoPg0KLSAgPHRoPkRlc2NyaXB0aW9uPC90aD4NCi0gPC90cj4NCi0jZm9yZWFjaCggJGF0dHJpYnV0ZSBpbiAkYXR0cmlidXRlTGlzdCApDQotI2lmICghJGF0dHJpYnV0ZS5pc1RhZ0V4Y2x1ZGVkKCkgJiYgJGF0dHJpYnV0ZS5pc0ZhY2VsZXRzT25seSgpKQ0KLSA8dHI+DQotICA8dGQ+JGF0dHJpYnV0ZS5uYW1lPC90ZD4NCi0jc2V0ICgkdHlwZSA9ICR7dGFnZG9jVXRpbHMuZ2V0RGlzcGxheVR5cGUoJGZhY2VsZXRUYWcuY2xhc3NOYW1lLCRhdHRyaWJ1dGUubmFtZSwkYXR0cmlidXRlLmNsYXNzTmFtZSl9KQ0KLSAgPHRkPiR0eXBlPC90ZD4NCi0gIDx0ZD4kYXR0cmlidXRlLmlzUmVxdWlyZWQoKTwvdGQ+DQotI2lmICgkYXR0cmlidXRlLmxvbmdEZXNjcmlwdGlvbikNCi0gIDx0ZD4kYXR0cmlidXRlLmxvbmdEZXNjcmlwdGlvbjwvdGQ+DQotI2Vsc2UNCi0gIDx0ZD48L3RkPg0KLSNlbmQNCi0gPC90cj4NCi0jZW5kDQotI2VuZA0KLTwvdGFibGU+DQotICA8L3NlY3Rpb24+DQotI2VuZA0KLSNlbmQNCi0gPC9ib2R5PiANCi08L2RvY3VtZW50PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL3hkb2MtdmFsaWRhdG9yLnZtIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYveGRvYy12YWxpZGF0b3Iudm0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0MTE4ZjkuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYveGRvYy12YWxpZGF0b3Iudm0KKysrIC9kZXYvbnVsbApAQCAtMSwxMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiID8+DQotPGRvY3VtZW50Pg0KLSA8cHJvcGVydGllcz4NCi0gIDx0aXRsZT4mbHQ7JHt2YWxpZGF0b3IubmFtZX0mZ3Q7PC90aXRsZT4NCi0gPC9wcm9wZXJ0aWVzPg0KLSA8Ym9keT4NCi0gIDxzZWN0aW9uIG5hbWU9IlN1bW1hcnkiPg0KLSAgPHA+DQotICAgPGI+VGFnIG5hbWU6PC9iPiAmbHQ7JHt2YWxpZGF0b3IubmFtZX0mZ3Q7DQotICAgPGJyLz4NCi0jc2V0ICgkamF2YWRvY1BhdGggPSAiLi4vYXBpZG9jcy8iICsgJHZhbGlkYXRvci5nZXRDbGFzc05hbWUoKS5yZXBsYWNlKCcuJywgJy8nKSApDQotICAgPGI+VmFsaWRhdG9yIGNsYXNzOjwvYj4gPGEgaHJlZj0iJHt0YWdkb2NVdGlscy5wbGF0Zm9ybUFnbm9zdGljUGF0aCggJGphdmFkb2NQYXRoICl9Lmh0bWwiPiR7dmFsaWRhdG9yLmNsYXNzTmFtZX08L2E+DQotICAgPGJyLz4NCi0jaWYgKCR2YWxpZGF0b3IudGFnQ2xhc3MpDQotI3NldCAoJGphdmFkb2NQYXRoID0gIi4uL2FwaWRvY3MvIiArICR2YWxpZGF0b3IuZ2V0VGFnQ2xhc3MoKS5yZXBsYWNlKCcuJywgJy8nKSApDQotICAgPGI+VGFnIGNsYXNzOjwvYj4gPGEgaHJlZj0iJHt0YWdkb2NVdGlscy5wbGF0Zm9ybUFnbm9zdGljUGF0aCggJGphdmFkb2NQYXRoICl9Lmh0bWwiPiR7dmFsaWRhdG9yLnRhZ0NsYXNzfTwvYT4NCi0gICA8YnIvPg0KLSNlbmQNCi0jaWYgKCRmYWNlbGV0VGFnKQ0KLSAgIDxiPkZhY2VsZXQgVGFnIEhhbmRsZXI6PC9iPiA8YSBocmVmPSIke3RhZ2RvY1V0aWxzLnBsYXRmb3JtQWdub3N0aWNQYXRoKCAkamF2YWRvY1BhdGggKX0uaHRtbCI+JHtmYWNlbGV0VGFnLmNsYXNzTmFtZX08L2E+DQotICAgPGJyLz4gIA0KLSNlbmQNCi0gICA8Yj52YWxpZGF0b3IgaWQ6PC9iPiAke3ZhbGlkYXRvci52YWxpZGF0b3JJZH0NCi0gICA8YnIvPg0KLSR7dmFsaWRhdG9yLmxvbmdEZXNjcmlwdGlvbn0gICANCi0gIDwvcD4NCi0gIDwvc2VjdGlvbj4NCi0jaWYgKCRiYXNlQ29udGVudCkNCi0kYmFzZUNvbnRlbnQNCi0jZW5kDQotI3NldCAoJHByb3BlcnR5TGlzdCA9ICR7dGFnZG9jVXRpbHMuZ2V0U29ydGVkUHJvcGVydHlMaXN0KCR2YWxpZGF0b3IpfSkNCi0jaWYgKCRwcm9wZXJ0eUxpc3Quc2l6ZSgpICE9IDApICANCi0gIDxzZWN0aW9uIG5hbWU9IkF0dHJpYnV0ZXMiPg0KLTx0YWJsZT4NCi0gPHRyPg0KLSAgPHRoPk5hbWU8L3RoPg0KLSAgPHRoPlR5cGU8L3RoPg0KLSAgPHRoPlN1cHBvcnRzIEVMPzwvdGg+DQotICA8dGg+RGVzY3JpcHRpb248L3RoPg0KLSA8L3RyPg0KLSNmb3JlYWNoKCAkcHJvcGVydHkgaW4gJHByb3BlcnR5TGlzdCApDQotI2lmICghJHByb3BlcnR5LmlzVGFnRXhjbHVkZWQoKSkNCi0gPHRyPg0KLSAgPHRkPiRwcm9wZXJ0eS5qc3BOYW1lPC90ZD4NCi0jc2V0ICgkdHlwZSA9ICR7dGFnZG9jVXRpbHMuZ2V0RGlzcGxheVR5cGUoJHZhbGlkYXRvci5jbGFzc05hbWUsJHByb3BlcnR5LmpzcE5hbWUsJHByb3BlcnR5LmNsYXNzTmFtZSl9KQ0KLSAgPHRkPiR0eXBlPC90ZD4NCi0jaWYgKCRwcm9wZXJ0eS5qc3BOYW1lID09ICJhY3Rpb24iKQ0KLSAgPHRkPlllczwvdGQ+DQotI2Vsc2VpZiAoJHByb3BlcnR5LmlzTWV0aG9kQmluZGluZygpIHx8ICRwcm9wZXJ0eS5pc01ldGhvZEV4cHJlc3Npb24oKSkNCi0gIDx0ZD5Pbmx5IEVMPC90ZD4NCi0jZWxzZWlmICgkcHJvcGVydHkuanNwTmFtZSA9PSAiYmluZGluZyIpDQotICA8dGQ+T25seSBFTDwvdGQ+DQotI2Vsc2VpZiAoJHByb3BlcnR5LmlzTGl0ZXJhbE9ubHkoKSkNCi0gIDx0ZD5ObzwvdGQ+DQotI2Vsc2UNCi0gIDx0ZD5ZZXM8L3RkPg0KLSNlbmQNCi0jaWYgKCRwcm9wZXJ0eS5sb25nRGVzY3JpcHRpb24pDQotICA8dGQ+JHByb3BlcnR5LmxvbmdEZXNjcmlwdGlvbjwvdGQ+DQotI2Vsc2UNCi0gIDx0ZD48L3RkPg0KLSNlbmQNCi0gPC90cj4NCi0jZW5kDQotI2VuZA0KLTwvdGFibGU+DQotICA8L3NlY3Rpb24+DQotI2VuZA0KLSNpZiAoJGZhY2VsZXRUYWcpDQotI3NldCAoJGF0dHJpYnV0ZUxpc3QgPSAke3RhZ2RvY1V0aWxzLmdldFNvcnRlZEF0dHJpYnV0ZUxpc3QoJGZhY2VsZXRUYWcpfSkNCi0jaWYgKCRhdHRyaWJ1dGVMaXN0LnNpemUoKSAhPSAwKSAgDQotICA8c2VjdGlvbiBuYW1lPSJGYWNlbGV0cyBBdHRyaWJ1dGVzIj4NCi08dGFibGU+DQotIDx0cj4NCi0gIDx0aD5OYW1lPC90aD4NCi0gIDx0aD5UeXBlPC90aD4NCi0gIDx0aD5SZXF1aXJlZDwvdGg+DQotICA8dGg+RGVzY3JpcHRpb248L3RoPg0KLSA8L3RyPg0KLSNmb3JlYWNoKCAkYXR0cmlidXRlIGluICRhdHRyaWJ1dGVMaXN0ICkNCi0jaWYgKCEkYXR0cmlidXRlLmlzVGFnRXhjbHVkZWQoKSAmJiAkYXR0cmlidXRlLmlzRmFjZWxldHNPbmx5KCkpDQotIDx0cj4NCi0gIDx0ZD4kYXR0cmlidXRlLm5hbWU8L3RkPg0KLSNzZXQgKCR0eXBlID0gJHt0YWdkb2NVdGlscy5nZXREaXNwbGF5VHlwZSgkZmFjZWxldFRhZy5jbGFzc05hbWUsJGF0dHJpYnV0ZS5uYW1lLCRhdHRyaWJ1dGUuY2xhc3NOYW1lKX0pDQotICA8dGQ+JHR5cGU8L3RkPg0KLSAgPHRkPiRhdHRyaWJ1dGUuaXNSZXF1aXJlZCgpPC90ZD4NCi0jaWYgKCRhdHRyaWJ1dGUubG9uZ0Rlc2NyaXB0aW9uKQ0KLSAgPHRkPiRhdHRyaWJ1dGUubG9uZ0Rlc2NyaXB0aW9uPC90ZD4NCi0jZWxzZQ0KLSAgPHRkPjwvdGQ+DQotI2VuZA0KLSA8L3RyPg0KLSNlbmQNCi0jZW5kDQotPC90YWJsZT4NCi0gIDwvc2VjdGlvbj4NCi0jZW5kDQotI2Vsc2VpZiAoJGpzZjIwKQ0KLSAgICAgIDxzZWN0aW9uIG5hbWU9IkZhY2VsZXRzIEF0dHJpYnV0ZXMiPg0KLTx0YWJsZT4NCi0gPHRyPg0KLSAgPHRoPk5hbWU8L3RoPg0KLSAgPHRoPlR5cGU8L3RoPg0KLSAgPHRoPlJlcXVpcmVkPC90aD4NCi0gIDx0aD5EZXNjcmlwdGlvbjwvdGg+DQotIDwvdHI+DQotIDx0cj4NCi0gIDx0ZD5mb3I8L3RkPg0KLSAgPHRkPlN0cmluZzwvdGQ+DQotICA8dGQ+ZmFsc2U8L3RkPg0KLSAgPHRkPjwvdGQ+DQotIDwvdHI+DQotPC90YWJsZT4NCi0gIDwvc2VjdGlvbj4NCi0jZW5kDQotIDwvYm9keT4gDQotPC9kb2N1bWVudD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi94ZG9jLXdlYi1jb25maWcudm0gYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi94ZG9jLXdlYi1jb25maWcudm0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyNTUwMmQuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYveGRvYy13ZWItY29uZmlnLnZtCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiID8+DQotPGRvY3VtZW50Pg0KLSA8cHJvcGVydGllcz4NCi0gIDx0aXRsZT5XZWIgQ29udGV4dCBQYXJhbXM8L3RpdGxlPg0KLSA8L3Byb3BlcnRpZXM+DQotIDxib2R5Pg0KLSAgPHNlY3Rpb24gbmFtZT0iU3VtbWFyeSI+DQotICA8cD4NCi0gIEJlbG93IGlzIHRoZSBsaXN0IG9mIGF2YWlsYWJsZSB3ZWIgY29udGV4dCBwYXJhbWV0ZXJzIHN1cHBvcnRlZDogDQotICA8L3A+DQotICA8L3NlY3Rpb24+DQotI2lmICgkYmFzZUNvbnRlbnQpDQotJGJhc2VDb250ZW50DQotI2VuZA0KLSAgPHNlY3Rpb24gbmFtZT0iV2ViIENvbnRleHQgUGFyYW1ldGVycyI+DQotI3NldCAoJHdlYkNvbmZpZ0xpc3QgPSAke21vZGVsLmdldFdlYkNvbmZpZ3MoKX0pDQotI2ZvcmVhY2goICR3ZWJDb25maWcgaW4gJHdlYkNvbmZpZ0xpc3QgKQ0KLSNpZiAoJG1vZGVsSWRzLmNvbnRhaW5zKCR3ZWJDb25maWcubW9kZWxJZCkpDQotPHA+QXJ0aWZhY3QgSWQ6ICR3ZWJDb25maWcubW9kZWxJZDwvcD4NCi0jc2V0ICgkd2ViQ29uZmlnUGFyYW1MaXN0ID0gJHt3ZWJDb25maWcuZ2V0V2ViQ29uZmlnUGFyYW1ldGVyc0xpc3QoKX0pDQotPHRhYmxlPg0KLSA8dHI+DQotICA8dGg+TmFtZTwvdGg+DQotICA8dGg+RGVmYXVsdCBWYWx1ZTwvdGg+DQotICA8dGg+RXhwZWN0ZWQgVmFsdWVzPC90aD4NCi0gIDx0aD5TaW5jZTwvdGg+DQotICA8dGg+RGVzY3JpcHRpb248L3RoPg0KLSAgPHRoPlNvdXJjZSBDbGFzczwvdGg+DQotIDwvdHI+DQotI2ZvcmVhY2goICR3ZWJDb25maWdQYXJhbSBpbiAkd2ViQ29uZmlnUGFyYW1MaXN0ICkNCi0gPHRyPg0KLSAgPHRkPiR3ZWJDb25maWdQYXJhbS5uYW1lPC90ZD4NCi0jaWYgKCR3ZWJDb25maWdQYXJhbS5kZWZhdWx0VmFsdWUpDQotICA8dGQ+JHdlYkNvbmZpZ1BhcmFtLmRlZmF1bHRWYWx1ZTwvdGQ+DQotI2Vsc2UNCi0gIDx0ZD48L3RkPg0KLSNlbmQNCi0jaWYgKCR3ZWJDb25maWdQYXJhbS5leHBlY3RlZFZhbHVlcykNCi0gIDx0ZD4kd2ViQ29uZmlnUGFyYW0uZXhwZWN0ZWRWYWx1ZXM8L3RkPg0KLSNlbHNlDQotICA8dGQ+PC90ZD4NCi0jZW5kDQotI2lmICgkd2ViQ29uZmlnUGFyYW0uc2luY2UpDQotICA8dGQ+JHdlYkNvbmZpZ1BhcmFtLnNpbmNlPC90ZD4NCi0jZWxzZQ0KLSAgPHRkPjwvdGQ+DQotI2VuZA0KLSNpZiAoJHdlYkNvbmZpZ1BhcmFtLmxvbmdEZXNjcmlwdGlvbikNCi0gIDx0ZD4kd2ViQ29uZmlnUGFyYW0ubG9uZ0Rlc2NyaXB0aW9uPC90ZD4NCi0jZWxzZQ0KLSAgPHRkPjwvdGQ+DQotI2VuZA0KLSAgPHRkPiR3ZWJDb25maWdQYXJhbS5zb3VyY2VDbGFzc05hbWU8L3RkPg0KLSA8L3RyPg0KLSNlbmQNCi08L3RhYmxlPg0KLSNlbmQNCi0jZW5kDQotICA8L3NlY3Rpb24+DQotIDwvYm9keT4gDQotPC9kb2N1bWVudD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi94bWxNYWNyb3Mudm0gYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi94bWxNYWNyb3Mudm0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2OWRlMjkuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYveG1sTWFjcm9zLnZtCisrKyAvZGV2L251bGwKZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9xZG94L2RlZmF1bHQuZHRkIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL3Fkb3gvZGVmYXVsdC5kdGQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkMDhjZTEuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL3Fkb3gvZGVmYXVsdC5kdGQKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08IS0tDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi08IS0tIERURCBmb3IgZmFjZWxldHMgY2xhc3MgaW4gDQotb3JnLmFwYWNoZS5teWZhY2VzLnZpZXcuZmFjZWxldHMuY29tcGlsZXIuU0FYQ29tcGlsZXINCi0tLT4NCi08IUVMRU1FTlQgZGVmYXVsdCBBTlk+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvc2l0ZS9hcHQvYXR0cmlidXRlcy5hcHQgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9zaXRlL2FwdC9hdHRyaWJ1dGVzLmFwdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmU1YjlhNy4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9zaXRlL2FwdC9hdHRyaWJ1dGVzLmFwdAorKysgL2Rldi9udWxsCkBAIC0xLDEyNCArMCwwIEBACi0gfn4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlDQotIH5+IGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aA0KLSB+fiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuDQotIH5+IFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wDQotIH5+ICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQotIH5+IHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotIH5+DQotIH5+ICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotIH5+DQotIH5+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCi0gfn4gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gfn4gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotIH5+IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCi0gfn4gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQotIA0KLSAtLS0tLS0NCi0gQXR0cmlidXRlcw0KLSAtLS0tLS0NCi0gDQotQXR0cmlidXRlcw0KLSANCi0gICAgVGFncyBoYXMgYXR0cmlidXRlcy4gQXR0cmlidXRlIGJlaGF2aW9yIGlzIGRpZmZlcmVudCBmcm9tIGEgcHJvcGVydHksDQotICAgIHNvIGl0IGlzIG5lY2Vzc2FyeSB0byB1c2UgYSBkaWZmZXJlbnQgYW5ub3RhdGlvbi9kb2NsZXQgdG8gdXNlIGl0Lg0KLSAgICBVc3VhbGx5IHRhZ3MgYXJlIHdyaXR0ZW4gYnkgdXNlcnMsIGJ1dCBoYXMgZmV3IGF0dHJpYnV0ZXMgYW5kIGRvZXMgbm90DQotICAgIGhhdmUgYSBjb21wbGV4IGhpZXJhcmNoeSwgc28gaXQgaXMgbm90IG5lY2Vzc2FyeSBtYWtlIHRhZ3MgaW5oZXJpdA0KLSAgICBhdHRyaWJ1dGVzIGZyb20gb3RoZXIgdGFncy4NCi0gICAgDQotICAgIFRoZSBvYmplY3RpdmUgb2YgdXNlIEBKU0ZKc3BUYWcgYW5kIEBKU0ZKc3BBdHRyaWJ1dGUgYW5ub3RhdGlvbi9kb2NsZXQgaXMNCi0gICAgbWFrZSBlYXNpZXIga2VlcCBzeW5jaHJvbml6ZWQgdGhlIC50bGQgZmlsZSB3aXRoIHRoZSB0YWcgY2xhc3MuDQotICAgIA0KLSogQXR0cmlidXRlIGxvYWRlZCBmcm9tIGJhc2ljIHR5cGUNCi0NCi0gICAgT24ganNmIDEuMSBhbmQgaW4gc29tZSBzcGVjaWFsIGNhc2VzLCBubyBWYWx1ZUV4cHJlc3Npb25zIGFyZSBhbGxvd2VkDQotICAgIG9uIHNvbWUgYXR0cmlidXRlLg0KLQ0KLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0gICAgLyoqIA0KLSAgICAgICogT24gdGxkcyB0aGlzIGlzIHRyYW5zbGF0ZWQgdG8gc29tZXRoaW5nIGxpa2U6DQotICAgICAgKg0KLSAgICAgICogPGF0dHJpYnV0ZT4NCi0gICAgICAqICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVtTb21lIGRlc2NyaXB0aW9uXV0+PC9kZXNjcmlwdGlvbj4NCi0gICAgICAqICAgIDxuYW1lPnZhcjwvbmFtZT4NCi0gICAgICAqICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+DQotICAgICAgKiAgICA8cnRleHBydmFsdWU+ZmFsc2U8L3J0ZXhwcnZhbHVlPg0KLSAgICAgICogICAgPHR5cGU+amF2YS5sYW5nLlN0cmluZzwvdHlwZT4NCi0gICAgICAqIDwvYXR0cmlidXRlPg0KLSAgICAgICoNCi0gICAgICAqLw0KLSAgICBASlNGSnNwQXR0cmlidXRlDQotICAgIHB1YmxpYyB2b2lkIHNldFZhcihTdHJpbmcgdmFyKQ0KLSAgICB7DQotICAgICAgICAvLyAuLi4uIHNvbWUgY29kZSAuLi4uDQotICAgIH0NCi0tLS0tLS0tLS0tLS0tLS0tLS0tDQotDQotKiBBdHRyaWJ1dGUgbG9hZGVkIGZyb20gVmFsdWVFeHByZXNzaW9uDQotDQotICAgIFRoZXJlIGFyZSB0d28gY2FzZXMgDQotDQotLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQ0KLSAgICAvKiogDQotICAgICAgKiBPbiBqc2YgMS4xIHRoaXMgdHJhbnNsYXRlcyB0byBzb21ldGhpbmcgbGlrZToNCi0gICAgICAqDQotICAgICAgKiBXb3JrcyBvbiB2ZXJzaW9uIDEuMC4yLCBidXQgc29tZSBqc2YgMS4yIHRsZCB0ZW1wbGF0ZXMgdHJhbnNsYXRlIGl0IHRvOg0KLSAgICAgICogDQotICAgICAgKiA8YXR0cmlidXRlPg0KLSAgICAgICogICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBW1RoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiB0aGUgQWN0aW9uTGlzdGVuZXIgY2xhc3MuXV0+PC9kZXNjcmlwdGlvbj4NCi0gICAgICAqICAgIDxuYW1lPnR5cGU8L25hbWU+DQotICAgICAgKiAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPg0KLSAgICAgICogICAgPGRlZmVycmVkLXZhbHVlPg0KLSAgICAgICogICAgICAgIDx0eXBlPmphdmEubGFuZy5TdHJpbmc8L3R5cGU+DQotICAgICAgKiAgICA8L2RlZmVycmVkLXZhbHVlPg0KLSAgICAgICogPC9hdHRyaWJ1dGU+ICAgICAgDQotICAgICAgKiAgDQotICAgICAgKiBPbiB2ZXJzaW9uIDEuMC4zIHRoaXMgc2hvdWxkIGJlIHRyYW5zbGF0ZWQgdG8gc29tZXRoaW5nIGxpa2U6DQotICAgICAgKiANCi0gICAgICAqIDxhdHRyaWJ1dGU+DQotICAgICAgKiAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbVGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIHRoZSBBY3Rpb25MaXN0ZW5lciBjbGFzcy5dXT48L2Rlc2NyaXB0aW9uPg0KLSAgICAgICogICAgPG5hbWU+dHlwZTwvbmFtZT4NCi0gICAgICAqICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+DQotICAgICAgKiAgICA8cnRleHBydmFsdWU+dHJ1ZTwvcnRleHBydmFsdWU+DQotICAgICAgKiA8L2F0dHJpYnV0ZT4NCi0gICAgICAqIA0KLSAgICAgICogQnV0IHRoaXMgZGVwZW5kcyBvbiB0aGUgdGVtcGxhdGUgdXNlZCB0byBnZW5lcmF0ZSBpdHMgdGxkLg0KLSAgICAgICoqLw0KLSAgICBASlNGSnNwQXR0cmlidXRlKGNsYXNzTmFtZSA9ICJqYXZhLmxhbmcuU3RyaW5nIiwgcnRleHBydmFsdWUgPSB0cnVlKQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRUeXBlKFZhbHVlRXhwcmVzc2lvbiB0eXBlKQ0KLSAgICB7DQotICAgICAgICAvLyAuLi4uIHNvbWUgY29kZSAuLi4uDQotICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgICogV29ya3Mgb24gdmVyc2lvbiAxLjAuMyBhbmQgdXBwZXIgZm9yIGpzZiAxLjIgYW5kIHVwcGVyIHRsZCB0ZW1wbGF0ZXM6DQotICAgICAgKg0KLSAgICAgICogPGF0dHJpYnV0ZT4NCi0gICAgICAqICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVtUaGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgdGhlIEFjdGlvbkxpc3RlbmVyIGNsYXNzLl1dPjwvZGVzY3JpcHRpb24+DQotICAgICAgKiAgICA8bmFtZT50eXBlPC9uYW1lPg0KLSAgICAgICogICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4NCi0gICAgICAqICAgIDxkZWZlcnJlZC12YWx1ZT4NCi0gICAgICAqICAgICAgICA8dHlwZT5qYXZhLmxhbmcuU3RyaW5nPC90eXBlPg0KLSAgICAgICogICAgPC9kZWZlcnJlZC12YWx1ZT4NCi0gICAgICAqIDwvYXR0cmlidXRlPiAgDQotICAgICAgKiovDQotICAgIEBKU0ZKc3BBdHRyaWJ1dGUoZGVmZXJyZWRWYWx1ZVR5cGUgPSAiamF2YS5sYW5nLlN0cmluZyIpDQotICAgIHB1YmxpYyB2b2lkIHNldFR5cGUoVmFsdWVFeHByZXNzaW9uIHR5cGUpDQotICAgIHsNCi0gICAgICAgIC8vIC4uLi4gc29tZSBjb2RlIC4uLi4NCi0gICAgfQ0KLSAgICANCi0gICAgDQotLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQ0KLSogQXR0cmlidXRlIGxvYWRlZCBmcm9tIE1ldGhvZEV4cHJlc3Npb24NCi0NCi0tLS0tLS0tLS0tLS0tLS0tLS0tDQotICAvKiogd29ya3Mgb24gdmVyc2lvbiAxLjAuMyBhbmQgdXBwZXIgZm9yIGpzZiAxLjIgYW5kIHVwcGVyIHRsZCB0ZW1wbGF0ZXMgKiovDQotICBASlNGSnNwQXR0cmlidXRlKHJlcXVpcmVkPXRydWUsDQotICAgICAgICAgIGRlZmVycmVkTWV0aG9kU2lnbmF0dXJlID0gInZvaWQgbXlNZXRob2QoamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQsIGphdmEuaW8uT3V0cHV0U3RyZWFtKSIpDQotICBwdWJsaWMgdm9pZCBzZXRNZXRob2QoTWV0aG9kRXhwcmVzc2lvbiBtZXRob2QpDQotICB7DQotICAgIF9tZXRob2QgPSBtZXRob2Q7DQotICB9DQotLS0tLS0tLS0tLS0tLS0tLS0tLQ0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL3NpdGUvYXB0L2NvbXBvbmVudHMuYXB0IGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvc2l0ZS9hcHQvY29tcG9uZW50cy5hcHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0NWQwMTkuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvc2l0ZS9hcHQvY29tcG9uZW50cy5hcHQKKysrIC9kZXYvbnVsbApAQCAtMSwyNDAgKzAsMCBAQAotIH5+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQ0KLSB+fiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgNCi0gfn4gdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLg0KLSB+fiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMA0KLSB+fiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KLSB+fiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSB+fg0KLSB+fiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSB+fg0KLSB+fiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQotIH5+IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotIH5+IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLSB+fiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQotIH5+IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSANCi0gLS0tLS0tDQotIENyZWF0aW5nIEN1c3RvbSBDb21wb25lbnRzIA0KLSAtLS0tLS0NCi0gDQotQ3JlYXRpbmcgQ3VzdG9tIENvbXBvbmVudHMNCi0gDQotICAgIEFueSBKU0YgQ29tcG9uZW50IGhhcyB0aGUgZm9sbG93aW5nIGVsZW1lbnRzOg0KLSAgICANCi0gICAgICogQ29tcG9uZW50IGNsYXNzIGZpbGUocykuDQotICAgIA0KLSAgICAgKiBKU1AgdGFnIGNsYXNzIGZpbGUocykuDQotICAgIA0KLSAgICAgKiBFbnRyeSBvbiBmYWNlcy1jb25maWcueG1sLg0KLSAgICANCi0gICAgICogUmVuZGVyZXIgY2xhc3MgZmlsZShzKSAob3B0aW9uYWwpLg0KLSAgICANCi0gICAgICogVExEIGZpbGUgKG9wdGlvbmFsKS4NCi0gICAgDQotICAgICAqIGZhY2VsZXQtdGFnbGliIGVudHJ5IChvcHRpb25hbCkuDQotICAgIA0KLSAgICAgKiBGYWNlbGV0cyB0YWcgaGFuZGxlciBmaWxlcyAob3B0aW9uYWwpLg0KLSAgICANCi0gICAgS2VlcCBhbGwgdGhvc2UgZmlsZXMgdXAgdG8gZGF0ZSBpcyBhIGNvbXBsZXggdGFzaywgYnV0IHdpdGggDQotICAgIG15ZmFjZXMtYnVpbGRlci1wbHVnaW4geW91IGp1c3QgbmVlZCB0byB0YWtlIGNhcmUgYWJvdXQ6DQotICAgIA0KLSAgICAgKiBDb21wb25lbnQgY2xhc3MgZmlsZShzKS4NCi0gICAgDQotICAgICAqIFJlbmRlcmVyIGNsYXNzIGZpbGUocykgKG9wdGlvbmFsKS4NCi0gICAgDQotICAgICAqIEZhY2VsZXRzIHRhZyBoYW5kbGVyIGZpbGVzIChvcHRpb25hbCkuDQotICAgIA0KLSAgICBUaGlzIGV4YW1wbGUgc2hvd3Mgc3RlcCBieSBzdGVwIHdoYXQgZG8geW91IG5lZWQgdG8gY3JlYXRlIGEgY3VzdG9tDQotICAgIGNvbXBvbmVudC4NCi0gICAgDQotU2V0dGluZyB1cCB5b3VyIHByb2plY3QNCi0NCi0gICAgQWxsIGluZm9ybWF0aW9uIHJlbGF0ZWQgY2FuIGJlIGZvdW5kIHt7e3NldHVwLmh0bWx9aGVyZX19Lg0KLQ0KLUNvbmZpZ3VyYXRpb24gZmlsZXMgKGZhY2VzLWNvbmZpZy54bWwsIC50bGQsIGZhY2VsZXRzIHRhZ2xpYikNCi0NCi0gICAgVGhpcyB7e3tjb25maWctZmlsZXMuaHRtbH1wYWdlfX0gc2hvd3Mgc29tZSBleGFtcGxlcy4NCi0NCi1Xcml0aW5nIHlvdXIgY29tcG9uZW50IGNsYXNzDQotDQotICAgIFRoZXJlIGFyZSB0aHJlZSBwb3NzaWJpbGl0aWVzIGZvciBjcmVhdGUgYSBjb21wb25lbnQgY2xhc3M6DQotICAgIA0KLSAgICAqIFdyaXRlIGp1c3Qgb25lIGZpbGUgYW5kIGFkZCBhbGwgY29kZSBtYW51YWxseSAoRXhhbXBsZTogdDphbGlhc0JlYW4pLg0KLSAgICANCi0gICAgKiBXcml0ZSBhbiBhYnN0cmFjdCBjbGFzcywgYW5kIGxldCBnZW5lcmF0ZSBhbGwgcHJvcGVydHkgY29kZSwgaW5jbHVkaW5nDQotICAgICAgc2F2ZVN0YXRlL3Jlc3RvcmVTdGF0ZSBtZXRob2RzIGluIGEgY29uY3JldGUgY2hpbGQgY2xhc3MgDQotICAgICAgKEV4YW1wbGU6IGFsbW9zdCBhbGwgY29tcG9uZW50cyBpbiB0b21haGF3ayBjb3JlIGFuZCBzYW5kYm94KS4NCi0gICAgDQotICAgICogV3JpdGUgYW4gYWJzdHJhY3QgY2xhc3MgKGdlbmVyYWxseSBwYWNrYWdlIHNjb3BlKSBhbmQgdXNlIHRlbXBsYXRlDQotICAgICAgcGF0dGVybi4gSW4gb3RoZXIgd29yZHMsIGFsbCBwcm9wZXJ0eSBjb2RlIGlzIGdlbmVyYXRlZCBpbmNsdWRpbmcNCi0gICAgICBzYXZlU3RhdGUvcmVzdG9yZVN0YXRlIG1ldGhvZHMgaW4gYSBjb25jcmV0ZSBjaGlsZCBjbGFzcywgYnV0IG90aGVyDQotICAgICAgY29kZSBpbnNpZGUgdGhlIGFic3RyYWN0IGNsYXNzIGlzIGNvcGllZCB0byB0aGUgZ2VuZXJhdGVkIGNsYXNzLg0KLQ0KLSogV3JpdGUgYSBjb21wb25lbnQgY2xhc3MgbWFudWFsbHkNCi0NCi0gICAgSW4gdGhpcyBtb2RlLCBubyBjb2RlIGlzIGdlbmVyYXRlZCwgYnV0IHRoZSBpbmZvcm1hdGlvbiBpcyBjaGFpbmVkIHRvDQotICAgIG90aGVyIGZpbGVzIHRvIGJlIGdlbmVyYXRlZCBsaWtlIGZhY2VzLWNvbmZpZy54bWwsIHRsZHMsIHRhZyBjbGFzc2VzLCBldGMuDQotICAgIA0KLSAgICBCZWxvdyB0aGVyZSBpcyBhbiBleGFtcGxlIG9mIGl0Og0KLSAgICANCi0tLS0tLS0tLS0tLS0tLS0tLS0tDQotLyoqDQotICogVGhlIG1vc3QgaW1wb3J0YW50IHBvaW50cyBhcmU6IA0KLSAqIA0KLSAqIDEuIERlZmluZSBjb21wb25lbnRUeXBlLCBjb21wb25lbnRGYW1pbHkgYW5kIHJlbmRlcmVyVHlwZSBhZGRpbmcgaXRzDQotICogY29uc3RhbnRzIChsaWtlIGJlbG93KSBvciBkaXJlY3RseSBpbiB0aGUgYW5ub3RhdGlvbi4NCi0gKiANCi0gKiAyLiBJZiB0aGUgY29tcG9uZW50IGhhcyBhIGpzcCB0YWcsIGRlZmluZSB0aGUgIm5hbWUiIGFuZCB0aGUgInRhZ0NsYXNzIg0KLSAqIElmIHRoZSB0YWdDbGFzcyBkb2VzIG5vdCBleGlzdHMgYSBuZXcgZmlsZSBpcyBnZW5lcmF0ZWQgaWYgbWFrZS10YWdzDQotICogZ29hbCBpcyBzZXQgb24gcG9tLnhtbA0KLSAqIA0KLSAqLw0KLUBKU0ZDb21wb25lbnQoDQotICAgbmFtZSA9ICJteWNvbXBvbmVudHM6c2F5SGVsbG8iLA0KLSAgIGNsYXp6ID0gIm9yZy5teW9yZ2FuaXphdGlvbi5jb21wb25lbnQuc2F5aGVsbG8uU2F5SGVsbG8iLA0KLSAgIHRhZ0NsYXNzID0gIm9yZy5teW9yZ2FuaXphdGlvbi5jb21wb25lbnQuc2F5aGVsbG8uU2F5SGVsbG9UYWciKQ0KLXB1YmxpYyBjbGFzcyBTYXlIZWxsbyBleHRlbmRzIFVJT3V0cHV0DQotew0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT01QT05FTlRfVFlQRSA9ICJvcmcubXlvcmdhbml6YXRpb24uU2F5SGVsbG8iOw0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1JFTkRFUkVSX1RZUEUgPSAib3JnLm15b3JnYW5pemF0aW9uLlNheUhlbGxvUmVuZGVyZXIiOw0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT01QT05FTlRfRkFNSUxZID0gImphdmF4LmZhY2VzLk91dHB1dCI7DQotDQotICAgIC8qKiAuLi4uLiBTb21lIGN1c3RvbSBjb2RlIGdvZXMgaGVyZSAuLi4uICoqLw0KLX0NCi0tLS0tLS0tLS0tLS0tLS0tLS0tDQotDQotKiBXcml0ZSBhIGNvbXBvbmVudCBjbGFzcyB1c2luZyBBYnN0cmFjdCBQYXR0ZXJuDQotDQotICAgIFRoZSBvYmplY3RpdmUgaXMgY3JlYXRlIGEgYWJzdHJhY3QgY29tcG9uZW50IGNsYXNzIA0KLSAgICB0aGF0IGRlZmluZXMgYWxsIGluZm9ybWF0aW9uIHJlcXVpcmVkIHRvIGdlbmVyYXRlIHRoZSBjb25jcmV0ZSANCi0gICAgY29tcG9uZW50IGNsYXNzLiBBbGwgY3VzdG9tIGNvZGUgZ29lcyBpbiB0aGUgYWJzdHJhY3QgY2xhc3MsIHNvIGl0DQotICAgIGlzIGluaGVyaXRlZCB0byB0aGUgY2hpbGQgY29tcG9uZW50Lg0KLSAgICANCi0gICAgVGhpcyBwYXR0ZXJuIGlzIHByZWZlcnJlZCBvdmVyIHRlbXBsYXRlIG1vZGUsIGJlY2F1c2UgaXQgaXMgbW9yZSBzaW1wbGUNCi0gICAgdG8gdW5kZXJzdGFuZCwgYnV0IHRoZXJlIGFyZSBzb21lIGNhc2VzIHdoZXJlIHRoaXMgbW9kZSBjYW5ub3QgYmUNCi0gICAgYXBwbGllZCAobGlrZSBpbiBteWZhY2VzIGNvcmUgYXBpLCB3aGVyZSB0aGUgY29tcG9uZW50IGhpZXJhcmNoeSBjYW5ub3QNCi0gICAgYmUgY2hhbmdlZCkuDQotICAgIA0KLSAgICBCZWxvdyB0aGVyZSBpcyBhbiBleGFtcGxlIG9mIGl0Og0KLQ0KLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0vKioNCi0gKiBUbyBnZW5lcmF0ZSBjb21wb25lbnQgY2xhc3NlcyB1c2luZyBhYnN0cmFjdCBwYXR0ZXJuDQotICogDQotICogMS4gRGVmaW5lIHRoZSAiY2xhenoiIGZpbGUgd2hpY2ggaXQgaXMgZ2VuZXJhdGVkDQotICogDQotICogMi4gRGVmaW5lIGNvbXBvbmVudFR5cGUsIGNvbXBvbmVudEZhbWlseSBhbmQgcmVuZGVyZXJUeXBlIGFkZGluZyBpdHMNCi0gKiBjb25zdGFudHMgKGxpa2UgYmVsb3cpIG9yIGRpcmVjdGx5IGluIHRoZSBhbm5vdGF0aW9uLg0KLSAqIA0KLSAqIDMuIElmIHRoZSBjb21wb25lbnQgaGFzIGEganNwIHRhZywgZGVmaW5lIHRoZSAibmFtZSIgYW5kIHRoZSAidGFnQ2xhc3MiDQotICogSWYgdGhlIHRhZ0NsYXNzIGRvZXMgbm90IGV4aXN0cyBhIG5ldyBmaWxlIGlzIGdlbmVyYXRlZCBpZiBtYWtlLXRhZ3MNCi0gKiBnb2FsIGlzIHNldCBvbiBwb20ueG1sDQotICogDQotICovDQotQEpTRkNvbXBvbmVudCgNCi0gICBuYW1lID0gIm15Y29tcG9uZW50czpzYXlIZWxsbyIsDQotICAgY2xhenogPSAib3JnLm15b3JnYW5pemF0aW9uLmNvbXBvbmVudC5zYXloZWxsby5TYXlIZWxsbyIsDQotICAgdGFnQ2xhc3MgPSAib3JnLm15b3JnYW5pemF0aW9uLmNvbXBvbmVudC5zYXloZWxsby5TYXlIZWxsb1RhZyIpDQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0U2F5SGVsbG8gZXh0ZW5kcyBVSU91dHB1dA0KLXsNCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NUE9ORU5UX1RZUEUgPSAib3JnLm15b3JnYW5pemF0aW9uLlNheUhlbGxvIjsNCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9SRU5ERVJFUl9UWVBFID0gIm9yZy5teW9yZ2FuaXphdGlvbi5TYXlIZWxsb1JlbmRlcmVyIjsNCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NUE9ORU5UX0ZBTUlMWSA9ICJqYXZheC5mYWNlcy5PdXRwdXQiOw0KLQ0KLSAgICAvKioNCi0gICAgICogVXNlcidzIGZpcnN0IG5hbWUuDQotICAgICAqLw0KLSAgICBASlNGUHJvcGVydHkNCi0gICAgcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXROYW1lKCk7DQotfQ0KLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0NCi0qIFdyaXRlIGEgY29tcG9uZW50IGNsYXNzIHVzaW5nIFRlbXBsYXRlIFBhdHRlcm4NCi0NCi0gICAgVGhlIG9iamVjdGl2ZSBpcyBjcmVhdGUgYW4gYWJzdHJhY3QgKGdlbmVyYWxseSBwYWNrYWdlIHNjb3BlZCkgY2xhc3MNCi0gICAgdGhhdCB3b3JrcyBhcyBhICJ0ZW1wbGF0ZSIuDQotICAgIA0KLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi1ASlNGQ29tcG9uZW50KA0KLSAgIG5hbWUgPSAibXljb21wb25lbnRzOnNheUhlbGxvIiwNCi0gICBjbGF6eiA9ICJvcmcubXlvcmdhbml6YXRpb24uY29tcG9uZW50LnNheWhlbGxvLlNheUhlbGxvIiwNCi0gICB0YWdDbGFzcyA9ICJvcmcubXlvcmdhbml6YXRpb24uY29tcG9uZW50LnNheWhlbGxvLlNheUhlbGxvVGFnIikNCi1hYnN0cmFjdCBjbGFzcyBfU2F5SGVsbG8gZXh0ZW5kcyBVSU91dHB1dA0KLXsNCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NUE9ORU5UX1RZUEUgPSAib3JnLm15b3JnYW5pemF0aW9uLlNheUhlbGxvIjsNCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9SRU5ERVJFUl9UWVBFID0gIm9yZy5teW9yZ2FuaXphdGlvbi5TYXlIZWxsb1JlbmRlcmVyIjsNCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NUE9ORU5UX0ZBTUlMWSA9ICJqYXZheC5mYWNlcy5PdXRwdXQiOw0KLQ0KLSAgICAvKioNCi0gICAgICogVGhpcyBtZXRob2QgaXMgY29waWVkIHRvIGdlbmVyYXRlZCBTYXlIZWxsbyBjbGFzcw0KLSAgICAgKiovDQotICAgIHB1YmxpYyB2b2lkIGJyb2FkY2FzdChqYXZheC5mYWNlcy5ldmVudC5GYWNlc0V2ZW50IGV2ZW50KQ0KLSAgICAgICAgdGhyb3dzIGphdmF4LmZhY2VzLmV2ZW50LkFib3J0UHJvY2Vzc2luZ0V4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICAvL1NvbWUgY3VzdG9tIGNvZGUgZ29lcyBoZXJlDQotICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBUaGlzIG1ldGhvZCBpcyBub3QgY29waWVkLCBidXQgQEpTRkV4Y2x1ZGUgd29ya3Mgd2l0aCBmaWVsZHMgdG9vIQ0KLSAgICAgKiovDQotICAgIEBKU0ZFeGNsdWRlDQotICAgIHB1YmxpYyB2b2lkIGRvU29tZXRoaW5nKCkNCi0gICAgew0KLSAgICAgICAgLy9Tb21lIG5ldmVyIHVzZWQgY3VzdG9tIGNvZGUgZ29lcyBoZXJlDQotICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBVc2VyJ3MgZmlyc3QgbmFtZS4NCi0gICAgICovDQotICAgIEBKU0ZQcm9wZXJ0eQ0KLSAgICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldE5hbWUoKTsNCi19DQotLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQ0KLUdlbmVyYXRpbmcgQ29tcG9uZW50IFRhZyBDbGFzc2VzDQotDQotICAgIFRoZSBnb2FsICJtYWtlLXRhZ3MiIHRyaWdnZXIgY29tcG9uZW50IGpzcCB0YWcgZ2VuZXJhdGlvbi4gVGhpcyBnb2FsDQotICAgIGNoZWNrcyBpZiB0aGUgdGFnIGNsYXNzIGV4aXN0cyBhbmQgaWYgbm90LCBpdCBjcmVhdGVzIG9uZS4NCi0NCi0gICAgSGVyZSB0aGVyZSBhcmUgdHdvIHNjZW5hcmlvczoNCi0gICAgDQotICAgICAqIFRoZSBjb21wb25lbnQgY2xhc3MgaW5oZXJpdHMgZnJvbSBqc2YgY29yZSBVSVhYWFhYLCBzbyB0aGUgZ2VuZXJhdGVkIA0KLSAgICAgICBjbGFzcyBpbmhlcml0cyBmcm9tIGphdmF4LmZhY2VzLndlYmFwcC5VSUNvbXBvbmVudChFTClUYWcuDQotICAgICANCi0gICAgICogVGhlIGNvbXBvbmVudCBjbGFzcyBpbmhlcml0cyBmcm9tIGpzZiBjb3JlIEh0bWxYWFguIEluIHRoaXMgY2FzZSwgDQotICAgICAgIHRoZSB0YWcgY2xhc3NlcyB3aGVyZSB5b3VyIGNvbXBvbmVudCBpbmhlcml0cyBpcyBvbiBteWZhY2VzIGNvcmUgDQotICAgICAgIGltcGwgamFyLCBzbyBhZ2FpbiB0aGVyZSBhcmUgdGhyZWUgb3B0aW9uczoNCi0gICAgICAgDQotICAgICAgICAqIEFkZCBteWZhY2VzIGNvcmUgaW1wbCBqYXIgYXMgY29tcGlsZSBkZXBlbmRlbmN5IGFuZCB1c2UgbXlmYWNlcw0KLSAgICAgICAgICBjb3JlIGluIHlvdXIgd2ViIGFwcGxpY2F0aW9uLiANCi0gICAgICAgIA0KLSAgICAgICAgKiBBZGQgdG9tYWhhd2sgY29yZSBvciBjb3JlMTIgdG8geW91ciBkZXBlbmRlbmNpZXMsIHdoZXJlIHRoZXJlIA0KLSAgICAgICAgICBpcyBhbiBhbHRlcm5hdGUgdGFnIGhpZXJhcmNoeSwgc28geW91ciBjb21wb25lbnRzIGNhbiB3b3JrIA0KLSAgICAgICAgICB3aXRoIHRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24uIE1ha2Ugc3VyZSB0b21haGF3ayBkZXBlbmRlbmN5Lg0KLSAgICAgICAgICBzaG91bGQgYmUgYmVmb3JlIG15ZmFjZXMgY29yZSBkZXBlbmRlbmN5IGluIHRoZSBwb20sIHRvIGJlIHN1cmUNCi0gICAgICAgICAgdGhhdCB0b21haGF3ayBtb2RlbCBpcyBsb2FkZWQgZmlyc3QuDQotICAgICAgICAgIA0KLSAgICAgICAgKiBHZW5lcmF0ZSBhIGpzZiBodG1sIHRhZyBoaWVyYXJjaHkgaW4geW91ciBqYXIuIFNlZSB0b21haGF3ayBjb3JlDQotICAgICAgICAgIG9yIGNvcmUxMiBwb20gZm9yIGRldGFpbHMuDQotICAgIA0KLSAgICBJZiB5b3UgbmVlZCB0byB3cml0ZSBzb21lIGN1c3RvbSBjb2RlIG9uIHRhZyBjbGFzcywgYnV0IGtlZXAgc29tZQ0KLSAgICBjb2RlIGdlbmVyYXRlZCwgdXNlIGFic3RyYWN0IHBhdHRlcm4gb24gdGFnIGNsYXNzLiBUaGUgcHJvcGVydGllcyB0aGF0DQotICAgIG5lZWRzIHRvIGJlIGRlZmluZWQgb24gYWJzdHJhY3QgdGFnIGNsYXNzIG11c3QgaGF2ZSBpbmhlcml0ZWRUYWc9InRydWUiLA0KLSAgICBzbyB0aGVyZSBhcmUgbm90IG92ZXJyaWRlbi4gU2VlIHQ6dHJlZSBjb21wb25lbnQgZm9yIGFuIGV4YW1wbGUuICANCi0gICAgICAgIA0KLUFkZGluZyBhIFJlbmRlcmVyIHRvIGZhY2VzLWNvbmZpZy54bWwgZmlsZS4NCi0NCi0gICAgVGhlIGFubm90YXRpb25zL2RvY2xldHMgQEpTRlJlbmRlcmVyIGFuZCBASlNGUmVuZGVyS2l0IGFyZSB1c2VkIGluY2x1ZGUNCi0gICAgcmVuZGVyZXIgY29uZmlndXJhdGlvbiB0byBnZW5lcmF0ZWQgZmFjZXMtY29uZmlnLnhtbCBmaWxlcy4gSnVzdCBhZGQgaXQNCi0gICAgdG8geW91ciByZW5kZXJlciBsaWtlIHRoaXM6IA0KLSAgICANCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi1ASlNGUmVuZGVyZXIoDQotICAgcmVuZGVyS2l0SWQgPSAiSFRNTF9CQVNJQyIsDQotICAgZmFtaWx5ID0gImphdmF4LmZhY2VzLk91dHB1dCIsDQotICAgdHlwZSA9ICJvcmcubXlvcmdhbml6YXRpb24uU2F5SGVsbG9SZW5kZXJlciIpDQotcHVibGljIGNsYXNzIFNheUhlbGxvUmVuZGVyZXIgZXh0ZW5kcyBSZW5kZXJlcg0KLXsNCi0gICAgLy9Tb21lIGNvZGUgZ29lcyBoZXJlDQotfQ0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL3NpdGUvYXB0L2NvbmZpZy1maWxlcy5hcHQgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9zaXRlL2FwdC9jb25maWctZmlsZXMuYXB0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTUzN2Q3Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL3NpdGUvYXB0L2NvbmZpZy1maWxlcy5hcHQKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0gfn4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlDQotIH5+IGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aA0KLSB+fiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuDQotIH5+IFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wDQotIH5+ICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQotIH5+IHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotIH5+DQotIH5+ICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotIH5+DQotIH5+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCi0gfn4gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gfn4gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotIH5+IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCi0gfn4gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQotDQotIC0tLS0tLQ0KLSBDb25maWd1cmF0aW9uIGZpbGVzIA0KLSAtLS0tLS0NCi0NCi1Db25maWd1cmF0aW9uIGZpbGVzIChmYWNlcy1jb25maWcueG1sLCAudGxkLCBmYWNlbGV0cyB0YWdsaWIpDQotDQotICAgIEFsbCBjb25maWd1cmF0aW9uIGZpbGVzIGFyZSBnZW5lcmF0ZWQgYnkgDQotICAgIHt7e21ha2UtY29uZmlnLW1vam8uaHRtbH1tYWtlLWNvbmZpZ319IGdvYWwuDQotICAgIA0KLSAgICBUaGlzIGdvYWwgY2FuIGJlIHNlZW4gYXMgYW4gZXF1YXRpb246DQotDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSAgICAgeG1sQmFzZUZpbGUgKyB0ZW1wbGF0ZUZpbGUoIG1vZGVsKHMpIHRvIHRha2UgaW4gY29uc2lkZXJhdGlvbiApID0geG1sRmlsZQ0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0gICAgDQotICAgIEl0IGlzIGVub3VnaHQgZmxleGlibGUgdG8gZ2VuZXJhdGUgYW55IGZpbGUgYmFzZWQgb24gdGhlIG1vZGVsLg0KLSAgICBTb21lIGV4YW1wbGVzIGNhbiBiZSBzZWVuIGJlbG93Lg0KLSAgICANCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotICAgICAgICAgIC4uLi4uLi4uLi4uLiBwbHVnaW4gZGVjbGFyYXRpb24gZ29lcyBiZWZvcmUgLi4uLi4uLi4uLi4NCi0gICAgICAgICAgPCEtLSBmYWNlcy1jb25maWcgLS0+DQotICAgICAgICAgIDxleGVjdXRpb24+DQotICAgICAgICAgICAgPGlkPm1ha2VmYWNlc2NvbmZpZzwvaWQ+DQotICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZUZpbGU+ZmFjZXMtY29uZmlnMTIudm08L3RlbXBsYXRlRmlsZT4NCi0gICAgICAgICAgICAgICAgPHhtbEZpbGU+TUVUQS1JTkYvZmFjZXMtY29uZmlnLnhtbDwveG1sRmlsZT4NCi0gICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+DQotICAgICAgICAgICAgPGdvYWxzPg0KLSAgICAgICAgICAgICAgICA8Z29hbD5tYWtlLWNvbmZpZzwvZ29hbD4NCi0gICAgICAgICAgICA8L2dvYWxzPg0KLSAgICAgICAgICA8L2V4ZWN1dGlvbj4NCi0gICAgICAgICAgDQotICAgICAgICAgIDwhLS0gdGxkIC0tPg0KLSAgICAgICAgICA8ZXhlY3V0aW9uPg0KLSAgICAgICAgICAgIDxpZD5tYWtldG9tYWhhd2t0bGQ8L2lkPg0KLSAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPg0KLSAgICAgICAgICAgICAgICA8eG1sRmlsZT5NRVRBLUlORi90b21haGF3ay50bGQ8L3htbEZpbGU+DQotICAgICAgICAgICAgICAgIDx4bWxCYXNlRmlsZT5zcmMvbWFpbi9jb25mL01FVEEtSU5GL3RvbWFoYXdrLWJhc2UudGxkPC94bWxCYXNlRmlsZT4NCi0gICAgICAgICAgICAgICAgPHRlbXBsYXRlRmlsZT50b21haGF3azEyLnZtPC90ZW1wbGF0ZUZpbGU+DQotICAgICAgICAgICAgICAgIDxwYXJhbXM+DQotICAgICAgICAgICAgICAgICAgIDxzaG9ydG5hbWU+dDwvc2hvcnRuYW1lPg0KLSAgICAgICAgICAgICAgICAgICA8dXJpPmh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvdG9tYWhhd2s8L3VyaT4NCi0gICAgICAgICAgICAgICAgICAgPGRpc3BsYXluYW1lPlRvbWFoYXdrIHRhZyBsaWJyYXJ5IDEuMi48L2Rpc3BsYXluYW1lPg0KLSAgICAgICAgICAgICAgICA8L3BhcmFtcz4NCi0gICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+DQotICAgICAgICAgICAgPGdvYWxzPg0KLSAgICAgICAgICAgICAgICA8Z29hbD5tYWtlLWNvbmZpZzwvZ29hbD4NCi0gICAgICAgICAgICA8L2dvYWxzPg0KLSAgICAgICAgICA8L2V4ZWN1dGlvbj4NCi0gICAgICAgICAgDQotICAgICAgICAgIDwhLS0gZmFjZWxldHMgdGFnbGliIC0tPiAgICAgICAgDQotICAgICAgICAgIDxleGVjdXRpb24+DQotICAgICAgICAgICAgPGlkPm1ha2V0b21haGF3a3RhZ2xpYjwvaWQ+DQotICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgICAgICAgIDx4bWxGaWxlPk1FVEEtSU5GL3RvbWFoYXdrLnRhZ2xpYi54bWw8L3htbEZpbGU+DQotICAgICAgICAgICAgICAgIDx4bWxCYXNlRmlsZT5zcmMvbWFpbi9jb25mL01FVEEtSU5GL2ZhY2VsZXRzLXRhZ2xpYi1iYXNlLnhtbDwveG1sQmFzZUZpbGU+DQotICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZUZpbGU+ZmFjZWxldHMtdGFnbGliLnZtPC90ZW1wbGF0ZUZpbGU+DQotICAgICAgICAgICAgICAgIDxwYXJhbXM+DQotICAgICAgICAgICAgICAgICAgIDxzaG9ydG5hbWU+dDwvc2hvcnRuYW1lPg0KLSAgICAgICAgICAgICAgICAgICA8dXJpPmh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvdG9tYWhhd2s8L3VyaT4NCi0gICAgICAgICAgICAgICAgPC9wYXJhbXM+DQotICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPg0KLSAgICAgICAgICAgIDxnb2Fscz4NCi0gICAgICAgICAgICAgICAgPGdvYWw+bWFrZS1jb25maWc8L2dvYWw+DQotICAgICAgICAgICAgPC9nb2Fscz4NCi0gICAgICAgICAgPC9leGVjdXRpb24+DQotICAgICAgICAgIC4uLi4uLi4uLi4uLi4uLi4uDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQ0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL3NpdGUvYXB0L2NvbnZlcnRlcnMuYXB0IGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvc2l0ZS9hcHQvY29udmVydGVycy5hcHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjMzc2MWEuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvc2l0ZS9hcHQvY29udmVydGVycy5hcHQKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0gfn4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlDQotIH5+IGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aA0KLSB+fiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuDQotIH5+IFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wDQotIH5+ICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQotIH5+IHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotIH5+DQotIH5+ICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotIH5+DQotIH5+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCi0gfn4gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gfn4gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotIH5+IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCi0gfn4gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQotIA0KLSAtLS0tLS0NCi0gQ3JlYXRpbmcgQ3VzdG9tIENvbnZlcnRlcnMgDQotIC0tLS0tLQ0KLSANCi1DcmVhdGluZyBDdXN0b20gQ29udmVydGVycw0KLSANCi0gICAgQSBKU0YgQ29udmVydGVyIG5lZWRzIHRoZSBmb2xsb3dpbmcgZWxlbWVudHM6DQotICAgIA0KLSAgICAgKiBBIGNsYXNzIGltcGxlbWVudGluZyBjb252ZXJ0ZXIgaW50ZXJmYWNlLg0KLSAgICAgDQotICAgICAqIEVudHJ5IG9uIGZhY2VzLWNvbmZpZy54bWwuDQotICAgICANCi0gICAgICogVGFnIGVudHJ5IG9uIHRsZC4NCi0gICAgIA0KLSAgICAgKiBUYWcgZW50cnkgb24gZmFjZWxldHMgdGFnbGliIChvcHRpb25hbCkuDQotICAgICANCi0gICAgICogSlNQIFRhZyBjbGFzcw0KLSAgICAgDQotICAgIE15ZmFjZXMgYnVpbGRlciBwbHVnaW4gcHJvdmlkZSBhbm5vdGF0aW9ucy9kb2NsZXRzIHRvIGhlbHAgdXNlcnMgbWFpbnRhaW4NCi0gICAgY29uZmlndXJhdGlvbiBmaWxlcywgYW5kIGdlbmVyYXRpbmcgY29udmVydGVyIGpzcCB0YWcgY2xhc3NlcyANCi0gICAgYXV0b21hdGljYWxseS4gSW4gdGhpcyB3YXksIGFsbCBpbmZvcm1hdGlvbiBmb3IgYSBjb252ZXJ0ZXIgaXMganVzdCBpbg0KLSAgICBvbmUgZmlsZSAodGhlIGNsYXNzIGltcGxlbWVudGluZyBDb252ZXJ0ZXIgaW50ZXJmYWNlKS4NCi0gICAgDQotICAgIE9uIGpzZiAxLjIsIGl0IGlzIG5lY2Vzc2FyeSB0byBwcm92aWRlIGEgYmFzZSB0YWcgY2xhc3MgdGhhdCBleHRlbmRzDQotICAgIGZyb20gamF2YXguZmFjZXMud2ViYXBwLkNvbnZlcnRlckVMVGFnIHdoZXJlIGFsbCBjb252ZXJ0ZXJzIHNob3VsZCANCi0gICAgaW5oZXJpdC4gVGhpcyBjbGFzcyBpcyBvbiBteWZhY2VzIGNvbW1vbnMgY29udmVydGVycyBwcm9qZWN0LCBidXQgDQotICAgIHVzZXJzIGNhbiBwcm92aWRlIGN1c3RvbSB0ZW1wbGF0ZSBpbXBsZW1lbnRhdGlvbnMgZm9yIGl0Lg0KLQ0KLVNldHRpbmcgdXAgeW91ciBwcm9qZWN0DQotDQotICAgIEFsbCBpbmZvcm1hdGlvbiByZWxhdGVkIGNhbiBiZSBmb3VuZCB7e3tzZXR1cC5odG1sfWhlcmV9fS4NCi0NCi1Db25maWd1cmF0aW9uIGZpbGVzIChmYWNlcy1jb25maWcueG1sLCAudGxkLCBmYWNlbGV0cyB0YWdsaWIpDQotDQotICAgIFRoaXMge3t7Y29uZmlnLWZpbGVzLmh0bWx9cGFnZX19IHNob3dzIHNvbWUgZXhhbXBsZXMuDQotICAgIA0KLUFubm90YXRlIENvbnZlcnRlciBDbGFzc2VzDQotDQotICAgIEp1c3QgYWRkIHRoZSBhbm5vdGF0aW9ucy9kb2NsZXRzIGFzIHByZXNlbnRlZCBiZWxvdzoNCi0NCi0tLS0tLS0tLS0tLS0tLS0tLS0tDQotDQotQEpTRkNvbnZlcnRlcigNCi0gICAgbmFtZSA9ICJtY2M6Y29udmVydERhdGVUaW1lIiwNCi0gICAgdGFnQ2xhc3MgPSAib3JnLmFwYWNoZS5teWZhY2VzLmNvbW1vbnMuY29udmVydGVyLkNvbnZlcnREYXRlVGltZVRhZyIsDQotICAgIHRhZ1N1cGVyY2xhc3MgPSAib3JnLmFwYWNoZS5teWZhY2VzLmNvbW1vbnMuY29udmVydGVyLkNvbnZlcnRlclRhZyIpDQotcHVibGljIGNsYXNzIERhdGVUaW1lQ29udmVydGVyIGV4dGVuZHMgamF2YXguZmFjZXMuY29udmVydC5EYXRlVGltZUNvbnZlcnRlcg0KLXsNCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVkVSVEVSX0lEID0gIm9yZy5hcGFjaGUubXlmYWNlcy5jdXN0b20uY29udmVydERhdGVUaW1lLkRhdGVUaW1lQ29udmVydGVyIjsNCi0gDQotICAgIC8qKiAuLi4uLi4uLi4uIGltcGwgY29kZSBnb2VzIGhlcmUgLi4uLi4uLi4uICoqLw0KLSAgICANCi0gICAgQEpTRlByb3BlcnR5DQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHkoKQ0KLSAgICB7DQotICAgICAgICAvLyBzb21lIHN0dWZmDQotICAgIH0gICANCi19DQotLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9zaXRlL2FwdC9kb2NsZXRzLWFubm90YXRpb25zLmFwdCBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL3NpdGUvYXB0L2RvY2xldHMtYW5ub3RhdGlvbnMuYXB0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ODBmZDk2Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL3NpdGUvYXB0L2RvY2xldHMtYW5ub3RhdGlvbnMuYXB0CisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotIH5+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQ0KLSB+fiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgNCi0gfn4gdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLg0KLSB+fiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMA0KLSB+fiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KLSB+fiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSB+fg0KLSB+fiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSB+fg0KLSB+fiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQotIH5+IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotIH5+IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLSB+fiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQotIH5+IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSANCi0gLS0tLS0tDQotIERvY2xldHMgYW5kIEFubm90YXRpb25zIA0KLSAtLS0tLS0NCi0gDQotRG9jbGV0cyBhbmQgQW5ub3RhdGlvbnMNCi0NCi0gICAgVG8gYW5ub3RhdGUgdGhlIG5lY2Vzc2FyeSBpbmZvcm1hdGlvbiBpbiANCi0gICAgY29tcG9uZW50IC8gY29udmVydGVyIC8gdmFsaWRhdG9yIC8gcmVuZGVya2l0IC8gcmVuZGVyZXIgLyB0YWcgZmlsZXMNCi0gICAgeW91IGNhbiB1c2UgZG9jbGV0czoNCi0gICAgDQotLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQ0KLSAgICAvKioNCi0gICAgICogVGhpcyBpcyBhIGRvY2xldA0KLSAgICAgKg0KLSAgICAgKiBASlNGUHJvcGVydHkNCi0gICAgICogICAgICAgcmVxdWlyZWQgPSAidHJ1ZSINCi0gICAgICogICAgICAgZGVmYXVsdFZhbHVlID0gIkFueVZhbHVlIg0KLSAgICAgKiovDQotICAgIA0KLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0NCi0gICAgb3IgYW5ub3RhdGlvbnMNCi0gICAgDQotLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQ0KLSAgICAvKioNCi0gICAgICogVGhpcyBpcyBhbiBhbm5vdGF0aW9uDQotICAgICAqDQotICAgICAqKi8NCi0gICAgIEBKU0ZQcm9wZXJ0eSgNCi0gICAgICAgICAgcmVxdWlyZWQgPSB0cnVlLA0KLSAgICAgICAgICBkZWZhdWx0VmFsdWUgPSAiQW55VmFsdWUiKQ0KLQ0KLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0gICAgDQotICAgIERvY2xldHMgYW5kIGFubm90YXRpb25zIGNhbiBiZSB1c2VkIG9uIGJvdGgganNmIDEuMSBhbmQganNmIDEuMiwgYnV0DQotICAgIHNpbmNlIGpzZiAxLjEgaXMgamRrIDEuNCBjb21wYXRpYmxlLCBpdCBpcyBwcmVmZXJyZWQgdG8gdXNlIGRvY2xldHMgd2l0aA0KLSAgICBqc2YgMS4xIChub3RlIHRoYXQgaWYgeW91IHVzZSBhbm5vdGF0aW9ucywgeW91ciBzb3VyY2UgY29kZSBzaG91bGQgYmUNCi0gICAgamRrIDEuNSBpbiBvcmRlciB0byBjb21waWxlKS4NCi0gICAgDQotICAgIFRoZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIGRvY2xldHMgYW5kIGFubm90YXRpb25zIGFyZSBsaXN0ZWQgYmVsb3c6DQotICAgIA0KLSAgICAgKiBBdHRyaWJ1dGUgbmFtZXMgbGlrZSAiY2xhc3MiLCAiaW1wbGVtZW50cyIgaW4gYW5ub3RhdGVkDQotICAgICAgIHZlcnNpb24gYXJlICJjbGF6eiIgYW5kICJpbXBsZW1lbnR6Ii4NCi0gICAgICANCi0gICAgICogQWxsIGF0dHJpYnV0ZSB2YWx1ZXMgaW4gZG9jbGV0cyBtdXN0IGJlIGJldHdlZW4gIiIuIEluIGFubm90YXRpb25zDQotICAgICAgIGJvb2xlYW4gYXR0cmlidXRlcyBtdXN0IG5vdCAoc2VlICJyZXF1aXJlZCIgZXhhbXBsZSBiZWxvdykuDQotICAgICAgDQotICAgICAqIFVzYWdlIG9mIGFubm90YXRpb25zIGxpa2UgQEpTRkpzcFByb3BlcnRpZXMgYW5kIEBKU0ZSZW5kZXJlcnMgYXJlDQotICAgICAgIG5vdCByZXF1aXJlZCBvbiBkb2NsZXRzLg0KLSAgICANCi0gICAgVGFraW5nIGludG8gYWNjb3VudCB0aGUgcHJldmlvdXMgZGlmZmVyZW5jZXMsIHlvdSBjYW4gY29uc3VsdCB0aGUNCi0gICAgYW5ub3RhdGlvbiBqYXZhZG9jIGZvciBkb2NsZXRzLg0KLSAgICANCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9zaXRlL2FwdC9ob3d0by5hcHQgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9zaXRlL2FwdC9ob3d0by5hcHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmODAyNzMuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvc2l0ZS9hcHQvaG93dG8uYXB0CisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLSB+fiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUNCi0gfn4gY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoDQotIH5+IHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4NCi0gfn4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjANCi0gfn4gKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCi0gfn4gdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gfn4NCi0gfn4gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gfn4NCi0gfn4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLSB+fiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSB+fiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCi0gfn4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLSB+fiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCi0NCi0gLS0tLS0tDQotIEhvdyB0byBVc2UgDQotIC0tLS0tLQ0KLQ0KLVNjYW4gYW5ub3RhdGlvbnMvZG9jbGV0cyBhbmQgZ2VuZXJhdGUgbWV0YWRhdGENCi0NCi0gIEp1c3QgYWRkIHRoaXMgY29kZSB0byB5b3VyIHByb2plY3QgcG9tLnhtbA0KLSAgDQotLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLTxwcm9qZWN0Pg0KLSAgIC4uLg0KLSAgICAgIDxidWlsZD4NCi0gICAgICAgICAuLi4NCi0gICAgICAgIDxwbHVnaW5zPg0KLSAgICAgICAgICAgIDxwbHVnaW4+DQotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzPC9ncm91cElkPg0KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWJ1aWxkZXItcGx1Z2luPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgICAgICA8dmVyc2lvbj4xLjAuMjx2ZXJzaW9uPg0KLSAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4NCi0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5idWlsZC1tZXRhZGF0YTwvZ29hbD4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPg0KLSAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+DQotICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4NCi0gICAgICAgICAgICAgPC9wbHVnaW4+DQotICAgICAgICAgPC9wbHVnaW5zPg0KLSAgICAgICAgIC4uLg0KLSAgICAgIDwvYnVpbGQ+DQotICAgLi4uDQotPC9wcm9qZWN0Pg0KLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0NCi0gICAgVGhpcyBnb2FsIHNjYW5zIGFsbCBzb3VyY2UgY2xhc3NlcyBmb3IgYW5ub3RhdGlvbnMgb3IgZG9jbGV0cyBhbmQgb3RoZXIgbWV0YWRhdGENCi0gICAgZmlsZXMgaW5zaWRlIHRoZSBwcm9qZWN0IGRlcGVuZGVuY2VzIGFuZCBidWlsZCB0aGUgbWV0YWRhdGEgZmlsZSANCi0gICAgKE1FVEEtSU5GL215ZmFjZXMtbWV0YWRhdGEueG1sKSwgcmVxdWlyZWQgYnkgb3RoZXIgZ29hbHMgdG8gd29yay4NCi0NCi1BcmNoZXR5cGUgdXNpbmcgbXlmYWNlcy1idWlsZGVyLXBsdWdpbg0KLQ0KLSAgICBUaGUgbGF0ZXN0IG15ZmFjZXMtYXJjaGV0eXBlLWpzZmNvbXBvbmVudHMgYXZhaWxhYmxlIHt7e2h0dHA6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvbXlmYWNlcy9teWZhY2VzLWJ1aWxkLXRvb2xzL3RydW5rL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWpzZmNvbXBvbmVudHMvfWhlcmV9fQ0KLSAgICBvciB3aXRoIHZlcnNpb24gMS4wLjIgb3IgdXBwZXIgdXNlcyBteWZhY2VzLWJ1aWxkZXItcGx1Z2luIHRvIGdlbmVyYXRlIGNvbXBvbmVudCBjbGFzc2VzLA0KLSAgICB0YWcgY2xhc3NlcywgY29uZmlnIGZpbGVzLCBldGMuIEp1c3QgY2hlY2tvdXQgdGhlIGNvZGUsIGNvbXBpbGUgaXQgYW5kIGxvb2sgdGhlIGluc3RydWN0aW9ucyBvbiANCi0gICAge3t7aHR0cDovL3dpa2kuYXBhY2hlLm9yZy9teWZhY2VzL015RmFjZXNfQXJjaGV0eXBlc19mb3JfTWF2ZW59TXlmYWNlcyBBcmNoZXR5cGVzIGZvciBNYXZlbn19Lg0KLQ0KLUdlbmVyYXRlIGN1c3RvbSBjb21wb25lbnRzDQotDQotICAgIFRoZSBjb2RlIGJlbG93IHNob3dzIGhvdyB0byBjb25maWd1cmUgdGhlIHBsdWdpbiB0byBnZW5lcmF0ZSBtZXRhZGF0YQ0KLSAgICBhbmQgdGhlbiB1c2UgaXQgdG8gZ2VuZXJhdGUgY29tcG9uZW50IGNsYXNzZXMuDQotDQotLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLTxwcm9qZWN0Pg0KLSAgIC4uLg0KLSAgICAgIDxidWlsZD4NCi0gICAgICAgICAuLi4NCi0gICAgICAgIDxwbHVnaW5zPg0KLSAgICAgICAgICAgIDxwbHVnaW4+DQotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzPC9ncm91cElkPg0KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWJ1aWxkZXItcGx1Z2luPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgICAgICA8dmVyc2lvbj4xLjAuMjx2ZXJzaW9uPg0KLSAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4NCi0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5idWlsZC1tZXRhZGF0YTwvZ29hbD4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPg0KLSAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+DQotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5tYWtlY29tcDwvaWQ+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5tYWtlLWNvbXBvbmVudHM8L2dvYWw+DQotICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGpzZlZlcnNpb24+MTI8L2pzZlZlcnNpb24+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZUNvbXBvbmVudE5hbWU+bXlDb21wb25lbnRUZW1wbGF0ZUNsYXNzLnZtPC90ZW1wbGF0ZUNvbXBvbmVudE5hbWU+DQotICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPg0KLSAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+DQotICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4NCi0gICAgICAgICAgICAgPC9wbHVnaW4+DQotICAgICAgICAgPC9wbHVnaW5zPg0KLSAgICAgICAgIC4uLg0KLSAgICAgIDwvYnVpbGQ+DQotICAgLi4uDQotPC9wcm9qZWN0Pg0KLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0NCi0gICAgVGFrZSBhIGxvb2sgYXQgdXNlciBndWlkZSBzZWN0aW9uIHRvIHNlZSBtb3JlIGRldGFpbGVkIGluZm9ybWF0aW9uLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL3NpdGUvYXB0L2luZGV4LmFwdCBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL3NpdGUvYXB0L2luZGV4LmFwdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzdmZTYxMC4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9zaXRlL2FwdC9pbmRleC5hcHQKKysrIC9kZXYvbnVsbApAQCAtMSwxNjcgKzAsMCBAQAotIH5+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotIH5+IGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotIH5+IHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSB+fiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotIH5+ICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gfn4gdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSB+fgotIH5+ICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gfn4KLSB+fiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gfn4gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSB+fiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSB+fiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gfn4gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSAtLS0tLS0KLSBNeWZhY2VzIEJ1aWxkZXIgUGx1Z2luIAotIC0tLS0tLQotIAotU3VtbWFyeQotCi0gIFRoaXMgaXMgYSBtYXZlbiBwbHVnaW4gdGhhdCB1c2VzIGphdmFkb2MgYW5ub3RhdGlvbnMgdG8gZ2VuZXJhdGUgdGhlIG5lY2Vzc2FyeSBKU0YgY29uZmlndXJhdGlvbgotICBmaWxlcyAoLnRsZCwgZmFjZXMtY29uZmlnLnhtbCwgZXRjKSBhbmQgb3B0aW9uYWxseSBUYWcsIFZhbGlkYXRvciBhbmQgQ29tcG9uZW50IGNsYXNzZXMuCi0KLSAgU2VlIHRoZSBkb2N1bWVudGF0aW9uIG1lbnUgaW4gdGhlIGxlZnQtaGFuZCBuYXZpZ2F0aW9uIHBhbmUgZm9yIG1vcmUgaW5mb3JtYXRpb24uCi0KLUludHJvZHVjdGlvbgotCi0gIEEgSlNGIGNvbXBvbmVudCBsaWJyYXJ5IG5lZWRzIHRvIHByb3ZpZGUgaGFuZC13cml0dGVuOgotCi0gICogY29tcG9uZW50IGNsYXNzZXMKLSAgCi0gICogcmVuZGVyZXIgY2xhc3NlcwotCi0gICogY29udmVydGVyIGFuZCB2YWxpZGF0b3IgY2xhc3NlcwotICAgIAotICBbXQotCi0gIEl0IHRoZW4gbmVlZHMgdG8gYWxzbyBwcm92aWRlOgotCi0gICoganNwIHRhZ2xpYiBmaWxlcwotCi0gICogZmFjZWxldHMgdGFnbGliIGZpbGVzCi0KLSAgKiB0YWcgY2xhc3NlcwotICAKLSAgW10KLQotICBIb3dldmVyIGluIG1vc3QgY2FzZXMsIHRoZSBzZWNvbmQgY2F0ZWdvcnkgb2YgYXJ0aWZhY3RzIGNhbiBiZSBnZW5lcmF0ZWQgZnJvbSB0aGUKLSAgZmlyc3Qgb25lcy4gVGFnIGNsYXNzZXMgZ2VuZXJhbGx5IGp1c3QgY29weSBkYXRhIGZyb20gb25lIGZvcm1hdCB0byBhbm90aGVyIGFuZAotICBkbyBub3QgaGF2ZSBhbnkgY3VzdG9tIGxvZ2ljOyB0aGV5IGNhbiBlZmZlY3RpdmVseSBiZSBjcmVhdGVkIHVzaW5nIGNvZGUgdGVtcGxhdGVzLgotICBUaGUgY29uZmlnIGZpbGVzIGFyZSBtb3N0bHkganVzdCBhICJzdW1tYXJ5IiBvZiB0aGUgaW5mb3JtYXRpb24gaW4gdGhlIGhhbmQtd3JpdHRlbgotICBjbGFzc2VzIGFib3ZlLCBhbmQgc28gYXJlIGFsc28gYSBjYW5kaWRhdGUgZm9yIGdlbmVyYXRpb24uCi0KLSAgSW4gYWRkaXRpb24sIGNvbXBvbmVudHMgaGF2ZSBhIGxvdCBvZiBnZXR0ZXIvc2V0dGVyIG1ldGhvZHMgZm9yIHByb3BlcnRpZXMsIHdoZXJlIHRoZQotICBnZXR0ZXIvc2V0dGVyIGltcGxlbWVudGF0aW9ucyBhcmUgdmVyeSByZXBldGl0aXZlLiBDb21wb25lbnRzIGFsc28gbmVlZCB0byBwcm92aWRlCi0gIHN0YXRlLWhhbmRsaW5nIG1ldGhvZHMgKHNhdmVTdGF0ZS9yZXN0b3JlU3RhdGUpIHdoaWNoIGFyZSBhbHNvIHJlcGV0aXRpdmUuIEluIGJvdGgKLSAgY2FzZXMsIHRoZSBuZWNlc3NhcnkgbWV0aG9kcyBjYW4gcG90ZW50aWFsbHkgYmUgZ2VuZXJhdGVkIGdpdmVuIG1ldGFkYXRhIGFib3V0IHRoZQotICBwcm9wZXJ0aWVzIGJlbG9uZ2luZyB0byBhIGNvbXBvbmVudC4gCi0gIAotUmVxdWlyZW1lbnRzCi0KLSAgKiBNaW5pbWlzZSB0aGUgYW1vdW50IG9mIGNvZGUgZHVwbGljYXRpb24sIGllIHdoZXJlIGEgc2luZ2xlIGNoYW5nZSByZXF1aXJlcyBjaGFuZ2VzCi0gICAgaW4gdHdvIGRpZmZlcmVudCBwbGFjZXMKLQotICAqIE1pbmltaXNlIGJ1Z3MgZHVlIHRvIGluY29uc2lzdGVuY2llcyBiZXR3ZWVuIGRhdGEgdGhhdCBzaG91bGQgbWF0Y2guCi0gIAotICAqIFJlZHVjZSB0aGUgYm9yZWRvbSBmYWN0b3IKLSAgCi0gICogQWxsb3cgb3B0aW1pc2F0aW9ucyBpbiBoYW5kbGluZyBvZiBKU0YgY2xhc3NlcyAoZWcgc3RhdGUtc2F2aW5nIGltcHJvdmVtZW50cykgdG8KLSAgICBiZSBpbXBsZW1lbnRlZCBpbiBqdXN0IG9uZSBwbGFjZSwgcmF0aGVyIHRoYW4gaGF2aW5nIHRvIHJlcGVhdCB0aGUgc2FtZSBmaXggaW4KLSAgICBldmVyeSBwbGFjZSB0aGF0IHVzZXMgdGhlIHNhbWUgYm9pbGVycGxhdGUgY29kZS4KLSAgICAKLSAgKiBLZWVwIHRoZSBjb2RlIHNpbXBsZSB0byB1bmRlcnN0YW5kIGZvciBwZW9wbGUgbmV3IHRvIE15RmFjZXMuIEEgc29sdXRpb24gdGhhdCB3aWxsCi0gICAgZGlzY291cmFnZSBwZW9wbGUgZnJvbSBjb21taXR0aW5nIHBhdGNoZXMgdG8gbXlmYWNlcyBjb2RlIGlzIHdvcnNlIHRoYW4gbm8gc29sdXRpb24uCi0KLSAgKiBEb24ndCBtYWtlIGJ1aWxkaW5nIHRoZSBjb2RlIG1vcmUgY29tcGxpY2F0ZWQuCi0KLSAgKiBEb24ndCBtYWtlIGRlYnVnZ2luZyBvZiB0aGUgY29kZSBtb3JlIGNvbXBsaWNhdGVkCi0KLSAgKiBQcm92aWRlIGEgc29sdXRpb24gdGhhdCBjYW4gYmUgYXBwbGllZCB0byBhcyBtYW55IG15ZmFjZXMgcHJvamVjdHMgYXMgcG9zc2libGU7Ci0gICAgYSBzZXBhcmF0ZSBidWlsZCB0b29sIHBlciBwcm9qZWN0IGlzIG5vdCBkZXNpcmFibGUuIE5vdGUsIGhvd2V2ZXIsIHRoYXQgZWFjaAotICAgIHByb2plY3QgbXVzdCAib3B0IGluIiwgc28gYW55IHN1Y2Nlc3NmdWwgdG9vbCBtdXN0IHNhdGlzZnkgdGhlIG5lZWRzIG9mIG11bHRpcGxlCi0gICAgcHJvamVjdHMsIG9yIGJlIHN1ZmZpY2llbnRseSBleHRlbnNpYmxlIGZvciBvdGhlciBwcm9qZWN0cyB0byBleHRlbmQgaXQgdG8gbWF0Y2guCi0KLSAgKiBBbGxvdyBleHRlcm5hbCBjb2RlIHRvIHN1YmNsYXNzIGNvbXBvbmVudHMgdGhhdCBhcmUgd2l0aGluIGEgcHJvamVjdCB3aGljaCBoYXMKLSAgICBiZWVuIGJ1aWx0IGJ5IHRoZSBteWZhY2VzLWJ1aWxkZXItcGx1Z2luLiBNeUZhY2VzIGNvbXBvbmVudHMgYXJlIG1lYW50IHRvIGJlCi0gICAgdXNlZCBhcyBhIGJhc2UgZm9yIG90aGVyIGNvZGU7IGl0IHdvdWxkIGJlIG5pY2UgdG8gYmUgYWJsZSB0byBvZmZlciBhIGJ1aWxkIHRvb2wKLSAgICB0aGF0IHVzZXJzIGNhbiBhcHBseSB0byB0aGVpciBvd24gY29kZSB3aGVuIGV4dGVuZGluZyBteWZhY2VzIGNsYXNzZXMgaW4gb3JkZXIKLSAgICB0byBpbmhlcml0IHRoZSBzYW1lIG1ldGFkYXRhLiAgIAotICAKLUdhdGhlcmluZyBhbmQgc2F2aW5nIG1ldGEtZGF0YQotCi0gIEluIG9yZGVyIHRvIGRyaXZlIGFsbCBvZiB0aGUgYWJvdmUgYXJ0aWZhY3QgZ2VuZXJhdGlvbiwgbWV0YWRhdGEgYWJvdXQgdGhlIGFydGlmYWN0cwotICB0byBiZSBnZW5lcmF0ZWQgaXMgbmVlZGVkLiBUaGVyZSBhcmUgc2V2ZXJhbCByZWFzb25hYmxlIHdheXMgdG8gZ2F0aGVyIHRoaXMgaW5mby4KLSAgCi0gICogRm9yIHNldmVyYWwgeWVhcnMsIFRyaW5pZGFkIGhhcyB1c2VkIHhtbCBmaWxlcyB0byBkZWNsYXJlIHRoZSBuZWNlc3NhcnkgZGF0YS4KLSAgCi0gICogVGhlIFRvYmFnbyBwcm9qZWN0IHVzZXMgamF2YTEuNSBhbm5vdGF0aW9ucyAod2l0aCBjb21waWxlLXNjb3BlIHJldGVudGlvbikgcGx1cwotICAgIGludHJvc3BlY3Rpb24gb2YgdGhlIGNsYXNzZXMgKHZpYSB0aGUgYXB0IHRvb2wgYW5kIHRoZSBjb20uc3VuLm1pcnJvciBhcGkpIHRvCi0gICAgZGVyaXZlIHRoZSBuZWNlc3NhcnkgZGF0YS4KLSAgCi0gICogVGhlIHVzZSBvZiBqYXZhZG9jIGFubm90YXRpb25zIGZvciBtZXRhZGF0YSAoZWcgeGRvY2xldCkgYWxzbyBoYXMgYSBsb25nIHN1Y2Nlc3NmdWwKLSAgICBoaXN0b3J5IGFzIGEgd2F5IHRvIHJlcHJlc2VudCBtZXRhZGF0YS4KLQotICBbXQotICAKLSAgSW4gYWRkaXRpb24sIHBlb3BsZSB3aWxsIG5vIGRvdWJ0IGludmVudCBvdGhlciBzb2x1dGlvbnMgaW4gdGhlIGZ1dHVyZS4KLSAgCi0gIFRoZXJlZm9yZSwgdGhlIG15ZmFjZXMtYnVpbGRlci1wbHVnaW4gcHJvdmlkZXMgInBsdWdnYWJsZSIgbWV0YWRhdGEgZ2F0aGVyaW5nIGluIG9yZGVyCi0gIGZvciBkaWZmZXJlbnQgcHJvamVjdHMgdG8gcmVwcmVzZW50IHRoZWlyIG1ldGFkYXRhIGFzIHRoZXkgd2lzaC4gSW4gZmFjdCwgaXQgc2hvdWxkCi0gIHN1cHBvcnQgImNoYWluaW5nIiBvZiBtZXRhZGF0YSBnYXRoZXJpbmcsIHNvIHRoYXQgcGFydCBvZiB0aGUgZGF0YSBjYW4gYmUgZ2F0aGVyZWQgb25lCi0gIHdheSwgYW5kIHBhcnQgb2YgaXQgYW5vdGhlciB3YXkuCi0gIAotICBBZnRlciBhIHByb2plY3QgdXNpbmcgdGhlIG15ZmFjZXMtYnVpbGRlci1wbHVnaW4gaXMgcHVibGlzaGVkLCBwZW9wbGUgY2FuIHRoZW4gZGVyaXZlCi0gIHRoZWlyIG93biBjb21wb25lbnRzIGZyb20gdGhlIGNsYXNzZXMgaW4gdGhlIHB1Ymxpc2hlZCBqYXJmaWxlLiBUaGV5IGNhbiBhbHdheXMgaW1wbGVtZW50Ci0gIHRoZWlyIG93biBzb2x1dGlvbiBmb3IgZGVmaW5pbmcgdGhlIG5lY2Vzc2FyeSB0YWcgY2xhc3NlcywgY29uZmlnIGZpbGVzLCBldGMuIEhvd2V2ZXIgaXQKLSAgd291bGQgYmUgbmljZSB0byBhbGxvdyB0aGlzIHBsdWdpbiB0byBhbHNvIGJlIHVzYWJsZSBvbiB0aGF0IGV4dGVybmFsIGNvZGUuIEFuZCBpbiBmYWN0Ci0gIHRoaXMgc2FtZSBpc3N1ZSBhbHNvIG9jY3VycyBpbnRlcm5hbGx5IHdpdGhpbiBteWZhY2VzLCBlZyBiZXR3ZWVuIHRoZSAtYXBpIGFuZCAtaW1wbCBqYXJzCi0gIG9mIGEgSlNGIGltcGxlbWVudGF0aW9uLiBUaGVyZSBhcmUgYSBudW1iZXIgb2YgcG9zc2libGUgc29sdXRpb25zLCBidXQgdGhlIG9uZSBjaG9zZW4gaXMKLSAgZm9yIG15ZmFjZXMtYnVpbGRlci1wbHVnaW4gdG8gZ2VuZXJhdGUgYSAueG1sIGZpbGUgY29udGFpbmluZyB0aGUgbWV0YWRhdGEgaXQgaGFzIGdhdGhlcmVkCi0gIGFib3V0IGEgcHJvamVjdCwgYW5kIGZvciB0aGlzIGZpbGUgdG8gYmUgcHVibGlzaGVkIGluIHRoZSBNRVRBLUlORiBkaXJlY3Rvcnkgb2YgZWFjaCAKLSAgamFyZmlsZS4gVGhpcyBmaWxlIGNhbiB0aGVuIGJlIHVzZWQgYXMgYW5vdGhlciBzb3VyY2Ugb2YgbWV0YS1kYXRhIGJ5IHRoZSBidWlsZGVyIHBsdWdpbgotICBpdHNlbGY7IGllIGlmIHRoZSBidWlsZGVyIGhhcyBidWlsdCBwcm9qZWN0IEEsIHRoZW4gaXQgY2FuIHVzZSB0aGUgZmlsZSBpdCBsZWZ0IGluIHRoZQotICBNRVRBLUlORiBvZiBBLmphciBpbiBvcmRlciB0byBoZWxwIGJ1aWxkIGNvbXBvbmVudHMgdGhhdCBleHRlbmQgdGhlIGNsYXNzZXMgaW4gQS4KLSAgCi1HZW5lcmF0aW5nIG91dHB1dAotCi0gIFRoZSB3aG9sZSBwb2ludCBvZiB0aGUgYXJ0aWZhY3RzIGJlaW5nIGdlbmVyYXRlZCAoY29uZmlnIGZpbGVzIG9yIGphdmEgY29kZSkgaXMgdGhhdCB0aGV5Ci0gIGFyZSB2ZXJ5IHJlcGV0aXRpdmUgaW50ZXJuYWxseSwgdmFyeWluZyBvbmx5IGR1ZSB0byB0aGUgbWV0YWRhdGEgaW5mb3JtYXRpb24uIFRoZXJlZm9yZQotICBhIHRlbXBsYXRpbmcgbWVjaGFuaXNtIHNob3VsZCBiZSB1c2VkIHRvIGdlbmVyYXRlIHRoZXNlLgotICAKLSAgSG93ZXZlciB0aGVyZSBhcmUgYSBsYXJnZSBudW1iZXIgb2YgcG9zc2libGUgdGVtcGxhdGluZyBzb2x1dGlvbnMuIEluIGFkZGl0aW9uLCB0aGUKLSAgdHJpbmlkYWQgcGx1Z2luIGhhcyBhIGhpc3Rvcnkgb2YgZ2VuZXJhdGluZyBvdXRwdXQgdmlhIGhhcmQtY29kaW5nIHByaW50IHN0YXRlbWVudHMgaW4KLSAgamF2YSByYXRoZXIgdGhhbiB1c2luZyB0ZW1wbGF0aW5nLgotICAKLSAgVGhlIGJ1aWxkZXIgcGx1Z2luIHRoZXJlZm9yZSBhbHNvIHByb3ZpZGVzIGEgInBsdWdnYWJsZSIgZ2VuZXJhdGlvbiBtZWNoYW5pc20sIHNvIHRoYXQKLSAgcHJvamVjdHMgY2FuIGN1c3RvbWlzZSB0aGUgcHJvY2VzcyBhcyB0aGV5IG5lZWQuIAotICAKLSAgSW5pdGlhbGx5LCBidWlsZGVyIHdpbGwgc3VwcG9ydCB0aGUgb3JnLmFudGxyLlN0cmluZ1RlbXBsYXRlIGxpYnJhcnkgYXMgdGhlIHRlbXBsYXRlCi0gIG1lY2hhbmlzbSwgbWFpbmx5IGJlY2F1c2UgdGhhdCBpcyB3aGF0IFRvYmFnbyBjdXJyZW50bHkgdXNlcy4gSG93ZXZlciB0aGVyZSBpcyBubwotICByZWFzb24gd2h5IG90aGVyIGFwcHJvYWNoZXMgY2Fubm90IGJlIHVzZWQuCi0gIAotUmVwcmVzZW50aW5nIE1ldGFEYXRhIGludGVybmFsbHkKLQotICBDbGFzc2VzIGluIHRoZSAibW9kZWwiIHBhY2thZ2Ugc3RvcmUgYWxsIHRoZSBtZXRhZGF0YSB0aGF0IGNhbiBiZSBnYXRoZXJlZC4gVGhlIG1vZGVsIGlzCi0gIHRoZXJlZm9yZSB0aGUgdW5pb24gb2YgYWxsIGRhdGEgbmVlZGVkIGJ5IGFsbCBzdXBwb3J0ZWQgcHJvamVjdHMuIAotICAKLSAgVGhlIG1vZGVsIG9iamVjdHMgYXJlIGNyZWF0ZWQvcG9wdWxhdGVkIGJ5IHRoZSBtb2RlbC1idWlsZGVycywgYW5kIHRoZW4gdXNlZCBieSB0aGUKLSAgdmFyaW91cyBnZW5lcmF0b3IgbW9kdWxlcy4KLSAgCi0gIFRoZSBtZXRhZGF0YSBpdHNlbGYgY2FuIGJlIHdyaXR0ZW4gdG8geG1sIGFuZCByZWFkIGJhY2sgZnJvbSB4bWwuIFRoaXMgYWxsb3dzIHRoZSBmb2xsb3dpbmc6Ci0gIAotICAqIHRoZSB0YXNrIG9mIGdhdGhlcmluZyB0aGUgbWV0YWRhdGEgY2FuIGJlIG9uZSBtYXZlbiBnb2FsLCB3aXRoIG91dHB1dCBiZWluZyBhIGZpbGUuCi0KLSAgKiB0aGUgdGFzayBvZiBnZW5lcmF0aW5nIGFydGZhY3RzIGZyb20gbWV0YWRhdGEgY2FuIGp1c3QgcmVhZCB0aGUgcHJldmlvdXNseS1jcmVhdGVkIG1ldGFkYXRhCi0gICAgZmlsZSB3aXRob3V0IHJlcGVhdGluZyB0aGUgZGF0YS1nYXRoZXJpbmcgcHJvY2Vzcy4KLSAgICAKLSAgW10KLQotICBJdCBhbHNvIG1lYW5zIHRoYXQ6Ci0gICAgICAKLSAgKiBtZXRhZGF0YSBjYW4gYmUgc3RvcmVkIGluIGEgZmlsZSBpbiB0aGUgTUVUQS1JTkYgb2YgYSBwdWJsaXNoZWQgamFyCi0KLSAgKiB0aGUgYnVpbGRlciBwbHVnaW4gY2FuIHJlLXJlYWQgdGhlIGZpbGUgZnJvbSB0aGUgTUVUQS1JTkYgb2YgYSBwdWJsaXNoZWQgamFyLCBhbGxvd2luZwotICAgIGxpYnJhcmllcyB0byBlYXNpbHkgKmV4dGVuZCogY2xhc3NlcyBkZWNsYXJlZCBpbiBhIHB1Ymxpc2hlZCBqYXIgYW5kIHN0aWxsIGhhdmUgYWNjZXNzCi0gICAgdG8gdGhlIG1ldGFkYXRhIGZvciB0aG9zZSBhbmNlc3RvciBjbGFzc2VzLiAgLS0tLS0tCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9zaXRlL2FwdC9wcm9wZXJ0aWVzLmFwdCBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL3NpdGUvYXB0L3Byb3BlcnRpZXMuYXB0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMmNiOTFjLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL3NpdGUvYXB0L3Byb3BlcnRpZXMuYXB0CisrKyAvZGV2L251bGwKQEAgLTEsMTQ2ICswLDAgQEAKLSB+fiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUNCi0gfn4gY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoDQotIH5+IHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4NCi0gfn4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjANCi0gfn4gKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCi0gfn4gdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gfn4NCi0gfn4gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gfn4NCi0gfn4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLSB+fiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSB+fiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCi0gfn4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLSB+fiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCi0gDQotIC0tLS0tLQ0KLSBQcm9wZXJ0aWVzDQotIC0tLS0tLQ0KLSANCi1Qcm9wZXJ0aWVzDQotIA0KLSAgICBDb21wb25lbnRzLCBjb252ZXJ0ZXJzIGFuZCB2YWxpZGF0b3JzIGhhdmUgcHJvcGVydGllcy4gVXN1YWxseSwNCi0gICAgcHJvcGVydGllcyBtdXN0IGJlIGRlZmluZWQgb24gLnRsZCBmaWxlcy4gQWxzbywgcHJvcGVydHkgZ2V0dGVyL3NldHRlcg0KLSAgICBhbmQgc2F2ZVN0YXRlL3Jlc3RvcmVTdGF0ZSBtZXRob2RzIGNhbiBiZSBnZW5lcmF0ZWQgYXV0b21hdGljYWxseSwgDQotICAgIHJlZHVjaW5nIHRoZSBhbW91bnQgb2YgY29kZSB0aGF0IHNob3VsZCBiZSBtYWludGFpbmVkLg0KLSAgICANCi0gICAgUHJvcGVydGllcyBhcmUgaW5oZXJpdGVkLCBzbyBpZiBhIGNvbXBvbmVudC9jb252ZXJ0ZXIvdmFsaWRhdG9yIGV4dGVuZHMNCi0gICAgZnJvbSBhIHBhcmVudCBjb21wb25lbnQvY29udmVydGVyL3ZhbGlkYXRvciB0aGF0IGhhcyBzb21lIHByb3BlcnR5IA0KLSAgICBkZWZpbmVkLCB0aGUgY2hpbGQgbXVzdCBoYXZlIGl0IG9uIGl0cyAudGxkLiANCi0gICAgDQotICAgIEJ1dCBzb21ldGltZXMgd2UgaGF2ZSB0aGUgZm9sbG93aW5nIHNjZW5hcmlvczoNCi0gICAgDQotICAgICAqIENvbXBvbmVudHMsIGNvbnZlcnRlcnMgYW5kIHZhbGlkYXRvcnMgYWxzbyBoYXZlIHByb3BlcnRpZXMgd2l0aA0KLSAgICAgICBubyBnZXR0ZXIgYW5kIHNldHRlcnMgKGxpa2UgImJpbmRpbmciIHByb3BlcnR5KSwgd2hpY2ggYXJlIGltcGxlbWVudGVkDQotICAgICAgIGluIHRoZWlyIHRhZyBjbGFzc2VzIG9yIGZhY2VsZXRzIHRhZyBoYW5kbGVyLg0KLSAgICANCi0gICAgICogQWxzbywgc29tZSBwcm9wZXJ0aWVzIGltcGxlbWVudGVkIG9uIGEgcGFyZW50IGNsYXNzIGFyZSBub3QgDQotICAgICAgIGltcGxlbWVudGVkIG9uIHNvbWUgY2hpbGRyZW4sIHNvIHdlIG5lZWQgdG8gZXhjbHVkZSBpdCBmcm9tIGl0cw0KLSAgICAgICB0bGQgZGVmaW5pdGlvbi4NCi0NCi0gICAgICogVXNlcnMgY2FuIGltcGxlbWVudCBpdHMgb3duIHNldHRlciBhbmQgZ2V0dGVyIG1ldGhvZHMgZm9yIHByb3BlcnRpZXMuDQotICAgICANCi0gICAgICogU29tZSBwcm9wZXJ0aWVzIGFyZSByZWxhdGVkIG9ubHkgdG8gY29tcG9uZW50IGJ1dCBzaG91bGQgbm90IGJlIG9uDQotICAgICAgIHRsZC4NCi0gICAgICAgDQotICAgICAqIFNvbWUgcHJvcGVydGllcyBoYXZlIHNvbWUgc3BlY2lmaWMgYmVoYXZpb3IgKGZvciBleGFtcGxlIHRoZXkgY291bGQgDQotICAgICAgIGNvbnRhaW5zIG9iamVjdHMgaW1wbGVtZW50aW5nIFN0YXRlSG9sZGVyIGludGVyZmFjZSkuDQotICAgICAgIA0KLSAgICBBbGwgdGhlc2UgY2FzZXMgY291bGQgYmUgaGFuZGxlZCB1c2luZyBASlNGUHJvcGVydHkgYW5kIEBKU0ZKc3BQcm9wZXJ0eQ0KLSAgICBhbm5vdGF0aW9ucy4gQmVsb3cgdGhlcmUgYXJlIHNvbWUgZXhhbXBsZXMgZGVzY3JpYmluZyBob3cgdG8gdXNlIGl0Lg0KLSAgICANCi0qIEdlbmVyYWwgY2FzZQ0KLQ0KLSAgICBUaGUgbW9zdCBjb21tb24gY2FzZSBpcyBsZXQgdGhlIHByb3BlcnR5IGJvZHkgYmUgZ2VuZXJhdGVkLg0KLQ0KLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0gIA0KLSAgICBASlNGUHJvcGVydHkNCi0gICAgcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRBdXRvY29tcGxldGUoKTsNCi0gIA0KLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0NCi0qIEN1c3RvbSBJbXBsZW1lbnRhdGlvbiBvZiBnZXR0ZXIvc2V0dGVycw0KLQ0KLSAgICBPbmUgZXhhbXBsZSBpcyBVSVZpZXdSb290ICJyZW5kZXJLaXRJZCIgcHJvcGVydHk6IA0KLSAgICANCi0tLS0tLS0tLS0tLS0tLS0tLS0tDQotICAgIEBKU0ZQcm9wZXJ0eQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFJlbmRlcktpdElkKCkNCi0gICAgew0KLSAgICAgICAgLy8uLi4gY3VzdG9tIGltcGxlbWVudGF0aW9uIC4uLg0KLSAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgdm9pZCBzZXRSZW5kZXJLaXRJZChTdHJpbmcgcmVuZGVyS2l0SWQpDQotICAgIHsNCi0gICAgICAgIC8vLi4uIGN1c3RvbSBpbXBsZW1lbnRhdGlvbiAuLi4NCi0gICAgfSANCi0tLS0tLS0tLS0tLS0tLS0tLS0tDQotDQotKiBQcm9wZXJ0aWVzIHdpdGhvdXQgZ2V0dGVyL3NldHRlcnMNCi0NCi0gICAgVGhpcyBzeW50YXggc2hvdWxkIGJlIHVzZWQgb25seSBpbiB2ZXJ5IHNwZWNpYWwgY2FzZXMgYW5kIHVzZXJzIHNob3VsZA0KLSAgICB1c2UgQEpTRlByb3BlcnR5IGFubm90YXRpb24vZG9jbGV0IGluc3RlYWQuDQotDQotLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLUBKU0ZDb21wb25lbnQodHlwZSA9ICJqYXZheC5mYWNlcy5Db21wb25lbnRCYXNlIiwgZmFtaWx5ID0gImphdmF4LmZhY2VzLkNvbXBvbmVudEJhc2UiLCBkZXNjID0gImJhc2UgY29tcG9uZW50IHdoZW4gYWxsIGNvbXBvbmVudHMgbXVzdCBpbmhlcml0IiwgdGFnQ2xhc3MgPSAiamF2YXguZmFjZXMud2ViYXBwLlVJQ29tcG9uZW50RUxUYWciLCBjb25maWdFeGNsdWRlZCA9IHRydWUpDQotQEpTRkpzcFByb3BlcnR5KG5hbWUgPSAiYmluZGluZyIsIA0KLSAgICByZXR1cm5UeXBlID0gImphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudCIsIA0KLSAgICBsb25nRGVzYyA9ICJJZGVudGlmaWVzIGEgYmFja2luZyBiZWFuIHByb3BlcnR5IChvZiB0eXBlIFVJQ29tcG9uZW50IG9yIGFwcHJvcHJpYXRlIHN1YmNsYXNzKSB0byBiaW5kIHRvIHRoaXMgY29tcG9uZW50IGluc3RhbmNlLiBUaGlzIHZhbHVlIG11c3QgYmUgYW4gRUwgZXhwcmVzc2lvbi4iLCBkZXNjID0gImJhY2tpbmcgYmVhbiBwcm9wZXJ0eSB0byBiaW5kIHRvIHRoaXMgY29tcG9uZW50IGluc3RhbmNlIikNCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgVUlDb21wb25lbnRCYXNlIGV4dGVuZHMgVUlDb21wb25lbnQNCi17DQotICAgIC8vIC4uLi4gc29tZSBjb2RlIC4uLg0KLX0NCi0tLS0tLS0tLS0tLS0tLS0tLS0tDQotDQotKiBFeGNsdWRpbmcgcHJvcGVydGllcyBmcm9tIHRsZA0KLQ0KLSAgICBPbmUgZXhhbXBsZSBpcyBVSVBhcmFtZXRlciAicmVuZGVyZWQiIHByb3BlcnR5Og0KLQ0KLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0NCi0gICAgLyoqDQotICAgICAqIERpc2FibGUgdGhpcyBwcm9wZXJ0eTsgYWx0aG91Z2ggdGhpcyBjbGFzcyBleHRlbmRzIGEgYmFzZS1jbGFzcyB0aGF0IGRlZmluZXMgYSByZWFkL3dyaXRlIHJlbmRlcmVkIHByb3BlcnR5LCB0aGlzDQotICAgICAqIHBhcnRpY3VsYXIgc3ViY2xhc3MgZG9lcyBub3Qgc3VwcG9ydCBzZXR0aW5nIGl0LiBZZXMsIHRoaXMgaXMgYnJva2VuIE9PIGRlc2lnbjogZGlyZWN0IGFsbCBjb21wbGFpbnRzIHRvIHRoZSBKU0YNCi0gICAgICogc3BlYyBncm91cC4NCi0gICAgICovDQotICAgIEBPdmVycmlkZQ0KLSAgICBASlNGUHJvcGVydHkodGFnRXhjbHVkZWQgPSB0cnVlKQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRSZW5kZXJlZChib29sZWFuIHN0YXRlKQ0KLSAgICB7DQotICAgICAgICBzdXBlci5zZXRSZW5kZXJlZChzdGF0ZSk7DQotICAgICAgICAvLyBjYWxsIHBhcmVudCBtZXRob2QgZHVlIFRDSyBwcm9ibGVtcw0KLSAgICAgICAgLy8gdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7DQotICAgIH0NCi0tLS0tLS0tLS0tLS0tLS0tLS0tDQotDQotKiBQcm9wZXJ0aWVzIHdpdGggZGlmZmVyZW50IG5hbWUgaW4gY29tcG9uZW50IGFuZCB0YWcgY2xhc3MNCi0NCi0gICAgT25lIGV4YW1wbGUgaXMgVUlDb21tYW5kICJhY3Rpb24iIHByb3BlcnR5LiBUbyBjaGFuZ2UgaXQgb24gdGxkLCANCi0gICAgdXNlICJqc3BOYW1lIi4gDQotDQotLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSAgICBASlNGUHJvcGVydHkoc3RhdGVIb2xkZXIgPSB0cnVlLCByZXR1cm5TaWduYXR1cmUgPSAiamF2YS5sYW5nLk9iamVjdCIsIGpzcE5hbWUgPSAiYWN0aW9uIikNCi0gICAgcHVibGljIE1ldGhvZEV4cHJlc3Npb24gZ2V0QWN0aW9uRXhwcmVzc2lvbigpDQotICAgIHsNCi0gICAgICAgIC8vIC4uLi4gc29tZSBjb2RlIC4uLg0KLSAgICB9DQotLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQ0KLSogTWV0aG9kRXhwcmVzc2lvbi9NZXRob2RCaW5kaW5nIHByb3BlcnRpZXMNCi0NCi0tLS0tLS0tLS0tLS0tLS0tLS0tDQotDQotICAgIEBKU0ZQcm9wZXJ0eShzdGF0ZUhvbGRlciA9IHRydWUsIHJldHVyblNpZ25hdHVyZSA9ICJ2b2lkIiwgbWV0aG9kU2lnbmF0dXJlID0gImphdmF4LmZhY2VzLmV2ZW50LkFjdGlvbkV2ZW50IikNCi0gICAgcHVibGljIE1ldGhvZEJpbmRpbmcgZ2V0QWN0aW9uTGlzdGVuZXIoKQ0KLSAgICB7DQotICAgICAgICAvLyAuLi4uIHNvbWUgY29kZSAuLi4NCi0gICAgfQ0KLSAgICANCi0gICAgQEpTRlByb3BlcnR5KHN0YXRlSG9sZGVyID0gdHJ1ZSwgcmV0dXJuU2lnbmF0dXJlID0gImphdmEubGFuZy5PYmplY3QiLCBqc3BOYW1lID0gImFjdGlvbiIpDQotICAgIHB1YmxpYyBNZXRob2RFeHByZXNzaW9uIGdldEFjdGlvbkV4cHJlc3Npb24oKQ0KLSAgICB7DQotICAgICAgICAvLyAuLi4uIHNvbWUgY29kZSAuLi4NCi0gICAgfQ0KLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0NCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9zaXRlL2FwdC9zZXR1cC5hcHQgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9zaXRlL2FwdC9zZXR1cC5hcHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3YzMyNTUuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvc2l0ZS9hcHQvc2V0dXAuYXB0CisrKyAvZGV2L251bGwKQEAgLTEsMTY4ICswLDAgQEAKLSB+fiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUNCi0gfn4gY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoDQotIH5+IHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4NCi0gfn4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjANCi0gfn4gKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCi0gfn4gdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gfn4NCi0gfn4gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gfn4NCi0gfn4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLSB+fiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSB+fiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCi0gfn4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLSB+fiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCi0gDQotIC0tLS0tLQ0KLSBTZXR0aW5nIHVwIHlvdXIgcHJvamVjdCANCi0gLS0tLS0tDQotIA0KLVNldHRpbmcgdXAgeW91ciBwcm9qZWN0DQotIA0KLSogQ29uZmlndXJpbmcgeW91ciBwb20ueG1sDQotDQotICAgIEFjY29yZGluZyB0byB5b3VyIGpzZiB2ZXJzaW9uIHlvdSB3aWxsIG5lZWQgdG8gc2V0IHRoZSByZXF1aXJlZA0KLSAgICBkZXBlbmRlbmNpZXMuDQotIA0KLSAgICBJbiBqc2YgMS4xICh1c2UgZG9jbGV0cykuDQotICAgIA0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgICANCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5jb3JlPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtYXBpPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuMS42PC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotDQotICAgIEluIGpzZiAxLjIgKHVzZSBhbm5vdGF0aW9ucykuDQotICAgIA0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmNvcmU8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1hcGk8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+MS4yLjY8L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtYnVpbGRlci1hbm5vdGF0aW9uczwvYXJ0aWZhY3RJZD4gDQotICAgICAgICAgICAgPHZlcnNpb24+MS4wLjI8L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0NCi0gICAgSWYgeW91IGFyZSB3b3JraW5nIHdpdGggY29udmVydGVycyBhbmQgdmFsaWRhdG9ycywgeW91IHNob3VsZCB1c2UNCi0gICAgbXlmYWNlcyBjb21tb25zIGRlcGVuZGVuY2llcyBhcyBiYXNlIGZvciBpdDoNCi0NCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgICANCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5jb21tb25zPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtdmFsaWRhdG9yczEyPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuMC4wPC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0gICAgICAgIA0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmNvbW1vbnM8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1jb252ZXJ0ZXJzMTI8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+MS4wLjA8L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotDQotICAgIFRoZW4geW91IG5lZWQgdG8gZGVmaW5lIHRoZSBwbHVnaW4gY29uZmlndXJhdGlvbiBpbiB5b3VyIHByb2plY3RzIA0KLSAgICBwb20ueG1sIGxpa2UgdGhpczoNCi0gICAgDQotLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSAgICA8YnVpbGQ+DQotICAgICAgICA8cmVzb3VyY2VzPg0KLSAgICAgICAgICAgIDxyZXNvdXJjZT4NCi0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT5zcmMvbWFpbi9yZXNvdXJjZXM8L2RpcmVjdG9yeT4NCi0gICAgICAgICAgICAgICAgPGV4Y2x1ZGVzPg0KLSAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+KiovKi52bTwvZXhjbHVkZT4NCi0gICAgICAgICAgICAgICAgPC9leGNsdWRlcz4NCi0gICAgICAgICAgICA8L3Jlc291cmNlPiAgICANCi0gICAgICAgIDwvcmVzb3VyY2VzPg0KLSAgICAgICAgPHBsdWdpbnM+DQotICAgICAgICAgICAgPHBsdWdpbj4NCi0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHM8L2dyb3VwSWQ+DQotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtYnVpbGRlci1wbHVnaW48L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjEuMC4yPC92ZXJzaW9uPg0KLSAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4NCi0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+DQotICAgICAgICAgICAgICAgICAgICAgIDxpZD5idWlsZG1ldGFkYXRhPC9pZD4NCi0gICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPmJ1aWxkLW1ldGFkYXRhPC9nb2FsPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gd2hlbiB1c2UgY29tcG9uZW50cyAtLT4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5tYWtlLWNvbXBvbmVudHM8L2dvYWw+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+bWFrZS10YWdzPC9nb2FsPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gd2hlbiB1c2UgdmFsaWRhdG9ycyAtLT4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5tYWtlLXZhbGlkYXRvcnM8L2dvYWw+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+bWFrZS12YWxpZGF0b3ItdGFnczwvZ29hbD4NCi0gICAgICAgICAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIHdoZW4gdXNlIGNvbnZlcnRlcnMgLS0+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+bWFrZS1jb252ZXJ0ZXItdGFnczwvZ29hbD4gICAgICAgICAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4NCi0gICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gVXNlIDEuMSBvciAxLjIgYWNjb3JkaW5nIHRvIHlvdXIganNmIHZlcnNpb24gLS0+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxqc2ZWZXJzaW9uPjEuMjwvanNmVmVyc2lvbj4NCi0gICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPg0KLSAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+DQotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPg0KLSAgICAgICAgICAgICAgICAgICAgICA8aWQ+bWFrZWZhY2VzY29uZmlnPC9pZD4NCi0gICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgICAgICAgICAgICAgICAgICA8eG1sRmlsZT5NRVRBLUlORi9mYWNlcy1jb25maWcueG1sPC94bWxGaWxlPg0KLSAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+DQotICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPm1ha2UtY29uZmlnPC9nb2FsPg0KLSAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPg0KLSAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+DQotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5tYWtldGxkPC9pZD4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhtbEZpbGU+TUVUQS1JTkYvbXljb21wb25lbnRzLnRsZDwveG1sRmlsZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBhcyB0ZW1wbGF0ZUZpbGUgeW91IGNhbiB1c2UgdG9tYWhhd2sudm0gb3IgdG9tYWhhd2sxMi52bSAtLT4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlRmlsZT5teWNvbXBvbmVudHMudGxkLnZtPC90ZW1wbGF0ZUZpbGU+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhbXM+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzaG9ydG5hbWU+bXljb21wb25lbnRzPC9zaG9ydG5hbWU+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx1cmk+aHR0cDovL3d3dy5teW9yZ2FuaXR6YXRpb24ub3JnL215Y29tcG9uZW50czwvdXJpPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGlzcGxheW5hbWU+Q3VzdG9tIHRhZyBsaWJyYXJ5LjwvZGlzcGxheW5hbWU+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5FbmhhbmNlZCBzdGFuZGFyZCBKU1AgYWN0aW9ucyBhbmQgY3VzdG9tIE15RmFjZXMgYWN0aW9ucy48L2Rlc2NyaXB0aW9uPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmFtcz4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5tYWtlLWNvbmZpZzwvZ29hbD4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPg0KLSAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+DQotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5tYWtlZmFjZWxldHN0YWdsaWI8L2lkPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eG1sRmlsZT5NRVRBLUlORi9teWNvbXBvbmVudHMudGFnbGliLnhtbDwveG1sRmlsZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhtbEJhc2VGaWxlPnNyYy9tYWluL2NvbmYvTUVUQS1JTkYvZmFjZWxldHMtdGFnbGliLWJhc2UueG1sPC94bWxCYXNlRmlsZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlRmlsZT5mYWNlbGV0cy10YWdsaWIudm08L3RlbXBsYXRlRmlsZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmFtcz4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNob3J0bmFtZT5teWNvbXBvbmVudHM8L3Nob3J0bmFtZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHVyaT5odHRwOi8vd3d3Lm15b3JnYW5pdHphdGlvbi5vcmcvbXljb21wb25lbnRzPC91cmk+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYW1zPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPm1ha2UtY29uZmlnPC9nb2FsPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+DQotICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4NCi0gICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPg0KLSAgICAgICAgICAgIDwvcGx1Z2luPg0KLSAgICAgICAgPC9wbHVnaW5zPg0KLSAgICA8L2J1aWxkPg0KLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0NCi0qIEN1c3RvbWl6aW5nIHlvdXIgdGVtcGxhdGVzDQotDQotICAgIFRoZSBwbHVnaW4gdXNlcyB2ZWxvY2l0eSB0ZW1wbGF0ZXMgdG8gZ2VuZXJhdGUgZmlsZXMsIGFuZCBvbiBpdHMgamFyDQotICAgIHRoZXJlIGFyZSBzb21lIGFscmVhZHkgZGVmaW5lZC4gSWYgeW91IG5lZWQgc29tZSBmaWxlIChsaWtlIGEgdGVtcGxhdGUNCi0gICAgZm9yIHRsZCkgeW91IGNhbiBmaW5kIHRoZSBtb3N0IHVwIHRvIGRhdGUgdGVtcGxhdGUgb24gdG9tYWhhd2sgY29yZSANCi0gICAgb3IgY29yZTEyLiANCi0NCi0gICAgTW9yZSBkZXRhaWxlZCBpbmZvcm1hdGlvbiBjYW4gYmUgZm91bmQge3t7dGVtcGxhdGVzLmh0bWx9aGVyZX19LgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL3NpdGUvYXB0L3RhZ3MuYXB0IGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvc2l0ZS9hcHQvdGFncy5hcHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlODg3NGMuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvc2l0ZS9hcHQvdGFncy5hcHQKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0gfn4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlDQotIH5+IGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aA0KLSB+fiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuDQotIH5+IFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wDQotIH5+ICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQotIH5+IHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotIH5+DQotIH5+ICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotIH5+DQotIH5+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCi0gfn4gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gfn4gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotIH5+IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCi0gfn4gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQotIA0KLSAtLS0tLS0NCi0gQ3JlYXRpbmcgQ3VzdG9tIEpTRiBUYWdzIA0KLSAtLS0tLS0NCi0gDQotQ3JlYXRpbmcgQ3VzdG9tIEpTRiBUYWdzDQotIA0KLSAgICBBIEpTRiBUYWcgbmVlZHMgdGhlIGZvbGxvd2luZyBlbGVtZW50czoNCi0gICAgDQotICAgICAqIEpTUCBUYWcgY2xhc3MuDQotICAgICANCi0gICAgICogVGFnIGVudHJ5IG9uIHRsZC4NCi0NCi0gICAgICogRmFjZWxldHMgVGFnIEhhbmRsZXIgY2xhc3MgKG9wdGlvbmFsKS4NCi0NCi0gICAgICogVGFnIGVudHJ5IG9uIGZhY2VsZXRzIHRhZ2xpYiAob3B0aW9uYWwpLg0KLSAgICAgDQotICAgIE15ZmFjZXMgYnVpbGRlciBwbHVnaW4gcHJvdmlkZSBhbm5vdGF0aW9ucy9kb2NsZXRzIHRvIGhlbHAgdXNlcnMgbWFpbnRhaW4NCi0gICAgY29uZmlndXJhdGlvbiBmaWxlcy4gSW4gdGhpcyB3YXksIGFsbCBpbmZvcm1hdGlvbiBmb3IgYSB0YWcgaXMganVzdCBpbg0KLSAgICBvbmUgZmlsZS4NCi0gICAgDQotICAgIEFueSB0YWcgaXMgcmVnaXN0ZXJlZCBvbiBmYWNlbGV0cyB0YWdsaWIgaWYgaXQgaGFzIGEgcmVsYXRlZCB0YWcgaGFuZGxlci4NCi0gICAgVXN1YWxseSwgY3VzdG9tIHRhZyBjbGFzc2VzIHNob3VsZCBoYXZlIGZhY2VsZXRzIHRhZyBoYW5kbGVycyB3aXRoIA0KLSAgICBzaW1pbGFyIGZ1bmN0aW9ucywgYnV0IG9uIGZhY2VsZXRzIHdvcmxkIHRoZXJlIGlzIG5vIG5lZWQgdG8gZGVmaW5lDQotICAgIHByb3BlcnRpZXMgb24gYSB4bWwgZmlsZS4NCi0gICAgDQotU2V0dGluZyB1cCB5b3VyIHByb2plY3QNCi0NCi0gICAgQWxsIGluZm9ybWF0aW9uIHJlbGF0ZWQgY2FuIGJlIGZvdW5kIHt7e3NldHVwLmh0bWx9aGVyZX19Lg0KLQ0KLUNvbmZpZ3VyYXRpb24gZmlsZXMgKGZhY2VzLWNvbmZpZy54bWwsIC50bGQsIGZhY2VsZXRzIHRhZ2xpYikNCi0NCi0gICAgVGhpcyB7e3tjb25maWctZmlsZXMuaHRtbH1wYWdlfX0gc2hvd3Mgc29tZSBleGFtcGxlcy4NCi0gICAgDQotQW5ub3RhdGUgSlNGIFRhZyBDbGFzc2VzDQotDQotICAgIEp1c3QgYWRkIHRoZSBhbm5vdGF0aW9ucy9kb2NsZXRzIGFzIHByZXNlbnRlZCBiZWxvdzoNCi0gICAgDQotLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQ0KLUBKU0ZKc3BUYWcoDQotICAgIG5hbWUgPSAiZjp2YWx1ZUNoYW5nZUxpc3RlbmVyIiwNCi0gICAgYm9keUNvbnRlbnQgPSAiZW1wdHkiKQ0KLXB1YmxpYyBjbGFzcyBWYWx1ZUNoYW5nZUxpc3RlbmVyVGFnIGV4dGVuZHMgDQotICAgIEdlbmVyaWNMaXN0ZW5lclRhZzxFZGl0YWJsZVZhbHVlSG9sZGVyLCBWYWx1ZUNoYW5nZUxpc3RlbmVyPg0KLXsNCi0NCi0gICAgLyoqIC4uLi4uLi4uLi4uLi4gc29tZSBjb2RlIGdvZXMgaGVyZSAuLi4uLi4uLi4uLi4uLi4uLiAqKi8NCi0gICAgDQotICAgIEBPdmVycmlkZQ0KLSAgICBASlNGSnNwQXR0cmlidXRlKA0KLSAgICAgICAgY2xhc3NOYW1lID0gImphdmEubGFuZy5TdHJpbmciLA0KLSAgICAgICAgcnRleHBydmFsdWUgPSB0cnVlKQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRUeXBlKFZhbHVlRXhwcmVzc2lvbiB0eXBlKQ0KLSAgICB7DQotICAgICAgICBzdXBlci5zZXRUeXBlKHR5cGUpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBASlNGSnNwQXR0cmlidXRlKA0KLSAgICAgICAgY2xhc3NOYW1lID0gImphdmF4LmZhY2VzLmV2ZW50LlZhbHVlQ2hhbmdlTGlzdGVuZXIiLA0KLSAgICAgICAgcnRleHBydmFsdWUgPSB0cnVlKQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRCaW5kaW5nKFZhbHVlRXhwcmVzc2lvbiBiaW5kaW5nKQ0KLSAgICB7DQotICAgICAgICBzdXBlci5zZXRCaW5kaW5nKGJpbmRpbmcpOw0KLSAgICB9DQotfQ0KLS0tLS0tLS0tLS0tLS0tLS0tLS0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9zaXRlL2FwdC90ZW1wbGF0ZXMuYXB0IGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvc2l0ZS9hcHQvdGVtcGxhdGVzLmFwdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWI2NWQ5MS4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9zaXRlL2FwdC90ZW1wbGF0ZXMuYXB0CisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotIH5+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQ0KLSB+fiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgNCi0gfn4gdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLg0KLSB+fiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMA0KLSB+fiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KLSB+fiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSB+fg0KLSB+fiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSB+fg0KLSB+fiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQotIH5+IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotIH5+IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLSB+fiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQotIH5+IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSANCi0gLS0tLS0tDQotIFRlbXBsYXRlIEZpbGVzIA0KLSAtLS0tLS0NCi0gDQotVGVtcGxhdGUgRmlsZXMNCi0gDQotICAgIFRoZSBwbHVnaW4gdXNlcyBhcGFjaGUgdmVsb2NpdHkgdG8gZ2VuZXJhdGUgc2V2ZXJhbCB0eXBlcyBvZiBmaWxlcyBsaWtlDQotICAgIGNvbXBvbmVudCBjbGFzc2VzLCB0YWcgY2xhc3NlcywgY29uZmlndXJhdGlvbiBmaWxlcyBhbmQgb3RoZXJzLg0KLSAgICANCi0gICAgSW4gdGhpcyB3YXksIHRoZSBwbHVnaW4gcHJvdmlkZXMgZmxleGliaWxpdHksIGFsbG93aW5nIHVzZXJzIHRvIHdyaXRlDQotICAgIGN1c3RvbSB0ZW1wbGF0ZXMgdG8gZml0IHRoZWlyIG5lZWRzLg0KLSAgICANCi0gICAgVGVtcGxhdGUgZXhhbXBsZXMgY2FuIGJlIGZvdW5kICBpbnNpZGUgbXlmYWNlcy1idWlsZGVyLXBsdWdpbiBqYXIgZmlsZQ0KLSAgICBvbiBNRVRBLUlORiBkaXJlY3RvcnkuDQotICAgIA0KLSAgICBBbGwgdmVsb2NpdHkgdGVtcGxhdGUgZmlsZXMgYnkgZGVmYXVsdCBzaG91bGQgYmUgb24gDQotICAgIHNyYy9tYWluL3Jlc291cmNlL01FVEEtSU5GIHBhdGggb2YgeW91ciBwcm9qZWN0LiBUaGUgcGx1Z2luIHRyaWVzIHRvDQotICAgIGZpbmQgdGhlIHRlbXBsYXRlIGZpcnN0IHRoZXJlIGFuZCB0aGVuIG9uIHRoZSBwbHVnaW4gamFyLCBzbyB5b3UNCi0gICAgY2FuIG92ZXJyaWRlIHRoZSBiYXNlIHRlbXBsYXRlIGNvcHlpbmcgaXQgZnJvbSB0aGUgamFyIHRvIHRoaXMgcGF0aC4NCi0gICAgDQotICAgIFlvdSBjYW4gZmluZCB0ZW1wbGF0ZSBleGFtcGxlcyBpbiB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczoNCi0gICAgDQotICAgICAqIG15ZmFjZXMgY29yZSBwcm9qZWN0IHNvdXJjZSBjb2RlLg0KLSAgICAgDQotICAgICAqIHRvbWFoYXdrIA0KLSAgICAgICB7e3todHRwOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL215ZmFjZXMvdG9tYWhhd2svdHJ1bmsvY29yZS9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvfWNvcmV9fSwNCi0gICAgICAge3t7aHR0cDovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9teWZhY2VzL3RvbWFoYXdrL3RydW5rL2NvcmUxMi9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvfWNvcmUxMn19IA0KLSAgICAgICBhbmQgc2FuZGJveCANCi0gICAgICAge3t7aHR0cDovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9teWZhY2VzL3RvbWFoYXdrL3RydW5rL3NhbmRib3gvY29yZS9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvfWNvcmV9fSwNCi0gICAgICAge3t7aHR0cDovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9teWZhY2VzL3RvbWFoYXdrL3RydW5rL3NhbmRib3gvY29yZTEyL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi99Y29yZTEyfX0NCi0gICAgICAgc291cmNlIGNvZGUuDQotICAgICANCi0gICAgICogbXlmYWNlcyBjb21tb25zIHNvdXJjZSBjb2RlICgNCi0gICAgICAge3t7aHR0cDovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9teWZhY2VzL2NvbW1vbnMvdHJ1bmsvbXlmYWNlcy1jb21tb25zLWNvbnZlcnRlcnMvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL31jb252ZXJ0ZXJzfX0gYW5kDQotICAgICAgIHt7e2h0dHA6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvbXlmYWNlcy9jb21tb25zL3RydW5rL215ZmFjZXMtY29tbW9ucy12YWxpZGF0b3JzL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi99dmFsaWRhdG9yc319ICkuICANCi0gICAgDQotICAgIEFzIG5ldyByZWxlYXNlIG9mIGJ1aWxkZXIgcGx1Z2luIGNvbnRpbnVlcywgbmV3IHRlbXBsYXRlcyB3aWxsIGJlIGFkZGVkDQotICAgIHRvIG15ZmFjZXMtYnVpbGRlci1wbHVnaW4gamFyLCBidXQgdGhlIGxhdGVzdCBvbmVzIGNhbiBiZSBmb3VuZCBvbiANCi0gICAgdGhlIHByZXZpb3VzIGxvY2F0aW9ucy4NCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9zaXRlL2FwdC92YWxpZGF0b3JzLmFwdCBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL3NpdGUvYXB0L3ZhbGlkYXRvcnMuYXB0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYWIzYmVkLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL3NpdGUvYXB0L3ZhbGlkYXRvcnMuYXB0CisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotIH5+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQ0KLSB+fiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgNCi0gfn4gdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLg0KLSB+fiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMA0KLSB+fiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KLSB+fiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSB+fg0KLSB+fiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSB+fg0KLSB+fiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQotIH5+IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotIH5+IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLSB+fiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQotIH5+IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSANCi0gLS0tLS0tDQotIENyZWF0aW5nIEN1c3RvbSBWYWxpZGF0b3JzIA0KLSAtLS0tLS0NCi0gDQotQ3JlYXRpbmcgQ3VzdG9tIFZhbGlkYXRvcnMNCi0gDQotICAgIEEgSlNGIFZhbGlkYXRvciBuZWVkcyB0aGUgZm9sbG93aW5nIGVsZW1lbnRzOg0KLSAgICANCi0gICAgICogQSBjbGFzcyBpbXBsZW1lbnRpbmcgdmFsaWRhdG9yIGludGVyZmFjZS4NCi0gICAgIA0KLSAgICAgKiBFbnRyeSBvbiBmYWNlcy1jb25maWcueG1sLg0KLSAgICAgDQotICAgICAqIFRhZyBlbnRyeSBvbiB0bGQuDQotICAgICANCi0gICAgICogVGFnIGVudHJ5IG9uIGZhY2VsZXRzIHRhZ2xpYiAob3B0aW9uYWwpLg0KLSAgICAgDQotICAgICAqIEpTUCBUYWcgY2xhc3MNCi0gICAgIA0KLSAgICBNeWZhY2VzIGJ1aWxkZXIgcGx1Z2luIHByb3ZpZGUgYW5ub3RhdGlvbnMvZG9jbGV0cyB0byBoZWxwIHVzZXJzIG1haW50YWluDQotICAgIGNvbmZpZ3VyYXRpb24gZmlsZXMsIGFuZCBnZW5lcmF0aW5nIGJvdGggdmFsaWRhdG9yIGNsYXNzZXMgYW5kIA0KLSAgICB2YWxpZGF0b3IganNwIHRhZyBjbGFzc2VzIGF1dG9tYXRpY2FsbHkuIEluIHRoaXMgd2F5LCBhbGwgaW5mb3JtYXRpb24gDQotICAgIGZvciBhIHZhbGlkYXRvciBpcyBqdXN0IGluIG9uZSBmaWxlICh0aGUgY2xhc3MgaW1wbGVtZW50aW5nIA0KLSAgICBWYWxpZGF0b3IgaW50ZXJmYWNlKS4NCi0gICAgDQotICAgIEZvciBib3RoIGpzZiB2ZXJzaW9ucyAxLjEgYW5kIDEuMiwgaXQgaXMgbmVjZXNzYXJ5IHRvIHByb3ZpZGUgIA0KLSAgICBiYXNlIGNsYXNzZXMgZm9yIHZhbGlkYXRvcnMgYW5kIHRhZyBjbGFzc2VzLCB3aGVyZSBhbGwgZ2VuZXJhdGVkIHNob3VsZCANCi0gICAgaW5oZXJpdC4gVGhpcyBjbGFzcyBpcyBvbiBteWZhY2VzIGNvbW1vbnMgdmFsaWRhdG9ycyBwcm9qZWN0LCBidXQgDQotICAgIHVzZXJzIGNhbiBwcm92aWRlIGN1c3RvbSB0ZW1wbGF0ZXMgaW1wbGVtZW50YXRpb25zIGZvciBpdC4NCi0gICAgDQotICAgIEl0IGlzIHBvc3NpYmxlIHRvIHVzZSBhYnN0cmFjdCBwYXR0ZXJuIGZvciBjcmVhdGUgdmFsaWRhdG9yIGNsYXNzZXMsDQotICAgIGluIHNpbWlsYXIgd2F5IHRvIGNvbXBvbmVudHMuIA0KLQ0KLVNldHRpbmcgdXAgeW91ciBwcm9qZWN0DQotDQotICAgIEFsbCBpbmZvcm1hdGlvbiByZWxhdGVkIGNhbiBiZSBmb3VuZCB7e3tzZXR1cC5odG1sfWhlcmV9fS4NCi0NCi1Db25maWd1cmF0aW9uIGZpbGVzIChmYWNlcy1jb25maWcueG1sLCAudGxkLCBmYWNlbGV0cyB0YWdsaWIpDQotDQotICAgIFRoaXMge3t7Y29uZmlnLWZpbGVzLmh0bWx9cGFnZX19IHNob3dzIHNvbWUgZXhhbXBsZXMuDQotDQotQW5ub3RhdGUgVmFsaWRhdG9yIENsYXNzZXMNCi0NCi0gICAgSnVzdCBhZGQgdGhlIGFubm90YXRpb25zL2RvY2xldHMgYXMgcHJlc2VudGVkIGJlbG93Og0KLQ0KLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0gQEpTRlZhbGlkYXRvcigNCi0gICBuYW1lID0gIm1jdjp2YWxpZGF0ZUVtYWlsIiwNCi0gICB0YWdDbGFzcyA9ICJvcmcuYXBhY2hlLm15ZmFjZXMuY29tbW9ucy52YWxpZGF0b3IuVmFsaWRhdGVFbWFpbFRhZyIpDQotcHVibGljIGNsYXNzIEVtYWlsVmFsaWRhdG9yIGV4dGVuZHMgb3JnLmFwYWNoZS5teWZhY2VzLmNvbW1vbnMudmFsaWRhdG9yLlZhbGlkYXRvckJhc2UNCi17DQotDQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTElEQVRPUl9JRCA9ICJvcmcuYXBhY2hlLm15ZmFjZXMuY29tbW9ucy52YWxpZGF0b3IuRW1haWwiOw0KLSANCi0gICAgLyoqIC4uLi4uLi4uLi4gaW1wbCBjb2RlIGdvZXMgaGVyZSAuLi4uLi4uLi4gKiovDQotICAgIA0KLSAgICBASlNGUHJvcGVydHkNCi0gICAgcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eSgpDQotICAgIHsNCi0gICAgICAgIC8vU29tZSBzdHVmZg0KLSAgICB9ICAgDQotfQ0KLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0NCi1Xcml0ZSBhIFZhbGlkYXRvciBDbGFzcyB1c2luZyBBYnN0cmFjdCBQYXR0ZXJuDQotDQotICAgIFNlZSB7e3todHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2NvbW1vbnMvaW5kZXguaHRtbH1teWZhY2VzIGNvbW1vbnN9fQ0KLSAgICB2YWxpZGF0b3JzIHByb2plY3QgZm9yIGV4YW1wbGVzLg0KLQ0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL3NpdGUvc2l0ZS54bWwgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9zaXRlL3NpdGUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMWI3ZWQzLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL3NpdGUvc2l0ZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJJU08tODg1OS0xIj8+Ci0KLTwhLS0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08cHJvamVjdCBuYW1lPSJNeWZhY2VzIEJ1aWxkZXIgUGx1Z2luIj4KLSAgPGJhbm5lckxlZnQ+Ci0gICAgPG5hbWU+QXBhY2hlIE15RmFjZXM8L25hbWU+Ci0gICAgPHNyYz5pbWcvYmFubmVycy9NeUZhY2VzX2xvZ28uanBnPC9zcmM+Ci0gICAgPGhyZWY+aHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9pbmRleC5odG1sPC9ocmVmPgotICA8L2Jhbm5lckxlZnQ+Ci0KLSAgPGJhbm5lclJpZ2h0PgotICAgIDxuYW1lPkFwYWNoZSBCYW5uZXI8L25hbWU+Ci0gICAgPHNyYz5pbWcvYmFubmVycy9hcGFjaGVfYmFubmVyLnBuZzwvc3JjPgotICAgIDxocmVmPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy88L2hyZWY+Ci0gIDwvYmFubmVyUmlnaHQ+ICAKLQotICA8cHVibGlzaERhdGUgZm9ybWF0PSJkZCBNTU0geXl5eSIvPgotCi0gIDxza2luPgotICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5tYXZlbjwvZ3JvdXBJZD4KLSAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLXNpdGUtc2tpbjwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj4xPC92ZXJzaW9uPgotICA8L3NraW4+Ci0KLQotICA8Ym9keT4KLSAgICA8bGlua3M+Ci0gICAgICA8aXRlbSBuYW1lPSJBcGFjaGUiIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZyIvPgotICAgICAgPGl0ZW0gbmFtZT0iTXlGYWNlcyIgaHJlZj0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9pbmRleC5odG1sIi8+Ci0gICAgPC9saW5rcz4KLQotICAgIDxtZW51IG5hbWU9Ik92ZXJ2aWV3Ij4KLSAgICAgIDxpdGVtIG5hbWU9IkludHJvZHVjdGlvbiIgaHJlZj0iLi9pbmRleC5odG1sIi8+Ci0gICAgICA8aXRlbSBuYW1lPSJHb2FscyIgaHJlZj0iLi9wbHVnaW4taW5mby5odG1sIi8+Ci0gICAgICA8aXRlbSBuYW1lPSJIb3cgdG8gVXNlIiBocmVmPSIuL2hvd3RvLmh0bWwiLz4KLQkgIDxpdGVtIG5hbWU9IlBsdWdpbiBKYXZhZG9jIiBocmVmPSIuL2FwaWRvY3MvaW5kZXguaHRtbCIvPgotICAgICAgPGl0ZW0gbmFtZT0iRG9jbGV0cyBhbmQgQW5ub3RhdGlvbnMiIGhyZWY9Ii4vZG9jbGV0cy1hbm5vdGF0aW9ucy5odG1sIi8+Ci0JICA8aXRlbSBuYW1lPSJBbm5vdGF0aW9ucyBKYXZhZG9jIiBocmVmPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2J1aWxkLXRvb2xzL3BsdWdpbnMvbXlmYWNlcy1idWlsZGVyLWFubm90YXRpb25zL2FwaWRvY3MvaW5kZXguaHRtbCIvPgotICAgICAgPGl0ZW0gbmFtZT0iV2lraSIgaHJlZj0iaHR0cDovL3dpa2kuYXBhY2hlLm9yZy9teWZhY2VzL015ZmFjZXNCdWlsZGVyUGx1Z2luIi8+Ci0gICAgPC9tZW51PgotCi0gICAgPG1lbnUgbmFtZT0iVXNlcnMgR3VpZGUiPgotICAgICAgPGl0ZW0gbmFtZT0iU2V0dGluZyB1cCB5b3VyIHByb2plY3QiIGhyZWY9Ii4vc2V0dXAuaHRtbCIvPgotICAgICAgPGl0ZW0gbmFtZT0iVGVtcGxhdGUgRmlsZXMiIGhyZWY9Ii4vdGVtcGxhdGVzLmh0bWwiLz4KLSAgICAgIDxpdGVtIG5hbWU9IkNvbmZpZ3VyYXRpb24gRmlsZXMiIGhyZWY9Ii4vY29uZmlnLWZpbGVzLmh0bWwiLz4KLSAgICAgIDxpdGVtIG5hbWU9IkNvbXBvbmVudHMiIGhyZWY9Ii4vY29tcG9uZW50cy5odG1sIi8+ICAgICAgCi0gICAgICA8aXRlbSBuYW1lPSJDb252ZXJ0ZXJzIiBocmVmPSIuL2NvbnZlcnRlcnMuaHRtbCIvPgotICAgICAgPGl0ZW0gbmFtZT0iVmFsaWRhdG9ycyIgaHJlZj0iLi92YWxpZGF0b3JzLmh0bWwiLz4KLSAgICAgIDxpdGVtIG5hbWU9IlByb3BlcnRpZXMgZm9yIENvbXBvbmVudHMsIENvbnZlcnRlcnMgYW5kIFZhbGlkYXRvcnMiIGhyZWY9Ii4vcHJvcGVydGllcy5odG1sIi8+Ci0gICAgICA8aXRlbSBuYW1lPSJKU1AgVGFncyIgaHJlZj0iLi90YWdzLmh0bWwiLz4KLSAgICAgIDxpdGVtIG5hbWU9IkF0dHJpYnV0ZXMgZm9yIEpTUCBUYWdzIiBocmVmPSIuL2F0dHJpYnV0ZXMuaHRtbCIvPgotICAgIDwvbWVudT4KLQotICAgIDxtZW51IHJlZj0icmVwb3J0cyIvPgotCi0gIDwvYm9keT4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvQnVpbGRNZXRhRGF0YU1vam9UZXN0LmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL0J1aWxkTWV0YURhdGFNb2pvVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Mzg4ZTEzLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvQnVpbGRNZXRhRGF0YU1vam9UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uYnVpbGRlcjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uYnVpbGRlci5tb2RlbC5Db21wb25lbnRNZXRhOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uYnVpbGRlci5tb2RlbC5Nb2RlbDsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmJ1aWxkZXIubW9kZWwuUHJvcGVydHlNZXRhOwotCi0vKioKLSAqIFRlc3RzIHRoZSBmYWNlcy1jb25maWcueG1sIGdlbmVyYXRpb24gbW9qby4KLSAqLwotcHVibGljIGNsYXNzIEJ1aWxkTWV0YURhdGFNb2pvVGVzdCBleHRlbmRzIFRlc3RDYXNlCi17Ci0gICAgcHVibGljIHZvaWQgdGVzdFdyaXRlKCkgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgTW9kZWwgbW9kZWwgPSBuZXcgTW9kZWwoKTsKLQotICAgICAgICBDb21wb25lbnRNZXRhIGNvbXAgPSBuZXcgQ29tcG9uZW50TWV0YSgpOwotICAgICAgICBjb21wLnNldE5hbWUoIm1vY2tDb21wb25lbnQiKTsKLSAgICAgICAgY29tcC5zZXRDbGFzc05hbWUoImV4YW1wbGUuTW9ja0NvbXBvbmVudCIpOwotICAgICAgICBjb21wLnNldERlc2NyaXB0aW9uKCJkdW1teSBkZXNjIik7Ci0gICAgICAgIGNvbXAuc2V0TG9uZ0Rlc2NyaXB0aW9uKCJkdW1teSBsb25nIGRlc2MiKTsKLSAgICAgICAgY29tcC5zZXRGYW1pbHkoIm1vY2tGYW1pbHkiKTsKLSAgICAgICAgY29tcC5zZXRQYXJlbnRDbGFzc05hbWUoImphdmF4LmZhY2VzLlVJQ29tcG9uZW50Iik7Ci0gICAgICAgIGNvbXAuc2V0VHlwZSgibW9ja1R5cGUiKTsKLQotICAgICAgICBQcm9wZXJ0eU1ldGEgcHJvcCA9IG5ldyBQcm9wZXJ0eU1ldGEoKTsKLSAgICAgICAgcHJvcC5zZXROYW1lKCJtb2NrUHJvcCIpOwotICAgICAgICBwcm9wLnNldERlc2NyaXB0aW9uKCJwcm9wZGVzYyIpOwotICAgICAgICBwcm9wLnNldExpdGVyYWxPbmx5KEJvb2xlYW4uVFJVRSk7Ci0gICAgICAgIHByb3Auc2V0UmVxdWlyZWQoQm9vbGVhbi5UUlVFKTsKLSAgICAgICAgY29tcC5hZGRQcm9wZXJ0eShwcm9wKTsKLQotICAgICAgICBtb2RlbC5hZGRDb21wb25lbnQoY29tcCk7Ci0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL0ZsYXR0ZW5lclRlc3QuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvRmxhdHRlbmVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YTU4ZjAwLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvRmxhdHRlbmVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYwICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5idWlsZGVyOwotCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLkZpbGVXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmJ1aWxkZXIubW9kZWwuTW9kZWw7Ci0KLS8qKgotICogVGVzdCBmbGF0dGVuaW5nIG9mIGEgbW9kZWwuCi0gKi8KLXB1YmxpYyBjbGFzcyBGbGF0dGVuZXJUZXN0IGV4dGVuZHMgVGVzdENhc2UKLXsKLSAgICAvKioKLSAgICAgKiBMb2FkIHRoZSAiZ29vZGZpbGUueG1sIiBmcm9tIHRoZSBjb21wbGV4IHRlc3QgY2FzZSwgZmxhdHRlbnMgaXQgYW5kCi0gICAgICogdGhlbiBjb21wYXJlcyB0aGUgcmVzdWx0IHRvIGFuIGV4cGVjdGVkIGdvb2QgZmlsZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q29tcGxleCgpIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyID0gdGhpcy5nZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCk7Ci0KLSAgICAgICAgSW5wdXRTdHJlYW0gaXMgPSBjbGFzc0xvYWRlcgotICAgICAgICAgICAgICAgIC5nZXRSZXNvdXJjZUFzU3RyZWFtKCJidWlsZGVyL2NvbXBsZXgvZ29vZGZpbGUueG1sIik7Ci0gICAgICAgIFN0cmluZyBvcmlnID0gcmVhZEFsbChpcyk7Ci0gICAgICAgIGlzLmNsb3NlKCk7Ci0KLSAgICAgICAgTW9kZWwgbW9kZWwgPSBJT1V0aWxzLnJlYWRNb2RlbChuZXcgU3RyaW5nUmVhZGVyKG9yaWcpKTsKLQotICAgICAgICBuZXcgRmxhdHRlbmVyKG1vZGVsKS5mbGF0dGVuKCk7Ci0gICAgICAgIAotICAgICAgICBTdHJpbmdXcml0ZXIgZHN0V3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOwotICAgICAgICBJT1V0aWxzLndyaXRlTW9kZWwobW9kZWwsIGRzdFdyaXRlcik7Ci0gICAgICAgIFN0cmluZyBkc3QgPSBkc3RXcml0ZXIudG9TdHJpbmcoKTsKLQotICAgICAgICAvLyBEdW1wIHRoZSBvdXRwdXQgdG8gZGlzaywgdG8gaGVscCBkZWJ1Z2dpbmcgaWYgc29tZXRoaW5nIGZhaWxzCi0gICAgICAgIHdyaXRlQWxsKCJ0YXJnZXQvY29tcGxleC1mbGF0LnhtbCIsIGRzdCk7Ci0gICAgICAgIAotICAgICAgICAvLyBub3cgbG9hZCBnb29kZmlsZS1mbGF0LnhtbCBhbmQgY2hlY2sgdGhhdCBpdCBpcyBhcyBleHBlY3RlZAotICAgICAgICBJbnB1dFN0cmVhbSBpczIgPSBjbGFzc0xvYWRlcgotICAgICAgICAgICAgICAgIC5nZXRSZXNvdXJjZUFzU3RyZWFtKCJidWlsZGVyL2NvbXBsZXgvZ29vZGZpbGUtZmxhdC54bWwiKTsKLSAgICAgICAgY29tcGFyZURhdGEobmV3IFN0cmluZ1JlYWRlcihkc3QpLCBuZXcgSW5wdXRTdHJlYW1SZWFkZXIoaXMyKSk7Ci0gICAgICAgIGlzMi5jbG9zZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIExvYWQgdGhlICJnb29kZmlsZS54bWwiIGZyb20gdGhlIGdlbmVyYXRpb24gdGVzdCBjYXNlLCBmbGF0dGVucyBpdCBhbmQKLSAgICAgKiB0aGVuIGNvbXBhcmVzIHRoZSByZXN1bHQgdG8gYW4gZXhwZWN0ZWQgZ29vZCBmaWxlLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RHZW5lcmF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIgPSB0aGlzLmdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKTsKLQotICAgICAgICBJbnB1dFN0cmVhbSBpcyA9IGNsYXNzTG9hZGVyCi0gICAgICAgICAgICAgICAgLmdldFJlc291cmNlQXNTdHJlYW0oImJ1aWxkZXIvZ2VuZXJhdGlvbi9nb29kZmlsZS54bWwiKTsKLSAgICAgICAgU3RyaW5nIG9yaWcgPSByZWFkQWxsKGlzKTsKLSAgICAgICAgaXMuY2xvc2UoKTsKLQotICAgICAgICBNb2RlbCBtb2RlbCA9IElPVXRpbHMucmVhZE1vZGVsKG5ldyBTdHJpbmdSZWFkZXIob3JpZykpOwotCi0gICAgICAgIG5ldyBGbGF0dGVuZXIobW9kZWwpLmZsYXR0ZW4oKTsKLSAgICAgICAgCi0gICAgICAgIFN0cmluZ1dyaXRlciBkc3RXcml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0gICAgICAgIElPVXRpbHMud3JpdGVNb2RlbChtb2RlbCwgZHN0V3JpdGVyKTsKLSAgICAgICAgU3RyaW5nIGRzdCA9IGRzdFdyaXRlci50b1N0cmluZygpOwotCi0gICAgICAgIC8vIER1bXAgdGhlIG91dHB1dCB0byBkaXNrLCB0byBoZWxwIGRlYnVnZ2luZyBpZiBzb21ldGhpbmcgZmFpbHMKLSAgICAgICAgd3JpdGVBbGwoInRhcmdldC9nZW5lcmF0aW9uLWZsYXQueG1sIiwgZHN0KTsKLSAgICAgICAgCi0gICAgICAgIC8vIG5vdyBsb2FkIGdvb2RmaWxlLWZsYXQueG1sIGFuZCBjaGVjayB0aGF0IGl0IGlzIGFzIGV4cGVjdGVkCi0gICAgICAgIElucHV0U3RyZWFtIGlzMiA9IGNsYXNzTG9hZGVyCi0gICAgICAgICAgICAgICAgLmdldFJlc291cmNlQXNTdHJlYW0oImJ1aWxkZXIvZ2VuZXJhdGlvbi9nb29kZmlsZS1mbGF0LnhtbCIpOwotICAgICAgICBjb21wYXJlRGF0YShuZXcgU3RyaW5nUmVhZGVyKGRzdCksIG5ldyBJbnB1dFN0cmVhbVJlYWRlcihpczIpKTsKLSAgICAgICAgaXMyLmNsb3NlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVhZCB0aGUgY29udGVudHMgb2YgYW4gaW5wdXQgc3RyZWFtIGludG8gYSBzdHJpbmcuCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgcmVhZEFsbChJbnB1dFN0cmVhbSBpcykgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBJbnB1dFN0cmVhbVJlYWRlciByZWFkZXIgPSBuZXcgSW5wdXRTdHJlYW1SZWFkZXIoaXMpOwotICAgICAgICBTdHJpbmdCdWZmZXIgb3V0ID0gbmV3IFN0cmluZ0J1ZmZlcig0MDk2KTsKLSAgICAgICAgY2hhcltdIGJ1ZiA9IG5ldyBjaGFyWzEwMjRdOwotICAgICAgICB3aGlsZSAodHJ1ZSkKLSAgICAgICAgewotICAgICAgICAgICAgaW50IG5jaGFycyA9IHJlYWRlci5yZWFkKGJ1Zik7Ci0gICAgICAgICAgICBpZiAobmNoYXJzIDw9IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBvdXQuYXBwZW5kKGJ1ZiwgMCwgbmNoYXJzKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gb3V0LnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHdyaXRlQWxsKFN0cmluZyBkc3RGaWxlLCBTdHJpbmcgc3JjKSB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBGaWxlV3JpdGVyIGZ3ID0gbmV3IEZpbGVXcml0ZXIoZHN0RmlsZSk7Ci0gICAgICAgIGZ3LndyaXRlKHNyYyk7Ci0gICAgICAgIGZ3LmNsb3NlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29tcGFyZSB0aGUgY29udGVudHMgb2YgdHdvIFJlYWRlciBvYmplY3RzIGxpbmUtYnktbGluZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgY29tcGFyZURhdGEoUmVhZGVyIHNyYzEsIFJlYWRlciBzcmMyKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIEJ1ZmZlcmVkUmVhZGVyIGluMSA9IG5ldyBCdWZmZXJlZFJlYWRlcihzcmMxKTsKLSAgICAgICAgQnVmZmVyZWRSZWFkZXIgaW4yID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKHNyYzIpOwotCi0gICAgICAgIGludCBsaW5lID0gMDsKLSAgICAgICAgZm9yICg7OykKLSAgICAgICAgewotICAgICAgICAgICAgKytsaW5lOwotICAgICAgICAgICAgU3RyaW5nIGxpbmUxID0gaW4xLnJlYWRMaW5lKCk7Ci0gICAgICAgICAgICBTdHJpbmcgbGluZTIgPSBpbjIucmVhZExpbmUoKTsKLQotICAgICAgICAgICAgaWYgKChsaW5lMSA9PSBudWxsKSAmJiAobGluZTIgPT0gbnVsbCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gc3VjY2VzcwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKGxpbmUxID09IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmFpbCgiaW5wdXQgMiBoYXMgbW9yZSBsaW5lcyB0aGFuIGlucHV0IDEiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKGxpbmUyID09IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmFpbCgiaW5wdXQgMSBoYXMgbW9yZSBsaW5lcyB0aGFuIGlucHV0IDIiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbnB1dHMgZGlmZmVyIG9uIGxpbmUgIiArIGxpbmUsIGxpbmUxLCBsaW5lMik7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL0lPVXRpbHNUZXN0LmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL0lPVXRpbHNUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkMzA0ZjYuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9JT1V0aWxzVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI0ICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5idWlsZGVyOwotCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLkZpbGVXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmJ1aWxkZXIubW9kZWwuTW9kZWw7Ci0KLS8qKgotICogVGVzdHMgc2F2aW5nIGFuZCBsb2FkaW5nIG1vZGVscyBmcm9tIHhtbC4KLSAqLwotcHVibGljIGNsYXNzIElPVXRpbHNUZXN0IGV4dGVuZHMgVGVzdENhc2UKLXsKLSAgICAvKioKLSAgICAgKiBMb2FkIHRoZSAiZ29vZGZpbGUueG1sIiBmcm9tIHRoZSBjb21wbGV4IHRlc3QgY2FzZSBhbmQgYnVpbGQgYSBNb2RlbAotICAgICAqIG9iamVjdCBmcm9tIGl0LCB0aGVuIHNhdmUgaXQgYWdhaW4gYW5kIGNvbXBhcmUgdG8gdGhlIG9yaWdpbmFsLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RDb21wbGV4KCkgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIgPSB0aGlzLmdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKTsKLQotICAgICAgICBJbnB1dFN0cmVhbSBpcyA9IGNsYXNzTG9hZGVyCi0gICAgICAgICAgICAgICAgLmdldFJlc291cmNlQXNTdHJlYW0oImJ1aWxkZXIvY29tcGxleC9nb29kZmlsZS54bWwiKTsKLSAgICAgICAgU3RyaW5nIHNyYyA9IHJlYWRBbGwoaXMpOwotICAgICAgICBpcy5jbG9zZSgpOwotCi0gICAgICAgIFN0cmluZ1JlYWRlciBzcmNSZWFkZXIgPSBuZXcgU3RyaW5nUmVhZGVyKHNyYyk7Ci0gICAgICAgIE1vZGVsIG1vZGVsID0gSU9VdGlscy5yZWFkTW9kZWwoc3JjUmVhZGVyKTsKLQotICAgICAgICBTdHJpbmdXcml0ZXIgZHN0V3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOwotICAgICAgICBJT1V0aWxzLndyaXRlTW9kZWwobW9kZWwsIGRzdFdyaXRlcik7Ci0gICAgICAgIFN0cmluZyBkc3QgPSBkc3RXcml0ZXIudG9TdHJpbmcoKTsKLSAgICAgICAgd3JpdGVBbGwoInRhcmdldC9vdXRmaWxlLWlvdXRpbHMueG1sIiwgZHN0KTsKLQotICAgICAgICBzcmNSZWFkZXIgPSBuZXcgU3RyaW5nUmVhZGVyKHNyYyk7Ci0gICAgICAgIFN0cmluZ1JlYWRlciBkc3RSZWFkZXIgPSBuZXcgU3RyaW5nUmVhZGVyKGRzdCk7Ci0gICAgICAgIGNvbXBhcmVEYXRhKHNyY1JlYWRlciwgZHN0UmVhZGVyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZWFkIHRoZSBjb250ZW50cyBvZiBhbiBpbnB1dCBzdHJlYW0gaW50byBhIHN0cmluZy4KLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyByZWFkQWxsKElucHV0U3RyZWFtIGlzKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIElucHV0U3RyZWFtUmVhZGVyIHJlYWRlciA9IG5ldyBJbnB1dFN0cmVhbVJlYWRlcihpcyk7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBvdXQgPSBuZXcgU3RyaW5nQnVmZmVyKDQwOTYpOwotICAgICAgICBjaGFyW10gYnVmID0gbmV3IGNoYXJbMTAyNF07Ci0gICAgICAgIHdoaWxlICh0cnVlKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgbmNoYXJzID0gcmVhZGVyLnJlYWQoYnVmKTsKLSAgICAgICAgICAgIGlmIChuY2hhcnMgPD0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG91dC5hcHBlbmQoYnVmLCAwLCBuY2hhcnMpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBvdXQudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgd3JpdGVBbGwoU3RyaW5nIGRzdEZpbGUsIFN0cmluZyBzcmMpIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIEZpbGVXcml0ZXIgZncgPSBuZXcgRmlsZVdyaXRlcihkc3RGaWxlKTsKLSAgICAgICAgZncud3JpdGUoc3JjKTsKLSAgICAgICAgZncuY2xvc2UoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb21wYXJlIHRoZSBjb250ZW50cyBvZiB0d28gUmVhZGVyIG9iamVjdHMgbGluZS1ieS1saW5lLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBjb21wYXJlRGF0YShSZWFkZXIgc3JjMSwgUmVhZGVyIHNyYzIpIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgQnVmZmVyZWRSZWFkZXIgaW4xID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKHNyYzEpOwotICAgICAgICBCdWZmZXJlZFJlYWRlciBpbjIgPSBuZXcgQnVmZmVyZWRSZWFkZXIoc3JjMik7Ci0KLSAgICAgICAgaW50IGxpbmUgPSAwOwotICAgICAgICBmb3IgKDs7KQotICAgICAgICB7Ci0gICAgICAgICAgICArK2xpbmU7Ci0gICAgICAgICAgICBTdHJpbmcgbGluZTEgPSBpbjEucmVhZExpbmUoKTsKLSAgICAgICAgICAgIFN0cmluZyBsaW5lMiA9IGluMi5yZWFkTGluZSgpOwotCi0gICAgICAgICAgICBpZiAoKGxpbmUxID09IG51bGwpICYmIChsaW5lMiA9PSBudWxsKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyBzdWNjZXNzCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAobGluZTEgPT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmYWlsKCJpbnB1dCAyIGhhcyBtb3JlIGxpbmVzIHRoYW4gaW5wdXQgMSIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAobGluZTIgPT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmYWlsKCJpbnB1dCAxIGhhcyBtb3JlIGxpbmVzIHRoYW4gaW5wdXQgMiIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoIklucHV0cyBkaWZmZXIgb24gbGluZSAiICsgbGluZSwgbGluZTEsIGxpbmUyKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvTWFrZUNvbXBvbmVudHNNb2pvVGVzdC5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9NYWtlQ29tcG9uZW50c01vam9UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3MDhkODQuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9NYWtlQ29tcG9uZW50c01vam9UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uYnVpbGRlcjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotLyoqCi0gKiBUZXN0cyB0aGUgY29tcG9uZW50IGdlbmVyYXRpb24gbW9qbwotICovCi1wdWJsaWMgY2xhc3MgTWFrZUNvbXBvbmVudHNNb2pvVGVzdCBleHRlbmRzIFRlc3RDYXNlCi17Ci0gICAgcHVibGljIHZvaWQgdGVzdENsZWFuSW5pdGlhbGl6ZXJFeHByZXNzaW9uKCkgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgU3RyaW5nIGJhZEV4cHIgPQotICAgICAgICAgICAgIiAgLy8gc29tZSBzdHVmZlxuIiArCi0gICAgICAgICAgICAiXG4iCi0gICAgICAgICAgICArICIgIHRydWUiOwotCi0gICAgICAgIFN0cmluZyBjbGVhbmVkID0gTWFrZUNvbXBvbmVudHNNb2pvLmNsZWFuSW5pdGlhbGl6YXRpb25FeHByZXNzaW9uKGJhZEV4cHIpOwotICAgICAgICBTdHJpbmcgZ29vZCA9ICJ0cnVlIjsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGdvb2QsIGNsZWFuZWQpOwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0RXF1YWxzKG51bGwsIE1ha2VDb21wb25lbnRzTW9qby5jbGVhbkluaXRpYWxpemF0aW9uRXhwcmVzc2lvbigiICAiKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhudWxsLCBNYWtlQ29tcG9uZW50c01vam8uY2xlYW5Jbml0aWFsaXphdGlvbkV4cHJlc3Npb24oIiAgLy8gYmxhaCIpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL3Fkb3gvUWRveE1vZGVsQnVpbGRlclRlc3QuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvcWRveC9RZG94TW9kZWxCdWlsZGVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OWE0M2YzLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvcWRveC9RZG94TW9kZWxCdWlsZGVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjgxICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5idWlsZGVyLnFkb3g7Ci0KLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmJ1aWxkZXIuSU9VdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmJ1aWxkZXIuTW9kZWxQYXJhbXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5idWlsZGVyLm1vZGVsLkNvbXBvbmVudE1ldGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5idWlsZGVyLm1vZGVsLk1vZGVsOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uYnVpbGRlci5tb2RlbC5Qcm9wZXJ0eU1ldGE7Ci0KLS8qKgotICogVGVzdHMgdGhlIFFEb3hNb2RlbEJ1aWxkZXJUZXN0IGdlbmVyYXRpb24gbW9qby4KLSAqLwotcHVibGljIGNsYXNzIFFkb3hNb2RlbEJ1aWxkZXJUZXN0IGV4dGVuZHMgVGVzdENhc2UKLXsKLSAgICBwdWJsaWMgdm9pZCB0ZXN0TWV0aG9kVG9Qcm9wTmFtZSgpIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGFzc2VydEVxdWFscygiZm9vQmFyIiwgUWRveEhlbHBlci5tZXRob2RUb1Byb3BOYW1lKCJnZXRmb29CYXIiKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiZm9vQmFyIiwgUWRveEhlbHBlci5tZXRob2RUb1Byb3BOYW1lKCJnZXRGb29CYXIiKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygidXJsIiwgUWRveEhlbHBlci5tZXRob2RUb1Byb3BOYW1lKCJnZXRVcmwiKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygidXJsIiwgUWRveEhlbHBlci5tZXRob2RUb1Byb3BOYW1lKCJnZXRVUkwiKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygidXJsTG9jYXRpb24iLCBRZG94SGVscGVyCi0gICAgICAgICAgICAgICAgLm1ldGhvZFRvUHJvcE5hbWUoImdldFVybExvY2F0aW9uIikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoInVybExvY2F0aW9uIiwgUWRveEhlbHBlcgotICAgICAgICAgICAgICAgIC5tZXRob2RUb1Byb3BOYW1lKCJnZXRVUkxMb2NhdGlvbiIpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2NhbigpIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFFkb3hNb2RlbEJ1aWxkZXIgYnVpbGRlciA9IG5ldyBRZG94TW9kZWxCdWlsZGVyKCk7Ci0gICAgICAgIE1vZGVsIG1vZGVsID0gbmV3IE1vZGVsKCk7Ci0gICAgICAgIG1vZGVsLnNldE1vZGVsSWQoInRlc3QiKTsKLQotICAgICAgICBVUkwgc291cmNlVXJsID0gdGhpcy5nZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCkuZ2V0UmVzb3VyY2UoCi0gICAgICAgICAgICAgICAgImJ1aWxkZXIvc2ltcGxlL0Zvby5qYXZhIik7Ci0gICAgICAgIFN0cmluZyBwYXJlbnREaXJOYW1lID0gbmV3IEZpbGUoc291cmNlVXJsLmdldEZpbGUoKSkuZ2V0UGFyZW50KCk7Ci0gICAgICAgIEZpbGUgcGFyZW50RGlyID0gbmV3IEZpbGUocGFyZW50RGlyTmFtZSk7Ci0gICAgICAgIExpc3Qgc291cmNlRGlycyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgc291cmNlRGlycy5hZGQocGFyZW50RGlyLmdldEFic29sdXRlUGF0aCgpKTsKLSAgICAgICAgCi0gICAgICAgIE1vZGVsUGFyYW1zIHBhcmFtZXRlcnMgPSBuZXcgTW9kZWxQYXJhbXMoKTsKLSAgICAgICAgcGFyYW1ldGVycy5zZXRTb3VyY2VEaXJzKHNvdXJjZURpcnMpOwotICAgICAgICBidWlsZGVyLmJ1aWxkTW9kZWwobW9kZWwsIHBhcmFtZXRlcnMpOwotCi0gICAgICAgIGFzc2VydEVxdWFscygxLCBtb2RlbC5nZXRDb21wb25lbnRzKCkuc2l6ZSgpKTsKLSAgICAgICAgQ29tcG9uZW50TWV0YSBjbSA9IChDb21wb25lbnRNZXRhKSBtb2RlbC5nZXRDb21wb25lbnRzKCkuZ2V0KDApOwotICAgICAgICBhc3NlcnRFcXVhbHMoMSwgY20ucHJvcGVydGllc1NpemUoKSk7Ci0gICAgICAgIEl0ZXJhdG9yIHByb3BzID0gY20ucHJvcGVydGllcygpOwotICAgICAgICBQcm9wZXJ0eU1ldGEgcHJvcDEgPSAoUHJvcGVydHlNZXRhKSBwcm9wcy5uZXh0KCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygicHJvcDEiLCBwcm9wMS5nZXROYW1lKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImphdmEubGFuZy5TdHJpbmciLCBwcm9wMS5nZXRDbGFzc05hbWUoKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2NhbiBhIHZlcnkgc2ltcGxlIHNvdXJjZSB0cmVlLCBhbmQgY29tcGFyZSB0aGUgcmVzdWx0IChsaW5lIGJ5IGxpbmUpCi0gICAgICogYWdhaW5zdCBhICJrbm93biBnb29kIiBmaWxlLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RTaW1wbGUoKSB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBRZG94TW9kZWxCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgUWRveE1vZGVsQnVpbGRlcigpOwotCi0gICAgICAgIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyID0gdGhpcy5nZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCk7Ci0gICAgICAgIFVSTCBzb3VyY2VVcmwgPSBjbGFzc0xvYWRlci5nZXRSZXNvdXJjZSgiYnVpbGRlci9zaW1wbGUvRm9vLmphdmEiKTsKLSAgICAgICAgU3RyaW5nIHBhcmVudERpck5hbWUgPSBuZXcgRmlsZShzb3VyY2VVcmwuZ2V0RmlsZSgpKS5nZXRQYXJlbnQoKTsKLSAgICAgICAgRmlsZSBwYXJlbnREaXIgPSBuZXcgRmlsZShwYXJlbnREaXJOYW1lKTsKLSAgICAgICAgTGlzdCBzb3VyY2VEaXJzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBzb3VyY2VEaXJzLmFkZChwYXJlbnREaXIuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCi0gICAgICAgIE1vZGVsIG1vZGVsID0gbmV3IE1vZGVsKCk7Ci0gICAgICAgIG1vZGVsLnNldE1vZGVsSWQoInRlc3QiKTsKLSAgICAgICAgTW9kZWxQYXJhbXMgcGFyYW1ldGVycyA9IG5ldyBNb2RlbFBhcmFtcygpOwotICAgICAgICBwYXJhbWV0ZXJzLnNldFNvdXJjZURpcnMoc291cmNlRGlycyk7Ci0gICAgICAgIGJ1aWxkZXIuYnVpbGRNb2RlbChtb2RlbCwgcGFyYW1ldGVycyk7Ci0KLSAgICAgICAgLy8gYmFzaWMgc2FuaXR5IGNoZWNrcwotICAgICAgICBhc3NlcnRUcnVlKG1vZGVsLmdldENvbXBvbmVudHMoKS5zaXplKCkgPiAwKTsKLQotICAgICAgICAvLyBOb3cgd3JpdGUgaXQuIE9wdGlvbmFsbHksIHdlIGNvdWxkIGp1c3Qgd3JpdGUgaXQgdG8gYW4gaW4tbWVtb3J5Ci0gICAgICAgIC8vIGJ1ZmZlci4KLSAgICAgICAgRmlsZSBvdXRmaWxlID0gbmV3IEZpbGUoInRhcmdldC9zaW1wbGUtb3V0LnhtbCIpOwotICAgICAgICBJT1V0aWxzLnNhdmVNb2RlbChtb2RlbCwgb3V0ZmlsZSk7Ci0KLSAgICAgICAgU3RyaW5nV3JpdGVyIG91dGJ1ZiA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLSAgICAgICAgSU9VdGlscy53cml0ZU1vZGVsKG1vZGVsLCBvdXRidWYpOwotCi0gICAgICAgIGNvbXBhcmVEYXRhKG91dGZpbGUsICJidWlsZGVyL3NpbXBsZS9nb29kZmlsZS54bWwiKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTY2FuIGEgdmVyeSBzaW1wbGUgc291cmNlIHRyZWUgdGhhdCB1c2VzIGphdmExNSBhbm5vdGF0aW9ucywgYW5kIGNvbXBhcmUKLSAgICAgKiB0aGUgcmVzdWx0IChsaW5lIGJ5IGxpbmUpIGFnYWluc3QgYSAia25vd24gZ29vZCIgZmlsZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2ltcGxlMTUoKSB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBRZG94TW9kZWxCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgUWRveE1vZGVsQnVpbGRlcigpOwotCi0gICAgICAgIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyID0gdGhpcy5nZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCk7Ci0gICAgICAgIFVSTCBzb3VyY2VVcmwgPSBjbGFzc0xvYWRlci5nZXRSZXNvdXJjZSgiYnVpbGRlci9zaW1wbGUxNS9Gb28uamF2YSIpOwotICAgICAgICBTdHJpbmcgcGFyZW50RGlyTmFtZSA9IG5ldyBGaWxlKHNvdXJjZVVybC5nZXRGaWxlKCkpLmdldFBhcmVudCgpOwotICAgICAgICBGaWxlIHBhcmVudERpciA9IG5ldyBGaWxlKHBhcmVudERpck5hbWUpOwotICAgICAgICBMaXN0IHNvdXJjZURpcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIHNvdXJjZURpcnMuYWRkKHBhcmVudERpci5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0KLSAgICAgICAgTW9kZWwgbW9kZWwgPSBuZXcgTW9kZWwoKTsKLSAgICAgICAgbW9kZWwuc2V0TW9kZWxJZCgidGVzdCIpOwotICAgICAgICBNb2RlbFBhcmFtcyBwYXJhbWV0ZXJzID0gbmV3IE1vZGVsUGFyYW1zKCk7Ci0gICAgICAgIHBhcmFtZXRlcnMuc2V0U291cmNlRGlycyhzb3VyY2VEaXJzKTsKLSAgICAgICAgYnVpbGRlci5idWlsZE1vZGVsKG1vZGVsLCBwYXJhbWV0ZXJzKTsKLQotICAgICAgICAvLyBiYXNpYyBzYW5pdHkgY2hlY2tzCi0gICAgICAgIGFzc2VydFRydWUobW9kZWwuZ2V0Q29tcG9uZW50cygpLnNpemUoKSA+IDApOwotCi0gICAgICAgIC8vIE5vdyB3cml0ZSBpdC4gT3B0aW9uYWxseSwgd2UgY291bGQganVzdCB3cml0ZSBpdCB0byBhbiBpbi1tZW1vcnkKLSAgICAgICAgLy8gYnVmZmVyLgotICAgICAgICBGaWxlIG91dGZpbGUgPSBuZXcgRmlsZSgidGFyZ2V0L3NpbXBsZTE1LW91dC54bWwiKTsKLSAgICAgICAgSU9VdGlscy5zYXZlTW9kZWwobW9kZWwsIG91dGZpbGUpOwotCi0gICAgICAgIFN0cmluZ1dyaXRlciBvdXRidWYgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0gICAgICAgIElPVXRpbHMud3JpdGVNb2RlbChtb2RlbCwgb3V0YnVmKTsKLQotICAgICAgICBjb21wYXJlRGF0YShvdXRmaWxlLCAiYnVpbGRlci9zaW1wbGUxNS9nb29kZmlsZS54bWwiKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTY2FuIGFubm90YXRlZCBKU0ZDb21wb25lbnQgY2xhc3NlcyB3aGljaCB1c2UgY29kZS1nZW5lcmF0aW9uIHRvIAotICAgICAqIGFjdHVhbGx5IGNyZWF0ZSBjb21wb25lbnQgY2xhc3Nlcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0R2VuZXJhdGlvbigpIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFFkb3hNb2RlbEJ1aWxkZXIgYnVpbGRlciA9IG5ldyBRZG94TW9kZWxCdWlsZGVyKCk7Ci0KLSAgICAgICAgQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIgPSB0aGlzLmdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKTsKLSAgICAgICAgVVJMIHNvdXJjZVVybCA9IGNsYXNzTG9hZGVyCi0gICAgICAgICAgICAgICAgLmdldFJlc291cmNlKCJidWlsZGVyL2dlbmVyYXRpb24vdGVzdHBrZy9Db21wb25lbnRCYXNlLmphdmEiKTsKLSAgICAgICAgU3RyaW5nIHBhcmVudERpck5hbWUgPSBuZXcgRmlsZShzb3VyY2VVcmwuZ2V0RmlsZSgpKS5nZXRQYXJlbnQoKTsKLSAgICAgICAgRmlsZSBwYXJlbnREaXIgPSBuZXcgRmlsZShwYXJlbnREaXJOYW1lKTsKLSAgICAgICAgRmlsZSBiYXNlRGlyID0gcGFyZW50RGlyLmdldFBhcmVudEZpbGUoKTsKLSAgICAgICAgTGlzdCBzb3VyY2VEaXJzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBzb3VyY2VEaXJzLmFkZChiYXNlRGlyLmdldEFic29sdXRlUGF0aCgpKTsKLQotICAgICAgICBNb2RlbCBtb2RlbCA9IG5ldyBNb2RlbCgpOwotICAgICAgICBtb2RlbC5zZXRNb2RlbElkKCJ0ZXN0Iik7Ci0gICAgICAgIE1vZGVsUGFyYW1zIHBhcmFtZXRlcnMgPSBuZXcgTW9kZWxQYXJhbXMoKTsKLSAgICAgICAgcGFyYW1ldGVycy5zZXRTb3VyY2VEaXJzKHNvdXJjZURpcnMpOwotICAgICAgICBidWlsZGVyLmJ1aWxkTW9kZWwobW9kZWwsIHBhcmFtZXRlcnMpOwotCi0gICAgICAgIC8vIGJhc2ljIHNhbml0eSBjaGVja3MKLSAgICAgICAgYXNzZXJ0VHJ1ZShtb2RlbC5nZXRDb21wb25lbnRzKCkuc2l6ZSgpID4gMCk7Ci0KLSAgICAgICAgLy8gTm93IHdyaXRlIGl0LiBPcHRpb25hbGx5LCB3ZSBjb3VsZCBqdXN0IHdyaXRlIGl0IHRvIGFuIGluLW1lbW9yeQotICAgICAgICAvLyBidWZmZXIuCi0gICAgICAgIEZpbGUgb3V0ZmlsZSA9IG5ldyBGaWxlKCJ0YXJnZXQvZ2VuZXJhdGlvbi1vdXQueG1sIik7Ci0gICAgICAgIElPVXRpbHMuc2F2ZU1vZGVsKG1vZGVsLCBvdXRmaWxlKTsKLQotICAgICAgICBTdHJpbmdXcml0ZXIgb3V0YnVmID0gbmV3IFN0cmluZ1dyaXRlcigpOwotICAgICAgICBJT1V0aWxzLndyaXRlTW9kZWwobW9kZWwsIG91dGJ1Zik7Ci0KLSAgICAgICAgY29tcGFyZURhdGEob3V0ZmlsZSwgImJ1aWxkZXIvZ2VuZXJhdGlvbi9nb29kZmlsZS54bWwiKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTY2FuIGEgdmVyeSBjb21wbGV4IHNvdXJjZSB0cmVlLCBjb250YWluaW5nIGFsbCB0aGUgZGlmZmVyZW50IGZlYXR1cmVzIGluCi0gICAgICogdmFyaW91cyBjb21iaW5hdGlvbnMsIHRoZW4gZHVtcCB0aGUgcmVzdWx0IHRvIGEgZmlsZSBhbmQgY29tcGFyZSBpdCAobGluZQotICAgICAqIGJ5IGxpbmUpIGFnYWluc3QgYSAia25vd24gZ29vZCIgZmlsZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q29tcGxleCgpIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFFkb3hNb2RlbEJ1aWxkZXIgYnVpbGRlciA9IG5ldyBRZG94TW9kZWxCdWlsZGVyKCk7Ci0KLSAgICAgICAgQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIgPSB0aGlzLmdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKTsKLSAgICAgICAgVVJMIHNvdXJjZVVybCA9IGNsYXNzTG9hZGVyCi0gICAgICAgICAgICAgICAgLmdldFJlc291cmNlKCJidWlsZGVyL2NvbXBsZXgvQ29tcG9uZW50QmFzZS5qYXZhIik7Ci0gICAgICAgIFN0cmluZyBwYXJlbnREaXJOYW1lID0gbmV3IEZpbGUoc291cmNlVXJsLmdldEZpbGUoKSkuZ2V0UGFyZW50KCk7Ci0gICAgICAgIEZpbGUgcGFyZW50RGlyID0gbmV3IEZpbGUocGFyZW50RGlyTmFtZSk7Ci0gICAgICAgIExpc3Qgc291cmNlRGlycyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgc291cmNlRGlycy5hZGQocGFyZW50RGlyLmdldEFic29sdXRlUGF0aCgpKTsKLQotICAgICAgICBNb2RlbCBtb2RlbCA9IG5ldyBNb2RlbCgpOwotICAgICAgICBtb2RlbC5zZXRNb2RlbElkKCJ0ZXN0Iik7Ci0gICAgICAgIE1vZGVsUGFyYW1zIHBhcmFtZXRlcnMgPSBuZXcgTW9kZWxQYXJhbXMoKTsKLSAgICAgICAgcGFyYW1ldGVycy5zZXRTb3VyY2VEaXJzKHNvdXJjZURpcnMpOwotICAgICAgICBidWlsZGVyLmJ1aWxkTW9kZWwobW9kZWwsIHBhcmFtZXRlcnMpOwotCi0gICAgICAgIC8vIGJhc2ljIHNhbml0eSBjaGVja3MKLSAgICAgICAgYXNzZXJ0VHJ1ZShtb2RlbC5nZXRDb21wb25lbnRzKCkuc2l6ZSgpID4gMCk7Ci0KLSAgICAgICAgLy8gTm93IHdyaXRlIGl0LiBPcHRpb25hbGx5LCB3ZSBjb3VsZCBqdXN0IHdyaXRlIGl0IHRvIGFuIGluLW1lbW9yeQotICAgICAgICAvLyBidWZmZXIuCi0gICAgICAgIEZpbGUgb3V0ZmlsZSA9IG5ldyBGaWxlKCJ0YXJnZXQvY29tcGxleC1vdXQueG1sIik7Ci0gICAgICAgIElPVXRpbHMuc2F2ZU1vZGVsKG1vZGVsLCBvdXRmaWxlKTsKLQotICAgICAgICBTdHJpbmdXcml0ZXIgb3V0YnVmID0gbmV3IFN0cmluZ1dyaXRlcigpOwotICAgICAgICBJT1V0aWxzLndyaXRlTW9kZWwobW9kZWwsIG91dGJ1Zik7Ci0KLSAgICAgICAgY29tcGFyZURhdGEob3V0ZmlsZSwgImJ1aWxkZXIvY29tcGxleC9nb29kZmlsZS54bWwiKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb21wYXJlIHRoZSBjb250ZW50cyBvZiB0d28gUmVhZGVyIG9iamVjdHMgbGluZS1ieS1saW5lLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBjb21wYXJlRGF0YShGaWxlIHRlc3REYXRhZmlsZU5hbWUsIFN0cmluZyBnb29kUmVzb3VyY2VOYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFJlYWRlciB0ZXN0RGF0YVJlYWRlclJhdyA9IG5ldyBGaWxlUmVhZGVyKHRlc3REYXRhZmlsZU5hbWUpOwotCi0gICAgICAgIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyID0gdGhpcy5nZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCk7Ci0gICAgICAgIElucHV0U3RyZWFtIGdvb2REYXRhU3RyZWFtID0gY2xhc3NMb2FkZXIuZ2V0UmVzb3VyY2VBc1N0cmVhbShnb29kUmVzb3VyY2VOYW1lKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbCgiZ29vZCByZXNvdXJjZSBmaWxlIG5vdCBmb3VuZDogIiArIGdvb2RSZXNvdXJjZU5hbWUsIGdvb2REYXRhU3RyZWFtKTsKLSAgICAgICAgUmVhZGVyIGdvb2REYXRhUmVhZGVyUmF3ID0gbmV3IElucHV0U3RyZWFtUmVhZGVyKGdvb2REYXRhU3RyZWFtKTsKLQotICAgICAgICBCdWZmZXJlZFJlYWRlciB0ZXN0RGF0YVJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcih0ZXN0RGF0YVJlYWRlclJhdyk7Ci0gICAgICAgIEJ1ZmZlcmVkUmVhZGVyIGdvb2REYXRhUmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKGdvb2REYXRhUmVhZGVyUmF3KTsKLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgaW50IGxpbmUgPSAwOwotICAgICAgICAgICAgZm9yICg7OykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICArK2xpbmU7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHRlc3RMaW5lID0gdGVzdERhdGFSZWFkZXIucmVhZExpbmUoKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgZ29vZExpbmUgPSBnb29kRGF0YVJlYWRlci5yZWFkTGluZSgpOwotICAgIAotICAgICAgICAgICAgICAgIGlmICgodGVzdExpbmUgPT0gbnVsbCkgJiYgKGdvb2RMaW5lID09IG51bGwpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gc3VjY2VzcwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAodGVzdExpbmUgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGZhaWwoIlRlc3QgaW5wdXQgIiArIHRlc3REYXRhZmlsZU5hbWUgKyAiIGhhcyBmZXdlciBsaW5lcyB0aGFuIGdvb2QgZmlsZSAiICsgZ29vZFJlc291cmNlTmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYgKGdvb2RMaW5lID09IG51bGwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmYWlsKCJUZXN0IGlucHV0ICIgKyB0ZXN0RGF0YWZpbGVOYW1lICsgIiBoYXMgbW9yZSBsaW5lcyB0aGFuIGdvb2QgZmlsZSAiICsgZ29vZFJlc291cmNlTmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgIAotICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygKLSAgICAgICAgICAgICAgICAgICAgICAgICJUZXN0IGlucHV0ICIgKyB0ZXN0RGF0YWZpbGVOYW1lICsgIiBhbmQgZ29vZCBmaWxlICIgKyBnb29kUmVzb3VyY2VOYW1lICsKLSAgICAgICAgICAgICAgICAgICAgICAgICIgZGlmZmVyIG9uIGxpbmUgIiArIGxpbmUsIAotICAgICAgICAgICAgICAgICAgICAgICAgZ29vZExpbmUsIHRlc3RMaW5lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBmaW5hbGx5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHRlc3REYXRhUmVhZGVyUmF3LmNsb3NlKCk7Ci0gICAgICAgICAgICBnb29kRGF0YVN0cmVhbS5jbG9zZSgpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvYnVpbGRlci9jb21wbGV4L0NvbXBvbmVudEJhc2UuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL2J1aWxkZXIvY29tcGxleC9Db21wb25lbnRCYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3NWJkZDQuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvYnVpbGRlci9jb21wbGV4L0NvbXBvbmVudEJhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8qKgotICogQSBiYXNlIGNvbXBvbmVudCBjbGFzcy4KLSAqIDxwPgotICogVGhpcyBpcyBhIGJhc2UgY29tcG9uZW50LiBJdCBoYXMgbm8gbmFtZSwgc28gaXMgbm90IGEgY29uY3JldGUgY29tcG9uZW50LgotICogCi0gKiBASlNGQ29tcG9uZW50Ci0gKiAgIHR5cGU9ImJhc2UiCi0gKiAgIGZhbWlseT0iYmFzZSIKLSAqICAgZGVmYXVsdFJlbmRlcmVyVHlwZT0iQmFzZVJlbmRlcmVyIgotICovCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBDb21wb25lbnRCYXNlCi17Ci0gICAgLyoqCi0gICAgICogVGhlIHByb3AxIHByb3BlcnR5LgotICAgICAqIDxwPgotICAgICAqIFNvbWUgZHVtbXkgcHJvcDEgZG9jdW1lbnRhdGlvbi4KLSAgICAgKgotICAgICAqIEBKU0ZQcm9wZXJ0eQotICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0UHJvcDEoKTsKLSAgICAKLSAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRQcm9wMShTdHJpbmcgcHJvcDEpOwotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvYnVpbGRlci9jb21wbGV4L0NvbXBvbmVudENoaWxkLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy9idWlsZGVyL2NvbXBsZXgvQ29tcG9uZW50Q2hpbGQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGZjYTFhMi4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy9idWlsZGVyL2NvbXBsZXgvQ29tcG9uZW50Q2hpbGQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qKgotICogVGhlIENvbXBvbmVudENoaWxkIGNvbXBvbmVudC4KLSAqIDxwPgotICogVGhpcyBpcyBhIGNoaWxkIGNvbXBvbmVudC4gSXQgZG9lcyBub3RoaW5nIHVzZWZ1bC4KLSAqIAotICogQEpTRkNvbXBvbmVudAotICogICBuYW1lPSJmb28iCi0gKiAgIHR5cGU9ImZvbyIKLSAqICAgZmFtaWx5PSJmb28iCi0gKiAgIGRlZmF1bHRSZW5kZXJlclR5cGU9IkZvb1JlbmRlcmVyIgotICovCi1wdWJsaWMgY2xhc3MgQ29tcG9uZW50Q2hpbGQgZXh0ZW5kcyBDb21wb25lbnRCYXNlIGltcGxlbWVudHMgQ29tcG9uZW50SW50ZXJmYWNlCi17Ci0gICAgU3RyaW5nIHByb3AxOwotICAgIGJvb2xlYW4gcHJvcDI7Ci0gICAgCi0gICAgLyoqCi0gICAgICogSW1wbGVtZW50IHRoZSBhYnN0cmFjdCBwcm9wZXJ0eSBkZWZpbmVkIG9uIHRoZSBiYXNlIGNsYXNzLgotICAgICAqIE5vdGUgdGhhdCBiZWNhdXNlIHRoaXMgbWV0aG9kIGlzIG5vdCBhbm5vdGF0ZWQgd2l0aCB0aGUKLSAgICAgKiBKU0ZQcm9wZXJ0eSBhbm5vdGF0aW9uLCB0aGlzIGNvbW1lbnQgZG9lcyBub3QgYmVjb21lIHRoZQotICAgICAqIGRvY3VtZW50YXRpb24gZm9yIHRoZSBwcm9wZXJ0eSBpdHNlbGYuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRQcm9wMSgpCi0gICAgewotICAgICAgICByZXR1cm4gcHJvcDE7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UHJvcDEoU3RyaW5nIHByb3AxKQotICAgIHsKLSAgICAgICAgdGhpcy5wcm9wMSA9IHByb3AxOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoZSBwcm9wMiBwcm9wZXJ0eS4KLSAgICAgKiA8cD4KLSAgICAgKiBTb21lIGR1bW15IHByb3AyIGRvY3VtZW50YXRpb24uCi0gICAgICoKLSAgICAgKiBASlNGUHJvcGVydHkKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBnZXRQcm9wMigpIHsKLSAgICAgICAgcmV0dXJuIHByb3AyOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXRQcm9wMihib29sZWFuIHByb3AyKSB7Ci0gICAgICAgIHRoaXMucHJvcDIgPSBwcm9wMjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbXBsZW1lbnQgdGhlIG1ldGhvZCBkZWZpbmVkIG9uIENvbXBvbmVudEludGVyZmFjZS4gQmVjYXVzZSB0aGlzIG1ldGhvZCBkb2VzCi0gICAgICogbm90IHVzZSB0aGUgSlNGUHJvcGVydHkgYW5ub3RhdGlvbiwgdGhlIHByb3BlcnR5IHNldHRpbmdzIGFyZSB0YWtlbiBmcm9tIHRoZQotICAgICAqIHBhcmVudCBpbnRlcmZhY2UsIG5vdCBoZXJlLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0SWZhY2VQcm9wKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldElmYWNlUHJvcChTdHJpbmcgdmFsKQotICAgIHsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy9idWlsZGVyL2NvbXBsZXgvQ29tcG9uZW50SW50ZXJmYWNlLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy9idWlsZGVyL2NvbXBsZXgvQ29tcG9uZW50SW50ZXJmYWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyNmI1MmIuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvYnVpbGRlci9jb21wbGV4L0NvbXBvbmVudEludGVyZmFjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLyoqCi0gKiBBbiBpbnRlcmZhY2UgdGhhdCBkZWZpbmVzIGNvbXBvbmVudCBwcm9wZXJ0aWVzLgotICogPHA+Ci0gKiBUaGlzIGlzIGFuIGludGVyZmFjZSBjb21wb25lbnQuCi0gKiAKLSAqIEBKU0ZDb21wb25lbnQKLSAqICAgdHlwZT0iaWZhY2UiCi0gKiAgIGZhbWlseT0iaWZhY2UiCi0gKiAgIGRlZmF1bHRSZW5kZXJlclR5cGU9IkJhc2VSZW5kZXJlciIKLSAqLwotCi1wdWJsaWMgaW50ZXJmYWNlIENvbXBvbmVudEludGVyZmFjZQotewotICAgIC8qKgotICAgICAqIFRoZSBpZmFjZVByb3AgcHJvcGVydHkuCi0gICAgICogPHA+Ci0gICAgICogU29tZSBkdW1teSBpZmFjZVByb3AgZG9jdW1lbnRhdGlvbi4KLSAgICAgKgotICAgICAqIEBKU0ZQcm9wZXJ0eQotICAgICAqLwotICAgIFN0cmluZyBnZXRJZmFjZVByb3AoKTsKLSAgICAKLSAgICB2b2lkIHNldElmYWNlUHJvcChTdHJpbmcgdmFsKTsKLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL2J1aWxkZXIvY29tcGxleC9Db252ZXJ0ZXIxLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy9idWlsZGVyL2NvbXBsZXgvQ29udmVydGVyMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjg3NjI4Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL2J1aWxkZXIvY29tcGxleC9Db252ZXJ0ZXIxLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi0vKioKLSAqIFRoZSBDb252ZXJ0ZXIxIGNvbnZlcnRlci4KLSAqIDxwPgotICogVGhpcyBpcyBhIHNpbGx5IGNvbnZlcnRlci4gSXQgZG9lcyBub3RoaW5nIHVzZWZ1bC4KLSAqIAotICogQEpTRkNvbnZlcnRlciBpZD0iY29udjEiCi0gKi8KLXB1YmxpYyBjbGFzcyBDb252ZXJ0ZXIxIC8vIGltcGxlbWVudHMgQ29udmVydGVyCi17Ci0gICAgLy8gVE9ETzogY29udmVydGVycyBjYW4gaGF2ZSBwcm9wZXJ0aWVzIHRvbwotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvYnVpbGRlci9jb21wbGV4L1ZhbGlkYXRvcjEuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL2J1aWxkZXIvY29tcGxleC9WYWxpZGF0b3IxLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0NjRhYmEuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvYnVpbGRlci9jb21wbGV4L1ZhbGlkYXRvcjEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLS8qKgotICogVGhlIFZhbGlkYXRvcjEgdmFsaWRhdG9yLgotICogPHA+Ci0gKiBUaGlzIGlzIGEgc2lsbHkgdmFsaWRhdG9yLiBJdCBkb2VzIG5vdGhpbmcgdXNlZnVsLgotICogCi0gKiBASlNGVmFsaWRhdG9yIGlkPSJ2YWwxIgotICovCi1wdWJsaWMgY2xhc3MgVmFsaWRhdG9yMSAvLyBpbXBsZW1lbnRzIFZhbGlkYXRvcgotewotICAgIC8vIFRPRE86IHZhbGlkYXRvcnMgY2FuIGhhdmUgcHJvcGVydGllcyB0b28KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL2J1aWxkZXIvY29tcGxleC9nb29kZmlsZS1mbGF0LnhtbCBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL2J1aWxkZXIvY29tcGxleC9nb29kZmlsZS1mbGF0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTg5OWE5Yi4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy9idWlsZGVyL2NvbXBsZXgvZ29vZGZpbGUtZmxhdC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNTQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyA/PgotCi08bW9kZWw+Ci0gIDxtb2RlbElkPnRlc3Q8L21vZGVsSWQ+Ci0gIDxjb21wb25lbnQ+Ci0gICAgPG1vZGVsSWQ+dGVzdDwvbW9kZWxJZD4KLSAgICA8Y2xhc3NOYW1lPkNvbXBvbmVudEJhc2U8L2NsYXNzTmFtZT4KLSAgICA8c291cmNlQ2xhc3NOYW1lPkNvbXBvbmVudEJhc2U8L3NvdXJjZUNsYXNzTmFtZT4KLSAgICA8dHlwZT5iYXNlPC90eXBlPgotICAgIDxmYW1pbHk+YmFzZTwvZmFtaWx5PgotICAgIDxyZW5kZXJlclR5cGU+QmFzZVJlbmRlcmVyPC9yZW5kZXJlclR5cGU+Ci0gICAgPGRlc2M+QSBiYXNlIGNvbXBvbmVudCBjbGFzczwvZGVzYz4KLSAgICA8bG9uZ0Rlc2M+Ci08IVtDREFUQVsKLUEgYmFzZSBjb21wb25lbnQgY2xhc3MuCi08cD4KLVRoaXMgaXMgYSBiYXNlIGNvbXBvbmVudC4gSXQgaGFzIG5vIG5hbWUsIHNvIGlzIG5vdCBhIGNvbmNyZXRlIGNvbXBvbmVudC4KLV1dPgotICAgIDwvbG9uZ0Rlc2M+Ci0gICAgPHByb3BlcnR5PgotICAgICAgPG5hbWU+cHJvcDE8L25hbWU+Ci0gICAgICA8Y2xhc3NOYW1lPmphdmEubGFuZy5TdHJpbmc8L2NsYXNzTmFtZT4KLSAgICAgIDxkZXNjPlRoZSBwcm9wMSBwcm9wZXJ0eTwvZGVzYz4KLSAgICAgIDxsb25nRGVzYz4KLTwhW0NEQVRBWwotVGhlIHByb3AxIHByb3BlcnR5LgotPHA+Ci1Tb21lIGR1bW15IHByb3AxIGRvY3VtZW50YXRpb24uCi1dXT4KLSAgICAgIDwvbG9uZ0Rlc2M+Ci0gICAgICA8Z2VuZXJhdGVkPnRydWU8L2dlbmVyYXRlZD4KLSAgICA8L3Byb3BlcnR5PgotICA8L2NvbXBvbmVudD4KLSAgPGNvbXBvbmVudD4KLSAgICA8bW9kZWxJZD50ZXN0PC9tb2RlbElkPgotICAgIDxjbGFzc05hbWU+Q29tcG9uZW50SW50ZXJmYWNlPC9jbGFzc05hbWU+Ci0gICAgPHNvdXJjZUNsYXNzTmFtZT5Db21wb25lbnRJbnRlcmZhY2U8L3NvdXJjZUNsYXNzTmFtZT4KLSAgICA8dHlwZT5pZmFjZTwvdHlwZT4KLSAgICA8ZmFtaWx5PmlmYWNlPC9mYW1pbHk+Ci0gICAgPHJlbmRlcmVyVHlwZT5CYXNlUmVuZGVyZXI8L3JlbmRlcmVyVHlwZT4KLSAgICA8ZGVzYz5BbiBpbnRlcmZhY2UgdGhhdCBkZWZpbmVzIGNvbXBvbmVudCBwcm9wZXJ0aWVzPC9kZXNjPgotICAgIDxsb25nRGVzYz4KLTwhW0NEQVRBWwotQW4gaW50ZXJmYWNlIHRoYXQgZGVmaW5lcyBjb21wb25lbnQgcHJvcGVydGllcy4KLTxwPgotVGhpcyBpcyBhbiBpbnRlcmZhY2UgY29tcG9uZW50LgotXV0+Ci0gICAgPC9sb25nRGVzYz4KLSAgICA8cHJvcGVydHk+Ci0gICAgICA8bmFtZT5pZmFjZVByb3A8L25hbWU+Ci0gICAgICA8Y2xhc3NOYW1lPmphdmEubGFuZy5TdHJpbmc8L2NsYXNzTmFtZT4KLSAgICAgIDxkZXNjPlRoZSBpZmFjZVByb3AgcHJvcGVydHk8L2Rlc2M+Ci0gICAgICA8bG9uZ0Rlc2M+Ci08IVtDREFUQVsKLVRoZSBpZmFjZVByb3AgcHJvcGVydHkuCi08cD4KLVNvbWUgZHVtbXkgaWZhY2VQcm9wIGRvY3VtZW50YXRpb24uCi1dXT4KLSAgICAgIDwvbG9uZ0Rlc2M+Ci0gICAgPC9wcm9wZXJ0eT4KLSAgPC9jb21wb25lbnQ+Ci0gIDxjb21wb25lbnQ+Ci0gICAgPG1vZGVsSWQ+dGVzdDwvbW9kZWxJZD4KLSAgICA8Y2xhc3NOYW1lPkNvbXBvbmVudENoaWxkPC9jbGFzc05hbWU+Ci0gICAgPHBhcmVudENsYXNzTmFtZT5Db21wb25lbnRCYXNlPC9wYXJlbnRDbGFzc05hbWU+Ci0gICAgPHNvdXJjZUNsYXNzTmFtZT5Db21wb25lbnRDaGlsZDwvc291cmNlQ2xhc3NOYW1lPgotICAgIDxzb3VyY2VDbGFzc1BhcmVudENsYXNzTmFtZT5Db21wb25lbnRCYXNlPC9zb3VyY2VDbGFzc1BhcmVudENsYXNzTmFtZT4KLSAgICA8aW50ZXJmYWNlcz4KLSAgICAgIDxpbnRlcmZhY2UgbmFtZT0iQ29tcG9uZW50SW50ZXJmYWNlIi8+Ci0gICAgPC9pbnRlcmZhY2VzPgotICAgIDxuYW1lPmZvbzwvbmFtZT4KLSAgICA8dHlwZT5mb288L3R5cGU+Ci0gICAgPGZhbWlseT5mb288L2ZhbWlseT4KLSAgICA8cmVuZGVyZXJUeXBlPkZvb1JlbmRlcmVyPC9yZW5kZXJlclR5cGU+Ci0gICAgPGltcGxlbWVudGVkSW50ZXJmYWNlcz4KLSAgICAgIDxpbnRlcmZhY2UgbmFtZT0iQ29tcG9uZW50SW50ZXJmYWNlIi8+Ci0gICAgPC9pbXBsZW1lbnRlZEludGVyZmFjZXM+Ci0gICAgPGRlc2M+VGhlIENvbXBvbmVudENoaWxkIGNvbXBvbmVudDwvZGVzYz4KLSAgICA8bG9uZ0Rlc2M+Ci08IVtDREFUQVsKLVRoZSBDb21wb25lbnRDaGlsZCBjb21wb25lbnQuCi08cD4KLVRoaXMgaXMgYSBjaGlsZCBjb21wb25lbnQuIEl0IGRvZXMgbm90aGluZyB1c2VmdWwuCi1dXT4KLSAgICA8L2xvbmdEZXNjPgotICAgIDxwcm9wZXJ0eT4KLSAgICAgIDxuYW1lPnByb3AyPC9uYW1lPgotICAgICAgPGNsYXNzTmFtZT5ib29sZWFuPC9jbGFzc05hbWU+Ci0gICAgICA8ZGVzYz5UaGUgcHJvcDIgcHJvcGVydHk8L2Rlc2M+Ci0gICAgICA8bG9uZ0Rlc2M+Ci08IVtDREFUQVsKLVRoZSBwcm9wMiBwcm9wZXJ0eS4KLTxwPgotU29tZSBkdW1teSBwcm9wMiBkb2N1bWVudGF0aW9uLgotXV0+Ci0gICAgICA8L2xvbmdEZXNjPgotICAgIDwvcHJvcGVydHk+Ci0gICAgPHByb3BlcnR5PgotICAgICAgPG5hbWU+cHJvcDE8L25hbWU+Ci0gICAgICA8Y2xhc3NOYW1lPmphdmEubGFuZy5TdHJpbmc8L2NsYXNzTmFtZT4KLSAgICAgIDxkZXNjPlRoZSBwcm9wMSBwcm9wZXJ0eTwvZGVzYz4KLSAgICAgIDxsb25nRGVzYz4KLTwhW0NEQVRBWwotVGhlIHByb3AxIHByb3BlcnR5LgotPHA+Ci1Tb21lIGR1bW15IHByb3AxIGRvY3VtZW50YXRpb24uCi1dXT4KLSAgICAgIDwvbG9uZ0Rlc2M+Ci0gICAgICA8aW5oZXJpdGVkPnRydWU8L2luaGVyaXRlZD4KLSAgICAgIDxnZW5lcmF0ZWQ+dHJ1ZTwvZ2VuZXJhdGVkPgotICAgIDwvcHJvcGVydHk+Ci0gICAgPHByb3BlcnR5PgotICAgICAgPG5hbWU+aWZhY2VQcm9wPC9uYW1lPgotICAgICAgPGNsYXNzTmFtZT5qYXZhLmxhbmcuU3RyaW5nPC9jbGFzc05hbWU+Ci0gICAgICA8ZGVzYz5UaGUgaWZhY2VQcm9wIHByb3BlcnR5PC9kZXNjPgotICAgICAgPGxvbmdEZXNjPgotPCFbQ0RBVEFbCi1UaGUgaWZhY2VQcm9wIHByb3BlcnR5LgotPHA+Ci1Tb21lIGR1bW15IGlmYWNlUHJvcCBkb2N1bWVudGF0aW9uLgotXV0+Ci0gICAgICA8L2xvbmdEZXNjPgotICAgICAgPGluaGVyaXRlZD50cnVlPC9pbmhlcml0ZWQ+Ci0gICAgPC9wcm9wZXJ0eT4KLSAgPC9jb21wb25lbnQ+Ci0gIDxjb252ZXJ0ZXI+Ci0gICAgPG1vZGVsSWQ+dGVzdDwvbW9kZWxJZD4KLSAgICA8Y2xhc3NOYW1lPkNvbnZlcnRlcjE8L2NsYXNzTmFtZT4KLSAgICA8c291cmNlQ2xhc3NOYW1lPkNvbnZlcnRlcjE8L3NvdXJjZUNsYXNzTmFtZT4KLSAgICA8Y29udmVydGVySWQ+Y29udjE8L2NvbnZlcnRlcklkPgotICAgIDxkZXNjPlRoZSBDb252ZXJ0ZXIxIGNvbnZlcnRlcjwvZGVzYz4KLSAgICA8bG9uZ0Rlc2M+Ci08IVtDREFUQVsKLVRoZSBDb252ZXJ0ZXIxIGNvbnZlcnRlci4KLTxwPgotVGhpcyBpcyBhIHNpbGx5IGNvbnZlcnRlci4gSXQgZG9lcyBub3RoaW5nIHVzZWZ1bC4KLV1dPgotICAgIDwvbG9uZ0Rlc2M+Ci0gIDwvY29udmVydGVyPgotICA8dmFsaWRhdG9yPgotICAgIDxtb2RlbElkPnRlc3Q8L21vZGVsSWQ+Ci0gICAgPGNsYXNzTmFtZT5WYWxpZGF0b3IxPC9jbGFzc05hbWU+Ci0gICAgPHNvdXJjZUNsYXNzTmFtZT5WYWxpZGF0b3IxPC9zb3VyY2VDbGFzc05hbWU+Ci0gICAgPHZhbGlkYXRvcklkPnZhbDE8L3ZhbGlkYXRvcklkPgotICAgIDxkZXNjPlRoZSBWYWxpZGF0b3IxIHZhbGlkYXRvcjwvZGVzYz4KLSAgICA8bG9uZ0Rlc2M+Ci08IVtDREFUQVsKLVRoZSBWYWxpZGF0b3IxIHZhbGlkYXRvci4KLTxwPgotVGhpcyBpcyBhIHNpbGx5IHZhbGlkYXRvci4gSXQgZG9lcyBub3RoaW5nIHVzZWZ1bC4KLV1dPgotICAgIDwvbG9uZ0Rlc2M+Ci0gIDwvdmFsaWRhdG9yPgotPC9tb2RlbD4KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL2J1aWxkZXIvY29tcGxleC9nb29kZmlsZS54bWwgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy9idWlsZGVyL2NvbXBsZXgvZ29vZGZpbGUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Mzc0OWI4Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL2J1aWxkZXIvY29tcGxleC9nb29kZmlsZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMjcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyA/PgotCi08bW9kZWw+Ci0gIDxtb2RlbElkPnRlc3Q8L21vZGVsSWQ+Ci0gIDxjb21wb25lbnQ+Ci0gICAgPG1vZGVsSWQ+dGVzdDwvbW9kZWxJZD4KLSAgICA8Y2xhc3NOYW1lPkNvbXBvbmVudEJhc2U8L2NsYXNzTmFtZT4KLSAgICA8c291cmNlQ2xhc3NOYW1lPkNvbXBvbmVudEJhc2U8L3NvdXJjZUNsYXNzTmFtZT4KLSAgICA8dHlwZT5iYXNlPC90eXBlPgotICAgIDxmYW1pbHk+YmFzZTwvZmFtaWx5PgotICAgIDxyZW5kZXJlclR5cGU+QmFzZVJlbmRlcmVyPC9yZW5kZXJlclR5cGU+Ci0gICAgPGRlc2M+QSBiYXNlIGNvbXBvbmVudCBjbGFzczwvZGVzYz4KLSAgICA8bG9uZ0Rlc2M+Ci08IVtDREFUQVsKLUEgYmFzZSBjb21wb25lbnQgY2xhc3MuCi08cD4KLVRoaXMgaXMgYSBiYXNlIGNvbXBvbmVudC4gSXQgaGFzIG5vIG5hbWUsIHNvIGlzIG5vdCBhIGNvbmNyZXRlIGNvbXBvbmVudC4KLV1dPgotICAgIDwvbG9uZ0Rlc2M+Ci0gICAgPHByb3BlcnR5PgotICAgICAgPG5hbWU+cHJvcDE8L25hbWU+Ci0gICAgICA8Y2xhc3NOYW1lPmphdmEubGFuZy5TdHJpbmc8L2NsYXNzTmFtZT4KLSAgICAgIDxkZXNjPlRoZSBwcm9wMSBwcm9wZXJ0eTwvZGVzYz4KLSAgICAgIDxsb25nRGVzYz4KLTwhW0NEQVRBWwotVGhlIHByb3AxIHByb3BlcnR5LgotPHA+Ci1Tb21lIGR1bW15IHByb3AxIGRvY3VtZW50YXRpb24uCi1dXT4KLSAgICAgIDwvbG9uZ0Rlc2M+Ci0gICAgICA8Z2VuZXJhdGVkPnRydWU8L2dlbmVyYXRlZD4KLSAgICA8L3Byb3BlcnR5PgotICA8L2NvbXBvbmVudD4KLSAgPGNvbXBvbmVudD4KLSAgICA8bW9kZWxJZD50ZXN0PC9tb2RlbElkPgotICAgIDxjbGFzc05hbWU+Q29tcG9uZW50SW50ZXJmYWNlPC9jbGFzc05hbWU+Ci0gICAgPHNvdXJjZUNsYXNzTmFtZT5Db21wb25lbnRJbnRlcmZhY2U8L3NvdXJjZUNsYXNzTmFtZT4KLSAgICA8dHlwZT5pZmFjZTwvdHlwZT4KLSAgICA8ZmFtaWx5PmlmYWNlPC9mYW1pbHk+Ci0gICAgPHJlbmRlcmVyVHlwZT5CYXNlUmVuZGVyZXI8L3JlbmRlcmVyVHlwZT4KLSAgICA8ZGVzYz5BbiBpbnRlcmZhY2UgdGhhdCBkZWZpbmVzIGNvbXBvbmVudCBwcm9wZXJ0aWVzPC9kZXNjPgotICAgIDxsb25nRGVzYz4KLTwhW0NEQVRBWwotQW4gaW50ZXJmYWNlIHRoYXQgZGVmaW5lcyBjb21wb25lbnQgcHJvcGVydGllcy4KLTxwPgotVGhpcyBpcyBhbiBpbnRlcmZhY2UgY29tcG9uZW50LgotXV0+Ci0gICAgPC9sb25nRGVzYz4KLSAgICA8cHJvcGVydHk+Ci0gICAgICA8bmFtZT5pZmFjZVByb3A8L25hbWU+Ci0gICAgICA8Y2xhc3NOYW1lPmphdmEubGFuZy5TdHJpbmc8L2NsYXNzTmFtZT4KLSAgICAgIDxkZXNjPlRoZSBpZmFjZVByb3AgcHJvcGVydHk8L2Rlc2M+Ci0gICAgICA8bG9uZ0Rlc2M+Ci08IVtDREFUQVsKLVRoZSBpZmFjZVByb3AgcHJvcGVydHkuCi08cD4KLVNvbWUgZHVtbXkgaWZhY2VQcm9wIGRvY3VtZW50YXRpb24uCi1dXT4KLSAgICAgIDwvbG9uZ0Rlc2M+Ci0gICAgPC9wcm9wZXJ0eT4KLSAgPC9jb21wb25lbnQ+Ci0gIDxjb21wb25lbnQ+Ci0gICAgPG1vZGVsSWQ+dGVzdDwvbW9kZWxJZD4KLSAgICA8Y2xhc3NOYW1lPkNvbXBvbmVudENoaWxkPC9jbGFzc05hbWU+Ci0gICAgPHBhcmVudENsYXNzTmFtZT5Db21wb25lbnRCYXNlPC9wYXJlbnRDbGFzc05hbWU+Ci0gICAgPHNvdXJjZUNsYXNzTmFtZT5Db21wb25lbnRDaGlsZDwvc291cmNlQ2xhc3NOYW1lPgotICAgIDxzb3VyY2VDbGFzc1BhcmVudENsYXNzTmFtZT5Db21wb25lbnRCYXNlPC9zb3VyY2VDbGFzc1BhcmVudENsYXNzTmFtZT4KLSAgICA8aW50ZXJmYWNlcz4KLSAgICAgIDxpbnRlcmZhY2UgbmFtZT0iQ29tcG9uZW50SW50ZXJmYWNlIi8+Ci0gICAgPC9pbnRlcmZhY2VzPgotICAgIDxuYW1lPmZvbzwvbmFtZT4KLSAgICA8dHlwZT5mb288L3R5cGU+Ci0gICAgPGZhbWlseT5mb288L2ZhbWlseT4KLSAgICA8cmVuZGVyZXJUeXBlPkZvb1JlbmRlcmVyPC9yZW5kZXJlclR5cGU+Ci0gICAgPGltcGxlbWVudGVkSW50ZXJmYWNlcz4KLSAgICAgIDxpbnRlcmZhY2UgbmFtZT0iQ29tcG9uZW50SW50ZXJmYWNlIi8+Ci0gICAgPC9pbXBsZW1lbnRlZEludGVyZmFjZXM+Ci0gICAgPGRlc2M+VGhlIENvbXBvbmVudENoaWxkIGNvbXBvbmVudDwvZGVzYz4KLSAgICA8bG9uZ0Rlc2M+Ci08IVtDREFUQVsKLVRoZSBDb21wb25lbnRDaGlsZCBjb21wb25lbnQuCi08cD4KLVRoaXMgaXMgYSBjaGlsZCBjb21wb25lbnQuIEl0IGRvZXMgbm90aGluZyB1c2VmdWwuCi1dXT4KLSAgICA8L2xvbmdEZXNjPgotICAgIDxwcm9wZXJ0eT4KLSAgICAgIDxuYW1lPnByb3AyPC9uYW1lPgotICAgICAgPGNsYXNzTmFtZT5ib29sZWFuPC9jbGFzc05hbWU+Ci0gICAgICA8ZGVzYz5UaGUgcHJvcDIgcHJvcGVydHk8L2Rlc2M+Ci0gICAgICA8bG9uZ0Rlc2M+Ci08IVtDREFUQVsKLVRoZSBwcm9wMiBwcm9wZXJ0eS4KLTxwPgotU29tZSBkdW1teSBwcm9wMiBkb2N1bWVudGF0aW9uLgotXV0+Ci0gICAgICA8L2xvbmdEZXNjPgotICAgIDwvcHJvcGVydHk+Ci0gIDwvY29tcG9uZW50PgotICA8Y29udmVydGVyPgotICAgIDxtb2RlbElkPnRlc3Q8L21vZGVsSWQ+Ci0gICAgPGNsYXNzTmFtZT5Db252ZXJ0ZXIxPC9jbGFzc05hbWU+Ci0gICAgPHNvdXJjZUNsYXNzTmFtZT5Db252ZXJ0ZXIxPC9zb3VyY2VDbGFzc05hbWU+Ci0gICAgPGNvbnZlcnRlcklkPmNvbnYxPC9jb252ZXJ0ZXJJZD4KLSAgICA8ZGVzYz5UaGUgQ29udmVydGVyMSBjb252ZXJ0ZXI8L2Rlc2M+Ci0gICAgPGxvbmdEZXNjPgotPCFbQ0RBVEFbCi1UaGUgQ29udmVydGVyMSBjb252ZXJ0ZXIuCi08cD4KLVRoaXMgaXMgYSBzaWxseSBjb252ZXJ0ZXIuIEl0IGRvZXMgbm90aGluZyB1c2VmdWwuCi1dXT4KLSAgICA8L2xvbmdEZXNjPgotICA8L2NvbnZlcnRlcj4KLSAgPHZhbGlkYXRvcj4KLSAgICA8bW9kZWxJZD50ZXN0PC9tb2RlbElkPgotICAgIDxjbGFzc05hbWU+VmFsaWRhdG9yMTwvY2xhc3NOYW1lPgotICAgIDxzb3VyY2VDbGFzc05hbWU+VmFsaWRhdG9yMTwvc291cmNlQ2xhc3NOYW1lPgotICAgIDx2YWxpZGF0b3JJZD52YWwxPC92YWxpZGF0b3JJZD4KLSAgICA8ZGVzYz5UaGUgVmFsaWRhdG9yMSB2YWxpZGF0b3I8L2Rlc2M+Ci0gICAgPGxvbmdEZXNjPgotPCFbQ0RBVEFbCi1UaGUgVmFsaWRhdG9yMSB2YWxpZGF0b3IuCi08cD4KLVRoaXMgaXMgYSBzaWxseSB2YWxpZGF0b3IuIEl0IGRvZXMgbm90aGluZyB1c2VmdWwuCi1dXT4KLSAgICA8L2xvbmdEZXNjPgotICA8L3ZhbGlkYXRvcj4KLTwvbW9kZWw+CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy9idWlsZGVyL2dlbmVyYXRpb24vZ29vZGZpbGUtZmxhdC54bWwgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy9idWlsZGVyL2dlbmVyYXRpb24vZ29vZGZpbGUtZmxhdC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4NjcyYWQuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvYnVpbGRlci9nZW5lcmF0aW9uL2dvb2RmaWxlLWZsYXQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjI0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgPz4KLQotPG1vZGVsPgotICA8bW9kZWxJZD50ZXN0PC9tb2RlbElkPgotICA8Y29tcG9uZW50PgotICAgIDxtb2RlbElkPnRlc3Q8L21vZGVsSWQ+Ci0gICAgPGNsYXNzTmFtZT50ZXN0cGtnLkNvbXBvbmVudEJhc2U8L2NsYXNzTmFtZT4KLSAgICA8c291cmNlQ2xhc3NOYW1lPnRlc3Rwa2cuQ29tcG9uZW50QmFzZTwvc291cmNlQ2xhc3NOYW1lPgotICAgIDx0eXBlPmJhc2U8L3R5cGU+Ci0gICAgPGZhbWlseT5iYXNlPC9mYW1pbHk+Ci0gICAgPHJlbmRlcmVyVHlwZT5CYXNlUmVuZGVyZXI8L3JlbmRlcmVyVHlwZT4KLSAgICA8ZGVzYz5BIGJhc2UgY29tcG9uZW50IGNsYXNzPC9kZXNjPgotICAgIDxsb25nRGVzYz4KLTwhW0NEQVRBWwotQSBiYXNlIGNvbXBvbmVudCBjbGFzcy4KLTxwPgotVGhpcyBpcyBhIGJhc2UgY29tcG9uZW50LiBJdCBoYXMgbm8gbmFtZSwgc28gaXMgbm90IGEgY29uY3JldGUgY29tcG9uZW50LgotXV0+Ci0gICAgPC9sb25nRGVzYz4KLSAgICA8cHJvcGVydHk+Ci0gICAgICA8bmFtZT5wcm9wMTwvbmFtZT4KLSAgICAgIDxjbGFzc05hbWU+amF2YS5sYW5nLlN0cmluZzwvY2xhc3NOYW1lPgotICAgICAgPGRlc2M+VGhlIHByb3AxIHByb3BlcnR5PC9kZXNjPgotICAgICAgPGxvbmdEZXNjPgotPCFbQ0RBVEFbCi1UaGUgcHJvcDEgcHJvcGVydHkuCi08cD4KLVNvbWUgZHVtbXkgcHJvcDEgZG9jdW1lbnRhdGlvbi4KLV1dPgotICAgICAgPC9sb25nRGVzYz4KLSAgICAgIDxnZW5lcmF0ZWQ+dHJ1ZTwvZ2VuZXJhdGVkPgotICAgIDwvcHJvcGVydHk+Ci0gIDwvY29tcG9uZW50PgotICA8Y29tcG9uZW50PgotICAgIDxtb2RlbElkPnRlc3Q8L21vZGVsSWQ+Ci0gICAgPGNsYXNzTmFtZT50ZXN0cGtnLkNvbXBvbmVudEludGVyZmFjZTwvY2xhc3NOYW1lPgotICAgIDxzb3VyY2VDbGFzc05hbWU+dGVzdHBrZy5Db21wb25lbnRJbnRlcmZhY2U8L3NvdXJjZUNsYXNzTmFtZT4KLSAgICA8dHlwZT5pZmFjZTwvdHlwZT4KLSAgICA8ZmFtaWx5PmlmYWNlPC9mYW1pbHk+Ci0gICAgPHJlbmRlcmVyVHlwZT5CYXNlUmVuZGVyZXI8L3JlbmRlcmVyVHlwZT4KLSAgICA8ZGVzYz5BbiBpbnRlcmZhY2UgdGhhdCBkZWZpbmVzIGNvbXBvbmVudCBwcm9wZXJ0aWVzPC9kZXNjPgotICAgIDxsb25nRGVzYz4KLTwhW0NEQVRBWwotQW4gaW50ZXJmYWNlIHRoYXQgZGVmaW5lcyBjb21wb25lbnQgcHJvcGVydGllcy4KLTxwPgotVGhpcyBpcyBhbiBpbnRlcmZhY2UgY29tcG9uZW50LgotXV0+Ci0gICAgPC9sb25nRGVzYz4KLSAgICA8cHJvcGVydHk+Ci0gICAgICA8bmFtZT5pZmFjZVByb3A8L25hbWU+Ci0gICAgICA8Y2xhc3NOYW1lPmphdmEubGFuZy5TdHJpbmc8L2NsYXNzTmFtZT4KLSAgICAgIDxkZXNjPlRoZSBpZmFjZVByb3AgcHJvcGVydHk8L2Rlc2M+Ci0gICAgICA8bG9uZ0Rlc2M+Ci08IVtDREFUQVsKLVRoZSBpZmFjZVByb3AgcHJvcGVydHkuCi08cD4KLVNvbWUgZHVtbXkgaWZhY2VQcm9wIGRvY3VtZW50YXRpb24uCi1dXT4KLSAgICAgIDwvbG9uZ0Rlc2M+Ci0gICAgPC9wcm9wZXJ0eT4KLSAgPC9jb21wb25lbnQ+Ci0gIDxjb21wb25lbnQ+Ci0gICAgPG1vZGVsSWQ+dGVzdDwvbW9kZWxJZD4KLSAgICA8Y2xhc3NOYW1lPnRlc3Rwa2cuU3ViY2xhc3NDb21wb25lbnQ8L2NsYXNzTmFtZT4KLSAgICA8cGFyZW50Q2xhc3NOYW1lPnRlc3Rwa2cuQ29tcG9uZW50QmFzZTwvcGFyZW50Q2xhc3NOYW1lPgotICAgIDxzb3VyY2VDbGFzc05hbWU+dGVzdHBrZy5Db21wb25lbnRHZW5TdWJjbGFzczwvc291cmNlQ2xhc3NOYW1lPgotICAgIDxzb3VyY2VDbGFzc1BhcmVudENsYXNzTmFtZT50ZXN0cGtnLkNvbXBvbmVudEJhc2U8L3NvdXJjZUNsYXNzUGFyZW50Q2xhc3NOYW1lPgotICAgIDxpbnRlcmZhY2VzPgotICAgICAgPGludGVyZmFjZSBuYW1lPSJ0ZXN0cGtnLkNvbXBvbmVudEludGVyZmFjZSIvPgotICAgIDwvaW50ZXJmYWNlcz4KLSAgICA8bmFtZT5mb29Gcm9tU3ViY2xhc3M8L25hbWU+Ci0gICAgPHR5cGU+Zm9vPC90eXBlPgotICAgIDxmYW1pbHk+Zm9vPC9mYW1pbHk+Ci0gICAgPHJlbmRlcmVyVHlwZT5Gb29SZW5kZXJlcjwvcmVuZGVyZXJUeXBlPgotICAgIDxnZW5lcmF0ZWRDb21wb25lbnRDbGFzcz50cnVlPC9nZW5lcmF0ZWRDb21wb25lbnRDbGFzcz4KLSAgICA8aW1wbGVtZW50ZWRJbnRlcmZhY2VzPgotICAgICAgPGludGVyZmFjZSBuYW1lPSJ0ZXN0cGtnLkNvbXBvbmVudEludGVyZmFjZSIvPgotICAgIDwvaW1wbGVtZW50ZWRJbnRlcmZhY2VzPgotICAgIDxkZXNjPkEgY2xhc3MgZm9yIHdoaWNoIGEgY29uY3JldGUgY29tcG9uZW50IHdpbGwgYmUgY3JlYXRlZCB1c2luZyAic3ViY2xhc3MgbW9kZSIgY29kZS1nZW5lcmF0aW9uPC9kZXNjPgotICAgIDxsb25nRGVzYz5BIGNsYXNzIGZvciB3aGljaCBhIGNvbmNyZXRlIGNvbXBvbmVudCB3aWxsIGJlIGNyZWF0ZWQgdXNpbmcgInN1YmNsYXNzIG1vZGUiIGNvZGUtZ2VuZXJhdGlvbi48L2xvbmdEZXNjPgotICAgIDxwcm9wZXJ0eT4KLSAgICAgIDxuYW1lPnByb3AxPC9uYW1lPgotICAgICAgPGNsYXNzTmFtZT5qYXZhLmxhbmcuU3RyaW5nPC9jbGFzc05hbWU+Ci0gICAgICA8ZGVzYz5UaGUgcHJvcDEgcHJvcGVydHk8L2Rlc2M+Ci0gICAgICA8bG9uZ0Rlc2M+Ci08IVtDREFUQVsKLVRoZSBwcm9wMSBwcm9wZXJ0eS4KLTxwPgotU29tZSBkdW1teSBwcm9wMSBkb2N1bWVudGF0aW9uLgotXV0+Ci0gICAgICA8L2xvbmdEZXNjPgotICAgICAgPGluaGVyaXRlZD50cnVlPC9pbmhlcml0ZWQ+Ci0gICAgICA8Z2VuZXJhdGVkPnRydWU8L2dlbmVyYXRlZD4KLSAgICA8L3Byb3BlcnR5PgotICAgIDxwcm9wZXJ0eT4KLSAgICAgIDxuYW1lPmlmYWNlUHJvcDwvbmFtZT4KLSAgICAgIDxjbGFzc05hbWU+amF2YS5sYW5nLlN0cmluZzwvY2xhc3NOYW1lPgotICAgICAgPGRlc2M+VGhlIGlmYWNlUHJvcCBwcm9wZXJ0eTwvZGVzYz4KLSAgICAgIDxsb25nRGVzYz4KLTwhW0NEQVRBWwotVGhlIGlmYWNlUHJvcCBwcm9wZXJ0eS4KLTxwPgotU29tZSBkdW1teSBpZmFjZVByb3AgZG9jdW1lbnRhdGlvbi4KLV1dPgotICAgICAgPC9sb25nRGVzYz4KLSAgICAgIDxpbmhlcml0ZWQ+dHJ1ZTwvaW5oZXJpdGVkPgotICAgIDwvcHJvcGVydHk+Ci0gIDwvY29tcG9uZW50PgotICA8Y29tcG9uZW50PgotICAgIDxtb2RlbElkPnRlc3Q8L21vZGVsSWQ+Ci0gICAgPGNsYXNzTmFtZT50ZXN0cGtnLlRlbXBsYXRlQ29tcG9uZW50PC9jbGFzc05hbWU+Ci0gICAgPHBhcmVudENsYXNzTmFtZT50ZXN0cGtnLkNvbXBvbmVudEJhc2U8L3BhcmVudENsYXNzTmFtZT4KLSAgICA8c291cmNlQ2xhc3NOYW1lPnRlc3Rwa2cuQ29tcG9uZW50R2VuVGVtcGxhdGU8L3NvdXJjZUNsYXNzTmFtZT4KLSAgICA8c291cmNlQ2xhc3NQYXJlbnRDbGFzc05hbWU+dGVzdHBrZy5Db21wb25lbnRCYXNlPC9zb3VyY2VDbGFzc1BhcmVudENsYXNzTmFtZT4KLSAgICA8aW50ZXJmYWNlcz4KLSAgICAgIDxpbnRlcmZhY2UgbmFtZT0idGVzdHBrZy5Db21wb25lbnRJbnRlcmZhY2UiLz4KLSAgICA8L2ludGVyZmFjZXM+Ci0gICAgPG5hbWU+Zm9vRnJvbVRlbXBsYXRlPC9uYW1lPgotICAgIDx0eXBlPmZvbzwvdHlwZT4KLSAgICA8ZmFtaWx5PmZvbzwvZmFtaWx5PgotICAgIDxyZW5kZXJlclR5cGU+Rm9vUmVuZGVyZXI8L3JlbmRlcmVyVHlwZT4KLSAgICA8Z2VuZXJhdGVkQ29tcG9uZW50Q2xhc3M+dHJ1ZTwvZ2VuZXJhdGVkQ29tcG9uZW50Q2xhc3M+Ci0gICAgPHRlbXBsYXRlPnRydWU8L3RlbXBsYXRlPgotICAgIDxkZXNjPkEgY2xhc3MgZm9yIHdoaWNoIGEgY29uY3JldGUgY29tcG9uZW50IHdpbGwgYmUgY3JlYXRlZCB1c2luZyAidGVtcGxhdGUgbW9kZSIgY29kZS1nZW5lcmF0aW9uPC9kZXNjPgotICAgIDxsb25nRGVzYz5BIGNsYXNzIGZvciB3aGljaCBhIGNvbmNyZXRlIGNvbXBvbmVudCB3aWxsIGJlIGNyZWF0ZWQgdXNpbmcgInRlbXBsYXRlIG1vZGUiIGNvZGUtZ2VuZXJhdGlvbi48L2xvbmdEZXNjPgotICAgIDxwcm9wZXJ0eT4KLSAgICAgIDxuYW1lPnByb3AyPC9uYW1lPgotICAgICAgPGNsYXNzTmFtZT5ib29sZWFuPC9jbGFzc05hbWU+Ci0gICAgICA8ZGVzYz5UaGUgcHJvcDIgcHJvcGVydHk8L2Rlc2M+Ci0gICAgICA8bG9uZ0Rlc2M+Ci08IVtDREFUQVsKLVRoZSBwcm9wMiBwcm9wZXJ0eS4KLTxwPgotU29tZSBkdW1teSBwcm9wMiBkb2N1bWVudGF0aW9uLgotXV0+Ci0gICAgICA8L2xvbmdEZXNjPgotICAgIDwvcHJvcGVydHk+Ci0gICAgPHByb3BlcnR5PgotICAgICAgPG5hbWU+cHJvcDE8L25hbWU+Ci0gICAgICA8Y2xhc3NOYW1lPmphdmEubGFuZy5TdHJpbmc8L2NsYXNzTmFtZT4KLSAgICAgIDxkZXNjPlRoZSBwcm9wMSBwcm9wZXJ0eTwvZGVzYz4KLSAgICAgIDxsb25nRGVzYz4KLTwhW0NEQVRBWwotVGhlIHByb3AxIHByb3BlcnR5LgotPHA+Ci1Tb21lIGR1bW15IHByb3AxIGRvY3VtZW50YXRpb24uCi1dXT4KLSAgICAgIDwvbG9uZ0Rlc2M+Ci0gICAgICA8aW5oZXJpdGVkPnRydWU8L2luaGVyaXRlZD4KLSAgICAgIDxnZW5lcmF0ZWQ+dHJ1ZTwvZ2VuZXJhdGVkPgotICAgIDwvcHJvcGVydHk+Ci0gICAgPHByb3BlcnR5PgotICAgICAgPG5hbWU+aWZhY2VQcm9wPC9uYW1lPgotICAgICAgPGNsYXNzTmFtZT5qYXZhLmxhbmcuU3RyaW5nPC9jbGFzc05hbWU+Ci0gICAgICA8ZGVzYz5UaGUgaWZhY2VQcm9wIHByb3BlcnR5PC9kZXNjPgotICAgICAgPGxvbmdEZXNjPgotPCFbQ0RBVEFbCi1UaGUgaWZhY2VQcm9wIHByb3BlcnR5LgotPHA+Ci1Tb21lIGR1bW15IGlmYWNlUHJvcCBkb2N1bWVudGF0aW9uLgotXV0+Ci0gICAgICA8L2xvbmdEZXNjPgotICAgICAgPGluaGVyaXRlZD50cnVlPC9pbmhlcml0ZWQ+Ci0gICAgPC9wcm9wZXJ0eT4KLSAgPC9jb21wb25lbnQ+Ci0gIDxjb21wb25lbnQ+Ci0gICAgPG1vZGVsSWQ+dGVzdDwvbW9kZWxJZD4KLSAgICA8Y2xhc3NOYW1lPnRlc3Rwa2cuQ29tcG9uZW50TWFudWFsPC9jbGFzc05hbWU+Ci0gICAgPHBhcmVudENsYXNzTmFtZT50ZXN0cGtnLkNvbXBvbmVudEJhc2U8L3BhcmVudENsYXNzTmFtZT4KLSAgICA8c291cmNlQ2xhc3NOYW1lPnRlc3Rwa2cuQ29tcG9uZW50TWFudWFsPC9zb3VyY2VDbGFzc05hbWU+Ci0gICAgPHNvdXJjZUNsYXNzUGFyZW50Q2xhc3NOYW1lPnRlc3Rwa2cuQ29tcG9uZW50QmFzZTwvc291cmNlQ2xhc3NQYXJlbnRDbGFzc05hbWU+Ci0gICAgPGludGVyZmFjZXM+Ci0gICAgICA8aW50ZXJmYWNlIG5hbWU9InRlc3Rwa2cuQ29tcG9uZW50SW50ZXJmYWNlIi8+Ci0gICAgPC9pbnRlcmZhY2VzPgotICAgIDxuYW1lPmZvbzwvbmFtZT4KLSAgICA8dHlwZT5mb288L3R5cGU+Ci0gICAgPGZhbWlseT5mb288L2ZhbWlseT4KLSAgICA8cmVuZGVyZXJUeXBlPkZvb1JlbmRlcmVyPC9yZW5kZXJlclR5cGU+Ci0gICAgPGltcGxlbWVudGVkSW50ZXJmYWNlcz4KLSAgICAgIDxpbnRlcmZhY2UgbmFtZT0idGVzdHBrZy5Db21wb25lbnRJbnRlcmZhY2UiLz4KLSAgICA8L2ltcGxlbWVudGVkSW50ZXJmYWNlcz4KLSAgICA8ZGVzYz5BIGNvbmNyZXRlIGNvbXBvbmVudCBjbGFzcyB0aGF0IGhhcyBiZWVuIHdyaXR0ZW4gYnkgaGFuZCAobm8gY29kZSBnZW5lcmF0aW9uKTwvZGVzYz4KLSAgICA8bG9uZ0Rlc2M+QSBjb25jcmV0ZSBjb21wb25lbnQgY2xhc3MgdGhhdCBoYXMgYmVlbiB3cml0dGVuIGJ5IGhhbmQgKG5vIGNvZGUgZ2VuZXJhdGlvbikuPC9sb25nRGVzYz4KLSAgICA8cHJvcGVydHk+Ci0gICAgICA8bmFtZT5wcm9wMjwvbmFtZT4KLSAgICAgIDxjbGFzc05hbWU+Ym9vbGVhbjwvY2xhc3NOYW1lPgotICAgICAgPGRlc2M+VGhlIHByb3AyIHByb3BlcnR5PC9kZXNjPgotICAgICAgPGxvbmdEZXNjPgotPCFbQ0RBVEFbCi1UaGUgcHJvcDIgcHJvcGVydHkuCi08cD4KLVNvbWUgZHVtbXkgcHJvcDIgZG9jdW1lbnRhdGlvbi4KLV1dPgotICAgICAgPC9sb25nRGVzYz4KLSAgICA8L3Byb3BlcnR5PgotICAgIDxwcm9wZXJ0eT4KLSAgICAgIDxuYW1lPnByb3AxPC9uYW1lPgotICAgICAgPGNsYXNzTmFtZT5qYXZhLmxhbmcuU3RyaW5nPC9jbGFzc05hbWU+Ci0gICAgICA8ZGVzYz5UaGUgcHJvcDEgcHJvcGVydHk8L2Rlc2M+Ci0gICAgICA8bG9uZ0Rlc2M+Ci08IVtDREFUQVsKLVRoZSBwcm9wMSBwcm9wZXJ0eS4KLTxwPgotU29tZSBkdW1teSBwcm9wMSBkb2N1bWVudGF0aW9uLgotXV0+Ci0gICAgICA8L2xvbmdEZXNjPgotICAgICAgPGluaGVyaXRlZD50cnVlPC9pbmhlcml0ZWQ+Ci0gICAgICA8Z2VuZXJhdGVkPnRydWU8L2dlbmVyYXRlZD4KLSAgICA8L3Byb3BlcnR5PgotICAgIDxwcm9wZXJ0eT4KLSAgICAgIDxuYW1lPmlmYWNlUHJvcDwvbmFtZT4KLSAgICAgIDxjbGFzc05hbWU+amF2YS5sYW5nLlN0cmluZzwvY2xhc3NOYW1lPgotICAgICAgPGRlc2M+VGhlIGlmYWNlUHJvcCBwcm9wZXJ0eTwvZGVzYz4KLSAgICAgIDxsb25nRGVzYz4KLTwhW0NEQVRBWwotVGhlIGlmYWNlUHJvcCBwcm9wZXJ0eS4KLTxwPgotU29tZSBkdW1teSBpZmFjZVByb3AgZG9jdW1lbnRhdGlvbi4KLV1dPgotICAgICAgPC9sb25nRGVzYz4KLSAgICAgIDxpbmhlcml0ZWQ+dHJ1ZTwvaW5oZXJpdGVkPgotICAgIDwvcHJvcGVydHk+Ci0gIDwvY29tcG9uZW50PgotPC9tb2RlbD4KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL2J1aWxkZXIvZ2VuZXJhdGlvbi9nb29kZmlsZS54bWwgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy9idWlsZGVyL2dlbmVyYXRpb24vZ29vZGZpbGUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MmM0Mjk2Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL2J1aWxkZXIvZ2VuZXJhdGlvbi9nb29kZmlsZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNDMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyA/PgotCi08bW9kZWw+Ci0gIDxtb2RlbElkPnRlc3Q8L21vZGVsSWQ+Ci0gIDxjb21wb25lbnQ+Ci0gICAgPG1vZGVsSWQ+dGVzdDwvbW9kZWxJZD4KLSAgICA8Y2xhc3NOYW1lPnRlc3Rwa2cuQ29tcG9uZW50QmFzZTwvY2xhc3NOYW1lPgotICAgIDxzb3VyY2VDbGFzc05hbWU+dGVzdHBrZy5Db21wb25lbnRCYXNlPC9zb3VyY2VDbGFzc05hbWU+Ci0gICAgPHR5cGU+YmFzZTwvdHlwZT4KLSAgICA8ZmFtaWx5PmJhc2U8L2ZhbWlseT4KLSAgICA8cmVuZGVyZXJUeXBlPkJhc2VSZW5kZXJlcjwvcmVuZGVyZXJUeXBlPgotICAgIDxkZXNjPkEgYmFzZSBjb21wb25lbnQgY2xhc3M8L2Rlc2M+Ci0gICAgPGxvbmdEZXNjPgotPCFbQ0RBVEFbCi1BIGJhc2UgY29tcG9uZW50IGNsYXNzLgotPHA+Ci1UaGlzIGlzIGEgYmFzZSBjb21wb25lbnQuIEl0IGhhcyBubyBuYW1lLCBzbyBpcyBub3QgYSBjb25jcmV0ZSBjb21wb25lbnQuCi1dXT4KLSAgICA8L2xvbmdEZXNjPgotICAgIDxwcm9wZXJ0eT4KLSAgICAgIDxuYW1lPnByb3AxPC9uYW1lPgotICAgICAgPGNsYXNzTmFtZT5qYXZhLmxhbmcuU3RyaW5nPC9jbGFzc05hbWU+Ci0gICAgICA8ZGVzYz5UaGUgcHJvcDEgcHJvcGVydHk8L2Rlc2M+Ci0gICAgICA8bG9uZ0Rlc2M+Ci08IVtDREFUQVsKLVRoZSBwcm9wMSBwcm9wZXJ0eS4KLTxwPgotU29tZSBkdW1teSBwcm9wMSBkb2N1bWVudGF0aW9uLgotXV0+Ci0gICAgICA8L2xvbmdEZXNjPgotICAgICAgPGdlbmVyYXRlZD50cnVlPC9nZW5lcmF0ZWQ+Ci0gICAgPC9wcm9wZXJ0eT4KLSAgPC9jb21wb25lbnQ+Ci0gIDxjb21wb25lbnQ+Ci0gICAgPG1vZGVsSWQ+dGVzdDwvbW9kZWxJZD4KLSAgICA8Y2xhc3NOYW1lPnRlc3Rwa2cuQ29tcG9uZW50SW50ZXJmYWNlPC9jbGFzc05hbWU+Ci0gICAgPHNvdXJjZUNsYXNzTmFtZT50ZXN0cGtnLkNvbXBvbmVudEludGVyZmFjZTwvc291cmNlQ2xhc3NOYW1lPgotICAgIDx0eXBlPmlmYWNlPC90eXBlPgotICAgIDxmYW1pbHk+aWZhY2U8L2ZhbWlseT4KLSAgICA8cmVuZGVyZXJUeXBlPkJhc2VSZW5kZXJlcjwvcmVuZGVyZXJUeXBlPgotICAgIDxkZXNjPkFuIGludGVyZmFjZSB0aGF0IGRlZmluZXMgY29tcG9uZW50IHByb3BlcnRpZXM8L2Rlc2M+Ci0gICAgPGxvbmdEZXNjPgotPCFbQ0RBVEFbCi1BbiBpbnRlcmZhY2UgdGhhdCBkZWZpbmVzIGNvbXBvbmVudCBwcm9wZXJ0aWVzLgotPHA+Ci1UaGlzIGlzIGFuIGludGVyZmFjZSBjb21wb25lbnQuCi1dXT4KLSAgICA8L2xvbmdEZXNjPgotICAgIDxwcm9wZXJ0eT4KLSAgICAgIDxuYW1lPmlmYWNlUHJvcDwvbmFtZT4KLSAgICAgIDxjbGFzc05hbWU+amF2YS5sYW5nLlN0cmluZzwvY2xhc3NOYW1lPgotICAgICAgPGRlc2M+VGhlIGlmYWNlUHJvcCBwcm9wZXJ0eTwvZGVzYz4KLSAgICAgIDxsb25nRGVzYz4KLTwhW0NEQVRBWwotVGhlIGlmYWNlUHJvcCBwcm9wZXJ0eS4KLTxwPgotU29tZSBkdW1teSBpZmFjZVByb3AgZG9jdW1lbnRhdGlvbi4KLV1dPgotICAgICAgPC9sb25nRGVzYz4KLSAgICA8L3Byb3BlcnR5PgotICA8L2NvbXBvbmVudD4KLSAgPGNvbXBvbmVudD4KLSAgICA8bW9kZWxJZD50ZXN0PC9tb2RlbElkPgotICAgIDxjbGFzc05hbWU+dGVzdHBrZy5TdWJjbGFzc0NvbXBvbmVudDwvY2xhc3NOYW1lPgotICAgIDxwYXJlbnRDbGFzc05hbWU+dGVzdHBrZy5Db21wb25lbnRCYXNlPC9wYXJlbnRDbGFzc05hbWU+Ci0gICAgPHNvdXJjZUNsYXNzTmFtZT50ZXN0cGtnLkNvbXBvbmVudEdlblN1YmNsYXNzPC9zb3VyY2VDbGFzc05hbWU+Ci0gICAgPHNvdXJjZUNsYXNzUGFyZW50Q2xhc3NOYW1lPnRlc3Rwa2cuQ29tcG9uZW50QmFzZTwvc291cmNlQ2xhc3NQYXJlbnRDbGFzc05hbWU+Ci0gICAgPGludGVyZmFjZXM+Ci0gICAgICA8aW50ZXJmYWNlIG5hbWU9InRlc3Rwa2cuQ29tcG9uZW50SW50ZXJmYWNlIi8+Ci0gICAgPC9pbnRlcmZhY2VzPgotICAgIDxuYW1lPmZvb0Zyb21TdWJjbGFzczwvbmFtZT4KLSAgICA8dHlwZT5mb288L3R5cGU+Ci0gICAgPGZhbWlseT5mb288L2ZhbWlseT4KLSAgICA8cmVuZGVyZXJUeXBlPkZvb1JlbmRlcmVyPC9yZW5kZXJlclR5cGU+Ci0gICAgPGdlbmVyYXRlZENvbXBvbmVudENsYXNzPnRydWU8L2dlbmVyYXRlZENvbXBvbmVudENsYXNzPgotICAgIDxpbXBsZW1lbnRlZEludGVyZmFjZXM+Ci0gICAgICA8aW50ZXJmYWNlIG5hbWU9InRlc3Rwa2cuQ29tcG9uZW50SW50ZXJmYWNlIi8+Ci0gICAgPC9pbXBsZW1lbnRlZEludGVyZmFjZXM+Ci0gICAgPGRlc2M+QSBjbGFzcyBmb3Igd2hpY2ggYSBjb25jcmV0ZSBjb21wb25lbnQgd2lsbCBiZSBjcmVhdGVkIHVzaW5nICJzdWJjbGFzcyBtb2RlIiBjb2RlLWdlbmVyYXRpb248L2Rlc2M+Ci0gICAgPGxvbmdEZXNjPkEgY2xhc3MgZm9yIHdoaWNoIGEgY29uY3JldGUgY29tcG9uZW50IHdpbGwgYmUgY3JlYXRlZCB1c2luZyAic3ViY2xhc3MgbW9kZSIgY29kZS1nZW5lcmF0aW9uLjwvbG9uZ0Rlc2M+Ci0gIDwvY29tcG9uZW50PgotICA8Y29tcG9uZW50PgotICAgIDxtb2RlbElkPnRlc3Q8L21vZGVsSWQ+Ci0gICAgPGNsYXNzTmFtZT50ZXN0cGtnLlRlbXBsYXRlQ29tcG9uZW50PC9jbGFzc05hbWU+Ci0gICAgPHBhcmVudENsYXNzTmFtZT50ZXN0cGtnLkNvbXBvbmVudEJhc2U8L3BhcmVudENsYXNzTmFtZT4KLSAgICA8c291cmNlQ2xhc3NOYW1lPnRlc3Rwa2cuQ29tcG9uZW50R2VuVGVtcGxhdGU8L3NvdXJjZUNsYXNzTmFtZT4KLSAgICA8c291cmNlQ2xhc3NQYXJlbnRDbGFzc05hbWU+dGVzdHBrZy5Db21wb25lbnRCYXNlPC9zb3VyY2VDbGFzc1BhcmVudENsYXNzTmFtZT4KLSAgICA8aW50ZXJmYWNlcz4KLSAgICAgIDxpbnRlcmZhY2UgbmFtZT0idGVzdHBrZy5Db21wb25lbnRJbnRlcmZhY2UiLz4KLSAgICA8L2ludGVyZmFjZXM+Ci0gICAgPG5hbWU+Zm9vRnJvbVRlbXBsYXRlPC9uYW1lPgotICAgIDx0eXBlPmZvbzwvdHlwZT4KLSAgICA8ZmFtaWx5PmZvbzwvZmFtaWx5PgotICAgIDxyZW5kZXJlclR5cGU+Rm9vUmVuZGVyZXI8L3JlbmRlcmVyVHlwZT4KLSAgICA8Z2VuZXJhdGVkQ29tcG9uZW50Q2xhc3M+dHJ1ZTwvZ2VuZXJhdGVkQ29tcG9uZW50Q2xhc3M+Ci0gICAgPHRlbXBsYXRlPnRydWU8L3RlbXBsYXRlPgotICAgIDxkZXNjPkEgY2xhc3MgZm9yIHdoaWNoIGEgY29uY3JldGUgY29tcG9uZW50IHdpbGwgYmUgY3JlYXRlZCB1c2luZyAidGVtcGxhdGUgbW9kZSIgY29kZS1nZW5lcmF0aW9uPC9kZXNjPgotICAgIDxsb25nRGVzYz5BIGNsYXNzIGZvciB3aGljaCBhIGNvbmNyZXRlIGNvbXBvbmVudCB3aWxsIGJlIGNyZWF0ZWQgdXNpbmcgInRlbXBsYXRlIG1vZGUiIGNvZGUtZ2VuZXJhdGlvbi48L2xvbmdEZXNjPgotICAgIDxwcm9wZXJ0eT4KLSAgICAgIDxuYW1lPnByb3AyPC9uYW1lPgotICAgICAgPGNsYXNzTmFtZT5ib29sZWFuPC9jbGFzc05hbWU+Ci0gICAgICA8ZGVzYz5UaGUgcHJvcDIgcHJvcGVydHk8L2Rlc2M+Ci0gICAgICA8bG9uZ0Rlc2M+Ci08IVtDREFUQVsKLVRoZSBwcm9wMiBwcm9wZXJ0eS4KLTxwPgotU29tZSBkdW1teSBwcm9wMiBkb2N1bWVudGF0aW9uLgotXV0+Ci0gICAgICA8L2xvbmdEZXNjPgotICAgIDwvcHJvcGVydHk+Ci0gIDwvY29tcG9uZW50PgotICA8Y29tcG9uZW50PgotICAgIDxtb2RlbElkPnRlc3Q8L21vZGVsSWQ+Ci0gICAgPGNsYXNzTmFtZT50ZXN0cGtnLkNvbXBvbmVudE1hbnVhbDwvY2xhc3NOYW1lPgotICAgIDxwYXJlbnRDbGFzc05hbWU+dGVzdHBrZy5Db21wb25lbnRCYXNlPC9wYXJlbnRDbGFzc05hbWU+Ci0gICAgPHNvdXJjZUNsYXNzTmFtZT50ZXN0cGtnLkNvbXBvbmVudE1hbnVhbDwvc291cmNlQ2xhc3NOYW1lPgotICAgIDxzb3VyY2VDbGFzc1BhcmVudENsYXNzTmFtZT50ZXN0cGtnLkNvbXBvbmVudEJhc2U8L3NvdXJjZUNsYXNzUGFyZW50Q2xhc3NOYW1lPgotICAgIDxpbnRlcmZhY2VzPgotICAgICAgPGludGVyZmFjZSBuYW1lPSJ0ZXN0cGtnLkNvbXBvbmVudEludGVyZmFjZSIvPgotICAgIDwvaW50ZXJmYWNlcz4KLSAgICA8bmFtZT5mb288L25hbWU+Ci0gICAgPHR5cGU+Zm9vPC90eXBlPgotICAgIDxmYW1pbHk+Zm9vPC9mYW1pbHk+Ci0gICAgPHJlbmRlcmVyVHlwZT5Gb29SZW5kZXJlcjwvcmVuZGVyZXJUeXBlPgotICAgIDxpbXBsZW1lbnRlZEludGVyZmFjZXM+Ci0gICAgICA8aW50ZXJmYWNlIG5hbWU9InRlc3Rwa2cuQ29tcG9uZW50SW50ZXJmYWNlIi8+Ci0gICAgPC9pbXBsZW1lbnRlZEludGVyZmFjZXM+Ci0gICAgPGRlc2M+QSBjb25jcmV0ZSBjb21wb25lbnQgY2xhc3MgdGhhdCBoYXMgYmVlbiB3cml0dGVuIGJ5IGhhbmQgKG5vIGNvZGUgZ2VuZXJhdGlvbik8L2Rlc2M+Ci0gICAgPGxvbmdEZXNjPkEgY29uY3JldGUgY29tcG9uZW50IGNsYXNzIHRoYXQgaGFzIGJlZW4gd3JpdHRlbiBieSBoYW5kIChubyBjb2RlIGdlbmVyYXRpb24pLjwvbG9uZ0Rlc2M+Ci0gICAgPHByb3BlcnR5PgotICAgICAgPG5hbWU+cHJvcDI8L25hbWU+Ci0gICAgICA8Y2xhc3NOYW1lPmJvb2xlYW48L2NsYXNzTmFtZT4KLSAgICAgIDxkZXNjPlRoZSBwcm9wMiBwcm9wZXJ0eTwvZGVzYz4KLSAgICAgIDxsb25nRGVzYz4KLTwhW0NEQVRBWwotVGhlIHByb3AyIHByb3BlcnR5LgotPHA+Ci1Tb21lIGR1bW15IHByb3AyIGRvY3VtZW50YXRpb24uCi1dXT4KLSAgICAgIDwvbG9uZ0Rlc2M+Ci0gICAgPC9wcm9wZXJ0eT4KLSAgPC9jb21wb25lbnQ+Ci08L21vZGVsPgpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvYnVpbGRlci9nZW5lcmF0aW9uL3Rlc3Rwa2cvQ29tcG9uZW50QmFzZS5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvYnVpbGRlci9nZW5lcmF0aW9uL3Rlc3Rwa2cvQ29tcG9uZW50QmFzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZDZhZjg4Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL2J1aWxkZXIvZ2VuZXJhdGlvbi90ZXN0cGtnL0NvbXBvbmVudEJhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLXBhY2thZ2UgdGVzdHBrZzsKLQotLyoqCi0gKiBBIGJhc2UgY29tcG9uZW50IGNsYXNzLgotICogPHA+Ci0gKiBUaGlzIGlzIGEgYmFzZSBjb21wb25lbnQuIEl0IGhhcyBubyBuYW1lLCBzbyBpcyBub3QgYSBjb25jcmV0ZSBjb21wb25lbnQuCi0gKiAKLSAqIEBKU0ZDb21wb25lbnQKLSAqICAgdHlwZT0iYmFzZSIKLSAqICAgZmFtaWx5PSJiYXNlIgotICogICBkZWZhdWx0UmVuZGVyZXJUeXBlPSJCYXNlUmVuZGVyZXIiCi0gKi8KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIENvbXBvbmVudEJhc2UKLXsKLSAgICAvKioKLSAgICAgKiBUaGUgcHJvcDEgcHJvcGVydHkuCi0gICAgICogPHA+Ci0gICAgICogU29tZSBkdW1teSBwcm9wMSBkb2N1bWVudGF0aW9uLgotICAgICAqCi0gICAgICogQEpTRlByb3BlcnR5Ci0gICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRQcm9wMSgpOwotICAgIAotICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldFByb3AxKFN0cmluZyBwcm9wMSk7Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy9idWlsZGVyL2dlbmVyYXRpb24vdGVzdHBrZy9Db21wb25lbnRHZW5TdWJjbGFzcy5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvYnVpbGRlci9nZW5lcmF0aW9uL3Rlc3Rwa2cvQ29tcG9uZW50R2VuU3ViY2xhc3MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDMzMjhkMi4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy9idWlsZGVyL2dlbmVyYXRpb24vdGVzdHBrZy9Db21wb25lbnRHZW5TdWJjbGFzcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotcGFja2FnZSB0ZXN0cGtnOwotCi0vKioKLSAqIEEgY2xhc3MgZm9yIHdoaWNoIGEgY29uY3JldGUgY29tcG9uZW50IHdpbGwgYmUgY3JlYXRlZCB1c2luZyAic3ViY2xhc3MgbW9kZSIgY29kZS1nZW5lcmF0aW9uLgotICogCi0gKiBASlNGQ29tcG9uZW50Ci0gKiAgIG5hbWU9ImZvb0Zyb21TdWJjbGFzcyIKLSAqICAgdHlwZT0iZm9vIgotICogICBmYW1pbHk9ImZvbyIKLSAqICAgZGVmYXVsdFJlbmRlcmVyVHlwZT0iRm9vUmVuZGVyZXIiCi0gKiAgIGNsYXNzPSJ0ZXN0cGtnLlN1YmNsYXNzQ29tcG9uZW50IgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ29tcG9uZW50R2VuU3ViY2xhc3MgZXh0ZW5kcyBDb21wb25lbnRCYXNlIGltcGxlbWVudHMgQ29tcG9uZW50SW50ZXJmYWNlCi17Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy9idWlsZGVyL2dlbmVyYXRpb24vdGVzdHBrZy9Db21wb25lbnRHZW5UZW1wbGF0ZS5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvYnVpbGRlci9nZW5lcmF0aW9uL3Rlc3Rwa2cvQ29tcG9uZW50R2VuVGVtcGxhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOThkOWEzOC4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy9idWlsZGVyL2dlbmVyYXRpb24vdGVzdHBrZy9Db21wb25lbnRHZW5UZW1wbGF0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotcGFja2FnZSB0ZXN0cGtnOwotCi0vKioKLSAqIEEgY2xhc3MgZm9yIHdoaWNoIGEgY29uY3JldGUgY29tcG9uZW50IHdpbGwgYmUgY3JlYXRlZCB1c2luZyAidGVtcGxhdGUgbW9kZSIgY29kZS1nZW5lcmF0aW9uLgotICogCi0gKiBASlNGQ29tcG9uZW50Ci0gKiAgIG5hbWU9ImZvb0Zyb21UZW1wbGF0ZSIKLSAqICAgdHlwZT0iZm9vIgotICogICBmYW1pbHk9ImZvbyIKLSAqICAgZGVmYXVsdFJlbmRlcmVyVHlwZT0iRm9vUmVuZGVyZXIiCi0gKiAgIGNsYXNzPSJ0ZXN0cGtnLlRlbXBsYXRlQ29tcG9uZW50IgotICogICB0ZW1wbGF0ZT0idHJ1ZSIKLSAqLwotYWJzdHJhY3QgY2xhc3MgQ29tcG9uZW50R2VuVGVtcGxhdGUgZXh0ZW5kcyBDb21wb25lbnRCYXNlIGltcGxlbWVudHMgQ29tcG9uZW50SW50ZXJmYWNlCi17Ci0gICAgU3RyaW5nIHByb3AxOwotICAgIGJvb2xlYW4gcHJvcDI7Ci0gICAgCi0gICAgLyoqCi0gICAgICogSW1wbGVtZW50IHRoZSBhYnN0cmFjdCBwcm9wZXJ0eSBkZWZpbmVkIG9uIHRoZSBiYXNlIGNsYXNzLgotICAgICAqIE5vdGUgdGhhdCBiZWNhdXNlIHRoaXMgbWV0aG9kIGlzIG5vdCBhbm5vdGF0ZWQgd2l0aCB0aGUKLSAgICAgKiBKU0ZQcm9wZXJ0eSBhbm5vdGF0aW9uLCB0aGlzIGNvbW1lbnQgZG9lcyBub3QgYmVjb21lIHRoZQotICAgICAqIGRvY3VtZW50YXRpb24gZm9yIHRoZSBwcm9wZXJ0eSBpdHNlbGYuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRQcm9wMSgpCi0gICAgewotICAgICAgICByZXR1cm4gcHJvcDE7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UHJvcDEoU3RyaW5nIHByb3AxKQotICAgIHsKLSAgICAgICAgdGhpcy5wcm9wMSA9IHByb3AxOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoZSBwcm9wMiBwcm9wZXJ0eS4KLSAgICAgKiA8cD4KLSAgICAgKiBTb21lIGR1bW15IHByb3AyIGRvY3VtZW50YXRpb24uCi0gICAgICoKLSAgICAgKiBASlNGUHJvcGVydHkKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBnZXRQcm9wMigpIHsKLSAgICAgICAgcmV0dXJuIHByb3AyOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXRQcm9wMihib29sZWFuIHByb3AyKSB7Ci0gICAgICAgIHRoaXMucHJvcDIgPSBwcm9wMjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbXBsZW1lbnQgdGhlIG1ldGhvZCBkZWZpbmVkIG9uIENvbXBvbmVudEludGVyZmFjZS4gQmVjYXVzZSB0aGlzIG1ldGhvZCBkb2VzCi0gICAgICogbm90IHVzZSB0aGUgSlNGUHJvcGVydHkgYW5ub3RhdGlvbiwgdGhlIHByb3BlcnR5IHNldHRpbmdzIGFyZSB0YWtlbiBmcm9tIHRoZQotICAgICAqIHBhcmVudCBpbnRlcmZhY2UsIG5vdCBoZXJlLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0SWZhY2VQcm9wKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldElmYWNlUHJvcChTdHJpbmcgdmFsKQotICAgIHsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy9idWlsZGVyL2dlbmVyYXRpb24vdGVzdHBrZy9Db21wb25lbnRJbnRlcmZhY2UuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL2J1aWxkZXIvZ2VuZXJhdGlvbi90ZXN0cGtnL0NvbXBvbmVudEludGVyZmFjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YjZjMDRkLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL2J1aWxkZXIvZ2VuZXJhdGlvbi90ZXN0cGtnL0NvbXBvbmVudEludGVyZmFjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotcGFja2FnZSB0ZXN0cGtnOwotCi0vKioKLSAqIEFuIGludGVyZmFjZSB0aGF0IGRlZmluZXMgY29tcG9uZW50IHByb3BlcnRpZXMuCi0gKiA8cD4KLSAqIFRoaXMgaXMgYW4gaW50ZXJmYWNlIGNvbXBvbmVudC4KLSAqIAotICogQEpTRkNvbXBvbmVudAotICogICB0eXBlPSJpZmFjZSIKLSAqICAgZmFtaWx5PSJpZmFjZSIKLSAqICAgZGVmYXVsdFJlbmRlcmVyVHlwZT0iQmFzZVJlbmRlcmVyIgotICovCi0KLXB1YmxpYyBpbnRlcmZhY2UgQ29tcG9uZW50SW50ZXJmYWNlCi17Ci0gICAgLyoqCi0gICAgICogVGhlIGlmYWNlUHJvcCBwcm9wZXJ0eS4KLSAgICAgKiA8cD4KLSAgICAgKiBTb21lIGR1bW15IGlmYWNlUHJvcCBkb2N1bWVudGF0aW9uLgotICAgICAqCi0gICAgICogQEpTRlByb3BlcnR5Ci0gICAgICovCi0gICAgU3RyaW5nIGdldElmYWNlUHJvcCgpOwotICAgIAotICAgIHZvaWQgc2V0SWZhY2VQcm9wKFN0cmluZyB2YWwpOwotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvYnVpbGRlci9nZW5lcmF0aW9uL3Rlc3Rwa2cvQ29tcG9uZW50TWFudWFsLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy9idWlsZGVyL2dlbmVyYXRpb24vdGVzdHBrZy9Db21wb25lbnRNYW51YWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmUxZjMwNS4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy9idWlsZGVyL2dlbmVyYXRpb24vdGVzdHBrZy9Db21wb25lbnRNYW51YWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLXBhY2thZ2UgdGVzdHBrZzsKLQotLyoqCi0gKiBBIGNvbmNyZXRlIGNvbXBvbmVudCBjbGFzcyB0aGF0IGhhcyBiZWVuIHdyaXR0ZW4gYnkgaGFuZCAobm8gY29kZSBnZW5lcmF0aW9uKS4KLSAqIAotICogQEpTRkNvbXBvbmVudAotICogICBuYW1lPSJmb28iCi0gKiAgIHR5cGU9ImZvbyIKLSAqICAgZmFtaWx5PSJmb28iCi0gKiAgIGRlZmF1bHRSZW5kZXJlclR5cGU9IkZvb1JlbmRlcmVyIgotICovCi1wdWJsaWMgY2xhc3MgQ29tcG9uZW50TWFudWFsIGV4dGVuZHMgQ29tcG9uZW50QmFzZSBpbXBsZW1lbnRzIENvbXBvbmVudEludGVyZmFjZQotewotICAgIFN0cmluZyBwcm9wMTsKLSAgICBib29sZWFuIHByb3AyOwotICAgIAotICAgIC8qKgotICAgICAqIEltcGxlbWVudCB0aGUgYWJzdHJhY3QgcHJvcGVydHkgZGVmaW5lZCBvbiB0aGUgYmFzZSBjbGFzcy4KLSAgICAgKiBOb3RlIHRoYXQgYmVjYXVzZSB0aGlzIG1ldGhvZCBpcyBub3QgYW5ub3RhdGVkIHdpdGggdGhlCi0gICAgICogSlNGUHJvcGVydHkgYW5ub3RhdGlvbiwgdGhpcyBjb21tZW50IGRvZXMgbm90IGJlY29tZSB0aGUKLSAgICAgKiBkb2N1bWVudGF0aW9uIGZvciB0aGUgcHJvcGVydHkgaXRzZWxmLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJvcDEoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHByb3AxOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFByb3AxKFN0cmluZyBwcm9wMSkKLSAgICB7Ci0gICAgICAgIHRoaXMucHJvcDEgPSBwcm9wMTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgcHJvcDIgcHJvcGVydHkuCi0gICAgICogPHA+Ci0gICAgICogU29tZSBkdW1teSBwcm9wMiBkb2N1bWVudGF0aW9uLgotICAgICAqCi0gICAgICogQEpTRlByb3BlcnR5Ci0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gZ2V0UHJvcDIoKSB7Ci0gICAgICAgIHJldHVybiBwcm9wMjsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc2V0UHJvcDIoYm9vbGVhbiBwcm9wMikgewotICAgICAgICB0aGlzLnByb3AyID0gcHJvcDI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW1wbGVtZW50IHRoZSBtZXRob2QgZGVmaW5lZCBvbiBDb21wb25lbnRJbnRlcmZhY2UuIEJlY2F1c2UgdGhpcyBtZXRob2QgZG9lcwotICAgICAqIG5vdCB1c2UgdGhlIEpTRlByb3BlcnR5IGFubm90YXRpb24sIHRoZSBwcm9wZXJ0eSBzZXR0aW5ncyBhcmUgdGFrZW4gZnJvbSB0aGUKLSAgICAgKiBwYXJlbnQgaW50ZXJmYWNlLCBub3QgaGVyZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldElmYWNlUHJvcCgpCi0gICAgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRJZmFjZVByb3AoU3RyaW5nIHZhbCkKLSAgICB7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvYnVpbGRlci9zaW1wbGUvRm9vLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy9idWlsZGVyL3NpbXBsZS9Gb28uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTUwYWRiMS4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy9idWlsZGVyL3NpbXBsZS9Gb28uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKgotICogVGhlIEZvbyBjb21wb25lbnQuCi0gKiA8cD4KLSAqIFRoaXMgaXMgYSBmb28gY29tcG9uZW50LiBJdCBkb2VzIG5vdGhpbmcgdXNlZnVsLgotICogCi0gKiBASlNGQ29tcG9uZW50Ci0gKiAgIG5hbWU9ImZvbyIKLSAqICAgdHlwZT0iZm9vIgotICogICBmYW1pbHk9ImZvbyIKLSAqICAgZGVmYXVsdFJlbmRlcmVyVHlwZT0iRm9vUmVuZGVyZXIiCi0gKi8KLXB1YmxpYyBjbGFzcyBGb28KLXsKLSAgICBTdHJpbmcgcHJvcDE7Ci0gICAgCi0gICAgLyoqCi0gICAgICogVGhlIHByb3AxIHByb3BlcnR5LgotICAgICAqIDxwPgotICAgICAqIFNvbWUgZHVtbXkgcHJvcDEgZG9jdW1lbnRhdG9pbi4KLSAgICAgKgotICAgICAqIEBKU0ZQcm9wZXJ0eQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJvcDEoKSB7Ci0gICAgICAgIHJldHVybiBwcm9wMTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc2V0UHJvcDEoU3RyaW5nIHByb3AxKSB7Ci0gICAgICAgIHRoaXMucHJvcDEgPSBwcm9wMTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy9idWlsZGVyL3NpbXBsZS9nb29kZmlsZS54bWwgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy9idWlsZGVyL3NpbXBsZS9nb29kZmlsZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzY2ExMmYuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvYnVpbGRlci9zaW1wbGUvZ29vZGZpbGUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyA/PgotCi08bW9kZWw+Ci0gIDxtb2RlbElkPnRlc3Q8L21vZGVsSWQ+Ci0gIDxjb21wb25lbnQ+Ci0gICAgPG1vZGVsSWQ+dGVzdDwvbW9kZWxJZD4KLSAgICA8Y2xhc3NOYW1lPkZvbzwvY2xhc3NOYW1lPgotICAgIDxzb3VyY2VDbGFzc05hbWU+Rm9vPC9zb3VyY2VDbGFzc05hbWU+Ci0gICAgPG5hbWU+Zm9vPC9uYW1lPgotICAgIDx0eXBlPmZvbzwvdHlwZT4KLSAgICA8ZmFtaWx5PmZvbzwvZmFtaWx5PgotICAgIDxyZW5kZXJlclR5cGU+Rm9vUmVuZGVyZXI8L3JlbmRlcmVyVHlwZT4KLSAgICA8ZGVzYz5UaGUgRm9vIGNvbXBvbmVudDwvZGVzYz4KLSAgICA8bG9uZ0Rlc2M+Ci08IVtDREFUQVsKLVRoZSBGb28gY29tcG9uZW50LgotPHA+Ci1UaGlzIGlzIGEgZm9vIGNvbXBvbmVudC4gSXQgZG9lcyBub3RoaW5nIHVzZWZ1bC4KLV1dPgotICAgIDwvbG9uZ0Rlc2M+Ci0gICAgPHByb3BlcnR5PgotICAgICAgPG5hbWU+cHJvcDE8L25hbWU+Ci0gICAgICA8Y2xhc3NOYW1lPmphdmEubGFuZy5TdHJpbmc8L2NsYXNzTmFtZT4KLSAgICAgIDxkZXNjPlRoZSBwcm9wMSBwcm9wZXJ0eTwvZGVzYz4KLSAgICAgIDxsb25nRGVzYz4KLTwhW0NEQVRBWwotVGhlIHByb3AxIHByb3BlcnR5LgotPHA+Ci1Tb21lIGR1bW15IHByb3AxIGRvY3VtZW50YXRvaW4uCi1dXT4KLSAgICAgIDwvbG9uZ0Rlc2M+Ci0gICAgPC9wcm9wZXJ0eT4KLSAgPC9jb21wb25lbnQ+Ci08L21vZGVsPgpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvYnVpbGRlci9zaW1wbGUxNS9Gb28uamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL2J1aWxkZXIvc2ltcGxlMTUvRm9vLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlMWQzMTguLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvYnVpbGRlci9zaW1wbGUxNS9Gb28uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5hbm5vdGF0aW9uLio7Ci0KLS8qKgotICogVGhlIEZvbyBjb21wb25lbnQgZGVmaW5lZCB2aWEgamF2YTE1IGFubm90YXRpb25zLgotICogPHA+Ci0gKiBUaGlzIGlzIGFuIGFubm90YXRlZCBmb28gY29tcG9uZW50LiBJdCBkb2VzIG5vdGhpbmcgdXNlZnVsLgotICovCi1ASlNGQ29tcG9uZW50KG5hbWU9ImZvbyIsIHR5cGU9ImZvbyIsIGZhbWlseT0iZm9vIiwgZGVmYXVsdFJlbmRlcmVyVHlwZT0iRm9vUmVuZGVyZXIiKQotcHVibGljIGNsYXNzIEZvbwotewotICAgIFN0cmluZyBwcm9wMTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBUaGUgcHJvcDEgcHJvcGVydHkuCi0gICAgICogPHA+Ci0gICAgICogU29tZSBkdW1teSBwcm9wMSBkb2N1bWVudGF0b2luLgotICAgICAqLwotICAgIEBKU0ZQcm9wZXJ0eQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJvcDEoKSB7Ci0gICAgICAgIHJldHVybiBwcm9wMTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc2V0UHJvcDEoU3RyaW5nIHByb3AxKSB7Ci0gICAgICAgIHRoaXMucHJvcDEgPSBwcm9wMTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy9idWlsZGVyL3NpbXBsZTE1L2dvb2RmaWxlLnhtbCBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL2J1aWxkZXIvc2ltcGxlMTUvZ29vZGZpbGUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzY2IwNGUwLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL2J1aWxkZXIvc2ltcGxlMTUvZ29vZGZpbGUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyA/PgotCi08bW9kZWw+Ci0gIDxtb2RlbElkPnRlc3Q8L21vZGVsSWQ+Ci0gIDxjb21wb25lbnQ+Ci0gICAgPG1vZGVsSWQ+dGVzdDwvbW9kZWxJZD4KLSAgICA8Y2xhc3NOYW1lPkZvbzwvY2xhc3NOYW1lPgotICAgIDxzb3VyY2VDbGFzc05hbWU+Rm9vPC9zb3VyY2VDbGFzc05hbWU+Ci0gICAgPG5hbWU+Zm9vPC9uYW1lPgotICAgIDx0eXBlPmZvbzwvdHlwZT4KLSAgICA8ZmFtaWx5PmZvbzwvZmFtaWx5PgotICAgIDxyZW5kZXJlclR5cGU+Rm9vUmVuZGVyZXI8L3JlbmRlcmVyVHlwZT4KLSAgICA8ZGVzYz5UaGUgRm9vIGNvbXBvbmVudCBkZWZpbmVkIHZpYSBqYXZhMTUgYW5ub3RhdGlvbnM8L2Rlc2M+Ci0gICAgPGxvbmdEZXNjPgotPCFbQ0RBVEFbCi1UaGUgRm9vIGNvbXBvbmVudCBkZWZpbmVkIHZpYSBqYXZhMTUgYW5ub3RhdGlvbnMuCi08cD4KLVRoaXMgaXMgYW4gYW5ub3RhdGVkIGZvbyBjb21wb25lbnQuIEl0IGRvZXMgbm90aGluZyB1c2VmdWwuCi1dXT4KLSAgICA8L2xvbmdEZXNjPgotICAgIDxwcm9wZXJ0eT4KLSAgICAgIDxuYW1lPnByb3AxPC9uYW1lPgotICAgICAgPGNsYXNzTmFtZT5qYXZhLmxhbmcuU3RyaW5nPC9jbGFzc05hbWU+Ci0gICAgICA8ZGVzYz5UaGUgcHJvcDEgcHJvcGVydHk8L2Rlc2M+Ci0gICAgICA8bG9uZ0Rlc2M+Ci08IVtDREFUQVsKLVRoZSBwcm9wMSBwcm9wZXJ0eS4KLTxwPgotU29tZSBkdW1teSBwcm9wMSBkb2N1bWVudGF0b2luLgotXV0+Ci0gICAgICA8L2xvbmdEZXNjPgotICAgIDwvcHJvcGVydHk+Ci0gIDwvY29tcG9uZW50PgotPC9tb2RlbD4KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL0xJQ0VOU0UudHh0IGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vTElDRU5TRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2NDU2OTUuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vTElDRU5TRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwyMDIgKzAsMCBAQAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNAotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLwotCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04KLQotICAgMS4gRGVmaW5pdGlvbnMuCi0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4KLQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4KLQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbgotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwKLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3IKLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KLQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KLQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLgotCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dAotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLAotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgotCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcgotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLgotCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0Ci0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3NlcwotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLgotCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZwotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucwotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5Ci0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIgotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0Ci0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCi0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLgotCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4KLQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywKLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcgotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcwotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCi0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91Ci0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3IKLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZAotCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kCi0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3JrcwotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQKLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YKLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kCi0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cwotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QKLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QKLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUKLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3IKLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwKLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZAotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUKLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQKLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuCi0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucwotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcgotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgKLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuCi0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwKLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yawotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLgotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4KLQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLAotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KLQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEEKLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55Ci0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuCi0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLAotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwKLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KLQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZwotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwKLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcwotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkKLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkKLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgotCi0gICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKLQotICAgQVBQRU5ESVg6IEhvdyB0byBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLgotCi0gICAgICBUbyBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLCBhdHRhY2ggdGhlIGZvbGxvd2luZwotICAgICAgYm9pbGVycGxhdGUgbm90aWNlLCB3aXRoIHRoZSBmaWVsZHMgZW5jbG9zZWQgYnkgYnJhY2tldHMgIltdIgotICAgICAgcmVwbGFjZWQgd2l0aCB5b3VyIG93biBpZGVudGlmeWluZyBpbmZvcm1hdGlvbi4gKERvbid0IGluY2x1ZGUKLSAgICAgIHRoZSBicmFja2V0cyEpICBUaGUgdGV4dCBzaG91bGQgYmUgZW5jbG9zZWQgaW4gdGhlIGFwcHJvcHJpYXRlCi0gICAgICBjb21tZW50IHN5bnRheCBmb3IgdGhlIGZpbGUgZm9ybWF0LiBXZSBhbHNvIHJlY29tbWVuZCB0aGF0IGEKLSAgICAgIGZpbGUgb3IgY2xhc3MgbmFtZSBhbmQgZGVzY3JpcHRpb24gb2YgcHVycG9zZSBiZSBpbmNsdWRlZCBvbiB0aGUKLSAgICAgIHNhbWUgInByaW50ZWQgcGFnZSIgYXMgdGhlIGNvcHlyaWdodCBub3RpY2UgZm9yIGVhc2llcgotICAgICAgaWRlbnRpZmljYXRpb24gd2l0aGluIHRoaXJkLXBhcnR5IGFyY2hpdmVzLgotCi0gICBDb3B5cmlnaHQgW3l5eXldIFtuYW1lIG9mIGNvcHlyaWdodCBvd25lcl0KLQotICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL05PVElDRS50eHQgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9OT1RJQ0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYTNkYmQ2Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL05PVElDRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci09PSAgTk9USUNFIGZpbGUgY29ycmVzcG9uZGluZyB0byBzZWN0aW9uIDQoZCkgb2YgdGhlIEFwYWNoZSBMaWNlbnNlLCAgID09Ci09PSAgVmVyc2lvbiAyLjAsIGluIHRoaXMgY2FzZSBmb3IgdGhlIEFwYWNoZSBNeUZhY2VzIE1hdmVuIFBsdWdpbnMgICAgID09Ci09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgCi1UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLgotCi1Qb3J0aW9ucyBvZiB0aGlzIHNvZnR3YXJlIHdlcmUgb3JpZ2luYWxseSBiYXNlZCBvbiB0aGUgZm9sbG93aW5nOgotCi0gLSBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwNiwgT3JhY2xlIENvcnAsIDxodHRwOi8vd3d3Lm9yYWNsZS5jb20vPi4KLWFuZCBhcmUgbGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIHVuZGVyIHRoZSAKLSJTb2Z0d2FyZSBHcmFudCBhbmQgQ29ycG9yYXRlIENvbnRyaWJ1dGlvbiBMaWNlbnNlIEFncmVlbWVudCIKLQotU2VlIHRoZSBMSUNFTlNFLnR4dCBmaWxlIGZvciBpbmZvcm1hdGlvbiBvbiBhbGwgbGljZW5zZXMgCi1hc3NvY2lhdGVkIHdpdGggdGhpcyBzb2Z0d2FyZS4KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3BvbS54bWwgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjVhZjM3Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMjYgKzAsMCBAQAotPCEtLQotICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICAgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gICAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICAgIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICAgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gICAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gICAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gICAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICAgIHVuZGVyIHRoZSBMaWNlbnNlLgotCSAgIAotLS0+Ci08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4gCi0KLSAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotCi0gIDxwYXJlbnQ+Ci0gICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29sczwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtcGx1Z2luLXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjEuMC41PC92ZXJzaW9uPgotICAgICAgPHJlbGF0aXZlUGF0aD4uLi9teWZhY2VzLXBsdWdpbi1wYXJlbnQvcG9tLnhtbDwvcmVsYXRpdmVQYXRoPgotICA8L3BhcmVudD4KLQotICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29sczwvZ3JvdXBJZD4KLSAgPGFydGlmYWN0SWQ+bXlmYWNlcy1mYWNlcy1wbHVnaW48L2FydGlmYWN0SWQ+IAotICA8dmVyc2lvbj4xLjAuMS1TTkFQU0hPVDwvdmVyc2lvbj4KLSAgPHBhY2thZ2luZz5tYXZlbi1wbHVnaW48L3BhY2thZ2luZz4KLSAgPG5hbWU+QXBhY2hlIE15RmFjZXMgQnVpbGR0b29scyBNYXZlbjIgRmFjZXMgUGx1Z2luPC9uYW1lPgotICA8ZGVzY3JpcHRpb24+Ci0gICAgQSBtYXZlbiBwbHVnaW4gdGhhdCB1c2VzIG1ldGFkYXRhIGlucHV0IGZpbGVzIHRvIGdlbmVyYXRlIEpTRiBDb21wb25lbnQsIFZhbGlkYXRvciBhbmQgVGFnIGNsYXNzZXMsCi0gICAgdG9nZXRoZXIgd2l0aCB0aGUgYXNzb2NpYXRlZCBjb25maWd1cmF0aW9uIGZpbGVzICgudGxkLCBmYWNlcy1jb25maWcueG1sLCBldGMpLgotICA8L2Rlc2NyaXB0aW9uPgotCi0gIDxzY20+Ci0gICAgPGNvbm5lY3Rpb24+c2NtOnN2bjpodHRwOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL215ZmFjZXMvbXlmYWNlcy1idWlsZC10b29scy90cnVuay9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbjwvY29ubmVjdGlvbj4KLSAgICA8ZGV2ZWxvcGVyQ29ubmVjdGlvbj5zY206c3ZuOmh0dHBzOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL215ZmFjZXMvbXlmYWNlcy1idWlsZC10b29scy90cnVuay9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbjwvZGV2ZWxvcGVyQ29ubmVjdGlvbj4KLSAgICA8dXJsPmh0dHA6Ly9zdm4uYXBhY2hlLm9yZy92aWV3dmMvbXlmYWNlcy9teWZhY2VzLWJ1aWxkLXRvb2xzL3RydW5rL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luPC91cmw+Ci0gIDwvc2NtPgotCi0gIDxidWlsZD4KLSAgICA8cGx1Z2lucz4KLSAgICAgIDxwbHVnaW4+Ci0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KLSAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY29tcGlsZXItcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICA8aW5oZXJpdGVkPnRydWU8L2luaGVyaXRlZD4KLSAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgPHNvdXJjZT4xLjQ8L3NvdXJjZT4KLSAgICAgICAgICA8dGFyZ2V0PjEuNDwvdGFyZ2V0PgotICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICA8L3BsdWdpbj4KLSAgICAgIDxwbHVnaW4+Ci0gICAgICAgIDwhLS0KLSAgICAgICAgICAtIE92ZXJyaWRlIGNoZWNrc3R5bGUgY29uZmlnIGZpbGUgZGVmaW5pdGlvbnMgZnJvbSBwYXJlbnQgcG9tLiBUaGUgc291cmNlIG9mCi0gICAgICAgICAgLSB0aGlzIHByb2plY3QgaXMgbm90IGNvbXBsaWFudCB3aXRoIHRoZSBub3JtYWwgTXlGYWNlcyBjb2RlIHN0eWxlIHJ1bGVzLCBhbmQKLSAgICAgICAgICAtIHByb2JhYmx5IG5ldmVyIHdpbGwgYmUuCi0gICAgICAgICAgLS0+Ci0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KLSAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY2hlY2tzdHlsZS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgIDx2ZXJzaW9uPjIuMjwvdmVyc2lvbj4KLSAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgPGNvbmZpZ0xvY2F0aW9uPmRlZmF1bHQvbXlmYWNlcy1jaGVja3MtbWluaW1hbC54bWw8L2NvbmZpZ0xvY2F0aW9uPgotICAgICAgICAgIDxoZWFkZXJMb2NhdGlvbj5kZWZhdWx0L215ZmFjZXMtaGVhZGVyLXNwYWNlcy50eHQ8L2hlYWRlckxvY2F0aW9uPgotICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICA8L3BsdWdpbj4KLQotICAgIDwvcGx1Z2lucz4KLSAgPC9idWlsZD4KLQotICA8cmVwb3J0aW5nPgotICAgIDxwbHVnaW5zPgotICAgICAgPHBsdWdpbj4KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgotICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1wbHVnaW4tcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj4yLjI8L3ZlcnNpb24+Ci0gICAgICA8L3BsdWdpbj4KLSAgICA8L3BsdWdpbnM+Ci0gIDwvcmVwb3J0aW5nPgotICAKLSAgPGRlcGVuZGVuY2llcz4KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW48L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1wbHVnaW4tYXBpPC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+Mi4wPC92ZXJzaW9uPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW48L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1wcm9qZWN0PC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+Mi4wPC92ZXJzaW9uPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPmNvbW1vbnMtZGlnZXN0ZXI8L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5jb21tb25zLWRpZ2VzdGVyPC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+MS43PC92ZXJzaW9uPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPnNheG9uPC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+c2F4b248L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj42LjUuMzwvdmVyc2lvbj4KLSAgICAgIDxzY29wZT5ydW50aW1lPC9zY29wZT4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD54ZXJjZXM8L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD54ZXJjZXNJbXBsPC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+Mi42LjI8L3ZlcnNpb24+Ci0gICAgICA8c2NvcGU+cnVudGltZTwvc2NvcGU+Ci0gICAgPC9kZXBlbmRlbmN5PgotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+c3RheDwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPnN0YXgtYXBpPC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+MS4wLjE8L3ZlcnNpb24+Ci0gICAgPC9kZXBlbmRlbmN5PgotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+c3RheDwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPnN0YXg8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4xLjIuMF9yYzItZGV2PC92ZXJzaW9uPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgPC9kZXBlbmRlbmNpZXM+Ci0KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy9BYnN0cmFjdEZhY2VzTW9qby5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL0Fic3RyYWN0RmFjZXNNb2pvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmZDg0OGEuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL0Fic3RyYWN0RmFjZXNNb2pvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NzkgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmRpZ2VzdGVyLkFic3RyYWN0T2JqZWN0Q3JlYXRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5kaWdlc3Rlci5EaWdlc3RlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLmFydGlmYWN0LkRlcGVuZGVuY3lSZXNvbHV0aW9uUmVxdWlyZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5tb2RlbC5SZXNvdXJjZTsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5BYnN0cmFjdE1vam87Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnByb2plY3QuTWF2ZW5Qcm9qZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMuZ2VuZXJhdG9yLkdlbmVyYXRvckhlbHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLmlvLlByZXR0eVdyaXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLnBhcnNlLkZhY2VzQ29uZmlnQmVhbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLnBhcnNlLkF0dHJpYnV0ZUJlYW47Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy5wYXJzZS5Db21wb25lbnRCZWFuOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMucGFyc2UuQ29udmVydGVyQmVhbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLnBhcnNlLkZhY2VzQ29uZmlnUGFyc2VyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMucGFyc2UuVmFsaWRhdG9yQmVhbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLnV0aWwuQXR0cmlidXRlRmlsdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMudXRpbC5Db21wb25lbnRGaWx0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy51dGlsLkNvbnZlcnRlckZpbHRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLnV0aWwuVXRpbDsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLnV0aWwuWEluY2x1ZGVGaWx0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy51dGlsLlZhbGlkYXRvckZpbHRlcjsKLWltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLnV0aWwuRmlsZVV0aWxzOwotaW1wb3J0IG9yZy54bWwuc2F4LkF0dHJpYnV0ZXM7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5QYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlNBWFBhcnNlckZhY3Rvcnk7Ci1pbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLm5ldC5VUkxDbGFzc0xvYWRlcjsKLWltcG9ydCBqYXZhLm5ldC5VUkxDb25uZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC4qOwotCi1hYnN0cmFjdCBwdWJsaWMgY2xhc3MgQWJzdHJhY3RGYWNlc01vam8gZXh0ZW5kcyBBYnN0cmFjdE1vam8KLXsKLSAgcHJvdGVjdGVkIExpc3QgZ2V0Q29tcGlsZURlcGVuZGVuY3lSZXNvdXJjZXMoCi0gICAgTWF2ZW5Qcm9qZWN0IHByb2plY3QsCi0gICAgU3RyaW5nICAgICAgIHJlc291cmNlUGF0aCkgdGhyb3dzIE1vam9FeGVjdXRpb25FeGNlcHRpb24KLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIENsYXNzTG9hZGVyIGNsID0gY3JlYXRlQ29tcGlsZUNsYXNzTG9hZGVyKHByb2plY3QpOwotICAgICAgRW51bWVyYXRpb24gZSA9IGNsLmdldFJlc291cmNlcyhyZXNvdXJjZVBhdGgpOwotICAgICAgTGlzdCB1cmxzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpCi0gICAgICB7Ci0gICAgICAgIFVSTCB1cmwgPSAoVVJMKWUubmV4dEVsZW1lbnQoKTsKLSAgICAgICAgdXJscy5hZGQodXJsKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KHVybHMpOwotICAgIH0KLSAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbigiVW5hYmxlIHRvIGdldCByZXNvdXJjZXMgZm9yIHBhdGggIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXCIiICsgcmVzb3VyY2VQYXRoICsgIlwiIiwgZSk7Ci0gICAgfQotCi0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBhZGRSZXNvdXJjZVJvb3QoCi0gICAgTWF2ZW5Qcm9qZWN0IHByb2plY3QsCi0gICAgU3RyaW5nICAgICAgIHJlc291cmNlUm9vdCkKLSAgewotICAgIExpc3QgcmVzb3VyY2VzID0gcHJvamVjdC5nZXRCdWlsZCgpLmdldFJlc291cmNlcygpOwotICAgIFJlc291cmNlIHJlc291cmNlID0gbmV3IFJlc291cmNlKCk7Ci0gICAgcmVzb3VyY2Uuc2V0RGlyZWN0b3J5KHJlc291cmNlUm9vdCk7Ci0gICAgcmVzb3VyY2VzLmFkZChyZXNvdXJjZSk7Ci0gIH0KLQotICAvKioKLSAgICogQGRlcHJlY2F0ZWQKLSAgICovCi0gIHByb3RlY3RlZCBVUkxbXSByZWFkSW5kZXgoCi0gICAgTWF2ZW5Qcm9qZWN0IHByb2plY3QsCi0gICAgU3RyaW5nICAgICAgIHJlc291cmNlUGF0aCkgdGhyb3dzIE1vam9FeGVjdXRpb25FeGNlcHRpb24KLSAgewotICAgIHJldHVybiByZWFkSW5kZXgocHJvamVjdCk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgTGlzdCBnZXRNYXN0ZXJDb25maWdzKAotICAgIE1hdmVuUHJvamVjdCBwcm9qZWN0KSB0aHJvd3MgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbgotICB7Ci0gICAgaWYgKGxvY2FsUmVzb3VyY2UgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBMaXN0IHVybHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICB0cnkgewotICAgICAgICB1cmxzLmFkZChsb2NhbFJlc291cmNlLnRvVVJMKCkpOwotICAgICAgfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgZ2V0TG9nKCkuZXJyb3IoIiIsIGUpOwotICAgICAgfQotICAgICAgcmV0dXJuIHVybHM7ICAKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIFN0cmluZyByZXNvdXJjZVBhdGggPSAiTUVUQS1JTkYvbWF2ZW4tZmFjZXMtcGx1Z2luL2ZhY2VzLWNvbmZpZy54bWwiOwotICAgICAgcmV0dXJuIGdldENvbXBpbGVEZXBlbmRlbmN5UmVzb3VyY2VzKHByb2plY3QsIHJlc291cmNlUGF0aCk7Ci0gICAgfQotICB9Ci0KLSAgcHJvdGVjdGVkIFVSTFtdIHJlYWRJbmRleCgKLSAgICBNYXZlblByb2plY3QgcHJvamVjdCkgdGhyb3dzIE1vam9FeGVjdXRpb25FeGNlcHRpb24KLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIC8vIDEuIHJlYWQgbWFzdGVyIGZhY2VzLWNvbmZpZy54bWwgcmVzb3VyY2VzCi0gICAgICBMaXN0IG1hc3RlcnMgPSBnZXRNYXN0ZXJDb25maWdzKHByb2plY3QpOwotICAgICAgaWYgKG1hc3RlcnMuaXNFbXB0eSgpKQotICAgICAgewotICAgICAgICBnZXRMb2coKS53YXJuKCJNYXN0ZXIgZmFjZXMtY29uZmlnLnhtbCBub3QgZm91bmQiKTsKLSAgICAgICAgcmV0dXJuIG5ldyBVUkxbMF07Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIExpc3QgZW50cmllcyA9IG5ldyBMaW5rZWRMaXN0KCk7Ci0KLSAgICAgICAgU0FYUGFyc2VyRmFjdG9yeSBzcGYgPSBTQVhQYXJzZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAgIHNwZi5zZXROYW1lc3BhY2VBd2FyZSh0cnVlKTsKLSAgICAgICAgLy8gcmVxdWlyZXMgSkFYUCAxLjMsIGluIEphdmFTRSA1LjAKLSAgICAgICAgLy8gc3BmLnNldFhJbmNsdWRlQXdhcmUoZmFsc2UpOwotCi0gICAgICAgIGZvciAoSXRlcmF0b3IgaT1tYXN0ZXJzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICAgICAgewotICAgICAgICAgIFVSTCB1cmwgPSAoVVJMKWkubmV4dCgpOwotICAgICAgICAgIERpZ2VzdGVyIGRpZ2VzdGVyID0gbmV3IERpZ2VzdGVyKHNwZi5uZXdTQVhQYXJzZXIoKSk7Ci0gICAgICAgICAgZGlnZXN0ZXIuc2V0TmFtZXNwYWNlQXdhcmUodHJ1ZSk7Ci0KLSAgICAgICAgICAvLyBYSW5jbHVkZQotICAgICAgICAgIGRpZ2VzdGVyLnNldFJ1bGVOYW1lc3BhY2VVUkkoWEluY2x1ZGVGaWx0ZXIuWElOQ0xVREVfTkFNRVNQQUNFKTsKLSAgICAgICAgICBkaWdlc3Rlci5hZGRDYWxsTWV0aG9kKCJmYWNlcy1jb25maWcvaW5jbHVkZSIsICJhZGQiLCAxKTsKLSAgICAgICAgICBkaWdlc3Rlci5hZGRGYWN0b3J5Q3JlYXRlKCJmYWNlcy1jb25maWcvaW5jbHVkZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUkxDcmVhdGlvbkZhY3RvcnkuY2xhc3MpOwotICAgICAgICAgIGRpZ2VzdGVyLmFkZENhbGxQYXJhbSgiZmFjZXMtY29uZmlnL2luY2x1ZGUiLCAwLCAwKTsKLQotICAgICAgICAgIGRpZ2VzdGVyLnB1c2godXJsKTsKLSAgICAgICAgICBkaWdlc3Rlci5wdXNoKGVudHJpZXMpOwotICAgICAgICAgIGRpZ2VzdGVyLnBhcnNlKHVybC5vcGVuU3RyZWFtKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIChVUkxbXSllbnRyaWVzLnRvQXJyYXkobmV3IFVSTFswXSk7Ci0gICAgICB9Ci0gICAgfQotICAgIGNhdGNoIChQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgdGhyb3cgbmV3IE1vam9FeGVjdXRpb25FeGNlcHRpb24oIkZhaWxlZCB0byBwYXJzZSBtYXN0ZXIgY29uZmlnIiwgZSk7Ci0gICAgfQotICAgIGNhdGNoIChTQVhFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbigiRmFpbGVkIHRvIHBhcnNlIG1hc3RlciBjb25maWciLCBlKTsKLSAgICB9Ci0gICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgdGhyb3cgbmV3IE1vam9FeGVjdXRpb25FeGNlcHRpb24oIkZhaWxlZCB0byBwYXJzZSBtYXN0ZXIgY29uZmlnIiwgZSk7Ci0gICAgfQotICB9Ci0KLSAgcHJvdGVjdGVkIGJvb2xlYW4gaXNNb2RpZmllZFNpbmNlKAotICAgIFVSTFtdIHVybHMsCi0gICAgbG9uZyAgbGFzdE1vZGlmaWVkKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgewotICAgIGZvciAoaW50IGk9MDsgaSA8IHVybHMubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgVVJMQ29ubmVjdGlvbiBjb25uID0gdXJsc1tpXS5vcGVuQ29ubmVjdGlvbigpOwotICAgICAgaWYgKGNvbm4uZ2V0TGFzdE1vZGlmaWVkKCkgPiBsYXN0TW9kaWZpZWQpCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8qKgotICAqIEBkZXByZWNhdGVkIGNhbGwgVXRpbC5jb252ZXJ0U3RyaW5nVG9MaXRlcmFsIGluc3RlYWQKLSAgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyBjb252ZXJ0U3RyaW5nVG9MaXRlcmFsKFN0cmluZyB2YWx1ZSkKLSAgewotICAgIHJldHVybiBVdGlsLmNvbnZlcnRTdHJpbmdUb0xpdGVyYWwoIlN0cmluZyIsIHZhbHVlKTsKLSAgfQotCi0gLyoqCi0gICogQGRlcHJlY2F0ZWQgY2FsbCBVdGlsLmNvbnZlcnRTdHJpbmdUb0xpdGVyYWwgaW5zdGVhZAotICAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIGNvbnZlcnRTdHJpbmdUb0xpdGVyYWwoU3RyaW5nIGNsYXNzTmFtZSwgU3RyaW5nIHZhbHVlKQotICB7Ci0gICAgcmV0dXJuIFV0aWwuY29udmVydFN0cmluZ1RvTGl0ZXJhbChjbGFzc05hbWUsIHZhbHVlKTsKLSAgfQotCi0gIHByb3RlY3RlZCBTdHJpbmcgcmVhZExpY2Vuc2VIZWFkZXIoKSB0aHJvd3MgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbgotICB7Ci0gICAgaWYgKGxpY2Vuc2VIZWFkZXJGaWxlID09IG51bGwpCi0gICAgewotICAgICAgcmV0dXJuIF9ERUZBVUxUX0xJQ0VOU0VfSEVBREVSOwotICAgIH0KLSAgICAKLSAgICBpZiAoIWxpY2Vuc2VIZWFkZXJGaWxlLmV4aXN0cygpKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uKCJMaWNlbnNlIGhlYWRlciBmaWxlIG5vdCBmb3VuZDogIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgK2xpY2Vuc2VIZWFkZXJGaWxlLmdldE5hbWUoKSk7Ci0gICAgfQotCi0gICAgaWYgKGxpY2Vuc2VIZWFkZXJGaWxlLmlzRGlyZWN0b3J5KCkpCi0gICAgewotICAgICAgIHRocm93IG5ldyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uKCJFeHBlY3RpbmcgYSBmaWxlIGFuZCBmb3VuZCBhIGRpcmVjdG9yeTogIgotICAgICAgICAgICAgICAgK2xpY2Vuc2VIZWFkZXJGaWxlLmdldE5hbWUoKSk7Ci0gICAgfQotCi0gICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgIAotICAgIHRyeQotICAgIHsKLSAgICAgIEJ1ZmZlcmVkUmVhZGVyIHJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgRmlsZVJlYWRlcihsaWNlbnNlSGVhZGVyRmlsZSkpOwotICAgICAgU3RyaW5nIGxpbmU7Ci0gICAgICAKLSAgICAgIHdoaWxlICgobGluZSA9IHJlYWRlci5yZWFkTGluZSgpKSAhPSBudWxsKQotICAgICAgewotICAgICAgICBzYi5hcHBlbmQobGluZSsiXG4iKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgdGhyb3cgbmV3IE1vam9FeGVjdXRpb25FeGNlcHRpb24oIkV4Y2VwdGlvbiByZWFkaW5nIGxpY2Vuc2UgaGVhZGVyIGZpbGUiLCBlKTsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBTdHJpbmcgZ2V0TGljZW5zZUhlYWRlcigpIHRocm93cyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uCi0gIHsKLSAgICBpZiAoX2xpY2Vuc2VIZWFkZXIgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBfbGljZW5zZUhlYWRlciA9IHJlYWRMaWNlbnNlSGVhZGVyKCk7Ci0gICAgfQotICAgIAotICAgIHJldHVybiBfbGljZW5zZUhlYWRlcjsKLSAgfQotCi0gIHN0YXRpYyBwdWJsaWMgY2xhc3MgVVJMQ3JlYXRpb25GYWN0b3J5IGV4dGVuZHMgQWJzdHJhY3RPYmplY3RDcmVhdGlvbkZhY3RvcnkKLSAgewotICAgIHB1YmxpYyBPYmplY3QgY3JlYXRlT2JqZWN0KAotICAgICAgQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uCi0gICAgewotICAgICAgU3RyaW5nIGhyZWYgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCJocmVmIik7Ci0gICAgICBpZiAoaHJlZiA9PSBudWxsKQotICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJNaXNzaW5nIGhyZWYgYXR0cmlidXRlIik7Ci0KLSAgICAgIFVSTCBtYXN0ZXIgPSAoVVJMKWRpZ2VzdGVyLmdldFJvb3QoKTsKLSAgICAgIHJldHVybiBuZXcgVVJMKG1hc3RlciwgaHJlZik7Ci0gICAgfQotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0luZGV4KAotICAgIE1hdmVuUHJvamVjdCBwcm9qZWN0LAotICAgIFN0cmluZyAgICAgICByZXNvdXJjZVBhdGgpIHRocm93cyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uCi0gIHsKLSAgICBfZmFjZXNDb25maWcgPSBuZXcgRmFjZXNDb25maWdCZWFuKCk7Ci0KLSAgICBVUkxbXSBpbmRleCA9IHJlYWRJbmRleChwcm9qZWN0LCByZXNvdXJjZVBhdGgpOwotICAgIGZvciAoaW50IGk9MDsgaSA8IGluZGV4Lmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIHByb2Nlc3NJbmRleEVudHJ5KGluZGV4W2ldKTsKLSAgICB9Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzSW5kZXhFbnRyeSgKLSAgICBVUkwgZW50cnkpIHRocm93cyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uCi0gIHsKLSAgICBVUkwgb2xkID0gX2ZhY2VzQ29uZmlnLnNldEN1cnJlbnRSZXNvdXJjZShlbnRyeSk7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgbmV3IEZhY2VzQ29uZmlnUGFyc2VyKCkubWVyZ2UoX2ZhY2VzQ29uZmlnLCBlbnRyeSk7Ci0gICAgfQotICAgIGZpbmFsbHkKLSAgICB7Ci0gICAgICBfZmFjZXNDb25maWcuc2V0Q3VycmVudFJlc291cmNlKG9sZCk7Ci0gICAgfQotICB9Ci0KLSAgcHJvdGVjdGVkIEZhY2VzQ29uZmlnQmVhbiBnZXRGYWNlc0NvbmZpZygpCi0gIHsKLSAgICByZXR1cm4gX2ZhY2VzQ29uZmlnOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgd3JpdGVQcmVhbWJsZSgKLSAgICBQcmV0dHlXcml0ZXIgb3V0KSB0aHJvd3MgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbgotICB7Ci0gICAgb3V0LndyaXRlKF9BVVRPX0dFTkVSQVRFX1dBUk5JTkcpOwotICAgIG91dC53cml0ZShnZXRMaWNlbnNlSGVhZGVyKCkpOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgY29weUZpbGUoCi0gICAgRmlsZSAgIHNvdXJjZURpcmVjdG9yeSwKLSAgICBTdHJpbmcgc291cmNlUGF0aCwKLSAgICBGaWxlICAgdGFyZ2V0RGlyZWN0b3J5KSB0aHJvd3MgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbgotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgRmlsZSBzb3VyY2VGaWxlID0gbmV3IEZpbGUoc291cmNlRGlyZWN0b3J5LCBzb3VyY2VQYXRoKTsKLSAgICAgIEZpbGUgdGFyZ2V0RmlsZSA9IG5ldyBGaWxlKHRhcmdldERpcmVjdG9yeSwgc291cmNlUGF0aCk7Ci0KLSAgICAgIGlmIChzb3VyY2VGaWxlLmV4aXN0cygpICYmCi0gICAgICAgICAgc291cmNlRmlsZS5sYXN0TW9kaWZpZWQoKSA+IHRhcmdldEZpbGUubGFzdE1vZGlmaWVkKCkpCi0gICAgICB7Ci0gICAgICAgIGlmIChnZXRMb2coKS5pc0RlYnVnRW5hYmxlZCgpKQotICAgICAgICAgIGdldExvZygpLmRlYnVnKCJDb3B5aW5nIGZpbGUgXCIiICsgc291cmNlUGF0aCArICJcIiIpOwotCi0gICAgICAgIEZpbGVVdGlscy5jb3B5RmlsZShzb3VyY2VGaWxlLCB0YXJnZXRGaWxlKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgdGhyb3cgbmV3IE1vam9FeGVjdXRpb25FeGNlcHRpb24oIkVycm9yIGNvcHlpbmcgZmlsZSBcIiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlUGF0aCArICJcIiIsIGUpOwotICAgIH0KLSAgfQotCi0gLyoqCi0gICogQGRlcHJlY2F0ZWQgdXNlIFV0aWwud3JpdGVJbXBvcnRzIGluc3RlYWQKLSAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgd3JpdGVJbXBvcnRzKAotICAgIFByZXR0eVdyaXRlciBvdXQsCi0gICAgU3RyaW5nICAgICAgIHBhY2thZ2VOYW1lLAotICAgIFNldCAgICAgICAgICBpbXBvcnRzKQotICB7Ci0gICAgR2VuZXJhdG9ySGVscGVyLndyaXRlSW1wb3J0cyhvdXQscGFja2FnZU5hbWUsaW1wb3J0cyk7Ci0gIH0KLQotICBwcml2YXRlIENsYXNzTG9hZGVyIGNyZWF0ZUNvbXBpbGVDbGFzc0xvYWRlcigKLSAgICBNYXZlblByb2plY3QgcHJvamVjdCkgdGhyb3dzIE1vam9FeGVjdXRpb25FeGNlcHRpb24KLSAgewotICAgIFRocmVhZCBjdXJyZW50ID0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKTsKLSAgICBDbGFzc0xvYWRlciBjbCA9IGN1cnJlbnQuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCk7Ci0KLSAgICB0cnkKLSAgICB7Ci0gICAgICBMaXN0IGNsYXNzcGF0aEVsZW1lbnRzID0gcHJvamVjdC5nZXRDb21waWxlQ2xhc3NwYXRoRWxlbWVudHMoKTsKLSAgICAgIGlmICghY2xhc3NwYXRoRWxlbWVudHMuaXNFbXB0eSgpKQotICAgICAgewotICAgICAgICBTdHJpbmdbXSBlbnRyaWVzID0gKFN0cmluZ1tdKWNsYXNzcGF0aEVsZW1lbnRzLnRvQXJyYXkobmV3IFN0cmluZ1swXSk7Ci0gICAgICAgIFVSTFtdIHVybHMgPSBuZXcgVVJMW2VudHJpZXMubGVuZ3RoXTsKLSAgICAgICAgZm9yIChpbnQgaT0wOyBpIDwgdXJscy5sZW5ndGg7IGkrKykKLSAgICAgICAgewotICAgICAgICAgIHVybHNbaV0gPSBuZXcgRmlsZShlbnRyaWVzW2ldKS50b1VSTCgpOwotICAgICAgICB9Ci0gICAgICAgIGNsID0gbmV3IFVSTENsYXNzTG9hZGVyKHVybHMsIGNsKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgY2F0Y2ggKERlcGVuZGVuY3lSZXNvbHV0aW9uUmVxdWlyZWRFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbigiRXJyb3IgY2FsY3VsYXRpbmcgc2NvcGUgY2xhc3NwYXRoIiwgZSk7Ci0gICAgfQotICAgIGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbigiRXJyb3IgY2FsY3VsYXRpbmcgc2NvcGUgY2xhc3NwYXRoIiwgZSk7Ci0gICAgfQotCi0gICAgcmV0dXJuIGNsOwotICB9Ci0KLSAgcHJvdGVjdGVkIGNsYXNzIFNraXBGaWx0ZXIgZXh0ZW5kcyBDb21wb25lbnRGaWx0ZXIKLSAgewotICAgIHByb3RlY3RlZCBib29sZWFuIGFjY2VwdCgKLSAgICAgIENvbXBvbmVudEJlYW4gY29tcG9uZW50KQotICAgIHsKLSAgICAgIFN0cmluZyBjb21wb25lbnRUeXBlID0gY29tcG9uZW50LmdldENvbXBvbmVudFR5cGUoKTsKLQotICAgICAgLy8gc2tpcCBBUEkgYW5kIGJhc2UgY2xhc3MgZ2VuZXJhdGlvbj8KLSAgICAgIHJldHVybiAhc2tpcEFwaU9yQmFzZUNsYXNzZXMgfHwgKCFjb21wb25lbnRUeXBlLnN0YXJ0c1dpdGgoImphdmF4IikgJiYKLSAgICAgICAgICAgICAgICAhY29tcG9uZW50VHlwZS5lbmRzV2l0aCgiQmFzZSIpKTsKLQotICAgIH0KLSAgfQotCi0gIHN0YXRpYyBmaW5hbCBwcm90ZWN0ZWQgY2xhc3MgQ29tcG9uZW50VHlwZUZpbHRlciBleHRlbmRzIENvbXBvbmVudEZpbHRlcgotICB7Ci0gICAgcHVibGljIENvbXBvbmVudFR5cGVGaWx0ZXIoCi0gICAgICBTdHJpbmcgdHlwZVByZWZpeCkKLSAgICB7Ci0gICAgICBfdHlwZVByZWZpeCA9IHR5cGVQcmVmaXg7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KAotICAgICAgQ29tcG9uZW50QmVhbiBjb21wb25lbnQpCi0gICAgewotICAgICAgU3RyaW5nIGNvbXBvbmVudFR5cGUgPSBjb21wb25lbnQuZ2V0Q29tcG9uZW50VHlwZSgpOyAgICAgICAgCi0gICAgICByZXR1cm4gKGNvbXBvbmVudFR5cGUuc3RhcnRzV2l0aChfdHlwZVByZWZpeCkpOwotICAgIH0KLSAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgX3R5cGVQcmVmaXg7Ci0gIH0KLQotICBzdGF0aWMgZmluYWwgcHJvdGVjdGVkIGNsYXNzIENvbXBvbmVudENsYXNzRmlsdGVyIGV4dGVuZHMgQ29tcG9uZW50RmlsdGVyCi0gIHsKLSAgICBwdWJsaWMgQ29tcG9uZW50Q2xhc3NGaWx0ZXIoCi0gICAgICBTdHJpbmcgcGFja2FnZUNvbnRhaW5zKQotICAgIHsKLSAgICAgIF9wYWNrYWdlQ29udGFpbnMgPSBwYWNrYWdlQ29udGFpbnM7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KAotICAgICAgQ29tcG9uZW50QmVhbiBjb21wb25lbnQpCi0gICAgewotICAgICAgU3RyaW5nIGNvbXBvbmVudENsYXNzID0gY29tcG9uZW50LmdldENvbXBvbmVudENsYXNzKCk7Ci0gICAgICBTdHJpbmcgcGFja2FnZU5hbWUgPSBVdGlsLmdldFBhY2thZ2VGcm9tRnVsbENsYXNzKGNvbXBvbmVudENsYXNzKTsKLQotICAgICAgLy8gYWNjZXB0IG9ubHkgY2xhc3NlcyB0aGF0IG1hdGNoIHRoZSBwYWNrYWdlCi0gICAgICByZXR1cm4gKHBhY2thZ2VOYW1lLmNvbnRhaW5zKF9wYWNrYWdlQ29udGFpbnMpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBfcGFja2FnZUNvbnRhaW5zOwotICB9Ci0KLSAgc3RhdGljIGZpbmFsIHByb3RlY3RlZCBjbGFzcyBDb21wb25lbnRUYWdDbGFzc0ZpbHRlciBleHRlbmRzIENvbXBvbmVudEZpbHRlcgotICB7Ci0gICAgcHVibGljIENvbXBvbmVudFRhZ0NsYXNzRmlsdGVyKAotICAgICAgU3RyaW5nIHBhY2thZ2VDb250YWlucykKLSAgICB7Ci0gICAgICBfcGFja2FnZUNvbnRhaW5zID0gcGFja2FnZUNvbnRhaW5zOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBib29sZWFuIGFjY2VwdCgKLSAgICAgIENvbXBvbmVudEJlYW4gY29tcG9uZW50KQotICAgIHsKLSAgICAgIFN0cmluZyB0YWdDbGFzcyA9IGNvbXBvbmVudC5nZXRUYWdDbGFzcygpOwotICAgICAgU3RyaW5nIHBhY2thZ2VOYW1lID0gVXRpbC5nZXRQYWNrYWdlRnJvbUZ1bGxDbGFzcyh0YWdDbGFzcyk7Ci0KLSAgICAgIC8vIGFjY2VwdCBvbmx5IGNsYXNzZXMgaW4gdGhpcyBwcm9qZWN0J3MgKHN1YilwYWNrYWdlCi0gICAgICByZXR1cm4gKHBhY2thZ2VOYW1lLmNvbnRhaW5zKF9wYWNrYWdlQ29udGFpbnMpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBfcGFja2FnZUNvbnRhaW5zOwotICB9Ci0KLSAgc3RhdGljIGZpbmFsIHByb3RlY3RlZCBjbGFzcyBDb252ZXJ0ZXJUYWdDbGFzc0ZpbHRlciBleHRlbmRzIENvbnZlcnRlckZpbHRlcgotICB7Ci0gICAgcHVibGljIENvbnZlcnRlclRhZ0NsYXNzRmlsdGVyKAotICAgICAgU3RyaW5nIHBhY2thZ2VDb250YWlucykKLSAgICB7Ci0gICAgICBfcGFja2FnZUNvbnRhaW5zID0gcGFja2FnZUNvbnRhaW5zOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBib29sZWFuIGFjY2VwdCgKLSAgICAgIENvbnZlcnRlckJlYW4gY29udmVydGVyKQotICAgIHsKLSAgICAgIFN0cmluZyB0YWdDbGFzcyA9IGNvbnZlcnRlci5nZXRUYWdDbGFzcygpOwotICAgICAgU3RyaW5nIHBhY2thZ2VOYW1lID0gVXRpbC5nZXRQYWNrYWdlRnJvbUZ1bGxDbGFzcyh0YWdDbGFzcyk7Ci0KLSAgICAgIC8vIGFjY2VwdCBvbmx5IGNsYXNzZXMgdGhhdCBjb250YWluIHRoZSBkZXNpcmVkIHN0cmluZwotICAgICAgcmV0dXJuIChwYWNrYWdlTmFtZS5jb250YWlucyhfcGFja2FnZUNvbnRhaW5zKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgX3BhY2thZ2VDb250YWluczsKLSAgfQotCi0gIHN0YXRpYyBmaW5hbCBwcm90ZWN0ZWQgY2xhc3MgVmFsaWRhdG9yVGFnQ2xhc3NGaWx0ZXIgZXh0ZW5kcyBWYWxpZGF0b3JGaWx0ZXIKLSAgewotICAgIHB1YmxpYyBWYWxpZGF0b3JUYWdDbGFzc0ZpbHRlcigKLSAgICAgIFN0cmluZyBwYWNrYWdlQ29udGFpbnMpCi0gICAgewotICAgICAgX3BhY2thZ2VDb250YWlucyA9IHBhY2thZ2VDb250YWluczsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHQoCi0gICAgICBWYWxpZGF0b3JCZWFuIHZhbGlkYXRvcikKLSAgICB7Ci0gICAgICBTdHJpbmcgdGFnQ2xhc3MgPSB2YWxpZGF0b3IuZ2V0VGFnQ2xhc3MoKTsKLSAgICAgIFN0cmluZyBwYWNrYWdlTmFtZSA9IFV0aWwuZ2V0UGFja2FnZUZyb21GdWxsQ2xhc3ModGFnQ2xhc3MpOwotCi0gICAgICAvLyBhY2NlcHQgb25seSBjbGFzc2VzIHRoYXQgY29udGFpbiB0aGUgZGVzaXJlZCBzdHJpbmcKLSAgICAgIHJldHVybiAocGFja2FnZU5hbWUuY29udGFpbnMoX3BhY2thZ2VDb250YWlucykpOwotICAgIH0KLQotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIF9wYWNrYWdlQ29udGFpbnM7Ci0gIH0KLQotICAKLQotICBzdGF0aWMgZmluYWwgcHJvdGVjdGVkIGNsYXNzIENvbXBvbmVudFRhZ0ZpbHRlciBleHRlbmRzIENvbXBvbmVudEZpbHRlcgotICB7Ci0gICAgcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KAotICAgICAgQ29tcG9uZW50QmVhbiBjb21wb25lbnQpCi0gICAgewotICAgICAgcmV0dXJuIChjb21wb25lbnQuZ2V0VGFnQ2xhc3MoKSAhPSBudWxsKTsKLSAgICB9Ci0gIH0KLQotICBzdGF0aWMgZmluYWwgcHJvdGVjdGVkIGNsYXNzIENvbnZlcnRlclRhZ0ZpbHRlciBleHRlbmRzIENvbnZlcnRlckZpbHRlcgotICB7Ci0gICAgcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KAotICAgICAgQ29udmVydGVyQmVhbiBjb252ZXJ0ZXIpCi0gICAgewotICAgICAgcmV0dXJuIChjb252ZXJ0ZXIuZ2V0VGFnQ2xhc3MoKSAhPSBudWxsKTsKLSAgICB9Ci0gIH0KLQotICBzdGF0aWMgZmluYWwgcHJvdGVjdGVkIGNsYXNzIFZhbGlkYXRvclRhZ0ZpbHRlciBleHRlbmRzIFZhbGlkYXRvckZpbHRlcgotICB7Ci0gICAgcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KAotICAgICAgVmFsaWRhdG9yQmVhbiB2YWxpZGF0b3IpCi0gICAgewotICAgICAgcmV0dXJuICh2YWxpZGF0b3IuZ2V0VGFnQ2xhc3MoKSAhPSBudWxsKTsKLSAgICB9Ci0gIH0KLQotICBzdGF0aWMgZmluYWwgcHJvdGVjdGVkIGNsYXNzIENvbXBvbmVudFRhZ0xpYnJhcnlGaWx0ZXIgZXh0ZW5kcyBDb21wb25lbnRGaWx0ZXIKLSAgewotICAgIHB1YmxpYyBDb21wb25lbnRUYWdMaWJyYXJ5RmlsdGVyKAotICAgICAgU3RyaW5nIG5hbWVzcGFjZVVSSSkKLSAgICB7Ci0gICAgICB0aGlzKG5hbWVzcGFjZVVSSSwgdHJ1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIENvbXBvbmVudFRhZ0xpYnJhcnlGaWx0ZXIoCi0gICAgICBTdHJpbmcgbmFtZXNwYWNlVVJJLAotICAgICAgYm9vbGVhbiByZXF1aXJlVGFnQ2xhc3MpCi0gICAgewotICAgICAgX25hbWVzcGFjZVVSSSA9IG5hbWVzcGFjZVVSSTsKLSAgICAgIF9yZXF1aXJlVGFnQ2xhc3MgPSByZXF1aXJlVGFnQ2xhc3M7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KAotICAgICAgQ29tcG9uZW50QmVhbiBjb21wb25lbnQpCi0gICAgewotICAgICAgUU5hbWUgdGFnTmFtZSA9IGNvbXBvbmVudC5nZXRUYWdOYW1lKCk7Ci0gICAgICBTdHJpbmcgdGFnQ2xhc3MgPSBjb21wb25lbnQuZ2V0VGFnQ2xhc3MoKTsKLQotICAgICAgLy8gYWNjZXB0IGlmIHRhZ0NsYXNzIGlzIHByZXNlbnQKLSAgICAgIC8vIGFuZCBpZiB0YWdOYW1lIGlzIGluIHRoZSBkZXNpcmVkIG5hbWVzcGFjZVVSSQotICAgICAgcmV0dXJuICgoIV9yZXF1aXJlVGFnQ2xhc3MgfHwgKHRhZ0NsYXNzICE9IG51bGwpKSAmJgotICAgICAgICAgICAgICB0YWdOYW1lICE9IG51bGwgJiYKLSAgICAgICAgICAgICAgX25hbWVzcGFjZVVSSS5lcXVhbHModGFnTmFtZS5nZXROYW1lc3BhY2VVUkkoKSkpOwotICAgIH0KLQotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIF9uYW1lc3BhY2VVUkk7Ci0gICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIF9yZXF1aXJlVGFnQ2xhc3M7Ci0gIH0KLQotICBzdGF0aWMgZmluYWwgcHJvdGVjdGVkIGNsYXNzIFZhbGlkYXRvclRhZ0xpYnJhcnlGaWx0ZXIgZXh0ZW5kcyBWYWxpZGF0b3JGaWx0ZXIKLSAgewotICAgIHB1YmxpYyBWYWxpZGF0b3JUYWdMaWJyYXJ5RmlsdGVyKAotICAgICAgU3RyaW5nIG5hbWVzcGFjZVVSSSkKLSAgICB7Ci0gICAgICB0aGlzKG5hbWVzcGFjZVVSSSwgdHJ1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIFZhbGlkYXRvclRhZ0xpYnJhcnlGaWx0ZXIoCi0gICAgICBTdHJpbmcgbmFtZXNwYWNlVVJJLAotICAgICAgYm9vbGVhbiByZXF1aXJlVGFnQ2xhc3MpCi0gICAgewotICAgICAgX25hbWVzcGFjZVVSSSA9IG5hbWVzcGFjZVVSSTsKLSAgICAgIF9yZXF1aXJlVGFnQ2xhc3MgPSByZXF1aXJlVGFnQ2xhc3M7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KAotICAgICAgVmFsaWRhdG9yQmVhbiB2YWxpZGF0b3IpCi0gICAgewotICAgICAgUU5hbWUgdGFnTmFtZSA9IHZhbGlkYXRvci5nZXRUYWdOYW1lKCk7Ci0gICAgICBTdHJpbmcgdGFnQ2xhc3MgPSB2YWxpZGF0b3IuZ2V0VGFnQ2xhc3MoKTsKLQotICAgICAgLy8gYWNjZXB0IGlmIHRhZ0NsYXNzIGlzIHByZXNlbnQKLSAgICAgIC8vIGFuZCBpZiB0YWdOYW1lIGlzIGluIHRoZSBkZXNpcmVkIG5hbWVzcGFjZVVSSQotICAgICAgcmV0dXJuICgoIV9yZXF1aXJlVGFnQ2xhc3MgfHwgKHRhZ0NsYXNzICE9IG51bGwpKSAmJgotICAgICAgICAgICAgICB0YWdOYW1lICE9IG51bGwgJiYKLSAgICAgICAgICAgICAgX25hbWVzcGFjZVVSSS5lcXVhbHModGFnTmFtZS5nZXROYW1lc3BhY2VVUkkoKSkpOwotICAgIH0KLQotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIF9uYW1lc3BhY2VVUkk7Ci0gICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIF9yZXF1aXJlVGFnQ2xhc3M7Ci0gIH0KLQotICBzdGF0aWMgZmluYWwgcHJvdGVjdGVkIGNsYXNzIENvbnZlcnRlclRhZ0xpYnJhcnlGaWx0ZXIgZXh0ZW5kcyBDb252ZXJ0ZXJGaWx0ZXIKLSAgewotICAgIHB1YmxpYyBDb252ZXJ0ZXJUYWdMaWJyYXJ5RmlsdGVyKAotICAgICAgU3RyaW5nIG5hbWVzcGFjZVVSSSkKLSAgICB7Ci0gICAgICB0aGlzKG5hbWVzcGFjZVVSSSwgdHJ1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIENvbnZlcnRlclRhZ0xpYnJhcnlGaWx0ZXIoCi0gICAgICBTdHJpbmcgbmFtZXNwYWNlVVJJLAotICAgICAgYm9vbGVhbiByZXF1aXJlVGFnQ2xhc3MpCi0gICAgewotICAgICAgX25hbWVzcGFjZVVSSSA9IG5hbWVzcGFjZVVSSTsKLSAgICAgIF9yZXF1aXJlVGFnQ2xhc3MgPSByZXF1aXJlVGFnQ2xhc3M7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KAotICAgICAgQ29udmVydGVyQmVhbiBjb252ZXJ0ZXIpCi0gICAgewotICAgICAgUU5hbWUgdGFnTmFtZSA9IGNvbnZlcnRlci5nZXRUYWdOYW1lKCk7Ci0gICAgICBTdHJpbmcgdGFnQ2xhc3MgPSBjb252ZXJ0ZXIuZ2V0VGFnQ2xhc3MoKTsKLQotICAgICAgLy8gYWNjZXB0IGlmIHRhZ0NsYXNzIGlzIHByZXNlbnQKLSAgICAgIC8vIGFuZCBpZiB0YWdOYW1lIGlzIGluIHRoZSBkZXNpcmVkIG5hbWVzcGFjZVVSSQotICAgICAgcmV0dXJuICgoIV9yZXF1aXJlVGFnQ2xhc3MgfHwgKHRhZ0NsYXNzICE9IG51bGwpKSAmJgotICAgICAgICAgICAgICB0YWdOYW1lICE9IG51bGwgJiYKLSAgICAgICAgICAgICAgX25hbWVzcGFjZVVSSS5lcXVhbHModGFnTmFtZS5nZXROYW1lc3BhY2VVUkkoKSkpOwotICAgIH0KLQotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIF9uYW1lc3BhY2VVUkk7Ci0gICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIF9yZXF1aXJlVGFnQ2xhc3M7Ci0gIH0KLQotICBzdGF0aWMgcHJvdGVjdGVkIGNsYXNzIFZpcnR1YWxBdHRyaWJ1dGVGaWx0ZXIgZXh0ZW5kcyBBdHRyaWJ1dGVGaWx0ZXIKLSAgewotICAgIHByb3RlY3RlZCBib29sZWFuIGFjY2VwdCgKLSAgICAgIEF0dHJpYnV0ZUJlYW4gYXR0cmlidXRlKQotICAgIHsKLSAgICAgIHJldHVybiAhYXR0cmlidXRlLmlzVmlydHVhbCgpOwotICAgIH0KLSAgfQotCi0gLyoqCi0gICogQHBhcmFtZXRlcgotICAqLwotICBwcml2YXRlIEZpbGUgbGljZW5zZUhlYWRlckZpbGU7Ci0KLSAgLyoqCi0gICogQHBhcmFtZXRlciBkZWZhdWx0LXZhbHVlID0gInRydWUiCi0gICovCi0gIHByaXZhdGUgYm9vbGVhbiBza2lwQXBpT3JCYXNlQ2xhc3NlczsKLQotICAvKioKLSAgICogQHBhcmFtZXRlcgotICAgKi8KLSAgcHJpdmF0ZSBGaWxlIGxvY2FsUmVzb3VyY2U7Ci0KLQotCi0gIHByaXZhdGUgRmFjZXNDb25maWdCZWFuIF9mYWNlc0NvbmZpZzsKLSAgcHJpdmF0ZSBTdHJpbmcgX2xpY2Vuc2VIZWFkZXI7Ci0KLSAgc3RhdGljIGZpbmFsIHByaXZhdGUgU3RyaW5nIF9BVVRPX0dFTkVSQVRFX1dBUk5JTkcgPQotIi8vIFdBUk5JTkc6IFRoaXMgZmlsZSB3YXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQuIERvIG5vdCBlZGl0IGl0IGRpcmVjdGx5LFxuIisKLSIvLyAgICAgICAgICBvciB5b3Ugd2lsbCBsb3NlIHlvdXIgY2hhbmdlcy5cblxuIjsKLQotCi0gIHN0YXRpYyBmaW5hbCBwcml2YXRlIFN0cmluZyBfREVGQVVMVF9MSUNFTlNFX0hFQURFUiA9Ci0gICAgIi8qXG4iICsKLSAgICAiICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuIiArCi0gICAgIiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuIiArCi0gICAgIiAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4iICsKLSAgICAiICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuIiArCi0gICAgIiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbiIgKwotICAgICIgKiBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2VcbiIgKwotICAgICIgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4iICsKLSAgICAiICpcbiIgKwotICAgICIgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuIiArCi0gICAgIiAqXG4iICsKLSAgICAiICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuIiArCi0gICAgIiAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4iICsKLSAgICAiICogXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbiIgKwotICAgICIgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbiIgKwotICAgICIgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4iICsKLSAgICAiICogdW5kZXIgdGhlIExpY2Vuc2UuXG4iICsKLSAgICAiKi9cbiI7Ci19Ci0gIApkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL0dlbmVyYXRlQ29tcG9uZW50c01vam8uamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy9HZW5lcmF0ZUNvbXBvbmVudHNNb2pvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhY2VmMjIuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL0dlbmVyYXRlQ29tcG9uZW50c01vam8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0MyArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5Nb2pvRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucHJvamVjdC5NYXZlblByb2plY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy5nZW5lcmF0b3IuY29tcG9uZW50LkNvbXBvbmVudEdlbmVyYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLmdlbmVyYXRvci5jb21wb25lbnQuTXlGYWNlc0NvbXBvbmVudEdlbmVyYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLmdlbmVyYXRvci5jb21wb25lbnQuVHJpbmlkYWRDb21wb25lbnRHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy5pby5QcmV0dHlXcml0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy5wYXJzZS5Db21wb25lbnRCZWFuOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMucGFyc2UuRmFjZXNDb25maWdCZWFuOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMudXRpbC5Db21wb25lbnRGaWx0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy51dGlsLkZpbHRlcmVkSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy51dGlsLlNvdXJjZVRlbXBsYXRlOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMudXRpbC5VdGlsOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZVdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1vZGlmaWVyOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotLyoqCi0gKiBAdmVyc2lvbiAkSWQkCi0gKiBAcmVxdWlyZXNEZXBlbmRlbmN5UmVzb2x1dGlvbiBjb21waWxlCi0gKiBAZ29hbCBnZW5lcmF0ZS1jb21wb25lbnRzCi0gKiBAcGhhc2UgZ2VuZXJhdGUtc291cmNlcwotICovCi1wdWJsaWMgY2xhc3MgR2VuZXJhdGVDb21wb25lbnRzTW9qbyBleHRlbmRzIEFic3RyYWN0RmFjZXNNb2pvCi17Ci0gIC8qKgotICAgKiBFeGVjdXRlIHRoZSBNb2pvLgotICAgKi8KLSAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBwcm9jZXNzSW5kZXgocHJvamVjdCwgcmVzb3VyY2VQYXRoKTsKLSAgICAgIF9nZW5lcmF0ZUNvbXBvbmVudHMoKTsKLSAgICB9Ci0gICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgdGhyb3cgbmV3IE1vam9FeGVjdXRpb25FeGNlcHRpb24oIkVycm9yIGdlbmVyYXRpbmcgY29tcG9uZW50cyIsIGUpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBHZW5lcmF0ZXMgcGFyc2VkIGNvbXBvbmVudHMuCi0gICAqLwotICBwcml2YXRlIHZvaWQgX2dlbmVyYXRlQ29tcG9uZW50cygpIHRocm93cyBJT0V4Y2VwdGlvbiwgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbgotICB7Ci0gICAgLy8gTWFrZSBzdXJlIGdlbmVyYXRlZCBzb3VyY2UgZGlyZWN0b3J5Ci0gICAgLy8gaXMgYWRkZWQgdG8gY29tcGlsYXRpb24gc291cmNlIHBhdGgKLSAgICBwcm9qZWN0LmFkZENvbXBpbGVTb3VyY2VSb290KGdlbmVyYXRlZFNvdXJjZURpcmVjdG9yeS5nZXRDYW5vbmljYWxQYXRoKCkpOwotCi0gICAgRmFjZXNDb25maWdCZWFuIGZhY2VzQ29uZmlnID0gZ2V0RmFjZXNDb25maWcoKTsKLSAgICBpZiAoIWZhY2VzQ29uZmlnLmhhc0NvbXBvbmVudHMoKSkKLSAgICB7Ci0gICAgICBnZXRMb2coKS5pbmZvKCJOb3RoaW5nIHRvIGdlbmVyYXRlIC0gbm8gY29tcG9uZW50cyBmb3VuZCIpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgaWYgKHN1cHByZXNzTGlzdGVuZXJNZXRob2RzKQotICAgICAgewotICAgICAgICBnZXRMb2coKS53YXJuKCJFdmVudCBsaXN0ZW5lciBtZXRob2RzIHdpbGwgbm90IGJlIGdlbmVyYXRlZCIpOwotICAgICAgfQotCi0gICAgICBJdGVyYXRvciBjb21wb25lbnRzID0gZmFjZXNDb25maWcuY29tcG9uZW50cygpOwotICAgICAgY29tcG9uZW50cyA9IG5ldyBGaWx0ZXJlZEl0ZXJhdG9yKGNvbXBvbmVudHMsIG5ldyBTa2lwRmlsdGVyKCkpOwotICAgICAgY29tcG9uZW50cyA9IG5ldyBGaWx0ZXJlZEl0ZXJhdG9yKGNvbXBvbmVudHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENvbXBvbmVudFR5cGVGaWx0ZXIodHlwZVByZWZpeCkpOwotCi0gICAgICAvLyBpbmNyZW1lbnRhbCB1bmxlc3MgZm9yY2VkCi0gICAgICBpZiAoIWZvcmNlKQotICAgICAgewotICAgICAgICBjb21wb25lbnRzID0gbmV3IEZpbHRlcmVkSXRlcmF0b3IoY29tcG9uZW50cywgbmV3IElmTW9kaWZpZWRGaWx0ZXIoKSk7Ci0gICAgICB9Ci0KLSAgICAgIGlmICghY29tcG9uZW50cy5oYXNOZXh0KCkpCi0gICAgICB7Ci0gICAgICAgIGdldExvZygpLmluZm8oIk5vdGhpbmcgdG8gZ2VuZXJhdGUgLSBhbGwgY29tcG9uZW50cyBhcmUgdXAgdG8gZGF0ZSIpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBpbnQgY291bnQgPSAwOwotICAgICAgICB3aGlsZSAoY29tcG9uZW50cy5oYXNOZXh0KCkpCi0gICAgICAgIHsKLSAgICAgICAgICBDb21wb25lbnRCZWFuIGNvbXBvbmVudCA9IChDb21wb25lbnRCZWFuKWNvbXBvbmVudHMubmV4dCgpOwotICAgICAgICAgIGlmICghY29tcG9uZW50LmlzQ29tcG9uZW50Q2xhc3NFeGNsdWRlZCgpKXsKLSAgICAgICAgICAgICAgX2dlbmVyYXRlQ29tcG9uZW50KGNvbXBvbmVudCk7Ci0gICAgICAgICAgICAgIGNvdW50Kys7Ci0gICAgICAgICAgfSAgICAgICAgICAKLSAgICAgICAgfQotICAgICAgICBnZXRMb2coKS5pbmZvKCJHZW5lcmF0ZWQgIiArIGNvdW50ICsgIiBjb21wb25lbnQocykiKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogR2VuZXJhdGVzIGEgcGFyc2VkIGNvbXBvbmVudC4KLSAgICoKLSAgICogQHBhcmFtIGNvbXBvbmVudCAgdGhlIHBhcnNlZCBjb21wb25lbnQgbWV0YWRhdGEKLSAgICovCi0gIHByaXZhdGUgdm9pZCBfZ2VuZXJhdGVDb21wb25lbnQoCi0gICAgQ29tcG9uZW50QmVhbiBjb21wb25lbnQpIHRocm93cyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uCi0gIHsKLSAgICBDb21wb25lbnRHZW5lcmF0b3IgZ2VuZXJhdG9yOwotCi0gICAgU3RyaW5nIGZ1bGxDbGFzc05hbWUgPSBjb21wb25lbnQuZ2V0Q29tcG9uZW50Q2xhc3MoKTsKLQotICAgIGlmIChjb21wb25lbnQuaXNUcmluaWRhZENvbXBvbmVudCgpKQotICAgIHsKLSAgICAgIGdlbmVyYXRvciA9IG5ldyBUcmluaWRhZENvbXBvbmVudEdlbmVyYXRvcihnZXRMb2coKSwgX2lzMTIoKSk7Ci0gICAgfQotICAgIGVsc2UgCi0gICAgewotICAgICAgZ2VuZXJhdG9yID0gbmV3IE15RmFjZXNDb21wb25lbnRHZW5lcmF0b3IoZ2V0TG9nKCksX2lzMTIoKSApOwotICAgIH0KLQotICAgIHRyeQotICAgIHsKLSAgICAgIGdldExvZygpLmRlYnVnKCJHZW5lcmF0aW5nICIgKyBmdWxsQ2xhc3NOYW1lKyIsIHdpdGggZ2VuZXJhdG9yOiAiK2dlbmVyYXRvci5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0KLSAgICAgIFN0cmluZyBzb3VyY2VQYXRoID0gVXRpbC5jb252ZXJ0Q2xhc3NUb1NvdXJjZVBhdGgoZnVsbENsYXNzTmFtZSwgIi5qYXZhIik7Ci0gICAgICBGaWxlIHRhcmdldEZpbGUgPSBuZXcgRmlsZShnZW5lcmF0ZWRTb3VyY2VEaXJlY3RvcnksIHNvdXJjZVBhdGgpOwotCi0gICAgICBTdHJpbmdXcml0ZXIgc3cgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0gICAgICBQcmV0dHlXcml0ZXIgb3V0ID0gbmV3IFByZXR0eVdyaXRlcihzdyk7Ci0KLSAgICAgIFN0cmluZyBjbGFzc05hbWUgPSBVdGlsLmdldENsYXNzRnJvbUZ1bGxDbGFzcyhmdWxsQ2xhc3NOYW1lKTsKLSAgICAgIFN0cmluZyBjb21wb25lbnRGYW1pbHkgPSBjb21wb25lbnQuZmluZENvbXBvbmVudEZhbWlseSgpOwotCi0gICAgICBpZiAoY29tcG9uZW50RmFtaWx5ID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGdldExvZygpLndhcm4oIk1pc3NpbmcgPGNvbXBvbmVudC1mYW1pbHk+IGZvciBcIiIgKwotICAgICAgICAgICAgICAgICAgICAgICBmdWxsQ2xhc3NOYW1lICsgIlwiLCBnZW5lcmF0aW9uIG9mIHRoaXMgQ29tcG9uZW50IGlzIHNraXBwZWQiKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIHBhY2thZ2VOYW1lID0gVXRpbC5nZXRQYWNrYWdlRnJvbUZ1bGxDbGFzcyhmdWxsQ2xhc3NOYW1lKTsKLSAgICAgICAgU3RyaW5nIGZ1bGxTdXBlcmNsYXNzTmFtZSA9IGNvbXBvbmVudC5maW5kQ29tcG9uZW50U3VwZXJjbGFzcygpOwotICAgICAgICBTdHJpbmcgc3VwZXJjbGFzc05hbWUgPSBVdGlsLmdldENsYXNzRnJvbUZ1bGxDbGFzcyhmdWxsU3VwZXJjbGFzc05hbWUpOwotCi0gICAgICAgIC8vIG1ha2UgY2xhc3MgbmFtZSBmdWxseSBxdWFsaWZpZWQgaW4gY2FzZSBvZiBjb2xsaXNpb24KLSAgICAgICAgaWYgKHN1cGVyY2xhc3NOYW1lLmVxdWFscyhjbGFzc05hbWUpKQotICAgICAgICAgIHN1cGVyY2xhc3NOYW1lID0gZnVsbFN1cGVyY2xhc3NOYW1lOwotCi0gICAgICAgIC8vIFRPRE86IHJlbW92ZSB0aGlzIGJvZ29zaXR5Ci0gICAgICAgIGlmIChzdXBlcmNsYXNzTmFtZS5lcXVhbHMoIlVJWE1lbnVIaWVyYXJjaHkiKSB8fAotICAgICAgICAgICAgc3VwZXJjbGFzc05hbWUuZXF1YWxzKCJVSVhUYWJsZSIpIHx8Ci0gICAgICAgICAgICBzdXBlcmNsYXNzTmFtZS5lcXVhbHMoIlVJWEhpZXJhcmNoeSIpIHx8Ci0gICAgICAgICAgICBzdXBlcmNsYXNzTmFtZS5lcXVhbHMoIlVJWE1lbnVUcmVlIikgfHwKLSAgICAgICAgICAgIGNsYXNzTmFtZS5lcXVhbHMoIkNvcmVUcmVlIikpCi0gICAgICAgIHsKLSAgICAgICAgICBzdXBlcmNsYXNzTmFtZSA9IGZ1bGxTdXBlcmNsYXNzTmFtZTsKLSAgICAgICAgfQotCi0KLSAgICAgICAgU3RyaW5nIGNvbXBvbmVudFR5cGUgPSBjb21wb25lbnQuZ2V0Q29tcG9uZW50VHlwZSgpOwotCi0gICAgICAgIC8vIFVzZSB0ZW1wbGF0ZSBmaWxlIGlmIGl0IGV4aXN0cwotICAgICAgICBTdHJpbmcgdGVtcGxhdGVQYXRoID0gVXRpbC5jb252ZXJ0Q2xhc3NUb1NvdXJjZVBhdGgoZnVsbENsYXNzTmFtZSwgIlRlbXBsYXRlLmphdmEiKTsKLSAgICAgICAgRmlsZSB0ZW1wbGF0ZUZpbGUgPSBuZXcgRmlsZSh0ZW1wbGF0ZVNvdXJjZURpcmVjdG9yeSwgdGVtcGxhdGVQYXRoKTsKLQotICAgICAgICBTb3VyY2VUZW1wbGF0ZSB0ZW1wbGF0ZSA9IG51bGw7Ci0gICAgICAgIGlmICh0ZW1wbGF0ZUZpbGUuZXhpc3RzKCkpCi0gICAgICAgIHsKLSAgICAgICAgICBnZXRMb2coKS5kZWJ1ZygiVXNpbmcgdGVtcGxhdGUgIiArIHRlbXBsYXRlUGF0aCk7Ci0gICAgICAgICAgdGVtcGxhdGUgPSBuZXcgU291cmNlVGVtcGxhdGUodGVtcGxhdGVGaWxlKTsKLSAgICAgICAgICB0ZW1wbGF0ZS5zdWJzdGl0dXRlKGNsYXNzTmFtZSArICJUZW1wbGF0ZSIsIGNsYXNzTmFtZSk7Ci0gICAgICAgICAgdGVtcGxhdGUucmVhZFByZWZhY2UoKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGhlYWRlci9jb3B5cmlnaHQKLSAgICAgICAgd3JpdGVQcmVhbWJsZShvdXQpOwotCi0gICAgICAgIC8vIHBhY2thZ2UKLSAgICAgICAgb3V0LnByaW50bG4oInBhY2thZ2UgIiArIHBhY2thZ2VOYW1lICsgIjsiKTsKLSAgICAgICAgb3V0LnByaW50bG4oKTsKLQotICAgICAgICAvLyBpbXBvcnRzCi0gICAgICAgIGdlbmVyYXRvci53cml0ZUltcG9ydHMob3V0LCB0ZW1wbGF0ZSwgcGFja2FnZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgZnVsbFN1cGVyY2xhc3NOYW1lLCBzdXBlcmNsYXNzTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQpOwotCi0gICAgICAgIC8vIGNsYXNzCi0gICAgICAgIGdlbmVyYXRvci53cml0ZUNsYXNzQmVnaW4ob3V0LCBjbGFzc05hbWUsIHN1cGVyY2xhc3NOYW1lLCBjb21wb25lbnQsIHRlbXBsYXRlKTsKLQotICAgICAgICAvLyBzdGF0aWMgZmluYWwgY29uc3RhbnRzCi0gICAgICAgIGdlbmVyYXRvci53cml0ZVByb3BlcnR5VmFsdWVDb25zdGFudHMob3V0LCBjb21wb25lbnQpOwotICAgICAgICBnZW5lcmF0b3Iud3JpdGVQcm9wZXJ0eUNvbnN0YW50cyhvdXQsIHN1cGVyY2xhc3NOYW1lLCBjb21wb25lbnQpOwotICAgICAgICBnZW5lcmF0b3Iud3JpdGVGYWNldENvbnN0YW50cyhvdXQsIGNvbXBvbmVudCk7Ci0gICAgICAgIGdlbmVyYXRvci53cml0ZUdlbmVyaWNDb25zdGFudHMob3V0LCBjb21wb25lbnRGYW1pbHksIGNvbXBvbmVudFR5cGUpOwotCi0gICAgICAgIC8vIHB1YmxpYyBjb25zdHJ1Y3RvcnMgYW5kIG1ldGhvZHMKLSAgICAgICAgZ2VuZXJhdG9yLndyaXRlQ29uc3RydWN0b3Iob3V0LCBjb21wb25lbnQsIE1vZGlmaWVyLlBVQkxJQyk7Ci0KLSAgICAgICAgLy8gaW5zZXJ0IHRlbXBsYXRlIGNvZGUKLSAgICAgICAgaWYgKHRlbXBsYXRlICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICB0ZW1wbGF0ZS53cml0ZUNvbnRlbnQob3V0KTsKLSAgICAgICAgICB0ZW1wbGF0ZS5jbG9zZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgZ2VuZXJhdG9yLndyaXRlRmFjZXRNZXRob2RzKG91dCwgY29tcG9uZW50KTsKLQotICAgICAgICBpZiAodGVtcGxhdGUgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIGdlbmVyYXRvci53cml0ZVByb3BlcnR5TWV0aG9kcyhvdXQsIGNvbXBvbmVudCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgZ2VuZXJhdG9yLndyaXRlUHJvcGVydHlNZXRob2RzKG91dCwgY29tcG9uZW50LCB0ZW1wbGF0ZS5nZXRJZ25vcmVNZXRob2RzKCkpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZiAoIXN1cHByZXNzTGlzdGVuZXJNZXRob2RzKQotICAgICAgICB7Ci0gICAgICAgICAgZ2VuZXJhdG9yLndyaXRlTGlzdGVuZXJNZXRob2RzKG91dCwgY29tcG9uZW50KTsKLSAgICAgICAgfQotCi0gICAgICAgIGdlbmVyYXRvci53cml0ZVN0YXRlTWFuYWdlbWVudE1ldGhvZHMob3V0LCBjb21wb25lbnQpOwotCi0gICAgICAgIGdlbmVyYXRvci53cml0ZUdldEZhbWlseShvdXQpOwotCi0gICAgICAgIC8vIHByb3RlY3RlZCBjb25zdHJ1Y3RvcnMgYW5kIG1ldGhvZHMKLSAgICAgICAgLy8gVE9ETzogcmV2ZXJzZSB0aGlzIG9yZGVyLCB0byBtYWtlIHByb3RlY3RlZCBjb25zdHJ1Y3RvciBnbyBmaXJzdAotICAgICAgICAvLyAgICAgICBmb3Igbm93IHdlIHdhbnQgY29uc2lzdGVuY3kgd2l0aCBwcmV2aW91cyBjb2RlIGdlbmVyYXRpb24KLSAgICAgICAgZ2VuZXJhdG9yLndyaXRlT3RoZXIob3V0LCBjb21wb25lbnQpOwotCi0gICAgICAgIGdlbmVyYXRvci53cml0ZUNsYXNzRW5kKG91dCk7Ci0KLSAgICAgICAgb3V0LmNsb3NlKCk7Ci0KLSAgICAgICAgLy8gZGVsYXkgd3JpdGUgaW4gY2FzZSBvZiBlcnJvcgotICAgICAgICAvLyB0aW1lc3RhbXAgc2hvdWxkIG5vdCBiZSB1cGRhdGVkIHdoZW4gYW4gZXJyb3Igb2NjdXJzCi0gICAgICAgIC8vIGRlbGV0ZSB0YXJnZXQgZmlsZSBmaXJzdCwgYmVjYXVzZSBpdCBpcyByZWFkb25seQotICAgICAgICB0YXJnZXRGaWxlLmdldFBhcmVudEZpbGUoKS5ta2RpcnMoKTsKLSAgICAgICAgdGFyZ2V0RmlsZS5kZWxldGUoKTsKLSAgICAgICAgRmlsZVdyaXRlciBmdyA9IG5ldyBGaWxlV3JpdGVyKHRhcmdldEZpbGUpOwotICAgICAgICBTdHJpbmdCdWZmZXIgYnVmID0gc3cuZ2V0QnVmZmVyKCk7Ci0gICAgICAgIGZ3LndyaXRlKGJ1Zi50b1N0cmluZygpKTsKLSAgICAgICAgZncuY2xvc2UoKTsKLSAgICAgICAgdGFyZ2V0RmlsZS5zZXRSZWFkT25seSgpOwotICAgICAgfQotICAgIH0KLSAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICBnZXRMb2coKS5lcnJvcigiRXJyb3IgZ2VuZXJhdGluZyAiICsgZnVsbENsYXNzTmFtZSwgZSk7Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSBjbGFzcyBJZk1vZGlmaWVkRmlsdGVyIGV4dGVuZHMgQ29tcG9uZW50RmlsdGVyCi0gIHsKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHQoCi0gICAgICBDb21wb25lbnRCZWFuIGNvbXBvbmVudCkKLSAgICB7Ci0gICAgICBTdHJpbmcgY29tcG9uZW50Q2xhc3MgPSBjb21wb25lbnQuZ2V0Q29tcG9uZW50Q2xhc3MoKTsKLSAgICAgIFN0cmluZyBzb3VyY2VQYXRoID0gVXRpbC5jb252ZXJ0Q2xhc3NUb1NvdXJjZVBhdGgoY29tcG9uZW50Q2xhc3MsICIuamF2YSIpOwotICAgICAgU3RyaW5nIHRlbXBsYXRlUGF0aCA9IFV0aWwuY29udmVydENsYXNzVG9Tb3VyY2VQYXRoKGNvbXBvbmVudENsYXNzLCAiVGVtcGxhdGUuamF2YSIpOwotICAgICAgRmlsZSB0YXJnZXRGaWxlID0gbmV3IEZpbGUoZ2VuZXJhdGVkU291cmNlRGlyZWN0b3J5LCBzb3VyY2VQYXRoKTsKLSAgICAgIEZpbGUgdGVtcGxhdGVGaWxlID0gbmV3IEZpbGUodGVtcGxhdGVTb3VyY2VEaXJlY3RvcnksIHRlbXBsYXRlUGF0aCk7Ci0KLSAgICAgIC8vIGFjY2VwdCBpZiB0ZW1wbGF0ZUZpbGUgaXMgbmV3ZXIgb3IgY29tcG9uZW50IGhhcyBiZWVuIG1vZGlmaWVkCi0gICAgICByZXR1cm4gKHRlbXBsYXRlRmlsZS5sYXN0TW9kaWZpZWQoKSA+IHRhcmdldEZpbGUubGFzdE1vZGlmaWVkKCkgfHwKLSAgICAgICAgICAgICAgY29tcG9uZW50LmlzTW9kaWZpZWRTaW5jZSh0YXJnZXRGaWxlLmxhc3RNb2RpZmllZCgpKSk7Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSBib29sZWFuIF9pczEyKCkKLSAgewotICAgIHJldHVybiAiMS4yIi5lcXVhbHMoanNmVmVyc2lvbikgfHwgIjEyIi5lcXVhbHMoanNmVmVyc2lvbik7Ci0gIH0KLSAgCi0KLSAgLyoqCi0gICAqIEBwYXJhbWV0ZXIgZXhwcmVzc2lvbj0iJHtwcm9qZWN0fSIKLSAgICogQHJlYWRvbmx5Ci0gICAqLwotICBwcml2YXRlIE1hdmVuUHJvamVjdCBwcm9qZWN0OwotCi0gIC8qKgotICAgKiBAcGFyYW1ldGVyCi0gICAqIEByZWFkb25seQotICAgKi8KLSAgcHJpdmF0ZSBTdHJpbmcgcmVzb3VyY2VQYXRoID0gIk1FVEEtSU5GL21hdmVuLWZhY2VzLXBsdWdpbi9pbmRleC5sc3QiOwotCi0gIC8qKgotICAgKiBAcGFyYW1ldGVyIGV4cHJlc3Npb249InNyYy9tYWluL2phdmEtdGVtcGxhdGVzIgotICAgKiBAcmVxdWlyZWQKLSAgICovCi0gIHByaXZhdGUgRmlsZSB0ZW1wbGF0ZVNvdXJjZURpcmVjdG9yeTsKLQotICAvKioKLSAgICogQHBhcmFtZXRlciBleHByZXNzaW9uPSIke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9tYXZlbi1mYWNlcy1wbHVnaW4vbWFpbi9qYXZhIgotICAgKiBAcmVxdWlyZWQKLSAgICovCi0gIHByaXZhdGUgRmlsZSBnZW5lcmF0ZWRTb3VyY2VEaXJlY3Rvcnk7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbWV0ZXIKLSAgICogQHJlcXVpcmVkCi0gICAqLwotICBwcml2YXRlIFN0cmluZyBwYWNrYWdlQ29udGFpbnM7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbWV0ZXIKLSAgICogQHJlcXVpcmVkCi0gICAqLwotICAgIHByaXZhdGUgU3RyaW5nIHR5cGVQcmVmaXg7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbWV0ZXIKLSAgICovCi0gIHByaXZhdGUgYm9vbGVhbiBmb3JjZTsKLQotICAvKioKLSAgICogQHBhcmFtZXRlcgotICAgKi8KLSAgcHJpdmF0ZSBib29sZWFuIHN1cHByZXNzTGlzdGVuZXJNZXRob2RzOwotCi0gIC8qKgotICAgKiBAcGFyYW1ldGVyCi0gICAqLwotICBwcml2YXRlIFN0cmluZyBqc2ZWZXJzaW9uOwotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL0dlbmVyYXRlRmFjZWxldHNUYWdsaWJzTW9qby5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL0dlbmVyYXRlRmFjZWxldHNUYWdsaWJzTW9qby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMTMxNDZiLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy9HZW5lcmF0ZUZhY2VsZXRzVGFnbGlic01vam8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzMyArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXM7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5QYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlNBWFBhcnNlcjsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXJGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MT3V0cHV0RmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlcjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLk91dHB1dEtleXM7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5SZXN1bHQ7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5Tb3VyY2U7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lcjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc2F4LlNBWFNvdXJjZTsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1SZXN1bHQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLnBhcnNlLkNvbXBvbmVudEJlYW47Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy5wYXJzZS5Db252ZXJ0ZXJCZWFuOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMucGFyc2UuRmFjZXNDb25maWdCZWFuOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMucGFyc2UuVmFsaWRhdG9yQmVhbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLnV0aWwuRmlsdGVyZWRJdGVyYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLnV0aWwuWEluY2x1ZGVGaWx0ZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5Nb2pvRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucHJvamVjdC5NYXZlblByb2plY3Q7Ci0KLWltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLnV0aWwuRmlsZVV0aWxzOwotCi1pbXBvcnQgb3JnLnhtbC5zYXguRW50aXR5UmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotaW1wb3J0IG9yZy54bWwuc2F4LlhNTFJlYWRlcjsKLQotLyoqCi0gKiBAdmVyc2lvbiAkSWQkCi0gKiBAcmVxdWlyZXNEZXBlbmRlbmN5UmVzb2x1dGlvbiBjb21waWxlCi0gKiBAZ29hbCBnZW5lcmF0ZS1mYWNlbGV0cy10YWdsaWJzCi0gKiBAcGhhc2UgZ2VuZXJhdGUtc291cmNlcwotICovCi1wdWJsaWMgY2xhc3MgR2VuZXJhdGVGYWNlbGV0c1RhZ2xpYnNNb2pvIGV4dGVuZHMgQWJzdHJhY3RGYWNlc01vam8KLXsKLSAgLyoqCi0gICAqIEV4ZWN1dGUgdGhlIE1vam8uCi0gICAqLwotICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIE1vam9FeGVjdXRpb25FeGNlcHRpb24KLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIC8vIGFsd2F5cyBhZGQgcmVzb3VyY2VzIGRpcmVjdG9yeSB0byBwcm9qZWN0IHJlc291cmNlIHJvb3QKLSAgICAgIGFkZFJlc291cmNlUm9vdChwcm9qZWN0LCBnZW5lcmF0ZWRSZXNvdXJjZXNEaXJlY3RvcnkuZ2V0Q2Fub25pY2FsUGF0aCgpKTsKLQotICAgICAgcHJvY2Vzc0luZGV4KHByb2plY3QsIHJlc291cmNlUGF0aCk7Ci0KLSAgICAgIC8vIHRhZ2xpYnMgbWFwIHN5bnRheCByZXF1aXJlcyBkaXN0aW5jdCBzaG9ydE5hbWVzLAotICAgICAgLy8gd2hpY2ggaXMgYSBHb29kIFRoaW5nIQotICAgICAgZm9yIChJdGVyYXRvciBpID0gdGFnbGlicy5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgICB7Ci0gICAgICAgIE1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpaS5uZXh0KCk7Ci0gICAgICAgIFN0cmluZyBzaG9ydE5hbWUgPSAoU3RyaW5nKWVudHJ5LmdldEtleSgpOwotICAgICAgICBTdHJpbmcgbmFtZXNwYWNlVVJJID0gKFN0cmluZyllbnRyeS5nZXRWYWx1ZSgpOwotCi0gICAgICAgIEZhY2VzQ29uZmlnQmVhbiBmYWNlc0NvbmZpZyA9IGdldEZhY2VzQ29uZmlnKCk7Ci0gICAgICAgIEl0ZXJhdG9yIGNvbXBvbmVudHMgPSBmYWNlc0NvbmZpZy5jb21wb25lbnRzKCk7Ci0gICAgICAgIGNvbXBvbmVudHMgPSBuZXcgRmlsdGVyZWRJdGVyYXRvcihjb21wb25lbnRzLCBuZXcgU2tpcEZpbHRlcigpKTsKLSAgICAgICAgY29tcG9uZW50cyA9IG5ldyBGaWx0ZXJlZEl0ZXJhdG9yKGNvbXBvbmVudHMsIG5ldyBDb21wb25lbnRUYWdMaWJyYXJ5RmlsdGVyKG5hbWVzcGFjZVVSSSwgZmFsc2UpKTsKLQotICAgICAgICBJdGVyYXRvciB2YWxpZGF0b3JzID0gZmFjZXNDb25maWcudmFsaWRhdG9ycygpOwotICAgICAgICB2YWxpZGF0b3JzID0gbmV3IEZpbHRlcmVkSXRlcmF0b3IodmFsaWRhdG9ycywgbmV3IFZhbGlkYXRvclRhZ0xpYnJhcnlGaWx0ZXIobmFtZXNwYWNlVVJJLCBmYWxzZSkpOwotCi0gICAgICAgIEl0ZXJhdG9yIGNvbnZlcnRlcnMgPSBmYWNlc0NvbmZpZy5jb252ZXJ0ZXJzKCk7Ci0gICAgICAgIGNvbnZlcnRlcnMgPSBuZXcgRmlsdGVyZWRJdGVyYXRvcihjb252ZXJ0ZXJzLCBuZXcgQ29udmVydGVyVGFnTGlicmFyeUZpbHRlcihuYW1lc3BhY2VVUkksIGZhbHNlKSk7Ci0KLQotICAgICAgICBTdHJpbmcgdGFyZ2V0UGF0aCA9ICJNRVRBLUlORi8iICsgc2hvcnROYW1lICsgIi50YWdsaWIueG1sIjsKLSAgICAgICAgRmlsZSB0YXJnZXRGaWxlID0gbmV3IEZpbGUoZ2VuZXJhdGVkUmVzb3VyY2VzRGlyZWN0b3J5LCB0YXJnZXRQYXRoKTsKLQotICAgICAgICBTdHJpbmcgY29uZmlnUGF0aCA9ICJNRVRBLUlORi8iICsgc2hvcnROYW1lICsgIi1iYXNlLnRhZ2xpYi54bWwiOwotICAgICAgICBGaWxlIGNvbmZpZ0ZpbGUgPSBuZXcgRmlsZShjb25maWdTb3VyY2VEaXJlY3RvcnksIGNvbmZpZ1BhdGgpOwotCi0gICAgICAgIHRhcmdldEZpbGUuZGVsZXRlKCk7Ci0KLSAgICAgICAgaWYgKChjb21wb25lbnRzLmhhc05leHQoKXx8dmFsaWRhdG9ycy5oYXNOZXh0KCl8fGNvbnZlcnRlcnMuaGFzTmV4dCgpKQotICAgICAgICAgICAgJiYgY29uZmlnRmlsZS5leGlzdHMoKSkKLSAgICAgICAgewotICAgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0gICAgICAgICAgWE1MT3V0cHV0RmFjdG9yeSBvdXRwdXRGYWN0b3J5ID0gWE1MT3V0cHV0RmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgICAgIFhNTFN0cmVhbVdyaXRlciBzdHJlYW0gPSBvdXRwdXRGYWN0b3J5LmNyZWF0ZVhNTFN0cmVhbVdyaXRlcihvdXQpOwotCi0gICAgICAgICAgX3dyaXRlU3RhcnRUYWdMaWJyYXJ5KHN0cmVhbSwgX1hJTkNMVURFX0ZBQ0VMRVRTX1RBR19MSUJSQVJZX0RURCk7Ci0gICAgICAgICAgLy8gYmFzZSBnb2VzIGZpcnN0Ci0gICAgICAgICAgc3RyZWFtLndyaXRlU3RhcnRFbGVtZW50KCJ4aSIsICJpbmNsdWRlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEluY2x1ZGVGaWx0ZXIuWElOQ0xVREVfTkFNRVNQQUNFKTsKLSAgICAgICAgICBzdHJlYW0ud3JpdGVOYW1lc3BhY2UoInhpIiwgWEluY2x1ZGVGaWx0ZXIuWElOQ0xVREVfTkFNRVNQQUNFKTsKLSAgICAgICAgICBzdHJlYW0ud3JpdGVBdHRyaWJ1dGUoImhyZWYiLCBjb25maWdGaWxlLnRvVVJMKCkudG9FeHRlcm5hbEZvcm0oKSk7Ci0gICAgICAgICAgc3RyZWFtLndyaXRlQXR0cmlidXRlKCJ4cG9pbnRlciIsICIvZmFjZWxldC10YWdsaWIvKiIpOwotICAgICAgICAgIHN0cmVhbS53cml0ZUVuZEVsZW1lbnQoKTsKLSAgICAgICAgICBfd3JpdGVUYWdzKGNvbXBvbmVudHMsIHZhbGlkYXRvcnMsIGNvbnZlcnRlcnMsIHN0cmVhbSk7Ci0KLSAgICAgICAgICBfd3JpdGVFbmRUYWdMaWJyYXJ5KHN0cmVhbSk7Ci0gICAgICAgICAgc3RyZWFtLmNsb3NlKCk7Ci0KLSAgICAgICAgICBJbnB1dFN0cmVhbSBtZXJnZWRTdHJlYW0gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ob3V0LnRvQnl0ZUFycmF5KCkpOwotCi0gICAgICAgICAgLy8gZXhwYW5kIGFsbCB0aGUgeGk6aW5jbHVkZSBlbGVtZW50cwotICAgICAgICAgIFNBWFBhcnNlckZhY3Rvcnkgc2F4RmFjdG9yeSA9IFNBWFBhcnNlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgICBzYXhGYWN0b3J5LnNldE5hbWVzcGFjZUF3YXJlKHRydWUpOwotICAgICAgICAgIHNheEZhY3Rvcnkuc2V0VmFsaWRhdGluZyhmYWxzZSk7Ci0gICAgICAgICAgU0FYUGFyc2VyIHNheFBhcnNlciA9IHNheEZhY3RvcnkubmV3U0FYUGFyc2VyKCk7Ci0gICAgICAgICAgWE1MUmVhZGVyIG1lcmdlZFJlYWRlciA9IHNheFBhcnNlci5nZXRYTUxSZWFkZXIoKTsKLSAgICAgICAgICBtZXJnZWRSZWFkZXIgPSBuZXcgWEluY2x1ZGVGaWx0ZXIobWVyZ2VkUmVhZGVyLCBjb25maWdGaWxlLnRvVVJMKCkpOwotICAgICAgICAgIC8vIGV2ZW4gd2l0aCB2YWxpZGF0aW5nPWZhbHNlLCBEVEQgaXMgc3RpbGwgZG93bmxvYWRlZCBzbyB0aGF0Ci0gICAgICAgICAgLy8gYW55IGVudGl0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZG9jdW1lbnQgY2FuIGJlIGV4cGFuZGVkLgotICAgICAgICAgIC8vIHRoZSBmb2xsb3dpbmcgZGlzYWJsZXMgdGhhdCBiZWhhdmlvciwgYWxzbyBzYXZpbmcgdGhlIHRpbWUKLSAgICAgICAgICAvLyBzcGVudCB0byBwYXJzZSB0aGUgRFRECi0gICAgICAgICAgbWVyZ2VkUmVhZGVyLnNldEVudGl0eVJlc29sdmVyKG5ldyBFbnRpdHlSZXNvbHZlcigpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHB1YmxpYyBJbnB1dFNvdXJjZSByZXNvbHZlRW50aXR5KAotICAgICAgICAgICAgICAgIFN0cmluZyBwdWJsaWNJZCwKLSAgICAgICAgICAgICAgICBTdHJpbmcgc3lzdGVtSWQpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IElucHV0U291cmNlKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShuZXcgYnl0ZVswXSkpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICAgICAgICBJbnB1dFNvdXJjZSBtZXJnZWRJbnB1dCA9IG5ldyBJbnB1dFNvdXJjZShtZXJnZWRTdHJlYW0pOwotICAgICAgICAgIFNvdXJjZSBtZXJnZWRTb3VyY2UgPSBuZXcgU0FYU291cmNlKG1lcmdlZFJlYWRlciwgbWVyZ2VkSW5wdXQpOwotCi0gICAgICAgICAgdGFyZ2V0RmlsZS5kZWxldGUoKTsKLSAgICAgICAgICB0YXJnZXRGaWxlLmdldFBhcmVudEZpbGUoKS5ta2RpcnMoKTsKLSAgICAgICAgICBSZXN1bHQgbWVyZ2VkUmVzdWx0ID0gbmV3IFN0cmVhbVJlc3VsdCh0YXJnZXRGaWxlKTsKLQotICAgICAgICAgIFRyYW5zZm9ybWVyRmFjdG9yeSB0cmFuc0ZhY3RvcnkgPSBUcmFuc2Zvcm1lckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgICBUcmFuc2Zvcm1lciBpZGVudGl0eSA9IHRyYW5zRmFjdG9yeS5uZXdUcmFuc2Zvcm1lcigpOwotICAgICAgICAgIGlkZW50aXR5LnNldE91dHB1dFByb3BlcnR5KE91dHB1dEtleXMuRE9DVFlQRV9QVUJMSUMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0ZBQ0VMRVRTX1RBR19MSUJSQVJZX0RPQ1RZUEVfUFVCTElDKTsKLSAgICAgICAgICBpZGVudGl0eS5zZXRPdXRwdXRQcm9wZXJ0eShPdXRwdXRLZXlzLkRPQ1RZUEVfU1lTVEVNLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9GQUNFTEVUU19UQUdfTElCUkFSWV9ET0NUWVBFX1NZU1RFTSk7Ci0gICAgICAgICAgaWRlbnRpdHkudHJhbnNmb3JtKG1lcmdlZFNvdXJjZSwgbWVyZ2VkUmVzdWx0KTsKLQotICAgICAgICAgIHRhcmdldEZpbGUuc2V0UmVhZE9ubHkoKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChjb21wb25lbnRzLmhhc05leHQoKXx8dmFsaWRhdG9ycy5oYXNOZXh0KCl8fGNvbnZlcnRlcnMuaGFzTmV4dCgpKQotICAgICAgICB7Ci0gICAgICAgICAgdGFyZ2V0RmlsZS5nZXRQYXJlbnRGaWxlKCkubWtkaXJzKCk7Ci0gICAgICAgICAgT3V0cHV0U3RyZWFtIG91dCA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKHRhcmdldEZpbGUpOwotICAgICAgICAgIFhNTE91dHB1dEZhY3Rvcnkgb3V0cHV0RmFjdG9yeSA9IFhNTE91dHB1dEZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgICBYTUxTdHJlYW1Xcml0ZXIgc3RyZWFtID0gb3V0cHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1Xcml0ZXIob3V0KTsKLQotICAgICAgICAgIF93cml0ZVN0YXJ0VGFnTGlicmFyeShzdHJlYW0sIF9GQUNFTEVUU19UQUdfTElCUkFSWV9EVEQpOwotICAgICAgICAgIHN0cmVhbS53cml0ZUNoYXJhY3RlcnMoIlxuICAiKTsKLSAgICAgICAgICBzdHJlYW0ud3JpdGVTdGFydEVsZW1lbnQoIm5hbWVzcGFjZSIpOwotICAgICAgICAgIHN0cmVhbS53cml0ZUNoYXJhY3RlcnMobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICBzdHJlYW0ud3JpdGVFbmRFbGVtZW50KCk7Ci0KLSAgICAgICAgICBfd3JpdGVUYWdzKGNvbXBvbmVudHMsIHZhbGlkYXRvcnMsIGNvbnZlcnRlcnMsIHN0cmVhbSk7Ci0gICAgICAgICAgX3dyaXRlRW5kVGFnTGlicmFyeShzdHJlYW0pOwotICAgICAgICAgIHN0cmVhbS5jbG9zZSgpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKGNvbmZpZ0ZpbGUuZXhpc3RzKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBjb3B5IGlmIG5ld2VyCi0gICAgICAgICAgaWYgKGNvbmZpZ0ZpbGUubGFzdE1vZGlmaWVkKCkgPiB0YXJnZXRGaWxlLmxhc3RNb2RpZmllZCgpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHRhcmdldEZpbGUuZGVsZXRlKCk7Ci0gICAgICAgICAgICB0YXJnZXRGaWxlLmdldFBhcmVudEZpbGUoKS5ta2RpcnMoKTsKLSAgICAgICAgICAgIEZpbGVVdGlscy5jb3B5RmlsZShjb25maWdGaWxlLCB0YXJnZXRGaWxlKTsKLSAgICAgICAgICAgIHRhcmdldEZpbGUuc2V0UmVhZE9ubHkoKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBnZXRMb2coKS5pbmZvKCJHZW5lcmF0ZWQgIiArIHRhcmdldFBhdGgpOwotICAgICAgfQotICAgIH0KLSAgICBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgdGhyb3cgbmV3IE1vam9FeGVjdXRpb25FeGNlcHRpb24oIkVycm9yIGR1cmluZyBnZW5lcmF0aW9uIiwgZSk7Ci0gICAgfQotICAgIGNhdGNoIChTQVhFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbigiRXJyb3IgZHVyaW5nIGdlbmVyYXRpb24iLCBlKTsKLSAgICB9Ci0gICAgY2F0Y2ggKFRyYW5zZm9ybWVyRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgdGhyb3cgbmV3IE1vam9FeGVjdXRpb25FeGNlcHRpb24oIkVycm9yIGR1cmluZyBnZW5lcmF0aW9uIiwgZSk7Ci0gICAgfQotICAgIGNhdGNoIChQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgdGhyb3cgbmV3IE1vam9FeGVjdXRpb25FeGNlcHRpb24oIkVycm9yIGR1cmluZyBnZW5lcmF0aW9uIiwgZSk7Ci0gICAgfQotICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uKCJFcnJvciBkdXJpbmcgZ2VuZXJhdGlvbiIsIGUpOwotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgdm9pZCBfd3JpdGVUYWdzKEl0ZXJhdG9yIGNvbXBvbmVudHMsIEl0ZXJhdG9yIHZhbGlkYXRvcnMsCi0gICAgICAgICAgSXRlcmF0b3IgY29udmVydGVycywgWE1MU3RyZWFtV3JpdGVyIHN0cmVhbSkKLSAgICAgIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24KLSAgewotICAgIHdoaWxlIChjb21wb25lbnRzLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBDb21wb25lbnRCZWFuIGNvbXBvbmVudCA9IChDb21wb25lbnRCZWFuKWNvbXBvbmVudHMubmV4dCgpOwotICAgICAgX3dyaXRlVGFnKHN0cmVhbSwgY29tcG9uZW50KTsKLSAgICB9Ci0gICAgd2hpbGUgKHZhbGlkYXRvcnMuaGFzTmV4dCgpKQotICAgIHsKLSAgICAgIF93cml0ZVZhbGlkYXRvclRhZyhzdHJlYW0sIChWYWxpZGF0b3JCZWFuKSB2YWxpZGF0b3JzLm5leHQoKSk7Ci0gICAgfQotICAgIHdoaWxlIChjb252ZXJ0ZXJzLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBfd3JpdGVDb252ZXJ0ZXJUYWcoc3RyZWFtLCAoQ29udmVydGVyQmVhbikgY29udmVydGVycy5uZXh0KCkpOwotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgdm9pZCBfd3JpdGVTdGFydFRhZ0xpYnJhcnkoCi0gICAgWE1MU3RyZWFtV3JpdGVyIHN0cmVhbSwKLSAgICBTdHJpbmcgICAgICAgICAgZHRkKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uCi0gIHsKLSAgICBzdHJlYW0ud3JpdGVTdGFydERvY3VtZW50KCIxLjAiKTsKLSAgICBzdHJlYW0ud3JpdGVDaGFyYWN0ZXJzKCJcbiIpOwotICAgIHN0cmVhbS53cml0ZURURChkdGQpOwotICAgIHN0cmVhbS53cml0ZUNoYXJhY3RlcnMoIlxuIik7Ci0gICAgc3RyZWFtLndyaXRlU3RhcnRFbGVtZW50KCJmYWNlbGV0LXRhZ2xpYiIpOwotICAgIHN0cmVhbS53cml0ZURlZmF1bHROYW1lc3BhY2UoX0ZBQ0VMRVRTX05BTUVTUEFDRV9VUkkpOwotICAgIHN0cmVhbS53cml0ZUNoYXJhY3RlcnMoIlxuICAiKTsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBfd3JpdGVFbmRUYWdMaWJyYXJ5KAotICAgIFhNTFN0cmVhbVdyaXRlciBzdHJlYW0pIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24KLSAgewotCi0gICAgc3RyZWFtLndyaXRlQ2hhcmFjdGVycygiXG4iKTsKLSAgICBzdHJlYW0ud3JpdGVFbmRFbGVtZW50KCk7Ci0gICAgc3RyZWFtLndyaXRlRW5kRG9jdW1lbnQoKTsKLSAgfQotCi0gIC8qKgotICAgKiBHZW5lcmF0ZXMgdGFnIGxpYnJhcnkgZGVzY3JpcHRvciBmb3IgcGFyc2VkIGNvbXBvbmVudCBtZXRhZGF0YS4KLSAgICovCi0gIHByaXZhdGUgdm9pZCBfd3JpdGVUYWcoCi0gICAgWE1MU3RyZWFtV3JpdGVyIHN0cmVhbSwKLSAgICBDb21wb25lbnRCZWFuICAgY29tcG9uZW50KSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uCi0gIHsKLSAgICBzdHJlYW0ud3JpdGVDaGFyYWN0ZXJzKCJcbiAgIik7Ci0gICAgc3RyZWFtLndyaXRlU3RhcnRFbGVtZW50KCJ0YWciKTsKLSAgICBzdHJlYW0ud3JpdGVDaGFyYWN0ZXJzKCJcbiAgICAiKTsKLSAgICBzdHJlYW0ud3JpdGVTdGFydEVsZW1lbnQoInRhZy1uYW1lIik7Ci0gICAgc3RyZWFtLndyaXRlQ2hhcmFjdGVycyhjb21wb25lbnQuZ2V0VGFnTmFtZSgpLmdldExvY2FsUGFydCgpKTsKLSAgICBzdHJlYW0ud3JpdGVFbmRFbGVtZW50KCk7Ci0gICAgc3RyZWFtLndyaXRlQ2hhcmFjdGVycygiXG4gICAgIik7Ci0gICAgc3RyZWFtLndyaXRlU3RhcnRFbGVtZW50KCJjb21wb25lbnQiKTsKLSAgICBzdHJlYW0ud3JpdGVDaGFyYWN0ZXJzKCJcbiAgICAgICIpOwotICAgIHN0cmVhbS53cml0ZVN0YXJ0RWxlbWVudCgiY29tcG9uZW50LXR5cGUiKTsKLSAgICBzdHJlYW0ud3JpdGVDaGFyYWN0ZXJzKGNvbXBvbmVudC5nZXRDb21wb25lbnRUeXBlKCkpOwotICAgIHN0cmVhbS53cml0ZUVuZEVsZW1lbnQoKTsKLSAgICAKLSAgICBpZiAoY29tcG9uZW50LmdldFJlbmRlcmVyVHlwZSgpICE9IG51bGwpCi0gICAgewotICAgICAgc3RyZWFtLndyaXRlQ2hhcmFjdGVycygiXG4gICAgICAiKTsKLSAgICAgIHN0cmVhbS53cml0ZVN0YXJ0RWxlbWVudCgicmVuZGVyZXItdHlwZSIpOwotICAgICAgc3RyZWFtLndyaXRlQ2hhcmFjdGVycyhjb21wb25lbnQuZ2V0UmVuZGVyZXJUeXBlKCkpOwotICAgICAgc3RyZWFtLndyaXRlRW5kRWxlbWVudCgpOwotICAgIH0KLSAgICAKLSAgICBTdHJpbmcgdGFnSGFuZGxlciA9IGNvbXBvbmVudC5nZXRUYWdIYW5kbGVyKCk7Ci0gICAgaWYgKHRhZ0hhbmRsZXIgPT0gbnVsbCkKLSAgICB7Ci0gICAgICB0YWdIYW5kbGVyID0gZmFjZWxldEhhbmRsZXJDbGFzczsKLSAgICB9Ci0gICAgaWYgKHRhZ0hhbmRsZXIgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBzdHJlYW0ud3JpdGVDaGFyYWN0ZXJzKCJcbiAgICAgICIpOwotICAgICAgc3RyZWFtLndyaXRlU3RhcnRFbGVtZW50KCJoYW5kbGVyLWNsYXNzIik7Ci0gICAgICBzdHJlYW0ud3JpdGVDaGFyYWN0ZXJzKHRhZ0hhbmRsZXIpOwotICAgICAgc3RyZWFtLndyaXRlRW5kRWxlbWVudCgpOwotICAgIH0KLQotICAgIHN0cmVhbS53cml0ZUNoYXJhY3RlcnMoIlxuICAgICIpOwotICAgIHN0cmVhbS53cml0ZUVuZEVsZW1lbnQoKTsKLSAgICBzdHJlYW0ud3JpdGVDaGFyYWN0ZXJzKCJcbiAgIik7Ci0gICAgc3RyZWFtLndyaXRlRW5kRWxlbWVudCgpOwotICB9Ci0KLSAgLyoqCi0gICAqIEdlbmVyYXRlcyB0YWcgbGlicmFyeSBkZXNjcmlwdG9yIGZvciBwYXJzZWQgdmFsaWRhdG9yIG1ldGFkYXRhLgotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIF93cml0ZVZhbGlkYXRvclRhZygKLSAgICBYTUxTdHJlYW1Xcml0ZXIgc3RyZWFtLAotICAgIFZhbGlkYXRvckJlYW4gICB2YWxpZGF0b3IpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24KLSAgewotICAgIHN0cmVhbS53cml0ZUNoYXJhY3RlcnMoIlxuICAiKTsKLSAgICBzdHJlYW0ud3JpdGVTdGFydEVsZW1lbnQoInRhZyIpOwotICAgIHN0cmVhbS53cml0ZUNoYXJhY3RlcnMoIlxuICAgICIpOwotICAgIHN0cmVhbS53cml0ZVN0YXJ0RWxlbWVudCgidGFnLW5hbWUiKTsKLSAgICBzdHJlYW0ud3JpdGVDaGFyYWN0ZXJzKHZhbGlkYXRvci5nZXRUYWdOYW1lKCkuZ2V0TG9jYWxQYXJ0KCkpOwotICAgIHN0cmVhbS53cml0ZUVuZEVsZW1lbnQoKTsKLSAgICBzdHJlYW0ud3JpdGVDaGFyYWN0ZXJzKCJcbiAgICAiKTsKLSAgICBzdHJlYW0ud3JpdGVTdGFydEVsZW1lbnQoInZhbGlkYXRvciIpOwotICAgIHN0cmVhbS53cml0ZUNoYXJhY3RlcnMoIlxuICAgICAgIik7Ci0gICAgc3RyZWFtLndyaXRlU3RhcnRFbGVtZW50KCJ2YWxpZGF0b3ItaWQiKTsKLSAgICBzdHJlYW0ud3JpdGVDaGFyYWN0ZXJzKHZhbGlkYXRvci5nZXRWYWxpZGF0b3JJZCgpKTsKLSAgICBzdHJlYW0ud3JpdGVFbmRFbGVtZW50KCk7Ci0KLSAgICBzdHJlYW0ud3JpdGVDaGFyYWN0ZXJzKCJcbiAgICAiKTsKLSAgICBzdHJlYW0ud3JpdGVFbmRFbGVtZW50KCk7Ci0gICAgc3RyZWFtLndyaXRlQ2hhcmFjdGVycygiXG4gICIpOwotICAgIHN0cmVhbS53cml0ZUVuZEVsZW1lbnQoKTsKLSAgfQotCi0gIC8qKgotICAgKiBHZW5lcmF0ZXMgdGFnIGxpYnJhcnkgZGVzY3JpcHRvciBmb3IgcGFyc2VkIGNvbnZlcnRlciBtZXRhZGF0YS4KLSAgICovCi0gIHByaXZhdGUgdm9pZCBfd3JpdGVDb252ZXJ0ZXJUYWcoCi0gICAgWE1MU3RyZWFtV3JpdGVyIHN0cmVhbSwKLSAgICBDb252ZXJ0ZXJCZWFuICAgY29udmVydGVyKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uCi0gIHsKLSAgICBzdHJlYW0ud3JpdGVDaGFyYWN0ZXJzKCJcbiAgIik7Ci0gICAgc3RyZWFtLndyaXRlU3RhcnRFbGVtZW50KCJ0YWciKTsKLSAgICBzdHJlYW0ud3JpdGVDaGFyYWN0ZXJzKCJcbiAgICAiKTsKLSAgICBzdHJlYW0ud3JpdGVTdGFydEVsZW1lbnQoInRhZy1uYW1lIik7Ci0gICAgc3RyZWFtLndyaXRlQ2hhcmFjdGVycyhjb252ZXJ0ZXIuZ2V0VGFnTmFtZSgpLmdldExvY2FsUGFydCgpKTsKLSAgICBzdHJlYW0ud3JpdGVFbmRFbGVtZW50KCk7Ci0gICAgc3RyZWFtLndyaXRlQ2hhcmFjdGVycygiXG4gICAgIik7Ci0gICAgc3RyZWFtLndyaXRlU3RhcnRFbGVtZW50KCJjb252ZXJ0ZXIiKTsKLSAgICBzdHJlYW0ud3JpdGVDaGFyYWN0ZXJzKCJcbiAgICAgICIpOwotICAgIHN0cmVhbS53cml0ZVN0YXJ0RWxlbWVudCgiY29udmVydGVyLWlkIik7Ci0gICAgc3RyZWFtLndyaXRlQ2hhcmFjdGVycyhjb252ZXJ0ZXIuZ2V0Q29udmVydGVySWQoKSk7Ci0gICAgc3RyZWFtLndyaXRlRW5kRWxlbWVudCgpOwotCi0gICAgc3RyZWFtLndyaXRlQ2hhcmFjdGVycygiXG4gICAgIik7Ci0gICAgc3RyZWFtLndyaXRlRW5kRWxlbWVudCgpOwotICAgIHN0cmVhbS53cml0ZUNoYXJhY3RlcnMoIlxuICAiKTsKLSAgICBzdHJlYW0ud3JpdGVFbmRFbGVtZW50KCk7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBAcGFyYW1ldGVyIGV4cHJlc3Npb249IiR7cHJvamVjdH0iCi0gICAqIEByZXF1aXJlZAotICAgKiBAcmVhZG9ubHkKLSAgICovCi0gIHByaXZhdGUgTWF2ZW5Qcm9qZWN0IHByb2plY3Q7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbWV0ZXIgZXhwcmVzc2lvbj0iTUVUQS1JTkYvbWF2ZW4tZmFjZXMtcGx1Z2luL2ZhY2VzLWNvbmZpZy54bWwiCi0gICAqIEByZXF1aXJlZAotICAgKiBAcmVhZG9ubHkKLSAgICovCi0gIHByaXZhdGUgU3RyaW5nIHJlc291cmNlUGF0aDsKLQotICAvKioKLSAgICogQHBhcmFtZXRlcgotICAgKiBAcmVxdWlyZWQKLSAgICovCi0gIHByaXZhdGUgTWFwIHRhZ2xpYnM7Ci0KLQotICAvKioKLSAgICpAcGFyYW1ldGVyCi0gICAqLwotICBwcml2YXRlIFN0cmluZyBmYWNlbGV0SGFuZGxlckNsYXNzOwotCi0gIC8qKgotICAgKiBAcGFyYW1ldGVyIGV4cHJlc3Npb249InNyYy9tYWluL2NvbmYiCi0gICAqIEByZXF1aXJlZAotICAgKi8KLSAgcHJpdmF0ZSBGaWxlIGNvbmZpZ1NvdXJjZURpcmVjdG9yeTsKLQotICAvKioKLSAgICogQHBhcmFtZXRlciBleHByZXNzaW9uPSIke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9tYXZlbi1mYWNlcy1wbHVnaW4vbWFpbi9yZXNvdXJjZXMiCi0gICAqIEByZXF1aXJlZAotICAgKi8KLSAgcHJpdmF0ZSBGaWxlIGdlbmVyYXRlZFJlc291cmNlc0RpcmVjdG9yeTsKLQotICAvKioKLSAgICogQHBhcmFtZXRlcgotICAgKi8KLSAgcHJpdmF0ZSBib29sZWFuIGZvcmNlOwotCi0gIHN0YXRpYyBwcml2YXRlIGZpbmFsIFN0cmluZyBfRkFDRUxFVFNfTkFNRVNQQUNFX1VSSSA9Ci0gICAgICAgICAgICAgICJodHRwOi8vamF2YS5zdW4uY29tL0pTRi9GYWNlbGV0IjsKLQotICBzdGF0aWMgZmluYWwgcHJpdmF0ZSBTdHJpbmcgX0ZBQ0VMRVRTX1RBR19MSUJSQVJZX0RPQ1RZUEVfUFVCTElDID0KLSAgICAgICAgICAgICAgIi0vL1N1biBNaWNyb3N5c3RlbXMsIEluYy4vL0RURCBGYWNlbGV0IFRhZ2xpYiAxLjAvL0VOIjsKLQotICBzdGF0aWMgZmluYWwgcHJpdmF0ZSBTdHJpbmcgX0ZBQ0VMRVRTX1RBR19MSUJSQVJZX0RPQ1RZUEVfU1lTVEVNID0KLSAgICAgICAgICAgICAgImh0dHA6Ly9qYXZhLnN1bi5jb20vZHRkL2ZhY2VsZXQtdGFnbGliXzFfMC5kdGQiOwotCi0gIHN0YXRpYyBmaW5hbCBwcml2YXRlIFN0cmluZyBfRkFDRUxFVFNfVEFHX0xJQlJBUllfRFREID0KLSAgICAiPCFET0NUWVBFIGZhY2VsZXQtdGFnbGliIFBVQkxJQyBcbiIgKwotICAgICIgIFwiIiArIF9GQUNFTEVUU19UQUdfTElCUkFSWV9ET0NUWVBFX1BVQkxJQyArICJcIlxuIiArCi0gICAgIiAgXCIiICsgX0ZBQ0VMRVRTX1RBR19MSUJSQVJZX0RPQ1RZUEVfU1lTVEVNICsgIlwiID5cbiI7Ci0KLSAgc3RhdGljIGZpbmFsIHByaXZhdGUgU3RyaW5nIF9YSU5DTFVERV9GQUNFTEVUU19UQUdfTElCUkFSWV9EVEQgPQotICAgICI8IURPQ1RZUEUgdGFnbGliIFBVQkxJQ1xuIiArCi0gICAgIiAgXCIiICsgX0ZBQ0VMRVRTX1RBR19MSUJSQVJZX0RPQ1RZUEVfUFVCTElDICsgIlwiXG4iICsKLSAgICAiICBcIiIgKyBfRkFDRUxFVFNfVEFHX0xJQlJBUllfRE9DVFlQRV9TWVNURU0gKyAiXCIgW1xuIiArCi0gICAgIiAgICAgIDwhRUxFTUVOVCB4aTppbmNsdWRlIEVNUFRZPlxuIiArCi0gICAgIiAgICAgIDwhQVRUTElTVCB4aTppbmNsdWRlXG4iICsKLSAgICAiICAgICAgICAgIHhtbG5zOnhpIENEQVRBICNGSVhFRCAgXCIiICsgWEluY2x1ZGVGaWx0ZXIuWElOQ0xVREVfTkFNRVNQQUNFICsgIlwiXG4iICsKLSAgICAiICAgICAgICAgIGhyZWYgICAgIENEQVRBICNJTVBMSUVEXG4iICsKLSAgICAiICAgICAgICAgIHhwb2ludGVyIENEQVRBICNJTVBMSUVEPlxuIiArCi0gICAgIl0+XG4iOwotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL0dlbmVyYXRlRmFjZXNDb25maWdNb2pvLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvR2VuZXJhdGVGYWNlc0NvbmZpZ01vam8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGYyMjQyMC4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvR2VuZXJhdGVGYWNlc0NvbmZpZ01vam8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwNiArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5Nb2pvRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucHJvamVjdC5NYXZlblByb2plY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy51dGlsLlhJbmNsdWRlRmlsdGVyOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnhtbC5zYXguRW50aXR5UmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotaW1wb3J0IG9yZy54bWwuc2F4LlhNTFJlYWRlcjsKLQotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLio7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS4qOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uZG9tLkRPTVNvdXJjZTsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnNheC5TQVhTb3VyY2U7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uU3RyZWFtUmVzdWx0OwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc3RyZWFtLlN0cmVhbVNvdXJjZTsKLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBAdmVyc2lvbiAkSWQkCi0gKiBAcmVxdWlyZXNEZXBlbmRlbmN5UmVzb2x1dGlvbiBjb21waWxlCi0gKiBAZ29hbCBnZW5lcmF0ZS1mYWNlcy1jb25maWcKLSAqIEBwaGFzZSBnZW5lcmF0ZS1yZXNvdXJjZXMKLSAqLwotcHVibGljIGNsYXNzIEdlbmVyYXRlRmFjZXNDb25maWdNb2pvIGV4dGVuZHMgQWJzdHJhY3RGYWNlc01vam8KLXsKLSAgLyoqCi0gICAqIEV4ZWN1dGUgdGhlIE1vam8uCi0gICAqLwotICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIE1vam9FeGVjdXRpb25FeGNlcHRpb24KLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIC8vIGFsd2F5cyBhZGQgcmVzb3VyY2VzIGRpcmVjdG9yeSB0byBwcm9qZWN0IHJlc291cmNlIHJvb3QKLSAgICAgIGFkZFJlc291cmNlUm9vdChwcm9qZWN0LCB0YXJnZXREaXJlY3RvcnkuZ2V0Q2Fub25pY2FsUGF0aCgpKTsKLQotICAgICAgRmlsZSB0YXJnZXRGaWxlID0gbmV3IEZpbGUodGFyZ2V0RGlyZWN0b3J5LCB0YXJnZXRQYXRoKTsKLQotICAgICAgVVJMW10gaW5kZXggPSByZWFkSW5kZXgocHJvamVjdCk7Ci0KLSAgICAgIGlmICghZm9yY2UgJiYgIWlzTW9kaWZpZWRTaW5jZShpbmRleCwgdGFyZ2V0RmlsZS5sYXN0TW9kaWZpZWQoKSkpCi0gICAgICB7Ci0gICAgICAgIGdldExvZygpLmluZm8oIk5vdGhpbmcgdG8gZ2VuZXJhdGUgLSAiICsgdGFyZ2V0UGF0aCArICIgaXMgdXAgdG8gZGF0ZSIpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBMaXN0IGNvbmZpZ1VSTHMgPSBnZXRNYXN0ZXJDb25maWdzKHByb2plY3QpOwotCi0gICAgICAgIEZpbGUgY29uZmlnRmlsZSA9IG5ldyBGaWxlKGNvbmZpZ0RpcmVjdG9yeSwgY29uZmlnUGF0aCk7Ci0gICAgICAgIGlmIChjb25maWdGaWxlLmV4aXN0cygpKQotICAgICAgICB7Ci0gICAgICAgICAgY29uZmlnVVJMcyA9IG5ldyBMaW5rZWRMaXN0KGNvbmZpZ1VSTHMpOwotICAgICAgICAgIC8vIGJhc2UgY29uZmlnIGdvZXMgZmlyc3QKLSAgICAgICAgICBjb25maWdVUkxzLmFkZCgwLCBjb25maWdGaWxlLnRvVVJMKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFjb25maWdVUkxzLmlzRW1wdHkoKSkKLSAgICAgICAgewotICAgICAgICAgIFVSTCBiYXNlVVJMID0gR2VuZXJhdGVGYWNlc0NvbmZpZ01vam8uY2xhc3MuZ2V0UmVzb3VyY2UoInJlc291cmNlcy9mYWNlcy1jb25maWcueG1sIik7Ci0gICAgICAgICAgRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBkb2NGYWN0b3J5ID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgICAgIERvY3VtZW50QnVpbGRlciBkb2NCdWlsZGVyID0gZG9jRmFjdG9yeS5uZXdEb2N1bWVudEJ1aWxkZXIoKTsKLSAgICAgICAgICBEb2N1bWVudCBkb2N1bWVudCA9IGRvY0J1aWxkZXIucGFyc2UoYmFzZVVSTC5vcGVuU3RyZWFtKCkpOwotICAgICAgICAgIEVsZW1lbnQgcm9vdCA9IGRvY3VtZW50LmdldERvY3VtZW50RWxlbWVudCgpOwotCi0gICAgICAgICAgLy8gZW1iZWQgZWFjaCA8eGk6aW5jbHVkZT4gZWxlbWVudAotICAgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGNvbmZpZ1VSTHMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBVUkwgdXJsID0gKFVSTClpLm5leHQoKTsKLSAgICAgICAgICAgIEVsZW1lbnQgaW5jbHVkZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YSW5jbHVkZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInhpOmluY2x1ZGUiKTsKLSAgICAgICAgICAgIGluY2x1ZGUuc2V0QXR0cmlidXRlKCJocmVmIiwgdXJsLnRvRXh0ZXJuYWxGb3JtKCkpOwotICAgICAgICAgICAgaW5jbHVkZS5zZXRBdHRyaWJ1dGUoInhwb2ludGVyIiwgIi9mYWNlcy1jb25maWcvKiIpOwotICAgICAgICAgICAgcm9vdC5pbnNlcnRCZWZvcmUoaW5jbHVkZSwgcm9vdC5nZXRGaXJzdENoaWxkKCkpOwotICAgICAgICAgIH0KLQotICAgICAgICAgIC8vIE5vdGU6IHVzZSBhIGRpcmVjdCBET00tPlNBWCByZWFkZXIKLSAgICAgICAgICAvLyAgICAgICByYXRoZXIgdGhhbiB0cmFuc2Zvcm1pbmcgdG8gc3RyaW5nCi0gICAgICAgICAgVHJhbnNmb3JtZXJGYWN0b3J5IHRyYW5zRmFjdG9yeSA9IFRyYW5zZm9ybWVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgICAgIFRyYW5zZm9ybWVyIGlkZW50aXR5ID0gdHJhbnNGYWN0b3J5Lm5ld1RyYW5zZm9ybWVyKCk7Ci0gICAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG91dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLSAgICAgICAgICBpZGVudGl0eS50cmFuc2Zvcm0obmV3IERPTVNvdXJjZShkb2N1bWVudCksIG5ldyBTdHJlYW1SZXN1bHQob3V0KSk7Ci0KLSAgICAgICAgICBJbnB1dFN0cmVhbSBtZXJnZWRTdHJlYW0gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ob3V0LnRvQnl0ZUFycmF5KCkpOwotICAgICAgICAgIC8vIGV4cGFuZCBhbGwgdGhlIHhpOmluY2x1ZGUgZWxlbWVudHMKLSAgICAgICAgICBTQVhQYXJzZXJGYWN0b3J5IHNheEZhY3RvcnkgPSBTQVhQYXJzZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAgICAgc2F4RmFjdG9yeS5zZXROYW1lc3BhY2VBd2FyZSh0cnVlKTsKLSAgICAgICAgICBzYXhGYWN0b3J5LnNldFZhbGlkYXRpbmcoZmFsc2UpOwotICAgICAgICAgIFNBWFBhcnNlciBzYXhQYXJzZXIgPSBzYXhGYWN0b3J5Lm5ld1NBWFBhcnNlcigpOwotICAgICAgICAgIFhNTFJlYWRlciBtZXJnZWRSZWFkZXIgPSBzYXhQYXJzZXIuZ2V0WE1MUmVhZGVyKCk7Ci0gICAgICAgICAgbWVyZ2VkUmVhZGVyID0gbmV3IFhJbmNsdWRlRmlsdGVyKG1lcmdlZFJlYWRlciwgYmFzZVVSTCk7Ci0gICAgICAgICAgbWVyZ2VkUmVhZGVyLnNldEVudGl0eVJlc29sdmVyKG5ldyBFbnRpdHlSZXNvbHZlcigpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHB1YmxpYyBJbnB1dFNvdXJjZSByZXNvbHZlRW50aXR5KAotICAgICAgICAgICAgICAgIFN0cmluZyBwdWJsaWNJZCwKLSAgICAgICAgICAgICAgICBTdHJpbmcgc3lzdGVtSWQpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IElucHV0U291cmNlKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShuZXcgYnl0ZVswXSkpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICAgICAgICBJbnB1dFNvdXJjZSBtZXJnZWRJbnB1dCA9IG5ldyBJbnB1dFNvdXJjZShtZXJnZWRTdHJlYW0pOwotICAgICAgICAgIFNvdXJjZSBtZXJnZWRTb3VyY2UgPSBuZXcgU0FYU291cmNlKG1lcmdlZFJlYWRlciwgbWVyZ2VkSW5wdXQpOwotCi0gICAgICAgICAgLy8gVHJhbnNmb3JtIHRoZSBjb21iaW5lZCBmYWNlcy1jb25maWcueG1sIGZpbGUgdG8gcmVzb2x2ZQotICAgICAgICAgIC8vIGNvbXBvbmVudC1zdXBlcnR5cGUsIGluamVjdCB0aGUgRFREIGFuZCBlbnN1cmUgdGhhdAotICAgICAgICAgIC8vIG1ldGFkYXRhIGlzIHJlcHJlc2VudGVkIGNvbXBhdGlibHkgd2l0aCBKU0YgMS4xIHN5bnRheC4KLSAgICAgICAgICB0YXJnZXRGaWxlLmRlbGV0ZSgpOwotICAgICAgICAgIHRhcmdldEZpbGUuZ2V0UGFyZW50RmlsZSgpLm1rZGlycygpOwotCi0gICAgICAgICAgRmlsZSB0bXBGaWxlID0gbnVsbDsKLSAgICAgICAgICBPdXRwdXRTdHJlYW0gcmVzdWx0U3RyZWFtOwotICAgICAgICAgIGlmICh0cmFuc2Zvcm1TdHlsZXNoZWV0ICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgdG1wRmlsZSA9IEZpbGUuY3JlYXRlVGVtcEZpbGUoImdlbmVyYXRlLWZhY2VzLWNvbmZpZyIsIG51bGwpOwotICAgICAgICAgICAgcmVzdWx0U3RyZWFtID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0odG1wRmlsZSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UKLSAgICAgICAgICB7Ci0gICAgICAgICAgICByZXN1bHRTdHJlYW0gPSBuZXcgRmlsZU91dHB1dFN0cmVhbSh0YXJnZXRGaWxlKTsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBSZXN1bHQgbWVyZ2VkUmVzdWx0ID0gbmV3IFN0cmVhbVJlc3VsdChyZXN1bHRTdHJlYW0pOwotCi0gICAgICAgICAgVVJMIHhzbFVSTDsKLSAgICAgICAgICBpZiAoX2lzMTIoKSkKLSAgICAgICAgICAgIHhzbFVSTCA9IGdldENsYXNzKCkuZ2V0UmVzb3VyY2UoInJlc291cmNlcy90cmFuc2Zvcm0xMi54c2wiKTsKLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB4c2xVUkwgPSBnZXRDbGFzcygpLmdldFJlc291cmNlKCJyZXNvdXJjZXMvdHJhbnNmb3JtLnhzbCIpOwotCi0gICAgICAgICAgSW5wdXRTdHJlYW0geHNsID0geHNsVVJMLm9wZW5TdHJlYW0oKTsKLSAgICAgICAgICBTdHJlYW1Tb3VyY2UgeHNsU291cmNlID0gbmV3IFN0cmVhbVNvdXJjZSh4c2wpOwotICAgICAgICAgIFRyYW5zZm9ybWVyIHRyYW5zZm9ybWVyID0gdHJhbnNGYWN0b3J5Lm5ld1RyYW5zZm9ybWVyKHhzbFNvdXJjZSk7Ci0gICAgICAgICAgdHJhbnNmb3JtZXIuc2V0UGFyYW1ldGVyKCJwYWNrYWdlQ29udGFpbnMiLCBwYWNrYWdlQ29udGFpbnMpOwotICAgICAgICAgIHRyYW5zZm9ybWVyLnNldFBhcmFtZXRlcigidHlwZVByZWZpeCIsIHR5cGVQcmVmaXgpOwotICAgICAgICAgIHRyYW5zZm9ybWVyLnNldFBhcmFtZXRlcigicmVtb3ZlUmVuZGVyZXJzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlUmVuZGVyZXJzID8gInRydWUiIDogImZhbHNlIik7Ci0gICAgICAgICAgdHJhbnNmb3JtZXIuc2V0UGFyYW1ldGVyKCJjb252ZXJ0ZXJQYWNrYWdlQ29udGFpbnMiLCBnZXRQYXJhbWV0ZXIoY29udmVydGVyUGFja2FnZUNvbnRhaW5zLCBwYWNrYWdlQ29udGFpbnMpKTsKLSAgICAgICAgICB0cmFuc2Zvcm1lci5zZXRQYXJhbWV0ZXIoInZhbGlkYXRvclBhY2thZ2VDb250YWlucyIsIGdldFBhcmFtZXRlcih2YWxpZGF0b3JQYWNrYWdlQ29udGFpbnMsIHBhY2thZ2VDb250YWlucykpOwotCi0gICAgICAgICAgdHJhbnNmb3JtZXIudHJhbnNmb3JtKG1lcmdlZFNvdXJjZSwgbWVyZ2VkUmVzdWx0KTsKLSAgICAgICAgICByZXN1bHRTdHJlYW0uY2xvc2UoKTsKLQotICAgICAgICAgIC8vIE9LLCBpZiB0aGVyZSdzIGEgdHJhbnNmb3JtU3lsZXNoZWV0LCB3ZSd2ZSB3cml0dGVuCi0gICAgICAgICAgLy8gdGhlIG91dHB1dCB0byBhIHRlbXBvcmFyeSBmaWxlLCBub3cgdHJhbnNmb3JtIGl0IGFnYWluLgotICAgICAgICAgIC8vID0tPUZJWE1FIEFkYW1XaW5lcjogIG5vLCB0aGlzIGlzIG5vdCB0aGUgc21hcnRlc3QgYW5kCi0gICAgICAgICAgLy8gZmFzdGVzdCB3YXkgdG8gZG8gaXQuICBCdXQgYWZ0ZXIgZmluZGluZyBvdXQKLSAgICAgICAgICAvLyB0aGF0IFhNTEZpbHRlciBhcHBhcmVudGx5IGRvZXNuJ3Qgc3VwcG9ydCBYU0wgcGFyYW1ldGVycywKLSAgICAgICAgICAvLyBhbmQgcnVubmluZyBpbnRvIGEgYml6YXJyZSAiaWxsZWdhbCBwcm9jZXNzaW5nIGluc3RydWN0aW9uOgotICAgICAgICAgIC8vIHNheG9uOndhcm5pbmciIGVycm9yIG1lc3NhZ2Ugd2hlbiB1c2luZyBjaGFpbmVkIGhhbmRsZXJzLCBJIGdvdAotICAgICAgICAgIC8vIHRpcmVkIG9mIHRyeWluZyB0byBiZSBzbWFydC4gIFRoaXMgaXMgZ29vZCBlbm91Z2guCi0gICAgICAgICAgaWYgKHRyYW5zZm9ybVN0eWxlc2hlZXQgIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBTdHJlYW1Tb3VyY2UgdG1wU291cmNlID0gbmV3IFN0cmVhbVNvdXJjZSh0bXBGaWxlKTsKLSAgICAgICAgICAgIFN0cmVhbVNvdXJjZSB0cmFuc2Zvcm1Tb3VyY2UgPSBuZXcgU3RyZWFtU291cmNlKAotICAgICAgICAgICAgICAgIG5ldyBGaWxlKGNvbmZpZ0RpcmVjdG9yeSwgdHJhbnNmb3JtU3R5bGVzaGVldCkpOwotICAgICAgICAgICAgVHJhbnNmb3JtZXIgZmluYWxUcmFuc2Zvcm0gPQotICAgICAgICAgICAgICB0cmFuc0ZhY3RvcnkubmV3VHJhbnNmb3JtZXIodHJhbnNmb3JtU291cmNlKTsKLSAgICAgICAgICAgIEZpbGVPdXRwdXRTdHJlYW0gZmluYWxPdXQgPSBuZXcgRmlsZU91dHB1dFN0cmVhbSh0YXJnZXRGaWxlKTsKLSAgICAgICAgICAgIFJlc3VsdCBmaW5hbFJlc3VsdCA9Ci0gICAgICAgICAgICAgIG5ldyBTdHJlYW1SZXN1bHQoZmluYWxPdXQpOwotCi0gICAgICAgICAgICBmaW5hbFRyYW5zZm9ybS50cmFuc2Zvcm0odG1wU291cmNlLCBmaW5hbFJlc3VsdCk7Ci0gICAgICAgICAgICBmaW5hbE91dC5jbG9zZSgpOwotICAgICAgICAgICAgdG1wRmlsZS5kZWxldGUoKTsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICAKLSAgICAgICAgICB0YXJnZXRGaWxlLnNldFJlYWRPbmx5KCk7Ci0KLSAgICAgICAgICBnZXRMb2coKS5pbmZvKCJHZW5lcmF0ZWQgIiArIHRhcmdldFBhdGgpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIGNhdGNoIChTQVhFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbigiRXJyb3IgZHVyaW5nIGdlbmVyYXRpb24iLCBlKTsKLSAgICB9Ci0gICAgY2F0Y2ggKFRyYW5zZm9ybWVyRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgdGhyb3cgbmV3IE1vam9FeGVjdXRpb25FeGNlcHRpb24oIkVycm9yIGR1cmluZyBnZW5lcmF0aW9uIiwgZSk7Ci0gICAgfQotICAgIGNhdGNoIChQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgdGhyb3cgbmV3IE1vam9FeGVjdXRpb25FeGNlcHRpb24oIkVycm9yIGR1cmluZyBnZW5lcmF0aW9uIiwgZSk7Ci0gICAgfQotICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uKCJFcnJvciBkdXJpbmcgZ2VuZXJhdGlvbiIsIGUpOwotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgYm9vbGVhbiBfaXMxMigpCi0gIHsKLSAgICByZXR1cm4gIjEuMiIuZXF1YWxzKGpzZlZlcnNpb24pIHx8ICIxMiIuZXF1YWxzKGpzZlZlcnNpb24pOwotICB9Ci0KLSAgcHJpdmF0ZSBTdHJpbmcgZ2V0UGFyYW1ldGVyKFN0cmluZyBwYXJhbU5hbWUsIFN0cmluZyBkZWZhdWx0VmFsdWUpCi0gIHsKLSAgICBTdHJpbmcgcGFyYW07Ci0KLSAgICBpZiAocGFyYW1OYW1lLmxlbmd0aCgpID4gMCkKLSAgICB7Ci0gICAgICAgcGFyYW0gPSBwYXJhbU5hbWU7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHBhcmFtID0gZGVmYXVsdFZhbHVlOwotICAgIH0KLSAgICByZXR1cm4gcGFyYW07Ci0gIH0KLQotICAvKioKLSAgICogQHBhcmFtZXRlciBleHByZXNzaW9uPSIke3Byb2plY3R9IgotICAgKiBAcmVhZG9ubHkKLSAgICovCi0gIHByaXZhdGUgTWF2ZW5Qcm9qZWN0IHByb2plY3Q7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbWV0ZXIgZXhwcmVzc2lvbj0ic3JjL21haW4vY29uZiIKLSAgICogQHJlcXVpcmVkCi0gICAqLwotICBwcml2YXRlIEZpbGUgY29uZmlnRGlyZWN0b3J5OwotCi0gIC8qKgotICAgKiBAcGFyYW1ldGVyCi0gICAqLwotICBwcml2YXRlIFN0cmluZyBjb25maWdQYXRoID0gIk1FVEEtSU5GL2ZhY2VzLWNvbmZpZy1iYXNlLnhtbCI7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbWV0ZXIKLSAgICovCi0gIHByaXZhdGUgU3RyaW5nIHBhY2thZ2VDb250YWlucyA9ICIiOwotCi0gIC8qKgotICAgKiBAcGFyYW1ldGVyCi0gICAqLwotICBwcml2YXRlIFN0cmluZyBjb252ZXJ0ZXJQYWNrYWdlQ29udGFpbnMgPSAiIjsKLQotICAvKioKLSAgICogQHBhcmFtZXRlcgotICAgKi8KLSAgcHJpdmF0ZSBTdHJpbmcgdmFsaWRhdG9yUGFja2FnZUNvbnRhaW5zID0gIiI7Ci0KLQotICAvKioKLSAgICogQHBhcmFtZXRlciBleHByZXNzaW9uPSIke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9tYXZlbi1mYWNlcy1wbHVnaW4vbWFpbi9yZXNvdXJjZXMiCi0gICAqIEByZXF1aXJlZAotICAgKi8KLSAgcHJpdmF0ZSBGaWxlIHRhcmdldERpcmVjdG9yeTsKLQotICAvKioKLSAgICogQHBhcmFtZXRlcgotICAgKi8KLSAgcHJpdmF0ZSBTdHJpbmcgdGFyZ2V0UGF0aCA9ICJNRVRBLUlORi9mYWNlcy1jb25maWcueG1sIjsKLQotICAvKioKLSAgICogQHBhcmFtZXRlcgotICAgKi8KLSAgcHJpdmF0ZSBib29sZWFuIGZvcmNlOwotCi0gIC8qKgotICAgKiBAcGFyYW1ldGVyCi0gICAqLwotICBwcml2YXRlIFN0cmluZyB0eXBlUHJlZml4ID0gIiI7Ci0KLSAgLyoqCi0gICAqIE5hbWUgb2YgYW4gWFNMVCBzdHlsZXNoZWV0IGluIHNyYy9tYWluL2NvbmYgdGhhdCB3aWxsIGJlIGFwcGxpZWQKLSAgICogYXMgdGhlIGZpbmFsIHN0ZXAuICBUaGlzIGNhbiBiZSB1c2VkIHRvIGltcGxlbWVudCBhbnkgZmluYWwgZml4dXAKLSAgICogb2YgdGhlIG91dHB1dC4KLSAgICogQHBhcmFtZXRlcgotICAgKi8KLSAgcHJpdmF0ZSBTdHJpbmcgdHJhbnNmb3JtU3R5bGVzaGVldDsKLQotICAvKioKLSAgICogQHBhcmFtZXRlcgotICAgKi8KLSAgcHJpdmF0ZSBib29sZWFuIHJlbW92ZVJlbmRlcmVyczsKLQotICAvKioKLSAgICogQHBhcmFtZXRlcgotICAgKi8KLSAgcHJpdmF0ZSBTdHJpbmcganNmVmVyc2lvbjsKLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy9HZW5lcmF0ZUpzcFRhZ2xpYnNNb2pvLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvR2VuZXJhdGVKc3BUYWdsaWJzTW9qby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MTk0YjgyLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy9HZW5lcmF0ZUpzcFRhZ2xpYnNNb2pvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQ3ICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlczsKLQotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLk1vam9FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wcm9qZWN0Lk1hdmVuUHJvamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLmdlbmVyYXRvci50YWdsaWIuQWJzdHJhY3RDb252ZXJ0ZXJUYWdHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy5nZW5lcmF0b3IudGFnbGliLkFic3RyYWN0VmFsaWRhdG9yVGFnR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMuZ2VuZXJhdG9yLnRhZ2xpYi5Db21wb25lbnRUYWdHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy5nZW5lcmF0b3IudGFnbGliLk15RmFjZXNDb21wb25lbnRUYWdHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy5nZW5lcmF0b3IudGFnbGliLk15RmFjZXNDb252ZXJ0ZXJUYWdHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy5nZW5lcmF0b3IudGFnbGliLk15RmFjZXNWYWxpZGF0b3JUYWdHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy5nZW5lcmF0b3IudGFnbGliLlRhZ0F0dHJpYnV0ZUZpbHRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLmdlbmVyYXRvci50YWdsaWIuVHJpbmlkYWRDb21wb25lbnRUYWdHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy5nZW5lcmF0b3IudGFnbGliLlRyaW5pZGFkQ29udmVydGVyVGFnR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMuZ2VuZXJhdG9yLnRhZ2xpYi5UcmluaWRhZFZhbGlkYXRvclRhZ0dlbmVyYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLmlvLlByZXR0eVdyaXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLnBhcnNlLkNvbXBvbmVudEJlYW47Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy5wYXJzZS5Db252ZXJ0ZXJCZWFuOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMucGFyc2UuRmFjZXNDb25maWdCZWFuOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMucGFyc2UuTWV0aG9kU2lnbmF0dXJlQmVhbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLnBhcnNlLlByb3BlcnR5QmVhbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLnBhcnNlLlZhbGlkYXRvckJlYW47Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy51dGlsLkNvbXBvbmVudEZpbHRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLnV0aWwuQ29udmVydGVyRmlsdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMudXRpbC5GaWx0ZXJlZEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMudXRpbC5VdGlsOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMudXRpbC5WYWxpZGF0b3JGaWx0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy51dGlsLlhJbmNsdWRlRmlsdGVyOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMudXRpbC5GaWxlVXRpbHM7Ci1pbXBvcnQgb3JnLnhtbC5zYXguRW50aXR5UmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotaW1wb3J0IG9yZy54bWwuc2F4LlhNTFJlYWRlcjsKLQotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlNBWFBhcnNlckZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxPdXRwdXRGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uT3V0cHV0S2V5czsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlJlc3VsdDsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlNvdXJjZTsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJFeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zYXguU0FYU291cmNlOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc3RyZWFtLlN0cmVhbVJlc3VsdDsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllcjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi0vKioKLSAqIEB2ZXJzaW9uICRJZCQKLSAqIEByZXF1aXJlc0RlcGVuZGVuY3lSZXNvbHV0aW9uIGNvbXBpbGUKLSAqIEBnb2FsIGdlbmVyYXRlLWpzcC10YWdsaWJzCi0gKiBAcGhhc2UgZ2VuZXJhdGUtc291cmNlcwotICovCi1wdWJsaWMgY2xhc3MgR2VuZXJhdGVKc3BUYWdsaWJzTW9qbyBleHRlbmRzIEFic3RyYWN0RmFjZXNNb2pvCi17Ci0gIC8qKgotICAgKiBFeGVjdXRlIHRoZSBNb2pvLgotICAgKi8KLSAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBwcm9jZXNzSW5kZXgocHJvamVjdCwgcmVzb3VyY2VQYXRoKTsKLSAgICAgIF9nZW5lcmF0ZVRhZ0hhbmRsZXJzKCk7Ci0gICAgICBfZ2VuZXJhdGVUYWdMaWJyYXJ5RGVzY3JpcHRvcnMoKTsKLSAgICB9Ci0gICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgdGhyb3cgbmV3IE1vam9FeGVjdXRpb25FeGNlcHRpb24oIkVycm9yIGdlbmVyYXRpbmcgY29tcG9uZW50cyIsIGUpOwotICAgIH0KLSAgfQotCi0KLSAgLy8gaG9vayBmb3IgY3VzdG9tIGNvbXBvbmVudCB0YWcgamF2YSBjb250ZW50Ci0gIHByb3RlY3RlZCB2b2lkIHdyaXRlQ3VzdG9tQ29tcG9uZW50VGFnSGFuZGxlckNvbnRlbnQoCi0gICAgICBQcmV0dHlXcml0ZXIgIG91dCwKLSAgICAgIENvbXBvbmVudEJlYW4gY29tcG9uZW50KSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgewotICB9Ci0KLSAgLy8gaG9vayBmb3IgY3VzdG9tIGNvbXBvbmVudCB0YWcgamF2YSBpbXBvcnRzCi0gIHByb3RlY3RlZCB2b2lkIGFkZEN1c3RvbUNvbXBvbmVudFRhZ0hhbmRsZXJJbXBvcnRzKAotICAgICAgU2V0ICAgICAgICAgICBpbXBvcnRzLAotICAgICAgQ29tcG9uZW50QmVhbiBjb21wb25lbnQpCi0gIHsKLSAgfQotCi0gIC8vIGhvb2sgZm9yIGN1c3RvbSBjb21wb25lbnQgZGVzY3JpcHRvciBjb250ZW50Ci0gIHByb3RlY3RlZCB2b2lkIHdyaXRlQ3VzdG9tQ29tcG9uZW50VGFnRGVzY3JpcHRvckNvbnRlbnQoCi0gICAgICBYTUxTdHJlYW1Xcml0ZXIgIHN0cmVhbSwKLSAgICAgIENvbXBvbmVudEJlYW4gICAgY29tcG9uZW50KXRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24KLSAgewotICB9Ci0KLQotICAvKioKLSAgICogR2VuZXJhdGVzIHRhZyBsaWJyYXJ5IGRlc2NyaXB0b3JzIGZvciBwYXJzZWQgY29tcG9uZW50IG1ldGFkYXRhLgotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIF9nZW5lcmF0ZVRhZ0xpYnJhcnlEZXNjcmlwdG9ycygpIHRocm93cyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICAvLyBhbHdheXMgYWRkIHJlc291cmNlcyBkaXJlY3RvcnkgdG8gcHJvamVjdCByZXNvdXJjZSByb290Ci0gICAgICBhZGRSZXNvdXJjZVJvb3QocHJvamVjdCwgZ2VuZXJhdGVkUmVzb3VyY2VzRGlyZWN0b3J5LmdldENhbm9uaWNhbFBhdGgoKSk7Ci0KLSAgICAgIC8vIHRhZ2xpYnMgbWFwIHN5bnRheCByZXF1aXJlcyBkaXN0aW5jdCBzaG9ydE5hbWVzLAotICAgICAgLy8gd2hpY2ggaXMgYSBHb29kIFRoaW5nIQotICAgICAgZm9yIChJdGVyYXRvciBpID0gdGFnbGlicy5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgICB7Ci0gICAgICAgIE1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpaS5uZXh0KCk7Ci0gICAgICAgIFN0cmluZyBzaG9ydE5hbWUgPSAoU3RyaW5nKWVudHJ5LmdldEtleSgpOwotICAgICAgICBTdHJpbmcgbmFtZXNwYWNlVVJJID0gKFN0cmluZyllbnRyeS5nZXRWYWx1ZSgpOwotCi0gICAgICAgIEZhY2VzQ29uZmlnQmVhbiBmYWNlc0NvbmZpZyA9IGdldEZhY2VzQ29uZmlnKCk7Ci0gICAgICAgIEl0ZXJhdG9yIGNvbXBvbmVudHMgPSBmYWNlc0NvbmZpZy5jb21wb25lbnRzKCk7Ci0gICAgICAgIGNvbXBvbmVudHMgPSBuZXcgRmlsdGVyZWRJdGVyYXRvcihjb21wb25lbnRzLCBuZXcgU2tpcEZpbHRlcigpKTsKLSAgICAgICAgY29tcG9uZW50cyA9IG5ldyBGaWx0ZXJlZEl0ZXJhdG9yKGNvbXBvbmVudHMsIG5ldyBDb21wb25lbnRUYWdMaWJyYXJ5RmlsdGVyKG5hbWVzcGFjZVVSSSkpOwotCi0gICAgICAgIEl0ZXJhdG9yIHZhbGlkYXRvcnMgPSBmYWNlc0NvbmZpZy52YWxpZGF0b3JzKCk7Ci0gICAgICAgIHZhbGlkYXRvcnMgPSBuZXcgRmlsdGVyZWRJdGVyYXRvcih2YWxpZGF0b3JzLCBuZXcgVmFsaWRhdG9yVGFnTGlicmFyeUZpbHRlcihuYW1lc3BhY2VVUkkpKTsKLQotICAgICAgICBJdGVyYXRvciBjb252ZXJ0ZXJzID0gZmFjZXNDb25maWcuY29udmVydGVycygpOwotICAgICAgICBjb252ZXJ0ZXJzID0gbmV3IEZpbHRlcmVkSXRlcmF0b3IoY29udmVydGVycywgbmV3IENvbnZlcnRlclRhZ0xpYnJhcnlGaWx0ZXIobmFtZXNwYWNlVVJJKSk7Ci0KLSAgICAgICAgU3RyaW5nIHRhcmdldFBhdGggPSAiTUVUQS1JTkYvIiArIHNob3J0TmFtZSArICIudGxkIjsKLSAgICAgICAgRmlsZSB0YXJnZXRGaWxlID0gbmV3IEZpbGUoZ2VuZXJhdGVkUmVzb3VyY2VzRGlyZWN0b3J5LCB0YXJnZXRQYXRoKTsKLQotICAgICAgICBTdHJpbmcgY29uZmlnUGF0aCA9ICJNRVRBLUlORi8iICsgc2hvcnROYW1lICsgIi1iYXNlLnRsZCI7Ci0gICAgICAgIEZpbGUgY29uZmlnRmlsZSA9IG5ldyBGaWxlKGNvbmZpZ1NvdXJjZURpcmVjdG9yeSwgY29uZmlnUGF0aCk7Ci0KLSAgICAgICAgdGFyZ2V0RmlsZS5kZWxldGUoKTsKLQotICAgICAgICBib29sZWFuIGhhc0dlbmVyYXRlZFRhZ3MgPSAoY29tcG9uZW50cy5oYXNOZXh0KCkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZlcnRlcnMuaGFzTmV4dCgpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0b3JzLmhhc05leHQoKSk7Ci0KLSAgICAgICAgaWYgKGhhc0dlbmVyYXRlZFRhZ3MgJiYgY29uZmlnRmlsZS5leGlzdHMoKSkKLSAgICAgICAgewotICAgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0gICAgICAgICAgWE1MT3V0cHV0RmFjdG9yeSBvdXRwdXRGYWN0b3J5ID0gWE1MT3V0cHV0RmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgICAgIFhNTFN0cmVhbVdyaXRlciBzdHJlYW0gPSBvdXRwdXRGYWN0b3J5LmNyZWF0ZVhNTFN0cmVhbVdyaXRlcihvdXQpOwotCi0gICAgICAgICAgX3dyaXRlU3RhcnRUYWdMaWJyYXJ5KHN0cmVhbSwgX1hJTkNMVURFX0pTUF9UQUdfTElCUkFSWV9EVEQpOwotICAgICAgICAgIC8vIGJhc2UgZ29lcyBmaXJzdAotICAgICAgICAgIHN0cmVhbS53cml0ZVN0YXJ0RWxlbWVudCgieGkiLCAiaW5jbHVkZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhJbmNsdWRlRmlsdGVyLlhJTkNMVURFX05BTUVTUEFDRSk7Ci0gICAgICAgICAgc3RyZWFtLndyaXRlTmFtZXNwYWNlKCJ4aSIsIFhJbmNsdWRlRmlsdGVyLlhJTkNMVURFX05BTUVTUEFDRSk7Ci0gICAgICAgICAgc3RyZWFtLndyaXRlQXR0cmlidXRlKCJocmVmIiwgY29uZmlnRmlsZS50b1VSTCgpLnRvRXh0ZXJuYWxGb3JtKCkpOwotICAgICAgICAgIHN0cmVhbS53cml0ZUF0dHJpYnV0ZSgieHBvaW50ZXIiLCAiL3RhZ2xpYi8qIik7Ci0gICAgICAgICAgc3RyZWFtLndyaXRlRW5kRWxlbWVudCgpOwotICAgICAgICAgIHdoaWxlIChjb21wb25lbnRzLmhhc05leHQoKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBDb21wb25lbnRCZWFuIGNvbXBvbmVudCA9IChDb21wb25lbnRCZWFuKWNvbXBvbmVudHMubmV4dCgpOwotICAgICAgICAgICAgX3dyaXRlVGFnKHN0cmVhbSwgY29tcG9uZW50KTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgd2hpbGUgKGNvbnZlcnRlcnMuaGFzTmV4dCgpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIENvbnZlcnRlckJlYW4gY29udmVydGVyID0gKENvbnZlcnRlckJlYW4pY29udmVydGVycy5uZXh0KCk7Ci0gICAgICAgICAgICBfd3JpdGVUYWcoc3RyZWFtLCBjb252ZXJ0ZXIpOwotICAgICAgICAgIH0KLSAgICAgICAgICB3aGlsZSAodmFsaWRhdG9ycy5oYXNOZXh0KCkpCi0gICAgICAgICAgewotICAgICAgICAgICAgVmFsaWRhdG9yQmVhbiB2YWxpZGF0b3IgPSAoVmFsaWRhdG9yQmVhbil2YWxpZGF0b3JzLm5leHQoKTsKLSAgICAgICAgICAgIF93cml0ZVRhZyhzdHJlYW0sIHZhbGlkYXRvcik7Ci0gICAgICAgICAgfQotICAgICAgICAgIF93cml0ZUVuZFRhZ0xpYnJhcnkoc3RyZWFtKTsKLSAgICAgICAgICBzdHJlYW0uY2xvc2UoKTsKLQotICAgICAgICAgIElucHV0U3RyZWFtIG1lcmdlZFN0cmVhbSA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShvdXQudG9CeXRlQXJyYXkoKSk7Ci0KLSAgICAgICAgICAvLyBleHBhbmQgYWxsIHRoZSB4aTppbmNsdWRlIGVsZW1lbnRzCi0gICAgICAgICAgU0FYUGFyc2VyRmFjdG9yeSBzYXhGYWN0b3J5ID0gU0FYUGFyc2VyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgICAgIHNheEZhY3Rvcnkuc2V0TmFtZXNwYWNlQXdhcmUodHJ1ZSk7Ci0gICAgICAgICAgc2F4RmFjdG9yeS5zZXRWYWxpZGF0aW5nKGZhbHNlKTsKLSAgICAgICAgICBTQVhQYXJzZXIgc2F4UGFyc2VyID0gc2F4RmFjdG9yeS5uZXdTQVhQYXJzZXIoKTsKLSAgICAgICAgICBYTUxSZWFkZXIgbWVyZ2VkUmVhZGVyID0gc2F4UGFyc2VyLmdldFhNTFJlYWRlcigpOwotICAgICAgICAgIG1lcmdlZFJlYWRlciA9IG5ldyBYSW5jbHVkZUZpbHRlcihtZXJnZWRSZWFkZXIsIGNvbmZpZ0ZpbGUudG9VUkwoKSk7Ci0gICAgICAgICAgLy8gZXZlbiB3aXRoIHZhbGlkYXRpbmc9ZmFsc2UsIERURCBpcyBzdGlsbCBkb3dubG9hZGVkIHNvIHRoYXQKLSAgICAgICAgICAvLyBhbnkgZW50aXRpZXMgY29udGFpbmVkIGluIHRoZSBkb2N1bWVudCBjYW4gYmUgZXhwYW5kZWQuCi0gICAgICAgICAgLy8gdGhlIGZvbGxvd2luZyBkaXNhYmxlcyB0aGF0IGJlaGF2aW9yLCBhbHNvIHNhdmluZyB0aGUgdGltZQotICAgICAgICAgIC8vIHNwZW50IHRvIHBhcnNlIHRoZSBEVEQKLSAgICAgICAgICBtZXJnZWRSZWFkZXIuc2V0RW50aXR5UmVzb2x2ZXIobmV3IEVudGl0eVJlc29sdmVyKCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgcHVibGljIElucHV0U291cmNlIHJlc29sdmVFbnRpdHkoCi0gICAgICAgICAgICAgICAgU3RyaW5nIHB1YmxpY0lkLAotICAgICAgICAgICAgICAgIFN0cmluZyBzeXN0ZW1JZCkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgSW5wdXRTb3VyY2UobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG5ldyBieXRlWzBdKSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgICAgICAgIElucHV0U291cmNlIG1lcmdlZElucHV0ID0gbmV3IElucHV0U291cmNlKG1lcmdlZFN0cmVhbSk7Ci0gICAgICAgICAgU291cmNlIG1lcmdlZFNvdXJjZSA9IG5ldyBTQVhTb3VyY2UobWVyZ2VkUmVhZGVyLCBtZXJnZWRJbnB1dCk7Ci0KLSAgICAgICAgICB0YXJnZXRGaWxlLmRlbGV0ZSgpOwotICAgICAgICAgIHRhcmdldEZpbGUuZ2V0UGFyZW50RmlsZSgpLm1rZGlycygpOwotICAgICAgICAgIFJlc3VsdCBtZXJnZWRSZXN1bHQgPSBuZXcgU3RyZWFtUmVzdWx0KG5ldyBGaWxlT3V0cHV0U3RyZWFtKHRhcmdldEZpbGUpKTsKLQotICAgICAgICAgIFRyYW5zZm9ybWVyRmFjdG9yeSB0cmFuc0ZhY3RvcnkgPSBUcmFuc2Zvcm1lckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgICBUcmFuc2Zvcm1lciBpZGVudGl0eSA9IHRyYW5zRmFjdG9yeS5uZXdUcmFuc2Zvcm1lcigpOwotICAgICAgICAgIGlmICghX2lzMTIoKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZGVudGl0eS5zZXRPdXRwdXRQcm9wZXJ0eShPdXRwdXRLZXlzLkRPQ1RZUEVfUFVCTElDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0pTUF9UQUdfTElCUkFSWV9ET0NUWVBFX1BVQkxJQyk7Ci0gICAgICAgICAgICBpZGVudGl0eS5zZXRPdXRwdXRQcm9wZXJ0eShPdXRwdXRLZXlzLkRPQ1RZUEVfU1lTVEVNLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0pTUF9UQUdfTElCUkFSWV9ET0NUWVBFX1NZU1RFTSk7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgaWRlbnRpdHkudHJhbnNmb3JtKG1lcmdlZFNvdXJjZSwgbWVyZ2VkUmVzdWx0KTsKLQotICAgICAgICAgIHRhcmdldEZpbGUuc2V0UmVhZE9ubHkoKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChoYXNHZW5lcmF0ZWRUYWdzKQotICAgICAgICB7Ci0gICAgICAgICAgdGFyZ2V0RmlsZS5nZXRQYXJlbnRGaWxlKCkubWtkaXJzKCk7Ci0gICAgICAgICAgT3V0cHV0U3RyZWFtIG91dCA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKHRhcmdldEZpbGUpOwotICAgICAgICAgIFhNTE91dHB1dEZhY3Rvcnkgb3V0cHV0RmFjdG9yeSA9IFhNTE91dHB1dEZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgICBYTUxTdHJlYW1Xcml0ZXIgc3RyZWFtID0gb3V0cHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1Xcml0ZXIob3V0KTsKLQotICAgICAgICAgIF93cml0ZVN0YXJ0VGFnTGlicmFyeShzdHJlYW0sIF9pczEyKCkgPyAiMi4xIiA6ICIxLjIiLCBzaG9ydE5hbWUsIG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgd2hpbGUgKGNvbXBvbmVudHMuaGFzTmV4dCgpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIENvbXBvbmVudEJlYW4gY29tcG9uZW50ID0gKENvbXBvbmVudEJlYW4pY29tcG9uZW50cy5uZXh0KCk7Ci0gICAgICAgICAgICBfd3JpdGVUYWcoc3RyZWFtLCBjb21wb25lbnQpOwotICAgICAgICAgIH0KLSAgICAgICAgICB3aGlsZSAoY29udmVydGVycy5oYXNOZXh0KCkpCi0gICAgICAgICAgewotICAgICAgICAgICAgQ29udmVydGVyQmVhbiBjb252ZXJ0ZXIgPSAoQ29udmVydGVyQmVhbiljb252ZXJ0ZXJzLm5leHQoKTsKLSAgICAgICAgICAgIF93cml0ZVRhZyhzdHJlYW0sIGNvbnZlcnRlcik7Ci0gICAgICAgICAgfQotICAgICAgICAgIHdoaWxlICh2YWxpZGF0b3JzLmhhc05leHQoKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBWYWxpZGF0b3JCZWFuIHZhbGlkYXRvciA9IChWYWxpZGF0b3JCZWFuKXZhbGlkYXRvcnMubmV4dCgpOwotICAgICAgICAgICAgX3dyaXRlVGFnKHN0cmVhbSwgdmFsaWRhdG9yKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgX3dyaXRlRW5kVGFnTGlicmFyeShzdHJlYW0pOwotICAgICAgICAgIHN0cmVhbS5jbG9zZSgpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKGNvbmZpZ0ZpbGUuZXhpc3RzKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBjb3B5IGlmIG5ld2VyCi0gICAgICAgICAgaWYgKGNvbmZpZ0ZpbGUubGFzdE1vZGlmaWVkKCkgPiB0YXJnZXRGaWxlLmxhc3RNb2RpZmllZCgpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHRhcmdldEZpbGUuZGVsZXRlKCk7Ci0gICAgICAgICAgICB0YXJnZXRGaWxlLmdldFBhcmVudEZpbGUoKS5ta2RpcnMoKTsKLSAgICAgICAgICAgIEZpbGVVdGlscy5jb3B5RmlsZShjb25maWdGaWxlLCB0YXJnZXRGaWxlKTsKLSAgICAgICAgICAgIHRhcmdldEZpbGUuc2V0UmVhZE9ubHkoKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgY2F0Y2ggKFNBWEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uKCJFcnJvciBnZW5lcmF0aW5nIHRhZyBsaWJyYXJ5IiwgZSk7Ci0gICAgfQotICAgIGNhdGNoIChQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgdGhyb3cgbmV3IE1vam9FeGVjdXRpb25FeGNlcHRpb24oIkVycm9yIGdlbmVyYXRpbmcgdGFnIGxpYnJhcnkiLCBlKTsKLSAgICB9Ci0gICAgY2F0Y2ggKFRyYW5zZm9ybWVyRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgdGhyb3cgbmV3IE1vam9FeGVjdXRpb25FeGNlcHRpb24oIkVycm9yIGdlbmVyYXRpbmcgdGFnIGxpYnJhcnkiLCBlKTsKLSAgICB9Ci0gICAgY2F0Y2ggKFhNTFN0cmVhbUV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uKCJFcnJvciBnZW5lcmF0aW5nIHRhZyBsaWJyYXJ5IiwgZSk7Ci0gICAgfQotICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uKCJFcnJvciBnZW5lcmF0aW5nIHRhZyBsaWJyYXJpZXMiLCBlKTsKLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgX3dyaXRlU3RhcnRUYWdMaWJyYXJ5KAotICAgIFhNTFN0cmVhbVdyaXRlciBzdHJlYW0sCi0gICAgU3RyaW5nICAgICAgICAgIGR0ZCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbgotICB7Ci0gICAgc3RyZWFtLndyaXRlU3RhcnREb2N1bWVudCgiMS4wIik7Ci0gICAgc3RyZWFtLndyaXRlQ2hhcmFjdGVycygiXG4iKTsKLSAgICBpZiAoIV9pczEyKCkpCi0gICAgICBzdHJlYW0ud3JpdGVEVEQoZHRkKTsKLQotICAgIHN0cmVhbS53cml0ZUNoYXJhY3RlcnMoIlxuIik7Ci0gICAgc3RyZWFtLndyaXRlU3RhcnRFbGVtZW50KCJ0YWdsaWIiKTsKLSAgICBpZiAoX2lzMTIoKSkKLSAgICB7Ci0gICAgICBzdHJlYW0ud3JpdGVOYW1lc3BhY2UoIiIsICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiKTsKLSAgICAgIHN0cmVhbS53cml0ZU5hbWVzcGFjZSgieHNpIiwgImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIik7Ci0gICAgICBzdHJlYW0ud3JpdGVBdHRyaWJ1dGUoInhzaTpzY2hlbWFMb2NhdGlvbiIsICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvd2ViLWpzcHRhZ2xpYnJhcnlfMl8xLnhzZCIpOwotICAgICAgc3RyZWFtLndyaXRlQXR0cmlidXRlKCJ2ZXJzaW9uIiwgIjIuMSIpOwotICAgIH0KLQotICAgIHN0cmVhbS53cml0ZUNoYXJhY3RlcnMoIlxuICAiKTsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBfd3JpdGVTdGFydFRhZ0xpYnJhcnkoCi0gICAgWE1MU3RyZWFtV3JpdGVyIHN0cmVhbSwKLSAgICBTdHJpbmcgICAgICAgICAgdmVyc2lvbiwKLSAgICBTdHJpbmcgICAgICAgICAgc2hvcnROYW1lLAotICAgIFN0cmluZyAgICAgICAgICBuYW1lc3BhY2VVUkkpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24KLSAgewotICAgIF93cml0ZVN0YXJ0VGFnTGlicmFyeShzdHJlYW0sIF9KU1BfVEFHX0xJQlJBUllfRFREKTsKLSAgICBzdHJlYW0ud3JpdGVTdGFydEVsZW1lbnQoInRsaWItdmVyc2lvbiIpOwotICAgIFN0cmluZyB0bGliVmVyc2lvbiA9IHByb2plY3QuZ2V0VmVyc2lvbigpOwotICAgIC8vIFJlbW92ZSBldmVyeXRoaW5nIGJ1dCBkZXdleS1kZWNpbWFsIGNoYXJhY3RlcnMgKGkuZS4sIG51bWJlcnMgYW5kIHBlcmlvZHMpCi0gICAgdGxpYlZlcnNpb24gPSB0bGliVmVyc2lvbi5yZXBsYWNlQWxsKCJbXi4wLTldIiwgIiIpOwotICAgIC8vIFJlbW92ZSBsZWFkaW5nIGFuZC9vciB0cmFpbGluZyBwZXJpb2RzCi0gICAgd2hpbGUgKHRsaWJWZXJzaW9uLnN0YXJ0c1dpdGgoIi4iKSkKLSAgICB7Ci0gICAgICB0bGliVmVyc2lvbiA9IHRsaWJWZXJzaW9uLnN1YnN0cmluZygxKTsKLSAgICB9Ci0KLSAgICB3aGlsZSAodGxpYlZlcnNpb24uZW5kc1dpdGgoIi4iKSkKLSAgICB7Ci0gICAgICB0bGliVmVyc2lvbiA9IHRsaWJWZXJzaW9uLnN1YnN0cmluZygwLCB0bGliVmVyc2lvbi5sZW5ndGgoKSAtIDEpOwotICAgIH0KLQotICAgIHN0cmVhbS53cml0ZUNoYXJhY3RlcnModGxpYlZlcnNpb24pOwotICAgIHN0cmVhbS53cml0ZUVuZEVsZW1lbnQoKTsKLQotICAgIGlmICghX2lzMTIoKSkKLSAgICB7Ci0gICAgICBzdHJlYW0ud3JpdGVDaGFyYWN0ZXJzKCJcbiAgIik7Ci0gICAgICBzdHJlYW0ud3JpdGVTdGFydEVsZW1lbnQoImpzcC12ZXJzaW9uIik7Ci0gICAgICBzdHJlYW0ud3JpdGVDaGFyYWN0ZXJzKHZlcnNpb24pOwotICAgICAgc3RyZWFtLndyaXRlRW5kRWxlbWVudCgpOwotICAgIH0KLSAgICBzdHJlYW0ud3JpdGVDaGFyYWN0ZXJzKCJcbiAgIik7Ci0gICAgc3RyZWFtLndyaXRlU3RhcnRFbGVtZW50KCJzaG9ydC1uYW1lIik7Ci0gICAgc3RyZWFtLndyaXRlQ2hhcmFjdGVycyhzaG9ydE5hbWUpOwotICAgIHN0cmVhbS53cml0ZUVuZEVsZW1lbnQoKTsKLSAgICBzdHJlYW0ud3JpdGVDaGFyYWN0ZXJzKCJcbiAgIik7Ci0gICAgc3RyZWFtLndyaXRlU3RhcnRFbGVtZW50KCJ1cmkiKTsKLSAgICBzdHJlYW0ud3JpdGVDaGFyYWN0ZXJzKG5hbWVzcGFjZVVSSSk7Ci0gICAgc3RyZWFtLndyaXRlRW5kRWxlbWVudCgpOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIF93cml0ZUVuZFRhZ0xpYnJhcnkoCi0gICAgWE1MU3RyZWFtV3JpdGVyIHN0cmVhbSkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbgotICB7Ci0KLSAgICBzdHJlYW0ud3JpdGVDaGFyYWN0ZXJzKCJcbiIpOwotICAgIHN0cmVhbS53cml0ZUVuZEVsZW1lbnQoKTsKLSAgICBzdHJlYW0ud3JpdGVFbmREb2N1bWVudCgpOwotICB9Ci0KLSAgLyoqCi0gICAqIEdlbmVyYXRlcyB0YWcgbGlicmFyeSBkZXNjcmlwdG9yIGZvciBwYXJzZWQgY29tcG9uZW50IG1ldGFkYXRhLgotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIF93cml0ZVRhZygKLSAgICBYTUxTdHJlYW1Xcml0ZXIgc3RyZWFtLAotICAgIENvbXBvbmVudEJlYW4gICBjb21wb25lbnQpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24KLSAgewotICAgIHN0cmVhbS53cml0ZUNoYXJhY3RlcnMoIlxuICAiKTsKLSAgICBzdHJlYW0ud3JpdGVTdGFydEVsZW1lbnQoInRhZyIpOwotICAgIHN0cmVhbS53cml0ZUNoYXJhY3RlcnMoIlxuICAgICIpOwotCi0gICAgLy8gSW4gSlNQIDIuMSwgZGVzY3JpcHRpb24gZ29lcyB1cCB0b3AKLSAgICBpZiAoX2lzMTIoKSAmJiBjb21wb25lbnQuZ2V0RGVzY3JpcHRpb24oKSAhPSBudWxsKQotICAgIHsKLSAgICAgIHN0cmVhbS53cml0ZUNoYXJhY3RlcnMoIlxuICAgICIpOwotICAgICAgc3RyZWFtLndyaXRlU3RhcnRFbGVtZW50KCJkZXNjcmlwdGlvbiIpOwotICAgICAgc3RyZWFtLndyaXRlQ0RhdGEoY29tcG9uZW50LmdldERlc2NyaXB0aW9uKCkpOwotICAgICAgc3RyZWFtLndyaXRlRW5kRWxlbWVudCgpOwotICAgIH0KLQotICAgIHN0cmVhbS53cml0ZVN0YXJ0RWxlbWVudCgibmFtZSIpOwotICAgIHN0cmVhbS53cml0ZUNoYXJhY3RlcnMoY29tcG9uZW50LmdldFRhZ05hbWUoKS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgc3RyZWFtLndyaXRlRW5kRWxlbWVudCgpOwotICAgIHN0cmVhbS53cml0ZUNoYXJhY3RlcnMoIlxuICAgICIpOwotICAgIHN0cmVhbS53cml0ZVN0YXJ0RWxlbWVudCgidGFnLWNsYXNzIik7Ci0gICAgc3RyZWFtLndyaXRlQ2hhcmFjdGVycyhjb21wb25lbnQuZ2V0VGFnQ2xhc3MoKSk7Ci0gICAgc3RyZWFtLndyaXRlRW5kRWxlbWVudCgpOwotCi0gICAgLy8gSW4gSlNQIDIuMSwgYm9keS1jb250ZW50IGlzIG5vdCBvcHRpb25hbAotICAgIGlmIChfaXMxMigpKQotICAgIHsKLSAgICAgIHN0cmVhbS53cml0ZUNoYXJhY3RlcnMoIlxuICAgICIpOwotICAgICAgc3RyZWFtLndyaXRlU3RhcnRFbGVtZW50KCJib2R5LWNvbnRlbnQiKTsKLSAgICAgIHN0cmVhbS53cml0ZUNoYXJhY3RlcnMoIkpTUCIpOwotICAgICAgc3RyZWFtLndyaXRlRW5kRWxlbWVudCgpOwotICAgIH0KLQotICAgIEdlbmVyYXRlSnNwVGFnbGlic01vam8udGhpcy53cml0ZUN1c3RvbUNvbXBvbmVudFRhZ0Rlc2NyaXB0b3JDb250ZW50KHN0cmVhbSwgY29tcG9uZW50KTsKLQotICAgIC8vIEluIEpTUCAyLjAsIGRlc2NyaXB0aW9uIGdvZXMganVzdCBiZWZvcmUgdGhlIGF0dHJpYnV0ZXMKLSAgICBpZiAoIV9pczEyKCkgJiYgY29tcG9uZW50LmdldERlc2NyaXB0aW9uKCkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBzdHJlYW0ud3JpdGVDaGFyYWN0ZXJzKCJcbiAgICAiKTsKLSAgICAgIHN0cmVhbS53cml0ZVN0YXJ0RWxlbWVudCgiZGVzY3JpcHRpb24iKTsKLSAgICAgIHN0cmVhbS53cml0ZUNEYXRhKGNvbXBvbmVudC5nZXREZXNjcmlwdGlvbigpKTsKLSAgICAgIHN0cmVhbS53cml0ZUVuZEVsZW1lbnQoKTsKLSAgICB9Ci0KLSAgICBJdGVyYXRvciBwcm9wZXJ0aWVzID0gY29tcG9uZW50LnByb3BlcnRpZXModHJ1ZSk7Ci0gICAgcHJvcGVydGllcyA9IG5ldyBGaWx0ZXJlZEl0ZXJhdG9yKHByb3BlcnRpZXMsIG5ldyBUYWdBdHRyaWJ1dGVGaWx0ZXIoKSk7Ci0gICAgd2hpbGUgKHByb3BlcnRpZXMuaGFzTmV4dCgpKQotICAgIHsKLSAgICAgIFByb3BlcnR5QmVhbiBwcm9wZXJ0eSA9IChQcm9wZXJ0eUJlYW4pcHJvcGVydGllcy5uZXh0KCk7Ci0gICAgICB3cml0ZVRhZ0F0dHJpYnV0ZShzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHkuZ2V0UHJvcGVydHlOYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHkuZ2V0RGVzY3JpcHRpb24oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eS5nZXRVbnN1cHBvcnRlZEFnZW50cygpLAotICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5KTsKLSAgICB9Ci0KLSAgICBzdHJlYW0ud3JpdGVDaGFyYWN0ZXJzKCJcbiAgIik7Ci0gICAgc3RyZWFtLndyaXRlRW5kRWxlbWVudCgpOwotICB9Ci0KLSAgLyoqCi0gICAqIEdlbmVyYXRlcyB0YWcgbGlicmFyeSBkZXNjcmlwdG9yIGZvciBwYXJzZWQgY29udmVydGVyIG1ldGFkYXRhLgotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIF93cml0ZVRhZygKLSAgICBYTUxTdHJlYW1Xcml0ZXIgc3RyZWFtLAotICAgIENvbnZlcnRlckJlYW4gICBjb252ZXJ0ZXIpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24KLSAgewotICAgIHN0cmVhbS53cml0ZUNoYXJhY3RlcnMoIlxuICAiKTsKLSAgICBzdHJlYW0ud3JpdGVTdGFydEVsZW1lbnQoInRhZyIpOwotICAgIHN0cmVhbS53cml0ZUNoYXJhY3RlcnMoIlxuICAgICIpOwotICAgIGlmIChfaXMxMigpICYmIGNvbnZlcnRlci5nZXREZXNjcmlwdGlvbigpICE9IG51bGwpCi0gICAgewotICAgICAgc3RyZWFtLndyaXRlQ2hhcmFjdGVycygiXG4gICAgIik7Ci0gICAgICBzdHJlYW0ud3JpdGVTdGFydEVsZW1lbnQoImRlc2NyaXB0aW9uIik7Ci0gICAgICBzdHJlYW0ud3JpdGVDRGF0YShjb252ZXJ0ZXIuZ2V0RGVzY3JpcHRpb24oKSk7Ci0gICAgICBzdHJlYW0ud3JpdGVFbmRFbGVtZW50KCk7Ci0gICAgfQotCi0gICAgc3RyZWFtLndyaXRlU3RhcnRFbGVtZW50KCJuYW1lIik7Ci0gICAgc3RyZWFtLndyaXRlQ2hhcmFjdGVycyhjb252ZXJ0ZXIuZ2V0VGFnTmFtZSgpLmdldExvY2FsUGFydCgpKTsKLSAgICBzdHJlYW0ud3JpdGVFbmRFbGVtZW50KCk7Ci0gICAgc3RyZWFtLndyaXRlQ2hhcmFjdGVycygiXG4gICAgIik7Ci0gICAgc3RyZWFtLndyaXRlU3RhcnRFbGVtZW50KCJ0YWctY2xhc3MiKTsKLSAgICBzdHJlYW0ud3JpdGVDaGFyYWN0ZXJzKGNvbnZlcnRlci5nZXRUYWdDbGFzcygpKTsKLSAgICBzdHJlYW0ud3JpdGVFbmRFbGVtZW50KCk7Ci0KLSAgICAvLyBJbiBKU1AgMi4xLCBib2R5LWNvbnRlbnQgaXMgbm90IG9wdGlvbmFsCi0gICAgaWYgKF9pczEyKCkpCi0gICAgewotICAgICAgc3RyZWFtLndyaXRlQ2hhcmFjdGVycygiXG4gICAgIik7Ci0gICAgICBzdHJlYW0ud3JpdGVTdGFydEVsZW1lbnQoImJvZHktY29udGVudCIpOwotICAgICAgc3RyZWFtLndyaXRlQ2hhcmFjdGVycygiZW1wdHkiKTsKLSAgICAgIHN0cmVhbS53cml0ZUVuZEVsZW1lbnQoKTsKLSAgICB9Ci0KLSAgICBpZiAoIV9pczEyKCkgJiYgY29udmVydGVyLmdldERlc2NyaXB0aW9uKCkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBzdHJlYW0ud3JpdGVDaGFyYWN0ZXJzKCJcbiAgICAiKTsKLSAgICAgIHN0cmVhbS53cml0ZVN0YXJ0RWxlbWVudCgiZGVzY3JpcHRpb24iKTsKLSAgICAgIHN0cmVhbS53cml0ZUNEYXRhKGNvbnZlcnRlci5nZXREZXNjcmlwdGlvbigpKTsKLSAgICAgIHN0cmVhbS53cml0ZUVuZEVsZW1lbnQoKTsKLSAgICB9Ci0KLSAgICAvLyBjb252ZXJ0ZXJzIG5lZWQgYW4gaWQgYXR0cmlidXRlCi0gICAgd3JpdGVUYWdBdHRyaWJ1dGUoc3RyZWFtLCAiaWQiLCAidGhlIGlkZW50aWZpZXIgZm9yIHRoZSBjb252ZXJ0ZXIiLCBudWxsLCBudWxsKTsKLQotICAgIEl0ZXJhdG9yIHByb3BlcnRpZXMgPSBjb252ZXJ0ZXIucHJvcGVydGllcygpOwotICAgIHByb3BlcnRpZXMgPSBuZXcgRmlsdGVyZWRJdGVyYXRvcihwcm9wZXJ0aWVzLCBuZXcgVGFnQXR0cmlidXRlRmlsdGVyKCkpOwotICAgIHdoaWxlIChwcm9wZXJ0aWVzLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBQcm9wZXJ0eUJlYW4gcHJvcGVydHkgPSAoUHJvcGVydHlCZWFuKXByb3BlcnRpZXMubmV4dCgpOwotICAgICAgd3JpdGVUYWdBdHRyaWJ1dGUoc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5LmdldFByb3BlcnR5TmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5LmdldERlc2NyaXB0aW9uKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHkuZ2V0VW5zdXBwb3J0ZWRBZ2VudHMoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eSk7Ci0gICAgfQotCi0gICAgc3RyZWFtLndyaXRlQ2hhcmFjdGVycygiXG4gICIpOwotICAgIHN0cmVhbS53cml0ZUVuZEVsZW1lbnQoKTsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBfd3JpdGVUYWdBdHRyaWJ1dGVEZXNjcmlwdGlvbigKLSAgICBYTUxTdHJlYW1Xcml0ZXIgc3RyZWFtLAotICAgIFN0cmluZyAgICAgICAgICBkZXNjcmlwdGlvbiwKLSAgICBTdHJpbmdbXSAgICAgICAgdW5zdXBwb3J0ZWRBZ2VudHMpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24KLSAgewotCi0gICAgaWYgKGRlc2NyaXB0aW9uICE9IG51bGwgfHwKLSAgICAgICAgdW5zdXBwb3J0ZWRBZ2VudHMubGVuZ3RoID4gMCkKLSAgICB7Ci0gICAgICBzdHJlYW0ud3JpdGVDaGFyYWN0ZXJzKCJcbiAgICAgICIpOwotICAgICAgc3RyZWFtLndyaXRlU3RhcnRFbGVtZW50KCJkZXNjcmlwdGlvbiIpOwotCi0gICAgICBpZiAodW5zdXBwb3J0ZWRBZ2VudHMgIT0gbnVsbCAmJgotICAgICAgICAgIHVuc3VwcG9ydGVkQWdlbnRzLmxlbmd0aCA+IDApCi0gICAgICB7Ci0gICAgICAgIGlmIChkZXNjcmlwdGlvbiA9PSBudWxsKQotICAgICAgICAgIGRlc2NyaXB0aW9uID0gIiI7Ci0KLSAgICAgICAgZGVzY3JpcHRpb24gKz0gIlxuXG4gICAgVGhpcyBhdHRyaWJ1dGUgaXMgbm90IHN1cHBvcnRlZCBvbiB0aGUgZm9sbG93aW5nIGFnZW50IHR5cGVzOlxuIjsKLQotICAgICAgICBmb3IgKGludCBpPTA7IGkgPCB1bnN1cHBvcnRlZEFnZW50cy5sZW5ndGg7IGkrKykKLSAgICAgICAgewotICAgICAgICAgIGRlc2NyaXB0aW9uICs9ICIgIiArIHVuc3VwcG9ydGVkQWdlbnRzW2ldOwotICAgICAgICAgIGRlc2NyaXB0aW9uICs9IChpIDwgdW5zdXBwb3J0ZWRBZ2VudHMubGVuZ3RoIC0gMSkgPyAiLCIgOiAiLiI7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgc3RyZWFtLndyaXRlQ0RhdGEoZGVzY3JpcHRpb24pOwotICAgICAgc3RyZWFtLndyaXRlRW5kRWxlbWVudCgpOwotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHdyaXRlVGFnQXR0cmlidXRlKAotICAgIFhNTFN0cmVhbVdyaXRlciBzdHJlYW0sCi0gICAgU3RyaW5nICAgICAgICAgIHByb3BlcnR5TmFtZSwKLSAgICBTdHJpbmcgICAgICAgICAgZGVzY3JpcHRpb24sCi0gICAgU3RyaW5nW10gICAgICAgIHVuc3VwcG9ydGVkQWdlbnRzLAotICAgIFByb3BlcnR5QmVhbiAgICBwcm9wZXJ0eSkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbgotICB7Ci0gICAgc3RyZWFtLndyaXRlQ2hhcmFjdGVycygiXG4gICAgIik7Ci0gICAgc3RyZWFtLndyaXRlU3RhcnRFbGVtZW50KCJhdHRyaWJ1dGUiKTsKLQotICAgIC8vIEluIEpTUCAyLjEsIHRoZSBkZXNjcmlwdGlvbiBnb2VzIGF0IHRoZSBiZWdpbm5pbmcKLSAgICBpZiAoX2lzMTIoKSkKLSAgICAgIF93cml0ZVRhZ0F0dHJpYnV0ZURlc2NyaXB0aW9uKHN0cmVhbSwgZGVzY3JpcHRpb24sIHVuc3VwcG9ydGVkQWdlbnRzKTsKLQotICAgIHN0cmVhbS53cml0ZUNoYXJhY3RlcnMoIlxuICAgICAgIik7Ci0gICAgc3RyZWFtLndyaXRlU3RhcnRFbGVtZW50KCJuYW1lIik7Ci0gICAgCi0gICAgaWYgKHByb3BlcnR5ICE9IG51bGwpCi0gICAgICBzdHJlYW0ud3JpdGVDaGFyYWN0ZXJzKHByb3BlcnR5LmdldEpzcFByb3BlcnR5TmFtZSgpKTsKLSAgICBlbHNlCi0gICAgICBzdHJlYW0ud3JpdGVDaGFyYWN0ZXJzKHByb3BlcnR5TmFtZSk7Ci0KLSAgICBzdHJlYW0ud3JpdGVFbmRFbGVtZW50KCk7Ci0KLSAgICBpZiAoIV9pczEyKCkpCi0gICAgewotICAgICAgaWYgKHByb3BlcnR5ICE9IG51bGwpCi0gICAgICB7ICAgICAgICAKLSAgICAgICAgaWYgKHByb3BlcnR5LmlzUmVxdWlyZWQoKSkKLSAgICAgICAgewotICAgICAgICAgIHN0cmVhbS53cml0ZUNoYXJhY3RlcnMoIlxuICAgICIpOwotICAgICAgICAgIHN0cmVhbS53cml0ZVN0YXJ0RWxlbWVudCgicmVxdWlyZWQiKTsKLSAgICAgICAgICBzdHJlYW0ud3JpdGVDaGFyYWN0ZXJzKCJ0cnVlIik7Ci0gICAgICAgICAgc3RyZWFtLndyaXRlRW5kRWxlbWVudCgpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICAgIAotICAgICAgc3RyZWFtLndyaXRlQ2hhcmFjdGVycygiXG4gICAgICAiKTsKLSAgICAgIHN0cmVhbS53cml0ZVN0YXJ0RWxlbWVudCgicnRleHBydmFsdWUiKTsKLSAgICAgIHN0cmVhbS53cml0ZUNoYXJhY3RlcnMoImZhbHNlIik7Ci0gICAgICBzdHJlYW0ud3JpdGVFbmRFbGVtZW50KCk7Ci0gICAgICAKLSAgICAgIC8vIEluIEpTUCAyLjAsIHRoZSB0YWcgZGVzY3JpcHRpb24gZ29lcyBhdCB0aGUgZW5kCi0gICAgICBfd3JpdGVUYWdBdHRyaWJ1dGVEZXNjcmlwdGlvbihzdHJlYW0sIGRlc2NyaXB0aW9uLCB1bnN1cHBvcnRlZEFnZW50cyk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBpZiAocHJvcGVydHkgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgaWYgKHByb3BlcnR5LmlzUmVxdWlyZWQoKSkKLSAgICAgICAgewotICAgICAgICAgIHN0cmVhbS53cml0ZUNoYXJhY3RlcnMoIlxuICAgICIpOwotICAgICAgICAgIHN0cmVhbS53cml0ZVN0YXJ0RWxlbWVudCgicmVxdWlyZWQiKTsKLSAgICAgICAgICBzdHJlYW0ud3JpdGVDaGFyYWN0ZXJzKCJ0cnVlIik7Ci0gICAgICAgICAgc3RyZWFtLndyaXRlRW5kRWxlbWVudCgpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZiAocHJvcGVydHkuaXNNZXRob2RFeHByZXNzaW9uKCkgfHwgcHJvcGVydHkuaXNNZXRob2RCaW5kaW5nKCkpCi0gICAgICAgIHsKLSAgICAgICAgICBzdHJlYW0ud3JpdGVDaGFyYWN0ZXJzKCJcbiAgICAiKTsKLSAgICAgICAgICBzdHJlYW0ud3JpdGVTdGFydEVsZW1lbnQoImRlZmVycmVkLW1ldGhvZCIpOwotICAgICAgICAgIHN0cmVhbS53cml0ZUNoYXJhY3RlcnMoIlxuICAgICAgIik7Ci0gICAgICAgICAgTWV0aG9kU2lnbmF0dXJlQmVhbiBzaWcgPSBwcm9wZXJ0eS5nZXRNZXRob2RCaW5kaW5nU2lnbmF0dXJlKCk7Ci0gICAgICAgICAgaWYgKHNpZyAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHN0cmVhbS53cml0ZVN0YXJ0RWxlbWVudCgibWV0aG9kLXNpZ25hdHVyZSIpOwotICAgICAgICAgICAgc3RyZWFtLndyaXRlQ2hhcmFjdGVycyhzaWcuZ2V0UmV0dXJuVHlwZSgpKTsKLSAgICAgICAgICAgIHN0cmVhbS53cml0ZUNoYXJhY3RlcnMoIiBteU1ldGhvZCgiKTsKLSAgICAgICAgICAgIFN0cmluZ1tdIHBhcmFtcyA9IHNpZy5nZXRQYXJhbWV0ZXJUeXBlcygpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJhbXMubGVuZ3RoOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGlmIChpID4gMCkKLSAgICAgICAgICAgICAgICBzdHJlYW0ud3JpdGVDaGFyYWN0ZXJzKCIsICIpOwotICAgICAgICAgICAgICBzdHJlYW0ud3JpdGVDaGFyYWN0ZXJzKHBhcmFtc1tpXSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHN0cmVhbS53cml0ZUNoYXJhY3RlcnMoIikiKTsKLSAgICAgICAgICAgIHN0cmVhbS53cml0ZUVuZEVsZW1lbnQoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgc3RyZWFtLndyaXRlRW5kRWxlbWVudCgpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKCFwcm9wZXJ0eS5pc0xpdGVyYWxPbmx5KCkgfHwKLSAgICAgICAgICAgICAgICAgLy8gImJpbmRpbmciIGlzIGFsd2F5cyBhIGRlZmVycmVkLXZhbHVlCi0gICAgICAgICAgICAgICAgICJiaW5kaW5nIi5lcXVhbHMocHJvcGVydHlOYW1lKSkKLSAgICAgICAgewotICAgICAgICAgIHN0cmVhbS53cml0ZUNoYXJhY3RlcnMoIlxuICAgICAgIik7Ci0gICAgICAgICAgc3RyZWFtLndyaXRlU3RhcnRFbGVtZW50KCJkZWZlcnJlZC12YWx1ZSIpOwotICAgICAgICAgIFN0cmluZyBwcm9wZXJ0eUNsYXNzID0gcHJvcGVydHkuZ2V0UHJvcGVydHlDbGFzcygpOwotICAgICAgICAgIC8vIFdyaXRpbmcgamF2YS5sYW5nLlN0cmluZyBpcyB1c3VhbGx5IGEgYmFkIGlkZWEgLSBpdAotICAgICAgICAgIC8vIG1lYW5zIHRoYXQgbnVsbCBnZXRzIGNvZXJjZWQgdG8gdGhlIGVtcHR5IHN0cmluZy4KLSAgICAgICAgICBpZiAoKCJqYXZhLmxhbmcuU3RyaW5nIi5lcXVhbHMocHJvcGVydHlDbGFzcykgJiYgY29lcmNlU3RyaW5ncykgfHwKLSAgICAgICAgICAgICAgX0NBTl9DT0VSQ0UuY29udGFpbnMocHJvcGVydHkuZ2V0UHJvcGVydHlDbGFzcygpKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBzdHJlYW0ud3JpdGVDaGFyYWN0ZXJzKCJcbiAgICAgICAgIik7Ci0gICAgICAgICAgICBzdHJlYW0ud3JpdGVTdGFydEVsZW1lbnQoInR5cGUiKTsKLSAgICAgICAgICAgIC8vIFRyaW0gb3V0IGFueSB1c2Ugb2YgZ2VuZXJpY3MgaGVyZSAtIHNpbmNlIEpTUCBjb2VyY2lvbgotICAgICAgICAgICAgLy8gY2VydGFpbmx5IGNhbid0IGRvIGFueXRoaW5nIHRoZXJlCi0gICAgICAgICAgICBpbnQgZ2VuZXJpY0luZGV4ID0gcHJvcGVydHlDbGFzcy5pbmRleE9mKCc8Jyk7Ci0gICAgICAgICAgICBpZiAoZ2VuZXJpY0luZGV4ID4gMCkKLSAgICAgICAgICAgICAgcHJvcGVydHlDbGFzcyA9IHByb3BlcnR5Q2xhc3Muc3Vic3RyaW5nKDAsIGdlbmVyaWNJbmRleCk7Ci0KLSAgICAgICAgICAgIHN0cmVhbS53cml0ZUNoYXJhY3RlcnMocHJvcGVydHlDbGFzcyk7Ci0gICAgICAgICAgICBzdHJlYW0ud3JpdGVFbmRFbGVtZW50KCk7Ci0gICAgICAgICAgICBzdHJlYW0ud3JpdGVDaGFyYWN0ZXJzKCJcbiAgICAgICIpOwotICAgICAgICAgIH0KLQotICAgICAgICAgIHN0cmVhbS53cml0ZUVuZEVsZW1lbnQoKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChwcm9wZXJ0eS5pc1J0ZXhwcnZhbHVlKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN0cmVhbS53cml0ZUNoYXJhY3RlcnMoIlxuICAgICAgIik7Ci0gICAgICAgICAgICBzdHJlYW0ud3JpdGVTdGFydEVsZW1lbnQoInJ0ZXhwcnZhbHVlIik7Ci0gICAgICAgICAgICBzdHJlYW0ud3JpdGVDaGFyYWN0ZXJzKCJ0cnVlIik7Ci0gICAgICAgICAgICBzdHJlYW0ud3JpdGVFbmRFbGVtZW50KCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgc3RyZWFtLndyaXRlQ2hhcmFjdGVycygiXG4gICAgICAiKTsKLSAgICAgICAgICBzdHJlYW0ud3JpdGVTdGFydEVsZW1lbnQoInJ0ZXhwcnZhbHVlIik7Ci0gICAgICAgICAgLy8gQXMgb2YgSlNGIDEuMiwgImlkIiBjYW4gYmUgc2V0IHZpYSBhbiBydGV4cHJ2YWx1ZSAoYnV0Ci0gICAgICAgICAgLy8gKm5vdCogYnkgYSBWYWx1ZUV4cHJlc3Npb24pIC0gaXQgaGFzIHRvIGJlIGV2YWx1YXRlZAotICAgICAgICAgIC8vIGluIHRoZSBKU1AKLSAgICAgICAgICBpZiAoImlkIi5lcXVhbHMocHJvcGVydHlOYW1lKSAmJiAhZGlzYWJsZUlkRXhwcmVzc2lvbnMpCi0gICAgICAgICAgICBzdHJlYW0ud3JpdGVDaGFyYWN0ZXJzKCJ0cnVlIik7Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgc3RyZWFtLndyaXRlQ2hhcmFjdGVycygiZmFsc2UiKTsKLSAgICAgICAgICBzdHJlYW0ud3JpdGVFbmRFbGVtZW50KCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICBzdHJlYW0ud3JpdGVDaGFyYWN0ZXJzKCJcbiAgICAiKTsKLSAgICBzdHJlYW0ud3JpdGVFbmRFbGVtZW50KCk7Ci0gIH0KLQotICAvKioKLSAgICogR2VuZXJhdGVzIHRhZyBsaWJyYXJ5IGRlc2NyaXB0b3IgZm9yIHBhcnNlZCB2YWxpZGF0b3IgbWV0YWRhdGEuCi0gICAqLwotICBwcml2YXRlIHZvaWQgX3dyaXRlVGFnKAotICAgIFhNTFN0cmVhbVdyaXRlciBzdHJlYW0sCi0gICAgVmFsaWRhdG9yQmVhbiAgIHZhbGlkYXRvcikgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbgotICB7Ci0gICAgc3RyZWFtLndyaXRlQ2hhcmFjdGVycygiXG4gICIpOwotICAgIHN0cmVhbS53cml0ZVN0YXJ0RWxlbWVudCgidGFnIik7Ci0KLSAgICBpZiAoX2lzMTIoKSAmJiB2YWxpZGF0b3IuZ2V0RGVzY3JpcHRpb24oKSAhPSBudWxsKQotICAgIHsKLSAgICAgIHN0cmVhbS53cml0ZUNoYXJhY3RlcnMoIlxuICAgICIpOwotICAgICAgc3RyZWFtLndyaXRlU3RhcnRFbGVtZW50KCJkZXNjcmlwdGlvbiIpOwotICAgICAgc3RyZWFtLndyaXRlQ0RhdGEodmFsaWRhdG9yLmdldERlc2NyaXB0aW9uKCkpOwotICAgICAgc3RyZWFtLndyaXRlRW5kRWxlbWVudCgpOwotICAgIH0KLQotICAgIHN0cmVhbS53cml0ZUNoYXJhY3RlcnMoIlxuICAgICIpOwotICAgIHN0cmVhbS53cml0ZVN0YXJ0RWxlbWVudCgibmFtZSIpOwotICAgIHN0cmVhbS53cml0ZUNoYXJhY3RlcnModmFsaWRhdG9yLmdldFRhZ05hbWUoKS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgc3RyZWFtLndyaXRlRW5kRWxlbWVudCgpOwotICAgIHN0cmVhbS53cml0ZUNoYXJhY3RlcnMoIlxuICAgICIpOwotICAgIHN0cmVhbS53cml0ZVN0YXJ0RWxlbWVudCgidGFnLWNsYXNzIik7Ci0gICAgc3RyZWFtLndyaXRlQ2hhcmFjdGVycyh2YWxpZGF0b3IuZ2V0VGFnQ2xhc3MoKSk7Ci0gICAgc3RyZWFtLndyaXRlRW5kRWxlbWVudCgpOwotCi0gICAgLy8gSW4gSlNQIDIuMSwgYm9keS1jb250ZW50IGlzIG5vdCBvcHRpb25hbAotICAgIGlmIChfaXMxMigpKQotICAgIHsKLSAgICAgIHN0cmVhbS53cml0ZUNoYXJhY3RlcnMoIlxuICAgICIpOwotICAgICAgc3RyZWFtLndyaXRlU3RhcnRFbGVtZW50KCJib2R5LWNvbnRlbnQiKTsKLSAgICAgIHN0cmVhbS53cml0ZUNoYXJhY3RlcnMoImVtcHR5Iik7Ci0gICAgICBzdHJlYW0ud3JpdGVFbmRFbGVtZW50KCk7Ci0gICAgfQotCi0gICAgaWYgKCFfaXMxMigpICYmIHZhbGlkYXRvci5nZXREZXNjcmlwdGlvbigpICE9IG51bGwpCi0gICAgewotICAgICAgc3RyZWFtLndyaXRlQ2hhcmFjdGVycygiXG4gICAgIik7Ci0gICAgICBzdHJlYW0ud3JpdGVTdGFydEVsZW1lbnQoImRlc2NyaXB0aW9uIik7Ci0gICAgICBzdHJlYW0ud3JpdGVDRGF0YSh2YWxpZGF0b3IuZ2V0RGVzY3JpcHRpb24oKSk7Ci0gICAgICBzdHJlYW0ud3JpdGVFbmRFbGVtZW50KCk7Ci0gICAgfQotCi0gICAgLy8gdmFsaWRhdG9ycyBuZWVkIGFuIGlkIGF0dHJpYnV0ZQotICAgIHdyaXRlVGFnQXR0cmlidXRlKHN0cmVhbSwgImlkIiwgInRoZSBpZGVudGlmaWVyIGZvciB0aGUgdmFsaWRhdG9yIiwgbnVsbCwgbnVsbCk7Ci0KLSAgICBJdGVyYXRvciBwcm9wZXJ0aWVzID0gdmFsaWRhdG9yLnByb3BlcnRpZXMoKTsKLSAgICBwcm9wZXJ0aWVzID0gbmV3IEZpbHRlcmVkSXRlcmF0b3IocHJvcGVydGllcywgbmV3IFRhZ0F0dHJpYnV0ZUZpbHRlcigpKTsKLSAgICB3aGlsZSAocHJvcGVydGllcy5oYXNOZXh0KCkpCi0gICAgewotICAgICAgUHJvcGVydHlCZWFuIHByb3BlcnR5ID0gKFByb3BlcnR5QmVhbilwcm9wZXJ0aWVzLm5leHQoKTsKLSAgICAgIHdyaXRlVGFnQXR0cmlidXRlKHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eS5nZXRQcm9wZXJ0eU5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eS5nZXREZXNjcmlwdGlvbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5LmdldFVuc3VwcG9ydGVkQWdlbnRzKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHkpOwotICAgIH0KLQotICAgIHN0cmVhbS53cml0ZUNoYXJhY3RlcnMoIlxuICAiKTsKLSAgICBzdHJlYW0ud3JpdGVFbmRFbGVtZW50KCk7Ci0gIH0KLQotICAvKioKLSAgICogR2VuZXJhdGVzIHRhZyBoYW5kbGVycyBmb3IgcGFyc2VkIGNvbXBvbmVudCBtZXRhZGF0YS4KLSAgICovCi0gIHByaXZhdGUgdm9pZCBfZ2VuZXJhdGVUYWdIYW5kbGVycygpIHRocm93cyBJT0V4Y2VwdGlvbiwgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0gICAgLy8gTWFrZSBzdXJlIGdlbmVyYXRlZCBzb3VyY2UgZGlyZWN0b3J5Ci0gICAgLy8gaXMgYWRkZWQgdG8gY29tcGlsYXRpb24gc291cmNlIHBhdGgKLSAgICBwcm9qZWN0LmFkZENvbXBpbGVTb3VyY2VSb290KGdlbmVyYXRlZFNvdXJjZURpcmVjdG9yeS5nZXRDYW5vbmljYWxQYXRoKCkpOwotCi0gICAgRmFjZXNDb25maWdCZWFuIGZhY2VzQ29uZmlnID0gZ2V0RmFjZXNDb25maWcoKTsKLSAgICBpZiAoIWZhY2VzQ29uZmlnLmhhc0NvbXBvbmVudHMoKSAmJiAhZmFjZXNDb25maWcuaGFzQ29udmVydGVycygpICYmICFmYWNlc0NvbmZpZy5oYXNWYWxpZGF0b3JzKCkpCi0gICAgewotICAgICAgZ2V0TG9nKCkuaW5mbygiTm90aGluZyB0byBnZW5lcmF0ZSAtIG5vIGNvbXBvbmVudHMgZm91bmQiKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIEl0ZXJhdG9yIGNvbXBvbmVudHMgPSBmYWNlc0NvbmZpZy5jb21wb25lbnRzKCk7Ci0gICAgICBjb21wb25lbnRzID0gbmV3IEZpbHRlcmVkSXRlcmF0b3IoY29tcG9uZW50cywgbmV3IFNraXBGaWx0ZXIoKSk7Ci0gICAgICBjb21wb25lbnRzID0gbmV3IEZpbHRlcmVkSXRlcmF0b3IoY29tcG9uZW50cywgbmV3IENvbXBvbmVudFRhZ0ZpbHRlcigpKTsKLSAgICAgIGNvbXBvbmVudHMgPSBuZXcgRmlsdGVyZWRJdGVyYXRvcihjb21wb25lbnRzLCBuZXcgQ29tcG9uZW50VGFnQ2xhc3NGaWx0ZXIocGFja2FnZUNvbnRhaW5zKSk7Ci0KLSAgICAgIEl0ZXJhdG9yIHZhbGlkYXRvcnMgPSBmYWNlc0NvbmZpZy52YWxpZGF0b3JzKCk7Ci0gICAgICB2YWxpZGF0b3JzID0gbmV3IEZpbHRlcmVkSXRlcmF0b3IodmFsaWRhdG9ycywgbmV3IFZhbGlkYXRvclRhZ0ZpbHRlcigpKTsKLSAgICAgIHZhbGlkYXRvcnMgPSBuZXcgRmlsdGVyZWRJdGVyYXRvcih2YWxpZGF0b3JzLCBuZXcgVmFsaWRhdG9yVGFnQ2xhc3NGaWx0ZXIocGFja2FnZUNvbnRhaW5zKSk7Ci0KLSAgICAgIEl0ZXJhdG9yIGNvbnZlcnRlcnMgPSBmYWNlc0NvbmZpZy5jb252ZXJ0ZXJzKCk7Ci0gICAgICBjb252ZXJ0ZXJzID0gbmV3IEZpbHRlcmVkSXRlcmF0b3IoY29udmVydGVycywgbmV3IENvbnZlcnRlclRhZ0ZpbHRlcigpKTsKLSAgICAgIGNvbnZlcnRlcnMgPSBuZXcgRmlsdGVyZWRJdGVyYXRvcihjb252ZXJ0ZXJzLCBuZXcgQ29udmVydGVyVGFnQ2xhc3NGaWx0ZXIocGFja2FnZUNvbnRhaW5zKSk7Ci0KLSAgICAgIC8vIGluY3JlbWVudGFsIHVubGVzcyBmb3JjZWQKLSAgICAgIGlmICghZm9yY2UpCi0gICAgICB7Ci0gICAgICAgIGNvbXBvbmVudHMgPSBuZXcgRmlsdGVyZWRJdGVyYXRvcihjb21wb25lbnRzLCBuZXcgSWZDb21wb25lbnRNb2RpZmllZEZpbHRlcigpKTsKLSAgICAgICAgY29udmVydGVycyA9IG5ldyBGaWx0ZXJlZEl0ZXJhdG9yKGNvbnZlcnRlcnMsIG5ldyBJZkNvbnZlcnRlck1vZGlmaWVkRmlsdGVyKCkpOwotICAgICAgICB2YWxpZGF0b3JzID0gbmV3IEZpbHRlcmVkSXRlcmF0b3IodmFsaWRhdG9ycywgbmV3IElmVmFsaWRhdG9yTW9kaWZpZWRGaWx0ZXIoKSk7Ci0gICAgICB9Ci0KLSAgICAgIGlmICghY29tcG9uZW50cy5oYXNOZXh0KCkgJiYgIWNvbnZlcnRlcnMuaGFzTmV4dCgpICYmICF2YWxpZGF0b3JzLmhhc05leHQoKSkKLSAgICAgIHsKLSAgICAgICAgZ2V0TG9nKCkuaW5mbygiTm90aGluZyB0byBnZW5lcmF0ZSAtIGFsbCBKU1AgdGFncyBhcmUgdXAgdG8gZGF0ZSIpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBDb21wb25lbnRUYWdIYW5kbGVyR2VuZXJhdG9yIGNvbXBvbmVudEdlbiA9IG5ldyBDb21wb25lbnRUYWdIYW5kbGVyR2VuZXJhdG9yKCk7Ci0gICAgICAgIEFic3RyYWN0Q29udmVydGVyVGFnR2VuZXJhdG9yIGNvbnZlcnRlckdlbiA9IG51bGw7Ci0gICAgICAgIEFic3RyYWN0VmFsaWRhdG9yVGFnR2VuZXJhdG9yIHZhbGlkYXRvckdlbiA9IG51bGw7Ci0gICAgICAgIGlmICh0eXBlID09IG51bGwgfHwgInRyaW5pZGFkIi5lcXVhbHModHlwZSkpCi0gICAgICAgIHsKLSAgICAgICAgICBjb252ZXJ0ZXJHZW4gPSBuZXcgVHJpbmlkYWRDb252ZXJ0ZXJUYWdHZW5lcmF0b3IoaXMxMigpLCBnZXRMaWNlbnNlSGVhZGVyKCksIGdldExvZygpKTsKLSAgICAgICAgICB2YWxpZGF0b3JHZW4gPSBuZXcgVHJpbmlkYWRWYWxpZGF0b3JUYWdHZW5lcmF0b3IoaXMxMigpLCBnZXRMaWNlbnNlSGVhZGVyKCksIGdldExvZygpKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBjb252ZXJ0ZXJHZW4gPSBuZXcgTXlGYWNlc0NvbnZlcnRlclRhZ0dlbmVyYXRvcihpczEyKCksIGdldExpY2Vuc2VIZWFkZXIoKSwgZ2V0TG9nKCkpOwotICAgICAgICAgIHZhbGlkYXRvckdlbiA9IG5ldyBNeUZhY2VzVmFsaWRhdG9yVGFnR2VuZXJhdG9yKGlzMTIoKSwgZ2V0TGljZW5zZUhlYWRlcigpLCBnZXRMb2coKSk7ICAgIAotICAgICAgICB9Ci0gICAgICAgIGludCBjb3VudCA9IDA7Ci0gICAgICAgIHdoaWxlIChjb21wb25lbnRzLmhhc05leHQoKSkKLSAgICAgICAgewotICAgICAgICAgIENvbXBvbmVudEJlYW4gY29tcG9uZW50ID0gKENvbXBvbmVudEJlYW4pY29tcG9uZW50cy5uZXh0KCk7Ci0gICAgICAgICAgaWYgKCFjb21wb25lbnQuaXNUYWdDbGFzc0V4Y2x1ZGVkKCkpCi0gICAgICAgICAgewotICAgICAgICAgICAgICBjb21wb25lbnRHZW4uZ2VuZXJhdGVUYWdIYW5kbGVyKGNvbXBvbmVudCk7Ci0gICAgICAgICAgICAgIGNvdW50Kys7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHdoaWxlIChjb252ZXJ0ZXJzLmhhc05leHQoKSkKLSAgICAgICAgewotICAgICAgICAgIENvbnZlcnRlckJlYW4gY29udmVydGVyID0gKENvbnZlcnRlckJlYW4pY29udmVydGVycy5uZXh0KCk7Ci0gICAgICAgICAgaWYgKCFjb252ZXJ0ZXIuaXNUYWdDbGFzc0V4Y2x1ZGVkKCkpCi0gICAgICAgICAgewotICAgICAgICAgICAgICBjb252ZXJ0ZXJHZW4uZ2VuZXJhdGVUYWdIYW5kbGVyKGNvbnZlcnRlciwgZ2VuZXJhdGVkU291cmNlRGlyZWN0b3J5KTsKLSAgICAgICAgICAgICAgY291bnQrKzsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgd2hpbGUgKHZhbGlkYXRvcnMuaGFzTmV4dCgpKQotICAgICAgICB7Ci0gICAgICAgICAgVmFsaWRhdG9yQmVhbiB2YWxpZGF0b3IgPSAoVmFsaWRhdG9yQmVhbil2YWxpZGF0b3JzLm5leHQoKTsKLSAgICAgICAgICBpZiAoIXZhbGlkYXRvci5pc1RhZ0NsYXNzRXhjbHVkZWQoKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHZhbGlkYXRvckdlbi5nZW5lcmF0ZVRhZ0hhbmRsZXIodmFsaWRhdG9yLCBnZW5lcmF0ZWRTb3VyY2VEaXJlY3RvcnkpOwotICAgICAgICAgICAgICBjb3VudCsrOyAgICAKLSAgICAgICAgICB9ICAgICAgICAgIAotICAgICAgICB9Ci0gICAgICAgIGdldExvZygpLmluZm8oIkdlbmVyYXRlZCAiICsgY291bnQgKyAiIEpTUCB0YWcocykiKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBjbGFzcyBDb21wb25lbnRUYWdIYW5kbGVyR2VuZXJhdG9yCi0gIHsKLSAgICAKLSAgICBwcml2YXRlIFNldCBpbml0Q29tcG9uZW50TGlzdChDb21wb25lbnRCZWFuIGNvbXBvbmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZnVsbFN1cGVyY2xhc3NOYW1lKQotICAgIHsKLSAgICAgIFNldCBjb21wb25lbnRMaXN0ID0gbmV3IEhhc2hTZXQoKTsKLSAgICAgIGNvbXBvbmVudExpc3QuYWRkKGNvbXBvbmVudCk7Ci0KLSAgICAgIENvbXBvbmVudEJlYW4gbEJlYW4gPSBjb21wb25lbnQ7Ci0gICAgICB3aGlsZSAoKGxCZWFuID0gbEJlYW4ucmVzb2x2ZVN1cGVydHlwZSgpKSAhPSBudWxsICYmCi0gICAgICAgICAgICAgIWZ1bGxTdXBlcmNsYXNzTmFtZS5lcXVhbHMobEJlYW4uZ2V0VGFnQ2xhc3MoKSkpCi0gICAgICB7Ci0gICAgICAgIGdldExvZygpLmRlYnVnKGNvbXBvbmVudC5nZXRDb21wb25lbnRUeXBlKCkrCi0gICAgICAgICAgICAgICAgICAgICAgICI6IEFkZCBhZGRpdGlvbmFsIFRhZ3MgZnJvbTogIiArIGxCZWFuLmdldENvbXBvbmVudFR5cGUoKSk7Ci0gICAgICAgIGNvbXBvbmVudExpc3QuYWRkKGxCZWFuKTsKLSAgICAgIH0KLQotICAgICAgcmV0dXJuIGNvbXBvbmVudExpc3Q7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZ2VuZXJhdGVUYWdIYW5kbGVyKENvbXBvbmVudEJlYW4gY29tcG9uZW50KQotICAgIHsKLSAgICAgIENvbXBvbmVudFRhZ0dlbmVyYXRvciBnZW5lcmF0b3I7Ci0gICAgICBTZXQgY29tcG9uZW50TGlzdDsKLSAgICAgIAotICAgICAgU3RyaW5nIGZ1bGxTdXBlcmNsYXNzTmFtZSA9IGNvbXBvbmVudC5maW5kSnNwVGFnU3VwZXJjbGFzcygpOwotICAgICAgICAgICAgCi0gICAgICBpZiAoZnVsbFN1cGVyY2xhc3NOYW1lID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGdldExvZygpLndhcm4oIk1pc3NpbmcgSlNQIFRhZyBzdXBlcmNsYXNzIGZvciBjb21wb25lbnQ6ICIgKyBjb21wb25lbnQuZ2V0Q29tcG9uZW50Q2xhc3MoKQotICAgICAgICAgICAgICAgICAgICAgICsgIiwgZ2VuZXJhdGlvbiBvZiB0aGlzIFRhZyBpcyBza2lwcGVkIik7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH1lbHNlewotICAgICAgICAgIGlmIChpczEyKCkgJiYgImphdmF4LmZhY2VzLndlYmFwcC5VSUNvbXBvbmVudFRhZyIuZXF1YWxzSWdub3JlQ2FzZShmdWxsU3VwZXJjbGFzc05hbWUpKXsKLSAgICAgICAgICAgICAgZnVsbFN1cGVyY2xhc3NOYW1lID0gImphdmF4LmZhY2VzLndlYmFwcC5VSUNvbXBvbmVudEVMVGFnIjsKLSAgICAgICAgICB9ZWxzZSBpZiAoIWlzMTIoKSAmJiAiamF2YXguZmFjZXMud2ViYXBwLlVJQ29tcG9uZW50RUxUYWciLmVxdWFsc0lnbm9yZUNhc2UoZnVsbFN1cGVyY2xhc3NOYW1lKSl7Ci0gICAgICAgICAgICAgIGZ1bGxTdXBlcmNsYXNzTmFtZSA9ICJqYXZheC5mYWNlcy53ZWJhcHAuVUlDb21wb25lbnRUYWciOwotICAgICAgICAgIH0KLSAgICAgIH0KLSAgICAgIAotICAgICAgY29tcG9uZW50TGlzdCA9IGluaXRDb21wb25lbnRMaXN0KGNvbXBvbmVudCwgZnVsbFN1cGVyY2xhc3NOYW1lKTsKLSAgICAgIAotICAgICAgU3RyaW5nIGZ1bGxDbGFzc05hbWUgPSBjb21wb25lbnQuZ2V0VGFnQ2xhc3MoKTsKLSAgICAgIHRyeQotICAgICAgewotICAgICAgICBnZXRMb2coKS5kZWJ1ZygiR2VuZXJhdGluZyAiICsgZnVsbENsYXNzTmFtZSk7Ci0gICAgICAgIAotICAgICAgICBTdHJpbmcgc291cmNlUGF0aCA9IFV0aWwuY29udmVydENsYXNzVG9Tb3VyY2VQYXRoKGZ1bGxDbGFzc05hbWUsICIuamF2YSIpOwotICAgICAgICBGaWxlIHRhcmdldEZpbGUgPSBuZXcgRmlsZShnZW5lcmF0ZWRTb3VyY2VEaXJlY3RvcnksIHNvdXJjZVBhdGgpOwotICAgICAgICAKLSAgICAgICAgdGFyZ2V0RmlsZS5nZXRQYXJlbnRGaWxlKCkubWtkaXJzKCk7Ci0gICAgICAgIFN0cmluZ1dyaXRlciBzdyA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLSAgICAgICAgUHJldHR5V3JpdGVyIG91dCA9IG5ldyBQcmV0dHlXcml0ZXIoc3cpOwotICAgICAgICAKLSAgICAgICAgaWYgKGNvbXBvbmVudC5pc1RyaW5pZGFkQ29tcG9uZW50KCkpCi0gICAgICAgIHsKLSAgICAgICAgICBnZW5lcmF0b3IgPSBuZXcgVHJpbmlkYWRDb21wb25lbnRUYWdHZW5lcmF0b3IoX2lzMTIoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgZ2VuZXJhdG9yID0gbmV3IE15RmFjZXNDb21wb25lbnRUYWdHZW5lcmF0b3IoX2lzMTIoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBnZXRMb2coKS5kZWJ1ZygiR2VuZXJhdGluZyAiICsgZnVsbENsYXNzTmFtZSsiLCB3aXRoIGdlbmVyYXRvcjogIitnZW5lcmF0b3IuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotCi0gICAgICAgIFN0cmluZyBjbGFzc05hbWUgPSBVdGlsLmdldENsYXNzRnJvbUZ1bGxDbGFzcyhmdWxsQ2xhc3NOYW1lKTsKLSAgICAgICAgU3RyaW5nIHBhY2thZ2VOYW1lID0gVXRpbC5nZXRQYWNrYWdlRnJvbUZ1bGxDbGFzcyhmdWxsQ2xhc3NOYW1lKTsKLSAgICAgICAgCi0gICAgICAgIC8vIGhlYWRlci9jb3B5cmlnaHQKLSAgICAgICAgd3JpdGVQcmVhbWJsZShvdXQpOwotICAgICAgICAKLSAgICAgICAgLy8gcGFja2FnZQotICAgICAgICBvdXQucHJpbnRsbigicGFja2FnZSAiICsgcGFja2FnZU5hbWUgKyAiOyIpOwotICAgICAgICAKLSAgICAgICAgb3V0LnByaW50bG4oKTsKLSAgICAgICAgCi0gICAgICAgIFN0cmluZyBzdXBlcmNsYXNzTmFtZSA9IFV0aWwuZ2V0Q2xhc3NGcm9tRnVsbENsYXNzKGZ1bGxTdXBlcmNsYXNzTmFtZSk7Ci0gICAgICAgIGlmIChzdXBlcmNsYXNzTmFtZS5lcXVhbHMoY2xhc3NOYW1lKSkKLSAgICAgICAgewotICAgICAgICAgIHN1cGVyY2xhc3NOYW1lID0gZnVsbFN1cGVyY2xhc3NOYW1lOwotICAgICAgICB9Ci0gICAgICAgIFN0cmluZyBjb21wb25lbnRGdWxsQ2xhc3MgPSBjb21wb25lbnQuZ2V0Q29tcG9uZW50Q2xhc3MoKTsKLSAgICAgICAgU3RyaW5nIGNvbXBvbmVudENsYXNzID0gVXRpbC5nZXRDbGFzc0Zyb21GdWxsQ2xhc3MoY29tcG9uZW50RnVsbENsYXNzKTsKLSAgICAgICAgCi0gICAgICAgIGdlbmVyYXRvci53cml0ZUltcG9ydHMob3V0LCBudWxsLCBwYWNrYWdlTmFtZSwgZnVsbFN1cGVyY2xhc3NOYW1lLCBzdXBlcmNsYXNzTmFtZSwgY29tcG9uZW50TGlzdCk7Ci0gICAgICAgIAotICAgICAgICBnZW5lcmF0b3Iud3JpdGVDbGFzc0JlZ2luKG91dCwgY2xhc3NOYW1lLCBzdXBlcmNsYXNzTmFtZSwgY29tcG9uZW50LCBudWxsKTsKLSAgICAgICAgCi0gICAgICAgIGludCBtb2RpZmllcnMgPSBjb21wb25lbnQuZ2V0VGFnQ2xhc3NNb2RpZmllcnMoKTsKLSAgICAgICAgZ2VuZXJhdG9yLndyaXRlQ29uc3RydWN0b3Iob3V0LCBjb21wb25lbnQsIG1vZGlmaWVycyk7Ci0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgaWYgKCFNb2RpZmllci5pc0Fic3RyYWN0KG1vZGlmaWVycykpCi0gICAgICAgIHsKLSAgICAgICAgICBnZW5lcmF0b3Iud3JpdGVHZXRDb21wb25lbnRUeXBlKG91dCwgY29tcG9uZW50KTsKLSAgICAgICAgICBnZW5lcmF0b3Iud3JpdGVHZXRSZW5kZXJlclR5cGUob3V0LCBjb21wb25lbnQpOwotICAgICAgICB9Ci0KLSAgICAgICAgR2VuZXJhdGVKc3BUYWdsaWJzTW9qby50aGlzLndyaXRlQ3VzdG9tQ29tcG9uZW50VGFnSGFuZGxlckNvbnRlbnQob3V0LCBjb21wb25lbnQpOwotCi0gICAgICAgIGdlbmVyYXRvci53cml0ZVByb3BlcnR5TWVtYmVycyhvdXQsIGNvbXBvbmVudExpc3QpOwotICAgICAgICBnZW5lcmF0b3Iud3JpdGVTZXRQcm9wZXJ0aWVzTWV0aG9kKG91dCwgY29tcG9uZW50Q2xhc3MsIGNvbXBvbmVudExpc3QpOwotICAgICAgICBnZW5lcmF0b3Iud3JpdGVSZWxlYXNlTWV0aG9kKG91dCwgY29tcG9uZW50TGlzdCk7Ci0gICAgICAgIAotICAgICAgICBnZW5lcmF0b3Iud3JpdGVDbGFzc0VuZChvdXQpOwotICAgICAgICBvdXQuY2xvc2UoKTsKLSAgICAgICAgCi0gICAgICAgIC8vIGRlbGF5IHdyaXRlIGluIGNhc2Ugb2YgZXJyb3IKLSAgICAgICAgLy8gdGltZXN0YW1wIHNob3VsZCBub3QgYmUgdXBkYXRlZCB3aGVuIGFuIGVycm9yIG9jY3VycwotICAgICAgICAvLyBkZWxldGUgdGFyZ2V0IGZpbGUgZmlyc3QsIGJlY2F1c2UgaXQgaXMgcmVhZG9ubHkKLSAgICAgICAgdGFyZ2V0RmlsZS5kZWxldGUoKTsKLSAgICAgICAgRmlsZVdyaXRlciBmdyA9IG5ldyBGaWxlV3JpdGVyKHRhcmdldEZpbGUpOwotICAgICAgICBTdHJpbmdCdWZmZXIgYnVmID0gc3cuZ2V0QnVmZmVyKCk7Ci0gICAgICAgIGZ3LndyaXRlKGJ1Zi50b1N0cmluZygpKTsKLSAgICAgICAgZncuY2xvc2UoKTsKLSAgICAgICAgdGFyZ2V0RmlsZS5zZXRSZWFkT25seSgpOwotICAgICAgfQotICAgICAgY2F0Y2ggKFRocm93YWJsZSBlKQotICAgICAgewotICAgICAgICBnZXRMb2coKS5lcnJvcigiRXJyb3IgZ2VuZXJhdGluZyAiICsgZnVsbENsYXNzTmFtZSwgZSk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcHJvdGVjdGVkIGJvb2xlYW4gaXMxMigpCi0gIHsKLSAgICByZXR1cm4gIjEuMiIuZXF1YWxzKGpzZlZlcnNpb24pIHx8ICIxMiIuZXF1YWxzKGpzZlZlcnNpb24pOwotICB9Ci0KLSAgcHJpdmF0ZSBib29sZWFuIF9pczEyKCkKLSAgewotICAgIHJldHVybiBpczEyKCk7Ci0gIH0KLQotICBwcml2YXRlIGNsYXNzIElmQ29tcG9uZW50TW9kaWZpZWRGaWx0ZXIgZXh0ZW5kcyBDb21wb25lbnRGaWx0ZXIKLSAgewotICAgIHByb3RlY3RlZCBib29sZWFuIGFjY2VwdCgKLSAgICAgIENvbXBvbmVudEJlYW4gY29tcG9uZW50KQotICAgIHsKLSAgICAgIFN0cmluZyB0YWdDbGFzcyA9IGNvbXBvbmVudC5nZXRUYWdDbGFzcygpOwotICAgICAgU3RyaW5nIHNvdXJjZVBhdGggPSBVdGlsLmNvbnZlcnRDbGFzc1RvU291cmNlUGF0aCh0YWdDbGFzcywgIi5qYXZhIik7Ci0gICAgICBTdHJpbmcgdGVtcGxhdGVQYXRoID0gVXRpbC5jb252ZXJ0Q2xhc3NUb1NvdXJjZVBhdGgodGFnQ2xhc3MsICJUZW1wbGF0ZS5qYXZhIik7Ci0gICAgICBGaWxlIHRhcmdldEZpbGUgPSBuZXcgRmlsZShnZW5lcmF0ZWRTb3VyY2VEaXJlY3RvcnksIHNvdXJjZVBhdGgpOwotICAgICAgRmlsZSB0ZW1wbGF0ZUZpbGUgPSBuZXcgRmlsZSh0ZW1wbGF0ZVNvdXJjZURpcmVjdG9yeSwgdGVtcGxhdGVQYXRoKTsKLQotICAgICAgLy8gYWNjZXB0IGlmIHRlbXBsYXRlRmlsZSBpcyBuZXdlciBvciBjb21wb25lbnQgaGFzIGJlZW4gbW9kaWZpZWQKLSAgICAgIHJldHVybiAodGVtcGxhdGVGaWxlLmxhc3RNb2RpZmllZCgpID4gdGFyZ2V0RmlsZS5sYXN0TW9kaWZpZWQoKSB8fAotICAgICAgICAgICAgICBjb21wb25lbnQuaXNNb2RpZmllZFNpbmNlKHRhcmdldEZpbGUubGFzdE1vZGlmaWVkKCkpKTsKLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIGNsYXNzIElmQ29udmVydGVyTW9kaWZpZWRGaWx0ZXIgZXh0ZW5kcyBDb252ZXJ0ZXJGaWx0ZXIKLSAgewotICAgIHByb3RlY3RlZCBib29sZWFuIGFjY2VwdCgKLSAgICAgIENvbnZlcnRlckJlYW4gY29udmVydGVyKQotICAgIHsKLSAgICAgIFN0cmluZyB0YWdDbGFzcyA9IGNvbnZlcnRlci5nZXRUYWdDbGFzcygpOwotICAgICAgU3RyaW5nIHNvdXJjZVBhdGggPSBVdGlsLmNvbnZlcnRDbGFzc1RvU291cmNlUGF0aCh0YWdDbGFzcywgIi5qYXZhIik7Ci0gICAgICBTdHJpbmcgdGVtcGxhdGVQYXRoID0gVXRpbC5jb252ZXJ0Q2xhc3NUb1NvdXJjZVBhdGgodGFnQ2xhc3MsICJUZW1wbGF0ZS5qYXZhIik7Ci0gICAgICBGaWxlIHRhcmdldEZpbGUgPSBuZXcgRmlsZShnZW5lcmF0ZWRTb3VyY2VEaXJlY3RvcnksIHNvdXJjZVBhdGgpOwotICAgICAgRmlsZSB0ZW1wbGF0ZUZpbGUgPSBuZXcgRmlsZSh0ZW1wbGF0ZVNvdXJjZURpcmVjdG9yeSwgdGVtcGxhdGVQYXRoKTsKLQotICAgICAgLy8gYWNjZXB0IGlmIHRlbXBsYXRlRmlsZSBpcyBuZXdlciBvciBjb21wb25lbnQgaGFzIGJlZW4gbW9kaWZpZWQKLSAgICAgIHJldHVybiAodGVtcGxhdGVGaWxlLmxhc3RNb2RpZmllZCgpID4gdGFyZ2V0RmlsZS5sYXN0TW9kaWZpZWQoKSB8fAotICAgICAgICAgICAgICBjb252ZXJ0ZXIuaXNNb2RpZmllZFNpbmNlKHRhcmdldEZpbGUubGFzdE1vZGlmaWVkKCkpKTsKLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIGNsYXNzIElmVmFsaWRhdG9yTW9kaWZpZWRGaWx0ZXIgZXh0ZW5kcyBWYWxpZGF0b3JGaWx0ZXIKLSAgewotICAgIHByb3RlY3RlZCBib29sZWFuIGFjY2VwdCgKLSAgICAgIFZhbGlkYXRvckJlYW4gdmFsaWRhdG9yKQotICAgIHsKLSAgICAgIFN0cmluZyB0YWdDbGFzcyA9IHZhbGlkYXRvci5nZXRUYWdDbGFzcygpOwotICAgICAgU3RyaW5nIHNvdXJjZVBhdGggPSBVdGlsLmNvbnZlcnRDbGFzc1RvU291cmNlUGF0aCh0YWdDbGFzcywgIi5qYXZhIik7Ci0gICAgICBTdHJpbmcgdGVtcGxhdGVQYXRoID0gVXRpbC5jb252ZXJ0Q2xhc3NUb1NvdXJjZVBhdGgodGFnQ2xhc3MsICJUZW1wbGF0ZS5qYXZhIik7Ci0gICAgICBGaWxlIHRhcmdldEZpbGUgPSBuZXcgRmlsZShnZW5lcmF0ZWRTb3VyY2VEaXJlY3RvcnksIHNvdXJjZVBhdGgpOwotICAgICAgRmlsZSB0ZW1wbGF0ZUZpbGUgPSBuZXcgRmlsZSh0ZW1wbGF0ZVNvdXJjZURpcmVjdG9yeSwgdGVtcGxhdGVQYXRoKTsKLQotICAgICAgLy8gYWNjZXB0IGlmIHRlbXBsYXRlRmlsZSBpcyBuZXdlciBvciBjb21wb25lbnQgaGFzIGJlZW4gbW9kaWZpZWQKLSAgICAgIHJldHVybiAodGVtcGxhdGVGaWxlLmxhc3RNb2RpZmllZCgpID4gdGFyZ2V0RmlsZS5sYXN0TW9kaWZpZWQoKSB8fAotICAgICAgICAgICAgICB2YWxpZGF0b3IuaXNNb2RpZmllZFNpbmNlKHRhcmdldEZpbGUubGFzdE1vZGlmaWVkKCkpKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogQHBhcmFtZXRlciBleHByZXNzaW9uPSIke3Byb2plY3R9IgotICAgKiBAcmVxdWlyZWQKLSAgICogQHJlYWRvbmx5Ci0gICAqLwotICBwcm90ZWN0ZWQgTWF2ZW5Qcm9qZWN0IHByb2plY3Q7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbWV0ZXIKLSAgICogQHJlcXVpcmVkCi0gICAqLwotICBwcm90ZWN0ZWQgTWFwIHRhZ2xpYnM7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbWV0ZXIgZXhwcmVzc2lvbj0iTUVUQS1JTkYvbWF2ZW4tZmFjZXMtcGx1Z2luL2ZhY2VzLWNvbmZpZy54bWwiCi0gICAqIEByZXF1aXJlZAotICAgKiBAcmVhZG9ubHkKLSAgICovCi0gIHByb3RlY3RlZCBTdHJpbmcgcmVzb3VyY2VQYXRoOwotCi0gIC8qKgotICAgKiBAcGFyYW1ldGVyIGV4cHJlc3Npb249InNyYy9tYWluL2NvbmYiCi0gICAqIEByZXF1aXJlZAotICAgKi8KLSAgcHJvdGVjdGVkIEZpbGUgY29uZmlnU291cmNlRGlyZWN0b3J5OwotCi0gIC8qKgotICAgKiBAcGFyYW1ldGVyIGV4cHJlc3Npb249InNyYy9tYWluL2phdmEtdGVtcGxhdGVzIgotICAgKiBAcmVxdWlyZWQKLSAgICovCi0gIHByb3RlY3RlZCBGaWxlIHRlbXBsYXRlU291cmNlRGlyZWN0b3J5OwotCi0gIC8qKgotICAgKiBAcGFyYW1ldGVyIGV4cHJlc3Npb249IiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L21hdmVuLWZhY2VzLXBsdWdpbi9tYWluL2phdmEiCi0gICAqIEByZXF1aXJlZAotICAgKi8KLSAgcHJvdGVjdGVkIEZpbGUgZ2VuZXJhdGVkU291cmNlRGlyZWN0b3J5OwotCi0gIC8qKgotICAgKiBAcGFyYW1ldGVyIGV4cHJlc3Npb249IiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L21hdmVuLWZhY2VzLXBsdWdpbi9tYWluL3Jlc291cmNlcyIKLSAgICogQHJlcXVpcmVkCi0gICAqLwotICBwcm90ZWN0ZWQgRmlsZSBnZW5lcmF0ZWRSZXNvdXJjZXNEaXJlY3Rvcnk7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbWV0ZXIKLSAgICovCi0gIHByb3RlY3RlZCBTdHJpbmcgcGFja2FnZUNvbnRhaW5zID0gIiI7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbWV0ZXIKLSAgICovCi0gIHByb3RlY3RlZCBib29sZWFuIGZvcmNlOwotCi0KLSAgLyoqCi0gICAqIEBwYXJhbWV0ZXIKLSAgICovCi0gIHByb3RlY3RlZCBib29sZWFuIGRpc2FibGVJZEV4cHJlc3Npb25zOwotCi0gIC8qKgotICAgKiBAcGFyYW1ldGVyCi0gICAqLwotICBwcm90ZWN0ZWQgYm9vbGVhbiBjb2VyY2VTdHJpbmdzOwotCi0gIAotICAvKioKLSAgICogQHBhcmFtZXRlcgotICAgKi8KLSAgcHJpdmF0ZSBTdHJpbmcganNmVmVyc2lvbjsKLQotICAvKioKLSAgICogQHBhcmFtZXRlciBleHByZXNzaW9uPSJ0cmluaWRhZCIKLSAgICovCi0gIHByaXZhdGUgU3RyaW5nIHR5cGU7Ci0KLQotCi0gIHN0YXRpYyBmaW5hbCBwcml2YXRlIFN0cmluZyBfSlNQX1RBR19MSUJSQVJZX0RPQ1RZUEVfUFVCTElDID0KLSAgICAgICAgICAgICAgIi0vL1N1biBNaWNyb3N5c3RlbXMsIEluYy4vL0RURCBKU1AgVGFnIExpYnJhcnkgMS4yLy9FTiI7Ci0KLSAgc3RhdGljIGZpbmFsIHByaXZhdGUgU3RyaW5nIF9KU1BfVEFHX0xJQlJBUllfRE9DVFlQRV9TWVNURU0gPQotICAgICAgICAgICAgICAiaHR0cDovL2phdmEuc3VuLmNvbS9kdGQvd2ViLWpzcHRhZ2xpYnJhcnlfMV8yLmR0ZCI7Ci0KLSAgc3RhdGljIGZpbmFsIHByaXZhdGUgU3RyaW5nIF9KU1BfVEFHX0xJQlJBUllfRFREID0KLSAgICAiPCFET0NUWVBFIHRhZ2xpYiBQVUJMSUMgXG4iICsKLSAgICAiICBcIiIgKyBfSlNQX1RBR19MSUJSQVJZX0RPQ1RZUEVfUFVCTElDICsgIlwiXG4iICsKLSAgICAiICBcIiIgKyBfSlNQX1RBR19MSUJSQVJZX0RPQ1RZUEVfU1lTVEVNICsgIlwiID5cbiI7Ci0KLSAgc3RhdGljIGZpbmFsIHByaXZhdGUgU3RyaW5nIF9YSU5DTFVERV9KU1BfVEFHX0xJQlJBUllfRFREID0KLSAgICAiPCFET0NUWVBFIHRhZ2xpYiBQVUJMSUNcbiIgKwotICAgICIgIFwiIiArIF9KU1BfVEFHX0xJQlJBUllfRE9DVFlQRV9QVUJMSUMgKyAiXCJcbiIgKwotICAgICIgIFwiIiArIF9KU1BfVEFHX0xJQlJBUllfRE9DVFlQRV9TWVNURU0gKyAiXCIgW1xuIiArCi0gICAgIiAgICAgIDwhRUxFTUVOVCB4aTppbmNsdWRlIEVNUFRZPlxuIiArCi0gICAgIiAgICAgIDwhQVRUTElTVCB4aTppbmNsdWRlXG4iICsKLSAgICAiICAgICAgICAgIHhtbG5zOnhpIENEQVRBICNGSVhFRCAgXCIiICsgWEluY2x1ZGVGaWx0ZXIuWElOQ0xVREVfTkFNRVNQQUNFICsgIlwiXG4iICsKLSAgICAiICAgICAgICAgIGhyZWYgICAgIENEQVRBICNJTVBMSUVEXG4iICsKLSAgICAiICAgICAgICAgIHhwb2ludGVyIENEQVRBICNJTVBMSUVEPlxuIiArCi0gICAgIl0+XG4iOwotCi0gIHN0YXRpYyBmaW5hbCBwcml2YXRlIFNldCBfQ0FOX0NPRVJDRSA9IG5ldyBIYXNoU2V0KCk7Ci0gIHN0YXRpYwotICB7Ci0gICAgLy8gV2hhdD8gIENhbid0IGNvZXJjZSBTdHJpbmdzPyAgSG93IGNvdWxkIHRoYXQgYmU/ICBXZWxsLCB0YWtlIGEgbG9vayBhdDoKLSAgICAvLyAgIGh0dHA6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9BREZGQUNFUy0zNzcKLSAgICAvLyBUaGUgc2lsbHkgY29lcmNpb24gcnVsZXMgaW4gSlNQIGNvbnZlcnQgbnVsbCB0byB0aGUKLSAgICAvLyBlbXB0eSBzdHJpbmcuICBTbyBpdCdzIG5vdCB0aGF0IHdlIGNhbid0IGNvZXJjZSB0bwotICAgIC8vIFN0cmluZywgd2UganVzdCByZWFsbHksIHJlYWxseSBkb24ndCB3YW50IHRvLgotICAgIC8vICAgIF9DQU5fQ09FUkNFLmFkZCgiamF2YS5sYW5nLlN0cmluZyIpOwotICAgIC8vIFRPRE86IGNvbnNpZGVyIGdldHRpbmcgcmlkIG9mIGNvZXJjaW9uIHJ1bGVzIGZvcgotICAgIC8vIGFsbCBub24tcHJpbWl0aXZlcwotICAgIF9DQU5fQ09FUkNFLmFkZCgiamF2YS5sYW5nLkludGVnZXIiKTsKLSAgICBfQ0FOX0NPRVJDRS5hZGQoImphdmEubGFuZy5Mb25nIik7Ci0gICAgX0NBTl9DT0VSQ0UuYWRkKCJqYXZhLmxhbmcuQm9vbGVhbiIpOwotICAgIF9DQU5fQ09FUkNFLmFkZCgiamF2YS5sYW5nLkRvdWJsZSIpOwotICAgIF9DQU5fQ09FUkNFLmFkZCgiamF2YS5sYW5nLkZsb2F0Iik7Ci0gICAgX0NBTl9DT0VSQ0UuYWRkKCJqYXZhLmxhbmcuU2hvcnQiKTsKLSAgICBfQ0FOX0NPRVJDRS5hZGQoImphdmEubGFuZy5DaGFyYWN0ZXIiKTsKLSAgICBfQ0FOX0NPRVJDRS5hZGQoImphdmEubGFuZy5CeXRlIik7Ci0gICAgX0NBTl9DT0VSQ0UuYWRkKCJpbnQiKTsKLSAgICBfQ0FOX0NPRVJDRS5hZGQoImxvbmciKTsKLSAgICBfQ0FOX0NPRVJDRS5hZGQoImJvb2xlYW4iKTsKLSAgICBfQ0FOX0NPRVJDRS5hZGQoImRvdWJsZSIpOwotICAgIF9DQU5fQ09FUkNFLmFkZCgiZmxvYXQiKTsKLSAgICBfQ0FOX0NPRVJDRS5hZGQoInNob3J0Iik7Ci0gICAgX0NBTl9DT0VSQ0UuYWRkKCJjaGFyIik7Ci0gICAgX0NBTl9DT0VSQ0UuYWRkKCJieXRlIik7Ci0KLSAgICAvLyBTZWUgaHR0cDovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL0FERkZBQ0VTLTQ3NzogIGZvcgotICAgIC8vICJiaW5kaW5nIiBhbmQgImNvbnZlcnRlciIgcHJvcGVydGllcywgd2Ugd2FudCB0aGUgZGVmZXJyZWQtdHlwZXMKLSAgICAvLyB0aGVyZS4gIEhhcmRjb2RpbmcgdGhlc2UgaGVyZSBpcyB2ZXJ5IHVnbHksIGJ1dCBwdXR0aW5nIGluCi0gICAgLy8gYWxsIGNvZXJjaW9uIHJ1bGVzIHdvdWxkIGJyZWFrIGhvdyBUcmluaWRhZCBoYW5kbGVzIERhdGVzLAotICAgIC8vIGFuZCBMaXN0cyBvZiBDb2xvcnMsIGV0Yy4gLSBmb3IgdGhvc2UsIHdlIHdhbnQgdG8gc3VwcG9ydAotICAgIC8vIHJhdyBTdHJpbmdzICh3aGljaCB0aGUgSlNQIGVuZ2luZSBkb2Vzbid0IGtub3cgaG93IHRvIGNvZXJjZSkKLSAgICAvLyBhbmQgY29lcmNlIHRoZW0gb3Vyc2VsdmVzIGluIHRoZSB0YWcuCi0gICAgX0NBTl9DT0VSQ0UuYWRkKCJqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQiKTsKLSAgICBfQ0FOX0NPRVJDRS5hZGQoImphdmF4LmZhY2VzLmNvbnZlcnQuQ29udmVydGVyIik7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy9HZW5lcmF0ZU1hc3RlckZhY2VzQ29uZmlnTW9qby5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL0dlbmVyYXRlTWFzdGVyRmFjZXNDb25maWdNb2pvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkNjVkNjAuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL0dlbmVyYXRlTWFzdGVyRmFjZXNDb25maWdNb2pvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTQgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzOwotCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZE91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci0KLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTE91dHB1dEZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5Nb2pvRXhlY3V0aW9uRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wcm9qZWN0Lk1hdmVuUHJvamVjdDsKLWltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLnV0aWwuRGlyZWN0b3J5U2Nhbm5lcjsKLQotLyoqCi0gKiBAdmVyc2lvbiAkSWQkCi0gKiBAcmVxdWlyZXNEZXBlbmRlbmN5UmVzb2x1dGlvbiBjb21waWxlCi0gKiBAZ29hbCBnZW5lcmF0ZS1tYXN0ZXItZmFjZXMtY29uZmlnCi0gKiBAcGhhc2UgZ2VuZXJhdGUtcmVzb3VyY2VzCi0gKi8KLXB1YmxpYyBjbGFzcyBHZW5lcmF0ZU1hc3RlckZhY2VzQ29uZmlnTW9qbyBleHRlbmRzIEFic3RyYWN0RmFjZXNNb2pvCi17Ci0gIC8qKgotICAgKiBFeGVjdXRlIHRoZSBNb2pvLgotICAgKi8KLSAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBhZGRSZXNvdXJjZVJvb3QocHJvamVjdCwgdGFyZ2V0RGlyZWN0b3J5LmdldENhbm9uaWNhbFBhdGgoKSk7Ci0KLSAgICAgIC8vIFNjYW4gZm9yIC54cnRzIHNvdXJjZXMKLSAgICAgIFN0cmluZyBbXSB4bWxGaWxlczsKLSAgICAgIAotICAgICAgaWYgKGluaGVyaXRlZERpcmVjdG9yeSAhPSBudWxsKQotICAgICAgewotICAgICAgICAgIEhhc2hTZXQgc2V0ID0gbmV3IEhhc2hTZXQoKTsKLSAgICAgICAgIAotICAgICAgICAgIERpcmVjdG9yeVNjYW5uZXIgc2Nhbm5lciA9IG5ldyBEaXJlY3RvcnlTY2FubmVyKCk7Ci0gICAgICAgICAgc2Nhbm5lci5zZXRCYXNlZGlyKG5ldyBGaWxlKHNvdXJjZURpcmVjdG9yeSwgc291cmNlUGF0aCkpOwotICAgICAgICAgIHNjYW5uZXIuYWRkRGVmYXVsdEV4Y2x1ZGVzKCk7Ci0gICAgICAgICAgc2Nhbm5lci5zZXRJbmNsdWRlcyhuZXcgU3RyaW5nW10geyAiKiovKi54bWwiIH0pOwotICAgICAgICAgIGlmIChleGNsdWRlcyAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgICAgc2Nhbm5lci5zZXRFeGNsdWRlcyhleGNsdWRlcyk7Ci0gICAgICAgICAgfQotICAgICAgICAgIHNjYW5uZXIuc2NhbigpOwotICAgICAgICAgIAotICAgICAgICAgIFN0cmluZyBbXSBzb3VyY2VGaWxlcyA9IHNjYW5uZXIuZ2V0SW5jbHVkZWRGaWxlcygpOwotICAgICAgICAgIAotICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc291cmNlRmlsZXMubGVuZ3RoO2krKykKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHNldC5hZGQoc291cmNlRmlsZXNbaV0pOwotICAgICAgICAgIH0KLSAgICAgICAgICAKLSAgICAgICAgICBzY2FubmVyLnNldEJhc2VkaXIobmV3IEZpbGUoaW5oZXJpdGVkRGlyZWN0b3J5LHNvdXJjZVBhdGgpKTsKLSAgICAgICAgICBzY2FubmVyLnNjYW4oKTsKLSAgICAgICAgICAKLSAgICAgICAgICBzb3VyY2VGaWxlcyA9IHNjYW5uZXIuZ2V0SW5jbHVkZWRGaWxlcygpOwotICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc291cmNlRmlsZXMubGVuZ3RoO2krKykKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHNldC5hZGQoc291cmNlRmlsZXNbaV0pOwotICAgICAgICAgIH0gICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgIE9iamVjdCBbXSByZXN1bHQgPSBzZXQudG9BcnJheSgpOwotICAgICAgICAgIHhtbEZpbGVzID0gbmV3IFN0cmluZ1tyZXN1bHQubGVuZ3RoXTsKLSAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlc3VsdC5sZW5ndGg7IGkrKykKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHhtbEZpbGVzW2ldID0gKFN0cmluZykgcmVzdWx0W2ldOwotICAgICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgICBEaXJlY3RvcnlTY2FubmVyIHNjYW5uZXIgPSBuZXcgRGlyZWN0b3J5U2Nhbm5lcigpOwotICAgICAgICAgIHNjYW5uZXIuc2V0QmFzZWRpcihuZXcgRmlsZShzb3VyY2VEaXJlY3RvcnksIHNvdXJjZVBhdGgpKTsKLSAgICAgICAgICBzY2FubmVyLmFkZERlZmF1bHRFeGNsdWRlcygpOwotICAgICAgICAgIHNjYW5uZXIuc2V0SW5jbHVkZXMobmV3IFN0cmluZ1tdIHsgIioqLyoueG1sIiB9KTsKLSAgICAgICAgICBpZiAoZXhjbHVkZXMgIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHNjYW5uZXIuc2V0RXhjbHVkZXMoZXhjbHVkZXMpOwotICAgICAgICAgIH0KLSAgICAgICAgICBzY2FubmVyLnNjYW4oKTsKLSAgICAgICAgICAKLSAgICAgICAgICB4bWxGaWxlcyA9IHNjYW5uZXIuZ2V0SW5jbHVkZWRGaWxlcygpOwotICAgICAgfQotCi0gICAgICAKLQotICAgICAgbG9uZyBsYXN0TW9kaWZpZWQgPSAwTDsKLSAgICAgIGZvciAoaW50IGk9MDsgaSA8IHhtbEZpbGVzLmxlbmd0aDsgaSsrKQotICAgICAgewotICAgICAgICBsYXN0TW9kaWZpZWQgPSBNYXRoLm1heChsYXN0TW9kaWZpZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBGaWxlKHhtbEZpbGVzW2ldKS5sYXN0TW9kaWZpZWQoKSk7Ci0gICAgICB9Ci0KLSAgICAgIEZpbGUgdGFyZ2V0RmlsZSA9IG5ldyBGaWxlKHRhcmdldERpcmVjdG9yeSwgdGFyZ2V0UGF0aCk7Ci0KLSAgICAgIGlmICghZm9yY2UgJiYgdGFyZ2V0RmlsZS5sYXN0TW9kaWZpZWQoKSA+IGxhc3RNb2RpZmllZCkKLSAgICAgIHsKLSAgICAgICAgZ2V0TG9nKCkuaW5mbygiTm90aGluZyB0byBnZW5lcmF0ZSAtICIgKyB0YXJnZXRQYXRoICsgIiBpcyB1cCB0byBkYXRlIik7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGdldExvZygpLmluZm8oIkdlbmVyYXRpbmcgIiArIHRhcmdldFBhdGgpOwotCi0gICAgICAgIHRhcmdldEZpbGUuZGVsZXRlKCk7Ci0gICAgICAgIHRhcmdldEZpbGUuZ2V0UGFyZW50RmlsZSgpLm1rZGlycygpOwotCi0gICAgICAgIE91dHB1dFN0cmVhbSBvdXQgPSBuZXcgQnVmZmVyZWRPdXRwdXRTdHJlYW0obmV3IEZpbGVPdXRwdXRTdHJlYW0odGFyZ2V0RmlsZSkpOwotICAgICAgICBYTUxPdXRwdXRGYWN0b3J5IG91dHB1dEZhY3RvcnkgPSBYTUxPdXRwdXRGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAgIFhNTFN0cmVhbVdyaXRlciB3cml0ZXIgPSAgb3V0cHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1Xcml0ZXIob3V0KTsKLSAgICAgICAgd3JpdGVyLndyaXRlU3RhcnREb2N1bWVudCgiMS4wIik7Ci0gICAgICAgIHdyaXRlci53cml0ZUNoYXJhY3RlcnMoIlxuIik7Ci0gICAgICAgIHdyaXRlci53cml0ZVN0YXJ0RWxlbWVudCgiZmFjZXMtY29uZmlnIik7Ci0gICAgICAgIHdyaXRlci53cml0ZURlZmF1bHROYW1lc3BhY2UoImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIpOwotICAgICAgICB3cml0ZXIud3JpdGVOYW1lc3BhY2UoInhpIiwgImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWEluY2x1ZGUiKTsKLSAgICAgICAgd3JpdGVyLndyaXRlQ2hhcmFjdGVycygiXG4iKTsKLSAgICAgICAgZm9yIChpbnQgaT0wOyBpIDwgeG1sRmlsZXMubGVuZ3RoOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICBTdHJpbmcgeG1sRmlsZSA9IHhtbEZpbGVzW2ldOwotICAgICAgICAgIGlmIChGaWxlLnNlcGFyYXRvckNoYXIgPT0gJ1xcJykKLSAgICAgICAgICB7Ci0gICAgICAgICAgICB4bWxGaWxlID0geG1sRmlsZS5yZXBsYWNlQWxsKCJcXFxcIiwgIi8iKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgd3JpdGVyLndyaXRlQ2hhcmFjdGVycygiICAiKTsKLSAgICAgICAgICB3cml0ZXIud3JpdGVTdGFydEVsZW1lbnQoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWEluY2x1ZGUiLCAiaW5jbHVkZSIpOwotICAgICAgICAgIHdyaXRlci53cml0ZUF0dHJpYnV0ZSgiaHJlZiIsIHhtbEZpbGUpOwotICAgICAgICAgIHdyaXRlci53cml0ZUF0dHJpYnV0ZSgieHBvaW50ZXIiLCAiL2ZhY2VzLWNvbmZpZy8qIik7Ci0gICAgICAgICAgd3JpdGVyLndyaXRlRW5kRWxlbWVudCgpOwotICAgICAgICAgIHdyaXRlci53cml0ZUNoYXJhY3RlcnMoIlxuIik7Ci0gICAgICAgIH0KLSAgICAgICAgd3JpdGVyLndyaXRlRW5kRG9jdW1lbnQoKTsKLSAgICAgICAgd3JpdGVyLmNsb3NlKCk7Ci0KLSAgICAgICAgdGFyZ2V0RmlsZS5zZXRSZWFkT25seSgpOwotICAgICAgfQotICAgIH0KLSAgICBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgdGhyb3cgbmV3IE1vam9FeGVjdXRpb25FeGNlcHRpb24oIkVycm9yIGR1cmluZyBnZW5lcmF0aW9uIiwgZSk7Ci0gICAgfQotICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uKCJFcnJvciBkdXJpbmcgZ2VuZXJhdGlvbiIsIGUpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBAcGFyYW1ldGVyIGV4cHJlc3Npb249IiR7cHJvamVjdH0iCi0gICAqIEByZWFkb25seQotICAgKi8KLSAgcHJpdmF0ZSBNYXZlblByb2plY3QgcHJvamVjdDsKLQotICAvKioKLSAgICogQHBhcmFtZXRlcgotICAgKi8KLSAgcHJpdmF0ZSBTdHJpbmdbXSBleGNsdWRlczsKLQotIC8qKgotICAgKiBAcGFyYW1ldGVyIGV4cHJlc3Npb249Ik1FVEEtSU5GL21hdmVuLWZhY2VzLXBsdWdpbiI7Ci0gICAqIEByZXF1aXJlZAotICAgKi8KLSAgcHJpdmF0ZSBTdHJpbmcgc291cmNlUGF0aDsKLQotICAvKioKLSAgICogQHBhcmFtZXRlciBleHByZXNzaW9uPSJzcmMvbWFpbi9yZXNvdXJjZXMiCi0gICAqIEByZXF1aXJlZAotICAgKi8KLSAgcHJpdmF0ZSBGaWxlIHNvdXJjZURpcmVjdG9yeTsKLSAgCi0gIC8qKgotICAgKiBAcGFyYW1ldGVyIAotICAgKi8gIAotICBwcml2YXRlIEZpbGUgaW5oZXJpdGVkRGlyZWN0b3J5OwotICAKLSAgLyoqCi0gICAqIEBwYXJhbWV0ZXIKLSAgICogQHJlYWRvbmx5Ci0gICAqLwotICBwcml2YXRlIFN0cmluZyB0YXJnZXRQYXRoID0gIk1FVEEtSU5GL21hdmVuLWZhY2VzLXBsdWdpbi9mYWNlcy1jb25maWcueG1sIjsKLQotICAvKioKLSAgICogQHBhcmFtZXRlciBleHByZXNzaW9uPSIke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9tYXZlbi1mYWNlcy1wbHVnaW4vbWFpbi9yZXNvdXJjZXMiCi0gICAqIEByZXF1aXJlZAotICAgKi8KLSAgcHJpdmF0ZSBGaWxlIHRhcmdldERpcmVjdG9yeTsKLQotICAvKioKLSAgICogQHBhcmFtZXRlcgotICAgKi8KLSAgcHJpdmF0ZSBib29sZWFuIGZvcmNlOwotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL0dlbmVyYXRlUmVuZGVyZXJNYXBNb2pvLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvR2VuZXJhdGVSZW5kZXJlck1hcE1vam8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDc3YzJjNS4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvR2VuZXJhdGVSZW5kZXJlck1hcE1vam8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNiArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5Nb2pvRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucHJvamVjdC5NYXZlblByb2plY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy5wYXJzZS5GYWNlc0NvbmZpZ0JlYW47Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy5wYXJzZS5SZW5kZXJLaXRCZWFuOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMucGFyc2UuUmVuZGVyZXJCZWFuOwotCi0vKioKLSAqIEB2ZXJzaW9uICRJZCQKLSAqIEByZXF1aXJlc0RlcGVuZGVuY3lSZXNvbHV0aW9uIGNvbXBpbGUKLSAqIEBnb2FsIGdlbmVyYXRlLXJlbmRlcmVyLW1hcAotICogQHBoYXNlIGdlbmVyYXRlLXNvdXJjZXMKLSAqLwotcHVibGljIGNsYXNzIEdlbmVyYXRlUmVuZGVyZXJNYXBNb2pvIGV4dGVuZHMgQWJzdHJhY3RGYWNlc01vam8KLXsKLSAgLyoqCi0gICAqIEV4ZWN1dGUgdGhlIE1vam8uCi0gICAqLwotICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIE1vam9FeGVjdXRpb25FeGNlcHRpb24KLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIHByb2Nlc3NJbmRleChwcm9qZWN0LCByZXNvdXJjZVBhdGgpOwotICAgICAgX2dlbmVyYXRlUmVuZGVyZXJNYXAoKTsKLSAgICB9Ci0gICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgdGhyb3cgbmV3IE1vam9FeGVjdXRpb25FeGNlcHRpb24oIkVycm9yIGdlbmVyYXRpbmcgY29tcG9uZW50cyIsIGUpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBHZW5lcmF0ZXMgcGFyc2VkIGNvbXBvbmVudHMuCi0gICAqLwotICBwcml2YXRlIHZvaWQgX2dlbmVyYXRlUmVuZGVyZXJNYXAoKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgewotICAgIC8vIE1ha2Ugc3VyZSBnZW5lcmF0ZWQgc291cmNlIGRpcmVjdG9yeQotICAgIC8vIGlzIGFkZGVkIHRvIGNvbXBpbGF0aW9uIHNvdXJjZSBwYXRoCi0gICAgcHJvamVjdC5hZGRDb21waWxlU291cmNlUm9vdChnZW5lcmF0ZWRTb3VyY2VEaXJlY3RvcnkuZ2V0Q2Fub25pY2FsUGF0aCgpKTsKLQotICAgIEZhY2VzQ29uZmlnQmVhbiBmYWNlc0NvbmZpZyA9IGdldEZhY2VzQ29uZmlnKCk7Ci0gICAgaWYgKCFmYWNlc0NvbmZpZy5oYXNSZW5kZXJLaXRzKCkpCi0gICAgewotICAgICAgZ2V0TG9nKCkuaW5mbygiTm90aGluZyB0byBnZW5lcmF0ZSAtIG5vIHJlbmRlcmtpdHMgZm91bmQiKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIEl0ZXJhdG9yIHJlbmRlcmtpdHMgPSBmYWNlc0NvbmZpZy5yZW5kZXJLaXRzKCk7Ci0gICAgICB3aGlsZSAocmVuZGVya2l0cy5oYXNOZXh0KCkpCi0gICAgICB7Ci0gICAgICAgIFJlbmRlcktpdEJlYW4gcmVuZGVya2l0ID0gKFJlbmRlcktpdEJlYW4pIHJlbmRlcmtpdHMubmV4dCgpOwotICAgICAgICBTdHJpbmcgaWQgPSByZW5kZXJraXQuZ2V0UmVuZGVyS2l0SWQoKTsKLSAgICAgICAgaWYgKCFpZC5zdGFydHNXaXRoKHJlbmRlcktpdFByZWZpeCkpCi0gICAgICAgIHsKLSAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotCi0gICAgICAgIF93cml0ZVJlbmRlcktpdE1hcChyZW5kZXJraXQpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgdm9pZCBfd3JpdGVSZW5kZXJLaXRNYXAoUmVuZGVyS2l0QmVhbiByaykgdGhyb3dzIElPRXhjZXB0aW9uCi0gIHsKLSAgICBGaWxlIG91dEZpbGUgPSBuZXcgRmlsZShnZW5lcmF0ZWRTb3VyY2VEaXJlY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIi9NRVRBLUlORi8iICsgcmsuZ2V0UmVuZGVyS2l0SWQoKSArICIucmVuZGVya2l0Iik7Ci0gICAgRmlsZVdyaXRlciBmdyA9IG5ldyBGaWxlV3JpdGVyKG91dEZpbGUpOwotICAgIFByaW50V3JpdGVyIHB3ID0gbmV3IFByaW50V3JpdGVyKGZ3KTsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBJdGVyYXRvciByZW5kZXJlcnMgPSByay5yZW5kZXJlcnMoKTsKLSAgICAgIHdoaWxlIChyZW5kZXJlcnMuaGFzTmV4dCgpKQotICAgICAgewotICAgICAgICBSZW5kZXJlckJlYW4gciA9IChSZW5kZXJlckJlYW4pIHJlbmRlcmVycy5uZXh0KCk7Ci0gICAgICAgIHB3LnByaW50KHIuZ2V0Q29tcG9uZW50RmFtaWx5KCkpOwotICAgICAgICBwdy5wcmludCgnfCcpOwotICAgICAgICBwdy5wcmludChyLmdldFJlbmRlcmVyVHlwZSgpKTsKLSAgICAgICAgcHcucHJpbnQoJz0nKTsKLSAgICAgICAgcHcucHJpbnRsbihyLmdldFJlbmRlcmVyQ2xhc3MoKSk7Ci0gICAgICB9Ci0gICAgfQotICAgIGZpbmFsbHkKLSAgICB7Ci0gICAgICBwdy5jbG9zZSgpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBAcGFyYW1ldGVyIGV4cHJlc3Npb249IiR7cHJvamVjdH0iCi0gICAqIEByZWFkb25seQotICAgKi8KLSAgcHJpdmF0ZSBNYXZlblByb2plY3QgcHJvamVjdDsKLQotICAvKioKLSAgICogQHBhcmFtZXRlcgotICAgKiBAcmVhZG9ubHkKLSAgICovCi0gIHByaXZhdGUgU3RyaW5nIHJlc291cmNlUGF0aCA9ICJNRVRBLUlORi9tYXZlbi1mYWNlcy1wbHVnaW4vaW5kZXgubHN0IjsKLQotICAvKioKLSAgICogQHBhcmFtZXRlciBleHByZXNzaW9uPSIke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9tYXZlbi1mYWNlcy1wbHVnaW4vbWFpbi9yZXNvdXJjZXMiCi0gICAqIEByZXF1aXJlZAotICAgKi8KLSAgcHJpdmF0ZSBGaWxlIGdlbmVyYXRlZFNvdXJjZURpcmVjdG9yeTsKLQotICAvKioKLSAgICogQHBhcmFtZXRlcgotICAgKiBAcmVxdWlyZWQKLSAgICovCi0gIHByaXZhdGUgU3RyaW5nIHJlbmRlcktpdFByZWZpeDsKLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy9nZW5lcmF0b3IvQ2xhc3NHZW5lcmF0b3IuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy9nZW5lcmF0b3IvQ2xhc3NHZW5lcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjhkOGY1MC4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvZ2VuZXJhdG9yL0NsYXNzR2VuZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMuZ2VuZXJhdG9yOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy5pby5QcmV0dHlXcml0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy5wYXJzZS5Db21wb25lbnRCZWFuOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMudXRpbC5Tb3VyY2VUZW1wbGF0ZTsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLS8qKgotICogR2VuZXJhdG9yCi0gKgotICogQGF1dGhvciBCcnVubyBBcmFuZGEgKGxhdGVzdCBtb2RpZmljYXRpb24gYnkgJEF1dGhvciQpCi0gKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAotICovCi1wdWJsaWMgaW50ZXJmYWNlIENsYXNzR2VuZXJhdG9yCi17Ci0gIHZvaWQgd3JpdGVJbXBvcnRzKAotICAgICAgUHJldHR5V3JpdGVyIG91dCwKLSAgICAgIFNvdXJjZVRlbXBsYXRlIHRlbXBsYXRlLAotICAgICAgU3RyaW5nIHBhY2thZ2VOYW1lLAotICAgICAgU3RyaW5nIGZ1bGxTdXBlcmNsYXNzTmFtZSwKLSAgICAgIFN0cmluZyBzdXBlcmNsYXNzTmFtZSwKLSAgICAgIENvbXBvbmVudEJlYW4gY29tcG9uZW50KTsKLQotICB2b2lkIHdyaXRlSW1wb3J0cygKLSAgICAgIFByZXR0eVdyaXRlciBvdXQsCi0gICAgICBTb3VyY2VUZW1wbGF0ZSB0ZW1wbGF0ZSwKLSAgICAgIFN0cmluZyBwYWNrYWdlTmFtZSwKLSAgICAgIFN0cmluZyBmdWxsU3VwZXJjbGFzc05hbWUsCi0gICAgICBTdHJpbmcgc3VwZXJjbGFzc05hbWUsCi0gICAgICBDb2xsZWN0aW9uIGNvbXBvbmVudHMpOwotCi0gIHZvaWQgd3JpdGVDbGFzc0JlZ2luKAotICAgICAgUHJldHR5V3JpdGVyIG91dCwKLSAgICAgIFN0cmluZyBjbGFzc05hbWUsCi0gICAgICBTdHJpbmcgc3VwZXJjbGFzc05hbWUsCi0gICAgICBDb21wb25lbnRCZWFuIGNvbXBvbmVudCwKLSAgICAgIFNvdXJjZVRlbXBsYXRlIHRlbXBsYXRlKTsKLQotICB2b2lkIHdyaXRlQ29uc3RydWN0b3IoCi0gICAgICBQcmV0dHlXcml0ZXIgb3V0LAotICAgICAgQ29tcG9uZW50QmVhbiBjb21wb25lbnQsCi0gICAgICBpbnQgbW9kaWZpZXJzKSB0aHJvd3MgSU9FeGNlcHRpb247Ci0KLSAgdm9pZCB3cml0ZUNsYXNzRW5kKAotICAgICAgUHJldHR5V3JpdGVyIG91dCk7Ci0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy9nZW5lcmF0b3IvR2VuZXJhdG9ySGVscGVyLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvZ2VuZXJhdG9yL0dlbmVyYXRvckhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYWI2ZDVkLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy9nZW5lcmF0b3IvR2VuZXJhdG9ySGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjggKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLmdlbmVyYXRvcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMuaW8uUHJldHR5V3JpdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMucGFyc2UuUHJvcGVydHlCZWFuOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMudXRpbC5GaWx0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy51dGlsLkZpbHRlcmVkSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy51dGlsLlV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotLyoqCi0gKiBUT0RPOiBjb21tZW50IHRoaXMhCi0gKgotICogQGF1dGhvciBCcnVubyBBcmFuZGEgKGxhdGVzdCBtb2RpZmljYXRpb24gYnkgJEF1dGhvciQpCi0gKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAotICovCi1wdWJsaWMgY2xhc3MgR2VuZXJhdG9ySGVscGVyCi17Ci0gIHByaXZhdGUgR2VuZXJhdG9ySGVscGVyKCkKLSAgewotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzQ29udmVydGVyKAotICAgICAgU3RyaW5nIHByb3BDbGFzcykKLSAgewotICAgIHJldHVybiAoImphdmF4LmZhY2VzLmNvbnZlcnQuQ29udmVydGVyIi5lcXVhbHMocHJvcENsYXNzKSk7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNLZXlTdHJva2UoCi0gICAgICBTdHJpbmcgcHJvcENsYXNzKQotICB7Ci0gICAgcmV0dXJuICgiamF2YXguc3dpbmcuS2V5U3Ryb2tlIi5lcXVhbHMocHJvcENsYXNzKSk7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNBV1RLZXlTdHJva2UoCi0gICAgICBTdHJpbmcgcHJvcENsYXNzKQotICB7Ci0gICAgcmV0dXJuICgiamF2YS5hd3QuQVdUS2V5U3Ryb2tlIi5lcXVhbHMocHJvcENsYXNzKSk7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNOdW1iZXIoCi0gICAgICBTdHJpbmcgcHJvcENsYXNzKQotICB7Ci0gICAgcmV0dXJuICgiamF2YS5sYW5nLk51bWJlciIuZXF1YWxzKHByb3BDbGFzcykpOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzQ29sb3JMaXN0KAotICAgICAgU3RyaW5nIHByb3BDbGFzcywKLSAgICAgIFN0cmluZ1tdIHByb3BDbGFzc1BhcmFtcykKLSAgewotICAgIHJldHVybiAoImphdmEudXRpbC5MaXN0Ii5lcXVhbHMocHJvcENsYXNzKSAmJgotICAgICAgICBwcm9wQ2xhc3NQYXJhbXMubGVuZ3RoID09IDEgJiYKLSAgICAgICAgImphdmEuYXd0LkNvbG9yIi5lcXVhbHMocHJvcENsYXNzUGFyYW1zWzBdKSk7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNDb2xvcigKLSAgICAgIFN0cmluZyBwcm9wQ2xhc3MpCi0gIHsKLSAgICByZXR1cm4gKCJqYXZhLmF3dC5Db2xvciIuZXF1YWxzKHByb3BDbGFzcykpOwotICB9ICAKLQotICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNBY3Rpb24oUHJvcGVydHlCZWFuIHByb3BlcnR5KQotICB7Ci0gICAgcmV0dXJuIChwcm9wZXJ0eS5nZXRDbGFzcygpLmVxdWFscygiamF2YXguZWwuTWV0aG9kRXhwcmVzc2lvbiIpCi0gICAgICAgICYmIHByb3BlcnR5LmdldEpzcFByb3BlcnR5TmFtZSgpLmVxdWFscygiYWN0aW9uIikpOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzQWN0aW9uTGlzdGVuZXIoUHJvcGVydHlCZWFuIHByb3BlcnR5LCBib29sZWFuIGlzMTIpCi0gIHsKLSAgICByZXR1cm4gKHByb3BlcnR5LmdldEpzcFByb3BlcnR5TmFtZSgpLmVxdWFscygiYWN0aW9uTGlzdGVuZXIiKSAmJgotICAgICAgICAoKHByb3BlcnR5LmlzTWV0aG9kRXhwcmVzc2lvbigpKSB8fCAoaXMxMiAmJiBwcm9wZXJ0eS5pc01ldGhvZEJpbmRpbmcoKSkpKTsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1ZhbHVlQ2hhbmdlTGlzdGVuZXIoUHJvcGVydHlCZWFuIHByb3BlcnR5LCBib29sZWFuIGlzMTIpCi0gIHsKLSAgICByZXR1cm4gKHByb3BlcnR5LmdldEpzcFByb3BlcnR5TmFtZSgpLmVxdWFscygidmFsdWVDaGFuZ2VMaXN0ZW5lciIpICYmCi0gICAgICAgICgocHJvcGVydHkuaXNNZXRob2RFeHByZXNzaW9uKCkpIHx8IChpczEyICYmIHByb3BlcnR5LmlzTWV0aG9kQmluZGluZygpKSkpOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzVmFsaWRhdG9yKFByb3BlcnR5QmVhbiBwcm9wZXJ0eSwgYm9vbGVhbiBpczEyKQotICB7Ci0gICAgcmV0dXJuIChwcm9wZXJ0eS5nZXRKc3BQcm9wZXJ0eU5hbWUoKS5lcXVhbHMoInZhbGlkYXRvciIpKSAmJgotICAgICAgICAoKHByb3BlcnR5LmlzTWV0aG9kRXhwcmVzc2lvbigpKSB8fCAoaXMxMiAmJiBwcm9wZXJ0eS5pc01ldGhvZEJpbmRpbmcoKSkpOwotICB9Ci0KLSAgc3RhdGljIHB1YmxpYyB2b2lkIHdyaXRlSW1wb3J0cygKLSAgICAgIFByZXR0eVdyaXRlciBvdXQsCi0gICAgICBTdHJpbmcgcGFja2FnZU5hbWUsCi0gICAgICBTZXQgaW1wb3J0cykKLSAgewotICAgIEl0ZXJhdG9yIGl0ZXJhdG9yID0gaW1wb3J0cy5pdGVyYXRvcigpOwotICAgIGl0ZXJhdG9yID0gbmV3IEZpbHRlcmVkSXRlcmF0b3IoaXRlcmF0b3IsCi0gICAgICAgIG5ldyBQYWNrYWdlSW1wb3J0c0ZpbHRlcihwYWNrYWdlTmFtZSkpOwotICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpCi0gICAgewotICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9IChTdHJpbmcpIGl0ZXJhdG9yLm5leHQoKTsKLSAgICAgIG91dC5wcmludGxuKCJpbXBvcnQgIiArIGNsYXNzTmFtZSArICI7Iik7Ci0gICAgfQotCi0gICAgb3V0LnByaW50bG4oKTsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgY2xhc3MgUGFja2FnZUltcG9ydHNGaWx0ZXIgaW1wbGVtZW50cyBGaWx0ZXIKLSAgewotICAgIHB1YmxpYyBQYWNrYWdlSW1wb3J0c0ZpbHRlcigKLSAgICAgICAgU3RyaW5nIHBhY2thZ2VOYW1lKQotICAgIHsKLSAgICAgIF9wYWNrYWdlTmFtZSA9IHBhY2thZ2VOYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGFjY2VwdCgKLSAgICAgICAgT2JqZWN0IG9iamVjdCkKLSAgICB7Ci0gICAgICBTdHJpbmcgY2xhc3NOYW1lID0gKFN0cmluZykgb2JqZWN0OwotICAgICAgU3RyaW5nIHBhY2thZ2VOYW1lID0gVXRpbC5nZXRQYWNrYWdlRnJvbUZ1bGxDbGFzcyhjbGFzc05hbWUpOwotICAgICAgcmV0dXJuICghcGFja2FnZU5hbWUuZXF1YWxzKF9wYWNrYWdlTmFtZSkgJiYKLSAgICAgICAgICAhcGFja2FnZU5hbWUuZXF1YWxzKCJqYXZhLmxhbmciKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgX3BhY2thZ2VOYW1lOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0SnNwUHJvcGVydHlUeXBlKFByb3BlcnR5QmVhbiBwcm9wZXJ0eSwgYm9vbGVhbiBpczEyKQotICB7Ci0gICAgaWYgKHByb3BlcnR5LmlzTWV0aG9kRXhwcmVzc2lvbigpKQotICAgIHsKLSAgICAgIHJldHVybiAiTWV0aG9kRXhwcmVzc2lvbiI7Ci0gICAgfQotCi0gICAgaWYgKGlzMTIgJiYgcHJvcGVydHkuaXNNZXRob2RCaW5kaW5nKCkpCi0gICAgewotICAgICAgcmV0dXJuICJNZXRob2RFeHByZXNzaW9uIjsKLSAgICB9Ci0KLSAgICBpZiAoaXMxMikKLSAgICB7Ci0gICAgICBpZiAoIXByb3BlcnR5LmlzTGl0ZXJhbE9ubHkoKSkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuICJWYWx1ZUV4cHJlc3Npb24iOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICByZXR1cm4gcHJvcGVydHkuZ2V0UHJvcGVydHlDbGFzcygpOwotICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiAiU3RyaW5nIjsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL2dlbmVyYXRvci9jb21wb25lbnQvQWJzdHJhY3RDb21wb25lbnRHZW5lcmF0b3IuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy9nZW5lcmF0b3IvY29tcG9uZW50L0Fic3RyYWN0Q29tcG9uZW50R2VuZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjNjlmZDMuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL2dlbmVyYXRvci9jb21wb25lbnQvQWJzdHJhY3RDb21wb25lbnRHZW5lcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNTggKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLmdlbmVyYXRvci5jb21wb25lbnQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLmdlbmVyYXRvci5HZW5lcmF0b3JIZWxwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy5pby5QcmV0dHlXcml0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy5wYXJzZS4qOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMudXRpbC5GaWx0ZXJlZEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMudXRpbC5Qcm9wZXJ0eUZpbHRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLnV0aWwuU291cmNlVGVtcGxhdGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy51dGlsLlV0aWw7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1vZGlmaWVyOwotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5NYXRjaGVyOwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RDb21wb25lbnRHZW5lcmF0b3IgaW1wbGVtZW50cyBDb21wb25lbnRHZW5lcmF0b3IKLXsKLQotICBwcml2YXRlIExvZyBfbG9nOwotICBib29sZWFuIF9pczEyOwotCi0gIHB1YmxpYyBBYnN0cmFjdENvbXBvbmVudEdlbmVyYXRvcihMb2cgbG9nLCBib29sZWFuIGlzMTIpCi0gIHsKLSAgICBfbG9nID0gbG9nOwotICAgIF9pczEyID0gaXMxMjsKLSAgfQotCi0gIHByb3RlY3RlZCBMb2cgZ2V0TG9nKCkKLSAgewotICAgIHJldHVybiBfbG9nOwotICB9Ci0KLSAgcHVibGljIHZvaWQgd3JpdGVDbGFzc0JlZ2luKAotICAgICAgUHJldHR5V3JpdGVyIG91dCwKLSAgICAgIFN0cmluZyBjbGFzc05hbWUsCi0gICAgICBTdHJpbmcgc3VwZXJjbGFzc05hbWUsCi0gICAgICBDb21wb25lbnRCZWFuIGNvbXBvbmVudCwKLSAgICAgIFNvdXJjZVRlbXBsYXRlIHRlbXBsYXRlKQotICB7Ci0gICAgb3V0LnByaW50bG4oIi8qKiIpOwotCi0gICAgLy8gVE9ETzogcmVzdG9yZSBkZXNjcmlwdGlvbiAobmVlZHMgZXNjYXBpbmc/KQotLy8gICAgU3RyaW5nIGRlc2NyaXB0aW9uID0gY29tcG9uZW50LmdldERlc2NyaXB0aW9uKCk7Ci0vLyAgICBpZiAoZGVzY3JpcHRpb24gIT0gbnVsbCkKLS8vICAgIHsKLS8vICAgICAgb3V0LnByaW50bG4oIiAqIik7Ci0vLyAgICAgIG91dC5wcmludGxuKCIgKiAiICsgY29udmVydE11bHRpbGluZUNvbW1lbnQoZGVzY3JpcHRpb24pKTsKLS8vICAgIH0KLQotICAgIFN0cmluZyBsb25nRGVzY3JpcHRpb24gPSBjb21wb25lbnQuZ2V0TG9uZ0Rlc2NyaXB0aW9uKCk7Ci0gICAgaWYgKGxvbmdEZXNjcmlwdGlvbiAhPSBudWxsKQotICAgIHsKLSAgICAgIG91dC5wcmludGxuKCIgKiIpOwotICAgICAgb3V0LnByaW50bG4oIiAqICIgKyBjb252ZXJ0TXVsdGlsaW5lQ29tbWVudChsb25nRGVzY3JpcHRpb24pKTsKLSAgICB9Ci0KLSAgICBpZiAoY29tcG9uZW50Lmhhc0V2ZW50cyh0cnVlKSkKLSAgICB7Ci0gICAgICAvLyB0aGUgZXZlbnRzIGphdmFkb2MKLSAgICAgIG91dC5wcmludGxuKCIgKiIpOwotICAgICAgb3V0LnByaW50bG4oIiAqIDxoND5FdmVudHM6PC9oND4iKTsKLSAgICAgIG91dC5wcmludGxuKCIgKiA8dGFibGUgYm9yZGVyPVwiMVwiIHdpZHRoPVwiMTAwJVwiIGNlbGxwYWRkaW5nPVwiM1wiIHN1bW1hcnk9XCJcIj4iKTsKLSAgICAgIG91dC5wcmludGxuKCIgKiA8dHIgYmdjb2xvcj1cIiNDQ0NDRkZcIiBjbGFzcz1cIlRhYmxlSGVhZGluZ0NvbG9yXCI+Iik7Ci0gICAgICBvdXQucHJpbnRsbigiICogPHRoIGFsaWduPVwibGVmdFwiPlR5cGU8L3RoPiIpOwotICAgICAgb3V0LnByaW50bG4oIiAqIDx0aCBhbGlnbj1cImxlZnRcIj5QaGFzZXM8L3RoPiIpOwotICAgICAgb3V0LnByaW50bG4oIiAqIDx0aCBhbGlnbj1cImxlZnRcIj5EZXNjcmlwdGlvbjwvdGg+Iik7Ci0gICAgICBvdXQucHJpbnRsbigiICogPC90cj4iKTsKLSAgICAgIEl0ZXJhdG9yIGV2ZW50cyA9IGNvbXBvbmVudC5ldmVudHModHJ1ZSk7Ci0gICAgICB3aGlsZSAoZXZlbnRzLmhhc05leHQoKSkKLSAgICAgIHsKLSAgICAgICAgRXZlbnRSZWZCZWFuIGV2ZW50UmVmID0gKEV2ZW50UmVmQmVhbikgZXZlbnRzLm5leHQoKTsKLSAgICAgICAgRXZlbnRCZWFuIGV2ZW50ID0gZXZlbnRSZWYucmVzb2x2ZUV2ZW50VHlwZSgpOwotICAgICAgICBpZiAoZXZlbnQgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIFN0cmluZyBldmVudENsYXNzID0gZXZlbnQuZ2V0RXZlbnRDbGFzcygpOwotICAgICAgICAgIFN0cmluZ1tdIGV2ZW50UGhhc2VzID0gZXZlbnRSZWYuZ2V0RXZlbnREZWxpdmVyeVBoYXNlcygpOwotICAgICAgICAgIFN0cmluZyBldmVudERlc2NyaXB0aW9uID0gZXZlbnQuZ2V0RGVzY3JpcHRpb24oKTsKLSAgICAgICAgICBvdXQucHJpbnRsbigiICogPHRyIGNsYXNzPVwiVGFibGVSb3dDb2xvclwiPiIpOwotICAgICAgICAgIG91dC5wcmludGxuKCIgKiA8dGQgdmFsaWduPVwidG9wXCI+PGNvZGU+IiArIGV2ZW50Q2xhc3MgKyAiPC9jb2RlPjwvdGQ+Iik7Ci0gICAgICAgICAgb3V0LnByaW50KCIgKiA8dGQgdmFsaWduPVwidG9wXCIgbm93cmFwPiIpOwotICAgICAgICAgIGlmIChldmVudFBoYXNlcyAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXZlbnRQaGFzZXMubGVuZ3RoOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGlmIChpID4gMCkKLSAgICAgICAgICAgICAgICBvdXQucHJpbnQoIjxicj4iKTsKLSAgICAgICAgICAgICAgb3V0LnByaW50KGV2ZW50UGhhc2VzW2ldKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgb3V0LnByaW50bG4oIjwvdGQ+Iik7Ci0gICAgICAgICAgb3V0LnByaW50bG4oIiAqIDx0ZCB2YWxpZ249XCJ0b3BcIj4iICsgZXZlbnREZXNjcmlwdGlvbiArICI8L3RkPiIpOwotICAgICAgICAgIG91dC5wcmludGxuKCIgKiA8L3RyPiIpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBvdXQucHJpbnRsbigiICogPC90YWJsZT4iKTsKLSAgICB9Ci0KLSAgICBpZiAoIWNvbXBvbmVudC5oYXNDaGlsZHJlbigpKQotICAgIHsKLSAgICAgIG91dC5wcmludGxuKCIgKiA8cD4iKTsKLSAgICAgIG91dC5wcmludGxuKCIgKiBJdCBkb2VzIG5vdCBzdXBwb3J0IGFueSBjaGlsZHJlbi4iKTsKLSAgICB9Ci0KLSAgICBvdXQucHJpbnRsbigiICovIik7Ci0KLSAgICAvLyBUT0RPOiBlbGltaW5hdGUgPG1mcDpjb21wb25lbnQtY2xhc3MtbW9kaWZpZXI+IG1ldGFkYXRhCi0gICAgaW50IG1vZGlmaWVycyA9IGNvbXBvbmVudC5nZXRDb21wb25lbnRDbGFzc01vZGlmaWVycygpOwotICAgIFN0cmluZyBjbGFzc1N0YXJ0ID0gTW9kaWZpZXIudG9TdHJpbmcobW9kaWZpZXJzKTsKLSAgICAvLyBUT0RPOiB1c2UgY2Fub25pY2FsIG9yZGVyaW5nCi0gICAgY2xhc3NTdGFydCA9IGNsYXNzU3RhcnQucmVwbGFjZUFsbCgicHVibGljIGFic3RyYWN0IiwgImFic3RyYWN0IHB1YmxpYyIpOwotICAgIG91dC5wcmludGxuKGNsYXNzU3RhcnQgKyAiIGNsYXNzICIgKyBjbGFzc05hbWUgKwotICAgICAgICAiIGV4dGVuZHMgIiArIHN1cGVyY2xhc3NOYW1lKTsKLQotICAgIFNldCBpbnRlcmZhY2VzID0gbmV3IEhhc2hTZXQoKTsKLSAgICBpZiAodGVtcGxhdGUgIT0gbnVsbCkKLSAgICAgIGludGVyZmFjZXMuYWRkQWxsKHRlbXBsYXRlLmdldEltcGxlbWVudHMoKSk7Ci0KLSAgICBpZiAoY29tcG9uZW50LmdldENvbXBvbmVudEltcGxlbWVudHMoKSAhPSBudWxsKXsKLSAgICAgICAgU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcihjb21wb25lbnQuZ2V0Q29tcG9uZW50SW1wbGVtZW50cygpLCIsIixmYWxzZSk7Ci0gICAgICAgIHdoaWxlIChzdC5oYXNNb3JlVG9rZW5zKCkpewotICAgICAgICAgICAgaW50ZXJmYWNlcy5hZGQoc3QubmV4dFRva2VuKCkpOyAgICAKLSAgICAgICAgfSAgICAgICAgCi0gICAgfQotICAgIAotICAgIGlmIChjb21wb25lbnQuaXNOYW1pbmdDb250YWluZXIoKSkKLSAgICAgIGludGVyZmFjZXMuYWRkKCJqYXZheC5mYWNlcy5jb21wb25lbnQuTmFtaW5nQ29udGFpbmVyIik7Ci0KLSAgICBJdGVyYXRvciBldmVudHMgPSBjb21wb25lbnQuZXZlbnRzKCk7Ci0gICAgd2hpbGUgKGV2ZW50cy5oYXNOZXh0KCkpCi0gICAgewotICAgICAgRXZlbnRSZWZCZWFuIGV2ZW50UmVmID0gKEV2ZW50UmVmQmVhbikgZXZlbnRzLm5leHQoKTsKLSAgICAgIEV2ZW50QmVhbiBldmVudCA9IGV2ZW50UmVmLnJlc29sdmVFdmVudFR5cGUoKTsKLSAgICAgIGlmIChldmVudCAhPSBudWxsKQotICAgICAgewotICAgICAgICBpZiAoIWV2ZW50UmVmLmlzSWdub3JlU291cmNlSW50ZXJmYWNlKCkpCi0gICAgICAgIHsKLSAgICAgICAgICBTdHJpbmcgc291cmNlID0gZXZlbnQuZ2V0RXZlbnRTb3VyY2VJbnRlcmZhY2UoKTsKLSAgICAgICAgICBpZiAoc291cmNlICE9IG51bGwpCi0gICAgICAgICAgICBpbnRlcmZhY2VzLmFkZChVdGlsLmdldENsYXNzRnJvbUZ1bGxDbGFzcyhzb3VyY2UpKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIGlmICghaW50ZXJmYWNlcy5pc0VtcHR5KCkpCi0gICAgewotICAgICAgU2V0IGltcGxlbWVudHNTZXQgPSBuZXcgSGFzaFNldCgpOwotICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gaW50ZXJmYWNlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyBmY3FuID0gKFN0cmluZykgaXRlci5uZXh0KCk7Ci0gICAgICAgIGltcGxlbWVudHNTZXQuYWRkKFV0aWwuZ2V0Q2xhc3NGcm9tRnVsbENsYXNzKGZjcW4pKTsKLSAgICAgIH0KLQotICAgICAgLy8gaW1wbGVtZW50cyBjbGF1c2Ugc3BhbnMgbXVsdGlwbGUgbGluZXMKLSAgICAgIGNoYXJbXSBpbmRlbnQgPSBuZXcgY2hhcltjbGFzc1N0YXJ0Lmxlbmd0aCgpICsKLSAgICAgICAgICAiIGNsYXNzICIubGVuZ3RoKCkgKwotICAgICAgICAgIGNsYXNzTmFtZS5sZW5ndGgoKSArIDFdOwotICAgICAgQXJyYXlzLmZpbGwoaW5kZW50LCAnICcpOwotICAgICAgb3V0LnByaW50KGluZGVudCk7Ci0gICAgICBvdXQucHJpbnQoImltcGxlbWVudHMgIik7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBpbXBsZW1lbnRzU2V0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykKLSAgICAgIHsKLSAgICAgICAgb3V0LnByaW50KChTdHJpbmcpIGl0ZXIubmV4dCgpKTsKLSAgICAgICAgaWYgKGl0ZXIuaGFzTmV4dCgpKQotICAgICAgICB7Ci0gICAgICAgICAgb3V0LnByaW50bG4oIiwiKTsKLSAgICAgICAgICBvdXQucHJpbnQoaW5kZW50KTsKLSAgICAgICAgICBvdXQucHJpbnQoIiAgICAgICAgICAgIik7ICAvLyBzYW1lIGxlbmd0aCBhcyAiaW1wbGVtZW50cyAiCi0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIG91dC5wcmludGxuKCk7Ci0gICAgfQotCi0gICAgb3V0LnByaW50bG4oInsiKTsKLSAgICBvdXQuaW5kZW50KCk7Ci0gICAgCi0gICAgLy9Xcml0ZSBzZXJpYWxWZXJzaW9uVUlECi0gICAgaWYgKGNvbXBvbmVudC5nZXRDb21wb25lbnRTZXJpYWxVSUQoKSAhPSBudWxsICYmCi0gICAgICAgICAgICAhIiIuZXF1YWxzKGNvbXBvbmVudC5nZXRDb21wb25lbnRTZXJpYWxVSUQoKSkpewotICAgICAgICBvdXQucHJpbnRsbigpOwotICAgICAgICBvdXQucHJpbnRsbigicHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gIisKLSAgICAgICAgICAgICAgICBjb21wb25lbnQuZ2V0Q29tcG9uZW50U2VyaWFsVUlEKCkrIjsiKTsKLSAgICAgICAgb3V0LnByaW50bG4oKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB3cml0ZUNsYXNzRW5kKAotICAgICAgUHJldHR5V3JpdGVyIG91dCkKLSAgewotICAgIG91dC51bmluZGVudCgpOwotICAgIG91dC5wcmludGxuKCJ9Iik7Ci0gIH0KLQotCi0gIHB1YmxpYyB2b2lkIHdyaXRlSW1wb3J0cyhQcmV0dHlXcml0ZXIgb3V0LCBTb3VyY2VUZW1wbGF0ZSB0ZW1wbGF0ZSwgU3RyaW5nIHBhY2thZ2VOYW1lLCBTdHJpbmcgZnVsbFN1cGVyY2xhc3NOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHN1cGVyY2xhc3NOYW1lLCBDb2xsZWN0aW9uIGNvbXBvbmVudHMpCi0gIHsKLSAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIm5vdCBpbXBsZW1lbnRlZCIpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgd3JpdGVJbXBvcnRzKAotICAgICAgUHJldHR5V3JpdGVyIG91dCwKLSAgICAgIFNvdXJjZVRlbXBsYXRlIHRlbXBsYXRlLAotICAgICAgU3RyaW5nIHBhY2thZ2VOYW1lLAotICAgICAgU3RyaW5nIGZ1bGxTdXBlcmNsYXNzTmFtZSwKLSAgICAgIFN0cmluZyBzdXBlcmNsYXNzTmFtZSwKLSAgICAgIENvbXBvbmVudEJlYW4gY29tcG9uZW50KQotICB7Ci0gICAgU2V0IGltcG9ydHMgPSBuZXcgVHJlZVNldCgpOwotCi0gICAgLy8gVXNlIHRoZSB0ZW1wbGF0ZSBpbXBvcnRzCi0gICAgaWYgKHRlbXBsYXRlICE9IG51bGwpCi0gICAgICBpbXBvcnRzLmFkZEFsbCh0ZW1wbGF0ZS5nZXRJbXBvcnRzKCkpOwotCi0gICAgaWYgKGNvbXBvbmVudC5nZXRDb21wb25lbnRJbXBsZW1lbnRzKCkgIT0gbnVsbCl7Ci0gICAgICAgIFN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoY29tcG9uZW50LmdldENvbXBvbmVudEltcGxlbWVudHMoKSwiLCIsZmFsc2UpOwotICAgICAgICB3aGlsZSAoc3QuaGFzTW9yZVRva2VucygpKXsKLSAgICAgICAgICAgIGltcG9ydHMuYWRkKHN0Lm5leHRUb2tlbigpKTsgICAgCi0gICAgICAgIH0gICAgICAgIAotICAgIH0gICAgCi0gICAgCi0gICAgLy8gRGV0ZWN0IE5hbWluZ0NvbnRhaW5lcgotICAgIGlmIChjb21wb25lbnQuaXNOYW1pbmdDb250YWluZXIoKSkKLSAgICAgIGltcG9ydHMuYWRkKCJqYXZheC5mYWNlcy5jb21wb25lbnQuTmFtaW5nQ29udGFpbmVyIik7Ci0KLSAgICBJdGVyYXRvciBwcm9wZXJ0aWVzID0gY29tcG9uZW50LnByb3BlcnRpZXMoKTsKLSAgICBwcm9wZXJ0aWVzID0gbmV3IEZpbHRlcmVkSXRlcmF0b3IocHJvcGVydGllcywgbmV3IE5vblZpcnR1YWxGaWx0ZXIoKSk7Ci0gICAgLy8gUHJvcGVydHlLZXkgb25seSBuZWVkZWQgaWYgdGhlcmUgYXJlIHByb3BlcnRpZXMKLSAgICBpZiAocHJvcGVydGllcy5oYXNOZXh0KCkpCi0gICAgewotICAgICAgd2hpbGUgKHByb3BlcnRpZXMuaGFzTmV4dCgpKQotICAgICAgewotICAgICAgICBQcm9wZXJ0eUJlYW4gcHJvcGVydHkgPSAoUHJvcGVydHlCZWFuKSBwcm9wZXJ0aWVzLm5leHQoKTsKLSAgICAgICAgU3RyaW5nIHByb3BlcnR5Q2xhc3MgPSBwcm9wZXJ0eS5nZXRQcm9wZXJ0eUNsYXNzKCk7Ci0gICAgICAgIGlmIChwcm9wZXJ0eUNsYXNzICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBpbXBvcnRzLmFkZChwcm9wZXJ0eUNsYXNzKTsKLSAgICAgICAgICAvLyBDaGVjayBmb3IgZ2VuZXJpY3MKLSAgICAgICAgICBTdHJpbmdbXSB0eXBlcyA9IHByb3BlcnR5LmdldEF0dHJpYnV0ZUNsYXNzUGFyYW1ldGVycygpOwotICAgICAgICAgIGlmICh0eXBlcyAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSB0eXBlcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgYWRkR2VuZXJpY0ltcG9ydHMoaW1wb3J0cywgdHlwZXNbaV0pOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIEl0ZXJhdG9yIGZhY2V0cyA9IGNvbXBvbmVudC5mYWNldHMoKTsKLSAgICAvLyBVSUNvbXBvbmVudCBuZWVkZWQgaWYgdGhlcmUgYXJlIGZhY2V0cwotICAgIGlmIChmYWNldHMuaGFzTmV4dCgpKQotICAgICAgaW1wb3J0cy5hZGQoImphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudCIpOwotCi0gICAgSXRlcmF0b3IgZXZlbnRzID0gY29tcG9uZW50LmV2ZW50cygpOwotICAgIHdoaWxlIChldmVudHMuaGFzTmV4dCgpKQotICAgIHsKLSAgICAgIEV2ZW50UmVmQmVhbiBldmVudFJlZiA9IChFdmVudFJlZkJlYW4pIGV2ZW50cy5uZXh0KCk7Ci0gICAgICBFdmVudEJlYW4gZXZlbnQgPSBldmVudFJlZi5yZXNvbHZlRXZlbnRUeXBlKCk7Ci0KLSAgICAgIGlmIChldmVudCA9PSBudWxsKQotICAgICAgewotICAgICAgICBnZXRMb2coKS53YXJuKCJVbmtub3duIGV2ZW50IHR5cGUgXCIiICsgZXZlbnRSZWYuZ2V0RXZlbnRUeXBlKCkgKyAiXCIiICsKLSAgICAgICAgICAgICIgaW4gY29tcG9uZW50OiIgKyBjb21wb25lbnQuZ2V0Q29tcG9uZW50VHlwZSgpKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIGxpc3RlbmVyQ2xhc3MgPSBldmVudC5nZXRFdmVudExpc3RlbmVyQ2xhc3MoKTsKLSAgICAgICAgaWYgKGxpc3RlbmVyQ2xhc3MgIT0gbnVsbCkKLSAgICAgICAgICBpbXBvcnRzLmFkZChsaXN0ZW5lckNsYXNzKTsKLQotICAgICAgICBpZiAoIWV2ZW50UmVmLmlzSWdub3JlU291cmNlSW50ZXJmYWNlKCkpCi0gICAgICAgIHsKLSAgICAgICAgICBTdHJpbmcgc291cmNlSW50ZXJmYWNlID0gZXZlbnQuZ2V0RXZlbnRTb3VyY2VJbnRlcmZhY2UoKTsKLSAgICAgICAgICBpZiAoc291cmNlSW50ZXJmYWNlICE9IG51bGwpCi0gICAgICAgICAgICBpbXBvcnRzLmFkZChzb3VyY2VJbnRlcmZhY2UpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8gSW1wb3J0IGNhdXNlcyBhIGNvbGxpc2lvbiBpZiBjbGFzc05hbWUgYW5kIHN1cGVyY2xhc3NOYW1lIGFyZSBlcXVhbAotICAgIGlmICghc3VwZXJjbGFzc05hbWUuZXF1YWxzKGZ1bGxTdXBlcmNsYXNzTmFtZSkpCi0gICAgewotICAgICAgU3RyaW5nIHN1cGVyUGFja2FnZU5hbWUgPSBVdGlsLmdldFBhY2thZ2VGcm9tRnVsbENsYXNzKGZ1bGxTdXBlcmNsYXNzTmFtZSk7Ci0gICAgICAvLyBjb21wb25lbnQgc3VwZXJjbGFzcyBvbmx5IG5lZWRlZCBpZiBub3QgaW4KLSAgICAgIC8vIHNhbWUgcGFja2FnZSBhcyBjb21wb25lbnQgY2xhc3MKLSAgICAgIGlmIChzdXBlclBhY2thZ2VOYW1lICE9IHBhY2thZ2VOYW1lKQotICAgICAgICBpbXBvcnRzLmFkZChmdWxsU3VwZXJjbGFzc05hbWUpOwotICAgIH0KLQotICAgIC8vIGFkZCBvdGhlciBpbXBvcnRzIChnZW5lcmF0b3Igc3BlY2lmaWMpCi0gICAgYWRkU3BlY2lmaWNJbXBvcnRzKGltcG9ydHMsIGNvbXBvbmVudCk7Ci0KLSAgICAvLyBkbyBub3QgaW1wb3J0IGltcGxpY2l0IHR5cGVzIQotICAgIGltcG9ydHMucmVtb3ZlQWxsKFV0aWwuUFJJTUlUSVZFX1RZUEVTKTsKLQotICAgIEdlbmVyYXRvckhlbHBlci53cml0ZUltcG9ydHMob3V0LCBwYWNrYWdlTmFtZSwgaW1wb3J0cyk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBhZGRTcGVjaWZpY0ltcG9ydHMoCi0gICAgICBTZXQgaW1wb3J0cywKLSAgICAgIENvbXBvbmVudEJlYW4gY29tcG9uZW50KQotICB7Ci0gICAgLy8gbm90aGluZyBieSBkZWZhdWx0Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBhZGRHZW5lcmljSW1wb3J0cyhTZXQgaW1wb3J0cywgU3RyaW5nIHR5cGUpCi0gIHsKLSAgICBNYXRjaGVyIG1hdGNoZXIgPSBfR0VORVJJQ19UWVBFLm1hdGNoZXIodHlwZSk7Ci0gICAgaWYgKG1hdGNoZXIubWF0Y2hlcygpKQotICAgIHsKLSAgICAgIC8vIEdlbmVyaWMgdHlwZQotICAgICAgaW1wb3J0cy5hZGQobWF0Y2hlci5ncm91cCgxKSk7Ci0gICAgICBTdHJpbmdbXSB0eXBlcyA9IG1hdGNoZXIuZ3JvdXAoMikuc3BsaXQoIiwiKTsKLSAgICAgIGZvciAoaW50IGkgPSB0eXBlcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkKLSAgICAgIHsKLSAgICAgICAgYWRkR2VuZXJpY0ltcG9ydHMoaW1wb3J0cywgdHlwZXNbaV0pOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgLy8gTm9uLWdlbmVyaWMgdHlwZQotICAgICAgaW1wb3J0cy5hZGQodHlwZSk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgd3JpdGVHZW5lcmljQ29uc3RhbnRzKAotICAgICAgUHJldHR5V3JpdGVyIG91dCwKLSAgICAgIFN0cmluZyBjb21wb25lbnRGYW1pbHksCi0gICAgICBTdHJpbmcgY29tcG9uZW50VHlwZSkgdGhyb3dzIElPRXhjZXB0aW9uCi0gIHsKLSAgICBvdXQucHJpbnRsbigpOwotICAgIG91dC5wcmludGxuKCJzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBDT01QT05FTlRfRkFNSUxZID0iKTsKLSAgICBvdXQucHJpbnRsbigiICBcIiIgKyBjb21wb25lbnRGYW1pbHkgKyAiXCI7Iik7Ci0gICAgb3V0LnByaW50bG4oInN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIENPTVBPTkVOVF9UWVBFID0iKTsKLSAgICBvdXQucHJpbnRsbigiICBcIiIgKyBjb21wb25lbnRUeXBlICsgIlwiOyIpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgd3JpdGVQcm9wZXJ0eUNvbnN0YW50cygKLSAgICAgIFByZXR0eVdyaXRlciBvdXQsCi0gICAgICBTdHJpbmcgc3VwZXJjbGFzc05hbWUsCi0gICAgICBDb21wb25lbnRCZWFuIGNvbXBvbmVudCkgdGhyb3dzIElPRXhjZXB0aW9uCi0gIHsKLSAgICAvLyBub3RoaW5nCi0gIH0KLQotICBwdWJsaWMgdm9pZCB3cml0ZVByb3BlcnR5VmFsdWVDb25zdGFudHMoCi0gICAgICBQcmV0dHlXcml0ZXIgb3V0LAotICAgICAgQ29tcG9uZW50QmVhbiBjb21wb25lbnQpIHRocm93cyBJT0V4Y2VwdGlvbgotICB7Ci0gICAgLy8gIGNvbXBvbmVudCBwcm9wZXJ0eSBrZXlzCi0gICAgSXRlcmF0b3IgcHJvcGVydGllcyA9IGNvbXBvbmVudC5wcm9wZXJ0aWVzKCk7Ci0gICAgcHJvcGVydGllcyA9IG5ldyBGaWx0ZXJlZEl0ZXJhdG9yKHByb3BlcnRpZXMsIG5ldyBOb25WaXJ0dWFsRmlsdGVyKCkpOwotICAgIHdoaWxlIChwcm9wZXJ0aWVzLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBQcm9wZXJ0eUJlYW4gcHJvcGVydHkgPSAoUHJvcGVydHlCZWFuKSBwcm9wZXJ0aWVzLm5leHQoKTsKLSAgICAgIFN0cmluZ1tdIHByb3BlcnR5VmFsdWVzID0gcHJvcGVydHkuZ2V0UHJvcGVydHlWYWx1ZXMoKTsKLQotICAgICAgaWYgKHByb3BlcnR5VmFsdWVzICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyBwcm9wTmFtZSA9IHByb3BlcnR5LmdldFByb3BlcnR5TmFtZSgpOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcHJvcGVydHlWYWx1ZXMubGVuZ3RoOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICBTdHJpbmcgcHJvcFZhbHVlID0gcHJvcGVydHlWYWx1ZXNbaV07Ci0gICAgICAgICAgU3RyaW5nIHByb3BWYWx1ZU5hbWUgPSBwcm9wTmFtZSArCi0gICAgICAgICAgICAgIENoYXJhY3Rlci50b1VwcGVyQ2FzZShwcm9wVmFsdWUuY2hhckF0KDApKSArCi0gICAgICAgICAgICAgIHByb3BWYWx1ZS5zdWJzdHJpbmcoMSk7Ci0gICAgICAgICAgU3RyaW5nIHByb3BWYWx1ZUtleSA9IFV0aWwuZ2V0Q29uc3RhbnROYW1lRnJvbVByb3BlcnR5KHByb3BWYWx1ZU5hbWUpOwotCi0gICAgICAgICAgb3V0LnByaW50bG4oInN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nICIgKyBwcm9wVmFsdWVLZXkgKyAiID0gXCIiICsgcHJvcFZhbHVlICsgIlwiOyIpOwotICAgICAgICB9Ci0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB3cml0ZUZhY2V0Q29uc3RhbnRzKAotICAgICAgUHJldHR5V3JpdGVyIG91dCwKLSAgICAgIENvbXBvbmVudEJlYW4gY29tcG9uZW50KSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgewotICAgIEl0ZXJhdG9yIGZhY2V0cyA9IGNvbXBvbmVudC5mYWNldHMoKTsKLSAgICB3aGlsZSAoZmFjZXRzLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBGYWNldEJlYW4gZmFjZXQgPSAoRmFjZXRCZWFuKSBmYWNldHMubmV4dCgpOwotICAgICAgU3RyaW5nIGZhY2V0TmFtZSA9IGZhY2V0LmdldEZhY2V0TmFtZSgpOwotICAgICAgU3RyaW5nIGZhY2V0S2V5ID0gVXRpbC5nZXRDb25zdGFudE5hbWVGcm9tUHJvcGVydHkoZmFjZXROYW1lLCAiX0ZBQ0VUIik7Ci0gICAgICBvdXQucHJpbnRsbigic3RhdGljIHB1YmxpYyBmaW5hbCAiICsKLSAgICAgICAgICAiU3RyaW5nICIgKyBmYWNldEtleSArICIgPSBcIiIgKyBmYWNldE5hbWUgKyAiXCI7Iik7Ci0gICAgfQotICB9Ci0KLSAgcHJvdGVjdGVkIFN0cmluZyBjb252ZXJ0U3RyaW5nVG9Cb3hlZExpdGVyYWwoCi0gICAgICBTdHJpbmcgY2xhc3NOYW1lLAotICAgICAgU3RyaW5nIHZhbHVlKQotICB7Ci0gICAgaWYgKHZhbHVlID09IG51bGwpCi0gICAgewotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICAgIGVsc2UgaWYgKCJTdHJpbmciLmVxdWFscyhjbGFzc05hbWUpKQotICAgIHsKLSAgICAgIHJldHVybiAiXCIiICsgdmFsdWUucmVwbGFjZUFsbCgiXCciLCAiXFwnIikgKyAiXCIiOwotICAgIH0KLSAgICBlbHNlIGlmICgiYm9vbGVhbiIuZXF1YWxzKGNsYXNzTmFtZSkpCi0gICAgewotICAgICAgcmV0dXJuICgidHJ1ZSIuZXF1YWxzKHZhbHVlKSkgPyAiQm9vbGVhbi5UUlVFIiA6ICJCb29sZWFuLkZBTFNFIjsKLSAgICB9Ci0gICAgZWxzZSBpZiAoImNoYXIiLmVxdWFscyhjbGFzc05hbWUpKQotICAgIHsKLSAgICAgIHJldHVybiAiQ2hhcmFjdGVyLnZhbHVlT2YoJyIgKyB2YWx1ZS5yZXBsYWNlQWxsKCJcJyIsICJcXCciKSArICInKSI7Ci0gICAgfQotICAgIGVsc2UgaWYgKCJpbnQiLmVxdWFscyhjbGFzc05hbWUpKQotICAgIHsKLSAgICAgIHJldHVybiAiSW50ZWdlci52YWx1ZU9mKCIgKyB2YWx1ZSArICIpIjsKLSAgICB9Ci0gICAgZWxzZSBpZiAoImRvdWJsZSIuZXF1YWxzKGNsYXNzTmFtZSkpCi0gICAgewotICAgICAgcmV0dXJuICJEb3VibGUudmFsdWVPZigiICsgdmFsdWUgKyAiKSI7Ci0gICAgfQotICAgIGVsc2UgaWYgKCJmbG9hdCIuZXF1YWxzKGNsYXNzTmFtZSkpCi0gICAgewotICAgICAgcmV0dXJuICJGbG9hdC52YWx1ZU9mKCIgKyB2YWx1ZSArICIpIjsKLSAgICB9Ci0gICAgZWxzZSBpZiAoIk51bWJlciIuZXF1YWxzKGNsYXNzTmFtZSkpCi0gICAgewotICAgICAgaWYodmFsdWUuaW5kZXhPZigiLiIpID09IC0xKQotICAgICAgewotICAgICAgICByZXR1cm4gIkludGVnZXIudmFsdWVPZigiICsgdmFsdWUgKyAiKSI7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHJldHVybiAiRG91YmxlLnZhbHVlT2YoIiArIHZhbHVlICsgIikiOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigicHJvcGVydHktY2xhc3MgIiArIGNsYXNzTmFtZSArICIgbm90IHN1cHBvcnRlZCBmb3IgYXV0by1ib3hpbmciKTsKLSAgICB9Ci0gIH0KLQotCi0gIHByb3RlY3RlZCBTdHJpbmcgY29udmVydFZhcmlhYmxlVG9Cb3hlZEZvcm0oCi0gICAgU3RyaW5nICBjbGFzc05hbWUsCi0gICAgU3RyaW5nICB2YXJOYW1lKQotICB7Ci0gICAgaWYgKCJib29sZWFuIi5lcXVhbHMoY2xhc3NOYW1lKSkKLSAgICB7Ci0gICAgICByZXR1cm4gdmFyTmFtZSArICIgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFIjsKLSAgICB9Ci0gICAgZWxzZSBpZiAoImNoYXIiLmVxdWFscyhjbGFzc05hbWUpKQotICAgIHsKLSAgICAgIHJldHVybiAiQ2hhcmFjdGVyLnZhbHVlT2YoIiArIHZhck5hbWUgKyAiKSI7Ci0gICAgfQotICAgIGVsc2UgaWYgKCJpbnQiLmVxdWFscyhjbGFzc05hbWUpKQotICAgIHsKLSAgICAgIHJldHVybiAiSW50ZWdlci52YWx1ZU9mKCIgKyB2YXJOYW1lICsgIikiOwotICAgIH0KLSAgICBlbHNlIGlmICgic2hvcnQiLmVxdWFscyhjbGFzc05hbWUpKQotICAgIHsKLSAgICAgIHJldHVybiAiU2hvcnQudmFsdWVPZigiICsgdmFyTmFtZSArICIpIjsKLSAgICB9Ci0gICAgZWxzZSBpZiAoImxvbmciLmVxdWFscyhjbGFzc05hbWUpKQotICAgIHsKLSAgICAgIHJldHVybiAiTG9uZy52YWx1ZU9mKCIgKyB2YXJOYW1lICsgIikiOwotICAgIH0KLSAgICBlbHNlIGlmICgiZG91YmxlIi5lcXVhbHMoY2xhc3NOYW1lKSkKLSAgICB7Ci0gICAgICByZXR1cm4gIkRvdWJsZS52YWx1ZU9mKCIgKyB2YXJOYW1lICsgIikiOwotICAgIH0KLSAgICBlbHNlIGlmICgiZmxvYXQiLmVxdWFscyhjbGFzc05hbWUpKQotICAgIHsKLSAgICAgIHJldHVybiAiRmxvYXQudmFsdWVPZigiICsgdmFyTmFtZSArICIpIjsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oInByb3BlcnR5LWNsYXNzICIgKyBjbGFzc05hbWUgKyAiIG5vdCBzdXBwb3J0ZWQgZm9yIGF1dG8tYm94aW5nIik7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgd3JpdGVDb25zdHJ1Y3RvcigKLSAgICAgIFByZXR0eVdyaXRlciBvdXQsCi0gICAgICBDb21wb25lbnRCZWFuIGNvbXBvbmVudCwKLSAgICAgIGludCBtb2RpZmllcnMpIHRocm93cyBJT0V4Y2VwdGlvbgotICB7Ci0gICAgU3RyaW5nIGZ1bGxDbGFzc05hbWUgPSBjb21wb25lbnQuZ2V0Q29tcG9uZW50Q2xhc3MoKTsKLSAgICBTdHJpbmcgY2xhc3NOYW1lID0gVXRpbC5nZXRDbGFzc0Zyb21GdWxsQ2xhc3MoZnVsbENsYXNzTmFtZSk7Ci0KLSAgICBpZiAoTW9kaWZpZXIuaXNQdWJsaWMobW9kaWZpZXJzKSkKLSAgICB7Ci0gICAgICAvLyBUT0RPOiBlbGltaW5hdGUgdGhpcyBpbmNvbnNpc3RlbmN5Ci0gICAgICBpZiAoIU1vZGlmaWVyLmlzQWJzdHJhY3QoY29tcG9uZW50LmdldENvbXBvbmVudENsYXNzTW9kaWZpZXJzKCkpKQotICAgICAgewotICAgICAgICBTdHJpbmcgcmVuZGVyZXJUeXBlID0gY29tcG9uZW50LmdldFJlbmRlcmVyVHlwZSgpOwotCi0gICAgICAgIGlmIChyZW5kZXJlclR5cGUgIT0gbnVsbCkKLSAgICAgICAgICByZW5kZXJlclR5cGUgPSBjb252ZXJ0U3RyaW5nVG9Cb3hlZExpdGVyYWwoIlN0cmluZyIsIHJlbmRlcmVyVHlwZSk7Ci0KLSAgICAgICAgb3V0LnByaW50bG4oKTsKLSAgICAgICAgb3V0LnByaW50bG4oIi8qKiIpOwotICAgICAgICAvLyBUT0RPOiByZXN0b3JlIHRoaXMgY29ycmVjdGx5IHBocmFzZWQgY29tbWVudCAodGVuc2UgdnMuIGNvbW1hbmQpCi0gICAgICAgIC8vb3V0LnByaW50bG4oIiAqIENvbnN0cnVjdHMgYW4gaW5zdGFuY2Ugb2YgIiArIGNsYXNzTmFtZSArICIuIik7Ci0gICAgICAgIG91dC5wcmludGxuKCIgKiBDb25zdHJ1Y3QgYW4gaW5zdGFuY2Ugb2YgdGhlICIgKyBjbGFzc05hbWUgKyAiLiIpOwotICAgICAgICBvdXQucHJpbnRsbigiICovIik7Ci0gICAgICAgIG91dC5wcmludGxuKCJwdWJsaWMgIiArIGNsYXNzTmFtZSArICIoKSIpOwotICAgICAgICBvdXQucHJpbnRsbigieyIpOwotICAgICAgICBvdXQuaW5kZW50KCk7Ci0KLSAgICAgICAgd3JpdGVDb25zdHJ1Y3RvckNvbnRlbnQob3V0LCBjb21wb25lbnQsIG1vZGlmaWVycywgcmVuZGVyZXJUeXBlKTsKLQotICAgICAgICBvdXQudW5pbmRlbnQoKTsKLSAgICAgICAgb3V0LnByaW50bG4oIn0iKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAoTW9kaWZpZXIuaXNQcm90ZWN0ZWQobW9kaWZpZXJzKSkKLSAgICB7Ci0gICAgICBvdXQucHJpbnRsbigpOwotICAgICAgb3V0LnByaW50bG4oIi8qKiIpOwotICAgICAgLy8gVE9ETzogcmVzdG9yZSB0aGlzIG1vcmUgZGVzY3JpcHRpdmUgY29tbWVudCB3aXRoIHBhcmFtIGRvY3MKLSAgICAgIC8vb3V0LnByaW50bG4oIiAqIENvbnN0cnVjdCBhbiBpbnN0YW5jZSBvZiB0aGUgIiArIGNsYXNzTmFtZSk7Ci0gICAgICAvL291dC5wcmludGxuKCIgKiB3aXRoIHRoZSBzcGVjaWZpZWQgcmVuZGVyZXIgdHlwZS4iKTsKLSAgICAgIC8vb3V0LnByaW50bG4oIiAqICIpOwotICAgICAgLy9vdXQucHJpbnRsbigiICogQHBhcmFtIHJlbmRlcmVyVHlwZSAgdGhlIHJlbmRlcmVyIHR5cGUiKTsKLSAgICAgIG91dC5wcmludGxuKCIgKiBDb25zdHJ1Y3QgYW4gaW5zdGFuY2Ugb2YgdGhlICIgKyBjbGFzc05hbWUgKyAiLiIpOwotICAgICAgb3V0LnByaW50bG4oIiAqLyIpOwotICAgICAgb3V0LnByaW50bG4oInByb3RlY3RlZCAiICsgY2xhc3NOYW1lICsgIigiKTsKLSAgICAgIG91dC5pbmRlbnQoKTsKLSAgICAgIG91dC5wcmludGxuKCJTdHJpbmcgcmVuZGVyZXJUeXBlIik7Ci0gICAgICBvdXQucHJpbnRsbigiKSIpOwotICAgICAgb3V0LnVuaW5kZW50KCk7Ci0gICAgICBvdXQucHJpbnRsbigieyIpOwotICAgICAgb3V0LmluZGVudCgpOwotCi0gICAgICB3cml0ZUNvbnN0cnVjdG9yQ29udGVudChvdXQsIGNvbXBvbmVudCwgbW9kaWZpZXJzLCAicmVuZGVyZXJUeXBlIik7Ci0KLSAgICAgIG91dC51bmluZGVudCgpOwotICAgICAgb3V0LnByaW50bG4oIn0iKTsKLQotICAgICAgLy8gVE9ETzogZWxpbWluYXRlIHRoaXMgaW5jb25zaXN0ZW5jeQotICAgICAgaWYgKE1vZGlmaWVyLmlzQWJzdHJhY3QoY29tcG9uZW50LmdldENvbXBvbmVudENsYXNzTW9kaWZpZXJzKCkpKQotICAgICAgewotICAgICAgICBvdXQucHJpbnRsbigpOwotICAgICAgICBvdXQucHJpbnRsbigiLyoqIik7Ci0gICAgICAgIC8vIFRPRE86IHJlc3RvcmUgdGhpcyBjb3JyZWN0bHkgcGhyYXNlZCBjb21tZW50ICh0ZW5zZSB2cy4gY29tbWFuZCkKLSAgICAgICAgLy9vdXQucHJpbnRsbigiICogQ29uc3RydWN0cyBhbiBpbnN0YW5jZSBvZiAiICsgY2xhc3NOYW1lICsgIi4iKTsKLSAgICAgICAgb3V0LnByaW50bG4oIiAqIENvbnN0cnVjdCBhbiBpbnN0YW5jZSBvZiB0aGUgIiArIGNsYXNzTmFtZSArICIuIik7Ci0gICAgICAgIG91dC5wcmludGxuKCIgKi8iKTsKLSAgICAgICAgb3V0LnByaW50bG4oInByb3RlY3RlZCAiICsgY2xhc3NOYW1lICsgIigpIik7Ci0gICAgICAgIG91dC5wcmludGxuKCJ7Iik7Ci0gICAgICAgIG91dC5pbmRlbnQoKTsKLSAgICAgICAgb3V0LnByaW50bG4oInRoaXMobnVsbCk7Iik7Ci0gICAgICAgIG91dC51bmluZGVudCgpOwotICAgICAgICBvdXQucHJpbnRsbigifSIpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHdyaXRlQ29uc3RydWN0b3JDb250ZW50KAotICAgICAgUHJldHR5V3JpdGVyIG91dCwKLSAgICAgIENvbXBvbmVudEJlYW4gY29tcG9uZW50LAotICAgICAgaW50IG1vZGlmaWVycywgU3RyaW5nIHJlbmRlcmVyVHlwZSkgdGhyb3dzIElPRXhjZXB0aW9uOwotCi0gIHB1YmxpYyB2b2lkIHdyaXRlR2V0RmFtaWx5KAotICAgICAgUHJldHR5V3JpdGVyIG91dCkgdGhyb3dzIElPRXhjZXB0aW9uCi0gIHsKLSAgICBvdXQucHJpbnRsbigpOwotICAgIGlmIChfaXMxMil7Ci0gICAgICAgIG91dC5wcmludGxuKCJAT3ZlcnJpZGUiKTsKLSAgICB9Ci0gICAgb3V0LnByaW50bG4oInB1YmxpYyBTdHJpbmcgZ2V0RmFtaWx5KCkiKTsKLSAgICBvdXQucHJpbnRsbigieyIpOwotICAgIG91dC5pbmRlbnQoKTsKLSAgICBvdXQucHJpbnRsbigicmV0dXJuIENPTVBPTkVOVF9GQU1JTFk7Iik7Ci0gICAgb3V0LnVuaW5kZW50KCk7Ci0gICAgb3V0LnByaW50bG4oIn0iKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHdyaXRlUHJvcGVydHlNZXRob2RzKAotICAgICAgUHJldHR5V3JpdGVyIG91dCwKLSAgICAgIENvbXBvbmVudEJlYW4gY29tcG9uZW50KSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgewotICAgIHdyaXRlUHJvcGVydHlNZXRob2RzKG91dCwgY29tcG9uZW50LCBudWxsKTsKLSAgfQotCi0KLSAgcHVibGljIHZvaWQgd3JpdGVQcm9wZXJ0eU1ldGhvZHMoUHJldHR5V3JpdGVyIG91dCwgQ29tcG9uZW50QmVhbiBjb21wb25lbnQsIENvbGxlY3Rpb24gaWdub3JlTGlzdCkKLSAgICAgIHRocm93cyBJT0V4Y2VwdGlvbgotICB7Ci0gICAgSXRlcmF0b3IgcHJvcGVydGllcyA9IGNvbXBvbmVudC5wcm9wZXJ0aWVzKCk7Ci0gICAgcHJvcGVydGllcyA9IG5ldyBGaWx0ZXJlZEl0ZXJhdG9yKHByb3BlcnRpZXMsIG5ldyBOb25WaXJ0dWFsRmlsdGVyKCkpOwotICAgIHdoaWxlIChwcm9wZXJ0aWVzLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBQcm9wZXJ0eUJlYW4gcHJvcGVydHkgPSAoUHJvcGVydHlCZWFuKSBwcm9wZXJ0aWVzLm5leHQoKTsKLSAgICAgIGlmIChwcm9wZXJ0eS5pc0xpc3QoKSkKLSAgICAgICAgd3JpdGVQcm9wZXJ0eUxpc3RNZXRob2RzKG91dCwgcHJvcGVydHksIGlnbm9yZUxpc3QpOwotICAgICAgZWxzZQotICAgICAgewotICAgICAgICB3cml0ZVByb3BlcnR5RGVjbGFyYXRpb24ob3V0LCBwcm9wZXJ0eSk7Ci0gICAgICAgIHdyaXRlUHJvcGVydHlHZXQob3V0LCBwcm9wZXJ0eSwgaWdub3JlTGlzdCk7Ci0gICAgICAgIHdyaXRlUHJvcGVydHlTZXQob3V0LCBwcm9wZXJ0eSwgaWdub3JlTGlzdCk7Ci0gICAgICAgIGlmIChHZW5lcmF0b3JIZWxwZXIuaXNWYWxpZGF0b3IocHJvcGVydHksIF9pczEyKSkKLSAgICAgICAgewotICAgICAgICAgIHdyaXRlUHJvcGVydHlMaXN0TWV0aG9kcyhvdXQsIHByb3BlcnR5LCBpZ25vcmVMaXN0KTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotCi0gIGFic3RyYWN0IHByb3RlY3RlZCB2b2lkIHdyaXRlUHJvcGVydHlMaXN0TWV0aG9kcygKLSAgICAgIFByZXR0eVdyaXRlciBvdXQsCi0gICAgICBQcm9wZXJ0eUJlYW4gcHJvcGVydHksCi0gICAgICBDb2xsZWN0aW9uIGlub3JlTGlzdCkgdGhyb3dzIElPRXhjZXB0aW9uOwotCi0gIGFic3RyYWN0IHByb3RlY3RlZCB2b2lkIHdyaXRlUHJvcGVydHlMaXN0TWV0aG9kcygKLSAgICAgIFByZXR0eVdyaXRlciBvdXQsCi0gICAgICBQcm9wZXJ0eUJlYW4gcHJvcGVydHkpIHRocm93cyBJT0V4Y2VwdGlvbjsKLQotICBzdGF0aWMgcHJvdGVjdGVkIFN0cmluZyBnZXRTaW5ndWxhcihTdHJpbmcgcGx1cmFsKQotICB7Ci0gICAgaWYgKHBsdXJhbC5lbmRzV2l0aCgicyIpKQotICAgICAgcmV0dXJuIHBsdXJhbC5zdWJzdHJpbmcoMCwgcGx1cmFsLmxlbmd0aCgpIC0gMSk7Ci0gICAgcmV0dXJuIHBsdXJhbDsKLSAgfQotCi0gIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHdyaXRlUHJvcGVydHlEZWNsYXJhdGlvbigKLSAgICAgIFByZXR0eVdyaXRlciBvdXQsCi0gICAgICBQcm9wZXJ0eUJlYW4gcHJvcGVydHkpIHRocm93cyBJT0V4Y2VwdGlvbjsKLQotICBwcm90ZWN0ZWQgdm9pZCB3cml0ZVByb3BlcnR5U2V0KAotICAgICAgUHJldHR5V3JpdGVyIG91dCwKLSAgICAgIFByb3BlcnR5QmVhbiBwcm9wZXJ0eSwKLSAgICAgIENvbGxlY3Rpb24gaWdub3JlTGlzdCkgdGhyb3dzIElPRXhjZXB0aW9uCi0gIHsKLSAgICBTdHJpbmcgcHJvcGVydHlDbGFzcyA9IFV0aWwuZ2V0UHJvcGVydHlDbGFzcyhwcm9wZXJ0eSk7Ci0gICAgd3JpdGVQcm9wZXJ0eVNldChvdXQsIHByb3BlcnR5LCBwcm9wZXJ0eUNsYXNzLCBpZ25vcmVMaXN0KTsKLQotICAgIGlmIChwcm9wZXJ0eS5nZXRBbHRlcm5hdGVDbGFzcygpICE9IG51bGwpCi0gICAgewotICAgICAgU3RyaW5nIGFsdGVybmF0ZUNsYXNzID0gVXRpbC5nZXRBbHRlcm5hdGVQcm9wZXJ0eUNsYXNzKHByb3BlcnR5KTsKLSAgICAgIHdyaXRlUHJvcGVydHlTZXQob3V0LCBwcm9wZXJ0eSwgYWx0ZXJuYXRlQ2xhc3MsIGlnbm9yZUxpc3QpOwotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHdyaXRlUHJvcGVydHlTZXQoCi0gICAgICBQcmV0dHlXcml0ZXIgb3V0LAotICAgICAgUHJvcGVydHlCZWFuIHByb3BlcnR5LAotICAgICAgU3RyaW5nIHByb3BlcnR5Q2xhc3MsCi0gICAgICBDb2xsZWN0aW9uIGlnbm9yZUxpc3QpIHRocm93cyBJT0V4Y2VwdGlvbgotICB7Ci0gICAgU3RyaW5nIHByb3BOYW1lID0gcHJvcGVydHkuZ2V0UHJvcGVydHlOYW1lKCk7Ci0gICAgU3RyaW5nIHByb3BWYXIgPSBVdGlsLmdldFZhcmlhYmxlRnJvbU5hbWUocHJvcE5hbWUpOwotICAgIFN0cmluZyBkZXNjcmlwdGlvbiA9IHByb3BlcnR5LmdldERlc2NyaXB0aW9uKCk7Ci0gICAgU3RyaW5nIHNldE1ldGhvZCA9IFV0aWwuZ2V0UHJlZml4ZWRQcm9wZXJ0eU5hbWUoInNldCIsIHByb3BOYW1lKTsKLSAgICBpZiAoaWdub3JlTGlzdCAhPSBudWxsICYmIGlnbm9yZUxpc3QuY29udGFpbnMoc2V0TWV0aG9kKSkKLSAgICB7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIG91dC5wcmludGxuKCk7Ci0gICAgb3V0LnByaW50bG4oIi8qKiIpOwotICAgIGlmIChkZXNjcmlwdGlvbiAhPSBudWxsKQotICAgIHsKLSAgICAgIG91dC5wcmludGxuKCIgKiBTZXRzICIgKyBjb252ZXJ0TXVsdGlsaW5lQ29tbWVudChkZXNjcmlwdGlvbikpOwotICAgIH0KLQotICAgIGlmIChwcm9wZXJ0eS5pc1JlcXVpcmVkKCkpCi0gICAgewotICAgICAgb3V0LnByaW50bG4oIiAqIDxwPiIpOwotICAgICAgb3V0LnByaW50bG4oIiAqIFRoaXMgaXMgYSByZXF1aXJlZCBwcm9wZXJ0eSBvbiB0aGUgY29tcG9uZW50LiIpOwotICAgIH0KLSAgICBvdXQucHJpbnRsbigiICogIik7Ci0gICAgb3V0LnByaW50bG4oIiAqIEBwYXJhbSAiICsgVXRpbC5nZXRWYXJpYWJsZUZyb21OYW1lKHByb3BOYW1lKSArICIgIHRoZSBuZXcgIiArIHByb3BOYW1lICsgIiB2YWx1ZSIpOwotICAgIGlmIChwcm9wZXJ0eS5pc01ldGhvZEJpbmRpbmcoKSAmJiBfaXMxMikKLSAgICB7Ci0gICAgICBvdXQucHJpbnRsbigiICogQGRlcHJlY2F0ZWQiKTsKLSAgICB9Ci0gICAgb3V0LnByaW50bG4oIiAqLyIpOwotCi0gICAgaWYgKGlzQWNjZXNzb3JNZXRob2RGaW5hbCgpKQotICAgIHsKLSAgICAgIG91dC5wcmludCgiZmluYWwgIik7Ci0gICAgfQotCi0gICAgb3V0LnByaW50bG4oInB1YmxpYyB2b2lkICIgKyBzZXRNZXRob2QgKyAiKCIgKyBwcm9wZXJ0eUNsYXNzICsgIiAiICsgcHJvcFZhciArICIpIik7Ci0gICAgb3V0LnByaW50bG4oInsiKTsKLSAgICBvdXQuaW5kZW50KCk7Ci0gICAgd3JpdGVQcm9wZXJ0eVNldHRlck1ldGhvZEJvZHkob3V0LCBwcm9wZXJ0eSwgcHJvcGVydHlDbGFzcyk7Ci0gICAgb3V0LnVuaW5kZW50KCk7Ci0gICAgb3V0LnByaW50bG4oIn0iKTsKLSAgfQotCi0gIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHdyaXRlUHJvcGVydHlTZXR0ZXJNZXRob2RCb2R5KAotICAgICAgUHJldHR5V3JpdGVyIG91dCwKLSAgICAgIFByb3BlcnR5QmVhbiBwcm9wZXJ0eSwKLSAgICAgIFN0cmluZyBwcm9wZXJ0eUNsYXNzKSB0aHJvd3MgSU9FeGNlcHRpb247Ci0KLSAgcHJvdGVjdGVkIHZvaWQgd3JpdGVQcm9wZXJ0eUdldCgKLSAgICAgIFByZXR0eVdyaXRlciBvdXQsCi0gICAgICBQcm9wZXJ0eUJlYW4gcHJvcGVydHksCi0gICAgICBDb2xsZWN0aW9uIGlnbm9yZUxpc3QpIHRocm93cyBJT0V4Y2VwdGlvbgotICB7Ci0gICAgU3RyaW5nIHByb3BOYW1lID0gcHJvcGVydHkuZ2V0UHJvcGVydHlOYW1lKCk7Ci0gICAgU3RyaW5nIHByb3BlcnR5RnVsbENsYXNzID0gcHJvcGVydHkuZ2V0UHJvcGVydHlDbGFzcygpOwotICAgIFN0cmluZyBwcm9wZXJ0eUNsYXNzID0gVXRpbC5nZXRDbGFzc0Zyb21GdWxsQ2xhc3MocHJvcGVydHlGdWxsQ2xhc3MpOwotICAgIFN0cmluZyBkZXNjcmlwdGlvbiA9IHByb3BlcnR5LmdldERlc2NyaXB0aW9uKCk7Ci0gICAgU3RyaW5nIGdldE1ldGhvZCA9IFV0aWwuZ2V0TWV0aG9kUmVhZGVyRnJvbVByb3BlcnR5KHByb3BOYW1lLCBwcm9wZXJ0eUNsYXNzKTsKLSAgICBpZiAoaWdub3JlTGlzdCAhPSBudWxsICYmIGlnbm9yZUxpc3QuY29udGFpbnMoZ2V0TWV0aG9kKSkKLSAgICB7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIGJvb2xlYW4gaXNVbmNoZWNrZWQgPSBmYWxzZTsKLSAgICBTdHJpbmdbXSBnZW5lcmljVHlwZXMgPSBwcm9wZXJ0eS5nZXRQcm9wZXJ0eUNsYXNzUGFyYW1ldGVycygpOwotICAgIGlmIChnZW5lcmljVHlwZXMgIT0gbnVsbCAmJiBnZW5lcmljVHlwZXMubGVuZ3RoID4gMCkKLSAgICB7Ci0gICAgICBpc1VuY2hlY2tlZCA9IHRydWU7Ci0gICAgICBwcm9wZXJ0eUNsYXNzID0gVXRpbC5nZXRQcm9wZXJ0eUNsYXNzKHByb3BlcnR5KTsKLSAgICB9Ci0KLSAgICBvdXQucHJpbnRsbigpOwotICAgIG91dC5wcmludGxuKCIvKioiKTsKLSAgICBpZiAoZGVzY3JpcHRpb24gIT0gbnVsbCkKLSAgICB7Ci0gICAgICBvdXQucHJpbnRsbigiICogR2V0cyAiICsgY29udmVydE11bHRpbGluZUNvbW1lbnQoZGVzY3JpcHRpb24pKTsKLSAgICB9Ci0gICAgaWYgKHByb3BlcnR5LmlzUmVxdWlyZWQoKSkKLSAgICB7Ci0gICAgICBvdXQucHJpbnRsbigiICogPHA+Iik7Ci0gICAgICBvdXQucHJpbnRsbigiICogVGhpcyBpcyBhIHJlcXVpcmVkIHByb3BlcnR5IG9uIHRoZSBjb21wb25lbnQuIik7Ci0gICAgICBvdXQucHJpbnRsbigiICogPC9wPiIpOwotICAgIH0KLQotICAgIG91dC5wcmludGxuKCIgKiIpOwotICAgIG91dC5wcmludGxuKCIgKiBAcmV0dXJuICB0aGUgbmV3ICIgKyBwcm9wTmFtZSArICIgdmFsdWUiKTsKLSAgICBpZiAocHJvcGVydHkuaXNNZXRob2RCaW5kaW5nKCkgJiYgX2lzMTIpCi0gICAgewotICAgICAgb3V0LnByaW50bG4oIiAqIEBkZXByZWNhdGVkIik7Ci0gICAgfQotICAgIG91dC5wcmludGxuKCIgKi8iKTsKLQotICAgIGlmIChpc1VuY2hlY2tlZCkKLSAgICB7Ci0gICAgICBvdXQucHJpbnRsbigiQFN1cHByZXNzV2FybmluZ3MoXCJ1bmNoZWNrZWRcIikiKTsKLSAgICB9Ci0KLSAgICBpZiAoaXNBY2Nlc3Nvck1ldGhvZEZpbmFsKCkpCi0gICAgewotICAgICAgb3V0LnByaW50KCJmaW5hbCAiKTsKLSAgICB9Ci0KLSAgICBvdXQucHJpbnRsbigicHVibGljICIgKyBwcm9wZXJ0eUNsYXNzICsgIiAiICsgZ2V0TWV0aG9kICsgIigpIik7Ci0gICAgb3V0LnByaW50bG4oInsiKTsKLSAgICBvdXQuaW5kZW50KCk7Ci0KLSAgICB3cml0ZVByb3BlcnR5R2V0dGVyTWV0aG9kQm9keShvdXQsIHByb3BlcnR5KTsKLQotICAgIG91dC51bmluZGVudCgpOwotICAgIG91dC5wcmludGxuKCJ9Iik7Ci0gIH0KLQotICAvKioKLSAgICogV2hldGhlciB0aGUgZ2V0dGVycy9zZXR0ZXJzIGhhdmUgdGhlIGZpbmFsIG1vZGlmaWVyCi0gICAqCi0gICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZ2V0dGVycy9zZXR0ZXJzIGFyZSBmaW5hbAotICAgKi8KLSAgcHJvdGVjdGVkIGJvb2xlYW4gaXNBY2Nlc3Nvck1ldGhvZEZpbmFsKCkKLSAgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHdyaXRlUHJvcGVydHlHZXR0ZXJNZXRob2RCb2R5KAotICAgICAgUHJldHR5V3JpdGVyIG91dCwKLSAgICAgIFByb3BlcnR5QmVhbiBwcm9wZXJ0eSkgdGhyb3dzIElPRXhjZXB0aW9uOwotCi0gIHB1YmxpYyB2b2lkIHdyaXRlRmFjZXRNZXRob2RzKAotICAgICAgUHJldHR5V3JpdGVyIG91dCwKLSAgICAgIENvbXBvbmVudEJlYW4gY29tcG9uZW50KSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgewotICAgIEl0ZXJhdG9yIGZhY2V0cyA9IGNvbXBvbmVudC5mYWNldHMoKTsKLSAgICB3aGlsZSAoZmFjZXRzLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBGYWNldEJlYW4gZmFjZXQgPSAoRmFjZXRCZWFuKSBmYWNldHMubmV4dCgpOwotICAgICAgd3JpdGVGYWNldEdldChvdXQsIGZhY2V0KTsKLSAgICAgIHdyaXRlRmFjZXRTZXQob3V0LCBmYWNldCk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgd3JpdGVGYWNldFNldCgKLSAgICAgIFByZXR0eVdyaXRlciBvdXQsCi0gICAgICBGYWNldEJlYW4gZmFjZXQpIHRocm93cyBJT0V4Y2VwdGlvbgotICB7Ci0gICAgU3RyaW5nIGZhY2V0TmFtZSA9IGZhY2V0LmdldEZhY2V0TmFtZSgpOwotICAgIC8vIFRPRE86IGRyb3AgdGhlIHVubmVjZXNzYXJ5ICJGYWNldCIgc3VmZml4Ci0gICAgU3RyaW5nIGZhY2V0VmFyID0gZmFjZXROYW1lICsgIkZhY2V0IjsKLSAgICBTdHJpbmcgZmFjZXRLZXkgPSBVdGlsLmdldENvbnN0YW50TmFtZUZyb21Qcm9wZXJ0eShmYWNldE5hbWUsICJfRkFDRVQiKTsKLSAgICBTdHJpbmcgc2V0TWV0aG9kID0gVXRpbC5nZXRQcmVmaXhlZFByb3BlcnR5TmFtZSgic2V0IiwgZmFjZXROYW1lKTsKLSAgICBTdHJpbmcgZGVzY3JpcHRpb24gPSBmYWNldC5nZXREZXNjcmlwdGlvbigpOwotCi0gICAgb3V0LnByaW50bG4oKTsKLSAgICBvdXQucHJpbnRsbigiLyoqIik7Ci0gICAgaWYgKGRlc2NyaXB0aW9uICE9IG51bGwpCi0gICAgewotICAgICAgb3V0LnByaW50bG4oIiAqICIgKyBjb252ZXJ0TXVsdGlsaW5lQ29tbWVudChkZXNjcmlwdGlvbikpOwotICAgIH0KLSAgICBpZiAoZmFjZXQuaXNSZXF1aXJlZCgpKQotICAgIHsKLSAgICAgIG91dC5wcmludGxuKCIgKiA8cD4iKTsKLSAgICAgIG91dC5wcmludGxuKCIgKiBUaGlzIGlzIGEgcmVxdWlyZWQgZmFjZXQgb24gdGhlIGNvbXBvbmVudC4iKTsKLSAgICB9Ci0gICAgLy8gVE9ETzogcHV0IHRoaXMgYmFjayBpbgotICAgIC8vb3V0LnByaW50bG4oIiAqICIpOwotICAgIC8vb3V0LnByaW50bG4oIiAqIEBwYXJhbSAiICsgZmFjZXRWYXIgKyAiICB0aGUgbmV3ICIgKyBmYWNldE5hbWUgKyAiIGZhY2V0Iik7Ci0gICAgb3V0LnByaW50bG4oIiAqLyIpOwotCi0gICAgLy8gUmVtb3ZlIHR5cGUgc2FmZXR5IHdhcm5pbmcgc2luY2UgZ2V0RmFjZXRzIGlzIG5vdCBnZW5lcmljcyBlbmFibGVkCi0gICAgLy8gdW5kZXIgSlNGIDEuMSBzcGVjCi0gICAgLy8gVE9ETzogUmVtb3ZlIHRoaXMgbGluZSB3aGVuIFRyaW5pZGFkIHN3aXRjaCB0byBKU0YgMS4yCi0gICAgb3V0LnByaW50bG4oIkBTdXBwcmVzc1dhcm5pbmdzKFwidW5jaGVja2VkXCIpIik7Ci0KLSAgICBvdXQucHJpbnRsbigiZmluYWwgcHVibGljIHZvaWQgIiArIHNldE1ldGhvZCArICIoVUlDb21wb25lbnQgIiArIGZhY2V0VmFyICsgIikiKTsKLSAgICBvdXQucHJpbnRsbigieyIpOwotICAgIG91dC5pbmRlbnQoKTsKLSAgICBvdXQucHJpbnRsbigiZ2V0RmFjZXRzKCkucHV0KCIgKyBmYWNldEtleSArICIsICIgKyBmYWNldFZhciArICIpOyIpOwotICAgIG91dC51bmluZGVudCgpOwotICAgIG91dC5wcmludGxuKCJ9Iik7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB3cml0ZUZhY2V0R2V0KAotICAgICAgUHJldHR5V3JpdGVyIG91dCwKLSAgICAgIEZhY2V0QmVhbiBmYWNldCkgdGhyb3dzIElPRXhjZXB0aW9uCi0gIHsKLSAgICBTdHJpbmcgZmFjZXROYW1lID0gZmFjZXQuZ2V0RmFjZXROYW1lKCk7Ci0gICAgU3RyaW5nIGZhY2V0S2V5ID0gVXRpbC5nZXRDb25zdGFudE5hbWVGcm9tUHJvcGVydHkoZmFjZXROYW1lLCAiX0ZBQ0VUIik7Ci0gICAgU3RyaW5nIGdldE1ldGhvZCA9IFV0aWwuZ2V0UHJlZml4ZWRQcm9wZXJ0eU5hbWUoImdldCIsIGZhY2V0TmFtZSk7Ci0gICAgU3RyaW5nIGRlc2NyaXB0aW9uID0gZmFjZXQuZ2V0RGVzY3JpcHRpb24oKTsKLQotICAgIG91dC5wcmludGxuKCk7Ci0gICAgb3V0LnByaW50bG4oIi8qKiIpOwotICAgIGlmIChkZXNjcmlwdGlvbiAhPSBudWxsKQotICAgIHsKLSAgICAgIG91dC5wcmludGxuKCIgKiAiICsgY29udmVydE11bHRpbGluZUNvbW1lbnQoZGVzY3JpcHRpb24pKTsKLSAgICB9Ci0gICAgaWYgKGZhY2V0LmlzUmVxdWlyZWQoKSkKLSAgICB7Ci0gICAgICBvdXQucHJpbnRsbigiICogPHA+Iik7Ci0gICAgICBvdXQucHJpbnRsbigiICogVGhpcyBpcyBhIHJlcXVpcmVkIGZhY2V0IG9uIHRoZSBjb21wb25lbnQuIik7Ci0gICAgfQotICAgIC8vIFRPRE86IHB1dCB0aGlzIGJhY2sgaW4KLSAgICAvL291dC5wcmludGxuKCIgKiAiKTsKLSAgICAvL291dC5wcmludGxuKCIgKiBAcmV0dXJuICB0aGUgIiArIGZhY2V0TmFtZSArICIgZmFjZXQiKTsKLSAgICBvdXQucHJpbnRsbigiICovIik7Ci0KLSAgICBvdXQucHJpbnRsbigiZmluYWwgcHVibGljIFVJQ29tcG9uZW50ICIgKyBnZXRNZXRob2QgKyAiKCkiKTsKLSAgICBvdXQucHJpbnRsbigieyIpOwotICAgIG91dC5pbmRlbnQoKTsKLSAgICBvdXQucHJpbnRsbigicmV0dXJuIGdldEZhY2V0KCIgKyBmYWNldEtleSArICIpOyIpOwotICAgIG91dC51bmluZGVudCgpOwotICAgIG91dC5wcmludGxuKCJ9Iik7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB3cml0ZUxpc3RlbmVyTWV0aG9kcygKLSAgICAgIFByZXR0eVdyaXRlciBvdXQsCi0gICAgICBDb21wb25lbnRCZWFuIGNvbXBvbmVudCkgdGhyb3dzIElPRXhjZXB0aW9uCi0gIHsKLSAgICBJdGVyYXRvciBldmVudHMgPSBjb21wb25lbnQuZXZlbnRzKCk7Ci0gICAgd2hpbGUgKGV2ZW50cy5oYXNOZXh0KCkpCi0gICAgewotICAgICAgRXZlbnRSZWZCZWFuIGV2ZW50UmVmID0gKEV2ZW50UmVmQmVhbikgZXZlbnRzLm5leHQoKTsKLSAgICAgIEV2ZW50QmVhbiBldmVudCA9IGV2ZW50UmVmLnJlc29sdmVFdmVudFR5cGUoKTsKLSAgICAgIGlmIChldmVudCAhPSBudWxsKQotICAgICAgewotICAgICAgICB3cml0ZUxpc3RlbmVyQWRkKG91dCwgZXZlbnQpOwotICAgICAgICB3cml0ZUxpc3RlbmVyUmVtb3ZlKG91dCwgZXZlbnQpOwotICAgICAgICB3cml0ZUxpc3RlbmVyc0dldChvdXQsIGV2ZW50KTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB3cml0ZUxpc3RlbmVyQWRkKAotICAgICAgUHJldHR5V3JpdGVyIG91dCwKLSAgICAgIEV2ZW50QmVhbiBldmVudCkgdGhyb3dzIElPRXhjZXB0aW9uCi0gIHsKLSAgICBTdHJpbmcgbGlzdGVuZXJGdWxsQ2xhc3MgPSBldmVudC5nZXRFdmVudExpc3RlbmVyQ2xhc3MoKTsKLSAgICBTdHJpbmcgbGlzdGVuZXJDbGFzcyA9IFV0aWwuZ2V0Q2xhc3NGcm9tRnVsbENsYXNzKGxpc3RlbmVyRnVsbENsYXNzKTsKLQotICAgIFN0cmluZyBldmVudE5hbWUgPSBldmVudC5nZXRFdmVudE5hbWUoKTsKLSAgICBTdHJpbmcgYWRkTWV0aG9kID0gVXRpbC5nZXRNZXRob2ROYW1lRnJvbUV2ZW50KCJhZGQiLCBldmVudE5hbWUsICJMaXN0ZW5lciIpOwotCi0gICAgb3V0LnByaW50bG4oKTsKLSAgICBvdXQucHJpbnRsbigiLyoqIik7Ci0gICAgb3V0LnByaW50bG4oIiAqIEFkZHMgYSAiICsgZXZlbnROYW1lICsgIiBsaXN0ZW5lci4iKTsKLSAgICBvdXQucHJpbnRsbigiICoiKTsKLSAgICBvdXQucHJpbnRsbigiICogQHBhcmFtIGxpc3RlbmVyICB0aGUgIiArIGV2ZW50TmFtZSArICIgbGlzdGVuZXIgdG8gYWRkIik7Ci0gICAgb3V0LnByaW50bG4oIiAqLyIpOwotCi0gICAgaWYgKGlzQWNjZXNzb3JNZXRob2RGaW5hbCgpKQotICAgIHsKLSAgICAgIG91dC5wcmludCgiZmluYWwgIik7Ci0gICAgfQotICAgIG91dC5wcmludGxuKCJwdWJsaWMgdm9pZCAiICsgYWRkTWV0aG9kICsgIigiKTsKLSAgICBvdXQuaW5kZW50KCk7Ci0gICAgb3V0LnByaW50bG4obGlzdGVuZXJDbGFzcyArICIgbGlzdGVuZXIpIik7Ci0gICAgb3V0LnVuaW5kZW50KCk7Ci0gICAgb3V0LnByaW50bG4oInsiKTsKLSAgICBvdXQuaW5kZW50KCk7Ci0gICAgb3V0LnByaW50bG4oImFkZEZhY2VzTGlzdGVuZXIobGlzdGVuZXIpOyIpOwotICAgIG91dC51bmluZGVudCgpOwotICAgIG91dC5wcmludGxuKCJ9Iik7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB3cml0ZUxpc3RlbmVyUmVtb3ZlKAotICAgICAgUHJldHR5V3JpdGVyIG91dCwKLSAgICAgIEV2ZW50QmVhbiBldmVudCkgdGhyb3dzIElPRXhjZXB0aW9uCi0gIHsKLSAgICBTdHJpbmcgbGlzdGVuZXJGdWxsQ2xhc3MgPSBldmVudC5nZXRFdmVudExpc3RlbmVyQ2xhc3MoKTsKLSAgICBTdHJpbmcgbGlzdGVuZXJDbGFzcyA9IFV0aWwuZ2V0Q2xhc3NGcm9tRnVsbENsYXNzKGxpc3RlbmVyRnVsbENsYXNzKTsKLQotICAgIFN0cmluZyBldmVudE5hbWUgPSBldmVudC5nZXRFdmVudE5hbWUoKTsKLSAgICBTdHJpbmcgcmVtb3ZlTWV0aG9kID0gVXRpbC5nZXRNZXRob2ROYW1lRnJvbUV2ZW50KCJyZW1vdmUiLCBldmVudE5hbWUsICJMaXN0ZW5lciIpOwotCi0gICAgb3V0LnByaW50bG4oKTsKLSAgICBvdXQucHJpbnRsbigiLyoqIik7Ci0gICAgb3V0LnByaW50bG4oIiAqIFJlbW92ZXMgYSAiICsgZXZlbnROYW1lICsgIiBsaXN0ZW5lci4iKTsKLSAgICBvdXQucHJpbnRsbigiICoiKTsKLSAgICBvdXQucHJpbnRsbigiICogQHBhcmFtIGxpc3RlbmVyICB0aGUgIiArIGV2ZW50TmFtZSArICIgbGlzdGVuZXIgdG8gcmVtb3ZlIik7Ci0gICAgb3V0LnByaW50bG4oIiAqLyIpOwotCi0gICAgaWYgKGlzQWNjZXNzb3JNZXRob2RGaW5hbCgpKQotICAgIHsKLSAgICAgIG91dC5wcmludCgiZmluYWwgIik7Ci0gICAgfQotICAgIG91dC5wcmludGxuKCJwdWJsaWMgdm9pZCAiICsgcmVtb3ZlTWV0aG9kICsgIigiKTsKLSAgICBvdXQuaW5kZW50KCk7Ci0gICAgb3V0LnByaW50bG4obGlzdGVuZXJDbGFzcyArICIgbGlzdGVuZXIpIik7Ci0gICAgb3V0LnVuaW5kZW50KCk7Ci0gICAgb3V0LnByaW50bG4oInsiKTsKLSAgICBvdXQuaW5kZW50KCk7Ci0gICAgb3V0LnByaW50bG4oInJlbW92ZUZhY2VzTGlzdGVuZXIobGlzdGVuZXIpOyIpOwotICAgIG91dC51bmluZGVudCgpOwotICAgIG91dC5wcmludGxuKCJ9Iik7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB3cml0ZUxpc3RlbmVyc0dldCgKLSAgICAgIFByZXR0eVdyaXRlciBvdXQsCi0gICAgICBFdmVudEJlYW4gZXZlbnQpIHRocm93cyBJT0V4Y2VwdGlvbgotICB7Ci0gICAgU3RyaW5nIGxpc3RlbmVyRnVsbENsYXNzID0gZXZlbnQuZ2V0RXZlbnRMaXN0ZW5lckNsYXNzKCk7Ci0gICAgU3RyaW5nIGxpc3RlbmVyQ2xhc3MgPSBVdGlsLmdldENsYXNzRnJvbUZ1bGxDbGFzcyhsaXN0ZW5lckZ1bGxDbGFzcyk7Ci0KLSAgICBTdHJpbmcgZXZlbnROYW1lID0gZXZlbnQuZ2V0RXZlbnROYW1lKCk7Ci0gICAgU3RyaW5nIGdldE1ldGhvZCA9IFV0aWwuZ2V0TWV0aG9kTmFtZUZyb21FdmVudCgiZ2V0IiwgZXZlbnROYW1lLCAiTGlzdGVuZXJzIik7Ci0KLSAgICBvdXQucHJpbnRsbigpOwotICAgIG91dC5wcmludGxuKCIvKioiKTsKLSAgICBvdXQucHJpbnRsbigiICogUmV0dXJucyBhbiBhcnJheSBvZiBhdHRhY2hlZCAiICsgZXZlbnROYW1lICsgIiBsaXN0ZW5lcnMuIik7Ci0gICAgb3V0LnByaW50bG4oIiAqIik7Ci0gICAgb3V0LnByaW50bG4oIiAqIEByZXR1cm4gIGFuIGFycmF5IG9mIGF0dGFjaGVkICIgKyBldmVudE5hbWUgKyAiIGxpc3RlbmVycy4iKTsKLSAgICBvdXQucHJpbnRsbigiICovIik7Ci0KLSAgICBpZiAoaXNBY2Nlc3Nvck1ldGhvZEZpbmFsKCkpCi0gICAgewotICAgICAgb3V0LnByaW50KCJmaW5hbCAiKTsKLSAgICB9Ci0gICAgb3V0LnByaW50bG4oInB1YmxpYyAiICsgbGlzdGVuZXJDbGFzcyArICJbXSAiICsgZ2V0TWV0aG9kICsgIigpIik7Ci0gICAgb3V0LnByaW50bG4oInsiKTsKLSAgICBvdXQuaW5kZW50KCk7Ci0gICAgb3V0LnByaW50bG4oInJldHVybiAoIiArIGxpc3RlbmVyQ2xhc3MgKyAiW10pIiArCi0gICAgICAgICJnZXRGYWNlc0xpc3RlbmVycygiICsgbGlzdGVuZXJDbGFzcyArICIuY2xhc3MpOyIpOwotICAgIG91dC51bmluZGVudCgpOwotICAgIG91dC5wcmludGxuKCJ9Iik7Ci0gIH0KLQotCi0gIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHdyaXRlU3RhdGVNYW5hZ2VtZW50TWV0aG9kcyhQcmV0dHlXcml0ZXIgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9uZW50QmVhbiBjb21wb25lbnQpIHRocm93cyBJT0V4Y2VwdGlvbjsKLQotICBwdWJsaWMgdm9pZCB3cml0ZU90aGVyKAotICAgICAgUHJldHR5V3JpdGVyIG91dCwgQ29tcG9uZW50QmVhbiBjb21wb25lbnQpIHRocm93cyBJT0V4Y2VwdGlvbgotICB7Ci0gICAgLy8gbm90aGluZwotICB9Ci0KLSAgcHJvdGVjdGVkIFN0cmluZyBjb252ZXJ0TXVsdGlsaW5lQ29tbWVudCgKLSAgICAgIFN0cmluZyBjb21tZW50Qm9keSkKLSAgewotICAgIHJldHVybiBjb21tZW50Qm9keS5yZXBsYWNlQWxsKCJcbiIsICJcbiAqICIpOwotICB9Ci0KLSAgcHJvdGVjdGVkIGNsYXNzIFJlc29sdmFibGVUeXBlRmlsdGVyIGV4dGVuZHMgUHJvcGVydHlGaWx0ZXIKLSAgewotICAgIHByb3RlY3RlZCBib29sZWFuIGFjY2VwdCgKLSAgICAgICAgUHJvcGVydHlCZWFuIHByb3BlcnR5KQotICAgIHsKLSAgICAgIFN0cmluZyBwcm9wZXJ0eUNsYXNzID0gcHJvcGVydHkuZ2V0UHJvcGVydHlDbGFzcygpOwotICAgICAgU3RyaW5nIHJlc29sdmFibGVUeXBlID0gcmVzb2x2ZVR5cGUocHJvcGVydHlDbGFzcyk7Ci0gICAgICByZXR1cm4gKHJlc29sdmFibGVUeXBlICE9IG51bGwpOwotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCBjbGFzcyBOb25WaXJ0dWFsRmlsdGVyIGV4dGVuZHMgUHJvcGVydHlGaWx0ZXIKLSAgewotICAgIHByb3RlY3RlZCBib29sZWFuIGFjY2VwdCgKLSAgICAgICAgUHJvcGVydHlCZWFuIHByb3BlcnR5KQotICAgIHsKLSAgICAgIHJldHVybiAoIXByb3BlcnR5LmlzVmlydHVhbCgpKTsKLSAgICB9Ci0gIH0KLQotICBzdGF0aWMgcHJvdGVjdGVkIFN0cmluZyByZXNvbHZlVHlwZSgKLSAgICAgIFN0cmluZyBjbGFzc05hbWUpCi0gIHsKLSAgICByZXR1cm4gKFN0cmluZykgX1JFU09MVkFCTEVfVFlQRVMuZ2V0KGNsYXNzTmFtZSk7Ci0gIH0KLQotCi0gIHN0YXRpYyBwcml2YXRlIE1hcCBfY3JlYXRlUmVzb2x2YWJsZVR5cGVzKCkKLSAgewotICAgIE1hcCByZXNvbHZhYmxlVHlwZXMgPSBuZXcgSGFzaE1hcCgpOwotCi0gICAgcmVzb2x2YWJsZVR5cGVzLnB1dCgiYm9vbGVhbiIsICJCb29sZWFuIik7Ci0gICAgcmVzb2x2YWJsZVR5cGVzLnB1dCgiY2hhciIsICJDaGFyYWN0ZXIiKTsKLSAgICAvLyBUT0RPOiBwdXQgdGhpcyBiYWNrIGluCi0gICAgLy9yZXNvbHZhYmxlVHlwZXMucHV0KCJqYXZhLnV0aWwuRGF0ZSIsICJEYXRlIik7Ci0gICAgcmVzb2x2YWJsZVR5cGVzLnB1dCgiaW50IiwgIkludGVnZXIiKTsKLSAgICByZXNvbHZhYmxlVHlwZXMucHV0KCJmbG9hdCIsICJGbG9hdCIpOwotICAgIHJlc29sdmFibGVUeXBlcy5wdXQoImRvdWJsZSIsICJEb3VibGUiKTsKLSAgICByZXNvbHZhYmxlVHlwZXMucHV0KCJqYXZhLnV0aWwuTG9jYWxlIiwgIkxvY2FsZSIpOwotICAgIHJlc29sdmFibGVUeXBlcy5wdXQoImxvbmciLCAiTG9uZyIpOwotICAgIHJlc29sdmFibGVUeXBlcy5wdXQoImphdmEubGFuZy5TdHJpbmciLCAiU3RyaW5nIik7Ci0gICAgcmVzb2x2YWJsZVR5cGVzLnB1dCgiamF2YS5sYW5nLk51bWJlciIsICJOdW1iZXIiKTsKLSAgICAvLyBUT0RPOiBwdXQgdGhpcyBiYWNrIGluCi0gICAgLy9yZXNvbHZhYmxlVHlwZXMucHV0KCJqYXZhLmxhbmcuU3RyaW5nW10iLCAiU3RyaW5nQXJyYXkiKTsKLSAgICByZXNvbHZhYmxlVHlwZXMucHV0KCJqYXZhLnV0aWwuVGltZVpvbmUiLCAiVGltZVpvbmUiKTsKLQotICAgIHJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVNYXAocmVzb2x2YWJsZVR5cGVzKTsKLSAgfQotCi0gIHN0YXRpYyBwcml2YXRlIGZpbmFsIFBhdHRlcm4gX0dFTkVSSUNfVFlQRSA9IFBhdHRlcm4uY29tcGlsZSgiKFtePF0rKTwoLispPiIpOwotICBzdGF0aWMgZmluYWwgcHJpdmF0ZSBNYXAgX1JFU09MVkFCTEVfVFlQRVMgPSBfY3JlYXRlUmVzb2x2YWJsZVR5cGVzKCk7Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvZ2VuZXJhdG9yL2NvbXBvbmVudC9Db21wb25lbnRHZW5lcmF0b3IuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy9nZW5lcmF0b3IvY29tcG9uZW50L0NvbXBvbmVudEdlbmVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZWNhNzk4Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy9nZW5lcmF0b3IvY29tcG9uZW50L0NvbXBvbmVudEdlbmVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLmdlbmVyYXRvci5jb21wb25lbnQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLmdlbmVyYXRvci5DbGFzc0dlbmVyYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLmlvLlByZXR0eVdyaXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLnBhcnNlLkNvbXBvbmVudEJlYW47Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi0vKioKLSAqIEdlbmVyYXRlcyBjb21wb25lbnQgY2xhc3NlcwotICoKLSAqIEBhdXRob3IgQnJ1bm8gQXJhbmRhIChsYXRlc3QgbW9kaWZpY2F0aW9uIGJ5ICRBdXRob3IkKQotICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKLSAqLwotcHVibGljIGludGVyZmFjZSBDb21wb25lbnRHZW5lcmF0b3IgZXh0ZW5kcyBDbGFzc0dlbmVyYXRvcgotewotCi0gIHZvaWQgd3JpdGVHZW5lcmljQ29uc3RhbnRzKAotICAgICAgUHJldHR5V3JpdGVyIG91dCwKLSAgICAgIFN0cmluZyBjb21wb25lbnRGYW1pbHksCi0gICAgICBTdHJpbmcgY29tcG9uZW50VHlwZSkgdGhyb3dzIElPRXhjZXB0aW9uOwotCi0gIHZvaWQgd3JpdGVQcm9wZXJ0eUNvbnN0YW50cygKLSAgICAgIFByZXR0eVdyaXRlciBvdXQsCi0gICAgICBTdHJpbmcgc3VwZXJjbGFzc05hbWUsCi0gICAgICBDb21wb25lbnRCZWFuIGNvbXBvbmVudCkgdGhyb3dzIElPRXhjZXB0aW9uOwotCi0gIHZvaWQgd3JpdGVQcm9wZXJ0eVZhbHVlQ29uc3RhbnRzKAotICAgICAgUHJldHR5V3JpdGVyIG91dCwKLSAgICAgIENvbXBvbmVudEJlYW4gY29tcG9uZW50KSB0aHJvd3MgSU9FeGNlcHRpb247Ci0KLSAgdm9pZCB3cml0ZUZhY2V0Q29uc3RhbnRzKAotICAgICAgUHJldHR5V3JpdGVyIG91dCwKLSAgICAgIENvbXBvbmVudEJlYW4gY29tcG9uZW50KSB0aHJvd3MgSU9FeGNlcHRpb247Ci0KLSAgdm9pZCB3cml0ZUdldEZhbWlseSgKLSAgICAgIFByZXR0eVdyaXRlciBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbjsKLQotICB2b2lkIHdyaXRlUHJvcGVydHlNZXRob2RzKAotICAgICAgUHJldHR5V3JpdGVyIG91dCwKLSAgICAgIENvbXBvbmVudEJlYW4gY29tcG9uZW50KSB0aHJvd3MgSU9FeGNlcHRpb247Ci0KLSAgdm9pZCB3cml0ZUZhY2V0TWV0aG9kcygKLSAgICAgIFByZXR0eVdyaXRlciBvdXQsCi0gICAgICBDb21wb25lbnRCZWFuIGNvbXBvbmVudCkgdGhyb3dzIElPRXhjZXB0aW9uOwotCi0gIHZvaWQgd3JpdGVMaXN0ZW5lck1ldGhvZHMoCi0gICAgICBQcmV0dHlXcml0ZXIgb3V0LAotICAgICAgQ29tcG9uZW50QmVhbiBjb21wb25lbnQpIHRocm93cyBJT0V4Y2VwdGlvbjsKLQotICB2b2lkIHdyaXRlU3RhdGVNYW5hZ2VtZW50TWV0aG9kcygKLSAgICAgIFByZXR0eVdyaXRlciBvdXQsCi0gICAgICBDb21wb25lbnRCZWFuIGNvbXBvbmVudCkgdGhyb3dzIElPRXhjZXB0aW9uOwotCi0gIHZvaWQgd3JpdGVPdGhlcigKLSAgICAgIFByZXR0eVdyaXRlciBvdXQsIENvbXBvbmVudEJlYW4gY29tcG9uZW50KSB0aHJvd3MgSU9FeGNlcHRpb247Ci0KLQotICB2b2lkIHdyaXRlUHJvcGVydHlNZXRob2RzKFByZXR0eVdyaXRlciBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9uZW50QmVhbiBjb21wb25lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sbGVjdGlvbiBpZ25vcmVMaXN0KSB0aHJvd3MgSU9FeGNlcHRpb247Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvZ2VuZXJhdG9yL2NvbXBvbmVudC9NeUZhY2VzQ29tcG9uZW50R2VuZXJhdG9yLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvZ2VuZXJhdG9yL2NvbXBvbmVudC9NeUZhY2VzQ29tcG9uZW50R2VuZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1YjUwNmMuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL2dlbmVyYXRvci9jb21wb25lbnQvTXlGYWNlc0NvbXBvbmVudEdlbmVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYyICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy5nZW5lcmF0b3IuY29tcG9uZW50OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4ubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy5nZW5lcmF0b3IuR2VuZXJhdG9ySGVscGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMuaW8uUHJldHR5V3JpdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMucGFyc2UuQ29tcG9uZW50QmVhbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLnBhcnNlLlByb3BlcnR5QmVhbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLnV0aWwuVXRpbDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLS8qKgotICogQ29tcG9uZW50IGdlbmVyYXRvciBmb3IgTXlGYWNlcwotICoKLSAqIEBhdXRob3IgQnJ1bm8gQXJhbmRhIChsYXRlc3QgbW9kaWZpY2F0aW9uIGJ5ICRBdXRob3IkKQotICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKLSAqLwotcHVibGljIGNsYXNzIE15RmFjZXNDb21wb25lbnRHZW5lcmF0b3IgZXh0ZW5kcyBBYnN0cmFjdENvbXBvbmVudEdlbmVyYXRvcgotewotCi0gIHB1YmxpYyBNeUZhY2VzQ29tcG9uZW50R2VuZXJhdG9yKExvZyBsb2csIGJvb2xlYW4gaXMxMikKLSAgewotICAgIHN1cGVyKGxvZywgaXMxMik7Ci0gIH0KLQotCi0gIHByb3RlY3RlZCB2b2lkIGFkZFNwZWNpZmljSW1wb3J0cyhTZXQgaW1wb3J0cywgQ29tcG9uZW50QmVhbiBjb21wb25lbnQpCi0gIHsKLSAgICBpbXBvcnRzLmFkZCgiamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQiKTsKLSAgICBpZiAoX2lzMTIpewotICAgICAgICBpbXBvcnRzLmFkZCgiamF2YXguZWwuVmFsdWVFeHByZXNzaW9uIik7Ci0gICAgfWVsc2V7Ci0gICAgICAgIGltcG9ydHMuYWRkKCJqYXZheC5mYWNlcy5lbC5WYWx1ZUJpbmRpbmciKTsKLSAgICB9Ci0gICAgZm9yIChJdGVyYXRvciBsSXRlcmF0b3IgPSBjb21wb25lbnQucHJvcGVydGllcygpOyBsSXRlcmF0b3IuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBQcm9wZXJ0eUJlYW4gbFByb3BlcnR5QmVhbiA9IChQcm9wZXJ0eUJlYW4pIGxJdGVyYXRvci5uZXh0KCk7Ci0gICAgICBpZiAoR2VuZXJhdG9ySGVscGVyLmlzVmFsaWRhdG9yKGxQcm9wZXJ0eUJlYW4sIF9pczEyKSkKLSAgICAgIHsKLSAgICAgICAgaW1wb3J0cy5hZGQoImphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3IiKTsKLSAgICAgICAgaW1wb3J0cy5hZGQoImphdmEudXRpbC5BcnJheUxpc3QiKTsKLSAgICAgICAgaW1wb3J0cy5hZGQoImphdmEudXRpbC5MaXN0Iik7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHdyaXRlUHJvcGVydHlEZWNsYXJhdGlvbihQcmV0dHlXcml0ZXIgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlCZWFuIHByb3BlcnR5KSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgewotICAgIFN0cmluZyBwcm9wTmFtZSA9IHByb3BlcnR5LmdldFByb3BlcnR5TmFtZSgpOwotICAgIFN0cmluZyBmaWVsZFByb3BOYW1lID0gcHJvcGVydHkuZ2V0RmllbGRQcm9wZXJ0eU5hbWUoKTsKLSAgICBTdHJpbmcgcHJvcGVydHlGdWxsQ2xhc3MgPSBwcm9wZXJ0eS5nZXRQcm9wZXJ0eUNsYXNzKCk7Ci0gICAgU3RyaW5nIHByb3BlcnR5Q2xhc3MgPSBVdGlsLmdldENsYXNzRnJvbUZ1bGxDbGFzcyhwcm9wZXJ0eUZ1bGxDbGFzcyk7Ci0gICAgU3RyaW5nIHByb3BlcnR5R2VuZXJpY3MgPSBVdGlsLmdldEdlbmVyaWNzRnJvbVByb3BlcnR5KHByb3BlcnR5KTsKLSAgICBTdHJpbmcgZGVmID0gVXRpbC5nZXREZWZhdWx0VmFsdWUocHJvcGVydHkpOwotICAgIAotICAgIGlmIChwcm9wZXJ0eUNsYXNzLmVuZHNXaXRoKCJCb29sZWFuIikpewotICAgICAgICBkZWYgPSAiQm9vbGVhbi52YWx1ZU9mKCIrZGVmKyIpIjsKLSAgICB9Ci0KLSAgICBvdXQucHJpbnRsbigpOwotICAgIG91dC5wcmludGxuKCIvLyBQcm9wZXJ0eTogIiArIHByb3BOYW1lKTsKLSAgICBpZiAocHJvcGVydHkuaXNMaXRlcmFsT25seSgpIHx8IHByb3BlcnR5LmlzVGFnQXR0cmlidXRlRXhjbHVkZWQoKSl7Ci0gICAgICAgIC8vSWYgdGhlIHByb3BlcnR5IGlzIGxpdGVyYWwgb3IgaXMgdGFnQXR0cmlidXRlRXhjbHVkZWQsIAotICAgICAgICAvL3RoZSBkZWZhdWx0IHZhbHVlIGdvZXMgb24gdGhlIGRlZmluaXRpb24gb2YgdGhlIGZpZWxkCi0gICAgICAgIG91dC5wcmludGxuKCJwcml2YXRlICIgKyBwcm9wZXJ0eUNsYXNzICsgcHJvcGVydHlHZW5lcmljcyArICIgIiArCi0gICAgICAgICAgICAgICAgZmllbGRQcm9wTmFtZSArIChkZWYgPT0gbnVsbCA/ICI7IiA6ICIgPSAiICsgZGVmICsgIjsiKSk7ICAgICAgICAKLSAgICB9ZWxzZXsgICAgICAgIAotICAgICAgICAvL0lmIGlzIGEgcHJpbWl0aXZlIGNsYXNzLCBoYXMgYSBzZXQgZmllbGQgdG8gY2hlY2sgaWYgdGhpcwotICAgICAgICAvL3Byb3BlcnR5IGlzIGRlZmluZWQsIHNvIHRoZSBkZWZhdWx0IHZhbHVlIGdvZXMgb24gdGhlIAotICAgICAgICAvL2dldHRlciBtZXRob2QuCi0gICAgICAgIC8vSWYgaXMgYSBjbGFzcywgdGhlIHNhbWUgYXBwbGllcywgYmVjYXVzZSB0aGUgY2hlY2sKLSAgICAgICAgLy9pcyBhZ2FpbnN0IG51bGwKLSAgICAgICAgb3V0LnByaW50bG4oInByaXZhdGUgIiArIHByb3BlcnR5Q2xhc3MgKyBwcm9wZXJ0eUdlbmVyaWNzICsgIiAiICsKLSAgICAgICAgICAgICAgICBmaWVsZFByb3BOYW1lICsgIjsiKTsgICAgICAgIAotICAgIH0KLQotICAgIGlmIChVdGlsLmlzUHJpbWl0aXZlQ2xhc3MocHJvcGVydHlGdWxsQ2xhc3MpICYmICFwcm9wZXJ0eS5pc1RhZ0F0dHJpYnV0ZUV4Y2x1ZGVkKCkpCi0gICAgewotICAgICAgb3V0LnByaW50bG4oInByaXZhdGUgYm9vbGVhbiAiICsgZmllbGRQcm9wTmFtZSArICJTZXQ7Iik7Ci0gICAgICAKLSAgICAgIGlmIChwcm9wZXJ0eS5pc0lzU2V0TWV0aG9kKCkpewotICAgICAgICAgIG91dC5wcmludGxuKCk7Ci0gICAgICAgICAgU3RyaW5nIHNjb3BlID0gcHJvcGVydHkuZ2V0SXNTZXRNZXRob2RTY29wZSgpOwotICAgICAgICAgIGlmIChzY29wZSA9PSBudWxsKSBzY29wZSA9ICJwcm90ZWN0ZWQiOwotICAgICAgICAgIG91dC5wcmludGxuKHNjb3BlKyIgYm9vbGVhbiAiK1V0aWwuZ2V0UHJlZml4ZWRQcm9wZXJ0eU5hbWUoImlzU2V0IiwgcHJvcE5hbWUpICsgIigpIik7Ci0gICAgICAgICAgb3V0LnByaW50bG4oInsiKTsKLSAgICAgICAgICBvdXQuaW5kZW50KCk7Ci0gICAgICAgICAgb3V0LnByaW50bG4oInJldHVybiAiICsgZmllbGRQcm9wTmFtZSArICJTZXQ7Iik7Ci0gICAgICAgICAgb3V0LnVuaW5kZW50KCk7Ci0gICAgICAgICAgb3V0LnByaW50bG4oIn0iKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgaWYgKHByb3BlcnR5LmlzSXNHZXRMb2NhbE1ldGhvZCgpKXsKLSAgICAgICAgU3RyaW5nIG1ldGhvZFByZWZpeCA9ICgiYm9vbGVhbiIuZXF1YWxzKHByb3BlcnR5Q2xhc3MpID8gImlzTG9jYWwiIDogImdldExvY2FsIik7Ci0gICAgICAgIFN0cmluZyBtZXRob2ROYW1lID0gVXRpbC5nZXRQcmVmaXhlZFByb3BlcnR5TmFtZShtZXRob2RQcmVmaXgsIHByb3BOYW1lKTsKLSAgICAgICAgCi0gICAgICAgIG91dC5wcmludGxuKCk7Ci0gICAgICAgIFN0cmluZyBzY29wZSA9IHByb3BlcnR5LmdldElzR2V0TG9jYWxNZXRob2RTY29wZSgpOwotICAgICAgICBpZiAoc2NvcGUgPT0gbnVsbCkgc2NvcGUgPSAicHJvdGVjdGVkIjsKLSAgICAgICAgCi0gICAgICAgIG91dC5wcmludGxuKCJmaW5hbCAiK3Njb3BlKyIgIiArIHByb3BlcnR5Q2xhc3MgKyAiICIgKyBtZXRob2ROYW1lICsgIigpIik7Ci0gICAgICAgIG91dC5wcmludGxuKCJ7Iik7Ci0gICAgICAgIG91dC5pbmRlbnQoKTsKLSAgICAgICAgb3V0LnByaW50bG4oInJldHVybiAiICsgZmllbGRQcm9wTmFtZSArICI7Iik7Ci0gICAgICAgIG91dC51bmluZGVudCgpOwotICAgICAgICBvdXQucHJpbnRsbigifSIpOwotICAgICAgICAgICAgICAgIAotICAgIH0gICAgCi0gIH0KLQotICBwdWJsaWMgdm9pZCB3cml0ZVN0YXRlTWFuYWdlbWVudE1ldGhvZHMoUHJldHR5V3JpdGVyIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvbmVudEJlYW4gY29tcG9uZW50KSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgewotICAgIGlmICghY29tcG9uZW50Lmhhc1Byb3BlcnRpZXMoKSkKLSAgICB7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgd3JpdGVTYXZlU3RhdGUob3V0LCBjb21wb25lbnQpOwotICAgIHdyaXRlUmVzdG9yZVN0YXRlKG91dCwgY29tcG9uZW50KTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHdyaXRlUHJvcGVydHlMaXN0TWV0aG9kcygKLSAgICAgIFByZXR0eVdyaXRlciBvdXQsCi0gICAgICBQcm9wZXJ0eUJlYW4gcHJvcGVydHkpIHRocm93cyBJT0V4Y2VwdGlvbgotICB7Ci0gICAgLy8gbm90aGluZwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgd3JpdGVDb25zdHJ1Y3RvckNvbnRlbnQoUHJldHR5V3JpdGVyIG91dCwgQ29tcG9uZW50QmVhbiBjb21wb25lbnQsIGludCBtb2RpZmllcnMsIFN0cmluZyByZW5kZXJlclR5cGUpIHRocm93cyBJT0V4Y2VwdGlvbgotICB7Ci0gICAgb3V0LnByaW50bG4oInNldFJlbmRlcmVyVHlwZSgiICsgcmVuZGVyZXJUeXBlICsgIik7Iik7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCB3cml0ZVByb3BlcnR5TGlzdE1ldGhvZHMoUHJldHR5V3JpdGVyIG91dCwgUHJvcGVydHlCZWFuIHByb3BlcnR5LCBDb2xsZWN0aW9uIGlnbm9yZUxpc3QpCi0gIHsKLSAgICBTdHJpbmcgcHJvcE5hbWUgPSBwcm9wZXJ0eS5nZXRQcm9wZXJ0eU5hbWUoKTsKLSAgICBTdHJpbmcgZ2VuZXJpYzsKLSAgICBTdHJpbmcgdHlwZTsKLSAgICBib29sZWFuIGlzVmFsaWRhdG9yID0gR2VuZXJhdG9ySGVscGVyLmlzVmFsaWRhdG9yKHByb3BlcnR5LCBfaXMxMik7Ci0gICAgaWYgKGlzVmFsaWRhdG9yKQotICAgIHsKLSAgICAgIGdlbmVyaWMgPSAiPFZhbGlkYXRvcj4iOwotICAgICAgdHlwZSA9ICJWYWxpZGF0b3IiOwotICAgIH0KLSAgICBlbHNlIGlmIChwcm9wZXJ0eS5nZXRBdHRyaWJ1dGVDbGFzc1BhcmFtZXRlcnMoKS5sZW5ndGggPT0gMSkKLSAgICB7Ci0gICAgICBnZW5lcmljID0gVXRpbC5nZXRHZW5lcmljc0Zyb21Qcm9wZXJ0eShwcm9wZXJ0eSk7Ci0gICAgICB0eXBlID0gVXRpbC5nZXRDbGFzc0Zyb21GdWxsQ2xhc3MocHJvcGVydHkuZ2V0QXR0cmlidXRlQ2xhc3NQYXJhbWV0ZXJzKClbMF0pOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigib25seSBvbmUgR2VuZXJpYyBQYXJhbWV0ZXIgaXMgYWxsb3dlZCBmb3IgTGlzdHMiKTsKLSAgICB9Ci0KLSAgICBTdHJpbmcgc2luZ3VsYXJOYW1lID0gZ2V0U2luZ3VsYXIocHJvcE5hbWUpOwotICAgIFN0cmluZyBwcm9wVmFyID0gVXRpbC5nZXRWYXJpYWJsZUZyb21OYW1lKHNpbmd1bGFyTmFtZSk7Ci0gICAgU3RyaW5nIGRlc2NyaXB0aW9uID0gcHJvcGVydHkuZ2V0RGVzY3JpcHRpb24oKTsKLSAgICBTdHJpbmcgYWRkTWV0aG9kID0gVXRpbC5nZXRQcmVmaXhlZFByb3BlcnR5TmFtZSgiYWRkIiwgc2luZ3VsYXJOYW1lKTsKLSAgICBTdHJpbmcgcmVtb3ZlTWV0aG9kID0gVXRpbC5nZXRQcmVmaXhlZFByb3BlcnR5TmFtZSgicmVtb3ZlIiwgc2luZ3VsYXJOYW1lKTsKLSAgICBTdHJpbmcgZ2V0TWV0aG9kID0gVXRpbC5nZXRQcmVmaXhlZFByb3BlcnR5TmFtZSgiZ2V0Iiwgc2luZ3VsYXJOYW1lICsgInMiKTsKLSAgICBTdHJpbmcgZmllbGRQcm9wTmFtZSA9IHByb3BlcnR5LmdldEZpZWxkUHJvcGVydHlOYW1lKCkgKyAoaXNWYWxpZGF0b3IgPyAiTGlzdCIgOiAiIik7Ci0KLSAgICBvdXQucHJpbnRsbigpOwotICAgIG91dC5wcmludGxuKCIvLyBQcm9wZXJ0eTogIiArIHByb3BOYW1lKTsKLSAgICBvdXQucHJpbnRsbigicHJpdmF0ZSBMaXN0IiArIGdlbmVyaWMgKyAiICIgKyBmaWVsZFByb3BOYW1lICsgIjsiKTsKLSAgICBpZiAoaWdub3JlTGlzdCA9PSBudWxsIHx8ICFpZ25vcmVMaXN0LmNvbnRhaW5zKGFkZE1ldGhvZCkpCi0gICAgewotICAgICAgb3V0LnByaW50bG4oKTsKLSAgICAgIG91dC5wcmludGxuKCIvKioiKTsKLSAgICAgIGlmIChkZXNjcmlwdGlvbiAhPSBudWxsKQotICAgICAgewotICAgICAgICBvdXQucHJpbnRsbigiICogQWRkcyBhICIgKyBjb252ZXJ0TXVsdGlsaW5lQ29tbWVudChkZXNjcmlwdGlvbikpOwotICAgICAgfQotICAgICAgb3V0LnByaW50bG4oIiAqLyIpOwotICAgICAgb3V0LnByaW50bG4oInB1YmxpYyB2b2lkICIgKyBhZGRNZXRob2QgKyAiKCAiICsgdHlwZSArICIgIiArCi0gICAgICAgICAgcHJvcFZhciArICIpIik7Ci0gICAgICBvdXQucHJpbnRsbigieyIpOwotICAgICAgb3V0LmluZGVudCgpOwotICAgICAgb3V0LnByaW50bG4oImlmICgiICsgcHJvcFZhciArICIgPT0gbnVsbCkgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKFwiIiArIHByb3BWYXIgKyAiXCIpOyIpOwotICAgICAgb3V0LnByaW50bG4oImlmICgiICsgZmllbGRQcm9wTmFtZSArICIgPT0gbnVsbCkiKTsKLSAgICAgIG91dC5wcmludGxuKCIgICIgKyBmaWVsZFByb3BOYW1lICsgIiA9IG5ldyBBcnJheUxpc3QiICsgZ2VuZXJpYyArICIoKTsiKTsKLSAgICAgIG91dC5wcmludGxuKCk7Ci0gICAgICBvdXQucHJpbnRsbihmaWVsZFByb3BOYW1lICsgIi5hZGQoIiArIHByb3BWYXIgKyAiKTsiKTsKLSAgICAgIG91dC51bmluZGVudCgpOwotICAgICAgb3V0LnByaW50bG4oIn0iKTsKLSAgICB9Ci0KLSAgICBpZiAoaWdub3JlTGlzdCA9PSBudWxsIHx8ICFpZ25vcmVMaXN0LmNvbnRhaW5zKHJlbW92ZU1ldGhvZCkpCi0gICAgewotICAgICAgb3V0LnByaW50bG4oKTsKLSAgICAgIG91dC5wcmludGxuKCIvKioiKTsKLSAgICAgIGlmIChkZXNjcmlwdGlvbiAhPSBudWxsKQotICAgICAgewotICAgICAgICBvdXQucHJpbnRsbigiICogUmVtb3ZlcyBhICIgKyBjb252ZXJ0TXVsdGlsaW5lQ29tbWVudChkZXNjcmlwdGlvbikpOwotICAgICAgfQotICAgICAgb3V0LnByaW50bG4oIiAqLyIpOwotICAgICAgb3V0LnByaW50bG4oInB1YmxpYyB2b2lkICIgKyByZW1vdmVNZXRob2QgKyAiKCAiICsgdHlwZSArICIgIiArIHByb3BWYXIgKyAiKSIpOwotICAgICAgb3V0LnByaW50bG4oInsiKTsKLSAgICAgIG91dC5pbmRlbnQoKTsKLSAgICAgIG91dC5wcmludGxuKCJpZiAoIiArIHByb3BWYXIgKyAiID09IG51bGwgfHwgIiArIGZpZWxkUHJvcE5hbWUgKyAiID09IG51bGwpIik7Ci0gICAgICBvdXQucHJpbnRsbigiICByZXR1cm47Iik7Ci0gICAgICBvdXQucHJpbnRsbigpOwotICAgICAgb3V0LnByaW50bG4oZmllbGRQcm9wTmFtZSArICIucmVtb3ZlKCIgKyBwcm9wVmFyICsgIik7Iik7Ci0gICAgICBvdXQudW5pbmRlbnQoKTsKLSAgICAgIG91dC5wcmludGxuKCJ9Iik7Ci0gICAgfQotCi0gICAgaWYgKGlnbm9yZUxpc3QgPT0gbnVsbCB8fCAhaWdub3JlTGlzdC5jb250YWlucyhnZXRNZXRob2QpKQotICAgIHsKLSAgICAgIGlmIChpc1ZhbGlkYXRvcikKLSAgICAgIHsKLSAgICAgICAgb3V0LnByaW50bG4oInByaXZhdGUgc3RhdGljIGZpbmFsICIgKyB0eXBlICsgIltdIEVNUFRZXyIgKyB0eXBlLnRvVXBwZXJDYXNlKCkgKyAiX0FSUkFZID0gbmV3ICIgKyB0eXBlICsgIlswXTsiKTsKLSAgICAgIH0KLSAgICAgIG91dC5wcmludGxuKCk7Ci0gICAgICBvdXQucHJpbnRsbigiLyoqIik7Ci0gICAgICBpZiAoZGVzY3JpcHRpb24gIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgb3V0LnByaW50bG4oIiAqIEdldHMgYWxsICIgKyBjb252ZXJ0TXVsdGlsaW5lQ29tbWVudChkZXNjcmlwdGlvbikpOwotICAgICAgfQotICAgICAgb3V0LnByaW50bG4oIiAqLyIpOwotICAgICAgaWYgKGlzVmFsaWRhdG9yKQotICAgICAgewotICAgICAgICBvdXQucHJpbnRsbigicHVibGljICIgKyB0eXBlICsgIltdICIgKyBnZXRNZXRob2QgKyAiKCkiKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgb3V0LnByaW50bG4oInB1YmxpYyBMaXN0IiArIGdlbmVyaWMgKyAiICIgKyBnZXRNZXRob2QgKyAiKCkiKTsKLSAgICAgIH0KLSAgICAgIG91dC5wcmludGxuKCJ7Iik7Ci0gICAgICBvdXQuaW5kZW50KCk7Ci0gICAgICBpZiAoaXNWYWxpZGF0b3IpCi0gICAgICB7Ci0gICAgICAgIG91dC5wcmludGxuKCJyZXR1cm4gIiArIGZpZWxkUHJvcE5hbWUgKyAiPT0gbnVsbD8gRU1QVFlfIiArIHR5cGUudG9VcHBlckNhc2UoKSArICJfQVJSQVkgOiAiICsgZmllbGRQcm9wTmFtZSArICIudG9BcnJheShuZXcgIiArIHR5cGUgKyAiWyIgKyBmaWVsZFByb3BOYW1lICsgIi5zaXplKCldKTsiKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgb3V0LnByaW50bG4oImlmICgiICsgZmllbGRQcm9wTmFtZSArICIgPT0gbnVsbCkiKTsKLSAgICAgICAgb3V0LmluZGVudCgpOwotICAgICAgICBvdXQucHJpbnRsbihmaWVsZFByb3BOYW1lICsgIiA9IG5ldyBBcnJheUxpc3Q8IiArIHR5cGUgKyAiPigpOyIpOwotICAgICAgICBvdXQudW5pbmRlbnQoKTsKLSAgICAgICAgb3V0LnByaW50bG4oInJldHVybiAiICsgZmllbGRQcm9wTmFtZSArICI7Iik7Ci0gICAgICB9Ci0gICAgICBvdXQudW5pbmRlbnQoKTsKLSAgICAgIG91dC5wcmludGxuKCJ9Iik7Ci0gICAgfQotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgd3JpdGVQcm9wZXJ0eVNldHRlck1ldGhvZEJvZHkoUHJldHR5V3JpdGVyIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlCZWFuIHByb3BlcnR5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcHJvcGVydHlDbGFzcykgdGhyb3dzIElPRXhjZXB0aW9uCi0gIHsKLSAgICBTdHJpbmcgdmFyTmFtZSA9IHByb3BlcnR5LmdldEZpZWxkUHJvcGVydHlOYW1lKCk7Ci0gICAgU3RyaW5nIHByb3BWYXIgPSBVdGlsLmdldFZhcmlhYmxlRnJvbU5hbWUocHJvcGVydHkuZ2V0UHJvcGVydHlOYW1lKCkpOwotCi0gICAgb3V0LnByaW50bG4oInRoaXMuIiArIHZhck5hbWUgKyAiID0gIiArIHByb3BWYXIgKyAiOyIpOwotCi0gICAgaWYgKFV0aWwuaXNQcmltaXRpdmVDbGFzcyhwcm9wZXJ0eUNsYXNzKSAmJiAhcHJvcGVydHkuaXNUYWdBdHRyaWJ1dGVFeGNsdWRlZCgpKQotICAgIHsKLSAgICAgIG91dC5wcmludGxuKCJ0aGlzLiIgKyBfcHJpbWl0aXZlU2V0VmFyTmFtZSh2YXJOYW1lKSArICIgPSB0cnVlOyIpOwotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHdyaXRlUHJvcGVydHlHZXR0ZXJNZXRob2RCb2R5KFByZXR0eVdyaXRlciBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5QmVhbiBwcm9wZXJ0eSkgdGhyb3dzIElPRXhjZXB0aW9uCi0gIHsKLSAgICBTdHJpbmcgdmFyTmFtZSA9IHByb3BlcnR5LmdldEZpZWxkUHJvcGVydHlOYW1lKCk7Ci0gICAgU3RyaW5nIHByb3BGdWxsQ2xhc3MgPSBwcm9wZXJ0eS5nZXRQcm9wZXJ0eUNsYXNzKCk7Ci0gICAgU3RyaW5nIHByb3BDbGFzcyA9IFV0aWwuZ2V0Q2xhc3NGcm9tRnVsbENsYXNzKHByb3BGdWxsQ2xhc3MpOwotICAgIGlmIChwcm9wZXJ0eS5pc1RhZ0F0dHJpYnV0ZUV4Y2x1ZGVkKCkpCi0gICAgewotICAgICAgb3V0LnByaW50bG4oInJldHVybiAiICsgcHJvcGVydHkuZ2V0RmllbGRQcm9wZXJ0eU5hbWUoKSArICI7Iik7Ci0gICAgfQotICAgIGVsc2UgaWYocHJvcGVydHkuaXNMaXRlcmFsT25seSgpKQotICAgIHsKLSAgICAgIG91dC5wcmludGxuKCJyZXR1cm4gIiArIHZhck5hbWUgKyAiOyIpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgaWYgKFV0aWwuaXNQcmltaXRpdmVDbGFzcyhwcm9wRnVsbENsYXNzKSkKLSAgICAgIHsKLSAgICAgICAgb3V0LnByaW50bG4oImlmICgiICsgX3ByaW1pdGl2ZVNldFZhck5hbWUodmFyTmFtZSkgKyAiKSIpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBvdXQucHJpbnRsbigiaWYgKCIgKyB2YXJOYW1lICsgIiAhPSBudWxsKSIpOwotICAgICAgfQotICAgICAgb3V0LnByaW50bG4oInsiKTsKLSAgICAgIG91dC5pbmRlbnQoKTsKLSAgICAgIG91dC5wcmludGxuKCJyZXR1cm4gIiArIHByb3BlcnR5LmdldEZpZWxkUHJvcGVydHlOYW1lKCkgKyAiOyIpOwotICAgICAgb3V0LnVuaW5kZW50KCk7Ci0gICAgICBvdXQucHJpbnRsbigifSIpOwotICAgICAgaWYgKF9pczEyKXsKLSAgICAgICAgICBvdXQucHJpbnRsbigiVmFsdWVFeHByZXNzaW9uIGV4cHJlc3Npb24gPSBnZXRWYWx1ZUV4cHJlc3Npb24oXCIiICsgcHJvcGVydHkuZ2V0UHJvcGVydHlOYW1lKCkgKyAiXCIpOyIpOwotICAgICAgICAgIG91dC5wcmludGxuKCJpZiAoZXhwcmVzc2lvbiAhPSBudWxsKSIpOwotICAgICAgICAgIG91dC5wcmludGxuKCJ7Iik7Ci0gICAgICAgICAgb3V0LmluZGVudCgpOwotICAgICAgICAgIG91dC5wcmludGxuKCJyZXR1cm4gIiArIF9jYXN0SWZOZWNlc3NhcnkocHJvcENsYXNzKSArICJleHByZXNzaW9uLmdldFZhbHVlKGdldEZhY2VzQ29udGV4dCgpLmdldEVMQ29udGV4dCgpKTsiKTsKLSAgICAgICAgICBvdXQudW5pbmRlbnQoKTsKLSAgICAgICAgICBvdXQucHJpbnRsbigifSIpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICAgIG91dC5wcmludGxuKCJWYWx1ZUJpbmRpbmcgdmIgPSBnZXRWYWx1ZUJpbmRpbmcoXCIiICsgcHJvcGVydHkuZ2V0UHJvcGVydHlOYW1lKCkgKyAiXCIpOyIpOwotICAgICAgICAgIG91dC5wcmludGxuKCJpZiAodmIgIT0gbnVsbCkiKTsKLSAgICAgICAgICBvdXQucHJpbnRsbigieyIpOwotICAgICAgICAgIG91dC5pbmRlbnQoKTsKLSAgICAgICAgICAKLSAgICAgICAgICBpZiAoVXRpbC5pc1ByaW1pdGl2ZUNsYXNzKHByb3BGdWxsQ2xhc3MpKQotICAgICAgICAgIHsgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICBvdXQucHJpbnRsbigicmV0dXJuICgiICsgX2Nhc3RJZk5lY2Vzc2FyeShwcm9wQ2xhc3MpICsgInZiLmdldFZhbHVlKGdldEZhY2VzQ29udGV4dCgpKSkuIitwcm9wQ2xhc3MrIlZhbHVlKCk7Iik7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAgIFN0cmluZyB0eXBlID0gbnVsbDsgCi0gICAgICAgICAgICAgIGlmICggKHR5cGUgPSBVdGlsLmdldFByaW1pdGl2ZVR5cGUocHJvcENsYXNzKSkgIT0gbnVsbCkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oIk9iamVjdCB2YWx1ZSA9IHZiID09IG51bGwgPyBudWxsIDogdmIuZ2V0VmFsdWUoZ2V0RmFjZXNDb250ZXh0KCkpOyIpOwotICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oImlmICghKHZhbHVlIGluc3RhbmNlb2YgIitwcm9wQ2xhc3MrIikpeyIpOwotICAgICAgICAgICAgICAgICAgb3V0LmluZGVudCgpOwotICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oInZhbHVlID0gIiArIFV0aWwuZ2V0Qm94ZWRDbGFzcyh0eXBlKSArIi52YWx1ZU9mKHZhbHVlLnRvU3RyaW5nKCkpOyIpOwotICAgICAgICAgICAgICAgICAgb3V0LnVuaW5kZW50KCk7Ci0gICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigifSIpOwotICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oInJldHVybiAiICsgX2Nhc3RJZk5lY2Vzc2FyeShwcm9wQ2xhc3MpICsgInZhbHVlOyIpOyAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oInJldHVybiAiICsgX2Nhc3RJZk5lY2Vzc2FyeShwcm9wQ2xhc3MpICsgInZiLmdldFZhbHVlKGdldEZhY2VzQ29udGV4dCgpKTsiKTsgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICBvdXQudW5pbmRlbnQoKTsKLSAgICAgICAgICBvdXQucHJpbnRsbigifSIpOyAgICAgICAgICAKLSAgICAgIH0KLQotICAgICAgU3RyaW5nIHJldCA9IFV0aWwuZ2V0RGVmYXVsdFZhbHVlKHByb3BlcnR5KTsKLSAgICAgIGlmIChudWxsICE9IHJldCkKLSAgICAgIHsKLSAgICAgICAgb3V0LnByaW50bG4oInJldHVybiAiICsgcmV0ICsgIjsiKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKFV0aWwuaXNQcmltaXRpdmVDbGFzcyhwcm9wRnVsbENsYXNzKSkKLSAgICAgIHsKLSAgICAgICAgb3V0LnByaW50bG4oInJldHVybiAiICsgVXRpbC5wcmltaXRpdmVEZWZhdWx0VmFsdWUocHJvcEZ1bGxDbGFzcykgKyAiOyIpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBvdXQucHJpbnRsbigicmV0dXJuIG51bGw7Iik7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgd3JpdGVTYXZlU3RhdGUoUHJldHR5V3JpdGVyIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9uZW50QmVhbiBjb21wb25lbnQpIHRocm93cyBJT0V4Y2VwdGlvbgotICB7Ci0gICAgU3RyaW5nIGFycmF5TmFtZSA9ICJ2YWx1ZXMiOwotCi0gICAgLy8gZmlyc3Qgd2UgY291bnQgdGhlIHByaW1pdGl2ZSBwcm9wZXJ0aWVzLCBiZWNhdXNlIGZvciBlYWNoIHByaW1pdGl2ZSBwcm9wZXJ0eQotICAgIC8vIHdlIHNhdmUgYSBuZXcgcHJvcGVydHkgdGhhdCBzYXlzIGlmIHRoZSBwcm9wZXJ0eSBoYXMgYmVlbiBzZXQgb3Igbm90Ci0gICAgaW50IHByaW1pdGl2ZVByb3BlcnRpZXNDb3VudCA9IDA7Ci0gICAgZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGNvbXBvbmVudC5wcm9wZXJ0aWVzKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspCi0gICAgewotICAgICAgUHJvcGVydHlCZWFuIHByb3BlcnR5ID0gKFByb3BlcnR5QmVhbikgaXRlcmF0b3IubmV4dCgpOwotICAgICAgaWYgKFV0aWwuaXNQcmltaXRpdmVDbGFzcyhwcm9wZXJ0eS5nZXRQcm9wZXJ0eUNsYXNzKCkpKQotICAgICAgewotICAgICAgICBwcmltaXRpdmVQcm9wZXJ0aWVzQ291bnQrKzsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyB0aGUgdG90YWwgYXJyYXkgc2l6ZSBpcyB0aGUgbnVtYmVyIG9mIHByb3BlcnRpZXMsIHBsdXMgdGhlIG51bWJlciBvZiBwcmltaXRpdmVzLAotICAgIC8vIHBsdXMgMSAodGhlIHN1cGVyIGNhbGwpCi0gICAgaW50IGFycmF5U2l6ZSA9IGNvbXBvbmVudC5wcm9wZXJ0aWVzU2l6ZSgpICsgcHJpbWl0aXZlUHJvcGVydGllc0NvdW50ICsgMTsKLQotICAgIG91dC5wcmludGxuKCk7Ci0gICAgaWYgKF9pczEyKXsKLSAgICAgICAgb3V0LnByaW50bG4oIkBPdmVycmlkZSIpOwotICAgIH0KLSAgICBvdXQucHJpbnRsbigicHVibGljIE9iamVjdCBzYXZlU3RhdGUoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCkiKTsKLSAgICBvdXQucHJpbnRsbigieyIpOwotICAgIG91dC5pbmRlbnQoKTsKLSAgICBvdXQucHJpbnRsbigiT2JqZWN0W10gIiArIGFycmF5TmFtZSArICIgPSBuZXcgT2JqZWN0WyIgKyBhcnJheVNpemUgKyAiXTsiKTsKLQotICAgIG91dC5wcmludGxuKGFycmF5TmFtZSArICJbIiArIDAgKyAiXSA9IHN1cGVyLnNhdmVTdGF0ZShmYWNlc0NvbnRleHQpOyIpOwotCi0gICAgaW50IHByb3BJbmRleCA9IDE7Ci0KLSAgICBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gY29tcG9uZW50LnByb3BlcnRpZXMoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBQcm9wZXJ0eUJlYW4gcHJvcGVydHkgPSAoUHJvcGVydHlCZWFuKSBpdGVyYXRvci5uZXh0KCk7Ci0gICAgICBTdHJpbmcgdmFyTmFtZSA9IHByb3BlcnR5LmdldEZpZWxkUHJvcGVydHlOYW1lKCk7Ci0KLSAgICAgIGlmIChwcm9wZXJ0eS5pc1N0YXRlSG9sZGVyKCkpCi0gICAgICB7Ci0gICAgICAgIGlmIChHZW5lcmF0b3JIZWxwZXIuaXNWYWxpZGF0b3IocHJvcGVydHksIF9pczEyKSkKLSAgICAgICAgewotICAgICAgICAgIG91dC5wcmludGxuKGFycmF5TmFtZSArICJbIiArICsrcHJvcEluZGV4ICsgIl0gPSBzYXZlQXR0YWNoZWRTdGF0ZShmYWNlc0NvbnRleHQsICIgKyB2YXJOYW1lICsgIkxpc3QpOyIpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHByb3BlcnR5LmlzTGlzdCgpKQotICAgICAgICB7Ci0gICAgICAgICAgb3V0LnByaW50bG4oYXJyYXlOYW1lICsgIlsiICsgKytwcm9wSW5kZXggKyAiXSA9IHNhdmVBdHRhY2hlZFN0YXRlKGZhY2VzQ29udGV4dCwgIiArIHZhck5hbWUgKyAiKTsiKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBvdXQucHJpbnRsbihhcnJheU5hbWUgKyAiWyIgKyBwcm9wSW5kZXggKyAiXSA9IHNhdmVBdHRhY2hlZFN0YXRlKGZhY2VzQ29udGV4dCwgIiArIHZhck5hbWUgKyAiKTsiKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZSBpZiAoR2VuZXJhdG9ySGVscGVyLmlzQ29udmVydGVyKHByb3BlcnR5LmdldFByb3BlcnR5Q2xhc3MoKSkpCi0gICAgICB7Ci0gICAgICAgIG91dC5wcmludGxuKGFycmF5TmFtZSArICJbIiArIHByb3BJbmRleCArICJdID0gc2F2ZUF0dGFjaGVkU3RhdGUoZmFjZXNDb250ZXh0LCAiICsgdmFyTmFtZSArICIpOyIpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBpZiAoIV9pczEyICYmIFV0aWwuaXNQcmltaXRpdmVDbGFzcyhwcm9wZXJ0eS5nZXRQcm9wZXJ0eUNsYXNzKCkpKXsKLSAgICAgICAgICAgIG91dC5wcmludGxuKGFycmF5TmFtZSArICJbIiArIHByb3BJbmRleCArICJdID0gIitVdGlsLmdldEJveGVkQ2xhc3MocHJvcGVydHkuZ2V0UHJvcGVydHlDbGFzcygpKSsiLnZhbHVlT2YoIiArIHZhck5hbWUgKyAiKTsiKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIG91dC5wcmludGxuKGFycmF5TmFtZSArICJbIiArIHByb3BJbmRleCArICJdID0gIiArIHZhck5hbWUgKyAiOyIpOwotICAgICAgICB9ICAgICAgICAKLSAgICAgIH0KLQotICAgICAgcHJvcEluZGV4Kys7Ci0KLSAgICAgIGlmIChVdGlsLmlzUHJpbWl0aXZlQ2xhc3MocHJvcGVydHkuZ2V0UHJvcGVydHlDbGFzcygpKSAmJiAhcHJvcGVydHkuaXNUYWdBdHRyaWJ1dGVFeGNsdWRlZCgpKQotICAgICAgewotICAgICAgICBpZiAoIV9pczEyKXsKLSAgICAgICAgICAgIG91dC5wcmludGxuKGFycmF5TmFtZSArICJbIiArIHByb3BJbmRleCArICJdID0gQm9vbGVhbi52YWx1ZU9mKCIgKyBfcHJpbWl0aXZlU2V0VmFyTmFtZSh2YXJOYW1lKSArICIpOyIpOwotICAgICAgICB9ZWxzZXsKLSAgICAgICAgICAgIG91dC5wcmludGxuKGFycmF5TmFtZSArICJbIiArIHByb3BJbmRleCArICJdID0gIiArIF9wcmltaXRpdmVTZXRWYXJOYW1lKHZhck5hbWUpICsgIjsiKTsKLSAgICAgICAgfQotICAgICAgICBwcm9wSW5kZXgrKzsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBvdXQucHJpbnRsbigpOwotICAgIG91dC5wcmludGxuKCJyZXR1cm4gIiArIGFycmF5TmFtZSArICI7Iik7Ci0gICAgb3V0LnVuaW5kZW50KCk7Ci0gICAgb3V0LnByaW50bG4oIn0iKTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHdyaXRlUmVzdG9yZVN0YXRlKFByZXR0eVdyaXRlciBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvbmVudEJlYW4gY29tcG9uZW50KSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgewotICAgIFN0cmluZyBhcnJheU5hbWUgPSAidmFsdWVzIjsKLQotICAgIG91dC5wcmludGxuKCk7Ci0gICAgaWYgKF9pczEyKXsKLSAgICAgICAgb3V0LnByaW50bG4oIkBPdmVycmlkZSIpOwotICAgIH0KLSAgICBvdXQucHJpbnRsbigicHVibGljIHZvaWQgcmVzdG9yZVN0YXRlKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIE9iamVjdCBzdGF0ZSkiKTsKLSAgICBvdXQucHJpbnRsbigieyIpOwotICAgIG91dC5pbmRlbnQoKTsKLQotICAgIG91dC5wcmludGxuKCJPYmplY3RbXSAiICsgYXJyYXlOYW1lICsgIiA9IChPYmplY3RbXSlzdGF0ZTsiKTsKLSAgICBvdXQucHJpbnRsbigic3VwZXIucmVzdG9yZVN0YXRlKGZhY2VzQ29udGV4dCwiICsgYXJyYXlOYW1lICsgIlswXSk7Iik7Ci0KLSAgICBpbnQgcHJvcEluZGV4ID0gMTsKLQotICAgIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBjb21wb25lbnQucHJvcGVydGllcygpOyBpdGVyYXRvci5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIFByb3BlcnR5QmVhbiBwcm9wZXJ0eSA9IChQcm9wZXJ0eUJlYW4pIGl0ZXJhdG9yLm5leHQoKTsKLQotICAgICAgU3RyaW5nIHZhck5hbWUgPSBwcm9wZXJ0eS5nZXRGaWVsZFByb3BlcnR5TmFtZSgpOwotICAgICAgU3RyaW5nIHByb3BGdWxsQ2xhc3MgPSBwcm9wZXJ0eS5nZXRQcm9wZXJ0eUNsYXNzKCk7Ci0gICAgICBTdHJpbmcgcHJvcENsYXNzID0gVXRpbC5nZXRDbGFzc0Zyb21GdWxsQ2xhc3MocHJvcEZ1bGxDbGFzcyk7Ci0KLSAgICAgIGlmIChwcm9wZXJ0eS5pc1N0YXRlSG9sZGVyKCkpCi0gICAgICB7Ci0gICAgICAgIGlmIChHZW5lcmF0b3JIZWxwZXIuaXNWYWxpZGF0b3IocHJvcGVydHksIF9pczEyKSkKLSAgICAgICAgewotICAgICAgICAgIG91dC5wcmludGxuKHZhck5hbWUgKyAiTGlzdCA9IChMaXN0PFZhbGlkYXRvcj4pIHJlc3RvcmVBdHRhY2hlZFN0YXRlKGZhY2VzQ29udGV4dCwgIgotICAgICAgICAgICAgICArIGFycmF5TmFtZSArICJbIiArICsrcHJvcEluZGV4ICsgIl0pOyIpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHByb3BlcnR5LmlzTGlzdCgpKQotICAgICAgICB7Ci0gICAgICAgICAgb3V0LnByaW50bG4odmFyTmFtZSArICIgPSAoTGlzdCkgcmVzdG9yZUF0dGFjaGVkU3RhdGUoZmFjZXNDb250ZXh0LCAiCi0gICAgICAgICAgICAgICsgYXJyYXlOYW1lICsgIlsiICsgKytwcm9wSW5kZXggKyAiXSk7Iik7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgb3V0LnByaW50bG4odmFyTmFtZSArICIgPSAiICsgX2Nhc3RJZk5lY2Vzc2FyeShwcm9wQ2xhc3MpICsgInJlc3RvcmVBdHRhY2hlZFN0YXRlKGZhY2VzQ29udGV4dCwgIgotICAgICAgICAgICAgICArIGFycmF5TmFtZSArICJbIiArIHByb3BJbmRleCArICJdKTsiKTsKLSAgICAgICAgfQotCi0gICAgICB9Ci0gICAgICBlbHNlIGlmIChHZW5lcmF0b3JIZWxwZXIuaXNDb252ZXJ0ZXIocHJvcGVydHkuZ2V0UHJvcGVydHlDbGFzcygpKSkKLSAgICAgIHsKLSAgICAgICAgb3V0LnByaW50bG4odmFyTmFtZSArICIgPSAoQ29udmVydGVyKSByZXN0b3JlQXR0YWNoZWRTdGF0ZShmYWNlc0NvbnRleHQsICIKLSAgICAgICAgICAgICsgYXJyYXlOYW1lICsgIlsiICsgcHJvcEluZGV4ICsgIl0pOyIpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBpZiAoIV9pczEyICYmIFV0aWwuaXNQcmltaXRpdmVDbGFzcyhwcm9wZXJ0eS5nZXRQcm9wZXJ0eUNsYXNzKCkpKXsKLSAgICAgICAgICAgIG91dC5wcmludGxuKHZhck5hbWUgKyAiID0gKCIgKyBfY2FzdElmTmVjZXNzYXJ5KHByb3BDbGFzcykKLSAgICAgICAgICAgICAgICAgICAgKyBhcnJheU5hbWUgKyAiWyIgKyBwcm9wSW5kZXggKyAiXSkuIitwcm9wQ2xhc3MrIlZhbHVlKCk7Iik7ICAgICAgICAgICAgCi0gICAgICAgIH1lbHNlewotICAgICAgICAgICAgb3V0LnByaW50bG4odmFyTmFtZSArICIgPSAiICsgX2Nhc3RJZk5lY2Vzc2FyeShwcm9wQ2xhc3MpCi0gICAgICAgICAgICAgICAgICAgICsgYXJyYXlOYW1lICsgIlsiICsgcHJvcEluZGV4ICsgIl07Iik7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgcHJvcEluZGV4Kys7Ci0KLSAgICAgIGlmIChVdGlsLmlzUHJpbWl0aXZlQ2xhc3MocHJvcGVydHkuZ2V0UHJvcGVydHlDbGFzcygpKSAmJiAhcHJvcGVydHkuaXNUYWdBdHRyaWJ1dGVFeGNsdWRlZCgpKQotICAgICAgewotICAgICAgICBpZiAoIV9pczEyKXsKLSAgICAgICAgICAgIG91dC5wcmludGxuKF9wcmltaXRpdmVTZXRWYXJOYW1lKHZhck5hbWUpICsgIiA9ICgoQm9vbGVhbikiCi0gICAgICAgICAgICAgICAgICAgICsgYXJyYXlOYW1lICsgIlsiICsgcHJvcEluZGV4ICsgIl0pLmJvb2xlYW5WYWx1ZSgpOyIpOwotICAgICAgICB9ZWxzZXsKLSAgICAgICAgICAgIG91dC5wcmludGxuKF9wcmltaXRpdmVTZXRWYXJOYW1lKHZhck5hbWUpICsgIiA9IChCb29sZWFuKSIKLSAgICAgICAgICAgICAgICAgICAgKyBhcnJheU5hbWUgKyAiWyIgKyBwcm9wSW5kZXggKyAiXTsiKTsKLSAgICAgICAgfQotICAgICAgICBwcm9wSW5kZXgrKzsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBvdXQudW5pbmRlbnQoKTsKLSAgICBvdXQucHJpbnRsbigifSIpOwotICB9Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIF9jYXN0SWZOZWNlc3NhcnkoU3RyaW5nIHByb3BDbGFzcykKLSAgewotICAgIGlmIChwcm9wQ2xhc3MuZXF1YWxzKCJPYmplY3QiKSB8fCBwcm9wQ2xhc3MuZXF1YWxzKCJqYXZhLmxhbmcuT2JqZWN0IikpCi0gICAgewotICAgICAgcmV0dXJuICIiOwotICAgIH0KLQotICAgIGlmIChVdGlsLmlzUHJpbWl0aXZlQ2xhc3MocHJvcENsYXNzKSkKLSAgICB7Ci0gICAgICBwcm9wQ2xhc3MgPSBVdGlsLmdldEJveGVkQ2xhc3MocHJvcENsYXNzKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gIigiICsgcHJvcENsYXNzICsgIikiOwotICB9Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIF9wcmltaXRpdmVTZXRWYXJOYW1lKFN0cmluZyB2YXJOYW1lKQotICB7Ci0gICAgcmV0dXJuIHZhck5hbWUgKyAiU2V0IjsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL2dlbmVyYXRvci9jb21wb25lbnQvVHJpbmlkYWRDb21wb25lbnRHZW5lcmF0b3IuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy9nZW5lcmF0b3IvY29tcG9uZW50L1RyaW5pZGFkQ29tcG9uZW50R2VuZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlNWQyN2MuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL2dlbmVyYXRvci9jb21wb25lbnQvVHJpbmlkYWRDb21wb25lbnRHZW5lcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5OSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMuZ2VuZXJhdG9yLmNvbXBvbmVudDsKLQotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMuaW8uUHJldHR5V3JpdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMucGFyc2UuQ29tcG9uZW50QmVhbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLnBhcnNlLlByb3BlcnR5QmVhbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLnV0aWwuRmlsdGVyZWRJdGVyYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLnV0aWwuUHJvcGVydHlGaWx0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy51dGlsLlV0aWw7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1vZGlmaWVyOwotaW1wb3J0IGphdmEudXRpbC4qOwotCi1wdWJsaWMgY2xhc3MgVHJpbmlkYWRDb21wb25lbnRHZW5lcmF0b3IgZXh0ZW5kcyBBYnN0cmFjdENvbXBvbmVudEdlbmVyYXRvcgotewotICBwdWJsaWMgVHJpbmlkYWRDb21wb25lbnRHZW5lcmF0b3IoTG9nIGxvZywgYm9vbGVhbiBpczEyKQotICB7Ci0gICAgc3VwZXIobG9nLCBpczEyKTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGFkZFNwZWNpZmljSW1wb3J0cyhTZXQgaW1wb3J0cywgQ29tcG9uZW50QmVhbiBjb21wb25lbnQpCi0gIHsKLSAgICAvLyBGYWNlc0JlYW4gaXMgYWx3YXlzIG5lZWRlZCB0byBkZWZpbmUgdGhlIFRZUEUKLQotICAgIGltcG9ydHMuYWRkKCJvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuYmVhbi5GYWNlc0JlYW4iKTsKLQotICAgIEl0ZXJhdG9yIHByb3BlcnRpZXMgPSBjb21wb25lbnQucHJvcGVydGllcygpOwotICAgIHByb3BlcnRpZXMgPSBuZXcgRmlsdGVyZWRJdGVyYXRvcihwcm9wZXJ0aWVzLCBuZXcgTm9uVmlydHVhbEZpbHRlcigpKTsKLSAgICAvLyBQcm9wZXJ0eUtleSBvbmx5IG5lZWRlZCBpZiB0aGVyZSBhcmUgcHJvcGVydGllcwotICAgIGlmIChwcm9wZXJ0aWVzLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBpbXBvcnRzLmFkZCgib3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLmJlYW4uUHJvcGVydHlLZXkiKTsKLQotICAgICAgUHJvcGVydHlGaWx0ZXIgcmVzb2x2YWJsZSA9IG5ldyBSZXNvbHZhYmxlVHlwZUZpbHRlcigpOwotICAgICAgd2hpbGUgKHByb3BlcnRpZXMuaGFzTmV4dCgpKQotICAgICAgewotICAgICAgICBQcm9wZXJ0eUJlYW4gcHJvcGVydHkgPSAoUHJvcGVydHlCZWFuKSBwcm9wZXJ0aWVzLm5leHQoKTsKLQotICAgICAgICAvLyBDb21wb25lbnRVdGlscyBvbmx5IG5lZWRlZCBmb3IgcmVzb2x2YWJsZSBwcm9wZXJ0aWVzCi0gICAgICAgIGlmIChyZXNvbHZhYmxlLmFjY2VwdChwcm9wZXJ0eSkpCi0gICAgICAgICAgaW1wb3J0cy5hZGQoIm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC51dGlsLkNvbXBvbmVudFV0aWxzIik7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgd3JpdGVDb25zdHJ1Y3RvckNvbnRlbnQoUHJldHR5V3JpdGVyIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9uZW50QmVhbiBjb21wb25lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtb2RpZmllcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyByZW5kZXJlclR5cGUpIHRocm93cyBJT0V4Y2VwdGlvbgotICB7Ci0gICAgb3V0LnByaW50bG4oInN1cGVyKCIgKyByZW5kZXJlclR5cGUgKyAiKTsiKTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHdyaXRlUHJvcGVydHlMaXN0TWV0aG9kcyhQcmV0dHlXcml0ZXIgb3V0LCBQcm9wZXJ0eUJlYW4gcHJvcGVydHksIENvbGxlY3Rpb24gZ25vcmVMaXN0KQotICB7Ci0gICAgLy8gbm90aGluZwotICB9Ci0KLSAgcHVibGljIHZvaWQgd3JpdGVQcm9wZXJ0eUNvbnN0YW50cygKLSAgICAgIFByZXR0eVdyaXRlciBvdXQsCi0gICAgICBTdHJpbmcgc3VwZXJjbGFzc05hbWUsCi0gICAgICBDb21wb25lbnRCZWFuIGNvbXBvbmVudCkgdGhyb3dzIElPRXhjZXB0aW9uCi0gIHsKLSAgICBvdXQucHJpbnRsbigic3RhdGljIHB1YmxpYyBmaW5hbCBGYWNlc0JlYW4uVHlwZSBUWVBFID0gbmV3IEZhY2VzQmVhbi5UeXBlKCIpOwotICAgIG91dC5pbmRlbnQoKTsKLSAgICBvdXQucHJpbnRsbihzdXBlcmNsYXNzTmFtZSArICIuVFlQRSk7Iik7Ci0gICAgb3V0LnVuaW5kZW50KCk7Ci0KLSAgICAvLyAgY29tcG9uZW50IHByb3BlcnR5IGtleXMKLSAgICBJdGVyYXRvciBwcm9wZXJ0aWVzID0gY29tcG9uZW50LnByb3BlcnRpZXMoKTsKLSAgICBwcm9wZXJ0aWVzID0gbmV3IEZpbHRlcmVkSXRlcmF0b3IocHJvcGVydGllcywgbmV3IE5vblZpcnR1YWxGaWx0ZXIoKSk7Ci0gICAgd2hpbGUgKHByb3BlcnRpZXMuaGFzTmV4dCgpKQotICAgIHsKLSAgICAgIFByb3BlcnR5QmVhbiBwcm9wZXJ0eSA9IChQcm9wZXJ0eUJlYW4pIHByb3BlcnRpZXMubmV4dCgpOwotICAgICAgU3RyaW5nIHByb3BOYW1lID0gcHJvcGVydHkuZ2V0UHJvcGVydHlOYW1lKCk7Ci0gICAgICBTdHJpbmcgcHJvcEtleSA9IFV0aWwuZ2V0Q29uc3RhbnROYW1lRnJvbVByb3BlcnR5KHByb3BOYW1lLCAiX0tFWSIpOwotICAgICAgU3RyaW5nIHByb3BBbGlhcyA9IHByb3BlcnR5LmdldEFsaWFzT2YoKTsKLQotICAgICAgb3V0LnByaW50bG4oInN0YXRpYyBwdWJsaWMgZmluYWwgUHJvcGVydHlLZXkgIiArIHByb3BLZXkgKyAiID0iKTsKLSAgICAgIG91dC5pbmRlbnQoKTsKLSAgICAgIGlmIChwcm9wQWxpYXMgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIGFsaWFzS2V5ID0gVXRpbC5nZXRDb25zdGFudE5hbWVGcm9tUHJvcGVydHkocHJvcEFsaWFzLCAiX0tFWSIpOwotICAgICAgICBvdXQucHJpbnQoIlRZUEUucmVnaXN0ZXJBbGlhcygiICsgYWxpYXNLZXkgKyAiLCBcIiIgKyBwcm9wTmFtZSArICJcIik7Iik7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIG91dC5wcmludCgiVFlQRS5yZWdpc3RlcktleShcIiIgKyBwcm9wTmFtZSArICJcIiIpOwotCi0gICAgICAgIC8vIHByb3BlcnR5IGNsYXNzCi0gICAgICAgIFN0cmluZyBwcm9wRnVsbENsYXNzID0gcHJvcGVydHkuZ2V0UHJvcGVydHlDbGFzcygpOwotICAgICAgICBTdHJpbmcgcHJvcENsYXNzID0gVXRpbC5nZXRDbGFzc0Zyb21GdWxsQ2xhc3MocHJvcEZ1bGxDbGFzcyk7Ci0gICAgICAgIGlmIChwcm9wQ2xhc3MgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIHByb3BDbGFzcyA9ICJTdHJpbmciOwotICAgICAgICB9Ci0gICAgICAgIFN0cmluZyBwcm9wRGVmYXVsdCA9IHByb3BlcnR5LmdldERlZmF1bHRWYWx1ZSgpOwotCi0gICAgICAgIGlmICghIk9iamVjdCIuZXF1YWxzKHByb3BDbGFzcykgfHwgcHJvcERlZmF1bHQgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIC8vIFRPRE86IGRvIG5vdCB1c2UgYm94ZWQgY2xhc3MgaGVyZQotICAgICAgICAgIFN0cmluZyBib3hlZENsYXNzID0gVXRpbC5nZXRCb3hlZENsYXNzKHByb3BDbGFzcyk7Ci0gICAgICAgICAgb3V0LnByaW50KCIsICIgKyBib3hlZENsYXNzICsgIi5jbGFzcyIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHByb3BEZWZhdWx0ICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAocHJvcGVydHkuaXNFbnVtKCkpCi0gICAgICAgICAgICBvdXQucHJpbnQoIiwgRW51bS52YWx1ZU9mKCIgKyBwcm9wQ2xhc3MgKyAiLmNsYXNzLCIgKwotICAgICAgICAgICAgICAgICAgICAgIGNvbnZlcnRTdHJpbmdUb0JveGVkTGl0ZXJhbCgiU3RyaW5nIiwgcHJvcERlZmF1bHQpICsKLSAgICAgICAgICAgICAgICAgICAgICAiKSIpOwotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIG91dC5wcmludCgiLCAiICsgY29udmVydFN0cmluZ1RvQm94ZWRMaXRlcmFsKHByb3BDbGFzcywgcHJvcERlZmF1bHQpKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIHByb3BlcnR5IGNhcGFiaWxpdGllcwotICAgICAgICBTdHJpbmcgcHJvcENhcHMgPSBfZ2V0UHJvcGVydHlDYXBhYmlsaXRpZXMocHJvcGVydHkpOwotICAgICAgICBpZiAocHJvcENhcHMgIT0gbnVsbCkKLSAgICAgICAgICBvdXQucHJpbnQoIiwgIiArIHByb3BDYXBzKTsKLSAgICAgICAgb3V0LnByaW50bG4oIik7Iik7Ci0gICAgICB9Ci0gICAgICBvdXQudW5pbmRlbnQoKTsKLSAgICB9Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCB3cml0ZVByb3BlcnR5RGVjbGFyYXRpb24oUHJldHR5V3JpdGVyIG91dCwgUHJvcGVydHlCZWFuIHByb3BlcnR5KSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgewotICAgIC8vIG5vdGhpbmcgYnkgZGVmYXVsdAotICB9Ci0KLQotICAvKioKLSAgICogV2hldGhlciB0aGUgZ2V0dGVycy9zZXR0ZXJzIGhhdmUgdGhlIGZpbmFsIG1vZGlmaWVyCi0gICAqCi0gICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZ2V0dGVycy9zZXR0ZXJzIGFyZSBmaW5hbAotICAgKi8KLSAgcHJvdGVjdGVkIGJvb2xlYW4gaXNBY2Nlc3Nvck1ldGhvZEZpbmFsKCkKLSAgewotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgd3JpdGVQcm9wZXJ0eVNldHRlck1ldGhvZEJvZHkoUHJldHR5V3JpdGVyIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlCZWFuIHByb3BlcnR5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcHJvcGVydHlDbGFzcykgdGhyb3dzIElPRXhjZXB0aW9uCi0gIHsKLSAgICBTdHJpbmcgcHJvcE5hbWUgPSBwcm9wZXJ0eS5nZXRQcm9wZXJ0eU5hbWUoKTsKLSAgICBTdHJpbmcgcHJvcEtleSA9IFV0aWwuZ2V0Q29uc3RhbnROYW1lRnJvbVByb3BlcnR5KHByb3BOYW1lLCAiX0tFWSIpOwotICAgIFN0cmluZyBwcm9wVmFyID0gVXRpbC5nZXRWYXJpYWJsZUZyb21OYW1lKHByb3BOYW1lKTsKLQotICAgIGlmIChVdGlsLmlzUHJpbWl0aXZlQ2xhc3MocHJvcGVydHlDbGFzcykpCi0gICAgewotICAgICAgb3V0LnByaW50bG4oInNldFByb3BlcnR5KCIgKyBwcm9wS2V5ICsgIiwgIiArCi0gICAgICAgICAgICAgICAgICBjb252ZXJ0VmFyaWFibGVUb0JveGVkRm9ybShwcm9wZXJ0eUNsYXNzLCBwcm9wVmFyKSArCi0gICAgICAgICAgICAgICAgICAiKTsiKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIG91dC5wcmludGxuKCJzZXRQcm9wZXJ0eSgiICsgcHJvcEtleSArICIsICgiICsgcHJvcFZhciArICIpKTsiKTsKLSAgICB9Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCB3cml0ZVByb3BlcnR5R2V0dGVyTWV0aG9kQm9keSgKLSAgICAgIFByZXR0eVdyaXRlciBvdXQsCi0gICAgICBQcm9wZXJ0eUJlYW4gcHJvcGVydHkpIHRocm93cyBJT0V4Y2VwdGlvbgotICB7Ci0gICAgU3RyaW5nIHByb3BOYW1lID0gcHJvcGVydHkuZ2V0UHJvcGVydHlOYW1lKCk7Ci0gICAgU3RyaW5nIHByb3BlcnR5RnVsbENsYXNzID0gcHJvcGVydHkuZ2V0UHJvcGVydHlDbGFzcygpOwotICAgIFN0cmluZyBwcm9wZXJ0eUNsYXNzID0gVXRpbC5nZXRDbGFzc0Zyb21GdWxsQ2xhc3MocHJvcGVydHlGdWxsQ2xhc3MpOwotICAgIFN0cmluZyBwcm9wS2V5ID0gVXRpbC5nZXRDb25zdGFudE5hbWVGcm9tUHJvcGVydHkocHJvcE5hbWUsICJfS0VZIik7Ci0KLSAgICBTdHJpbmcgcmVzb2x2YWJsZVR5cGUgPSByZXNvbHZlVHlwZShwcm9wZXJ0eUZ1bGxDbGFzcyk7Ci0KLSAgICBpZiAocmVzb2x2YWJsZVR5cGUgIT0gbnVsbCkKLSAgICB7Ci0gICAgICAvLyBUT0RPOiBjaGFuZ2Ugc2lnbmF0dXJlIG9mIENvbXBvbmVudFV0aWxzLnJlc29sdmVDaGFyYWN0ZXIKLSAgICAgIC8vICAgICAgIHRvIHRha2UgT2JqZWN0IGluc3RlYWQgb2YgQ2hhcmFjdGVyCi0gICAgICBpZiAocmVzb2x2YWJsZVR5cGUuZXF1YWxzKCJDaGFyYWN0ZXIiKSkKLSAgICAgIHsKLSAgICAgICAgb3V0LnByaW50bG4oInJldHVybiBDb21wb25lbnRVdGlscy5yZXNvbHZlQ2hhcmFjdGVyKChDaGFyYWN0ZXIpZ2V0UHJvcGVydHkoIiArIHByb3BLZXkgKyAiKSk7Iik7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIC8vIFRPRE86IHN0b3Agc3BlY2lmeWluZyBkZWZhdWx0IHZhbHVlcyBpbiB0aGUgZ2V0dGVycwotICAgICAgICBTdHJpbmcgcmVzb2x2ZU1ldGhvZCA9IFV0aWwuZ2V0UHJlZml4ZWRQcm9wZXJ0eU5hbWUoInJlc29sdmUiLCByZXNvbHZhYmxlVHlwZSk7Ci0gICAgICAgIFN0cmluZyBwcm9wZXJ0eURlZmF1bHQgPSBwcm9wZXJ0eS5nZXREZWZhdWx0VmFsdWUoKTsKLSAgICAgICAgb3V0LnByaW50KCJyZXR1cm4gQ29tcG9uZW50VXRpbHMuIiArIHJlc29sdmVNZXRob2QgKyAiKGdldFByb3BlcnR5KCIgKyBwcm9wS2V5ICsgIikiKTsKLSAgICAgICAgaWYgKHByb3BlcnR5RGVmYXVsdCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgb3V0LnByaW50KCIsICIgKyBVdGlsLmNvbnZlcnRTdHJpbmdUb0xpdGVyYWwocHJvcGVydHlDbGFzcywKLSAgICAgICAgICAgICAgcHJvcGVydHlEZWZhdWx0KSk7Ci0gICAgICAgIH0KLSAgICAgICAgb3V0LnByaW50bG4oIik7Iik7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBpZiAocHJvcGVydHlDbGFzcy5lcXVhbHMoIk9iamVjdCIpKQotICAgICAgewotICAgICAgICAvLyBDYXN0IGlzIG5vdCBuZWNlc3NhcnkgaWYgdGhlIHByb3BlcnR5IGNsYXNzIGlzIE9iamVjdAotICAgICAgICBvdXQucHJpbnRsbigicmV0dXJuIGdldFByb3BlcnR5KCIgKyBwcm9wS2V5ICsgIik7Iik7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIG91dC5wcmludGxuKCJyZXR1cm4gKCIgKyBwcm9wZXJ0eUNsYXNzICsgIikiICsKLSAgICAgICAgICAgICJnZXRQcm9wZXJ0eSgiICsgcHJvcEtleSArICIpOyIpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHdyaXRlU3RhdGVNYW5hZ2VtZW50TWV0aG9kcyhQcmV0dHlXcml0ZXIgb3V0LCBDb21wb25lbnRCZWFuIGNvbXBvbmVudCkgdGhyb3dzIElPRXhjZXB0aW9uCi0gIHsKLSAgICAvLyBub3RoaW5nIHRvIGRvIGhlcmUKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHdyaXRlUHJvcGVydHlMaXN0TWV0aG9kcygKLSAgICAgIFByZXR0eVdyaXRlciBvdXQsCi0gICAgICBQcm9wZXJ0eUJlYW4gcHJvcGVydHkpIHRocm93cyBJT0V4Y2VwdGlvbgotICB7Ci0gICAgU3RyaW5nIHByb3BOYW1lID0gcHJvcGVydHkuZ2V0UHJvcGVydHlOYW1lKCk7Ci0gICAgU3RyaW5nIHByb3BLZXkgPSBVdGlsLmdldENvbnN0YW50TmFtZUZyb21Qcm9wZXJ0eShwcm9wTmFtZSwgIl9LRVkiKTsKLSAgICBTdHJpbmcgcHJvcGVydHlDbGFzcyA9IHByb3BlcnR5LmdldFByb3BlcnR5Q2xhc3MoKTsKLSAgICBpZiAoISJqYXZhLnV0aWwuTGlzdCIuZXF1YWxzKHByb3BlcnR5Q2xhc3MpKQotICAgIHsKLSAgICAgIGdldExvZygpLmVycm9yKCJJbnZhbGlkIGxpc3QgdHlwZTogIiArIHByb3BlcnR5Q2xhc3MpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIC8vIExvb2sgZm9yIHRoZSBnZW5lcmljIHR5cGUgLSBpZiBpdCBkb2Vzbid0IGV4aXN0LCB0aGVuCi0gICAgLy8gd2UnbGwgYmUgYW4gT2JqZWN0LgotICAgIFN0cmluZ1tdIHBhcmFtcyA9IHByb3BlcnR5LmdldFByb3BlcnR5Q2xhc3NQYXJhbWV0ZXJzKCk7Ci0gICAgaWYgKChwYXJhbXMgPT0gbnVsbCkgfHwgKHBhcmFtcy5sZW5ndGggPT0gMCkpCi0gICAgICBwcm9wZXJ0eUNsYXNzID0gImphdmEubGFuZy5PYmplY3QiOwotICAgIGVsc2UKLSAgICAgIHByb3BlcnR5Q2xhc3MgPSBwYXJhbXNbMF07Ci0KLSAgICBwcm9wZXJ0eUNsYXNzID0gVXRpbC5nZXRDbGFzc0Zyb21GdWxsQ2xhc3MocHJvcGVydHlDbGFzcyk7Ci0KLSAgICBTdHJpbmcgc2luZ3VsYXJOYW1lID0gZ2V0U2luZ3VsYXIocHJvcE5hbWUpOwotICAgIFN0cmluZyBwcm9wVmFyID0gVXRpbC5nZXRWYXJpYWJsZUZyb21OYW1lKHNpbmd1bGFyTmFtZSk7Ci0gICAgU3RyaW5nIGRlc2NyaXB0aW9uID0gcHJvcGVydHkuZ2V0RGVzY3JpcHRpb24oKTsKLSAgICBTdHJpbmcgYWRkTWV0aG9kID0gVXRpbC5nZXRQcmVmaXhlZFByb3BlcnR5TmFtZSgiYWRkIiwgc2luZ3VsYXJOYW1lKTsKLSAgICBTdHJpbmcgcmVtb3ZlTWV0aG9kID0gVXRpbC5nZXRQcmVmaXhlZFByb3BlcnR5TmFtZSgicmVtb3ZlIiwgc2luZ3VsYXJOYW1lKTsKLSAgICBTdHJpbmcgZ2V0TWV0aG9kID0gVXRpbC5nZXRQcmVmaXhlZFByb3BlcnR5TmFtZSgiZ2V0IiwgcHJvcE5hbWUpOwotCi0gICAgb3V0LnByaW50bG4oKTsKLSAgICBvdXQucHJpbnRsbigiLyoqIik7Ci0gICAgaWYgKGRlc2NyaXB0aW9uICE9IG51bGwpCi0gICAgewotICAgICAgb3V0LnByaW50bG4oIiAqIEFkZHMgYSAiICsgY29udmVydE11bHRpbGluZUNvbW1lbnQoZGVzY3JpcHRpb24pKTsKLSAgICB9Ci0gICAgb3V0LnByaW50bG4oIiAqLyIpOwotICAgIG91dC5wcmludGxuKCJmaW5hbCBwdWJsaWMgdm9pZCAiICsgYWRkTWV0aG9kICsgIigiICsgcHJvcGVydHlDbGFzcyArICIgIiArCi0gICAgICAgIHByb3BWYXIgKyAiKSIpOwotICAgIG91dC5wcmludGxuKCJ7Iik7Ci0gICAgb3V0LmluZGVudCgpOwotICAgIG91dC5wcmludGxuKCJpZiAoIiArIHByb3BWYXIgKyAiID09IG51bGwpIik7Ci0gICAgb3V0LnByaW50bG4oIiAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Iik7Ci0gICAgb3V0LnByaW50bG4oKTsKLSAgICBvdXQucHJpbnRsbigiZ2V0RmFjZXNCZWFuKCkuYWRkRW50cnkoIiArIHByb3BLZXkgKyAiLCAiICsgcHJvcFZhciArICIpOyIpOwotICAgIG91dC51bmluZGVudCgpOwotICAgIG91dC5wcmludGxuKCJ9Iik7Ci0KLSAgICBvdXQucHJpbnRsbigpOwotICAgIG91dC5wcmludGxuKCIvKioiKTsKLSAgICBpZiAoZGVzY3JpcHRpb24gIT0gbnVsbCkKLSAgICB7Ci0gICAgICBvdXQucHJpbnRsbigiICogUmVtb3ZlcyBhICIgKyBjb252ZXJ0TXVsdGlsaW5lQ29tbWVudChkZXNjcmlwdGlvbikpOwotICAgIH0KLSAgICBvdXQucHJpbnRsbigiICovIik7Ci0gICAgb3V0LnByaW50bG4oImZpbmFsIHB1YmxpYyB2b2lkICIgKyByZW1vdmVNZXRob2QgKyAiKCIgKyBwcm9wZXJ0eUNsYXNzICsgIiAiICsKLSAgICAgICAgcHJvcFZhciArICIpIik7Ci0gICAgb3V0LnByaW50bG4oInsiKTsKLSAgICBvdXQuaW5kZW50KCk7Ci0gICAgb3V0LnByaW50bG4oImlmICgiICsgcHJvcFZhciArICIgPT0gbnVsbCkiKTsKLSAgICBvdXQucHJpbnRsbigiICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsiKTsKLSAgICBvdXQucHJpbnRsbigpOwotICAgIG91dC5wcmludGxuKCJnZXRGYWNlc0JlYW4oKS5yZW1vdmVFbnRyeSgiICsgcHJvcEtleSArICIsICIgKyBwcm9wVmFyICsgIik7Iik7Ci0gICAgb3V0LnVuaW5kZW50KCk7Ci0gICAgb3V0LnByaW50bG4oIn0iKTsKLQotICAgIG91dC5wcmludGxuKCk7Ci0gICAgb3V0LnByaW50bG4oIi8qKiIpOwotICAgIGlmIChkZXNjcmlwdGlvbiAhPSBudWxsKQotICAgIHsKLSAgICAgIG91dC5wcmludGxuKCIgKiBHZXRzIGFsbCAiICsgY29udmVydE11bHRpbGluZUNvbW1lbnQoZGVzY3JpcHRpb24pKTsKLSAgICB9Ci0gICAgb3V0LnByaW50bG4oIiAqLyIpOwotICAgIG91dC5wcmludGxuKCJmaW5hbCBwdWJsaWMgIiArIHByb3BlcnR5Q2xhc3MgKyAiW10gIiArIGdldE1ldGhvZCArICIoKSIpOwotICAgIG91dC5wcmludGxuKCJ7Iik7Ci0gICAgb3V0LmluZGVudCgpOwotICAgIG91dC5wcmludGxuKCJyZXR1cm4gKCIgKyBwcm9wZXJ0eUNsYXNzICsgIltdKSBnZXRGYWNlc0JlYW4oKS5nZXRFbnRyaWVzKCIpOwotICAgIG91dC5wcmludGxuKCIgICAgICAgICAiICsgcHJvcEtleSArICIsICIgKyBwcm9wZXJ0eUNsYXNzICsgIi5jbGFzcyk7Iik7Ci0gICAgb3V0LnVuaW5kZW50KCk7Ci0gICAgb3V0LnByaW50bG4oIn0iKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHdyaXRlT3RoZXIoUHJldHR5V3JpdGVyIG91dCwgQ29tcG9uZW50QmVhbiBjb21wb25lbnQpIHRocm93cyBJT0V4Y2VwdGlvbgotICB7Ci0gICAgX3dyaXRlR2V0QmVhblR5cGUob3V0KTsKLQotICAgIHdyaXRlQ29uc3RydWN0b3Iob3V0LCBjb21wb25lbnQsIE1vZGlmaWVyLlBST1RFQ1RFRCk7Ci0KLSAgICBfd3JpdGVUeXBlTG9jayhvdXQsIGNvbXBvbmVudCk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBfd3JpdGVHZXRCZWFuVHlwZSgKLSAgICAgIFByZXR0eVdyaXRlciBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbgotICB7Ci0gICAgb3V0LnByaW50bG4oKTsKLSAgICBvdXQucHJpbnRsbigiQE92ZXJyaWRlIik7Ci0gICAgb3V0LnByaW50bG4oInByb3RlY3RlZCBGYWNlc0JlYW4uVHlwZSBnZXRCZWFuVHlwZSgpIik7Ci0gICAgb3V0LnByaW50bG4oInsiKTsKLSAgICBvdXQuaW5kZW50KCk7Ci0gICAgb3V0LnByaW50bG4oInJldHVybiBUWVBFOyIpOwotICAgIG91dC51bmluZGVudCgpOwotICAgIG91dC5wcmludGxuKCJ9Iik7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgX3dyaXRlVHlwZUxvY2soCi0gICAgICBQcmV0dHlXcml0ZXIgb3V0LCBDb21wb25lbnRCZWFuIGNvbXBvbmVudCkgdGhyb3dzIElPRXhjZXB0aW9uCi0gIHsKLSAgICBvdXQucHJpbnRsbigpOwotICAgIG91dC5wcmludGxuKCJzdGF0aWMiKTsKLSAgICBvdXQucHJpbnRsbigieyIpOwotICAgIG91dC5pbmRlbnQoKTsKLSAgICBTdHJpbmcgcmVuZGVyZXJUeXBlID0gY29tcG9uZW50LmdldFJlbmRlcmVyVHlwZSgpOwotICAgIGlmIChyZW5kZXJlclR5cGUgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBvdXQucHJpbnRsbigiVFlQRS5sb2NrKCk7Iik7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBTdHJpbmcgY29tcG9uZW50RmFtaWx5ID0gY29tcG9uZW50LmZpbmRDb21wb25lbnRGYW1pbHkoKTsKLSAgICAgIG91dC5wcmludGxuKCJUWVBFLmxvY2tBbmRSZWdpc3RlcihcIiIgKyBjb21wb25lbnRGYW1pbHkgKyAiXCIsIiArCi0gICAgICAgICAgIlwiIiArIHJlbmRlcmVyVHlwZSArICJcIik7Iik7Ci0gICAgfQotCi0gICAgb3V0LnVuaW5kZW50KCk7Ci0gICAgb3V0LnByaW50bG4oIn0iKTsKLSAgfQotCi0gIHByaXZhdGUgU3RyaW5nIF9nZXRQcm9wZXJ0eUNhcGFiaWxpdGllcygKLSAgICAgIFByb3BlcnR5QmVhbiBwcm9wZXJ0eSkKLSAgewotICAgIExpc3QgY2FwcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAgIGlmIChwcm9wZXJ0eS5pc01ldGhvZEJpbmRpbmcoKSB8fAotICAgICAgICBwcm9wZXJ0eS5pc0xpdGVyYWxPbmx5KCkpCi0gICAgewotICAgICAgY2Fwcy5hZGQoIlByb3BlcnR5S2V5LkNBUF9OT1RfQk9VTkQiKTsKLSAgICB9Ci0KLSAgICBpZiAocHJvcGVydHkuaXNTdGF0ZUhvbGRlcigpKQotICAgIHsKLSAgICAgIGNhcHMuYWRkKCJQcm9wZXJ0eUtleS5DQVBfU1RBVEVfSE9MREVSIik7Ci0gICAgfQotCi0gICAgaWYgKHByb3BlcnR5LmlzVHJhbnNpZW50KCkpCi0gICAgewotICAgICAgY2Fwcy5hZGQoIlByb3BlcnR5S2V5LkNBUF9UUkFOU0lFTlQiKTsKLSAgICB9Ci0KLSAgICBpZiAocHJvcGVydHkuaXNMaXN0KCkpCi0gICAgewotICAgICAgY2Fwcy5hZGQoIlByb3BlcnR5S2V5LkNBUF9MSVNUIik7Ci0gICAgfQotCi0gICAgaWYgKGNhcHMuaXNFbXB0eSgpKQotICAgICAgcmV0dXJuIG51bGw7Ci0KLSAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjYXBzLnNpemUoKTsgaSsrKQotICAgIHsKLSAgICAgIGlmIChpID4gMCkKLSAgICAgICAgc2IuYXBwZW5kKCIgfCAiKTsKLSAgICAgIHNiLmFwcGVuZChjYXBzLmdldChpKSk7Ci0gICAgfQotICAgIHJldHVybiBzYi50b1N0cmluZygpOwotICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvZ2VuZXJhdG9yL3RhZ2xpYi9BYnN0cmFjdENvbXBvbmVudFRhZ0dlbmVyYXRvci5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL2dlbmVyYXRvci90YWdsaWIvQWJzdHJhY3RDb21wb25lbnRUYWdHZW5lcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmE4ZGI4My4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvZ2VuZXJhdG9yL3RhZ2xpYi9BYnN0cmFjdENvbXBvbmVudFRhZ0dlbmVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjk3ICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy5nZW5lcmF0b3IudGFnbGliOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy5nZW5lcmF0b3IuR2VuZXJhdG9ySGVscGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMuaW8uUHJldHR5V3JpdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMucGFyc2UuQ29tcG9uZW50QmVhbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLnBhcnNlLlByb3BlcnR5QmVhbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLnV0aWwuRmlsdGVyZWRJdGVyYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLnV0aWwuU291cmNlVGVtcGxhdGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy51dGlsLlV0aWw7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1vZGlmaWVyOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5UcmVlU2V0OwotCi0vKioKLSAqIFRPRE86IGNvbW1lbnQgdGhpcyEKLSAqCi0gKiBAYXV0aG9yIEJydW5vIEFyYW5kYSAobGF0ZXN0IG1vZGlmaWNhdGlvbiBieSAkQXV0aG9yJCkKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdENvbXBvbmVudFRhZ0dlbmVyYXRvciBpbXBsZW1lbnRzIENvbXBvbmVudFRhZ0dlbmVyYXRvcgotewotCi0gIHB1YmxpYyB2b2lkIHdyaXRlSW1wb3J0cyhQcmV0dHlXcml0ZXIgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlVGVtcGxhdGUgdGVtcGxhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcGFja2FnZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZnVsbFN1cGVyY2xhc3NOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHN1cGVyY2xhc3NOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9uZW50QmVhbiBjb21wb25lbnQpCi0gIHsKLSAgICBDb2xsZWN0aW9uIGNvbXBvbmVudHMgPSBuZXcgSGFzaFNldCgpOwotICAgIGNvbXBvbmVudHMuYWRkKGNvbXBvbmVudCk7Ci0gICAgd3JpdGVJbXBvcnRzKG91dCwgdGVtcGxhdGUsIHBhY2thZ2VOYW1lLCBmdWxsU3VwZXJjbGFzc05hbWUsIHN1cGVyY2xhc3NOYW1lLCBjb21wb25lbnRzKTsKLSAgfQotCi0KLSAgcHVibGljIHZvaWQgd3JpdGVJbXBvcnRzKFByZXR0eVdyaXRlciBvdXQsIFNvdXJjZVRlbXBsYXRlIHRlbXBsYXRlLCBTdHJpbmcgcGFja2FnZU5hbWUsIFN0cmluZyBmdWxsU3VwZXJjbGFzc05hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc3VwZXJjbGFzc05hbWUsIENvbGxlY3Rpb24gY29tcG9uZW50cykKLSAgewotICAgIFNldCBpbXBvcnRzID0gbmV3IFRyZWVTZXQoKTsKLQotICAgIGZvciAoSXRlcmF0b3IgbEl0ZXJhdG9yID0gY29tcG9uZW50cy5pdGVyYXRvcigpOyBsSXRlcmF0b3IuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBDb21wb25lbnRCZWFuIGNvbXBvbmVudCA9IChDb21wb25lbnRCZWFuKSBsSXRlcmF0b3IubmV4dCgpOwotICAgICAgSXRlcmF0b3IgcHJvcGVydGllcyA9IGNvbXBvbmVudC5wcm9wZXJ0aWVzKCk7Ci0gICAgICBwcm9wZXJ0aWVzID0gbmV3IEZpbHRlcmVkSXRlcmF0b3IocHJvcGVydGllcywgbmV3IFRhZ0F0dHJpYnV0ZUZpbHRlcigpKTsKLQotICAgICAgLy8gVE9ETzogcmVtb3ZlIHRoZXNlIGltcG9ydHMKLSAgICAgIC8vIEZJWE1FOiBBY3R1YWxseSBsYXN0IDIgY2FuIGJlIGtlcHQgd2hlbiBub3QgYWJzdHJhY3QKLSAgICAgIC8vaW1wb3J0cy5hZGQoImphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudCIpOwotCi0gICAgICAvLyBzdXBlcmNsYXNzTmFtZSBpcyBmdWxseSBxdWFsaWZpZWQgaWYgaXQgY29sbGlkZXMKLSAgICAgIC8vIHdpdGggdGhlIGdlbmVyYXRlZCBjbGFzcyBuYW1lIGFuZCBzaG91bGQgbm90IGJlCi0gICAgICAvLyBpbXBvcnRlZCB3aGVuIHN1Y2ggYSBjb2xsaXNpb24gd291bGQgb2NjdXIKLSAgICAgIGlmICghc3VwZXJjbGFzc05hbWUuZXF1YWxzKGZ1bGxTdXBlcmNsYXNzTmFtZSkpCi0gICAgICB7Ci0gICAgICAgIGltcG9ydHMuYWRkKGZ1bGxTdXBlcmNsYXNzTmFtZSk7Ci0gICAgICB9Ci0KLSAgICAgIHdoaWxlIChwcm9wZXJ0aWVzLmhhc05leHQoKSkKLSAgICAgIHsKLSAgICAgICAgUHJvcGVydHlCZWFuIHByb3BlcnR5ID0gKFByb3BlcnR5QmVhbikgcHJvcGVydGllcy5uZXh0KCk7Ci0KLSAgICAgICAgU3RyaW5nIHByb3BlcnR5Q2xhc3MgPSBwcm9wZXJ0eS5nZXRQcm9wZXJ0eUNsYXNzKCk7Ci0gICAgICAgIFN0cmluZ1tdIHByb3BlcnR5Q2xhc3NQYXJhbXMgPSBwcm9wZXJ0eS5nZXRQcm9wZXJ0eUNsYXNzUGFyYW1ldGVycygpOwotCi0gICAgICAgIGlmIChwcm9wZXJ0eUNsYXNzICE9IG51bGwgJiYgcHJvcGVydHkuaXNMaXRlcmFsT25seSgpKQotICAgICAgICB7Ci0gICAgICAgICAgLy8gSW1wb3J0IHRoZSBwcm9wZXJ0eSBjbGFzcyBvbmx5IGlmIG9ubHkgbGl0dGVyYWxzIGFyZSBzdXBwb3J0ZWQKLSAgICAgICAgICAvLyBvdGhlcndpc2UgdGhlIGNsYXNzIHdpbGwgYmUgYSBTdHJpbmcgaW5zaWRlIHRoZSB0YWcgdG8gc3VwcG9ydAotICAgICAgICAgIC8vIFZhbHVlQmluZGluZwotICAgICAgICAgIGltcG9ydHMuYWRkKHByb3BlcnR5Q2xhc3MpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gVE9ETzogcmVzdG9yZSBpbXBvcnQgYW5kIG1ha2UgcmVmZXJlbmNlIHRvCi0gICAgICAgIC8vICAgICAgIENvbnN0YW50TWV0aG9kQmluZGluZyByZWxhdGl2ZSByYXRoZXIKLSAgICAgICAgLy8gICAgICAgdGhhbiBhYnNvbHV0ZQotICAgICAgICAvL2lmIChwcm9wZXJ0eS5pc01ldGhvZEJpbmRpbmcoKSAmJgotICAgICAgICAvLyAgICBpc1N0cmluZ01ldGhvZEJpbmRpbmdSZXR1cm5UeXBlKHByb3BlcnR5KSkKLSAgICAgICAgLy97Ci0gICAgICAgIC8vICBpbXBvcnRzLmFkZCgib3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkaW50ZXJuYWwudGFnbGliLkNvbnN0YW50TWV0aG9kQmluZGluZyIpOwotICAgICAgICAvL30KLSAgICAgIH0KLQotICAgICAgYWRkU3BlY2lmaWNJbXBvcnRzKGltcG9ydHMsIGNvbXBvbmVudCk7Ci0KLSAgICB9Ci0gICAgLy8gZG8gbm90IGltcG9ydCBpbXBsaWNpdCEKLSAgICBpbXBvcnRzLnJlbW92ZUFsbChVdGlsLlBSSU1JVElWRV9UWVBFUyk7Ci0KLSAgICBHZW5lcmF0b3JIZWxwZXIud3JpdGVJbXBvcnRzKG91dCwgcGFja2FnZU5hbWUsIGltcG9ydHMpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgd3JpdGVDbGFzc0JlZ2luKFByZXR0eVdyaXRlciBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgY2xhc3NOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHN1cGVyY2xhc3NOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9uZW50QmVhbiBjb21wb25lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VUZW1wbGF0ZSB0ZW1wbGF0ZSkKLSAgewotICAgIGludCBtb2RpZmllcnMgPSBjb21wb25lbnQuZ2V0VGFnQ2xhc3NNb2RpZmllcnMoKTsKLSAgICBTdHJpbmcgY2xhc3NTdGFydCA9IE1vZGlmaWVyLnRvU3RyaW5nKG1vZGlmaWVycyk7Ci0KLSAgICBvdXQucHJpbnRsbigiLyoqIik7Ci0gICAgb3V0LnByaW50bG4oIiAqIEF1dG8tZ2VuZXJhdGVkIHRhZyBjbGFzcy4iKTsKLSAgICBvdXQucHJpbnRsbigiICovIik7Ci0KLSAgICAvLyBUT0RPOiB1c2UgY2Fub25pY2FsIG9yZGVyaW5nCi0gICAgY2xhc3NTdGFydCA9IGNsYXNzU3RhcnQucmVwbGFjZUFsbCgicHVibGljIGFic3RyYWN0IiwgImFic3RyYWN0IHB1YmxpYyIpOwotICAgIG91dC5wcmludGxuKGNsYXNzU3RhcnQgKyAiIGNsYXNzICIgKyBjbGFzc05hbWUgKwotICAgICAgICAiIGV4dGVuZHMgIiArIHN1cGVyY2xhc3NOYW1lKTsKLSAgICBvdXQucHJpbnRsbigieyIpOwotICAgIG91dC5pbmRlbnQoKTsKLSAgfQotCi0KLSAgcHVibGljIHZvaWQgd3JpdGVDb25zdHJ1Y3RvcihQcmV0dHlXcml0ZXIgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvbmVudEJlYW4gY29tcG9uZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtb2RpZmllcnMpIHRocm93cyBJT0V4Y2VwdGlvbgotICB7Ci0gICAgU3RyaW5nIGZ1bGxDbGFzc05hbWUgPSBjb21wb25lbnQuZ2V0VGFnQ2xhc3MoKTsKLSAgICBTdHJpbmcgY2xhc3NOYW1lID0gVXRpbC5nZXRDbGFzc0Zyb21GdWxsQ2xhc3MoZnVsbENsYXNzTmFtZSk7Ci0gICAgb3V0LnByaW50bG4oKTsKLSAgICBvdXQucHJpbnRsbigiLyoqIik7Ci0gICAgLy8gVE9ETzogcmVzdG9yZSB0aGlzIGNvcnJlY3RseSBwaHJhc2VkIGNvbW1lbnQgKHRlbnNlIHZzLiBjb21tYW5kKQotICAgIC8vb3V0LnByaW50bG4oIiAqIENvbnN0cnVjdHMgYW4gaW5zdGFuY2Ugb2YgIiArIGNsYXNzTmFtZSArICIuIik7Ci0gICAgb3V0LnByaW50bG4oIiAqIENvbnN0cnVjdCBhbiBpbnN0YW5jZSBvZiB0aGUgIiArIGNsYXNzTmFtZSArICIuIik7Ci0gICAgb3V0LnByaW50bG4oIiAqLyIpOwotICAgIG91dC5wcmludGxuKCJwdWJsaWMgIiArIGNsYXNzTmFtZSArICIoKSIpOwotICAgIG91dC5wcmludGxuKCJ7Iik7Ci0gICAgb3V0LnByaW50bG4oIn0iKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHdyaXRlR2V0Q29tcG9uZW50VHlwZSgKLSAgICAgIFByZXR0eVdyaXRlciBvdXQsCi0gICAgICBDb21wb25lbnRCZWFuIGNvbXBvbmVudCkgdGhyb3dzIElPRXhjZXB0aW9uCi0gIHsKLSAgICBTdHJpbmcgY29tcG9uZW50VHlwZSA9IGNvbXBvbmVudC5nZXRDb21wb25lbnRUeXBlKCk7Ci0gICAgb3V0LnByaW50bG4oKTsKLQotICAgIC8vIFRoZSBzdXBlcmNsYXNzIGRvZXMgbm90IG5lY2Vzc2FyaWx5IG5lZWQgdG8gaGF2ZSB0aGlzIG1ldGhvZAotICAgIC8vb3V0LnByaW50bG4oIkBPdmVycmlkZSIpOwotICAgIG91dC5wcmludGxuKCJwdWJsaWMgU3RyaW5nIGdldENvbXBvbmVudFR5cGUoKSIpOwotICAgIG91dC5wcmludGxuKCJ7Iik7Ci0gICAgb3V0LmluZGVudCgpOwotICAgIG91dC5wcmludGxuKCJyZXR1cm4gXCIiICsgY29tcG9uZW50VHlwZSArICJcIjsiKTsKLSAgICBvdXQudW5pbmRlbnQoKTsKLSAgICBvdXQucHJpbnRsbigifSIpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgd3JpdGVHZXRSZW5kZXJlclR5cGUoCi0gICAgICBQcmV0dHlXcml0ZXIgb3V0LAotICAgICAgQ29tcG9uZW50QmVhbiBjb21wb25lbnQpIHRocm93cyBJT0V4Y2VwdGlvbgotICB7Ci0gICAgU3RyaW5nIHJlbmRlcmVyVHlwZSA9IGNvbXBvbmVudC5nZXRSZW5kZXJlclR5cGUoKTsKLSAgICBvdXQucHJpbnRsbigpOwotCi0gICAgLy8gVGhlIHN1cGVyY2xhc3MgZG9lcyBub3QgbmVjZXNzYXJpbHkgbmVlZCB0byBoYXZlIHRoaXMgbWV0aG9kCi0gICAgLy9vdXQucHJpbnRsbigiQE92ZXJyaWRlIik7Ci0gICAgb3V0LnByaW50bG4oInB1YmxpYyBTdHJpbmcgZ2V0UmVuZGVyZXJUeXBlKCkiKTsKLSAgICBvdXQucHJpbnRsbigieyIpOwotICAgIG91dC5pbmRlbnQoKTsKLSAgICBvdXQucHJpbnRsbigicmV0dXJuICIgKyBVdGlsLmNvbnZlcnRTdHJpbmdUb0xpdGVyYWwocmVuZGVyZXJUeXBlKSArICI7Iik7Ci0gICAgb3V0LnVuaW5kZW50KCk7Ci0gICAgb3V0LnByaW50bG4oIn0iKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHdyaXRlQ2xhc3NFbmQoUHJldHR5V3JpdGVyIG91dCkKLSAgewotICAgIG91dC51bmluZGVudCgpOwotICAgIG91dC5wcmludGxuKCJ9Iik7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB3cml0ZVByb3BlcnR5TWVtYmVycyhQcmV0dHlXcml0ZXIgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb25lbnRCZWFuIGNvbXBvbmVudCkgdGhyb3dzIElPRXhjZXB0aW9uCi0gIHsKLSAgICBJdGVyYXRvciBwcm9wZXJ0aWVzID0gY29tcG9uZW50LnByb3BlcnRpZXMoKTsKLSAgICBwcm9wZXJ0aWVzID0gbmV3IEZpbHRlcmVkSXRlcmF0b3IocHJvcGVydGllcywgbmV3IFRhZ0F0dHJpYnV0ZUZpbHRlcigpKTsKLQotICAgIHdoaWxlIChwcm9wZXJ0aWVzLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBQcm9wZXJ0eUJlYW4gcHJvcGVydHkgPSAoUHJvcGVydHlCZWFuKSBwcm9wZXJ0aWVzLm5leHQoKTsKLSAgICAgIHdyaXRlUHJvcGVydHlEZWNsYXJhdGlvbihvdXQsIHByb3BlcnR5KTsKLSAgICAgIHdyaXRlUHJvcGVydHlTZXR0ZXIob3V0LCBwcm9wZXJ0eSk7Ci0gICAgfQotICB9Ci0KLQotICBwdWJsaWMgdm9pZCB3cml0ZVByb3BlcnR5TWVtYmVycyhQcmV0dHlXcml0ZXIgb3V0LCBDb2xsZWN0aW9uIGNvbXBvbmVudHMpIHRocm93cyBJT0V4Y2VwdGlvbgotICB7Ci0gICAgZm9yIChJdGVyYXRvciBsSXRlcmF0b3IgPSBjb21wb25lbnRzLml0ZXJhdG9yKCk7IGxJdGVyYXRvci5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIHdyaXRlUHJvcGVydHlNZW1iZXJzKG91dCwgKENvbXBvbmVudEJlYW4pIGxJdGVyYXRvci5uZXh0KCkpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHdyaXRlUmVsZWFzZU1ldGhvZChQcmV0dHlXcml0ZXIgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9uZW50QmVhbiBjb21wb25lbnQpIHRocm93cyBJT0V4Y2VwdGlvbgotICB7Ci0gICAgQ29sbGVjdGlvbiBjb21wb25lbnRzID0gbmV3IEhhc2hTZXQoKTsKLSAgICBjb21wb25lbnRzLmFkZChjb21wb25lbnQpOwotICAgIHdyaXRlUmVsZWFzZU1ldGhvZChvdXQsIGNvbXBvbmVudHMpOwotICB9Ci0KLQotICBwdWJsaWMgdm9pZCB3cml0ZVJlbGVhc2VNZXRob2QoCi0gICAgUHJldHR5V3JpdGVyIG91dCwgQ29sbGVjdGlvbiBjb21wb25lbnRzKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgewotICAgIENvbGxlY3Rpb24gYWxsID0gbmV3IEhhc2hTZXQoKTsKLSAgICBib29sZWFuIHNwZWNpYWwgPSBmYWxzZTsKLSAgICBmb3IgKEl0ZXJhdG9yIGxJdGVyYXRvciA9IGNvbXBvbmVudHMuaXRlcmF0b3IoKTsgbEl0ZXJhdG9yLmhhc05leHQoKTspCi0gICAgewotICAgICAgQ29tcG9uZW50QmVhbiBjb21wb25lbnQgPSAoQ29tcG9uZW50QmVhbikgbEl0ZXJhdG9yLm5leHQoKTsKLSAgICAgIEl0ZXJhdG9yIHByb3AgPSBjb21wb25lbnQucHJvcGVydGllcygpOwotICAgICAgLy8gVE9ETzogcmVtb3ZlIHNwZWNpYWwgY2FzZSBmb3IgVUlYRm9ybVRhZwotICAgICAgc3BlY2lhbCB8PSAib3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkaW50ZXJuYWwudGFnbGliLlVJWEZvcm1UYWciLmVxdWFscyhjb21wb25lbnQuZ2V0VGFnQ2xhc3MoKSk7Ci0gICAgICB3aGlsZSAocHJvcC5oYXNOZXh0KCkpCi0gICAgICB7Ci0gICAgICAgIGFsbC5hZGQocHJvcC5uZXh0KCkpOwotICAgICAgfQotICAgIH0KLQotICAgIEl0ZXJhdG9yIHByb3BlcnRpZXMgPSBhbGwuaXRlcmF0b3IoKTsKLSAgICBwcm9wZXJ0aWVzID0gbmV3IEZpbHRlcmVkSXRlcmF0b3IocHJvcGVydGllcywgbmV3IFRhZ0F0dHJpYnV0ZUZpbHRlcigpKTsKLSAgICBpZiAocHJvcGVydGllcy5oYXNOZXh0KCkgfHwgc3BlY2lhbCkKLSAgICB7Ci0gICAgICBvdXQucHJpbnRsbigpOwotICAgICAgaWYgKGlzMTIoKSl7Ci0gICAgICAgICAgb3V0LnByaW50bG4oIkBPdmVycmlkZSIpOwotICAgICAgfQotICAgICAgb3V0LnByaW50bG4oInB1YmxpYyB2b2lkIHJlbGVhc2UoKSIpOwotICAgICAgb3V0LnByaW50bG4oInsiKTsKLSAgICAgIG91dC5pbmRlbnQoKTsKLSAgICAgIG91dC5wcmludGxuKCJzdXBlci5yZWxlYXNlKCk7Iik7Ci0gICAgICB3aGlsZSAocHJvcGVydGllcy5oYXNOZXh0KCkpCi0gICAgICB7Ci0gICAgICAgIFByb3BlcnR5QmVhbiBwcm9wZXJ0eSA9IChQcm9wZXJ0eUJlYW4pIHByb3BlcnRpZXMubmV4dCgpOwotICAgICAgICBTdHJpbmcgcHJvcE5hbWUgPSBwcm9wZXJ0eS5nZXRQcm9wZXJ0eU5hbWUoKTsKLSAgICAgICAgU3RyaW5nIHByb3BWYXIgPSAiXyIgKyBwcm9wTmFtZTsKLSAgICAgICAgb3V0LnByaW50KHByb3BWYXIgKyAiID0gIik7Ci0gICAgICAgIFN0cmluZyB0eXBlID0gR2VuZXJhdG9ySGVscGVyLmdldEpzcFByb3BlcnR5VHlwZShwcm9wZXJ0eSwgaXMxMigpKTsKLSAgICAgICAgLy8gRklYTUU6IHN1cHBvcnQgYWxsIHByaW1pdGl2ZSB0eXBlcy4gIEluIHByYWN0aWNlLCB0aGUgb25seSB0eXBlcwotICAgICAgICAvLyB0aGF0IGhhdmUgY29tZSB1cCBhcmUgVmFsdWVFeHByZXNzaW9uLCBTdHJpbmcsIGFuZCBib29sZWFuCi0gICAgICAgIGlmICgiYm9vbGVhbiIuZXF1YWxzKHR5cGUpKQotICAgICAgICAgIG91dC5wcmludGxuKCJmYWxzZTsiKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgIG91dC5wcmludGxuKCJudWxsOyIpOwotICAgICAgfQotICAgICAgb3V0LnVuaW5kZW50KCk7Ci0gICAgICBvdXQucHJpbnRsbigifSIpOwotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGFkZFNwZWNpZmljSW1wb3J0cygKLSAgICAgIFNldCBpbXBvcnRzLAotICAgICAgQ29tcG9uZW50QmVhbiBjb21wb25lbnQpCi0gIHsKLSAgICAvLyBub3RoaW5nIGJ5IGRlZmF1bHQKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIG1ldGhvZCBpcyBiZWluZyB1c2VkIGZvciBnZW5lcmF0aW5nIEpTRiAxLjIgY29kZS4KLSAgICovCi0gIHByb3RlY3RlZCBhYnN0cmFjdCBib29sZWFuIGlzMTIoKTsKLQotICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCB3cml0ZVByb3BlcnR5RGVjbGFyYXRpb24oUHJldHR5V3JpdGVyIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5QmVhbiBwcm9wZXJ0eSkgdGhyb3dzIElPRXhjZXB0aW9uOwotCi0gIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHdyaXRlUHJvcGVydHlTZXR0ZXIoUHJldHR5V3JpdGVyIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eUJlYW4gcHJvcGVydHkpIHRocm93cyBJT0V4Y2VwdGlvbjsKLQotICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCB3cml0ZVNldFByb3BlcnR5TWV0aG9kQm9keShQcmV0dHlXcml0ZXIgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgY29tcG9uZW50Q2xhc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEl0ZXJhdG9yIHByb3BlcnRpZXMpIHRocm93cyBJT0V4Y2VwdGlvbjsKLQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL2dlbmVyYXRvci90YWdsaWIvQWJzdHJhY3RDb252ZXJ0ZXJUYWdHZW5lcmF0b3IuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy9nZW5lcmF0b3IvdGFnbGliL0Fic3RyYWN0Q29udmVydGVyVGFnR2VuZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3NDM2ZjkuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL2dlbmVyYXRvci90YWdsaWIvQWJzdHJhY3RDb252ZXJ0ZXJUYWdHZW5lcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMuZ2VuZXJhdG9yLnRhZ2xpYjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMuaW8uUHJldHR5V3JpdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMucGFyc2UuQWJzdHJhY3RUYWdCZWFuOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMucGFyc2UuQ29udmVydGVyQmVhbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLnBhcnNlLlByb3BlcnR5QmVhbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLnV0aWwuRmlsdGVyZWRJdGVyYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLnV0aWwuVXRpbDsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5sb2dnaW5nLkxvZzsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKLWltcG9ydCBqYXZhLmlvLkZpbGVXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0Q29udmVydGVyVGFnR2VuZXJhdG9yIGV4dGVuZHMgQWJzdHJhY3RUYWdHZW5lcmF0b3IgewotICBwcm90ZWN0ZWQgQWJzdHJhY3RDb252ZXJ0ZXJUYWdHZW5lcmF0b3IoYm9vbGVhbiBpczEyLCBTdHJpbmcgbGljZW5zZUhlYWRlciwgTG9nIGxvZykgewotICAgIHN1cGVyKGlzMTIsIGxpY2Vuc2VIZWFkZXIsIGxvZyk7Ci0gIH0KLQotICAgcHVibGljIHZvaWQgZ2VuZXJhdGVUYWdIYW5kbGVyKAotICAgIENvbnZlcnRlckJlYW4gY29udmVydGVyLCBGaWxlIGdlbmVyYXRlZFNvdXJjZURpcmVjdG9yeSkKLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIGdldExvZygpLmRlYnVnKCJHZW5lcmF0aW5nICIgKyBjb252ZXJ0ZXIuZ2V0VGFnQ2xhc3MoKSk7Ci0KLSAgICAgIFN0cmluZ1dyaXRlciBzdyA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLSAgICAgIFByZXR0eVdyaXRlciBvdXQgPSBuZXcgUHJldHR5V3JpdGVyKHN3KTsKLQotICAgICAgU2V0IGltcG9ydHMgPSBjcmVhdGVJbXBvcnRzKGNvbnZlcnRlcik7Ci0gICAgICB3cml0ZUhlYWRlcihvdXQsIGNvbnZlcnRlciwgaW1wb3J0cyk7Ci0KLSAgICAgIHdyaXRlQ2xhc3Mob3V0LCBjb252ZXJ0ZXIpOwotCi0gICAgICB3cml0ZUNvbnN0cnVjdG9yKG91dCwgY29udmVydGVyKTsKLQotICAgICAgd3JpdGVQcm9wZXJ0eU1ldGhvZHMob3V0LCBjb252ZXJ0ZXIpOwotICAgICAgd3JpdGVEb1N0YXJ0VGFnKG91dCwgY29udmVydGVyKTsKLSAgICAgIHdyaXRlQ3JlYXRlQ29udmVydGVyKG91dCwgY29udmVydGVyKTsKLSAgICAgIHdyaXRlU2V0UHJvcGVydGllcyhvdXQsIGNvbnZlcnRlcik7Ci0gICAgICB3cml0ZVJlbGVhc2Uob3V0LCBjb252ZXJ0ZXIpOwotCi0gICAgICB3cml0ZUVuZChvdXQpOwotICAgICAgLy8gZGVsYXkgd3JpdGUgaW4gY2FzZSBvZiBlcnJvcgotICAgICAgLy8gdGltZXN0YW1wIHNob3VsZCBub3QgYmUgdXBkYXRlZCB3aGVuIGFuIGVycm9yIG9jY3VycwotICAgICAgLy8gZGVsZXRlIHRhcmdldCBmaWxlIGZpcnN0LCBiZWNhdXNlIGl0IGlzIHJlYWRvbmx5Ci0gICAgICBGaWxlIHRhcmdldEZpbGUgPSBjcmVhdGVGaWxlKGdlbmVyYXRlZFNvdXJjZURpcmVjdG9yeSwgY29udmVydGVyLmdldFRhZ0NsYXNzKCkpOwotICAgICAgdGFyZ2V0RmlsZS5kZWxldGUoKTsKLSAgICAgIEZpbGVXcml0ZXIgZncgPSBuZXcgRmlsZVdyaXRlcih0YXJnZXRGaWxlKTsKLSAgICAgIFN0cmluZ0J1ZmZlciBidWYgPSBzdy5nZXRCdWZmZXIoKTsKLSAgICAgIGZ3LndyaXRlKGJ1Zi50b1N0cmluZygpKTsKLSAgICAgIGZ3LmNsb3NlKCk7Ci0gICAgICB0YXJnZXRGaWxlLnNldFJlYWRPbmx5KCk7Ci0gICAgfQotICAgIGNhdGNoIChUaHJvd2FibGUgZSkKLSAgICB7Ci0gICAgICBnZXRMb2coKS5lcnJvcigiRXJyb3IgZ2VuZXJhdGluZyAiICsgY29udmVydGVyLmdldFRhZ0NsYXNzKCksIGUpOwotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCBhYnN0cmFjdCBTZXQgY3JlYXRlSW1wb3J0cyhDb252ZXJ0ZXJCZWFuIGNvbnZlcnRlcik7Ci0gIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHdyaXRlU2V0UHJvcGVydHkoUHJldHR5V3JpdGVyIG91dCwgUHJvcGVydHlCZWFuIHByb3BlcnR5KTsKLQotCi0gIHByaXZhdGUgdm9pZCB3cml0ZVNldFByb3BlcnRpZXMoCi0gICAgUHJldHR5V3JpdGVyICBvdXQsCi0gICAgQ29udmVydGVyQmVhbiBjb252ZXJ0ZXIpIHRocm93cyBJT0V4Y2VwdGlvbgotICB7Ci0gICAgSXRlcmF0b3IgcHJvcGVydGllcyA9IGNvbnZlcnRlci5wcm9wZXJ0aWVzKCk7Ci0gICAgcHJvcGVydGllcyA9IG5ldyBGaWx0ZXJlZEl0ZXJhdG9yKHByb3BlcnRpZXMsIG5ldyBUYWdBdHRyaWJ1dGVGaWx0ZXIoKSk7Ci0gICAgaWYgKHByb3BlcnRpZXMuaGFzTmV4dCgpKQotICAgIHsKLSAgICAgIFN0cmluZyBjb252ZXJ0ZXJGdWxsQ2xhc3MgPSBjb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKTsKLSAgICAgIFN0cmluZyBjb252ZXJ0ZXJDbGFzcyA9IFV0aWwuZ2V0Q2xhc3NGcm9tRnVsbENsYXNzKGNvbnZlcnRlckZ1bGxDbGFzcyk7Ci0gICAgICBvdXQucHJpbnRsbigpOwotICAgICAgb3V0LnByaW50bG4oInByaXZhdGUgdm9pZCBfc2V0UHJvcGVydGllcygiKTsKLSAgICAgIG91dC5pbmRlbnQoKTsKLSAgICAgIG91dC5wcmludGxuKGNvbnZlcnRlckNsYXNzICsgIiBjb252ZXJ0ZXIpIHRocm93cyBKc3BFeGNlcHRpb24iKTsKLSAgICAgIG91dC51bmluZGVudCgpOwotICAgICAgb3V0LnByaW50bG4oInsiKTsKLSAgICAgIG91dC5pbmRlbnQoKTsKLSAgICAgIHdoaWxlIChwcm9wZXJ0aWVzLmhhc05leHQoKSkKLSAgICAgIHsKLSAgICAgICAgUHJvcGVydHlCZWFuIHByb3BlcnR5ID0gKFByb3BlcnR5QmVhbilwcm9wZXJ0aWVzLm5leHQoKTsKLSAgICAgICAgd3JpdGVTZXRQcm9wZXJ0eShvdXQsIHByb3BlcnR5KTsKLSAgICAgIH0KLSAgICAgIG91dC51bmluZGVudCgpOwotICAgICAgb3V0LnByaW50bG4oIn0iKTsKLSAgICB9Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCB3cml0ZUNyZWF0ZUNvbnZlcnRlcigKLSAgICBQcmV0dHlXcml0ZXIgIG91dCwKLSAgICBDb252ZXJ0ZXJCZWFuIGNvbnZlcnRlcikgdGhyb3dzIElPRXhjZXB0aW9uCi0gIHsKLSAgICBJdGVyYXRvciBwcm9wZXJ0aWVzID0gY29udmVydGVyLnByb3BlcnRpZXMoKTsKLSAgICBwcm9wZXJ0aWVzID0gbmV3IEZpbHRlcmVkSXRlcmF0b3IocHJvcGVydGllcywgbmV3IFRhZ0F0dHJpYnV0ZUZpbHRlcigpKTsKLSAgICBpZiAocHJvcGVydGllcy5oYXNOZXh0KCkpCi0gICAgewotICAgICAgU3RyaW5nIGNvbnZlcnRlckZ1bGxDbGFzcyA9IGNvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpOwotICAgICAgU3RyaW5nIGNvbnZlcnRlckNsYXNzID0gVXRpbC5nZXRDbGFzc0Zyb21GdWxsQ2xhc3MoY29udmVydGVyRnVsbENsYXNzKTsKLQotICAgICAgb3V0LnByaW50bG4oKTsKLSAgICAgIC8vIFRPRE86IHJlc3RvcmUgY29kaW5nIHN0YW5kYXJkcywgYW5kIG1ha2UgZmluYWwKLSAgICAgIGlmIChpczEyKCkpIHsKLSAgICAgICAgb3V0LnByaW50bG4oIkBPdmVycmlkZSIpOwotICAgICAgfQotICAgICAgb3V0LnByaW50bG4oInByb3RlY3RlZCBDb252ZXJ0ZXIgY3JlYXRlQ29udmVydGVyKCkgdGhyb3dzIEpzcEV4Y2VwdGlvbiIpOwotICAgICAgb3V0LnByaW50bG4oInsiKTsKLSAgICAgIG91dC5pbmRlbnQoKTsKLSAgICAgIGlmIChpczEyKCkpCi0gICAgICB7Ci0gICAgICAgIG91dC5wcmludGxuKCJTdHJpbmcgY29udmVydGVySWQgPSAiICsgY29udmVydGVyQ2xhc3MgKyAgIi5DT05WRVJURVJfSUQ7Iik7Ci0gICAgICAgIG91dC5wcmludGxuKCJBcHBsaWNhdGlvbiBhcHBsID0gRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLmdldEFwcGxpY2F0aW9uKCk7Iik7Ci0gICAgICAgIG91dC5wcmludGxuKGNvbnZlcnRlckNsYXNzICsgIiBjb252ZXJ0ZXIgPSAiICsKLSAgICAgICAgICAgICAgICAgICAgIigiICsgY29udmVydGVyQ2xhc3MgKyAiKWFwcGwuY3JlYXRlQ29udmVydGVyKGNvbnZlcnRlcklkKTsiKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgb3V0LnByaW50bG4oY29udmVydGVyQ2xhc3MgKyAiIGNvbnZlcnRlciA9ICIgKwotICAgICAgICAgICAgICAgICAgICAiKCIgKyBjb252ZXJ0ZXJDbGFzcyArICIpc3VwZXIuY3JlYXRlQ29udmVydGVyKCk7Iik7Ci0gICAgICB9Ci0gICAgICBvdXQucHJpbnRsbigiX3NldFByb3BlcnRpZXMoY29udmVydGVyKTsiKTsKLSAgICAgIG91dC5wcmludGxuKCJyZXR1cm4gY29udmVydGVyOyIpOwotICAgICAgb3V0LnVuaW5kZW50KCk7Ci0gICAgICBvdXQucHJpbnRsbigifSIpOwotICAgIH0KLSAgfQotCi0KLSAgcHJvdGVjdGVkIHZvaWQgd3JpdGVEb1N0YXJ0VGFnKAotICAgICAgUHJldHR5V3JpdGVyICBvdXQsCi0gICAgICBDb252ZXJ0ZXJCZWFuIGNvbnZlcnRlcikgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgaWYgKCFpczEyKCkpCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyBjb252ZXJ0ZXJGdWxsQ2xhc3MgPSBjb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKTsKLSAgICAgICAgU3RyaW5nIGNvbnZlcnRlckNsYXNzID0gVXRpbC5nZXRDbGFzc0Zyb21GdWxsQ2xhc3MoY29udmVydGVyRnVsbENsYXNzKTsKLQotICAgICAgICBvdXQucHJpbnRsbigpOwotICAgICAgICAvLyBUT0RPOiByZXN0b3JlIGNvZGluZyBzdGFuZGFyZHMsIGFuZCBtYWtlIGZpbmFsCi0gICAgICAgIG91dC5wcmludGxuKCJAT3ZlcnJpZGUiKTsKLSAgICAgICAgb3V0LnByaW50bG4oInB1YmxpYyBpbnQgZG9TdGFydFRhZygpIHRocm93cyBKc3BFeGNlcHRpb24iKTsKLSAgICAgICAgb3V0LnByaW50bG4oInsiKTsKLSAgICAgICAgb3V0LmluZGVudCgpOwotICAgICAgICBvdXQucHJpbnRsbigic3VwZXIuc2V0Q29udmVydGVySWQoIiArIGNvbnZlcnRlckNsYXNzICsgIi5DT05WRVJURVJfSUQpOyIpOwotICAgICAgICBvdXQucHJpbnRsbigicmV0dXJuIHN1cGVyLmRvU3RhcnRUYWcoKTsiKTsKLSAgICAgICAgb3V0LnVuaW5kZW50KCk7Ci0gICAgICAgIG91dC5wcmludGxuKCJ9Iik7Ci0gICAgICB9Ci0gICAgfQotCi0KLSAgcHJpdmF0ZSB2b2lkIHdyaXRlQ2xhc3MoUHJldHR5V3JpdGVyIG91dCwgQWJzdHJhY3RUYWdCZWFuIGFic3RyYWN0VGFnKSB7Ci0gICAgU3RyaW5nIGNsYXNzTmFtZSA9IFV0aWwuZ2V0Q2xhc3NGcm9tRnVsbENsYXNzKGFic3RyYWN0VGFnLmdldFRhZ0NsYXNzKCkpOwotICAgIGlmIChpczEyKCkpCi0gICAgewotICAgICAgb3V0LnByaW50bG4oInB1YmxpYyBjbGFzcyAiICsgY2xhc3NOYW1lICsKLSAgICAgICAgICAgICAgICAgICIgZXh0ZW5kcyBDb252ZXJ0ZXJFTFRhZyIpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgb3V0LnByaW50bG4oInB1YmxpYyBjbGFzcyAiICsgY2xhc3NOYW1lICsKLSAgICAgICAgICAgICAgICAgICIgZXh0ZW5kcyBDb252ZXJ0ZXJUYWciKTsKLSAgICB9Ci0KLSAgICBvdXQucHJpbnRsbigieyIpOwotICAgIG91dC5pbmRlbnQoKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL2dlbmVyYXRvci90YWdsaWIvQWJzdHJhY3RUYWdHZW5lcmF0b3IuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy9nZW5lcmF0b3IvdGFnbGliL0Fic3RyYWN0VGFnR2VuZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0NGZlMmIuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL2dlbmVyYXRvci90YWdsaWIvQWJzdHJhY3RUYWdHZW5lcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2NiArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMuZ2VuZXJhdG9yLnRhZ2xpYjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMuZ2VuZXJhdG9yLkdlbmVyYXRvckhlbHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLmlvLlByZXR0eVdyaXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLnBhcnNlLkFic3RyYWN0VGFnQmVhbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLnBhcnNlLlByb3BlcnR5QmVhbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLnV0aWwuRmlsdGVyZWRJdGVyYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLnV0aWwuVXRpbDsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5sb2dnaW5nLkxvZzsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RUYWdHZW5lcmF0b3IgewotICBwcm90ZWN0ZWQgTG9nIF9sb2c7Ci0gIHByb3RlY3RlZCBib29sZWFuIF9pczEyOwotICBwcm90ZWN0ZWQgU3RyaW5nIF9saWNlbnNlSGVhZGVyOwotICBzdGF0aWMgZmluYWwgcHJpdmF0ZSBTdHJpbmcgX0FVVE9fR0VORVJBVEVfV0FSTklORyA9Ci0iLy8gV0FSTklORzogVGhpcyBmaWxlIHdhcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZC4gRG8gbm90IGVkaXQgaXQgZGlyZWN0bHksXG4iKwotIi8vICAgICAgICAgIG9yIHlvdSB3aWxsIGxvc2UgeW91ciBjaGFuZ2VzLlxuXG4iOwotCi0gIHB1YmxpYyBBYnN0cmFjdFRhZ0dlbmVyYXRvcihib29sZWFuIGlzMTIsIFN0cmluZyBsaWNlbnNlSGVhZGVyLCBMb2cgbG9nKSB7Ci0gICAgdGhpcy5fbG9nID0gbG9nOwotICAgIHRoaXMuX2xpY2Vuc2VIZWFkZXIgPSBsaWNlbnNlSGVhZGVyOwotICAgIHRoaXMuX2lzMTIgPSBpczEyOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgd3JpdGVQcmVhbWJsZSgKLSAgICBQcmV0dHlXcml0ZXIgb3V0KQotICB7Ci0gICAgb3V0LndyaXRlKF9BVVRPX0dFTkVSQVRFX1dBUk5JTkcpOwotICAgIG91dC53cml0ZShfbGljZW5zZUhlYWRlcik7Ci0gIH0KLQotICBwcm90ZWN0ZWQgTG9nIGdldExvZygpIHsKLSAgICByZXR1cm4gX2xvZzsKLSAgfQotCi0gIHByb3RlY3RlZCBib29sZWFuIGlzMTIoKSB7Ci0gICAgcmV0dXJuIF9pczEyOwotICB9Ci0KLSAgcHJvdGVjdGVkIEZpbGUgY3JlYXRlRmlsZShGaWxlIGdlbmVyYXRlZFNvdXJjZURpcmVjdG9yeSwgU3RyaW5nIGZ1bGxDbGFzc05hbWUpIHsKLSAgICAgZ2V0TG9nKCkuZGVidWcoIkdlbmVyYXRpbmcgIiArIGZ1bGxDbGFzc05hbWUpOwotICAgICBTdHJpbmcgc291cmNlUGF0aCA9IFV0aWwuY29udmVydENsYXNzVG9Tb3VyY2VQYXRoKGZ1bGxDbGFzc05hbWUsICIuamF2YSIpOwotICAgICBGaWxlIHRhcmdldEZpbGUgPSBuZXcgRmlsZShnZW5lcmF0ZWRTb3VyY2VEaXJlY3RvcnksIHNvdXJjZVBhdGgpOwotCi0gICAgIHRhcmdldEZpbGUuZ2V0UGFyZW50RmlsZSgpLm1rZGlycygpOwotICAgICByZXR1cm4gdGFyZ2V0RmlsZTsKLSAgIH0KLQotICBwcm90ZWN0ZWQgdm9pZCB3cml0ZUNvbnN0cnVjdG9yKAotICAgICAgUHJldHR5V3JpdGVyICBvdXQsCi0gICAgICBBYnN0cmFjdFRhZ0JlYW4gYWJzdHJhY3RUYWcpIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgIFN0cmluZyBmdWxsQ2xhc3NOYW1lID0gYWJzdHJhY3RUYWcuZ2V0VGFnQ2xhc3MoKTsKLSAgICAgIFN0cmluZyBjbGFzc05hbWUgPSBVdGlsLmdldENsYXNzRnJvbUZ1bGxDbGFzcyhmdWxsQ2xhc3NOYW1lKTsKLSAgICAgIG91dC5wcmludGxuKCk7Ci0gICAgICBvdXQucHJpbnRsbigiLyoqIik7Ci0gICAgICAvLyBUT0RPOiByZXN0b3JlIHRoaXMgY29ycmVjdGx5IHBocmFzZWQgY29tbWVudCAodGVuc2UgdnMuIGNvbW1hbmQpCi0gICAgICAvL291dC5wcmludGxuKCIgKiBDb25zdHJ1Y3RzIGFuIGluc3RhbmNlIG9mICIgKyBjbGFzc05hbWUgKyAiLiIpOwotICAgICAgb3V0LnByaW50bG4oIiAqIENvbnN0cnVjdCBhbiBpbnN0YW5jZSBvZiB0aGUgIiArIGNsYXNzTmFtZSArICIuIik7Ci0gICAgICBvdXQucHJpbnRsbigiICovIik7Ci0gICAgICBvdXQucHJpbnRsbigicHVibGljICIgKyBjbGFzc05hbWUgKyAiKCkiKTsKLSAgICAgIG91dC5wcmludGxuKCJ7Iik7Ci0gICAgICBvdXQucHJpbnRsbigifSIpOwotICAgIH0KLQotICBwcm90ZWN0ZWQgdm9pZCB3cml0ZVByb3BlcnR5TWV0aG9kcygKLSAgICAgIFByZXR0eVdyaXRlciAgb3V0LAotICAgICAgQWJzdHJhY3RUYWdCZWFuIGFic3RyYWN0VGFnKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICBJdGVyYXRvciBwcm9wZXJ0aWVzID0gYWJzdHJhY3RUYWcucHJvcGVydGllcygpOwotICAgICAgcHJvcGVydGllcyA9IG5ldyBGaWx0ZXJlZEl0ZXJhdG9yKHByb3BlcnRpZXMsIG5ldyBUYWdBdHRyaWJ1dGVGaWx0ZXIoKSk7Ci0gICAgICB3aGlsZSAocHJvcGVydGllcy5oYXNOZXh0KCkpCi0gICAgICB7Ci0gICAgICAgIFByb3BlcnR5QmVhbiBwcm9wZXJ0eSA9IChQcm9wZXJ0eUJlYW4pcHJvcGVydGllcy5uZXh0KCk7Ci0gICAgICAgIG91dC5wcmludGxuKCk7Ci0gICAgICAgIHdyaXRlUHJvcGVydHlNZW1iZXIob3V0LCBwcm9wZXJ0eSk7Ci0gICAgICAgIHdyaXRlUHJvcGVydHlTZXQob3V0LCBwcm9wZXJ0eSk7Ci0gICAgICB9Ci0gICAgfQotICAgIHByaXZhdGUgdm9pZCB3cml0ZVByb3BlcnR5TWVtYmVyKAotICAgUHJldHR5V3JpdGVyICBvdXQsCi0gICBQcm9wZXJ0eUJlYW4gIHByb3BlcnR5KSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgewotICAgIFN0cmluZyBwcm9wTmFtZSA9IHByb3BlcnR5LmdldFByb3BlcnR5TmFtZSgpOwotICAgIFN0cmluZyBwcm9wVmFyID0gIl8iICsgVXRpbC5nZXRWYXJpYWJsZUZyb21OYW1lKHByb3BOYW1lKTsKLSAgICBTdHJpbmcganNwUHJvcFR5cGUgPSBnZXRKc3BQcm9wZXJ0eVR5cGUocHJvcGVydHkpOwotCi0gICAgb3V0LnByaW50bG4oInByaXZhdGUgIiArIGpzcFByb3BUeXBlICsgIiAiICsgcHJvcFZhciArICI7Iik7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgd3JpdGVQcm9wZXJ0eVNldCgKLSAgIFByZXR0eVdyaXRlciAgb3V0LAotICAgUHJvcGVydHlCZWFuICBwcm9wZXJ0eSkgdGhyb3dzIElPRXhjZXB0aW9uCi0gIHsKLSAgICBTdHJpbmcgcHJvcE5hbWUgPSBwcm9wZXJ0eS5nZXRQcm9wZXJ0eU5hbWUoKTsKLSAgICBTdHJpbmcgcHJvcFZhciA9IFV0aWwuZ2V0VmFyaWFibGVGcm9tTmFtZShwcm9wTmFtZSk7Ci0gICAgU3RyaW5nIHNldE1ldGhvZCA9IFV0aWwuZ2V0UHJlZml4ZWRQcm9wZXJ0eU5hbWUoInNldCIsIHByb3BOYW1lKTsKLSAgICBTdHJpbmcganNwUHJvcFR5cGUgPSBnZXRKc3BQcm9wZXJ0eVR5cGUocHJvcGVydHkpOwotCi0gICAgLy8gVE9ETzogcmVzdG9yZSBjb2Rpbmcgc3RhbmRhcmRzLCBhbmQgbWFrZSBmaW5hbAotICAgIG91dC5wcmludGxuKCJwdWJsaWMgdm9pZCAiICsgc2V0TWV0aG9kICsgIigiICsganNwUHJvcFR5cGUgKyAiICIgKyBwcm9wVmFyICsgIikiKTsKLSAgICBvdXQucHJpbnRsbigieyIpOwotICAgIG91dC5pbmRlbnQoKTsKLSAgICBvdXQucHJpbnRsbigiXyIgKyBwcm9wVmFyICsgIiA9ICIgKyBwcm9wVmFyICsgIjsiKTsKLSAgICBvdXQudW5pbmRlbnQoKTsKLSAgICBvdXQucHJpbnRsbigifSIpOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgd3JpdGVSZWxlYXNlKAotICAgIFByZXR0eVdyaXRlciAgb3V0LAotICAgIEFic3RyYWN0VGFnQmVhbiBhYnN0cmFjdFRhZykgdGhyb3dzIElPRXhjZXB0aW9uCi0gIHsKLSAgICBJdGVyYXRvciBwcm9wZXJ0aWVzID0gYWJzdHJhY3RUYWcucHJvcGVydGllcygpOwotICAgIHByb3BlcnRpZXMgPSBuZXcgRmlsdGVyZWRJdGVyYXRvcihwcm9wZXJ0aWVzLCBuZXcgVGFnQXR0cmlidXRlRmlsdGVyKCkpOwotICAgIGlmIChwcm9wZXJ0aWVzLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBvdXQucHJpbnRsbigpOwotICAgICAgaWYgKGlzMTIoKSkgewotICAgICAgICBvdXQucHJpbnRsbigiQE92ZXJyaWRlIik7Ci0gICAgICB9Ci0gICAgICBvdXQucHJpbnRsbigicHVibGljIHZvaWQgcmVsZWFzZSgpIik7Ci0gICAgICBvdXQucHJpbnRsbigieyIpOwotICAgICAgb3V0LmluZGVudCgpOwotICAgICAgb3V0LnByaW50bG4oInN1cGVyLnJlbGVhc2UoKTsiKTsKLSAgICAgIHdoaWxlIChwcm9wZXJ0aWVzLmhhc05leHQoKSkKLSAgICAgIHsKLSAgICAgICAgUHJvcGVydHlCZWFuIHByb3BlcnR5ID0gKFByb3BlcnR5QmVhbilwcm9wZXJ0aWVzLm5leHQoKTsKLSAgICAgICAgU3RyaW5nIHByb3BOYW1lID0gcHJvcGVydHkuZ2V0UHJvcGVydHlOYW1lKCk7Ci0gICAgICAgIFN0cmluZyBwcm9wVmFyID0gIl8iICsgVXRpbC5nZXRWYXJpYWJsZUZyb21OYW1lKHByb3BOYW1lKTsKLSAgICAgICAgb3V0LnByaW50bG4ocHJvcFZhciArICIgPSBudWxsOyIpOwotICAgICAgfQotICAgICAgb3V0LnVuaW5kZW50KCk7Ci0gICAgICBvdXQucHJpbnRsbigifSIpOwotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgU3RyaW5nIGdldEpzcFByb3BlcnR5VHlwZShQcm9wZXJ0eUJlYW4gcHJvcGVydHkpCi0gIHsKLSAgICBpZiAocHJvcGVydHkuaXNNZXRob2RFeHByZXNzaW9uKCkpCi0gICAgICByZXR1cm4gIk1ldGhvZEV4cHJlc3Npb24iOwotCi0gICAgaWYgKGlzMTIoKSAmJiBwcm9wZXJ0eS5pc01ldGhvZEJpbmRpbmcoKSkKLSAgICAgIHJldHVybiAiTWV0aG9kRXhwcmVzc2lvbiI7Ci0KLSAgICBpZiAoaXMxMigpICYmICFwcm9wZXJ0eS5pc0xpdGVyYWxPbmx5KCkpCi0gICAgICByZXR1cm4gIlZhbHVlRXhwcmVzc2lvbiI7Ci0gICAgcmV0dXJuICJTdHJpbmciOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgd3JpdGVFbmQoUHJldHR5V3JpdGVyIG91dCkgewotICAgICAgb3V0LnVuaW5kZW50KCk7Ci0gICAgICBvdXQucHJpbnRsbigifSIpOwotICAgICAgb3V0LmNsb3NlKCk7Ci0gICAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHdyaXRlSW1wb3J0cygKLSAgICBQcmV0dHlXcml0ZXIgICBvdXQsCi0gICAgQWJzdHJhY3RUYWdCZWFuICBhYnN0cmFjdFRhZ0JlYW4sIFNldCBpbXBvcnRzKQotICB7Ci0KLSAgICAvLyBkbyBub3QgaW1wb3J0IGltcGxpY2l0IQotICAgIGltcG9ydHMucmVtb3ZlQWxsKFV0aWwuUFJJTUlUSVZFX1RZUEVTKTsKLQotICAgIFN0cmluZyBwYWNrYWdlTmFtZSA9IFV0aWwuZ2V0UGFja2FnZUZyb21GdWxsQ2xhc3MoYWJzdHJhY3RUYWdCZWFuLmdldFRhZ0NsYXNzKCkpOwotICAgIEdlbmVyYXRvckhlbHBlci53cml0ZUltcG9ydHMob3V0LCBwYWNrYWdlTmFtZSwgaW1wb3J0cyk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgZmluYWwgdm9pZCB3cml0ZUhlYWRlcihQcmV0dHlXcml0ZXIgb3V0LCBBYnN0cmFjdFRhZ0JlYW4gY29udmVydGVyLCBTZXQgaW1wb3J0cykgewotICAgIFN0cmluZyBwYWNrYWdlTmFtZSA9IFV0aWwuZ2V0UGFja2FnZUZyb21GdWxsQ2xhc3MoY29udmVydGVyLmdldFRhZ0NsYXNzKCkpOwotICAgIC8vIGhlYWRlci9jb3B5cmlnaHQKLSAgICB3cml0ZVByZWFtYmxlKG91dCk7Ci0KLSAgICAvLyBwYWNrYWdlCi0gICAgb3V0LnByaW50bG4oInBhY2thZ2UgIiArIHBhY2thZ2VOYW1lICsgIjsiKTsKLQotICAgIG91dC5wcmludGxuKCk7Ci0gICAgd3JpdGVJbXBvcnRzKG91dCwgY29udmVydGVyLCBpbXBvcnRzKTsKLQotICAgIG91dC5wcmludGxuKCIvKioiKTsKLSAgICAvLyBUT0RPOiByZW1vdmUgdGhpcyBibGFuayBsaW5lLgotICAgIG91dC5wcmludGxuKCk7Ci0gICAgb3V0LnByaW50bG4oIiAqIEF1dG8tZ2VuZXJhdGVkIHRhZyBjbGFzcy4iKTsKLSAgICBvdXQucHJpbnRsbigiICovIik7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBhZGRJbXBvcnRzRnJvbVByb3BlcnRlcyhBYnN0cmFjdFRhZ0JlYW4gYWJzdHJhY3RUYWdCZWFuLCBTZXQgaW1wb3J0cykgewotICAgIEl0ZXJhdG9yIHByb3BlcnRpZXMgPSBhYnN0cmFjdFRhZ0JlYW4ucHJvcGVydGllcygpOwotICAgIHByb3BlcnRpZXMgPSBuZXcgRmlsdGVyZWRJdGVyYXRvcihwcm9wZXJ0aWVzLCBuZXcgVGFnQXR0cmlidXRlRmlsdGVyKCkpOwotCi0gICAgd2hpbGUgKHByb3BlcnRpZXMuaGFzTmV4dCgpKQotICAgIHsKLSAgICAgIFByb3BlcnR5QmVhbiBwcm9wZXJ0eSA9IChQcm9wZXJ0eUJlYW4pcHJvcGVydGllcy5uZXh0KCk7Ci0KLSAgICAgIFN0cmluZyBwcm9wZXJ0eUNsYXNzID0gcHJvcGVydHkuZ2V0UHJvcGVydHlDbGFzcygpOwotICAgICAgaWYgKHByb3BlcnR5Q2xhc3MgIT0gbnVsbCkKLSAgICAgICAgaW1wb3J0cy5hZGQocHJvcGVydHlDbGFzcyk7Ci0KLSAgICAgIGlmICgiamF2YS5sYW5nLlN0cmluZ1tdIi5lcXVhbHMocHJvcGVydHlDbGFzcykpCi0gICAgICB7Ci0gICAgICAgIGltcG9ydHMuYWRkKCJqYXZhLnRleHQuUGFyc2VFeGNlcHRpb24iKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwcm90ZWN0ZWQgU3RyaW5nIHJlc29sdmVEYXRlVHlwZShTdHJpbmcgY2xhc3NOYW1lLCBib29sZWFuIHVzZU1heFRpbWUpCi0gIHsKLSAgICBTdHJpbmcgdHlwZSA9IChTdHJpbmcpX1JFU09MVkFCTEVfVFlQRVMuZ2V0KGNsYXNzTmFtZSk7Ci0gICAgcmV0dXJuIHVzZU1heFRpbWUgPyB0eXBlICsgIldpdGhNYXhUaW1lIiA6IHR5cGU7Ci0gIH0KLQotICBwcm90ZWN0ZWQgU3RyaW5nIHJlc29sdmVUeXBlKFN0cmluZyBjbGFzc05hbWUpCi0gIHsKLSAgICByZXR1cm4gKFN0cmluZylfUkVTT0xWQUJMRV9UWVBFUy5nZXQoY2xhc3NOYW1lKTsKLSAgfQotCi0gIC8vIFRPRE86IGZvciBldmVyeXRoaW5nIGJ1dCBMb2NhbGUsIFN0cmluZ1tdLCBEYXRlLCBhbmQgVGltZVpvbmUsCi0gIC8vIGluIEpTRiAxLjIgd2Ugc2hvdWxkIGFscmVhZHkgYmUgZ29pbmcgdGhyb3VnaCBjb2VyY2lvbiwgYW5kCi0gIC8vIG5vdCBuZWVkIGFueSBvZiB0aGUgIlRhZ1V0aWxzIiBmdW5jdGlvbnMKLSAgcHJpdmF0ZSBNYXAgX2NyZWF0ZVJlc29sdmFibGVUeXBlcygpCi0gIHsKLSAgICBNYXAgcmVzb2x2YWJsZVR5cGVzID0gbmV3IEhhc2hNYXAoKTsKLQotICAgIHJlc29sdmFibGVUeXBlcy5wdXQoImJvb2xlYW4iLCAiQm9vbGVhbiIpOwotICAgIHJlc29sdmFibGVUeXBlcy5wdXQoImNoYXIiLCAiQ2hhcmFjdGVyIik7Ci0gICAgcmVzb2x2YWJsZVR5cGVzLnB1dCgiamF2YS51dGlsLkRhdGUiLCAiRGF0ZSIpOwotICAgIHJlc29sdmFibGVUeXBlcy5wdXQoImludCIsICJJbnRlZ2VyIik7Ci0gICAgcmVzb2x2YWJsZVR5cGVzLnB1dCgiZmxvYXQiLCAiRmxvYXQiKTsKLSAgICByZXNvbHZhYmxlVHlwZXMucHV0KCJkb3VibGUiLCAiRG91YmxlIik7Ci0gICAgcmVzb2x2YWJsZVR5cGVzLnB1dCgiamF2YS51dGlsLkxvY2FsZSIsICJMb2NhbGUiKTsKLSAgICByZXNvbHZhYmxlVHlwZXMucHV0KCJsb25nIiwgIkxvbmciKTsKLSAgICByZXNvbHZhYmxlVHlwZXMucHV0KCJqYXZhLmxhbmcuU3RyaW5nIiwgIlN0cmluZyIpOwotICAgIHJlc29sdmFibGVUeXBlcy5wdXQoImphdmEubGFuZy5TdHJpbmdbXSIsICJTdHJpbmdBcnJheSIpOwotICAgIHJlc29sdmFibGVUeXBlcy5wdXQoImphdmEudXRpbC5UaW1lWm9uZSIsICJUaW1lWm9uZSIpOwotCi0gICAgcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZU1hcChyZXNvbHZhYmxlVHlwZXMpOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBNYXAgX1JFU09MVkFCTEVfVFlQRVMgPSBfY3JlYXRlUmVzb2x2YWJsZVR5cGVzKCk7Ci0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy9nZW5lcmF0b3IvdGFnbGliL0Fic3RyYWN0VmFsaWRhdG9yVGFnR2VuZXJhdG9yLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvZ2VuZXJhdG9yL3RhZ2xpYi9BYnN0cmFjdFZhbGlkYXRvclRhZ0dlbmVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMzBiYzUzLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy9nZW5lcmF0b3IvdGFnbGliL0Fic3RyYWN0VmFsaWRhdG9yVGFnR2VuZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTUgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLmdlbmVyYXRvci50YWdsaWI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLmlvLlByZXR0eVdyaXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLnBhcnNlLkFic3RyYWN0VGFnQmVhbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLnBhcnNlLlByb3BlcnR5QmVhbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLnBhcnNlLlZhbGlkYXRvckJlYW47Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy51dGlsLkZpbHRlcmVkSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy51dGlsLlV0aWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4ubG9nZ2luZy5Mb2c7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5GaWxlV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFZhbGlkYXRvclRhZ0dlbmVyYXRvciBleHRlbmRzIEFic3RyYWN0VGFnR2VuZXJhdG9yIHsKLQotICBwdWJsaWMgQWJzdHJhY3RWYWxpZGF0b3JUYWdHZW5lcmF0b3IoYm9vbGVhbiBpczEyLCBTdHJpbmcgbGljZW5zZUhlYWRlciwgTG9nIGxvZykgewotICAgIHN1cGVyKGlzMTIsIGxpY2Vuc2VIZWFkZXIsIGxvZyk7Ci0gIH0KLQotICAgcHVibGljIHZvaWQgZ2VuZXJhdGVUYWdIYW5kbGVyKAotICAgIFZhbGlkYXRvckJlYW4gdmFsaWRhdG9yLCBGaWxlIGdlbmVyYXRlZFNvdXJjZURpcmVjdG9yeSkKLSAgewotCi0gICAgdHJ5Ci0gICAgewotICAgICAgZ2V0TG9nKCkuZGVidWcoIkdlbmVyYXRpbmcgIiArIHZhbGlkYXRvci5nZXRUYWdDbGFzcygpKTsKLQotICAgICAgU3RyaW5nV3JpdGVyIHN3ID0gbmV3IFN0cmluZ1dyaXRlcigpOwotICAgICAgUHJldHR5V3JpdGVyIG91dCA9IG5ldyBQcmV0dHlXcml0ZXIoc3cpOwotICAgICAgU2V0IGltcG9ydHMgPSBjcmVhdGVJbXBvcnRzKHZhbGlkYXRvcik7Ci0gICAgICB3cml0ZUhlYWRlcihvdXQsIHZhbGlkYXRvciwgaW1wb3J0cyk7Ci0KLSAgICAgIHdyaXRlQ2xhc3Mob3V0LCB2YWxpZGF0b3IpOwotCi0gICAgICB3cml0ZUNvbnN0cnVjdG9yKG91dCwgdmFsaWRhdG9yKTsKLQotICAgICAgd3JpdGVQcm9wZXJ0eU1ldGhvZHMob3V0LCB2YWxpZGF0b3IpOwotICAgICAgd3JpdGVEb1N0YXJ0VGFnKG91dCwgdmFsaWRhdG9yKTsKLSAgICAgIHdyaXRlQ3JlYXRlVmFsaWRhdG9yKG91dCwgdmFsaWRhdG9yKTsKLSAgICAgIHdyaXRlU2V0UHJvcGVydGllcyhvdXQsIHZhbGlkYXRvcik7Ci0gICAgICB3cml0ZVJlbGVhc2Uob3V0LCB2YWxpZGF0b3IpOwotCi0gICAgICB3cml0ZUVuZChvdXQpOwotCi0gICAgICAvLyBkZWxheSB3cml0ZSBpbiBjYXNlIG9mIGVycm9yCi0gICAgICAvLyB0aW1lc3RhbXAgc2hvdWxkIG5vdCBiZSB1cGRhdGVkIHdoZW4gYW4gZXJyb3Igb2NjdXJzCi0gICAgICAvLyBkZWxldGUgdGFyZ2V0IGZpbGUgZmlyc3QsIGJlY2F1c2UgaXQgaXMgcmVhZG9ubHkKLSAgICAgIEZpbGUgdGFyZ2V0RmlsZSA9IGNyZWF0ZUZpbGUoZ2VuZXJhdGVkU291cmNlRGlyZWN0b3J5LCB2YWxpZGF0b3IuZ2V0VGFnQ2xhc3MoKSk7Ci0gICAgICB0YXJnZXRGaWxlLmRlbGV0ZSgpOwotICAgICAgRmlsZVdyaXRlciBmdyA9IG5ldyBGaWxlV3JpdGVyKHRhcmdldEZpbGUpOwotICAgICAgU3RyaW5nQnVmZmVyIGJ1ZiA9IHN3LmdldEJ1ZmZlcigpOwotICAgICAgZncud3JpdGUoYnVmLnRvU3RyaW5nKCkpOwotICAgICAgZncuY2xvc2UoKTsKLSAgICAgIHRhcmdldEZpbGUuc2V0UmVhZE9ubHkoKTsKLSAgICB9Ci0gICAgY2F0Y2ggKFRocm93YWJsZSBlKQotICAgIHsKLSAgICAgIGdldExvZygpLmVycm9yKCJFcnJvciBnZW5lcmF0aW5nICIgKyB2YWxpZGF0b3IuZ2V0VGFnQ2xhc3MoKSwgZSk7Ci0gICAgfQotICB9Ci0KLSAgcHJvdGVjdGVkIGFic3RyYWN0IFNldCBjcmVhdGVJbXBvcnRzKFZhbGlkYXRvckJlYW4gdmFsaWRhdG9yKTsKLQotICBwcm90ZWN0ZWQgdm9pZCB3cml0ZUNsYXNzKFByZXR0eVdyaXRlciBvdXQsIEFic3RyYWN0VGFnQmVhbiBhYnN0cmFjdFRhZykgewotICAgIFN0cmluZyBjbGFzc05hbWUgPSBVdGlsLmdldENsYXNzRnJvbUZ1bGxDbGFzcyhhYnN0cmFjdFRhZy5nZXRUYWdDbGFzcygpKTsKLSAgICBpZiAoaXMxMigpKQotICAgIHsKLSAgICAgIG91dC5wcmludGxuKCJwdWJsaWMgY2xhc3MgIiArIGNsYXNzTmFtZSArCi0gICAgICAgICAgICAgICAgICAiIGV4dGVuZHMgVmFsaWRhdG9yRUxUYWciKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIG91dC5wcmludGxuKCJwdWJsaWMgY2xhc3MgIiArIGNsYXNzTmFtZSArCi0gICAgICAgICAgICAgICAgICAiIGV4dGVuZHMgVmFsaWRhdG9yVGFnIik7Ci0gICAgfQotCi0gICAgb3V0LnByaW50bG4oInsiKTsKLSAgICBvdXQuaW5kZW50KCk7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgd3JpdGVEb1N0YXJ0VGFnKAotICAgICBQcmV0dHlXcml0ZXIgIG91dCwKLSAgICAgVmFsaWRhdG9yQmVhbiB2YWxpZGF0b3IpIHRocm93cyBJT0V4Y2VwdGlvbgotICAgewotICAgICBvdXQucHJpbnRsbigpOwotICAgICBpZiAoIWlzMTIoKSkKLSAgICAgewotICAgICAgIFN0cmluZyB2YWxpZGF0b3JGdWxsQ2xhc3MgPSB2YWxpZGF0b3IuZ2V0VmFsaWRhdG9yQ2xhc3MoKTsKLSAgICAgICBTdHJpbmcgdmFsaWRhdG9yQ2xhc3MgPSBVdGlsLmdldENsYXNzRnJvbUZ1bGxDbGFzcyh2YWxpZGF0b3JGdWxsQ2xhc3MpOwotCi0gICAgICAgLy8gVE9ETzogcmVzdG9yZSBjb2Rpbmcgc3RhbmRhcmRzLCBhbmQgbWFrZSBmaW5hbAotICAgICAgIC8vb3V0LnByaW50bG4oIkBPdmVycmlkZSIpOwotICAgICAgIG91dC5wcmludGxuKCJwdWJsaWMgaW50IGRvU3RhcnRUYWcoKSB0aHJvd3MgSnNwRXhjZXB0aW9uIik7Ci0gICAgICAgb3V0LnByaW50bG4oInsiKTsKLSAgICAgICBvdXQuaW5kZW50KCk7Ci0gICAgICAgb3V0LnByaW50bG4oInN1cGVyLnNldFZhbGlkYXRvcklkKCIgKyB2YWxpZGF0b3JDbGFzcyArICIuVkFMSURBVE9SX0lEKTsiKTsKLSAgICAgICBvdXQucHJpbnRsbigicmV0dXJuIHN1cGVyLmRvU3RhcnRUYWcoKTsiKTsKLSAgICAgICBvdXQudW5pbmRlbnQoKTsKLSAgICAgICBvdXQucHJpbnRsbigifSIpOwotICAgICB9Ci0gICB9Ci0KLQotICBwcml2YXRlIHZvaWQgd3JpdGVDcmVhdGVWYWxpZGF0b3IoCi0gICAgUHJldHR5V3JpdGVyICBvdXQsCi0gICAgVmFsaWRhdG9yQmVhbiB2YWxpZGF0b3IpIHRocm93cyBJT0V4Y2VwdGlvbgotICB7Ci0gICAgSXRlcmF0b3IgcHJvcGVydGllcyA9IHZhbGlkYXRvci5wcm9wZXJ0aWVzKCk7Ci0gICAgcHJvcGVydGllcyA9IG5ldyBGaWx0ZXJlZEl0ZXJhdG9yKHByb3BlcnRpZXMsIG5ldyBUYWdBdHRyaWJ1dGVGaWx0ZXIoKSk7Ci0gICAgaWYgKHByb3BlcnRpZXMuaGFzTmV4dCgpKQotICAgIHsKLSAgICAgIFN0cmluZyB2YWxpZGF0b3JGdWxsQ2xhc3MgPSB2YWxpZGF0b3IuZ2V0VmFsaWRhdG9yQ2xhc3MoKTsKLSAgICAgIFN0cmluZyB2YWxpZGF0b3JDbGFzcyA9IFV0aWwuZ2V0Q2xhc3NGcm9tRnVsbENsYXNzKHZhbGlkYXRvckZ1bGxDbGFzcyk7Ci0KLSAgICAgIG91dC5wcmludGxuKCk7Ci0gICAgICAvLyBUT0RPOiByZXN0b3JlIGNvZGluZyBzdGFuZGFyZHMsIGFuZCBtYWtlIGZpbmFsCi0gICAgICBpZiAoaXMxMigpKSB7Ci0gICAgICAgIG91dC5wcmludGxuKCJAT3ZlcnJpZGUiKTsKLSAgICAgIH0KLSAgICAgIG91dC5wcmludGxuKCJwcm90ZWN0ZWQgVmFsaWRhdG9yIGNyZWF0ZVZhbGlkYXRvcigpIHRocm93cyBKc3BFeGNlcHRpb24iKTsKLSAgICAgIG91dC5wcmludGxuKCJ7Iik7Ci0gICAgICBvdXQuaW5kZW50KCk7Ci0gICAgICBpZiAoaXMxMigpKQotICAgICAgewotICAgICAgICBvdXQucHJpbnRsbigiU3RyaW5nIHZhbGlkYXRvcklkID0gIiArIHZhbGlkYXRvckNsYXNzICsgIi5WQUxJREFUT1JfSUQ7Iik7Ci0gICAgICAgIG91dC5wcmludGxuKCJBcHBsaWNhdGlvbiBhcHBsID0gRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLmdldEFwcGxpY2F0aW9uKCk7Iik7Ci0gICAgICAgIG91dC5wcmludGxuKHZhbGlkYXRvckNsYXNzICsgIiB2YWxpZGF0b3IgPSAiICsKLSAgICAgICAgICAgICAgICAgICAgIigiICsgdmFsaWRhdG9yQ2xhc3MgKyAiKWFwcGwuY3JlYXRlVmFsaWRhdG9yKHZhbGlkYXRvcklkKTsiKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgb3V0LnByaW50bG4odmFsaWRhdG9yQ2xhc3MgKyAiIHZhbGlkYXRvciA9ICIgKwotICAgICAgICAgICAgICAgICAgICAiKCIgKyB2YWxpZGF0b3JDbGFzcyArICIpc3VwZXIuY3JlYXRlVmFsaWRhdG9yKCk7Iik7Ci0gICAgICB9Ci0gICAgICBvdXQucHJpbnRsbigiX3NldFByb3BlcnRpZXModmFsaWRhdG9yKTsiKTsKLSAgICAgIG91dC5wcmludGxuKCJyZXR1cm4gdmFsaWRhdG9yOyIpOwotICAgICAgb3V0LnVuaW5kZW50KCk7Ci0gICAgICBvdXQucHJpbnRsbigifSIpOwotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgdm9pZCB3cml0ZVNldFByb3BlcnRpZXMoCi0gICAgICBQcmV0dHlXcml0ZXIgIG91dCwKLSAgICAgIFZhbGlkYXRvckJlYW4gdmFsaWRhdG9yKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICBJdGVyYXRvciBwcm9wZXJ0aWVzID0gdmFsaWRhdG9yLnByb3BlcnRpZXMoKTsKLSAgICAgIHByb3BlcnRpZXMgPSBuZXcgRmlsdGVyZWRJdGVyYXRvcihwcm9wZXJ0aWVzLCBuZXcgVGFnQXR0cmlidXRlRmlsdGVyKCkpOwotICAgICAgaWYgKHByb3BlcnRpZXMuaGFzTmV4dCgpKQotICAgICAgewotICAgICAgICBTdHJpbmcgdmFsaWRhdG9yRnVsbENsYXNzID0gdmFsaWRhdG9yLmdldFZhbGlkYXRvckNsYXNzKCk7Ci0gICAgICAgIFN0cmluZyB2YWxpZGF0b3JDbGFzcyA9IFV0aWwuZ2V0Q2xhc3NGcm9tRnVsbENsYXNzKHZhbGlkYXRvckZ1bGxDbGFzcyk7Ci0gICAgICAgIG91dC5wcmludGxuKCk7Ci0gICAgICAgIG91dC5wcmludGxuKCJwcml2YXRlIHZvaWQgX3NldFByb3BlcnRpZXMoIik7Ci0gICAgICAgIG91dC5pbmRlbnQoKTsKLSAgICAgICAgb3V0LnByaW50bG4odmFsaWRhdG9yQ2xhc3MgKyAiIHZhbGlkYXRvcikgdGhyb3dzIEpzcEV4Y2VwdGlvbiIpOwotICAgICAgICBvdXQudW5pbmRlbnQoKTsKLSAgICAgICAgb3V0LnByaW50bG4oInsiKTsKLSAgICAgICAgb3V0LmluZGVudCgpOwotICAgICAgICB3aGlsZSAocHJvcGVydGllcy5oYXNOZXh0KCkpCi0gICAgICAgIHsKLSAgICAgICAgICBQcm9wZXJ0eUJlYW4gcHJvcGVydHkgPSAoUHJvcGVydHlCZWFuKXByb3BlcnRpZXMubmV4dCgpOwotICAgICAgICAgIHdyaXRlU2V0UHJvcGVydHkob3V0LCBwcm9wZXJ0eSk7Ci0gICAgICAgIH0KLSAgICAgICAgb3V0LnVuaW5kZW50KCk7Ci0gICAgICAgIG91dC5wcmludGxuKCJ9Iik7Ci0gICAgICB9Ci0gICAgfQotCi0gIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHdyaXRlU2V0UHJvcGVydHkoCi0gICAgIFByZXR0eVdyaXRlciBvdXQsCi0gICAgIFByb3BlcnR5QmVhbiBwcm9wZXJ0eSk7Ci0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy9nZW5lcmF0b3IvdGFnbGliL0NvbXBvbmVudFRhZ0dlbmVyYXRvci5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL2dlbmVyYXRvci90YWdsaWIvQ29tcG9uZW50VGFnR2VuZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0NmM0NzAuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL2dlbmVyYXRvci90YWdsaWIvQ29tcG9uZW50VGFnR2VuZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMuZ2VuZXJhdG9yLnRhZ2xpYjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMuZ2VuZXJhdG9yLkNsYXNzR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMuaW8uUHJldHR5V3JpdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMucGFyc2UuQ29tcG9uZW50QmVhbjsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLS8qKgotICogR2VuZXJhdGVzIHRhZyBjbGFzc2VzCi0gKgotICogQGF1dGhvciBCcnVubyBBcmFuZGEgKGxhdGVzdCBtb2RpZmljYXRpb24gYnkgJEF1dGhvciQpCi0gKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAotICovCi1wdWJsaWMgaW50ZXJmYWNlIENvbXBvbmVudFRhZ0dlbmVyYXRvciBleHRlbmRzIENsYXNzR2VuZXJhdG9yCi17Ci0KLSAgdm9pZCB3cml0ZVNldFByb3BlcnRpZXNNZXRob2QoUHJldHR5V3JpdGVyIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGNvbXBvbmVudENsYXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb25lbnRCZWFuIGNvbXBvbmVudCkgdGhyb3dzIElPRXhjZXB0aW9uOwotCi0gIHZvaWQgd3JpdGVTZXRQcm9wZXJ0aWVzTWV0aG9kKFByZXR0eVdyaXRlciBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBjb21wb25lbnRDbGFzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sbGVjdGlvbiBjb21wb25lbnRzKSB0aHJvd3MgSU9FeGNlcHRpb247Ci0KLSAgdm9pZCB3cml0ZVJlbGVhc2VNZXRob2QoUHJldHR5V3JpdGVyIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9uZW50QmVhbiBjb21wb25lbnQpIHRocm93cyBJT0V4Y2VwdGlvbjsKLQotICB2b2lkIHdyaXRlUmVsZWFzZU1ldGhvZChQcmV0dHlXcml0ZXIgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICBDb2xsZWN0aW9uIGNvbXBvbmVudHMpIHRocm93cyBJT0V4Y2VwdGlvbjsKLQotICB2b2lkIHdyaXRlR2V0Q29tcG9uZW50VHlwZShQcmV0dHlXcml0ZXIgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb25lbnRCZWFuIGNvbXBvbmVudCkgdGhyb3dzIElPRXhjZXB0aW9uOwotCi0gIHZvaWQgd3JpdGVHZXRSZW5kZXJlclR5cGUoUHJldHR5V3JpdGVyIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb25lbnRCZWFuIGNvbXBvbmVudCkgdGhyb3dzIElPRXhjZXB0aW9uOwotCi0gIHZvaWQgd3JpdGVQcm9wZXJ0eU1lbWJlcnMoUHJldHR5V3JpdGVyIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb25lbnRCZWFuIGNvbXBvbmVudCkgdGhyb3dzIElPRXhjZXB0aW9uOwotCi0gIHZvaWQgd3JpdGVQcm9wZXJ0eU1lbWJlcnMoUHJldHR5V3JpdGVyIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2xsZWN0aW9uIGNvbXBvbmVudHMpIHRocm93cyBJT0V4Y2VwdGlvbjsKLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy9nZW5lcmF0b3IvdGFnbGliL015RmFjZXNDb21wb25lbnRUYWdHZW5lcmF0b3IuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy9nZW5lcmF0b3IvdGFnbGliL015RmFjZXNDb21wb25lbnRUYWdHZW5lcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTRmMWNlYy4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvZ2VuZXJhdG9yL3RhZ2xpYi9NeUZhY2VzQ29tcG9uZW50VGFnR2VuZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MzYgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLmdlbmVyYXRvci50YWdsaWI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLmdlbmVyYXRvci5HZW5lcmF0b3JIZWxwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy5pby5QcmV0dHlXcml0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy5wYXJzZS5Db21wb25lbnRCZWFuOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMucGFyc2UuTWV0aG9kU2lnbmF0dXJlQmVhbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLnBhcnNlLlByb3BlcnR5QmVhbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLnV0aWwuRmlsdGVyZWRJdGVyYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLnV0aWwuVXRpbDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLS8qKgotICogQ29tcG9uZW50IHRhZyBnZW5lcmF0b3IgZm9yIG15ZmFjZXMKLSAqCi0gKiBAYXV0aG9yIEJydW5vIEFyYW5kYSAobGF0ZXN0IG1vZGlmaWNhdGlvbiBieSAkQXV0aG9yJCkKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCi0gKi8KLXB1YmxpYyBjbGFzcyBNeUZhY2VzQ29tcG9uZW50VGFnR2VuZXJhdG9yIGV4dGVuZHMgQWJzdHJhY3RDb21wb25lbnRUYWdHZW5lcmF0b3IKLXsKLSAgcHJpdmF0ZSBib29sZWFuIF9pczEyOwotCi0gIHB1YmxpYyBNeUZhY2VzQ29tcG9uZW50VGFnR2VuZXJhdG9yKGJvb2xlYW4gaXMxMikKLSAgewotICAgIF9pczEyID0gaXMxMjsKLSAgfQotICAKLSAgcHJvdGVjdGVkIGJvb2xlYW4gaXMxMigpCi0gIHsKLSAgICByZXR1cm4gX2lzMTI7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBhZGRTcGVjaWZpY0ltcG9ydHMoU2V0IGltcG9ydHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb25lbnRCZWFuIGNvbXBvbmVudCkKLSAgewotICAgIGltcG9ydHMuYWRkKCJqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQiKTsKLSAgICBpbXBvcnRzLmFkZChjb21wb25lbnQuZ2V0Q29tcG9uZW50Q2xhc3MoKSk7Ci0KLSAgICBpZiAoX2lzMTIpCi0gICAgewotICAgICAgaW1wb3J0cy5hZGQoImphdmF4LmVsLlZhbHVlRXhwcmVzc2lvbiIpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgaW1wb3J0cy5hZGQoImphdmF4LmZhY2VzLmVsLlZhbHVlQmluZGluZyIpOwotICAgICAgaW1wb3J0cy5hZGQoImphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Iik7Ci0gICAgfQotICAgICAgICAKLQotICAgIEl0ZXJhdG9yIHByb3BlcnRpZXMgPSBjb21wb25lbnQucHJvcGVydGllcygpOwotICAgIHByb3BlcnRpZXMgPSBuZXcgRmlsdGVyZWRJdGVyYXRvcihwcm9wZXJ0aWVzLCBuZXcgVGFnQXR0cmlidXRlRmlsdGVyKCkpOwotCi0gICAgd2hpbGUgKHByb3BlcnRpZXMuaGFzTmV4dCgpKQotICAgIHsKLSAgICAgIFByb3BlcnR5QmVhbiBwcm9wZXJ0eSA9IChQcm9wZXJ0eUJlYW4pIHByb3BlcnRpZXMubmV4dCgpOwotICAgICAgU3RyaW5nIHByb3BlcnR5Q2xhc3MgPSBwcm9wZXJ0eS5nZXRQcm9wZXJ0eUNsYXNzKCk7Ci0KLSAgICAgIGlmIChHZW5lcmF0b3JIZWxwZXIuaXNDb252ZXJ0ZXIocHJvcGVydHlDbGFzcykpCi0gICAgICB7Ci0gICAgICAgIGlmICghX2lzMTIpCi0gICAgICAgIHsKLSAgICAgICAgICBpbXBvcnRzLmFkZCgiamF2YXguZmFjZXMuZWwuVmFsdWVCaW5kaW5nIik7Ci0gICAgICAgIH0KLSAgICAgICAgaW1wb3J0cy5hZGQoImphdmF4LmZhY2VzLmNvbnZlcnQuQ29udmVydGVyIik7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChwcm9wZXJ0eS5pc01ldGhvZEJpbmRpbmcoKSkKLSAgICAgIHsKLSAgICAgICAgaWYgKF9pczEyKQotICAgICAgICB7Ci0gICAgICAgICAgaW1wb3J0cy5hZGQoImphdmF4LmVsLk1ldGhvZEV4cHJlc3Npb24iKTsKLSAgICAgICAgICBpZiAoR2VuZXJhdG9ySGVscGVyLmlzQWN0aW9uTGlzdGVuZXIocHJvcGVydHksIF9pczEyKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpbXBvcnRzLmFkZCgiamF2YXguZmFjZXMuZXZlbnQuTWV0aG9kRXhwcmVzc2lvbkFjdGlvbkxpc3RlbmVyIik7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChHZW5lcmF0b3JIZWxwZXIuaXNWYWx1ZUNoYW5nZUxpc3RlbmVyKHByb3BlcnR5LCBfaXMxMikpCi0gICAgICAgICAgewotICAgICAgICAgICAgaW1wb3J0cy5hZGQoImphdmF4LmZhY2VzLmV2ZW50Lk1ldGhvZEV4cHJlc3Npb25WYWx1ZUNoYW5nZUxpc3RlbmVyIik7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChHZW5lcmF0b3JIZWxwZXIuaXNWYWxpZGF0b3IocHJvcGVydHksIF9pczEyKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpbXBvcnRzLmFkZCgiamF2YXguZmFjZXMudmFsaWRhdG9yLk1ldGhvZEV4cHJlc3Npb25WYWxpZGF0b3IiKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgaW1wb3J0cy5hZGQoImphdmF4LmZhY2VzLmVsLk1ldGhvZEJpbmRpbmciKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZSBpZiAocHJvcGVydHkuaXNNZXRob2RFeHByZXNzaW9uKCkpCi0gICAgICB7Ci0gICAgICAgIGltcG9ydHMuYWRkKCJqYXZheC5lbC5NZXRob2RFeHByZXNzaW9uIik7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChHZW5lcmF0b3JIZWxwZXIuaXNBY3Rpb25MaXN0ZW5lcihwcm9wZXJ0eSwgX2lzMTIpKQotICAgICAgewotICAgICAgICBpbXBvcnRzLmFkZCgiamF2YXguZmFjZXMuZXZlbnQuTWV0aG9kRXhwcmVzc2lvbkFjdGlvbkxpc3RlbmVyIik7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChHZW5lcmF0b3JIZWxwZXIuaXNWYWx1ZUNoYW5nZUxpc3RlbmVyKHByb3BlcnR5LCBfaXMxMikpCi0gICAgICB7Ci0gICAgICAgIGltcG9ydHMuYWRkKCJqYXZheC5mYWNlcy5ldmVudC5NZXRob2RFeHByZXNzaW9uVmFsdWVDaGFuZ2VMaXN0ZW5lciIpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoR2VuZXJhdG9ySGVscGVyLmlzVmFsaWRhdG9yKHByb3BlcnR5LCBfaXMxMikpCi0gICAgICB7Ci0gICAgICAgIGltcG9ydHMuYWRkKCJqYXZheC5mYWNlcy52YWxpZGF0b3IuTWV0aG9kRXhwcmVzc2lvblZhbGlkYXRvciIpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0KLSAgcHJvdGVjdGVkIHZvaWQgd3JpdGVQcm9wZXJ0eURlY2xhcmF0aW9uKFByZXR0eVdyaXRlciBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eUJlYW4gcHJvcGVydHkpIHRocm93cyBJT0V4Y2VwdGlvbgotICB7Ci0gICAgU3RyaW5nIGZpZWxkUHJvcE5hbWUgPSBwcm9wZXJ0eS5nZXRGaWVsZFByb3BlcnR5TmFtZSgpOwotICAgIFN0cmluZyBqc3BQcm9wVHlwZSA9IEdlbmVyYXRvckhlbHBlci5nZXRKc3BQcm9wZXJ0eVR5cGUocHJvcGVydHksIF9pczEyKTsKLQotICAgIG91dC5wcmludGxuKCk7Ci0gICAgb3V0LnByaW50bG4oInByaXZhdGUgIiArIGpzcFByb3BUeXBlICsgIiAiICsgZmllbGRQcm9wTmFtZSArICI7Iik7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCB3cml0ZVByb3BlcnR5U2V0dGVyKFByZXR0eVdyaXRlciBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlCZWFuIHByb3BlcnR5KSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgewotICAgIFN0cmluZyBwcm9wTmFtZSA9IHByb3BlcnR5LmdldFByb3BlcnR5TmFtZSgpOwotICAgIFN0cmluZyBmaWVsZFByb3BOYW1lID0gcHJvcGVydHkuZ2V0RmllbGRQcm9wZXJ0eU5hbWUoKTsKLSAgICBTdHJpbmcganNwUHJvcE5hbWUgPSBwcm9wZXJ0eS5nZXRKc3BQcm9wZXJ0eU5hbWUoKTsKLSAgICBTdHJpbmcgcHJvcFZhciA9IFV0aWwuZ2V0VmFyaWFibGVGcm9tTmFtZShwcm9wTmFtZSk7Ci0gICAgU3RyaW5nIHNldE1ldGhvZCA9IFV0aWwuZ2V0UHJlZml4ZWRQcm9wZXJ0eU5hbWUoInNldCIsIGpzcFByb3BOYW1lKTsKLSAgICBTdHJpbmcganNwUHJvcFR5cGUgPSBHZW5lcmF0b3JIZWxwZXIuZ2V0SnNwUHJvcGVydHlUeXBlKHByb3BlcnR5LCBfaXMxMik7Ci0KLSAgICBvdXQucHJpbnRsbigicHVibGljIHZvaWQgIiArIHNldE1ldGhvZCArICIoIiArIGpzcFByb3BUeXBlICsgIiAiICsgcHJvcFZhciArICIpIik7Ci0gICAgb3V0LnByaW50bG4oInsiKTsKLSAgICBvdXQuaW5kZW50KCk7Ci0gICAgb3V0LnByaW50bG4oZmllbGRQcm9wTmFtZSArICIgPSAiICsgcHJvcFZhciArICI7Iik7Ci0gICAgb3V0LnVuaW5kZW50KCk7Ci0gICAgb3V0LnByaW50bG4oIn0iKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHdyaXRlR2V0Q29tcG9uZW50VHlwZShQcmV0dHlXcml0ZXIgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9uZW50QmVhbiBjb21wb25lbnQpIHRocm93cyBJT0V4Y2VwdGlvbgotICB7Ci0gICAgU3RyaW5nIGNvbXBvbmVudFR5cGUgPSBjb21wb25lbnQuZ2V0Q29tcG9uZW50VHlwZSgpOwotICAgIGlmKCJqYXZheC5mYWNlcy5IdG1sQ29sdW1uIi5lcXVhbHMoY29tcG9uZW50VHlwZSkpCi0gICAgewotICAgICAgY29tcG9uZW50VHlwZSA9ICJqYXZheC5mYWNlcy5Db2x1bW4iOwotICAgIH0KLSAgICBvdXQucHJpbnRsbigpOwotCi0gICAgLy8gVGhlIHN1cGVyY2xhc3MgZG9lcyBub3QgbmVjZXNzYXJpbHkgbmVlZCB0byBoYXZlIHRoaXMgbWV0aG9kCi0gICAgaWYgKGlzMTIoKSl7Ci0gICAgICAgIG91dC5wcmludGxuKCJAT3ZlcnJpZGUiKTsKLSAgICB9Ci0gICAgb3V0LnByaW50bG4oInB1YmxpYyBTdHJpbmcgZ2V0Q29tcG9uZW50VHlwZSgpIik7Ci0gICAgb3V0LnByaW50bG4oInsiKTsKLSAgICBvdXQuaW5kZW50KCk7Ci0gICAgb3V0LnByaW50bG4oInJldHVybiBcIiIgKyBjb21wb25lbnRUeXBlICsgIlwiOyIpOwotICAgIG91dC51bmluZGVudCgpOwotICAgIG91dC5wcmludGxuKCJ9Iik7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB3cml0ZVNldFByb3BlcnRpZXNNZXRob2QoUHJldHR5V3JpdGVyIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBjb21wb25lbnRDbGFzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvbmVudEJlYW4gY29tcG9uZW50KSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgewotICAgIENvbGxlY3Rpb24gY29tcG9uZW50cyA9IG5ldyBIYXNoU2V0KCk7Ci0gICAgY29tcG9uZW50cy5hZGQoY29tcG9uZW50KTsKLSAgICB3cml0ZVNldFByb3BlcnRpZXNNZXRob2Qob3V0LCBjb21wb25lbnRDbGFzcywgY29tcG9uZW50cyk7Ci0gIH0KLQotCi0gIHB1YmxpYyB2b2lkIHdyaXRlU2V0UHJvcGVydGllc01ldGhvZChQcmV0dHlXcml0ZXIgb3V0LCBTdHJpbmcgY29tcG9uZW50Q2xhc3MsIENvbGxlY3Rpb24gY29tcG9uZW50cykKLSAgICAgIHRocm93cyBJT0V4Y2VwdGlvbgotICB7Ci0KLSAgICBDb2xsZWN0aW9uIGFsbCA9IG5ldyBIYXNoU2V0KCk7Ci0gICAgZm9yIChJdGVyYXRvciBsSXRlcmF0b3IgPSBjb21wb25lbnRzLml0ZXJhdG9yKCk7IGxJdGVyYXRvci5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIENvbXBvbmVudEJlYW4gY29tcG9uZW50ID0gKENvbXBvbmVudEJlYW4pIGxJdGVyYXRvci5uZXh0KCk7Ci0gICAgICBJdGVyYXRvciBwcm9wID0gY29tcG9uZW50LnByb3BlcnRpZXMoKTsKLSAgICAgIHdoaWxlIChwcm9wLmhhc05leHQoKSkKLSAgICAgIHsKLSAgICAgICAgYWxsLmFkZChwcm9wLm5leHQoKSk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgSXRlcmF0b3IgcHJvcGVydGllcyA9IGFsbC5pdGVyYXRvcigpOwotICAgIHByb3BlcnRpZXMgPSBuZXcgRmlsdGVyZWRJdGVyYXRvcihwcm9wZXJ0aWVzLCBuZXcgVGFnQXR0cmlidXRlRmlsdGVyKCkpOwotCi0gICAgb3V0LnByaW50bG4oKTsKLQotICAgIGlmIChfaXMxMikKLSAgICB7Ci0gICAgICBvdXQucHJpbnRsbigiQE92ZXJyaWRlIik7Ci0gICAgfQotICAgIG91dC5wcmludGxuKCJwcm90ZWN0ZWQgdm9pZCBzZXRQcm9wZXJ0aWVzKFVJQ29tcG9uZW50IGNvbXBvbmVudCkiKTsKLSAgICBvdXQudW5pbmRlbnQoKTsKLSAgICBvdXQucHJpbnRsbigieyIpOwotICAgIG91dC5pbmRlbnQoKTsKLQotICAgIHdyaXRlU2V0UHJvcGVydHlNZXRob2RCb2R5KG91dCwgY29tcG9uZW50Q2xhc3MsIHByb3BlcnRpZXMpOwotICAgIG91dC51bmluZGVudCgpOwotICAgIG91dC5wcmludGxuKCJ9Iik7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCB3cml0ZVNldFByb3BlcnR5TWV0aG9kQm9keShQcmV0dHlXcml0ZXIgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgY29tcG9uZW50Q2xhc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEl0ZXJhdG9yIHByb3BlcnRpZXMpIHRocm93cyBJT0V4Y2VwdGlvbgotICB7Ci0KLSAgICBpZigiSHRtbENvbHVtbiIuZXF1YWxzKGNvbXBvbmVudENsYXNzKSkKLSAgICB7Ci0gICAgICAgIGNvbXBvbmVudENsYXNzID0gIlVJQ29sdW1uIjsKLSAgICB9Ci0KLSAgICBvdXQucHJpbnRsbigiaWYgKCEoY29tcG9uZW50IGluc3RhbmNlb2YgIiArIGNvbXBvbmVudENsYXNzICsgIikpIik7Ci0gICAgb3V0LnByaW50bG4oInsiKTsKLSAgICBvdXQuaW5kZW50KCk7Ci0gICAgb3V0LnByaW50KCJ0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCIpOwotICAgIG91dC5wcmludCgiXCJDb21wb25lbnQgXCIgKyBjb21wb25lbnQuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyBcIiBpcyBubyAiICsgY29tcG9uZW50Q2xhc3MgKyAiXCIiKTsKLSAgICBvdXQucHJpbnRsbigiKTsiKTsKLSAgICBvdXQudW5pbmRlbnQoKTsKLSAgICBvdXQucHJpbnRsbigifSIpOwotCi0gICAgb3V0LnByaW50bG4oY29tcG9uZW50Q2xhc3MgKyAiIGNvbXAgPSAoIiArIGNvbXBvbmVudENsYXNzICsgIiljb21wb25lbnQ7Iik7Ci0KLSAgICBvdXQucHJpbnRsbigpOwotICAgIG91dC5wcmludGxuKCJzdXBlci5zZXRQcm9wZXJ0aWVzKGNvbXBvbmVudCk7Iik7Ci0gICAgb3V0LnByaW50bG4oKTsKLQotICAgIGlmICghX2lzMTIpCi0gICAgewotICAgICAgb3V0LnByaW50bG4oIkZhY2VzQ29udGV4dCBjb250ZXh0ID0gZ2V0RmFjZXNDb250ZXh0KCk7Iik7Ci0gICAgfQotCi0gICAgd2hpbGUgKHByb3BlcnRpZXMuaGFzTmV4dCgpKQotICAgIHsKLSAgICAgIFByb3BlcnR5QmVhbiBwcm9wZXJ0eSA9IChQcm9wZXJ0eUJlYW4pIHByb3BlcnRpZXMubmV4dCgpOwotICAgICAgX3dyaXRlU2V0UHJvcGVydGllc0Nhc2Uob3V0LCBjb21wb25lbnRDbGFzcywgcHJvcGVydHkpOwotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgdm9pZCBfd3JpdGVTZXRQcm9wZXJ0aWVzQ2FzZSgKLSAgICAgIFByZXR0eVdyaXRlciBvdXQsCi0gICAgICBTdHJpbmcgY29tcG9uZW50Q2xhc3MsCi0gICAgICBQcm9wZXJ0eUJlYW4gcHJvcGVydHkpIHRocm93cyBJT0V4Y2VwdGlvbgotICB7Ci0KLSAgICBpZiAocHJvcGVydHkuaXNNZXRob2RCaW5kaW5nKCkpCi0gICAgewotICAgICAgX3dyaXRlU2V0TWV0aG9kQmluZGluZyhvdXQsIGNvbXBvbmVudENsYXNzLCBwcm9wZXJ0eSk7Ci0gICAgfQotICAgIGVsc2UgaWYgKHByb3BlcnR5LmlzTWV0aG9kRXhwcmVzc2lvbigpKQotICAgIHsKLSAgICAgIF93cml0ZVNldE1ldGhvZEV4cHJlc3Npb24ob3V0LCBjb21wb25lbnRDbGFzcywgcHJvcGVydHkpOwotICAgIH0KLSAgICBlbHNlIGlmIChHZW5lcmF0b3JIZWxwZXIuaXNDb252ZXJ0ZXIocHJvcGVydHkuZ2V0UHJvcGVydHlDbGFzcygpKSkKLSAgICB7Ci0gICAgICBfd3JpdGVTZXRDb252ZXJ0ZXIob3V0LCBjb21wb25lbnRDbGFzcywgcHJvcGVydHkuZ2V0UHJvcGVydHlOYW1lKCkpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgX3dyaXRlU2V0UHJvcGVydHkob3V0LCBwcm9wZXJ0eSk7Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIF93cml0ZVNldFByb3BlcnR5KAotICAgICAgUHJldHR5V3JpdGVyIG91dCwKLSAgICAgIFByb3BlcnR5QmVhbiBwcm9wZXJ0eSkKLSAgewotICAgIFN0cmluZyBwcm9wTmFtZSA9IHByb3BlcnR5LmdldFByb3BlcnR5TmFtZSgpOwotICAgIFN0cmluZyBwcm9wVmFyID0gIl8iICsgcHJvcE5hbWU7Ci0gICAgCi0gICAgb3V0LnByaW50bG4oImlmICgiICsgcHJvcFZhciArICIgIT0gbnVsbCkgIik7Ci0gICAgb3V0LnByaW50bG4oInsiKTsKLSAgICBvdXQuaW5kZW50KCk7Ci0KLSAgICBpZiAocHJvcGVydHkuaXNMaXRlcmFsT25seSgpKQotICAgIHsKLSAgICAgIGlmIChfaXMxMil7Ci0gICAgICAgICAgb3V0LnByaW50bG4oImNvbXAuZ2V0QXR0cmlidXRlcygpLnB1dChcIiIgKyBwcm9wTmFtZSArICJcIiwgIiArIHByb3BWYXIgKyAiKTsiKTsKLSAgICAgIH1lbHNlewotICAgICAgICAgIFN0cmluZyBwcm9wZXJ0eUNsYXNzID0gcHJvcGVydHkuZ2V0UHJvcGVydHlDbGFzcygpLnRyaW0oKTsKLSAgICAgICAgICBpZiAocHJvcGVydHlDbGFzcy5zdGFydHNXaXRoKCJqYXZhLmxhbmcuIikpewotICAgICAgICAgICAgICBwcm9wZXJ0eUNsYXNzID0gcHJvcGVydHlDbGFzcy5yZXBsYWNlKCJqYXZhLmxhbmcuIiwgIiIpOwotICAgICAgICAgIH0KLSAgICAgICAgICAKLSAgICAgICAgICBpZiAocHJvcGVydHlDbGFzcy5lbmRzV2l0aCgiZWdlciIpKXsKLSAgICAgICAgICAgICAgcHJvcGVydHlDbGFzcyA9IHByb3BlcnR5Q2xhc3MucmVwbGFjZSgiZWdlciIsICIiKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgCi0gICAgICAgICAgaWYgKFV0aWwuaXNQcmltaXRpdmVDbGFzcyhwcm9wZXJ0eUNsYXNzLnRvTG93ZXJDYXNlKCkpKXsKLSAgICAgICAgICAgICAgb3V0LnByaW50bG4oImNvbXAuZ2V0QXR0cmlidXRlcygpLnB1dChcIiIgKyBwcm9wTmFtZSArICJcIiwgIiArCi0gICAgICAgICAgICAgICAgICAgICAgVXRpbC5nZXRCb3hlZENsYXNzKHByb3BlcnR5Q2xhc3MudG9Mb3dlckNhc2UoKSkrIi52YWx1ZU9mKCIgKyBwcm9wVmFyICsgIikpOyIpOyAgICAgICAgICAgICAgICAKLSAgICAgICAgICB9ZWxzZXsgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgIG91dC5wcmludGxuKCJjb21wLmdldEF0dHJpYnV0ZXMoKS5wdXQoXCIiICsgcHJvcE5hbWUgKyAiXCIsICIgKyBwcm9wVmFyICsgIik7Iik7Ci0gICAgICAgICAgfQotICAgICAgfQotICAgICAgCi0gICAgfQotICAgIGVsc2UgaWYgKF9pczEyKQotICAgIHsKLSAgICAgIG91dC5wcmludGxuKCJjb21wLnNldFZhbHVlRXhwcmVzc2lvbihcIiIgKyBwcm9wTmFtZSArICJcIiwgIiArIHByb3BWYXIgKyAiKTsiKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIF93cml0ZVNldFZhbHVlQmluZGluZyhvdXQsIHByb3BlcnR5LCBwcm9wTmFtZSwgcHJvcFZhcik7Ci0gICAgfQotICAgIG91dC51bmluZGVudCgpOwotICAgIG91dC5wcmludGxuKCJ9Iik7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgX3dyaXRlU2V0VmFsdWVCaW5kaW5nKAotICAgICAgUHJldHR5V3JpdGVyIG91dCwKLSAgICAgIFByb3BlcnR5QmVhbiBwcm9wZXJ0eSwKLSAgICAgIFN0cmluZyBwcm9wTmFtZSwKLSAgICAgIFN0cmluZyBwcm9wVmFyKQotICB7Ci0gICAgb3V0LnByaW50bG4oImlmIChpc1ZhbHVlUmVmZXJlbmNlKCIgKyBwcm9wVmFyICsgIikpIik7Ci0gICAgb3V0LnByaW50bG4oInsiKTsKLSAgICBvdXQuaW5kZW50KCk7Ci0gICAgb3V0LnByaW50bG4oIlZhbHVlQmluZGluZyB2YiA9IGNvbnRleHQuZ2V0QXBwbGljYXRpb24oKS5jcmVhdGVWYWx1ZUJpbmRpbmcoIiArIHByb3BWYXIgKyAiKTsiKTsKLSAgICBvdXQucHJpbnRsbigiY29tcC5zZXRWYWx1ZUJpbmRpbmcoXCIiICsgcHJvcE5hbWUgKyAiXCIsIHZiKTsiKTsKLSAgICBvdXQudW5pbmRlbnQoKTsKLSAgICBvdXQucHJpbnRsbigifSIpOwotICAgIG91dC5wcmludGxuKCJlbHNlIik7Ci0gICAgb3V0LnByaW50bG4oInsiKTsKLSAgICBvdXQuaW5kZW50KCk7Ci0gICAgaWYgKCFpczEyKCkgJiYgInZhbHVlIi5lcXVhbHMocHJvcE5hbWUpKQotICAgIHsKLSAgICAgICAgb3V0LnByaW50bG4oImNvbXAuc2V0VmFsdWUoIiArIHByb3BWYXIgKyAiKTsiKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgaWYgKFV0aWwuaXNQcmltaXRpdmVDbGFzcyhwcm9wZXJ0eS5nZXRQcm9wZXJ0eUNsYXNzKCkpKXsKLSAgICAgICAgICAgIG91dC5wcmludGxuKCJjb21wLmdldEF0dHJpYnV0ZXMoKS5wdXQoXCIiICsgcHJvcE5hbWUgKyAiXCIsICIgKwotICAgICAgICAgICAgICAgICAgICBVdGlsLmdldEJveGVkQ2xhc3MocHJvcGVydHkuZ2V0UHJvcGVydHlDbGFzcygpKSsiLnZhbHVlT2YoIiArIHByb3BWYXIgKyAiKSk7Iik7Ci0gICAgICAgIH1lbHNlewotICAgICAgICAgICAgU3RyaW5nIHByb3BlcnR5Q2xhc3MgPSBwcm9wZXJ0eS5nZXRQcm9wZXJ0eUNsYXNzKCkudHJpbSgpOwotICAgICAgICAgICAgaWYgKHByb3BlcnR5Q2xhc3Muc3RhcnRzV2l0aCgiamF2YS5sYW5nLiIpKXsKLSAgICAgICAgICAgICAgICBwcm9wZXJ0eUNsYXNzID0gcHJvcGVydHlDbGFzcy5yZXBsYWNlKCJqYXZhLmxhbmcuIiwgIiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAocHJvcGVydHlDbGFzcy5lbmRzV2l0aCgiZWdlciIpKXsKLSAgICAgICAgICAgICAgICBwcm9wZXJ0eUNsYXNzID0gcHJvcGVydHlDbGFzcy5yZXBsYWNlKCJlZ2VyIiwgIiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoVXRpbC5pc1ByaW1pdGl2ZUNsYXNzKHByb3BlcnR5Q2xhc3MudG9Mb3dlckNhc2UoKSkpewotICAgICAgICAgICAgICAgIG91dC5wcmludGxuKCJjb21wLmdldEF0dHJpYnV0ZXMoKS5wdXQoXCIiICsgcHJvcE5hbWUgKyAiXCIsICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgVXRpbC5nZXRCb3hlZENsYXNzKHByb3BlcnR5Q2xhc3MudG9Mb3dlckNhc2UoKSkrIi52YWx1ZU9mKCIgKyBwcm9wVmFyICsgIikpOyIpOyAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIH1lbHNleyAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigiY29tcC5nZXRBdHRyaWJ1dGVzKCkucHV0KFwiIiArIHByb3BOYW1lICsgIlwiLCAiICsgcHJvcFZhciArICIpOyIpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfSAgICAKLSAgICBvdXQudW5pbmRlbnQoKTsKLSAgICBvdXQucHJpbnRsbigifSIpOwotICB9Ci0KLQotICBwcml2YXRlIHZvaWQgX3dyaXRlU2V0TWV0aG9kQmluZGluZygKLSAgICAgIFByZXR0eVdyaXRlciBvdXQsCi0gICAgICBTdHJpbmcgY29tcG9uZW50Q2xhc3MsCi0gICAgICBQcm9wZXJ0eUJlYW4gcHJvcGVydHkpIHRocm93cyBJT0V4Y2VwdGlvbgotICB7Ci0gICAgU3RyaW5nIHByb3BOYW1lID0gcHJvcGVydHkuZ2V0UHJvcGVydHlOYW1lKCk7Ci0gICAgU3RyaW5nIHByb3BLZXkgPSBVdGlsLmdldENvbnN0YW50TmFtZUZyb21Qcm9wZXJ0eShwcm9wTmFtZSwgIl9LRVkiKTsKLSAgICBTdHJpbmcgcHJvcFZhciA9ICJfIiArIHByb3BOYW1lOwotCi0gICAgaWYgKF9pczEyKQotICAgIHsKLSAgICAgIG91dC5wcmludGxuKCJpZiAoIiArIHByb3BWYXIgKyAiICE9IG51bGwpIik7Ci0gICAgICBvdXQucHJpbnRsbigieyIpOwotICAgICAgb3V0LmluZGVudCgpOwotICAgICAgaWYgKEdlbmVyYXRvckhlbHBlci5pc0FjdGlvbkxpc3RlbmVyKHByb3BlcnR5LCBfaXMxMikpCi0gICAgICB7Ci0gICAgICAgIG91dC5wcmludGxuKCJjb21wLmFkZEFjdGlvbkxpc3RlbmVyKG5ldyBNZXRob2RFeHByZXNzaW9uQWN0aW9uTGlzdGVuZXIoIiArIHByb3BWYXIgKyAiKSk7Iik7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChHZW5lcmF0b3JIZWxwZXIuaXNWYWx1ZUNoYW5nZUxpc3RlbmVyKHByb3BlcnR5LCBfaXMxMikpCi0gICAgICB7Ci0gICAgICAgIG91dC5wcmludGxuKCJjb21wLmFkZFZhbHVlQ2hhbmdlTGlzdGVuZXIobmV3IE1ldGhvZEV4cHJlc3Npb25WYWx1ZUNoYW5nZUxpc3RlbmVyKCIgKyBwcm9wVmFyICsgIikpOyIpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoR2VuZXJhdG9ySGVscGVyLmlzVmFsaWRhdG9yKHByb3BlcnR5LCBfaXMxMikpCi0gICAgICB7Ci0gICAgICAgIG91dC5wcmludGxuKCJjb21wLmFkZFZhbGlkYXRvcihuZXcgTWV0aG9kRXhwcmVzc2lvblZhbGlkYXRvcigiICsgcHJvcFZhciArICIpKTsiKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgb3V0LnByaW50bG4oImJlYW4uc2V0UHJvcGVydHkoIiArIGNvbXBvbmVudENsYXNzICsgIi4iICsgcHJvcEtleSArICIsICIgKwotICAgICAgICAgICAgIm5ldyBNZXRob2RFeHByZXNzaW9uTWV0aG9kQmluZGluZygiICsgcHJvcFZhciArICIpKTsiKTsKLSAgICAgIH0KLSAgICAgIG91dC51bmluZGVudCgpOwotICAgICAgb3V0LnByaW50bG4oIn0iKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIE1ldGhvZFNpZ25hdHVyZUJlYW4gc2lnbmF0dXJlID0gcHJvcGVydHkuZ2V0TWV0aG9kQmluZGluZ1NpZ25hdHVyZSgpOwotICAgICAgU3RyaW5nW10gcGFyYW1UeXBlcyA9IChzaWduYXR1cmUgIT0gbnVsbCkgPyBzaWduYXR1cmUuZ2V0UGFyYW1ldGVyVHlwZXMoKSA6IG51bGw7Ci0KLSAgICAgIFN0cmluZyBjbGFzc0FycmF5OwotCi0gICAgICBpZiAocGFyYW1UeXBlcyA9PSBudWxsIHx8IHBhcmFtVHlwZXMubGVuZ3RoID09IDApCi0gICAgICB7Ci0gICAgICAgIGNsYXNzQXJyYXkgPSAibmV3IENsYXNzWzBdIjsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICBzYi5hcHBlbmQoIm5ldyBDbGFzc1tdeyIpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhcmFtVHlwZXMubGVuZ3RoOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoaSA+IDApCi0gICAgICAgICAgICBzYi5hcHBlbmQoJywnKTsKLSAgICAgICAgICBzYi5hcHBlbmQocGFyYW1UeXBlc1tpXSk7Ci0gICAgICAgICAgc2IuYXBwZW5kKCIuY2xhc3MiKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFRPRE86IHJlbW92ZSB0cmFpbGluZyBjb21tYQotICAgICAgICBzYi5hcHBlbmQoJywnKTsKLQotICAgICAgICBzYi5hcHBlbmQoJ30nKTsKLSAgICAgICAgY2xhc3NBcnJheSA9IHNiLnRvU3RyaW5nKCk7Ci0gICAgICB9Ci0KLSAgICAgIG91dC5wcmludGxuKCJpZiAoIiArIHByb3BWYXIgKyAiICE9IG51bGwpIik7Ci0gICAgICBvdXQucHJpbnRsbigieyIpOwotICAgICAgb3V0LmluZGVudCgpOwotCi0gICAgICBpZiAoaXNTdHJpbmdNZXRob2RCaW5kaW5nUmV0dXJuVHlwZShzaWduYXR1cmUpIHx8IHByb3BlcnR5LmdldEpzcFByb3BlcnR5TmFtZSgpLmVxdWFscygiYWN0aW9uIikpCi0gICAgICB7Ci0gICAgICAgIG91dC5wcmludGxuKCJNZXRob2RCaW5kaW5nIG1iOyIpOwotICAgICAgICBvdXQucHJpbnRsbigiaWYgKGlzVmFsdWVSZWZlcmVuY2UoIiArIHByb3BWYXIgKyAiKSkiKTsKLSAgICAgICAgb3V0LmluZGVudCgpOwotICAgICAgICBvdXQucHJpbnRsbigibWIgPSBjb250ZXh0LmdldEFwcGxpY2F0aW9uKCkuY3JlYXRlTWV0aG9kQmluZGluZygiICsgcHJvcFZhciArICIsICIgKyBjbGFzc0FycmF5ICsgIik7Iik7Ci0gICAgICAgIG91dC51bmluZGVudCgpOwotICAgICAgICBvdXQucHJpbnRsbigiZWxzZSIpOwotICAgICAgICBvdXQuaW5kZW50KCk7Ci0gICAgICAgIAotICAgICAgICBpZiAoIWlzMTIoKSAmJiBwcm9wZXJ0eS5nZXRKc3BQcm9wZXJ0eU5hbWUoKS5lcXVhbHMoImFjdGlvbiIpKXsKLSAgICAgICAgICAgIG91dC5wcmludGxuKCJtYiA9IG5ldyBvcmcuYXBhY2hlLm15ZmFjZXMuc2hhcmVkX3RvbWFoYXdrLmVsLlNpbXBsZUFjdGlvbk1ldGhvZEJpbmRpbmcoIitwcm9wVmFyKyIpOyIpOwotICAgICAgICB9ZWxzZXsKLSAgICAgICAgICAgIG91dC5wcmludGxuKCJ0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKFwiSW52YWxpZCBleHByZXNzaW9uIFwiICsgIitwcm9wVmFyKyIpOyIpOwotICAgICAgICB9Ci0gICAgICAgIG91dC51bmluZGVudCgpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICAvLyBuZXZlciBhIGxpdGVyYWwsIG5vIG5lZWQgZm9yIENvbnN0YW50TWV0aG9kQmluZGluZwotICAgICAgICBvdXQucHJpbnRsbigiTWV0aG9kQmluZGluZyBtYiA9IGNvbnRleHQuZ2V0QXBwbGljYXRpb24oKS5jcmVhdGVNZXRob2RCaW5kaW5nKCIgKyBwcm9wVmFyICsgIiwgIiArCi0gICAgICAgICAgICBjbGFzc0FycmF5ICsgIik7Iik7Ci0gICAgICB9Ci0gICAgICBTdHJpbmcgc2V0TWV0aG9kID0gVXRpbC5nZXRQcmVmaXhlZFByb3BlcnR5TmFtZSgic2V0IiwgcHJvcE5hbWUpOwotICAgICAgCi0gICAgICBvdXQucHJpbnRsbigiY29tcC4iK3NldE1ldGhvZCsiKG1iKTsiKTsKLSAgICAgIG91dC51bmluZGVudCgpOwotICAgICAgb3V0LnByaW50bG4oIn0iKTsKLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgX3dyaXRlU2V0TWV0aG9kRXhwcmVzc2lvbigKLSAgICAgIFByZXR0eVdyaXRlciBvdXQsCi0gICAgICBTdHJpbmcgY29tcG9uZW50Q2xhc3MsCi0gICAgICBQcm9wZXJ0eUJlYW4gcHJvcGVydHkpIHRocm93cyBJT0V4Y2VwdGlvbgotICB7Ci0gICAgU3RyaW5nIHByb3BOYW1lID0gcHJvcGVydHkuZ2V0UHJvcGVydHlOYW1lKCk7Ci0gICAgU3RyaW5nIHByb3BWYXIgPSBwcm9wZXJ0eS5nZXRGaWVsZFByb3BlcnR5TmFtZSgpOwotCi0gICAgb3V0LnByaW50bG4oImlmICgiICsgcHJvcFZhciArICIgIT0gbnVsbCkgIik7Ci0gICAgb3V0LnByaW50bG4oInsiKTsKLSAgICBvdXQuaW5kZW50KCk7Ci0KLSAgICBpZiAoR2VuZXJhdG9ySGVscGVyLmlzQWN0aW9uKHByb3BlcnR5KSkKLSAgICB7Ci0gICAgICBvdXQucHJpbnRsbigiY29tcC5zZXRBY3Rpb25FeHByZXNzaW9uKCIgKyBwcm9wVmFyICsgIik7Iik7Ci0gICAgfQotICAgIGVsc2UgaWYgKEdlbmVyYXRvckhlbHBlci5pc0FjdGlvbkxpc3RlbmVyKHByb3BlcnR5LCBfaXMxMikpCi0gICAgewotICAgICAgb3V0LnByaW50bG4oImNvbXAuYWRkQWN0aW9uTGlzdGVuZXIobmV3IE1ldGhvZEV4cHJlc3Npb25BY3Rpb25MaXN0ZW5lcigiICsgcHJvcFZhciArICIpKTsiKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIG91dC5wcmludGxuKCJjb21wLiIgKyBVdGlsLmdldFByZWZpeGVkUHJvcGVydHlOYW1lKCJzZXQiLCBwcm9wTmFtZSkgKyAiKCIgKyBwcm9wVmFyICsgIik7Iik7Ci0gICAgfQotICAgIG91dC51bmluZGVudCgpOwotICAgIG91dC5wcmludGxuKCJ9Iik7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgX3dyaXRlU2V0S2V5U3Ryb2tlKAotICAgICAgUHJldHR5V3JpdGVyIG91dCwKLSAgICAgIFN0cmluZyBjb21wb25lbnRDbGFzcywKLSAgICAgIFN0cmluZyBwcm9wTmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uCi0gIHsKLSAgICBTdHJpbmcgcHJvcEtleSA9IFV0aWwuZ2V0Q29uc3RhbnROYW1lRnJvbVByb3BlcnR5KHByb3BOYW1lLCAiX0tFWSIpOwotICAgIFN0cmluZyBwcm9wVmFyID0gIl8iICsgcHJvcE5hbWU7Ci0KLQotICAgIGlmIChfaXMxMikKLSAgICB7Ci0gICAgICBvdXQucHJpbnRsbigiaWYgKCIgKyBwcm9wVmFyICsgIiAhPSBudWxsKSIpOwotICAgICAgb3V0LnByaW50bG4oInsiKTsKLSAgICAgIG91dC5pbmRlbnQoKTsKLSAgICAgIG91dC5wcmludGxuKCJpZiAoISIgKyBwcm9wVmFyICsgIi5pc0xpdGVyYWxUZXh0KCkpIik7Ci0gICAgICBvdXQucHJpbnRsbigieyIpOwotICAgICAgb3V0LmluZGVudCgpOwotICAgICAgb3V0LnByaW50bG4oImJlYW4uc2V0VmFsdWVFeHByZXNzaW9uKCIgKyBjb21wb25lbnRDbGFzcyArICIuIiArIHByb3BLZXkgKyAiLCAiICsgcHJvcFZhciArICIpOyIpOwotICAgICAgb3V0LnVuaW5kZW50KCk7Ci0gICAgICBvdXQucHJpbnRsbigifSIpOwotICAgICAgb3V0LnByaW50bG4oImVsc2UiKTsKLSAgICAgIG91dC5wcmludGxuKCJ7Iik7Ci0gICAgICBvdXQuaW5kZW50KCk7Ci0gICAgICBvdXQucHJpbnRsbigiT2JqZWN0IHZhbCA9ICIgKyBwcm9wVmFyICsgIi5nZXRWYWx1ZShudWxsKTsiKTsKLSAgICAgIG91dC5wcmludGxuKCJpZiAodmFsICE9IG51bGwpIik7Ci0gICAgICBvdXQuaW5kZW50KCk7Ci0gICAgICBvdXQucHJpbnRsbigiYmVhbi5zZXRQcm9wZXJ0eSgiICsgY29tcG9uZW50Q2xhc3MgKyAiLiIgKyBwcm9wS2V5ICsgIiwiKTsKLSAgICAgIG91dC5wcmludGxuKCJcdEtleVN0cm9rZS5nZXRLZXlTdHJva2UodmFsLnRvU3RyaW5nKCkpKTsiKTsKLSAgICAgIG91dC51bmluZGVudCgpOwotICAgICAgb3V0LnVuaW5kZW50KCk7Ci0gICAgICBvdXQucHJpbnRsbigifSIpOwotICAgICAgb3V0LnVuaW5kZW50KCk7Ci0gICAgICBvdXQucHJpbnRsbigifSIpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgb3V0LnByaW50bG4oImlmICgiICsgcHJvcFZhciArICIgIT0gbnVsbCkiKTsKLSAgICAgIG91dC5wcmludGxuKCJ7Iik7Ci0gICAgICBvdXQuaW5kZW50KCk7Ci0gICAgICBvdXQucHJpbnRsbigiaWYgKGlzVmFsdWVSZWZlcmVuY2UoIiArIHByb3BWYXIgKyAiKSkiKTsKLSAgICAgIG91dC5wcmludGxuKCJ7Iik7Ci0gICAgICBvdXQuaW5kZW50KCk7Ci0gICAgICBvdXQucHJpbnRsbigiVmFsdWVCaW5kaW5nIHZiID0gY3JlYXRlVmFsdWVCaW5kaW5nKCIgKyBwcm9wVmFyICsgIik7Iik7Ci0gICAgICBvdXQucHJpbnRsbigiYmVhbi5zZXRWYWx1ZUJpbmRpbmcoIiArIGNvbXBvbmVudENsYXNzICsgIi4iICsgcHJvcEtleSArICIsIHZiKTsiKTsKLSAgICAgIG91dC51bmluZGVudCgpOwotICAgICAgb3V0LnByaW50bG4oIn0iKTsKLSAgICAgIG91dC5wcmludGxuKCJlbHNlIik7Ci0gICAgICBvdXQucHJpbnRsbigieyIpOwotICAgICAgb3V0LmluZGVudCgpOwotICAgICAgb3V0LnByaW50bG4oImJlYW4uc2V0UHJvcGVydHkoIiArIGNvbXBvbmVudENsYXNzICsgIi4iICsgcHJvcEtleSArICIsIik7Ci0gICAgICBvdXQucHJpbnRsbigiXHRLZXlTdHJva2UuZ2V0S2V5U3Ryb2tlKCIgKyBwcm9wVmFyICsgIikpOyIpOwotICAgICAgb3V0LnVuaW5kZW50KCk7Ci0gICAgICBvdXQucHJpbnRsbigifSIpOwotICAgICAgb3V0LnVuaW5kZW50KCk7Ci0gICAgICBvdXQucHJpbnRsbigifSIpOwotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgdm9pZCBfd3JpdGVTZXRDb252ZXJ0ZXIoCi0gICAgICBQcmV0dHlXcml0ZXIgb3V0LAotICAgICAgU3RyaW5nIGNvbXBvbmVudENsYXNzLAotICAgICAgU3RyaW5nIHByb3BOYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgewotICAgIFN0cmluZyBwcm9wS2V5ID0gVXRpbC5nZXRDb25zdGFudE5hbWVGcm9tUHJvcGVydHkocHJvcE5hbWUsICJfS0VZIik7Ci0gICAgU3RyaW5nIHByb3BWYXIgPSAiXyIgKyBwcm9wTmFtZTsKLQotICAgIG91dC5wcmludGxuKCJpZiAoIiArIHByb3BWYXIgKyAiICE9IG51bGwpIik7Ci0gICAgb3V0LnByaW50bG4oInsiKTsKLSAgICBvdXQuaW5kZW50KCk7Ci0KLSAgICBpZiAoX2lzMTIpCi0gICAgewotICAgICAgb3V0LnByaW50bG4oImlmICghIiArIHByb3BWYXIgKyAiLmlzTGl0ZXJhbFRleHQoKSkiKTsKLSAgICAgIG91dC5wcmludGxuKCJ7Iik7Ci0gICAgICBvdXQuaW5kZW50KCk7Ci0gICAgICBvdXQucHJpbnRsbigiY29tcC5zZXRWYWx1ZUV4cHJlc3Npb24oXCIiICsgcHJvcE5hbWUgKyAiXCIsICIgKyBwcm9wVmFyICsgIik7Iik7Ci0gICAgICBvdXQudW5pbmRlbnQoKTsKLSAgICAgIG91dC5wcmludGxuKCJ9Iik7Ci0gICAgICBvdXQucHJpbnRsbigiZWxzZSIpOwotICAgICAgb3V0LnByaW50bG4oInsiKTsKLSAgICAgIG91dC5pbmRlbnQoKTsKLSAgICAgIG91dC5wcmludGxuKCJTdHJpbmcgcyA9ICIgKyBwcm9wVmFyICsgIi5nZXRFeHByZXNzaW9uU3RyaW5nKCk7Iik7Ci0gICAgICBvdXQucHJpbnRsbigiaWYgKHMgIT0gbnVsbCkiKTsKLSAgICAgIG91dC5wcmludGxuKCJ7Iik7Ci0KLSAgICAgIG91dC5pbmRlbnQoKTsKLSAgICAgIG91dC5wcmludGxuKCJDb252ZXJ0ZXIgY29udmVydGVyID0gZ2V0RmFjZXNDb250ZXh0KCkuZ2V0QXBwbGljYXRpb24oKS4iKTsKLSAgICAgIG91dC5pbmRlbnQoKTsKLSAgICAgIG91dC5wcmludGxuKCJjcmVhdGVDb252ZXJ0ZXIocyk7Iik7Ci0gICAgICBvdXQudW5pbmRlbnQoKTsKLSAgICAgIG91dC5wcmludGxuKCJjb21wLnNldENvbnZlcnRlcihjb252ZXJ0ZXIpOyIpOwotCi0gICAgICBvdXQudW5pbmRlbnQoKTsKLSAgICAgIG91dC5wcmludGxuKCJ9Iik7Ci0KLSAgICAgIG91dC51bmluZGVudCgpOwotICAgICAgb3V0LnByaW50bG4oIn0iKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIG91dC5wcmludGxuKCJpZiAoaXNWYWx1ZVJlZmVyZW5jZSgiICsgcHJvcFZhciArICIpKSIpOwotICAgICAgb3V0LnByaW50bG4oInsiKTsKLSAgICAgIG91dC5pbmRlbnQoKTsKLSAgICAgIG91dC5wcmludGxuKCJWYWx1ZUJpbmRpbmcgdmIgPSBjb250ZXh0LmdldEFwcGxpY2F0aW9uKCkuY3JlYXRlVmFsdWVCaW5kaW5nKCIgKyBwcm9wVmFyICsgIik7Iik7Ci0gICAgICBvdXQucHJpbnRsbigiY29tcC5zZXRWYWx1ZUJpbmRpbmcoXCIiICtwcm9wTmFtZSsgIlwiLCB2Yik7Iik7Ci0gICAgICBvdXQudW5pbmRlbnQoKTsKLSAgICAgIG91dC5wcmludGxuKCJ9Iik7Ci0gICAgICBvdXQucHJpbnRsbigiZWxzZSIpOwotICAgICAgb3V0LnByaW50bG4oInsiKTsKLSAgICAgIG91dC5pbmRlbnQoKTsKLSAgICAgIG91dC5wcmludGxuKCJDb252ZXJ0ZXIgY29udmVydGVyID0gZ2V0RmFjZXNDb250ZXh0KCkuZ2V0QXBwbGljYXRpb24oKS4iKTsKLSAgICAgIG91dC5pbmRlbnQoKTsKLSAgICAgIG91dC5wcmludGxuKCJjcmVhdGVDb252ZXJ0ZXIoIiArIHByb3BWYXIgKyAiKTsiKTsKLSAgICAgIG91dC51bmluZGVudCgpOwotICAgICAgb3V0LnByaW50bG4oImNvbXAuc2V0Q29udmVydGVyKGNvbnZlcnRlcik7Iik7Ci0gICAgICBvdXQudW5pbmRlbnQoKTsKLSAgICAgIG91dC5wcmludGxuKCJ9Iik7Ci0gICAgfQotICAgIG91dC51bmluZGVudCgpOwotICAgIG91dC5wcmludGxuKCJ9Iik7Ci0gIH0KLQotICBwcml2YXRlIGJvb2xlYW4gaXNTdHJpbmdNZXRob2RCaW5kaW5nUmV0dXJuVHlwZSgKLSAgICAgIE1ldGhvZFNpZ25hdHVyZUJlYW4gc2lnKQotICB7Ci0gICAgcmV0dXJuIChzaWcgIT0gbnVsbCAmJiAiamF2YS5sYW5nLlN0cmluZyIuZXF1YWxzKHNpZy5nZXRSZXR1cm5UeXBlKCkpKTsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvZ2VuZXJhdG9yL3RhZ2xpYi9NeUZhY2VzQ29udmVydGVyVGFnR2VuZXJhdG9yLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvZ2VuZXJhdG9yL3RhZ2xpYi9NeUZhY2VzQ29udmVydGVyVGFnR2VuZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxOGQ5NTUuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL2dlbmVyYXRvci90YWdsaWIvTXlGYWNlc0NvbnZlcnRlclRhZ0dlbmVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY3ICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy5nZW5lcmF0b3IudGFnbGliOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4ubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy5pby5QcmV0dHlXcml0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy5wYXJzZS5Db252ZXJ0ZXJCZWFuOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMucGFyc2UuUHJvcGVydHlCZWFuOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMudXRpbC5VdGlsOwotCi1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwuVHJlZVNldDsKLQotcHVibGljIGNsYXNzIE15RmFjZXNDb252ZXJ0ZXJUYWdHZW5lcmF0b3IgZXh0ZW5kcyBBYnN0cmFjdENvbnZlcnRlclRhZ0dlbmVyYXRvciB7Ci0KLSAgcHVibGljIE15RmFjZXNDb252ZXJ0ZXJUYWdHZW5lcmF0b3IoYm9vbGVhbiBpczEyLCBTdHJpbmcgbGljZW5zZUhlYWRlciwgTG9nIGxvZykgewotICAgIHN1cGVyKGlzMTIsIGxpY2Vuc2VIZWFkZXIsIGxvZyk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgU2V0IGNyZWF0ZUltcG9ydHMoQ29udmVydGVyQmVhbiBjb252ZXJ0ZXIpIHsKLSAgICBTZXQgaW1wb3J0cyA9IG5ldyBUcmVlU2V0KCk7Ci0KLSAgICBpZiAoaXMxMigpKQotICAgIHsKLSAgICAgIGltcG9ydHMuYWRkKCJqYXZheC5mYWNlcy53ZWJhcHAuQ29udmVydGVyRUxUYWciKTsKLSAgICAgIGltcG9ydHMuYWRkKCJqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dCIpOwotICAgICAgaW1wb3J0cy5hZGQoImphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uIik7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBpbXBvcnRzLmFkZCgiamF2YXguZmFjZXMud2ViYXBwLkNvbnZlcnRlclRhZyIpOwotICAgIH0KLQotICAgIGltcG9ydHMuYWRkKCJqYXZheC5zZXJ2bGV0LmpzcC5Kc3BFeGNlcHRpb24iKTsKLSAgICBpbXBvcnRzLmFkZChjb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0KLSAgICBpbXBvcnRzLmFkZCgiamF2YXguZmFjZXMuY29udmVydC5Db252ZXJ0ZXIiKTsKLSAgICBpZiAoaXMxMigpKQotICAgIHsKLSAgICAgIGltcG9ydHMuYWRkKCJqYXZheC5lbC5WYWx1ZUV4cHJlc3Npb24iKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGltcG9ydHMuYWRkKCJqYXZheC5mYWNlcy5lbC5WYWx1ZUJpbmRpbmciKTsKLSAgICB9Ci0gICAgaW1wb3J0cy5hZGQoIm9yZy5hcGFjaGUubXlmYWNlcy5jb21tb25zLnV0aWwuVGFnVXRpbHMiKTsKLQotCi0gICAgYWRkSW1wb3J0c0Zyb21Qcm9wZXJ0ZXMoY29udmVydGVyLCBpbXBvcnRzKTsKLSAgICByZXR1cm4gaW1wb3J0czsKLSAgfQotCi0KLQotCi0gIHByb3RlY3RlZCB2b2lkIHdyaXRlU2V0UHJvcGVydHkoCi0gICAgUHJldHR5V3JpdGVyIG91dCwKLSAgICBQcm9wZXJ0eUJlYW4gcHJvcGVydHkpCi0gIHsKLSAgICBTdHJpbmcgcHJvcE5hbWUgPSBwcm9wZXJ0eS5nZXRQcm9wZXJ0eU5hbWUoKTsKLSAgICBTdHJpbmcgcHJvcEZ1bGxDbGFzcyA9IHByb3BlcnR5LmdldFByb3BlcnR5Q2xhc3MoKTsKLSAgICBTdHJpbmcgcHJvcENsYXNzID0gVXRpbC5nZXRDbGFzc0Zyb21GdWxsQ2xhc3MocHJvcEZ1bGxDbGFzcyk7Ci0gICAgU3RyaW5nIHByb3BWYXIgPSAiXyIgKyBVdGlsLmdldFZhcmlhYmxlRnJvbU5hbWUocHJvcE5hbWUpOwotCi0gICAgb3V0LnByaW50bG4oImlmICgiICsgcHJvcFZhciArICIgIT0gbnVsbCkiKTsKLSAgICBvdXQucHJpbnRsbigieyIpOwotICAgIG91dC5pbmRlbnQoKTsKLQotICAgIGlmIChpczEyKCkpCi0gICAgewotICAgICAgb3V0LnByaW50bG4oImlmICghIiArIHByb3BWYXIgKyAiLmlzTGl0ZXJhbFRleHQoKSkiKTsKLSAgICAgIG91dC5wcmludGxuKCJ7Iik7Ci0gICAgICBvdXQuaW5kZW50KCk7Ci0gICAgICBvdXQucHJpbnRsbigiY29udmVydGVyLnNldFZhbHVlRXhwcmVzc2lvbihcIiIgKyBwcm9wTmFtZSArICJcIiwgIiArCi0gICAgICAgICAgICAgICAgICBwcm9wVmFyICsgIik7Iik7Ci0gICAgICBvdXQudW5pbmRlbnQoKTsKLSAgICAgIG91dC5wcmludGxuKCJ9Iik7Ci0gICAgICBTdHJpbmcgcHJvcFR5cGUgPSByZXNvbHZlVHlwZShwcm9wRnVsbENsYXNzKTsKLSAgICAgIGlmIChwcm9wVHlwZSAhPSBudWxsKQotICAgICAgewotICAgICAgICBvdXQucHJpbnRsbigiZWxzZSIpOwotICAgICAgICBvdXQucHJpbnRsbigieyIpOwotICAgICAgICBvdXQuaW5kZW50KCk7Ci0gICAgICAgIGlmICgiU3RyaW5nQXJyYXkiLmVxdWFscyhwcm9wVHlwZSkpCi0gICAgICAgIHsKLSAgICAgICAgICBvdXQucHJpbnRsbigidHJ5Iik7Ci0gICAgICAgICAgb3V0LnByaW50bG4oInsiKTsKLSAgICAgICAgfQotCi0gICAgICAgIG91dC5wcmludGxuKHByb3BDbGFzcyArICIgdmFsdWUgPSBUYWdVdGlscy5nZXQiICsgcHJvcFR5cGUgKyAiKCIgKyBwcm9wVmFyICsgIi5nZXRWYWx1ZShudWxsKSk7Iik7Ci0gICAgICAgIFN0cmluZyBzZXRNZXRob2QgPSBVdGlsLmdldFByZWZpeGVkUHJvcGVydHlOYW1lKCJzZXQiLCBwcm9wTmFtZSk7Ci0gICAgICAgIG91dC5wcmludGxuKCJjb252ZXJ0ZXIuIiArIHNldE1ldGhvZCArICIodmFsdWUpOyIpOwotICAgICAgICBpZiAoIlN0cmluZ0FycmF5Ii5lcXVhbHMocHJvcFR5cGUpKQotICAgICAgICB7Ci0gICAgICAgICAgb3V0LnByaW50bG4oIn0iKTsKLSAgICAgICAgICBvdXQucHJpbnRsbigiY2F0Y2ggKFBhcnNlRXhjZXB0aW9uIHBlKSIpOwotICAgICAgICAgIG91dC5wcmludGxuKCJ7Iik7Ci0gICAgICAgICAgb3V0LmluZGVudCgpOwotICAgICAgICAgIG91dC5wcmludGxuKCJ0aHJvdyBuZXcgSnNwRXhjZXB0aW9uKCIpOwotICAgICAgICAgIG91dC5wcmludGxuKCIgIHBlLmdldE1lc3NhZ2UoKSArIFwiOiBcIiArIFwiUG9zaXRpb24gXCIgKyBwZS5nZXRFcnJvck9mZnNldCgpKTsiKTsKLSAgICAgICAgICBvdXQudW5pbmRlbnQoKTsKLSAgICAgICAgICBvdXQucHJpbnRsbigifSIpOwotICAgICAgICB9Ci0gICAgICAgIG91dC51bmluZGVudCgpOwotICAgICAgICBvdXQucHJpbnRsbigifSIpOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgb3V0LnByaW50bG4oImlmIChUYWdVdGlscy5pc1ZhbHVlUmVmZXJlbmNlKCIgKyBwcm9wVmFyICsgIikpIik7Ci0gICAgICBvdXQucHJpbnRsbigieyIpOwotICAgICAgb3V0LmluZGVudCgpOwotICAgICAgb3V0LnByaW50bG4oIlZhbHVlQmluZGluZyB2YiA9IFRhZ1V0aWxzLmdldFZhbHVlQmluZGluZygiICsgcHJvcFZhciArICIpOyIpOwotICAgICAgb3V0LnByaW50bG4oImNvbnZlcnRlci5zZXRWYWx1ZUJpbmRpbmcoXCIiICsgcHJvcE5hbWUgKyAiXCIsIHZiKTsiKTsKLSAgICAgIG91dC51bmluZGVudCgpOwotICAgICAgb3V0LnByaW50bG4oIn0iKTsKLSAgICAgIFN0cmluZyBwcm9wVHlwZSA9IHJlc29sdmVUeXBlKHByb3BGdWxsQ2xhc3MpOwotICAgICAgaWYgKHByb3BUeXBlICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIG91dC5wcmludGxuKCJlbHNlIik7Ci0gICAgICAgIG91dC5wcmludGxuKCJ7Iik7Ci0gICAgICAgIG91dC5pbmRlbnQoKTsKLSAgICAgICAgaWYgKCJTdHJpbmdBcnJheSIuZXF1YWxzKHByb3BUeXBlKSkKLSAgICAgICAgewotICAgICAgICAgIG91dC5wcmludGxuKCJ0cnkiKTsKLSAgICAgICAgICBvdXQucHJpbnRsbigieyIpOwotICAgICAgICB9Ci0gICAgICAgIG91dC5wcmludGxuKHByb3BDbGFzcyArICIgdmFsdWUgPSBUYWdVdGlscy5nZXQiICsgcHJvcFR5cGUgKyAiKCIgKyBwcm9wVmFyICsgIik7Iik7Ci0gICAgICAgIFN0cmluZyBzZXRNZXRob2QgPSBVdGlsLmdldFByZWZpeGVkUHJvcGVydHlOYW1lKCJzZXQiLCBwcm9wTmFtZSk7Ci0gICAgICAgIG91dC5wcmludGxuKCJjb252ZXJ0ZXIuIiArIHNldE1ldGhvZCArICIodmFsdWUpOyIpOwotICAgICAgICBpZiAoIlN0cmluZ0FycmF5Ii5lcXVhbHMocHJvcFR5cGUpKQotICAgICAgICB7Ci0gICAgICAgICAgb3V0LnByaW50bG4oIn0iKTsKLSAgICAgICAgICBvdXQucHJpbnRsbigiY2F0Y2ggKFBhcnNlRXhjZXB0aW9uIHBlKSIpOwotICAgICAgICAgIG91dC5wcmludGxuKCJ7Iik7Ci0gICAgICAgICAgb3V0LmluZGVudCgpOwotICAgICAgICAgIG91dC5wcmludGxuKCJ0aHJvdyBuZXcgSnNwRXhjZXB0aW9uKCIpOwotICAgICAgICAgIG91dC5wcmludGxuKCIgIHBlLmdldE1lc3NhZ2UoKSArIFwiOiBcIiArIFwiUG9zaXRpb24gXCIgKyBwZS5nZXRFcnJvck9mZnNldCgpKTsiKTsKLSAgICAgICAgICBvdXQudW5pbmRlbnQoKTsKLSAgICAgICAgICBvdXQucHJpbnRsbigifSIpOwotICAgICAgICB9Ci0gICAgICAgIG91dC51bmluZGVudCgpOwotICAgICAgICBvdXQucHJpbnRsbigifSIpOwotICAgICAgfQotICAgIH0KLQotICAgIG91dC51bmluZGVudCgpOwotICAgIG91dC5wcmludGxuKCJ9Iik7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL2dlbmVyYXRvci90YWdsaWIvTXlGYWNlc1ZhbGlkYXRvclRhZ0dlbmVyYXRvci5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL2dlbmVyYXRvci90YWdsaWIvTXlGYWNlc1ZhbGlkYXRvclRhZ0dlbmVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZjM1NTMzLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy9nZW5lcmF0b3IvdGFnbGliL015RmFjZXNWYWxpZGF0b3JUYWdHZW5lcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMuZ2VuZXJhdG9yLnRhZ2xpYjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMuaW8uUHJldHR5V3JpdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMucGFyc2UuUHJvcGVydHlCZWFuOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMucGFyc2UuVmFsaWRhdG9yQmVhbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLnV0aWwuVXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlRyZWVTZXQ7Ci0KLXB1YmxpYyBjbGFzcyBNeUZhY2VzVmFsaWRhdG9yVGFnR2VuZXJhdG9yIGV4dGVuZHMgQWJzdHJhY3RWYWxpZGF0b3JUYWdHZW5lcmF0b3IgewotCi0gIHB1YmxpYyBNeUZhY2VzVmFsaWRhdG9yVGFnR2VuZXJhdG9yKGJvb2xlYW4gaXMxMiwgU3RyaW5nIGxpY2Vuc2VIZWFkZXIsIExvZyBsb2cpIHsKLSAgICBzdXBlcihpczEyLCBsaWNlbnNlSGVhZGVyLCBsb2cpOwotICB9Ci0KLSAgcHJvdGVjdGVkIFNldCBjcmVhdGVJbXBvcnRzKFZhbGlkYXRvckJlYW4gdmFsaWRhdG9yKSB7Ci0gICAgU2V0IGltcG9ydHMgPSBuZXcgVHJlZVNldCgpOwotCi0gICAgaWYgKGlzMTIoKSkKLSAgICB7Ci0gICAgICBpbXBvcnRzLmFkZCgiamF2YXguZmFjZXMud2ViYXBwLlZhbGlkYXRvckVMVGFnIik7Ci0gICAgICBpbXBvcnRzLmFkZCgiamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQiKTsKLSAgICAgIGltcG9ydHMuYWRkKCJqYXZheC5mYWNlcy5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbiIpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgaW1wb3J0cy5hZGQoImphdmF4LmZhY2VzLndlYmFwcC5WYWxpZGF0b3JUYWciKTsKLSAgICB9Ci0gICAgaW1wb3J0cy5hZGQoImphdmF4LnNlcnZsZXQuanNwLkpzcEV4Y2VwdGlvbiIpOwotICAgIGltcG9ydHMuYWRkKHZhbGlkYXRvci5nZXRWYWxpZGF0b3JDbGFzcygpKTsKLQotICAgIGltcG9ydHMuYWRkKCJqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yIik7Ci0KLSAgICBpZiAoaXMxMigpKQotICAgIHsKLSAgICAgIGltcG9ydHMuYWRkKCJqYXZheC5lbC5WYWx1ZUV4cHJlc3Npb24iKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGltcG9ydHMuYWRkKCJqYXZheC5mYWNlcy5lbC5WYWx1ZUJpbmRpbmciKTsKLSAgICB9Ci0gICAgaW1wb3J0cy5hZGQoIm9yZy5hcGFjaGUubXlmYWNlcy5jb21tb25zLnV0aWwuVGFnVXRpbHMiKTsKLQotCi0gICAgYWRkSW1wb3J0c0Zyb21Qcm9wZXJ0ZXModmFsaWRhdG9yLCBpbXBvcnRzKTsKLSAgICByZXR1cm4gaW1wb3J0czsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHdyaXRlU2V0UHJvcGVydHkoCi0gICAgUHJldHR5V3JpdGVyIG91dCwKLSAgICBQcm9wZXJ0eUJlYW4gcHJvcGVydHkpCi0gIHsKLSAgICBTdHJpbmcgcHJvcE5hbWUgPSBwcm9wZXJ0eS5nZXRQcm9wZXJ0eU5hbWUoKTsKLSAgICBTdHJpbmcgcHJvcEZ1bGxDbGFzcyA9IHByb3BlcnR5LmdldFByb3BlcnR5Q2xhc3MoKTsKLSAgICBTdHJpbmcgcHJvcENsYXNzID0gVXRpbC5nZXRDbGFzc0Zyb21GdWxsQ2xhc3MocHJvcEZ1bGxDbGFzcyk7Ci0gICAgU3RyaW5nIHByb3BWYXIgPSAiXyIgKyBVdGlsLmdldFZhcmlhYmxlRnJvbU5hbWUocHJvcE5hbWUpOwotICAgIG91dC5wcmludGxuKCJpZiAoIiArIHByb3BWYXIgKyAiICE9IG51bGwpIik7Ci0gICAgb3V0LnByaW50bG4oInsiKTsKLSAgICBvdXQuaW5kZW50KCk7Ci0gICAgaWYgKGlzMTIoKSkKLSAgICB7Ci0gICAgICBvdXQucHJpbnRsbigiaWYgKCEiICsgcHJvcFZhciArICIuaXNMaXRlcmFsVGV4dCgpKSIpOwotICAgICAgb3V0LnByaW50bG4oInsiKTsKLSAgICAgIG91dC5pbmRlbnQoKTsKLSAgICAgIG91dC5wcmludGxuKCJ2YWxpZGF0b3Iuc2V0VmFsdWVFeHByZXNzaW9uKFwiIiArIHByb3BOYW1lICsgIlwiLCAiICsKLSAgICAgICAgICAgICAgICAgIHByb3BWYXIgKyAiKTsiKTsKLSAgICAgIG91dC51bmluZGVudCgpOwotICAgICAgb3V0LnByaW50bG4oIn0iKTsKLSAgICAgIFN0cmluZyBwcm9wVHlwZSA9IHJlc29sdmVUeXBlKHByb3BGdWxsQ2xhc3MpOwotICAgICAgaWYgKHByb3BUeXBlICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIG91dC5wcmludGxuKCJlbHNlIik7Ci0gICAgICAgIG91dC5wcmludGxuKCJ7Iik7Ci0gICAgICAgIG91dC5pbmRlbnQoKTsKLSAgICAgICAgaWYgKCJTdHJpbmdBcnJheSIuZXF1YWxzKHByb3BUeXBlKSkKLSAgICAgICAgewotICAgICAgICAgIG91dC5wcmludGxuKCJ0cnkiKTsKLSAgICAgICAgICBvdXQucHJpbnRsbigieyIpOwotICAgICAgICB9Ci0KLSAgICAgICAgb3V0LnByaW50bG4ocHJvcENsYXNzICsgIiB2YWx1ZSA9IFRhZ1V0aWxzLmdldCIgKyBwcm9wVHlwZSArICIoIiArIHByb3BWYXIgKyAiLmdldFZhbHVlKG51bGwpKTsiKTsKLSAgICAgICAgU3RyaW5nIHNldE1ldGhvZCA9IFV0aWwuZ2V0UHJlZml4ZWRQcm9wZXJ0eU5hbWUoInNldCIsIHByb3BOYW1lKTsKLSAgICAgICAgb3V0LnByaW50bG4oInZhbGlkYXRvci4iICsgc2V0TWV0aG9kICsgIih2YWx1ZSk7Iik7Ci0gICAgICAgIGlmICgiU3RyaW5nQXJyYXkiLmVxdWFscyhwcm9wVHlwZSkpCi0gICAgICAgIHsKLSAgICAgICAgICBvdXQucHJpbnRsbigifSIpOwotICAgICAgICAgIG91dC5wcmludGxuKCJjYXRjaCAoUGFyc2VFeGNlcHRpb24gcGUpIik7Ci0gICAgICAgICAgb3V0LnByaW50bG4oInsiKTsKLSAgICAgICAgICBvdXQuaW5kZW50KCk7Ci0gICAgICAgICAgb3V0LnByaW50bG4oInRocm93IG5ldyBKc3BFeGNlcHRpb24oIik7Ci0gICAgICAgICAgb3V0LnByaW50bG4oIiAgcGUuZ2V0TWVzc2FnZSgpICsgXCI6IFwiICsgXCJQb3NpdGlvbiBcIiArIHBlLmdldEVycm9yT2Zmc2V0KCkpOyIpOwotICAgICAgICAgIG91dC51bmluZGVudCgpOwotICAgICAgICAgIG91dC5wcmludGxuKCJ9Iik7Ci0gICAgICAgIH0KLSAgICAgICAgb3V0LnVuaW5kZW50KCk7Ci0gICAgICAgIG91dC5wcmludGxuKCJ9Iik7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBvdXQucHJpbnRsbigiaWYgKFRhZ1V0aWxzLmlzVmFsdWVSZWZlcmVuY2UoIiArIHByb3BWYXIgKyAiKSkiKTsKLSAgICAgIG91dC5wcmludGxuKCJ7Iik7Ci0gICAgICBvdXQuaW5kZW50KCk7Ci0gICAgICBvdXQucHJpbnRsbigiVmFsdWVCaW5kaW5nIHZiID0gVGFnVXRpbHMuZ2V0VmFsdWVCaW5kaW5nKCIgKyBwcm9wVmFyICsgIik7Iik7Ci0gICAgICBvdXQucHJpbnRsbigidmFsaWRhdG9yLnNldFZhbHVlQmluZGluZyhcIiIgKyBwcm9wTmFtZSArICJcIiwgdmIpOyIpOwotICAgICAgb3V0LnVuaW5kZW50KCk7Ci0gICAgICBvdXQucHJpbnRsbigifSIpOwotICAgICAgU3RyaW5nIHByb3BUeXBlID0gcmVzb2x2ZVR5cGUocHJvcEZ1bGxDbGFzcyk7Ci0gICAgICBpZiAocHJvcFR5cGUgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgb3V0LnByaW50bG4oImVsc2UiKTsKLSAgICAgICAgb3V0LnByaW50bG4oInsiKTsKLSAgICAgICAgb3V0LmluZGVudCgpOwotICAgICAgICBpZiAoIlN0cmluZ0FycmF5Ii5lcXVhbHMocHJvcFR5cGUpKQotICAgICAgICB7Ci0gICAgICAgICAgb3V0LnByaW50bG4oInRyeSIpOwotICAgICAgICAgIG91dC5wcmludGxuKCJ7Iik7Ci0gICAgICAgIH0KLSAgICAgICAgb3V0LnByaW50bG4ocHJvcENsYXNzICsgIiB2YWx1ZSA9IFRhZ1V0aWxzLmdldCIgKyBwcm9wVHlwZSArICIoIiArIHByb3BWYXIgKyAiKTsiKTsKLSAgICAgICAgU3RyaW5nIHNldE1ldGhvZCA9IFV0aWwuZ2V0UHJlZml4ZWRQcm9wZXJ0eU5hbWUoInNldCIsIHByb3BOYW1lKTsKLSAgICAgICAgb3V0LnByaW50bG4oInZhbGlkYXRvci4iICsgc2V0TWV0aG9kICsgIih2YWx1ZSk7Iik7Ci0gICAgICAgIGlmICgiU3RyaW5nQXJyYXkiLmVxdWFscyhwcm9wVHlwZSkpCi0gICAgICAgIHsKLSAgICAgICAgICBvdXQucHJpbnRsbigifSIpOwotICAgICAgICAgIG91dC5wcmludGxuKCJjYXRjaCAoUGFyc2VFeGNlcHRpb24gcGUpIik7Ci0gICAgICAgICAgb3V0LnByaW50bG4oInsiKTsKLSAgICAgICAgICBvdXQuaW5kZW50KCk7Ci0gICAgICAgICAgb3V0LnByaW50bG4oInRocm93IG5ldyBKc3BFeGNlcHRpb24oIik7Ci0gICAgICAgICAgb3V0LnByaW50bG4oIiAgcGUuZ2V0TWVzc2FnZSgpICsgXCI6IFwiICsgXCJQb3NpdGlvbiBcIiArIHBlLmdldEVycm9yT2Zmc2V0KCkpOyIpOwotICAgICAgICAgIG91dC51bmluZGVudCgpOwotICAgICAgICAgIG91dC5wcmludGxuKCJ9Iik7Ci0gICAgICAgIH0KLSAgICAgICAgb3V0LnVuaW5kZW50KCk7Ci0gICAgICAgIG91dC5wcmludGxuKCJ9Iik7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgb3V0LnVuaW5kZW50KCk7Ci0gICAgb3V0LnByaW50bG4oIn0iKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL2dlbmVyYXRvci90YWdsaWIvVGFnQXR0cmlidXRlRmlsdGVyLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvZ2VuZXJhdG9yL3RhZ2xpYi9UYWdBdHRyaWJ1dGVGaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDkxYzM4Ny4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvZ2VuZXJhdG9yL3RhZ2xpYi9UYWdBdHRyaWJ1dGVGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy5nZW5lcmF0b3IudGFnbGliOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy5wYXJzZS5Qcm9wZXJ0eUJlYW47Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy51dGlsLlByb3BlcnR5RmlsdGVyOwotCi0vKioKLSAqIFRPRE86IGNvbW1lbnQgdGhpcyEKLSAqCi0gKiBAYXV0aG9yIEJydW5vIEFyYW5kYSAobGF0ZXN0IG1vZGlmaWNhdGlvbiBieSAkQXV0aG9yJCkKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCi0gKi8KLWZpbmFsIHB1YmxpYyBjbGFzcyBUYWdBdHRyaWJ1dGVGaWx0ZXIgZXh0ZW5kcyBQcm9wZXJ0eUZpbHRlcgotewotICBwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHQoCi0gICAgICBQcm9wZXJ0eUJlYW4gcHJvcGVydHkpCi0gIHsKLSAgICByZXR1cm4gKCFwcm9wZXJ0eS5pc1RhZ0F0dHJpYnV0ZUV4Y2x1ZGVkKCkpOwotICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvZ2VuZXJhdG9yL3RhZ2xpYi9UcmluaWRhZENvbXBvbmVudFRhZ0dlbmVyYXRvci5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL2dlbmVyYXRvci90YWdsaWIvVHJpbmlkYWRDb21wb25lbnRUYWdHZW5lcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWY3YWRjMS4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvZ2VuZXJhdG9yL3RhZ2xpYi9UcmluaWRhZENvbXBvbmVudFRhZ0dlbmVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODk5ICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy5nZW5lcmF0b3IudGFnbGliOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy5nZW5lcmF0b3IuR2VuZXJhdG9ySGVscGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMuaW8uUHJldHR5V3JpdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMucGFyc2UuQ29tcG9uZW50QmVhbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLnBhcnNlLk1ldGhvZFNpZ25hdHVyZUJlYW47Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy5wYXJzZS5Qcm9wZXJ0eUJlYW47Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy51dGlsLkZpbHRlcmVkSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy51dGlsLlV0aWw7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi0vKioKLSAqIFRPRE86IGNvbW1lbnQgdGhpcyEKLSAqCi0gKiBAYXV0aG9yIEJydW5vIEFyYW5kYSAobGF0ZXN0IG1vZGlmaWNhdGlvbiBieSAkQXV0aG9yJCkKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCi0gKi8KLXB1YmxpYyBjbGFzcyBUcmluaWRhZENvbXBvbmVudFRhZ0dlbmVyYXRvciBleHRlbmRzIEFic3RyYWN0Q29tcG9uZW50VGFnR2VuZXJhdG9yCi17Ci0gIHByaXZhdGUgYm9vbGVhbiBfaXMxMjsKLQotICBwdWJsaWMgVHJpbmlkYWRDb21wb25lbnRUYWdHZW5lcmF0b3IoYm9vbGVhbiBpczEyKQotICB7Ci0gICAgX2lzMTIgPSBpczEyOwotICB9Ci0KLSAgcHJvdGVjdGVkIGJvb2xlYW4gaXMxMigpCi0gIHsKLSAgICByZXR1cm4gX2lzMTI7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBhZGRTcGVjaWZpY0ltcG9ydHMoU2V0IGltcG9ydHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb25lbnRCZWFuIGNvbXBvbmVudCkKLSAgewotICAgIGltcG9ydHMuYWRkKCJvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuYmVhbi5GYWNlc0JlYW4iKTsKLQotICAgIGlmIChfaXMxMikKLSAgICB7Ci0gICAgICBpbXBvcnRzLmFkZCgiamF2YXguZWwuVmFsdWVFeHByZXNzaW9uIik7Ci0gICAgfQotCi0gICAgSXRlcmF0b3IgcHJvcGVydGllcyA9IGNvbXBvbmVudC5wcm9wZXJ0aWVzKCk7Ci0gICAgcHJvcGVydGllcyA9IG5ldyBGaWx0ZXJlZEl0ZXJhdG9yKHByb3BlcnRpZXMsIG5ldyBUYWdBdHRyaWJ1dGVGaWx0ZXIoKSk7Ci0KLSAgICB3aGlsZSAocHJvcGVydGllcy5oYXNOZXh0KCkpCi0gICAgewotICAgICAgUHJvcGVydHlCZWFuIHByb3BlcnR5ID0gKFByb3BlcnR5QmVhbikgcHJvcGVydGllcy5uZXh0KCk7Ci0gICAgICBTdHJpbmcgcHJvcGVydHlDbGFzcyA9IHByb3BlcnR5LmdldFByb3BlcnR5Q2xhc3MoKTsKLSAgICAgIFN0cmluZ1tdIHByb3BlcnR5Q2xhc3NQYXJhbXMgPSBwcm9wZXJ0eS5nZXRQcm9wZXJ0eUNsYXNzUGFyYW1ldGVycygpOwotCi0gICAgICBpbXBvcnRzLmFkZChjb21wb25lbnQuZ2V0Q29tcG9uZW50Q2xhc3MoKSk7Ci0KLSAgICAgIGlmIChHZW5lcmF0b3JIZWxwZXIuaXNLZXlTdHJva2UocHJvcGVydHlDbGFzcykpCi0gICAgICB7Ci0gICAgICAgIGlmIChfaXMxMikKLSAgICAgICAgICBpbXBvcnRzLmFkZCgiamF2YXguZWwuVmFsdWVFeHByZXNzaW9uIik7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICBpbXBvcnRzLmFkZCgiamF2YXguZmFjZXMuZWwuVmFsdWVCaW5kaW5nIik7Ci0gICAgICAgIGltcG9ydHMuYWRkKCJqYXZheC5zd2luZy5LZXlTdHJva2UiKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKEdlbmVyYXRvckhlbHBlci5pc0FXVEtleVN0cm9rZShwcm9wZXJ0eUNsYXNzKSkKLSAgICAgIHsKLSAgICAgICAgaWYgKF9pczEyKQotICAgICAgICAgIGltcG9ydHMuYWRkKCJqYXZheC5lbC5WYWx1ZUV4cHJlc3Npb24iKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgIGltcG9ydHMuYWRkKCJqYXZheC5mYWNlcy5lbC5WYWx1ZUJpbmRpbmciKTsKLSAgICAgICAgaW1wb3J0cy5hZGQoImphdmEuYXd0LkFXVEtleVN0cm9rZSIpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoR2VuZXJhdG9ySGVscGVyLmlzQ29udmVydGVyKHByb3BlcnR5Q2xhc3MpKQotICAgICAgewotICAgICAgICBpZiAoX2lzMTIpCi0gICAgICAgICAgaW1wb3J0cy5hZGQoImphdmF4LmVsLlZhbHVlRXhwcmVzc2lvbiIpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgaW1wb3J0cy5hZGQoImphdmF4LmZhY2VzLmVsLlZhbHVlQmluZGluZyIpOwotICAgICAgICBpbXBvcnRzLmFkZCgiamF2YXguZmFjZXMuY29udmVydC5Db252ZXJ0ZXIiKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKHByb3BlcnR5LmlzVmlydHVhbCgpKQotICAgICAgewotICAgICAgICBpZiAoX2lzMTIpCi0gICAgICAgICAgaW1wb3J0cy5hZGQoImphdmF4LmVsLlZhbHVlRXhwcmVzc2lvbiIpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgaW1wb3J0cy5hZGQoImphdmF4LmZhY2VzLmVsLlZhbHVlQmluZGluZyIpOwotICAgICAgICBpbXBvcnRzLmFkZCgib3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkaW50ZXJuYWwudGFnbGliLnV0aWwuVmlydHVhbEF0dHJpYnV0ZVV0aWxzIik7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChHZW5lcmF0b3JIZWxwZXIuaXNDb2xvckxpc3QocHJvcGVydHlDbGFzcywgcHJvcGVydHlDbGFzc1BhcmFtcykgfHwKLSAgICAgICAgICAgICAgIEdlbmVyYXRvckhlbHBlci5pc0NvbG9yKHByb3BlcnR5Q2xhc3MpKQotICAgICAgewotICAgICAgICBpZiAoX2lzMTIpCi0gICAgICAgICAgaW1wb3J0cy5hZGQoImphdmF4LmVsLlZhbHVlRXhwcmVzc2lvbiIpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgaW1wb3J0cy5hZGQoImphdmF4LmZhY2VzLmVsLlZhbHVlQmluZGluZyIpOwotICAgICAgICBpbXBvcnRzLmFkZCgiamF2YS50ZXh0LlBhcnNlRXhjZXB0aW9uIik7Ci0gICAgICAgIGltcG9ydHMuYWRkKCJvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWRpbnRlcm5hbC50YWdsaWIudXRpbC5UYWdVdGlscyIpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAocHJvcGVydHkuaXNNZXRob2RCaW5kaW5nKCkpCi0gICAgICB7Ci0gICAgICAgIGlmIChfaXMxMikKLSAgICAgICAgewotICAgICAgICAgIGltcG9ydHMuYWRkKCJqYXZheC5lbC5NZXRob2RFeHByZXNzaW9uIik7Ci0gICAgICAgICAgaW1wb3J0cy5hZGQoIm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZGludGVybmFsLnRhZ2xpYi51dGlsLk1ldGhvZEV4cHJlc3Npb25NZXRob2RCaW5kaW5nIik7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgaW1wb3J0cy5hZGQoImphdmF4LmZhY2VzLmVsLk1ldGhvZEJpbmRpbmciKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZSBpZiAocHJvcGVydHkuaXNNZXRob2RFeHByZXNzaW9uKCkpCi0gICAgICB7Ci0gICAgICAgIGltcG9ydHMuYWRkKCJqYXZheC5lbC5NZXRob2RFeHByZXNzaW9uIik7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChwcm9wZXJ0eS5pc0VudW0oKSkKLSAgICAgIHsKLSAgICAgICAgaW1wb3J0cy5hZGQocHJvcGVydHlDbGFzcyk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLQotICBwcm90ZWN0ZWQgdm9pZCB3cml0ZVByb3BlcnR5RGVjbGFyYXRpb24oUHJldHR5V3JpdGVyIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5QmVhbiBwcm9wZXJ0eSkgdGhyb3dzIElPRXhjZXB0aW9uCi0gIHsKLSAgICBTdHJpbmcgcHJvcE5hbWUgPSBwcm9wZXJ0eS5nZXRQcm9wZXJ0eU5hbWUoKTsKLSAgICBTdHJpbmcgZmllbGRQcm9wTmFtZSA9ICJfIiArIHByb3BOYW1lOwotICAgIFN0cmluZyBqc3BQcm9wVHlwZSA9IEdlbmVyYXRvckhlbHBlci5nZXRKc3BQcm9wZXJ0eVR5cGUocHJvcGVydHksIF9pczEyKTsKLQotICAgIG91dC5wcmludGxuKCk7Ci0gICAgb3V0LnByaW50bG4oInByaXZhdGUgIiArIGpzcFByb3BUeXBlICsgIiAiICsgZmllbGRQcm9wTmFtZSArICI7Iik7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCB3cml0ZVByb3BlcnR5U2V0dGVyKFByZXR0eVdyaXRlciBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlCZWFuIHByb3BlcnR5KSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgewotICAgIFN0cmluZyBwcm9wTmFtZSA9IHByb3BlcnR5LmdldFByb3BlcnR5TmFtZSgpOwotICAgIFN0cmluZyBmaWVsZFByb3BOYW1lID0gIl8iICsgcHJvcE5hbWU7Ci0gICAgU3RyaW5nIGpzcFByb3BOYW1lID0gcHJvcGVydHkuZ2V0SnNwUHJvcGVydHlOYW1lKCk7Ci0gICAgU3RyaW5nIHByb3BWYXIgPSBVdGlsLmdldFZhcmlhYmxlRnJvbU5hbWUocHJvcE5hbWUpOwotICAgIFN0cmluZyBzZXRNZXRob2QgPSBVdGlsLmdldFByZWZpeGVkUHJvcGVydHlOYW1lKCJzZXQiLCBqc3BQcm9wTmFtZSk7Ci0gICAgU3RyaW5nIGpzcFByb3BUeXBlID0gR2VuZXJhdG9ySGVscGVyLmdldEpzcFByb3BlcnR5VHlwZShwcm9wZXJ0eSwgX2lzMTIpOwotCi0gICAgb3V0LnByaW50KCJmaW5hbCAiKTsKLSAgICBvdXQucHJpbnRsbigicHVibGljIHZvaWQgIiArIHNldE1ldGhvZCArICIoIiArIGpzcFByb3BUeXBlICsgIiAiICsgcHJvcFZhciArICIpIik7Ci0gICAgb3V0LnByaW50bG4oInsiKTsKLSAgICBvdXQuaW5kZW50KCk7Ci0gICAgb3V0LnByaW50bG4oZmllbGRQcm9wTmFtZSArICIgPSAiICsgcHJvcFZhciArICI7Iik7Ci0gICAgb3V0LnVuaW5kZW50KCk7Ci0gICAgb3V0LnByaW50bG4oIn0iKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHdyaXRlU2V0UHJvcGVydGllc01ldGhvZChQcmV0dHlXcml0ZXIgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGNvbXBvbmVudENsYXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9uZW50QmVhbiBjb21wb25lbnQpIHRocm93cyBJT0V4Y2VwdGlvbgotICB7Ci0gICAgQ29sbGVjdGlvbiBjb21wb25lbnRzID0gbmV3IEhhc2hTZXQoKTsKLSAgICBjb21wb25lbnRzLmFkZChjb21wb25lbnQpOwotICAgIHdyaXRlU2V0UHJvcGVydGllc01ldGhvZChvdXQsIGNvbXBvbmVudENsYXNzLCBjb21wb25lbnRzKTsKLSAgfQotCi0KLSAgcHVibGljIHZvaWQgd3JpdGVTZXRQcm9wZXJ0aWVzTWV0aG9kKFByZXR0eVdyaXRlciBvdXQsIFN0cmluZyBjb21wb25lbnRDbGFzcywgQ29sbGVjdGlvbiBjb21wb25lbnRzKQotICAgICAgdGhyb3dzIElPRXhjZXB0aW9uCi0gIHsKLSAgICBDb2xsZWN0aW9uIGFsbCA9IG5ldyBIYXNoU2V0KCk7Ci0gICAgZm9yIChJdGVyYXRvciBsSXRlcmF0b3IgPSBjb21wb25lbnRzLml0ZXJhdG9yKCk7IGxJdGVyYXRvci5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIENvbXBvbmVudEJlYW4gY29tcG9uZW50ID0gKENvbXBvbmVudEJlYW4pIGxJdGVyYXRvci5uZXh0KCk7Ci0gICAgICBJdGVyYXRvciBwcm9wID0gY29tcG9uZW50LnByb3BlcnRpZXMoKTsKLSAgICAgIHdoaWxlIChwcm9wLmhhc05leHQoKSkKLSAgICAgIHsKLSAgICAgICAgYWxsLmFkZChwcm9wLm5leHQoKSk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgSXRlcmF0b3IgcHJvcGVydGllcyA9IGFsbC5pdGVyYXRvcigpOwotICAgIHByb3BlcnRpZXMgPSBuZXcgRmlsdGVyZWRJdGVyYXRvcihwcm9wZXJ0aWVzLCBuZXcgVGFnQXR0cmlidXRlRmlsdGVyKCkpOwotCi0gICAgaWYgKHByb3BlcnRpZXMuaGFzTmV4dCgpKQotICAgIHsKLSAgICAgIG91dC5wcmludGxuKCk7Ci0gICAgICBvdXQucHJpbnRsbigiQE92ZXJyaWRlIik7Ci0gICAgICBvdXQucHJpbnRsbigicHJvdGVjdGVkIHZvaWQgc2V0UHJvcGVydGllcygiKTsKLSAgICAgIG91dC5pbmRlbnQoKTsKLSAgICAgIG91dC5wcmludGxuKCJGYWNlc0JlYW4gYmVhbikiKTsKLSAgICAgIG91dC51bmluZGVudCgpOwotICAgICAgb3V0LnByaW50bG4oInsiKTsKLSAgICAgIG91dC5pbmRlbnQoKTsKLQotICAgICAgd3JpdGVTZXRQcm9wZXJ0eU1ldGhvZEJvZHkob3V0LCBjb21wb25lbnRDbGFzcywgcHJvcGVydGllcyk7Ci0gICAgICBvdXQudW5pbmRlbnQoKTsKLSAgICAgIG91dC5wcmludGxuKCJ9Iik7Ci0gICAgfQotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgd3JpdGVTZXRQcm9wZXJ0eU1ldGhvZEJvZHkoUHJldHR5V3JpdGVyIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGNvbXBvbmVudENsYXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJdGVyYXRvciBwcm9wZXJ0aWVzKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgewotCi0gICAgb3V0LnByaW50bG4oInN1cGVyLnNldFByb3BlcnRpZXMoYmVhbik7Iik7Ci0KLSAgICB3aGlsZSAocHJvcGVydGllcy5oYXNOZXh0KCkpCi0gICAgewotICAgICAgUHJvcGVydHlCZWFuIHByb3BlcnR5ID0gKFByb3BlcnR5QmVhbikgcHJvcGVydGllcy5uZXh0KCk7Ci0gICAgICBfd3JpdGVTZXRQcm9wZXJ0aWVzQ2FzZShvdXQsIGNvbXBvbmVudENsYXNzLCBwcm9wZXJ0eSk7Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIF93cml0ZVNldFByb3BlcnRpZXNDYXNlKAotICAgICAgUHJldHR5V3JpdGVyIG91dCwKLSAgICAgIFN0cmluZyBjb21wb25lbnRDbGFzcywKLSAgICAgIFByb3BlcnR5QmVhbiBwcm9wZXJ0eSkgdGhyb3dzIElPRXhjZXB0aW9uCi0gIHsKLSAgICBTdHJpbmcgcHJvcE5hbWUgPSBwcm9wZXJ0eS5nZXRQcm9wZXJ0eU5hbWUoKTsKLSAgICBTdHJpbmcgcHJvcENsYXNzID0gcHJvcGVydHkuZ2V0UHJvcGVydHlDbGFzcygpOwotICAgIFN0cmluZyBwcm9wVmFyID0gIl8iICsgcHJvcE5hbWU7Ci0gICAgCi0gICAgaWYgKHByb3BlcnR5LmlzVmlydHVhbCgpKQotICAgIHsKLSAgICAgIF93cml0ZVZpcnR1YWxTZXRNZXRob2Qob3V0LCBjb21wb25lbnRDbGFzcywgcHJvcE5hbWUpOwotICAgIH0KLSAgICBlbHNlIGlmIChwcm9wZXJ0eS5pc01ldGhvZEJpbmRpbmcoKSkKLSAgICB7Ci0gICAgICBfd3JpdGVTZXRNZXRob2RCaW5kaW5nKG91dCwgY29tcG9uZW50Q2xhc3MsIHByb3BlcnR5KTsKLSAgICB9Ci0gICAgZWxzZSBpZiAocHJvcGVydHkuaXNNZXRob2RFeHByZXNzaW9uKCkpCi0gICAgewotICAgICAgX3dyaXRlU2V0TWV0aG9kRXhwcmVzc2lvbihvdXQsIGNvbXBvbmVudENsYXNzLCBwcm9wZXJ0eSk7Ci0gICAgfQotICAgIGVsc2UgaWYgKHByb3BlcnR5LmlzRW51bSgpKQotICAgIHsKLSAgICAgIF93cml0ZVNldEVudW0ob3V0LCBjb21wb25lbnRDbGFzcywgcHJvcGVydHkpOwotICAgIH0KLSAgICBlbHNlIGlmIChHZW5lcmF0b3JIZWxwZXIuaXNLZXlTdHJva2UocHJvcENsYXNzKSkKLSAgICB7Ci0gICAgICBfd3JpdGVTZXRLZXlTdHJva2Uob3V0LCBjb21wb25lbnRDbGFzcywgcHJvcE5hbWUpOwotICAgIH0KLSAgICBlbHNlIGlmIChHZW5lcmF0b3JIZWxwZXIuaXNBV1RLZXlTdHJva2UocHJvcENsYXNzKSkKLSAgICB7Ci0gICAgICBfd3JpdGVTZXRBV1RLZXlTdHJva2Uob3V0LCBjb21wb25lbnRDbGFzcywgcHJvcE5hbWUpOwotICAgIH0KLSAgICBlbHNlIGlmIChHZW5lcmF0b3JIZWxwZXIuaXNDb2xvckxpc3QocHJvcENsYXNzLCBwcm9wZXJ0eS5nZXRQcm9wZXJ0eUNsYXNzUGFyYW1ldGVycygpKSkKLSAgICB7Ci0gICAgICBfd3JpdGVTZXRDb2xvcihvdXQsIGNvbXBvbmVudENsYXNzLCBwcm9wTmFtZSwgdHJ1ZSk7Ci0gICAgfQotICAgIGVsc2UgaWYgKEdlbmVyYXRvckhlbHBlci5pc0NvbG9yKHByb3BDbGFzcykpCi0gICAgewotICAgICAgX3dyaXRlU2V0Q29sb3Iob3V0LCBjb21wb25lbnRDbGFzcywgcHJvcE5hbWUsIGZhbHNlKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoR2VuZXJhdG9ySGVscGVyLmlzQ29udmVydGVyKHByb3BDbGFzcykpCi0gICAgewotICAgICAgX3dyaXRlU2V0Q29udmVydGVyKG91dCwgY29tcG9uZW50Q2xhc3MsIHByb3BOYW1lKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAocHJvcGVydHkuaXNMaXRlcmFsT25seSgpKQotICAgIHsKLSAgICAgIF93cml0ZVNldExpdGVyYWwob3V0LCBjb21wb25lbnRDbGFzcywgcHJvcE5hbWUsIHByb3BDbGFzcywgcHJvcFZhcik7Ci0gICAgfQotICAgIGVsc2UgaWYgKCJqYXZhLnV0aWwuRGF0ZSIuZXF1YWxzKHByb3BDbGFzcykpCi0gICAgewotICAgICAgX3dyaXRlU2V0RGF0ZShvdXQsIGNvbXBvbmVudENsYXNzLCBwcm9wTmFtZSwgcHJvcENsYXNzLCBwcm9wVmFyLCBwcm9wZXJ0eS5nZXRVc2VNYXhUaW1lKCkpOwotICAgIH0KLSAgICBlbHNlIC8vaWYgKF9oYXNQcm9wZXJ0eVNldHRlcihwcm9wZXJ0eSkpCi0gICAgewotICAgICAgX3dyaXRlU2V0UHJvcGVydHkob3V0LCBjb21wb25lbnRDbGFzcywgcHJvcE5hbWUsIHByb3BDbGFzcywgcHJvcFZhcik7Ci0gICAgfQotICAgIC8vICAgIGVsc2UKLSAgICAvLyAgICB7Ci0gICAgLy8gICAgICBfd3JpdGVTZXRWYWx1ZUJpbmRpbmcob3V0LCBjb21wb25lbnRDbGFzcywgcHJvcE5hbWUsIHByb3BWYXIpOwotICAgIC8vICAgIH0KLSAgfQotCi0gIHByaXZhdGUgdm9pZCBfd3JpdGVTZXRMaXRlcmFsKAotICAgICAgUHJldHR5V3JpdGVyIG91dCwKLSAgICAgIFN0cmluZyBjb21wb25lbnRDbGFzcywKLSAgICAgIFN0cmluZyBwcm9wTmFtZSwKLSAgICAgIFN0cmluZyBwcm9wRnVsbENsYXNzLAotICAgICAgU3RyaW5nIHByb3BWYXIpCi0gIHsKLSAgICBTdHJpbmcgcHJvcENsYXNzID0gVXRpbC5nZXRDbGFzc0Zyb21GdWxsQ2xhc3MocHJvcEZ1bGxDbGFzcyk7Ci0gICAgU3RyaW5nIGJveGVkQ2xhc3MgPSBVdGlsLmdldEJveGVkQ2xhc3MocHJvcENsYXNzKTsKLSAgICBpZiAoKCFfaXMxMiAmJiAhYm94ZWRDbGFzcy5lcXVhbHMocHJvcENsYXNzKSkgfHwKLSAgICAgICAgImphdmEudXRpbC5EYXRlIi5lcXVhbHMocHJvcEZ1bGxDbGFzcykgfHwKLSAgICAgICAgKGJveGVkQ2xhc3MuaW5kZXhPZigiW10iKSAhPSAtMSkpCi0gICAgewotICAgICAgLy8gVE9ETzogcmVqZWN0IHZhbHVlIGJpbmRpbmcgZXhwcmVzc2lvbnMgZm9yIGxpdGVyYWwtb25seQotICAgICAgX3dyaXRlU2V0UHJvcGVydHkob3V0LCBjb21wb25lbnRDbGFzcywgcHJvcE5hbWUsIHByb3BGdWxsQ2xhc3MsIHByb3BWYXIpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgU3RyaW5nIHByb3BLZXkgPSBVdGlsLmdldENvbnN0YW50TmFtZUZyb21Qcm9wZXJ0eShwcm9wTmFtZSwgIl9LRVkiKTsKLSAgICAgIG91dC5wcmludGxuKCJiZWFuLnNldFByb3BlcnR5KCIgKwotICAgICAgICAgIGNvbXBvbmVudENsYXNzICsgIi4iICsgcHJvcEtleSArICIsICIgKwotICAgICAgICAgIHByb3BWYXIgKyAiKTsiKTsKLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgX3dyaXRlU2V0RGF0ZSgKLSAgICBQcmV0dHlXcml0ZXIgb3V0LAotICAgIFN0cmluZyBjb21wb25lbnRDbGFzcywKLSAgICBTdHJpbmcgcHJvcE5hbWUsCi0gICAgU3RyaW5nIHByb3BGdWxsQ2xhc3MsCi0gICAgU3RyaW5nIHByb3BWYXIsCi0gICAgYm9vbGVhbiB1c2VNYXhUaW1lKQotICB7Ci0gICAgU3RyaW5nIHByb3BLZXkgPSBVdGlsLmdldENvbnN0YW50TmFtZUZyb21Qcm9wZXJ0eShwcm9wTmFtZSwgIl9LRVkiKTsKLSAgICBTdHJpbmcgcHJvcENsYXNzID0gVXRpbC5nZXRDbGFzc0Zyb21GdWxsQ2xhc3MocHJvcEZ1bGxDbGFzcyk7Ci0gICAgU3RyaW5nIGJveGVkQ2xhc3MgPSBVdGlsLmdldEJveGVkQ2xhc3MocHJvcENsYXNzKTsKLSAgICBTdHJpbmcgc2V0UHJvcGVydHkgPSAic2V0UHJvcGVydHkiOwotICAgIFN0cmluZyBwcm9wVHlwZSA9IGJveGVkQ2xhc3MucmVwbGFjZUFsbCgiXFxbXFxdIiwgIkFycmF5Iik7Ci0gICAgaWYgKHVzZU1heFRpbWUpCi0gICAgewotICAgICAgc2V0UHJvcGVydHkgPSBVdGlsLmdldFByZWZpeGVkUHJvcGVydHlOYW1lKCJzZXRNYXgiLCBwcm9wVHlwZSArICJQcm9wZXJ0eSIpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgc2V0UHJvcGVydHkgPSBVdGlsLmdldFByZWZpeGVkUHJvcGVydHlOYW1lKCJzZXQiLCBwcm9wVHlwZSArICJQcm9wZXJ0eSIpOwotICAgIH0KLQotICAgIG91dC5wcmludGxuKHNldFByb3BlcnR5ICsgIihiZWFuLCAiICsKLSAgICAgICAgY29tcG9uZW50Q2xhc3MgKyAiLiIgKyBwcm9wS2V5ICsgIiwgIiArCi0gICAgICAgIHByb3BWYXIgKyAiKTsiKTsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBfd3JpdGVTZXRQcm9wZXJ0eSgKLSAgICAgIFByZXR0eVdyaXRlciBvdXQsCi0gICAgICBTdHJpbmcgY29tcG9uZW50Q2xhc3MsCi0gICAgICBTdHJpbmcgcHJvcE5hbWUsCi0gICAgICBTdHJpbmcgcHJvcEZ1bGxDbGFzcywKLSAgICAgIFN0cmluZyBwcm9wVmFyKQotICB7Ci0gICAgU3RyaW5nIHByb3BLZXkgPSBVdGlsLmdldENvbnN0YW50TmFtZUZyb21Qcm9wZXJ0eShwcm9wTmFtZSwgIl9LRVkiKTsKLSAgICBTdHJpbmcgcHJvcENsYXNzID0gVXRpbC5nZXRDbGFzc0Zyb21GdWxsQ2xhc3MocHJvcEZ1bGxDbGFzcyk7Ci0gICAgU3RyaW5nIGJveGVkQ2xhc3MgPSBVdGlsLmdldEJveGVkQ2xhc3MocHJvcENsYXNzKTsKLSAgICBTdHJpbmcgc2V0UHJvcGVydHkgPSAic2V0UHJvcGVydHkiOwotICAgIGlmICgoIV9pczEyICYmICFib3hlZENsYXNzLmVxdWFscyhwcm9wQ2xhc3MpKSB8fAotICAgICAgICBHZW5lcmF0b3JIZWxwZXIuaXNOdW1iZXIocHJvcEZ1bGxDbGFzcykgfHwKLSAgICAgICAgImphdmEudXRpbC5EYXRlIi5lcXVhbHMocHJvcEZ1bGxDbGFzcykgfHwKLSAgICAgICAgKGJveGVkQ2xhc3MuaW5kZXhPZigiW10iKSAhPSAtMSkpCi0gICAgewotICAgICAgU3RyaW5nIHByb3BUeXBlID0gYm94ZWRDbGFzcy5yZXBsYWNlQWxsKCJcXFtcXF0iLCAiQXJyYXkiKTsKLSAgICAgIHNldFByb3BlcnR5ID0gVXRpbC5nZXRQcmVmaXhlZFByb3BlcnR5TmFtZSgic2V0IiwgcHJvcFR5cGUgKyAiUHJvcGVydHkiKTsKLSAgICB9Ci0KLSAgICBvdXQucHJpbnRsbihzZXRQcm9wZXJ0eSArICIoYmVhbiwgIiArCi0gICAgICAgIGNvbXBvbmVudENsYXNzICsgIi4iICsgcHJvcEtleSArICIsICIgKwotICAgICAgICBwcm9wVmFyICsgIik7Iik7Ci0gIH0KLQotICBwcml2YXRlIFN0cmluZ1tdIF9nZXRBY2Nlc3NLZXlQcm9wZXJ0eUtleXMoCi0gICAgICBTdHJpbmcgY29tcG9uZW50Q2xhc3MsCi0gICAgICBTdHJpbmcgcHJvcE5hbWUpCi0gIHsKLSAgICBTdHJpbmdbXSBwcm9wS2V5cyA9IG5ldyBTdHJpbmdbMl07Ci0KLSAgICBpbnQgb2Zmc2V0ID0gcHJvcE5hbWUuaW5kZXhPZigiQW5kQWNjZXNzS2V5Iik7Ci0gICAgaWYgKG9mZnNldCAhPSAtMSkKLSAgICB7Ci0gICAgICBTdHJpbmcgbWFpblByb3AgPSBwcm9wTmFtZS5zdWJzdHJpbmcoMCwgb2Zmc2V0KTsKLSAgICAgIHByb3BLZXlzWzBdID0gY29tcG9uZW50Q2xhc3MgKyAiLiIgKwotICAgICAgICAgIFV0aWwuZ2V0Q29uc3RhbnROYW1lRnJvbVByb3BlcnR5KG1haW5Qcm9wLCAiX0tFWSIpOwotICAgICAgcHJvcEtleXNbMV0gPSBjb21wb25lbnRDbGFzcyArICIuIiArCi0gICAgICAgICAgVXRpbC5nZXRDb25zdGFudE5hbWVGcm9tUHJvcGVydHkoImFjY2Vzc0tleSIsICJfS0VZIik7Ci0gICAgfQotCi0gICAgcmV0dXJuIHByb3BLZXlzOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIF93cml0ZVNldFZhbHVlQmluZGluZygKLSAgICAgIFByZXR0eVdyaXRlciBvdXQsCi0gICAgICBTdHJpbmcgY29tcG9uZW50Q2xhc3MsCi0gICAgICBTdHJpbmcgcHJvcE5hbWUsCi0gICAgICBTdHJpbmcgcHJvcFZhcikKLSAgewotICAgIFN0cmluZyBwcm9wS2V5ID0gVXRpbC5nZXRDb25zdGFudE5hbWVGcm9tUHJvcGVydHkocHJvcE5hbWUsICJfS0VZIik7Ci0gICAgb3V0LnByaW50bG4oImJlYW4uc2V0VmFsdWVCaW5kaW5nKCIgKyBjb21wb25lbnRDbGFzcyArICIuIiArIHByb3BLZXkgKyAiLCAiICsKLSAgICAgICAgImNyZWF0ZVZhbHVlQmluZGluZygiICsgcHJvcFZhciArICIpKTsiKTsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBfd3JpdGVWaXJ0dWFsU2V0TWV0aG9kKAotICAgICAgUHJldHR5V3JpdGVyIG91dCwKLSAgICAgIFN0cmluZyBjb21wb25lbnRDbGFzcywKLSAgICAgIFN0cmluZyBwcm9wTmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uCi0gIHsKLSAgICBTdHJpbmdbXSBwcm9wS2V5cyA9IF9nZXRBY2Nlc3NLZXlQcm9wZXJ0eUtleXMoY29tcG9uZW50Q2xhc3MsIHByb3BOYW1lKTsKLQotICAgIFN0cmluZyBwcm9wVmFyID0gIl8iICsgcHJvcE5hbWU7Ci0gICAgb3V0LnByaW50bG4oImlmICgiICsgcHJvcFZhciArICIgIT0gbnVsbCkiKTsKLSAgICBvdXQucHJpbnRsbigieyIpOwotICAgIG91dC5pbmRlbnQoKTsKLQotICAgIGlmIChfaXMxMikKLSAgICB7Ci0gICAgICBvdXQucHJpbnRsbigiaWYgKCEiICsgcHJvcFZhciArICIuaXNMaXRlcmFsVGV4dCgpKSIpOwotICAgICAgb3V0LnByaW50bG4oInsiKTsKLSAgICAgIG91dC5pbmRlbnQoKTsKLSAgICAgIG91dC5wcmludGxuKCJWaXJ0dWFsQXR0cmlidXRlVXRpbHMuc2V0QWNjZXNzS2V5QXR0cmlidXRlKCIpOwotICAgICAgb3V0LmluZGVudCgpOwotICAgICAgb3V0LnByaW50bG4oImJlYW4sIik7Ci0gICAgICBvdXQucHJpbnRsbihwcm9wVmFyICsgIiwiKTsKLSAgICAgIG91dC5wcmludGxuKHByb3BLZXlzWzBdICsgIiwiKTsKLSAgICAgIG91dC5wcmludGxuKHByb3BLZXlzWzFdICsgIik7Iik7Ci0gICAgICBvdXQudW5pbmRlbnQoKTsKLSAgICAgIG91dC51bmluZGVudCgpOwotICAgICAgb3V0LnByaW50bG4oIn0iKTsKLSAgICAgIG91dC5wcmludGxuKCJlbHNlIik7Ci0gICAgICBvdXQucHJpbnRsbigieyIpOwotICAgICAgb3V0LmluZGVudCgpOwotICAgICAgb3V0LnByaW50bG4oIlN0cmluZyBzID0gIiArIHByb3BWYXIgKyAiLmdldEV4cHJlc3Npb25TdHJpbmcoKTsiKTsKLSAgICAgIG91dC5wcmludGxuKCJpZiAocyAhPSBudWxsKSIpOwotICAgICAgb3V0LmluZGVudCgpOwotICAgICAgb3V0LnByaW50bG4oIlZpcnR1YWxBdHRyaWJ1dGVVdGlscy5zZXRBY2Nlc3NLZXlBdHRyaWJ1dGUoIik7Ci0gICAgICBvdXQuaW5kZW50KCk7Ci0gICAgICBvdXQucHJpbnRsbigiYmVhbiwiKTsKLSAgICAgIG91dC5wcmludGxuKCJzLCIpOwotICAgICAgb3V0LnByaW50bG4ocHJvcEtleXNbMF0gKyAiLCIpOwotICAgICAgb3V0LnByaW50bG4ocHJvcEtleXNbMV0gKyAiKTsiKTsKLSAgICAgIG91dC51bmluZGVudCgpOwotICAgICAgb3V0LnVuaW5kZW50KCk7Ci0gICAgICBvdXQudW5pbmRlbnQoKTsKLSAgICAgIG91dC5wcmludGxuKCJ9Iik7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBvdXQucHJpbnRsbigiaWYgKGlzVmFsdWVSZWZlcmVuY2UoIiArIHByb3BWYXIgKyAiKSkiKTsKLSAgICAgIG91dC5wcmludGxuKCJ7Iik7Ci0gICAgICBvdXQuaW5kZW50KCk7Ci0gICAgICBvdXQucHJpbnRsbigiVmFsdWVCaW5kaW5nIHZiID0gY3JlYXRlVmFsdWVCaW5kaW5nKCIgKyBwcm9wVmFyICsgIik7Iik7Ci0gICAgICBvdXQucHJpbnRsbigiVmlydHVhbEF0dHJpYnV0ZVV0aWxzLnNldEFjY2Vzc0tleUF0dHJpYnV0ZSgiKTsKLSAgICAgIG91dC5pbmRlbnQoKTsKLSAgICAgIG91dC5wcmludGxuKCJiZWFuLCIpOwotICAgICAgb3V0LnByaW50bG4oInZiLCIpOwotICAgICAgb3V0LnByaW50bG4ocHJvcEtleXNbMF0gKyAiLCIpOwotICAgICAgb3V0LnByaW50bG4ocHJvcEtleXNbMV0gKyAiKTsiKTsKLSAgICAgIG91dC51bmluZGVudCgpOwotICAgICAgb3V0LnVuaW5kZW50KCk7Ci0gICAgICBvdXQucHJpbnRsbigifSIpOwotICAgICAgb3V0LnByaW50bG4oImVsc2UiKTsKLSAgICAgIG91dC5wcmludGxuKCJ7Iik7Ci0gICAgICBvdXQuaW5kZW50KCk7Ci0gICAgICBvdXQucHJpbnRsbigiVmlydHVhbEF0dHJpYnV0ZVV0aWxzLnNldEFjY2Vzc0tleUF0dHJpYnV0ZSgiKTsKLSAgICAgIG91dC5pbmRlbnQoKTsKLSAgICAgIG91dC5wcmludGxuKCJiZWFuLCIpOwotICAgICAgb3V0LnByaW50bG4ocHJvcFZhciArICIsIik7Ci0gICAgICBvdXQucHJpbnRsbihwcm9wS2V5c1swXSArICIsIik7Ci0gICAgICBvdXQucHJpbnRsbihwcm9wS2V5c1sxXSArICIpOyIpOwotICAgICAgb3V0LnVuaW5kZW50KCk7Ci0gICAgICBvdXQudW5pbmRlbnQoKTsKLSAgICAgIG91dC5wcmludGxuKCJ9Iik7Ci0gICAgfQotCi0gICAgb3V0LnVuaW5kZW50KCk7Ci0gICAgb3V0LnByaW50bG4oIn0iKTsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBfd3JpdGVTZXRNZXRob2RCaW5kaW5nKAotICAgICAgUHJldHR5V3JpdGVyIG91dCwKLSAgICAgIFN0cmluZyBjb21wb25lbnRDbGFzcywKLSAgICAgIFByb3BlcnR5QmVhbiBwcm9wZXJ0eSkgdGhyb3dzIElPRXhjZXB0aW9uCi0gIHsKLSAgICBTdHJpbmcgcHJvcE5hbWUgPSBwcm9wZXJ0eS5nZXRQcm9wZXJ0eU5hbWUoKTsKLSAgICBTdHJpbmcgcHJvcEtleSA9IFV0aWwuZ2V0Q29uc3RhbnROYW1lRnJvbVByb3BlcnR5KHByb3BOYW1lLCAiX0tFWSIpOwotICAgIFN0cmluZyBwcm9wVmFyID0gIl8iICsgcHJvcE5hbWU7Ci0KLSAgICBpZiAoX2lzMTIpCi0gICAgewotICAgICAgb3V0LnByaW50bG4oImlmICgiICsgcHJvcFZhciArICIgIT0gbnVsbCkiKTsKLSAgICAgIG91dC5pbmRlbnQoKTsKLSAgICAgIG91dC5wcmludGxuKCJiZWFuLnNldFByb3BlcnR5KCIgKyBjb21wb25lbnRDbGFzcyArICIuIiArIHByb3BLZXkgKyAiLCAiICsKLSAgICAgICAgICAibmV3IE1ldGhvZEV4cHJlc3Npb25NZXRob2RCaW5kaW5nKCIgKyBwcm9wVmFyICsgIikpOyIpOwotICAgICAgb3V0LnVuaW5kZW50KCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBNZXRob2RTaWduYXR1cmVCZWFuIHNpZ25hdHVyZSA9IHByb3BlcnR5LmdldE1ldGhvZEJpbmRpbmdTaWduYXR1cmUoKTsKLSAgICAgIFN0cmluZ1tdIHBhcmFtVHlwZXMgPSAoc2lnbmF0dXJlICE9IG51bGwpID8gc2lnbmF0dXJlLmdldFBhcmFtZXRlclR5cGVzKCkgOiBudWxsOwotCi0gICAgICBTdHJpbmcgY2xhc3NBcnJheTsKLQotICAgICAgaWYgKHBhcmFtVHlwZXMgPT0gbnVsbCB8fCBwYXJhbVR5cGVzLmxlbmd0aCA9PSAwKQotICAgICAgewotICAgICAgICBjbGFzc0FycmF5ID0gIm5ldyBDbGFzc1swXSI7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgc2IuYXBwZW5kKCJuZXcgQ2xhc3NbXXsiKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJhbVR5cGVzLmxlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKGkgPiAwKQotICAgICAgICAgICAgc2IuYXBwZW5kKCcsJyk7Ci0gICAgICAgICAgc2IuYXBwZW5kKHBhcmFtVHlwZXNbaV0pOwotICAgICAgICAgIHNiLmFwcGVuZCgiLmNsYXNzIik7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBUT0RPOiByZW1vdmUgdHJhaWxpbmcgY29tbWEKLSAgICAgICAgc2IuYXBwZW5kKCcsJyk7Ci0KLSAgICAgICAgc2IuYXBwZW5kKCd9Jyk7Ci0gICAgICAgIGNsYXNzQXJyYXkgPSBzYi50b1N0cmluZygpOwotICAgICAgfQotCi0gICAgICBvdXQucHJpbnRsbigiaWYgKCIgKyBwcm9wVmFyICsgIiAhPSBudWxsKSIpOwotICAgICAgb3V0LnByaW50bG4oInsiKTsKLSAgICAgIG91dC5pbmRlbnQoKTsKLQotICAgICAgaWYgKGlzU3RyaW5nTWV0aG9kQmluZGluZ1JldHVyblR5cGUoc2lnbmF0dXJlKSkKLSAgICAgIHsKLSAgICAgICAgb3V0LnByaW50bG4oIk1ldGhvZEJpbmRpbmcgbWI7Iik7Ci0gICAgICAgIG91dC5wcmludGxuKCJpZiAoaXNWYWx1ZVJlZmVyZW5jZSgiICsgcHJvcFZhciArICIpKSIpOwotICAgICAgICBvdXQuaW5kZW50KCk7Ci0gICAgICAgIG91dC5wcmludGxuKCJtYiA9IGNyZWF0ZU1ldGhvZEJpbmRpbmcoIiArIHByb3BWYXIgKyAiLCAiICsgY2xhc3NBcnJheSArICIpOyIpOwotICAgICAgICBvdXQudW5pbmRlbnQoKTsKLSAgICAgICAgb3V0LnByaW50bG4oImVsc2UiKTsKLSAgICAgICAgb3V0LmluZGVudCgpOwotICAgICAgICBvdXQucHJpbnRsbigibWIgPSBuZXcgb3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkaW50ZXJuYWwudGFnbGliLkNvbnN0YW50TWV0aG9kQmluZGluZygiICsgcHJvcFZhciArICIpOyIpOwotICAgICAgICBvdXQudW5pbmRlbnQoKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgLy8gbmV2ZXIgYSBsaXRlcmFsLCBubyBuZWVkIGZvciBDb25zdGFudE1ldGhvZEJpbmRpbmcKLSAgICAgICAgb3V0LnByaW50bG4oIk1ldGhvZEJpbmRpbmcgbWIgPSBjcmVhdGVNZXRob2RCaW5kaW5nKCIgKyBwcm9wVmFyICsgIiwgIiArCi0gICAgICAgICAgICBjbGFzc0FycmF5ICsgIik7Iik7Ci0gICAgICB9Ci0KLSAgICAgIG91dC5wcmludGxuKCJiZWFuLnNldFByb3BlcnR5KCIgKyBjb21wb25lbnRDbGFzcyArICIuIiArIHByb3BLZXkgKyAiLCBtYik7Iik7Ci0gICAgICBvdXQudW5pbmRlbnQoKTsKLSAgICAgIG91dC5wcmludGxuKCJ9Iik7Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIF93cml0ZVNldE1ldGhvZEV4cHJlc3Npb24oCi0gICAgICBQcmV0dHlXcml0ZXIgb3V0LAotICAgICAgU3RyaW5nIGNvbXBvbmVudENsYXNzLAotICAgICAgUHJvcGVydHlCZWFuIHByb3BlcnR5KSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgewotICAgIFN0cmluZyBwcm9wTmFtZSA9IHByb3BlcnR5LmdldFByb3BlcnR5TmFtZSgpOwotICAgIFN0cmluZyBwcm9wS2V5ID0gVXRpbC5nZXRDb25zdGFudE5hbWVGcm9tUHJvcGVydHkocHJvcE5hbWUsICJfS0VZIik7Ci0gICAgU3RyaW5nIHByb3BWYXIgPSAiXyIgKyBwcm9wTmFtZTsKLQotICAgIG91dC5wcmludGxuKCJiZWFuLnNldFByb3BlcnR5KCIgKyBjb21wb25lbnRDbGFzcyArICIuIiArIHByb3BLZXkgKyAiLCAiICsKLSAgICAgICAgcHJvcFZhciArICIpOyIpOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIF93cml0ZVNldEVudW0oCi0gICAgICBQcmV0dHlXcml0ZXIgb3V0LAotICAgICAgU3RyaW5nIGNvbXBvbmVudENsYXNzLAotICAgICAgUHJvcGVydHlCZWFuIHByb3BlcnR5KSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgewotICAgIFN0cmluZyBwcm9wTmFtZSA9IHByb3BlcnR5LmdldFByb3BlcnR5TmFtZSgpOwotICAgIFN0cmluZyBwcm9wS2V5ID0gVXRpbC5nZXRDb25zdGFudE5hbWVGcm9tUHJvcGVydHkocHJvcE5hbWUsICJfS0VZIik7Ci0gICAgU3RyaW5nIHByb3BWYXIgPSAiXyIgKyBwcm9wTmFtZTsKLSAgICBTdHJpbmcgcHJvcENsYXNzID0gVXRpbC5nZXRDbGFzc0Zyb21GdWxsQ2xhc3MocHJvcGVydHkuZ2V0UHJvcGVydHlDbGFzcygpKTsKLQotICAgIGlmIChfaXMxMikKLSAgICB7Ci0gICAgICBvdXQucHJpbnRsbigiaWYgKCIgKyBwcm9wVmFyICsgIiAhPSBudWxsKSIpOwotICAgICAgb3V0LnByaW50bG4oInsiKTsKLSAgICAgIG91dC5pbmRlbnQoKTsKLSAgICAgIG91dC5wcmludGxuKCJpZiAoISIgKyBwcm9wVmFyICsgIi5pc0xpdGVyYWxUZXh0KCkpIik7Ci0gICAgICBvdXQucHJpbnRsbigieyIpOwotICAgICAgb3V0LmluZGVudCgpOwotICAgICAgb3V0LnByaW50bG4oImJlYW4uc2V0VmFsdWVFeHByZXNzaW9uKCIgKyBjb21wb25lbnRDbGFzcyArICIuIiArIHByb3BLZXkgKyAiLCAiICsgcHJvcFZhciArICIpOyIpOwotICAgICAgb3V0LnVuaW5kZW50KCk7Ci0gICAgICBvdXQucHJpbnRsbigifSIpOwotICAgICAgb3V0LnByaW50bG4oImVsc2UiKTsKLSAgICAgIG91dC5wcmludGxuKCJ7Iik7Ci0gICAgICBvdXQuaW5kZW50KCk7Ci0gICAgICBvdXQucHJpbnRsbigiU3RyaW5nIHMgPSAiICsgcHJvcFZhciArICIuZ2V0RXhwcmVzc2lvblN0cmluZygpOyIpOwotICAgICAgb3V0LnByaW50bG4oImlmIChzICE9IG51bGwpIik7Ci0gICAgICBvdXQuaW5kZW50KCk7Ci0gICAgICBvdXQucHJpbnRsbigiYmVhbi5zZXRQcm9wZXJ0eSgiICsgY29tcG9uZW50Q2xhc3MgKyAiLiIgKyBwcm9wS2V5ICsgIiwiKTsKLSAgICAgIG91dC5wcmludGxuKCJFbnVtLnZhbHVlT2YoIiArIHByb3BDbGFzcyArICIuY2xhc3MscykpOyIpOwotICAgICAgb3V0LnVuaW5kZW50KCk7Ci0gICAgICBvdXQudW5pbmRlbnQoKTsKLSAgICAgIG91dC5wcmludGxuKCJ9Iik7Ci0gICAgICBvdXQudW5pbmRlbnQoKTsKLSAgICAgIG91dC5wcmludGxuKCJ9Iik7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBvdXQucHJpbnRsbigiaWYgKCIgKyBwcm9wVmFyICsgIiAhPSBudWxsKSIpOwotICAgICAgb3V0LnByaW50bG4oInsiKTsKLSAgICAgIG91dC5pbmRlbnQoKTsKLSAgICAgIG91dC5wcmludGxuKCJpZiAoaXNWYWx1ZVJlZmVyZW5jZSgiICsgcHJvcFZhciArICIpKSIpOwotICAgICAgb3V0LnByaW50bG4oInsiKTsKLSAgICAgIG91dC5pbmRlbnQoKTsKLSAgICAgIG91dC5wcmludGxuKCJWYWx1ZUJpbmRpbmcgdmIgPSBjcmVhdGVWYWx1ZUJpbmRpbmcoIiArIHByb3BWYXIgKyAiKTsiKTsKLSAgICAgIG91dC5wcmludGxuKCJiZWFuLnNldFZhbHVlQmluZGluZygiICsgY29tcG9uZW50Q2xhc3MgKyAiLiIgKyBwcm9wS2V5ICsgIiwgdmIpOyIpOwotICAgICAgb3V0LnVuaW5kZW50KCk7Ci0gICAgICBvdXQucHJpbnRsbigifSIpOwotICAgICAgb3V0LnByaW50bG4oImVsc2UiKTsKLSAgICAgIG91dC5wcmludGxuKCJ7Iik7Ci0gICAgICBvdXQuaW5kZW50KCk7Ci0gICAgICBvdXQucHJpbnRsbigiYmVhbi5zZXRQcm9wZXJ0eSgiICsgY29tcG9uZW50Q2xhc3MgKyAiLiIgKyBwcm9wS2V5ICsgIiwiKTsKLSAgICAgIG91dC5wcmludGxuKCJFbnVtLnZhbHVlT2YoIiArIHByb3BDbGFzcyArICIuY2xhc3MsIiArIHByb3BWYXIgKyAiKSk7Iik7Ci0gICAgICBvdXQudW5pbmRlbnQoKTsKLSAgICAgIG91dC5wcmludGxuKCJ9Iik7Ci0gICAgICBvdXQudW5pbmRlbnQoKTsKLSAgICAgIG91dC5wcmludGxuKCJ9Iik7Ci0gICAgfQotICB9Ci0KLQotICBwcml2YXRlIHZvaWQgX3dyaXRlU2V0S2V5U3Ryb2tlKAotICAgICAgUHJldHR5V3JpdGVyIG91dCwKLSAgICAgIFN0cmluZyBjb21wb25lbnRDbGFzcywKLSAgICAgIFN0cmluZyBwcm9wTmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uCi0gIHsKLSAgICBTdHJpbmcgcHJvcEtleSA9IFV0aWwuZ2V0Q29uc3RhbnROYW1lRnJvbVByb3BlcnR5KHByb3BOYW1lLCAiX0tFWSIpOwotICAgIFN0cmluZyBwcm9wVmFyID0gIl8iICsgcHJvcE5hbWU7Ci0KLQotICAgIGlmIChfaXMxMikKLSAgICB7Ci0gICAgICBvdXQucHJpbnRsbigiaWYgKCIgKyBwcm9wVmFyICsgIiAhPSBudWxsKSIpOwotICAgICAgb3V0LnByaW50bG4oInsiKTsKLSAgICAgIG91dC5pbmRlbnQoKTsKLSAgICAgIG91dC5wcmludGxuKCJpZiAoISIgKyBwcm9wVmFyICsgIi5pc0xpdGVyYWxUZXh0KCkpIik7Ci0gICAgICBvdXQucHJpbnRsbigieyIpOwotICAgICAgb3V0LmluZGVudCgpOwotICAgICAgb3V0LnByaW50bG4oImJlYW4uc2V0VmFsdWVFeHByZXNzaW9uKCIgKyBjb21wb25lbnRDbGFzcyArICIuIiArIHByb3BLZXkgKyAiLCAiICsgcHJvcFZhciArICIpOyIpOwotICAgICAgb3V0LnVuaW5kZW50KCk7Ci0gICAgICBvdXQucHJpbnRsbigifSIpOwotICAgICAgb3V0LnByaW50bG4oImVsc2UiKTsKLSAgICAgIG91dC5wcmludGxuKCJ7Iik7Ci0gICAgICBvdXQuaW5kZW50KCk7Ci0gICAgICBvdXQucHJpbnRsbigiU3RyaW5nIHZhbCA9ICIgKyBwcm9wVmFyICsgIi5nZXRFeHByZXNzaW9uU3RyaW5nKCk7Iik7Ci0gICAgICBvdXQucHJpbnRsbigiaWYgKHZhbCAhPSBudWxsKSIpOwotICAgICAgb3V0LmluZGVudCgpOwotICAgICAgb3V0LnByaW50bG4oImJlYW4uc2V0UHJvcGVydHkoIiArIGNvbXBvbmVudENsYXNzICsgIi4iICsgcHJvcEtleSArICIsIik7Ci0gICAgICBvdXQucHJpbnRsbigiXHRLZXlTdHJva2UuZ2V0S2V5U3Ryb2tlKHZhbCkpOyIpOwotICAgICAgb3V0LnVuaW5kZW50KCk7Ci0gICAgICBvdXQudW5pbmRlbnQoKTsKLSAgICAgIG91dC5wcmludGxuKCJ9Iik7Ci0gICAgICBvdXQudW5pbmRlbnQoKTsKLSAgICAgIG91dC5wcmludGxuKCJ9Iik7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBvdXQucHJpbnRsbigiaWYgKCIgKyBwcm9wVmFyICsgIiAhPSBudWxsKSIpOwotICAgICAgb3V0LnByaW50bG4oInsiKTsKLSAgICAgIG91dC5pbmRlbnQoKTsKLSAgICAgIG91dC5wcmludGxuKCJpZiAoaXNWYWx1ZVJlZmVyZW5jZSgiICsgcHJvcFZhciArICIpKSIpOwotICAgICAgb3V0LnByaW50bG4oInsiKTsKLSAgICAgIG91dC5pbmRlbnQoKTsKLSAgICAgIG91dC5wcmludGxuKCJWYWx1ZUJpbmRpbmcgdmIgPSBjcmVhdGVWYWx1ZUJpbmRpbmcoIiArIHByb3BWYXIgKyAiKTsiKTsKLSAgICAgIG91dC5wcmludGxuKCJiZWFuLnNldFZhbHVlQmluZGluZygiICsgY29tcG9uZW50Q2xhc3MgKyAiLiIgKyBwcm9wS2V5ICsgIiwgdmIpOyIpOwotICAgICAgb3V0LnVuaW5kZW50KCk7Ci0gICAgICBvdXQucHJpbnRsbigifSIpOwotICAgICAgb3V0LnByaW50bG4oImVsc2UiKTsKLSAgICAgIG91dC5wcmludGxuKCJ7Iik7Ci0gICAgICBvdXQuaW5kZW50KCk7Ci0gICAgICBvdXQucHJpbnRsbigiYmVhbi5zZXRQcm9wZXJ0eSgiICsgY29tcG9uZW50Q2xhc3MgKyAiLiIgKyBwcm9wS2V5ICsgIiwiKTsKLSAgICAgIG91dC5wcmludGxuKCJcdEtleVN0cm9rZS5nZXRLZXlTdHJva2UoIiArIHByb3BWYXIgKyAiKSk7Iik7Ci0gICAgICBvdXQudW5pbmRlbnQoKTsKLSAgICAgIG91dC5wcmludGxuKCJ9Iik7Ci0gICAgICBvdXQudW5pbmRlbnQoKTsKLSAgICAgIG91dC5wcmludGxuKCJ9Iik7Ci0gICAgfQotICB9Ci0KLQotICBwcml2YXRlIHZvaWQgX3dyaXRlU2V0QVdUS2V5U3Ryb2tlKAotICAgICAgUHJldHR5V3JpdGVyIG91dCwKLSAgICAgIFN0cmluZyBjb21wb25lbnRDbGFzcywKLSAgICAgIFN0cmluZyBwcm9wTmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uCi0gIHsKLSAgICBTdHJpbmcgcHJvcEtleSA9IFV0aWwuZ2V0Q29uc3RhbnROYW1lRnJvbVByb3BlcnR5KHByb3BOYW1lLCAiX0tFWSIpOwotICAgIFN0cmluZyBwcm9wVmFyID0gIl8iICsgcHJvcE5hbWU7Ci0KLSAgICBpZiAoX2lzMTIpCi0gICAgewotICAgICAgb3V0LnByaW50bG4oImlmICgiICsgcHJvcFZhciArICIgIT0gbnVsbCkiKTsKLSAgICAgIG91dC5wcmludGxuKCJ7Iik7Ci0gICAgICBvdXQuaW5kZW50KCk7Ci0gICAgICBvdXQucHJpbnRsbigiaWYgKCEiICsgcHJvcFZhciArICIuaXNMaXRlcmFsVGV4dCgpKSIpOwotICAgICAgb3V0LnByaW50bG4oInsiKTsKLSAgICAgIG91dC5pbmRlbnQoKTsKLSAgICAgIG91dC5wcmludGxuKCJiZWFuLnNldFZhbHVlRXhwcmVzc2lvbigiICsgY29tcG9uZW50Q2xhc3MgKyAiLiIgKyBwcm9wS2V5ICsgIiwgIiArIHByb3BWYXIgKyAiKTsiKTsKLSAgICAgIG91dC51bmluZGVudCgpOwotICAgICAgb3V0LnByaW50bG4oIn0iKTsKLSAgICAgIG91dC5wcmludGxuKCJlbHNlIik7Ci0gICAgICBvdXQucHJpbnRsbigieyIpOwotICAgICAgb3V0LmluZGVudCgpOwotICAgICAgb3V0LnByaW50bG4oIlN0cmluZyB2YWwgPSAiICsgcHJvcFZhciArICIuZ2V0RXhwcmVzc2lvblN0cmluZygpOyIpOwotICAgICAgb3V0LnByaW50bG4oImlmICh2YWwgIT0gbnVsbCkiKTsKLSAgICAgIG91dC5pbmRlbnQoKTsKLSAgICAgIG91dC5wcmludGxuKCJiZWFuLnNldFByb3BlcnR5KCIgKyBjb21wb25lbnRDbGFzcyArICIuIiArIHByb3BLZXkgKyAiLCIpOwotICAgICAgb3V0LnByaW50bG4oIlx0QVdUS2V5U3Ryb2tlLmdldEFXVEtleVN0cm9rZSh2YWwpKTsiKTsKLSAgICAgIG91dC51bmluZGVudCgpOwotICAgICAgb3V0LnVuaW5kZW50KCk7Ci0gICAgICBvdXQucHJpbnRsbigifSIpOwotICAgICAgb3V0LnVuaW5kZW50KCk7Ci0gICAgICBvdXQucHJpbnRsbigifSIpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgb3V0LnByaW50bG4oImlmICgiICsgcHJvcFZhciArICIgIT0gbnVsbCkiKTsKLSAgICAgIG91dC5wcmludGxuKCJ7Iik7Ci0gICAgICBvdXQuaW5kZW50KCk7Ci0gICAgICBvdXQucHJpbnRsbigiaWYgKGlzVmFsdWVSZWZlcmVuY2UoIiArIHByb3BWYXIgKyAiKSkiKTsKLSAgICAgIG91dC5wcmludGxuKCJ7Iik7Ci0gICAgICBvdXQuaW5kZW50KCk7Ci0gICAgICBvdXQucHJpbnRsbigiVmFsdWVCaW5kaW5nIHZiID0gY3JlYXRlVmFsdWVCaW5kaW5nKCIgKyBwcm9wVmFyICsgIik7Iik7Ci0gICAgICBvdXQucHJpbnRsbigiYmVhbi5zZXRWYWx1ZUJpbmRpbmcoIiArIGNvbXBvbmVudENsYXNzICsgIi4iICsgcHJvcEtleSArICIsIHZiKTsiKTsKLSAgICAgIG91dC51bmluZGVudCgpOwotICAgICAgb3V0LnByaW50bG4oIn0iKTsKLSAgICAgIG91dC5wcmludGxuKCJlbHNlIik7Ci0gICAgICBvdXQucHJpbnRsbigieyIpOwotICAgICAgb3V0LmluZGVudCgpOwotICAgICAgb3V0LnByaW50bG4oImJlYW4uc2V0UHJvcGVydHkoIiArIGNvbXBvbmVudENsYXNzICsgIi4iICsgcHJvcEtleSArICIsIik7Ci0gICAgICBvdXQucHJpbnRsbigiXHRBV1RLZXlTdHJva2UuZ2V0QVdUS2V5U3Ryb2tlKCIgKyBwcm9wVmFyICsgIikpOyIpOwotICAgICAgb3V0LnVuaW5kZW50KCk7Ci0gICAgICBvdXQucHJpbnRsbigifSIpOwotICAgICAgb3V0LnVuaW5kZW50KCk7Ci0gICAgICBvdXQucHJpbnRsbigifSIpOwotICAgIH0KLSAgfQotCi0KLSAgcHJpdmF0ZSB2b2lkIF93cml0ZVNldENvbG9yKAotICAgICAgUHJldHR5V3JpdGVyIG91dCwKLSAgICAgIFN0cmluZyAgY29tcG9uZW50Q2xhc3MsCi0gICAgICBTdHJpbmcgIHByb3BOYW1lLAotICAgICAgYm9vbGVhbiBpc0xpc3QpIHRocm93cyBJT0V4Y2VwdGlvbgotICB7Ci0gICAgU3RyaW5nIHByb3BLZXkgPSBVdGlsLmdldENvbnN0YW50TmFtZUZyb21Qcm9wZXJ0eShwcm9wTmFtZSwgIl9LRVkiKTsKLSAgICBTdHJpbmcgcHJvcFZhciA9ICJfIiArIHByb3BOYW1lOwotCi0gICAgb3V0LnByaW50bG4oImlmICgiICsgcHJvcFZhciArICIgIT0gbnVsbCkiKTsKLSAgICBvdXQucHJpbnRsbigieyIpOwotICAgIG91dC5pbmRlbnQoKTsKLSAgICBpZiAoX2lzMTIpCi0gICAgewotICAgICAgb3V0LnByaW50bG4oImlmICghIiArIHByb3BWYXIgKyAiLmlzTGl0ZXJhbFRleHQoKSkiKTsKLSAgICAgIG91dC5wcmludGxuKCJ7Iik7Ci0gICAgICBvdXQuaW5kZW50KCk7Ci0gICAgICBvdXQucHJpbnRsbigiYmVhbi5zZXRWYWx1ZUV4cHJlc3Npb24oIiArIGNvbXBvbmVudENsYXNzICsgIi4iICsgcHJvcEtleSArICIsICIgKyBwcm9wVmFyICsgIik7Iik7Ci0gICAgICBvdXQudW5pbmRlbnQoKTsKLSAgICAgIG91dC5wcmludGxuKCJ9Iik7Ci0gICAgICBvdXQucHJpbnRsbigiZWxzZSIpOwotICAgICAgb3V0LnByaW50bG4oInsiKTsKLSAgICAgIG91dC5pbmRlbnQoKTsKLSAgICAgIG91dC5wcmludGxuKCJTdHJpbmcgcyA9ICIgKyBwcm9wVmFyICsgIi5nZXRFeHByZXNzaW9uU3RyaW5nKCk7Iik7Ci0gICAgICBvdXQucHJpbnRsbigiaWYgKHMgIT0gbnVsbCkiKTsKLSAgICAgIG91dC5pbmRlbnQoKTsKLSAgICAgIG91dC5wcmludGxuKCJ7Iik7Ci0gICAgICBvdXQucHJpbnRsbigidHJ5Iik7Ci0gICAgICBvdXQucHJpbnRsbigieyIpOwotICAgICAgb3V0LmluZGVudCgpOwotICAgICAgb3V0LnByaW50bG4oImJlYW4uc2V0UHJvcGVydHkoIiArIGNvbXBvbmVudENsYXNzICsgIi4iICsgcHJvcEtleSArICIsIik7Ci0gICAgICBpZiAoaXNMaXN0KQotICAgICAgICBvdXQucHJpbnRsbigiICAgICAgICAgICAgICAgICBUYWdVdGlscy5nZXRDb2xvckxpc3QocykpOyIpOwotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBvdXQucHJpbnRsbigiICAgICAgICAgICAgICAgICBUYWdVdGlscy5nZXRDb2xvcihzKSk7Iik7Ci0gICAgICB9Ci0gICAgICBvdXQudW5pbmRlbnQoKTsKLSAgICAgIG91dC5wcmludGxuKCJ9Iik7Ci0gICAgICBvdXQucHJpbnRsbigiY2F0Y2ggKFBhcnNlRXhjZXB0aW9uIHBlKSIpOwotICAgICAgb3V0LnByaW50bG4oInsiKTsKLSAgICAgIG91dC5pbmRlbnQoKTsKLSAgICAgIG91dC5wcmludGxuKCJzZXRWYWxpZGF0aW9uRXJyb3IoIik7Ci0gICAgICBvdXQucHJpbnRsbigiICBwZS5nZXRNZXNzYWdlKCkgKyBcIjogXCIgKyBcIlBvc2l0aW9uIFwiICsgcGUuZ2V0RXJyb3JPZmZzZXQoKSk7Iik7Ci0gICAgICBvdXQudW5pbmRlbnQoKTsKLSAgICAgIG91dC5wcmludGxuKCJ9Iik7Ci0gICAgICBvdXQudW5pbmRlbnQoKTsKLSAgICAgIG91dC5wcmludGxuKCJ9Iik7Ci0gICAgICBvdXQudW5pbmRlbnQoKTsKLSAgICAgIG91dC5wcmludGxuKCJ9Iik7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBvdXQucHJpbnRsbigiaWYgKGlzVmFsdWVSZWZlcmVuY2UoIiArIHByb3BWYXIgKyAiKSkiKTsKLSAgICAgIG91dC5wcmludGxuKCJ7Iik7Ci0gICAgICBvdXQuaW5kZW50KCk7Ci0gICAgICBvdXQucHJpbnRsbigiVmFsdWVCaW5kaW5nIHZiID0gY3JlYXRlVmFsdWVCaW5kaW5nKCIgKyBwcm9wVmFyICsgIik7Iik7Ci0gICAgICBvdXQucHJpbnRsbigiYmVhbi5zZXRWYWx1ZUJpbmRpbmcoIiArIGNvbXBvbmVudENsYXNzICsgIi4iICsgcHJvcEtleSArICIsIHZiKTsiKTsKLSAgICAgIG91dC51bmluZGVudCgpOwotICAgICAgb3V0LnByaW50bG4oIn0iKTsKLSAgICAgIG91dC5wcmludGxuKCJlbHNlIik7Ci0gICAgICBvdXQucHJpbnRsbigieyIpOwotICAgICAgb3V0LmluZGVudCgpOwotICAgICAgb3V0LnByaW50bG4oInRyeSIpOwotICAgICAgb3V0LnByaW50bG4oInsiKTsKLSAgICAgIG91dC5pbmRlbnQoKTsKLSAgICAgIG91dC5wcmludGxuKCJiZWFuLnNldFByb3BlcnR5KCIgKyBjb21wb25lbnRDbGFzcyArICIuIiArIHByb3BLZXkgKyAiLCIpOwotICAgICAgaWYgKGlzTGlzdCkKLSAgICAgICAgb3V0LnByaW50bG4oIiAgICAgICAgICAgICAgICAgVGFnVXRpbHMuZ2V0Q29sb3JMaXN0KCIgKyBwcm9wVmFyICsgIikpOyIpOwotICAgICAgZWxzZQotICAgICAgICBvdXQucHJpbnRsbigiICAgICAgICAgICAgICAgICBUYWdVdGlscy5nZXRDb2xvcigiICsgcHJvcFZhciArICIpKTsiKTsKLSAgICAgIG91dC51bmluZGVudCgpOwotICAgICAgb3V0LnByaW50bG4oIn0iKTsKLSAgICAgIG91dC5wcmludGxuKCJjYXRjaCAoUGFyc2VFeGNlcHRpb24gcGUpIik7Ci0gICAgICBvdXQucHJpbnRsbigieyIpOwotICAgICAgb3V0LmluZGVudCgpOwotICAgICAgb3V0LnByaW50bG4oInNldFZhbGlkYXRpb25FcnJvcigiKTsKLSAgICAgIG91dC5wcmludGxuKCIgIHBlLmdldE1lc3NhZ2UoKSArIFwiOiBcIiArIFwiUG9zaXRpb24gXCIgKyBwZS5nZXRFcnJvck9mZnNldCgpKTsiKTsKLSAgICAgIG91dC51bmluZGVudCgpOwotICAgICAgb3V0LnByaW50bG4oIn0iKTsKLSAgICAgIG91dC51bmluZGVudCgpOwotICAgICAgb3V0LnByaW50bG4oIn0iKTsKLSAgICB9Ci0gICAgb3V0LnVuaW5kZW50KCk7Ci0gICAgb3V0LnByaW50bG4oIn0iKTsKLSAgfQotCi0KLSAgcHJpdmF0ZSB2b2lkIF93cml0ZVNldENvbnZlcnRlcigKLSAgICAgIFByZXR0eVdyaXRlciBvdXQsCi0gICAgICBTdHJpbmcgY29tcG9uZW50Q2xhc3MsCi0gICAgICBTdHJpbmcgcHJvcE5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbgotICB7Ci0gICAgU3RyaW5nIHByb3BLZXkgPSBVdGlsLmdldENvbnN0YW50TmFtZUZyb21Qcm9wZXJ0eShwcm9wTmFtZSwgIl9LRVkiKTsKLSAgICBTdHJpbmcgcHJvcFZhciA9ICJfIiArIHByb3BOYW1lOwotCi0gICAgb3V0LnByaW50bG4oImlmICgiICsgcHJvcFZhciArICIgIT0gbnVsbCkiKTsKLSAgICBvdXQucHJpbnRsbigieyIpOwotICAgIG91dC5pbmRlbnQoKTsKLSAgICBpZiAoX2lzMTIpCi0gICAgewotICAgICAgb3V0LnByaW50bG4oImlmICghIiArIHByb3BWYXIgKyAiLmlzTGl0ZXJhbFRleHQoKSkiKTsKLSAgICAgIG91dC5wcmludGxuKCJ7Iik7Ci0gICAgICBvdXQuaW5kZW50KCk7Ci0gICAgICBvdXQucHJpbnRsbigiYmVhbi5zZXRWYWx1ZUV4cHJlc3Npb24oIiArIGNvbXBvbmVudENsYXNzICsgIi4iICsgcHJvcEtleSArICIsICIgKyBwcm9wVmFyICsgIik7Iik7Ci0gICAgICBvdXQudW5pbmRlbnQoKTsKLSAgICAgIG91dC5wcmludGxuKCJ9Iik7Ci0gICAgICBvdXQucHJpbnRsbigiZWxzZSIpOwotICAgICAgb3V0LnByaW50bG4oInsiKTsKLSAgICAgIG91dC5pbmRlbnQoKTsKLSAgICAgIG91dC5wcmludGxuKCJTdHJpbmcgcyA9ICIgKyBwcm9wVmFyICsgIi5nZXRFeHByZXNzaW9uU3RyaW5nKCk7Iik7Ci0gICAgICBvdXQucHJpbnRsbigiaWYgKHMgIT0gbnVsbCkiKTsKLSAgICAgIG91dC5wcmludGxuKCJ7Iik7Ci0KLSAgICAgIG91dC5pbmRlbnQoKTsKLSAgICAgIG91dC5wcmludGxuKCJDb252ZXJ0ZXIgY29udmVydGVyID0gZ2V0RmFjZXNDb250ZXh0KCkuZ2V0QXBwbGljYXRpb24oKS4iKTsKLSAgICAgIG91dC5pbmRlbnQoKTsKLSAgICAgIG91dC5wcmludGxuKCJjcmVhdGVDb252ZXJ0ZXIocyk7Iik7Ci0gICAgICBvdXQudW5pbmRlbnQoKTsKLSAgICAgIG91dC5wcmludGxuKCJiZWFuLnNldFByb3BlcnR5KCIgKyBjb21wb25lbnRDbGFzcyArICIuIiArIHByb3BLZXkgKyAiLCBjb252ZXJ0ZXIpOyIpOwotCi0gICAgICBvdXQudW5pbmRlbnQoKTsKLSAgICAgIG91dC5wcmludGxuKCJ9Iik7Ci0KLSAgICAgIG91dC51bmluZGVudCgpOwotICAgICAgb3V0LnByaW50bG4oIn0iKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIG91dC5wcmludGxuKCJpZiAoaXNWYWx1ZVJlZmVyZW5jZSgiICsgcHJvcFZhciArICIpKSIpOwotICAgICAgb3V0LnByaW50bG4oInsiKTsKLSAgICAgIG91dC5pbmRlbnQoKTsKLSAgICAgIG91dC5wcmludGxuKCJWYWx1ZUJpbmRpbmcgdmIgPSBjcmVhdGVWYWx1ZUJpbmRpbmcoIiArIHByb3BWYXIgKyAiKTsiKTsKLSAgICAgIG91dC5wcmludGxuKCJiZWFuLnNldFZhbHVlQmluZGluZygiICsgY29tcG9uZW50Q2xhc3MgKyAiLiIgKyBwcm9wS2V5ICsgIiwgdmIpOyIpOwotICAgICAgb3V0LnVuaW5kZW50KCk7Ci0gICAgICBvdXQucHJpbnRsbigifSIpOwotICAgICAgb3V0LnByaW50bG4oImVsc2UiKTsKLSAgICAgIG91dC5wcmludGxuKCJ7Iik7Ci0gICAgICBvdXQuaW5kZW50KCk7Ci0gICAgICBvdXQucHJpbnRsbigiQ29udmVydGVyIGNvbnZlcnRlciA9IGdldEZhY2VzQ29udGV4dCgpLmdldEFwcGxpY2F0aW9uKCkuIik7Ci0gICAgICBvdXQuaW5kZW50KCk7Ci0gICAgICBvdXQucHJpbnRsbigiY3JlYXRlQ29udmVydGVyKCIgKyBwcm9wVmFyICsgIik7Iik7Ci0gICAgICBvdXQudW5pbmRlbnQoKTsKLSAgICAgIG91dC5wcmludGxuKCJiZWFuLnNldFByb3BlcnR5KCIgKyBjb21wb25lbnRDbGFzcyArICIuIiArIHByb3BLZXkgKyAiLCBjb252ZXJ0ZXIpOyIpOwotICAgICAgb3V0LnVuaW5kZW50KCk7Ci0gICAgICBvdXQucHJpbnRsbigifSIpOwotICAgIH0KLSAgICBvdXQudW5pbmRlbnQoKTsKLSAgICBvdXQucHJpbnRsbigifSIpOwotICB9Ci0KLSAgcHJpdmF0ZSBib29sZWFuIGlzU3RyaW5nTWV0aG9kQmluZGluZ1JldHVyblR5cGUoCi0gICAgICBNZXRob2RTaWduYXR1cmVCZWFuIHNpZykKLSAgewotICAgIHJldHVybiAoc2lnICE9IG51bGwgJiYgImphdmEubGFuZy5TdHJpbmciLmVxdWFscyhzaWcuZ2V0UmV0dXJuVHlwZSgpKSk7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL2dlbmVyYXRvci90YWdsaWIvVHJpbmlkYWRDb252ZXJ0ZXJUYWdHZW5lcmF0b3IuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy9nZW5lcmF0b3IvdGFnbGliL1RyaW5pZGFkQ29udmVydGVyVGFnR2VuZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0MDdlOWEuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL2dlbmVyYXRvci90YWdsaWIvVHJpbmlkYWRDb252ZXJ0ZXJUYWdHZW5lcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NyArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMuZ2VuZXJhdG9yLnRhZ2xpYjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMuaW8uUHJldHR5V3JpdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMucGFyc2UuQ29udmVydGVyQmVhbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLnBhcnNlLlByb3BlcnR5QmVhbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLnV0aWwuVXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlRyZWVTZXQ7Ci0KLXB1YmxpYyBjbGFzcyBUcmluaWRhZENvbnZlcnRlclRhZ0dlbmVyYXRvciBleHRlbmRzIEFic3RyYWN0Q29udmVydGVyVGFnR2VuZXJhdG9yIHsKLQotICBwdWJsaWMgVHJpbmlkYWRDb252ZXJ0ZXJUYWdHZW5lcmF0b3IoYm9vbGVhbiBpczEyLCBTdHJpbmcgbGljZW5zZUhlYWRlciwgTG9nIGxvZykgewotICAgIHN1cGVyKGlzMTIsIGxpY2Vuc2VIZWFkZXIsIGxvZyk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgU2V0IGNyZWF0ZUltcG9ydHMoQ29udmVydGVyQmVhbiBjb252ZXJ0ZXIpIHsKLSAgICBTZXQgaW1wb3J0cyA9IG5ldyBUcmVlU2V0KCk7Ci0KLSAgICBpZiAoaXMxMigpKQotICAgIHsKLSAgICAgIGltcG9ydHMuYWRkKCJqYXZheC5mYWNlcy53ZWJhcHAuQ29udmVydGVyRUxUYWciKTsKLSAgICAgIGltcG9ydHMuYWRkKCJqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dCIpOwotICAgICAgaW1wb3J0cy5hZGQoImphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uIik7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBpbXBvcnRzLmFkZCgiamF2YXguZmFjZXMud2ViYXBwLkNvbnZlcnRlclRhZyIpOwotICAgIH0KLQotICAgIGltcG9ydHMuYWRkKCJqYXZheC5zZXJ2bGV0LmpzcC5Kc3BFeGNlcHRpb24iKTsKLSAgICBpbXBvcnRzLmFkZChjb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0KLSAgICBpbXBvcnRzLmFkZCgiamF2YXguZmFjZXMuY29udmVydC5Db252ZXJ0ZXIiKTsKLSAgICBpZiAoaXMxMigpKQotICAgIHsKLSAgICAgIGltcG9ydHMuYWRkKCJqYXZheC5lbC5WYWx1ZUV4cHJlc3Npb24iKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGltcG9ydHMuYWRkKCJqYXZheC5mYWNlcy5lbC5WYWx1ZUJpbmRpbmciKTsKLSAgICB9Ci0gICAgaW1wb3J0cy5hZGQoIm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZGludGVybmFsLnRhZ2xpYi51dGlsLlRhZ1V0aWxzIik7Ci0KLQotICAgIGFkZEltcG9ydHNGcm9tUHJvcGVydGVzKGNvbnZlcnRlciwgaW1wb3J0cyk7Ci0gICAgcmV0dXJuIGltcG9ydHM7Ci0gIH0KLQotCi0KLQotICBwcm90ZWN0ZWQgdm9pZCB3cml0ZVNldFByb3BlcnR5KAotICAgIFByZXR0eVdyaXRlciBvdXQsCi0gICAgUHJvcGVydHlCZWFuIHByb3BlcnR5KQotICB7Ci0gICAgU3RyaW5nIHByb3BOYW1lID0gcHJvcGVydHkuZ2V0UHJvcGVydHlOYW1lKCk7Ci0gICAgU3RyaW5nIHByb3BGdWxsQ2xhc3MgPSBwcm9wZXJ0eS5nZXRQcm9wZXJ0eUNsYXNzKCk7Ci0gICAgU3RyaW5nIHByb3BDbGFzcyA9IFV0aWwuZ2V0Q2xhc3NGcm9tRnVsbENsYXNzKHByb3BGdWxsQ2xhc3MpOwotICAgIFN0cmluZyBwcm9wVmFyID0gIl8iICsgVXRpbC5nZXRWYXJpYWJsZUZyb21OYW1lKHByb3BOYW1lKTsKLQotICAgIG91dC5wcmludGxuKCJpZiAoIiArIHByb3BWYXIgKyAiICE9IG51bGwpIik7Ci0gICAgb3V0LnByaW50bG4oInsiKTsKLSAgICBvdXQuaW5kZW50KCk7Ci0KLSAgICBpZiAoaXMxMigpKQotICAgIHsKLSAgICAgIG91dC5wcmludGxuKCJpZiAoISIgKyBwcm9wVmFyICsgIi5pc0xpdGVyYWxUZXh0KCkpIik7Ci0gICAgICBvdXQucHJpbnRsbigieyIpOwotICAgICAgb3V0LmluZGVudCgpOwotICAgICAgb3V0LnByaW50bG4oImNvbnZlcnRlci5zZXRWYWx1ZUV4cHJlc3Npb24oXCIiICsgcHJvcE5hbWUgKyAiXCIsICIgKwotICAgICAgICAgICAgICAgICAgcHJvcFZhciArICIpOyIpOwotICAgICAgb3V0LnVuaW5kZW50KCk7Ci0gICAgICBvdXQucHJpbnRsbigifSIpOwotICAgICAgU3RyaW5nIHByb3BUeXBlID0gcmVzb2x2ZVR5cGUocHJvcEZ1bGxDbGFzcyk7Ci0gICAgICBpZiAocHJvcFR5cGUgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgb3V0LnByaW50bG4oImVsc2UiKTsKLSAgICAgICAgb3V0LnByaW50bG4oInsiKTsKLSAgICAgICAgb3V0LmluZGVudCgpOwotICAgICAgICBpZiAoIlN0cmluZ0FycmF5Ii5lcXVhbHMocHJvcFR5cGUpKQotICAgICAgICB7Ci0gICAgICAgICAgb3V0LnByaW50bG4oInRyeSIpOwotICAgICAgICAgIG91dC5wcmludGxuKCJ7Iik7Ci0gICAgICAgIH0KLQotICAgICAgICBvdXQucHJpbnRsbihwcm9wQ2xhc3MgKyAiIHZhbHVlID0gVGFnVXRpbHMuZ2V0IiArIHByb3BUeXBlICsgIigiICsgcHJvcFZhciArICIuZ2V0VmFsdWUobnVsbCkpOyIpOwotICAgICAgICBTdHJpbmcgc2V0TWV0aG9kID0gVXRpbC5nZXRQcmVmaXhlZFByb3BlcnR5TmFtZSgic2V0IiwgcHJvcE5hbWUpOwotICAgICAgICBvdXQucHJpbnRsbigiY29udmVydGVyLiIgKyBzZXRNZXRob2QgKyAiKHZhbHVlKTsiKTsKLSAgICAgICAgaWYgKCJTdHJpbmdBcnJheSIuZXF1YWxzKHByb3BUeXBlKSkKLSAgICAgICAgewotICAgICAgICAgIG91dC5wcmludGxuKCJ9Iik7Ci0gICAgICAgICAgb3V0LnByaW50bG4oImNhdGNoIChQYXJzZUV4Y2VwdGlvbiBwZSkiKTsKLSAgICAgICAgICBvdXQucHJpbnRsbigieyIpOwotICAgICAgICAgIG91dC5pbmRlbnQoKTsKLSAgICAgICAgICBvdXQucHJpbnRsbigidGhyb3cgbmV3IEpzcEV4Y2VwdGlvbigiKTsKLSAgICAgICAgICBvdXQucHJpbnRsbigiICBwZS5nZXRNZXNzYWdlKCkgKyBcIjogXCIgKyBcIlBvc2l0aW9uIFwiICsgcGUuZ2V0RXJyb3JPZmZzZXQoKSk7Iik7Ci0gICAgICAgICAgb3V0LnVuaW5kZW50KCk7Ci0gICAgICAgICAgb3V0LnByaW50bG4oIn0iKTsKLSAgICAgICAgfQotICAgICAgICBvdXQudW5pbmRlbnQoKTsKLSAgICAgICAgb3V0LnByaW50bG4oIn0iKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIG91dC5wcmludGxuKCJpZiAoVGFnVXRpbHMuaXNWYWx1ZVJlZmVyZW5jZSgiICsgcHJvcFZhciArICIpKSIpOwotICAgICAgb3V0LnByaW50bG4oInsiKTsKLSAgICAgIG91dC5pbmRlbnQoKTsKLSAgICAgIG91dC5wcmludGxuKCJWYWx1ZUJpbmRpbmcgdmIgPSBUYWdVdGlscy5nZXRWYWx1ZUJpbmRpbmcoIiArIHByb3BWYXIgKyAiKTsiKTsKLSAgICAgIG91dC5wcmludGxuKCJjb252ZXJ0ZXIuc2V0VmFsdWVCaW5kaW5nKFwiIiArIHByb3BOYW1lICsgIlwiLCB2Yik7Iik7Ci0gICAgICBvdXQudW5pbmRlbnQoKTsKLSAgICAgIG91dC5wcmludGxuKCJ9Iik7Ci0gICAgICBTdHJpbmcgcHJvcFR5cGUgPSByZXNvbHZlVHlwZShwcm9wRnVsbENsYXNzKTsKLSAgICAgIGlmIChwcm9wVHlwZSAhPSBudWxsKQotICAgICAgewotICAgICAgICBvdXQucHJpbnRsbigiZWxzZSIpOwotICAgICAgICBvdXQucHJpbnRsbigieyIpOwotICAgICAgICBvdXQuaW5kZW50KCk7Ci0gICAgICAgIGlmICgiU3RyaW5nQXJyYXkiLmVxdWFscyhwcm9wVHlwZSkpCi0gICAgICAgIHsKLSAgICAgICAgICBvdXQucHJpbnRsbigidHJ5Iik7Ci0gICAgICAgICAgb3V0LnByaW50bG4oInsiKTsKLSAgICAgICAgfQotICAgICAgICBvdXQucHJpbnRsbihwcm9wQ2xhc3MgKyAiIHZhbHVlID0gVGFnVXRpbHMuZ2V0IiArIHByb3BUeXBlICsgIigiICsgcHJvcFZhciArICIpOyIpOwotICAgICAgICBTdHJpbmcgc2V0TWV0aG9kID0gVXRpbC5nZXRQcmVmaXhlZFByb3BlcnR5TmFtZSgic2V0IiwgcHJvcE5hbWUpOwotICAgICAgICBvdXQucHJpbnRsbigiY29udmVydGVyLiIgKyBzZXRNZXRob2QgKyAiKHZhbHVlKTsiKTsKLSAgICAgICAgaWYgKCJTdHJpbmdBcnJheSIuZXF1YWxzKHByb3BUeXBlKSkKLSAgICAgICAgewotICAgICAgICAgIG91dC5wcmludGxuKCJ9Iik7Ci0gICAgICAgICAgb3V0LnByaW50bG4oImNhdGNoIChQYXJzZUV4Y2VwdGlvbiBwZSkiKTsKLSAgICAgICAgICBvdXQucHJpbnRsbigieyIpOwotICAgICAgICAgIG91dC5pbmRlbnQoKTsKLSAgICAgICAgICBvdXQucHJpbnRsbigidGhyb3cgbmV3IEpzcEV4Y2VwdGlvbigiKTsKLSAgICAgICAgICBvdXQucHJpbnRsbigiICBwZS5nZXRNZXNzYWdlKCkgKyBcIjogXCIgKyBcIlBvc2l0aW9uIFwiICsgcGUuZ2V0RXJyb3JPZmZzZXQoKSk7Iik7Ci0gICAgICAgICAgb3V0LnVuaW5kZW50KCk7Ci0gICAgICAgICAgb3V0LnByaW50bG4oIn0iKTsKLSAgICAgICAgfQotICAgICAgICBvdXQudW5pbmRlbnQoKTsKLSAgICAgICAgb3V0LnByaW50bG4oIn0iKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBvdXQudW5pbmRlbnQoKTsKLSAgICBvdXQucHJpbnRsbigifSIpOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy9nZW5lcmF0b3IvdGFnbGliL1RyaW5pZGFkVmFsaWRhdG9yVGFnR2VuZXJhdG9yLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvZ2VuZXJhdG9yL3RhZ2xpYi9UcmluaWRhZFZhbGlkYXRvclRhZ0dlbmVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDhiN2JlLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy9nZW5lcmF0b3IvdGFnbGliL1RyaW5pZGFkVmFsaWRhdG9yVGFnR2VuZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzcgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLmdlbmVyYXRvci50YWdsaWI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLmlvLlByZXR0eVdyaXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLnBhcnNlLlByb3BlcnR5QmVhbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLnBhcnNlLlZhbGlkYXRvckJlYW47Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy51dGlsLlV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5UcmVlU2V0OwotCi1wdWJsaWMgY2xhc3MgVHJpbmlkYWRWYWxpZGF0b3JUYWdHZW5lcmF0b3IgZXh0ZW5kcyBBYnN0cmFjdFZhbGlkYXRvclRhZ0dlbmVyYXRvciB7Ci0KLSAgcHVibGljIFRyaW5pZGFkVmFsaWRhdG9yVGFnR2VuZXJhdG9yKGJvb2xlYW4gX2lzMTIsIFN0cmluZyBfbGljZW5zZUhlYWRlciwgTG9nIF9sb2cpIHsKLSAgICBzdXBlcihfaXMxMiwgX2xpY2Vuc2VIZWFkZXIsIF9sb2cpOwotICB9Ci0KLSAgcHJvdGVjdGVkIFNldCBjcmVhdGVJbXBvcnRzKFZhbGlkYXRvckJlYW4gdmFsaWRhdG9yKSB7Ci0gICAgU2V0IGltcG9ydHMgPSBuZXcgVHJlZVNldCgpOwotCi0gICAgaWYgKGlzMTIoKSkKLSAgICB7Ci0gICAgICBpbXBvcnRzLmFkZCgiamF2YXguZmFjZXMud2ViYXBwLlZhbGlkYXRvckVMVGFnIik7Ci0gICAgICBpbXBvcnRzLmFkZCgiamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQiKTsKLSAgICAgIGltcG9ydHMuYWRkKCJqYXZheC5mYWNlcy5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbiIpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgaW1wb3J0cy5hZGQoImphdmF4LmZhY2VzLndlYmFwcC5WYWxpZGF0b3JUYWciKTsKLSAgICB9Ci0gICAgaW1wb3J0cy5hZGQoImphdmF4LnNlcnZsZXQuanNwLkpzcEV4Y2VwdGlvbiIpOwotICAgIGltcG9ydHMuYWRkKHZhbGlkYXRvci5nZXRWYWxpZGF0b3JDbGFzcygpKTsKLQotICAgIGltcG9ydHMuYWRkKCJqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yIik7Ci0KLSAgICBpZiAoaXMxMigpKQotICAgIHsKLSAgICAgIGltcG9ydHMuYWRkKCJqYXZheC5lbC5WYWx1ZUV4cHJlc3Npb24iKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGltcG9ydHMuYWRkKCJqYXZheC5mYWNlcy5lbC5WYWx1ZUJpbmRpbmciKTsKLSAgICB9Ci0gICAgaW1wb3J0cy5hZGQoIm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZGludGVybmFsLnRhZ2xpYi51dGlsLlRhZ1V0aWxzIik7Ci0KLQotICAgIGFkZEltcG9ydHNGcm9tUHJvcGVydGVzKHZhbGlkYXRvciwgaW1wb3J0cyk7Ci0gICAgcmV0dXJuIGltcG9ydHM7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCB3cml0ZVNldFByb3BlcnR5KAotICAgIFByZXR0eVdyaXRlciBvdXQsCi0gICAgUHJvcGVydHlCZWFuIHByb3BlcnR5KQotICB7Ci0gICAgU3RyaW5nIHByb3BOYW1lID0gcHJvcGVydHkuZ2V0UHJvcGVydHlOYW1lKCk7Ci0gICAgU3RyaW5nIHByb3BGdWxsQ2xhc3MgPSBwcm9wZXJ0eS5nZXRQcm9wZXJ0eUNsYXNzKCk7Ci0gICAgU3RyaW5nIHByb3BDbGFzcyA9IFV0aWwuZ2V0Q2xhc3NGcm9tRnVsbENsYXNzKHByb3BGdWxsQ2xhc3MpOwotICAgIFN0cmluZyBwcm9wVmFyID0gIl8iICsgVXRpbC5nZXRWYXJpYWJsZUZyb21OYW1lKHByb3BOYW1lKTsKLSAgICBvdXQucHJpbnRsbigiaWYgKCIgKyBwcm9wVmFyICsgIiAhPSBudWxsKSIpOwotICAgIG91dC5wcmludGxuKCJ7Iik7Ci0gICAgb3V0LmluZGVudCgpOwotICAgIGlmIChpczEyKCkpCi0gICAgewotICAgICAgb3V0LnByaW50bG4oImlmICghIiArIHByb3BWYXIgKyAiLmlzTGl0ZXJhbFRleHQoKSkiKTsKLSAgICAgIG91dC5wcmludGxuKCJ7Iik7Ci0gICAgICBvdXQuaW5kZW50KCk7Ci0gICAgICBvdXQucHJpbnRsbigidmFsaWRhdG9yLnNldFZhbHVlRXhwcmVzc2lvbihcIiIgKyBwcm9wTmFtZSArICJcIiwgIiArCi0gICAgICAgICAgICAgICAgICBwcm9wVmFyICsgIik7Iik7Ci0gICAgICBvdXQudW5pbmRlbnQoKTsKLSAgICAgIG91dC5wcmludGxuKCJ9Iik7Ci0gICAgICBTdHJpbmcgcHJvcFR5cGUgPSBudWxsOwotICAgICAgaWYgKCJEYXRlIi5lcXVhbHMgKHByb3BDbGFzcykpIAotICAgICAgewotICAgICAgICBwcm9wVHlwZSA9IHJlc29sdmVEYXRlVHlwZShwcm9wRnVsbENsYXNzLCBwcm9wZXJ0eS5nZXRVc2VNYXhUaW1lKCkpOyAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgfQotICAgICAgZWxzZSAKLSAgICAgIHsKLSAgICAgICAgcHJvcFR5cGUgPSByZXNvbHZlVHlwZShwcm9wRnVsbENsYXNzKTsgICAgICAgICAgICAKLSAgICAgIH0KLSAgICAgIGlmIChwcm9wVHlwZSAhPSBudWxsKQotICAgICAgewotICAgICAgICBvdXQucHJpbnRsbigiZWxzZSIpOwotICAgICAgICBvdXQucHJpbnRsbigieyIpOwotICAgICAgICBvdXQuaW5kZW50KCk7Ci0gICAgICAgIGlmICgiU3RyaW5nQXJyYXkiLmVxdWFscyhwcm9wVHlwZSkpCi0gICAgICAgIHsKLSAgICAgICAgICBvdXQucHJpbnRsbigidHJ5Iik7Ci0gICAgICAgICAgb3V0LnByaW50bG4oInsiKTsKLSAgICAgICAgfQotCi0gICAgICAgIG91dC5wcmludGxuKHByb3BDbGFzcyArICIgdmFsdWUgPSBUYWdVdGlscy5nZXQiICsgcHJvcFR5cGUgKyAiKCIgKyBwcm9wVmFyICsgIi5nZXRWYWx1ZShudWxsKSk7Iik7Ci0gICAgICAgIFN0cmluZyBzZXRNZXRob2QgPSBVdGlsLmdldFByZWZpeGVkUHJvcGVydHlOYW1lKCJzZXQiLCBwcm9wTmFtZSk7Ci0gICAgICAgIG91dC5wcmludGxuKCJ2YWxpZGF0b3IuIiArIHNldE1ldGhvZCArICIodmFsdWUpOyIpOwotICAgICAgICBpZiAoIlN0cmluZ0FycmF5Ii5lcXVhbHMocHJvcFR5cGUpKQotICAgICAgICB7Ci0gICAgICAgICAgb3V0LnByaW50bG4oIn0iKTsKLSAgICAgICAgICBvdXQucHJpbnRsbigiY2F0Y2ggKFBhcnNlRXhjZXB0aW9uIHBlKSIpOwotICAgICAgICAgIG91dC5wcmludGxuKCJ7Iik7Ci0gICAgICAgICAgb3V0LmluZGVudCgpOwotICAgICAgICAgIG91dC5wcmludGxuKCJ0aHJvdyBuZXcgSnNwRXhjZXB0aW9uKCIpOwotICAgICAgICAgIG91dC5wcmludGxuKCIgIHBlLmdldE1lc3NhZ2UoKSArIFwiOiBcIiArIFwiUG9zaXRpb24gXCIgKyBwZS5nZXRFcnJvck9mZnNldCgpKTsiKTsKLSAgICAgICAgICBvdXQudW5pbmRlbnQoKTsKLSAgICAgICAgICBvdXQucHJpbnRsbigifSIpOwotICAgICAgICB9Ci0gICAgICAgIG91dC51bmluZGVudCgpOwotICAgICAgICBvdXQucHJpbnRsbigifSIpOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgb3V0LnByaW50bG4oImlmIChUYWdVdGlscy5pc1ZhbHVlUmVmZXJlbmNlKCIgKyBwcm9wVmFyICsgIikpIik7Ci0gICAgICBvdXQucHJpbnRsbigieyIpOwotICAgICAgb3V0LmluZGVudCgpOwotICAgICAgb3V0LnByaW50bG4oIlZhbHVlQmluZGluZyB2YiA9IFRhZ1V0aWxzLmdldFZhbHVlQmluZGluZygiICsgcHJvcFZhciArICIpOyIpOwotICAgICAgb3V0LnByaW50bG4oInZhbGlkYXRvci5zZXRWYWx1ZUJpbmRpbmcoXCIiICsgcHJvcE5hbWUgKyAiXCIsIHZiKTsiKTsKLSAgICAgIG91dC51bmluZGVudCgpOwotICAgICAgb3V0LnByaW50bG4oIn0iKTsKLSAgICAgIFN0cmluZyBwcm9wVHlwZSA9IG51bGw7Ci0gICAgICBpZiAoIkRhdGUiLmVxdWFscyAocHJvcENsYXNzKSkgCi0gICAgICB7Ci0gICAgICAgIHByb3BUeXBlID0gcmVzb2x2ZURhdGVUeXBlKHByb3BGdWxsQ2xhc3MsIHByb3BlcnR5LmdldFVzZU1heFRpbWUoKSk7ICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICB9Ci0gICAgICBlbHNlIAotICAgICAgewotICAgICAgICBwcm9wVHlwZSA9IHJlc29sdmVUeXBlKHByb3BGdWxsQ2xhc3MpOyAgICAgICAgICAgIAotICAgICAgfQotICAgICAgaWYgKHByb3BUeXBlICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIG91dC5wcmludGxuKCJlbHNlIik7Ci0gICAgICAgIG91dC5wcmludGxuKCJ7Iik7Ci0gICAgICAgIG91dC5pbmRlbnQoKTsKLSAgICAgICAgaWYgKCJTdHJpbmdBcnJheSIuZXF1YWxzKHByb3BUeXBlKSkKLSAgICAgICAgewotICAgICAgICAgIG91dC5wcmludGxuKCJ0cnkiKTsKLSAgICAgICAgICBvdXQucHJpbnRsbigieyIpOwotICAgICAgICB9Ci0gICAgICAgIG91dC5wcmludGxuKHByb3BDbGFzcyArICIgdmFsdWUgPSBUYWdVdGlscy5nZXQiICsgcHJvcFR5cGUgKyAiKCIgKyBwcm9wVmFyICsgIik7Iik7Ci0gICAgICAgIFN0cmluZyBzZXRNZXRob2QgPSBVdGlsLmdldFByZWZpeGVkUHJvcGVydHlOYW1lKCJzZXQiLCBwcm9wTmFtZSk7Ci0gICAgICAgIG91dC5wcmludGxuKCJ2YWxpZGF0b3IuIiArIHNldE1ldGhvZCArICIodmFsdWUpOyIpOwotICAgICAgICBpZiAoIlN0cmluZ0FycmF5Ii5lcXVhbHMocHJvcFR5cGUpKQotICAgICAgICB7Ci0gICAgICAgICAgb3V0LnByaW50bG4oIn0iKTsKLSAgICAgICAgICBvdXQucHJpbnRsbigiY2F0Y2ggKFBhcnNlRXhjZXB0aW9uIHBlKSIpOwotICAgICAgICAgIG91dC5wcmludGxuKCJ7Iik7Ci0gICAgICAgICAgb3V0LmluZGVudCgpOwotICAgICAgICAgIG91dC5wcmludGxuKCJ0aHJvdyBuZXcgSnNwRXhjZXB0aW9uKCIpOwotICAgICAgICAgIG91dC5wcmludGxuKCIgIHBlLmdldE1lc3NhZ2UoKSArIFwiOiBcIiArIFwiUG9zaXRpb24gXCIgKyBwZS5nZXRFcnJvck9mZnNldCgpKTsiKTsKLSAgICAgICAgICBvdXQudW5pbmRlbnQoKTsKLSAgICAgICAgICBvdXQucHJpbnRsbigifSIpOwotICAgICAgICB9Ci0gICAgICAgIG91dC51bmluZGVudCgpOwotICAgICAgICBvdXQucHJpbnRsbigifSIpOwotICAgICAgfQotICAgIH0KLQotICAgIG91dC51bmluZGVudCgpOwotICAgIG91dC5wcmludGxuKCJ9Iik7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy9pby9QcmV0dHlXcml0ZXIuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy9pby9QcmV0dHlXcml0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTVkZjYzYy4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvaW8vUHJldHR5V3JpdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDEgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLmlvOwotCi1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLldyaXRlcjsKLQotcHVibGljIGNsYXNzIFByZXR0eVdyaXRlciBleHRlbmRzIFByaW50V3JpdGVyCi17Ci0gIHB1YmxpYyBQcmV0dHlXcml0ZXIoCi0gICAgT3V0cHV0U3RyZWFtIG91dCkKLSAgewotICAgIHN1cGVyKG91dCk7Ci0gIH0KLQotICBwdWJsaWMgUHJldHR5V3JpdGVyKAotICAgIE91dHB1dFN0cmVhbSBvdXQsCi0gICAgYm9vbGVhbiAgICAgIGF1dG9GbHVzaCkKLSAgewotICAgIHN1cGVyKG91dCwgYXV0b0ZsdXNoKTsKLSAgfQotCi0gIHB1YmxpYyBQcmV0dHlXcml0ZXIoCi0gICAgV3JpdGVyIG91dCkKLSAgewotICAgIHN1cGVyKG91dCk7Ci0gIH0KLQotICBwdWJsaWMgUHJldHR5V3JpdGVyKAotICAgIFdyaXRlciAgb3V0LAotICAgIGJvb2xlYW4gYXV0b0ZsdXNoKQotICB7Ci0gICAgc3VwZXIob3V0LCBhdXRvRmx1c2gpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgaW5kZW50KCkKLSAgewotICAgIF9pbmRlbnRhdGlvbiArKzsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHVuaW5kZW50KCkKLSAgewotICAgIF9pbmRlbnRhdGlvbiAtLTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHdyaXRlKAotICAgIFN0cmluZyBzdHJpbmcsCi0gICAgaW50ICAgIG9mZnNldCwKLSAgICBpbnQgICAgbGVuZ3RoKQotICB7Ci0gICAgaWYgKF91bmxhdGNoUGVuZGluZygpKQotICAgIHsKLSAgICAgIGZvciAoaW50IGk9MDsgaSA8IF9pbmRlbnRhdGlvbjsgaSsrKQotICAgICAgewotICAgICAgICBzdXBlci53cml0ZShfVEFCX0lOREVOVCwgMCwgMik7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgc3VwZXIud3JpdGUoc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB3cml0ZSgKLSAgICBjaGFyW10gY2hhcnMsCi0gICAgaW50ICAgIG9mZnNldCwKLSAgICBpbnQgICAgbGVuZ3RoKQotICB7Ci0gICAgaWYgKF91bmxhdGNoUGVuZGluZygpKQotICAgIHsKLSAgICAgIGZvciAoaW50IGk9MDsgaSA8IF9pbmRlbnRhdGlvbjsgaSsrKQotICAgICAgewotICAgICAgICBzdXBlci53cml0ZShfVEFCX0lOREVOVF9DSEFSUywgMCwgMik7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgc3VwZXIud3JpdGUoY2hhcnMsIG9mZnNldCwgbGVuZ3RoKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHByaW50bG4oKQotICB7Ci0gICAgc3VwZXIucHJpbnRsbigpOwotICAgIF9sYXRjaFBlbmRpbmcoKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHByaW50bG4oCi0gICAgYm9vbGVhbiB4KQotICB7Ci0gICAgc3VwZXIucHJpbnRsbih4KTsKLSAgICBfbGF0Y2hQZW5kaW5nKCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBwcmludGxuKAotICAgIGNoYXIgeCkKLSAgewotICAgIHN1cGVyLnByaW50bG4oeCk7Ci0gICAgX2xhdGNoUGVuZGluZygpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgcHJpbnRsbigKLSAgICBpbnQgeCkKLSAgewotICAgIHN1cGVyLnByaW50bG4oeCk7Ci0gICAgX2xhdGNoUGVuZGluZygpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgcHJpbnRsbigKLSAgICBsb25nIHgpCi0gIHsKLSAgICBzdXBlci5wcmludGxuKHgpOwotICAgIF9sYXRjaFBlbmRpbmcoKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHByaW50bG4oCi0gICAgZmxvYXQgeCkKLSAgewotICAgIHN1cGVyLnByaW50bG4oeCk7Ci0gICAgX2xhdGNoUGVuZGluZygpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgcHJpbnRsbigKLSAgICBkb3VibGUgeCkKLSAgewotICAgIHN1cGVyLnByaW50bG4oeCk7Ci0gICAgX2xhdGNoUGVuZGluZygpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgcHJpbnRsbigKLSAgICBjaGFyW10geCkKLSAgewotICAgIHN1cGVyLnByaW50bG4oeCk7Ci0gICAgX2xhdGNoUGVuZGluZygpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgcHJpbnRsbigKLSAgICBTdHJpbmcgeCkKLSAgewotICAgIGludCBmcm9tSW5kZXggPSAwOwotICAgIGZvciAoaW50IGluZGV4ID0geC5pbmRleE9mKCdcbicpOwotICAgICAgICAgaW5kZXggIT0gLTEgICYmIGluZGV4ICsgMSA8IHgubGVuZ3RoKCk7Ci0gICAgICAgICBmcm9tSW5kZXggPSBpbmRleCArIDEsCi0gICAgICAgICBpbmRleCA9IHguaW5kZXhPZignXG4nLCBmcm9tSW5kZXgpKQotICAgIHsKLSAgICAgIHN1cGVyLnByaW50bG4oeC5zdWJzdHJpbmcoZnJvbUluZGV4LCBpbmRleCkpOwotICAgICAgX2xhdGNoUGVuZGluZygpOwotICAgIH0KLQotICAgIHN1cGVyLnByaW50bG4oeC5zdWJzdHJpbmcoZnJvbUluZGV4KSk7Ci0gICAgX2xhdGNoUGVuZGluZygpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgcHJpbnRsbigKLSAgICBPYmplY3QgeCkKLSAgewotICAgIHN1cGVyLnByaW50bG4oeCk7Ci0gICAgX2xhdGNoUGVuZGluZygpOwotICB9Ci0KLSAgcHJpdmF0ZSBib29sZWFuIF91bmxhdGNoUGVuZGluZygpCi0gIHsKLSAgICBib29sZWFuIHBlbmRpbmcgPSBfcGVuZGluZzsKLSAgICBpZiAocGVuZGluZykKLSAgICB7Ci0gICAgICBfcGVuZGluZyA9IGZhbHNlOwotICAgIH0KLQotICAgIHJldHVybiBwZW5kaW5nOwotICB9Ci0KLSAgcHJpdmF0ZSBib29sZWFuIF9sYXRjaFBlbmRpbmcoKQotICB7Ci0gICAgYm9vbGVhbiBwZW5kaW5nID0gX3BlbmRpbmc7Ci0gICAgaWYgKCFwZW5kaW5nKQotICAgIHsKLSAgICAgIF9wZW5kaW5nID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gIXBlbmRpbmc7Ci0gIH0KLQotICBwcml2YXRlIGludCBfaW5kZW50YXRpb247Ci0gIHByaXZhdGUgYm9vbGVhbiBfcGVuZGluZyA9IHRydWU7Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIF9UQUJfSU5ERU5UID0gIiAgIjsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhcltdIF9UQUJfSU5ERU5UX0NIQVJTID0gX1RBQl9JTkRFTlQudG9DaGFyQXJyYXkoKTsKLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy9wYXJzZS9BYnN0cmFjdFRhZ0JlYW4uamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy9wYXJzZS9BYnN0cmFjdFRhZ0JlYW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTRjNmZkNS4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvcGFyc2UvQWJzdHJhY3RUYWdCZWFuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjkgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLnBhcnNlOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaE1hcDsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllcjsKLQotcHVibGljIGNsYXNzIEFic3RyYWN0VGFnQmVhbiBleHRlbmRzIE9iamVjdEJlYW4gewotICBwcml2YXRlIFN0cmluZyAgX2Rlc2NyaXB0aW9uOwotICBwcml2YXRlIFN0cmluZyAgX2xvbmdEZXNjcmlwdGlvbjsKLSAgcHJpdmF0ZSBRTmFtZSAgIF90YWdOYW1lOwotICBwcml2YXRlIFN0cmluZyAgX3RhZ0NsYXNzOwotICBwcm90ZWN0ZWQgTWFwIF9wcm9wZXJ0aWVzOwotICBwcml2YXRlIGludCAgICAgX3RhZ0NsYXNzTW9kaWZpZXJzOwotCi0gIHB1YmxpYyBBYnN0cmFjdFRhZ0JlYW4oKSB7Ci0gICAgX3Byb3BlcnRpZXMgPSBuZXcgTGlua2VkSGFzaE1hcCgpOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIGRlc2NyaXB0aW9uIG9mIHRoaXMgcHJvcGVydHkuCi0gICAqCi0gICAqIEBwYXJhbSBkZXNjcmlwdGlvbiAgdGhlIHByb3BlcnR5IGRlc2NyaXB0aW9uCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbigKLSAgICBTdHJpbmcgZGVzY3JpcHRpb24pCi0gIHsKLSAgICBfZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGlzIHByb3BlcnR5LgotICAgKgotICAgKiBAcmV0dXJuICB0aGUgcHJvcGVydHkgZGVzY3JpcHRpb24KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKQotICB7Ci0gICAgcmV0dXJuIF9kZXNjcmlwdGlvbjsKLSAgfQotCi0gIC8qKgotICAgKiBTZXRzIHRoZSBsb25nIGRlc2NyaXB0aW9uIG9mIHRoaXMgcHJvcGVydHkuCi0gICAqCi0gICAqIEBwYXJhbSBsb25nRGVzY3JpcHRpb24gIHRoZSBsb25nIHByb3BlcnR5IGRlc2NyaXB0aW9uCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRMb25nRGVzY3JpcHRpb24oCi0gICAgU3RyaW5nIGxvbmdEZXNjcmlwdGlvbikKLSAgewotICAgIF9sb25nRGVzY3JpcHRpb24gPSBsb25nRGVzY3JpcHRpb247Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbG9uZyBkZXNjcmlwdGlvbiBvZiB0aGlzIHByb3BlcnR5LgotICAgKgotICAgKiBAcmV0dXJuICB0aGUgbG9uZyBwcm9wZXJ0eSBkZXNjcmlwdGlvbgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRMb25nRGVzY3JpcHRpb24oKQotICB7Ci0gICAgcmV0dXJuIF9sb25nRGVzY3JpcHRpb247Ci0gIH0KLQotICAvKioKLSAgICogU2V0cyB0aGUgSlNQIHRhZyBoYW5kbGVyIGNsYXNzIGZvciB0aGlzIGNvbXBvbmVudC4KLSAgICoKLSAgICogQHBhcmFtIHRhZ0NsYXNzICB0aGUgSlNQIHRhZyBoYW5kbGVyIGNsYXNzCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRUYWdDbGFzcygKLSAgICBTdHJpbmcgdGFnQ2xhc3MpCi0gIHsKLSAgICBfdGFnQ2xhc3MgPSB0YWdDbGFzczsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBKU1AgdGFnIGhhbmRsZXIgY2xhc3MgZm9yIHRoaXMgY29tcG9uZW50LgotICAgKgotICAgKiBAcmV0dXJuICB0aGUgSlNQIHRhZyBoYW5kbGVyIGNsYXNzCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFRhZ0NsYXNzKCkKLSAgewotICAgIHJldHVybiBfdGFnQ2xhc3M7Ci0gIH0KLQotICAvKioKLSAgICogU2V0cyB0aGUgSlNQIHRhZyBuYW1lIGZvciB0aGlzIGNvbXBvbmVudC4KLSAgICoKLSAgICogQHBhcmFtIHRhZ05hbWUgIHRoZSBKU1AgdGFnIG5hbWUKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFRhZ05hbWUoCi0gICAgICBRTmFtZSB0YWdOYW1lKQotICB7Ci0gICAgX3RhZ05hbWUgPSB0YWdOYW1lOwotICB9Ci0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgSlNQIHRhZyBuYW1lIGZvciB0aGlzIGNvbXBvbmVudC4KLSAgICoKLSAgICogQHJldHVybiAgdGhlIEpTUCB0YWcgbmFtZQotICAgKi8KLSAgcHVibGljIFFOYW1lIGdldFRhZ05hbWUoKQotICB7Ci0gICAgcmV0dXJuIF90YWdOYW1lOwotICB9Ci0KLSAgLyoqCi0gICAqIEFkZHMgYSBwcm9wZXJ0eSB0byB0aGlzIGNvbXBvbmVudC4KLSAgICoKLSAgICogQHBhcmFtIHByb3BlcnR5ICB0aGUgcHJvcGVydHkgdG8gYWRkCi0gICAqLwotICBwdWJsaWMgdm9pZCBhZGRQcm9wZXJ0eSgKLSAgICBQcm9wZXJ0eUJlYW4gcHJvcGVydHkpCi0gIHsKLSAgICBfcHJvcGVydGllcy5wdXQocHJvcGVydHkuZ2V0UHJvcGVydHlOYW1lKCksIHByb3BlcnR5KTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBwcm9wZXJ0eSBmb3IgdGhpcyBwcm9wZXJ0eSBuYW1lLgotICAgKgotICAgKiBAcGFyYW0gcHJvcGVydHlOYW1lICB0aGUgcHJvcGVydHkgbmFtZSB0byBmaW5kCi0gICAqLwotICBwdWJsaWMgUHJvcGVydHlCZWFuIGZpbmRQcm9wZXJ0eSgKLSAgICBTdHJpbmcgcHJvcGVydHlOYW1lKQotICB7Ci0gICAgcmV0dXJuIChQcm9wZXJ0eUJlYW4pX3Byb3BlcnRpZXMuZ2V0KHByb3BlcnR5TmFtZSk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgY29tcG9uZW50IGhhcyBhbnkgcHJvcGVydGllcy4KLSAgICoKLSAgICogQHJldHVybiAgdHJ1ZSAgIGlmIHRoaXMgY29tcG9uZW50IGhhcyBhbnkgcHJvcGVydGllcywKLSAgICogICAgICAgICAgZmFsc2UgIG90aGVyd2lzZQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaGFzUHJvcGVydGllcygpCi0gIHsKLSAgICByZXR1cm4gIV9wcm9wZXJ0aWVzLmlzRW1wdHkoKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIGFuIGl0ZXJhdG9yIGZvciBhbGwgcHJvcGVydGllcyBvbiB0aGlzIGNvbXBvbmVudCBvbmx5LgotICAgKgotICAgKiBAcmV0dXJuICB0aGUgcHJvcGVydHkgaXRlcmF0b3IKLSAgICovCi0gIHB1YmxpYyBJdGVyYXRvciBwcm9wZXJ0aWVzKCkKLSAgewotICAgIHJldHVybiBfcHJvcGVydGllcy52YWx1ZXMoKS5pdGVyYXRvcigpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgcGFyc2VUYWdDbGFzc01vZGlmaWVyKAotICAgIFN0cmluZyBtb2RpZmllcikKLSAgewotICAgIGFkZFRhZ0NsYXNzTW9kaWZpZXIoX3BhcnNlTW9kaWZpZXIobW9kaWZpZXIpKTsKLSAgfQotCi0gIHByb3RlY3RlZCBpbnQgX3BhcnNlTW9kaWZpZXIoCi0gICAgU3RyaW5nIHRleHQpCi0gIHsKLSAgICBpZiAoInB1YmxpYyIuZXF1YWxzKHRleHQpKQotICAgICAgcmV0dXJuIE1vZGlmaWVyLlBVQkxJQzsKLSAgICBlbHNlIGlmICgicHJvdGVjdGVkIi5lcXVhbHModGV4dCkpCi0gICAgICByZXR1cm4gTW9kaWZpZXIuUFJPVEVDVEVEOwotICAgIGVsc2UgaWYgKCJwcml2YXRlIi5lcXVhbHModGV4dCkpCi0gICAgICByZXR1cm4gTW9kaWZpZXIuUFJJVkFURTsKLSAgICBlbHNlIGlmICgiYWJzdHJhY3QiLmVxdWFscyh0ZXh0KSkKLSAgICAgIHJldHVybiBNb2RpZmllci5BQlNUUkFDVDsKLSAgICBlbHNlIGlmICgiZmluYWwiLmVxdWFscyh0ZXh0KSkKLSAgICAgIHJldHVybiBNb2RpZmllci5GSU5BTDsKLQotICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlVucmVjb2duaXplZCBtb2RpZmllcjogIiArIHRleHQpOwotICB9Ci0KLSAgLyoqCi0gICAqIEFkZHMgYSBKYXZhIExhbmd1YWdlIGNsYXNzIG1vZGlmaWVyIHRvIHRoZSB0YWcgY2xhc3MuCi0gICAqCi0gICAqIEBwYXJhbSBtb2RpZmllciAgdGhlIG1vZGlmaWVyIHRvIGJlIGFkZGVkCi0gICAqLwotICBwdWJsaWMgdm9pZCBhZGRUYWdDbGFzc01vZGlmaWVyKAotICAgIGludCBtb2RpZmllcikKLSAgewotICAgIF90YWdDbGFzc01vZGlmaWVycyB8PSBtb2RpZmllcjsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBKYXZhIExhbmd1YWdlIGNsYXNzIG1vZGlmaWVycyBmb3IgdGhlIHRhZyBjbGFzcy4KLSAgICogQnkgZGVmYXVsdCwgdGhlc2UgbW9kaWZpZXJzIGluY2x1ZGUgTW9kaWZpZXIuUFVCTElDLgotICAgKgotICAgKiBAcmV0dXJuICB0aGUgSmF2YSBMYW5ndWFnZSBjbGFzcyBtb2RpZmllcnMgZm9yIHRoZSB0YWcgY2xhc3MKLSAgICovCi0gIHB1YmxpYyBpbnQgZ2V0VGFnQ2xhc3NNb2RpZmllcnMoKQotICB7Ci0gICAgaW50IG1vZGlmaWVycyA9IF90YWdDbGFzc01vZGlmaWVyczsKLQotICAgIGlmICghTW9kaWZpZXIuaXNQcml2YXRlKG1vZGlmaWVycykgJiYKLSAgICAgICAgIU1vZGlmaWVyLmlzUHJvdGVjdGVkKG1vZGlmaWVycykgJiYKLSAgICAgICAgIU1vZGlmaWVyLmlzUHVibGljKG1vZGlmaWVycykpCi0gICAgewotICAgICAgbW9kaWZpZXJzIHw9IE1vZGlmaWVyLlBVQkxJQzsKLSAgICB9Ci0KLSAgICByZXR1cm4gbW9kaWZpZXJzOwotICB9Ci0KLSAvKioKLSAgKiBOdW1iZXIgb2YgcHJvcGVydGllcyBmb3IgdGhpcyBjb21wb25lbnQKLSAgKiBAcmV0dXJuIG51bSBvZiBwcm9wZXJ0aWVzCi0gICovCi0gIHB1YmxpYyBpbnQgcHJvcGVydGllc1NpemUoKQotICB7Ci0gICAgcmV0dXJuIF9wcm9wZXJ0aWVzLnNpemUoKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL3BhcnNlL0F0dHJpYnV0ZUJlYW4uamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy9wYXJzZS9BdHRyaWJ1dGVCZWFuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0YjM4NTUuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL3BhcnNlL0F0dHJpYnV0ZUJlYW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyNSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMucGFyc2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwucmVnZXguTWF0Y2hlcjsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKLWltcG9ydCBqYXZhLmxhbmcuQ29tcGFyYWJsZTsKLQotLyoqCi0gKiBBdHRyaWJ1dGVCZWFuIGlzIGEgSmF2YSByZXByZXNlbnRhdGlvbiBvZiB0aGUgZmFjZXMtY29uZmlnIGNvbXBvbmVudCBvcgotICogcmVuZGVyZXIgYXR0cmlidXRlIFhNTCBlbGVtZW50LgotICovCi1wdWJsaWMgY2xhc3MgQXR0cmlidXRlQmVhbiBleHRlbmRzIE9iamVjdEJlYW4gaW1wbGVtZW50cyBDb21wYXJhYmxlCi17Ci0gIC8qKgotICAgKiBTZXRzIHRoZSBuYW1lIG9mIHRoaXMgYXR0cmlidXRlLgotICAgKgotICAgKiBAcGFyYW0gYXR0cmlidXRlTmFtZSAgdGhlIGF0dHJpYnV0ZSBuYW1lCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRBdHRyaWJ1dGVOYW1lKAotICAgIFN0cmluZyBhdHRyaWJ1dGVOYW1lKQotICB7Ci0gICAgX2F0dHJpYnV0ZU5hbWUgPSBhdHRyaWJ1dGVOYW1lOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhpcyBhdHRyaWJ1dGUuCi0gICAqCi0gICAqIEByZXR1cm4gIHRoZSBhdHRyaWJ1dGUgbmFtZQotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGVOYW1lKCkKLSAgewotICAgIHJldHVybiBfYXR0cmlidXRlTmFtZTsKLSAgfQotCi0gIC8qKgotICAgKiBTZXRzIHRoZSBhdHRyaWJ1dGUgY2xhc3MgZm9yIHRoaXMgYXR0cmlidXRlLgotICAgKgotICAgKiBAcGFyYW0gYXR0cmlidXRlQ2xhc3MgIHRoZSBhdHRyaWJ1dGUgY2xhc3MKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZUNsYXNzKAotICAgIFN0cmluZyBhdHRyaWJ1dGVDbGFzcykKLSAgewotICAgIE1hdGNoZXIgbWF0Y2hlciA9IF9HRU5FUklDX1RZUEUubWF0Y2hlcihhdHRyaWJ1dGVDbGFzcyk7Ci0KLSAgICBpZiAobWF0Y2hlci5tYXRjaGVzKCkpCi0gICAgewotICAgICAgX2F0dHJpYnV0ZUNsYXNzID0gbWF0Y2hlci5ncm91cCgxKTsKLSAgICAgIF9hdHRyaWJ1dGVDbGFzc1BhcmFtZXRlcnMgPSBtYXRjaGVyLmdyb3VwKDIpLnNwbGl0KCIsIik7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBfYXR0cmlidXRlQ2xhc3MgPSBhdHRyaWJ1dGVDbGFzczsKLSAgICAgIF9hdHRyaWJ1dGVDbGFzc1BhcmFtZXRlcnMgPSBfRU1QVFlfQVJSQVk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGFycmF5IG9mIHBhcmFtZXRlcml6ZWQgdHlwZXMgZm9yIHRoaXMgYXR0cmlidXRlCi0gICAqIGlmIGl0IHVzZXMgZ2VuZXJpY3MuCi0gICAqCi0gICAqIEByZXR1cm4gdGhlIGFycmF5IG9mIHBhcmFtZXRlcml6ZWQgdHlwZXMgZm9yIHRoaXMgYXR0cmlidXRlCi0gICAqLwotICBwdWJsaWMgU3RyaW5nW10gZ2V0QXR0cmlidXRlQ2xhc3NQYXJhbWV0ZXJzKCkKLSAgewotICAgIHJldHVybiBfYXR0cmlidXRlQ2xhc3NQYXJhbWV0ZXJzOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGF0dHJpYnV0ZSBjbGFzcyBmb3IgdGhpcyBhdHRyaWJ1dGUuCi0gICAqCi0gICAqIEByZXR1cm4gIHRoZSBhdHRyaWJ1dGUgY2xhc3MKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlQ2xhc3MoKQotICB7Ci0gICAgcmV0dXJuIF9hdHRyaWJ1dGVDbGFzczsKLSAgfQotCi0gIC8qKgotICAgKiBTZXRzIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGlzIGF0dHJpYnV0ZS4KLSAgICoKLSAgICogQHBhcmFtIGRlc2NyaXB0aW9uICB0aGUgYXR0cmlidXRlIGRlc2NyaXB0aW9uCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbigKLSAgICBTdHJpbmcgZGVzY3JpcHRpb24pCi0gIHsKLSAgICBfZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGlzIGF0dHJpYnV0ZS4KLSAgICoKLSAgICogQHJldHVybiAgdGhlIGF0dHJpYnV0ZSBkZXNjcmlwdGlvbgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpCi0gIHsKLSAgICByZXR1cm4gX2Rlc2NyaXB0aW9uOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhpcyBhdHRyaWJ1dGUuCi0gICAqCi0gICAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgIHRoZSBhdHRyaWJ1dGUgZGVmYXVsdCB2YWx1ZQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0RGVmYXVsdFZhbHVlKAotICAgIFN0cmluZyBkZWZhdWx0VmFsdWUpCi0gIHsKLSAgICBfZGVmYXVsdFZhbHVlID0gZGVmYXVsdFZhbHVlOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhpcyBhdHRyaWJ1dGUuCi0gICAqCi0gICAqIEByZXR1cm4gIHRoZSBhdHRyaWJ1dGUgZGVmYXVsdCB2YWx1ZQotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXREZWZhdWx0VmFsdWUoKQotICB7Ci0gICAgcmV0dXJuIF9kZWZhdWx0VmFsdWU7Ci0gIH0KLQotICAvKioKLSAgICogU2V0cyB0aGUgYWx0ZXJuYXRpdmUgY2xhc3MgZm9yIHRoaXMgcHJvcGVydHkuCi0gICAqCi0gICAqIEBwYXJhbSBhbHRlcm5hdGVDbGFzcyAgdGhlIGFsdGVybmF0aXZlIGNsYXNzCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRBbHRlcm5hdGVDbGFzcygKLSAgICBTdHJpbmcgYWx0ZXJuYXRlQ2xhc3MpCi0gIHsKLSAgICBfYWx0ZXJuYXRlQ2xhc3MgPSBhbHRlcm5hdGVDbGFzczsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBhbHRlcm5hdGl2ZSBjbGFzcyBmb3IgdGhpcyBwcm9wZXJ0eS4KLSAgICoKLSAgICogQHJldHVybiAgdGhlIGFsdGVybmF0aXZlIGNsYXNzCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldEFsdGVybmF0ZUNsYXNzKCkKLSAgewotICAgIHJldHVybiBfYWx0ZXJuYXRlQ2xhc3M7Ci0gIH0KLQotICAvKioKLSAgICogU2V0cyB0aGUgbWV0aG9kIGJpbmRpbmcgc2lnbmF0dXJlIG9mIHRoaXMgcHJvcGVydHkuCi0gICAqCi0gICAqIEBwYXJhbSBzaWduYXR1cmUgIHRoZSBtZXRob2QgYmluZGluZyBzaWduYXR1cmUgb2YgdGhpcyBwcm9wZXJ0eQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0TWV0aG9kQmluZGluZ1NpZ25hdHVyZSgKLSAgICBNZXRob2RTaWduYXR1cmVCZWFuIHNpZ25hdHVyZSkKLSAgewotICAgIF9zaWduYXR1cmUgPSBzaWduYXR1cmU7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0aG9kIGJpbmRpbmcgc2lnbmF0dXJlIG9mIHRoaXMgcHJvcGVydHkuCi0gICAqCi0gICAqIEByZXR1cm4gdGhlIG1ldGhvZCBiaW5kaW5nIHNpZ25hdHVyZSBvZiB0aGlzIHByb3BlcnR5Ci0gICAqLwotICBwdWJsaWMgTWV0aG9kU2lnbmF0dXJlQmVhbiBnZXRNZXRob2RCaW5kaW5nU2lnbmF0dXJlKCkKLSAgewotICAgIHJldHVybiBfc2lnbmF0dXJlOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIHZpcnR1YWwgZmxhZyBvZiB0aGlzIHByb3BlcnR5LgotICAgKgotICAgKiBAcGFyYW0gdmlydHVhbCAgdGhlIHByb3BlcnR5IHJlcXVpcmVkIGZsYWcKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFZpcnR1YWwoCi0gICAgYm9vbGVhbiB2aXJ0dWFsKQotICB7Ci0gICAgX3ZpcnR1YWwgPSB2aXJ0dWFsOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdmlydHVhbCBmbGFnIG9mIHRoaXMgcHJvcGVydHkuCi0gICAqCi0gICAqIEByZXR1cm4gIHRoZSBwcm9wZXJ0eSB2aXJ0dWFsIGZsYWcKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzVmlydHVhbCgpCi0gIHsKLSAgICByZXR1cm4gX3ZpcnR1YWw7Ci0gIH0KLQotICBwdWJsaWMgaW50IGNvbXBhcmVUbyhPYmplY3QgbykKLSAgewotICAgIGlmKG8gaW5zdGFuY2VvZiBBdHRyaWJ1dGVCZWFuKQotICAgIHsKLSAgICAgIEF0dHJpYnV0ZUJlYW4gYXR0ciA9IChBdHRyaWJ1dGVCZWFuKW87Ci0gICAgICByZXR1cm4gX2F0dHJpYnV0ZU5hbWUuY29tcGFyZVRvKGF0dHIuX2F0dHJpYnV0ZU5hbWUpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgcmV0dXJuIDE7Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSBTdHJpbmcgICBfYXR0cmlidXRlTmFtZTsKLSAgcHJpdmF0ZSBTdHJpbmcgICBfYXR0cmlidXRlQ2xhc3M7Ci0gIHByaXZhdGUgU3RyaW5nW10gX2F0dHJpYnV0ZUNsYXNzUGFyYW1ldGVyczsKLSAgcHJpdmF0ZSBTdHJpbmcgICBfZGVzY3JpcHRpb247Ci0gIHByaXZhdGUgU3RyaW5nICAgX2RlZmF1bHRWYWx1ZTsKLSAgLy8gRklYTUU6IEFsdGVybmF0ZSB0eXBlIGRvZXMgbm90IHNlZW0gdG8gc3VwcG9ydCBnZW5lcmljIHR5cGVzCi0gIHByaXZhdGUgU3RyaW5nICAgX2FsdGVybmF0ZUNsYXNzOwotICBwcml2YXRlIGJvb2xlYW4gIF92aXJ0dWFsOwotICBwcml2YXRlIE1ldGhvZFNpZ25hdHVyZUJlYW4gX3NpZ25hdHVyZTsKLQotICBzdGF0aWMgcHJpdmF0ZSBmaW5hbCBQYXR0ZXJuIF9HRU5FUklDX1RZUEUgPSBQYXR0ZXJuLmNvbXBpbGUoIihbXjxdKyk8KC4rKT4iKTsKLSAgc3RhdGljIHByaXZhdGUgZmluYWwgU3RyaW5nW10gX0VNUFRZX0FSUkFZID0gbmV3IFN0cmluZ1swXTsKLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy9wYXJzZS9Db21wb25lbnRCZWFuLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvcGFyc2UvQ29tcG9uZW50QmVhbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYTZlMWU5Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy9wYXJzZS9Db21wb25lbnRCZWFuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTI4ICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy5wYXJzZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMudXRpbC5Db21wb3VuZEl0ZXJhdG9yOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllcjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7Ci0KLS8qKgotICogQ29tcG9uZW50QmVhbiBpcyBhIEphdmEgcmVwcmVzZW50YXRpb24gb2YgdGhlIGZhY2VzLWNvbmZpZyBjb21wb25lbnQKLSAqIFhNTCBlbGVtZW50LgotICovCi1wdWJsaWMgY2xhc3MgQ29tcG9uZW50QmVhbiBleHRlbmRzIE9iamVjdEJlYW4KLXsKLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcgQ29tcG9uZW50QmVhbi4KLSAgICovCi0gIHB1YmxpYyBDb21wb25lbnRCZWFuKCkKLSAgewotICAgIF9wcm9wZXJ0aWVzID0gbmV3IExpbmtlZEhhc2hNYXAoKTsKLSAgICBfZmFjZXRzID0gbmV3IExpbmtlZEhhc2hNYXAoKTsKLSAgICBfZXZlbnRzID0gbmV3IExpbmtlZEhhc2hNYXAoKTsKLSAgfQotCi0gIC8qKgotICAgKiBTZXRzIHRoZSBVSVgyIGxvY2FsIG5hbWUgZm9yIHRoaXMgY29tcG9uZW50LgotICAgKgotICAgKiBAcGFyYW0gbG9jYWxOYW1lICB0aGUgbG9jYWwgbmFtZQotICAgKgotICAgKiBAZGVwcmVjYXRlZCByZW1vdmUgd2hlbiAidWkiIHBhY2thZ2UgaXMgZ29uZQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0TG9jYWxOYW1lKAotICAgIFN0cmluZyBsb2NhbE5hbWUpCi0gIHsKLSAgICBfbG9jYWxOYW1lID0gbG9jYWxOYW1lOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIFVJWDIgbG9jYWwgbmFtZSBmb3IgdGhpcyBjb21wb25lbnQuCi0gICAqCi0gICAqIEByZXR1cm4gIHRoZSBsb2NhbCBuYW1lCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldExvY2FsTmFtZSgpCi0gIHsKLSAgICByZXR1cm4gX2xvY2FsTmFtZTsKLSAgfQotCi0gIC8qKgotICAgKiBTZXRzIHRoZSBVSVgyIG5vZGUgY2xhc3MgZm9yIHRoaXMgY29tcG9uZW50LgotICAgKgotICAgKiBAcGFyYW0gbm9kZUNsYXNzICB0aGUgbm9kZSBjbGFzcwotICAgKgotICAgKiBAZGVwcmVjYXRlZCByZW1vdmUgd2hlbiAidWkiIHBhY2thZ2UgaXMgZ29uZQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0Tm9kZUNsYXNzKAotICAgIFN0cmluZyBub2RlQ2xhc3MpCi0gIHsKLSAgICBfbm9kZUNsYXNzID0gbm9kZUNsYXNzOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIFVJWDIgbm9kZSBjbGFzcyBmb3IgdGhpcyBjb21wb25lbnQuCi0gICAqCi0gICAqIEByZXR1cm4gIHRoZSBub2RlIGNsYXNzCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldE5vZGVDbGFzcygpCi0gIHsKLSAgICByZXR1cm4gX25vZGVDbGFzczsKLSAgfQotCi0gIC8qKgotICAgKiBTZXRzIHRoZSBjb21wb25lbnQgdHlwZSBmb3IgdGhpcyBjb21wb25lbnQuCi0gICAqCi0gICAqIEBwYXJhbSBjb21wb25lbnRUeXBlICB0aGUgY29tcG9uZW50IHR5cGUKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldENvbXBvbmVudFR5cGUoCi0gICAgU3RyaW5nIGNvbXBvbmVudFR5cGUpCi0gIHsKLSAgICBfY29tcG9uZW50VHlwZSA9IGNvbXBvbmVudFR5cGU7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgY29tcG9uZW50IHR5cGUgZm9yIHRoaXMgY29tcG9uZW50LgotICAgKgotICAgKiBAcmV0dXJuICB0aGUgY29tcG9uZW50IHR5cGUKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0Q29tcG9uZW50VHlwZSgpCi0gIHsKLSAgICByZXR1cm4gX2NvbXBvbmVudFR5cGU7Ci0gIH0KLQotICAvKioKLSAgICogU2V0cyB0aGUgY29tcG9uZW50IGZhbWlseSBmb3IgdGhpcyBjb21wb25lbnQuCi0gICAqCi0gICAqIEBwYXJhbSBjb21wb25lbnRGYW1pbHkgIHRoZSBjb21wb25lbnQgZmFtaWx5Ci0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRDb21wb25lbnRGYW1pbHkoCi0gICAgU3RyaW5nIGNvbXBvbmVudEZhbWlseSkKLSAgewotICAgIF9jb21wb25lbnRGYW1pbHkgPSBjb21wb25lbnRGYW1pbHk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgY29tcG9uZW50IGZhbWlseSBmb3IgdGhpcyBjb21wb25lbnQuCi0gICAqCi0gICAqIEByZXR1cm4gIHRoZSBjb21wb25lbnQgZmFtaWx5Ci0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldENvbXBvbmVudEZhbWlseSgpCi0gIHsKLSAgICByZXR1cm4gX2NvbXBvbmVudEZhbWlseTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGNvbXBvbmVudCBmYW1pbHkgZXhpc3RzIGZvciB0aGlzIGNvbXBvbmVudC4KLSAgICoKLSAgICogQHJldHVybiAgdHJ1ZSAgaWYgdGhlIGNvbXBvbmVudCBmYW1pbHkgZXhpc3RzLAotICAgKiAgICAgICAgICBmYWxzZSBvdGhlcndpc2UKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGhhc0NvbXBvbmVudEZhbWlseSgpCi0gIHsKLSAgICByZXR1cm4gKF9jb21wb25lbnRGYW1pbHkgIT0gbnVsbCk7Ci0gIH0KLQotICAvKioKLSAgICogU2V0cyB0aGUgY29tcG9uZW50IGNsYXNzIGZvciB0aGlzIGNvbXBvbmVudC4KLSAgICoKLSAgICogQHBhcmFtIGNvbXBvbmVudENsYXNzICB0aGUgY29tcG9uZW50IGNsYXNzCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRDb21wb25lbnRDbGFzcygKLSAgICBTdHJpbmcgY29tcG9uZW50Q2xhc3MpCi0gIHsKLSAgICBfY29tcG9uZW50Q2xhc3MgPSBjb21wb25lbnRDbGFzczsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBjb21wb25lbnQgY2xhc3MgZm9yIHRoaXMgY29tcG9uZW50LgotICAgKgotICAgKiBAcmV0dXJuICB0aGUgY29tcG9uZW50IGNsYXNzCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldENvbXBvbmVudENsYXNzKCkKLSAgewotICAgIHJldHVybiBfY29tcG9uZW50Q2xhc3M7Ci0gIH0KLQotICAvKioKLSAgICogU2V0cyB0aGUgZGVzY3JpcHRpb24gb2YgdGhpcyBwcm9wZXJ0eS4KLSAgICoKLSAgICogQHBhcmFtIGRlc2NyaXB0aW9uICB0aGUgcHJvcGVydHkgZGVzY3JpcHRpb24KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKAotICAgIFN0cmluZyBkZXNjcmlwdGlvbikKLSAgewotICAgIF9kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGRlc2NyaXB0aW9uIG9mIHRoaXMgcHJvcGVydHkuCi0gICAqCi0gICAqIEByZXR1cm4gIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdGlvbgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpCi0gIHsKLSAgICByZXR1cm4gX2Rlc2NyaXB0aW9uOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIGxvbmcgZGVzY3JpcHRpb24gb2YgdGhpcyBwcm9wZXJ0eS4KLSAgICoKLSAgICogQHBhcmFtIGxvbmdEZXNjcmlwdGlvbiAgdGhlIGxvbmcgcHJvcGVydHkgZGVzY3JpcHRpb24KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldExvbmdEZXNjcmlwdGlvbigKLSAgICBTdHJpbmcgbG9uZ0Rlc2NyaXB0aW9uKQotICB7Ci0gICAgX2xvbmdEZXNjcmlwdGlvbiA9IGxvbmdEZXNjcmlwdGlvbjsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBsb25nIGRlc2NyaXB0aW9uIG9mIHRoaXMgcHJvcGVydHkuCi0gICAqCi0gICAqIEByZXR1cm4gIHRoZSBsb25nIHByb3BlcnR5IGRlc2NyaXB0aW9uCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldExvbmdEZXNjcmlwdGlvbigpCi0gIHsKLSAgICByZXR1cm4gX2xvbmdEZXNjcmlwdGlvbjsKLSAgfQotCi0gIC8qKgotICAgKiBTZXRzIHRoZSBKU1AgdGFnIGhhbmRsZXIgY2xhc3MgZm9yIHRoaXMgY29tcG9uZW50LgotICAgKgotICAgKiBAcGFyYW0gdGFnQ2xhc3MgIHRoZSBKU1AgdGFnIGhhbmRsZXIgY2xhc3MKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFRhZ0NsYXNzKAotICAgIFN0cmluZyB0YWdDbGFzcykKLSAgewotICAgIF90YWdDbGFzcyA9IHRhZ0NsYXNzOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIHVuc3VwcG9ydGVkIGFnZW50cyBmb3IgdGhpcyBjb21wb25lbnQuCi0gICAqCi0gICAqIEBwYXJhbSB1bnN1cHBvcnRlZEFnZW50cyAgdGhlIHVuc3VwcG9ydGVkIGFnZW50cwotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0VW5zdXBwb3J0ZWRBZ2VudHMoCi0gICAgU3RyaW5nW10gdW5zdXBwb3J0ZWRBZ2VudHMpCi0gIHsKLSAgICBpZiAodW5zdXBwb3J0ZWRBZ2VudHMgPT0gbnVsbCkKLSAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigidW5zdXBwb3J0ZWRBZ2VudHMiKTsKLQotICAgIF91bnN1cHBvcnRlZEFnZW50cyA9IHVuc3VwcG9ydGVkQWdlbnRzOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdW5zdXBwb3J0ZWQgYWdlbnRzIGZvciB0aGlzIGNvbXBvbmVudC4KLSAgICoKLSAgICogQHJldHVybiAgdGhlIHVuc3VwcG9ydGVkIGFnZW50cwotICAgKi8KLSAgcHVibGljIFN0cmluZ1tdIGdldFVuc3VwcG9ydGVkQWdlbnRzKCkKLSAgewotICAgIHJldHVybiBfdW5zdXBwb3J0ZWRBZ2VudHM7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBKU1AgdGFnIGhhbmRsZXIgY2xhc3MgZm9yIHRoaXMgY29tcG9uZW50LgotICAgKgotICAgKiBAcmV0dXJuICB0aGUgSlNQIHRhZyBoYW5kbGVyIGNsYXNzCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFRhZ0NsYXNzKCkKLSAgewotICAgIHJldHVybiBfdGFnQ2xhc3M7Ci0gIH0KLQotICAgLyoqCi0gICAqIFNldHMgdGhlIEpTUCB0YWcgaGFuZGxlciBzdXBlcmNsYXNzIGZvciB0aGlzIGNvbXBvbmVudC4KLSAgICoKLSAgICogQHBhcmFtIHRhZ1N1cGVyY2xhc3MgIHRoZSBKU1AgdGFnIGhhbmRsZXIgc3VwZXJjbGFzcwotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0VGFnU3VwZXJjbGFzcygKLSAgICBTdHJpbmcgdGFnU3VwZXJjbGFzcykKLSAgewotICAgIF90YWdTdXBlcmNsYXNzID0gdGFnU3VwZXJjbGFzczsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBKU1AgdGFnIGhhbmRsZXIgc3VwZXJjbGFzcyBmb3IgdGhpcyBjb21wb25lbnQuCi0gICAqCi0gICAqIEByZXR1cm4gIHRoZSBKU1AgdGFnIGhhbmRsZXIgc3VwZXJjbGFzcwotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRUYWdTdXBlcmNsYXNzKCkKLSAgewotICAgIHJldHVybiBfdGFnU3VwZXJjbGFzczsKLSAgfQotCi0gIC8qKgotICAqIFNldHMgdGhlIEZhY2VsZXRzIHRhZyBoYW5kbGVyIChjb21wb25lbnQgaGFuZGxlcikgdGhpcyBjb21wb25lbnQuCi0gICoKLSAgKiBAcGFyYW0gdGFnSGFuZGxlciB0aGUgRmFjZWxldHMgdGFnIGhhbmRsZXIgY2xhc3MKLSAgKi8KLSBwdWJsaWMgdm9pZCBzZXRUYWdIYW5kbGVyKAotICAgU3RyaW5nIHRhZ0hhbmRsZXIpCi0gewotICAgX3RhZ0hhbmRsZXIgPSB0YWdIYW5kbGVyOwotIH0KLQotIC8qKgotICAqIFJldHVybnMgdGhlIEZhY2VsZXRzIHRhZyBoYW5kbGVyIGZvciB0aGlzIGNvbXBvbmVudAotICAqCi0gICogQHJldHVybiAgdGhlIEZhY2VsZXRzIHRhZyBoYW5kbGVyCi0gICovCi0gcHVibGljIFN0cmluZyBnZXRUYWdIYW5kbGVyKCkKLSB7Ci0gICByZXR1cm4gX3RhZ0hhbmRsZXI7Ci0gfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBKU1AgdGFnIG5hbWUgZm9yIHRoaXMgY29tcG9uZW50LgotICAgKgotICAgKiBAcmV0dXJuICB0aGUgSlNQIHRhZyBuYW1lCi0gICAqLwotICBwdWJsaWMgUU5hbWUgZ2V0VGFnTmFtZSgpCi0gIHsKLSAgICByZXR1cm4gX3RhZ05hbWU7Ci0gIH0KLQotICAvKioKLSAgICogU2V0cyB0aGUgSlNQIHRhZyBuYW1lIGZvciB0aGlzIGNvbXBvbmVudC4KLSAgICoKLSAgICogQHBhcmFtIHRhZ05hbWUgIHRoZSBKU1AgdGFnIG5hbWUKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFRhZ05hbWUoCi0gICAgUU5hbWUgdGFnTmFtZSkKLSAgewotICAgIF90YWdOYW1lID0gdGFnTmFtZTsKLSAgfQotCi0gIC8qKgotICAgKiBTZXRzIHRoZSBuYW1pbmdDb250YWluZXIgZmxhZyBvZiB0aGlzIHByb3BlcnR5LgotICAgKgotICAgKiBAcGFyYW0gbmFtaW5nQ29udGFpbmVyICB0aGUgY29tcG9uZW50IG5hbWluZ0NvbnRhaW5lciBmbGFnCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXROYW1pbmdDb250YWluZXIoCi0gICAgYm9vbGVhbiBuYW1pbmdDb250YWluZXIpCi0gIHsKLSAgICBfbmFtaW5nQ29udGFpbmVyID0gbmFtaW5nQ29udGFpbmVyOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgbmFtaW5nQ29udGFpbmVyIGZsYWcgb2YgdGhpcyBjb21wb25lbnQuCi0gICAqCi0gICAqIEByZXR1cm4gIHRoZSBjb21wb25lbnQgbmFtaW5nQ29udGFpbmVyIGZsYWcKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzTmFtaW5nQ29udGFpbmVyKCkKLSAgewotICAgIHJldHVybiBfbmFtaW5nQ29udGFpbmVyOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIGNvbXBvbmVudCBzdXBlcnR5cGUgZm9yIHRoaXMgY29tcG9uZW50LgotICAgKgotICAgKiBAcGFyYW0gY29tcG9uZW50U3VwZXJ0eXBlICB0aGUgY29tcG9uZW50IHN1cGVyIHR5cGUKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldENvbXBvbmVudFN1cGVydHlwZSgKLSAgICBTdHJpbmcgY29tcG9uZW50U3VwZXJ0eXBlKQotICB7Ci0gICAgX2NvbXBvbmVudFN1cGVydHlwZSA9IGNvbXBvbmVudFN1cGVydHlwZTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBjb21wb25lbnQgc3VwZXJ0eXBlIGZvciB0aGlzIGNvbXBvbmVudC4KLSAgICoKLSAgICogQHJldHVybiAgdGhlIGNvbXBvbmVudCBzdXBlcnR5cGUKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0Q29tcG9uZW50U3VwZXJ0eXBlKCkKLSAgewotICAgIHJldHVybiBfY29tcG9uZW50U3VwZXJ0eXBlOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIGNvbXBvbmVudCBzdXBlciBjbGFzcyBmb3IgdGhpcyBjb21wb25lbnQuCi0gICAqCi0gICAqIEBwYXJhbSBjb21wb25lbnRTdXBlcmNsYXNzICB0aGUgY29tcG9uZW50IHN1cGVyIGNsYXNzCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRDb21wb25lbnRTdXBlcmNsYXNzKAotICAgIFN0cmluZyBjb21wb25lbnRTdXBlcmNsYXNzKQotICB7Ci0gICAgX2NvbXBvbmVudFN1cGVyY2xhc3MgPSBjb21wb25lbnRTdXBlcmNsYXNzOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGNvbXBvbmVudCBzdXBlciBjbGFzcyBmb3IgdGhpcyBjb21wb25lbnQuCi0gICAqCi0gICAqIEByZXR1cm4gIHRoZSBjb21wb25lbnQgc3VwZXIgY2xhc3MKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0Q29tcG9uZW50U3VwZXJjbGFzcygpCi0gIHsKLSAgICByZXR1cm4gX2NvbXBvbmVudFN1cGVyY2xhc3M7Ci0gIH0KLQotICAvKioKLSAgICogU2V0cyB0aGUgcmVuZGVyZXIgdHlwZSBmb3IgdGhpcyBjb21wb25lbnQuCi0gICAqCi0gICAqIEBwYXJhbSByZW5kZXJlclR5cGUgIHRoZSByZW5kZXJlciB0eXBlCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRSZW5kZXJlclR5cGUoCi0gICAgU3RyaW5nIHJlbmRlcmVyVHlwZSkKLSAgewotICAgIF9yZW5kZXJlclR5cGUgPSByZW5kZXJlclR5cGU7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgcmVuZGVyZXIgdHlwZSBmb3IgdGhpcyBjb21wb25lbnQuCi0gICAqCi0gICAqIEByZXR1cm4gIHRoZSByZW5kZXJlciB0eXBlCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFJlbmRlcmVyVHlwZSgpCi0gIHsKLSAgICByZXR1cm4gX3JlbmRlcmVyVHlwZTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBkZWZhdWx0IHJlbmRlcmVyIHR5cGUgZm9yIHRoaXMgY29tcG9uZW50LgotICAgKgotICAgKiBAcmV0dXJuICB0aGUgZGVmYXVsdCByZW5kZXJlciB0eXBlCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRSZW5kZXJlclR5cGUoKQotICB7Ci0gICAgQ29tcG9uZW50QmVhbiBwYXJlbnQgPSByZXNvbHZlU3VwZXJ0eXBlKCk7Ci0gICAgcmV0dXJuIChwYXJlbnQgIT0gbnVsbCkgPyBwYXJlbnQuZmluZFJlbmRlcmVyVHlwZSgpIDogbnVsbDsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0SW1wbGVtZW50YXRpb25UeXBlKCkKLSAgewotICAgIHJldHVybiBfaW1wbGVtZW50YXRpb25UeXBlOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0SW1wbGVtZW50YXRpb25UeXBlKFN0cmluZyBpbXBsZW1lbnRhdGlvblR5cGUpCi0gIHsKLSAgICBfaW1wbGVtZW50YXRpb25UeXBlID0gaW1wbGVtZW50YXRpb25UeXBlOwotICB9Ci0KLQotICAvKioKLSAgICogQWRkcyBhIHByb3BlcnR5IHRvIHRoaXMgY29tcG9uZW50LgotICAgKgotICAgKiBAcGFyYW0gcHJvcGVydHkgIHRoZSBwcm9wZXJ0eSB0byBhZGQKLSAgICovCi0gIHB1YmxpYyB2b2lkIGFkZFByb3BlcnR5KAotICAgIFByb3BlcnR5QmVhbiBwcm9wZXJ0eSkKLSAgewotICAgIF9wcm9wZXJ0aWVzLnB1dChwcm9wZXJ0eS5nZXRQcm9wZXJ0eU5hbWUoKSwgcHJvcGVydHkpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHByb3BlcnR5IGZvciB0aGlzIHByb3BlcnR5IG5hbWUuCi0gICAqCi0gICAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUgIHRoZSBwcm9wZXJ0eSBuYW1lIHRvIGZpbmQKLSAgICovCi0gIHB1YmxpYyBQcm9wZXJ0eUJlYW4gZmluZFByb3BlcnR5KAotICAgIFN0cmluZyBwcm9wZXJ0eU5hbWUpCi0gIHsKLSAgICByZXR1cm4gKFByb3BlcnR5QmVhbilfcHJvcGVydGllcy5nZXQocHJvcGVydHlOYW1lKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBwcm9wZXJ0eSBmb3IgdGhpcyBwcm9wZXJ0eSBuYW1lLgotICAgKgotICAgKiBAcGFyYW0gcHJvcGVydHlOYW1lICB0aGUgcHJvcGVydHkgbmFtZSB0byBmaW5kCi0gICAqLwotICBwdWJsaWMgUHJvcGVydHlCZWFuIGZpbmRQcm9wZXJ0eSgKLSAgICBTdHJpbmcgcHJvcGVydHlOYW1lLAotICAgIGJvb2xlYW4gZmxhdHRlbikKLSAgewotICAgIFByb3BlcnR5QmVhbiBwcm9wID0gZmluZFByb3BlcnR5KHByb3BlcnR5TmFtZSk7Ci0gICAgaWYgKHByb3AgPT0gbnVsbCAmJiBmbGF0dGVuKQotICAgIHsKLSAgICAgIENvbXBvbmVudEJlYW4gcGFyZW50ID0gcmVzb2x2ZVN1cGVydHlwZSgpOwotICAgICAgaWYgKHBhcmVudCAhPSBudWxsKQotICAgICAgICBwcm9wID0gcGFyZW50LmZpbmRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIGZsYXR0ZW4pOwotICAgIH0KLQotICAgIHJldHVybiBwcm9wOwotICB9Ci0KLQotICAvKioKLSAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgY29tcG9uZW50IGhhcyBhbnkgcHJvcGVydGllcy4KLSAgICoKLSAgICogQHJldHVybiAgdHJ1ZSAgIGlmIHRoaXMgY29tcG9uZW50IGhhcyBhbnkgcHJvcGVydGllcywKLSAgICogICAgICAgICAgZmFsc2UgIG90aGVyd2lzZQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaGFzUHJvcGVydGllcygpCi0gIHsKLSAgICByZXR1cm4gaGFzUHJvcGVydGllcyhmYWxzZSk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgY29tcG9uZW50IG9yIGFueSBjb21wb25lbnQgc3VwZXJ0eXBlCi0gICAqIGhhcyBhbnkgcHJvcGVydGllcy4KLSAgICoKLSAgICogQHJldHVybiAgdHJ1ZSAgIGlmIHRoaXMgY29tcG9uZW50IG9yIGFueSBzdXBlcnR5cGUgaGFzIGFueSBwcm9wZXJ0aWVzLAotICAgKiAgICAgICAgICBmYWxzZSAgb3RoZXJ3aXNlCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBoYXNQcm9wZXJ0aWVzKAotICAgIGJvb2xlYW4gZmxhdHRlbikKLSAgewotICAgIGJvb2xlYW4gaGFzUHJvcGVydGllcyA9ICFfcHJvcGVydGllcy5pc0VtcHR5KCk7Ci0KLSAgICBpZiAoIWhhc1Byb3BlcnRpZXMgJiYgZmxhdHRlbikKLSAgICB7Ci0gICAgICBDb21wb25lbnRCZWFuIHBhcmVudCA9IHJlc29sdmVTdXBlcnR5cGUoKTsKLSAgICAgIGlmIChwYXJlbnQgIT0gbnVsbCkKLSAgICAgICAgaGFzUHJvcGVydGllcyB8PSBwYXJlbnQuaGFzUHJvcGVydGllcyhmbGF0dGVuKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gaGFzUHJvcGVydGllczsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIGFuIGl0ZXJhdG9yIGZvciBhbGwgcHJvcGVydGllcyBvbiB0aGlzIGNvbXBvbmVudCBvbmx5LgotICAgKgotICAgKiBAcmV0dXJuICB0aGUgcHJvcGVydHkgaXRlcmF0b3IKLSAgICovCi0gIHB1YmxpYyBJdGVyYXRvciBwcm9wZXJ0aWVzKCkKLSAgewotICAgIHJldHVybiBfcHJvcGVydGllcy52YWx1ZXMoKS5pdGVyYXRvcigpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgYW4gaXRlcmF0b3IgZm9yIHByb3BlcnRpZXMgb24gdGhpcyBjb21wb25lbnQuCi0gICAqCi0gICAqIEBwYXJhbSBmbGF0dGVuICB0cnVlICAgaWYgdGhlIGl0ZXJhdG9yIHNob3VsZCBiZSBhIGNvbWJpbmVkIGxpc3Qgb2YKLSAgICogICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzIG9mIHRoaXMgY29tcG9uZW50IGFuZCBpdHMgc3VwZXJ0eXBlLAotICAgKiAgICAgICAgICAgICAgICAgZmFsc2UgIG90aGVyd2lzZQotICAgKgotICAgKiBAcmV0dXJuICB0aGUgcHJvcGVydHkgaXRlcmF0b3IKLSAgICovCi0gIHB1YmxpYyBJdGVyYXRvciBwcm9wZXJ0aWVzKAotICAgIGJvb2xlYW4gZmxhdHRlbikKLSAgewotICAgIEl0ZXJhdG9yIHByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzKCk7Ci0gICAgaWYgKGZsYXR0ZW4pCi0gICAgewotICAgICAgQ29tcG9uZW50QmVhbiBwYXJlbnQgPSByZXNvbHZlU3VwZXJ0eXBlKCk7Ci0gICAgICBpZiAocGFyZW50ICE9IG51bGwpCi0gICAgICAgIHByb3BlcnRpZXMgPSBuZXcgQ29tcG91bmRJdGVyYXRvcihwYXJlbnQucHJvcGVydGllcyh0cnVlKSwgcHJvcGVydGllcyk7Ci0gICAgfQotICAgIHJldHVybiBwcm9wZXJ0aWVzOwotICB9Ci0KLSAvKioKLSAgKiBOdW1iZXIgb2YgcHJvcGVydGllcyBmb3IgdGhpcyBjb21wb25lbnQKLSAgKiBAcmV0dXJuIG51bSBvZiBwcm9wZXJ0aWVzCi0gICovCi0gIHB1YmxpYyBpbnQgcHJvcGVydGllc1NpemUoKQotICB7Ci0gICAgcmV0dXJuIF9wcm9wZXJ0aWVzLnNpemUoKTsKLSAgfQotCi0gIC8qKgotICAgKiBBZGRzIGEgZmFjZXQgdG8gdGhpcyBjb21wb25lbnQuCi0gICAqCi0gICAqIEBwYXJhbSBmYWNldCAgdGhlIGZhY2V0IHRvIGFkZAotICAgKi8KLSAgcHVibGljIHZvaWQgYWRkRmFjZXQoCi0gICAgRmFjZXRCZWFuIGZhY2V0KQotICB7Ci0gICAgX2ZhY2V0cy5wdXQoZmFjZXQuZ2V0RmFjZXROYW1lKCksIGZhY2V0KTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBmYWNldCBmb3IgdGhpcyBmYWNldCBuYW1lLgotICAgKgotICAgKiBAcGFyYW0gZmFjZXROYW1lICB0aGUgZmFjZXQgbmFtZSB0byBmaW5kCi0gICAqLwotICBwdWJsaWMgRmFjZXRCZWFuIGZpbmRGYWNldCgKLSAgICBTdHJpbmcgZmFjZXROYW1lKQotICB7Ci0gICAgcmV0dXJuIChGYWNldEJlYW4pX2ZhY2V0cy5nZXQoZmFjZXROYW1lKTsKLSAgfQotCi0KLSAgcHVibGljIEZhY2V0QmVhbiBmaW5kRmFjZXQoCi0gICAgU3RyaW5nIGZhY2V0TmFtZSwKLSAgICBib29sZWFuIGZsYXR0ZW4pCi0gIHsKLSAgICBGYWNldEJlYW4gZmFjZXQgPSBmaW5kRmFjZXQoZmFjZXROYW1lKTsKLSAgICBpZiAoZmFjZXQgPT0gbnVsbCAmJiBmbGF0dGVuKQotICAgIHsKLSAgICAgIENvbXBvbmVudEJlYW4gcGFyZW50ID0gcmVzb2x2ZVN1cGVydHlwZSgpOwotICAgICAgaWYgKHBhcmVudCAhPSBudWxsKQotICAgICAgICBmYWNldCA9IHBhcmVudC5maW5kRmFjZXQoZmFjZXROYW1lLCBmbGF0dGVuKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gZmFjZXQ7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgY29tcG9uZW50IGhhcyBhbnkgZmFjZXRzLgotICAgKgotICAgKiBAcmV0dXJuICB0cnVlICAgaWYgdGhpcyBjb21wb25lbnQgaGFzIGFueSBmYWNldHMsCi0gICAqICAgICAgICAgIGZhbHNlICBvdGhlcndpc2UKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGhhc0ZhY2V0cygpCi0gIHsKLSAgICByZXR1cm4gaGFzRmFjZXRzKGZhbHNlKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBjb21wb25lbnQgb3IgYW55IGNvbXBvbmVudCBzdXBlcnR5cGUKLSAgICogaGFzIGFueSBmYWNldHMuCi0gICAqCi0gICAqIEByZXR1cm4gIHRydWUgICBpZiB0aGlzIGNvbXBvbmVudCBvciBhbnkgc3VwZXJ0eXBlIGhhcyBhbnkgZmFjZXRzLAotICAgKiAgICAgICAgICBmYWxzZSAgb3RoZXJ3aXNlCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBoYXNGYWNldHMoCi0gICAgYm9vbGVhbiBmbGF0dGVuKQotICB7Ci0gICAgYm9vbGVhbiBoYXNGYWNldHMgPSAhX2ZhY2V0cy5pc0VtcHR5KCk7Ci0KLSAgICBpZiAoIWhhc0ZhY2V0cyAmJiBmbGF0dGVuKQotICAgIHsKLSAgICAgIENvbXBvbmVudEJlYW4gcGFyZW50ID0gcmVzb2x2ZVN1cGVydHlwZSgpOwotICAgICAgaWYgKHBhcmVudCAhPSBudWxsKQotICAgICAgICBoYXNGYWNldHMgfD0gcGFyZW50Lmhhc0ZhY2V0cyhmbGF0dGVuKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gaGFzRmFjZXRzOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgYW4gaXRlcmF0b3IgZm9yIGFsbCBmYWNldHMgb24gdGhpcyBjb21wb25lbnQgb25seS4KLSAgICoKLSAgICogQHJldHVybiAgdGhlIGZhY2V0IGl0ZXJhdG9yCi0gICAqLwotICBwdWJsaWMgSXRlcmF0b3IgZmFjZXRzKCkKLSAgewotICAgIHJldHVybiBfZmFjZXRzLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyBhbiBpdGVyYXRvciBmb3IgZmFjZXRzIG9uIHRoaXMgY29tcG9uZW50LgotICAgKgotICAqIEBwYXJhbSBmbGF0dGVuICB0cnVlICAgaWYgdGhlIGl0ZXJhdG9yIHNob3VsZCBiZSBhIGNvbWJpbmVkIGxpc3Qgb2YKLSAgKiAgICAgICAgICAgICAgICAgICAgICAgIGZhY2V0cyBvZiB0aGlzIGNvbXBvbmVudCBhbmQgaXRzIHN1cGVydHlwZSwKLSAgKiAgICAgICAgICAgICAgICAgZmFsc2UgIG90aGVyd2lzZQotICAqCi0gICogQHJldHVybiAgdGhlIGZhY2V0IGl0ZXJhdG9yCi0gICovCi0gIHB1YmxpYyBJdGVyYXRvciBmYWNldHMoCi0gICBib29sZWFuIGZsYXR0ZW4pCi0gIHsKLSAgICBJdGVyYXRvciBmYWNldHMgPSBmYWNldHMoKTsKLSAgICBpZiAoZmxhdHRlbikKLSAgICB7Ci0gICAgICBDb21wb25lbnRCZWFuIHBhcmVudCA9IHJlc29sdmVTdXBlcnR5cGUoKTsKLSAgICAgIGlmIChwYXJlbnQgIT0gbnVsbCkKLSAgICAgICAgZmFjZXRzID0gbmV3IENvbXBvdW5kSXRlcmF0b3IoZmFjZXRzLCBwYXJlbnQuZmFjZXRzKHRydWUpKTsKLSAgICB9Ci0gICAgcmV0dXJuIGZhY2V0czsKLSAgfQotCi0gIC8qKgotICAgKiBTcGVjaWZpZXMgaWYgdGhlIGNvbXBvbmVudCBjYW4gaGF2ZSBjaGlsZHJlbi4KLSAgICoKLSAgICogQHBhcmFtIGNoaWxkcmVuICB0cnVlICBpZiB0aGUgY29tcG9uZW50IGNhbiBoYXZlIGNoaWxkcmVuLgotICAgKiAgICAgICAgICAgICAgICAgIGZhbHNlIG90aGVyd2lzZQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0Q2hpbGRyZW4oCi0gICAgYm9vbGVhbiBjaGlsZHJlbikKLSAgewotICAgIF9jaGlsZHJlbiA9IGNoaWxkcmVuOwotICB9Ci0KLQotICAvKioKLSAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBjb21wb25lbnQgY2FuIGhhdmUgY2hpbGRyZW4uCi0gICAqCi0gICAqIEByZXR1cm4gIHRydWUgIGlmIHRoZSBjb21wb25lbnQgY2FuIGhhdmUgY2hpbGRyZW4uCi0gICAqICAgICAgICAgIGZhbHNlIG90aGVyd2lzZQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oKQotICB7Ci0gICAgcmV0dXJuIF9jaGlsZHJlbjsKLSAgfQotCi0gIC8qKgotICAgKiBBZGRzIGEgSmF2YSBMYW5ndWFnZSBjbGFzcyBtb2RpZmllciB0byB0aGUgY29tcG9uZW50IGNsYXNzLgotICAgKgotICAgKiBAcGFyYW0gbW9kaWZpZXIgIHRoZSBtb2RpZmllciB0byBiZSBhZGRlZAotICAgKi8KLSAgcHVibGljIHZvaWQgYWRkQ29tcG9uZW50Q2xhc3NNb2RpZmllcigKLSAgICBpbnQgbW9kaWZpZXIpCi0gIHsKLSAgICBfY29tcG9uZW50Q2xhc3NNb2RpZmllcnMgfD0gbW9kaWZpZXI7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgSmF2YSBMYW5ndWFnZSBjbGFzcyBtb2RpZmllcnMgZm9yIHRoZSBjb21wb25lbnQgY2xhc3MuCi0gICAqIEJ5IGRlZmF1bHQsIHRoZXNlIG1vZGlmaWVycyBpbmNsdWRlIE1vZGlmaWVyLlBVQkxJQy4KLSAgICoKLSAgICogQHJldHVybiAgdGhlIEphdmEgTGFuZ3VhZ2UgY2xhc3MgbW9kaWZpZXJzIGZvciB0aGUgY29tcG9uZW50IGNsYXNzCi0gICAqLwotICBwdWJsaWMgaW50IGdldENvbXBvbmVudENsYXNzTW9kaWZpZXJzKCkKLSAgewotICAgIGludCBtb2RpZmllcnMgPSBfY29tcG9uZW50Q2xhc3NNb2RpZmllcnM7Ci0KLSAgICBpZiAoIU1vZGlmaWVyLmlzUHJpdmF0ZShtb2RpZmllcnMpICYmCi0gICAgICAgICFNb2RpZmllci5pc1Byb3RlY3RlZChtb2RpZmllcnMpICYmCi0gICAgICAgICFNb2RpZmllci5pc1B1YmxpYyhtb2RpZmllcnMpKQotICAgIHsKLSAgICAgIG1vZGlmaWVycyB8PSBNb2RpZmllci5QVUJMSUM7Ci0gICAgfQotCi0gICAgcmV0dXJuIG1vZGlmaWVyczsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHBhcnNlQ29tcG9uZW50Q2xhc3NNb2RpZmllcigKLSAgICBTdHJpbmcgbW9kaWZpZXIpCi0gIHsKLSAgICBhZGRDb21wb25lbnRDbGFzc01vZGlmaWVyKF9wYXJzZU1vZGlmaWVyKG1vZGlmaWVyKSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBwYXJzZVRhZ0NsYXNzTW9kaWZpZXIoCi0gICAgU3RyaW5nIG1vZGlmaWVyKQotICB7Ci0gICAgYWRkVGFnQ2xhc3NNb2RpZmllcihfcGFyc2VNb2RpZmllcihtb2RpZmllcikpOwotICB9Ci0KLSAgcHJpdmF0ZSBpbnQgX3BhcnNlTW9kaWZpZXIoCi0gICAgU3RyaW5nIHRleHQpCi0gIHsKLSAgICBpZiAoInB1YmxpYyIuZXF1YWxzKHRleHQpKQotICAgICAgcmV0dXJuIE1vZGlmaWVyLlBVQkxJQzsKLSAgICBlbHNlIGlmICgicHJvdGVjdGVkIi5lcXVhbHModGV4dCkpCi0gICAgICByZXR1cm4gTW9kaWZpZXIuUFJPVEVDVEVEOwotICAgIGVsc2UgaWYgKCJwcml2YXRlIi5lcXVhbHModGV4dCkpCi0gICAgICByZXR1cm4gTW9kaWZpZXIuUFJJVkFURTsKLSAgICBlbHNlIGlmICgiYWJzdHJhY3QiLmVxdWFscyh0ZXh0KSkKLSAgICAgIHJldHVybiBNb2RpZmllci5BQlNUUkFDVDsKLSAgICBlbHNlIGlmICgiZmluYWwiLmVxdWFscyh0ZXh0KSkKLSAgICAgIHJldHVybiBNb2RpZmllci5GSU5BTDsKLQotICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlVucmVjb2duaXplZCBtb2RpZmllcjogIiArIHRleHQpOwotICB9Ci0KLSAgLyoqCi0gICAqIFBhcnNlcyB0aGUgdW5zdXBwb3J0ZWQgYWdlbnRzIGZvciB0aGlzIGNvbXBvbmVudCBpbnRvIGEgU3RyaW5nIGFycmF5Ci0gICAqIHVzaW5nIHNwYWNlIGFzIHRoZSBzZXBhcmF0b3IgYmV0d2VlbiB2YWx1ZXMuCi0gICAqCi0gICAqIEBwYXJhbSB1bnN1cHBvcnRlZEFnZW50cyAgdGhlIHVuc3VwcG9ydGVkIGFnZW50cwotICAgKi8KLSAgcHVibGljIHZvaWQgcGFyc2VVbnN1cHBvcnRlZEFnZW50cygKLSAgICBTdHJpbmcgdW5zdXBwb3J0ZWRBZ2VudHMpCi0gIHsKLSAgICBzZXRVbnN1cHBvcnRlZEFnZW50cyh1bnN1cHBvcnRlZEFnZW50cy5zcGxpdCgiICIpKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIEFkZHMgYSBKYXZhIExhbmd1YWdlIGNsYXNzIG1vZGlmaWVyIHRvIHRoZSB0YWcgY2xhc3MuCi0gICAqCi0gICAqIEBwYXJhbSBtb2RpZmllciAgdGhlIG1vZGlmaWVyIHRvIGJlIGFkZGVkCi0gICAqLwotICBwdWJsaWMgdm9pZCBhZGRUYWdDbGFzc01vZGlmaWVyKAotICAgIGludCBtb2RpZmllcikKLSAgewotICAgIF90YWdDbGFzc01vZGlmaWVycyB8PSBtb2RpZmllcjsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBKYXZhIExhbmd1YWdlIGNsYXNzIG1vZGlmaWVycyBmb3IgdGhlIHRhZyBjbGFzcy4KLSAgICogQnkgZGVmYXVsdCwgdGhlc2UgbW9kaWZpZXJzIGluY2x1ZGUgTW9kaWZpZXIuUFVCTElDLgotICAgKgotICAgKiBAcmV0dXJuICB0aGUgSmF2YSBMYW5ndWFnZSBjbGFzcyBtb2RpZmllcnMgZm9yIHRoZSB0YWcgY2xhc3MKLSAgICovCi0gIHB1YmxpYyBpbnQgZ2V0VGFnQ2xhc3NNb2RpZmllcnMoKQotICB7Ci0gICAgaW50IG1vZGlmaWVycyA9IF90YWdDbGFzc01vZGlmaWVyczsKLQotICAgIGlmICghTW9kaWZpZXIuaXNQcml2YXRlKG1vZGlmaWVycykgJiYKLSAgICAgICAgIU1vZGlmaWVyLmlzUHJvdGVjdGVkKG1vZGlmaWVycykgJiYKLSAgICAgICAgIU1vZGlmaWVyLmlzUHVibGljKG1vZGlmaWVycykpCi0gICAgewotICAgICAgbW9kaWZpZXJzIHw9IE1vZGlmaWVyLlBVQkxJQzsKLSAgICB9Ci0KLSAgICByZXR1cm4gbW9kaWZpZXJzOwotICB9Ci0KLSAgLyoqCi0gICAqIEFkZHMgYW4gZXZlbnQgdG8gdGhpcyBjb21wb25lbnQuCi0gICAqCi0gICAqIEBwYXJhbSBldmVudFJlZiAgdGhlIGV2ZW50IHRvIGFkZAotICAgKi8KLSAgcHVibGljIHZvaWQgYWRkRXZlbnQoCi0gICAgRXZlbnRSZWZCZWFuIGV2ZW50UmVmKQotICB7Ci0gICAgaWYgKGV2ZW50UmVmLmdldEV2ZW50VHlwZSgpID09IG51bGwpCi0gICAgewotICAgICAgX0xPRy53YXJuaW5nKCJNaXNzaW5nIGV2ZW50IHR5cGUgaW4gY29tcG9uZW50IFwiIiArCi0gICAgICAgICAgICAgICAgICAgX2NvbXBvbmVudFR5cGUgKyAiXCIiKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIF9ldmVudHMucHV0KGV2ZW50UmVmLmdldEV2ZW50VHlwZSgpLCBldmVudFJlZik7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGNvbXBvbmVudCBoYXMgYW55IGV2ZW50cy4KLSAgICoKLSAgICogQHJldHVybiAgdHJ1ZSAgIGlmIHRoaXMgY29tcG9uZW50IGhhcyBhbnkgZXZlbnRzLAotICAgKiAgICAgICAgICBmYWxzZSAgb3RoZXJ3aXNlCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBoYXNFdmVudHMoKQotICB7Ci0gICAgcmV0dXJuIGhhc0V2ZW50cyhmYWxzZSk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgY29tcG9uZW50IG9yIGFueSBjb21wb25lbnQgc3VwZXJ0eXBlCi0gICAqIGhhcyBhbnkgZXZlbnRzLgotICAgKgotICAgKiBAcmV0dXJuICB0cnVlICAgaWYgdGhpcyBjb21wb25lbnQgb3IgYW55IHN1cGVydHlwZSBoYXMgYW55IGV2ZW50cywKLSAgICogICAgICAgICAgZmFsc2UgIG90aGVyd2lzZQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaGFzRXZlbnRzKAotICAgIGJvb2xlYW4gZmxhdHRlbikKLSAgewotICAgIGJvb2xlYW4gaGFzRXZlbnRzID0gIV9ldmVudHMuaXNFbXB0eSgpOwotCi0gICAgaWYgKCFoYXNFdmVudHMgJiYgZmxhdHRlbikKLSAgICB7Ci0gICAgICBDb21wb25lbnRCZWFuIHBhcmVudCA9IHJlc29sdmVTdXBlcnR5cGUoKTsKLSAgICAgIGlmIChwYXJlbnQgIT0gbnVsbCkKLSAgICAgICAgaGFzRXZlbnRzIHw9IHBhcmVudC5oYXNFdmVudHMoZmxhdHRlbik7Ci0gICAgfQotCi0gICAgcmV0dXJuIGhhc0V2ZW50czsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBldmVudCBmb3IgdGhpcyBldmVudCBuYW1lLgotICAgKgotICAgKiBAcGFyYW0gZXZlbnROYW1lICB0aGUgZXZlbnQgbmFtZSB0byBmaW5kCi0gICAqLwotICBwdWJsaWMgRXZlbnRCZWFuIGZpbmRFdmVudCgKLSAgICBTdHJpbmcgZXZlbnROYW1lKQotICB7Ci0gICAgcmV0dXJuIChFdmVudEJlYW4pX2V2ZW50cy5nZXQoZXZlbnROYW1lKTsKLSAgfQotCi0gIHB1YmxpYyBFdmVudEJlYW4gZmluZEV2ZW50KAotICAgIFN0cmluZyBldmVudE5hbWUsCi0gICAgYm9vbGVhbiBmbGF0dGVuKQotICB7Ci0gICAgRXZlbnRCZWFuIGV2ZW50ID0gZmluZEV2ZW50KGV2ZW50TmFtZSk7Ci0gICAgaWYgKGV2ZW50ID09IG51bGwgJiYgZmxhdHRlbikKLSAgICB7Ci0gICAgICBDb21wb25lbnRCZWFuIHBhcmVudCA9IHJlc29sdmVTdXBlcnR5cGUoKTsKLSAgICAgIGlmIChwYXJlbnQgIT0gbnVsbCkKLSAgICAgICAgZXZlbnQgPSBwYXJlbnQuZmluZEV2ZW50KGV2ZW50TmFtZSwgZmxhdHRlbik7Ci0gICAgfQotCi0gICAgcmV0dXJuIGV2ZW50OwotICB9Ci0KLQotICAvKioKLSAgICogUmV0dXJucyBhbiBpdGVyYXRvciBmb3IgYWxsIGV2ZW50cyBvbiB0aGlzIGNvbXBvbmVudCBvbmx5LgotICAgKgotICAgKiBAcmV0dXJuICB0aGUgZXZlbnQgaXRlcmF0b3IKLSAgICovCi0gIHB1YmxpYyBJdGVyYXRvciBldmVudHMoKQotICB7Ci0gICAgcmV0dXJuIF9ldmVudHMudmFsdWVzKCkuaXRlcmF0b3IoKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIGFuIGl0ZXJhdG9yIGZvciBldmVudHMgb24gdGhpcyBjb21wb25lbnQuCi0gICAqCi0gICogQHBhcmFtIGZsYXR0ZW4gIHRydWUgICBpZiB0aGUgaXRlcmF0b3Igc2hvdWxkIGJlIGEgY29tYmluZWQgbGlzdCBvZgotICAqICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRzIG9mIHRoaXMgY29tcG9uZW50IGFuZCBpdHMgc3VwZXJ0eXBlLAotICAqICAgICAgICAgICAgICAgICBmYWxzZSAgb3RoZXJ3aXNlCi0gICoKLSAgKiBAcmV0dXJuICB0aGUgZXZlbnQgaXRlcmF0b3IKLSAgKi8KLSAgcHVibGljIEl0ZXJhdG9yIGV2ZW50cygKLSAgIGJvb2xlYW4gZmxhdHRlbikKLSAgewotICAgIEl0ZXJhdG9yIGV2ZW50cyA9IGV2ZW50cygpOwotICAgIGlmIChmbGF0dGVuKQotICAgIHsKLSAgICAgIENvbXBvbmVudEJlYW4gcGFyZW50ID0gcmVzb2x2ZVN1cGVydHlwZSgpOwotICAgICAgaWYgKHBhcmVudCAhPSBudWxsKQotICAgICAgICBldmVudHMgPSBuZXcgQ29tcG91bmRJdGVyYXRvcihldmVudHMsIHBhcmVudC5ldmVudHModHJ1ZSkpOwotICAgIH0KLSAgICByZXR1cm4gZXZlbnRzOwotICB9Ci0KLSAgLyoqCi0gICAqIEZpbmRzIHRoZSBjb21wb25lbnQgZmFtaWx5IGluIHRoZSBjb21wb25lbnQgaW5oZXJpdGFuY2UKLSAgICogaGllcmFyY2h5LgotICAgKgotICAgKiBAcmV0dXJuICB0aGUgY29tcG9uZW50IGZhbWlseQotICAgKi8KLSAgcHVibGljIFN0cmluZyBmaW5kQ29tcG9uZW50RmFtaWx5KCkKLSAgewotICAgIGlmIChfY29tcG9uZW50RmFtaWx5ICE9IG51bGwpCi0gICAgICByZXR1cm4gX2NvbXBvbmVudEZhbWlseTsKLQotICAgIENvbXBvbmVudEJlYW4gcGFyZW50ID0gcmVzb2x2ZVN1cGVydHlwZSgpOwotICAgIHJldHVybiAocGFyZW50ICE9IG51bGwpID8gcGFyZW50LmZpbmRDb21wb25lbnRGYW1pbHkoKSA6IG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogRmluZHMgdGhlIGJlaGF2aW9yYWwgY29tcG9uZW50IGNvbXBvbmVudCBpbmhlcml0YW5jZQotICAgKiBoaWVyYXJjaHkuCi0gICAqCi0gICAqIEByZXR1cm4gIHRoZSBiZWhhdmlvcmFsIGNvbXBvbmVudAotICAgKi8KLSAgcHVibGljIENvbXBvbmVudEJlYW4gZmluZEJlaGF2aW9yYWxDb21wb25lbnQoKQotICB7Ci0gICAgaWYgKF9jb21wb25lbnRGYW1pbHkgIT0gbnVsbCkKLSAgICAgIHJldHVybiB0aGlzOwotCi0gICAgQ29tcG9uZW50QmVhbiBjb21wb25lbnQgPSByZXNvbHZlU3VwZXJ0eXBlKCk7Ci0gICAgcmV0dXJuIChjb21wb25lbnQgIT0gbnVsbCkgPyBjb21wb25lbnQuZmluZEJlaGF2aW9yYWxDb21wb25lbnQoKSA6IHRoaXM7Ci0gIH0KLQotICAvKioKLSAgICogRmluZHMgdGhlIHJlbmRlcmVyIHR5cGUgaW4gdGhlIGNvbXBvbmVudCBpbmhlcml0YW5jZQotICAgKiBoaWVyYXJjaHkuCi0gICAqCi0gICAqIEByZXR1cm4gIHRoZSByZW5kZXJlciB0eXBlCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGZpbmRSZW5kZXJlclR5cGUoKQotICB7Ci0gICAgaWYgKF9yZW5kZXJlclR5cGUgIT0gbnVsbCkKLSAgICAgIHJldHVybiBfcmVuZGVyZXJUeXBlOwotCi0gICAgQ29tcG9uZW50QmVhbiBwYXJlbnQgPSByZXNvbHZlU3VwZXJ0eXBlKCk7Ci0gICAgcmV0dXJuIChwYXJlbnQgIT0gbnVsbCkgPyBwYXJlbnQuZmluZFJlbmRlcmVyVHlwZSgpIDogbnVsbDsKLSAgfQotCi0KLSAgLyoqCi0gICAqIEZpbmRzIHRoZSBjb21wb25lbnQgc3VwZXJjbGFzcyBpbiB0aGUgY29tcG9uZW50IGluaGVyaXRhbmNlCi0gICAqIGhpZXJhcmNoeS4KLSAgICoKLSAgICogQHJldHVybiAgdGhlIGNvbXBvbmVudCBzdXBlcmNsYXNzCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGZpbmRDb21wb25lbnRTdXBlcmNsYXNzKCkKLSAgewotICAgIGlmIChfY29tcG9uZW50U3VwZXJjbGFzcyAhPSBudWxsKQotICAgICAgcmV0dXJuIF9jb21wb25lbnRTdXBlcmNsYXNzOwotCi0gICAgQ29tcG9uZW50QmVhbiBwYXJlbnQgPSByZXNvbHZlU3VwZXJ0eXBlKCk7Ci0gICAgcmV0dXJuIChwYXJlbnQgIT0gbnVsbCkgPyBwYXJlbnQuZmluZENvbXBvbmVudENsYXNzKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IChpc1RyaW5pZGFkQ29tcG9uZW50KCkgPyAKLSAgICAgICAgICAgICAgICAgICBfVFJJTklEQURfQ09NUE9ORU5UX0JBU0UgOiBfSlNGX0NPTVBPTkVOVF9CQVNFKTsKLSAgfQotCi0gIC8qKgotICAgKiBGaW5kcyB0aGUgdGFnIHN1cGVyY2xhc3MgaW4gdGhlIGNvbXBvbmVudCBpbmhlcml0YW5jZQotICAgKiBoaWVyYXJjaHkuCi0gICAqCi0gICAqIEByZXR1cm4gIHRoZSB0YWcgc3VwZXJjbGFzcwotICAgKi8KLSAgcHVibGljIFN0cmluZyBmaW5kSnNwVGFnU3VwZXJjbGFzcygpCi0gIHsKLSAgICBpZiAoX3RhZ1N1cGVyY2xhc3MgIT0gbnVsbCkKLSAgICAgIHJldHVybiBfdGFnU3VwZXJjbGFzczsKLQotICAgIENvbXBvbmVudEJlYW4gcGFyZW50ID0gcmVzb2x2ZVN1cGVydHlwZSgpOwotICAgIHJldHVybiAocGFyZW50ICE9IG51bGwpID8gcGFyZW50LmZpbmRKc3BUYWdDbGFzcygpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAoaXNUcmluaWRhZENvbXBvbmVudCgpID8KLSAgICAgICAgICAgICAgICAgIF9UUklOSURBRF9DT01QT05FTlRfVEFHIDogX0pTRl9DT01QT05FTlRfVEFHKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBjb21wb25lbnQgc3VwZXJ0eXBlIGluc3RhbmNlLgotICAgKgotICAgKiBAcmV0dXJuICB0aGUgY29tcG9uZW50IHN1cGVydHlwZSBpbnN0YW5jZQotICAgKi8KLSAgcHVibGljIENvbXBvbmVudEJlYW4gcmVzb2x2ZVN1cGVydHlwZSgpCi0gIHsKLSAgICBpZiAoX2NvbXBvbmVudFN1cGVydHlwZSA9PSBudWxsKQotICAgICAgcmV0dXJuIG51bGw7Ci0KLSAgICBGYWNlc0NvbmZpZ0JlYW4gb3duZXIgPSBnZXRPd25lcigpOwotICAgIHJldHVybiAob3duZXIgIT0gbnVsbCkgPyBvd25lci5maW5kQ29tcG9uZW50KF9jb21wb25lbnRTdXBlcnR5cGUpIDogbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBDaGVja3MgaWYgYW55IG9mIHRoZSBjb21wb25lbnQgc3VwZXJjbGFzc2VzIGlzIFVJWENvbXBvbmVudEJhc2UKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzVHJpbmlkYWRDb21wb25lbnQoKQotICB7Ci0gICAgU3RyaW5nIGltcGxlbWVudGF0aW9uVHlwZSA9IGdldEltcGxlbWVudGF0aW9uVHlwZSgpOwotICAgIGlmIChpbXBsZW1lbnRhdGlvblR5cGUgIT0gbnVsbCkKLSAgICAgIHJldHVybiAidHJpbmlkYWQiLmVxdWFscyhpbXBsZW1lbnRhdGlvblR5cGUpOwotCi0gICAgQ29tcG9uZW50QmVhbiBjb21wb25lbnRTdXBlcnR5cGUgPSByZXNvbHZlU3VwZXJ0eXBlKCk7Ci0gICAgaWYgKGNvbXBvbmVudFN1cGVydHlwZSAhPSBudWxsKQotICAgIHsKLSAgICAgIGlmIChfVFJJTklEQURfQ09NUE9ORU5UX0JBU0UuZXF1YWxzKGNvbXBvbmVudFN1cGVydHlwZS5nZXRDb21wb25lbnRDbGFzcygpKSkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBjb21wb25lbnRTdXBlcnR5cGUuaXNUcmluaWRhZENvbXBvbmVudCgpOwotICAgICAgfQotICAgIH0KLSAgICAKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAvKioKLSAgICogRmluZHMgdGhlIGNvbXBvbmVudCBjbGFzcyBpbiB0aGUgY29tcG9uZW50IGluaGVyaXRhbmNlCi0gICAqIGhpZXJhcmNoeS4KLSAgICoKLSAgICogQHJldHVybiAgdGhlIGNvbXBvbmVudCBjbGFzcwotICAgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyBmaW5kQ29tcG9uZW50Q2xhc3MoKQotICB7Ci0gICAgaWYgKF9jb21wb25lbnRDbGFzcyAhPSBudWxsKQotICAgICAgcmV0dXJuIF9jb21wb25lbnRDbGFzczsKLQotICAgIENvbXBvbmVudEJlYW4gcGFyZW50ID0gcmVzb2x2ZVN1cGVydHlwZSgpOwotICAgIHJldHVybiAocGFyZW50ICE9IG51bGwpID8gcGFyZW50LmZpbmRDb21wb25lbnRDbGFzcygpIDogbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBGaW5kcyB0aGUgdGFnIGNsYXNzIGluIHRoZSBjb21wb25lbnQgaW5oZXJpdGFuY2UKLSAgICogaGllcmFyY2h5LgotICAgKgotICAgKiBAcmV0dXJuICB0aGUgdGFnIGNsYXNzCi0gICAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIGZpbmRKc3BUYWdDbGFzcygpCi0gIHsKLSAgICBpZiAoX3RhZ0NsYXNzICE9IG51bGwpCi0gICAgICByZXR1cm4gX3RhZ0NsYXNzOwotCi0gICAgQ29tcG9uZW50QmVhbiBwYXJlbnQgPSByZXNvbHZlU3VwZXJ0eXBlKCk7Ci0gICAgcmV0dXJuIChwYXJlbnQgIT0gbnVsbCkgPyBwYXJlbnQuZmluZEpzcFRhZ0NsYXNzKCkgOiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIEF0dGFjaGVzIHRoZSBjb21wb25lbnQgYW5kIGFsbCBldmVudCByZWZlcmVuY2VzLgotICAgKgotICAgKiBAcGFyYW0gb3duZXIgIHRoZSBmYWNlcyBjb25maWcgb3duZXIKLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIGF0dGFjaCgKLSAgICBGYWNlc0NvbmZpZ0JlYW4gb3duZXIpCi0gIHsKLSAgICBzdXBlci5hdHRhY2gob3duZXIpOwotICAgIEl0ZXJhdG9yIGV2ZW50cyA9IGV2ZW50cyhmYWxzZSk7Ci0gICAgd2hpbGUgKGV2ZW50cy5oYXNOZXh0KCkpCi0gICAgewotICAgICAgRXZlbnRSZWZCZWFuIGV2ZW50UmVmID0gKEV2ZW50UmVmQmVhbilldmVudHMubmV4dCgpOwotICAgICAgZXZlbnRSZWYuYXR0YWNoKG93bmVyKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRDb21wb25lbnRDbGFzc0V4Y2x1ZGVkKGJvb2xlYW4gY29tcG9uZW50Q2xhc3NFeGNsdWRlZCkKLSAgewotICAgIF9jb21wb25lbnRDbGFzc0V4Y2x1ZGVkID0gY29tcG9uZW50Q2xhc3NFeGNsdWRlZDsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGlzQ29tcG9uZW50Q2xhc3NFeGNsdWRlZCgpCi0gIHsKLSAgICByZXR1cm4gX2NvbXBvbmVudENsYXNzRXhjbHVkZWQ7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldFRhZ0NsYXNzRXhjbHVkZWQoYm9vbGVhbiB0YWdDbGFzc0V4Y2x1ZGVkKQotICB7Ci0gICAgX3RhZ0NsYXNzRXhjbHVkZWQgPSB0YWdDbGFzc0V4Y2x1ZGVkOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gaXNUYWdDbGFzc0V4Y2x1ZGVkKCkKLSAgewotICAgIHJldHVybiBfdGFnQ2xhc3NFeGNsdWRlZDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldENvbXBvbmVudEltcGxlbWVudHMoU3RyaW5nIGNvbXBvbmVudEltcGxlbWVudHMpCi0gIHsKLSAgICB0aGlzLl9jb21wb25lbnRJbXBsZW1lbnRzID0gY29tcG9uZW50SW1wbGVtZW50czsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0Q29tcG9uZW50SW1wbGVtZW50cygpCi0gIHsKLSAgICByZXR1cm4gX2NvbXBvbmVudEltcGxlbWVudHM7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRDb21wb25lbnRTZXJpYWxVSUQoU3RyaW5nIGNvbXBvbmVudFNlcmlhbFVJRCkKLSAgewotICAgIHRoaXMuX2NvbXBvbmVudFNlcmlhbFVJRCA9IGNvbXBvbmVudFNlcmlhbFVJRDsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0Q29tcG9uZW50U2VyaWFsVUlEKCkKLSAgewotICAgIHJldHVybiBfY29tcG9uZW50U2VyaWFsVUlEOwotICB9Ci0KLSAgcHJpdmF0ZSBTdHJpbmcgX2NvbXBvbmVudFNlcmlhbFVJRDsKLSAgcHJpdmF0ZSBTdHJpbmcgX2NvbXBvbmVudEltcGxlbWVudHM7Ci0gIHByaXZhdGUgYm9vbGVhbiBfdGFnQ2xhc3NFeGNsdWRlZDsKLSAgcHJpdmF0ZSBib29sZWFuIF9jb21wb25lbnRDbGFzc0V4Y2x1ZGVkOyAgCi0gIHByaXZhdGUgU3RyaW5nICBfZGVzY3JpcHRpb247Ci0gIHByaXZhdGUgU3RyaW5nICBfbG9uZ0Rlc2NyaXB0aW9uOwotICBwcml2YXRlIFN0cmluZyAgX2NvbXBvbmVudFR5cGU7Ci0gIHByaXZhdGUgU3RyaW5nICBfY29tcG9uZW50RmFtaWx5OwotICBwcml2YXRlIFN0cmluZyAgX2NvbXBvbmVudENsYXNzOwotICBwcml2YXRlIFN0cmluZyAgX2NvbXBvbmVudFN1cGVydHlwZTsKLSAgcHJpdmF0ZSBTdHJpbmcgIF9jb21wb25lbnRTdXBlcmNsYXNzOwotICBwcml2YXRlIFN0cmluZyAgX3JlbmRlcmVyVHlwZTsKLSAgcHJpdmF0ZSBTdHJpbmcgIF9pbXBsZW1lbnRhdGlvblR5cGU7Ci0gIHByaXZhdGUgUU5hbWUgICBfdGFnTmFtZTsKLSAgcHJpdmF0ZSBTdHJpbmcgIF90YWdDbGFzczsKLSAgcHJpdmF0ZSBTdHJpbmcgIF90YWdIYW5kbGVyOwotICBwcml2YXRlIFN0cmluZyAgX3RhZ1N1cGVyY2xhc3M7Ci0gIHByaXZhdGUgU3RyaW5nICBfbG9jYWxOYW1lOwotICBwcml2YXRlIFN0cmluZyAgX25vZGVDbGFzczsKLSAgcHJpdmF0ZSBib29sZWFuIF9uYW1pbmdDb250YWluZXI7Ci0gIHByaXZhdGUgYm9vbGVhbiBfY2hpbGRyZW4gPSB0cnVlOwotICBwcml2YXRlIE1hcCAgICAgX3Byb3BlcnRpZXM7Ci0gIHByaXZhdGUgTWFwICAgICBfZmFjZXRzOwotICBwcml2YXRlIE1hcCAgICAgX2V2ZW50czsKLSAgcHJpdmF0ZSBpbnQgICAgIF9jb21wb25lbnRDbGFzc01vZGlmaWVyczsKLSAgcHJpdmF0ZSBpbnQgICAgIF90YWdDbGFzc01vZGlmaWVyczsKLSAgcHJpdmF0ZSBTdHJpbmdbXSBfdW5zdXBwb3J0ZWRBZ2VudHMgPSBuZXcgU3RyaW5nWzBdOwotCi0gIHN0YXRpYyBwcml2YXRlIGZpbmFsIFN0cmluZyBfVFJJTklEQURfQ09NUE9ORU5UX0JBU0UgPQotICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuY29tcG9uZW50LlVJWENvbXBvbmVudEJhc2UiOwotCi0gIHN0YXRpYyBwcml2YXRlIGZpbmFsIFN0cmluZyBfVFJJTklEQURfQ09NUE9ORU5UX1RBRyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC53ZWJhcHAuVUlYQ29tcG9uZW50VGFnIjsKLQotICBzdGF0aWMgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgX0pTRl9DT01QT05FTlRfQkFTRSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgImphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudEJhc2UiOwotCi0gIHN0YXRpYyBwcml2YXRlIGZpbmFsIFN0cmluZyBfSlNGX0NPTVBPTkVOVF9UQUcgPQotICAgICAgICAgICAgICAgICAgICAgICAgICJqYXZheC5mYWNlcy53ZWJhcHAuVUlDb21wb25lbnRUYWciOwotICAKLSAgc3RhdGljIHByaXZhdGUgZmluYWwgTG9nZ2VyIF9MT0cgPSBMb2dnZXIuZ2V0TG9nZ2VyKENvbXBvbmVudEJlYW4uY2xhc3MuZ2V0TmFtZSgpKTsKLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy9wYXJzZS9Db252ZXJ0ZXJCZWFuLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvcGFyc2UvQ29udmVydGVyQmVhbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YzY1MWUwLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy9wYXJzZS9Db252ZXJ0ZXJCZWFuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjAgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLnBhcnNlOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTW9kaWZpZXI7Ci1pbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOwotCi0vKioKLSAqIENvbnZlcnRlckJlYW4gaXMgYSBKYXZhIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBmYWNlcy1jb25maWcgY29udmVydGVyCi0gKiBYTUwgZWxlbWVudC4KLSAqLwotcHVibGljIGNsYXNzIENvbnZlcnRlckJlYW4gZXh0ZW5kcyBBYnN0cmFjdFRhZ0JlYW4KLXsKLQotICAvKioKLSAgICogU2V0cyB0aGUgY29udmVydGVyIGlkZW50aWZlciBmb3IgdGhpcyBjb21wb25lbnQuCi0gICAqCi0gICAqIEBwYXJhbSBjb252ZXJ0ZXJJZCAgY29udmVydGVyIGlkZW50aWZlcgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0Q29udmVydGVySWQoCi0gICAgU3RyaW5nIGNvbnZlcnRlcklkKQotICB7Ci0gICAgX2NvbnZlcnRlcklkID0gY29udmVydGVySWQ7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBjb252ZXJ0ZXIgaWRlbnRpZmllciBpcyBzcGVjaWZpZWQsIG90aGVyd2lzZSBmYWxzZS4KLSAgICoKLSAgICogQHJldHVybiAgdHJ1ZSBpZiB0aGUgY29udmVydGVyIGlkZW50aWZpZXIgaXMgc3BlY2lmaWVkLAotICAgKiAgICAgICAgICBvdGhlcndpc2UgZmFsc2UuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBoYXNDb252ZXJ0ZXJJZCgpCi0gIHsKLSAgICByZXR1cm4gKF9jb252ZXJ0ZXJJZCAhPSBudWxsKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBjb252ZXJ0ZXIgaWRlbnRpZmllciBmb3IgdGhpcyBjb21wb25lbnQuCi0gICAqCi0gICAqIEByZXR1cm4gIHRoZSBjb252ZXJ0ZXIgaWRlbnRpZmllcgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRDb252ZXJ0ZXJJZCgpCi0gIHsKLSAgICByZXR1cm4gX2NvbnZlcnRlcklkOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIGNvbnZlcnRlciBjbGFzcyBmb3IgdGhpcyBjb21wb25lbnQuCi0gICAqCi0gICAqIEBwYXJhbSBjb252ZXJ0ZXJDbGFzcyAgdGhlIGNvbnZlcnRlciBjbGFzcwotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0Q29udmVydGVyQ2xhc3MoCi0gICAgU3RyaW5nIGNvbnZlcnRlckNsYXNzKQotICB7Ci0gICAgX2NvbnZlcnRlckNsYXNzID0gY29udmVydGVyQ2xhc3M7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgY29udmVydGVyIGNsYXNzIGZvciB0aGlzIGNvbXBvbmVudC4KLSAgICoKLSAgICogQHJldHVybiAgdGhlIGNvbnZlcnRlciBjbGFzcwotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRDb252ZXJ0ZXJDbGFzcygpCi0gIHsKLSAgICByZXR1cm4gX2NvbnZlcnRlckNsYXNzOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIGNvbnZlcnRlciBzdXBlciBjbGFzcyBmb3IgdGhpcyBjb21wb25lbnQuCi0gICAqCi0gICAqIEBwYXJhbSBjb252ZXJ0ZXJTdXBlckNsYXNzICB0aGUgY29udmVydGVyIHN1cGVyIGNsYXNzCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRDb252ZXJ0ZXJTdXBlckNsYXNzKAotICAgIFN0cmluZyBjb252ZXJ0ZXJTdXBlckNsYXNzKQotICB7Ci0gICAgX2NvbnZlcnRlclN1cGVyQ2xhc3MgPSBjb252ZXJ0ZXJTdXBlckNsYXNzOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGNvbnZlcnRlciBzdXBlciBjbGFzcyBmb3IgdGhpcyBjb21wb25lbnQuCi0gICAqCi0gICAqIEByZXR1cm4gIHRoZSBjb252ZXJ0ZXIgc3VwZXIgY2xhc3MKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0Q29udmVydGVyU3VwZXJDbGFzcygpCi0gIHsKLSAgICByZXR1cm4gX2NvbnZlcnRlclN1cGVyQ2xhc3M7Ci0gIH0KLQotICAvKioKLSAgICogQWRkcyBhIEphdmEgTGFuZ3VhZ2UgY2xhc3MgbW9kaWZpZXIgdG8gdGhlIGNvbnZlcnRlciBjbGFzcy4KLSAgICoKLSAgICogQHBhcmFtIG1vZGlmaWVyICB0aGUgbW9kaWZpZXIgdG8gYmUgYWRkZWQKLSAgICovCi0gIHB1YmxpYyB2b2lkIGFkZENvbnZlcnRlckNsYXNzTW9kaWZpZXIoCi0gICAgaW50IG1vZGlmaWVyKQotICB7Ci0gICAgX2NvbnZlcnRlckNsYXNzTW9kaWZpZXJzIHw9IG1vZGlmaWVyOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIEphdmEgTGFuZ3VhZ2UgY2xhc3MgbW9kaWZpZXJzIGZvciB0aGUgY29udmVydGVyIGNsYXNzLgotICAgKiBCeSBkZWZhdWx0LCB0aGVzZSBtb2RpZmllcnMgaW5jbHVkZSBNb2RpZmllci5QVUJMSUMuCi0gICAqCi0gICAqIEByZXR1cm4gIHRoZSBKYXZhIExhbmd1YWdlIGNsYXNzIG1vZGlmaWVycyBmb3IgdGhlIGNvbnZlcnRlciBjbGFzcwotICAgKi8KLSAgcHVibGljIGludCBnZXRDb252ZXJ0ZXJDbGFzc01vZGlmaWVycygpCi0gIHsKLSAgICBpbnQgbW9kaWZpZXJzID0gX2NvbnZlcnRlckNsYXNzTW9kaWZpZXJzOwotCi0gICAgaWYgKCFNb2RpZmllci5pc1ByaXZhdGUobW9kaWZpZXJzKSAmJgotICAgICAgICAhTW9kaWZpZXIuaXNQcm90ZWN0ZWQobW9kaWZpZXJzKSAmJgotICAgICAgICAhTW9kaWZpZXIuaXNQdWJsaWMobW9kaWZpZXJzKSkKLSAgICB7Ci0gICAgICBtb2RpZmllcnMgfD0gTW9kaWZpZXIuUFVCTElDOwotICAgIH0KLQotICAgIHJldHVybiBtb2RpZmllcnM7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBwYXJzZUNvbnZlcnRlckNsYXNzTW9kaWZpZXIoCi0gICAgU3RyaW5nIG1vZGlmaWVyKQotICB7Ci0gICAgYWRkQ29udmVydGVyQ2xhc3NNb2RpZmllcihfcGFyc2VNb2RpZmllcihtb2RpZmllcikpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0VGFnQ2xhc3NFeGNsdWRlZChib29sZWFuIHRhZ0NsYXNzRXhjbHVkZWQpCi0gIHsKLSAgICBfdGFnQ2xhc3NFeGNsdWRlZCA9IHRhZ0NsYXNzRXhjbHVkZWQ7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBpc1RhZ0NsYXNzRXhjbHVkZWQoKQotICB7Ci0gICAgcmV0dXJuIF90YWdDbGFzc0V4Y2x1ZGVkOwotICB9Ci0KLSAgcHJpdmF0ZSBib29sZWFuIF90YWdDbGFzc0V4Y2x1ZGVkOwotICBwcml2YXRlIFN0cmluZyAgX2NvbnZlcnRlcklkOwotICBwcml2YXRlIFN0cmluZyAgX2NvbnZlcnRlckNsYXNzOwotICBwcml2YXRlIFN0cmluZyAgX2NvbnZlcnRlclN1cGVyQ2xhc3M7Ci0gIHByaXZhdGUgaW50ICAgICBfY29udmVydGVyQ2xhc3NNb2RpZmllcnM7Ci0KLQotICBzdGF0aWMgcHJpdmF0ZSBmaW5hbCBMb2dnZXIgX0xPRyA9IExvZ2dlci5nZXRMb2dnZXIoQ29udmVydGVyQmVhbi5jbGFzcy5nZXROYW1lKCkpOwotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL3BhcnNlL0V2ZW50QmVhbi5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL3BhcnNlL0V2ZW50QmVhbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZTAyZDA3Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy9wYXJzZS9FdmVudEJlYW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MyArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMucGFyc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy51dGlsLlV0aWw7Ci0KLS8qKgotICogRXZlbnRCZWFuIGlzIGEgSmF2YSByZXByZXNlbnRhdGlvbiBvZiB0aGUgZmFjZXMtY29uZmlnLWV4dGVuc2lvbgotICogZXZlbnQgWE1MIGVsZW1lbnQuCi0gKi8KLXB1YmxpYyBjbGFzcyBFdmVudEJlYW4gZXh0ZW5kcyBPYmplY3RCZWFuCi17Ci0gIHB1YmxpYyBTdHJpbmcgZ2V0RXZlbnROYW1lKCkKLSAgewotICAgIHJldHVybiBVdGlsLmdldEV2ZW50TmFtZUZyb21FdmVudFR5cGUoX2V2ZW50VHlwZSk7Ci0gIH0KLQotICAvKioKLSAgICogU2V0cyB0aGUgZGVzY3JpcHRpb24gb2YgdGhpcyBwcm9wZXJ0eS4KLSAgICoKLSAgICogQHBhcmFtIGRlc2NyaXB0aW9uICB0aGUgcHJvcGVydHkgZGVzY3JpcHRpb24KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKAotICAgIFN0cmluZyBkZXNjcmlwdGlvbikKLSAgewotICAgIF9kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGRlc2NyaXB0aW9uIG9mIHRoaXMgcHJvcGVydHkuCi0gICAqCi0gICAqIEByZXR1cm4gIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdGlvbgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpCi0gIHsKLSAgICByZXR1cm4gX2Rlc2NyaXB0aW9uOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIGV2ZW50IHR5cGUgZm9yIHRoaXMgZXZlbnQuCi0gICAqCi0gICAqIEBwYXJhbSBldmVudFR5cGUgIHRoZSBldmVudCB0eXBlCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRFdmVudFR5cGUoCi0gICAgU3RyaW5nIGV2ZW50VHlwZSkKLSAgewotICAgIF9ldmVudFR5cGUgPSBldmVudFR5cGU7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgZXZlbnQgdHlwZSBmb3IgdGhpcyBldmVudC4KLSAgICoKLSAgICogQHJldHVybiAgdGhlIGV2ZW50IHR5cGUKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0RXZlbnRUeXBlKCkKLSAgewotICAgIHJldHVybiBfZXZlbnRUeXBlOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIGV2ZW50IGNsYXNzIGZvciB0aGlzIGV2ZW50LgotICAgKgotICAgKiBAcGFyYW0gZXZlbnROYW1lICB0aGUgZXZlbnQgY2xhc3MKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEV2ZW50Q2xhc3MoCi0gICAgU3RyaW5nIGV2ZW50Q2xhc3MpCi0gIHsKLSAgICBfZXZlbnRDbGFzcyA9IGV2ZW50Q2xhc3M7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgZXZlbnQgY2xhc3MgZm9yIHRoaXMgZXZlbnQuCi0gICAqCi0gICAqIEByZXR1cm4gIHRoZSBldmVudCBjbGFzcwotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRFdmVudENsYXNzKCkKLSAgewotICAgIHJldHVybiBfZXZlbnRDbGFzczsKLSAgfQotCi0gIC8qKgotICAgKiBTZXRzIHRoZSBldmVudCBsaXN0ZW5lciBjbGFzcyBmb3IgdGhpcyBldmVudC4KLSAgICoKLSAgICogQHBhcmFtIGV2ZW50TGlzdGVuZXJDbGFzcyAgdGhlIGV2ZW50IGxpc3RlbmVyIGNsYXNzCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRFdmVudExpc3RlbmVyQ2xhc3MoCi0gICAgU3RyaW5nIGV2ZW50TGlzdGVuZXJDbGFzcykKLSAgewotICAgIF9ldmVudExpc3RlbmVyQ2xhc3MgPSBldmVudExpc3RlbmVyQ2xhc3M7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgZXZlbnQgbGlzdGVuZXIgY2xhc3MgZm9yIHRoaXMgZXZlbnQuCi0gICAqCi0gICAqIEByZXR1cm4gIHRoZSBldmVudCBsaXN0ZW5lciBjbGFzcwotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRFdmVudExpc3RlbmVyQ2xhc3MoKQotICB7Ci0gICAgcmV0dXJuIF9ldmVudExpc3RlbmVyQ2xhc3M7Ci0gIH0KLQotICAvKioKLSAgICogU2V0cyB0aGUgZXZlbnQgc291cmNlIGludGVyZmFjZSBmb3IgdGhpcyBldmVudC4KLSAgICoKLSAgICogQHBhcmFtIGV2ZW50U291cmNlSW50ZXJmYWNlICB0aGUgZXZlbnQgc291cmNlIGludGVyZmFjZQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0RXZlbnRTb3VyY2VJbnRlcmZhY2UoCi0gICAgU3RyaW5nIGV2ZW50U291cmNlSW50ZXJmYWNlKQotICB7Ci0gICAgX2V2ZW50U291cmNlSW50ZXJmYWNlID0gZXZlbnRTb3VyY2VJbnRlcmZhY2U7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgZXZlbnQgc291cmNlIGludGVyZmFjZSBmb3IgdGhpcyBldmVudC4KLSAgICoKLSAgICogQHJldHVybiAgdGhlIGV2ZW50IHNvdXJjZSBpbnRlcmZhY2UKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0RXZlbnRTb3VyY2VJbnRlcmZhY2UoKQotICB7Ci0gICAgcmV0dXJuIF9ldmVudFNvdXJjZUludGVyZmFjZTsKLSAgfQotCi0gIHByaXZhdGUgU3RyaW5nIF9kZXNjcmlwdGlvbjsKLSAgcHJpdmF0ZSBTdHJpbmcgX2V2ZW50VHlwZTsKLSAgcHJpdmF0ZSBTdHJpbmcgX2V2ZW50Q2xhc3M7Ci0gIHByaXZhdGUgU3RyaW5nIF9ldmVudExpc3RlbmVyQ2xhc3M7Ci0gIHByaXZhdGUgU3RyaW5nIF9ldmVudFNvdXJjZUludGVyZmFjZTsKLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy9wYXJzZS9FdmVudFJlZkJlYW4uamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy9wYXJzZS9FdmVudFJlZkJlYW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQ3MTdlNi4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvcGFyc2UvRXZlbnRSZWZCZWFuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjcgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLnBhcnNlOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMudXRpbC5VdGlsOwotCi0vKioKLSAqIEV2ZW50QmVhbiBpcyBhIEphdmEgcmVwcmVzZW50YXRpb24gb2YgdGhlIGZhY2VzLWNvbmZpZyBjb21wb25lbnQtZXh0ZW5zaW9uCi0gKiBldmVudCBYTUwgZWxlbWVudC4KLSAqLwotcHVibGljIGNsYXNzIEV2ZW50UmVmQmVhbiBleHRlbmRzIE9iamVjdEJlYW4KLXsKLSAgcHVibGljIFN0cmluZyBnZXRFdmVudE5hbWUoKQotICB7Ci0gICAgcmV0dXJuIFV0aWwuZ2V0RXZlbnROYW1lRnJvbUV2ZW50VHlwZShfZXZlbnRUeXBlKTsKLSAgfQotCi0gIC8qKgotICAgKiBTZXRzIHRoZSBldmVudCB0eXBlIGZvciB0aGlzIGV2ZW50IHJlZmVyZW5jZS4KLSAgICoKLSAgICogQHBhcmFtIGV2ZW50VHlwZSAgdGhlIGV2ZW50IHR5cGUKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEV2ZW50VHlwZSgKLSAgICBTdHJpbmcgZXZlbnRUeXBlKQotICB7Ci0gICAgX2V2ZW50VHlwZSA9IGV2ZW50VHlwZTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBldmVudCB0eXBlIGZvciB0aGlzIGV2ZW50LgotICAgKgotICAgKiBAcmV0dXJuICB0aGUgZXZlbnQgdHlwZQotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRFdmVudFR5cGUoKQotICB7Ci0gICAgcmV0dXJuIF9ldmVudFR5cGU7Ci0gIH0KLQotICAvKioKLSAgICogU2V0cyB0aGUgZGVsaXZlcnkgcGhhc2VzIGZvciB0aGlzIGV2ZW50LgotICAgKgotICAgKiBAcGFyYW0gZGVsaXZlcnlQaGFzZXMgIHRoZSBldmVudCBkZWxpdmVyeSBwaGFzZXMKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEV2ZW50RGVsaXZlcnlQaGFzZXMoCi0gICAgU3RyaW5nW10gZGVsaXZlcnlQaGFzZXMpCi0gIHsKLSAgICBpZiAoKF9kZWxpdmVyeVBoYXNlcyAhPSBudWxsKSAmJiAoX2RlbGl2ZXJ5UGhhc2VzLmxlbmd0aCA+IDApKQotICAgIHsKLSAgICAgIGludCBvbGRMZW4gPSBfZGVsaXZlcnlQaGFzZXMubGVuZ3RoOwotICAgICAgaW50IG5ld0xlbiA9IGRlbGl2ZXJ5UGhhc2VzLmxlbmd0aDsKLSAgICAgIFN0cmluZ1tdIG5ld0RlbGl2ZXJ5UGhhc2VzID0gbmV3IFN0cmluZ1tvbGRMZW4gKyBuZXdMZW5dOwotICAgICAgU3lzdGVtLmFycmF5Y29weShfZGVsaXZlcnlQaGFzZXMsIDAsIG5ld0RlbGl2ZXJ5UGhhc2VzLCAwLCBvbGRMZW4pOwotICAgICAgU3lzdGVtLmFycmF5Y29weShkZWxpdmVyeVBoYXNlcywgMCwgbmV3RGVsaXZlcnlQaGFzZXMsIG9sZExlbiwgbmV3TGVuKTsKLSAgICAgIF9kZWxpdmVyeVBoYXNlcyA9IG5ld0RlbGl2ZXJ5UGhhc2VzOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgX2RlbGl2ZXJ5UGhhc2VzID0gZGVsaXZlcnlQaGFzZXM7Ci0gICAgfQotICAgIAotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGRlbGl2ZXJ5IHBoYXNlcyBmb3IgdGhpcyBldmVudC4KLSAgICoKLSAgICogQHJldHVybiAgdGhlIGV2ZW50IGRlbGl2ZXJ5IHBoYXNlcwotICAgKi8KLSAgcHVibGljIFN0cmluZ1tdIGdldEV2ZW50RGVsaXZlcnlQaGFzZXMoKQotICB7Ci0gICAgcmV0dXJuIF9kZWxpdmVyeVBoYXNlczsKLSAgfQotCi0gIC8qKgotICAgKiBTZXRzIGEgZmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgb3Igbm90IHRvIGF1dG9tYXRpY2FsbHkgaW1wbGVtZW50Ci0gICAqIHRoZSBldmVudCBzb3VyY2UgaW50ZXJmYWNlIG9uIHRoZSBnZW5lcmF0ZWQgY29tcG9uZW50IHNvdXJjZS4KLSAgICoKLSAgICogQHBhcmFtIGlnbm9yZVNvdXJjZUludGVyZmFjZSAgdHJ1ZSwgIHRvIGlnbm9yZSB0aGUgZXZlbnQgc291cmNlIGludGVyZmFjZTsKLSAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIG90aGVyd2lzZQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0SWdub3JlU291cmNlSW50ZXJmYWNlKAotICAgIGJvb2xlYW4gaWdub3JlU291cmNlSW50ZXJmYWNlKQotICB7Ci0gICAgX2lnbm9yZVNvdXJjZUludGVyZmFjZSA9IGlnbm9yZVNvdXJjZUludGVyZmFjZTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIGEgZmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgb3Igbm90IHRvIGF1dG9tYXRpY2FsbHkgaW1wbGVtZW50Ci0gICAqIHRoZSBldmVudCBzb3VyY2UgaW50ZXJmYWNlIG9uIHRoZSBnZW5lcmF0ZWQgY29tcG9uZW50IHNvdXJjZS4KLSAgICoKLSAgICogQHJldHVybiAgdHJ1ZSwgIHRvIGlnbm9yZSB0aGUgZXZlbnQgc291cmNlIGludGVyZmFjZTsKLSAgICogICAgICAgICAgZmFsc2UsIG90aGVyd2lzZQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNJZ25vcmVTb3VyY2VJbnRlcmZhY2UoKQotICB7Ci0gICAgcmV0dXJuIF9pZ25vcmVTb3VyY2VJbnRlcmZhY2U7Ci0gIH0KLQotICAvKioKLSAgICogUmVzb2x2ZXMgdGhlIGV2ZW50IHR5cGUuCi0gICAqCi0gICAqIEByZXR1cm4gIHRoZSBldmVudCB3aXRoIHRoZSByZWZlcmVuY2luZyBldmVudCB0eXBlLAotICAgKiAgICAgICAgICBvciBudWxsIGlmIG5vdCBmb3VuZAotICAgKi8KLSAgcHVibGljIEV2ZW50QmVhbiByZXNvbHZlRXZlbnRUeXBlKCkKLSAgewotICAgIHJldHVybiBnZXRPd25lcigpLmZpbmRFdmVudChfZXZlbnRUeXBlKTsKLSAgfQotCi0gIHByaXZhdGUgU3RyaW5nICAgX2V2ZW50VHlwZTsKLSAgcHJpdmF0ZSBTdHJpbmdbXSBfZGVsaXZlcnlQaGFzZXM7Ci0gIHByaXZhdGUgYm9vbGVhbiAgX2lnbm9yZVNvdXJjZUludGVyZmFjZTsKLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy9wYXJzZS9GYWNlc0NvbmZpZ0JlYW4uamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy9wYXJzZS9GYWNlc0NvbmZpZ0JlYW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGZhMTBmZC4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvcGFyc2UvRmFjZXNDb25maWdCZWFuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTUgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLnBhcnNlOwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5UcmVlTWFwOwotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKLQotLyoqCi0gKiBGYWNlc0NvbmZpZ0JlYW4gaXMgYSBKYXZhIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBmYWNlcy1jb25maWcgWE1MIGVsZW1lbnQuCi0gKi8KLXB1YmxpYyBjbGFzcyBGYWNlc0NvbmZpZ0JlYW4gZXh0ZW5kcyBPYmplY3RCZWFuCi17Ci0gIC8qKgotICAgKiBBZGRzIGEgY29udmVydGVyIHRvIHRoaXMgZmFjZXMgY29uZmlnIGRvY3VtZW50LgotICAgKgotICAgKiBAcGFyYW0gY29udmVydGVyICB0aGUgY29udmVydGVyIHRvIGFkZAotICAgKi8KLSAgcHVibGljIHZvaWQgYWRkQ29udmVydGVyKAotICAgIENvbnZlcnRlckJlYW4gY29udmVydGVyKQotICB7Ci0gICAgY29udmVydGVyLmF0dGFjaCh0aGlzKTsKLSAgICBpZiAoY29udmVydGVyLmhhc0NvbnZlcnRlcklkKCkpCi0gICAgICBfY29udmVydGVycy5wdXQoY29udmVydGVyLmdldENvbnZlcnRlcklkKCksIGNvbnZlcnRlcik7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgY29udmVydGVyIGZvciB0aGlzIGNvbnZlcnRlciB0eXBlLgotICAgKgotICAgKiBAcGFyYW0gY29udmVydGVySWQgIHRoZSBjb252ZXJ0ZXIgdHlwZSB0byBmaW5kCi0gICAqLwotICBwdWJsaWMgQ29udmVydGVyQmVhbiBmaW5kQ29udmVydGVyKAotICAgIFN0cmluZyBjb252ZXJ0ZXJJZCkKLSAgewotICAgIHJldHVybiAoQ29udmVydGVyQmVhbilfY29udmVydGVycy5nZXQoY29udmVydGVySWQpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGZhY2VzIGNvbmZpZyBoYXMgYW55IGNvbnZlcnRlcnMuCi0gICAqCi0gICAqIEByZXR1cm4gdHJ1ZSAgaWYgdGhpcyBmYWNlcyBjb25maWcgaGFzIGFueSBjb252ZXJ0ZXJzLAotICAgKiAgICAgICAgIG90aGVyd2lzZSBmYWxzZQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaGFzQ29udmVydGVycygpCi0gIHsKLSAgICByZXR1cm4gIV9jb252ZXJ0ZXJzLmlzRW1wdHkoKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIGFuIGl0ZXJhdG9yIGZvciBhbGwgY29udmVydGVycyBpbiB0aGlzIGZhY2VzCi0gICAqIGNvbmZpZy4KLSAgICoKLSAgICogQHJldHVybiAgdGhlIGNvbnZlcnRlciBpdGVyYXRvcgotICAgKi8KLSAgcHVibGljIEl0ZXJhdG9yIGNvbnZlcnRlcnMoKQotICB7Ci0gICAgcmV0dXJuIF9jb252ZXJ0ZXJzLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0gIH0KLQotICAvKioKLSAgICogQWRkcyBhIHZhbGlkYXRvciB0byB0aGlzIGZhY2VzIGNvbmZpZyBkb2N1bWVudC4KLSAgICoKLSAgICogQHBhcmFtIHZhbGlkYXRvciAgdGhlIHZhbGlkYXRvciB0byBhZGQKLSAgICovCi0gIHB1YmxpYyB2b2lkIGFkZFZhbGlkYXRvcigKLSAgICBWYWxpZGF0b3JCZWFuIHZhbGlkYXRvcikKLSAgewotICAgIHZhbGlkYXRvci5hdHRhY2godGhpcyk7Ci0gICAgaWYgKHZhbGlkYXRvci5oYXNWYWxpZGF0b3JJZCgpKQotICAgICAgX3ZhbGlkYXRvcnMucHV0KHZhbGlkYXRvci5nZXRWYWxpZGF0b3JJZCgpLCB2YWxpZGF0b3IpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHZhbGlkYXRvciBmb3IgdGhpcyB2YWxpZGF0b3IgdHlwZS4KLSAgICoKLSAgICogQHBhcmFtIHZhbGlkYXRvcklkICB0aGUgdmFsaWRhdG9yIHR5cGUgdG8gZmluZAotICAgKi8KLSAgcHVibGljIFZhbGlkYXRvckJlYW4gZmluZFZhbGlkYXRvcigKLSAgICBTdHJpbmcgdmFsaWRhdG9ySWQpCi0gIHsKLSAgICByZXR1cm4gKFZhbGlkYXRvckJlYW4pX3ZhbGlkYXRvcnMuZ2V0KHZhbGlkYXRvcklkKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBmYWNlcyBjb25maWcgaGFzIGFueSB2YWxpZGF0b3JzLgotICAgKgotICAgKiBAcmV0dXJuIHRydWUgIGlmIHRoaXMgZmFjZXMgY29uZmlnIGhhcyBhbnkgdmFsaWRhdG9ycywKLSAgICogICAgICAgICBvdGhlcndpc2UgZmFsc2UKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGhhc1ZhbGlkYXRvcnMoKQotICB7Ci0gICAgcmV0dXJuICFfdmFsaWRhdG9ycy5pc0VtcHR5KCk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyBhbiBpdGVyYXRvciBmb3IgYWxsIHZhbGlkYXRvcnMgaW4gdGhpcyBmYWNlcwotICAgKiBjb25maWcuCi0gICAqCi0gICAqIEByZXR1cm4gIHRoZSB2YWxpZGF0b3IgaXRlcmF0b3IKLSAgICovCi0gIHB1YmxpYyBJdGVyYXRvciB2YWxpZGF0b3JzKCkKLSAgewotICAgIHJldHVybiBfdmFsaWRhdG9ycy52YWx1ZXMoKS5pdGVyYXRvcigpOwotICB9Ci0KLSAgLyoqCi0gICAqIEFkZHMgYSBjb21wb25lbnQgdG8gdGhpcyBmYWNlcyBjb25maWcgZG9jdW1lbnQuCi0gICAqCi0gICAqIEBwYXJhbSBjb21wb25lbnQgIHRoZSBjb21wb25lbnQgdG8gYWRkCi0gICAqLwotICBwdWJsaWMgdm9pZCBhZGRDb21wb25lbnQoCi0gICAgQ29tcG9uZW50QmVhbiBjb21wb25lbnQpCi0gIHsKLSAgICAvLyBHZW5lcmljICJpbmNsdWRlcyIgd2lsbCBub3QgaGF2ZSBhIGNvbXBvbmVudCB0eXBlCi0gICAgaWYgKGNvbXBvbmVudC5nZXRDb21wb25lbnRUeXBlKCkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBjb21wb25lbnQuYXR0YWNoKHRoaXMpOwotICAgICAgX2NvbXBvbmVudHMucHV0KGNvbXBvbmVudC5nZXRDb21wb25lbnRUeXBlKCksIGNvbXBvbmVudCk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGNvbXBvbmVudCBmb3IgdGhpcyBjb21wb25lbnQgdHlwZS4KLSAgICoKLSAgICogQHBhcmFtIGNvbXBvbmVudFR5cGUgIHRoZSBjb21wb25lbnQgdHlwZSB0byBmaW5kCi0gICAqLwotICBwdWJsaWMgQ29tcG9uZW50QmVhbiBmaW5kQ29tcG9uZW50KAotICAgIFN0cmluZyBjb21wb25lbnRUeXBlKQotICB7Ci0gICAgcmV0dXJuIChDb21wb25lbnRCZWFuKV9jb21wb25lbnRzLmdldChjb21wb25lbnRUeXBlKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBmYWNlcyBjb25maWcgaGFzIGFueSBjb21wb25lbnRzLgotICAgKgotICAgKiBAcmV0dXJuIHRydWUgIGlmIHRoaXMgZmFjZXMgY29uZmlnIGhhcyBhbnkgY29tcG9uZW50cywKLSAgICogICAgICAgICBvdGhlcndpc2UgZmFsc2UKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGhhc0NvbXBvbmVudHMoKQotICB7Ci0gICAgcmV0dXJuICFfY29tcG9uZW50cy5pc0VtcHR5KCk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyBhbiBpdGVyYXRvciBmb3IgYWxsIGNvbXBvbmVudHMgaW4gdGhpcyBmYWNlcwotICAgKiBjb25maWcuCi0gICAqCi0gICAqIEByZXR1cm4gIHRoZSBjb21wb25lbnQgaXRlcmF0b3IKLSAgICovCi0gIHB1YmxpYyBJdGVyYXRvciBjb21wb25lbnRzKCkKLSAgewotICAgIHJldHVybiBfY29tcG9uZW50cy52YWx1ZXMoKS5pdGVyYXRvcigpOwotICB9Ci0KLSAgLyoqCi0gICAqIEFkZHMgYW4gZXZlbnQgdG8gdGhpcyBmYWNlcyBjb25maWcgZG9jdW1lbnQuCi0gICAqCi0gICAqIEBwYXJhbSBldmVudCAgdGhlIGV2ZW50IHRvIGFkZAotICAgKi8KLSAgcHVibGljIHZvaWQgYWRkRXZlbnQoCi0gICAgRXZlbnRCZWFuIGV2ZW50KQotICB7Ci0gICAgaWYgKGV2ZW50LmdldEV2ZW50VHlwZSgpID09IG51bGwpCi0gICAgewotICAgICAgX3dhcm5pbmcoIk1pc3NpbmcgZXZlbnQgdHlwZSIpOwotICAgIH0KLSAgICBlbHNlIGlmIChldmVudC5nZXRFdmVudExpc3RlbmVyQ2xhc3MoKSA9PSBudWxsKQotICAgIHsKLSAgICAgIF93YXJuaW5nKCJFdmVudCBcIiIgKyBldmVudC5nZXRFdmVudFR5cGUoKSArICJcIiAiICsKLSAgICAgICAgICAgICAgICAgICAiaGFzIG5vIGxpc3RlbmVyIGNsYXNzIik7Ci0gICAgfQotICAgIGVsc2UgaWYgKGV2ZW50LmdldEV2ZW50Q2xhc3MoKSA9PSBudWxsKQotICAgIHsKLSAgICAgIF93YXJuaW5nKCJFdmVudCBcIiIgKyBldmVudC5nZXRFdmVudFR5cGUoKSArICJcIiAiICsKLSAgICAgICAgICAgICAgICAgICAiaGFzIG5vIGV2ZW50IGNsYXNzIik7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBldmVudC5hdHRhY2godGhpcyk7Ci0gICAgICBfZXZlbnRzLnB1dChldmVudC5nZXRFdmVudFR5cGUoKSwgZXZlbnQpOwotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgdm9pZCBfd2FybmluZyhTdHJpbmcgcykKLSAgewotICAgIF9MT0cud2FybmluZyhzKyJcbiAgcGFyc2luZyByZXNvdXJjZToiK2dldEN1cnJlbnRSZXNvdXJjZSgpKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBldmVudCBmb3IgdGhpcyBldmVudCB0eXBlLgotICAgKgotICAgKiBAcGFyYW0gZXZlbnRUeXBlICB0aGUgZXZlbnQgdHlwZSB0byBmaW5kCi0gICAqLwotICBwdWJsaWMgRXZlbnRCZWFuIGZpbmRFdmVudCgKLSAgICBTdHJpbmcgZXZlbnRUeXBlKQotICB7Ci0gICAgcmV0dXJuIChFdmVudEJlYW4pX2V2ZW50cy5nZXQoZXZlbnRUeXBlKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBmYWNlcyBjb25maWcgaGFzIGFueSBldmVudHMuCi0gICAqCi0gICAqIEByZXR1cm4gdHJ1ZSAgaWYgdGhpcyBmYWNlcyBjb25maWcgaGFzIGFueSBldmVudHMsCi0gICAqICAgICAgICAgb3RoZXJ3aXNlIGZhbHNlCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBoYXNFdmVudHMoKQotICB7Ci0gICAgcmV0dXJuICFfZXZlbnRzLmlzRW1wdHkoKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIGFuIGl0ZXJhdG9yIGZvciBhbGwgZXZlbnRzIGluIHRoaXMgZmFjZXMKLSAgICogY29uZmlnLgotICAgKgotICAgKiBAcmV0dXJuICB0aGUgZXZlbnQgaXRlcmF0b3IKLSAgICovCi0gIHB1YmxpYyBJdGVyYXRvciBldmVudHMoKQotICB7Ci0gICAgcmV0dXJuIF9ldmVudHMudmFsdWVzKCkuaXRlcmF0b3IoKTsKLSAgfQotCi0gIC8qKgotICAgKiBBZGRzIGEgcmVuZGVyIGtpdCB0byB0aGlzIGZhY2VzIGNvbmZpZyBkb2N1bWVudC4KLSAgICoKLSAgICogQHBhcmFtIHJlbmRlcktpdCAgdGhlIHJlbmRlciBraXQgdG8gYWRkCi0gICAqLwotICBwdWJsaWMgdm9pZCBhZGRSZW5kZXJLaXQoCi0gICAgUmVuZGVyS2l0QmVhbiByZW5kZXJLaXQpCi0gIHsKLSAgICBTdHJpbmcgcmVuZGVyS2l0SWQgPSByZW5kZXJLaXQuZ2V0UmVuZGVyS2l0SWQoKTsKLSAgICBSZW5kZXJLaXRCZWFuIGV4aXN0aW5nID0gZmluZFJlbmRlcktpdChyZW5kZXJLaXRJZCk7Ci0KLSAgICBpZiAoZXhpc3RpbmcgPT0gbnVsbCkKLSAgICB7Ci0gICAgICByZW5kZXJLaXQuYXR0YWNoKHRoaXMpOwotICAgICAgX3JlbmRlcktpdHMucHV0KHJlbmRlcktpdElkLCByZW5kZXJLaXQpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgZXhpc3RpbmcuYWRkQWxsUmVuZGVyZXJzKHJlbmRlcktpdCk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHJlbmRlciBraXQgZm9yIHRoaXMgcmVuZGVyIGtpdCBpZC4KLSAgICoKLSAgICogQHBhcmFtIHJlbmRlcktpdElkICB0aGUgcmVuZGVyIGtpdCBpZCB0byBmaW5kCi0gICAqLwotICBwdWJsaWMgUmVuZGVyS2l0QmVhbiBmaW5kUmVuZGVyS2l0KAotICAgIFN0cmluZyByZW5kZXJLaXRJZCkKLSAgewotICAgIHJldHVybiAoUmVuZGVyS2l0QmVhbilfcmVuZGVyS2l0cy5nZXQocmVuZGVyS2l0SWQpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGZhY2VzIGNvbmZpZyBoYXMgYW55IHJlbmRlciBraXRzLgotICAgKgotICAgKiBAcmV0dXJuIHRydWUgIGlmIHRoaXMgZmFjZXMgY29uZmlnIGhhcyBhbnkgcmVuZGVyIGtpdHMsCi0gICAqICAgICAgICAgb3RoZXJ3aXNlIGZhbHNlCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBoYXNSZW5kZXJLaXRzKCkKLSAgewotICAgIHJldHVybiAhX3JlbmRlcktpdHMuaXNFbXB0eSgpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgYW4gaXRlcmF0b3IgZm9yIGFsbCByZW5kZXIga2l0cyBpbiB0aGlzIGZhY2VzCi0gICAqIGNvbmZpZy4KLSAgICoKLSAgICogQHJldHVybiAgdGhlIHJlbmRlciBraXQgaXRlcmF0b3IKLSAgICovCi0gIHB1YmxpYyBJdGVyYXRvciByZW5kZXJLaXRzKCkKLSAgewotICAgIHJldHVybiBfcmVuZGVyS2l0cy52YWx1ZXMoKS5pdGVyYXRvcigpOwotICB9Ci0KLSAgcHVibGljIFVSTCBnZXRDdXJyZW50UmVzb3VyY2UoKQotICB7Ci0gICAgcmV0dXJuIF9jdXJyZW50UmVzb3VyY2U7Ci0gIH0KLSAgCi0gIHB1YmxpYyBVUkwgc2V0Q3VycmVudFJlc291cmNlKFVSTCByZXNvdXJjZSkKLSAgewotICAgIFVSTCBfY3VyID0gX2N1cnJlbnRSZXNvdXJjZTsKLSAgICBfY3VycmVudFJlc291cmNlID0gcmVzb3VyY2U7Ci0gICAgcmV0dXJuIF9jdXI7Ci0gIH0KLQotICBwcml2YXRlIE1hcCBfY29udmVydGVycyA9IG5ldyBUcmVlTWFwKCk7Ci0gIHByaXZhdGUgTWFwIF92YWxpZGF0b3JzID0gbmV3IFRyZWVNYXAoKTsKLSAgcHJpdmF0ZSBNYXAgX2NvbXBvbmVudHMgPSBuZXcgVHJlZU1hcCgpOwotICBwcml2YXRlIE1hcCBfZXZlbnRzID0gbmV3IFRyZWVNYXAoKTsKLSAgcHJpdmF0ZSBNYXAgX3JlbmRlcktpdHMgPSBuZXcgVHJlZU1hcCgpOwotICBwcml2YXRlIFVSTCBfY3VycmVudFJlc291cmNlID0gbnVsbDsKLQotICBzdGF0aWMgcHJpdmF0ZSBmaW5hbCBMb2dnZXIgX0xPRyA9IExvZ2dlci5nZXRMb2dnZXIoRmFjZXNDb25maWdCZWFuLmNsYXNzLmdldE5hbWUoKSk7Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvcGFyc2UvRmFjZXNDb25maWdQYXJzZXIuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy9wYXJzZS9GYWNlc0NvbmZpZ1BhcnNlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYzIxMTE4Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy9wYXJzZS9GYWNlc0NvbmZpZ1BhcnNlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDI1ICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy5wYXJzZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5kaWdlc3Rlci5BYnN0cmFjdE9iamVjdENyZWF0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuZGlnZXN0ZXIuRGlnZXN0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLnBhcnNlLnJ1bGVzLkJlYW5Qcm9wZXJ0eVNldHRlclJ1bGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy51dGlsLlhJbmNsdWRlRmlsdGVyOwotaW1wb3J0IG9yZy54bWwuc2F4LkF0dHJpYnV0ZXM7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotCi1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXJGYWN0b3J5OwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS5uZXQuVVJMQ29ubmVjdGlvbjsKLQotcHVibGljIGNsYXNzIEZhY2VzQ29uZmlnUGFyc2VyCi17Ci0gIHB1YmxpYyB2b2lkIG1lcmdlKAotICAgIEZhY2VzQ29uZmlnQmVhbiBvd25lciwKLSAgICBVUkwgICAgICAgICAgICAgdXJsKSB0aHJvd3MgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbgotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgVVJMQ29ubmVjdGlvbiBjb25uID0gdXJsLm9wZW5Db25uZWN0aW9uKCk7Ci0gICAgICBsb25nIGxhc3RNb2RpZmllZCA9IGNvbm4uZ2V0TGFzdE1vZGlmaWVkKCk7Ci0gICAgICBJbnB1dFN0cmVhbSBpcyA9IGNvbm4uZ2V0SW5wdXRTdHJlYW0oKTsKLQotICAgICAgaWYgKGlzICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIC8vIEVzdGFibGlzaCB0aGUgY3VycmVudCBsYXN0LW1vZGlmaWVkIHZhbHVlCi0gICAgICAgIC8vIEFzIG5ldyBjb21wb25lbnRzIGFyZSBhZGRlZCwgdGhleSB3aWxsIHJlbWVtYmVyCi0gICAgICAgIC8vIHRoaXMgY3VycmVudCB2YWx1ZSBhcyB0aGVpciBvd24gbGFzdC1tb2RpZmllZAotICAgICAgICBvd25lci50b3VjaChsYXN0TW9kaWZpZWQpOwotCi0gICAgICAgIERpZ2VzdGVyIGRpZ2VzdGVyID0gY3JlYXRlRGlnZXN0ZXIoKTsKLSAgICAgICAgZGlnZXN0ZXIucHVzaCh1cmwpOwotICAgICAgICBkaWdlc3Rlci5wdXNoKG93bmVyKTsKLSAgICAgICAgZGlnZXN0ZXIucGFyc2UoaXMpOwotICAgICAgICBpcy5jbG9zZSgpOwotICAgICAgfQotICAgIH0KLSAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbigiRmFpbGVkIHRvIHBhcnNlICIgKyB1cmwsIGUpOwotICAgIH0KLSAgICBjYXRjaCAoU0FYRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgdGhyb3cgbmV3IE1vam9FeGVjdXRpb25FeGNlcHRpb24oIkZhaWxlZCB0byBwYXJzZSAiICsgdXJsLCBlKTsKLSAgICB9Ci0gICAgY2F0Y2ggKFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbigiRmFpbGVkIHRvIHBhcnNlICIgKyB1cmwsIGUpOwotICAgIH0KLSAgfQotCi0KLSAgc3RhdGljIHByb3RlY3RlZCBEaWdlc3RlciBjcmVhdGVFbXB0eURpZ2VzdGVyKCkKLSAgICB0aHJvd3MgUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiwgU0FYRXhjZXB0aW9uCi0gIHsKLSAgICBTQVhQYXJzZXJGYWN0b3J5IHNwZiA9IFNBWFBhcnNlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICBzcGYuc2V0TmFtZXNwYWNlQXdhcmUodHJ1ZSk7Ci0gICAgLy8gcmVxdWlyZXMgSkFYUCAxLjMsIGluIEphdmFTRSA1LjAKLSAgICAvLyBzcGYuc2V0WEluY2x1ZGVBd2FyZSh0cnVlKTsKLSAgICBEaWdlc3RlciBkaWdlc3RlciA9IG5ldyBEaWdlc3RlcihzcGYubmV3U0FYUGFyc2VyKCkpOwotICAgIGRpZ2VzdGVyLnNldE5hbWVzcGFjZUF3YXJlKHRydWUpOwotICAgIAotICAgIHJldHVybiBkaWdlc3RlcjsKLSAgfQotCi0gIHN0YXRpYyBwcm90ZWN0ZWQgdm9pZCBhZGRDb21wb25lbnREaWdlc3RlclJ1bGVzKERpZ2VzdGVyIGRpZ2VzdGVyLCBib29sZWFuIHdpdGhDcmVhdGUpCi0gIHsKLSAgICBkaWdlc3Rlci5zZXRSdWxlTmFtZXNwYWNlVVJJKCJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiKTsKLQotICAgIC8vIGZhY2VzLWNvbmZpZy9jb21wb25lbnQKLSAgICAvLyBPbmx5IHVzZSBpZiB3ZSdyZSBjcmVhdGluZyB0aGUgY29tcG9uZW50OyAgdHVybiB0aGlzIG9mZgotICAgIC8vIHdoZW4gd2UncmUgc2ltcGx5IGluY2x1ZGluZyBjb250ZW50Ci0gICAgaWYgKHdpdGhDcmVhdGUpCi0gICAgewotICAgICAgLy8gZmFjZXMtY29uZmlnL2NvbXBvbmVudAotICAgICAgZGlnZXN0ZXIuYWRkT2JqZWN0Q3JlYXRlKCJmYWNlcy1jb25maWcvY29tcG9uZW50IiwgQ29tcG9uZW50QmVhbi5jbGFzcyk7Ci0gICAgICBkaWdlc3Rlci5hZGRCZWFuUHJvcGVydHlTZXR0ZXIoImZhY2VzLWNvbmZpZy9jb21wb25lbnQvY29tcG9uZW50LXR5cGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb21wb25lbnRUeXBlIik7Ci0gICAgICBkaWdlc3Rlci5hZGRCZWFuUHJvcGVydHlTZXR0ZXIoImZhY2VzLWNvbmZpZy9jb21wb25lbnQvY29tcG9uZW50LWNsYXNzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29tcG9uZW50Q2xhc3MiKTsKLSAgICAgIGRpZ2VzdGVyLmFkZEJlYW5Qcm9wZXJ0eVNldHRlcigiZmFjZXMtY29uZmlnL2NvbXBvbmVudC9kZXNjcmlwdGlvbiIpOwotICAgICAgZGlnZXN0ZXIuYWRkU2V0TmV4dCgiZmFjZXMtY29uZmlnL2NvbXBvbmVudCIsICJhZGRDb21wb25lbnQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb25lbnRCZWFuLmNsYXNzLmdldE5hbWUoKSk7Ci0gICAgfQotCi0gICAgLy8gZmFjZXMtY29uZmlnL2NvbXBvbmVudC9wcm9wZXJ0eQotICAgIGRpZ2VzdGVyLmFkZE9iamVjdENyZWF0ZSgiZmFjZXMtY29uZmlnL2NvbXBvbmVudC9wcm9wZXJ0eSIsIFByb3BlcnR5QmVhbi5jbGFzcyk7Ci0gICAgZGlnZXN0ZXIuYWRkQmVhblByb3BlcnR5U2V0dGVyKCJmYWNlcy1jb25maWcvY29tcG9uZW50L3Byb3BlcnR5L3Byb3BlcnR5LW5hbWUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHJvcGVydHlOYW1lIik7Ci0gICAgZGlnZXN0ZXIuYWRkQmVhblByb3BlcnR5U2V0dGVyKCJmYWNlcy1jb25maWcvY29tcG9uZW50L3Byb3BlcnR5L3Byb3BlcnR5LWNsYXNzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInByb3BlcnR5Q2xhc3MiKTsKLSAgICBkaWdlc3Rlci5hZGRCZWFuUHJvcGVydHlTZXR0ZXIoImZhY2VzLWNvbmZpZy9jb21wb25lbnQvcHJvcGVydHkvZGVzY3JpcHRpb24iKTsKLSAgICBkaWdlc3Rlci5hZGRCZWFuUHJvcGVydHlTZXR0ZXIoImZhY2VzLWNvbmZpZy9jb21wb25lbnQvcHJvcGVydHkvZGVmYXVsdC12YWx1ZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0VmFsdWUiKTsKLSAgICBkaWdlc3Rlci5hZGRTZXROZXh0KCJmYWNlcy1jb25maWcvY29tcG9uZW50L3Byb3BlcnR5IiwgImFkZFByb3BlcnR5IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5QmVhbi5jbGFzcy5nZXROYW1lKCkpOwotICAgIAotCi0gICAgLy8gZmFjZXMtY29uZmlnL2NvbXBvbmVudC9mYWNldAotICAgIGRpZ2VzdGVyLmFkZE9iamVjdENyZWF0ZSgiZmFjZXMtY29uZmlnL2NvbXBvbmVudC9mYWNldCIsIEZhY2V0QmVhbi5jbGFzcyk7Ci0gICAgZGlnZXN0ZXIuYWRkQmVhblByb3BlcnR5U2V0dGVyKCJmYWNlcy1jb25maWcvY29tcG9uZW50L2ZhY2V0L2ZhY2V0LW5hbWUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmFjZXROYW1lIik7Ci0gICAgZGlnZXN0ZXIuYWRkQmVhblByb3BlcnR5U2V0dGVyKCJmYWNlcy1jb25maWcvY29tcG9uZW50L2ZhY2V0L2Rlc2NyaXB0aW9uIik7Ci0gICAgZGlnZXN0ZXIuYWRkU2V0TmV4dCgiZmFjZXMtY29uZmlnL2NvbXBvbmVudC9mYWNldCIsICJhZGRGYWNldCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBGYWNldEJlYW4uY2xhc3MuZ2V0TmFtZSgpKTsKLQotICAgIC8vIE1hdmVuIEZhY2VzIFBsdWdpbgotICAgIGRpZ2VzdGVyLnNldFJ1bGVOYW1lc3BhY2VVUkkoImh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvbWF2ZW4tZmFjZXMtcGx1Z2luIik7Ci0KLSAgICAvLyBmYWNlcy1jb25maWcvY29tcG9uZW50L2NvbXBvbmVudC1leHRlbnNpb24KLSAgICBkaWdlc3Rlci5hZGRCZWFuUHJvcGVydHlTZXR0ZXIoImZhY2VzLWNvbmZpZy9jb21wb25lbnQvY29tcG9uZW50LWV4dGVuc2lvbi9sb25nLWRlc2NyaXB0aW9uIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxvbmdEZXNjcmlwdGlvbiIpOwotICAgIGRpZ2VzdGVyLmFkZEJlYW5Qcm9wZXJ0eVNldHRlcigiZmFjZXMtY29uZmlnL2NvbXBvbmVudC9jb21wb25lbnQtZXh0ZW5zaW9uL2NvbXBvbmVudC1mYW1pbHkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29tcG9uZW50RmFtaWx5Iik7Ci0gICAgZGlnZXN0ZXIuYWRkQmVhblByb3BlcnR5U2V0dGVyKCJmYWNlcy1jb25maWcvY29tcG9uZW50L2NvbXBvbmVudC1leHRlbnNpb24vY29tcG9uZW50LXN1cGVydHlwZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb21wb25lbnRTdXBlcnR5cGUiKTsKLSAgICBkaWdlc3Rlci5hZGRCZWFuUHJvcGVydHlTZXR0ZXIoImZhY2VzLWNvbmZpZy9jb21wb25lbnQvY29tcG9uZW50LWV4dGVuc2lvbi9jb21wb25lbnQtc3VwZXJjbGFzcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb21wb25lbnRTdXBlcmNsYXNzIik7Ci0gICAgZGlnZXN0ZXIuYWRkQmVhblByb3BlcnR5U2V0dGVyKCJmYWNlcy1jb25maWcvY29tcG9uZW50L2NvbXBvbmVudC1leHRlbnNpb24vcmVuZGVyZXItdHlwZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZW5kZXJlclR5cGUiKTsKLSAgICBkaWdlc3Rlci5hZGRCZWFuUHJvcGVydHlTZXR0ZXIoImZhY2VzLWNvbmZpZy9jb21wb25lbnQvY29tcG9uZW50LWV4dGVuc2lvbi9uYW1pbmctY29udGFpbmVyIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5hbWluZ0NvbnRhaW5lciIpOwotICAgIGRpZ2VzdGVyLmFkZEJlYW5Qcm9wZXJ0eVNldHRlcigiZmFjZXMtY29uZmlnL2NvbXBvbmVudC9jb21wb25lbnQtZXh0ZW5zaW9uL2FjY2VwdHMtY2hpbGQtY29tcG9uZW50cyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjaGlsZHJlbiIpOwotICAgIGRpZ2VzdGVyLmFkZEJlYW5Qcm9wZXJ0eVNldHRlcigiZmFjZXMtY29uZmlnL2NvbXBvbmVudC9jb21wb25lbnQtZXh0ZW5zaW9uL3RhZy1jbGFzcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0YWdDbGFzcyIpOwotICAgIGRpZ2VzdGVyLmFkZEJlYW5Qcm9wZXJ0eVNldHRlcigiZmFjZXMtY29uZmlnL2NvbXBvbmVudC9jb21wb25lbnQtZXh0ZW5zaW9uL3RhZy1zdXBlcmNsYXNzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRhZ1N1cGVyY2xhc3MiKTsKLSAgICBkaWdlc3Rlci5hZGRCZWFuUHJvcGVydHlTZXR0ZXIoImZhY2VzLWNvbmZpZy9jb21wb25lbnQvY29tcG9uZW50LWV4dGVuc2lvbi90YWctaGFuZGxlciIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0YWdIYW5kbGVyIik7Ci0gICAgZGlnZXN0ZXIuYWRkQmVhblByb3BlcnR5U2V0dGVyKCJmYWNlcy1jb25maWcvY29tcG9uZW50L2NvbXBvbmVudC1leHRlbnNpb24vaW1wbGVtZW50YXRpb24tdHlwZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbXBsZW1lbnRhdGlvblR5cGUiKTsKLSAgICBkaWdlc3Rlci5hZGRCZWFuUHJvcGVydHlTZXR0ZXIoImZhY2VzLWNvbmZpZy9jb21wb25lbnQvY29tcG9uZW50LWV4dGVuc2lvbi9jb21wb25lbnQtY2xhc3MtZXhjbHVkZWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29tcG9uZW50Q2xhc3NFeGNsdWRlZCIpOwotICAgIGRpZ2VzdGVyLmFkZEJlYW5Qcm9wZXJ0eVNldHRlcigiZmFjZXMtY29uZmlnL2NvbXBvbmVudC9jb21wb25lbnQtZXh0ZW5zaW9uL3RhZy1jbGFzcy1leGNsdWRlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0YWdDbGFzc0V4Y2x1ZGVkIik7Ci0gICAgZGlnZXN0ZXIuYWRkQmVhblByb3BlcnR5U2V0dGVyKCJmYWNlcy1jb25maWcvY29tcG9uZW50L2NvbXBvbmVudC1leHRlbnNpb24vY29tcG9uZW50LWltcGxlbWVudHMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29tcG9uZW50SW1wbGVtZW50cyIpOwotICAgIGRpZ2VzdGVyLmFkZEJlYW5Qcm9wZXJ0eVNldHRlcigiZmFjZXMtY29uZmlnL2NvbXBvbmVudC9jb21wb25lbnQtZXh0ZW5zaW9uL2NvbXBvbmVudC1zZXJpYWwtdWlkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbXBvbmVudFNlcmlhbFVJRCIpOwotICAgIAotICAgIGRpZ2VzdGVyLmFkZENhbGxNZXRob2QoImZhY2VzLWNvbmZpZy9jb21wb25lbnQvY29tcG9uZW50LWV4dGVuc2lvbi90YWctY2xhc3MtbW9kaWZpZXIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgInBhcnNlVGFnQ2xhc3NNb2RpZmllciIsIDEpOwotICAgIGRpZ2VzdGVyLmFkZENhbGxQYXJhbSgiZmFjZXMtY29uZmlnL2NvbXBvbmVudC9jb21wb25lbnQtZXh0ZW5zaW9uL3RhZy1jbGFzcy1tb2RpZmllciIsIDApOwotICAgIGRpZ2VzdGVyLmFkZENhbGxNZXRob2QoImZhY2VzLWNvbmZpZy9jb21wb25lbnQvY29tcG9uZW50LWV4dGVuc2lvbi91bnN1cHBvcnRlZC1hZ2VudHMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgInBhcnNlVW5zdXBwb3J0ZWRBZ2VudHMiLCAxKTsKLSAgICBkaWdlc3Rlci5hZGRDYWxsUGFyYW0oImZhY2VzLWNvbmZpZy9jb21wb25lbnQvY29tcG9uZW50LWV4dGVuc2lvbi91bnN1cHBvcnRlZC1hZ2VudHMiLCAwKTsKLQotICAgIGRpZ2VzdGVyLmFkZENhbGxNZXRob2QoImZhY2VzLWNvbmZpZy9jb21wb25lbnQvY29tcG9uZW50LWV4dGVuc2lvbi9jb21wb25lbnQtY2xhc3MtbW9kaWZpZXIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgInBhcnNlQ29tcG9uZW50Q2xhc3NNb2RpZmllciIsIDEpOwotICAgIGRpZ2VzdGVyLmFkZENhbGxQYXJhbSgiZmFjZXMtY29uZmlnL2NvbXBvbmVudC9jb21wb25lbnQtZXh0ZW5zaW9uL2NvbXBvbmVudC1jbGFzcy1tb2RpZmllciIsIDApOwotICAgIGRpZ2VzdGVyLmFkZFJ1bGUoImZhY2VzLWNvbmZpZy9jb21wb25lbnQvY29tcG9uZW50LWV4dGVuc2lvbi90YWctbmFtZSIsCi0gICAgICAgICAgICAgICAgICAgICBuZXcgQmVhblByb3BlcnR5U2V0dGVyUnVsZSgidGFnTmFtZSIpKTsKLSAgICBkaWdlc3Rlci5hZGRCZWFuUHJvcGVydHlTZXR0ZXIoImZhY2VzLWNvbmZpZy9jb21wb25lbnQvY29tcG9uZW50LWV4dGVuc2lvbi91aXgyLWxvY2FsLW5hbWUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibG9jYWxOYW1lIik7Ci0gICAgZGlnZXN0ZXIuYWRkQmVhblByb3BlcnR5U2V0dGVyKCJmYWNlcy1jb25maWcvY29tcG9uZW50L2NvbXBvbmVudC1leHRlbnNpb24vdWl4Mi1ub2RlLWNsYXNzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5vZGVDbGFzcyIpOwotCi0gICAgLy8gZmFjZXMtY29uZmlnL2NvbXBvbmVudC9jb21wb25lbnQtZXh0ZW5zaW9uL2V2ZW50Ci0gICAgZGlnZXN0ZXIuYWRkT2JqZWN0Q3JlYXRlKCJmYWNlcy1jb25maWcvY29tcG9uZW50L2NvbXBvbmVudC1leHRlbnNpb24vZXZlbnQiLCBFdmVudFJlZkJlYW4uY2xhc3MpOwotICAgIGRpZ2VzdGVyLmFkZEJlYW5Qcm9wZXJ0eVNldHRlcigiZmFjZXMtY29uZmlnL2NvbXBvbmVudC9jb21wb25lbnQtZXh0ZW5zaW9uL2V2ZW50L2V2ZW50LXR5cGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXZlbnRUeXBlIik7Ci0gICAgZGlnZXN0ZXIuYWRkQmVhblByb3BlcnR5U2V0dGVyKCJmYWNlcy1jb25maWcvY29tcG9uZW50L2NvbXBvbmVudC1leHRlbnNpb24vZXZlbnQvZXZlbnQtZGVsaXZlcnktcGhhc2UiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXZlbnREZWxpdmVyeVBoYXNlcyIpOwotICAgIGRpZ2VzdGVyLmFkZEJlYW5Qcm9wZXJ0eVNldHRlcigiZmFjZXMtY29uZmlnL2NvbXBvbmVudC9jb21wb25lbnQtZXh0ZW5zaW9uL2V2ZW50L2lnbm9yZS1zb3VyY2UtaW50ZXJmYWNlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImlnbm9yZVNvdXJjZUludGVyZmFjZSIpOwotICAgIGRpZ2VzdGVyLmFkZFNldE5leHQoImZhY2VzLWNvbmZpZy9jb21wb25lbnQvY29tcG9uZW50LWV4dGVuc2lvbi9ldmVudCIsICJhZGRFdmVudCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBFdmVudFJlZkJlYW4uY2xhc3MuZ2V0TmFtZSgpKTsKLQotICAgIC8vIGZhY2VzLWNvbmZpZy9jb21wb25lbnQvcHJvcGVydHkvcHJvcGVydHktZXh0ZW5zaW9uCi0gICAgZGlnZXN0ZXIuYWRkQmVhblByb3BlcnR5U2V0dGVyKCJmYWNlcy1jb25maWcvY29tcG9uZW50L3Byb3BlcnR5L3Byb3BlcnR5LWV4dGVuc2lvbi9zdGF0ZS1ob2xkZXIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3RhdGVIb2xkZXIiKTsKLSAgICBkaWdlc3Rlci5hZGRCZWFuUHJvcGVydHlTZXR0ZXIoImZhY2VzLWNvbmZpZy9jb21wb25lbnQvcHJvcGVydHkvcHJvcGVydHktZXh0ZW5zaW9uL2pzcC1wcm9wZXJ0eS1uYW1lIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImpzcFByb3BlcnR5TmFtZSIpOwotICAgIGRpZ2VzdGVyLmFkZEJlYW5Qcm9wZXJ0eVNldHRlcigiZmFjZXMtY29uZmlnL2NvbXBvbmVudC9wcm9wZXJ0eS9wcm9wZXJ0eS1leHRlbnNpb24vbGlzdCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsaXN0Iik7Ci0gICAgZGlnZXN0ZXIuYWRkQmVhblByb3BlcnR5U2V0dGVyKCJmYWNlcy1jb25maWcvY29tcG9uZW50L3Byb3BlcnR5L3Byb3BlcnR5LWV4dGVuc2lvbi9yZXF1aXJlZCIpOwotICAgIGRpZ2VzdGVyLmFkZEJlYW5Qcm9wZXJ0eVNldHRlcigiZmFjZXMtY29uZmlnL2NvbXBvbmVudC9wcm9wZXJ0eS9wcm9wZXJ0eS1leHRlbnNpb24vYWxpYXMtb2YiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWxpYXNPZiIpOwotICAgIGRpZ2VzdGVyLmFkZEJlYW5Qcm9wZXJ0eVNldHRlcigiZmFjZXMtY29uZmlnL2NvbXBvbmVudC9wcm9wZXJ0eS9wcm9wZXJ0eS1leHRlbnNpb24vdmlydHVhbCIpOwotICAgIGRpZ2VzdGVyLmFkZEJlYW5Qcm9wZXJ0eVNldHRlcigiZmFjZXMtY29uZmlnL2NvbXBvbmVudC9wcm9wZXJ0eS9wcm9wZXJ0eS1leHRlbnNpb24vdHJhbnNpZW50Iik7Ci0gICAgZGlnZXN0ZXIuYWRkQmVhblByb3BlcnR5U2V0dGVyKCJmYWNlcy1jb25maWcvY29tcG9uZW50L3Byb3BlcnR5L3Byb3BlcnR5LWV4dGVuc2lvbi9saXRlcmFsLW9ubHkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibGl0ZXJhbE9ubHkiKTsKLSAgICBkaWdlc3Rlci5hZGRCZWFuUHJvcGVydHlTZXR0ZXIoImZhY2VzLWNvbmZpZy9jb21wb25lbnQvcHJvcGVydHkvcHJvcGVydHktZXh0ZW5zaW9uL2VudW0iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZW51bSIpOwotICAgIGRpZ2VzdGVyLmFkZEJlYW5Qcm9wZXJ0eVNldHRlcigiZmFjZXMtY29uZmlnL2NvbXBvbmVudC9wcm9wZXJ0eS9wcm9wZXJ0eS1leHRlbnNpb24vYWx0ZXJuYXRlLWNsYXNzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFsdGVybmF0ZUNsYXNzIik7Ci0gICAgZGlnZXN0ZXIuYWRkQmVhblByb3BlcnR5U2V0dGVyKCJmYWNlcy1jb25maWcvY29tcG9uZW50L3Byb3BlcnR5L3Byb3BlcnR5LWV4dGVuc2lvbi90YWctYXR0cmlidXRlLWV4Y2x1ZGVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRhZ0F0dHJpYnV0ZUV4Y2x1ZGVkIik7Ci0gICAgZGlnZXN0ZXIuYWRkQmVhblByb3BlcnR5U2V0dGVyKCJmYWNlcy1jb25maWcvY29tcG9uZW50L3Byb3BlcnR5L3Byb3BlcnR5LWV4dGVuc2lvbi9pcy1zZXQtbWV0aG9kIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImlzU2V0TWV0aG9kIik7Ci0gICAgZGlnZXN0ZXIuYWRkQmVhblByb3BlcnR5U2V0dGVyKCJmYWNlcy1jb25maWcvY29tcG9uZW50L3Byb3BlcnR5L3Byb3BlcnR5LWV4dGVuc2lvbi9pcy1zZXQtbWV0aG9kLXNjb3BlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImlzU2V0TWV0aG9kU2NvcGUiKTsKLSAgICBkaWdlc3Rlci5hZGRCZWFuUHJvcGVydHlTZXR0ZXIoImZhY2VzLWNvbmZpZy9jb21wb25lbnQvcHJvcGVydHkvcHJvcGVydHktZXh0ZW5zaW9uL2lzLWdldC1sb2NhbC1tZXRob2QiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaXNHZXRMb2NhbE1ldGhvZCIpOwotICAgIGRpZ2VzdGVyLmFkZEJlYW5Qcm9wZXJ0eVNldHRlcigiZmFjZXMtY29uZmlnL2NvbXBvbmVudC9wcm9wZXJ0eS9wcm9wZXJ0eS1leHRlbnNpb24vaXMtZ2V0LWxvY2FsLW1ldGhvZC1zY29wZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaXNHZXRMb2NhbE1ldGhvZFNjb3BlIik7Ci0gICAgZGlnZXN0ZXIuYWRkQmVhblByb3BlcnR5U2V0dGVyKCJmYWNlcy1jb25maWcvY29tcG9uZW50L3Byb3BlcnR5L3Byb3BlcnR5LWV4dGVuc2lvbi9ydGV4cHJ2YWx1ZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicnRleHBydmFsdWUiKTsKLSAgICAKLSAgICBkaWdlc3Rlci5hZGRDYWxsTWV0aG9kKCJmYWNlcy1jb25maWcvY29tcG9uZW50L3Byb3BlcnR5L3Byb3BlcnR5LWV4dGVuc2lvbi9wcm9wZXJ0eS12YWx1ZXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgInBhcnNlUHJvcGVydHlWYWx1ZXMiLCAxKTsKLSAgICBkaWdlc3Rlci5hZGRDYWxsUGFyYW0oImZhY2VzLWNvbmZpZy9jb21wb25lbnQvcHJvcGVydHkvcHJvcGVydHktZXh0ZW5zaW9uL3Byb3BlcnR5LXZhbHVlcyIsIDApOwotICAgIGRpZ2VzdGVyLmFkZENhbGxNZXRob2QoImZhY2VzLWNvbmZpZy9jb21wb25lbnQvcHJvcGVydHkvcHJvcGVydHktZXh0ZW5zaW9uL3Vuc3VwcG9ydGVkLWFnZW50cyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAicGFyc2VVbnN1cHBvcnRlZEFnZW50cyIsIDEpOwotICAgIGRpZ2VzdGVyLmFkZENhbGxQYXJhbSgiZmFjZXMtY29uZmlnL2NvbXBvbmVudC9wcm9wZXJ0eS9wcm9wZXJ0eS1leHRlbnNpb24vdW5zdXBwb3J0ZWQtYWdlbnRzIiwgMCk7Ci0gICAgZGlnZXN0ZXIuYWRkQ2FsbE1ldGhvZCgiZmFjZXMtY29uZmlnL2NvbXBvbmVudC9wcm9wZXJ0eS9wcm9wZXJ0eS1leHRlbnNpb24vdW5zdXBwb3J0ZWQtcmVuZGVyLWtpdHMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgInBhcnNlVW5zdXBwb3J0ZWRSZW5kZXJLaXRzIiwgMSk7Ci0gICAgZGlnZXN0ZXIuYWRkQ2FsbFBhcmFtKCJmYWNlcy1jb25maWcvY29tcG9uZW50L3Byb3BlcnR5L3Byb3BlcnR5LWV4dGVuc2lvbi91bnN1cHBvcnRlZC1yZW5kZXIta2l0cyIsIDApOwotCi0gICAgZGlnZXN0ZXIuYWRkT2JqZWN0Q3JlYXRlKCJmYWNlcy1jb25maWcvY29tcG9uZW50L3Byb3BlcnR5L3Byb3BlcnR5LWV4dGVuc2lvbi9tZXRob2QtYmluZGluZy1zaWduYXR1cmUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRob2RTaWduYXR1cmVCZWFuLmNsYXNzKTsKLSAgICBkaWdlc3Rlci5hZGRCZWFuUHJvcGVydHlTZXR0ZXIoImZhY2VzLWNvbmZpZy9jb21wb25lbnQvcHJvcGVydHkvcHJvcGVydHktZXh0ZW5zaW9uL21ldGhvZC1iaW5kaW5nLXNpZ25hdHVyZS9yZXR1cm4tdHlwZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZXR1cm5UeXBlIik7Ci0gICAgZGlnZXN0ZXIuYWRkQ2FsbE1ldGhvZCgiZmFjZXMtY29uZmlnL2NvbXBvbmVudC9wcm9wZXJ0eS9wcm9wZXJ0eS1leHRlbnNpb24vbWV0aG9kLWJpbmRpbmctc2lnbmF0dXJlL3BhcmFtZXRlci10eXBlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJhZGRQYXJhbWV0ZXJUeXBlIiwgMSk7Ci0gICAgZGlnZXN0ZXIuYWRkQ2FsbFBhcmFtKCJmYWNlcy1jb25maWcvY29tcG9uZW50L3Byb3BlcnR5L3Byb3BlcnR5LWV4dGVuc2lvbi9tZXRob2QtYmluZGluZy1zaWduYXR1cmUvcGFyYW1ldGVyLXR5cGUiLCAwKTsKLSAgICBkaWdlc3Rlci5hZGRTZXROZXh0KCJmYWNlcy1jb25maWcvY29tcG9uZW50L3Byb3BlcnR5L3Byb3BlcnR5LWV4dGVuc2lvbi9tZXRob2QtYmluZGluZy1zaWduYXR1cmUiLAotICAgICAgICAgICAgICAgICAgICAgICAgInNldE1ldGhvZEJpbmRpbmdTaWduYXR1cmUiLAotICAgICAgICAgICAgICAgICAgICAgICAgTWV0aG9kU2lnbmF0dXJlQmVhbi5jbGFzcy5nZXROYW1lKCkpOwotICAgIC8vIGZhY2VzLWNvbmZpZy9jb21wb25lbnQvcHJvcGVydHkvcHJvcGVydHktZXh0ZW5zaW9uL3Byb3BlcnR5LW1ldGFkYQotICAgIGRpZ2VzdGVyLmFkZEJlYW5Qcm9wZXJ0eVNldHRlcigiZmFjZXMtY29uZmlnL2NvbXBvbmVudC9wcm9wZXJ0eS9wcm9wZXJ0eS1leHRlbnNpb24vcHJvcGVydHktbWV0YWRhdGEvdXNlLW1heC10aW1lIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVzZU1heFRpbWUiKTsgICAgICAgIAotCi0KLSAgICAvLyBYSW5jbHVkZSBydWxlcwotICAgIGRpZ2VzdGVyLnNldFJ1bGVOYW1lc3BhY2VVUkkoWEluY2x1ZGVGaWx0ZXIuWElOQ0xVREVfTkFNRVNQQUNFKTsKLSAgICBkaWdlc3Rlci5hZGRGYWN0b3J5Q3JlYXRlKCJmYWNlcy1jb25maWcvY29tcG9uZW50L2luY2x1ZGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9uZW50SW5jbHVkZUZhY3RvcnkuY2xhc3MpOwotICB9Ci0KLSAgcHJvdGVjdGVkIERpZ2VzdGVyIGNyZWF0ZURpZ2VzdGVyKCkgdGhyb3dzIFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24sIFNBWEV4Y2VwdGlvbgotICB7Ci0gICAgRGlnZXN0ZXIgZGlnZXN0ZXIgPSBjcmVhdGVFbXB0eURpZ2VzdGVyKCk7Ci0KLSAgICBhZGRDb21wb25lbnREaWdlc3RlclJ1bGVzKGRpZ2VzdGVyLCB0cnVlKTsKLSAgICAKLSAgICAvLyBKYXZhIEVudGVycHJpc2UgNS4wCi0gICAgZGlnZXN0ZXIuc2V0UnVsZU5hbWVzcGFjZVVSSSgiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIik7Ci0gICAgLy9kaWdlc3Rlci5hZGRPYmplY3RDcmVhdGUoImZhY2VzLWNvbmZpZyIsIEZhY2VzQ29uZmlnQmVhbi5jbGFzcyk7Ci0KLSAgICAvLyBmYWNlcy1jb25maWcvY29udmVydGVyCi0gICAgZGlnZXN0ZXIuYWRkT2JqZWN0Q3JlYXRlKCJmYWNlcy1jb25maWcvY29udmVydGVyIiwgQ29udmVydGVyQmVhbi5jbGFzcyk7Ci0gICAgZGlnZXN0ZXIuYWRkQmVhblByb3BlcnR5U2V0dGVyKCJmYWNlcy1jb25maWcvY29udmVydGVyL2NvbnZlcnRlci1pZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb252ZXJ0ZXJJZCIpOwotICAgIGRpZ2VzdGVyLmFkZEJlYW5Qcm9wZXJ0eVNldHRlcigiZmFjZXMtY29uZmlnL2NvbnZlcnRlci9jb252ZXJ0ZXItY2xhc3MiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29udmVydGVyQ2xhc3MiKTsKLSAgICBkaWdlc3Rlci5hZGRCZWFuUHJvcGVydHlTZXR0ZXIoImZhY2VzLWNvbmZpZy9jb252ZXJ0ZXIvZGVzY3JpcHRpb24iKTsKLSAgICBkaWdlc3Rlci5hZGRTZXROZXh0KCJmYWNlcy1jb25maWcvY29udmVydGVyIiwgImFkZENvbnZlcnRlciIsCi0gICAgICAgICAgICAgICAgICAgICAgICBDb252ZXJ0ZXJCZWFuLmNsYXNzLmdldE5hbWUoKSk7Ci0KLSAgICAvLyBmYWNlcy1jb25maWcvY29udmVydGVyL3Byb3BlcnR5Ci0gICAgZGlnZXN0ZXIuYWRkT2JqZWN0Q3JlYXRlKCJmYWNlcy1jb25maWcvY29udmVydGVyL3Byb3BlcnR5IiwgUHJvcGVydHlCZWFuLmNsYXNzKTsKLSAgICBkaWdlc3Rlci5hZGRCZWFuUHJvcGVydHlTZXR0ZXIoImZhY2VzLWNvbmZpZy9jb252ZXJ0ZXIvcHJvcGVydHkvcHJvcGVydHktbmFtZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwcm9wZXJ0eU5hbWUiKTsKLSAgICBkaWdlc3Rlci5hZGRCZWFuUHJvcGVydHlTZXR0ZXIoImZhY2VzLWNvbmZpZy9jb252ZXJ0ZXIvcHJvcGVydHkvcHJvcGVydHktY2xhc3MiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHJvcGVydHlDbGFzcyIpOwotICAgIGRpZ2VzdGVyLmFkZEJlYW5Qcm9wZXJ0eVNldHRlcigiZmFjZXMtY29uZmlnL2NvbnZlcnRlci9wcm9wZXJ0eS9kZXNjcmlwdGlvbiIpOwotICAgIGRpZ2VzdGVyLmFkZEJlYW5Qcm9wZXJ0eVNldHRlcigiZmFjZXMtY29uZmlnL2NvbnZlcnRlci9wcm9wZXJ0eS9kZWZhdWx0LXZhbHVlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHRWYWx1ZSIpOwotICAgIGRpZ2VzdGVyLmFkZFNldE5leHQoImZhY2VzLWNvbmZpZy9jb252ZXJ0ZXIvcHJvcGVydHkiLCAiYWRkUHJvcGVydHkiLAotICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlCZWFuLmNsYXNzLmdldE5hbWUoKSk7Ci0KLSAgICAvLyBmYWNlcy1jb25maWcvdmFsaWRhdG9yCi0gICAgZGlnZXN0ZXIuYWRkT2JqZWN0Q3JlYXRlKCJmYWNlcy1jb25maWcvdmFsaWRhdG9yIiwgVmFsaWRhdG9yQmVhbi5jbGFzcyk7Ci0gICAgZGlnZXN0ZXIuYWRkQmVhblByb3BlcnR5U2V0dGVyKCJmYWNlcy1jb25maWcvdmFsaWRhdG9yL3ZhbGlkYXRvci1pZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2YWxpZGF0b3JJZCIpOwotICAgIGRpZ2VzdGVyLmFkZEJlYW5Qcm9wZXJ0eVNldHRlcigiZmFjZXMtY29uZmlnL3ZhbGlkYXRvci92YWxpZGF0b3ItY2xhc3MiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmFsaWRhdG9yQ2xhc3MiKTsKLSAgICBkaWdlc3Rlci5hZGRCZWFuUHJvcGVydHlTZXR0ZXIoImZhY2VzLWNvbmZpZy92YWxpZGF0b3IvZGVzY3JpcHRpb24iKTsKLSAgICBkaWdlc3Rlci5hZGRTZXROZXh0KCJmYWNlcy1jb25maWcvdmFsaWRhdG9yIiwgImFkZFZhbGlkYXRvciIsCi0gICAgICAgICAgICAgICAgICAgICAgICBWYWxpZGF0b3JCZWFuLmNsYXNzLmdldE5hbWUoKSk7Ci0KLSAgICAvLyBmYWNlcy1jb25maWcvdmFsaWRhdG9yL3Byb3BlcnR5Ci0gICAgZGlnZXN0ZXIuYWRkT2JqZWN0Q3JlYXRlKCJmYWNlcy1jb25maWcvdmFsaWRhdG9yL3Byb3BlcnR5IiwgUHJvcGVydHlCZWFuLmNsYXNzKTsKLSAgICBkaWdlc3Rlci5hZGRCZWFuUHJvcGVydHlTZXR0ZXIoImZhY2VzLWNvbmZpZy92YWxpZGF0b3IvcHJvcGVydHkvcHJvcGVydHktbmFtZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwcm9wZXJ0eU5hbWUiKTsKLSAgICBkaWdlc3Rlci5hZGRCZWFuUHJvcGVydHlTZXR0ZXIoImZhY2VzLWNvbmZpZy92YWxpZGF0b3IvcHJvcGVydHkvcHJvcGVydHktY2xhc3MiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHJvcGVydHlDbGFzcyIpOwotICAgIGRpZ2VzdGVyLmFkZEJlYW5Qcm9wZXJ0eVNldHRlcigiZmFjZXMtY29uZmlnL3ZhbGlkYXRvci9wcm9wZXJ0eS9kZXNjcmlwdGlvbiIpOwotICAgIGRpZ2VzdGVyLmFkZEJlYW5Qcm9wZXJ0eVNldHRlcigiZmFjZXMtY29uZmlnL3ZhbGlkYXRvci9wcm9wZXJ0eS9kZWZhdWx0LXZhbHVlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHRWYWx1ZSIpOwotICAgIGRpZ2VzdGVyLmFkZFNldE5leHQoImZhY2VzLWNvbmZpZy92YWxpZGF0b3IvcHJvcGVydHkiLCAiYWRkUHJvcGVydHkiLAotICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlCZWFuLmNsYXNzLmdldE5hbWUoKSk7Ci0KLQotICAgIC8vIGZhY2VzLWNvbmZpZy9yZW5kZXIta2l0Ci0gICAgZGlnZXN0ZXIuYWRkT2JqZWN0Q3JlYXRlKCJmYWNlcy1jb25maWcvcmVuZGVyLWtpdCIsIFJlbmRlcktpdEJlYW4uY2xhc3MpOwotICAgIGRpZ2VzdGVyLmFkZEJlYW5Qcm9wZXJ0eVNldHRlcigiZmFjZXMtY29uZmlnL3JlbmRlci1raXQvcmVuZGVyLWtpdC1pZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZW5kZXJLaXRJZCIpOwotICAgIGRpZ2VzdGVyLmFkZFNldE5leHQoImZhY2VzLWNvbmZpZy9yZW5kZXIta2l0IiwgImFkZFJlbmRlcktpdCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBSZW5kZXJLaXRCZWFuLmNsYXNzLmdldE5hbWUoKSk7Ci0KLSAgICAvLyBmYWNlcy1jb25maWcvcmVuZGVyLWtpdC9yZW5kZXJlcgotICAgIGRpZ2VzdGVyLmFkZE9iamVjdENyZWF0ZSgiZmFjZXMtY29uZmlnL3JlbmRlci1raXQvcmVuZGVyZXIiLCBSZW5kZXJlckJlYW4uY2xhc3MpOwotICAgIGRpZ2VzdGVyLmFkZEJlYW5Qcm9wZXJ0eVNldHRlcigiZmFjZXMtY29uZmlnL3JlbmRlci1raXQvcmVuZGVyZXIvZGVzY3JpcHRpb24iKTsKLSAgICBkaWdlc3Rlci5hZGRCZWFuUHJvcGVydHlTZXR0ZXIoImZhY2VzLWNvbmZpZy9yZW5kZXIta2l0L3JlbmRlcmVyL2NvbXBvbmVudC1mYW1pbHkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29tcG9uZW50RmFtaWx5Iik7Ci0gICAgZGlnZXN0ZXIuYWRkQmVhblByb3BlcnR5U2V0dGVyKCJmYWNlcy1jb25maWcvcmVuZGVyLWtpdC9yZW5kZXJlci9yZW5kZXJlci10eXBlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlbmRlcmVyVHlwZSIpOwotICAgIGRpZ2VzdGVyLmFkZEJlYW5Qcm9wZXJ0eVNldHRlcigiZmFjZXMtY29uZmlnL3JlbmRlci1raXQvcmVuZGVyZXIvcmVuZGVyZXItY2xhc3MiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmVuZGVyZXJDbGFzcyIpOwotICAgIGRpZ2VzdGVyLmFkZFNldE5leHQoImZhY2VzLWNvbmZpZy9yZW5kZXIta2l0L3JlbmRlcmVyIiwgImFkZFJlbmRlcmVyIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIFJlbmRlcmVyQmVhbi5jbGFzcy5nZXROYW1lKCkpOwotCi0KLSAgICAvLyBUQkQ6IEpTUi0yNzYgbWV0YWRhdGEgKGFzayBKZWZmIFN0ZXBoZW5zb24pCi0KLQotICAgIC8vIE1hdmVuIEZhY2VzIFBsdWdpbgotICAgIGRpZ2VzdGVyLnNldFJ1bGVOYW1lc3BhY2VVUkkoImh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvbWF2ZW4tZmFjZXMtcGx1Z2luIik7Ci0KLSAgICAvLyBmYWNlcy1jb25maWcvZmFjZXMtY29uZmlnLWV4dGVuc2lvbi9ldmVudAotICAgIGRpZ2VzdGVyLmFkZE9iamVjdENyZWF0ZSgiZmFjZXMtY29uZmlnL2ZhY2VzLWNvbmZpZy1leHRlbnNpb24vZXZlbnQiLCBFdmVudEJlYW4uY2xhc3MpOwotICAgIGRpZ2VzdGVyLmFkZEJlYW5Qcm9wZXJ0eVNldHRlcigiZmFjZXMtY29uZmlnL2ZhY2VzLWNvbmZpZy1leHRlbnNpb24vZXZlbnQvZGVzY3JpcHRpb24iKTsKLSAgICBkaWdlc3Rlci5hZGRCZWFuUHJvcGVydHlTZXR0ZXIoImZhY2VzLWNvbmZpZy9mYWNlcy1jb25maWctZXh0ZW5zaW9uL2V2ZW50L2V2ZW50LXR5cGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXZlbnRUeXBlIik7Ci0gICAgZGlnZXN0ZXIuYWRkQmVhblByb3BlcnR5U2V0dGVyKCJmYWNlcy1jb25maWcvZmFjZXMtY29uZmlnLWV4dGVuc2lvbi9ldmVudC9ldmVudC1jbGFzcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJldmVudENsYXNzIik7Ci0gICAgZGlnZXN0ZXIuYWRkQmVhblByb3BlcnR5U2V0dGVyKCJmYWNlcy1jb25maWcvZmFjZXMtY29uZmlnLWV4dGVuc2lvbi9ldmVudC9ldmVudC1saXN0ZW5lci1jbGFzcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJldmVudExpc3RlbmVyQ2xhc3MiKTsKLSAgICBkaWdlc3Rlci5hZGRCZWFuUHJvcGVydHlTZXR0ZXIoImZhY2VzLWNvbmZpZy9mYWNlcy1jb25maWctZXh0ZW5zaW9uL2V2ZW50L2V2ZW50LXNvdXJjZS1pbnRlcmZhY2UiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXZlbnRTb3VyY2VJbnRlcmZhY2UiKTsKLSAgICBkaWdlc3Rlci5hZGRTZXROZXh0KCJmYWNlcy1jb25maWcvZmFjZXMtY29uZmlnLWV4dGVuc2lvbi9ldmVudCIsICJhZGRFdmVudCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBFdmVudEJlYW4uY2xhc3MuZ2V0TmFtZSgpKTsKLQotICAgIC8vIGZhY2VzLWNvbmZpZy9jb252ZXJ0ZXIvY29udmVydGVyLWV4dGVuc2lvbgotICAgIGRpZ2VzdGVyLmFkZEJlYW5Qcm9wZXJ0eVNldHRlcigiZmFjZXMtY29uZmlnL2NvbnZlcnRlci9jb252ZXJ0ZXItZXh0ZW5zaW9uL2xvbmctZGVzY3JpcHRpb24iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibG9uZ0Rlc2NyaXB0aW9uIik7Ci0gICAgZGlnZXN0ZXIuYWRkQmVhblByb3BlcnR5U2V0dGVyKCJmYWNlcy1jb25maWcvY29udmVydGVyL2NvbnZlcnRlci1leHRlbnNpb24vdGFnLWNsYXNzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRhZ0NsYXNzIik7Ci0gICAgZGlnZXN0ZXIuYWRkQmVhblByb3BlcnR5U2V0dGVyKCJmYWNlcy1jb25maWcvY29udmVydGVyL2NvbnZlcnRlci1leHRlbnNpb24vdGFnLWNsYXNzLWV4Y2x1ZGVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRhZ0NsYXNzRXhjbHVkZWQiKTsKLSAgICBkaWdlc3Rlci5hZGRSdWxlKCJmYWNlcy1jb25maWcvY29udmVydGVyL2NvbnZlcnRlci1leHRlbnNpb24vdGFnLW5hbWUiLAotICAgICAgICAgICAgICAgICAgICAgbmV3IEJlYW5Qcm9wZXJ0eVNldHRlclJ1bGUoInRhZ05hbWUiKSk7Ci0gICAgZGlnZXN0ZXIuYWRkQ2FsbE1ldGhvZCgiZmFjZXMtY29uZmlnL2NvbnZlcnRlci9jb252ZXJ0ZXItZXh0ZW5zaW9uL3RhZy1jbGFzcy1tb2RpZmllciIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAicGFyc2VUYWdDbGFzc01vZGlmaWVyIiwgMSk7Ci0gICAgZGlnZXN0ZXIuYWRkQ2FsbFBhcmFtKCJmYWNlcy1jb25maWcvY29udmVydGVyL2NvbnZlcnRlci1leHRlbnNpb24vdGFnLWNsYXNzLW1vZGlmaWVyIiwgMCk7Ci0KLSAgICAvLyBmYWNlcy1jb25maWcvY29udmVydGVyL3Byb3BlcnR5L3Byb3BlcnR5LWV4dGVuc2lvbgotICAgIGRpZ2VzdGVyLmFkZEJlYW5Qcm9wZXJ0eVNldHRlcigiZmFjZXMtY29uZmlnL2NvbnZlcnRlci9wcm9wZXJ0eS9wcm9wZXJ0eS1leHRlbnNpb24vdGFnLWF0dHJpYnV0ZS1leGNsdWRlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0YWdBdHRyaWJ1dGVFeGNsdWRlZCIpOwotICAgIGRpZ2VzdGVyLmFkZEJlYW5Qcm9wZXJ0eVNldHRlcigiZmFjZXMtY29uZmlnL2NvbnZlcnRlci9wcm9wZXJ0eS9wcm9wZXJ0eS1leHRlbnNpb24vbGl0ZXJhbC1vbmx5IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxpdGVyYWxPbmx5Iik7Ci0KLSAgICAvLyBmYWNlcy1jb25maWcvdmFsaWRhdG9yL3ZhbGlkYXRvci1leHRlbnNpb24KLSAgICBkaWdlc3Rlci5hZGRCZWFuUHJvcGVydHlTZXR0ZXIoImZhY2VzLWNvbmZpZy92YWxpZGF0b3IvdmFsaWRhdG9yLWV4dGVuc2lvbi9sb25nLWRlc2NyaXB0aW9uIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxvbmdEZXNjcmlwdGlvbiIpOwotICAgIGRpZ2VzdGVyLmFkZEJlYW5Qcm9wZXJ0eVNldHRlcigiZmFjZXMtY29uZmlnL3ZhbGlkYXRvci92YWxpZGF0b3ItZXh0ZW5zaW9uL3RhZy1jbGFzcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0YWdDbGFzcyIpOwotICAgIGRpZ2VzdGVyLmFkZEJlYW5Qcm9wZXJ0eVNldHRlcigiZmFjZXMtY29uZmlnL3ZhbGlkYXRvci92YWxpZGF0b3ItZXh0ZW5zaW9uL3RhZy1jbGFzcy1leGNsdWRlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0YWdDbGFzc0V4Y2x1ZGVkIik7ICAgIAotICAgIGRpZ2VzdGVyLmFkZFJ1bGUoImZhY2VzLWNvbmZpZy92YWxpZGF0b3IvdmFsaWRhdG9yLWV4dGVuc2lvbi90YWctbmFtZSIsCi0gICAgICAgICAgICAgICAgICAgICBuZXcgQmVhblByb3BlcnR5U2V0dGVyUnVsZSgidGFnTmFtZSIpKTsKLSAgICBkaWdlc3Rlci5hZGRDYWxsTWV0aG9kKCJmYWNlcy1jb25maWcvdmFsaWRhdG9yL3ZhbGlkYXRvci1leHRlbnNpb24vdGFnLWNsYXNzLW1vZGlmaWVyIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJwYXJzZVRhZ0NsYXNzTW9kaWZpZXIiLCAxKTsKLSAgICBkaWdlc3Rlci5hZGRDYWxsUGFyYW0oImZhY2VzLWNvbmZpZy92YWxpZGF0b3IvdmFsaWRhdG9yLWV4dGVuc2lvbi90YWctY2xhc3MtbW9kaWZpZXIiLCAwKTsKLSAgICAKLSAgICAvLyBmYWNlcy1jb25maWcvdmFsaWRhdG9yL3Byb3BlcnR5L3Byb3BlcnR5LWV4dGVuc2lvbgotICAgIGRpZ2VzdGVyLmFkZEJlYW5Qcm9wZXJ0eVNldHRlcigiZmFjZXMtY29uZmlnL3ZhbGlkYXRvci9wcm9wZXJ0eS9wcm9wZXJ0eS1leHRlbnNpb24vdGFnLWF0dHJpYnV0ZS1leGNsdWRlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0YWdBdHRyaWJ1dGVFeGNsdWRlZCIpOwotICAgIC8vIGZhY2VzLWNvbmZpZy92YWxpZGF0b3IvcHJvcGVydHkvcHJvcGVydHktZXh0ZW5zaW9uL3Byb3BlcnR5LW1ldGFkYQotICAgIGRpZ2VzdGVyLmFkZEJlYW5Qcm9wZXJ0eVNldHRlcigiZmFjZXMtY29uZmlnL3ZhbGlkYXRvci9wcm9wZXJ0eS9wcm9wZXJ0eS1leHRlbnNpb24vcHJvcGVydHktbWV0YWRhdGEvdXNlLW1heC10aW1lIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1c2VNYXhUaW1lIik7Ci0KLSAgICAvLyBmYWNlcy1jb25maWcvcmVuZGVyLWtpdC9yZW5kZXJlci9yZW5kZXJlci1leHRlbnNpb24KLSAgICBkaWdlc3Rlci5hZGRCZWFuUHJvcGVydHlTZXR0ZXIoImZhY2VzLWNvbmZpZy9yZW5kZXIta2l0L3JlbmRlcmVyL3JlbmRlcmVyLWV4dGVuc2lvbi9jb21wb25lbnQtdHlwZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb21wb25lbnRUeXBlIik7Ci0gICAgZGlnZXN0ZXIuYWRkQmVhblByb3BlcnR5U2V0dGVyKCJmYWNlcy1jb25maWcvcmVuZGVyLWtpdC9yZW5kZXJlci9yZW5kZXJlci1leHRlbnNpb24vcmVuZGVyZXItc3VwZXJjbGFzcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZW5kZXJlclN1cGVyY2xhc3MiKTsKLQotICAgIHJldHVybiBkaWdlc3RlcjsKLSAgfQotCi0gIHN0YXRpYyBwdWJsaWMgY2xhc3MgQ29tcG9uZW50SW5jbHVkZUZhY3RvcnkgZXh0ZW5kcyBBYnN0cmFjdE9iamVjdENyZWF0aW9uRmFjdG9yeQotICB7Ci0gICAgcHVibGljIE9iamVjdCBjcmVhdGVPYmplY3QoCi0gICAgICBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICBTdHJpbmcgaHJlZiA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoImhyZWYiKTsKLSAgICAgIGlmIChocmVmID09IG51bGwpCi0gICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIk1pc3NpbmcgaHJlZiBhdHRyaWJ1dGUiKTsKLQotICAgICAgVVJMIG1hc3RlciA9IChVUkwpZGlnZXN0ZXIuZ2V0Um9vdCgpOwotICAgICAgVVJMIGluY2x1ZGVkID0gbmV3IFVSTChtYXN0ZXIsIGhyZWYpOwotCi0gICAgICBEaWdlc3RlciBpbmNsdWRlZERpZ2VzdGVyID0gY3JlYXRlRW1wdHlEaWdlc3RlcigpOwotICAgICAgYWRkQ29tcG9uZW50RGlnZXN0ZXJSdWxlcyhpbmNsdWRlZERpZ2VzdGVyLCBmYWxzZSk7Ci0gICAgICBpbmNsdWRlZERpZ2VzdGVyLnB1c2goaW5jbHVkZWQpOwotICAgICAgaW5jbHVkZWREaWdlc3Rlci5wdXNoKGRpZ2VzdGVyLnBlZWsoKSk7Ci0KLSAgICAgIFVSTENvbm5lY3Rpb24gY29ubiA9IGluY2x1ZGVkLm9wZW5Db25uZWN0aW9uKCk7Ci0gICAgICBJbnB1dFN0cmVhbSBpcyA9IGNvbm4uZ2V0SW5wdXRTdHJlYW0oKTsKLSAgICAgIGluY2x1ZGVkRGlnZXN0ZXIucGFyc2UoaXMpOwotICAgICAgaXMuY2xvc2UoKTsKLQotICAgICAgLy8gV2UgZG9uJ3QgcmVhbGx5IHdhbnQgdGhlIGluY2x1ZGVkIG9iamVjdCAtIGJ1dCByZXR1cm4gaXQgYW55d2F5Ci0gICAgICByZXR1cm4gaW5jbHVkZWQ7Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvcGFyc2UvRmFjZXRCZWFuLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvcGFyc2UvRmFjZXRCZWFuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0NWI0ZTQuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL3BhcnNlL0ZhY2V0QmVhbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLnBhcnNlOwotCi0vKioKLSAqIEZhY2V0QmVhbiBpcyBhIEphdmEgcmVwcmVzZW50YXRpb24gb2YgdGhlIGZhY2VzLWNvbmZpZyBjb21wb25lbnQgb3IKLSAqIHJlbmRlcmVyIGZhY2V0IFhNTCBlbGVtZW50LgotICovCi1wdWJsaWMgY2xhc3MgRmFjZXRCZWFuIGV4dGVuZHMgT2JqZWN0QmVhbgotewotICAvKioKLSAgICogU2V0cyB0aGUgZmFjZXQgbmFtZSBmb3IgdGhpcyBmYWNldC4KLSAgICoKLSAgICogQHBhcmFtIGZhY2V0TmFtZSAgdGhlIGZhY2V0IG5hbWUKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEZhY2V0TmFtZSgKLSAgICBTdHJpbmcgZmFjZXROYW1lKQotICB7Ci0gICAgX2ZhY2V0TmFtZSA9IGZhY2V0TmFtZTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBmYWNldCBuYW1lIGZvciB0aGlzIGZhY2V0LgotICAgKgotICAgKiBAcmV0dXJuICB0aGUgZmFjZXQgbmFtZQotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRGYWNldE5hbWUoKQotICB7Ci0gICAgcmV0dXJuIF9mYWNldE5hbWU7Ci0gIH0KLQotICAvKioKLSAgICogU2V0cyB0aGUgZGVzY3JpcHRpb24gb2YgdGhpcyBwcm9wZXJ0eS4KLSAgICoKLSAgICogQHBhcmFtIGRlc2NyaXB0aW9uICB0aGUgcHJvcGVydHkgZGVzY3JpcHRpb24KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKAotICAgIFN0cmluZyBkZXNjcmlwdGlvbikKLSAgewotICAgIF9kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGRlc2NyaXB0aW9uIG9mIHRoaXMgcHJvcGVydHkuCi0gICAqCi0gICAqIEByZXR1cm4gIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdGlvbgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpCi0gIHsKLSAgICByZXR1cm4gX2Rlc2NyaXB0aW9uOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIHJlcXVpcmVkIGZsYWcgb2YgdGhpcyBmYWNldC4KLSAgICoKLSAgICogQHBhcmFtIHJlcXVpcmVkICB0aGUgZmFjZXQgcmVxdWlyZWQgZmxhZwotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0UmVxdWlyZWQoCi0gICAgYm9vbGVhbiByZXF1aXJlZCkKLSAgewotICAgIF9yZXF1aXJlZCA9IHJlcXVpcmVkOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgcmVxdWlyZWQgZmxhZyBvZiB0aGlzIGZhY2V0LgotICAgKgotICAgKiBAcmV0dXJuICB0aGUgZmFjZXQgcmVxdWlyZWQgZmxhZwotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNSZXF1aXJlZCgpCi0gIHsKLSAgICByZXR1cm4gX3JlcXVpcmVkOwotICB9Ci0KLSAgcHJpdmF0ZSBTdHJpbmcgIF9kZXNjcmlwdGlvbjsKLSAgcHJpdmF0ZSBTdHJpbmcgIF9mYWNldE5hbWU7Ci0gIHByaXZhdGUgYm9vbGVhbiBfcmVxdWlyZWQ7Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvcGFyc2UvTWV0aG9kU2lnbmF0dXJlQmVhbi5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL3BhcnNlL01ldGhvZFNpZ25hdHVyZUJlYW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjExMjFkMS4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvcGFyc2UvTWV0aG9kU2lnbmF0dXJlQmVhbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLnBhcnNlOwotCi1pbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogTWV0aG9kU2lnbmF0dXJlQmVhbiBpcyBhIEphdmEgcmVwcmVzZW50YXRpb24gb2YgdGhlIGZhY2VzLWNvbmZpZyBjb21wb25lbnQKLSAqIHByb3BlcnR5LWV4dGVuc2lvbiBtZXRob2Qtc2lnbmF0dXJlIFhNTCBlbGVtZW50LgotICovCi1wdWJsaWMgY2xhc3MgTWV0aG9kU2lnbmF0dXJlQmVhbiBleHRlbmRzIE9iamVjdEJlYW4KLXsKLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcgTWV0aG9kU2lnbmF0dXJlQmVhbi4KLSAgICovCi0gIHB1YmxpYyBNZXRob2RTaWduYXR1cmVCZWFuKCkKLSAgewotICAgIF9wYXJhbWV0ZXJUeXBlcyA9IG5ldyBMaW5rZWRMaXN0KCk7Ci0gIH0KLQotICAvKioKLSAgICogQWRkcyBhIG5ldyBwYXJhbWV0ZXIgdHlwZSB0byB0aGlzIG1ldGhvZCBzaWduYXR1cmUuCi0gICAqCi0gICAqIEBwYXJhbSBwYXJhbWV0ZXJUeXBlICB0aGUgcGFyYW1ldGVyIHR5cGUKLSAgICovCi0gIHB1YmxpYyB2b2lkIGFkZFBhcmFtZXRlclR5cGUoCi0gICAgU3RyaW5nIHBhcmFtZXRlclR5cGUpCi0gIHsKLSAgICBfcGFyYW1ldGVyVHlwZXMuYWRkKHBhcmFtZXRlclR5cGUpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGxpc3Qgb2YgcGFyYW1ldGVyIHR5cGVzIGFzIGFuIGFycmF5LgotICAgKgotICAgKiBAcmV0dXJuICB0aGUgcGFyYW1ldGVyIHR5cGUgbGlzdAotICAgKi8KLSAgcHVibGljIFN0cmluZ1tdIGdldFBhcmFtZXRlclR5cGVzKCkKLSAgewotICAgIHJldHVybiAoU3RyaW5nW10pX3BhcmFtZXRlclR5cGVzLnRvQXJyYXkobmV3IFN0cmluZ1swXSk7Ci0gIH0KLQotICAvKioKLSAgICogU2V0cyB0aGUgcmV0dXJuIHR5cGUgb2YgdGhpcyBtZXRob2Qgc2lnbmF0dXJlLgotICAgKgotICAgKiBAcGFyYW0gcmV0dXJuVHlwZSAgdGhlIG1ldGhvZCBzaWduYXR1cmUgcmV0dXJuIHR5cGUKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFJldHVyblR5cGUoCi0gICAgU3RyaW5nIHJldHVyblR5cGUpCi0gIHsKLSAgICBfcmV0dXJuVHlwZSA9IHJldHVyblR5cGU7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgcmV0dXJuIHR5cGUgb2YgdGhpcyBtZXRob2Qgc2lnbmF0dXJlLgotICAgKgotICAgKiBAcmV0dXJuICB0aGUgbWV0aG9kIHNpZ25hdHVyZSByZXR1cm4gdHlwZQotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRSZXR1cm5UeXBlKCkKLSAgewotICAgIHJldHVybiBfcmV0dXJuVHlwZTsKLSAgfQotCi0gIHByaXZhdGUgU3RyaW5nIF9yZXR1cm5UeXBlOwotICBwcml2YXRlIExpc3QgICBfcGFyYW1ldGVyVHlwZXM7Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvcGFyc2UvT2JqZWN0QmVhbi5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL3BhcnNlL09iamVjdEJlYW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTZkMzNhYi4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvcGFyc2UvT2JqZWN0QmVhbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLnBhcnNlOwotCi0vKioKLSAqIE9iamVjdEJlYW4gaXMgdGhlIGJhc2UgY2xhc3MgZm9yIGFsbCBwYXJzZWQgYmVhbnMuCi0gKi8KLXB1YmxpYyBjbGFzcyBPYmplY3RCZWFuCi17Ci0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IE9iamVjdEJlYW4uCi0gICAqLwotICBwdWJsaWMgT2JqZWN0QmVhbigpCi0gIHsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBmYWNlcyBjb25maWcgZG9jdW1lbnQgaGFzIGJlZW4gbW9kaWZpZWQgc2luY2UKLSAgICogdGhlIHNwZWNpZmllZCB0aW1lc3RhbXAuCi0gICAqCi0gICAqIEBwYXJhbSB0aW1lc3RhbXAgIHRoZSB0aW1lc3RhbXAgaW4gVVRDIG1pbGxpcwotICAgKgotICAgKiBAcmV0dXJuIHRydWUgIGlmIHRoaXMgZmFjZXMgY29uZmlnIGRvY3VtZW50IGhhcyBiZWVuIG1vZGlmaWVkLAotICAgKiAgICAgICAgIG90aGVyd2lzZSBmYWxzZQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNNb2RpZmllZFNpbmNlKAotICAgIGxvbmcgdGltZXN0YW1wKQotICB7Ci0gICAgcmV0dXJuIChfbGFzdE1vZGlmaWVkID4gdGltZXN0YW1wKTsKLSAgfQotCi0gIHByb3RlY3RlZCBGYWNlc0NvbmZpZ0JlYW4gZ2V0T3duZXIoKQotICB7Ci0gICAgcmV0dXJuIF9vd25lcjsKLSAgfQotCi0gIC8qKgotICAgKiBBdHRhY2hlcyB0aGUgb2JqZWN0LgotICAgKgotICAgKiBAcGFyYW0gb3duZXIgIHRoZSBmYWNlcyBjb25maWcgb3duZXIKLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIGF0dGFjaCgKLSAgICBGYWNlc0NvbmZpZ0JlYW4gb3duZXIpCi0gIHsKLSAgICBfb3duZXIgPSBvd25lcjsKLSAgICBPYmplY3RCZWFuIG9iamVjdCA9IG93bmVyOwotICAgIHRvdWNoKG9iamVjdC5fbGFzdE1vZGlmaWVkKTsKLSAgfQotCi0gIC8qKgotICAgKiBTZXRzIHRoZSBsYXN0IG1vZGlmaWVkIHRpbWVzdGFtcCBmb3IgdGhlIHBhcnNlZCBmYWNlcyBjb25maWcgZG9jdW1lbnQKLSAgICogaWYgaXQgaXMgbmV3ZXIgdGhhbiB0aGUgZXhpc3RpbmcgbGFzdCBtb2RpZmllZCB0aW1lc3RhbXAuCi0gICAqCi0gICAqIEBwYXJhbSBsYXN0TW9kaWZpZWQgIHRoZSBsYXN0IG1vZGlmaWVkIHRpbWUgaW4gVVRDIG1pbGxpcwotICAgKi8KLSAgdm9pZCB0b3VjaCgKLSAgICBsb25nIGxhc3RNb2RpZmllZCkKLSAgewotICAgIF9sYXN0TW9kaWZpZWQgPSBNYXRoLm1heChfbGFzdE1vZGlmaWVkLCBsYXN0TW9kaWZpZWQpOwotICB9Ci0KLSAgcHJpdmF0ZSBsb25nIF9sYXN0TW9kaWZpZWQ7Ci0gIHByaXZhdGUgRmFjZXNDb25maWdCZWFuIF9vd25lcjsKLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy9wYXJzZS9Qcm9wZXJ0eUJlYW4uamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy9wYXJzZS9Qcm9wZXJ0eUJlYW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDEzMDJmYy4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvcGFyc2UvUHJvcGVydHlCZWFuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MDQgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLnBhcnNlOwotCi0vKioKLSAqIFByb3BlcnR5QmVhbiBpcyBhIEphdmEgcmVwcmVzZW50YXRpb24gb2YgdGhlIGZhY2VzLWNvbmZpZyBjb21wb25lbnQgcHJvcGVydHkKLSAqIFhNTCBlbGVtZW50LgotICovCi1wdWJsaWMgY2xhc3MgUHJvcGVydHlCZWFuIGV4dGVuZHMgQXR0cmlidXRlQmVhbgotewotICAgIHB1YmxpYyB2b2lkIHNldFVzZU1heFRpbWUoYm9vbGVhbiBfdXNlTWF4VGltZSkgCi0gICAgewotICAgICAgdGhpcy5fdXNlTWF4VGltZSA9IF91c2VNYXhUaW1lOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgYm9vbGVhbiBnZXRVc2VNYXhUaW1lKCkgCi0gICAgewotICAgICAgcmV0dXJuIF91c2VNYXhUaW1lOwotICAgIH0KLQotICAvKioKLSAgICogU2V0cyB0aGUgbmFtZSBvZiB0aGlzIHByb3BlcnR5LgotICAgKgotICAgKiBAcGFyYW0gcHJvcGVydHlOYW1lICB0aGUgcHJvcGVydHkgbmFtZQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0UHJvcGVydHlOYW1lKAotICAgIFN0cmluZyBwcm9wZXJ0eU5hbWUpCi0gIHsKLSAgICBzZXRBdHRyaWJ1dGVOYW1lKHByb3BlcnR5TmFtZSk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGlzIHByb3BlcnR5LgotICAgKgotICAgKiBAcmV0dXJuICB0aGUgcHJvcGVydHkgbmFtZQotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eU5hbWUoKQotICB7Ci0gICAgcmV0dXJuIGdldEF0dHJpYnV0ZU5hbWUoKTsKLSAgfQotCi0gIC8qKgotICAgKiBTZXRzIHRoZSBwcm9wZXJ0eSBjbGFzcyBmb3IgdGhpcyBwcm9wZXJ0eS4KLSAgICoKLSAgICogQHBhcmFtIHByb3BlcnR5Q2xhc3MgIHRoZSBwcm9wZXJ0eSBjbGFzcwotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0UHJvcGVydHlDbGFzcygKLSAgICBTdHJpbmcgcHJvcGVydHlDbGFzcykKLSAgewotICAgIHNldEF0dHJpYnV0ZUNsYXNzKHByb3BlcnR5Q2xhc3MpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHByb3BlcnR5IGNsYXNzIGZvciB0aGlzIHByb3BlcnR5LgotICAgKgotICAgKiBAcmV0dXJuICB0aGUgcHJvcGVydHkgY2xhc3MKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHlDbGFzcygpCi0gIHsKLSAgICByZXR1cm4gZ2V0QXR0cmlidXRlQ2xhc3MoKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBhcnJheSBvZiBwYXJhbWV0ZXJpemVkIHR5cGVzIGZvciB0aGlzIHByb3BlcnR5Ci0gICAqIGlmIGl0IHVzZXMgZ2VuZXJpY3MuCi0gICAqCi0gICAqIEByZXR1cm4gdGhlIGFycmF5IG9mIHBhcmFtZXRlcml6ZWQgdHlwZXMgZm9yIHRoaXMgcHJvcGVydHkKLSAgICovCi0gIHB1YmxpYyBTdHJpbmdbXSBnZXRQcm9wZXJ0eUNsYXNzUGFyYW1ldGVycygpCi0gIHsKLSAgICByZXR1cm4gZ2V0QXR0cmlidXRlQ2xhc3NQYXJhbWV0ZXJzKCk7Ci0gIH0KLQotICAvKioKLSAgICogU2V0cyB0aGUgcG9zc2libGUgdmFsdWVzIGZvciB0aGlzIHByb3BlcnR5LgotICAgKgotICAgKiBAcGFyYW0gcHJvcGVydHlWYWx1ZXMgIHRoZSBwcm9wZXJ0eSB2YWx1ZXMKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5VmFsdWVzKAotICAgIFN0cmluZ1tdIHByb3BlcnR5VmFsdWVzKQotICB7Ci0gICAgX3Byb3BlcnR5VmFsdWVzID0gcHJvcGVydHlWYWx1ZXM7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyBwb3NzaWJsZSB2YWx1ZXMgZm9yIHRoaXMgcHJvcGVydHkuCi0gICAqCi0gICAqIEByZXR1cm4gIHRoZSBwcm9wZXJ0eSB2YWx1ZXMKLSAgICovCi0gIHB1YmxpYyBTdHJpbmdbXSBnZXRQcm9wZXJ0eVZhbHVlcygpCi0gIHsKLSAgICByZXR1cm4gX3Byb3BlcnR5VmFsdWVzOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIHN0YXRlSG9sZGVyIGZsYWcgb2YgdGhpcyBwcm9wZXJ0eS4KLSAgICoKLSAgICogQHBhcmFtIHN0YXRlSG9sZGVyICB0aGUgcHJvcGVydHkgc3RhdGVIb2xkZXIgZmxhZwotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0U3RhdGVIb2xkZXIoCi0gICAgYm9vbGVhbiBzdGF0ZUhvbGRlcikKLSAgewotICAgIF9zdGF0ZUhvbGRlciA9IHN0YXRlSG9sZGVyOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgc3RhdGVIb2xkZXIgZmxhZyBvZiB0aGlzIHByb3BlcnR5LgotICAgKgotICAgKiBAcmV0dXJuICB0aGUgcHJvcGVydHkgc3RhdGVIb2xkZXIgZmxhZwotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNTdGF0ZUhvbGRlcigpCi0gIHsKLSAgICByZXR1cm4gX3N0YXRlSG9sZGVyOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIHRyYW5zaWVudCBmbGFnIG9mIHRoaXMgcHJvcGVydHkuCi0gICAqCi0gICAqIEBwYXJhbSB0cmFuc2llbnQgIHRoZSBwcm9wZXJ0eSB0cmFuc2llbnQgZmxhZwotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0VHJhbnNpZW50KAotICAgIGJvb2xlYW4gdHJhbnNpZW50XykKLSAgewotICAgIF90cmFuc2llbnQgPSB0cmFuc2llbnRfOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdHJhbnNpZW50IGZsYWcgb2YgdGhpcyBwcm9wZXJ0eS4KLSAgICoKLSAgICogQHJldHVybiAgdGhlIHByb3BlcnR5IHRyYW5zaWVudCBmbGFnCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc1RyYW5zaWVudCgpCi0gIHsKLSAgICByZXR1cm4gX3RyYW5zaWVudDsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFNldHMgdGhlIGxpc3QgZmxhZyBvZiB0aGlzIHByb3BlcnR5LgotICAgKgotICAgKiBAcGFyYW0gbGlzdCAgdGhlIHByb3BlcnR5IGxpc3QgZmxhZwotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0TGlzdCgKLSAgICBib29sZWFuIGxpc3RfKQotICB7Ci0gICAgX2xpc3QgPSBsaXN0XzsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIGxpc3QgZmxhZyBvZiB0aGlzIHByb3BlcnR5LgotICAgKgotICAgKiBAcmV0dXJuICB0aGUgcHJvcGVydHkgbGlzdCBmbGFnCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc0xpc3QoKQotICB7Ci0gICAgcmV0dXJuIF9saXN0OwotICB9Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIHJlcXVpcmVkIGZsYWcgb2YgdGhpcyBwcm9wZXJ0eS4KLSAgICoKLSAgICogQHBhcmFtIHJlcXVpcmVkICB0aGUgcHJvcGVydHkgcmVxdWlyZWQgZmxhZwotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0UmVxdWlyZWQoCi0gICAgYm9vbGVhbiByZXF1aXJlZCkKLSAgewotICAgIF9yZXF1aXJlZCA9IHJlcXVpcmVkOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgcmVxdWlyZWQgZmxhZyBvZiB0aGlzIHByb3BlcnR5LgotICAgKgotICAgKiBAcmV0dXJuICB0aGUgcHJvcGVydHkgcmVxdWlyZWQgZmxhZwotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNSZXF1aXJlZCgpCi0gIHsKLSAgICByZXR1cm4gX3JlcXVpcmVkOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIGxpdGVyYWxPbmx5IGZsYWcgb2YgdGhpcyBwcm9wZXJ0eS4KLSAgICoKLSAgICogQHBhcmFtIGxpdGVyYWxPbmx5ICB0aGUgcHJvcGVydHkgbGl0ZXJhbE9ubHkgZmxhZwotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0TGl0ZXJhbE9ubHkoCi0gICAgYm9vbGVhbiBsaXRlcmFsT25seSkKLSAgewotICAgIF9saXRlcmFsT25seSA9IGxpdGVyYWxPbmx5OwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgbGl0ZXJhbE9ubHkgZmxhZyBvZiB0aGlzIHByb3BlcnR5LgotICAgKgotICAgKiBAcmV0dXJuICB0aGUgcHJvcGVydHkgbGl0ZXJhbE9ubHkgZmxhZwotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNMaXRlcmFsT25seSgpCi0gIHsKLSAgICByZXR1cm4gX2xpdGVyYWxPbmx5OwotICB9Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIGFsaWFzIG9mIHRoaXMgcHJvcGVydHkuCi0gICAqCi0gICAqIEBwYXJhbSBhbGlhc09mICB0aGUgcHJvcGVydHkgYWxpYXMKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEFsaWFzT2YoCi0gICAgU3RyaW5nIGFsaWFzT2YpCi0gIHsKLSAgICBfYWxpYXNPZiA9IGFsaWFzT2Y7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgYWxpYXMgb2YgdGhpcyBwcm9wZXJ0eS4KLSAgICoKLSAgICogQHJldHVybiAgdGhlIHByb3BlcnR5IGFsaWFzCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldEFsaWFzT2YoKQotICB7Ci0gICAgcmV0dXJuIF9hbGlhc09mOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIHVuc3VwcG9ydGVkIGFnZW50cyBmb3IgdGhpcyBwcm9wZXJ0eS4KLSAgICoKLSAgICogQHBhcmFtIHVuc3VwcG9ydGVkQWdlbnRzICB0aGUgdW5zdXBwb3J0ZWQgYWdlbnRzCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRVbnN1cHBvcnRlZEFnZW50cygKLSAgICBTdHJpbmdbXSB1bnN1cHBvcnRlZEFnZW50cykKLSAgewotICAgIGlmICh1bnN1cHBvcnRlZEFnZW50cyA9PSBudWxsKQotICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJ1bnN1cHBvcnRlZEFnZW50cyIpOwotCi0gICAgX3Vuc3VwcG9ydGVkQWdlbnRzID0gdW5zdXBwb3J0ZWRBZ2VudHM7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB1bnN1cHBvcnRlZCBhZ2VudHMgZm9yIHRoaXMgcHJvcGVydHkuCi0gICAqCi0gICAqIEByZXR1cm4gIHRoZSB1bnN1cHBvcnRlZCBhZ2VudHMKLSAgICovCi0gIHB1YmxpYyBTdHJpbmdbXSBnZXRVbnN1cHBvcnRlZEFnZW50cygpCi0gIHsKLSAgICByZXR1cm4gX3Vuc3VwcG9ydGVkQWdlbnRzOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIHVuc3VwcG9ydGVkIFJlbmRlcktpdHMgZm9yIHRoaXMgcHJvcGVydHkuCi0gICAqCi0gICAqIEBwYXJhbSB1bnN1cHBvcnRlZFJlbmRlcktpdHMgIHRoZSB1bnN1cHBvcnRlZCBSZW5kZXJLaXRzCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRVbnN1cHBvcnRlZFJlbmRlcktpdHMoCi0gICAgU3RyaW5nW10gdW5zdXBwb3J0ZWRSZW5kZXJLaXRzKQotICB7Ci0gICAgaWYgKHVuc3VwcG9ydGVkUmVuZGVyS2l0cyA9PSBudWxsKQotICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJ1bnN1cHBvcnRlZFJlbmRlcktpdHMiKTsKLQotICAgIF91bnN1cHBvcnRlZFJlbmRlcktpdHMgPSB1bnN1cHBvcnRlZFJlbmRlcktpdHM7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB1bnN1cHBvcnRlZCBSZW5kZXJLaXRzIGZvciB0aGlzIHByb3BlcnR5LgotICAgKgotICAgKiBAcmV0dXJuICB0aGUgdW5zdXBwb3J0ZWQgUmVuZGVyS2l0cwotICAgKi8KLSAgcHVibGljIFN0cmluZ1tdIGdldFVuc3VwcG9ydGVkUmVuZGVyS2l0cygpCi0gIHsKLSAgICByZXR1cm4gX3Vuc3VwcG9ydGVkUmVuZGVyS2l0czsKLSAgfQotCi0gIC8qKgotICAgKiBTZXRzIHRoZSB0YWcgYXR0cmlidXRlIGV4Y2x1ZGVkIGZsYWcgZm9yIHRoaXMgcHJvcGVydHkuCi0gICAqCi0gICAqIEBwYXJhbSBleGNsdWRlZCAgdHJ1ZSwgIGlmIHRoZSB0YWcgYXR0cmlidXRlIHNob3VsZCBiZSBleGNsdWRlZDsKLSAgICogICAgICAgICAgICAgICAgICBmYWxzZSwgb3RoZXJ3aXNlCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRUYWdBdHRyaWJ1dGVFeGNsdWRlZCgKLSAgICBib29sZWFuIGV4Y2x1ZGVkKQotICB7Ci0gICAgX3RhZ0F0dHJpYnV0ZUV4Y2x1ZGVkID0gZXhjbHVkZWQ7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgdGFnIGF0dHJpYnV0ZSBleGNsdWRlZCBmbGFnIGZvciB0aGlzIHByb3BlcnR5LgotICAgKgotICAgKiBAcmV0dXJuIHRydWUsICBpZiB0aGUgdGFnIGF0dHJpYnV0ZSBzaG91bGQgYmUgZXhjbHVkZWQ7Ci0gICAqICAgICAgICAgZmFsc2UsIG90aGVyd2lzZQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNUYWdBdHRyaWJ1dGVFeGNsdWRlZCgpCi0gIHsKLSAgICByZXR1cm4gX3RhZ0F0dHJpYnV0ZUV4Y2x1ZGVkOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgcHJvcGVydHkgaXMgYW4gZW51bWVyYXRlZCBKYXZhIHR5cGUuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc0VudW0oKQotICB7Ci0gICAgcmV0dXJuIF9lbnVtOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgcHJvcGVydHkgaXMgYW4gZW51bWVyYXRlZCBKYXZhIHR5cGUuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRFbnVtKGJvb2xlYW4gaXNFbnVtKQotICB7Ci0gICAgX2VudW0gPSBpc0VudW07Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgcHJvcGVydHkgaXMgYSBtZXRob2QgYmluZGluZy4KLSAgICoKLSAgICogQHJldHVybiB0cnVlICBpZiB0aGlzIHByb3BlcnR5IGlzIGEgbWV0aG9kIGJpbmRpbmcsCi0gICAqICAgICAgICAgb3RoZXJ3aXNlIGZhbHNlCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc01ldGhvZEJpbmRpbmcoKQotICB7Ci0gICAgcmV0dXJuICgiamF2YXguZmFjZXMuZWwuTWV0aG9kQmluZGluZyIuZXF1YWxzKGdldFByb3BlcnR5Q2xhc3MoKSkpOwotICB9Ci0KLQotICAvKioKLSAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgcHJvcGVydHkgaXMgYSBtZXRob2QgYmluZGluZy4KLSAgICoKLSAgICogQHJldHVybiB0cnVlICBpZiB0aGlzIHByb3BlcnR5IGlzIGEgbWV0aG9kIGJpbmRpbmcsCi0gICAqICAgICAgICAgb3RoZXJ3aXNlIGZhbHNlCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc01ldGhvZEV4cHJlc3Npb24oKQotICB7Ci0gICAgcmV0dXJuICgiamF2YXguZWwuTWV0aG9kRXhwcmVzc2lvbiIuZXF1YWxzKGdldFByb3BlcnR5Q2xhc3MoKSkpOwotICB9Ci0KLSAgLyoqCi0gICAqIFBhcnNlcyB0aGUgcG9zc2libGUgdmFsdWVzIGZvciB0aGlzIHByb3BlcnR5IGludG8gYSBTdHJpbmcgYXJyYXkKLSAgICogdXNpbmcgc3BhY2UgYXMgdGhlIHNlcGFyYXRvciBiZXR3ZWVuIHZhbHVlcy4KLSAgICoKLSAgICogQHBhcmFtIHByb3BlcnR5VmFsdWVzICB0aGUgcHJvcGVydHkgdmFsdWVzCi0gICAqLwotICBwdWJsaWMgdm9pZCBwYXJzZVByb3BlcnR5VmFsdWVzKAotICAgIFN0cmluZyBwcm9wZXJ0eVZhbHVlcykKLSAgewotICAgIHNldFByb3BlcnR5VmFsdWVzKHByb3BlcnR5VmFsdWVzLnNwbGl0KCIgIikpOwotICB9Ci0KLSAgLyoqCi0gICAqIFBhcnNlcyB0aGUgdW5zdXBwb3J0ZWQgYWdlbnRzIGZvciB0aGlzIHByb3BlcnR5IGludG8gYSBTdHJpbmcgYXJyYXkKLSAgICogdXNpbmcgc3BhY2UgYXMgdGhlIHNlcGFyYXRvciBiZXR3ZWVuIHZhbHVlcy4KLSAgICoKLSAgICogQHBhcmFtIHVuc3VwcG9ydGVkQWdlbnRzICB0aGUgdW5zdXBwb3J0ZWQgYWdlbnRzCi0gICAqLwotICBwdWJsaWMgdm9pZCBwYXJzZVVuc3VwcG9ydGVkQWdlbnRzKAotICAgIFN0cmluZyB1bnN1cHBvcnRlZEFnZW50cykKLSAgewotICAgIHNldFVuc3VwcG9ydGVkQWdlbnRzKHVuc3VwcG9ydGVkQWdlbnRzLnNwbGl0KCIgIikpOwotICB9Ci0KLSAgLyoqCi0gICAqIFBhcnNlcyB0aGUgdW5zdXBwb3J0ZWQgUmVuZGVyS2l0cyBmb3IgdGhpcyBwcm9wZXJ0eSBpbnRvIGEgU3RyaW5nIGFycmF5Ci0gICAqIHVzaW5nIHNwYWNlIGFzIHRoZSBzZXBhcmF0b3IgYmV0d2VlbiB2YWx1ZXMuCi0gICAqCi0gICAqIEBwYXJhbSB1bnN1cHBvcnRlZFJlbmRlcktpdHMgIHRoZSB1bnN1cHBvcnRlZCBSZW5kZXJLaXRzCi0gICAqLwotICBwdWJsaWMgdm9pZCBwYXJzZVVuc3VwcG9ydGVkUmVuZGVyS2l0cygKLSAgICBTdHJpbmcgdW5zdXBwb3J0ZWRSZW5kZXJLaXRzKQotICB7Ci0gICAgc2V0VW5zdXBwb3J0ZWRSZW5kZXJLaXRzKHVuc3VwcG9ydGVkUmVuZGVyS2l0cy5zcGxpdCgiICIpKTsKLSAgfQotCi0gIC8qKgotICAgKiBTZXRzIHRoZSBKU1AgbmFtZSBvZiB0aGlzIHByb3BlcnR5LgotICAgKgotICAgKiBAcGFyYW0ganNwUHJvcGVydHlOYW1lICB0aGUgSlNQIHByb3BlcnR5IG5hbWUKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEpzcFByb3BlcnR5TmFtZSgKLSAgICBTdHJpbmcganNwUHJvcGVydHlOYW1lKQotICB7Ci0gICAgX2pzcFByb3BlcnR5TmFtZSA9IGpzcFByb3BlcnR5TmFtZTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBKU1AgbmFtZSBvZiB0aGlzIHByb3BlcnR5LgotICAgKgotICAgKiBAcmV0dXJuICB0aGUgSlNQIHByb3BlcnR5IG5hbWUKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0SnNwUHJvcGVydHlOYW1lKCkKLSAgewotICAgIGlmIChfanNwUHJvcGVydHlOYW1lID09IG51bGwpCi0gICAgICByZXR1cm4gZ2V0UHJvcGVydHlOYW1lKCk7Ci0KLSAgICByZXR1cm4gX2pzcFByb3BlcnR5TmFtZTsKLSAgfQotCi0gIC8qKgotICAgKiBTZXRzIHRoZSBmaWVsZCBuYW1lIG9mIHRoaXMgcHJvcGVydHksIHdoZW4gbm90IGdlbmVyYXRpbmcgVHJpbmlkYWQgY29tcG9uZW50cwotICAgKgotICAgKiBAcGFyYW0gZmllbGRQcm9wZXJ0eU5hbWUgIHRoZSBmaWVsZCBwcm9wZXJ0eSBuYW1lCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRGaWVsZFByb3BlcnR5TmFtZSgKLSAgICBTdHJpbmcgZmllbGRQcm9wZXJ0eU5hbWUpCi0gIHsKLSAgICBfZmllbGRQcm9wZXJ0eU5hbWUgPSBmaWVsZFByb3BlcnR5TmFtZTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBmaWVsZCBuYW1lIG9mIHRoaXMgcHJvcGVydHksIHdoZW4gbm90IGdlbmVyYXRpbmcgVHJpbmlkYWQgY29tcG9uZW50cwotICAgKgotICAgKiBAcmV0dXJuICB0aGUgZmllbGQgcHJvcGVydHkgbmFtZQotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRGaWVsZFByb3BlcnR5TmFtZSgpCi0gIHsKLSAgICBpZiAoX2ZpZWxkUHJvcGVydHlOYW1lID09IG51bGwpCi0gICAgICByZXR1cm4gIl8iK2dldFByb3BlcnR5TmFtZSgpOwotCi0gICAgcmV0dXJuIF9maWVsZFByb3BlcnR5TmFtZTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldElzU2V0TWV0aG9kKGJvb2xlYW4gX2lzU2V0TWV0aG9kKQotICB7Ci0gICAgdGhpcy5faXNTZXRNZXRob2QgPSBfaXNTZXRNZXRob2Q7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBpc0lzU2V0TWV0aG9kKCkKLSAgewotICAgIHJldHVybiBfaXNTZXRNZXRob2Q7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRJc1NldE1ldGhvZFNjb3BlKFN0cmluZyBfaXNTZXRNZXRob2RTY29wZSkKLSAgewotICAgIHRoaXMuX2lzU2V0TWV0aG9kU2NvcGUgPSBfaXNTZXRNZXRob2RTY29wZTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0SXNTZXRNZXRob2RTY29wZSgpCi0gIHsKLSAgICByZXR1cm4gX2lzU2V0TWV0aG9kU2NvcGU7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRJc0dldExvY2FsTWV0aG9kKGJvb2xlYW4gX2lzR2V0TG9jYWxNZXRob2QpCi0gIHsKLSAgICB0aGlzLl9pc0dldExvY2FsTWV0aG9kID0gX2lzR2V0TG9jYWxNZXRob2Q7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBpc0lzR2V0TG9jYWxNZXRob2QoKQotICB7Ci0gICAgcmV0dXJuIF9pc0dldExvY2FsTWV0aG9kOyAgIAotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0SXNHZXRMb2NhbE1ldGhvZFNjb3BlKFN0cmluZyBfaXNHZXRMb2NhbE1ldGhvZFNjb3BlKQotICB7Ci0gICAgdGhpcy5faXNHZXRMb2NhbE1ldGhvZFNjb3BlID0gX2lzR2V0TG9jYWxNZXRob2RTY29wZTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0SXNHZXRMb2NhbE1ldGhvZFNjb3BlKCkKLSAgewotICAgIHJldHVybiBfaXNHZXRMb2NhbE1ldGhvZFNjb3BlOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0UnRleHBydmFsdWUoYm9vbGVhbiBfcnRleHBydmFsdWUpCi0gIHsKLSAgICB0aGlzLl9ydGV4cHJ2YWx1ZSA9IF9ydGV4cHJ2YWx1ZTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGlzUnRleHBydmFsdWUoKQotICB7Ci0gICAgcmV0dXJuIF9ydGV4cHJ2YWx1ZTsKLSAgfQotIAotICBwcml2YXRlIGJvb2xlYW4gX3J0ZXhwcnZhbHVlOwotICBwcml2YXRlIFN0cmluZyBfaXNHZXRMb2NhbE1ldGhvZFNjb3BlOwotICBwcml2YXRlIGJvb2xlYW4gX2lzR2V0TG9jYWxNZXRob2Q7Ci0gIHByaXZhdGUgU3RyaW5nIF9pc1NldE1ldGhvZFNjb3BlOwotICBwcml2YXRlIGJvb2xlYW4gX2lzU2V0TWV0aG9kOwotICBwcml2YXRlIFN0cmluZyAgX2FsaWFzT2Y7Ci0gIHByaXZhdGUgU3RyaW5nICBfanNwUHJvcGVydHlOYW1lOwotICBwcml2YXRlIFN0cmluZyAgX2ZpZWxkUHJvcGVydHlOYW1lOwotICBwcml2YXRlIGJvb2xlYW4gX3JlcXVpcmVkOwotICBwcml2YXRlIGJvb2xlYW4gX2xpdGVyYWxPbmx5OwotICBwcml2YXRlIGJvb2xlYW4gX3N0YXRlSG9sZGVyOwotICBwcml2YXRlIGJvb2xlYW4gX3RyYW5zaWVudDsKLSAgcHJpdmF0ZSBib29sZWFuIF9saXN0OwotICBwcml2YXRlIGJvb2xlYW4gX3RhZ0F0dHJpYnV0ZUV4Y2x1ZGVkOwotICBwcml2YXRlIGJvb2xlYW4gX2VudW07Ci0gIHByaXZhdGUgYm9vbGVhbiBfdXNlTWF4VGltZTsKLSAgcHJpdmF0ZSBTdHJpbmdbXSBfcHJvcGVydHlWYWx1ZXM7Ci0gIHByaXZhdGUgU3RyaW5nW10gX3Vuc3VwcG9ydGVkQWdlbnRzID0gX0VNUFRZX0FSUkFZOwotICBwcml2YXRlIFN0cmluZ1tdIF91bnN1cHBvcnRlZFJlbmRlcktpdHMgPSBfRU1QVFlfQVJSQVk7Ci0KLSAgc3RhdGljIHByaXZhdGUgU3RyaW5nW10gX0VNUFRZX0FSUkFZID0gbmV3IFN0cmluZ1swXTsKLQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL3BhcnNlL1JlbmRlcktpdEJlYW4uamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy9wYXJzZS9SZW5kZXJLaXRCZWFuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1NDY2NjEuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL3BhcnNlL1JlbmRlcktpdEJlYW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NCArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMucGFyc2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuVHJlZU1hcDsKLQotLyoqCi0gKiBSZW5kZXJLaXRCZWFuIGlzIGEgSmF2YSByZXByZXNlbnRhdGlvbiBvZiB0aGUgZmFjZXMtY29uZmlnIHJlbmRlci1raXQKLSAqIFhNTCBlbGVtZW50LgotICovCi1wdWJsaWMgY2xhc3MgUmVuZGVyS2l0QmVhbiBleHRlbmRzIE9iamVjdEJlYW4KLXsKLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcgUmVuZGVyS2l0QmVhbi4KLSAgICovCi0gIHB1YmxpYyBSZW5kZXJLaXRCZWFuKCkKLSAgewotICAgIF9yZW5kZXJlcnMgPSBuZXcgVHJlZU1hcCgpOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIHJlbmRlciBraXQgaWQgZm9yIHRoaXMgY29tcG9uZW50LgotICAgKgotICAgKiBAcGFyYW0gcmVuZGVyS2l0SWQgIHRoZSByZW5kZXIga2l0IGlkCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRSZW5kZXJLaXRJZCgKLSAgICBTdHJpbmcgcmVuZGVyS2l0SWQpCi0gIHsKLSAgICBfcmVuZGVyS2l0SWQgPSByZW5kZXJLaXRJZDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSByZW5kZXIga2l0IGlkIHR5cGUgZm9yIHRoaXMgY29tcG9uZW50LgotICAgKgotICAgKiBAcmV0dXJuICB0aGUgcmVuZGVyIGtpdCBpZAotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRSZW5kZXJLaXRJZCgpCi0gIHsKLSAgICByZXR1cm4gX3JlbmRlcktpdElkOwotICB9Ci0KLSAgLyoqCi0gICAqIEFkZHMgYSByZW5kZXJlciB0byB0aGlzIHJlbmRlciBraXQuCi0gICAqCi0gICAqIEBwYXJhbSByZW5kZXJlciAgdGhlIHJlbmRlcmVyIHRvIGFkZAotICAgKi8KLSAgcHVibGljIHZvaWQgYWRkUmVuZGVyZXIoCi0gICAgUmVuZGVyZXJCZWFuIHJlbmRlcmVyKQotICB7Ci0gICAgU3RyaW5nIGNvbXBvbmVudEZhbWlseSA9IHJlbmRlcmVyLmdldENvbXBvbmVudEZhbWlseSgpOwotICAgIFN0cmluZyByZW5kZXJlclR5cGUgPSByZW5kZXJlci5nZXRSZW5kZXJlclR5cGUoKTsKLSAgICBTdHJpbmcgY29tcG9zaXRlS2V5ID0gY29tcG9uZW50RmFtaWx5ICsgInwiICsgcmVuZGVyZXJUeXBlOwotICAgIF9yZW5kZXJlcnMucHV0KGNvbXBvc2l0ZUtleSwgcmVuZGVyZXIpOwotCi0gICAgRmFjZXNDb25maWdCZWFuIG93bmVyID0gZ2V0T3duZXIoKTsKLSAgICBpZiAob3duZXIgIT0gbnVsbCkKLSAgICB7Ci0gICAgICByZW5kZXJlci5hdHRhY2gob3duZXIpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSByZW5kZXJlciBmb3IgdGhpcyBjb21wb25lbnQgZmFtaWx5IGFuZCByZW5kZXJlciB0eXBlLgotICAgKgotICAgKiBAcGFyYW0gY29tcG9uZW50RmFtaWx5ICB0aGUgY29tcG9uZW50IGZhbWlseQotICAgKiBAcGFyYW0gcmVuZGVyZXJUeXBlICAgICB0aGUgcmVuZGVyZXIgdHlwZQotICAgKi8KLSAgcHVibGljIFJlbmRlcmVyQmVhbiBmaW5kUmVuZGVyZXIoCi0gICAgU3RyaW5nIGNvbXBvbmVudEZhbWlseSwKLSAgICBTdHJpbmcgcmVuZGVyZXJUeXBlKQotICB7Ci0gICAgU3RyaW5nIGNvbXBvc2l0ZUtleSA9IGNvbXBvbmVudEZhbWlseSArICJ8IiArIHJlbmRlcmVyVHlwZTsKLSAgICByZXR1cm4gKFJlbmRlcmVyQmVhbikgX3JlbmRlcmVycy5nZXQoY29tcG9zaXRlS2V5KTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyByZW5kZXIga2l0IGhhcyBhbnkgcmVuZGVyZXJzLgotICAgKgotICAgKiBAcmV0dXJuICB0cnVlICAgaWYgdGhpcyByZW5kZXIga2l0IGhhcyBhbnkgcmVuZGVyZXJzLAotICAgKiAgICAgICAgICBmYWxzZSAgb3RoZXJ3aXNlCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBoYXNSZW5kZXJlcnMoKQotICB7Ci0gICAgcmV0dXJuICFfcmVuZGVyZXJzLmlzRW1wdHkoKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIGFuIGl0ZXJhdG9yIGZvciBhbGwgcmVuZGVyZXJzIGluIHRoaXMgcmVuZGVyIGtpdC4KLSAgICoKLSAgICogQHJldHVybiAgdGhlIHJlbmRlcmVyIGl0ZXJhdG9yCi0gICAqLwotICBwdWJsaWMgSXRlcmF0b3IgcmVuZGVyZXJzKCkKLSAgewotICAgIHJldHVybiBfcmVuZGVyZXJzLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0gIH0KLQotICAvKioKLSAgICogQXR0YWNoZXMgdGhlIGNvbXBvbmVudCBhbmQgYWxsIGV2ZW50IHJlZmVyZW5jZXMuCi0gICAqCi0gICAqIEBwYXJhbSBvd25lciAgdGhlIGZhY2VzIGNvbmZpZyBvd25lcgotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgYXR0YWNoKAotICAgIEZhY2VzQ29uZmlnQmVhbiBvd25lcikKLSAgewotICAgIHN1cGVyLmF0dGFjaChvd25lcik7Ci0gICAgSXRlcmF0b3IgcmVuZGVyZXJzID0gcmVuZGVyZXJzKCk7Ci0gICAgd2hpbGUgKHJlbmRlcmVycy5oYXNOZXh0KCkpCi0gICAgewotICAgICAgUmVuZGVyZXJCZWFuIHJlbmRlcmVyID0gKFJlbmRlcmVyQmVhbilyZW5kZXJlcnMubmV4dCgpOwotICAgICAgcmVuZGVyZXIuYXR0YWNoKG93bmVyKTsKLSAgICB9Ci0gIH0KLQotICB2b2lkIGFkZEFsbFJlbmRlcmVycygKLSAgICBSZW5kZXJLaXRCZWFuIHJlbmRlcktpdCkKLSAgewotICAgIGZvciAoSXRlcmF0b3IgaSA9IHJlbmRlcktpdC5fcmVuZGVyZXJzLnZhbHVlcygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICAvLyB1c2UgYWRkUmVuZGVyZXIgdG8gZXN0YWJsaXNoIG93bmVyCi0gICAgICBhZGRSZW5kZXJlcigoUmVuZGVyZXJCZWFuKWkubmV4dCgpKTsKLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIFN0cmluZyAgX3JlbmRlcktpdElkID0gIiI7Ci0gIHByaXZhdGUgTWFwICAgICBfcmVuZGVyZXJzOwotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL3BhcnNlL1JlbmRlcmVyQmVhbi5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL3BhcnNlL1JlbmRlcmVyQmVhbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNmI1ZWU3Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy9wYXJzZS9SZW5kZXJlckJlYW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0MyArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMucGFyc2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuVHJlZU1hcDsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMudXRpbC5Db21wb3VuZEl0ZXJhdG9yOwotCi0vKioKLSAqIFJlbmRlcktpdEJlYW4gaXMgYSBKYXZhIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBmYWNlcy1jb25maWcgcmVuZGVyLWtpdAotICogWE1MIGVsZW1lbnQuCi0gKi8KLXB1YmxpYyBjbGFzcyBSZW5kZXJlckJlYW4gZXh0ZW5kcyBPYmplY3RCZWFuCi17Ci0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IFJlbmRlcmVyQmVhbi4KLSAgICovCi0gIHB1YmxpYyBSZW5kZXJlckJlYW4oKQotICB7Ci0gICAgX2F0dHJpYnV0ZXMgPSBuZXcgVHJlZU1hcCgpOwotICAgIF9mYWNldHMgPSBuZXcgVHJlZU1hcCgpOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIGNvbXBvbmVudCBmYW1pbHkgZm9yIHRoaXMgY29tcG9uZW50LgotICAgKgotICAgKiBAcGFyYW0gY29tcG9uZW50RmFtaWx5ICB0aGUgY29tcG9uZW50IGZhbWlseQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0Q29tcG9uZW50RmFtaWx5KAotICAgIFN0cmluZyBjb21wb25lbnRGYW1pbHkpCi0gIHsKLSAgICBfY29tcG9uZW50RmFtaWx5ID0gY29tcG9uZW50RmFtaWx5OwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGNvbXBvbmVudCBmYW1pbHkgZm9yIHRoaXMgY29tcG9uZW50LgotICAgKgotICAgKiBAcmV0dXJuICB0aGUgY29tcG9uZW50IGZhbWlseQotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRDb21wb25lbnRGYW1pbHkoKQotICB7Ci0gICAgcmV0dXJuIF9jb21wb25lbnRGYW1pbHk7Ci0gIH0KLQotICAvKioKLSAgICogU2V0cyB0aGUgcmVuZGVyZXIgdHlwZSBmb3IgdGhpcyBjb21wb25lbnQuCi0gICAqCi0gICAqIEBwYXJhbSByZW5kZXJlclR5cGUgIHRoZSByZW5kZXJlciB0eXBlCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRSZW5kZXJlclR5cGUoCi0gICAgU3RyaW5nIHJlbmRlcmVyVHlwZSkKLSAgewotICAgIF9yZW5kZXJlclR5cGUgPSByZW5kZXJlclR5cGU7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgcmVuZGVyZXIgdHlwZSBmb3IgdGhpcyBjb21wb25lbnQuCi0gICAqCi0gICAqIEByZXR1cm4gIHRoZSByZW5kZXJlciB0eXBlCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFJlbmRlcmVyVHlwZSgpCi0gIHsKLSAgICByZXR1cm4gX3JlbmRlcmVyVHlwZTsKLSAgfQotCi0gIC8qKgotICAgKiBTZXRzIHRoZSByZW5kZXJlciBjbGFzcyBmb3IgdGhpcyByZW5kZXJlci4KLSAgICoKLSAgICogQHBhcmFtIHJlbmRlcmVyQ2xhc3MgIHRoZSByZW5kZXJlciBjbGFzcwotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0UmVuZGVyZXJDbGFzcygKLSAgICBTdHJpbmcgcmVuZGVyZXJDbGFzcykKLSAgewotICAgIF9yZW5kZXJlckNsYXNzID0gcmVuZGVyZXJDbGFzczsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSByZW5kZXJlciBjbGFzcyBmb3IgdGhpcyByZW5kZXJlci4KLSAgICoKLSAgICogQHJldHVybiAgdGhlIHJlbmRlcmVyIGNsYXNzCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFJlbmRlcmVyQ2xhc3MoKQotICB7Ci0gICAgcmV0dXJuIF9yZW5kZXJlckNsYXNzOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIGRlc2NyaXB0aW9uIG9mIHRoaXMgYXR0cmlidXRlLgotICAgKgotICAgKiBAcGFyYW0gZGVzY3JpcHRpb24gIHRoZSBhdHRyaWJ1dGUgZGVzY3JpcHRpb24KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKAotICAgIFN0cmluZyBkZXNjcmlwdGlvbikKLSAgewotICAgIF9kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGRlc2NyaXB0aW9uIG9mIHRoaXMgYXR0cmlidXRlLgotICAgKgotICAgKiBAcmV0dXJuICB0aGUgYXR0cmlidXRlIGRlc2NyaXB0aW9uCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkKLSAgewotICAgIHJldHVybiBfZGVzY3JpcHRpb247Ci0gIH0KLQotICAvKioKLSAgICogU2V0cyB0aGUgY29tcG9uZW50IHR5cGUgZm9yIHRoaXMgY29tcG9uZW50LgotICAgKgotICAgKiBAcGFyYW0gY29tcG9uZW50VHlwZSAgdGhlIGNvbXBvbmVudCB0eXBlCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRDb21wb25lbnRUeXBlKAotICAgIFN0cmluZyBjb21wb25lbnRUeXBlKQotICB7Ci0gICAgX2NvbXBvbmVudFR5cGUgPSBjb21wb25lbnRUeXBlOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGNvbXBvbmVudCB0eXBlIGZvciB0aGlzIGNvbXBvbmVudC4KLSAgICoKLSAgICogQHJldHVybiAgdGhlIGNvbXBvbmVudCB0eXBlCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldENvbXBvbmVudFR5cGUoKQotICB7Ci0gICAgcmV0dXJuIF9jb21wb25lbnRUeXBlOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIHJlbmRlcmVyIHN1cGVyY2xhc3MgZm9yIHRoaXMgcmVuZGVyZXIuCi0gICAqCi0gICAqIEBwYXJhbSByZW5kZXJlclN1cGVyY2xhc3MgIHRoZSByZW5kZXJlciBzdXBlcmNsYXNzCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRSZW5kZXJlclN1cGVyY2xhc3MoCi0gICAgU3RyaW5nIHJlbmRlcmVyU3VwZXJjbGFzcykKLSAgewotICAgIF9yZW5kZXJlclN1cGVyY2xhc3MgPSByZW5kZXJlclN1cGVyY2xhc3M7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgcmVuZGVyZXIgc3VwZXJjbGFzcyBmb3IgdGhpcyBjb21wb25lbnQuCi0gICAqCi0gICAqIEByZXR1cm4gIHRoZSByZW5kZXJlciBzdXBlcmNsYXNzCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFJlbmRlcmVyU3VwZXJjbGFzcygpCi0gIHsKLSAgICByZXR1cm4gX3JlbmRlcmVyU3VwZXJjbGFzczsKLSAgfQotCi0gIC8qKgotICAgKiBGaW5kcyB0aGUgcmVuZGVyZXItc3BlY2lmaWMgY29tcG9uZW50IGNsYXNzIGZvciB0aGlzIHJlbmRlcmVyLgotICAgKgotICAgKiBAcmV0dXJuICB0aGUgcmVuZGVyZXItc3BlY2lmYyBjb21wb25lbnQgY2xhc3MKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZmluZENvbXBvbmVudENsYXNzKCkKLSAgewotICAgIENvbXBvbmVudEJlYW4gY29tcG9uZW50ID0gcmVzb2x2ZUNvbXBvbmVudFR5cGUoKTsKLSAgICByZXR1cm4gKGNvbXBvbmVudCAhPSBudWxsKSA/IGNvbXBvbmVudC5nZXRDb21wb25lbnRDbGFzcygpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAib3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLmNvbXBvbmVudC5VSVhDb21wb25lbnQiOwotICB9Ci0KLSAgLyoqCi0gICAqIEZpbmRzIHRoZSBiZWhhdmlvcmFsIGNvbXBvbmVudCBjbGFzcyBmb3IgdGhpcyByZW5kZXJlci4KLSAgICoKLSAgICogQHJldHVybiAgdGhlIGJlaGF2aW9yYWwgY29tcG9uZW50IGNsYXNzCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGZpbmRDb21wb25lbnRGYW1pbHlDbGFzcygpCi0gIHsKLSAgICBDb21wb25lbnRCZWFuIGNvbXBvbmVudCA9IHJlc29sdmVDb21wb25lbnRUeXBlKCk7Ci0gICAgQ29tcG9uZW50QmVhbiBiZWhhdmlvcmFsID0gKGNvbXBvbmVudCAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gY29tcG9uZW50LmZpbmRCZWhhdmlvcmFsQ29tcG9uZW50KCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IG51bGw7Ci0gICAgcmV0dXJuIChiZWhhdmlvcmFsICE9IG51bGwpID8gYmVoYXZpb3JhbC5nZXRDb21wb25lbnRDbGFzcygpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogIm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5jb21wb25lbnQuVUlYQ29tcG9uZW50IjsKLSAgfQotCi0gIC8qKgotICAgKiBBZGRzIGEgYXR0cmlidXRlIHRvIHRoaXMgY29tcG9uZW50LgotICAgKgotICAgKiBAcGFyYW0gYXR0cmlidXRlICB0aGUgYXR0cmlidXRlIHRvIGFkZAotICAgKi8KLSAgcHVibGljIHZvaWQgYWRkQXR0cmlidXRlKAotICAgIEF0dHJpYnV0ZUJlYW4gYXR0cmlidXRlKQotICB7Ci0gICAgX2F0dHJpYnV0ZXMucHV0KGF0dHJpYnV0ZS5nZXRBdHRyaWJ1dGVOYW1lKCksIGF0dHJpYnV0ZSk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgYXR0cmlidXRlIGZvciB0aGlzIGF0dHJpYnV0ZSBuYW1lLgotICAgKgotICAgKiBAcGFyYW0gYXR0cmlidXRlTmFtZSAgdGhlIGF0dHJpYnV0ZSBuYW1lIHRvIGZpbmQKLSAgICovCi0gIHB1YmxpYyBBdHRyaWJ1dGVCZWFuIGZpbmRBdHRyaWJ1dGUoCi0gICAgU3RyaW5nIGF0dHJpYnV0ZU5hbWUpCi0gIHsKLSAgICBBdHRyaWJ1dGVCZWFuIGF0dHJpYnV0ZSA9IChBdHRyaWJ1dGVCZWFuKV9hdHRyaWJ1dGVzLmdldChhdHRyaWJ1dGVOYW1lKTsKLQotICAgIGlmIChhdHRyaWJ1dGUgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBDb21wb25lbnRCZWFuIGNvbXBvbmVudCA9IHJlc29sdmVDb21wb25lbnRUeXBlKCk7Ci0gICAgICBpZiAoY29tcG9uZW50ICE9IG51bGwpCi0gICAgICAgIGF0dHJpYnV0ZSA9IGNvbXBvbmVudC5maW5kUHJvcGVydHkoYXR0cmlidXRlTmFtZSk7Ci0gICAgfQotCi0gICAgcmV0dXJuIGF0dHJpYnV0ZTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBjb21wb25lbnQgaGFzIGFueSBhdHRyaWJ1dGVzLgotICAgKgotICAgKiBAcmV0dXJuICB0cnVlICAgaWYgdGhpcyBjb21wb25lbnQgaGFzIGFueSBhdHRyaWJ1dGVzLAotICAgKiAgICAgICAgICBmYWxzZSAgb3RoZXJ3aXNlCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBoYXNBdHRyaWJ1dGVzKCkKLSAgewotICAgIGJvb2xlYW4gaGFzQXR0cmlidXRlcyA9ICFfYXR0cmlidXRlcy5pc0VtcHR5KCk7Ci0KLSAgICBpZiAoIWhhc0F0dHJpYnV0ZXMpCi0gICAgewotICAgICAgQ29tcG9uZW50QmVhbiBjb21wb25lbnQgPSByZXNvbHZlQ29tcG9uZW50VHlwZSgpOwotICAgICAgaWYgKGNvbXBvbmVudCAhPSBudWxsKQotICAgICAgICBoYXNBdHRyaWJ1dGVzIHw9IGNvbXBvbmVudC5oYXNQcm9wZXJ0aWVzKCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIGhhc0F0dHJpYnV0ZXM7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgY29tcG9uZW50IG9yIGFueSBjb21wb25lbnQgc3VwZXJ0eXBlCi0gICAqIGhhcyBhbnkgYXR0cmlidXRlcy4KLSAgICoKLSAgICogQHJldHVybiAgdHJ1ZSAgIGlmIHRoaXMgY29tcG9uZW50IG9yIGFueSBzdXBlcnR5cGUgaGFzIGFueSBhdHRyaWJ1dGVzLAotICAgKiAgICAgICAgICBmYWxzZSAgb3RoZXJ3aXNlCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBoYXNBdHRyaWJ1dGVzKAotICAgIGJvb2xlYW4gZmxhdHRlbikKLSAgewotICAgIGJvb2xlYW4gaGFzQXR0cmlidXRlcyA9IGhhc0F0dHJpYnV0ZXMoKTsKLQotICAgIGlmICghaGFzQXR0cmlidXRlcyAmJiBmbGF0dGVuKQotICAgIHsKLSAgICAgIENvbXBvbmVudEJlYW4gY29tcG9uZW50ID0gcmVzb2x2ZUNvbXBvbmVudFR5cGUoKTsKLSAgICAgIGlmIChjb21wb25lbnQgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgQ29tcG9uZW50QmVhbiBwYXJlbnQgPSBjb21wb25lbnQucmVzb2x2ZVN1cGVydHlwZSgpOwotICAgICAgICBpZiAocGFyZW50ICE9IG51bGwpCi0gICAgICAgICAgaGFzQXR0cmlidXRlcyB8PSBwYXJlbnQuaGFzUHJvcGVydGllcyh0cnVlKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gaGFzQXR0cmlidXRlczsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIGFuIGl0ZXJhdG9yIGZvciBhbGwgYXR0cmlidXRlcyBvbiB0aGlzIGNvbXBvbmVudCBvbmx5LgotICAgKgotICAgKiBAcmV0dXJuICB0aGUgYXR0cmlidXRlIGl0ZXJhdG9yCi0gICAqLwotICBwdWJsaWMgSXRlcmF0b3IgYXR0cmlidXRlcygpCi0gIHsKLSAgICBJdGVyYXRvciBhdHRyaWJ1dGVzID0gX2F0dHJpYnV0ZXMudmFsdWVzKCkuaXRlcmF0b3IoKTsKLQotICAgIENvbXBvbmVudEJlYW4gY29tcG9uZW50ID0gcmVzb2x2ZUNvbXBvbmVudFR5cGUoKTsKLSAgICBpZiAoY29tcG9uZW50ICE9IG51bGwpCi0gICAgICAgIGF0dHJpYnV0ZXMgPSBuZXcgQ29tcG91bmRJdGVyYXRvcihhdHRyaWJ1dGVzLCBjb21wb25lbnQucHJvcGVydGllcygpKTsKLQotICAgIHJldHVybiBhdHRyaWJ1dGVzOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgYW4gaXRlcmF0b3IgZm9yIGF0dHJpYnV0ZXMgb24gdGhpcyBjb21wb25lbnQuCi0gICAqCi0gICAqIEBwYXJhbSBmbGF0dGVuICB0cnVlICAgaWYgdGhlIGl0ZXJhdG9yIHNob3VsZCBiZSBhIGNvbWJpbmVkIGxpc3Qgb2YKLSAgICogICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzIG9mIHRoaXMgY29tcG9uZW50IGFuZCBpdHMgc3VwZXJ0eXBlLAotICAgKiAgICAgICAgICAgICAgICAgZmFsc2UgIG90aGVyd2lzZQotICAgKgotICAgKiBAcmV0dXJuICB0aGUgYXR0cmlidXRlIGl0ZXJhdG9yCi0gICAqLwotICBwdWJsaWMgSXRlcmF0b3IgYXR0cmlidXRlcygKLSAgICBib29sZWFuIGZsYXR0ZW4pCi0gIHsKLSAgICBJdGVyYXRvciBhdHRyaWJ1dGVzID0gYXR0cmlidXRlcygpOwotICAgIGlmIChmbGF0dGVuKQotICAgIHsKLSAgICAgIENvbXBvbmVudEJlYW4gY29tcG9uZW50ID0gcmVzb2x2ZUNvbXBvbmVudFR5cGUoKTsKLSAgICAgIGlmIChjb21wb25lbnQgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgQ29tcG9uZW50QmVhbiBwYXJlbnQgPSBjb21wb25lbnQucmVzb2x2ZVN1cGVydHlwZSgpOwotICAgICAgICBpZiAocGFyZW50ICE9IG51bGwpCi0gICAgICAgICAgYXR0cmlidXRlcyA9IG5ldyBDb21wb3VuZEl0ZXJhdG9yKGF0dHJpYnV0ZXMsIHBhcmVudC5wcm9wZXJ0aWVzKHRydWUpKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGF0dHJpYnV0ZXM7Ci0gIH0KLQotICAvKioKLSAgICogQWRkcyBhIGZhY2V0IHRvIHRoaXMgY29tcG9uZW50LgotICAgKgotICAgKiBAcGFyYW0gZmFjZXQgIHRoZSBmYWNldCB0byBhZGQKLSAgICovCi0gIHB1YmxpYyB2b2lkIGFkZEZhY2V0KAotICAgIEZhY2V0QmVhbiBmYWNldCkKLSAgewotICAgIF9mYWNldHMucHV0KGZhY2V0LmdldEZhY2V0TmFtZSgpLCBmYWNldCk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgZmFjZXQgZm9yIHRoaXMgZmFjZXQgbmFtZS4KLSAgICoKLSAgICogQHBhcmFtIGZhY2V0TmFtZSAgdGhlIGZhY2V0IG5hbWUgdG8gZmluZAotICAgKi8KLSAgcHVibGljIEZhY2V0QmVhbiBmaW5kRmFjZXQoCi0gICAgU3RyaW5nIGZhY2V0TmFtZSkKLSAgewotICAgIHJldHVybiAoRmFjZXRCZWFuKV9mYWNldHMuZ2V0KGZhY2V0TmFtZSk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgY29tcG9uZW50IGhhcyBhbnkgZmFjZXRzLgotICAgKgotICAgKiBAcmV0dXJuICB0cnVlICAgaWYgdGhpcyBjb21wb25lbnQgaGFzIGFueSBmYWNldHMsCi0gICAqICAgICAgICAgIGZhbHNlICBvdGhlcndpc2UKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGhhc0ZhY2V0cygpCi0gIHsKLSAgICBib29sZWFuIGhhc0ZhY2V0cyA9ICFfZmFjZXRzLmlzRW1wdHkoKTsKLQotICAgIENvbXBvbmVudEJlYW4gY29tcG9uZW50ID0gcmVzb2x2ZUNvbXBvbmVudFR5cGUoKTsKLSAgICBpZiAoY29tcG9uZW50ICE9IG51bGwpCi0gICAgICBoYXNGYWNldHMgfD0gY29tcG9uZW50Lmhhc0ZhY2V0cygpOwotCi0gICAgcmV0dXJuIGhhc0ZhY2V0czsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBjb21wb25lbnQgb3IgYW55IGNvbXBvbmVudCBzdXBlcnR5cGUKLSAgICogaGFzIGFueSBmYWNldHMuCi0gICAqCi0gICAqIEByZXR1cm4gIHRydWUgICBpZiB0aGlzIGNvbXBvbmVudCBvciBhbnkgc3VwZXJ0eXBlIGhhcyBhbnkgZmFjZXRzLAotICAgKiAgICAgICAgICBmYWxzZSAgb3RoZXJ3aXNlCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBoYXNGYWNldHMoCi0gICAgYm9vbGVhbiBmbGF0dGVuKQotICB7Ci0gICAgYm9vbGVhbiBoYXNGYWNldHMgPSBoYXNGYWNldHMoKTsKLQotICAgIGlmICghaGFzRmFjZXRzICYmIGZsYXR0ZW4pCi0gICAgewotICAgICAgQ29tcG9uZW50QmVhbiBjb21wb25lbnQgPSByZXNvbHZlQ29tcG9uZW50VHlwZSgpOwotICAgICAgaWYgKGNvbXBvbmVudCAhPSBudWxsKQotICAgICAgewotICAgICAgICBDb21wb25lbnRCZWFuIHBhcmVudCA9IGNvbXBvbmVudC5yZXNvbHZlU3VwZXJ0eXBlKCk7Ci0gICAgICAgIGlmIChwYXJlbnQgIT0gbnVsbCkKLSAgICAgICAgICBoYXNGYWNldHMgfD0gcGFyZW50Lmhhc0ZhY2V0cyh0cnVlKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gaGFzRmFjZXRzOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgYW4gaXRlcmF0b3IgZm9yIGFsbCBmYWNldHMgb24gdGhpcyBjb21wb25lbnQgb25seS4KLSAgICoKLSAgICogQHJldHVybiAgdGhlIGZhY2V0IGl0ZXJhdG9yCi0gICAqLwotICBwdWJsaWMgSXRlcmF0b3IgZmFjZXRzKCkKLSAgewotICAgIEl0ZXJhdG9yIGZhY2V0cyA9IF9mYWNldHMudmFsdWVzKCkuaXRlcmF0b3IoKTsKLQotICAgIENvbXBvbmVudEJlYW4gY29tcG9uZW50ID0gcmVzb2x2ZUNvbXBvbmVudFR5cGUoKTsKLSAgICBpZiAoY29tcG9uZW50ICE9IG51bGwpCi0gICAgICAgIGZhY2V0cyA9IG5ldyBDb21wb3VuZEl0ZXJhdG9yKGZhY2V0cywgY29tcG9uZW50LmZhY2V0cygpKTsKLQotICAgIHJldHVybiBmYWNldHM7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyBhbiBpdGVyYXRvciBmb3IgZmFjZXRzIG9uIHRoaXMgY29tcG9uZW50LgotICAgKgotICAqIEBwYXJhbSBmbGF0dGVuICB0cnVlICAgaWYgdGhlIGl0ZXJhdG9yIHNob3VsZCBiZSBhIGNvbWJpbmVkIGxpc3Qgb2YKLSAgKiAgICAgICAgICAgICAgICAgICAgICAgIGZhY2V0cyBvZiB0aGlzIGNvbXBvbmVudCBhbmQgaXRzIHN1cGVydHlwZSwKLSAgKiAgICAgICAgICAgICAgICAgZmFsc2UgIG90aGVyd2lzZQotICAqCi0gICogQHJldHVybiAgdGhlIGZhY2V0IGl0ZXJhdG9yCi0gICovCi0gIHB1YmxpYyBJdGVyYXRvciBmYWNldHMoCi0gICAgYm9vbGVhbiBmbGF0dGVuKQotICB7Ci0gICAgSXRlcmF0b3IgZmFjZXRzID0gZmFjZXRzKCk7Ci0gICAgaWYgKGZsYXR0ZW4pCi0gICAgewotICAgICAgQ29tcG9uZW50QmVhbiBjb21wb25lbnQgPSByZXNvbHZlQ29tcG9uZW50VHlwZSgpOwotICAgICAgaWYgKGNvbXBvbmVudCAhPSBudWxsKQotICAgICAgewotICAgICAgICBDb21wb25lbnRCZWFuIHBhcmVudCA9IGNvbXBvbmVudC5yZXNvbHZlU3VwZXJ0eXBlKCk7Ci0gICAgICAgIGlmIChwYXJlbnQgIT0gbnVsbCkKLSAgICAgICAgICBmYWNldHMgPSBuZXcgQ29tcG91bmRJdGVyYXRvcihmYWNldHMsIHBhcmVudC5mYWNldHModHJ1ZSkpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZmFjZXRzOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGNvbXBvbmVudCB0eXBlIGluc3RhbmNlLgotICAgKgotICAgKiBAcmV0dXJuICB0aGUgY29tcG9uZW50IHR5cGUgaW5zdGFuY2UKLSAgICovCi0gIHB1YmxpYyBDb21wb25lbnRCZWFuIHJlc29sdmVDb21wb25lbnRUeXBlKCkKLSAgewotICAgIGlmIChfY29tcG9uZW50VHlwZSA9PSBudWxsKQotICAgICAgcmV0dXJuIG51bGw7Ci0KLSAgICBGYWNlc0NvbmZpZ0JlYW4gb3duZXIgPSBnZXRPd25lcigpOwotICAgIHJldHVybiAob3duZXIgIT0gbnVsbCkgPyBvd25lci5maW5kQ29tcG9uZW50KF9jb21wb25lbnRUeXBlKSA6IG51bGw7Ci0gIH0KLQotICBwcml2YXRlIFN0cmluZyAgX2Rlc2NyaXB0aW9uOwotICBwcml2YXRlIFN0cmluZyAgX2NvbXBvbmVudEZhbWlseTsKLSAgcHJpdmF0ZSBTdHJpbmcgIF9yZW5kZXJlclR5cGU7Ci0gIHByaXZhdGUgU3RyaW5nICBfcmVuZGVyZXJDbGFzczsKLSAgcHJpdmF0ZSBTdHJpbmcgIF9yZW5kZXJlclN1cGVyY2xhc3M7Ci0gIHByaXZhdGUgU3RyaW5nICBfY29tcG9uZW50VHlwZTsKLSAgcHJpdmF0ZSBNYXAgICAgIF9hdHRyaWJ1dGVzOwotICBwcml2YXRlIE1hcCAgICAgX2ZhY2V0czsKLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy9wYXJzZS9WYWxpZGF0b3JCZWFuLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvcGFyc2UvVmFsaWRhdG9yQmVhbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZDRhOGJhLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy9wYXJzZS9WYWxpZGF0b3JCZWFuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTkgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLnBhcnNlOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTW9kaWZpZXI7Ci1pbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOwotCi0vKioKLSAqIFZhbGlkYXRvckJlYW4gaXMgYSBKYXZhIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBmYWNlcy1jb25maWcgdmFsaWRhdG9yCi0gKiBYTUwgZWxlbWVudC4KLSAqLwotcHVibGljIGNsYXNzIFZhbGlkYXRvckJlYW4gZXh0ZW5kcyBBYnN0cmFjdFRhZ0JlYW4gewotCi0gIC8qKgotICAgKiBTZXRzIHRoZSB2YWxpZGF0b3IgaWRlbnRpZmVyIGZvciB0aGlzIGNvbXBvbmVudC4KLSAgICoKLSAgICogQHBhcmFtIHZhbGlkYXRvcklkICB2YWxpZGF0b3IgaWRlbnRpZmVyCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRWYWxpZGF0b3JJZCgKLSAgICBTdHJpbmcgdmFsaWRhdG9ySWQpCi0gIHsKLSAgICBfdmFsaWRhdG9ySWQgPSB2YWxpZGF0b3JJZDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHZhbGlkYXRvciBpZGVudGlmaWVyIGlzIHNwZWNpZmllZCwgb3RoZXJ3aXNlIGZhbHNlLgotICAgKgotICAgKiBAcmV0dXJuICB0cnVlIGlmIHRoZSB2YWxpZGF0b3IgaWRlbnRpZmllciBpcyBzcGVjaWZpZWQsCi0gICAqICAgICAgICAgIG90aGVyd2lzZSBmYWxzZS4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGhhc1ZhbGlkYXRvcklkKCkKLSAgewotICAgIHJldHVybiAoX3ZhbGlkYXRvcklkICE9IG51bGwpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHZhbGlkYXRvciBpZGVudGlmaWVyIGZvciB0aGlzIGNvbXBvbmVudC4KLSAgICoKLSAgICogQHJldHVybiAgdGhlIHZhbGlkYXRvciBpZGVudGlmaWVyCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFZhbGlkYXRvcklkKCkKLSAgewotICAgIHJldHVybiBfdmFsaWRhdG9ySWQ7Ci0gIH0KLQotICAvKioKLSAgICogU2V0cyB0aGUgdmFsaWRhdG9yIGNsYXNzIGZvciB0aGlzIGNvbXBvbmVudC4KLSAgICoKLSAgICogQHBhcmFtIHZhbGlkYXRvckNsYXNzICB0aGUgdmFsaWRhdG9yIGNsYXNzCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRWYWxpZGF0b3JDbGFzcygKLSAgICBTdHJpbmcgdmFsaWRhdG9yQ2xhc3MpCi0gIHsKLSAgICBfdmFsaWRhdG9yQ2xhc3MgPSB2YWxpZGF0b3JDbGFzczsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB2YWxpZGF0b3IgY2xhc3MgZm9yIHRoaXMgY29tcG9uZW50LgotICAgKgotICAgKiBAcmV0dXJuICB0aGUgdmFsaWRhdG9yIGNsYXNzCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFZhbGlkYXRvckNsYXNzKCkKLSAgewotICAgIHJldHVybiBfdmFsaWRhdG9yQ2xhc3M7Ci0gIH0KLQotICAvKioKLSAgICogU2V0cyB0aGUgdmFsaWRhdG9yIHN1cGVyIGNsYXNzIGZvciB0aGlzIGNvbXBvbmVudC4KLSAgICoKLSAgICogQHBhcmFtIHZhbGlkYXRvclN1cGVyQ2xhc3MgIHRoZSB2YWxpZGF0b3Igc3VwZXIgY2xhc3MKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFZhbGlkYXRvclN1cGVyQ2xhc3MoCi0gICAgU3RyaW5nIHZhbGlkYXRvclN1cGVyQ2xhc3MpCi0gIHsKLSAgICBfdmFsaWRhdG9yU3VwZXJDbGFzcyA9IHZhbGlkYXRvclN1cGVyQ2xhc3M7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgdmFsaWRhdG9yIHN1cGVyIGNsYXNzIGZvciB0aGlzIGNvbXBvbmVudC4KLSAgICoKLSAgICogQHJldHVybiAgdGhlIHZhbGlkYXRvciBzdXBlciBjbGFzcwotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRWYWxpZGF0b3JTdXBlckNsYXNzKCkKLSAgewotICAgIHJldHVybiBfdmFsaWRhdG9yU3VwZXJDbGFzczsKLSAgfQotCi0gIC8qKgotICAgKiBBZGRzIGEgSmF2YSBMYW5ndWFnZSBjbGFzcyBtb2RpZmllciB0byB0aGUgdmFsaWRhdG9yIGNsYXNzLgotICAgKgotICAgKiBAcGFyYW0gbW9kaWZpZXIgIHRoZSBtb2RpZmllciB0byBiZSBhZGRlZAotICAgKi8KLSAgcHVibGljIHZvaWQgYWRkVmFsaWRhdG9yQ2xhc3NNb2RpZmllcigKLSAgICBpbnQgbW9kaWZpZXIpCi0gIHsKLSAgICBfdmFsaWRhdG9yQ2xhc3NNb2RpZmllcnMgfD0gbW9kaWZpZXI7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgSmF2YSBMYW5ndWFnZSBjbGFzcyBtb2RpZmllcnMgZm9yIHRoZSB2YWxpZGF0b3IgY2xhc3MuCi0gICAqIEJ5IGRlZmF1bHQsIHRoZXNlIG1vZGlmaWVycyBpbmNsdWRlIE1vZGlmaWVyLlBVQkxJQy4KLSAgICoKLSAgICogQHJldHVybiAgdGhlIEphdmEgTGFuZ3VhZ2UgY2xhc3MgbW9kaWZpZXJzIGZvciB0aGUgdmFsaWRhdG9yIGNsYXNzCi0gICAqLwotICBwdWJsaWMgaW50IGdldFZhbGlkYXRvckNsYXNzTW9kaWZpZXJzKCkKLSAgewotICAgIGludCBtb2RpZmllcnMgPSBfdmFsaWRhdG9yQ2xhc3NNb2RpZmllcnM7Ci0KLSAgICBpZiAoIU1vZGlmaWVyLmlzUHJpdmF0ZShtb2RpZmllcnMpICYmCi0gICAgICAgICFNb2RpZmllci5pc1Byb3RlY3RlZChtb2RpZmllcnMpICYmCi0gICAgICAgICFNb2RpZmllci5pc1B1YmxpYyhtb2RpZmllcnMpKQotICAgIHsKLSAgICAgIG1vZGlmaWVycyB8PSBNb2RpZmllci5QVUJMSUM7Ci0gICAgfQotCi0gICAgcmV0dXJuIG1vZGlmaWVyczsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHBhcnNlVmFsaWRhdG9yQ2xhc3NNb2RpZmllcigKLSAgICBTdHJpbmcgbW9kaWZpZXIpCi0gIHsKLSAgICBhZGRWYWxpZGF0b3JDbGFzc01vZGlmaWVyKF9wYXJzZU1vZGlmaWVyKG1vZGlmaWVyKSk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldFRhZ0NsYXNzRXhjbHVkZWQoYm9vbGVhbiB0YWdDbGFzc0V4Y2x1ZGVkKQotICB7Ci0gICAgX3RhZ0NsYXNzRXhjbHVkZWQgPSB0YWdDbGFzc0V4Y2x1ZGVkOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gaXNUYWdDbGFzc0V4Y2x1ZGVkKCkKLSAgewotICAgIHJldHVybiBfdGFnQ2xhc3NFeGNsdWRlZDsKLSAgfQotCi0gIHByaXZhdGUgU3RyaW5nICBfdmFsaWRhdG9ySWQ7Ci0gIHByaXZhdGUgU3RyaW5nICBfdmFsaWRhdG9yQ2xhc3M7Ci0gIHByaXZhdGUgU3RyaW5nICBfdmFsaWRhdG9yU3VwZXJDbGFzczsKLSAgcHJpdmF0ZSBpbnQgICAgIF92YWxpZGF0b3JDbGFzc01vZGlmaWVyczsKLSAgcHJpdmF0ZSBib29sZWFuIF90YWdDbGFzc0V4Y2x1ZGVkOwotCi0KLSAgc3RhdGljIHByaXZhdGUgZmluYWwgTG9nZ2VyIF9MT0cgPSBMb2dnZXIuZ2V0TG9nZ2VyKFZhbGlkYXRvckJlYW4uY2xhc3MuZ2V0TmFtZSgpKTsKLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy9wYXJzZS9jb252ZXJ0ZXJzL1FOYW1lQ29udmVydGVyLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvcGFyc2UvY29udmVydGVycy9RTmFtZUNvbnZlcnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlY2I5YTQyLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy9wYXJzZS9jb252ZXJ0ZXJzL1FOYW1lQ29udmVydGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMucGFyc2UuY29udmVydGVyczsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuYmVhbnV0aWxzLkNvbnZlcnNpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmJlYW51dGlscy5Db252ZXJ0VXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmJlYW51dGlscy5Db252ZXJ0ZXI7Ci0KLXB1YmxpYyBmaW5hbCBjbGFzcyBRTmFtZUNvbnZlcnRlciBpbXBsZW1lbnRzIENvbnZlcnRlcgotewotICBwdWJsaWMgT2JqZWN0IGNvbnZlcnQoCi0gICAgQ2xhc3MgIHR5cGUsCi0gICAgT2JqZWN0IHZhbHVlKQotICB7Ci0gICAgaWYgKHZhbHVlID09IG51bGwpCi0gICAgICB0aHJvdyBuZXcgQ29udmVyc2lvbkV4Y2VwdGlvbigiTWlzc2luZyB2YWx1ZSIpOwotCi0gICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgUU5hbWUpCi0gICAgICByZXR1cm4gdmFsdWU7Ci0KLSAgICB0cnkKLSAgICB7Ci0gICAgICByZXR1cm4gUU5hbWUudmFsdWVPZih2YWx1ZS50b1N0cmluZygpKTsKLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBDb252ZXJzaW9uRXhjZXB0aW9uKGUpOwotICAgIH0KLSAgfQotCi0gIHN0YXRpYyBwdWJsaWMgdm9pZCByZWdpc3RlcigpCi0gIHsKLSAgICBDb252ZXJ0VXRpbHMucmVnaXN0ZXIobmV3IFFOYW1lQ29udmVydGVyKCksIFFOYW1lLmNsYXNzKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL3BhcnNlL3J1bGVzL0JlYW5Qcm9wZXJ0eVNldHRlclJ1bGUuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy9wYXJzZS9ydWxlcy9CZWFuUHJvcGVydHlTZXR0ZXJSdWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzMDNiMTcuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL3BhcnNlL3J1bGVzL0JlYW5Qcm9wZXJ0eVNldHRlclJ1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy5wYXJzZS5ydWxlczsKLQotaW1wb3J0IGphdmEuYmVhbnMuUHJvcGVydHlEZXNjcmlwdG9yOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMucGFyc2UuY29udmVydGVycy5RTmFtZUNvbnZlcnRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuYmVhbnV0aWxzLkJlYW5VdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuYmVhbnV0aWxzLlByb3BlcnR5VXRpbHM7Ci0KLQotLyoqCi0gKiBFeHRlbmRzIEFwYWNoZSBDb21tb25zIERpZ2VzdGVyIEJlYW5Qcm9wZXJ0eVNldHRlclJ1bGUgdG8gYWRkIFFOYW1lIHN1cHBvcnQuCi0gKgotICogQSBRTmFtZSBjb252ZXRlciBpcyBub3Qgc3VmZmljaWVudCBiZWNhdXNlIGl0IHJlcXVpcmVzIGNvbnRleHR1YWwKLSAqIGtub3dsZWRnZSBvZiB0aGUgY3VycmVudCBwcmVmaXgtdG8tbmFtZXNwYWNlIG1hcHBpbmdzLgotICovCi1wdWJsaWMgY2xhc3MgQmVhblByb3BlcnR5U2V0dGVyUnVsZQotICAgICAgIGV4dGVuZHMgb3JnLmFwYWNoZS5jb21tb25zLmRpZ2VzdGVyLkJlYW5Qcm9wZXJ0eVNldHRlclJ1bGUKLXsKLSAgcHVibGljIEJlYW5Qcm9wZXJ0eVNldHRlclJ1bGUoCi0gICAgU3RyaW5nIHByb3BlcnR5TmFtZSkKLSAgewotICAgIHN1cGVyKHByb3BlcnR5TmFtZSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBlbmQoCi0gICAgU3RyaW5nIG5hbWVzcGFjZSwKLSAgICBTdHJpbmcgbmFtZSkgdGhyb3dzIEV4Y2VwdGlvbgotICB7Ci0gICAgT2JqZWN0IHRvcCA9IGRpZ2VzdGVyLnBlZWsoKTsKLQotICAgIFByb3BlcnR5RGVzY3JpcHRvciBkZXNjcmlwdG9yID0KLSAgICAgICAgICBQcm9wZXJ0eVV0aWxzLmdldFByb3BlcnR5RGVzY3JpcHRvcih0b3AsIHByb3BlcnR5TmFtZSk7Ci0KLSAgICBpZiAoZGVzY3JpcHRvciA9PSBudWxsKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBOb1N1Y2hNZXRob2RFeGNlcHRpb24oIk1pc3NpbmcgYmVhbiBwcm9wZXJ0eSBcIiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eU5hbWUgKyAiXCIiKTsKLSAgICB9Ci0KLSAgICBDbGFzcyBwcm9wZXJ0eVR5cGUgPSBkZXNjcmlwdG9yLmdldFByb3BlcnR5VHlwZSgpOwotCi0gICAgaWYgKFFOYW1lLmNsYXNzLmVxdWFscyhwcm9wZXJ0eVR5cGUpKQotICAgIHsKLSAgICAgIGludCBjb2xvbiA9IGJvZHlUZXh0LmluZGV4T2YoJzonKTsKLSAgICAgIGlmIChjb2xvbiAhPSAtMSkKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIG5hbWVzcGFjZVVSSSA9IGRpZ2VzdGVyLmZpbmROYW1lc3BhY2VVUkkoYm9keVRleHQuc3Vic3RyaW5nKDAsIGNvbG9uKSk7Ci0gICAgICAgIGJvZHlUZXh0ID0gInsiICsgbmFtZXNwYWNlVVJJICsgIn0iICsgYm9keVRleHQuc3Vic3RyaW5nKGNvbG9uICsgMSk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChib2R5VGV4dC5pbmRleE9mKCd7JykgPT0gLTEpCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyBuYW1lc3BhY2VVUkkgPSBkaWdlc3Rlci5maW5kTmFtZXNwYWNlVVJJKCIiKTsKLSAgICAgICAgYm9keVRleHQgPSAieyIgKyBuYW1lc3BhY2VVUkkgKyAifSIgKyBib2R5VGV4dC5zdWJzdHJpbmcoY29sb24gKyAxKTsKLSAgICAgIH0KLSAgICAgIEJlYW5VdGlscy5zZXRQcm9wZXJ0eSh0b3AsIHByb3BlcnR5TmFtZSwgYm9keVRleHQpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgc3VwZXIuZW5kKG5hbWVzcGFjZSwgbmFtZSk7Ci0gICAgfQotICB9Ci0KLSAgc3RhdGljCi0gIHsKLSAgICBRTmFtZUNvbnZlcnRlci5yZWdpc3RlcigpOwotICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvdXRpbC9BdHRyaWJ1dGVGaWx0ZXIuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy91dGlsL0F0dHJpYnV0ZUZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4N2FjYmI3Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy91dGlsL0F0dHJpYnV0ZUZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLnV0aWw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLnBhcnNlLkF0dHJpYnV0ZUJlYW47Ci0KLWFic3RyYWN0IHB1YmxpYyBjbGFzcyBBdHRyaWJ1dGVGaWx0ZXIgaW1wbGVtZW50cyBGaWx0ZXIKLXsKLSAgZmluYWwgcHVibGljIGJvb2xlYW4gYWNjZXB0KAotICAgIE9iamVjdCBvYmopCi0gIHsKLSAgICByZXR1cm4gYWNjZXB0KChBdHRyaWJ1dGVCZWFuKW9iaik7Ci0gIH0KLQotICBhYnN0cmFjdCBwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHQoCi0gICAgQXR0cmlidXRlQmVhbiBhdHRyaWJ1dGUpOwotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL3V0aWwvQ29tcG9uZW50RmlsdGVyLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvdXRpbC9Db21wb25lbnRGaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTRlNDdlMi4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvdXRpbC9Db21wb25lbnRGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy51dGlsOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy5wYXJzZS5Db21wb25lbnRCZWFuOwotCi1hYnN0cmFjdCBwdWJsaWMgY2xhc3MgQ29tcG9uZW50RmlsdGVyIGltcGxlbWVudHMgRmlsdGVyCi17Ci0gIGZpbmFsIHB1YmxpYyBib29sZWFuIGFjY2VwdCgKLSAgICBPYmplY3Qgb2JqKQotICB7Ci0gICAgcmV0dXJuIGFjY2VwdCgoQ29tcG9uZW50QmVhbilvYmopOwotICB9Ci0KLSAgYWJzdHJhY3QgcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KAotICAgIENvbXBvbmVudEJlYW4gY29tcG9uZW50KTsKLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy91dGlsL0NvbXBvdW5kSXRlcmF0b3IuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy91dGlsL0NvbXBvdW5kSXRlcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGQ2ZGMyYy4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvdXRpbC9Db21wb3VuZEl0ZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLQotLyoqCi0gKiBDb21wb3VuZEl0ZXJhdG9yIGNvbnN1bWVzIHRoZSBpbml0aWFsIGl0ZXJhdG9yIGJlZm9yZQotICogb2JzZXJ2aW5nIHRoZSBuZXh0IGl0ZXJhdG9yLgotICovCi1wdWJsaWMgY2xhc3MgQ29tcG91bmRJdGVyYXRvciBpbXBsZW1lbnRzIEl0ZXJhdG9yCi17Ci0gIHB1YmxpYyBDb21wb3VuZEl0ZXJhdG9yKAotICAgIEl0ZXJhdG9yIHByaW1hcnksCi0gICAgSXRlcmF0b3Igc2Vjb25kYXJ5KQotICB7Ci0gICAgdGhpcyhuZXcgSXRlcmF0b3JbXSB7cHJpbWFyeSwgc2Vjb25kYXJ5fSk7Ci0gIH0KLQotICBwdWJsaWMgQ29tcG91bmRJdGVyYXRvcigKLSAgICBJdGVyYXRvcltdIGl0ZXJhdG9ycykKLSAgewotICAgIF9pdGVyYXRvcnMgPSBpdGVyYXRvcnM7Ci0gICAgX2luZGV4ID0gMDsKLSAgICBfYWR2YW5jZSgpOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpCi0gIHsKLSAgICByZXR1cm4gKF9uZXh0ICE9IG51bGwpOwotICB9Ci0KLSAgcHVibGljIE9iamVjdCBuZXh0KCkKLSAgewotICAgIGlmIChfbmV4dCA9PSBudWxsKQotICAgICAgdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKTsKLQotICAgIE9iamVjdCBvYmogPSBfbmV4dDsKLSAgICBfYWR2YW5jZSgpOwotICAgIHJldHVybiBvYmo7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCByZW1vdmUoKQotICB7Ci0gICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgX2FkdmFuY2UoKQotICB7Ci0gICAgSXRlcmF0b3IgY3VycmVudCA9IF9pdGVyYXRvcnNbX2luZGV4XTsKLSAgICBpZiAoY3VycmVudCAhPSBudWxsICYmICFjdXJyZW50Lmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBfaW5kZXggKys7Ci0gICAgICBjdXJyZW50ID0gKF9pbmRleCA8IF9pdGVyYXRvcnMubGVuZ3RoKSA/IF9pdGVyYXRvcnNbX2luZGV4XSA6IG51bGw7Ci0gICAgfQotCi0gICAgX25leHQgPSAoY3VycmVudCAhPSBudWxsICYmIGN1cnJlbnQuaGFzTmV4dCgpKSA/IGN1cnJlbnQubmV4dCgpIDogbnVsbDsKLSAgfQotCi0gIHByaXZhdGUgT2JqZWN0IF9uZXh0OwotICBwcml2YXRlIEl0ZXJhdG9yW10gX2l0ZXJhdG9yczsKLSAgcHJpdmF0ZSBpbnQgX2luZGV4OwotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL3V0aWwvQ29udmVydGVyRmlsdGVyLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvdXRpbC9Db252ZXJ0ZXJGaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmVjMzg1MC4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvdXRpbC9Db252ZXJ0ZXJGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy51dGlsOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy5wYXJzZS5Db252ZXJ0ZXJCZWFuOwotCi1hYnN0cmFjdCBwdWJsaWMgY2xhc3MgQ29udmVydGVyRmlsdGVyIGltcGxlbWVudHMgRmlsdGVyCi17Ci0gIGZpbmFsIHB1YmxpYyBib29sZWFuIGFjY2VwdCgKLSAgICBPYmplY3Qgb2JqKQotICB7Ci0gICAgcmV0dXJuIGFjY2VwdCgoQ29udmVydGVyQmVhbilvYmopOwotICB9Ci0KLSAgYWJzdHJhY3QgcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KAotICAgIENvbnZlcnRlckJlYW4gY29udmVydGVyKTsKLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy91dGlsL0ZhY2V0RmlsdGVyLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvdXRpbC9GYWNldEZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNmY1ZjJkLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy91dGlsL0ZhY2V0RmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMudXRpbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMucGFyc2UuRmFjZXRCZWFuOwotCi1hYnN0cmFjdCBwdWJsaWMgY2xhc3MgRmFjZXRGaWx0ZXIgaW1wbGVtZW50cyBGaWx0ZXIKLXsKLSAgZmluYWwgcHVibGljIGJvb2xlYW4gYWNjZXB0KAotICAgIE9iamVjdCBvYmopCi0gIHsKLSAgICByZXR1cm4gYWNjZXB0KChGYWNldEJlYW4pb2JqKTsKLSAgfQotCi0gIGFic3RyYWN0IHByb3RlY3RlZCBib29sZWFuIGFjY2VwdCgKLSAgICBGYWNldEJlYW4gZmFjZXQpOwotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL3V0aWwvRmlsdGVyLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvdXRpbC9GaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTM4M2JiNi4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvdXRpbC9GaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy51dGlsOwotCi1wdWJsaWMgaW50ZXJmYWNlIEZpbHRlcgotewotICBhYnN0cmFjdCBwdWJsaWMgYm9vbGVhbiBhY2NlcHQoCi0gICAgT2JqZWN0IG9iaik7Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvdXRpbC9GaWx0ZXJlZEl0ZXJhdG9yLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvdXRpbC9GaWx0ZXJlZEl0ZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkNjBjNzYuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL3V0aWwvRmlsdGVyZWRJdGVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247Ci0KLXB1YmxpYyBjbGFzcyBGaWx0ZXJlZEl0ZXJhdG9yIGltcGxlbWVudHMgSXRlcmF0b3IKLXsKLSAgcHVibGljIEZpbHRlcmVkSXRlcmF0b3IoCi0gICAgSXRlcmF0b3IgaXRlciwKLSAgICBGaWx0ZXIgICBmaWx0ZXIpCi0gIHsKLSAgICBfaXRlciA9IGl0ZXI7Ci0gICAgX2ZpbHRlciA9IGZpbHRlcjsKLSAgICBfYWR2YW5jZSgpOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpCi0gIHsKLSAgICByZXR1cm4gKF9uZXh0ICE9IG51bGwpOwotICB9Ci0KLSAgcHVibGljIE9iamVjdCBuZXh0KCkKLSAgewotICAgIGlmIChfbmV4dCA9PSBudWxsKQotICAgICAgdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKTsKLQotICAgIE9iamVjdCBvYmogPSBfbmV4dDsKLSAgICBfYWR2YW5jZSgpOwotICAgIHJldHVybiBvYmo7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCByZW1vdmUoKQotICB7Ci0gICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgX2FkdmFuY2UoKQotICB7Ci0gICAgd2hpbGUgKF9pdGVyLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBPYmplY3Qgb2JqID0gX2l0ZXIubmV4dCgpOwotICAgICAgaWYgKF9maWx0ZXIuYWNjZXB0KG9iaikpCi0gICAgICB7Ci0gICAgICAgIF9uZXh0ID0gb2JqOwotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgfQotCi0gICAgX25leHQgPSBudWxsOwotICB9Ci0KLSAgcHJpdmF0ZSBmaW5hbCBJdGVyYXRvciBfaXRlcjsKLSAgcHJpdmF0ZSBmaW5hbCBGaWx0ZXIgX2ZpbHRlcjsKLSAgcHJpdmF0ZSBPYmplY3QgX25leHQ7Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvdXRpbC9Qcm9wZXJ0eUZpbHRlci5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL3V0aWwvUHJvcGVydHlGaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzZmYzU5My4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvdXRpbC9Qcm9wZXJ0eUZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLnV0aWw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLnBhcnNlLlByb3BlcnR5QmVhbjsKLQotYWJzdHJhY3QgcHVibGljIGNsYXNzIFByb3BlcnR5RmlsdGVyIGltcGxlbWVudHMgRmlsdGVyCi17Ci0gIGZpbmFsIHB1YmxpYyBib29sZWFuIGFjY2VwdCgKLSAgICBPYmplY3Qgb2JqKQotICB7Ci0gICAgcmV0dXJuIGFjY2VwdCgoUHJvcGVydHlCZWFuKW9iaik7Ci0gIH0KLQotICBhYnN0cmFjdCBwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHQoCi0gICAgUHJvcGVydHlCZWFuIHByb3BlcnR5KTsKLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy91dGlsL1JlbmRlcmVyRmlsdGVyLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvdXRpbC9SZW5kZXJlckZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MDNkNGViLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy91dGlsL1JlbmRlcmVyRmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMudXRpbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMucGFyc2UuUmVuZGVyZXJCZWFuOwotCi1hYnN0cmFjdCBwdWJsaWMgY2xhc3MgUmVuZGVyZXJGaWx0ZXIgaW1wbGVtZW50cyBGaWx0ZXIKLXsKLSAgZmluYWwgcHVibGljIGJvb2xlYW4gYWNjZXB0KAotICAgIE9iamVjdCBvYmopCi0gIHsKLSAgICByZXR1cm4gYWNjZXB0KChSZW5kZXJlckJlYW4pb2JqKTsKLSAgfQotCi0gIGFic3RyYWN0IHByb3RlY3RlZCBib29sZWFuIGFjY2VwdCgKLSAgICBSZW5kZXJlckJlYW4gcmVuZGVyZXIpOwotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL3V0aWwvU29ydGVkSXRlcmF0b3IuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy91dGlsL1NvcnRlZEl0ZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlZThjZDEuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL3V0aWwvU29ydGVkSXRlcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotCi0vKioKLSAqIFNvcnRlZEl0ZXJhdG9yIHByZXNlbnRzIHRoZSBlbGVtZW50cyBvZiBhbm90aGVyIGl0ZXJhdG9yIGluIGEgc29ydGVkIG9yZGVyLgotICovCi1wdWJsaWMgY2xhc3MgU29ydGVkSXRlcmF0b3IgaW1wbGVtZW50cyBJdGVyYXRvcgotewotICBwdWJsaWMgU29ydGVkSXRlcmF0b3IoCi0gICAgSXRlcmF0b3IgdW5zb3J0ZWQpCi0gIHsKLSAgICAgLy8gdGhpcyBpbXBsZW1lbnRhdGlvbiBqdXN0IHB1bGxzIHRoZSBlbnRpcmUgY29udGVudHMgaW50byBhIGxpc3QgLS0KLSAgICAgLy8gaXQgd2lsbCBiZSBhd2t3YXJkIGlmIHRoZSB1bnNvcnRlZCBpdGVyYXRvciBpcyBpbmZpbml0ZQotICAgICBBcnJheUxpc3Qgc29ydGVkTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgd2hpbGUodW5zb3J0ZWQuaGFzTmV4dCgpKQotICAgICB7Ci0gICAgICAgc29ydGVkTGlzdC5hZGQodW5zb3J0ZWQubmV4dCgpKTsKLSAgICAgfQotICAgICBDb2xsZWN0aW9ucy5zb3J0KHNvcnRlZExpc3QpOwotICAgICBfc29ydGVkID0gc29ydGVkTGlzdC5pdGVyYXRvcigpOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpCi0gIHsKLSAgICByZXR1cm4gX3NvcnRlZC5oYXNOZXh0KCk7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IG5leHQoKQotICB7Ci0gICAgcmV0dXJuIF9zb3J0ZWQubmV4dCgpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgcmVtb3ZlKCkKLSAgewotICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICB9Ci0KLSAgcHJpdmF0ZSBmaW5hbCBJdGVyYXRvciBfc29ydGVkOwotCi19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvdXRpbC9Tb3VyY2VUZW1wbGF0ZS5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL3V0aWwvU291cmNlVGVtcGxhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWQyOWVkZC4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvdXRpbC9Tb3VyY2VUZW1wbGF0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY0ICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy51dGlsOwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEudXRpbC4qOwotCi1wdWJsaWMgY2xhc3MgU291cmNlVGVtcGxhdGUKLXsKLSAgcHVibGljIFNvdXJjZVRlbXBsYXRlKEZpbGUgZmlsZSkKLSAgewotICAgIF9maWxlID0gZmlsZTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHN1YnN0aXR1dGUoU3RyaW5nIGluLCBTdHJpbmcgb3V0KQotICB7Ci0gICAgX3N1YnN0aXR1dGlvbnMucHV0KGluLCBvdXQpOwotICB9Ci0KLSAgcHVibGljIFNldCBnZXRJbXBvcnRzKCkKLSAgewotICAgIHJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVTZXQoX2ltcG9ydHMpOwotICB9Ci0KLSAgcHVibGljIFNldCBnZXRJbXBsZW1lbnRzKCkKLSAgewotICAgIHJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVTZXQoX2ltcGxlbWVudHMpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgcmVhZFByZWZhY2UoKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgewotICAgIF9yZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IEZpbGVSZWFkZXIoX2ZpbGUpKTsKLSAgICB3aGlsZSAodHJ1ZSkKLSAgICB7Ci0gICAgICBTdHJpbmcgbGluZSA9IF9yZWFkZXIucmVhZExpbmUoKTsKLSAgICAgIGlmIChsaW5lID09IG51bGwpCi0gICAgICAgIHRocm93IG5ldyBFT0ZFeGNlcHRpb24oIkZpbGUgIiArIF9maWxlICsgIiBlbmRlZCBwcmVtYXR1cmVseSIpOwotCi0gICAgICBpZiAobGluZS5lcXVhbHMoInsiKSkKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGlmIChsaW5lLnN0YXJ0c1dpdGgoImltcG9ydCAiKSkKLSAgICAgIHsKLSAgICAgICAgbGluZSA9IGxpbmUudHJpbSgpOwotICAgICAgICBTdHJpbmcgaW1wb3J0ZWQgPSBsaW5lLnN1YnN0cmluZygiaW1wb3J0ICIubGVuZ3RoKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUubGVuZ3RoKCkgLSAxKTsKLSAgICAgICAgX2ltcG9ydHMuYWRkKGltcG9ydGVkKTsKLSAgICAgICAgX2ZxY25NYXAucHV0KFV0aWwuZ2V0Q2xhc3NGcm9tRnVsbENsYXNzKGltcG9ydGVkKSwgaW1wb3J0ZWQpOwotICAgICAgfQotCi0gICAgICBpbnQgaW5kZXggPSBsaW5lLmluZGV4T2YoIiBpbXBsZW1lbnRzICIpOwotICAgICAgaWYgKGluZGV4ICE9IC0xKQotICAgICAgewotICAgICAgICBTdHJpbmcgY2xhdXNlID0gbGluZS5zdWJzdHJpbmcoaW5kZXggKyAiIGltcGxlbWVudHMgIi5sZW5ndGgoKSk7Ci0gICAgICAgIFN0cmluZ1tdIGludGVyZmFjZXMgPSBjbGF1c2Uuc3BsaXQoIiwgIik7Ci0gICAgICAgIGZvciAoaW50IGk9MDsgaSA8IGludGVyZmFjZXMubGVuZ3RoOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gaW50ZXJmYWNlc1tpXTsKLSAgICAgICAgICBpZiAoIVV0aWwuaXNGdWxsQ2xhc3MoY2xhc3NOYW1lKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmcgaW1wb3J0ZWROYW1lID0gKFN0cmluZylfZnFjbk1hcC5nZXQoY2xhc3NOYW1lKTsKLSAgICAgICAgICAgIGlmIChpbXBvcnRlZE5hbWUgIT0gbnVsbCkKLSAgICAgICAgICAgICAgY2xhc3NOYW1lID0gaW1wb3J0ZWROYW1lOwotICAgICAgICAgIH0KLSAgICAgICAgICBfaW1wbGVtZW50cy5hZGQoY2xhc3NOYW1lKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotCi0KLSAgcHVibGljIHZvaWQgd3JpdGVDb250ZW50KFdyaXRlciBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbgotICB7Ci0gICAgd2hpbGUgKHRydWUpCi0gICAgewotICAgICAgU3RyaW5nIGxpbmUgPSBfcmVhZGVyLnJlYWRMaW5lKCk7Ci0gICAgICBpZiAobGluZSA9PSBudWxsKQotICAgICAgICB0aHJvdyBuZXcgRU9GRXhjZXB0aW9uKCJGaWxlICIgKyBfZmlsZSArICIgZW5kZWQgcHJlbWF0dXJlbHkiKTsKLQotICAgICAgaWYgKGxpbmUudHJpbSgpLnN0YXJ0c1dpdGgoX0lHTk9SRV9QUkVGSVgpKXsKLSAgICAgICAgICBpZiAobGluZS50cmltKCkuc3RhcnRzV2l0aChfSUdOT1JFX1BSRUZJWDIpKXsKLSAgICAgICAgICAgICAgU3RyaW5nIG1ldGhvZCA9IGxpbmUudHJpbSgpLnN1YnN0cmluZyhfSUdOT1JFX1BSRUZJWDIubGVuZ3RoKCkpLnRyaW0oKTsKLSAgICAgICAgICAgICAgaWYgKG1ldGhvZC5sZW5ndGgoKSA+IDAgKXsKLSAgICAgICAgICAgICAgICAgIF9pZ25vcmVNZXRob2RzLmFkZChtZXRob2QpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotCi0gICAgICBpZiAobGluZS5lcXVhbHMoIn0iKSkKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGxpbmUgPSBfc3Vic3RpdHV0ZShsaW5lKTsKLSAgICAgIG91dC53cml0ZShsaW5lKTsKLSAgICAgIG91dC53cml0ZSgiXG4iKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbgotICB7Ci0gICAgX3JlYWRlci5jbG9zZSgpOwotICB9Ci0KLSAgcHJpdmF0ZSBTdHJpbmcgX3N1YnN0aXR1dGUoU3RyaW5nIGluKQotICB7Ci0gICAgSXRlcmF0b3Iga2V5cyA9IF9zdWJzdGl0dXRpb25zLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0gICAgd2hpbGUgKGtleXMuaGFzTmV4dCgpKQotICAgIHsKLSAgICAgIFN0cmluZyBrZXkgPSAoU3RyaW5nKSBrZXlzLm5leHQoKTsKLSAgICAgIFN0cmluZyB2YWx1ZSA9IChTdHJpbmcpIF9zdWJzdGl0dXRpb25zLmdldChrZXkpOwotICAgICAgaW4gPSBfc3Vic3RpdHV0ZShpbiwga2V5LCB2YWx1ZSk7Ci0gICAgfQotCi0gICAgcmV0dXJuIGluOwotICB9Ci0KLSAgc3RhdGljIHByaXZhdGUgU3RyaW5nIF9zdWJzdGl0dXRlKFN0cmluZyBpbiwgU3RyaW5nIGZyb20sIFN0cmluZyB0bykKLSAgewotICAgIGludCBpbmRleCA9IGluLmluZGV4T2YoZnJvbSk7Ci0gICAgaWYgKGluZGV4IDwgMCkKLSAgICAgIHJldHVybiBpbjsKLQotICAgIFN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKGluLmxlbmd0aCgpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0by5sZW5ndGgoKSAtIGZyb20ubGVuZ3RoKCkpOwotICAgIGJ1ZmZlci5hcHBlbmQoaW4uc3Vic3RyaW5nKDAsIGluZGV4KSk7Ci0gICAgYnVmZmVyLmFwcGVuZCh0byk7Ci0gICAgU3RyaW5nIHN1ZmZpeCA9IGluLnN1YnN0cmluZyhpbmRleCArIGZyb20ubGVuZ3RoKCkpOwotICAgIGJ1ZmZlci5hcHBlbmQoX3N1YnN0aXR1dGUoc3VmZml4LCBmcm9tLCB0bykpOwotCi0gICAgcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotICB9Ci0KLSAgICBwdWJsaWMgQ29sbGVjdGlvbiBnZXRJZ25vcmVNZXRob2RzKCkgewotICAgICAgICByZXR1cm4gX2lnbm9yZU1ldGhvZHM7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBGaWxlICAgICAgICAgICBfZmlsZTsKLSAgcHJpdmF0ZSBCdWZmZXJlZFJlYWRlciBfcmVhZGVyOwotICBwcml2YXRlIFNldCAgICAgICAgICAgIF9pbXBvcnRzID0gbmV3IEhhc2hTZXQoKTsKLSAgcHJpdmF0ZSBNYXAgICAgICAgICAgICBfZnFjbk1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0gIHByaXZhdGUgU2V0ICAgICAgICAgICAgX2ltcGxlbWVudHMgPSBuZXcgSGFzaFNldCgpOwotICBwcml2YXRlIE1hcCAgICAgICAgICAgIF9zdWJzdGl0dXRpb25zID0gbmV3IEhhc2hNYXAoKTsKLSAgcHJpdmF0ZSBTZXQgICAgICAgICAgICBfaWdub3JlTWV0aG9kcyA9IG5ldyBIYXNoU2V0KCk7Ci0KLSAgLy8gTWFnaWMgc3ludGF4IGluZGljYXRpbmcgInBsZWFzZSBpZ25vcmUgdGhpcyBsaW5lIgotICBzdGF0aWMgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgX0lHTk9SRV9QUkVGSVggPSAiLyoqLyI7Ci0gIHN0YXRpYyBwcml2YXRlIGZpbmFsIFN0cmluZyBfSUdOT1JFX1BSRUZJWDIgPSAiLyoqLy8vIjsKLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy91dGlsL1V0aWwuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy91dGlsL1V0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGU5ZmJhZS4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvdXRpbC9VdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0ODkgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLnV0aWw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLnBhcnNlLlByb3BlcnR5QmVhbjsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwuVHJlZVNldDsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguTWF0Y2hlcjsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKLQotcHVibGljIGNsYXNzIFV0aWwKLXsKLSAgc3RhdGljIHB1YmxpYyBTdHJpbmcgY29udmVydENsYXNzVG9Tb3VyY2VQYXRoKAotICAgIFN0cmluZyBjbGFzc05hbWUsCi0gICAgU3RyaW5nIGZpbGVFeHRlbnNpb24pCi0gIHsKLSAgICByZXR1cm4gKGNsYXNzTmFtZS5yZXBsYWNlKCcuJywgRmlsZS5zZXBhcmF0b3JDaGFyKSArIGZpbGVFeHRlbnNpb24pOwotICB9Ci0KLSAgc3RhdGljIHB1YmxpYyBib29sZWFuIGlzRnVsbENsYXNzKAotICAgIFN0cmluZyBjbGFzc05hbWUpCi0gIHsKLSAgICByZXR1cm4gKGNsYXNzTmFtZSAhPSBudWxsICYmIGNsYXNzTmFtZS5pbmRleE9mKCcuJykgIT0gLTEpOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0R2VuZXJpY3NGcm9tUHJvcGVydHkoUHJvcGVydHlCZWFuIHByb3BlcnR5KXsKLSAgICAgIFN0cmluZyBnZW4gPSAiIjsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcHJvcGVydHkuZ2V0QXR0cmlidXRlQ2xhc3NQYXJhbWV0ZXJzKCkubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICBpZiAoaT4wKXsKLSAgICAgICAgICAgICAgZ2VuICs9ICIsIjsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZ2VuICs9IGdldENsYXNzRnJvbUZ1bGxDbGFzcyhwcm9wZXJ0eS5nZXRBdHRyaWJ1dGVDbGFzc1BhcmFtZXRlcnMoKVtpXSk7ICAgICAgICAgIAotICAgICAgfQotICAgICAgcmV0dXJuIChnZW4ubGVuZ3RoKCkgPiAwPyI8IitnZW4rIj4iOmdlbik7Ci0gIH0KLQotICBzdGF0aWMgcHVibGljIFN0cmluZyBnZXRDbGFzc0Zyb21GdWxsQ2xhc3MoCi0gICAgU3RyaW5nIGZ1bGxDbGFzcykKLSAgewotICAgIGlmIChmdWxsQ2xhc3MgPT0gbnVsbCkKLSAgICAgIHJldHVybiBudWxsOwotCi0gICAgaW50IGxhc3RTZXAgPSBmdWxsQ2xhc3MubGFzdEluZGV4T2YoJy4nKTsKLSAgICAvLyBOb3RlOiB0aGlzIGNvZGUgYWxzbyB3b3JrcyBmb3IgdGhlIGVtcHR5IHBhY2thZ2UKLSAgICByZXR1cm4gKGZ1bGxDbGFzcy5zdWJzdHJpbmcobGFzdFNlcCArIDEpKTsKLSAgfQotCi0gIHN0YXRpYyBwdWJsaWMgU3RyaW5nIGdldFBhY2thZ2VGcm9tRnVsbENsYXNzKAotICAgIFN0cmluZyBmdWxsQ2xhc3MpCi0gIHsKLSAgICBpZiAoZnVsbENsYXNzID09IG51bGwpCi0gICAgICByZXR1cm4gbnVsbDsKLQotICAgIGludCBsYXN0U2VwID0gZnVsbENsYXNzLmxhc3RJbmRleE9mKCcuJyk7Ci0KLSAgICAvLyBkZXRlY3QgdGhlIGVtcHR5IHBhY2thZ2UKLSAgICBpZiAobGFzdFNlcCA9PSAtMSkKLSAgICAgIHJldHVybiAiIjsKLQotICAgIHJldHVybiAoZnVsbENsYXNzLnN1YnN0cmluZygwLCBsYXN0U2VwKSk7Ci0gIH0KLQotICBzdGF0aWMgcHVibGljIFN0cmluZyBnZXRDb25zdGFudE5hbWVGcm9tUHJvcGVydHkoCi0gICAgU3RyaW5nIHByb3BlcnR5TmFtZSkKLSAgewotICAgIHJldHVybiBnZXRDb25zdGFudE5hbWVGcm9tUHJvcGVydHkocHJvcGVydHlOYW1lLCBudWxsKTsKLSAgfQotCi0gIHN0YXRpYyBwdWJsaWMgU3RyaW5nIGdldENvbnN0YW50TmFtZUZyb21Qcm9wZXJ0eSgKLSAgICBTdHJpbmcgcHJvcGVydHlOYW1lLAotICAgIFN0cmluZyBjb25zdGFudFN1ZmZpeCkKLSAgewotICAgIFN0cmluZ0J1ZmZlciBjb25zdGFudE5hbWUgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0KLSAgICBmb3IgKGludCBpPTA7IGkgPCBwcm9wZXJ0eU5hbWUubGVuZ3RoKCk7IGkrKykKLSAgICB7Ci0gICAgICBjaGFyIGNoID0gcHJvcGVydHlOYW1lLmNoYXJBdChpKTsKLSAgICAgIGlmIChpID4gMCAmJgotICAgICAgICAgIENoYXJhY3Rlci5pc1VwcGVyQ2FzZShjaCkgJiYKLSAgICAgICAgICBDaGFyYWN0ZXIuaXNMb3dlckNhc2UocHJvcGVydHlOYW1lLmNoYXJBdChpLTEpKSkKLSAgICAgIHsKLSAgICAgICAgY29uc3RhbnROYW1lLmFwcGVuZCgnXycpOwotICAgICAgfQotICAgICAgY2ggPSBDaGFyYWN0ZXIudG9VcHBlckNhc2UoY2gpOwotICAgICAgY29uc3RhbnROYW1lLmFwcGVuZChjaCk7Ci0gICAgfQotCi0gICAgaWYgKGNvbnN0YW50U3VmZml4ICE9IG51bGwpCi0gICAgICBjb25zdGFudE5hbWUuYXBwZW5kKGNvbnN0YW50U3VmZml4KTsKLQotICAgIHJldHVybiBjb25zdGFudE5hbWUudG9TdHJpbmcoKTsKLSAgfQotCi0gIHN0YXRpYyBwdWJsaWMgU3RyaW5nIGdldFByZWZpeGVkUHJvcGVydHlOYW1lKAotICAgIFN0cmluZyBwcmVmaXgsCi0gICAgU3RyaW5nIHByb3BlcnR5TmFtZSkKLSAgewotICAgIHJldHVybiBwcmVmaXggKyBDaGFyYWN0ZXIudG9VcHBlckNhc2UocHJvcGVydHlOYW1lLmNoYXJBdCgwKSkgKwotICAgICAgICAgICBwcm9wZXJ0eU5hbWUuc3Vic3RyaW5nKDEpOwotICB9Ci0gIAotICBzdGF0aWMgcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eUNsYXNzKFByb3BlcnR5QmVhbiBwcm9wZXJ0eSkKLSAgewotICAgIFN0cmluZyBwcm9wZXJ0eUZ1bGxDbGFzcyA9IHByb3BlcnR5LmdldFByb3BlcnR5Q2xhc3MoKTsKLSAgICBTdHJpbmcgcHJvcGVydHlDbGFzcyA9IFV0aWwuZ2V0Q2xhc3NGcm9tRnVsbENsYXNzKHByb3BlcnR5RnVsbENsYXNzKTsKLSAgICBTdHJpbmdbXSBnZW5lcmljVHlwZXMgPSBwcm9wZXJ0eS5nZXRQcm9wZXJ0eUNsYXNzUGFyYW1ldGVycygpOwotICAgIGlmKGdlbmVyaWNUeXBlcyAhPSBudWxsICYmIGdlbmVyaWNUeXBlcy5sZW5ndGggPiAwKQotICAgIHsKLSAgICAgIFN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKDYwKTsKLSAgICAgIGJ1ZmZlci5hcHBlbmQocHJvcGVydHlDbGFzcyk7Ci0gICAgICBidWZmZXIuYXBwZW5kKCc8Jyk7Ci0gICAgICBpbnQgbWF4ID0gZ2VuZXJpY1R5cGVzLmxlbmd0aCAtIDE7Ci0gICAgICBmb3IoaW50IGkgPSAwOyBpIDw9IG1heDsgaSsrKQotICAgICAgewotICAgICAgICBfYnVpbGRQcm9wZXJ0eUNsYXNzKGJ1ZmZlciwgZ2VuZXJpY1R5cGVzW2ldKTsKLSAgICAgICAgaWYoaSA8IG1heCkKLSAgICAgICAgewotICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoIiwgIik7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGJ1ZmZlci5hcHBlbmQoJz4nKTsKLSAgICAgIAotICAgICAgcHJvcGVydHlDbGFzcyA9IGJ1ZmZlci50b1N0cmluZygpOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gcHJvcGVydHlDbGFzczsKLSAgfQotCi0gIHN0YXRpYyBwdWJsaWMgU3RyaW5nIGdldE1ldGhvZE5hbWVGcm9tRXZlbnQoCi0gICAgU3RyaW5nIG1ldGhvZFByZWZpeCwKLSAgICBTdHJpbmcgZXZlbnROYW1lLAotICAgIFN0cmluZyBtZXRob2RTdWZmaXgpCi0gIHsKLSAgICByZXR1cm4gbWV0aG9kUHJlZml4ICsKLSAgICAgICAgICAgQ2hhcmFjdGVyLnRvVXBwZXJDYXNlKGV2ZW50TmFtZS5jaGFyQXQoMCkpICsKLSAgICAgICAgICAgZXZlbnROYW1lLnN1YnN0cmluZygxKSArCi0gICAgICAgICAgIG1ldGhvZFN1ZmZpeDsKLSAgfQotCi0gIHN0YXRpYyBwdWJsaWMgU3RyaW5nIGdldE1ldGhvZFJlYWRlckZyb21Qcm9wZXJ0eSgKLSAgICBTdHJpbmcgcHJvcGVydHlOYW1lLAotICAgIFN0cmluZyBwcm9wZXJ0eUNsYXNzKQotICB7Ci0gICAgU3RyaW5nIG1ldGhvZFByZWZpeCA9ICgiYm9vbGVhbiIuZXF1YWxzKHByb3BlcnR5Q2xhc3MpID8gImlzIiA6ICJnZXQiKTsKLSAgICByZXR1cm4gZ2V0UHJlZml4ZWRQcm9wZXJ0eU5hbWUobWV0aG9kUHJlZml4LCBwcm9wZXJ0eU5hbWUpOwotICB9Ci0KLSAgc3RhdGljIHB1YmxpYyBTdHJpbmcgZ2V0RXZlbnROYW1lRnJvbUV2ZW50VHlwZSgKLSAgICBTdHJpbmcgZXZlbnRGdWxsQ2xhc3MpCi0gIHsKLSAgICBTdHJpbmcgZXZlbnROYW1lID0gZ2V0Q2xhc3NGcm9tRnVsbENsYXNzKGV2ZW50RnVsbENsYXNzKTsKLSAgICByZXR1cm4gQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKGV2ZW50TmFtZS5jaGFyQXQoMCkpICsKLSAgICAgICAgICAgZXZlbnROYW1lLnN1YnN0cmluZygxLCBldmVudE5hbWUubGVuZ3RoKCkpOwotICB9Ci0KLSAgc3RhdGljIHB1YmxpYyBib29sZWFuIGlzUHJpbWl0aXZlQ2xhc3MoCi0gICAgU3RyaW5nIGNsYXNzTmFtZSkKLSAgewotICAgIHJldHVybiAiYm9vbGVhbiIuZXF1YWxzKGNsYXNzTmFtZSkgfHwKLSAgICAgICAgICAgImJ5dGUiLmVxdWFscyhjbGFzc05hbWUpIHx8Ci0gICAgICAgICAgICJjaGFyIi5lcXVhbHMoY2xhc3NOYW1lKSB8fAotICAgICAgICAgICAiZG91YmxlIi5lcXVhbHMoY2xhc3NOYW1lKSB8fAotICAgICAgICAgICAiZmxvYXQiLmVxdWFscyhjbGFzc05hbWUpIHx8Ci0gICAgICAgICAgICJpbnQiLmVxdWFscyhjbGFzc05hbWUpIHx8Ci0gICAgICAgICAgICJsb25nIi5lcXVhbHMoY2xhc3NOYW1lKSB8fAotICAgICAgICAgICAic2hvcnQiLmVxdWFscyhjbGFzc05hbWUpOwotICB9Ci0gIAotICBzdGF0aWMgcHVibGljIFN0cmluZyBnZXRBbHRlcm5hdGVQcm9wZXJ0eUNsYXNzKFByb3BlcnR5QmVhbiBwcm9wZXJ0eSkKLSAgewotICAgIFN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKDYwKTsKLSAgICBfYnVpbGRQcm9wZXJ0eUNsYXNzKGJ1ZmZlciwgcHJvcGVydHkuZ2V0QWx0ZXJuYXRlQ2xhc3MoKSk7Ci0gICAgCi0gICAgcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotICB9Ci0gIAotICBzdGF0aWMgcHVibGljIFN0cmluZyBnZXRQcmltaXRpdmVUeXBlKFN0cmluZyBjbGFzc05hbWUpeyAgICAgIAotICAgICAgaWYgKGNsYXNzTmFtZS5zdGFydHNXaXRoKCJqYXZhLmxhbmcuIikpCi0gICAgICB7Ci0gICAgICAgICAgY2xhc3NOYW1lID0gY2xhc3NOYW1lLnJlcGxhY2UoImphdmEubGFuZy4iLCAiIik7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIGlmIChjbGFzc05hbWUuZW5kc1dpdGgoImVnZXIiKSkKLSAgICAgIHsKLSAgICAgICAgICBjbGFzc05hbWUgPSBjbGFzc05hbWUucmVwbGFjZSgiZWdlciIsICIiKTsKLSAgICAgIH0KLSAgICAgIAotICAgICAgaWYgKFV0aWwuaXNQcmltaXRpdmVDbGFzcyhjbGFzc05hbWUudG9Mb3dlckNhc2UoKSkpCi0gICAgICB7Ci0gICAgICAgICAgcmV0dXJuIGNsYXNzTmFtZS50b0xvd2VyQ2FzZSgpOwotICAgICAgfWVsc2UKLSAgICAgIHsKLSAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgIH0KLSAgICAgIAotICB9Ci0KLSAgc3RhdGljIHB1YmxpYyBTdHJpbmcgZ2V0Qm94ZWRDbGFzcygKLSAgICBTdHJpbmcgY2xhc3NOYW1lKQotICB7Ci0gICAgaWYgKCJib29sZWFuIi5lcXVhbHMoY2xhc3NOYW1lKSkKLSAgICAgIHJldHVybiAiQm9vbGVhbiI7Ci0gICAgZWxzZSBpZiAoImJ5dGUiLmVxdWFscyhjbGFzc05hbWUpKQotICAgICAgcmV0dXJuICJCeXRlIjsKLSAgICBlbHNlIGlmICgiY2hhciIuZXF1YWxzKGNsYXNzTmFtZSkpCi0gICAgICByZXR1cm4gIkNoYXJhY3RlciI7Ci0gICAgZWxzZSBpZiAoImRvdWJsZSIuZXF1YWxzKGNsYXNzTmFtZSkpCi0gICAgICByZXR1cm4gIkRvdWJsZSI7Ci0gICAgZWxzZSBpZiAoImZsb2F0Ii5lcXVhbHMoY2xhc3NOYW1lKSkKLSAgICAgIHJldHVybiAiRmxvYXQiOwotICAgIGVsc2UgaWYgKCJpbnQiLmVxdWFscyhjbGFzc05hbWUpKQotICAgICAgcmV0dXJuICJJbnRlZ2VyIjsKLSAgICBlbHNlIGlmICgibG9uZyIuZXF1YWxzKGNsYXNzTmFtZSkpCi0gICAgICByZXR1cm4gIkxvbmciOwotICAgIGVsc2UgaWYgKCJzaG9ydCIuZXF1YWxzKGNsYXNzTmFtZSkpCi0gICAgICByZXR1cm4gIlNob3J0IjsKLSAgICBlbHNlCi0gICAgICByZXR1cm4gY2xhc3NOYW1lOwotICB9Ci0KLSAgc3RhdGljIHB1YmxpYyBTdHJpbmcgcHJpbWl0aXZlRGVmYXVsdFZhbHVlKFN0cmluZyBjbGFzc05hbWUpCi0gIHsKLSAgICAgaWYgKCJib29sZWFuIi5lcXVhbHMoY2xhc3NOYW1lKSkKLSAgICAgIHJldHVybiAiZmFsc2UiOwotICAgIGVsc2UgaWYgKCJieXRlIi5lcXVhbHMoY2xhc3NOYW1lKSkKLSAgICAgIHJldHVybiAiMCI7Ci0gICAgZWxzZSBpZiAoImNoYXIiLmVxdWFscyhjbGFzc05hbWUpKQotICAgICAgcmV0dXJuICInJyI7Ci0gICAgZWxzZSBpZiAoImRvdWJsZSIuZXF1YWxzKGNsYXNzTmFtZSkpCi0gICAgICByZXR1cm4gIjAuMGQiOwotICAgIGVsc2UgaWYgKCJmbG9hdCIuZXF1YWxzKGNsYXNzTmFtZSkpCi0gICAgICByZXR1cm4gIjAuMGYiOwotICAgIGVsc2UgaWYgKCJpbnQiLmVxdWFscyhjbGFzc05hbWUpKQotICAgICAgcmV0dXJuICIwIjsKLSAgICBlbHNlIGlmICgibG9uZyIuZXF1YWxzKGNsYXNzTmFtZSkpCi0gICAgICByZXR1cm4gIjBMIjsKLSAgICBlbHNlIGlmICgic2hvcnQiLmVxdWFscyhjbGFzc05hbWUpKQotICAgICAgcmV0dXJuICIwIjsKLSAgICBlbHNlCi0gICAgICByZXR1cm4gY2xhc3NOYW1lOwotICB9Ci0KLSAgc3RhdGljIHB1YmxpYyBTdHJpbmcgZmlsbCgKLSAgICBTdHJpbmcgYmFzZSwKLSAgICBpbnQgICAgbGVuZ3RoKQotICB7Ci0gICAgaWYgKGJhc2UgPT0gbnVsbCB8fCBiYXNlLmxlbmd0aCgpID4gbGVuZ3RoKQotICAgICAgcmV0dXJuIGJhc2U7Ci0KLSAgICBTdHJpbmdCdWZmZXIgZmlsbGVkID0gbmV3IFN0cmluZ0J1ZmZlcihiYXNlKTsKLSAgICBmb3IgKGludCBpPWJhc2UubGVuZ3RoKCk7IGkgPCBsZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBmaWxsZWQuYXBwZW5kKCcgJyk7Ci0gICAgfQotICAgIHJldHVybiBmaWxsZWQudG9TdHJpbmcoKTsKLSAgfQotCi0gIHN0YXRpYyBwdWJsaWMgU3RyaW5nIGdldFZhcmlhYmxlRnJvbUNsYXNzKAotICAgIFN0cmluZyBjbGFzc05hbWUpCi0gIHsKLSAgICBpZiAoY2xhc3NOYW1lID09IG51bGwpCi0gICAgICByZXR1cm4gbnVsbDsKLQotICAgIGZvciAoaW50IGk9MDsgaSA8IGNsYXNzTmFtZS5sZW5ndGgoKTsgaSsrKQotICAgIHsKLSAgICAgIGNoYXIgY2ggPSBjbGFzc05hbWUuY2hhckF0KGkpOwotICAgICAgaWYgKENoYXJhY3Rlci5pc0xvd2VyQ2FzZShjaCkpCi0gICAgICB7Ci0gICAgICAgIGlmIChpID4gMCkKLSAgICAgICAgewotICAgICAgICAgIHJldHVybiBDaGFyYWN0ZXIudG9Mb3dlckNhc2UoY2xhc3NOYW1lLmNoYXJBdChpIC0gMSkpICsKLSAgICAgICAgICAgICAgICAgY2xhc3NOYW1lLnN1YnN0cmluZyhpKTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJDbGFzcyBuYW1lIFwiIiArIGNsYXNzTmFtZSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXCIgZG9lcyBub3QgdXNlIGluaXRjYXBzIik7Ci0gIH0KLQotICBzdGF0aWMgcHVibGljIFN0cmluZyBnZXRWYXJpYWJsZUZyb21OYW1lKAotICAgIFN0cmluZyBuYW1lKQotICB7Ci0gICAgaWYgKG5hbWUgPT0gbnVsbCkKLSAgICAgIHJldHVybiBudWxsOwotCi0gICAgaWYgKFJFU0VSVkVEX1dPUkRTLmNvbnRhaW5zKG5hbWUpKQotICAgICAgbmFtZSA9IG5hbWUgKyAiUGFyYW0iOwotCi0gICAgcmV0dXJuIG5hbWU7Ci0gIH0KLQotICBzdGF0aWMgcHVibGljIFN0cmluZyBjb252ZXJ0U3RyaW5nVG9MaXRlcmFsKFN0cmluZyB2YWx1ZSkKLSAgewotICAgIHJldHVybiBjb252ZXJ0U3RyaW5nVG9MaXRlcmFsKCJTdHJpbmciLCB2YWx1ZSk7Ci0gIH0KLQotICBzdGF0aWMgcHVibGljIFN0cmluZyBjb252ZXJ0U3RyaW5nVG9MaXRlcmFsKFN0cmluZyBjbGFzc05hbWUsIFN0cmluZyB2YWx1ZSkKLSAgewotICAgIGlmICh2YWx1ZSA9PSBudWxsKQotICAgIHsKLSAgICAgIHJldHVybiBudWxsOwotICAgIH0KLSAgICBlbHNlIGlmICgiU3RyaW5nIi5lcXVhbHMoY2xhc3NOYW1lKSkKLSAgICB7Ci0gICAgICByZXR1cm4gIlwiIiArIHZhbHVlLnJlcGxhY2VBbGwoIlwnIiwgIlxcJyIpICsgIlwiIjsKLSAgICB9Ci0gICAgZWxzZSBpZiAoIk51bWJlciIuZXF1YWxzKGNsYXNzTmFtZSkpCi0gICAgewotICAgICAgLy8gRG91YmxlIHZzLiBJbnRlZ2VyLgotICAgICAgaWYodmFsdWUuaW5kZXhPZigiLiIpID09IC0xKQotICAgICAgewotICAgICAgICByZXR1cm4gIkludGVnZXIudmFsdWVPZigiICsgdmFsdWUgKyAiKSI7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHJldHVybiAiRG91YmxlLnZhbHVlT2YoIiArIHZhbHVlICsgIikiOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgcmV0dXJuIHZhbHVlOwotICAgIH0KLSAgfQotCi0gICAgc3RhdGljIHB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFZhbHVlKFByb3BlcnR5QmVhbiBwcm9wZXJ0eSl7Ci0gICAgICAgIFN0cmluZyBwcm9wZXJ0eUZ1bGxDbGFzcyA9IHByb3BlcnR5LmdldFByb3BlcnR5Q2xhc3MoKTsKLSAgICAgICAgU3RyaW5nIGRlZiA9IHByb3BlcnR5LmdldERlZmF1bHRWYWx1ZSgpOwotICAgICAgICBpZiAoZGVmID09IG51bGwgfHwgZGVmLmxlbmd0aCgpID09IDApewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGlzUHJpbWl0aXZlQ2xhc3MocHJvcGVydHlGdWxsQ2xhc3MpKXsKLSAgICAgICAgICAgIHJldHVybiBkZWY7Ci0gICAgICAgIH0gZWxzZSBpZiAoImphdmEubGFuZy5TdHJpbmciLmVxdWFscyhwcm9wZXJ0eUZ1bGxDbGFzcykpewotICAgICAgICAgICAgaWYgKGRlZi5zdGFydHNXaXRoKCJcIiIpICYmIGRlZi5lbmRzV2l0aCgiXCIiKSl7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGRlZjsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJcIiIrZGVmKyJcIiI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH1lbHNlewotICAgICAgICAgICAgLy9Bbnkgb3RoZXIgY2xhc3MsIHNvIHdlIHJldHVybiB0aGUgZGVmYXVsdCB2YWx1ZQotICAgICAgICAgICAgcmV0dXJuIGRlZjsgICAgICAgICAgICAKLSAgICAgICAgfQotICAgIH0KLQotICAgIHN0YXRpYyBwcml2YXRlIHZvaWQgX2J1aWxkUHJvcGVydHlDbGFzcyhTdHJpbmdCdWZmZXIgYnVmZmVyLCBTdHJpbmcgdHlwZSkKLSAgewotICAgIE1hdGNoZXIgbWF0Y2hlciA9IF9HRU5FUklDX1RZUEUubWF0Y2hlcih0eXBlKTsKLSAgICBpZihtYXRjaGVyLm1hdGNoZXMoKSkKLSAgICB7Ci0gICAgICAvLyBHZW5lcmljIHR5cGUKLSAgICAgIGJ1ZmZlci5hcHBlbmQoVXRpbC5nZXRDbGFzc0Zyb21GdWxsQ2xhc3MobWF0Y2hlci5ncm91cCgxKSkpOwotICAgICAgYnVmZmVyLmFwcGVuZCgnPCcpOwotICAgICAgU3RyaW5nW10gdHlwZXMgPSBtYXRjaGVyLmdyb3VwKDIpLnNwbGl0KCIsIik7Ci0gICAgICBpbnQgbWF4ID0gdHlwZXMubGVuZ3RoIC0gMTsKLSAgICAgIGZvcihpbnQgaSA9IDA7IGkgPD0gbWF4OyBpKyspCi0gICAgICB7Ci0gICAgICAgIF9idWlsZFByb3BlcnR5Q2xhc3MoYnVmZmVyLCB0eXBlc1tpXSk7Ci0gICAgICAgIGlmKGkgPCBtYXgpCi0gICAgICAgIHsKLSAgICAgICAgICBidWZmZXIuYXBwZW5kKCIsICIpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBidWZmZXIuYXBwZW5kKCc+Jyk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAvLyBOb24tZ2VuZXJpYyB0eXBlCi0gICAgICBidWZmZXIuYXBwZW5kKFV0aWwuZ2V0Q2xhc3NGcm9tRnVsbENsYXNzKHR5cGUpKTsKLSAgICB9Ci0gIH0KLQotICBzdGF0aWMgcHJpdmF0ZSBTZXQgX2NyZWF0ZVByaW1pdGl2ZVR5cGVzU2V0KCkKLSAgewotICAgIFNldCBwcmltaXRpdmVzID0gbmV3IFRyZWVTZXQoKTsKLSAgICBmb3IgKGludCBpPTA7IGkgPCBfUFJJTUlUSVZFX1RZUEVTLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIFN0cmluZyB0eXBlID0gX1BSSU1JVElWRV9UWVBFU1tpXTsKLSAgICAgIHByaW1pdGl2ZXMuYWRkKHR5cGUpOwotICAgICAgcHJpbWl0aXZlcy5hZGQodHlwZSArICJbXSIpOwotICAgIH0KLSAgICByZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlU2V0KHByaW1pdGl2ZXMpOwotICB9Ci0KLSAgc3RhdGljIHByaXZhdGUgU2V0IF9jcmVhdGVSZXNlcnZlZFdvcmRzU2V0KCkKLSAgewotICAgIFNldCByZXNlcnZlZCA9IG5ldyBUcmVlU2V0KCk7Ci0gICAgZm9yIChpbnQgaT0wOyBpIDwgX1JFU0VSVkVEX1dPUkRTLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIFN0cmluZyBrZXl3b3JkID0gX1JFU0VSVkVEX1dPUkRTW2ldOwotICAgICAgcmVzZXJ2ZWQuYWRkKGtleXdvcmQpOwotICAgIH0KLSAgICByZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlU2V0KHJlc2VydmVkKTsKLSAgfQotCi0gIHN0YXRpYyBwcml2YXRlIGZpbmFsIFN0cmluZ1tdIF9QUklNSVRJVkVfVFlQRVMgPSBuZXcgU3RyaW5nW10KLSAgey8vIFRPRE86IFNob3VsZG4ndCBqYXZhLmxhbmcuKiBiZSBzcGVjaWZpZWQgaW4gdGhhdCBsaXN0IGFzIHdlbGw/Ci0gICAgImJvb2xlYW4iLAotICAgICJieXRlIiwKLSAgICAiY2hhciIsCi0gICAgImZsb2F0IiwKLSAgICAiZG91YmxlIiwKLSAgICAiaW50IiwKLSAgICAic2hvcnQiLAotICAgICJsb25nIiwKLSAgfTsKLQotICBzdGF0aWMgcHJpdmF0ZSBmaW5hbCBTdHJpbmdbXSBfUkVTRVJWRURfV09SRFMgPSBuZXcgU3RyaW5nW10KLSAgewotICAgICJhYnN0cmFjdCIsCi0gICAgImFzc2VydCIsCi0gICAgImJvb2xlYW4iLAotICAgICJicmVhayIsCi0gICAgImJ5dGUiLAotICAgICJjYXNlIiwKLSAgICAiY2F0Y2giLAotICAgICJjaGFyIiwKLSAgICAiY2xhc3MiLAotICAgICJjb25zdCIsCi0gICAgImNvbnRpbnVlIiwKLSAgICAiZGVmYXVsdCIsCi0gICAgImRvIiwKLSAgICAiZG91YmxlIiwKLSAgICAiZWxzZSIsCi0gICAgImV4dGVuZHMiLAotICAgICJmaW5hbCIsCi0gICAgImZpbmFsbHkiLAotICAgICJmbG9hdCIsCi0gICAgImZvciIsCi0gICAgImdvdG8iLAotICAgICJpZiIsCi0gICAgImltcGxlbWVudHMiLAotICAgICJpbXBvcnQiLAotICAgICJpbnN0YW5jZW9mIiwKLSAgICAiaW50IiwKLSAgICAiaW50ZXJmYWNlIiwKLSAgICAibG9uZyIsCi0gICAgIm5hdGl2ZSIsCi0gICAgIm5ldyIsCi0gICAgInBhY2thZ2UiLAotICAgICJwcml2YXRlIiwKLSAgICAicHJvdGVjdGVkIiwKLSAgICAicHVibGljIiwKLSAgICAicmV0dXJuIiwKLSAgICAic2hvcnQiLAotICAgICJzdGF0aWMiLAotICAgICJzdXBlciIsCi0gICAgInN3aXRjaCIsCi0gICAgInN5bmNocm9uaXplZCIsCi0gICAgInRoaXMiLAotICAgICJ0aHJvdyIsCi0gICAgInRocm93cyIsCi0gICAgInRyYW5zaWVudCIsCi0gICAgInRyeSIsCi0gICAgInZvaWQiLAotICAgICJ2b2xhdGlsZSIsCi0gICAgIndoaWxlIiwKLSAgfTsKLQotICBzdGF0aWMgcHVibGljIGZpbmFsIFNldCBSRVNFUlZFRF9XT1JEUyA9IF9jcmVhdGVSZXNlcnZlZFdvcmRzU2V0KCk7Ci0gIHN0YXRpYyBwdWJsaWMgZmluYWwgU2V0IFBSSU1JVElWRV9UWVBFUyA9IF9jcmVhdGVQcmltaXRpdmVUeXBlc1NldCgpOwotCi0gIHN0YXRpYyBwcml2YXRlIGZpbmFsIFBhdHRlcm4gX0dFTkVSSUNfVFlQRSA9IFBhdHRlcm4uY29tcGlsZSgiKFtePF0rKTwoLispPiIpOwotCi0gIC8vIG5vIGluc3RhbmNlcwotICBwcml2YXRlIFV0aWwoKQotICB7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy91dGlsL1ZhbGlkYXRvckZpbHRlci5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL3V0aWwvVmFsaWRhdG9yRmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwMzE0Y2MuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL3V0aWwvVmFsaWRhdG9yRmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMudXRpbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMucGFyc2UuVmFsaWRhdG9yQmVhbjsKLQotYWJzdHJhY3QgcHVibGljIGNsYXNzIFZhbGlkYXRvckZpbHRlciBpbXBsZW1lbnRzIEZpbHRlcgotewotICBmaW5hbCBwdWJsaWMgYm9vbGVhbiBhY2NlcHQoCi0gICAgT2JqZWN0IG9iaikKLSAgewotICAgIHJldHVybiBhY2NlcHQoKFZhbGlkYXRvckJlYW4pb2JqKTsKLSAgfQotCi0gIGFic3RyYWN0IHByb3RlY3RlZCBib29sZWFuIGFjY2VwdCgKLSAgICBWYWxpZGF0b3JCZWFuIHZhbGlkYXRvcik7Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvdXRpbC9YSW5jbHVkZUZpbHRlci5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL3V0aWwvWEluY2x1ZGVGaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDUwMTQ3ZC4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvdXRpbC9YSW5jbHVkZUZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg2ICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy51dGlsOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuU3RhY2s7Ci0KLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5QYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlNBWFBhcnNlcjsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXJGYWN0b3J5OwotCi1pbXBvcnQgb3JnLnhtbC5zYXguQXR0cmlidXRlczsKLWltcG9ydCBvcmcueG1sLnNheC5JbnB1dFNvdXJjZTsKLWltcG9ydCBvcmcueG1sLnNheC5Mb2NhdG9yOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcueG1sLnNheC5YTUxSZWFkZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguaGVscGVycy5OYW1lc3BhY2VTdXBwb3J0OwotaW1wb3J0IG9yZy54bWwuc2F4LmhlbHBlcnMuWE1MRmlsdGVySW1wbDsKLQotcHVibGljIGZpbmFsIGNsYXNzIFhJbmNsdWRlRmlsdGVyIGV4dGVuZHMgWE1MRmlsdGVySW1wbAotewotICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBYSU5DTFVERV9OQU1FU1BBQ0UgPSAiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YSW5jbHVkZSI7Ci0KLSAgcHVibGljIFhJbmNsdWRlRmlsdGVyKAotICAgIFhNTFJlYWRlciBwYXJlbnQsCi0gICAgVVJMICAgICAgIGJhc2UpCi0gIHsKLSAgICBzdXBlcihwYXJlbnQpOwotICAgIGJhc2VzLnB1c2goYmFzZSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXREb2N1bWVudExvY2F0b3IoCi0gICAgTG9jYXRvciBsb2NhdG9yKQotICB7Ci0gICAgbG9jYXRvcnMucHVzaChsb2NhdG9yKTsKLSAgICBzdXBlci5zZXREb2N1bWVudExvY2F0b3IobG9jYXRvcik7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzdGFydFByZWZpeE1hcHBpbmcoCi0gICAgU3RyaW5nIHByZWZpeCwKLSAgICBTdHJpbmcgbmFtZXNwYWNlVVJJKSB0aHJvd3MgU0FYRXhjZXB0aW9uCi0gIHsKLSAgICBpZiAoIW5hbWVzcGFjZVVSSS5lcXVhbHMoWElOQ0xVREVfTkFNRVNQQUNFKSkKLSAgICB7Ci0gICAgICBuYW1lc3BhY2VzLmRlY2xhcmVQcmVmaXgocHJlZml4LCBuYW1lc3BhY2VVUkkpOwotICAgICAgc3VwZXIuc3RhcnRQcmVmaXhNYXBwaW5nKHByZWZpeCwgbmFtZXNwYWNlVVJJKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzdGFydEVsZW1lbnQoCi0gICAgU3RyaW5nICAgICBuYW1lc3BhY2VVUkksCi0gICAgU3RyaW5nICAgICBsb2NhbE5hbWUsCi0gICAgU3RyaW5nICAgICBxdWFsaWZpZWROYW1lLAotICAgIEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgdGhyb3dzIFNBWEV4Y2VwdGlvbgotICB7Ci0gICAgbmFtZXNwYWNlcy5wdXNoQ29udGV4dCgpOwotICAgIC8vIHN1cHBvcnQgYm90aCBEVEQgYW5kIFNjaGVtYQotICAgIGlmIChuYW1lc3BhY2VVUkkuZXF1YWxzKFhJTkNMVURFX05BTUVTUEFDRSkgJiYKLSAgICAgICAgbG9jYWxOYW1lLmVxdWFscygiaW5jbHVkZSIpKQotICAgIHsKLSAgICAgIC8vIGhyZWYgYXR0cmlidXRlIGlzIHJlcXVpcmVkCi0gICAgICBTdHJpbmcgaHJlZiA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoImhyZWYiKTsKLSAgICAgIGlmIChocmVmID09IG51bGwpCi0gICAgICAgIHRocm93IG5ldyBTQVhFeGNlcHRpb24oIk1pc3NpbmcgaHJlZiBhdHRyaWJ1dGUiKTsKLQotICAgICAgLy8geHBvaW50ZXIgYXR0cmlidXRlIGlzIG9wdGlvbmFsCi0gICAgICBTdHJpbmcgeHBvaW50ZXIgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCJ4cG9pbnRlciIpOwotCi0gICAgICBkb1hJbmNsdWRlKGhyZWYsIHhwb2ludGVyKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHN1cGVyLnN0YXJ0RWxlbWVudChuYW1lc3BhY2VVUkksIGxvY2FsTmFtZSwgcXVhbGlmaWVkTmFtZSwgYXR0cmlidXRlcyk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgZW5kRWxlbWVudCgKLSAgICBTdHJpbmcgICAgIG5hbWVzcGFjZVVSSSwKLSAgICBTdHJpbmcgICAgIGxvY2FsTmFtZSwKLSAgICBTdHJpbmcgICAgIHF1YWxpZmllZE5hbWUpIHRocm93cyBTQVhFeGNlcHRpb24KLSAgewotICAgIGlmICghbmFtZXNwYWNlVVJJLmVxdWFscyhYSU5DTFVERV9OQU1FU1BBQ0UpKQotICAgICAgc3VwZXIuZW5kRWxlbWVudChuYW1lc3BhY2VVUkksIGxvY2FsTmFtZSwgcXVhbGlmaWVkTmFtZSk7Ci0KLSAgICBuYW1lc3BhY2VzLnBvcENvbnRleHQoKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHN0YXJ0RG9jdW1lbnQoKSB0aHJvd3MgU0FYRXhjZXB0aW9uCi0gIHsKLSAgICBpZiAoZGVwdGggPT0gMCkKLSAgICAgIHN1cGVyLnN0YXJ0RG9jdW1lbnQoKTsKLQotICAgIGRlcHRoKys7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBlbmREb2N1bWVudCgpIHRocm93cyBTQVhFeGNlcHRpb24KLSAgewotICAgIGxvY2F0b3JzLnBvcCgpOwotICAgIGRlcHRoLS07Ci0KLSAgICBpZiAoZGVwdGggPT0gMCkKLSAgICAgIHN1cGVyLmVuZERvY3VtZW50KCk7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgZG9YSW5jbHVkZSgKLSAgICBTdHJpbmcgaHJlZiwKLSAgICBTdHJpbmcgeHBvaW50ZXIpIHRocm93cyBTQVhFeGNlcHRpb24KLSAgewotICAgIFVSTCB0YXJnZXQgPSByZXNvbHZlVVJMKGhyZWYpOwotCi0gICAgdHJ5Ci0gICAgewotICAgICAgU0FYUGFyc2VyRmFjdG9yeSBzYXhGYWN0b3J5ID0gU0FYUGFyc2VyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgU0FYUGFyc2VyIHNheFBhcnNlciA9IHNheEZhY3RvcnkubmV3U0FYUGFyc2VyKCk7Ci0gICAgICBYTUxSZWFkZXIgcmVhZGVyID0gc2F4UGFyc2VyLmdldFhNTFJlYWRlcigpOwotICAgICAgaWYgKHhwb2ludGVyICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIC8vIHBhc3MgYWxsIHBhcnNlZCBTQVggZXZlbnRzIHRocm91Z2ggWFBvaW50ZXJGaWx0ZXIKLSAgICAgICAgcmVhZGVyID0gbmV3IFhQb2ludGVyRmlsdGVyKHJlYWRlciwgbmFtZXNwYWNlcywgeHBvaW50ZXIpOwotICAgICAgfQotICAgICAgLy8gcGFzcyBhbGwgc2VsZWN0ZWQgWFBvaW50ZXIgU0FYIGV2ZW50cyB0byBYSW5jbHVkZUZpbHRlcgotICAgICAgcmVhZGVyLnNldENvbnRlbnRIYW5kbGVyKHRoaXMpOwotICAgICAgcmVhZGVyLnNldEVudGl0eVJlc29sdmVyKHRoaXMpOwotICAgICAgcmVhZGVyLnNldEVycm9ySGFuZGxlcih0aGlzKTsKLSAgICAgIHJlYWRlci5zZXREVERIYW5kbGVyKHRoaXMpOwotCi0gICAgICAvLyBwdXNoIG9uIG5ldyBiYXNlIFVSTCBpbiBjYXNlIG9mIG5lc3RlZCB4aTppbmNsdWRlCi0gICAgICBiYXNlcy5wdXNoKHRhcmdldCk7Ci0gICAgICByZWFkZXIucGFyc2UobmV3IElucHV0U291cmNlKHRhcmdldC5vcGVuU3RyZWFtKCkpKTsKLSAgICAgIGJhc2VzLnBvcCgpOwotICAgIH0KLSAgICBjYXRjaCAoUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBTQVhFeGNlcHRpb24oIkVycm9yIGR1cmluZyB4aW5jbHVkZSBvZiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LnRvRXh0ZXJuYWxGb3JtKCksIGUpOwotICAgIH0KLSAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgU0FYRXhjZXB0aW9uKCJFcnJvciBkdXJpbmcgeGluY2x1ZGUgb2YgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldC50b0V4dGVybmFsRm9ybSgpLCBlKTsKLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIFVSTCByZXNvbHZlVVJMKAotICAgIFN0cmluZyBocmVmKSB0aHJvd3MgU0FYRXhjZXB0aW9uCi0gIHsKLSAgICBVUkwgYmFzZSA9IChVUkwpIGJhc2VzLnBlZWsoKTsKLQotICAgIHRyeQotICAgIHsKLSAgICAgIHJldHVybiBuZXcgVVJMKGJhc2UsIGhyZWYpOwotICAgIH0KLSAgICBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgdGhyb3cgbmV3IFNBWEV4Y2VwdGlvbigiRXJyb3IgcmVzb2x2aW5nIGhyZWYgXCIiICsgaHJlZiArICJcIiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImF0IGJhc2UgXCIiICsgYmFzZSArICJcIiIsIGUpOwotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgaW50IGRlcHRoID0gMDsKLQotICBwcml2YXRlIFN0YWNrIGJhc2VzID0gbmV3IFN0YWNrKCk7Ci0gIHByaXZhdGUgU3RhY2sgbG9jYXRvcnMgPSBuZXcgU3RhY2soKTsKLSAgcHJpdmF0ZSBOYW1lc3BhY2VTdXBwb3J0IG5hbWVzcGFjZXMgPSBuZXcgTmFtZXNwYWNlU3VwcG9ydCgpOwotfQotCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvdXRpbC9YUG9pbnRlckZpbHRlci5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL3V0aWwvWFBvaW50ZXJGaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDllN2FiNC4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvdXRpbC9YUG9pbnRlckZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy51dGlsOwotCi1pbXBvcnQgb3JnLnhtbC5zYXguQXR0cmlidXRlczsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247Ci1pbXBvcnQgb3JnLnhtbC5zYXguWE1MUmVhZGVyOwotaW1wb3J0IG9yZy54bWwuc2F4LmhlbHBlcnMuTmFtZXNwYWNlU3VwcG9ydDsKLWltcG9ydCBvcmcueG1sLnNheC5oZWxwZXJzLlhNTEZpbHRlckltcGw7Ci0KLS8qKgotICogRm9yIG5vdywganVzdCBza2lwIHRoZSByb290IGVsZW1lbnQgc2luY2UgdGhhdCdzIG91ciB1c2VjYXNlLgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgWFBvaW50ZXJGaWx0ZXIgZXh0ZW5kcyBYTUxGaWx0ZXJJbXBsCi17Ci0gIHB1YmxpYyBYUG9pbnRlckZpbHRlcigKLSAgICBYTUxSZWFkZXIgICAgICAgIHBhcmVudCwKLSAgICBOYW1lc3BhY2VTdXBwb3J0IG5hbWVzcGFjZXMsCi0gICAgU3RyaW5nICAgICAgICAgICB4cG9pbnRlcikKLSAgewotICAgIHN1cGVyKHBhcmVudCk7Ci0KLSAgICAvLyBXZSBzdXBwb3J0IGEgdmVyeSBydWRpbWVudGFyeSAtIGJ1dCB0b3RhbGx5IHN1ZmZpY2llbnQgLSBYUG9pbnRlciBzeW50YXgsCi0gICAgLy8gd2hpY2ggaXMganVzdCAvZWxlbWVudC9vdGhlcmVsZW1lbnQvb3RoZXJvdGhlcmVsZW1lbnQvKgotICAgIGlmICgheHBvaW50ZXIuc3RhcnRzV2l0aCgiLyIpIHx8ICF4cG9pbnRlci5lbmRzV2l0aCgiLyoiKSkKLSAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlVuc3VwcG9ydGVkIHhwb2ludGVyIHN5bnRheDogIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhwb2ludGVyKTsKLQotICAgIHhwb2ludGVyID0geHBvaW50ZXIuc3Vic3RyaW5nKDAsIHhwb2ludGVyLmxlbmd0aCgpIC0gMikuc3Vic3RyaW5nKDEpOwotICAgIFN0cmluZ1tdIGVsZW1lbnRzID0geHBvaW50ZXIuc3BsaXQoIi8iKTsKLSAgICBpbnQgY291bnQgPSBlbGVtZW50cy5sZW5ndGg7Ci0KLSAgICBfcm9vdE5hbWVzcGFjZVVSSSA9IG5ldyBTdHJpbmdbY291bnRdOwotICAgIF9yb290TG9jYWxOYW1lID0gbmV3IFN0cmluZ1tjb3VudF07Ci0gICAgX2FjY2VwdENoaWxkTm9kZXMgPSBuZXcgYm9vbGVhbltjb3VudF07Ci0KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspCi0gICAgewotICAgICAgU3RyaW5nW10gcGFydHMgPSBlbGVtZW50c1tpXS5zcGxpdCgiOiIpOwotICAgICAgU3RyaW5nIHByZWZpeCA9IChwYXJ0cy5sZW5ndGggPT0gMSkgPyAiIiA6IHBhcnRzWzBdOwotICAgICAgU3RyaW5nIG5hbWVzcGFjZVVSSSA9IG5hbWVzcGFjZXMuZ2V0VVJJKHByZWZpeCk7Ci0gICAgICBfcm9vdE5hbWVzcGFjZVVSSVtpXSA9IChuYW1lc3BhY2VVUkkgIT0gbnVsbCkgPyBuYW1lc3BhY2VVUkkgOiAiIjsKLSAgICAgIF9yb290TG9jYWxOYW1lW2ldID0gKHBhcnRzLmxlbmd0aCA9PSAxKSA/IHBhcnRzWzBdIDogcGFydHNbMV07Ci0gICAgICBfYWNjZXB0Q2hpbGROb2Rlc1tpXSA9IGZhbHNlOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHN0YXJ0RWxlbWVudCgKLSAgICBTdHJpbmcgICAgIG5hbWVzcGFjZVVSSSwKLSAgICBTdHJpbmcgICAgIGxvY2FsTmFtZSwKLSAgICBTdHJpbmcgICAgIHF1YWxpZmllZE5hbWUsCi0gICAgQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB0aHJvd3MgU0FYRXhjZXB0aW9uCi0gIHsKLSAgICBpZiAoX2RlcHRoIDwgX2FjY2VwdENoaWxkTm9kZXMubGVuZ3RoKQotICAgIHsKLSAgICAgIF9hY2NlcHRDaGlsZE5vZGVzW19kZXB0aF0gPQotICAgICAgICAgICAoX3Jvb3ROYW1lc3BhY2VVUklbX2RlcHRoXS5lcXVhbHMobmFtZXNwYWNlVVJJKSAmJgotICAgICAgICAgICAgX3Jvb3RMb2NhbE5hbWVbX2RlcHRoXS5lcXVhbHMobG9jYWxOYW1lKSk7Ci0gICAgfQotICAgIGVsc2UgaWYgKF9hY2NlcHRpbmdDaGlsZE5vZGVzKCkpCi0gICAgewotICAgICAgc3VwZXIuc3RhcnRFbGVtZW50KG5hbWVzcGFjZVVSSSwgbG9jYWxOYW1lLCBxdWFsaWZpZWROYW1lLCBhdHRyaWJ1dGVzKTsKLSAgICB9Ci0KLSAgICBfZGVwdGgrKzsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGVuZEVsZW1lbnQoCi0gICAgU3RyaW5nIG5hbWVzcGFjZVVSSSwKLSAgICBTdHJpbmcgbG9jYWxOYW1lLAotICAgIFN0cmluZyBxdWFsaWZpZWROYW1lKSB0aHJvd3MgU0FYRXhjZXB0aW9uCi0gIHsKLSAgICBfZGVwdGgtLTsKLQotICAgIGlmIChfZGVwdGggPj0gX2FjY2VwdENoaWxkTm9kZXMubGVuZ3RoICYmIF9hY2NlcHRpbmdDaGlsZE5vZGVzKCkpCi0gICAgICBzdXBlci5lbmRFbGVtZW50KG5hbWVzcGFjZVVSSSwgbG9jYWxOYW1lLCBxdWFsaWZpZWROYW1lKTsKLSAgfQotCi0gIAotICBwcml2YXRlIGJvb2xlYW4gX2FjY2VwdGluZ0NoaWxkTm9kZXMoKQotICB7Ci0gICAgZm9yIChpbnQgaSA9IF9hY2NlcHRDaGlsZE5vZGVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKQotICAgIHsKLSAgICAgIGlmICghX2FjY2VwdENoaWxkTm9kZXNbaV0pCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIHByaXZhdGUgaW50ICAgICBfZGVwdGg7Ci0gIHByaXZhdGUgYm9vbGVhbltdIF9hY2NlcHRDaGlsZE5vZGVzOwotICBwcml2YXRlIFN0cmluZ1tdICBfcm9vdE5hbWVzcGFjZVVSSTsKLSAgcHJpdmF0ZSBTdHJpbmdbXSAgX3Jvb3RMb2NhbE5hbWU7Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvTk9USUNFIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL05PVElDRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmEzZGJkNi4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvTk9USUNFCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotPT0gIE5PVElDRSBmaWxlIGNvcnJlc3BvbmRpbmcgdG8gc2VjdGlvbiA0KGQpIG9mIHRoZSBBcGFjaGUgTGljZW5zZSwgICA9PQotPT0gIFZlcnNpb24gMi4wLCBpbiB0aGlzIGNhc2UgZm9yIHRoZSBBcGFjaGUgTXlGYWNlcyBNYXZlbiBQbHVnaW5zICAgICA9PQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1UaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IAotVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4KLQotUG9ydGlvbnMgb2YgdGhpcyBzb2Z0d2FyZSB3ZXJlIG9yaWdpbmFsbHkgYmFzZWQgb24gdGhlIGZvbGxvd2luZzoKLQotIC0gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDYsIE9yYWNsZSBDb3JwLCA8aHR0cDovL3d3dy5vcmFjbGUuY29tLz4uCi1hbmQgYXJlIGxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiB1bmRlciB0aGUgCi0iU29mdHdhcmUgR3JhbnQgYW5kIENvcnBvcmF0ZSBDb250cmlidXRpb24gTGljZW5zZSBBZ3JlZW1lbnQiCi0KLVNlZSB0aGUgTElDRU5TRS50eHQgZmlsZSBmb3IgaW5mb3JtYXRpb24gb24gYWxsIGxpY2Vuc2VzIAotYXNzb2NpYXRlZCB3aXRoIHRoaXMgc29mdHdhcmUuCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvc2NoZW1hcy9tYXZlbi1mYWNlcy1wbHVnaW4ueHNkIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL3NjaGVtYXMvbWF2ZW4tZmFjZXMtcGx1Z2luLnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjBjZWJmNC4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvc2NoZW1hcy9tYXZlbi1mYWNlcy1wbHVnaW4ueHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTMyICswLDAgQEAKLTw/eG1sIHZlcnNpb24gPSAiMS4wIiBlbmNvZGluZyA9ICJVVEYtOCI/PgotPCEtLQotICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICAgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gICAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICAgIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICAgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gICAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gICAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gICAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICAgIHVuZGVyIHRoZSBMaWNlbnNlLgotCSAgIAotLS0+Ci08eHNkOnNjaGVtYSB4bWxuczptZnA9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvbWF2ZW4tZmFjZXMtcGx1Z2luIgotICAgICAgICAgICAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICAgICAgICAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9tYXZlbi1mYWNlcy1wbHVnaW4iCi0gICAgICAgICAgICBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIKLSAgICAgICAgICAgIGF0dHJpYnV0ZUZvcm1EZWZhdWx0PSJ1bnF1YWxpZmllZCIKLSAgICAgICAgICAgIHZlcnNpb249IjEuMiI+Ci0KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICRJZDogJAotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29tcG9uZW50IiB0eXBlPSJtZnA6Y29tcG9uZW50VHlwZSIgLz4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiIHR5cGU9Im1mcDpwcm9wZXJ0eVR5cGUiIC8+Ci0KLSAgICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InByb3BlcnR5VHlwZSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVxdWlyZWQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOmJvb2xlYW4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0iMSIgLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhbGlhcy1vZiIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9IjEiIC8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHJhbnNpZW50IgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpib29sZWFuIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9IjEiIC8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic3RhdGUtaG9sZGVyIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpib29sZWFuIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9IjEiIC8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVxdWlyZXMtbGl0ZXJhbCIgdHlwZT0ieHNkOmJvb2xlYW4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idmlydHVhbCIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtZXRob2QtYmluZGluZy1zaWduYXR1cmUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ibWZwOm1ldGhvZC1iaW5kaW5nLXNpZ25hdHVyZVR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY29tcG9uZW50VHlwZSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29tcG9uZW50LWZhbWlseSIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9IjEiIC8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVuZGVyZXItdHlwZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9IjEiIC8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29tcG9uZW50LXN1cGVydHlwZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9IjEiIC8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29tcG9uZW50LXN1cGVyY2xhc3MiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSIxIiAvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlZmF1bHQtcmVuZGVyZXItdHlwZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9IjEiIC8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtaW5nLWNvbnRhaW5lciIgdHlwZT0ieHNkOmJvb2xlYW4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ianNwLXRhZy1jbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImV2ZW50IgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9Im1mcDpjb21wb25lbnQtZXZlbnRUeXBlIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNvbXBvbmVudC1ldmVudFR5cGUiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImV2ZW50LW5hbWUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjEiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSIxIiAvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImV2ZW50LWxpc3RlbmVyLWNsYXNzIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0iMSIgLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJldmVudC1jbGFzcyIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9IjEiIC8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXZlbnQtc291cmNlLWludGVyZmFjZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9IjEiIC8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXZlbnQtZGVsaXZlcnktcGhhc2VzIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im1ldGhvZC1iaW5kaW5nLXNpZ25hdHVyZVR5cGUiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBhcmFtZXRlci10eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZXR1cm4tdHlwZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTwveHNkOnNjaGVtYT4KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL3Jlc291cmNlcy9mYWNlcy1jb25maWcueG1sIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvcmVzb3VyY2VzL2ZhY2VzLWNvbmZpZy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1YmE3NmQuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvcmVzb3VyY2VzL2ZhY2VzLWNvbmZpZy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLQotICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICAgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gICAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICAgIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICAgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gICAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gICAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gICAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICAgIHVuZGVyIHRoZSBMaWNlbnNlLgotCSAgIAotLS0+Ci08ZmFjZXMtY29uZmlnIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiCi0gICAgICAgICAgICAgIHhtbG5zOnhpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hJbmNsdWRlIgotICAgICAgICAgICAgICB4bWxuczptZnA9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvbWF2ZW4tZmFjZXMtcGx1Z2luIiAvPgpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvcmVzb3VyY2VzL3RyYW5zZm9ybS54c2wgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy9yZXNvdXJjZXMvdHJhbnNmb3JtLnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTMzNzBhYy4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy9yZXNvdXJjZXMvdHJhbnNmb3JtLnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDk0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiID8+DQotPCEtLQ0KLSAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICAgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICAgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gICAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICAgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICAgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gICAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgICB1bmRlciB0aGUgTGljZW5zZS4NCi0JICAgDQotLS0+DQotPHhzbDpzdHlsZXNoZWV0IHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL0pTRi9Db25maWd1cmF0aW9uIg0KLSAgICAgICAgICAgICAgICB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIgDQotICAgICAgICAgICAgICAgIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSINCi0gICAgICAgICAgICAgICAgeG1sbnM6amF2YWVlPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiDQotICAgICAgICAgICAgICAgIHhtbG5zOm1mcD0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9tYXZlbi1mYWNlcy1wbHVnaW4iIA0KLSAgICAgICAgICAgICAgICBleGNsdWRlLXJlc3VsdC1wcmVmaXhlcz0ieHNsIHhzIGphdmFlZSBtZnAiDQotICAgICAgICAgICAgICAgIHZlcnNpb249IjEuMCIgPg0KLQ0KLSAgPHhzbDpvdXRwdXQgbWV0aG9kPSJ4bWwiIGluZGVudD0ieWVzIi8+DQotICA8eHNsOnBhcmFtIG5hbWU9InBhY2thZ2VDb250YWlucyIgLz4NCi0gIDx4c2w6cGFyYW0gbmFtZT0idHlwZVByZWZpeCIgLz4NCi0gIDx4c2w6cGFyYW0gbmFtZT0icmVtb3ZlUmVuZGVyZXJzIiAvPg0KLQ0KLSAgPHhzbDp2YXJpYWJsZSBuYW1lPSJkb2N0eXBlIiA+PCFbQ0RBVEFbDQotICA8IURPQ1RZUEUgZmFjZXMtY29uZmlnIFBVQkxJQw0KLSAgIi0vL1N1biBNaWNyb3N5c3RlbXMsIEluYy4vL0RURCBKYXZhU2VydmVyIEZhY2VzIENvbmZpZyAxLjEvL0VOIg0KLSAgImh0dHA6Ly9qYXZhLnN1bi5jb20vZHRkL3dlYi1mYWNlc2NvbmZpZ18xXzEuZHRkIlsNCi0gIDwhRUxFTUVOVCBjb21wb25lbnQtbWV0YWRhdGEgQU5ZPg0KLSAgPCFFTEVNRU5UIGF0dHJpYnV0ZS1tZXRhZGF0YSBBTlk+DQotICA8IUVMRU1FTlQgcHJvcGVydHktbWV0YWRhdGEgQU5ZPg0KLSAgPCFFTEVNRU5UIGZhY2V0LW1ldGFkYXRhIEFOWT4NCi0gIDwhRUxFTUVOVCByZW5kZXJlci1tZXRhZGF0YSBBTlk+DQotICA8IUVMRU1FTlQgYWNjZXB0cy1jaGlsZC1jb21wb25lbnRzICgjUENEQVRBKT4NCi0gIDwhRUxFTUVOVCBhdHRyaWJ1dGUtdmFsdWVzICgjUENEQVRBKT4NCi0gIDwhRUxFTUVOVCBiYXNlLWNvbXBvbmVudC10eXBlICgjUENEQVRBKT4NCi0gIDwhRUxFTUVOVCBkZXByZWNhdGVkICgjUENEQVRBKT4NCi0gIDwhRUxFTUVOVCBkaXNwbGF5LW9yZGVyICgjUENEQVRBKT4NCi0gIDwhRUxFTUVOVCBleHBlcnQgKCNQQ0RBVEEpPg0KLSAgPCFFTEVNRU5UIGZhdm9yaXRlLXByb3BlcnR5ICgjUENEQVRBKT4NCi0gIDwhRUxFTUVOVCBncm91cCAoI1BDREFUQSk+DQotICA8IUVMRU1FTlQgaGVscC10b3BpYyAoI1BDREFUQSk+DQotICA8IUVMRU1FTlQgaGlkZGVuICgjUENEQVRBKT4NCi0gIDwhRUxFTUVOVCBpbml0aWFsLXZhbHVlICgjUENEQVRBKT4NCi0gIDwhRUxFTUVOVCBwcmVmZXJyZWQgKCNQQ0RBVEEpPg0KLSAgPCFFTEVNRU5UIHByZWZlcnJlZC1jaGlsZHJlbiAoI1BDREFUQSk+DQotICA8IUVMRU1FTlQgYWxsb3dhYmxlLWNoaWxkcmVuICgjUENEQVRBKT4NCi0gIDwhRUxFTUVOVCBwcmVmZXJyZWQtY29tcG9uZW50LXR5cGVzICgjUENEQVRBKT4NCi0gIDwhRUxFTUVOVCBwcm9wZXJ0eS1lZGl0b3IgKCNQQ0RBVEEpPg0KLSAgPCFFTEVNRU5UIHNob3J0LWRlc2NyaXB0aW9uICgjUENEQVRBKT4NCi0gIDwhRUxFTUVOVCB0cmFuc2xhdGFibGUgKCNQQ0RBVEEpPg0KLSAgPCFFTEVNRU5UIHVuc3VwcG9ydGVkLWFnZW50cyAoI1BDREFUQSk+DQotICA8IUFUVExJU1QgY29tcG9uZW50LW1ldGFkYXRhIGNvbXBvbmVudC10eXBlIENEQVRBICNJTVBMSUVEPg0KLV0+DQotXV0+PC94c2w6dmFyaWFibGU+DQotDQotICA8eHNsOmtleSBuYW1lPSJjb21wb25lbnQtdHlwZSIgDQotICAgICAgICAgICBtYXRjaD0iamF2YWVlOmNvbXBvbmVudCIgDQotICAgICAgICAgICB1c2U9ImphdmFlZTpjb21wb25lbnQtdHlwZS90ZXh0KCkiIC8+DQotDQotICA8eHNsOmtleSBuYW1lPSJyZW5kZXIta2l0LWlkIiANCi0gICAgICAgICAgIG1hdGNoPSJqYXZhZWU6cmVuZGVyLWtpdCIgDQotICAgICAgICAgICB1c2U9ImphdmFlZTpyZW5kZXIta2l0LWlkL3RleHQoKSIgLz4NCi0NCi0gIDwhLS0gc3dpdGNoIG9mZiBkZWZhdWx0IHRleHQgcHJvY2Vzc2luZyAtLT4gIA0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy90ZXh0KCkiIC8+DQotDQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvamF2YWVlOmZhY2VzLWNvbmZpZyIgPg0KLSAgICA8eHNsOnZhbHVlLW9mIGRpc2FibGUtb3V0cHV0LWVzY2FwaW5nPSJ5ZXMiIHNlbGVjdD0iJGRvY3R5cGUiIC8+DQotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJmYWNlcy1jb25maWciDQotICAgICAgICAgICAgICAgICBuYW1lc3BhY2U9Imh0dHA6Ly9qYXZhLnN1bi5jb20vSlNGL0NvbmZpZ3VyYXRpb24iID4NCi0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9ImphdmFlZTphcHBsaWNhdGlvbiIgLz4NCi0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9ImphdmFlZTpmYWN0b3J5IiAvPg0KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iamF2YWVlOmNvbXBvbmVudFtub3QoY29udGFpbnMoamF2YWVlOmNvbXBvbmVudC1leHRlbnNpb24vbWZwOmNvbXBvbmVudC1jbGFzcy1tb2RpZmllci90ZXh0KCksICdhYnN0cmFjdCcpKSBhbmQNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRzLXdpdGgoamF2YWVlOmNvbXBvbmVudC10eXBlLCAkdHlwZVByZWZpeCldIiAvPg0KLSAgICAgIDwhLS0gSW4gdG9tYWhhd2sgMS4xIHNvbWUgY29udmVydGVycyBzaG91bGQgYmUgYWRkZWQNCi0gICAgICBvbiBmYWNlcy1jb25maWcueG1sIGxpa2UgamF2YXgubWF0aC5CaWdEZWNpbWFsLCBpZiB3ZQ0KLSAgICAgIGluY2x1ZGUgamF2YWVlOmNvbnZlcnRlcltjb250YWlucyhqYXZhZWU6Y29udmVydGVyLWNsYXNzLCAkcGFja2FnZUNvbnRhaW5zKV0gDQotICAgICAgdGhpcyBjbGFzcyByZWZlcmVuY2VzIGFyZSBub3QgYWRkZWQgdG8gZmFjZXMtY29uZmlnLnhtbC4gDQotICAgICAgU28gd2UgbmVlZCB0byBhZGQgdGhpcyBmb3IgYXZvaWQgY2hlY2sgcGFja2FhZ2VDb250YWlucyAtLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJqYXZhZWU6Y29udmVydGVyIiAvPg0KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iamF2YWVlOm1hbmFnZWQtYmVhbltjb250YWlucyhqYXZhZWU6bWFuYWdlZC1iZWFuLWNsYXNzLCAkcGFja2FnZUNvbnRhaW5zKV0iIC8+DQotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJqYXZhZWU6bmF2aWdhdGlvbi1ydWxlIiAvPg0KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iamF2YWVlOnJlZmVyZW5jZWQtYmVhbiIgLz4NCi0gICAgICA8IS0tIG1lcmdlIHRoZSByZW5kZXIta2l0cyB0b2dldGhlciAtLT4NCi0gICAgICA8IS0tIEluIHRvbWFoYXdrIDEuMSB3ZSBkb24ndCBtZXJnZSByZW5kZXIta2l0LA0KLSAgICAgIGJlY2F1c2Ugd2UgYWRkIGFsbCBjb21wb25lbnRzIHRvIEhUTUxfQkFTSUMgcmVuZGVya2l0LA0KLSAgICAgIGFuZCB0aGUgcmVuZGVyLWtpdC1jbGFzcyBpcyBtaXNzaW5nIChteWZhY2VzIGNvcmUgb3IganNmIHJpDQotICAgICAgZGVjaWRlIHdoYXQgY2xhc3MgaW1wbGVtZW50IHRoaXMpLiANCi0gICAgICBTbywgaGVyZSB3ZSBjYW5ub3QgcHV0IA0KLSAgICAgIGphdmFlZTpyZW5kZXIta2l0W2NvbnRhaW5zKGphdmFlZTpyZW5kZXIta2l0LWNsYXNzLCAkcGFja2FnZUNvbnRhaW5zKV0NCi0gICAgICBhZ2Fpbg0KLSAgICAgICAtLT4gICAgICANCi0gICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0iamF2YWVlOnJlbmRlci1raXQiID4NCi0gICAgICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJyZW5kZXIta2l0IiA+DQotICAgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iamF2YWVlOmRlc2NyaXB0aW9uIiAvPg0KLSAgICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9ImphdmFlZTpkaXNwbGF5LW5hbWUiIC8+DQotICAgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iamF2YWVlOmljb24iIC8+DQotICAgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iamF2YWVlOnJlbmRlci1raXQtaWQiIC8+DQotICAgICAgICAgIDwhLS0gTm90IHJlcXVpcmVkIGluIHRvbWFoYXdrIDEuMSAtLT4gDQotICAgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iamF2YWVlOnJlbmRlci1raXQtY2xhc3MiIC8+DQotICAgICAgICAgICANCi0gICAgICAgICAgPCEtLSBEcm9wIHJlbmRlcmVycyBpZiBkZXNpcmVkIC0tPg0KLSAgICAgICAgICA8eHNsOmlmIHRlc3Q9IiRyZW1vdmVSZW5kZXJlcnMgIT0gJ3RydWUnIj4NCi0gICAgICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0ia2V5KCdyZW5kZXIta2l0LWlkJywgamF2YWVlOnJlbmRlci1raXQtaWQvdGV4dCgpKSIgPg0KLSAgICAgICAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJqYXZhZWU6cmVuZGVyZXJbY29udGFpbnMoamF2YWVlOnJlbmRlcmVyLWNsYXNzLCAkcGFja2FnZUNvbnRhaW5zKV0iIC8+DQotICAgICAgICAgICAgPC94c2w6Zm9yLWVhY2g+DQotICAgICAgICAgIDwveHNsOmlmPg0KLSAgICAgICAgPC94c2w6ZWxlbWVudD4NCi0gICAgICA8L3hzbDpmb3ItZWFjaD4NCi0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9ImphdmFlZTpsaWZlY3ljbGVbY29udGFpbnMoamF2YWVlOnBoYXNlLWxpc3RlbmVyLCAkcGFja2FnZUNvbnRhaW5zKV0iIC8+DQotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJqYXZhZWU6dmFsaWRhdG9yW2NvbnRhaW5zKGphdmFlZTp2YWxpZGF0b3ItY2xhc3MsICRwYWNrYWdlQ29udGFpbnMpXSIgLz4NCi0gICAgPC94c2w6ZWxlbWVudD4NCi0gIDwveHNsOnRlbXBsYXRlPg0KLQ0KLSAgPCEtLSB0aGlzIHRlbXBsYXRlcyBhcHBsaWVzIGphdmFlZTpwcm9wZXJ0eSB0ZW1wbGF0ZXMNCi0gICAgICAgZm9yIGEgY29tcG9uZW50IGFuZCBhbGwgc3VwZXJ0eXBlcyAtLT4NCi0gIDx4c2w6dGVtcGxhdGUgbmFtZT0iYXBwbHktcHJvcGVydHktdGVtcGxhdGVzIiA+DQotICAgIDx4c2w6cGFyYW0gbmFtZT0iY29tcG9uZW50IiAvPg0KLSAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImNvbXBvbmVudFN1cGVydHlwZSINCi0gICAgICAgICAgICAgICAgICBzZWxlY3Q9IiRjb21wb25lbnQvamF2YWVlOmNvbXBvbmVudC1leHRlbnNpb24vbWZwOmNvbXBvbmVudC1zdXBlcnR5cGUvdGV4dCgpIiAvPg0KLSAgICA8eHNsOmlmIHRlc3Q9IiRjb21wb25lbnRTdXBlcnR5cGUiID4NCi0gICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYXBwbHktcHJvcGVydHktdGVtcGxhdGVzIiA+DQotICAgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0iY29tcG9uZW50IiANCi0gICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Q9ImtleSgnY29tcG9uZW50LXR5cGUnLCAkY29tcG9uZW50U3VwZXJ0eXBlKSIgLz4NCi0gICAgICA8L3hzbDpjYWxsLXRlbXBsYXRlPg0KLSAgICA8L3hzbDppZj4NCi0gICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSIkY29tcG9uZW50L2phdmFlZTpwcm9wZXJ0eSIgLz4NCi0gIDwveHNsOnRlbXBsYXRlPg0KLSAgDQotICA8IS0tIHRoaXMgdGVtcGxhdGVzIGFwcGxpZXMgamF2YWVlOmF0dHJpYnV0ZSB0ZW1wbGF0ZXMNCi0gICAgICAgZm9yIGEgY29tcG9uZW50IGFuZCBhbGwgc3VwZXJ0eXBlcyAtLT4NCi0gIDx4c2w6dGVtcGxhdGUgbmFtZT0iYXBwbHktYXR0cmlidXRlLXRlbXBsYXRlcyIgPg0KLSAgICA8eHNsOnBhcmFtIG5hbWU9ImNvbXBvbmVudCIgLz4NCi0gICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJjb21wb25lbnRTdXBlcnR5cGUiDQotICAgICAgICAgICAgICAgICAgc2VsZWN0PSIkY29tcG9uZW50L2phdmFlZTpjb21wb25lbnQtZXh0ZW5zaW9uL21mcDpjb21wb25lbnQtc3VwZXJ0eXBlL3RleHQoKSIgLz4NCi0gICAgPHhzbDppZiB0ZXN0PSIkY29tcG9uZW50U3VwZXJ0eXBlIiA+DQotICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFwcGx5LWF0dHJpYnV0ZS10ZW1wbGF0ZXMiID4NCi0gICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJjb21wb25lbnQiDQotICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0PSJrZXkoJ2NvbXBvbmVudC10eXBlJywgJGNvbXBvbmVudFN1cGVydHlwZSkiIC8+DQotICAgICAgPC94c2w6Y2FsbC10ZW1wbGF0ZT4NCi0gICAgPC94c2w6aWY+DQotICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iJGNvbXBvbmVudC9qYXZhZWU6YXR0cmlidXRlIiAvPg0KLSAgPC94c2w6dGVtcGxhdGU+DQotICANCi0gIDwhLS0gdGhpcyB0ZW1wbGF0ZXMgYXBwbGllcyBqYXZhZWU6ZmFjZXQgdGVtcGxhdGVzDQotICAgICAgIGZvciBhIGNvbXBvbmVudCBhbmQgYWxsIHN1cGVydHlwZXMgLS0+DQotICA8eHNsOnRlbXBsYXRlIG5hbWU9ImFwcGx5LWZhY2V0LXRlbXBsYXRlcyIgPg0KLSAgICA8eHNsOnBhcmFtIG5hbWU9ImNvbXBvbmVudCIgLz4NCi0gICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJjb21wb25lbnRTdXBlcnR5cGUiDQotICAgICAgICAgICAgICAgICAgc2VsZWN0PSIkY29tcG9uZW50L2phdmFlZTpjb21wb25lbnQtZXh0ZW5zaW9uL21mcDpjb21wb25lbnQtc3VwZXJ0eXBlL3RleHQoKSIgLz4NCi0gICAgPHhzbDppZiB0ZXN0PSIkY29tcG9uZW50U3VwZXJ0eXBlIiA+DQotICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFwcGx5LWZhY2V0LXRlbXBsYXRlcyIgPg0KLSAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImNvbXBvbmVudCINCi0gICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Q9ImtleSgnY29tcG9uZW50LXR5cGUnLCAkY29tcG9uZW50U3VwZXJ0eXBlKSIgLz4NCi0gICAgICA8L3hzbDpjYWxsLXRlbXBsYXRlPg0KLSAgICA8L3hzbDppZj4NCi0gICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSIkY29tcG9uZW50L2phdmFlZTpmYWNldCIgLz4NCi0gIDwveHNsOnRlbXBsYXRlPg0KLSAgDQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL2phdmFlZTpjb21wb25lbnRbamF2YWVlOmNvbXBvbmVudC1leHRlbnNpb24vbWZwOmNvbXBvbmVudC1zdXBlcnR5cGVdIiANCi0gICAgICAgICAgICAgICAgcHJpb3JpdHk9IjEiID4NCi0gICAgPHhzbDplbGVtZW50IG5hbWU9ImNvbXBvbmVudCIgPg0KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iamF2YWVlOmRlc2NyaXB0aW9uIiAvPg0KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iamF2YWVlOmRpc3BsYXktbmFtZSIgLz4NCi0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9ImphdmFlZTppY29uIiAvPg0KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iamF2YWVlOmNvbXBvbmVudC10eXBlIiAvPg0KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iamF2YWVlOmNvbXBvbmVudC1jbGFzcyIgLz4NCi0gICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYXBwbHktZmFjZXQtdGVtcGxhdGVzIiA+DQotICAgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0iY29tcG9uZW50IiBzZWxlY3Q9Ii4iIC8+DQotICAgICAgPC94c2w6Y2FsbC10ZW1wbGF0ZT4NCi0gICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYXBwbHktYXR0cmlidXRlLXRlbXBsYXRlcyIgPg0KLSAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImNvbXBvbmVudCIgc2VsZWN0PSIuIiAvPg0KLSAgICAgIDwveHNsOmNhbGwtdGVtcGxhdGU+DQotICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFwcGx5LXByb3BlcnR5LXRlbXBsYXRlcyIgPg0KLSAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImNvbXBvbmVudCIgc2VsZWN0PSIuIiAvPg0KLSAgICAgIDwveHNsOmNhbGwtdGVtcGxhdGU+DQotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJqYXZhZWU6Y29tcG9uZW50LWV4dGVuc2lvbiIgLz4NCi0gICAgPC94c2w6ZWxlbWVudD4NCi0gIDwveHNsOnRlbXBsYXRlPg0KLQ0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9qYXZhZWU6YXBwbGljYXRpb24iID4NCi0gICAgPHhzbDplbGVtZW50IG5hbWU9ImFwcGxpY2F0aW9uIiA+DQotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJqYXZhZWU6YWN0aW9uLWxpc3RlbmVyW2NvbnRhaW5zKHRleHQoKSwgJHBhY2thZ2VDb250YWlucyldIiAvPg0KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iamF2YWVlOmRlZmF1bHQtcmVuZGVyLWtpdC1pZCIgLz4NCi0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9ImphdmFlZTptZXNzYWdlLWJ1bmRsZVtjb250YWlucyh0ZXh0KCksICRwYWNrYWdlQ29udGFpbnMpXSIgLz4NCi0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9ImphdmFlZTp2aWV3LWhhbmRsZXJbY29udGFpbnModGV4dCgpLCAkcGFja2FnZUNvbnRhaW5zKV0iIC8+DQotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJqYXZhZWU6c3RhdGUtbWFuYWdlcltjb250YWlucyh0ZXh0KCksICRwYWNrYWdlQ29udGFpbnMpXSIgLz4NCi0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9ImphdmFlZTpuYXZpZ2F0aW9uLWhhbmRsZXJbY29udGFpbnModGV4dCgpLCAkcGFja2FnZUNvbnRhaW5zKV0iIC8+DQotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJqYXZhZWU6cHJvcGVydHktcmVzb2x2ZXJbY29udGFpbnModGV4dCgpLCAkcGFja2FnZUNvbnRhaW5zKV0iIC8+DQotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJqYXZhZWU6dmFyaWFibGUtcmVzb2x2ZXJbY29udGFpbnModGV4dCgpLCAkcGFja2FnZUNvbnRhaW5zKV0iIC8+DQotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJqYXZhZWU6bG9jYWxlLWNvbmZpZyIgLz4NCi0gICAgPC94c2w6ZWxlbWVudD4NCi0gIDwveHNsOnRlbXBsYXRlPg0KLQ0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9qYXZhZWU6YWN0aW9uLWxpc3RlbmVyIiA+DQotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJhY3Rpb24tbGlzdGVuZXIiID4NCi0gICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0idGV4dCgpIiAvPg0KLSAgICA8L3hzbDplbGVtZW50Pg0KLSAgPC94c2w6dGVtcGxhdGU+DQotDQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL2phdmFlZTpkZWZhdWx0LXJlbmRlci1raXQtaWQiID4NCi0gICAgPHhzbDplbGVtZW50IG5hbWU9ImRlZmF1bHQtcmVuZGVyLWtpdC1pZCIgPg0KLSAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ0ZXh0KCkiIC8+DQotICAgIDwveHNsOmVsZW1lbnQ+DQotICA8L3hzbDp0ZW1wbGF0ZT4NCi0NCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vamF2YWVlOm1lc3NhZ2UtYnVuZGxlIiA+DQotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJtZXNzYWdlLWJ1bmRsZSIgPg0KLSAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ0ZXh0KCkiIC8+DQotICAgIDwveHNsOmVsZW1lbnQ+DQotICA8L3hzbDp0ZW1wbGF0ZT4NCi0NCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vamF2YWVlOm5hdmlnYXRpb24taGFuZGxlciIgPg0KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0ibmF2aWdhdGlvbi1oYW5kbGVyIiA+DQotICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InRleHQoKSIgLz4NCi0gICAgPC94c2w6ZWxlbWVudD4NCi0gIDwveHNsOnRlbXBsYXRlPg0KLQ0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9qYXZhZWU6dmlldy1oYW5kbGVyIiA+DQotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJ2aWV3LWhhbmRsZXIiID4NCi0gICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0idGV4dCgpIiAvPg0KLSAgICA8L3hzbDplbGVtZW50Pg0KLSAgPC94c2w6dGVtcGxhdGU+DQotDQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL2phdmFlZTpzdGF0ZS1tYW5hZ2VyIiA+DQotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJzdGF0ZS1tYW5hZ2VyIiA+DQotICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InRleHQoKSIgLz4NCi0gICAgPC94c2w6ZWxlbWVudD4NCi0gIDwveHNsOnRlbXBsYXRlPg0KLQ0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9qYXZhZWU6cHJvcGVydHktcmVzb2x2ZXIiID4NCi0gICAgPHhzbDplbGVtZW50IG5hbWU9InByb3BlcnR5LXJlc29sdmVyIiA+DQotICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InRleHQoKSIgLz4NCi0gICAgPC94c2w6ZWxlbWVudD4NCi0gIDwveHNsOnRlbXBsYXRlPg0KLQ0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9qYXZhZWU6dmFyaWFibGUtcmVzb2x2ZXIiID4NCi0gICAgPHhzbDplbGVtZW50IG5hbWU9InZhcmlhYmxlLXJlc29sdmVyIiA+DQotICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InRleHQoKSIgLz4NCi0gICAgPC94c2w6ZWxlbWVudD4NCi0gIDwveHNsOnRlbXBsYXRlPg0KLQ0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9qYXZhZWU6bG9jYWxlLWNvbmZpZyIgPg0KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0ibG9jYWxlLWNvbmZpZyIgPg0KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIC8+DQotICAgIDwveHNsOmVsZW1lbnQ+DQotICA8L3hzbDp0ZW1wbGF0ZT4NCi0NCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vamF2YWVlOmZhY3RvcnkiID4NCi0gICAgPHhzbDplbGVtZW50IG5hbWU9ImZhY3RvcnkiID4NCi0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9ImphdmFlZTphcHBsaWNhdGlvbi1mYWN0b3J5W2NvbnRhaW5zKHRleHQoKSwgJHBhY2thZ2VDb250YWlucyldIiAvPg0KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iamF2YWVlOmZhY2VzLWNvbnRleHQtZmFjdG9yeVtjb250YWlucyh0ZXh0KCksICRwYWNrYWdlQ29udGFpbnMpXSIgLz4NCi0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9ImphdmFlZTpsaWZlY3ljbGUtZmFjdG9yeVtjb250YWlucyh0ZXh0KCksICRwYWNrYWdlQ29udGFpbnMpXSIgLz4NCi0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9ImphdmFlZTpyZW5kZXIta2l0LWZhY3RvcnlbY29udGFpbnModGV4dCgpLCAkcGFja2FnZUNvbnRhaW5zKV0iIC8+DQotICAgIDwveHNsOmVsZW1lbnQ+DQotICA8L3hzbDp0ZW1wbGF0ZT4NCi0NCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vamF2YWVlOmFwcGxpY2F0aW9uLWZhY3RvcnkiID4NCi0gICAgPHhzbDplbGVtZW50IG5hbWU9ImFwcGxpY2F0aW9uLWZhY3RvcnkiID4NCi0gICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0idGV4dCgpIiAvPg0KLSAgICA8L3hzbDplbGVtZW50Pg0KLSAgPC94c2w6dGVtcGxhdGU+DQotDQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL2phdmFlZTpmYWNlcy1jb250ZXh0LWZhY3RvcnkiID4NCi0gICAgPHhzbDplbGVtZW50IG5hbWU9ImZhY2VzLWNvbnRleHQtZmFjdG9yeSIgPg0KLSAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ0ZXh0KCkiIC8+DQotICAgIDwveHNsOmVsZW1lbnQ+DQotICA8L3hzbDp0ZW1wbGF0ZT4NCi0NCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vamF2YWVlOmxpZmVjeWNsZS1mYWN0b3J5IiA+DQotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJsaWZlY3ljbGUtZmFjdG9yeSIgPg0KLSAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ0ZXh0KCkiIC8+DQotICAgIDwveHNsOmVsZW1lbnQ+DQotICA8L3hzbDp0ZW1wbGF0ZT4NCi0NCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vamF2YWVlOnJlbmRlci1raXQtZmFjdG9yeSIgPg0KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0icmVuZGVyLWtpdC1mYWN0b3J5IiA+DQotICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InRleHQoKSIgLz4NCi0gICAgPC94c2w6ZWxlbWVudD4NCi0gIDwveHNsOnRlbXBsYXRlPg0KLQ0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9qYXZhZWU6Y29tcG9uZW50IiA+DQotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJjb21wb25lbnQiID4NCi0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyAvPg0KLSAgICA8L3hzbDplbGVtZW50Pg0KLSAgPC94c2w6dGVtcGxhdGU+DQotDQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL2phdmFlZTpjb21wb25lbnQtdHlwZSIgPg0KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0iY29tcG9uZW50LXR5cGUiID4NCi0gICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0idGV4dCgpIiAvPg0KLSAgICA8L3hzbDplbGVtZW50Pg0KLSAgPC94c2w6dGVtcGxhdGU+DQotDQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL2phdmFlZTpjb21wb25lbnQtY2xhc3MiID4NCi0gICAgPHhzbDplbGVtZW50IG5hbWU9ImNvbXBvbmVudC1jbGFzcyIgPg0KLSAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ0ZXh0KCkiIC8+DQotICAgIDwveHNsOmVsZW1lbnQ+DQotICA8L3hzbDp0ZW1wbGF0ZT4NCi0NCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vamF2YWVlOmNvbXBvbmVudC9qYXZhZWU6ZmFjZXRbMV0iIHByaW9yaXR5PSIxIiA+DQotICAgIDx4c2w6Y29tbWVudD48eHNsOnZhbHVlLW9mIHNlbGVjdD0icGFyZW50Ojpub2RlKCkvamF2YWVlOmNvbXBvbmVudC10eXBlL3RleHQoKSIgLz4gZmFjZXRzPC94c2w6Y29tbWVudD4NCi0gICAgPHhzbDplbGVtZW50IG5hbWU9ImZhY2V0IiA+DQotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMvPg0KLSAgICA8L3hzbDplbGVtZW50Pg0KLSAgPC94c2w6dGVtcGxhdGU+DQotDQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL2phdmFlZTpmYWNldCIgPg0KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0iZmFjZXQiID4NCi0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcy8+DQotICAgIDwveHNsOmVsZW1lbnQ+DQotICA8L3hzbDp0ZW1wbGF0ZT4NCi0NCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vamF2YWVlOmZhY2V0LW5hbWUiID4NCi0gICAgPHhzbDplbGVtZW50IG5hbWU9ImZhY2V0LW5hbWUiID4NCi0gICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0idGV4dCgpIiAvPg0KLSAgICA8L3hzbDplbGVtZW50Pg0KLSAgPC94c2w6dGVtcGxhdGU+DQotDQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL2phdmFlZTpmYWNldC1leHRlbnNpb25bbWZwOmZhY2V0LW1ldGFkYXRhfG1mcDphbGxvd2FibGUtY2hpbGRyZW58bWZwOnByZWZlcnJlZC1jaGlsZHJlbnxtZnA6cHJlZmVycmVkfG1mcDp1bnN1cHBvcnRlZC1hZ2VudHN8bWZwOmRlcHJlY2F0ZWRdIiA+DQotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJmYWNldC1leHRlbnNpb24iID4NCi0gICAgICA8eHNsOmVsZW1lbnQgbmFtZT0iZmFjZXQtbWV0YWRhdGEiID4NCi0gICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzLz4NCi0gICAgICA8L3hzbDplbGVtZW50Pg0KLSAgICA8L3hzbDplbGVtZW50Pg0KLSAgPC94c2w6dGVtcGxhdGU+DQotDQotICANCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vamF2YWVlOmNvbXBvbmVudC9qYXZhZWU6YXR0cmlidXRlWzFdIiBwcmlvcml0eT0iMSIgPg0KLSAgICA8eHNsOmNvbW1lbnQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InBhcmVudDo6bm9kZSgpL2phdmFlZTpjb21wb25lbnQtdHlwZS90ZXh0KCkiIC8+IGF0dHJpYnV0ZXM8L3hzbDpjb21tZW50Pg0KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0iYXR0cmlidXRlIiA+DQotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMvPg0KLSAgICA8L3hzbDplbGVtZW50Pg0KLSAgPC94c2w6dGVtcGxhdGU+DQotDQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL2phdmFlZTpjb21wb25lbnQvamF2YWVlOmF0dHJpYnV0ZVsxXSIgcHJpb3JpdHk9IjEiID4NCi0gICAgPHhzbDpjb21tZW50Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJwYXJlbnQ6Om5vZGUoKS9qYXZhZWU6Y29tcG9uZW50LXR5cGUvdGV4dCgpIiAvPiBhdHRyaWJ1dGVzPC94c2w6Y29tbWVudD4NCi0gICAgPHhzbDplbGVtZW50IG5hbWU9ImF0dHJpYnV0ZSIgPg0KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzLz4NCi0gICAgPC94c2w6ZWxlbWVudD4NCi0gIDwveHNsOnRlbXBsYXRlPg0KLQ0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9qYXZhZWU6YXR0cmlidXRlIiA+DQotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJhdHRyaWJ1dGUiID4NCi0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcy8+DQotICAgIDwveHNsOmVsZW1lbnQ+DQotICA8L3hzbDp0ZW1wbGF0ZT4NCi0NCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vamF2YWVlOmF0dHJpYnV0ZS1uYW1lIiA+DQotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJhdHRyaWJ1dGUtbmFtZSIgPg0KLSAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ0ZXh0KCkiIC8+DQotICAgIDwveHNsOmVsZW1lbnQ+DQotICA8L3hzbDp0ZW1wbGF0ZT4NCi0NCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vamF2YWVlOmF0dHJpYnV0ZS1jbGFzcyIgPg0KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0iYXR0cmlidXRlLWNsYXNzIiA+DQotICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InRleHQoKSIgLz4NCi0gICAgPC94c2w6ZWxlbWVudD4NCi0gIDwveHNsOnRlbXBsYXRlPg0KLQ0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9qYXZhZWU6YXR0cmlidXRlLWV4dGVuc2lvbiIgPg0KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0iYXR0cmlidXRlLWV4dGVuc2lvbiIgPg0KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIC8+DQotICAgIDwveHNsOmVsZW1lbnQ+DQotICA8L3hzbDp0ZW1wbGF0ZT4NCi0NCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vamF2YWVlOmNvbXBvbmVudC9qYXZhZWU6cHJvcGVydHlbMV0iIHByaW9yaXR5PSIxIiA+DQotICAgIDx4c2w6Y29tbWVudD48eHNsOnZhbHVlLW9mIHNlbGVjdD0icGFyZW50Ojpub2RlKCkvamF2YWVlOmNvbXBvbmVudC10eXBlL3RleHQoKSIgLz4gcHJvcGVydGllczwveHNsOmNvbW1lbnQ+DQotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eSIgPg0KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzLz4NCi0gICAgPC94c2w6ZWxlbWVudD4NCi0gIDwveHNsOnRlbXBsYXRlPg0KLQ0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9qYXZhZWU6cHJvcGVydHlbamF2YWVlOnByb3BlcnR5LW5hbWUvdGV4dCgpID0gJ2JpbmRpbmcnXSIgcHJpb3JpdHk9JzInID4NCi0gICAgPCEtLSBza2lwIG92ZXIgcHJvcGVydGllcyBuYW1lZCAnYmluZGluZycgLS0+DQotICA8L3hzbDp0ZW1wbGF0ZT4NCi0NCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vamF2YWVlOnByb3BlcnR5IiA+DQotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eSIgPg0KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzLz4NCi0gICAgPC94c2w6ZWxlbWVudD4NCi0gIDwveHNsOnRlbXBsYXRlPg0KLQ0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9qYXZhZWU6cHJvcGVydHktbmFtZSIgPg0KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0icHJvcGVydHktbmFtZSIgPg0KLSAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ0ZXh0KCkiIC8+DQotICAgIDwveHNsOmVsZW1lbnQ+DQotICA8L3hzbDp0ZW1wbGF0ZT4NCi0NCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vamF2YWVlOnByb3BlcnR5LWNsYXNzIiA+DQotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eS1jbGFzcyIgPg0KLSAgICAgIDwhLS0gZWxpbWluYXRlIGdlbmVyaWNzIGZvciAxLjQtYmFzZWQgY2xhc3NlcyBpbiBKU0YgMS4xIC0tPg0KLSAgICAgIDx4c2w6Y2hvb3NlPg0KLSAgICAgICAgPHhzbDp3aGVuIHRlc3Q9ImNvbnRhaW5zKHRleHQoKSwgJyZsdDsnKSIgPg0KLSAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0ic3Vic3RyaW5nLWJlZm9yZSh0ZXh0KCksICcmbHQ7JykiIC8+DQotICAgICAgICA8L3hzbDp3aGVuPg0KLSAgICAgICAgPHhzbDpvdGhlcndpc2U+DQotICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ0ZXh0KCkiIC8+DQotICAgICAgICA8L3hzbDpvdGhlcndpc2U+DQotICAgICAgPC94c2w6Y2hvb3NlPg0KLSAgICA8L3hzbDplbGVtZW50Pg0KLSAgPC94c2w6dGVtcGxhdGU+DQotICANCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vamF2YWVlOnByb3BlcnR5LWV4dGVuc2lvblttZnA6cHJvcGVydHktdmFsdWVzfG1mcDpncm91cHxtZnA6dHJhbnNsYXRhYmxlfG1mcDpwcm9wZXJ0eS1lZGl0b3J8bWZwOmV4cGVydHxtZnA6dW5zdXBwb3J0ZWQtYWdlbnRzfCpbbmFtZXNwYWNlLXVyaSgpICE9ICdodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUnIGFuZCBuYW1lc3BhY2UtdXJpKCkgIT0naHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9tYXZlbi1mYWNlcy1wbHVnaW4nXV0iID4NCi0gICAgPHhzbDplbGVtZW50IG5hbWU9InByb3BlcnR5LWV4dGVuc2lvbiIgPg0KLSAgICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eS1tZXRhZGF0YSIgPg0KLSAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMvPg0KLSAgICAgIDwveHNsOmVsZW1lbnQ+DQotICAgIDwveHNsOmVsZW1lbnQ+DQotICA8L3hzbDp0ZW1wbGF0ZT4NCi0gIA0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9qYXZhZWU6cHJvcGVydHktZXh0ZW5zaW9uW21mcDpwcm9wZXJ0eS1tZXRhZGF0YV0iIHByaW9yaXR5PSIxIiA+DQotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eS1leHRlbnNpb24iID4NCi0gICAgICA8IS0tIGRvIG5vdCBjb3B5IHRoZSBwcm9wZXJ0eSB2YWx1ZXMsIGJ1dCBpbnN0ZWFkIGxldCB0aGVtIGJlIHBpY2tlZCB1cCBpbiB0aGUgcHJvcGVydHktbWV0YWRhdGEgZWxlbWVudCAtLT4NCi0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9IipbbmFtZSgpICE9ICdtZnA6cHJvcGVydHktdmFsdWVzJ10iIC8+DQotICAgIDwveHNsOmVsZW1lbnQ+DQotICA8L3hzbDp0ZW1wbGF0ZT4NCi0gIA0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9tZnA6cHJvcGVydHktbWV0YWRhdGEiID4NCi0gICAgPHhzbDplbGVtZW50IG5hbWU9InByb3BlcnR5LW1ldGFkYXRhIiA+DQotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMvPg0KLSAgICAgIDwhLS0gcGljayB1cCBhbnkgcHJvcGVydHktdmFsdWVzIGVsZW1lbnRzIGZyb20gdGhlIHBhcmVudCBub2RlIC0tPg0KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iLi4vbWZwOnByb3BlcnR5LXZhbHVlcyIgLz4NCi0gICAgPC94c2w6ZWxlbWVudD4NCi0gIDwveHNsOnRlbXBsYXRlPg0KLQ0KLSAgPCEtLSB0aGlzIHRlbXBsYXRlcyBncmFicyB0aGUgY29tcG9uZW50LWZhbWlseSBmcm9tIGFuIGFuY2VzdG9yIC0tPg0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9qYXZhZWU6Y29tcG9uZW50LWV4dGVuc2lvblttZnA6Y29tcG9uZW50LXN1cGVydHlwZV0iIHByaW9yaXR5PSIxIiA+DQotICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iY29tcG9uZW50U3VwZXJ0eXBlIg0KLSAgICAgICAgICAgICAgICAgIHNlbGVjdD0ibWZwOmNvbXBvbmVudC1zdXBlcnR5cGUvdGV4dCgpIiAvPg0KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0iY29tcG9uZW50LWV4dGVuc2lvbiIgPg0KLSAgICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJjb21wb25lbnQtZmFtaWx5Ij4NCi0gICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJrZXkoJ2NvbXBvbmVudC10eXBlJywgJGNvbXBvbmVudFN1cGVydHlwZSkvamF2YWVlOmNvbXBvbmVudC1leHRlbnNpb24vbWZwOmNvbXBvbmVudC1mYW1pbHkvdGV4dCgpIiAvPg0KLSAgICAgIDwveHNsOmVsZW1lbnQ+DQotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMvPg0KLSAgICA8L3hzbDplbGVtZW50Pg0KLSAgPC94c2w6dGVtcGxhdGU+DQotICANCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vamF2YWVlOmNvbXBvbmVudC1leHRlbnNpb25bbWZwOmNvbXBvbmVudC1mYW1pbHldIiBwcmlvcml0eT0iMiIgPg0KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0iY29tcG9uZW50LWV4dGVuc2lvbiIgPg0KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzLz4NCi0gICAgPC94c2w6ZWxlbWVudD4NCi0gIDwveHNsOnRlbXBsYXRlPg0KLQ0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9qYXZhZWU6Y29tcG9uZW50LWV4dGVuc2lvbiIgPg0KLSAgICA8eHNsOmNvbW1lbnQ+V2FybmluZzogdGhpcyBjb21wb25lbnQgaGFzIG5vIGNvbXBvbmVudC1mYW1pbHkhPC94c2w6Y29tbWVudD4NCi0gICAgPHhzbDplbGVtZW50IG5hbWU9ImNvbXBvbmVudC1leHRlbnNpb24iID4NCi0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcy8+DQotICAgIDwveHNsOmVsZW1lbnQ+DQotICA8L3hzbDp0ZW1wbGF0ZT4NCi0NCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vbWZwOmNvbXBvbmVudC1tZXRhZGF0YSIgPg0KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0iY29tcG9uZW50LW1ldGFkYXRhIiA+DQotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMvPg0KLSAgICA8L3hzbDplbGVtZW50Pg0KLSAgPC94c2w6dGVtcGxhdGU+DQotDQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL2phdmFlZTpjb252ZXJ0ZXIiID4NCi0gICAgPHhzbDplbGVtZW50IG5hbWU9ImNvbnZlcnRlciIgPg0KLSAgICAgIDwhLS0geHNsOmFwcGx5LXRlbXBsYXRlcy8gVE9ETyB1c2UgdGhpcyBpbnN0ZWFkIC0tPg0KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iamF2YWVlOmRlc2NyaXB0aW9uIi8+DQotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJqYXZhZWU6ZGlzcGxheS1uYW1lIi8+DQotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJqYXZhZWU6Y29udmVydGVyLWlkIi8+DQotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJqYXZhZWU6Y29udmVydGVyLWZvci1jbGFzcyIvPg0KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iamF2YWVlOmNvbnZlcnRlci1jbGFzcyIvPg0KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iamF2YWVlOnByb3BlcnR5Ii8+DQotICAgIDwveHNsOmVsZW1lbnQ+DQotICA8L3hzbDp0ZW1wbGF0ZT4NCi0NCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vamF2YWVlOmNvbnZlcnRlci1pZCIgPg0KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0iY29udmVydGVyLWlkIiA+DQotICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InRleHQoKSIgLz4NCi0gICAgPC94c2w6ZWxlbWVudD4NCi0gIDwveHNsOnRlbXBsYXRlPg0KLQ0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9qYXZhZWU6Y29udmVydGVyLWZvci1jbGFzcyIgPg0KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0iY29udmVydGVyLWZvci1jbGFzcyIgPg0KLSAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ0ZXh0KCkiIC8+DQotICAgIDwveHNsOmVsZW1lbnQ+DQotICA8L3hzbDp0ZW1wbGF0ZT4NCi0NCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vamF2YWVlOmNvbnZlcnRlci1jbGFzcyIgPg0KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0iY29udmVydGVyLWNsYXNzIiA+DQotICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InRleHQoKSIgLz4NCi0gICAgPC94c2w6ZWxlbWVudD4NCi0gIDwveHNsOnRlbXBsYXRlPg0KLQ0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9qYXZhZWU6bWFuYWdlZC1iZWFuIiA+DQotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJtYW5hZ2VkLWJlYW4iID4NCi0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyAvPg0KLSAgICA8L3hzbDplbGVtZW50Pg0KLSAgPC94c2w6dGVtcGxhdGU+DQotDQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL2phdmFlZTptYW5hZ2VkLWJlYW4tbmFtZSIgPg0KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0ibWFuYWdlZC1iZWFuLW5hbWUiID4NCi0gICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0idGV4dCgpIiAvPg0KLSAgICA8L3hzbDplbGVtZW50Pg0KLSAgPC94c2w6dGVtcGxhdGU+DQotDQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL2phdmFlZTptYW5hZ2VkLWJlYW4tY2xhc3MiID4NCi0gICAgPHhzbDplbGVtZW50IG5hbWU9Im1hbmFnZWQtYmVhbi1jbGFzcyIgPg0KLSAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ0ZXh0KCkiIC8+DQotICAgIDwveHNsOmVsZW1lbnQ+DQotICA8L3hzbDp0ZW1wbGF0ZT4NCi0NCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vamF2YWVlOm1hbmFnZWQtYmVhbi1zY29wZSIgPg0KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0ibWFuYWdlZC1iZWFuLXNjb3BlIiA+DQotICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InRleHQoKSIgLz4NCi0gICAgPC94c2w6ZWxlbWVudD4NCi0gIDwveHNsOnRlbXBsYXRlPg0KLQ0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9qYXZhZWU6bWFuYWdlZC1wcm9wZXJ0eSIgPg0KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0ibWFuYWdlZC1wcm9wZXJ0eSIgPg0KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIC8+DQotICAgIDwveHNsOmVsZW1lbnQ+DQotICA8L3hzbDp0ZW1wbGF0ZT4NCi0NCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vamF2YWVlOm51bGwtdmFsdWUiID4NCi0gICAgPHhzbDplbGVtZW50IG5hbWU9Im51bGwtdmFsdWUiID4NCi0gICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0idGV4dCgpIiAvPg0KLSAgICA8L3hzbDplbGVtZW50Pg0KLSAgPC94c2w6dGVtcGxhdGU+DQotDQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL2phdmFlZTp2YWx1ZSIgPg0KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0idmFsdWUiID4NCi0gICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0idGV4dCgpIiAvPg0KLSAgICA8L3hzbDplbGVtZW50Pg0KLSAgPC94c2w6dGVtcGxhdGU+DQotDQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL2phdmFlZTptYXAtZW50cmllcyIgPg0KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0ibWFwLWVudHJpZXMiID4NCi0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyAvPg0KLSAgICA8L3hzbDplbGVtZW50Pg0KLSAgPC94c2w6dGVtcGxhdGU+DQotDQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL2phdmFlZTptYXAtZW50cnkiID4NCi0gICAgPHhzbDplbGVtZW50IG5hbWU9Im1hcC1lbnRyeSIgPg0KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIC8+DQotICAgIDwveHNsOmVsZW1lbnQ+DQotICA8L3hzbDp0ZW1wbGF0ZT4NCi0NCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vamF2YWVlOmtleSIgPg0KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0ia2V5IiA+DQotICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InRleHQoKSIgLz4NCi0gICAgPC94c2w6ZWxlbWVudD4NCi0gIDwveHNsOnRlbXBsYXRlPg0KLQ0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9qYXZhZWU6a2V5LWNsYXNzIiA+DQotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJrZXktY2xhc3MiID4NCi0gICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0idGV4dCgpIiAvPg0KLSAgICA8L3hzbDplbGVtZW50Pg0KLSAgPC94c2w6dGVtcGxhdGU+DQotDQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL2phdmFlZTp2YWx1ZS1jbGFzcyIgPg0KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0idmFsdWUtY2xhc3MiID4NCi0gICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0idGV4dCgpIiAvPg0KLSAgICA8L3hzbDplbGVtZW50Pg0KLSAgPC94c2w6dGVtcGxhdGU+DQotDQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL2phdmFlZTptZXNzYWdlLWJ1bmRsZSIgPg0KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0ibWVzc2FnZS1idW5kbGUiID4NCi0gICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0idGV4dCgpIiAvPg0KLSAgICA8L3hzbDplbGVtZW50Pg0KLSAgPC94c2w6dGVtcGxhdGU+DQotDQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL2phdmFlZTpsaXN0LWVudHJpZXMiID4NCi0gICAgPHhzbDplbGVtZW50IG5hbWU9Imxpc3QtZW50cmllcyIgPg0KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIC8+DQotICAgIDwveHNsOmVsZW1lbnQ+DQotICA8L3hzbDp0ZW1wbGF0ZT4NCi0NCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vamF2YWVlOm5hdmlnYXRpb24tcnVsZSIgPg0KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0ibmF2aWdhdGlvbi1ydWxlIiA+DQotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgLz4NCi0gICAgPC94c2w6ZWxlbWVudD4NCi0gIDwveHNsOnRlbXBsYXRlPg0KLQ0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9qYXZhZWU6ZnJvbS12aWV3LWlkIiA+DQotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJmcm9tLXZpZXctaWQiID4NCi0gICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0idGV4dCgpIiAvPg0KLSAgICA8L3hzbDplbGVtZW50Pg0KLSAgPC94c2w6dGVtcGxhdGU+DQotDQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL2phdmFlZTpuYXZpZ2F0aW9uLWNhc2UiID4NCi0gICAgPHhzbDplbGVtZW50IG5hbWU9Im5hdmlnYXRpb24tY2FzZSIgPg0KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIC8+DQotICAgIDwveHNsOmVsZW1lbnQ+DQotICA8L3hzbDp0ZW1wbGF0ZT4NCi0NCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vamF2YWVlOmZyb20tYWN0aW9uIiA+DQotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJmcm9tLWFjdGlvbiIgPg0KLSAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ0ZXh0KCkiIC8+DQotICAgIDwveHNsOmVsZW1lbnQ+DQotICA8L3hzbDp0ZW1wbGF0ZT4NCi0NCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vamF2YWVlOmZyb20tb3V0Y29tZSIgPg0KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0iZnJvbS1vdXRjb21lIiA+DQotICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InRleHQoKSIgLz4NCi0gICAgPC94c2w6ZWxlbWVudD4NCi0gIDwveHNsOnRlbXBsYXRlPg0KLQ0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9qYXZhZWU6dG8tdmlldy1pZCIgPg0KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0idG8tdmlldy1pZCIgPg0KLSAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ0ZXh0KCkiIC8+DQotICAgIDwveHNsOmVsZW1lbnQ+DQotICA8L3hzbDp0ZW1wbGF0ZT4NCi0NCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vamF2YWVlOnJlZGlyZWN0IiA+DQotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJyZWRpcmVjdCIgLz4NCi0gIDwveHNsOnRlbXBsYXRlPg0KLQ0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9qYXZhZWU6cmVmZXJlbmNlZC1iZWFuIiA+DQotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJyZWZlcmVuY2VkLWJlYW4iID4NCi0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyAvPg0KLSAgICA8L3hzbDplbGVtZW50Pg0KLSAgPC94c2w6dGVtcGxhdGU+DQotDQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL2phdmFlZTpyZWZlcmVuY2VkLWJlYW4tbmFtZSIgPg0KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0icmVmZXJlbmNlZC1iZWFuLW5hbWUiID4NCi0gICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0idGV4dCgpIiAvPg0KLSAgICA8L3hzbDplbGVtZW50Pg0KLSAgPC94c2w6dGVtcGxhdGU+DQotDQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL2phdmFlZTpyZWZlcmVuY2VkLWJlYW4tY2xhc3MiID4NCi0gICAgPHhzbDplbGVtZW50IG5hbWU9InJlZmVyZW5jZWQtYmVhbi1jbGFzcyIgPg0KLSAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ0ZXh0KCkiIC8+DQotICAgIDwveHNsOmVsZW1lbnQ+DQotICA8L3hzbDp0ZW1wbGF0ZT4NCi0NCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vamF2YWVlOnJlbmRlci1raXQiID4NCi0gICAgPHhzbDplbGVtZW50IG5hbWU9InJlbmRlci1raXQiID4NCi0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyAvPg0KLSAgICA8L3hzbDplbGVtZW50Pg0KLSAgPC94c2w6dGVtcGxhdGU+DQotDQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL2phdmFlZTpyZW5kZXIta2l0LWlkIiA+DQotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJyZW5kZXIta2l0LWlkIiA+DQotICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InRleHQoKSIgLz4NCi0gICAgPC94c2w6ZWxlbWVudD4NCi0gIDwveHNsOnRlbXBsYXRlPg0KLQ0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9qYXZhZWU6cmVuZGVyLWtpdC1jbGFzcyIgPg0KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0icmVuZGVyLWtpdC1jbGFzcyIgPg0KLSAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ0ZXh0KCkiIC8+DQotICAgIDwveHNsOmVsZW1lbnQ+DQotICA8L3hzbDp0ZW1wbGF0ZT4NCi0NCi08IS0tIFRPRE86IGZsYXR0ZW4gY29tcG9uZW50IHByb3BlcnRpZXMgaW50byByZW5kZXJlciBhcyBhdHRyaWJ1dGVzIC0tPg0KLTwhLS0NCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vamF2YWVlOnJlbmRlcmVyW2phdmFlZTpyZW5kZXJlci1leHRlbnNpb24vbWZwOmNvbXBvbmVudC10eXBlXSINCi0gICAgICAgICAgICAgICAgcHJpb3JpdHk9IjEiID4NCi0gICAgPHhzbDplbGVtZW50IG5hbWU9InJlbmRlcmVyIiA+DQotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJqYXZhZWU6Y29tcG9uZW50LWZhbWlseSIgLz4NCi0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9ImphdmFlZTpyZW5kZXJlci10eXBlIiAvPg0KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iamF2YWVlOnJlbmRlcmVyLWNsYXNzIiAvPg0KLSAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iY29tcG9uZW50VHlwZSIgc2VsZWN0PSJqYXZhZWU6cmVuZGVyZXItZXh0ZW5zaW9uL21mcDpjb21wb25lbnQtdHlwZS90ZXh0KCkiIC8+DQotICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9ImtleSgnY29tcG9uZW50LXR5cGUnLCAkY29tcG9uZW50VHlwZSkvamF2YWVlOnByb3BlcnR5IiA+DQotICAgICAgICA8eHNsOmVsZW1lbnQgbmFtZT0iYXR0cmlidXRlIiA+DQotICAgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iamF2YWVlOmRlc2NyaXB0aW9uIiAvPg0KLSAgICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9ImphdmFlZTpkaXNwbGF5LW5hbWUiIC8+DQotICAgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iamF2YWVlOmljb24iIC8+DQotICAgICAgICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJhdHRyaWJ1dGUtbmFtZSIgPg0KLSAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJqYXZhZWU6cHJvcGVydHktbmFtZSIgLz4NCi0gICAgICAgICAgPC94c2w6ZWxlbWVudD4NCi0gICAgICAgICAgPHhzbDplbGVtZW50IG5hbWU9ImF0dHJpYnV0ZS1jbGFzcyIgPg0KLSAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJqYXZhZWU6cHJvcGVydHktY2xhc3MiIC8+DQotICAgICAgICAgIDwveHNsOmVsZW1lbnQ+DQotICAgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iamF2YWVlOmRlZmF1bHQtdmFsdWUiIC8+DQotICAgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iamF2YWVlOnN1Z2dlc3RlZC12YWx1ZSIgLz4NCi0gICAgICAgICAgPHhzbDplbGVtZW50IG5hbWU9ImF0dHJpYnV0ZS1leHRlbnNpb24iID4NCi0gICAgICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9Im1mcDpwcm9wZXJ0eS1leHRlbnNpb24vKiIgLz4NCi0gICAgICAgICAgPC94c2w6ZWxlbWVudD4NCi0gICAgICAgIDwveHNsOmVsZW1lbnQ+DQotICAgICAgPC94c2w6Zm9yLWVhY2g+DQotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJqYXZhZWU6YXR0cmlidXRlIiAvPg0KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iamF2YWVlOnJlbmRlcmVyLWV4dGVuc2lvbiIgLz4NCi0gICAgPC94c2w6ZWxlbWVudD4NCi0gIDwveHNsOnRlbXBsYXRlPg0KLS0tPg0KLQ0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9qYXZhZWU6cmVuZGVyZXIiID4NCi0gICAgPHhzbDplbGVtZW50IG5hbWU9InJlbmRlcmVyIiA+DQotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgLz4NCi0gICAgPC94c2w6ZWxlbWVudD4NCi0gIDwveHNsOnRlbXBsYXRlPg0KLQ0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9qYXZhZWU6Y29tcG9uZW50LWZhbWlseSIgPg0KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0iY29tcG9uZW50LWZhbWlseSIgPg0KLSAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ0ZXh0KCkiIC8+DQotICAgIDwveHNsOmVsZW1lbnQ+DQotICA8L3hzbDp0ZW1wbGF0ZT4NCi0NCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vamF2YWVlOnJlbmRlcmVyLXR5cGUiID4NCi0gICAgPHhzbDplbGVtZW50IG5hbWU9InJlbmRlcmVyLXR5cGUiID4NCi0gICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0idGV4dCgpIiAvPg0KLSAgICA8L3hzbDplbGVtZW50Pg0KLSAgPC94c2w6dGVtcGxhdGU+DQotDQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL2phdmFlZTpyZW5kZXJlci1jbGFzcyIgPg0KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0icmVuZGVyZXItY2xhc3MiID4NCi0gICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0idGV4dCgpIiAvPg0KLSAgICA8L3hzbDplbGVtZW50Pg0KLSAgPC94c2w6dGVtcGxhdGU+DQotDQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL2phdmFlZTpyZW5kZXJlci1leHRlbnNpb25bbWZwOnVuc3VwcG9ydGVkLWFnZW50c10iID4NCi0gICAgPHhzbDplbGVtZW50IG5hbWU9InJlbmRlcmVyLWV4dGVuc2lvbiIgPg0KLSAgICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJyZW5kZXJlci1tZXRhZGF0YSIgPg0KLSAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMvPg0KLSAgICAgIDwveHNsOmVsZW1lbnQ+DQotICAgIDwveHNsOmVsZW1lbnQ+DQotICA8L3hzbDp0ZW1wbGF0ZT4NCi0NCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vamF2YWVlOmxpZmVjeWNsZSIgPg0KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0ibGlmZWN5Y2xlIiA+DQotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJqYXZhZWU6cGhhc2UtbGlzdGVuZXJbY29udGFpbnModGV4dCgpLCAkcGFja2FnZUNvbnRhaW5zKV0iIC8+DQotICAgIDwveHNsOmVsZW1lbnQ+DQotICA8L3hzbDp0ZW1wbGF0ZT4NCi0NCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vamF2YWVlOnBoYXNlLWxpc3RlbmVyIiA+DQotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJwaGFzZS1saXN0ZW5lciIgPg0KLSAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ0ZXh0KCkiIC8+DQotICAgIDwveHNsOmVsZW1lbnQ+DQotICA8L3hzbDp0ZW1wbGF0ZT4NCi0NCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vamF2YWVlOmRlZmF1bHQtbG9jYWxlIiA+DQotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJkZWZhdWx0LWxvY2FsZSIgPg0KLSAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ0ZXh0KCkiIC8+DQotICAgIDwveHNsOmVsZW1lbnQ+DQotICA8L3hzbDp0ZW1wbGF0ZT4NCi0NCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vamF2YWVlOnN1cHBvcnRlZC1sb2NhbGUiID4NCi0gICAgPHhzbDplbGVtZW50IG5hbWU9InN1cHBvcnRlZC1sb2NhbGUiID4NCi0gICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0idGV4dCgpIiAvPg0KLSAgICA8L3hzbDplbGVtZW50Pg0KLSAgPC94c2w6dGVtcGxhdGU+DQotDQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL2phdmFlZTp2YWxpZGF0b3IiID4NCi0gICAgPHhzbDplbGVtZW50IG5hbWU9InZhbGlkYXRvciIgPg0KLSAgICAgIDwhLS0geHNsOmFwcGx5LXRlbXBsYXRlcy8gVE9ETyB1c2UgdGhpcyBpbnN0ZWFkIC0tPg0KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iamF2YWVlOmRpc3BsYXktbmFtZSIvPg0KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iamF2YWVlOnZhbGlkYXRvci1pZCIvPg0KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iamF2YWVlOnZhbGlkYXRvci1jbGFzcyIvPg0KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iamF2YWVlOnByb3BlcnR5Ii8+DQotICAgIDwveHNsOmVsZW1lbnQ+DQotICA8L3hzbDp0ZW1wbGF0ZT4NCi0NCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vamF2YWVlOnZhbGlkYXRvci1pZCIgPg0KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0idmFsaWRhdG9yLWlkIiA+DQotICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InRleHQoKSIgLz4NCi0gICAgPC94c2w6ZWxlbWVudD4NCi0gIDwveHNsOnRlbXBsYXRlPg0KLQ0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9qYXZhZWU6dmFsaWRhdG9yLWNsYXNzIiA+DQotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJ2YWxpZGF0b3ItY2xhc3MiID4NCi0gICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0idGV4dCgpIiAvPg0KLSAgICA8L3hzbDplbGVtZW50Pg0KLSAgPC94c2w6dGVtcGxhdGU+DQotDQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL2phdmFlZTpkZXNjcmlwdGlvbiIgPg0KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iID4NCi0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9IkAqIiAvPg0KLSAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ0ZXh0KCkiIC8+DQotICAgIDwveHNsOmVsZW1lbnQ+DQotICA8L3hzbDp0ZW1wbGF0ZT4NCi0NCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vamF2YWVlOnByb3BlcnR5W2phdmFlZTpwcm9wZXJ0eS1leHRlbnNpb24vbWZwOmxvbmctZGVzY3JpcHRpb25dL2phdmFlZTpkZXNjcmlwdGlvbiIgcHJpb3JpdHk9IjEiPg0KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iID4NCi0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9Ii4uL2phdmFlZTpwcm9wZXJ0eS1leHRlbnNpb24vbWZwOmxvbmctZGVzY3JpcHRpb24vQCoiIC8+DQotICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii4uL2phdmFlZTpwcm9wZXJ0eS1leHRlbnNpb24vbWZwOmxvbmctZGVzY3JpcHRpb24vdGV4dCgpIiAvPg0KLSAgICA8L3hzbDplbGVtZW50Pg0KLSAgPC94c2w6dGVtcGxhdGU+DQotDQotDQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL2phdmFlZTpkZXNjcmlwdGlvbi9AeG1sOmxhbmciID4NCi0gICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0ieG1sOmxhbmciID48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHhtbDpsYW5nIiAvPjwveHNsOmF0dHJpYnV0ZT4NCi0gIDwveHNsOnRlbXBsYXRlPg0KLQ0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9qYXZhZWU6ZGlzcGxheS1uYW1lIiA+DQotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJkaXNwbGF5LW5hbWUiID4NCi0gICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0idGV4dCgpIiAvPg0KLSAgICA8L3hzbDplbGVtZW50Pg0KLSAgPC94c2w6dGVtcGxhdGU+DQotDQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL2phdmFlZTppY29uIiA+DQotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJpY29uIiA+DQotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMvPg0KLSAgICA8L3hzbDplbGVtZW50Pg0KLSAgPC94c2w6dGVtcGxhdGU+DQotDQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL2phdmFlZTpzbWFsbC1pY29uIiA+DQotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJzbWFsbC1pY29uIiA+DQotICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InRleHQoKSIgLz4NCi0gICAgPC94c2w6ZWxlbWVudD4NCi0gIDwveHNsOnRlbXBsYXRlPg0KLQ0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9qYXZhZWU6bGFyZ2UtaWNvbiIgPg0KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0ibGFyZ2UtaWNvbiIgPg0KLSAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ0ZXh0KCkiIC8+DQotICAgIDwveHNsOmVsZW1lbnQ+DQotICA8L3hzbDp0ZW1wbGF0ZT4NCi0NCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vamF2YWVlOmRlZmF1bHQtdmFsdWUiID4NCi0gICAgPHhzbDplbGVtZW50IG5hbWU9ImRlZmF1bHQtdmFsdWUiID4NCi0gICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0idGV4dCgpIiAvPg0KLSAgICA8L3hzbDplbGVtZW50Pg0KLSAgPC94c2w6dGVtcGxhdGU+DQotDQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL2phdmFlZTpzdWdnZXN0ZWQtdmFsdWUiID4NCi0gICAgPHhzbDplbGVtZW50IG5hbWU9InN1Z2dlc3RlZC12YWx1ZSIgPg0KLSAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ0ZXh0KCkiIC8+DQotICAgIDwveHNsOmVsZW1lbnQ+DQotICA8L3hzbDp0ZW1wbGF0ZT4NCi0NCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vbWZwOmNvbXBvbmVudC1mYW1pbHkiID4NCi0gICAgPHhzbDplbGVtZW50IG5hbWU9ImNvbXBvbmVudC1mYW1pbHkiID4NCi0gICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0idGV4dCgpIiAvPg0KLSAgICA8L3hzbDplbGVtZW50Pg0KLSAgPC94c2w6dGVtcGxhdGU+DQotDQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL21mcDpmYXZvcml0ZS1wcm9wZXJ0eSIgPg0KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0iZmF2b3JpdGUtcHJvcGVydHkiID4NCi0gICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0idGV4dCgpIiAvPg0KLSAgICA8L3hzbDplbGVtZW50Pg0KLSAgPC94c2w6dGVtcGxhdGU+DQotDQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL21mcDpyZW5kZXJlci10eXBlIiA+DQotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJyZW5kZXJlci10eXBlIiA+DQotICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InRleHQoKSIgLz4NCi0gICAgPC94c2w6ZWxlbWVudD4NCi0gIDwveHNsOnRlbXBsYXRlPg0KLQ0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9tZnA6cHJvcGVydHktdmFsdWVzIiA+DQotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJhdHRyaWJ1dGUtdmFsdWVzIiA+DQotICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InRleHQoKSIgLz4NCi0gICAgPC94c2w6ZWxlbWVudD4NCi0gIDwveHNsOnRlbXBsYXRlPg0KLQ0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9tZnA6dW5zdXBwb3J0ZWQtYWdlbnRzIiA+DQotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJ1bnN1cHBvcnRlZC1hZ2VudHMiID4NCi0gICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0idGV4dCgpIiAvPg0KLSAgICA8L3hzbDplbGVtZW50Pg0KLSAgPC94c2w6dGVtcGxhdGU+DQotDQotICA8IS0tIEhhbmRsZSBtZXRhZGF0YSB3ZSBkbyBub3Qga25vdyBhYm91dCBieSBsZXR0aW5nIGl0IHRocm91Z2guICBDdXJyZW50bHksDQotICAganVzdCBmb3IgcHJvcGVydHktZXh0ZW5zaW9uIGFuZCBjb21wb25lbnQtbWV0YWRhdGEsIGJ1dCBzaG91bGQgYmUgZ2xvYmFsLg0KLSAgIFNlZSBKSVJBIGlzc3VlcyBBREZGQUNFUy0zNTgsIEFERkZBQ0VTLTM2MSBhbmQgQURGRkFDRVMtNDcyIC0tPg0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iamF2YWVlOnByb3BlcnR5LWV4dGVuc2lvbi8qW25hbWVzcGFjZS11cmkoKSAhPSAnaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlJyBhbmQgbmFtZXNwYWNlLXVyaSgpICE9J2h0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvbWF2ZW4tZmFjZXMtcGx1Z2luJ10iPg0KLSAgICA8eHNsOmNvcHk+DQotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJAKnxub2RlKCkiLz4NCi0gICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0idGV4dCgpIi8+DQotICAgIDwveHNsOmNvcHk+IA0KLSAgPC94c2w6dGVtcGxhdGU+DQotDQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJtZnA6Y29tcG9uZW50LW1ldGFkYXRhLypbbmFtZXNwYWNlLXVyaSgpICE9ICdodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUnIGFuZCBuYW1lc3BhY2UtdXJpKCkgIT0naHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9tYXZlbi1mYWNlcy1wbHVnaW4nXSI+DQotICAgIDx4c2w6Y29weT4NCi0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9IkAqfG5vZGUoKSIvPg0KLSAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ0ZXh0KCkiLz4NCi0gICAgPC94c2w6Y29weT4gDQotICA8L3hzbDp0ZW1wbGF0ZT4NCi0NCi0NCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vbWZwOmNvbXBvbmVudC1tZXRhZGF0YS9tZnA6Z3JvdXAiID4NCi08IS0tIERpc2FibGUgY29tcG9uZW50IGdyb3VwcyBmb3Igbm93DQotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJncm91cCIgPg0KLSAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ0ZXh0KCkiIC8+DQotICAgIDwveHNsOmVsZW1lbnQ+DQotLS0+DQotICA8L3hzbDp0ZW1wbGF0ZT4NCi0NCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vbWZwOnByb3BlcnR5LW1ldGFkYXRhL21mcDpncm91cCIgPg0KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0iZ3JvdXAiID4NCi0gICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0idGV4dCgpIiAvPg0KLSAgICA8L3hzbDplbGVtZW50Pg0KLSAgPC94c2w6dGVtcGxhdGU+DQotDQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL21mcDpwcm9wZXJ0eS1tZXRhZGF0YS9tZnA6dHJhbnNsYXRhYmxlIiA+DQotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJ0cmFuc2xhdGFibGUiID4NCi0gICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0idGV4dCgpIiAvPg0KLSAgICA8L3hzbDplbGVtZW50Pg0KLSAgPC94c2w6dGVtcGxhdGU+DQotICANCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vbWZwOmFjY2VwdHMtY2hpbGQtY29tcG9uZW50cyIgPg0KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0iYWNjZXB0cy1jaGlsZC1jb21wb25lbnRzIiA+DQotICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InRleHQoKSIgLz4NCi0gICAgPC94c2w6ZWxlbWVudD4NCi0gIDwveHNsOnRlbXBsYXRlPg0KLQ0KLQ0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9tZnA6cHJvcGVydHktZWRpdG9yIiA+DQotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eS1lZGl0b3IiID4NCi0gICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0idGV4dCgpIiAvPg0KLSAgICA8L3hzbDplbGVtZW50Pg0KLSAgPC94c2w6dGVtcGxhdGU+DQotDQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL21mcDpleHBlcnQiID4NCi0gICAgPHhzbDplbGVtZW50IG5hbWU9ImV4cGVydCIgPg0KLSAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ0ZXh0KCkiIC8+DQotICAgIDwveHNsOmVsZW1lbnQ+DQotICA8L3hzbDp0ZW1wbGF0ZT4NCi0NCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vbWZwOnByZWZlcnJlZC1jaGlsZHJlbiIgPg0KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0icHJlZmVycmVkLWNoaWxkcmVuIiA+DQotICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InRleHQoKSIgLz4NCi0gICAgPC94c2w6ZWxlbWVudD4NCi0gIDwveHNsOnRlbXBsYXRlPg0KLQ0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9tZnA6YWxsb3dhYmxlLWNoaWxkcmVuIiA+DQotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJhbGxvd2FibGUtY2hpbGRyZW4iID4NCi0gICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0idGV4dCgpIiAvPg0KLSAgICA8L3hzbDplbGVtZW50Pg0KLSAgPC94c2w6dGVtcGxhdGU+DQotDQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL21mcDpwcmVmZXJyZWQiID4NCi0gICAgPHhzbDplbGVtZW50IG5hbWU9InByZWZlcnJlZCIgPg0KLSAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ0ZXh0KCkiIC8+DQotICAgIDwveHNsOmVsZW1lbnQ+DQotICA8L3hzbDp0ZW1wbGF0ZT4NCi0NCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vbWZwOmRlcHJlY2F0ZWQiID4NCi0gICAgPHhzbDplbGVtZW50IG5hbWU9ImRlcHJlY2F0ZWQiID4NCi0gICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0idGV4dCgpIiAvPg0KLSAgICA8L3hzbDplbGVtZW50Pg0KLSAgPC94c2w6dGVtcGxhdGU+DQotDQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL21mcDppbml0aWFsLXZhbHVlIiA+DQotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJpbml0aWFsLXZhbHVlIiA+DQotICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InRleHQoKSIgLz4NCi0gICAgPC94c2w6ZWxlbWVudD4NCi0gIDwveHNsOnRlbXBsYXRlPg0KLQ0KLTwveHNsOnN0eWxlc2hlZXQ+DQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvcmVzb3VyY2VzL3RyYW5zZm9ybTEyLnhzbCBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL3Jlc291cmNlcy90cmFuc2Zvcm0xMi54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwOTE2ZWYuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvcmVzb3VyY2VzL3RyYW5zZm9ybTEyLnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDkwNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiID8+Ci08IS0tCi0gICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICAgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICAgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gICAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICAgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gICAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gICAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gICAgdW5kZXIgdGhlIExpY2Vuc2UuCi0JICAgCi0tLT4KLTx4c2w6c3R5bGVzaGVldCB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIgotICAgICAgICAgICAgICAgIHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIiAKLSAgICAgICAgICAgICAgICB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICAgICAgICAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICAgICAgICAgICAgICB4bWxuczpqYXZhZWU9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIKLSAgICAgICAgICAgICAgICB4bWxuczptZnA9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvbWF2ZW4tZmFjZXMtcGx1Z2luIiAKLSAgICAgICAgICAgICAgICBleGNsdWRlLXJlc3VsdC1wcmVmaXhlcz0ieHNsIHhzIGphdmFlZSBtZnAiCi0gICAgICAgICAgICAgICAgdmVyc2lvbj0iMS4wIiA+Ci0KLSAgPHhzbDpvdXRwdXQgbWV0aG9kPSJ4bWwiIGluZGVudD0ieWVzIi8+Ci0gIDx4c2w6cGFyYW0gbmFtZT0icGFja2FnZUNvbnRhaW5zIiAvPgotICA8eHNsOnBhcmFtIG5hbWU9ImNvbnZlcnRlclBhY2thZ2VDb250YWlucyIgLz4KLSAgPHhzbDpwYXJhbSBuYW1lPSJ2YWxpZGF0b3JQYWNrYWdlQ29udGFpbnMiIC8+Ci0gIDx4c2w6cGFyYW0gbmFtZT0idHlwZVByZWZpeCIgLz4KLSAgPHhzbDpwYXJhbSBuYW1lPSJyZW1vdmVSZW5kZXJlcnMiIC8+Ci0KLQotCi0gIDx4c2w6a2V5IG5hbWU9ImNvbXBvbmVudC10eXBlIiAKLSAgICAgICAgICAgbWF0Y2g9ImphdmFlZTpjb21wb25lbnQiIAotICAgICAgICAgICB1c2U9ImphdmFlZTpjb21wb25lbnQtdHlwZS90ZXh0KCkiIC8+Ci0KLSAgPHhzbDprZXkgbmFtZT0icmVuZGVyLWtpdC1pZCIgCi0gICAgICAgICAgIG1hdGNoPSJqYXZhZWU6cmVuZGVyLWtpdCIgCi0gICAgICAgICAgIHVzZT0iamF2YWVlOnJlbmRlci1raXQtaWQvdGV4dCgpIiAvPgotCi0gIDwhLS0gc3dpdGNoIG9mZiBkZWZhdWx0IHRleHQgcHJvY2Vzc2luZyAtLT4gIAotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL3RleHQoKSIgLz4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvamF2YWVlOmZhY2VzLWNvbmZpZyIgPgotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJmYWNlcy1jb25maWciCi0gICAgICAgICAgICAgICAgIG5hbWVzcGFjZT0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIiA+Ci0gICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJ4c2k6c2NoZW1hTG9jYXRpb24iPmh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvd2ViLWZhY2VzY29uZmlnXzFfMi54c2Q8L3hzbDphdHRyaWJ1dGU+Ci0gICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJ2ZXJzaW9uIj4xLjI8L3hzbDphdHRyaWJ1dGU+Ci0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9ImphdmFlZTphcHBsaWNhdGlvbiIgLz4KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iamF2YWVlOmZhY3RvcnkiIC8+Ci0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9ImphdmFlZTpjb21wb25lbnRbbm90KGNvbnRhaW5zKGphdmFlZTpjb21wb25lbnQtZXh0ZW5zaW9uL21mcDpjb21wb25lbnQtY2xhc3MtbW9kaWZpZXIvdGV4dCgpLCAnYWJzdHJhY3QnKSkgYW5kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRzLXdpdGgoamF2YWVlOmNvbXBvbmVudC10eXBlLCAkdHlwZVByZWZpeCldIiAvPgotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJqYXZhZWU6Y29udmVydGVyW2NvbnRhaW5zKGphdmFlZTpjb252ZXJ0ZXItY2xhc3MsICRjb252ZXJ0ZXJQYWNrYWdlQ29udGFpbnMpXSIgLz4KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iamF2YWVlOm1hbmFnZWQtYmVhbltjb250YWlucyhqYXZhZWU6bWFuYWdlZC1iZWFuLWNsYXNzLCAkcGFja2FnZUNvbnRhaW5zKV0iIC8+Ci0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9ImphdmFlZTpuYXZpZ2F0aW9uLXJ1bGUiIC8+Ci0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9ImphdmFlZTpyZWZlcmVuY2VkLWJlYW4iIC8+Ci0gICAgICA8IS0tIG1lcmdlIHRoZSByZW5kZXIta2l0cyB0b2dldGhlciAtLT4KLSAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJqYXZhZWU6cmVuZGVyLWtpdFtjb250YWlucyhqYXZhZWU6cmVuZGVyLWtpdC1jbGFzcywgJHBhY2thZ2VDb250YWlucyldIiA+Ci0gICAgICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJyZW5kZXIta2l0IiA+Ci0gICAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJqYXZhZWU6ZGVzY3JpcHRpb24iIC8+Ci0gICAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJqYXZhZWU6ZGlzcGxheS1uYW1lIiAvPgotICAgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iamF2YWVlOmljb24iIC8+Ci0gICAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJqYXZhZWU6cmVuZGVyLWtpdC1pZCIgLz4KLSAgICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9ImphdmFlZTpyZW5kZXIta2l0LWNsYXNzIiAvPgotICAgICAgICAgIDwhLS0gRHJvcCByZW5kZXJlcnMgaWYgZGVzaXJlZCAtLT4KLSAgICAgICAgICA8eHNsOmlmIHRlc3Q9IiRyZW1vdmVSZW5kZXJlcnMgIT0gJ3RydWUnIj4KLSAgICAgICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJrZXkoJ3JlbmRlci1raXQtaWQnLCBqYXZhZWU6cmVuZGVyLWtpdC1pZC90ZXh0KCkpIiA+Ci0gICAgICAgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iamF2YWVlOnJlbmRlcmVyW2NvbnRhaW5zKGphdmFlZTpyZW5kZXJlci1jbGFzcywgJHBhY2thZ2VDb250YWlucyldIiAvPgotICAgICAgICAgICAgPC94c2w6Zm9yLWVhY2g+Ci0gICAgICAgICAgPC94c2w6aWY+Ci0gICAgICAgIDwveHNsOmVsZW1lbnQ+Ci0gICAgICA8L3hzbDpmb3ItZWFjaD4KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iamF2YWVlOmxpZmVjeWNsZVtjb250YWlucyhqYXZhZWU6cGhhc2UtbGlzdGVuZXIsICRwYWNrYWdlQ29udGFpbnMpXSIgLz4KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iamF2YWVlOnZhbGlkYXRvcltjb250YWlucyhqYXZhZWU6dmFsaWRhdG9yLWNsYXNzLCAkdmFsaWRhdG9yUGFja2FnZUNvbnRhaW5zKV0iIC8+Ci0gICAgPC94c2w6ZWxlbWVudD4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgPCEtLSB0aGlzIHRlbXBsYXRlcyBhcHBsaWVzIGphdmFlZTpwcm9wZXJ0eSB0ZW1wbGF0ZXMKLSAgICAgICBmb3IgYSBjb21wb25lbnQgYW5kIGFsbCBzdXBlcnR5cGVzIC0tPgotICA8eHNsOnRlbXBsYXRlIG5hbWU9ImFwcGx5LXByb3BlcnR5LXRlbXBsYXRlcyIgPgotICAgIDx4c2w6cGFyYW0gbmFtZT0iY29tcG9uZW50IiAvPgotICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iY29tcG9uZW50U3VwZXJ0eXBlIgotICAgICAgICAgICAgICAgICAgc2VsZWN0PSIkY29tcG9uZW50L2phdmFlZTpjb21wb25lbnQtZXh0ZW5zaW9uL21mcDpjb21wb25lbnQtc3VwZXJ0eXBlL3RleHQoKSIgLz4KLSAgICA8eHNsOmlmIHRlc3Q9IiRjb21wb25lbnRTdXBlcnR5cGUiID4KLSAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhcHBseS1wcm9wZXJ0eS10ZW1wbGF0ZXMiID4KLSAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImNvbXBvbmVudCIgCi0gICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Q9ImtleSgnY29tcG9uZW50LXR5cGUnLCAkY29tcG9uZW50U3VwZXJ0eXBlKSIgLz4KLSAgICAgIDwveHNsOmNhbGwtdGVtcGxhdGU+Ci0gICAgPC94c2w6aWY+Ci0gICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSIkY29tcG9uZW50L2phdmFlZTpwcm9wZXJ0eSIgLz4KLSAgPC94c2w6dGVtcGxhdGU+Ci0gIAotICA8IS0tIHRoaXMgdGVtcGxhdGVzIGFwcGxpZXMgamF2YWVlOmF0dHJpYnV0ZSB0ZW1wbGF0ZXMKLSAgICAgICBmb3IgYSBjb21wb25lbnQgYW5kIGFsbCBzdXBlcnR5cGVzIC0tPgotICA8eHNsOnRlbXBsYXRlIG5hbWU9ImFwcGx5LWF0dHJpYnV0ZS10ZW1wbGF0ZXMiID4KLSAgICA8eHNsOnBhcmFtIG5hbWU9ImNvbXBvbmVudCIgLz4KLSAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImNvbXBvbmVudFN1cGVydHlwZSIKLSAgICAgICAgICAgICAgICAgIHNlbGVjdD0iJGNvbXBvbmVudC9qYXZhZWU6Y29tcG9uZW50LWV4dGVuc2lvbi9tZnA6Y29tcG9uZW50LXN1cGVydHlwZS90ZXh0KCkiIC8+Ci0gICAgPHhzbDppZiB0ZXN0PSIkY29tcG9uZW50U3VwZXJ0eXBlIiA+Ci0gICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYXBwbHktYXR0cmlidXRlLXRlbXBsYXRlcyIgPgotICAgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0iY29tcG9uZW50IgotICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0PSJrZXkoJ2NvbXBvbmVudC10eXBlJywgJGNvbXBvbmVudFN1cGVydHlwZSkiIC8+Ci0gICAgICA8L3hzbDpjYWxsLXRlbXBsYXRlPgotICAgIDwveHNsOmlmPgotICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iJGNvbXBvbmVudC9qYXZhZWU6YXR0cmlidXRlIiAvPgotICA8L3hzbDp0ZW1wbGF0ZT4KLSAgCi0gIDwhLS0gdGhpcyB0ZW1wbGF0ZXMgYXBwbGllcyBqYXZhZWU6ZmFjZXQgdGVtcGxhdGVzCi0gICAgICAgZm9yIGEgY29tcG9uZW50IGFuZCBhbGwgc3VwZXJ0eXBlcyAtLT4KLSAgPHhzbDp0ZW1wbGF0ZSBuYW1lPSJhcHBseS1mYWNldC10ZW1wbGF0ZXMiID4KLSAgICA8eHNsOnBhcmFtIG5hbWU9ImNvbXBvbmVudCIgLz4KLSAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImNvbXBvbmVudFN1cGVydHlwZSIKLSAgICAgICAgICAgICAgICAgIHNlbGVjdD0iJGNvbXBvbmVudC9qYXZhZWU6Y29tcG9uZW50LWV4dGVuc2lvbi9tZnA6Y29tcG9uZW50LXN1cGVydHlwZS90ZXh0KCkiIC8+Ci0gICAgPHhzbDppZiB0ZXN0PSIkY29tcG9uZW50U3VwZXJ0eXBlIiA+Ci0gICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYXBwbHktZmFjZXQtdGVtcGxhdGVzIiA+Ci0gICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJjb21wb25lbnQiCi0gICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Q9ImtleSgnY29tcG9uZW50LXR5cGUnLCAkY29tcG9uZW50U3VwZXJ0eXBlKSIgLz4KLSAgICAgIDwveHNsOmNhbGwtdGVtcGxhdGU+Ci0gICAgPC94c2w6aWY+Ci0gICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSIkY29tcG9uZW50L2phdmFlZTpmYWNldCIgLz4KLSAgPC94c2w6dGVtcGxhdGU+Ci0gIAotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL2phdmFlZTpjb21wb25lbnRbamF2YWVlOmNvbXBvbmVudC1leHRlbnNpb24vbWZwOmNvbXBvbmVudC1zdXBlcnR5cGVdIiAKLSAgICAgICAgICAgICAgICBwcmlvcml0eT0iMSIgPgotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJjb21wb25lbnQiID4KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iamF2YWVlOmRlc2NyaXB0aW9uIiAvPgotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJqYXZhZWU6ZGlzcGxheS1uYW1lIiAvPgotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJqYXZhZWU6aWNvbiIgLz4KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iamF2YWVlOmNvbXBvbmVudC10eXBlIiAvPgotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJqYXZhZWU6Y29tcG9uZW50LWNsYXNzIiAvPgotICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFwcGx5LWZhY2V0LXRlbXBsYXRlcyIgPgotICAgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0iY29tcG9uZW50IiBzZWxlY3Q9Ii4iIC8+Ci0gICAgICA8L3hzbDpjYWxsLXRlbXBsYXRlPgotICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFwcGx5LWF0dHJpYnV0ZS10ZW1wbGF0ZXMiID4KLSAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImNvbXBvbmVudCIgc2VsZWN0PSIuIiAvPgotICAgICAgPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLSAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhcHBseS1wcm9wZXJ0eS10ZW1wbGF0ZXMiID4KLSAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImNvbXBvbmVudCIgc2VsZWN0PSIuIiAvPgotICAgICAgPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iamF2YWVlOmNvbXBvbmVudC1leHRlbnNpb24iIC8+Ci0gICAgPC94c2w6ZWxlbWVudD4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9qYXZhZWU6YXBwbGljYXRpb24iID4KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0iYXBwbGljYXRpb24iID4KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iamF2YWVlOmFjdGlvbi1saXN0ZW5lcltjb250YWlucyh0ZXh0KCksICRwYWNrYWdlQ29udGFpbnMpXSIgLz4KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iamF2YWVlOmRlZmF1bHQtcmVuZGVyLWtpdC1pZCIgLz4KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iamF2YWVlOm1lc3NhZ2UtYnVuZGxlW2NvbnRhaW5zKHRleHQoKSwgJHBhY2thZ2VDb250YWlucyldIiAvPgotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJqYXZhZWU6dmlldy1oYW5kbGVyW2NvbnRhaW5zKHRleHQoKSwgJHBhY2thZ2VDb250YWlucyldIiAvPgotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJqYXZhZWU6c3RhdGUtbWFuYWdlcltjb250YWlucyh0ZXh0KCksICRwYWNrYWdlQ29udGFpbnMpXSIgLz4KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iamF2YWVlOm5hdmlnYXRpb24taGFuZGxlcltjb250YWlucyh0ZXh0KCksICRwYWNrYWdlQ29udGFpbnMpXSIgLz4KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iamF2YWVlOmVsLXJlc29sdmVyW2NvbnRhaW5zKHRleHQoKSwgJHBhY2thZ2VDb250YWlucyldIiAvPgotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJqYXZhZWU6cHJvcGVydHktcmVzb2x2ZXJbY29udGFpbnModGV4dCgpLCAkcGFja2FnZUNvbnRhaW5zKV0iIC8+Ci0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9ImphdmFlZTp2YXJpYWJsZS1yZXNvbHZlcltjb250YWlucyh0ZXh0KCksICRwYWNrYWdlQ29udGFpbnMpXSIgLz4KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iamF2YWVlOmxvY2FsZS1jb25maWciIC8+Ci0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9ImphdmFlZTpyZXNvdXJjZS1idW5kbGUiIC8+Ci0gICAgPC94c2w6ZWxlbWVudD4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9qYXZhZWU6YWN0aW9uLWxpc3RlbmVyIiA+Ci0gICAgPHhzbDplbGVtZW50IG5hbWU9ImFjdGlvbi1saXN0ZW5lciIgPgotICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InRleHQoKSIgLz4KLSAgICA8L3hzbDplbGVtZW50PgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL2phdmFlZTpkZWZhdWx0LXJlbmRlci1raXQtaWQiID4KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0iZGVmYXVsdC1yZW5kZXIta2l0LWlkIiA+Ci0gICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0idGV4dCgpIiAvPgotICAgIDwveHNsOmVsZW1lbnQ+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vamF2YWVlOm1lc3NhZ2UtYnVuZGxlIiA+Ci0gICAgPHhzbDplbGVtZW50IG5hbWU9Im1lc3NhZ2UtYnVuZGxlIiA+Ci0gICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0idGV4dCgpIiAvPgotICAgIDwveHNsOmVsZW1lbnQ+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vamF2YWVlOm5hdmlnYXRpb24taGFuZGxlciIgPgotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJuYXZpZ2F0aW9uLWhhbmRsZXIiID4KLSAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ0ZXh0KCkiIC8+Ci0gICAgPC94c2w6ZWxlbWVudD4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9qYXZhZWU6dmlldy1oYW5kbGVyIiA+Ci0gICAgPHhzbDplbGVtZW50IG5hbWU9InZpZXctaGFuZGxlciIgPgotICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InRleHQoKSIgLz4KLSAgICA8L3hzbDplbGVtZW50PgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL2phdmFlZTpzdGF0ZS1tYW5hZ2VyIiA+Ci0gICAgPHhzbDplbGVtZW50IG5hbWU9InN0YXRlLW1hbmFnZXIiID4KLSAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ0ZXh0KCkiIC8+Ci0gICAgPC94c2w6ZWxlbWVudD4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9qYXZhZWU6ZWwtcmVzb2x2ZXIiID4KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0iZWwtcmVzb2x2ZXIiID4KLSAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ0ZXh0KCkiIC8+Ci0gICAgPC94c2w6ZWxlbWVudD4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9qYXZhZWU6cHJvcGVydHktcmVzb2x2ZXIiID4KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0icHJvcGVydHktcmVzb2x2ZXIiID4KLSAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ0ZXh0KCkiIC8+Ci0gICAgPC94c2w6ZWxlbWVudD4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9qYXZhZWU6dmFyaWFibGUtcmVzb2x2ZXIiID4KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0idmFyaWFibGUtcmVzb2x2ZXIiID4KLSAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ0ZXh0KCkiIC8+Ci0gICAgPC94c2w6ZWxlbWVudD4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9qYXZhZWU6bG9jYWxlLWNvbmZpZyIgPgotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJsb2NhbGUtY29uZmlnIiA+Ci0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyAvPgotICAgIDwveHNsOmVsZW1lbnQ+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vamF2YWVlOmZhY3RvcnkiID4KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0iZmFjdG9yeSIgPgotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJqYXZhZWU6YXBwbGljYXRpb24tZmFjdG9yeVtjb250YWlucyh0ZXh0KCksICRwYWNrYWdlQ29udGFpbnMpXSIgLz4KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iamF2YWVlOmZhY2VzLWNvbnRleHQtZmFjdG9yeVtjb250YWlucyh0ZXh0KCksICRwYWNrYWdlQ29udGFpbnMpXSIgLz4KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iamF2YWVlOmxpZmVjeWNsZS1mYWN0b3J5W2NvbnRhaW5zKHRleHQoKSwgJHBhY2thZ2VDb250YWlucyldIiAvPgotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJqYXZhZWU6cmVuZGVyLWtpdC1mYWN0b3J5W2NvbnRhaW5zKHRleHQoKSwgJHBhY2thZ2VDb250YWlucyldIiAvPgotICAgIDwveHNsOmVsZW1lbnQ+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vamF2YWVlOmFwcGxpY2F0aW9uLWZhY3RvcnkiID4KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0iYXBwbGljYXRpb24tZmFjdG9yeSIgPgotICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InRleHQoKSIgLz4KLSAgICA8L3hzbDplbGVtZW50PgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL2phdmFlZTpmYWNlcy1jb250ZXh0LWZhY3RvcnkiID4KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0iZmFjZXMtY29udGV4dC1mYWN0b3J5IiA+Ci0gICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0idGV4dCgpIiAvPgotICAgIDwveHNsOmVsZW1lbnQ+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vamF2YWVlOmxpZmVjeWNsZS1mYWN0b3J5IiA+Ci0gICAgPHhzbDplbGVtZW50IG5hbWU9ImxpZmVjeWNsZS1mYWN0b3J5IiA+Ci0gICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0idGV4dCgpIiAvPgotICAgIDwveHNsOmVsZW1lbnQ+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vamF2YWVlOnJlbmRlci1raXQtZmFjdG9yeSIgPgotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJyZW5kZXIta2l0LWZhY3RvcnkiID4KLSAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ0ZXh0KCkiIC8+Ci0gICAgPC94c2w6ZWxlbWVudD4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9qYXZhZWU6Y29tcG9uZW50IiA+Ci0gICAgPHhzbDplbGVtZW50IG5hbWU9ImNvbXBvbmVudCIgPgotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgLz4KLSAgICA8L3hzbDplbGVtZW50PgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL2phdmFlZTpjb21wb25lbnQtdHlwZSIgPgotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJjb21wb25lbnQtdHlwZSIgPgotICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InRleHQoKSIgLz4KLSAgICA8L3hzbDplbGVtZW50PgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL2phdmFlZTpjb21wb25lbnQtY2xhc3MiID4KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0iY29tcG9uZW50LWNsYXNzIiA+Ci0gICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0idGV4dCgpIiAvPgotICAgIDwveHNsOmVsZW1lbnQ+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vamF2YWVlOmNvbXBvbmVudC9qYXZhZWU6ZmFjZXRbMV0iIHByaW9yaXR5PSIxIiA+Ci0gICAgPHhzbDpjb21tZW50Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJwYXJlbnQ6Om5vZGUoKS9qYXZhZWU6Y29tcG9uZW50LXR5cGUvdGV4dCgpIiAvPiBmYWNldHM8L3hzbDpjb21tZW50PgotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJmYWNldCIgPgotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMvPgotICAgIDwveHNsOmVsZW1lbnQ+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vamF2YWVlOmZhY2V0IiA+Ci0gICAgPHhzbDplbGVtZW50IG5hbWU9ImZhY2V0IiA+Ci0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcy8+Ci0gICAgPC94c2w6ZWxlbWVudD4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9qYXZhZWU6ZmFjZXQtbmFtZSIgPgotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJmYWNldC1uYW1lIiA+Ci0gICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0idGV4dCgpIiAvPgotICAgIDwveHNsOmVsZW1lbnQ+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vamF2YWVlOmZhY2V0LWV4dGVuc2lvblttZnA6ZmFjZXQtbWV0YWRhdGF8bWZwOmFsbG93YWJsZS1jaGlsZHJlbnxtZnA6cHJlZmVycmVkLWNoaWxkcmVufG1mcDpwcmVmZXJyZWR8bWZwOnVuc3VwcG9ydGVkLWFnZW50c3xtZnA6ZGVwcmVjYXRlZF0iID4KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0iZmFjZXQtZXh0ZW5zaW9uIiA+Ci0gICAgICA8eHNsOmVsZW1lbnQgbmFtZT0iZmFjZXQtbWV0YWRhdGEiID4KLSAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMvPgotICAgICAgPC94c2w6ZWxlbWVudD4KLSAgICA8L3hzbDplbGVtZW50PgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotICAKLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9qYXZhZWU6Y29tcG9uZW50L2phdmFlZTphdHRyaWJ1dGVbMV0iIHByaW9yaXR5PSIxIiA+Ci0gICAgPHhzbDpjb21tZW50Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJwYXJlbnQ6Om5vZGUoKS9qYXZhZWU6Y29tcG9uZW50LXR5cGUvdGV4dCgpIiAvPiBhdHRyaWJ1dGVzPC94c2w6Y29tbWVudD4KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0iYXR0cmlidXRlIiA+Ci0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcy8+Ci0gICAgPC94c2w6ZWxlbWVudD4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9qYXZhZWU6Y29tcG9uZW50L2phdmFlZTphdHRyaWJ1dGVbMV0iIHByaW9yaXR5PSIxIiA+Ci0gICAgPHhzbDpjb21tZW50Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJwYXJlbnQ6Om5vZGUoKS9qYXZhZWU6Y29tcG9uZW50LXR5cGUvdGV4dCgpIiAvPiBhdHRyaWJ1dGVzPC94c2w6Y29tbWVudD4KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0iYXR0cmlidXRlIiA+Ci0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcy8+Ci0gICAgPC94c2w6ZWxlbWVudD4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9qYXZhZWU6YXR0cmlidXRlIiA+Ci0gICAgPHhzbDplbGVtZW50IG5hbWU9ImF0dHJpYnV0ZSIgPgotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMvPgotICAgIDwveHNsOmVsZW1lbnQ+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vamF2YWVlOmF0dHJpYnV0ZS1uYW1lIiA+Ci0gICAgPHhzbDplbGVtZW50IG5hbWU9ImF0dHJpYnV0ZS1uYW1lIiA+Ci0gICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0idGV4dCgpIiAvPgotICAgIDwveHNsOmVsZW1lbnQ+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vamF2YWVlOmF0dHJpYnV0ZS1jbGFzcyIgPgotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJhdHRyaWJ1dGUtY2xhc3MiID4KLSAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ0ZXh0KCkiIC8+Ci0gICAgPC94c2w6ZWxlbWVudD4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9qYXZhZWU6YXR0cmlidXRlLWV4dGVuc2lvbiIgPgotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJhdHRyaWJ1dGUtZXh0ZW5zaW9uIiA+Ci0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyAvPgotICAgIDwveHNsOmVsZW1lbnQ+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vamF2YWVlOmNvbXBvbmVudC9qYXZhZWU6cHJvcGVydHlbMV0iIHByaW9yaXR5PSIxIiA+Ci0gICAgPHhzbDpjb21tZW50Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJwYXJlbnQ6Om5vZGUoKS9qYXZhZWU6Y29tcG9uZW50LXR5cGUvdGV4dCgpIiAvPiBwcm9wZXJ0aWVzPC94c2w6Y29tbWVudD4KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiID4KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzLz4KLSAgICA8L3hzbDplbGVtZW50PgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL2phdmFlZTpwcm9wZXJ0eVtqYXZhZWU6cHJvcGVydHktbmFtZS90ZXh0KCkgPSAnYmluZGluZyddIiBwcmlvcml0eT0nMicgPgotICAgIDwhLS0gc2tpcCBvdmVyIHByb3BlcnRpZXMgbmFtZWQgJ2JpbmRpbmcnIC0tPgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL2phdmFlZTpwcm9wZXJ0eSIgPgotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eSIgPgotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMvPgotICAgIDwveHNsOmVsZW1lbnQ+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vamF2YWVlOnByb3BlcnR5LW5hbWUiID4KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0icHJvcGVydHktbmFtZSIgPgotICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InRleHQoKSIgLz4KLSAgICA8L3hzbDplbGVtZW50PgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL2phdmFlZTpwcm9wZXJ0eS1jbGFzcyIgPgotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eS1jbGFzcyIgPgotICAgICAgPCEtLSBlbGltaW5hdGUgZ2VuZXJpY3MgZm9yIDEuNC1iYXNlZCBjbGFzc2VzIGluIEpTRiAxLjEgLS0+Ci0gICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgPHhzbDp3aGVuIHRlc3Q9ImNvbnRhaW5zKHRleHQoKSwgJyZsdDsnKSIgPgotICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJzdWJzdHJpbmctYmVmb3JlKHRleHQoKSwgJyZsdDsnKSIgLz4KLSAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgPHhzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InRleHQoKSIgLz4KLSAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgICAgPC94c2w6Y2hvb3NlPgotICAgIDwveHNsOmVsZW1lbnQ+Ci0gIDwveHNsOnRlbXBsYXRlPgotICAKLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9qYXZhZWU6cHJvcGVydHktZXh0ZW5zaW9uW21mcDpwcm9wZXJ0eS12YWx1ZXN8bWZwOmdyb3VwfG1mcDp0cmFuc2xhdGFibGV8bWZwOnByb3BlcnR5LWVkaXRvcnxtZnA6ZXhwZXJ0fG1mcDp1bnN1cHBvcnRlZC1hZ2VudHN8KltuYW1lc3BhY2UtdXJpKCkgIT0gJ2h0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZScgYW5kIG5hbWVzcGFjZS11cmkoKSAhPSdodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL21hdmVuLWZhY2VzLXBsdWdpbiddXSIgPgotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eS1leHRlbnNpb24iID4KLSAgICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eS1tZXRhZGF0YSIgPgotICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcy8+Ci0gICAgICA8L3hzbDplbGVtZW50PgotICAgIDwveHNsOmVsZW1lbnQ+Ci0gIDwveHNsOnRlbXBsYXRlPgotICAKLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9qYXZhZWU6cHJvcGVydHktZXh0ZW5zaW9uW21mcDpwcm9wZXJ0eS1tZXRhZGF0YV0iIHByaW9yaXR5PSIxIiA+Ci0gICAgPHhzbDplbGVtZW50IG5hbWU9InByb3BlcnR5LWV4dGVuc2lvbiIgPgotICAgICAgPCEtLSBkbyBub3QgY29weSB0aGUgcHJvcGVydHkgdmFsdWVzLCBidXQgaW5zdGVhZCBsZXQgdGhlbSBiZSBwaWNrZWQgdXAgaW4gdGhlIHByb3BlcnR5LW1ldGFkYXRhIGVsZW1lbnQgLS0+Ci0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9IipbbmFtZSgpICE9ICdtZnA6cHJvcGVydHktdmFsdWVzJ10iIC8+Ci0gICAgPC94c2w6ZWxlbWVudD4KLSAgPC94c2w6dGVtcGxhdGU+Ci0gIAotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL21mcDpwcm9wZXJ0eS1tZXRhZGF0YSIgPgotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eS1tZXRhZGF0YSIgPgotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMvPgotICAgICAgPCEtLSBwaWNrIHVwIGFueSBwcm9wZXJ0eS12YWx1ZXMgZWxlbWVudHMgZnJvbSB0aGUgcGFyZW50IG5vZGUgLS0+Ci0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9Ii4uL21mcDpwcm9wZXJ0eS12YWx1ZXMiIC8+Ci0gICAgPC94c2w6ZWxlbWVudD4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgPCEtLSB0aGlzIHRlbXBsYXRlcyBncmFicyB0aGUgY29tcG9uZW50LWZhbWlseSBmcm9tIGFuIGFuY2VzdG9yIC0tPgotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL2phdmFlZTpjb21wb25lbnQtZXh0ZW5zaW9uW21mcDpjb21wb25lbnQtc3VwZXJ0eXBlXSIgcHJpb3JpdHk9IjEiID4KLSAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImNvbXBvbmVudFN1cGVydHlwZSIKLSAgICAgICAgICAgICAgICAgIHNlbGVjdD0ibWZwOmNvbXBvbmVudC1zdXBlcnR5cGUvdGV4dCgpIiAvPgotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJjb21wb25lbnQtZXh0ZW5zaW9uIiA+Ci0gICAgICA8eHNsOmVsZW1lbnQgbmFtZT0iY29tcG9uZW50LWZhbWlseSI+Ci0gICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJrZXkoJ2NvbXBvbmVudC10eXBlJywgJGNvbXBvbmVudFN1cGVydHlwZSkvamF2YWVlOmNvbXBvbmVudC1leHRlbnNpb24vbWZwOmNvbXBvbmVudC1mYW1pbHkvdGV4dCgpIiAvPgotICAgICAgPC94c2w6ZWxlbWVudD4KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzLz4KLSAgICA8L3hzbDplbGVtZW50PgotICA8L3hzbDp0ZW1wbGF0ZT4KLSAgCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vamF2YWVlOmNvbXBvbmVudC1leHRlbnNpb25bbWZwOmNvbXBvbmVudC1mYW1pbHldIiBwcmlvcml0eT0iMiIgPgotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJjb21wb25lbnQtZXh0ZW5zaW9uIiA+Ci0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcy8+Ci0gICAgPC94c2w6ZWxlbWVudD4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9qYXZhZWU6Y29tcG9uZW50LWV4dGVuc2lvbiIgPgotICAgIDx4c2w6Y29tbWVudD5XYXJuaW5nOiB0aGlzIGNvbXBvbmVudCBoYXMgbm8gY29tcG9uZW50LWZhbWlseSE8L3hzbDpjb21tZW50PgotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJjb21wb25lbnQtZXh0ZW5zaW9uIiA+Ci0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcy8+Ci0gICAgPC94c2w6ZWxlbWVudD4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9tZnA6Y29tcG9uZW50LW1ldGFkYXRhIiA+Ci0gICAgPHhzbDplbGVtZW50IG5hbWU9ImNvbXBvbmVudC1tZXRhZGF0YSIgPgotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMvPgotICAgIDwveHNsOmVsZW1lbnQ+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vamF2YWVlOmNvbnZlcnRlciIgPgotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJjb252ZXJ0ZXIiID4KLSAgICAgIDwhLS0geHNsOmFwcGx5LXRlbXBsYXRlcy8gVE9ETyB1c2UgdGhpcyBpbnN0ZWFkIC0tPgotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJqYXZhZWU6ZGVzY3JpcHRpb24iLz4KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iamF2YWVlOmRpc3BsYXktbmFtZSIvPgotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJqYXZhZWU6Y29udmVydGVyLWlkIi8+Ci0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9ImphdmFlZTpjb252ZXJ0ZXItZm9yLWNsYXNzIi8+Ci0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9ImphdmFlZTpjb252ZXJ0ZXItY2xhc3MiLz4KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iamF2YWVlOnByb3BlcnR5Ii8+Ci0gICAgPC94c2w6ZWxlbWVudD4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9qYXZhZWU6Y29udmVydGVyLWlkIiA+Ci0gICAgPHhzbDplbGVtZW50IG5hbWU9ImNvbnZlcnRlci1pZCIgPgotICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InRleHQoKSIgLz4KLSAgICA8L3hzbDplbGVtZW50PgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL2phdmFlZTpjb252ZXJ0ZXItZm9yLWNsYXNzIiA+Ci0gICAgPHhzbDplbGVtZW50IG5hbWU9ImNvbnZlcnRlci1mb3ItY2xhc3MiID4KLSAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ0ZXh0KCkiIC8+Ci0gICAgPC94c2w6ZWxlbWVudD4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9qYXZhZWU6Y29udmVydGVyLWNsYXNzIiA+Ci0gICAgPHhzbDplbGVtZW50IG5hbWU9ImNvbnZlcnRlci1jbGFzcyIgPgotICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InRleHQoKSIgLz4KLSAgICA8L3hzbDplbGVtZW50PgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL2phdmFlZTptYW5hZ2VkLWJlYW4iID4KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0ibWFuYWdlZC1iZWFuIiA+Ci0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyAvPgotICAgIDwveHNsOmVsZW1lbnQ+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vamF2YWVlOm1hbmFnZWQtYmVhbi1uYW1lIiA+Ci0gICAgPHhzbDplbGVtZW50IG5hbWU9Im1hbmFnZWQtYmVhbi1uYW1lIiA+Ci0gICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0idGV4dCgpIiAvPgotICAgIDwveHNsOmVsZW1lbnQ+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vamF2YWVlOm1hbmFnZWQtYmVhbi1jbGFzcyIgPgotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJtYW5hZ2VkLWJlYW4tY2xhc3MiID4KLSAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ0ZXh0KCkiIC8+Ci0gICAgPC94c2w6ZWxlbWVudD4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9qYXZhZWU6bWFuYWdlZC1iZWFuLXNjb3BlIiA+Ci0gICAgPHhzbDplbGVtZW50IG5hbWU9Im1hbmFnZWQtYmVhbi1zY29wZSIgPgotICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InRleHQoKSIgLz4KLSAgICA8L3hzbDplbGVtZW50PgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL2phdmFlZTptYW5hZ2VkLXByb3BlcnR5IiA+Ci0gICAgPHhzbDplbGVtZW50IG5hbWU9Im1hbmFnZWQtcHJvcGVydHkiID4KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIC8+Ci0gICAgPC94c2w6ZWxlbWVudD4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9qYXZhZWU6bnVsbC12YWx1ZSIgPgotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJudWxsLXZhbHVlIiA+Ci0gICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0idGV4dCgpIiAvPgotICAgIDwveHNsOmVsZW1lbnQ+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vamF2YWVlOnZhbHVlIiA+Ci0gICAgPHhzbDplbGVtZW50IG5hbWU9InZhbHVlIiA+Ci0gICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0idGV4dCgpIiAvPgotICAgIDwveHNsOmVsZW1lbnQ+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vamF2YWVlOm1hcC1lbnRyaWVzIiA+Ci0gICAgPHhzbDplbGVtZW50IG5hbWU9Im1hcC1lbnRyaWVzIiA+Ci0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyAvPgotICAgIDwveHNsOmVsZW1lbnQ+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vamF2YWVlOm1hcC1lbnRyeSIgPgotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJtYXAtZW50cnkiID4KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIC8+Ci0gICAgPC94c2w6ZWxlbWVudD4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9qYXZhZWU6a2V5IiA+Ci0gICAgPHhzbDplbGVtZW50IG5hbWU9ImtleSIgPgotICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InRleHQoKSIgLz4KLSAgICA8L3hzbDplbGVtZW50PgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL2phdmFlZTprZXktY2xhc3MiID4KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0ia2V5LWNsYXNzIiA+Ci0gICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0idGV4dCgpIiAvPgotICAgIDwveHNsOmVsZW1lbnQ+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vamF2YWVlOnZhbHVlLWNsYXNzIiA+Ci0gICAgPHhzbDplbGVtZW50IG5hbWU9InZhbHVlLWNsYXNzIiA+Ci0gICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0idGV4dCgpIiAvPgotICAgIDwveHNsOmVsZW1lbnQ+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vamF2YWVlOm1lc3NhZ2UtYnVuZGxlIiA+Ci0gICAgPHhzbDplbGVtZW50IG5hbWU9Im1lc3NhZ2UtYnVuZGxlIiA+Ci0gICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0idGV4dCgpIiAvPgotICAgIDwveHNsOmVsZW1lbnQ+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vamF2YWVlOmxpc3QtZW50cmllcyIgPgotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJsaXN0LWVudHJpZXMiID4KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIC8+Ci0gICAgPC94c2w6ZWxlbWVudD4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9qYXZhZWU6bmF2aWdhdGlvbi1ydWxlIiA+Ci0gICAgPHhzbDplbGVtZW50IG5hbWU9Im5hdmlnYXRpb24tcnVsZSIgPgotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgLz4KLSAgICA8L3hzbDplbGVtZW50PgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL2phdmFlZTpmcm9tLXZpZXctaWQiID4KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0iZnJvbS12aWV3LWlkIiA+Ci0gICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0idGV4dCgpIiAvPgotICAgIDwveHNsOmVsZW1lbnQ+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vamF2YWVlOm5hdmlnYXRpb24tY2FzZSIgPgotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJuYXZpZ2F0aW9uLWNhc2UiID4KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIC8+Ci0gICAgPC94c2w6ZWxlbWVudD4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9qYXZhZWU6ZnJvbS1hY3Rpb24iID4KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0iZnJvbS1hY3Rpb24iID4KLSAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ0ZXh0KCkiIC8+Ci0gICAgPC94c2w6ZWxlbWVudD4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9qYXZhZWU6ZnJvbS1vdXRjb21lIiA+Ci0gICAgPHhzbDplbGVtZW50IG5hbWU9ImZyb20tb3V0Y29tZSIgPgotICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InRleHQoKSIgLz4KLSAgICA8L3hzbDplbGVtZW50PgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL2phdmFlZTp0by12aWV3LWlkIiA+Ci0gICAgPHhzbDplbGVtZW50IG5hbWU9InRvLXZpZXctaWQiID4KLSAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ0ZXh0KCkiIC8+Ci0gICAgPC94c2w6ZWxlbWVudD4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9qYXZhZWU6cmVkaXJlY3QiID4KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0icmVkaXJlY3QiIC8+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vamF2YWVlOnJlZmVyZW5jZWQtYmVhbiIgPgotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJyZWZlcmVuY2VkLWJlYW4iID4KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIC8+Ci0gICAgPC94c2w6ZWxlbWVudD4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9qYXZhZWU6cmVmZXJlbmNlZC1iZWFuLW5hbWUiID4KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0icmVmZXJlbmNlZC1iZWFuLW5hbWUiID4KLSAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ0ZXh0KCkiIC8+Ci0gICAgPC94c2w6ZWxlbWVudD4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9qYXZhZWU6cmVmZXJlbmNlZC1iZWFuLWNsYXNzIiA+Ci0gICAgPHhzbDplbGVtZW50IG5hbWU9InJlZmVyZW5jZWQtYmVhbi1jbGFzcyIgPgotICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InRleHQoKSIgLz4KLSAgICA8L3hzbDplbGVtZW50PgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL2phdmFlZTpyZW5kZXIta2l0IiA+Ci0gICAgPHhzbDplbGVtZW50IG5hbWU9InJlbmRlci1raXQiID4KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIC8+Ci0gICAgPC94c2w6ZWxlbWVudD4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9qYXZhZWU6cmVuZGVyLWtpdC1pZCIgPgotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJyZW5kZXIta2l0LWlkIiA+Ci0gICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0idGV4dCgpIiAvPgotICAgIDwveHNsOmVsZW1lbnQ+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vamF2YWVlOnJlbmRlci1raXQtY2xhc3MiID4KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0icmVuZGVyLWtpdC1jbGFzcyIgPgotICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InRleHQoKSIgLz4KLSAgICA8L3hzbDplbGVtZW50PgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotPCEtLSBUT0RPOiBmbGF0dGVuIGNvbXBvbmVudCBwcm9wZXJ0aWVzIGludG8gcmVuZGVyZXIgYXMgYXR0cmlidXRlcyAtLT4KLTwhLS0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9qYXZhZWU6cmVuZGVyZXJbamF2YWVlOnJlbmRlcmVyLWV4dGVuc2lvbi9tZnA6Y29tcG9uZW50LXR5cGVdIgotICAgICAgICAgICAgICAgIHByaW9yaXR5PSIxIiA+Ci0gICAgPHhzbDplbGVtZW50IG5hbWU9InJlbmRlcmVyIiA+Ci0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9ImphdmFlZTpjb21wb25lbnQtZmFtaWx5IiAvPgotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJqYXZhZWU6cmVuZGVyZXItdHlwZSIgLz4KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iamF2YWVlOnJlbmRlcmVyLWNsYXNzIiAvPgotICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJjb21wb25lbnRUeXBlIiBzZWxlY3Q9ImphdmFlZTpyZW5kZXJlci1leHRlbnNpb24vbWZwOmNvbXBvbmVudC10eXBlL3RleHQoKSIgLz4KLSAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJrZXkoJ2NvbXBvbmVudC10eXBlJywgJGNvbXBvbmVudFR5cGUpL2phdmFlZTpwcm9wZXJ0eSIgPgotICAgICAgICA8eHNsOmVsZW1lbnQgbmFtZT0iYXR0cmlidXRlIiA+Ci0gICAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJqYXZhZWU6ZGVzY3JpcHRpb24iIC8+Ci0gICAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJqYXZhZWU6ZGlzcGxheS1uYW1lIiAvPgotICAgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iamF2YWVlOmljb24iIC8+Ci0gICAgICAgICAgPHhzbDplbGVtZW50IG5hbWU9ImF0dHJpYnV0ZS1uYW1lIiA+Ci0gICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iamF2YWVlOnByb3BlcnR5LW5hbWUiIC8+Ci0gICAgICAgICAgPC94c2w6ZWxlbWVudD4KLSAgICAgICAgICA8eHNsOmVsZW1lbnQgbmFtZT0iYXR0cmlidXRlLWNsYXNzIiA+Ci0gICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iamF2YWVlOnByb3BlcnR5LWNsYXNzIiAvPgotICAgICAgICAgIDwveHNsOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJqYXZhZWU6ZGVmYXVsdC12YWx1ZSIgLz4KLSAgICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9ImphdmFlZTpzdWdnZXN0ZWQtdmFsdWUiIC8+Ci0gICAgICAgICAgPHhzbDplbGVtZW50IG5hbWU9ImF0dHJpYnV0ZS1leHRlbnNpb24iID4KLSAgICAgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0ibWZwOnByb3BlcnR5LWV4dGVuc2lvbi8qIiAvPgotICAgICAgICAgIDwveHNsOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNsOmVsZW1lbnQ+Ci0gICAgICA8L3hzbDpmb3ItZWFjaD4KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iamF2YWVlOmF0dHJpYnV0ZSIgLz4KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iamF2YWVlOnJlbmRlcmVyLWV4dGVuc2lvbiIgLz4KLSAgICA8L3hzbDplbGVtZW50PgotICA8L3hzbDp0ZW1wbGF0ZT4KLS0tPgotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vamF2YWVlOnJlbmRlcmVyIiA+Ci0gICAgPHhzbDplbGVtZW50IG5hbWU9InJlbmRlcmVyIiA+Ci0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyAvPgotICAgIDwveHNsOmVsZW1lbnQ+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vamF2YWVlOmNvbXBvbmVudC1mYW1pbHkiID4KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0iY29tcG9uZW50LWZhbWlseSIgPgotICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InRleHQoKSIgLz4KLSAgICA8L3hzbDplbGVtZW50PgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL2phdmFlZTpyZW5kZXJlci10eXBlIiA+Ci0gICAgPHhzbDplbGVtZW50IG5hbWU9InJlbmRlcmVyLXR5cGUiID4KLSAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ0ZXh0KCkiIC8+Ci0gICAgPC94c2w6ZWxlbWVudD4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9qYXZhZWU6cmVuZGVyZXItY2xhc3MiID4KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0icmVuZGVyZXItY2xhc3MiID4KLSAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ0ZXh0KCkiIC8+Ci0gICAgPC94c2w6ZWxlbWVudD4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9qYXZhZWU6cmVuZGVyZXItZXh0ZW5zaW9uW21mcDp1bnN1cHBvcnRlZC1hZ2VudHNdIiA+Ci0gICAgPHhzbDplbGVtZW50IG5hbWU9InJlbmRlcmVyLWV4dGVuc2lvbiIgPgotICAgICAgPHhzbDplbGVtZW50IG5hbWU9InJlbmRlcmVyLW1ldGFkYXRhIiA+Ci0gICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzLz4KLSAgICAgIDwveHNsOmVsZW1lbnQ+Ci0gICAgPC94c2w6ZWxlbWVudD4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9qYXZhZWU6bGlmZWN5Y2xlIiA+Ci0gICAgPHhzbDplbGVtZW50IG5hbWU9ImxpZmVjeWNsZSIgPgotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJqYXZhZWU6cGhhc2UtbGlzdGVuZXJbY29udGFpbnModGV4dCgpLCAkcGFja2FnZUNvbnRhaW5zKV0iIC8+Ci0gICAgPC94c2w6ZWxlbWVudD4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9qYXZhZWU6cGhhc2UtbGlzdGVuZXIiID4KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0icGhhc2UtbGlzdGVuZXIiID4KLSAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ0ZXh0KCkiIC8+Ci0gICAgPC94c2w6ZWxlbWVudD4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9qYXZhZWU6ZGVmYXVsdC1sb2NhbGUiID4KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0iZGVmYXVsdC1sb2NhbGUiID4KLSAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ0ZXh0KCkiIC8+Ci0gICAgPC94c2w6ZWxlbWVudD4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9qYXZhZWU6c3VwcG9ydGVkLWxvY2FsZSIgPgotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJzdXBwb3J0ZWQtbG9jYWxlIiA+Ci0gICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0idGV4dCgpIiAvPgotICAgIDwveHNsOmVsZW1lbnQ+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vamF2YWVlOnZhbGlkYXRvciIgPgotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJ2YWxpZGF0b3IiID4KLSAgICAgIDwhLS0geHNsOmFwcGx5LXRlbXBsYXRlcy8gVE9ETyB1c2UgdGhpcyBpbnN0ZWFkIC0tPgotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJqYXZhZWU6ZGlzcGxheS1uYW1lIi8+Ci0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9ImphdmFlZTp2YWxpZGF0b3ItaWQiLz4KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iamF2YWVlOnZhbGlkYXRvci1jbGFzcyIvPgotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJqYXZhZWU6cHJvcGVydHkiLz4KLSAgICA8L3hzbDplbGVtZW50PgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL2phdmFlZTp2YWxpZGF0b3ItaWQiID4KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0idmFsaWRhdG9yLWlkIiA+Ci0gICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0idGV4dCgpIiAvPgotICAgIDwveHNsOmVsZW1lbnQ+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vamF2YWVlOnZhbGlkYXRvci1jbGFzcyIgPgotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJ2YWxpZGF0b3ItY2xhc3MiID4KLSAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ0ZXh0KCkiIC8+Ci0gICAgPC94c2w6ZWxlbWVudD4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9qYXZhZWU6ZGVzY3JpcHRpb24iID4KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iID4KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iQCoiIC8+Ci0gICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0idGV4dCgpIiAvPgotICAgIDwveHNsOmVsZW1lbnQ+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vamF2YWVlOnByb3BlcnR5W2phdmFlZTpwcm9wZXJ0eS1leHRlbnNpb24vbWZwOmxvbmctZGVzY3JpcHRpb25dL2phdmFlZTpkZXNjcmlwdGlvbiIgcHJpb3JpdHk9IjEiPgotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgPgotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSIuLi9qYXZhZWU6cHJvcGVydHktZXh0ZW5zaW9uL21mcDpsb25nLWRlc2NyaXB0aW9uL0AqIiAvPgotICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii4uL2phdmFlZTpwcm9wZXJ0eS1leHRlbnNpb24vbWZwOmxvbmctZGVzY3JpcHRpb24vdGV4dCgpIiAvPgotICAgIDwveHNsOmVsZW1lbnQ+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9qYXZhZWU6ZGVzY3JpcHRpb24vQHhtbDpsYW5nIiA+Ci0gICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0ieG1sOmxhbmciID48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHhtbDpsYW5nIiAvPjwveHNsOmF0dHJpYnV0ZT4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9qYXZhZWU6ZGlzcGxheS1uYW1lIiA+Ci0gICAgPHhzbDplbGVtZW50IG5hbWU9ImRpc3BsYXktbmFtZSIgPgotICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InRleHQoKSIgLz4KLSAgICA8L3hzbDplbGVtZW50PgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL2phdmFlZTppY29uIiA+Ci0gICAgPHhzbDplbGVtZW50IG5hbWU9Imljb24iID4KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzLz4KLSAgICA8L3hzbDplbGVtZW50PgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL2phdmFlZTpzbWFsbC1pY29uIiA+Ci0gICAgPHhzbDplbGVtZW50IG5hbWU9InNtYWxsLWljb24iID4KLSAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ0ZXh0KCkiIC8+Ci0gICAgPC94c2w6ZWxlbWVudD4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9qYXZhZWU6bGFyZ2UtaWNvbiIgPgotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJsYXJnZS1pY29uIiA+Ci0gICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0idGV4dCgpIiAvPgotICAgIDwveHNsOmVsZW1lbnQ+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vamF2YWVlOmRlZmF1bHQtdmFsdWUiID4KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0iZGVmYXVsdC12YWx1ZSIgPgotICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InRleHQoKSIgLz4KLSAgICA8L3hzbDplbGVtZW50PgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL2phdmFlZTpzdWdnZXN0ZWQtdmFsdWUiID4KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0ic3VnZ2VzdGVkLXZhbHVlIiA+Ci0gICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0idGV4dCgpIiAvPgotICAgIDwveHNsOmVsZW1lbnQ+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vbWZwOmNvbXBvbmVudC1mYW1pbHkiID4KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0iY29tcG9uZW50LWZhbWlseSIgPgotICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InRleHQoKSIgLz4KLSAgICA8L3hzbDplbGVtZW50PgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL21mcDpmYXZvcml0ZS1wcm9wZXJ0eSIgPgotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJmYXZvcml0ZS1wcm9wZXJ0eSIgPgotICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InRleHQoKSIgLz4KLSAgICA8L3hzbDplbGVtZW50PgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL21mcDpyZW5kZXJlci10eXBlIiA+Ci0gICAgPHhzbDplbGVtZW50IG5hbWU9InJlbmRlcmVyLXR5cGUiID4KLSAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ0ZXh0KCkiIC8+Ci0gICAgPC94c2w6ZWxlbWVudD4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9tZnA6cHJvcGVydHktdmFsdWVzIiA+Ci0gICAgPHhzbDplbGVtZW50IG5hbWU9ImF0dHJpYnV0ZS12YWx1ZXMiID4KLSAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ0ZXh0KCkiIC8+Ci0gICAgPC94c2w6ZWxlbWVudD4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9tZnA6dW5zdXBwb3J0ZWQtYWdlbnRzIiA+Ci0gICAgPHhzbDplbGVtZW50IG5hbWU9InVuc3VwcG9ydGVkLWFnZW50cyIgPgotICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InRleHQoKSIgLz4KLSAgICA8L3hzbDplbGVtZW50PgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotICA8IS0tIEhhbmRsZSBtZXRhZGF0YSB3ZSBkbyBub3Qga25vdyBhYm91dCBieSBsZXR0aW5nIGl0IHRocm91Z2guICBDdXJyZW50bHksCi0gICBqdXN0IGZvciBwcm9wZXJ0eS1leHRlbnNpb24gYW5kIGNvbXBvbmVudC1tZXRhZGF0YSwgYnV0IHNob3VsZCBiZSBnbG9iYWwuCi0gICBTZWUgSklSQSBpc3N1ZXMgQURGRkFDRVMtMzU4LCBBREZGQUNFUy0zNjEgYW5kIEFERkZBQ0VTLTQ3MiAtLT4KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iamF2YWVlOnByb3BlcnR5LWV4dGVuc2lvbi8qW25hbWVzcGFjZS11cmkoKSAhPSAnaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlJyBhbmQgbmFtZXNwYWNlLXVyaSgpICE9J2h0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvbWF2ZW4tZmFjZXMtcGx1Z2luJ10iPgotICAgIDx4c2w6Y29weT4KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iQCp8bm9kZSgpIi8+Ci0gICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0idGV4dCgpIi8+Ci0gICAgPC94c2w6Y29weT4gCi0gIDwveHNsOnRlbXBsYXRlPgotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Im1mcDpjb21wb25lbnQtbWV0YWRhdGEvKltuYW1lc3BhY2UtdXJpKCkgIT0gJ2h0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZScgYW5kIG5hbWVzcGFjZS11cmkoKSAhPSdodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL21hdmVuLWZhY2VzLXBsdWdpbiddIj4KLSAgICA8eHNsOmNvcHk+Ci0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9IkAqfG5vZGUoKSIvPgotICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InRleHQoKSIvPgotICAgIDwveHNsOmNvcHk+IAotICA8L3hzbDp0ZW1wbGF0ZT4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL21mcDpjb21wb25lbnQtbWV0YWRhdGEvbWZwOmdyb3VwIiA+Ci08IS0tIERpc2FibGUgY29tcG9uZW50IGdyb3VwcyBmb3Igbm93Ci0gICAgPHhzbDplbGVtZW50IG5hbWU9Imdyb3VwIiA+Ci0gICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0idGV4dCgpIiAvPgotICAgIDwveHNsOmVsZW1lbnQ+Ci0tLT4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9tZnA6cHJvcGVydHktbWV0YWRhdGEvbWZwOmdyb3VwIiA+Ci0gICAgPHhzbDplbGVtZW50IG5hbWU9Imdyb3VwIiA+Ci0gICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0idGV4dCgpIiAvPgotICAgIDwveHNsOmVsZW1lbnQ+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vbWZwOnByb3BlcnR5LW1ldGFkYXRhL21mcDp0cmFuc2xhdGFibGUiID4KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0idHJhbnNsYXRhYmxlIiA+Ci0gICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0idGV4dCgpIiAvPgotICAgIDwveHNsOmVsZW1lbnQ+Ci0gIDwveHNsOnRlbXBsYXRlPgotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL21mcDphY2NlcHRzLWNoaWxkLWNvbXBvbmVudHMiID4KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0iYWNjZXB0cy1jaGlsZC1jb21wb25lbnRzIiA+Ci0gICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0idGV4dCgpIiAvPgotICAgIDwveHNsOmVsZW1lbnQ+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9tZnA6cHJvcGVydHktZWRpdG9yIiA+Ci0gICAgPHhzbDplbGVtZW50IG5hbWU9InByb3BlcnR5LWVkaXRvciIgPgotICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InRleHQoKSIgLz4KLSAgICA8L3hzbDplbGVtZW50PgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL21mcDpleHBlcnQiID4KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0iZXhwZXJ0IiA+Ci0gICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0idGV4dCgpIiAvPgotICAgIDwveHNsOmVsZW1lbnQ+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vbWZwOnByZWZlcnJlZC1jaGlsZHJlbiIgPgotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJwcmVmZXJyZWQtY2hpbGRyZW4iID4KLSAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ0ZXh0KCkiIC8+Ci0gICAgPC94c2w6ZWxlbWVudD4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9tZnA6YWxsb3dhYmxlLWNoaWxkcmVuIiA+Ci0gICAgPHhzbDplbGVtZW50IG5hbWU9ImFsbG93YWJsZS1jaGlsZHJlbiIgPgotICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InRleHQoKSIgLz4KLSAgICA8L3hzbDplbGVtZW50PgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL21mcDpwcmVmZXJyZWQiID4KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0icHJlZmVycmVkIiA+Ci0gICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0idGV4dCgpIiAvPgotICAgIDwveHNsOmVsZW1lbnQ+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vbWZwOmRlcHJlY2F0ZWQiID4KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0iZGVwcmVjYXRlZCIgPgotICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InRleHQoKSIgLz4KLSAgICA8L3hzbDplbGVtZW50PgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL21mcDppbml0aWFsLXZhbHVlIiA+Ci0gICAgPHhzbDplbGVtZW50IG5hbWU9ImluaXRpYWwtdmFsdWUiID4KLSAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ0ZXh0KCkiIC8+Ci0gICAgPC94c2w6ZWxlbWVudD4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLTwveHNsOnN0eWxlc2hlZXQ+CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvdGVzdC9jb25mL01FVEEtSU5GL2ZhY2VzLWNvbmZpZy54bWwgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvdGVzdC9jb25mL01FVEEtSU5GL2ZhY2VzLWNvbmZpZy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkYTA0NTQuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL3Rlc3QvY29uZi9NRVRBLUlORi9mYWNlcy1jb25maWcueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTgxICswLDAgQEAKLTwhLS0NCi0gICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gICAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gICAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICAgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gICAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi0gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gICAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gICAgdW5kZXIgdGhlIExpY2Vuc2UuDQotCSAgIA0KLS0tPg0KLSAgPGFwcGxpY2F0aW9uPg0KLSAgICA8dmlldy1oYW5kbGVyPm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZGludGVybmFsLmFwcGxpY2F0aW9uLlZpZXdIYW5kbGVySW1wbDwvdmlldy1oYW5kbGVyPg0KLSAgICA8c3RhdGUtbWFuYWdlcj5vcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWRpbnRlcm5hbC5hcHBsaWNhdGlvbi5TdGF0ZU1hbmFnZXJJbXBsPC9zdGF0ZS1tYW5hZ2VyPg0KLSAgICA8bmF2aWdhdGlvbi1oYW5kbGVyPm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZGludGVybmFsLmFwcGxpY2F0aW9uLk5hdmlnYXRpb25IYW5kbGVySW1wbDwvbmF2aWdhdGlvbi1oYW5kbGVyPg0KLSAgICA8dmFyaWFibGUtcmVzb2x2ZXI+b3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkaW50ZXJuYWwuZWwuVHJpbmlkYWRWYXJpYWJsZVJlc29sdmVyPC92YXJpYWJsZS1yZXNvbHZlcj4NCi0gIDwvYXBwbGljYXRpb24+DQotDQotICA8bGlmZWN5Y2xlPg0KLSAgICA8cGhhc2UtbGlzdGVuZXI+b3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkaW50ZXJuYWwuY29udGV4dC5UcmluaWRhZFBoYXNlTGlzdGVuZXI8L3BoYXNlLWxpc3RlbmVyPg0KLSAgPC9saWZlY3ljbGU+DQotDQotICA8Y29udmVydGVyPg0KLSAgICA8Y29udmVydGVyLWlkPmphdmF4LmZhY2VzLlNob3J0PC9jb252ZXJ0ZXItaWQ+DQotICAgIDxjb252ZXJ0ZXItY2xhc3M+b3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkaW50ZXJuYWwuY29udmVydC5TaG9ydENvbnZlcnRlcjwvY29udmVydGVyLWNsYXNzPg0KLSAgPC9jb252ZXJ0ZXI+ICAgICANCi0gIDxjb252ZXJ0ZXI+DQotICAgIDxjb252ZXJ0ZXItZm9yLWNsYXNzPmphdmEubGFuZy5TaG9ydDwvY29udmVydGVyLWZvci1jbGFzcz4NCi0gICAgPGNvbnZlcnRlci1jbGFzcz5vcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWRpbnRlcm5hbC5jb252ZXJ0LlNob3J0Q29udmVydGVyPC9jb252ZXJ0ZXItY2xhc3M+DQotICA8L2NvbnZlcnRlcj4NCi0gIA0KLSAgPGNvbnZlcnRlcj4NCi0gICAgPGNvbnZlcnRlci1pZD5qYXZheC5mYWNlcy5CeXRlPC9jb252ZXJ0ZXItaWQ+DQotICAgIDxjb252ZXJ0ZXItY2xhc3M+b3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkaW50ZXJuYWwuY29udmVydC5CeXRlQ29udmVydGVyPC9jb252ZXJ0ZXItY2xhc3M+DQotICA8L2NvbnZlcnRlcj4gICAgIA0KLSAgPGNvbnZlcnRlcj4NCi0gICAgPGNvbnZlcnRlci1mb3ItY2xhc3M+amF2YS5sYW5nLkJ5dGU8L2NvbnZlcnRlci1mb3ItY2xhc3M+DQotICAgIDxjb252ZXJ0ZXItY2xhc3M+b3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkaW50ZXJuYWwuY29udmVydC5CeXRlQ29udmVydGVyPC9jb252ZXJ0ZXItY2xhc3M+DQotICA8L2NvbnZlcnRlcj4gIA0KLQ0KLSAgPGNvbnZlcnRlcj4NCi0gICAgPGNvbnZlcnRlci1pZD5qYXZheC5mYWNlcy5JbnRlZ2VyPC9jb252ZXJ0ZXItaWQ+DQotICAgIDxjb252ZXJ0ZXItY2xhc3M+b3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkaW50ZXJuYWwuY29udmVydC5JbnRlZ2VyQ29udmVydGVyPC9jb252ZXJ0ZXItY2xhc3M+DQotICA8L2NvbnZlcnRlcj4gICAgIA0KLSAgPGNvbnZlcnRlcj4NCi0gICAgPGNvbnZlcnRlci1mb3ItY2xhc3M+amF2YS5sYW5nLkludGVnZXI8L2NvbnZlcnRlci1mb3ItY2xhc3M+DQotICAgIDxjb252ZXJ0ZXItY2xhc3M+b3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkaW50ZXJuYWwuY29udmVydC5JbnRlZ2VyQ29udmVydGVyPC9jb252ZXJ0ZXItY2xhc3M+DQotICA8L2NvbnZlcnRlcj4NCi0gIA0KLSAgPGNvbnZlcnRlcj4NCi0gICAgPGNvbnZlcnRlci1pZD5qYXZheC5mYWNlcy5Mb25nPC9jb252ZXJ0ZXItaWQ+DQotICAgIDxjb252ZXJ0ZXItY2xhc3M+b3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkaW50ZXJuYWwuY29udmVydC5Mb25nQ29udmVydGVyPC9jb252ZXJ0ZXItY2xhc3M+DQotICA8L2NvbnZlcnRlcj4gICAgIA0KLSAgPGNvbnZlcnRlcj4NCi0gICAgPGNvbnZlcnRlci1mb3ItY2xhc3M+amF2YS5sYW5nLkxvbmc8L2NvbnZlcnRlci1mb3ItY2xhc3M+DQotICAgIDxjb252ZXJ0ZXItY2xhc3M+b3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkaW50ZXJuYWwuY29udmVydC5Mb25nQ29udmVydGVyPC9jb252ZXJ0ZXItY2xhc3M+DQotICA8L2NvbnZlcnRlcj4NCi0gIA0KLSAgPGNvbnZlcnRlcj4NCi0gICAgPGNvbnZlcnRlci1pZD5qYXZheC5mYWNlcy5GbG9hdDwvY29udmVydGVyLWlkPg0KLSAgICA8Y29udmVydGVyLWNsYXNzPm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZGludGVybmFsLmNvbnZlcnQuRmxvYXRDb252ZXJ0ZXI8L2NvbnZlcnRlci1jbGFzcz4NCi0gIDwvY29udmVydGVyPiAgICAgDQotICA8Y29udmVydGVyPg0KLSAgICA8Y29udmVydGVyLWZvci1jbGFzcz5qYXZhLmxhbmcuRmxvYXQ8L2NvbnZlcnRlci1mb3ItY2xhc3M+DQotICAgIDxjb252ZXJ0ZXItY2xhc3M+b3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkaW50ZXJuYWwuY29udmVydC5GbG9hdENvbnZlcnRlcjwvY29udmVydGVyLWNsYXNzPg0KLSAgPC9jb252ZXJ0ZXI+ICANCi0gIA0KLSAgPGNvbnZlcnRlcj4NCi0gICAgPGNvbnZlcnRlci1pZD5qYXZheC5mYWNlcy5Eb3VibGU8L2NvbnZlcnRlci1pZD4NCi0gICAgPGNvbnZlcnRlci1jbGFzcz5vcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWRpbnRlcm5hbC5jb252ZXJ0LkRvdWJsZUNvbnZlcnRlcjwvY29udmVydGVyLWNsYXNzPg0KLSAgPC9jb252ZXJ0ZXI+ICAgICANCi0gIDxjb252ZXJ0ZXI+DQotICAgIDxjb252ZXJ0ZXItZm9yLWNsYXNzPmphdmEubGFuZy5Eb3VibGU8L2NvbnZlcnRlci1mb3ItY2xhc3M+DQotICAgIDxjb252ZXJ0ZXItY2xhc3M+b3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkaW50ZXJuYWwuY29udmVydC5Eb3VibGVDb252ZXJ0ZXI8L2NvbnZlcnRlci1jbGFzcz4NCi0gIDwvY29udmVydGVyPiAgICAgICAgDQotICANCi0gIDx2YWxpZGF0b3I+DQotICAgIDx2YWxpZGF0b3ItaWQ+amF2YXguZmFjZXMuTG9uZ1JhbmdlPC92YWxpZGF0b3ItaWQ+DQotICAgIDx2YWxpZGF0b3ItY2xhc3M+b3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkaW50ZXJuYWwudmFsaWRhdG9yLkxvbmdSYW5nZVZhbGlkYXRvcjwvdmFsaWRhdG9yLWNsYXNzPg0KLSAgPC92YWxpZGF0b3I+DQotICANCi0gIDx2YWxpZGF0b3I+DQotICAgIDxkaXNwbGF5LW5hbWU+dmFsaWRhdGVEYXRlVGltZVJhbmdlPC9kaXNwbGF5LW5hbWU+DQotICAgIDx2YWxpZGF0b3ItaWQ+b3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLkRhdGVUaW1lUmFuZ2U8L3ZhbGlkYXRvci1pZD4NCi0gICAgPHZhbGlkYXRvci1jbGFzcz5vcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQudmFsaWRhdG9yLkRhdGVUaW1lUmFuZ2VWYWxpZGF0b3I8L3ZhbGlkYXRvci1jbGFzcz4gICANCi0gIDwvdmFsaWRhdG9yPg0KLQ0KLSAgPHZhbGlkYXRvcj4NCi0gICAgPGRpc3BsYXktbmFtZT52YWxpZGF0ZVJlZ3VsYXJFeHByZXNzaW9uPC9kaXNwbGF5LW5hbWU+DQotICAgIDx2YWxpZGF0b3ItaWQ+b3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLlJlZ0V4cDwvdmFsaWRhdG9yLWlkPg0KLSAgICA8dmFsaWRhdG9yLWNsYXNzPm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZGludGVybmFsLnZhbGlkYXRvci5SZWdFeHBWYWxpZGF0b3I8L3ZhbGlkYXRvci1jbGFzcz4NCi0gIDwvdmFsaWRhdG9yPg0KLQ0KLSAgPHZhbGlkYXRvcj4NCi0gICAgPGRpc3BsYXktbmFtZT52YWxpZGF0ZUJ5dGVMZW5ndGg8L2Rpc3BsYXktbmFtZT4NCi0gICAgPHZhbGlkYXRvci1pZD5vcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuQnl0ZUxlbmd0aDwvdmFsaWRhdG9yLWlkPg0KLSAgICA8dmFsaWRhdG9yLWNsYXNzPm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZGludGVybmFsLnZhbGlkYXRvci5CeXRlTGVuZ3RoVmFsaWRhdG9yPC92YWxpZGF0b3ItY2xhc3M+ICAgDQotICA8L3ZhbGlkYXRvcj4NCi0NCi0gICA8Y29udmVydGVyPg0KLSAgICA8ZGlzcGxheS1uYW1lPkNvbG9yIENvbnZlcnRlcjwvZGlzcGxheS1uYW1lPg0KLSAgICA8Y29udmVydGVyLWlkPm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5Db2xvcjwvY29udmVydGVyLWlkPg0KLSAgICA8Y29udmVydGVyLWNsYXNzPm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZGludGVybmFsLmNvbnZlcnQuQ29sb3JDb252ZXJ0ZXI8L2NvbnZlcnRlci1jbGFzcz4NCi0gIDwvY29udmVydGVyPg0KLSAgDQotICA8Y29udmVydGVyPg0KLSAgICA8ZGVzY3JpcHRpb24+Q29sb3IgQ29udmVydGVyPC9kZXNjcmlwdGlvbj4NCi0gICAgPGNvbnZlcnRlci1mb3ItY2xhc3M+amF2YS5hd3QuQ29sb3I8L2NvbnZlcnRlci1mb3ItY2xhc3M+DQotICAgIDxjb252ZXJ0ZXItY2xhc3M+b3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkaW50ZXJuYWwuY29udmVydC5Db2xvckNvbnZlcnRlcjwvY29udmVydGVyLWNsYXNzPg0KLSAgPC9jb252ZXJ0ZXI+DQotDQotICA8Y29udmVydGVyPg0KLSAgICA8ZGlzcGxheS1uYW1lPkRhdGUgVGltZSBDb252ZXJ0ZXI8L2Rpc3BsYXktbmFtZT4NCi0gICAgPGNvbnZlcnRlci1pZD5qYXZheC5mYWNlcy5EYXRlVGltZTwvY29udmVydGVyLWlkPg0KLSAgICA8Y29udmVydGVyLWNsYXNzPm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZGludGVybmFsLmNvbnZlcnQuRGF0ZVRpbWVDb252ZXJ0ZXI8L2NvbnZlcnRlci1jbGFzcz4NCi0gIDwvY29udmVydGVyPg0KLQ0KLSAgPGNvbnZlcnRlcj4NCi0gICAgPGRpc3BsYXktbmFtZT5EYXRlIFRpbWUgQ29udmVydGVyPC9kaXNwbGF5LW5hbWU+DQotICAgIDxjb252ZXJ0ZXItaWQ+b3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLkRhdGVUaW1lPC9jb252ZXJ0ZXItaWQ+ICAgIA0KLSAgICA8Y29udmVydGVyLWNsYXNzPm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZGludGVybmFsLmNvbnZlcnQuRGF0ZVRpbWVDb252ZXJ0ZXI8L2NvbnZlcnRlci1jbGFzcz4NCi0gIDwvY29udmVydGVyPg0KLSAgDQotICA8Y29udmVydGVyPg0KLSAgICA8ZGlzcGxheS1uYW1lPkRhdGUgVGltZSBDb252ZXJ0ZXI8L2Rpc3BsYXktbmFtZT4NCi0gICAgPGNvbnZlcnRlci1mb3ItY2xhc3M+amF2YS51dGlsLkRhdGU8L2NvbnZlcnRlci1mb3ItY2xhc3M+ICAgDQotICAgIDxjb252ZXJ0ZXItY2xhc3M+b3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkaW50ZXJuYWwuY29udmVydC5EYXRlVGltZUNvbnZlcnRlcjwvY29udmVydGVyLWNsYXNzPg0KLSAgPC9jb252ZXJ0ZXI+DQotICANCi0gIDxjb252ZXJ0ZXI+DQotICAgIDxkaXNwbGF5LW5hbWU+RGF0ZSBUaW1lIENvbnZlcnRlcjwvZGlzcGxheS1uYW1lPg0KLSAgICA8Y29udmVydGVyLWZvci1jbGFzcz5qYXZhLnNxbC5UaW1lc3RhbXA8L2NvbnZlcnRlci1mb3ItY2xhc3M+ICAgDQotICAgIDxjb252ZXJ0ZXItY2xhc3M+b3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkaW50ZXJuYWwuY29udmVydC5UaW1lc3RhbXBDb252ZXJ0ZXI8L2NvbnZlcnRlci1jbGFzcz4NCi0gIDwvY29udmVydGVyPg0KLQ0KLSAgPGNvbnZlcnRlcj4NCi0gICAgPGRpc3BsYXktbmFtZT5EYXRlIFRpbWUgQ29udmVydGVyPC9kaXNwbGF5LW5hbWU+DQotICAgIDxjb252ZXJ0ZXItZm9yLWNsYXNzPmphdmEuc3FsLkRhdGU8L2NvbnZlcnRlci1mb3ItY2xhc3M+ICAgDQotICAgIDxjb252ZXJ0ZXItY2xhc3M+b3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkaW50ZXJuYWwuY29udmVydC5KYXZhU3FsRGF0ZUNvbnZlcnRlcjwvY29udmVydGVyLWNsYXNzPg0KLSAgPC9jb252ZXJ0ZXI+DQotDQotICA8Y29udmVydGVyPg0KLSAgICA8ZGlzcGxheS1uYW1lPk51bWJlciBDb252ZXJ0ZXI8L2Rpc3BsYXktbmFtZT4NCi0gICAgPGNvbnZlcnRlci1mb3ItY2xhc3M+amF2YS5sYW5nLk51bWJlcjwvY29udmVydGVyLWZvci1jbGFzcz4gICANCi0gICAgPGNvbnZlcnRlci1jbGFzcz5vcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuY29udmVydC5OdW1iZXJDb252ZXJ0ZXI8L2NvbnZlcnRlci1jbGFzcz4NCi0gIDwvY29udmVydGVyPg0KLQ0KLSAgPGNvbnZlcnRlcj4NCi0gICAgPGRpc3BsYXktbmFtZT5OdW1iZXIgQ29udmVydGVyPC9kaXNwbGF5LW5hbWU+DQotICAgIDxjb252ZXJ0ZXItaWQ+amF2YXguZmFjZXMuTnVtYmVyPC9jb252ZXJ0ZXItaWQ+DQotICAgIDxjb252ZXJ0ZXItY2xhc3M+b3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLmNvbnZlcnQuTnVtYmVyQ29udmVydGVyPC9jb252ZXJ0ZXItY2xhc3M+DQotICA8L2NvbnZlcnRlcj4NCi0gIA0KLSAgPGNvbnZlcnRlcj4NCi0gICAgPGRpc3BsYXktbmFtZT5OdW1iZXIgQ29udmVydGVyPC9kaXNwbGF5LW5hbWU+DQotICAgIDxjb252ZXJ0ZXItaWQ+b3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLk51bWJlcjwvY29udmVydGVyLWlkPiANCi0gICAgPGNvbnZlcnRlci1jbGFzcz5vcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuY29udmVydC5OdW1iZXJDb252ZXJ0ZXI8L2NvbnZlcnRlci1jbGFzcz4NCi0gIDwvY29udmVydGVyPg0KLSAgDQotICA8cmVmZXJlbmNlZC1iZWFuPg0KLSAgICA8ZGVzY3JpcHRpb24+aW1wbGljaXQgb2JqZWN0IHByb3ZpZGVkIGJ5IFRyaW5pZGFkPC9kZXNjcmlwdGlvbj4NCi0gICAgPGRpc3BsYXktbmFtZT5SZXF1ZXN0IENvbnRleHQ8L2Rpc3BsYXktbmFtZT4NCi0gICAgPHJlZmVyZW5jZWQtYmVhbi1uYW1lPnJlcXVlc3RDb250ZXh0PC9yZWZlcmVuY2VkLWJlYW4tbmFtZT4NCi0gICAgPHJlZmVyZW5jZWQtYmVhbi1jbGFzcz5vcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuY29udGV4dC5SZXF1ZXN0Q29udGV4dDwvcmVmZXJlbmNlZC1iZWFuLWNsYXNzPg0KLSAgPC9yZWZlcmVuY2VkLWJlYW4+DQotDQotICA8cmVmZXJlbmNlZC1iZWFuPg0KLSAgICA8ZGVzY3JpcHRpb24+VHJpbmlkYWQgUHJvY2VzcyBTY29wZSBNYXA8L2Rlc2NyaXB0aW9uPg0KLSAgICA8ZGlzcGxheS1uYW1lPlByb2Nlc3MgU2NvcGU8L2Rpc3BsYXktbmFtZT4NCi0gICAgPHJlZmVyZW5jZWQtYmVhbi1uYW1lPnByb2Nlc3NTY29wZTwvcmVmZXJlbmNlZC1iZWFuLW5hbWU+DQotICAgIDxyZWZlcmVuY2VkLWJlYW4tY2xhc3M+amF2YS51dGlsLk1hcDwvcmVmZXJlbmNlZC1iZWFuLWNsYXNzPg0KLSAgPC9yZWZlcmVuY2VkLWJlYW4+DQotDQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL3Rlc3QvamF2YS10ZW1wbGF0ZXMvb3JnL2FwYWNoZS9teWZhY2VzL3RyaW5pZGFkL2NvbXBvbmVudC9VSVhDb21tYW5kVGVtcGxhdGUuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy90ZXN0L2phdmEtdGVtcGxhdGVzL29yZy9hcGFjaGUvbXlmYWNlcy90cmluaWRhZC9jb21wb25lbnQvVUlYQ29tbWFuZFRlbXBsYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2YjlmMDAuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL3Rlc3QvamF2YS10ZW1wbGF0ZXMvb3JnL2FwYWNoZS9teWZhY2VzL3RyaW5pZGFkL2NvbXBvbmVudC9VSVhDb21tYW5kVGVtcGxhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NCArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5jb21wb25lbnQ7Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuQWN0aW9uU291cmNlOwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0OwotaW1wb3J0IGphdmF4LmZhY2VzLmVsLk1ldGhvZEJpbmRpbmc7Ci1pbXBvcnQgamF2YXguZmFjZXMuZXZlbnQuQWJvcnRQcm9jZXNzaW5nRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LmZhY2VzLmV2ZW50LkFjdGlvbkV2ZW50OwotaW1wb3J0IGphdmF4LmZhY2VzLmV2ZW50LkFjdGlvbkxpc3RlbmVyOwotaW1wb3J0IGphdmF4LmZhY2VzLmV2ZW50LkZhY2VzRXZlbnQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuZXZlbnQuUGhhc2VJZDsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5jb250ZXh0LlJlcXVlc3RDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5ldmVudC5MYXVuY2hFdmVudDsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuZXZlbnQuTGF1bmNoTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLmV2ZW50LlJldHVybkV2ZW50OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5ldmVudC5SZXR1cm5MaXN0ZW5lcjsKLQotLyoqCi0gKiBCYXNlIGNsYXNzIGZvciBjb21tYW5kIGNvbXBvbmVudHMuCi0gKgotICogQHZlcnNpb24gJE5hbWU6ICAkICgkUmV2aXNpb246IDEuMyAkKSAkRGF0ZTogMjAwNC8wNy8xOSAxODoyNToxNyAkCi0gKi8KLWFic3RyYWN0IHB1YmxpYyBjbGFzcyBVSVhDb21tYW5kVGVtcGxhdGUgZXh0ZW5kcyBVSVhDb21wb25lbnRCYXNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50cyBBY3Rpb25Tb3VyY2UsIERpYWxvZ1NvdXJjZQotewotLyoqLyAvLyBBYnN0cmFjdCBtZXRob2RzIGltcGxlbWVudGVkIGJ5IGNvZGUgZ2VuCi0vKiovICBhYnN0cmFjdCBwdWJsaWMgTWV0aG9kQmluZGluZyBnZXRBY3Rpb25MaXN0ZW5lcigpOwotLyoqLyAgYWJzdHJhY3QgcHVibGljIE1ldGhvZEJpbmRpbmcgZ2V0UmV0dXJuTGlzdGVuZXIoKTsKLS8qKi8gIGFic3RyYWN0IHB1YmxpYyBNZXRob2RCaW5kaW5nIGdldExhdW5jaExpc3RlbmVyKCk7Ci0KLQotICAvKioKLSAgICogQWRkIGEgTGF1bmNoTGlzdGVuZXIuCi0gICAqLwotICBwdWJsaWMgdm9pZCBhZGRMYXVuY2hMaXN0ZW5lcihMYXVuY2hMaXN0ZW5lciBsaXN0ZW5lcikKLSAgewotICAgIGFkZEZhY2VzTGlzdGVuZXIobGlzdGVuZXIpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJlbW92ZSBhIExhdW5jaExpc3RlbmVyLgotICAgKi8KLSAgcHVibGljIHZvaWQgcmVtb3ZlTGF1bmNoTGlzdGVuZXIoTGF1bmNoTGlzdGVuZXIgbGlzdGVuZXIpCi0gIHsKLSAgICByZW1vdmVGYWNlc0xpc3RlbmVyKGxpc3RlbmVyKTsKLSAgfQotCi0gIC8qKgotICAgKiBMYXVuY2ggYWxsIGFkZGVkIExhdW5jaExpc3RlbmVycy4KLSAgICovCi0gIHB1YmxpYyBMYXVuY2hMaXN0ZW5lcltdIGdldExhdW5jaExpc3RlbmVycygpCi0gIHsKLSAgICByZXR1cm4gKExhdW5jaExpc3RlbmVyW10pIGdldEZhY2VzTGlzdGVuZXJzKExhdW5jaExpc3RlbmVyLmNsYXNzKTsKLSAgfQotCi0gIC8qKgotICAgKiA8cD5JbnRlcmNlcHQgPGNvZGU+cXVldWVFdmVudDwvY29kZT4gYW5kIG1hcmsgdGhlIHBoYXNlSWQgZm9yIHRoZQotICAgKiBldmVudCB0byBiZSA8Y29kZT5QaGFzZUlkLkFQUExZX1JFUVVFU1RfVkFMVUVTPC9jb2RlPiBpZiB0aGUKLSAgICogPGNvZGU+aW1tZWRpYXRlPC9jb2RlPiBmbGFnIGlzIHRydWUsCi0gICAqIDxjb2RlPlBoYXNlSWQuSU5WT0tFX0FQUExJQ0FUSU9OPC9jb2RlPiBvdGhlcndpc2UuPC9wPgotICAgKi8KLSAgcHVibGljIHZvaWQgcXVldWVFdmVudChGYWNlc0V2ZW50IGUpCi0gIHsKLSAgICBpZiAoZSBpbnN0YW5jZW9mIEFjdGlvbkV2ZW50KQotICAgIHsKLSAgICAgIGlmIChpc0ltbWVkaWF0ZSgpKQotICAgICAgewotICAgICAgICBlLnNldFBoYXNlSWQoUGhhc2VJZC5BTllfUEhBU0UpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBlLnNldFBoYXNlSWQoUGhhc2VJZC5JTlZPS0VfQVBQTElDQVRJT04pOwotICAgICAgfQotICAgIH0KLQotICAgIHN1cGVyLnF1ZXVlRXZlbnQoZSk7Ci0gIH0KLQotCi0gIHB1YmxpYyB2b2lkIGJyb2FkY2FzdChGYWNlc0V2ZW50IGV2ZW50KSB0aHJvd3MgQWJvcnRQcm9jZXNzaW5nRXhjZXB0aW9uCi0gIHsKLSAgICAvLyBQZXJmb3JtIHNwZWNpYWwgcHJvY2Vzc2luZyBmb3IgQWN0aW9uRXZlbnRzOiAgdGVsbAotICAgIC8vIHRoZSBSZXF1ZXN0Q29udGV4dCB0byByZW1lbWJlciB0aGlzIGNvbW1hbmQgaW5zdGFuY2UKLSAgICAvLyBzbyB0aGF0IHRoZSBOYXZpZ2F0aW9uSGFuZGxlciBjYW4gbG9jYXRlIHVzIHRvIHF1ZXVlCi0gICAgLy8gYSBMYXVuY2hFdmVudC4KLSAgICBpZiAoZXZlbnQgaW5zdGFuY2VvZiBBY3Rpb25FdmVudCkKLSAgICB7Ci0gICAgICBSZXF1ZXN0Q29udGV4dCBhZkNvbnRleHQgPSBSZXF1ZXN0Q29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKTsKLSAgICAgIGFmQ29udGV4dC5nZXREaWFsb2dTZXJ2aWNlKCkuc2V0Q3VycmVudExhdW5jaFNvdXJjZSh0aGlzKTsKLQotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIC8vIFBlcmZvcm0gc3RhbmRhcmQgc3VwZXJjbGFzcyBwcm9jZXNzaW5nCi0gICAgICAgIHN1cGVyLmJyb2FkY2FzdChldmVudCk7Ci0KLSAgICAgICAgLy8gTm90aWZ5IHRoZSBzcGVjaWZpZWQgYWN0aW9uIGxpc3RlbmVyIG1ldGhvZCAoaWYgYW55KSwKLSAgICAgICAgLy8gYW5kIHRoZSBkZWZhdWx0IGFjdGlvbiBsaXN0ZW5lcgotICAgICAgICBfX2Jyb2FkY2FzdChldmVudCwgZ2V0QWN0aW9uTGlzdGVuZXIoKSk7Ci0KLSAgICAgICAgRmFjZXNDb250ZXh0IGNvbnRleHQgPSBnZXRGYWNlc0NvbnRleHQoKTsKLSAgICAgICAgQWN0aW9uTGlzdGVuZXIgZGVmYXVsdEFjdGlvbkxpc3RlbmVyID0KLSAgICAgICAgICBjb250ZXh0LmdldEFwcGxpY2F0aW9uKCkuZ2V0QWN0aW9uTGlzdGVuZXIoKTsKLSAgICAgICAgaWYgKGRlZmF1bHRBY3Rpb25MaXN0ZW5lciAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgZGVmYXVsdEFjdGlvbkxpc3RlbmVyLnByb2Nlc3NBY3Rpb24oKEFjdGlvbkV2ZW50KSBldmVudCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGZpbmFsbHkKLSAgICAgIHsKLSAgICAgICAgYWZDb250ZXh0LmdldERpYWxvZ1NlcnZpY2UoKS5zZXRDdXJyZW50TGF1bmNoU291cmNlKG51bGwpOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgLy8gUGVyZm9ybSBzdGFuZGFyZCBzdXBlcmNsYXNzIHByb2Nlc3NpbmcKLSAgICAgIHN1cGVyLmJyb2FkY2FzdChldmVudCk7Ci0KLSAgICAgIGlmIChldmVudCBpbnN0YW5jZW9mIExhdW5jaEV2ZW50KQotICAgICAgewotICAgICAgICBfX2Jyb2FkY2FzdChldmVudCwgZ2V0TGF1bmNoTGlzdGVuZXIoKSk7Ci0gICAgICAgIGJvb2xlYW4gdXNlV2luZG93ID0KLSAgICAgICAgICBCb29sZWFuLlRSVUUuZXF1YWxzKGdldEF0dHJpYnV0ZXMoKS5nZXQoInVzZVdpbmRvdyIpKTsKLQotICAgICAgICAoKExhdW5jaEV2ZW50KSBldmVudCkubGF1bmNoRGlhbG9nKHVzZVdpbmRvdyk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChldmVudCBpbnN0YW5jZW9mIFJldHVybkV2ZW50KQotICAgICAgewotICAgICAgICBfX2Jyb2FkY2FzdChldmVudCwgZ2V0UmV0dXJuTGlzdGVuZXIoKSk7Ci0gICAgICAgIC8vID0tPUFFVzogYWx3YXlzIGp1bXAgdG8gcmVuZGVyIHJlc3BvbnNlPz8/ICBTZWVtcyB0aGUgc2FmZXN0Ci0gICAgICAgIC8vIG9wdGlvbiwgYmVjYXVzZSB3ZSBkb24ndCB3YW50IHRvIGltbWVkaWF0ZWx5IHVwZGF0ZSBhIG1vZGVsCi0gICAgICAgIC8vIG9yIHJlYWxseSBwZXJmb3JtIGFueSB2YWxpZGF0aW9uLgotICAgICAgICBnZXRGYWNlc0NvbnRleHQoKS5yZW5kZXJSZXNwb25zZSgpOwotICAgICAgfQotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL0Fic3RyYWN0TW9qb1Rlc3RDYXNlLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvQWJzdHJhY3RNb2pvVGVzdENhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGZmNzVhZi4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvQWJzdHJhY3RNb2pvVGVzdENhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNCArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXM7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ubW9kZWwuTW9kZWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5tb2RlbC5CdWlsZDsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5Nb2pvOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLk1vam9FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wcm9qZWN0Lk1hdmVuUHJvamVjdDsKLQotLyoqCi0gKiBUZXN0cyB0aGUgY29tcG9uZW50IGdlbmVyYXRpb24gbW9qby4KLSAqLwotYWJzdHJhY3QgcHVibGljIGNsYXNzIEFic3RyYWN0TW9qb1Rlc3RDYXNlIGV4dGVuZHMgVGVzdENhc2UKLXsKLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcgQWJzdHJhY3RNb2pvVGVzdENhc2UuCi0gICAqCi0gICAqIEBwYXJhbSB0ZXN0TmFtZSAgdGhlIHRlc3QgdG8gZXhlY3V0ZQotICAgKi8KLSAgcHVibGljIEFic3RyYWN0TW9qb1Rlc3RDYXNlKAotICAgIFN0cmluZyB0ZXN0TmFtZSkKLSAgewotICAgIHN1cGVyKHRlc3ROYW1lKTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHNldE1vam9Qcm9qZWN0KAotICAgIE1vam8gICBtb2pvLAotICAgIFN0cmluZyBuYW1lKSB0aHJvd3MgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbgotICB7Ci0gICAgTW9kZWwgbW9kZWwgPSBuZXcgTW9kZWwoKTsKLSAgICBCdWlsZCBidWlsZCA9IG5ldyBCdWlsZCgpOwotICAgIGJ1aWxkLnNldE91dHB1dERpcmVjdG9yeSgidGFyZ2V0L3Rlc3QtYnVpbGQtb3V0cHV0Iik7Ci0gICAgbW9kZWwuc2V0QnVpbGQoYnVpbGQpOwotICAgIHNldE1vam9GaWVsZChtb2pvLCBuYW1lLCBuZXcgTWF2ZW5Qcm9qZWN0KG1vZGVsKSk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBzZXRNb2pvRmllbGQoCi0gICAgTW9qbyAgIG1vam8sCi0gICAgU3RyaW5nIG5hbWUsCi0gICAgT2JqZWN0IHZhbHVlKSB0aHJvd3MgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbgotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgQ2xhc3MgbW9qb0NsYXNzID0gbW9qby5nZXRDbGFzcygpOwotICAgICAgRmllbGQgZmllbGQgPSBtb2pvQ2xhc3MuZ2V0RGVjbGFyZWRGaWVsZChuYW1lKTsKLSAgICAgIGZpZWxkLnNldEFjY2Vzc2libGUodHJ1ZSk7Ci0gICAgICBmaWVsZC5zZXQobW9qbywgdmFsdWUpOwotICAgIH0KLSAgICBjYXRjaCAoTm9TdWNoRmllbGRFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbigiVW5rbm93biBNb2pvIHByb3BlcnR5ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiIiArIG5hbWUgKyAiXCIiLCBlKTsKLSAgICB9Ci0gICAgY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbigiRXJyb3Igc2V0dGluZyBNb2pvIHByb3BlcnR5ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiIiArIG5hbWUgKyAiXCIiLCBlKTsKLSAgICB9Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBzZXRNb2pvUHJvcGVydHkoCi0gICAgTW9qbyAgIG1vam8sCi0gICAgU3RyaW5nIG5hbWUsCi0gICAgT2JqZWN0IHZhbHVlKSB0aHJvd3MgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbgotICB7Ci0gICAgc2V0TW9qb1Byb3BlcnR5KG1vam8sIG5hbWUsIHZhbHVlLmdldENsYXNzKCksIHZhbHVlKTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHNldE1vam9Qcm9wZXJ0eSgKLSAgICBNb2pvICAgIG1vam8sCi0gICAgU3RyaW5nICBuYW1lLAotICAgIGJvb2xlYW4gdmFsdWUpIHRocm93cyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uCi0gIHsKLSAgICBzZXRNb2pvUHJvcGVydHkobW9qbywgbmFtZSwgQm9vbGVhbi5UWVBFLCBCb29sZWFuLnZhbHVlT2YodmFsdWUpKTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHNldE1vam9Qcm9wZXJ0eSgKLSAgICBNb2pvICAgbW9qbywKLSAgICBTdHJpbmcgbmFtZSwKLSAgICBDbGFzcyAgdHlwZSwKLSAgICBPYmplY3QgdmFsdWUpIHRocm93cyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBDbGFzcyBtb2pvQ2xhc3MgPSBtb2pvLmdldENsYXNzKCk7Ci0gICAgICBNZXRob2QgbWV0aG9kID0gbW9qb0NsYXNzLmdldERlY2xhcmVkTWV0aG9kKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNldCIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhcmFjdGVyLnRvVXBwZXJDYXNlKG5hbWUuY2hhckF0KDApKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLnN1YnN0cmluZygxKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDbGFzc1tde3R5cGV9KTsKLSAgICAgIG1ldGhvZC5zZXRBY2Nlc3NpYmxlKHRydWUpOwotICAgICAgbWV0aG9kLmludm9rZShtb2pvLCBuZXcgT2JqZWN0W117dmFsdWV9KTsKLSAgICB9Ci0gICAgY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uKCJVbmtub3duIE1vam8gcHJvcGVydHkgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXCIiICsgbmFtZSArICJcIiIsIGUpOwotICAgIH0KLSAgICBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uKCJFcnJvciBzZXR0aW5nIE1vam8gcHJvcGVydHkgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXCIiICsgbmFtZSArICJcIiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmdldFRhcmdldEV4Y2VwdGlvbigpKTsKLSAgICB9Ci0gICAgY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbigiRXJyb3Igc2V0dGluZyBNb2pvIHByb3BlcnR5ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiIiArIG5hbWUgKyAiXCIiLCBlKTsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy9HZW5lcmF0ZUNvbXBvbmVudHNNb2pvVGVzdC5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL0dlbmVyYXRlQ29tcG9uZW50c01vam9UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4MjIxNmIuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL0dlbmVyYXRlQ29tcG9uZW50c01vam9UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTUgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uTW9qbzsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5Nb2pvRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLk1vam9GYWlsdXJlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMuQWJzdHJhY3RNb2pvVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy5HZW5lcmF0ZUNvbXBvbmVudHNNb2pvOwotCi0vKioKLSAqIFRlc3RzIHRoZSBjb21wb25lbnQgZ2VuZXJhdGlvbiBtb2pvLgotICovCi1wdWJsaWMgY2xhc3MgR2VuZXJhdGVDb21wb25lbnRzTW9qb1Rlc3QgZXh0ZW5kcyBBYnN0cmFjdE1vam9UZXN0Q2FzZQotewotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBHZW5lcmF0ZUNvbXBvbmVudHNNb2pvVGVzdC4KLSAgICoKLSAgICogQHBhcmFtIHRlc3ROYW1lICB0aGUgdGVzdCB0byBleGVjdXRlCi0gICAqLwotICBwdWJsaWMgR2VuZXJhdGVDb21wb25lbnRzTW9qb1Rlc3QoCi0gICAgU3RyaW5nIHRlc3ROYW1lKQotICB7Ci0gICAgc3VwZXIodGVzdE5hbWUpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbgotICB7Ci0gICAgTW9qbyBtb2pvID0gbmV3IEdlbmVyYXRlQ29tcG9uZW50c01vam8oKTsKLSAgICBGaWxlIGdlblNyY0RpciA9IG5ldyBGaWxlKCJ0YXJnZXQvbW9qby10ZXN0LW91dHB1dC9qYXZhIik7Ci0KLSAgICBzZXRNb2pvUHJvamVjdChtb2pvLCAicHJvamVjdCIpOwotICAgIHNldE1vam9GaWVsZChtb2pvLCAicGFja2FnZUNvbnRhaW5zIiwgIm9yZyIpOwotICAgIHNldE1vam9GaWVsZChtb2pvLCAidHlwZVByZWZpeCIsICJvcmcuYXBhY2hlIik7Ci0gICAgc2V0TW9qb0ZpZWxkKG1vam8sICJ0ZW1wbGF0ZVNvdXJjZURpcmVjdG9yeSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRmlsZSgic3JjL3Rlc3QvamF2YS10ZW1wbGF0ZXMiKSk7Ci0gICAgc2V0TW9qb0ZpZWxkKG1vam8sICJnZW5lcmF0ZWRTb3VyY2VEaXJlY3RvcnkiLCBnZW5TcmNEaXIpOwotICAgIHNldE1vam9GaWVsZChtb2pvLCAiZm9yY2UiLCBCb29sZWFuLlRSVUUpOwotCi0gICAgX21vam8gPSBtb2pvOwotICAgIF9nZW5TcmNEaXIgPSBnZW5TcmNEaXI7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZWFyRG93bigpCi0gIHsKLSAgICBfbW9qbyA9IG51bGw7Ci0gICAgX2dlblNyY0RpciA9IG51bGw7Ci0gIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RNaXNzaW5nRGVmYXVsdEluZGV4KCkgdGhyb3dzIE1vam9FeGVjdXRpb25FeGNlcHRpb24sIE1vam9GYWlsdXJlRXhjZXB0aW9uCi0gIHsKLSAgICBfbW9qby5leGVjdXRlKCk7Ci0gIH0KLS8qCi0gIHB1YmxpYyB2b2lkIHRlc3RTa2lwQVBJKCkgdGhyb3dzIE1vam9FeGVjdXRpb25FeGNlcHRpb24KLSAgewotICAgIHNldE1vam9GaWVsZChfbW9qbywgInJlc291cmNlUGF0aCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAiTUVUQS1JTkYvbWF2ZW4tZmFjZXMtcGx1Z2luL3Rlc3RTa2lwQVBJLmxzdCIpOwotICAgIF9tb2pvLmV4ZWN1dGUoKTsKLQotICAgIEZpbGUgdGFyZ2V0RmlsZSA9IG5ldyBGaWxlKF9nZW5TcmNEaXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImphdmF4L2ZhY2VzL2NvbXBvbmVudC9VSU5hbWluZ0NvbnRhaW5lci5qYXZhIik7Ci0gICAgaWYgKHRhcmdldEZpbGUuZXhpc3RzKCkpCi0gICAgICBmYWlsKCJKYXZhU2VydmVyIEZhY2VzIEFQSSBjb21wb25lbnQgZ2VuZXJhdGVkIik7Ci0gIH0KLSovCi0gIHB1YmxpYyB2b2lkIHRlc3RHZW5lcmF0ZSgpIHRocm93cyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uLCBNb2pvRmFpbHVyZUV4Y2VwdGlvbgotICB7Ci0gICAgc2V0TW9qb0ZpZWxkKF9tb2pvLCAicmVzb3VyY2VQYXRoIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICJNRVRBLUlORi9tYXZlbi1mYWNlcy1wbHVnaW4vdGVzdEdlbmVyYXRlLmxzdCIpOwotICAgIF9tb2pvLmV4ZWN1dGUoKTsKLQotICAgIEZpbGUgdGFyZ2V0RmlsZSA9IG5ldyBGaWxlKF9nZW5TcmNEaXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy9hcGFjaGUvbXlmYWNlcy90cmluaWRhZC9jb21wb25lbnQvVUlYQ29tbWFuZC5qYXZhIik7Ci0gICAgaWYgKCF0YXJnZXRGaWxlLmV4aXN0cygpKQotICAgICAgZmFpbCgiQ29tcG9uZW50IG5vdCBnZW5lcmF0ZWQiKTsKLQotICAgIC8vIFRPRE86IHZlcmlmeSBpZGVudGl0eSBjb250ZW50IHdpdGggdHJpbmlkYWQgRmFjZXMgZXhhbXBsZQotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdEdlbmVyYXRlV2l0aFRlbXBsYXRlKCkgdGhyb3dzIE1vam9FeGVjdXRpb25FeGNlcHRpb24sIE1vam9GYWlsdXJlRXhjZXB0aW9uCi0gIHsKLSAgICBzZXRNb2pvRmllbGQoX21vam8sICJyZXNvdXJjZVBhdGgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1FVEEtSU5GL21hdmVuLWZhY2VzLXBsdWdpbi90ZXN0R2VuZXJhdGUubHN0Iik7Ci0gICAgX21vam8uZXhlY3V0ZSgpOwotCi0gICAgRmlsZSB0YXJnZXRGaWxlID0gbmV3IEZpbGUoX2dlblNyY0RpciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JnL2FwYWNoZS9teWZhY2VzL3RyaW5pZGFkL2NvbXBvbmVudC9VSVhDb21tYW5kLmphdmEiKTsKLSAgICBpZiAoIXRhcmdldEZpbGUuZXhpc3RzKCkpCi0gICAgICBmYWlsKCJDb21wb25lbnQgbm90IGdlbmVyYXRlZCIpOwotCi0gICAgLy8gVE9ETzogdmVyaWZ5IGlkZW50aXR5IGNvbnRlbnQgd2l0aCB0cmluaWRhZCBGYWNlcyBleGFtcGxlCi0gIH0KLQotICBwcml2YXRlIE1vam8gX21vam87Ci0gIHByaXZhdGUgRmlsZSBfZ2VuU3JjRGlyOwotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL0dlbmVyYXRlRmFjZXNDb25maWdNb2pvVGVzdC5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL0dlbmVyYXRlRmFjZXNDb25maWdNb2pvVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzlhNTI0Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy9HZW5lcmF0ZUZhY2VzQ29uZmlnTW9qb1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLk1vam87Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5Nb2pvRmFpbHVyZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLkdlbmVyYXRlRmFjZXNDb25maWdNb2pvOwotCi0vKioKLSAqIFRlc3RzIHRoZSBmYWNlcy1jb25maWcueG1sIGdlbmVyYXRpb24gbW9qby4KLSAqLwotcHVibGljIGNsYXNzIEdlbmVyYXRlRmFjZXNDb25maWdNb2pvVGVzdCBleHRlbmRzIEFic3RyYWN0TW9qb1Rlc3RDYXNlCi17Ci0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IEdlbmVyYXRlRmFjZXNDb25maWdNb2pvVGVzdC4KLSAgICoKLSAgICogQHBhcmFtIHRlc3ROYW1lICB0aGUgdGVzdCB0byBleGVjdXRlCi0gICAqLwotICBwdWJsaWMgR2VuZXJhdGVGYWNlc0NvbmZpZ01vam9UZXN0KAotICAgIFN0cmluZyB0ZXN0TmFtZSkKLSAgewotICAgIHN1cGVyKHRlc3ROYW1lKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIE1vam9FeGVjdXRpb25FeGNlcHRpb24KLSAgewotICAgIE1vam8gbW9qbyA9IG5ldyBHZW5lcmF0ZUZhY2VzQ29uZmlnTW9qbygpOwotICAgIEZpbGUgdGFyZ2V0RGlyID0gbmV3IEZpbGUoInRhcmdldC9tb2pvLXRlc3Qtb3V0cHV0L2phdmEiKTsKLQotICAgIHNldE1vam9Qcm9qZWN0KG1vam8sICJwcm9qZWN0Iik7Ci0gICAgc2V0TW9qb0ZpZWxkKG1vam8sICJjb25maWdEaXJlY3RvcnkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEZpbGUoInNyYy90ZXN0L3Jlc291cmNlcyIpKTsKLSAgICBzZXRNb2pvRmllbGQobW9qbywgImNvbmZpZ1BhdGgiLCAiTUVUQS1JTkYvZmFjZXMtY29uZmlnLnhtbCIpOwotICAgIHNldE1vam9GaWVsZChtb2pvLCAidGFyZ2V0RGlyZWN0b3J5IiwgdGFyZ2V0RGlyKTsKLSAgICBzZXRNb2pvRmllbGQobW9qbywgImZvcmNlIiwgQm9vbGVhbi5UUlVFKTsKLQotICAgIF9tb2pvID0gbW9qbzsKLSAgICBfdGFyZ2V0RGlyID0gdGFyZ2V0RGlyOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVhckRvd24oKQotICB7Ci0gICAgX21vam8gPSBudWxsOwotICAgIF90YXJnZXREaXIgPSBudWxsOwotICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0R2VuZXJhdGUoKSB0aHJvd3MgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbiwgTW9qb0ZhaWx1cmVFeGNlcHRpb24KLSAgewotICAgIF9tb2pvLmV4ZWN1dGUoKTsKLQotICAgIC8vIFRPRE86IHZlcmlmeSBjb250ZW50IGlzIGNvcnJlY3QhIAotICB9Ci0KLSAgcHJpdmF0ZSBNb2pvIF9tb2pvOwotICBwcml2YXRlIEZpbGUgX3RhcmdldERpcjsKLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy9NRVRBLUlORi9tYXZlbi1mYWNlcy1wbHVnaW4vY29tcG9uZW50cy9qYXZheC9mYWNlcy9Db21wb25lbnQueG1sIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL01FVEEtSU5GL21hdmVuLWZhY2VzLXBsdWdpbi9jb21wb25lbnRzL2phdmF4L2ZhY2VzL0NvbXBvbmVudC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmYjAyZjcuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL01FVEEtSU5GL21hdmVuLWZhY2VzLXBsdWdpbi9jb21wb25lbnRzL2phdmF4L2ZhY2VzL0NvbXBvbmVudC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiID8+DQotPCEtLQ0KLSAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICAgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICAgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gICAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICAgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICAgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gICAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgICB1bmRlciB0aGUgTGljZW5zZS4NCi0JICAgDQotLS0+DQotPGZhY2VzLWNvbmZpZyB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIg0KLSAgICAgICAgICAgICAgeG1sbnM6bWQ9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvYmFsaS94bWwvbWV0YWRhdGEiDQotICAgICAgICAgICAgICB4bWxuczptZnA9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvbWF2ZW4tZmFjZXMtcGx1Z2luIiA+DQotDQotICA8Y29tcG9uZW50PiAgDQotICANCi0gICAgPGNvbXBvbmVudC10eXBlPmphdmF4LmZhY2VzLkNvbXBvbmVudDwvY29tcG9uZW50LXR5cGU+DQotICAgIDxjb21wb25lbnQtY2xhc3M+amF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50PC9jb21wb25lbnQtY2xhc3M+DQotDQotICAgIDxwcm9wZXJ0eT4NCi0gICAgICA8cHJvcGVydHktbmFtZT5pZDwvcHJvcGVydHktbmFtZT4NCi0gICAgICA8cHJvcGVydHktY2xhc3M+U3RyaW5nPC9wcm9wZXJ0eS1jbGFzcz4NCi0gICAgICA8cHJvcGVydHktZXh0ZW5zaW9uPg0KLSAgICAgICAgPG1mcDpsaXRlcmFsLW9ubHk+dHJ1ZTwvbWZwOmxpdGVyYWwtb25seT4NCi0gICAgICA8L3Byb3BlcnR5LWV4dGVuc2lvbj4NCi0gICAgPC9wcm9wZXJ0eT4NCi0NCi0gICAgPHByb3BlcnR5Pg0KLSAgICAgIDxwcm9wZXJ0eS1uYW1lPnJlbmRlcmVkPC9wcm9wZXJ0eS1uYW1lPg0KLSAgICAgIDxwcm9wZXJ0eS1jbGFzcz5ib29sZWFuPC9wcm9wZXJ0eS1jbGFzcz4NCi0gICAgICA8ZGVmYXVsdC12YWx1ZT50cnVlPC9kZWZhdWx0LXZhbHVlPg0KLSAgICA8L3Byb3BlcnR5Pg0KLQ0KLSAgICA8cHJvcGVydHk+DQotICAgICAgPHByb3BlcnR5LW5hbWU+YmluZGluZzwvcHJvcGVydHktbmFtZT4NCi0gICAgICA8cHJvcGVydHktY2xhc3M+amF2YXguZmFjZXMuZWwuVmFsdWVCaW5kaW5nPC9wcm9wZXJ0eS1jbGFzcz4NCi0gICAgPC9wcm9wZXJ0eT4NCi0NCi0gICAgPHByb3BlcnR5Pg0KLSAgICAgIDxwcm9wZXJ0eS1uYW1lPnRyYW5zaWVudDwvcHJvcGVydHktbmFtZT4NCi0gICAgICA8cHJvcGVydHktY2xhc3M+Ym9vbGVhbjwvcHJvcGVydHktY2xhc3M+DQotICAgICAgPHByb3BlcnR5LWV4dGVuc2lvbj4NCi0gICAgICAgIDxtZnA6bGl0ZXJhbC1vbmx5PnRydWU8L21mcDpsaXRlcmFsLW9ubHk+DQotICAgICAgICA8bWZwOnRyYW5zaWVudD50cnVlPC9tZnA6dHJhbnNpZW50Pg0KLSAgICAgIDwvcHJvcGVydHktZXh0ZW5zaW9uPg0KLSAgICA8L3Byb3BlcnR5Pg0KLQ0KLSAgICA8cHJvcGVydHk+DQotICAgICAgPHByb3BlcnR5LW5hbWU+cmVuZGVyZXJUeXBlPC9wcm9wZXJ0eS1uYW1lPg0KLSAgICAgIDxwcm9wZXJ0eS1jbGFzcz5TdHJpbmc8L3Byb3BlcnR5LWNsYXNzPg0KLSAgICAgIDxwcm9wZXJ0eS1leHRlbnNpb24+DQotICAgICAgICA8bWZwOmxpdGVyYWwtb25seT50cnVlPC9tZnA6bGl0ZXJhbC1vbmx5Pg0KLSAgICAgIDwvcHJvcGVydHktZXh0ZW5zaW9uPg0KLSAgICA8L3Byb3BlcnR5Pg0KLQ0KLSAgPC9jb21wb25lbnQ+DQotPC9mYWNlcy1jb25maWc+DQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL01FVEEtSU5GL21hdmVuLWZhY2VzLXBsdWdpbi9jb21wb25lbnRzL2phdmF4L2ZhY2VzL0NvbXBvbmVudEJhc2UueG1sIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL01FVEEtSU5GL21hdmVuLWZhY2VzLXBsdWdpbi9jb21wb25lbnRzL2phdmF4L2ZhY2VzL0NvbXBvbmVudEJhc2UueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZWYxNzI1Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy9NRVRBLUlORi9tYXZlbi1mYWNlcy1wbHVnaW4vY29tcG9uZW50cy9qYXZheC9mYWNlcy9Db21wb25lbnRCYXNlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgPz4NCi08IS0tDQotICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gICAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICAgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICAgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gICAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICAgIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gICAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gICAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICAgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICAgIHVuZGVyIHRoZSBMaWNlbnNlLg0KLQkgICANCi0tLT4NCi08ZmFjZXMtY29uZmlnIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiDQotICAgICAgICAgICAgICB4bWxuczptZD0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9iYWxpL3htbC9tZXRhZGF0YSINCi0gICAgICAgICAgICAgIHhtbG5zOm1mcD0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9tYXZlbi1mYWNlcy1wbHVnaW4iID4NCi0NCi0gIDxjb21wb25lbnQ+ICANCi0gIA0KLSAgICA8Y29tcG9uZW50LXR5cGU+amF2YXguZmFjZXMuQ29tcG9uZW50QmFzZTwvY29tcG9uZW50LXR5cGU+DQotICAgIDxjb21wb25lbnQtY2xhc3M+amF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50QmFzZTwvY29tcG9uZW50LWNsYXNzPg0KLQ0KLSAgICA8Y29tcG9uZW50LWV4dGVuc2lvbj4NCi0gICAgICA8bWZwOmNvbXBvbmVudD4NCi0gICAgICAgIDxtZnA6Y29tcG9uZW50LXN1cGVydHlwZT5qYXZheC5mYWNlcy5Db21wb25lbnQ8L21mcDpjb21wb25lbnQtc3VwZXJ0eXBlPg0KLSAgICAgIDwvbWZwOmNvbXBvbmVudD4NCi0gICAgPC9jb21wb25lbnQtZXh0ZW5zaW9uPg0KLSAgICANCi0gIDwvY29tcG9uZW50Pg0KLTwvZmFjZXMtY29uZmlnPg0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy9NRVRBLUlORi9tYXZlbi1mYWNlcy1wbHVnaW4vY29tcG9uZW50cy9qYXZheC9mYWNlcy9OYW1pbmdDb250YWluZXIueG1sIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL01FVEEtSU5GL21hdmVuLWZhY2VzLXBsdWdpbi9jb21wb25lbnRzL2phdmF4L2ZhY2VzL05hbWluZ0NvbnRhaW5lci54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4OWU0ZGEuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL01FVEEtSU5GL21hdmVuLWZhY2VzLXBsdWdpbi9jb21wb25lbnRzL2phdmF4L2ZhY2VzL05hbWluZ0NvbnRhaW5lci54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiID8+DQotPCEtLQ0KLSAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICAgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICAgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gICAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICAgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICAgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gICAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgICB1bmRlciB0aGUgTGljZW5zZS4NCi0JICAgDQotLS0+DQotPGZhY2VzLWNvbmZpZyB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIg0KLSAgICAgICAgICAgICAgeG1sbnM6bWZwPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL21hdmVuLWZhY2VzLXBsdWdpbiIgPg0KLQ0KLSAgPGNvbXBvbmVudD4NCi0NCi0gICAgPGNvbXBvbmVudC10eXBlPmphdmF4LmZhY2VzLk5hbWluZ0NvbnRhaW5lcjwvY29tcG9uZW50LXR5cGU+DQotICAgIDxjb21wb25lbnQtY2xhc3M+amF2YXguZmFjZXMuY29tcG9uZW50LlVJTmFtaW5nQ29udGFpbmVyPC9jb21wb25lbnQtY2xhc3M+DQotICAgIA0KLSAgICA8ZGVzY3JpcHRpb24+DQotICAgICAgQSBzaW1wbGUgbmFtaW5nIGNvbnRhaW5lci4NCi0gICAgPC9kZXNjcmlwdGlvbj4NCi0gICAgDQotICAgIDxjb21wb25lbnQtZXh0ZW5zaW9uPg0KLSAgICAgIDxtZnA6Y29tcG9uZW50LWZhbWlseT5qYXZheC5mYWNlcy5OYW1pbmdDb250YWluZXI8L21mcDpjb21wb25lbnQtZmFtaWx5Pg0KLSAgICAgIDxtZnA6bmFtaW5nLWNvbnRhaW5lcj50cnVlPC9tZnA6bmFtaW5nLWNvbnRhaW5lcj4NCi0gICAgICA8bWZwOmVjbWFzY3JpcHQtY2xhc3M+Y29tcG9uZW50LlVJTmFtaW5nQ29udGFpbmVyPC9tZnA6ZWNtYXNjcmlwdC1jbGFzcz4NCi0gICAgPC9jb21wb25lbnQtZXh0ZW5zaW9uPg0KLSAgICAgIA0KLSAgPC9jb21wb25lbnQ+DQotDQotPC9mYWNlcy1jb25maWc+DQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL01FVEEtSU5GL21hdmVuLWZhY2VzLXBsdWdpbi9jb21wb25lbnRzL3RyaW5pZGFkL2ZhY2VzL0NvbW1hbmQueG1sIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL01FVEEtSU5GL21hdmVuLWZhY2VzLXBsdWdpbi9jb21wb25lbnRzL3RyaW5pZGFkL2ZhY2VzL0NvbW1hbmQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOGY5Mzg4Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy9NRVRBLUlORi9tYXZlbi1mYWNlcy1wbHVnaW4vY29tcG9uZW50cy90cmluaWRhZC9mYWNlcy9Db21tYW5kLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE0MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiID8+DQotPCEtLQ0KLSAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICAgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICAgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gICAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICAgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICAgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gICAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgICB1bmRlciB0aGUgTGljZW5zZS4NCi0JICAgDQotLS0+DQotPGZhY2VzLWNvbmZpZyB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIg0KLSAgICAgICAgICAgICAgeG1sbnM6YWY9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvdHJpbmlkYWQiDQotICAgICAgICAgICAgICB4bWxuczp4aT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YSW5jbHVkZSINCi0gICAgICAgICAgICAgIHhtbG5zOm1kPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2JhbGkveG1sL21ldGFkYXRhIg0KLSAgICAgICAgICAgICAgeG1sbnM6bWZwPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL21hdmVuLWZhY2VzLXBsdWdpbiIgPg0KLQ0KLSAgPGNvbXBvbmVudD4gIA0KLSAgDQotICAgIDxjb21wb25lbnQtdHlwZT5vcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuQ29tbWFuZDwvY29tcG9uZW50LXR5cGU+DQotICAgIDxjb21wb25lbnQtY2xhc3M+b3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLmNvbXBvbmVudC5VSVhDb21tYW5kPC9jb21wb25lbnQtY2xhc3M+DQotDQotICAgIDxkZXNjcmlwdGlvbj4NCi0gICAgICBBIGJhc2UgYWJzdHJhY3Rpb24gZm9yIGNvbXBvbmVudHMgdGhhdCBpbXBsZW1lbnQgQWN0aW9uU291cmNlLg0KLSAgICA8L2Rlc2NyaXB0aW9uPg0KLQ0KLSAgICA8eGk6aW5jbHVkZSBocmVmPSJUZXN0SW5jbHVkZS54bWwiIHhwb2ludGVyPSIvZmFjZXMtY29uZmlnL2NvbXBvbmVudC8qIj48L3hpOmluY2x1ZGU+DQotDQotICAgIDxwcm9wZXJ0eT4NCi0gICAgICA8cHJvcGVydHktbmFtZT5hY3Rpb248L3Byb3BlcnR5LW5hbWU+DQotICAgICAgPHByb3BlcnR5LWNsYXNzPmphdmF4LmZhY2VzLmVsLk1ldGhvZEJpbmRpbmc8L3Byb3BlcnR5LWNsYXNzPg0KLSAgICAgIDxkZXNjcmlwdGlvbj4NCi0gICAgICAgICAgVGhlIHJlZmVyZW5jZSB0byB0aGUgSmF2YSBtZXRob2QgdGhhdCB3aWxsIGJlIGludm9rZWQgd2hlbg0KLSAgICAgICAgICBhbiBBY3Rpb25FdmVudCBpcyBicm9hZGNhc3QgYnkgdGhpcyBjb21wb25lbnQuICBUaGUgbWV0aG9kDQotICAgICAgICAgIHNpZ25hdHVyZSB0YWtlcyB6ZXJvIHBhcmFtZXRlcnMgYW5kIG1heSByZXR1cm4gU3RyaW5nIG9yIHZvaWQuDQotICAgICAgICAgIElmIGEgbm9uLW51bGwgU3RyaW5nIHZhbHVlIGlzIHJldHVybmVkLCBpdCB3aWxsIGJlIHVzZWQgYXMNCi0gICAgICAgICAgYW4gb3V0Y29tZSBmb3IgbmF2aWdhdGlvbi4NCi0gICAgICA8L2Rlc2NyaXB0aW9uPg0KLSAgICAgIDxwcm9wZXJ0eS1leHRlbnNpb24+DQotICAgICAgICA8bWZwOnN0YXRlLWhvbGRlcj50cnVlPC9tZnA6c3RhdGUtaG9sZGVyPg0KLSAgICAgICAgPG1mcDptZXRob2QtYmluZGluZy1zaWduYXR1cmU+DQotICAgICAgICAgIDxtZnA6cmV0dXJuLXR5cGU+U3RyaW5nPC9tZnA6cmV0dXJuLXR5cGU+DQotICAgICAgICA8L21mcDptZXRob2QtYmluZGluZy1zaWduYXR1cmU+DQotICAgICAgICA8bWQ6YXR0cmlidXRlTWV0YWRhdGE+DQotICAgICAgICAgIDxtZDpwcmVmZXJyZWQ+dHJ1ZTwvbWQ6cHJlZmVycmVkPg0KLSAgICAgICAgPC9tZDphdHRyaWJ1dGVNZXRhZGF0YT4NCi0gICAgICA8L3Byb3BlcnR5LWV4dGVuc2lvbj4NCi0gICAgPC9wcm9wZXJ0eT4NCi0NCi0gICAgPHByb3BlcnR5Pg0KLSAgICAgIDxwcm9wZXJ0eS1uYW1lPmFjdGlvbkxpc3RlbmVyPC9wcm9wZXJ0eS1uYW1lPg0KLSAgICAgIDxwcm9wZXJ0eS1jbGFzcz5qYXZheC5mYWNlcy5lbC5NZXRob2RCaW5kaW5nPC9wcm9wZXJ0eS1jbGFzcz4NCi0gICAgICA8ZGVzY3JpcHRpb24+DQotICAgICAgICAgIFRoZSByZWZlcmVuY2UgdG8gdGhlIEphdmEgbWV0aG9kIHRoYXQgd2lsbCBiZSBpbnZva2VkIHdoZW4NCi0gICAgICAgICAgYW4gQWN0aW9uRXZlbnQgaXMgYnJvYWRjYXN0IGJ5IHRoaXMgY29tcG9uZW50LiAgVGhlIG1ldGhvZA0KLSAgICAgICAgICBzaWduYXR1cmUgdGFrZXMgYSBzaW5nbGUgQWN0aW9uRXZlbnQgcGFyYW1ldGVyIGFuZCByZXR1cm5zDQotICAgICAgICAgIHZvaWQuDQotICAgICAgPC9kZXNjcmlwdGlvbj4NCi0gICAgICA8cHJvcGVydHktZXh0ZW5zaW9uPg0KLSAgICAgICAgPG1mcDpzdGF0ZS1ob2xkZXI+dHJ1ZTwvbWZwOnN0YXRlLWhvbGRlcj4NCi0gICAgICAgIDxtZnA6bWV0aG9kLWJpbmRpbmctc2lnbmF0dXJlPg0KLSAgICAgICAgICA8bWZwOnBhcmFtZXRlci10eXBlPmphdmF4LmZhY2VzLmV2ZW50LkFjdGlvbkV2ZW50PC9tZnA6cGFyYW1ldGVyLXR5cGU+DQotICAgICAgICAgIDxtZnA6cmV0dXJuLXR5cGU+dm9pZDwvbWZwOnJldHVybi10eXBlPg0KLSAgICAgICAgPC9tZnA6bWV0aG9kLWJpbmRpbmctc2lnbmF0dXJlPg0KLSAgICAgICAgPG1kOmF0dHJpYnV0ZU1ldGFkYXRhPg0KLSAgICAgICAgICA8bWQ6cHJlZmVycmVkPnRydWU8L21kOnByZWZlcnJlZD4NCi0gICAgICAgIDwvbWQ6YXR0cmlidXRlTWV0YWRhdGE+DQotICAgICAgPC9wcm9wZXJ0eS1leHRlbnNpb24+DQotICAgIDwvcHJvcGVydHk+DQotDQotICAgIDxwcm9wZXJ0eT4NCi0gICAgICA8cHJvcGVydHktbmFtZT5yZXR1cm5MaXN0ZW5lcjwvcHJvcGVydHktbmFtZT4NCi0gICAgICA8cHJvcGVydHktY2xhc3M+amF2YXguZmFjZXMuZWwuTWV0aG9kQmluZGluZzwvcHJvcGVydHktY2xhc3M+DQotICAgICAgPGRlc2NyaXB0aW9uPg0KLSAgICAgICAgICBUaGUgcmVmZXJlbmNlIHRvIHRoZSBKYXZhIG1ldGhvZCB0aGF0IHdpbGwgYmUgaW52b2tlZCB3aGVuDQotICAgICAgICAgIGEgZGlhbG9nIFJldHVybkV2ZW50IGlzIGJyb2FkY2FzdCBieSB0aGlzIGNvbXBvbmVudC4gIFRoZSBtZXRob2QNCi0gICAgICAgICAgc2lnbmF0dXJlIHRha2VzIGEgc2luZ2xlIFJldHVybkV2ZW50IHBhcmFtZXRlciBhbmQgcmV0dXJucw0KLSAgICAgICAgICB2b2lkLg0KLSAgICAgIDwvZGVzY3JpcHRpb24+DQotICAgICAgPHByb3BlcnR5LWV4dGVuc2lvbj4NCi0gICAgICAgIDxtZnA6c3RhdGUtaG9sZGVyPnRydWU8L21mcDpzdGF0ZS1ob2xkZXI+DQotICAgICAgICA8bWZwOm1ldGhvZC1iaW5kaW5nLXNpZ25hdHVyZT4NCi0gICAgICAgICAgPG1mcDpwYXJhbWV0ZXItdHlwZT5vcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuZXZlbnQuUmV0dXJuRXZlbnQ8L21mcDpwYXJhbWV0ZXItdHlwZT4NCi0gICAgICAgICAgPG1mcDpyZXR1cm4tdHlwZT52b2lkPC9tZnA6cmV0dXJuLXR5cGU+DQotICAgICAgICA8L21mcDptZXRob2QtYmluZGluZy1zaWduYXR1cmU+DQotICAgICAgPC9wcm9wZXJ0eS1leHRlbnNpb24+DQotICAgIDwvcHJvcGVydHk+DQotDQotICAgIDxwcm9wZXJ0eT4NCi0gICAgICA8cHJvcGVydHktbmFtZT5pbW1lZGlhdGU8L3Byb3BlcnR5LW5hbWU+DQotICAgICAgPHByb3BlcnR5LWNsYXNzPmJvb2xlYW48L3Byb3BlcnR5LWNsYXNzPg0KLSAgICAgIDxkZXNjcmlwdGlvbj4NCi0gICAgICAgIGEgcmVmZXJlbmNlIHRvIGFuIGFjdGlvbiBtZXRob2Qgc2VudCBieSB0aGUgY29tbWFuZCBjb21wb25lbnQsIA0KLW9yIHRoZSBzdGF0aWMgb3V0Y29tZSBvZiBhbiBhY3Rpb24uICBXaGVuIGltbWVkaWF0ZSBpcyB0cnVlLCB0aGUgDQotZGVmYXVsdCBBY3Rpb25MaXN0ZW5lciBwcm92aWRlZCBieSB0aGUgSmF2YVNlcnZlciBGYWNlcyBpbXBsZW1lbnRhdGlvbiANCi1zaG91bGQgYmUgZXhlY3V0ZWQgZHVyaW5nIEFwcGx5IFJlcXVlc3QgVmFsdWVzIHBoYXNlIG9mIHRoZSByZXF1ZXN0IA0KLXByb2Nlc3NpbmcgbGlmZWN5Y2xlLCByYXRoZXIgdGhhbiB3YWl0aW5nIHVudGlsIHRoZSBJbnZva2UgQXBwbGljYXRpb24gDQotcGhhc2UuDQotICAgICAgPC9kZXNjcmlwdGlvbj4NCi0gICAgICA8cHJvcGVydHktZXh0ZW5zaW9uPg0KLSAgICAgICAgPG1mcDpyZXF1aXJlZD5mYWxzZTwvbWZwOnJlcXVpcmVkPg0KLSAgICAgIDwvcHJvcGVydHktZXh0ZW5zaW9uPg0KLSAgICA8L3Byb3BlcnR5Pg0KLQ0KLSAgICA8Y29tcG9uZW50LWV4dGVuc2lvbj4NCi0gICAgICA8bWZwOmNvbXBvbmVudC1mYW1pbHk+b3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLkNvbW1hbmQ8L21mcDpjb21wb25lbnQtZmFtaWx5Pg0KLSAgICAgIDxtZnA6ZGVmYXVsdC1yZW5kZXJlci10eXBlPm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5CdXR0b248L21mcDpkZWZhdWx0LXJlbmRlcmVyLXR5cGU+DQotICAgICAgPG1mcDpjb21wb25lbnQtc3VwZXJ0eXBlPm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5Db21wb25lbnRCYXNlPC9tZnA6Y29tcG9uZW50LXN1cGVydHlwZT4NCi0NCi0gICAgICA8bWZwOmpzcC10YWctY2xhc3M+b3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkaW50ZXJuYWwudGFnbGliLlVJWENvbW1hbmRUYWc8L21mcDpqc3AtdGFnLWNsYXNzPg0KLSAgICAgIDxtZnA6anNwLXRhZy1uYW1lPmFmOmNvbW1hbmQ8L21mcDpqc3AtdGFnLW5hbWU+DQotDQotICAgICAgPG1mcDpldmVudD4NCi0gICAgICAgIDxtZnA6ZXZlbnQtdHlwZT5qYXZheC5mYWNlcy5BY3Rpb248L21mcDpldmVudC10eXBlPg0KLSAgICAgICAgPG1mcDpldmVudC1kZWxpdmVyeS1waGFzZXM+SW52b2tlIEFwcGxpY2F0aW9uLEFwcGx5IFJlcXVlc3QgVmFsdWVzPC9tZnA6ZXZlbnQtZGVsaXZlcnktcGhhc2VzPg0KLSAgICAgIDwvbWZwOmV2ZW50Pg0KLQ0KLSAgICAgIDxtZnA6ZXZlbnQ+DQotICAgICAgICA8bWZwOmV2ZW50LXR5cGU+b3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLkxhdW5jaDwvbWZwOmV2ZW50LXR5cGU+DQotICAgICAgICA8bWZwOmV2ZW50LWRlbGl2ZXJ5LXBoYXNlcz5JbnZva2UgQXBwbGljYXRpb24sQXBwbHkgUmVxdWVzdCBWYWx1ZXM8L21mcDpldmVudC1kZWxpdmVyeS1waGFzZXM+DQotICAgICAgPC9tZnA6ZXZlbnQ+DQotDQotICAgICAgPG1mcDpldmVudD4NCi0gICAgICAgIDxtZnA6ZXZlbnQtdHlwZT5vcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuUmV0dXJuPC9tZnA6ZXZlbnQtdHlwZT4NCi0gICAgICAgIDxtZnA6ZXZlbnQtZGVsaXZlcnktcGhhc2VzPkFwcGx5IFJlcXVlc3QgVmFsdWVzPC9tZnA6ZXZlbnQtZGVsaXZlcnktcGhhc2VzPg0KLSAgICAgIDwvbWZwOmV2ZW50Pg0KLQ0KLSAgICAgIDxtZDplbGVtZW50TWV0YWRhdGE+DQotICAgICAgICA8bWQ6Z3JvdXA+JHttZDpnZXRUcmFuc2xhdGVkU3RyaW5nKCJQQUxFVFRFX0lOUFVUIil9PC9tZDpncm91cD4NCi0gICAgICA8L21kOmVsZW1lbnRNZXRhZGF0YT4NCi0gICAgPC9jb21wb25lbnQtZXh0ZW5zaW9uPg0KLQ0KLSAgPC9jb21wb25lbnQ+DQotPC9mYWNlcy1jb25maWc+DQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL01FVEEtSU5GL21hdmVuLWZhY2VzLXBsdWdpbi9jb21wb25lbnRzL3RyaW5pZGFkL2ZhY2VzL0NvbXBvbmVudEJhc2UueG1sIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL01FVEEtSU5GL21hdmVuLWZhY2VzLXBsdWdpbi9jb21wb25lbnRzL3RyaW5pZGFkL2ZhY2VzL0NvbXBvbmVudEJhc2UueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzQxZWM0Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy9NRVRBLUlORi9tYXZlbi1mYWNlcy1wbHVnaW4vY29tcG9uZW50cy90cmluaWRhZC9mYWNlcy9Db21wb25lbnRCYXNlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgPz4NCi08IS0tDQotICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gICAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICAgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICAgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gICAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICAgIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gICAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gICAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICAgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICAgIHVuZGVyIHRoZSBMaWNlbnNlLg0KLQkgICANCi0tLT4NCi08ZmFjZXMtY29uZmlnIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiDQotICAgICAgICAgICAgICB4bWxuczptZD0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9iYWxpL3htbC9tZXRhZGF0YSINCi0gICAgICAgICAgICAgIHhtbG5zOm1mcD0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9tYXZlbi1mYWNlcy1wbHVnaW4iID4NCi0NCi0gIDxjb21wb25lbnQ+ICANCi0gIA0KLSAgICA8Y29tcG9uZW50LXR5cGU+b3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLkNvbXBvbmVudEJhc2U8L2NvbXBvbmVudC10eXBlPg0KLSAgICA8Y29tcG9uZW50LWNsYXNzPm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5jb21wb25lbnQuVUlYQ29tcG9uZW50QmFzZTwvY29tcG9uZW50LWNsYXNzPg0KLQ0KLSAgICA8cHJvcGVydHk+DQotICAgICAgPHByb3BlcnR5LW5hbWU+YXR0cmlidXRlQ2hhbmdlTGlzdGVuZXI8L3Byb3BlcnR5LW5hbWU+DQotICAgICAgPHByb3BlcnR5LWNsYXNzPmphdmF4LmZhY2VzLmVsLk1ldGhvZEJpbmRpbmc8L3Byb3BlcnR5LWNsYXNzPg0KLSAgICAgIDxkZXNjcmlwdGlvbj4NCi0gICAgICAgICAgVGhlIHJlZmVyZW5jZSB0byB0aGUgSmF2YSBtZXRob2QgdGhhdCB3aWxsIGJlIGludm9rZWQgd2hlbg0KLSAgICAgICAgICBhbiBBdHRyaWJ1dGVDaGFuZ2VFdmVudCBpcyBicm9hZGNhc3QgYnkgdGhpcyBjb21wb25lbnQuICBUaGUgDQotICAgICAgICAgIG1ldGhvZCBzaWduYXR1cmUgdGFrZXMgYSBzaW5nbGUgQXR0cmlidXRlQ2hhbmdlRXZlbnQgcGFyYW1ldGVyIA0KLSAgICAgICAgICBhbmQgcmV0dXJucyB2b2lkLg0KLSAgICAgIDwvZGVzY3JpcHRpb24+DQotICAgICAgPHByb3BlcnR5LWV4dGVuc2lvbj4NCi0gICAgICAgIDxtZnA6c3RhdGUtaG9sZGVyPnRydWU8L21mcDpzdGF0ZS1ob2xkZXI+DQotICAgICAgICA8bWZwOm1ldGhvZC1iaW5kaW5nLXNpZ25hdHVyZT4NCi0gICAgICAgICAgPG1mcDpwYXJhbWV0ZXItdHlwZT5vcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuZXZlbnQuQXR0cmlidXRlQ2hhbmdlRXZlbnQ8L21mcDpwYXJhbWV0ZXItdHlwZT4NCi0gICAgICAgICAgPG1mcDpyZXR1cm4tdHlwZT52b2lkPC9tZnA6cmV0dXJuLXR5cGU+DQotICAgICAgICA8L21mcDptZXRob2QtYmluZGluZy1zaWduYXR1cmU+DQotICAgICAgPC9wcm9wZXJ0eS1leHRlbnNpb24+DQotICAgIDwvcHJvcGVydHk+DQotDQotICAgIDxjb21wb25lbnQtZXh0ZW5zaW9uPg0KLSAgICAgIDxtZnA6Y29tcG9uZW50LXN1cGVydHlwZT5qYXZheC5mYWNlcy5Db21wb25lbnQ8L21mcDpjb21wb25lbnQtc3VwZXJ0eXBlPg0KLQ0KLSAgICAgIDxtZnA6anNwLXRhZy1jbGFzcz5vcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWRpbnRlcm5hbC50YWdsaWIuVUlYQ29tcG9uZW50VGFnPC9tZnA6anNwLXRhZy1jbGFzcz4NCi0gICAgICA8bWZwOmV2ZW50Pg0KLSAgICAgICAgPG1mcDpldmVudC10eXBlPm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5BdHRyaWJ1dGVDaGFuZ2U8L21mcDpldmVudC10eXBlPg0KLSAgICAgICAgPG1mcDpldmVudC1kZWxpdmVyeS1waGFzZXM+SW52b2tlIEFwcGxpY2F0aW9uLEFwcGx5IFJlcXVlc3QgVmFsdWVzPC9tZnA6ZXZlbnQtZGVsaXZlcnktcGhhc2VzPg0KLSAgICAgIDwvbWZwOmV2ZW50Pg0KLSAgICA8L2NvbXBvbmVudC1leHRlbnNpb24+DQotDQotICA8L2NvbXBvbmVudD4NCi08L2ZhY2VzLWNvbmZpZz4NCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvTUVUQS1JTkYvbWF2ZW4tZmFjZXMtcGx1Z2luL2NvbXBvbmVudHMvdHJpbmlkYWQvZmFjZXMvVGVzdEluY2x1ZGUueG1sIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL01FVEEtSU5GL21hdmVuLWZhY2VzLXBsdWdpbi9jb21wb25lbnRzL3RyaW5pZGFkL2ZhY2VzL1Rlc3RJbmNsdWRlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTU2NDkwYS4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvTUVUQS1JTkYvbWF2ZW4tZmFjZXMtcGx1Z2luL2NvbXBvbmVudHMvdHJpbmlkYWQvZmFjZXMvVGVzdEluY2x1ZGUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiA/Pg0KLTwhLS0NCi0gICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gICAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gICAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICAgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gICAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi0gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gICAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gICAgdW5kZXIgdGhlIExpY2Vuc2UuDQotCSAgIA0KLS0tPg0KLTxmYWNlcy1jb25maWcgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSINCi0gICAgICAgICAgICAgIHhtbG5zOmFmPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL3RyaW5pZGFkIg0KLSAgICAgICAgICAgICAgeG1sbnM6eGk9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWEluY2x1ZGUiDQotICAgICAgICAgICAgICB4bWxuczptZD0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9iYWxpL3htbC9tZXRhZGF0YSINCi0gICAgICAgICAgICAgIHhtbG5zOm1mcD0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9tYXZlbi1mYWNlcy1wbHVnaW4iID4NCi0NCi0gIDxjb21wb25lbnQ+ICANCi0gICAgPHByb3BlcnR5Pg0KLSAgICAgIDxwcm9wZXJ0eS1uYW1lPmluY2x1ZGVkUHJvcGVydHk8L3Byb3BlcnR5LW5hbWU+DQotICAgICAgPHByb3BlcnR5LWNsYXNzPmphdmEubGFuZy5TdHJpbmc8L3Byb3BlcnR5LWNsYXNzPg0KLSAgICAgIDxkZXNjcmlwdGlvbj4NCi0gICAgICAgICAganVzdCBhIHRlc3QuDQotICAgICAgPC9kZXNjcmlwdGlvbj4NCi0gICAgICA8cHJvcGVydHktZXh0ZW5zaW9uPg0KLSAgICAgICAgPG1kOmF0dHJpYnV0ZU1ldGFkYXRhPg0KLSAgICAgICAgICA8bWQ6cHJlZmVycmVkPnRydWU8L21kOnByZWZlcnJlZD4NCi0gICAgICAgIDwvbWQ6YXR0cmlidXRlTWV0YWRhdGE+DQotICAgICAgPC9wcm9wZXJ0eS1leHRlbnNpb24+DQotICAgIDwvcHJvcGVydHk+DQotICA8L2NvbXBvbmVudD4NCi08L2ZhY2VzLWNvbmZpZz4NCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvTUVUQS1JTkYvbWF2ZW4tZmFjZXMtcGx1Z2luL2V2ZW50cy9qYXZheC9mYWNlcy9BY3Rpb24ueG1sIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL01FVEEtSU5GL21hdmVuLWZhY2VzLXBsdWdpbi9ldmVudHMvamF2YXgvZmFjZXMvQWN0aW9uLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzFlNDA1NS4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvTUVUQS1JTkYvbWF2ZW4tZmFjZXMtcGx1Z2luL2V2ZW50cy9qYXZheC9mYWNlcy9BY3Rpb24ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiA/Pg0KLTwhLS0NCi0gICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gICAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gICAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICAgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gICAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi0gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gICAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gICAgdW5kZXIgdGhlIExpY2Vuc2UuDQotCSAgIA0KLS0tPg0KLTxmYWNlcy1jb25maWcgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSINCi0gICAgICAgICAgICAgIHhtbG5zOm1kPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2JhbGkveG1sL21ldGFkYXRhIg0KLSAgICAgICAgICAgICAgeG1sbnM6bWZwPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL21hdmVuLWZhY2VzLXBsdWdpbiIgPg0KLSAgPGZhY2VzLWNvbmZpZy1leHRlbnNpb24+DQotICAgIDxtZnA6ZXZlbnQ+DQotICAgICAgPG1mcDpkZXNjcmlwdGlvbj4NCi0gICAgICAgIEV2ZW50IGRlbGl2ZXJlZCB3aGVuIHRoZSAiYWN0aW9uIiBvZiB0aGUgY29tcG9uZW50IGhhcyBiZWVuDQotaW52b2tlZDsgIGZvciBleGFtcGxlLCBieSBjbGlja2luZyBvbiBhIGJ1dHRvbi4gIFRoZSBhY3Rpb24gbWF5IHJlc3VsdA0KLWluIHBhZ2UgbmF2aWdhdGlvbi4NCi0gICAgICA8L21mcDpkZXNjcmlwdGlvbj4NCi0gICAgICA8bWZwOmV2ZW50LXR5cGU+amF2YXguZmFjZXMuQWN0aW9uPC9tZnA6ZXZlbnQtdHlwZT4NCi0gICAgICA8bWZwOmV2ZW50LWNsYXNzPmphdmF4LmZhY2VzLmV2ZW50LkFjdGlvbkV2ZW50PC9tZnA6ZXZlbnQtY2xhc3M+DQotICAgICAgPG1mcDpldmVudC1saXN0ZW5lci1jbGFzcz5qYXZheC5mYWNlcy5ldmVudC5BY3Rpb25MaXN0ZW5lcjwvbWZwOmV2ZW50LWxpc3RlbmVyLWNsYXNzPg0KLSAgICAgIDxtZnA6ZXZlbnQtc291cmNlLWludGVyZmFjZT5qYXZheC5mYWNlcy5jb21wb25lbnQuQWN0aW9uU291cmNlPC9tZnA6ZXZlbnQtc291cmNlLWludGVyZmFjZT4NCi0gICAgICA8bWZwOmV2ZW50LWRlbGl2ZXJ5LXBoYXNlcz5JbnZva2UgQXBwbGljYXRpb24sQXBwbHkgUmVxdWVzdCBWYWx1ZXM8L21mcDpldmVudC1kZWxpdmVyeS1waGFzZXM+DQotICAgIDwvbWZwOmV2ZW50Pg0KLSAgPC9mYWNlcy1jb25maWctZXh0ZW5zaW9uPg0KLTwvZmFjZXMtY29uZmlnPg0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy9NRVRBLUlORi9tYXZlbi1mYWNlcy1wbHVnaW4vZXZlbnRzL3RyaW5pZGFkL2ZhY2VzL0xhdW5jaC54bWwgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvTUVUQS1JTkYvbWF2ZW4tZmFjZXMtcGx1Z2luL2V2ZW50cy90cmluaWRhZC9mYWNlcy9MYXVuY2gueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOGRjMWM2Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy9NRVRBLUlORi9tYXZlbi1mYWNlcy1wbHVnaW4vZXZlbnRzL3RyaW5pZGFkL2ZhY2VzL0xhdW5jaC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiID8+DQotPCEtLQ0KLSAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICAgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICAgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gICAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICAgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICAgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gICAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgICB1bmRlciB0aGUgTGljZW5zZS4NCi0JICAgDQotLS0+DQotPGZhY2VzLWNvbmZpZyB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIg0KLSAgICAgICAgICAgICAgeG1sbnM6bWQ9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvYmFsaS94bWwvbWV0YWRhdGEiDQotICAgICAgICAgICAgICB4bWxuczptZnA9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvbWF2ZW4tZmFjZXMtcGx1Z2luIiA+DQotICA8ZmFjZXMtY29uZmlnLWV4dGVuc2lvbj4NCi0gICAgICA8bWZwOmV2ZW50Pg0KLSAgICAgICAgPG1mcDpkZXNjcmlwdGlvbj4NCi0gICAgICAgICAgRXZlbnQgZGVsaXZlcmVkIHRvIHByb21wdCB0aGUgY29tbWFuZCB0byBsYXVuY2ggYSBkaWFsb2cuDQotICAgICAgICA8L21mcDpkZXNjcmlwdGlvbj4NCi0gICAgICAgIDxtZnA6ZXZlbnQtdHlwZT5vcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuTGF1bmNoPC9tZnA6ZXZlbnQtdHlwZT4NCi0gICAgICAgIDxtZnA6ZXZlbnQtY2xhc3M+b3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLmV2ZW50LkxhdW5jaEV2ZW50PC9tZnA6ZXZlbnQtY2xhc3M+DQotICAgICAgICA8bWZwOmV2ZW50LWxpc3RlbmVyLWNsYXNzPm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5ldmVudC5MYXVuY2hMaXN0ZW5lcjwvbWZwOmV2ZW50LWxpc3RlbmVyLWNsYXNzPg0KLSAgICAgICAgPG1mcDpldmVudC1zb3VyY2UtaW50ZXJmYWNlPm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5jb21wb25lbnQuRGlhbG9nU291cmNlPC9tZnA6ZXZlbnQtc291cmNlLWludGVyZmFjZT4NCi0gICAgICAgIDxtZnA6ZXZlbnQtZGVsaXZlcnktcGhhc2VzPkludm9rZSBBcHBsaWNhdGlvbixBcHBseSBSZXF1ZXN0IFZhbHVlczwvbWZwOmV2ZW50LWRlbGl2ZXJ5LXBoYXNlcz4NCi0gICAgICA8L21mcDpldmVudD4NCi0gIDwvZmFjZXMtY29uZmlnLWV4dGVuc2lvbj4NCi08L2ZhY2VzLWNvbmZpZz4NCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvTUVUQS1JTkYvbWF2ZW4tZmFjZXMtcGx1Z2luL2V2ZW50cy90cmluaWRhZC9mYWNlcy9SZXR1cm4ueG1sIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL01FVEEtSU5GL21hdmVuLWZhY2VzLXBsdWdpbi9ldmVudHMvdHJpbmlkYWQvZmFjZXMvUmV0dXJuLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGMwMzQ3Yy4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvTUVUQS1JTkYvbWF2ZW4tZmFjZXMtcGx1Z2luL2V2ZW50cy90cmluaWRhZC9mYWNlcy9SZXR1cm4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiA/Pg0KLTwhLS0NCi0gICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gICAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gICAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICAgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gICAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi0gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gICAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gICAgdW5kZXIgdGhlIExpY2Vuc2UuDQotCSAgIA0KLS0tPg0KLTxmYWNlcy1jb25maWcgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSINCi0gICAgICAgICAgICAgIHhtbG5zOm1kPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2JhbGkveG1sL21ldGFkYXRhIg0KLSAgICAgICAgICAgICAgeG1sbnM6bWZwPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL21hdmVuLWZhY2VzLXBsdWdpbiIgPg0KLSAgPGZhY2VzLWNvbmZpZy1leHRlbnNpb24+DQotICAgICAgPG1mcDpldmVudD4NCi0gICAgICAgIDxtZnA6ZGVzY3JpcHRpb24+DQotICAgICAgICAgIEV2ZW50IGRlbGl2ZXJlZCB3aGVuIHRoZSBkaWFsb2cgaGFzIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkuDQotICAgICAgICA8L21mcDpkZXNjcmlwdGlvbj4NCi0gICAgICAgIDxtZnA6ZXZlbnQtdHlwZT5vcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuUmV0dXJuPC9tZnA6ZXZlbnQtdHlwZT4NCi0gICAgICAgIDxtZnA6ZXZlbnQtY2xhc3M+b3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLmV2ZW50LlJldHVybkV2ZW50PC9tZnA6ZXZlbnQtY2xhc3M+DQotICAgICAgICA8bWZwOmV2ZW50LWxpc3RlbmVyLWNsYXNzPm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5ldmVudC5SZXR1cm5MaXN0ZW5lcjwvbWZwOmV2ZW50LWxpc3RlbmVyLWNsYXNzPg0KLSAgICAgICAgPG1mcDpldmVudC1zb3VyY2UtaW50ZXJmYWNlPm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5jb21wb25lbnQuRGlhbG9nU291cmNlPC9tZnA6ZXZlbnQtc291cmNlLWludGVyZmFjZT4NCi0gICAgICAgIDxtZnA6ZXZlbnQtZGVsaXZlcnktcGhhc2VzPkFwcGx5IFJlcXVlc3QgVmFsdWVzPC9tZnA6ZXZlbnQtZGVsaXZlcnktcGhhc2VzPg0KLSAgICAgIDwvbWZwOmV2ZW50Pg0KLSAgPC9mYWNlcy1jb25maWctZXh0ZW5zaW9uPg0KLTwvZmFjZXMtY29uZmlnPg0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy9NRVRBLUlORi9tYXZlbi1mYWNlcy1wbHVnaW4vZmFjZXMtY29uZmlnLnhtbCBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy9NRVRBLUlORi9tYXZlbi1mYWNlcy1wbHVnaW4vZmFjZXMtY29uZmlnLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTJlZTQ1Ny4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvTUVUQS1JTkYvbWF2ZW4tZmFjZXMtcGx1Z2luL2ZhY2VzLWNvbmZpZy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnPz4NCi08IS0tDQotICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gICAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICAgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICAgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gICAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICAgIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gICAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gICAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICAgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICAgIHVuZGVyIHRoZSBMaWNlbnNlLg0KLQkgICANCi0tLT4NCi08ZmFjZXMtY29uZmlnIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiIHhtbG5zOnhpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hJbmNsdWRlIj4NCi0gIDx4aTppbmNsdWRlIGhyZWY9ImNvbXBvbmVudHMvdHJpbmlkYWQvZmFjZXMvQ29tbWFuZC54bWwiIHhwb2ludGVyPSIvZmFjZXMtY29uZmlnLyoiPjwveGk6aW5jbHVkZT4NCi0gIDx4aTppbmNsdWRlIGhyZWY9ImV2ZW50cy9qYXZheC9mYWNlcy9BY3Rpb24ueG1sIiB4cG9pbnRlcj0iL2ZhY2VzLWNvbmZpZy8qIj48L3hpOmluY2x1ZGU+DQotICA8eGk6aW5jbHVkZSBocmVmPSJldmVudHMvdHJpbmlkYWQvZmFjZXMvTGF1bmNoLnhtbCIgeHBvaW50ZXI9Ii9mYWNlcy1jb25maWcvKiI+PC94aTppbmNsdWRlPg0KLSAgPHhpOmluY2x1ZGUgaHJlZj0iZXZlbnRzL3RyaW5pZGFkL2ZhY2VzL1JldHVybi54bWwiIHhwb2ludGVyPSIvZmFjZXMtY29uZmlnLyoiPjwveGk6aW5jbHVkZT4NCi08L2ZhY2VzLWNvbmZpZz4NCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvTUVUQS1JTkYvbWF2ZW4tZmFjZXMtcGx1Z2luL3Rlc3RHZW5lcmF0ZS5sc3QgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvTUVUQS1JTkYvbWF2ZW4tZmFjZXMtcGx1Z2luL3Rlc3RHZW5lcmF0ZS5sc3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyZWU0NTcuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL01FVEEtSU5GL21hdmVuLWZhY2VzLXBsdWdpbi90ZXN0R2VuZXJhdGUubHN0CisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJz8+DQotPCEtLQ0KLSAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICAgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICAgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gICAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICAgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICAgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gICAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgICB1bmRlciB0aGUgTGljZW5zZS4NCi0JICAgDQotLS0+DQotPGZhY2VzLWNvbmZpZyB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIiB4bWxuczp4aT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YSW5jbHVkZSI+DQotICA8eGk6aW5jbHVkZSBocmVmPSJjb21wb25lbnRzL3RyaW5pZGFkL2ZhY2VzL0NvbW1hbmQueG1sIiB4cG9pbnRlcj0iL2ZhY2VzLWNvbmZpZy8qIj48L3hpOmluY2x1ZGU+DQotICA8eGk6aW5jbHVkZSBocmVmPSJldmVudHMvamF2YXgvZmFjZXMvQWN0aW9uLnhtbCIgeHBvaW50ZXI9Ii9mYWNlcy1jb25maWcvKiI+PC94aTppbmNsdWRlPg0KLSAgPHhpOmluY2x1ZGUgaHJlZj0iZXZlbnRzL3RyaW5pZGFkL2ZhY2VzL0xhdW5jaC54bWwiIHhwb2ludGVyPSIvZmFjZXMtY29uZmlnLyoiPjwveGk6aW5jbHVkZT4NCi0gIDx4aTppbmNsdWRlIGhyZWY9ImV2ZW50cy90cmluaWRhZC9mYWNlcy9SZXR1cm4ueG1sIiB4cG9pbnRlcj0iL2ZhY2VzLWNvbmZpZy8qIj48L3hpOmluY2x1ZGU+DQotPC9mYWNlcy1jb25maWc+DQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL01FVEEtSU5GL21hdmVuLWZhY2VzLXBsdWdpbi90ZXN0U2tpcEFQSS5sc3QgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvTUVUQS1JTkYvbWF2ZW4tZmFjZXMtcGx1Z2luL3Rlc3RTa2lwQVBJLmxzdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDFhNTFiZC4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvTUVUQS1JTkYvbWF2ZW4tZmFjZXMtcGx1Z2luL3Rlc3RTa2lwQVBJLmxzdAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWNvbXBvbmVudHMvamF2YXgvZmFjZXMvTmFtaW5nQ29udGFpbmVyLnhtbApkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1pMThuLXBsdWdpbi9MSUNFTlNFLnR4dCBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtaTE4bi1wbHVnaW4vTElDRU5TRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2NDU2OTUuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1pMThuLXBsdWdpbi9MSUNFTlNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDIwMiArMCwwIEBACi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0Ci0gICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvCi0KLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTgotCi0gICAxLiBEZWZpbml0aW9ucy4KLQotICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwKLSAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgotCi0gICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgotCi0gICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsCi0gICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCi0gICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLAotICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlCi0gICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgotICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlCi0gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5LgotCi0gICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLgotCi0gICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywKLSAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24KLSAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCi0KLSAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsCi0gICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0Ci0gICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sCi0gICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuCi0KLSAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yCi0gICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhCi0gICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKLSAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuCi0KLSAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKLSAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUKLSAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMKLSAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCi0gICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4KLSAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwKLSAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCi0KLSAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nCi0gICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCi0gICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkKLSAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIKLSAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgotICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiCi0gICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50Ci0gICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bwotICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywKLSAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlCi0gICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKLSAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlCi0gICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiIKLQotICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKLSAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZAotICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCi0KLSAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKLSAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLAotICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCi0gICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLgotCi0gICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKLSAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLAotICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUKLSAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCi0gICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpCi0gICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQotICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKLSAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsKLSAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0Ci0gICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCi0gICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUKLSAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4KLQotICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUKLSAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dAotICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKLSAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotCi0gICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgotICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kCi0KLSAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKLSAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQKLQotICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCi0gICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZAotICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssCi0gICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgotICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQKLQotICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCi0gICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdAotICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZAotICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAotICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQotICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkCi0gICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgotICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLAotICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQKLSAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKLSAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kCi0gICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24KLSAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQotICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZAotICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZAotICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KLQotICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kCi0gICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCi0gICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yCi0gICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwKLSAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAotICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4KLQotICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAotICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrCi0gICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCi0gICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5Ci0gICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZAotICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgotCi0gICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlCi0gICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCi0gICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUKLSAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLgotCi0gICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IKLSAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gKLSAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucwotICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQotICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlCi0gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkKLSAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KLQotICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksCi0gICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKLSAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5Ci0gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQotICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAotICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhCi0gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlCi0gICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCi0gICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbAotICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcgotICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgotCi0gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nCi0gICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAotICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwKLSAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzCi0gICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQotICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYKLSAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwKLSAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQotICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbgotICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuCi0KLSAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUwotCi0gICBBUFBFTkRJWDogSG93IHRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmsuCi0KLSAgICAgIFRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmssIGF0dGFjaCB0aGUgZm9sbG93aW5nCi0gICAgICBib2lsZXJwbGF0ZSBub3RpY2UsIHdpdGggdGhlIGZpZWxkcyBlbmNsb3NlZCBieSBicmFja2V0cyAiW10iCi0gICAgICByZXBsYWNlZCB3aXRoIHlvdXIgb3duIGlkZW50aWZ5aW5nIGluZm9ybWF0aW9uLiAoRG9uJ3QgaW5jbHVkZQotICAgICAgdGhlIGJyYWNrZXRzISkgIFRoZSB0ZXh0IHNob3VsZCBiZSBlbmNsb3NlZCBpbiB0aGUgYXBwcm9wcmlhdGUKLSAgICAgIGNvbW1lbnQgc3ludGF4IGZvciB0aGUgZmlsZSBmb3JtYXQuIFdlIGFsc28gcmVjb21tZW5kIHRoYXQgYQotICAgICAgZmlsZSBvciBjbGFzcyBuYW1lIGFuZCBkZXNjcmlwdGlvbiBvZiBwdXJwb3NlIGJlIGluY2x1ZGVkIG9uIHRoZQotICAgICAgc2FtZSAicHJpbnRlZCBwYWdlIiBhcyB0aGUgY29weXJpZ2h0IG5vdGljZSBmb3IgZWFzaWVyCi0gICAgICBpZGVudGlmaWNhdGlvbiB3aXRoaW4gdGhpcmQtcGFydHkgYXJjaGl2ZXMuCi0KLSAgIENvcHlyaWdodCBbeXl5eV0gW25hbWUgb2YgY29weXJpZ2h0IG93bmVyXQotCi0gICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1pMThuLXBsdWdpbi9OT1RJQ0UudHh0IGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1pMThuLXBsdWdpbi9OT1RJQ0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYTNkYmQ2Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtaTE4bi1wbHVnaW4vTk9USUNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLT09ICBOT1RJQ0UgZmlsZSBjb3JyZXNwb25kaW5nIHRvIHNlY3Rpb24gNChkKSBvZiB0aGUgQXBhY2hlIExpY2Vuc2UsICAgPT0KLT09ICBWZXJzaW9uIDIuMCwgaW4gdGhpcyBjYXNlIGZvciB0aGUgQXBhY2hlIE15RmFjZXMgTWF2ZW4gUGx1Z2lucyAgICAgPT0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSAKLVRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuCi0KLVBvcnRpb25zIG9mIHRoaXMgc29mdHdhcmUgd2VyZSBvcmlnaW5hbGx5IGJhc2VkIG9uIHRoZSBmb2xsb3dpbmc6Ci0KLSAtIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDA2LCBPcmFjbGUgQ29ycCwgPGh0dHA6Ly93d3cub3JhY2xlLmNvbS8+LgotYW5kIGFyZSBsaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gdW5kZXIgdGhlIAotIlNvZnR3YXJlIEdyYW50IGFuZCBDb3Jwb3JhdGUgQ29udHJpYnV0aW9uIExpY2Vuc2UgQWdyZWVtZW50IgotCi1TZWUgdGhlIExJQ0VOU0UudHh0IGZpbGUgZm9yIGluZm9ybWF0aW9uIG9uIGFsbCBsaWNlbnNlcyAKLWFzc29jaWF0ZWQgd2l0aCB0aGlzIHNvZnR3YXJlLgpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1pMThuLXBsdWdpbi9wb20ueG1sIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1pMThuLXBsdWdpbi9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNzEyYmMyLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtaTE4bi1wbHVnaW4vcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLTwhLS0KLSAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gICAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gICAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gICAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICAgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICAgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICAgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgICB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLQotICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0KLSAgPHBhcmVudD4KLSAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzPC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1wbHVnaW4tcGFyZW50PC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+MS4wLjU8L3ZlcnNpb24+Ci0gICAgICA8cmVsYXRpdmVQYXRoPi4uL215ZmFjZXMtcGx1Z2luLXBhcmVudC9wb20ueG1sPC9yZWxhdGl2ZVBhdGg+Ci0gIDwvcGFyZW50PgotCi0gIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzPC9ncm91cElkPgotICA8YXJ0aWZhY3RJZD5teWZhY2VzLWkxOG4tcGx1Z2luPC9hcnRpZmFjdElkPgotICA8dmVyc2lvbj4xLjAuMS1TTkFQU0hPVDwvdmVyc2lvbj4KLSAgPHBhY2thZ2luZz5tYXZlbi1wbHVnaW48L3BhY2thZ2luZz4KLSAgPG5hbWU+QXBhY2hlIE15RmFjZXMgQnVpbGR0b29scyBNYXZlbjIgaTE4biBQbHVnaW48L25hbWU+Ci0KLSAgPHNjbT4KLSAgICA8Y29ubmVjdGlvbj5zY206c3ZuOmh0dHA6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvbXlmYWNlcy9teWZhY2VzLWJ1aWxkLXRvb2xzL3RydW5rL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtaTE4bi1wbHVnaW48L2Nvbm5lY3Rpb24+Ci0gICAgPGRldmVsb3BlckNvbm5lY3Rpb24+c2NtOnN2bjpodHRwczovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9teWZhY2VzL215ZmFjZXMtYnVpbGQtdG9vbHMvdHJ1bmsvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1pMThuLXBsdWdpbjwvZGV2ZWxvcGVyQ29ubmVjdGlvbj4KLSAgICA8dXJsPmh0dHA6Ly9zdm4uYXBhY2hlLm9yZy92aWV3dmMvbXlmYWNlcy9teWZhY2VzLWJ1aWxkLXRvb2xzL3RydW5rL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtaTE4bi1wbHVnaW48L3VybD4KLSAgPC9zY20+Ci0KLSAgPGJ1aWxkPgotICAgIDxwbHVnaW5zPgotICAgICAgPHBsdWdpbj4KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgotICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1jb21waWxlci1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgIDxpbmhlcml0ZWQ+dHJ1ZTwvaW5oZXJpdGVkPgotICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICA8c291cmNlPjEuNDwvc291cmNlPgotICAgICAgICAgIDx0YXJnZXQ+MS40PC90YXJnZXQ+Ci0gICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgIDwvcGx1Z2luPgotICAgICAgPHBsdWdpbj4KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgotICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1wbHVnaW4tcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj4yLjI8L3ZlcnNpb24+Ci0gICAgICA8L3BsdWdpbj4KLSAgICA8L3BsdWdpbnM+Ci0gIDwvYnVpbGQ+Ci0KLSAgPGRlcGVuZGVuY2llcz4KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW48L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1wbHVnaW4tYXBpPC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+Mi4wPC92ZXJzaW9uPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW48L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1wcm9qZWN0PC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+Mi4wPC92ZXJzaW9uPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgPC9kZXBlbmRlbmNpZXM+Ci0KLSAgPHJlcG9ydGluZz4KLSAgICA8cGx1Z2lucz4KLSAgICAgIDxwbHVnaW4+Ci0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KLSAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tcGx1Z2luLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPHZlcnNpb24+Mi4yPC92ZXJzaW9uPgotICAgICAgPC9wbHVnaW4+Ci0gICAgPC9wbHVnaW5zPgotICA8L3JlcG9ydGluZz4KLQotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1pMThuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vaTE4bi9HZW5lcmF0ZUphdmFzY3JpcHRMb2NhbGVzTW9qby5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1pMThuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vaTE4bi9HZW5lcmF0ZUphdmFzY3JpcHRMb2NhbGVzTW9qby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZGQ4NGJhLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtaTE4bi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2kxOG4vR2VuZXJhdGVKYXZhc2NyaXB0TG9jYWxlc01vam8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NiArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uaTE4bjsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uaTE4bi51aXh0b29scy5KU0xvY2FsZUVsZW1lbnRzR2VuZXJhdG9yOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5tb2RlbC5SZXNvdXJjZTsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5BYnN0cmFjdE1vam87Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnByb2plY3QuTWF2ZW5Qcm9qZWN0OwotCi0vKioKLSAqIEB2ZXJzaW9uICRJZCQKLSAqIEBnb2FsIGdlbmVyYXRlLWphdmFzY3JpcHQtbG9jYWxlcwotICogQHBoYXNlIGdlbmVyYXRlLXNvdXJjZXMKLSAqLwotcHVibGljIGNsYXNzIEdlbmVyYXRlSmF2YXNjcmlwdExvY2FsZXNNb2pvIGV4dGVuZHMgQWJzdHJhY3RNb2pvCi17Ci0gIC8qKgotICAgKiBFeGVjdXRlIHRoZSBNb2pvLgotICAgKi8KLSAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICAvLyBhZGQgZ2VuZXJhdGVkIHNvdXJjZXMgdG8gY29tcGlsYXRpb24gY2xhc3NwYXRoCi0gICAgICBhZGRSZXNvdXJjZVJvb3QodGFyZ2V0RGlyZWN0b3J5LmdldENhbm9uaWNhbFBhdGgoKSk7Ci0KLSAgICAgIEZpbGUgb3V0cHV0RGlyZWN0b3J5ID0gbmV3IEZpbGUodGFyZ2V0RGlyZWN0b3J5LCB0YXJnZXRQYXRoKTsKLQotICAgICAgLy8gSW5jcmVtZW50YWwgY2hlY2sKLSAgICAgIGJvb2xlYW4gdXB0b2RhdGUgPSBmYWxzZTsKLQotICAgICAgLy8gVE9ETzogZGV0ZXJtaW5lIGhvdyBiZXN0IHRvIGNoZWNrIGZvciBpbmNyZW1lbnRhbAotLy8gICAgICBpZiAoIWZvcmNlKQotLy8gICAgICB7Ci0vLyAgICAgICAgU3RyaW5nW10gbG9jYWxlU3RyaW5ncyA9IGdldExvY2FsZVN0cmluZ3MoKTsKLS8vICAgICAgICBTdHJpbmcgYnVuZGxlUGF0aCA9IEpTTG9jYWxlRWxlbWVudHNHZW5lcmF0b3IuX0RFRkFVTFRfQlVORExFX0xPQ0FUSU9OX1BBVEg7Ci0vLyAgICAgICAgZm9yIChpbnQgaT0wOyBpIDwgbG9jYWxlU3RyaW5ncy5sZW5ndGg7IGkrKykKLS8vICAgICAgICB7Ci0vLyAgICAgICAgICBTdHJpbmcgcGF0aCA9IGJ1bmRsZVBhdGggKyAiTG9jYWxlRWxlbWVudHMiICsKLS8vICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxlU3RyaW5nc1tpXSArICIuamF2YSI7Ci0vLyAgICAgICAgICBGaWxlIHRhcmdldEZpbGUgPSBuZXcgRmlsZSh0YXJnZXREaXJlY3RvcnksIHBhdGgpOwotLy8gICAgICAgICAgaWYgKCF0YXJnZXRGaWxlLmV4aXN0cygpKQotLy8gICAgICAgICAgewotLy8gICAgICAgICAgICB1cHRvZGF0ZSA9IGZhbHNlOwotLy8gICAgICAgICAgICBicmVhazsKLS8vICAgICAgICAgIH0KLS8vICAgICAgICB9Ci0vLyAgICAgIH0KLQotICAgICAgaWYgKGZvcmNlIHx8ICF1cHRvZGF0ZSkKLSAgICAgIHsKLSAgICAgICAgZ2V0TG9nKCkuaW5mbygiR2VuZXJhdGluZyBKYXZhc2NyaXB0IExvY2FsZXMiKTsKLQotICAgICAgICBMaXN0IGFyZ3NMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0gICAgICAgIGFyZ3NMaXN0LmFkZCgib3V0RGlyPSIgKyBvdXRwdXREaXJlY3RvcnkuZ2V0Q2Fub25pY2FsUGF0aCgpKTsKLSAgICAgICAgYXJnc0xpc3QuYWRkKCJ3cml0ZUphdmFzY3JpcHQ9dHJ1ZSIpOwotICAgICAgICBhcmdzTGlzdC5hZGQoIndyaXRlU291cmNlPWZhbHNlIik7Ci0gICAgICAgIGFyZ3NMaXN0LmFkZCgidmVyYm9zZT1mYWxzZSIpOwotICAgICAgICBhcmdzTGlzdC5hZGQoInByZXR0eVByaW50PXRydWUiKTsKLQotICAgICAgICBTdHJpbmdbXSBhcmdzID0gKFN0cmluZ1tdKWFyZ3NMaXN0LnRvQXJyYXkobmV3IFN0cmluZ1swXSk7Ci0gICAgICAgIEpTTG9jYWxlRWxlbWVudHNHZW5lcmF0b3IubWFpbihhcmdzKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgZ2V0TG9nKCkuaW5mbygiTm90aGluZyB0byBnZW5lcmF0ZSAtIEphdmFzY3JpcHQgTG9jYWxlcyBhcmUgdXAgdG8gZGF0ZSIpOwotICAgICAgfQotICAgIH0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgIHRocm93IG5ldyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKLSAgICB9Ci0gIH0KLQotICAvLyBUT0RPOiB1c2UgcHJvamVjdC5hZGRSZXNvdXJjZVJvb3QoKQotICBwcm90ZWN0ZWQgdm9pZCBhZGRSZXNvdXJjZVJvb3QoCi0gICAgU3RyaW5nIHJlc291cmNlUm9vdCkKLSAgewotICAgIExpc3QgcmVzb3VyY2VzID0gcHJvamVjdC5nZXRCdWlsZCgpLmdldFJlc291cmNlcygpOwotICAgIFJlc291cmNlIHJlc291cmNlID0gbmV3IFJlc291cmNlKCk7Ci0gICAgcmVzb3VyY2Uuc2V0RGlyZWN0b3J5KHJlc291cmNlUm9vdCk7Ci0gICAgcmVzb3VyY2VzLmFkZChyZXNvdXJjZSk7Ci0gIH0KLQotICBwcml2YXRlIFN0cmluZ1tdIGdldExvY2FsZVN0cmluZ3MoKQotICB7Ci0gICAgaWYgKCJlbl9VUyIuZXF1YWxzKGxvY2FsZSkpCi0gICAgewotICAgICAgcmV0dXJuIG5ldyBTdHJpbmdbXSB7ICIiIH07Ci0gICAgfQotCi0gICAgTG9jYWxlW10gbG9jYWxlcyA9IExvY2FsZS5nZXRBdmFpbGFibGVMb2NhbGVzKCk7Ci0gICAgU3RyaW5nW10gbG9jYWxlU3RyaW5ncyA9IG5ldyBTdHJpbmdbbG9jYWxlcy5sZW5ndGhdOwotCi0gICAgZm9yIChpbnQgaT0wOyBpIDwgbG9jYWxlU3RyaW5ncy5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBsb2NhbGVTdHJpbmdzW2ldID0gbG9jYWxlc1tpXS5nZXREaXNwbGF5TmFtZSgpOwotICAgIH0KLQotICAgIHJldHVybiBsb2NhbGVTdHJpbmdzOwotICB9Ci0KLSAgLyoqCi0gICAqIEBwYXJhbWV0ZXIgZXhwcmVzc2lvbj0iJHtwcm9qZWN0fSIKLSAgICogQHJlcXVpcmVkCi0gICAqIEByZWFkb25seQotICAgKi8KLSAgcHJpdmF0ZSBNYXZlblByb2plY3QgcHJvamVjdDsKLQotICAvKioKLSAgICogQHBhcmFtZXRlciBleHByZXNzaW9uPSIke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9tYXZlbi1pMThuLXBsdWdpbi9tYWluL2phdmFzY3JpcHQiCi0gICAqIEByZXF1aXJlZAotICAgKi8KLSAgcHJpdmF0ZSBGaWxlIHRhcmdldERpcmVjdG9yeTsKLQotICAvKioKLSAgICogQHBhcmFtZXRlcgotICAgKi8KLSAgcHJpdmF0ZSBTdHJpbmcgdGFyZ2V0UGF0aCA9ICIiOwotCi0gIC8qKgotICAgKiBAcGFyYW1ldGVyCi0gICAqLwotICBwcml2YXRlIFN0cmluZyBsb2NhbGU7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbWV0ZXIKLSAgICovCi0gIHByaXZhdGUgYm9vbGVhbiBmb3JjZTsKLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtaTE4bi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2kxOG4vR2VuZXJhdGVMb2NhbGVFbGVtZW50c01vam8uamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtaTE4bi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2kxOG4vR2VuZXJhdGVMb2NhbGVFbGVtZW50c01vam8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmVkNThiYS4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWkxOG4tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9pMThuL0dlbmVyYXRlTG9jYWxlRWxlbWVudHNNb2pvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzkgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmkxOG47Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmkxOG4udWl4dG9vbHMuSlNMb2NhbGVFbGVtZW50c0dlbmVyYXRvcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLkFic3RyYWN0TW9qbzsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5Nb2pvRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucHJvamVjdC5NYXZlblByb2plY3Q7Ci0KLS8qKgotICogQHZlcnNpb24gJElkJAotICogQGdvYWwgZ2VuZXJhdGUtbG9jYWxlLWVsZW1lbnRzCi0gKiBAcGhhc2UgZ2VuZXJhdGUtc291cmNlcwotICovCi1wdWJsaWMgY2xhc3MgR2VuZXJhdGVMb2NhbGVFbGVtZW50c01vam8gZXh0ZW5kcyBBYnN0cmFjdE1vam8KLXsKLSAgLyoqCi0gICAqIEV4ZWN1dGUgdGhlIE1vam8uCi0gICAqLwotICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIE1vam9FeGVjdXRpb25FeGNlcHRpb24KLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIC8vIGFkZCBnZW5lcmF0ZWQgc291cmNlcyB0byBjb21waWxhdGlvbiBjbGFzc3BhdGgKLSAgICAgIHByb2plY3QuYWRkQ29tcGlsZVNvdXJjZVJvb3QodGFyZ2V0RGlyZWN0b3J5LmdldENhbm9uaWNhbFBhdGgoKSk7Ci0KLSAgICAgIC8vIEluY3JlbWVudGFsIGNoZWNrCi0gICAgICBib29sZWFuIHVwdG9kYXRlID0gdHJ1ZTsKLQotICAgICAgaWYgKCFmb3JjZSkKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nW10gbG9jYWxlU3RyaW5ncyA9IGdldExvY2FsZVN0cmluZ3MoKTsKLSAgICAgICAgU3RyaW5nIGJ1bmRsZVBhdGggPSBKU0xvY2FsZUVsZW1lbnRzR2VuZXJhdG9yLl9ERUZBVUxUX0JVTkRMRV9MT0NBVElPTl9QQVRIOwotICAgICAgICBmb3IgKGludCBpPTA7IGkgPCBsb2NhbGVTdHJpbmdzLmxlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgU3RyaW5nIHBhdGggPSBidW5kbGVQYXRoICsgIkxvY2FsZUVsZW1lbnRzIiArCi0gICAgICAgICAgICAgICAgICAgICAgICBsb2NhbGVTdHJpbmdzW2ldICsgIi5qYXZhIjsKLSAgICAgICAgICBGaWxlIHRhcmdldEZpbGUgPSBuZXcgRmlsZSh0YXJnZXREaXJlY3RvcnksIHBhdGgpOwotICAgICAgICAgIGlmICghdGFyZ2V0RmlsZS5leGlzdHMoKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICB1cHRvZGF0ZSA9IGZhbHNlOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGlmIChmb3JjZSB8fCAhdXB0b2RhdGUpCi0gICAgICB7Ci0gICAgICAgIGdldExvZygpLmluZm8oIkdlbmVyYXRpbmcgTG9jYWxlRWxlbWVudHMiKTsKLQotICAgICAgICBMaXN0IGFyZ3NMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0gICAgICAgIGFyZ3NMaXN0LmFkZCgic291cmNlRGlyPSIgKyB0YXJnZXREaXJlY3RvcnkuZ2V0Q2Fub25pY2FsUGF0aCgpKTsKLSAgICAgICAgYXJnc0xpc3QuYWRkKCJidW5kbGVPdXREaXI9IiArIHRhcmdldERpcmVjdG9yeS5nZXRDYW5vbmljYWxQYXRoKCkpOwotICAgICAgICBhcmdzTGlzdC5hZGQoIndyaXRlSmF2YXNjcmlwdD1mYWxzZSIpOwotICAgICAgICBhcmdzTGlzdC5hZGQoIndyaXRlU291cmNlPXRydWUiKTsKLSAgICAgICAgYXJnc0xpc3QuYWRkKCJnZW5lcmF0ZUJ1bmRsZUJhc2VPbmx5PSIgKyAoImVuX1VTIi5lcXVhbHMobG9jYWxlKSkpOwotICAgICAgICBhcmdzTGlzdC5hZGQoInZlcmJvc2U9ZmFsc2UiKTsKLSAgICAgICAgYXJnc0xpc3QuYWRkKCJwcmV0dHlQcmludD10cnVlIik7Ci0KLSAgICAgICAgU3RyaW5nW10gYXJncyA9IChTdHJpbmdbXSlhcmdzTGlzdC50b0FycmF5KG5ldyBTdHJpbmdbMF0pOwotICAgICAgICBKU0xvY2FsZUVsZW1lbnRzR2VuZXJhdG9yLm1haW4oYXJncyk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGdldExvZygpLmluZm8oIk5vdGhpbmcgdG8gZ2VuZXJhdGUgLSBMb2NhbGVFbGVtZW50cyBhcmUgdXAgdG8gZGF0ZSIpOwotICAgICAgfQotICAgIH0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgIHRocm93IG5ldyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIFN0cmluZ1tdIGdldExvY2FsZVN0cmluZ3MoKQotICB7Ci0gICAgaWYgKCJlbl9VUyIuZXF1YWxzKGxvY2FsZSkpCi0gICAgewotICAgICAgcmV0dXJuIG5ldyBTdHJpbmdbXSB7ICIiIH07Ci0gICAgfQotCi0gICAgTG9jYWxlW10gbG9jYWxlcyA9IExvY2FsZS5nZXRBdmFpbGFibGVMb2NhbGVzKCk7Ci0gICAgU3RyaW5nW10gbG9jYWxlU3RyaW5ncyA9IG5ldyBTdHJpbmdbbG9jYWxlcy5sZW5ndGhdOwotCi0gICAgZm9yIChpbnQgaT0wOyBpIDwgbG9jYWxlU3RyaW5ncy5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBsb2NhbGVTdHJpbmdzW2ldID0gbG9jYWxlc1tpXS5nZXREaXNwbGF5TmFtZSgpOwotICAgIH0KLQotICAgIHJldHVybiBsb2NhbGVTdHJpbmdzOwotICB9Ci0KLSAgLyoqCi0gICAqIEBwYXJhbWV0ZXIgZXhwcmVzc2lvbj0iJHtwcm9qZWN0fSIKLSAgICogQHJlcXVpcmVkCi0gICAqIEByZWFkb25seQotICAgKi8KLSAgcHJpdmF0ZSBNYXZlblByb2plY3QgcHJvamVjdDsKLQotICAvKioKLSAgICogQHBhcmFtZXRlciBleHByZXNzaW9uPSIke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9tYXZlbi1pMThuLXBsdWdpbi9tYWluL2phdmEiCi0gICAqIEByZXF1aXJlZAotICAgKi8KLSAgcHJpdmF0ZSBGaWxlIHRhcmdldERpcmVjdG9yeTsKLQotICAvKioKLSAgICogQHBhcmFtZXRlcgotICAgKi8KLSAgcHJpdmF0ZSBTdHJpbmcgbG9jYWxlOwotCi0gIC8qKgotICAgKiBAcGFyYW1ldGVyCi0gICAqLwotICBwcml2YXRlIGJvb2xlYW4gZm9yY2U7Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWkxOG4tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9pMThuL3VpeHRvb2xzL0pTTG9jYWxlRWxlbWVudHNHZW5lcmF0b3IuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtaTE4bi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2kxOG4vdWl4dG9vbHMvSlNMb2NhbGVFbGVtZW50c0dlbmVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZGQ1ZGVmLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtaTE4bi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2kxOG4vdWl4dG9vbHMvSlNMb2NhbGVFbGVtZW50c0dlbmVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTA2ICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5pMThuLnVpeHRvb2xzOwotCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZFdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLldyaXRlcjsKLWltcG9ydCBqYXZhLnRleHQuRGVjaW1hbEZvcm1hdDsKLWltcG9ydCBqYXZhLnRleHQuRGVjaW1hbEZvcm1hdFN5bWJvbHM7Ci1pbXBvcnQgamF2YS50ZXh0Lk51bWJlckZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotLyoqCi0gKiBHZW5lcmF0ZXMgSmF2YVNjcmlwdCBsaWJyYXJpZXMgY29udGFpbmluZyB0aGUgTG9jYWxlIGluZm9ybWF0aW9uIGZyb20KLSAqIEphdmEuCi0gKiBAdmVyc2lvbiAkTmFtZTogICQgKCRSZXZpc2lvbjogMS4zICQpICREYXRlOiAyMDA0LzAzLzI1IDIyOjM2OjQyICQKLSAqLwotcHVibGljIGNsYXNzIEpTTG9jYWxlRWxlbWVudHNHZW5lcmF0b3IKLXsKLSAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oCi0gICAgU3RyaW5nW10gYXJncwotICAgICkKLSAgewotCi0gICAgaWYgKChhcmdzLmxlbmd0aCA9PSAxKSAmJiAoIj8iLmVxdWFscyhhcmdzWzBdKSkpCi0gICAgewotICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJHZW5lcmF0ZXMgSmF2YVNjcmlwdCBMb2NhbGUgaW5mb3JtYXRpb24gZmlsZXMiKTsKLSAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiZm9yIHRoZSBMb2NhbGVzIGF2YWlsYWJsZSBpbiB0aGUgSlZNLiIpOwotICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJUaGVzZSBmaWxlcyBhcmUgdXNlZCBieSB0aGUgQ2FibyBIVE1MIGNsaWVudCIpOwotICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJsb2dpYyB0byBoYW5kbGUgZGF0ZSBmb3JtYXR0aW5nIGFuZCB2YWxpZGF0aW9uLiIpOwotICAgICAgU3lzdGVtLm91dC5wcmludGxuKCk7Ci0gICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlBhcmFtZXRlcnM6Iik7Ci0gICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlx0cHJldHR5UHJpbnQ9ZmFsc2VcdFR1cm5zIG9mZiBwcmV0dHkgcHJpbnRlZCBvdXRwdXQiKTsKLSAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiXHRvdXREaXI9W3BhdGhdXHRcdERpcmVjdG9yeSBwYXRoIHRvIHdyaXRlIEphdmFTY3JpcHQgZmlsZXMgdG8iKTsKLSAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiXHRzb3VyY2VEaXI9W3BhdGhdXHRcdFJvb3QgZGlyZWN0b3J5IHBhdGggdG8gd3JpdGUgSmF2YSBzb3VyY2UgdG8iKTsKLSAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigKLSAgICAgICAgICAiXHRidW5kbGVPdXREaXI9W3BhdGhdXHRcdFJvb3QgZGlyZWN0b3J5IHBhdGggdG8gd3JpdGUgIiArCi0gICAgICAgICAgIkphdmEgUmVzb3VyY2VCdW5kbGVzIHRvIChkZWZhdWx0cyB0byBzb3VyY2VEaXIpLiIpOwotICAgICAgU3lzdGVtLm91dC5wcmludGxuKAotICAgICAgICAgICJcdHZhcmlhbnQ9W3ZhcmlhbnQgbmFtZV1cdFx0SWYgc3VwcGxpZWQgdXRpbGl0eSB3aWxsIGdlbmVyYXRlICIgKwotICAgICAgICAgICJSZXNvdXJjZUJ1bmRsZXMgZm9yIHRoaXMgdmFyaWFudCwgYW5kIG5vdGhpbmcgZWxzZS4iKTsKLSAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiXHR2ZXJib3NlPXRydWVcdFx0VHVybnMgb24gdmVyYm9zZSBvdXRwdXQiKTsKLSAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiXHRnZW5lcmF0ZUJ1bmRsZUJhc2VPbmx5PXRydWVcdFx0R2VuZXJhdGVzIHRoZSBiYXNlIExvY2FsZUVsZW1lbnQuamF2YSBmaWxlIG9ubHkiKTsKLSAgICAgIFN5c3RlbS5leGl0KDApOwotICAgIH0KLQotICAgIC8vIHdoZXRoZXIgdGhlIG91dHB1dCBzaG91bGQgYmUgcHJldHR5IHByaW50ZWQgZm9yIGxlZ2liaWxpdHkKLSAgICBib29sZWFuIHByZXR0eVByaW50ID0gZ2V0QXJnQm9vbGVhblZhbHVlKGFyZ3MsICJwcmV0dHlQcmludCIsIHRydWUpOwotCi0gICAgLy8gd2hldGhlciB2ZXJib3NlIG91cHV0IHNob3VsZCBiZSBnZW5lcmF0ZWQuCi0gICAgYm9vbGVhbiB2ZXJib3NlID0gZ2V0QXJnQm9vbGVhblZhbHVlKGFyZ3MsICJ2ZXJib3NlIiwgZmFsc2UpOwotCi0gICAgYm9vbGVhbiB3cml0ZVNvdXJjZSA9IGdldEFyZ0Jvb2xlYW5WYWx1ZShhcmdzLCAid3JpdGVTb3VyY2UiLCB0cnVlKTsKLSAgICBib29sZWFuIHdyaXRlSmF2YXNjcmlwdCA9IGdldEFyZ0Jvb2xlYW5WYWx1ZShhcmdzLCAid3JpdGVKYXZhc2NyaXB0IiwgdHJ1ZSk7Ci0KLSAgICAvLyB3aGV0aGVyIG9ubHkgdGhlIEJhc2UgTG9jYWxlRWxlbWVudHMuamF2YSBmaWxlIHNob3VsZCBiZSBjcmVhdGVkLgotICAgIC8vIHRoaXMgaXMgYmFzZWQgb24gdGhlIExvY2FsZS5VUwotICAgIGJvb2xlYW4gZ2VuZXJhdGVCdW5kbGVCYXNlT25seSA9IGdldEFyZ0Jvb2xlYW5WYWx1ZShhcmdzLCJnZW5lcmF0ZUJ1bmRsZUJhc2VPbmx5IixmYWxzZSk7Ci0KLSAgICAvLyB0aGUgb3V0cHV0IGRpcmVjdG9yeQotICAgIFN0cmluZyBvdXREaXIgPSBnZXRBcmdTdHJpbmdWYWx1ZShhcmdzLCAib3V0RGlyIiwgbnVsbCk7Ci0KLSAgICBpZiAob3V0RGlyID09IG51bGwpCi0gICAgewotICAgICAgb3V0RGlyID0gU3lzdGVtLmdldFByb3BlcnR5KCJ1c2VyLmRpciIpICsKLSAgICAgICAgICAgICAgIEZpbGUuc2VwYXJhdG9yICsKLSAgICAgICAgICAgICAgIF9ERUZBVUxUX0xPQ0FUSU9OX1BBVEg7Ci0gICAgfQotCi0gICAgaWYgKCFvdXREaXIuZW5kc1dpdGgoRmlsZS5zZXBhcmF0b3IpKQotICAgIHsKLSAgICAgIG91dERpciA9IG91dERpciArIEZpbGUuc2VwYXJhdG9yOwotICAgIH0KLQotCi0gICAgLy8gdGhlIHJlcXVlc3RlZCB2YXJpYW50Ci0gICAgU3RyaW5nIHZhcmlhbnQgPSBnZXRBcmdTdHJpbmdWYWx1ZShhcmdzLCAidmFyaWFudCIsIG51bGwpOwotICAgIGJvb2xlYW4gd3JpdGVBbGwgPSB0cnVlOwotICAgIGlmICh2YXJpYW50ICE9IG51bGwpCi0gICAgewotICAgICAgd3JpdGVBbGwgPSBmYWxzZTsKLSAgICAgIHZhcmlhbnQgPSB2YXJpYW50LnRvVXBwZXJDYXNlKCk7Ci0gICAgfQotCi0gICAgLy8gdGhlIHNvdXJjZSBkaXJlY3RvcnkKLSAgICBTdHJpbmcgc291cmNlRGlyID0gZ2V0QXJnU3RyaW5nVmFsdWUoYXJncywgInNvdXJjZURpciIsIG51bGwpOwotCi0gICAgaWYgKHNvdXJjZURpciA9PSBudWxsKQotICAgIHsKLSAgICAgIHNvdXJjZURpciA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgidXNlci5kaXIiKTsKLSAgICB9Ci0KLSAgICBTdHJpbmcgYnVuZGxlT3V0RGlyID0gZ2V0QXJnU3RyaW5nVmFsdWUoYXJncywgImJ1bmRsZU91dERpciIsIG51bGwpOwotCi0gICAgaWYgKGJ1bmRsZU91dERpciA9PSBudWxsKQotICAgIHsKLSAgICAgIGJ1bmRsZU91dERpciA9IHNvdXJjZURpcjsKLSAgICB9Ci0KLSAgICAvLyBUaGUgYnVuZGxlIG91dHB1dCBkaXIgaXMgdGhlIGJhc2Ugb2YgdGhlIGhlaXJhcmNoeSwgd2UnbGwgYWN0dWFsbHkgcHV0Ci0gICAgLy8gdGhlIGZpbGVzIGludG8gdGhlIGFwcHJvcHJpYXRlIHN1YiBkaXJlY3RvcnkgZm9yIHRoZSBwYWNrYWdlLgotICAgIFN0cmluZyBmdWxsQnVuZGxlT3V0RGlyID0gKGJ1bmRsZU91dERpcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKGJ1bmRsZU91dERpci5lbmRzV2l0aChGaWxlLnNlcGFyYXRvcikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICIiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBGaWxlLnNlcGFyYXRvcikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgX0RFRkFVTFRfQlVORExFX0xPQ0FUSU9OX1BBVEgpOwotCi0gICAgU3RyaW5nIHZlcnNpb24gPSBnZXRBcmdTdHJpbmdWYWx1ZShhcmdzLCAidmVyc2lvbiIsIG51bGwpOwotICAgIHZlcnNpb24gPSBWZXJzaW9uVXRpbHMubm9ybWFsaXplVmVyc2lvblN1ZmZpeCh2ZXJzaW9uKTsKLQotICAgIGlmICh2ZXJib3NlKQotICAgIHsKLSAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiV3JpdGluZyBmaWxlcyB0bzogIiArIG91dERpcik7Ci0gICAgICBpZiAod3JpdGVBbGwpCi0gICAgICB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiV3JpdGluZyBzb3VyY2UgdG86ICIgKyBzb3VyY2VEaXIpOwotICAgICAgfQotICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJXcml0aW5nIGJ1bmRsZXMgdG86ICIgKyBmdWxsQnVuZGxlT3V0RGlyKTsKLSAgICB9Ci0KLSAgICB0cnkKLSAgICB7Ci0gICAgICBGaWxlIGxvY2FsZUxpc3RGaWxlID0gbnVsbDsKLQotICAgICAgaWYgKHdyaXRlU291cmNlKQotICAgICAgewotICAgICAgICAobmV3IEZpbGUoZnVsbEJ1bmRsZU91dERpcikpLm1rZGlycygpOwotICAgICAgfQotCi0gICAgICBpZiAod3JpdGVKYXZhc2NyaXB0KQotICAgICAgewotICAgICAgICAobmV3IEZpbGUob3V0RGlyKSkubWtkaXJzKCk7Ci0gICAgICB9Ci0KLSAgICAgIGlmICh3cml0ZUFsbCAmJiB3cml0ZVNvdXJjZSAmJiAhZ2VuZXJhdGVCdW5kbGVCYXNlT25seSkKLSAgICAgIHsKLSAgICAgICAgbG9jYWxlTGlzdEZpbGUgPSBuZXcgRmlsZShzb3VyY2VEaXIsIF9MT0NBTEVfTElTVF9QQVRIKTsKLSAgICAgICAgbG9jYWxlTGlzdEZpbGUuZ2V0UGFyZW50RmlsZSgpLm1rZGlycygpOwotICAgICAgICBsb2NhbGVMaXN0RmlsZS5jcmVhdGVOZXdGaWxlKCk7Ci0gICAgICB9Ci0KLSAgICAgIExvY2FsZVtdIGxvY2FsZXMgPSBudWxsOwotCi0gICAgICBpZiAoZ2VuZXJhdGVCdW5kbGVCYXNlT25seSkKLSAgICAgIHsKLSAgICAgICAgIGxvY2FsZXMgPSBuZXcgTG9jYWxlWzFdOwotICAgICAgICAgbG9jYWxlc1swXSA9IExvY2FsZS5VUzsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgbG9jYWxlcyA9IExvY2FsZS5nZXRBdmFpbGFibGVMb2NhbGVzKCk7Ci0gICAgICB9Ci0KLSAgICAgIC8vCi0gICAgICAvLyBsb29wIHRocm91Z2ggdGhlIGF2YWlsYWJsZSBMb2NhbGVzLCB3cml0aW5nIHRoZWlyIGNvbnRlbnRzIG91dAotICAgICAgLy8gYXMgSmF2YVNjcmlwdCBsaWJyYXJpZXMgYW5kL29yIFJlc291cmNlQnVuZGxlcwotICAgICAgLy8KLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbG9jYWxlcy5sZW5ndGg7IGkrKykKLSAgICAgIHsKLSAgICAgICAgLy8gd3JpdGUgdGhlIEphdmFTQ3JpcHQgbGlicmFyeSBmb3IgdGhpcyBsb2NhbGUKLSAgICAgICAgX2dlbmVyYXRlSlNMb2NhbGVFbGVtZW50cyhvdXREaXIsIGZ1bGxCdW5kbGVPdXREaXIsIGxvY2FsZXNbaV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFudCwgcHJldHR5UHJpbnQsIHZlcmJvc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVKYXZhc2NyaXB0LCB3cml0ZVNvdXJjZSwgZ2VuZXJhdGVCdW5kbGVCYXNlT25seSwgdmVyc2lvbik7Ci0gICAgICB9Ci0KLSAgICAgIC8vIEFuZCB3cml0ZSBvdXQgYSBsaXN0aW5nIG9mIGFsbCB0aGUgbG9jYWxlcywgYnV0ICBub3Qgd2hlbiB3ZSB3YW50IHRvCi0gICAgICAvLyBqdXN0IGdlbmVyYXRlIHRoZSBiYXNlIFJlc291cmNlIGZpbGUuCi0gICAgICBpZiAod3JpdGVBbGwgJiYgd3JpdGVTb3VyY2UgJiYgIWdlbmVyYXRlQnVuZGxlQmFzZU9ubHkpCi0gICAgICB7Ci0gICAgICAgIFdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgRmlsZVdyaXRlcihsb2NhbGVMaXN0RmlsZSk7Ci0gICAgICAgIHNvdXJjZVdyaXRlci53cml0ZShfTE9DQUxFX0xJU1RfQ09ERV9TVEFSVCk7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsb2NhbGVzLmxlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgc291cmNlV3JpdGVyLndyaXRlKCIgICAgbmV3IExvY2FsZShcIiIpOwotICAgICAgICAgIHNvdXJjZVdyaXRlci53cml0ZShsb2NhbGVzW2ldLmdldExhbmd1YWdlKCkpOwotICAgICAgICAgIHNvdXJjZVdyaXRlci53cml0ZSgiXCIsXCIiKTsKLSAgICAgICAgICBzb3VyY2VXcml0ZXIud3JpdGUobG9jYWxlc1tpXS5nZXRDb3VudHJ5KCkpOwotICAgICAgICAgIHNvdXJjZVdyaXRlci53cml0ZSgiXCIsXCIiKTsKLSAgICAgICAgICBzb3VyY2VXcml0ZXIud3JpdGUobG9jYWxlc1tpXS5nZXRWYXJpYW50KCkpOwotICAgICAgICAgIHNvdXJjZVdyaXRlci53cml0ZSgiXCIpLFxuIik7Ci0gICAgICAgIH0KLSAgICAgICAgc291cmNlV3JpdGVyLndyaXRlKF9MT0NBTEVfTElTVF9DT0RFX0VORCk7Ci0gICAgICAgIHNvdXJjZVdyaXRlci5jbG9zZSgpOwotICAgICAgfQotICAgIH0KLSAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICBTeXN0ZW0uZXJyLnByaW50bG4oZSk7Ci0gICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgIH0KLQotICAgIGlmICh2ZXJib3NlKQotICAgIHsKLSAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRG9uZSB3cml0aW5nIGZpbGVzIik7Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldEFyZ1N0cmluZ1ZhbHVlKAotICAgIFN0cmluZ1tdIGFyZ3MsCi0gICAgU3RyaW5nICAgYXJnTmFtZSwKLSAgICBTdHJpbmcgICBkZWZhdWx0VmFsdWUKLSAgICApCi0gIHsKLSAgICBpbnQgYXJnTGVuZ3RoID0gYXJnTmFtZS5sZW5ndGgoKTsKLQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBTdHJpbmcgY3VyckFyZyA9IGFyZ3NbaV07Ci0KLSAgICAgIGlmIChjdXJyQXJnLnN0YXJ0c1dpdGgoYXJnTmFtZSkpCi0gICAgICB7Ci0gICAgICAgIGlmICghY3VyckFyZy5lcXVhbHMoYXJnTmFtZSkgJiYKLSAgICAgICAgICAgICgnPScgPT0gY3VyckFyZy5jaGFyQXQoYXJnTGVuZ3RoKSkpCi0gICAgICAgIHsKLSAgICAgICAgICByZXR1cm4gY3VyckFyZy5zdWJzdHJpbmcoYXJnTGVuZ3RoICsgMSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gZGVmYXVsdFZhbHVlOwotICB9Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBnZXRBcmdCb29sZWFuVmFsdWUoCi0gICAgU3RyaW5nW10gYXJncywKLSAgICBTdHJpbmcgICBhcmdOYW1lLAotICAgIGJvb2xlYW4gIGRlZmF1bHRWYWx1ZQotICAgICkKLSAgewotICAgIC8vCi0gICAgLy8gY2hlY2sgZm9yID0gdHJ1ZSBvciA9IGZhbHNlCi0gICAgLy8KLSAgICBTdHJpbmcgYXJnVmFsdWUgPSBnZXRBcmdTdHJpbmdWYWx1ZShhcmdzLCBhcmdOYW1lLCBudWxsKTsKLQotICAgIGlmIChhcmdWYWx1ZSAhPSBudWxsKQotICAgIHsKLSAgICAgIC8vIGNoZWNrIGZvciA9IHNlbGYKLSAgICAgIGlmIChhcmdOYW1lLmVxdWFscyhhcmdWYWx1ZSkpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICByZXR1cm4gQm9vbGVhbi52YWx1ZU9mKGFyZ1ZhbHVlKS5ib29sZWFuVmFsdWUoKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLwotICAgIC8vIGNoZWNrIGZvciB0aGUgbmFtZSBieSBpdHNlbGYKLSAgICAvLwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBpZiAoYXJnc1tpXS5lcXVhbHMoYXJnTmFtZSkpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgIH0KLQotICAgIC8vCi0gICAgLy8gY2hlY2sgZm9yIHRoZSBuYW1lIHR1cm5lZCBvZmYKLSAgICAvLwotICAgIFN0cmluZyBub3ROYW1lID0gIi0iICsgYXJnTmFtZTsKLQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBpZiAoYXJnc1tpXS5lcXVhbHMobm90TmFtZSkpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gZGVmYXVsdFZhbHVlOwotICB9Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBfZ2VuZXJhdGVKU0xvY2FsZUVsZW1lbnRzKAotICAgIFN0cmluZyAgb3V0RGlyLAotICAgIFN0cmluZyAgYnVuZGxlT3V0RGlyLAotICAgIExvY2FsZSAgdGFyZ2V0TG9jYWxlLAotICAgIFN0cmluZyAgdmFyaWFudCwKLSAgICBib29sZWFuIHByZXR0eVByaW50LAotICAgIGJvb2xlYW4gdmVyYm9zZSwKLSAgICBib29sZWFuIHdyaXRlSmF2YXNjcmlwdCwKLSAgICBib29sZWFuIHdyaXRlU291cmNlLAotICAgIGJvb2xlYW4gZ2VuZXJhdGVCdW5kbGVCYXNlT25seSwKLSAgICBTdHJpbmcgdmVyc2lvbgotICAgICkgdGhyb3dzIElPRXhjZXB0aW9uCi0gIHsKLSAgICBTdHJpbmcgZmlsZU5hbWU7Ci0gICAgUHJpbnRXcml0ZXIgbG9jYWxlV3JpdGVyOwotCi0gICAgaWYgKHZhcmlhbnQgPT0gbnVsbCAmJiB3cml0ZUphdmFzY3JpcHQpCi0gICAgewotICAgICAgZmlsZU5hbWUgPSBfZ2V0RmlsZU5hbWUodGFyZ2V0TG9jYWxlLCB2ZXJzaW9uLCBnZW5lcmF0ZUJ1bmRsZUJhc2VPbmx5KSArIF9KQVZBU0NSSVBUX0VYVEVOU0lPTjsKLQotICAgICAgaWYgKHZlcmJvc2UpCi0gICAgICB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiV3JpdGluZyAiICsgZmlsZU5hbWUpOwotICAgICAgfQotCi0gICAgICAvLyBjcmVhdGUgdGhlIGZpbGUgdG8gd3JpdGUgdG8KLSAgICAgIGxvY2FsZVdyaXRlciA9IG5ldyBQcmludFdyaXRlcgotICAgICAgICAobmV3IEJ1ZmZlcmVkV3JpdGVyKG5ldyBGaWxlV3JpdGVyKG91dERpciArIGZpbGVOYW1lKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBfREVGQVVMVF9CVUZGRVJfU0laRSkpOwotICAgICAgX3dyaXRlTG9jYWxlKGxvY2FsZVdyaXRlciwgdGFyZ2V0TG9jYWxlLCBwcmV0dHlQcmludCk7Ci0gICAgICBsb2NhbGVXcml0ZXIuY2xvc2UoKTsKLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIHN0YXRpYyB2b2lkIF93cml0ZUphdmFCdW5kbGUoCi0gICAgV3JpdGVyICAgICAgb3V0cHV0LAotICAgIExvY2FsZSAgICAgIHRhcmdldExvY2FsZSwKLSAgICBTdHJpbmcgICAgICBmaWxlTmFtZQotICAgICkgdGhyb3dzIElPRXhjZXB0aW9uCi0gIHsKLSAgICBvdXRwdXQud3JpdGUoX0xPQ0FMRV9KQVZBX0NPREVfU1RBUlQpOwotICAgIG91dHB1dC53cml0ZSgicHVibGljIGNsYXNzICIKLSAgICAgICAgICAgICAgICAgKyBmaWxlTmFtZQotICAgICAgICAgICAgICAgICArICIgZXh0ZW5kcyBMaXN0UmVzb3VyY2VCdW5kbGVcbntcbiIKLSAgICAgICAgICAgICAgICAgKyAiICBwdWJsaWMgT2JqZWN0W11bXSBnZXRDb250ZW50cygpXG4gIHtcbiIKLSAgICAgICAgICAgICAgICAgKyAiICAgIHJldHVybiBjb250ZW50cztcbiAgfVxuXG4iKTsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBSZXNvdXJjZUJ1bmRsZSBlbGVtZW50c0RhdGEgPQotICAgICAgICBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoX0xPQ0FMRV9FTEVNRU5UU19QQVRILCB0YXJnZXRMb2NhbGUpOwotCi0gICAgICBib29sZWFuIGRvbmVPbmUgPSBmYWxzZTsKLQotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBMT0NBTEVfRUxFTUVOVFNfR0VUX0tFWVMubGVuZ3RoOyBpICsrKQotICAgICAgewotICAgICAgICBTdHJpbmcgY3VycktleSA9IExPQ0FMRV9FTEVNRU5UU19HRVRfS0VZU1tpXTsKLQotICAgICAgICBPYmplY3QgZGF0YSA9IF9nZXRFbGVtZW50RGF0YShjdXJyS2V5LCBlbGVtZW50c0RhdGEsIHRhcmdldExvY2FsZSk7Ci0gICAgICAgIF93cml0ZUphdmFCdW5kbGVFbGVtZW50KG91dHB1dCwgY3VycktleSwgZGF0YSwgZG9uZU9uZSk7Ci0gICAgICAgIGRvbmVPbmUgPSB0cnVlOwotICAgICAgfQotICAgICAgZG9uZU9uZSA9IGZhbHNlOwotICAgICAgb3V0cHV0LndyaXRlKCIgIHN0YXRpYyBmaW5hbCBPYmplY3RbXVtdIGNvbnRlbnRzID0gXG4gIHtcbiIpOwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBMT0NBTEVfRUxFTUVOVFNfR0VUX0tFWVMubGVuZ3RoOyBpICsrKQotICAgICAgewotICAgICAgICBTdHJpbmcgY3VycktleSA9IExPQ0FMRV9FTEVNRU5UU19HRVRfS0VZU1tpXTsKLSAgICAgICAgb3V0cHV0LndyaXRlKChkb25lT25lID8gIixcbiIgOiAiIikKLSAgICAgICAgICAgICAgICAgICAgICsgIiAgICB7IFwiIgotICAgICAgICAgICAgICAgICAgICAgKyBjdXJyS2V5Ci0gICAgICAgICAgICAgICAgICAgICArICJcIiwgIgotICAgICAgICAgICAgICAgICAgICAgKyBfZ2V0S2V5QXJyYXlOYW1lKGN1cnJLZXkpCi0gICAgICAgICAgICAgICAgICAgICArICJ9Iik7Ci0gICAgICAgIGRvbmVPbmUgPSB0cnVlOwotICAgICAgfQotICAgICAgb3V0cHV0LndyaXRlKCJcbiAgfTsiKTsKLSAgICB9Ci0gICAgY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIC8vIG1ha2Ugc3VyZSB0aGF0IHRoZSBjbGFzcyB3aWxsLCBhdCBsZWFzdCwgY29tcGlsZSBldmVuIGlmIGluY29tcGxldGUuCi0gICAgICBvdXRwdXQud3JpdGUoIiAgLy8gQnVuZGxlIGdlbmVyYXRpb24gZXJyb3I6XG4gIC8vICIgKyBlKTsKLSAgICAgIG91dHB1dC53cml0ZSgiXG4gIHN0YXRpYyBmaW5hbCBPYmplY3RbXVtdIGNvbnRlbnRzID0gbnVsbDsiKTsKLSAgICAgIFN5c3RlbS5lcnIucHJpbnRsbihlKTsKLSAgICB9Ci0gICAgb3V0cHV0LndyaXRlKCJcbn1cbiIpOwotICB9Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBfd3JpdGVMb2NhbGUoCi0gICAgV3JpdGVyICAgICAgb3V0cHV0LAotICAgIExvY2FsZSAgICAgIHRhcmdldExvY2FsZSwKLSAgICBib29sZWFuICAgICBwcmV0dHlQcmludAotICAgICkgdGhyb3dzIElPRXhjZXB0aW9uCi0gIHsKLQotICAgIG91dHB1dC53cml0ZSgidmFyIExvY2FsZVN5bWJvbHNfIik7Ci0gICAgb3V0cHV0LndyaXRlKHRhcmdldExvY2FsZS50b1N0cmluZygpKTsKLSAgICBvdXRwdXQud3JpdGUoIiA9IG5ldyBMb2NhbGVTeW1ib2xzKHsiKTsKLQotICAgIGlmIChwcmV0dHlQcmludCkKLSAgICB7Ci0gICAgICBvdXRwdXQud3JpdGUoJ1xuJyk7Ci0gICAgfQotCi0gICAgRW51bWVyYXRpb24gem9uZUVudW1lcmF0aW9uID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQXJyYXlFbnVtZXJhdGlvbihEQVRFX0ZPUk1BVF9aT05FX0dFVF9LRVlTKTsKLQotICAgIC8vIHdyaXRlIHRoZSBsb2NhbGUgZWxlbWVudHMgaW50byB0aGUgZmlsZQotICAgIF93cml0ZVJlc291cmNlQ29udGVudHMob3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgX0xPQ0FMRV9FTEVNRU5UU19QQVRILAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEFycmF5RW51bWVyYXRpb24oTE9DQUxFX0VMRU1FTlRTX0dFVF9LRVlTKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldExvY2FsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHpvbmVFbnVtZXJhdGlvbi5oYXNNb3JlRWxlbWVudHMoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXR0eVByaW50KTsKLQotICAgIC8vIHdyaXRlIHRoZSBkYXRlIGZvcm1hdCBlbGVtZW50cyBpbnRvIHRoZSBmaWxlCi0gICAgX3dyaXRlUmVzb3VyY2VDb250ZW50cyhvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBfREFURV9GT1JNQVRfWk9ORV9QQVRILAotICAgICAgICAgICAgICAgICAgICAgICAgICAgem9uZUVudW1lcmF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0TG9jYWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsICAvLyB0aGlzIGlzIHRoZSBsYXN0IHJlc291cmNlIHRvIHdyaXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV0dHlQcmludCk7Ci0KLSAgICBvdXRwdXQud3JpdGUoIn0pOyIpOwotCi0gICAgaWYgKHByZXR0eVByaW50KQotICAgIHsKLSAgICAgIG91dHB1dC53cml0ZSgnXG4nKTsKLSAgICB9Ci0gIH0KLQotCi0gIHByaXZhdGUgc3RhdGljIHZvaWQgX3dyaXRlUmVzb3VyY2VDb250ZW50cygKLSAgICBXcml0ZXIgICAgICBvdXRwdXQsCi0gICAgU3RyaW5nICAgICAgYmFzZU5hbWUsCi0gICAgRW51bWVyYXRpb24ga2V5cywKLSAgICBMb2NhbGUgICAgICB0YXJnZXRMb2NhbGUsCi0gICAgYm9vbGVhbiAgICAgaGFzTW9yZVJlc291cmNlcywKLSAgICBib29sZWFuICAgICBwcmV0dHlQcmludAotICAgICkgdGhyb3dzIElPRXhjZXB0aW9uCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBSZXNvdXJjZUJ1bmRsZSBlbGVtZW50c0RhdGEgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoYmFzZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0TG9jYWxlKTsKLQotICAgICAgd2hpbGUoa2V5cy5oYXNNb3JlRWxlbWVudHMoKSkKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIGN1cnJLZXkgPSAoU3RyaW5nKWtleXMubmV4dEVsZW1lbnQoKTsKLQotICAgICAgICBPYmplY3QgZGF0YSA9IG51bGw7Ci0KLSAgICAgICAgaWYoIkN1cnJlbmN5RWxlbWVudHMiLmVxdWFscyhjdXJyS2V5KSkKLSAgICAgICAgewotICAgICAgICAgIGRhdGEgPSBfZ2V0Q3VycmVuY3lEYXRhKHRhcmdldExvY2FsZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgZGF0YSA9IF9nZXRFbGVtZW50RGF0YShjdXJyS2V5LCBlbGVtZW50c0RhdGEsIHRhcmdldExvY2FsZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBib29sZWFuIHdyb3RlRWxlbWVudCA9IF93cml0ZVJlc291cmNlRWxlbWVudCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJLZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzTW9yZVJlc291cmNlcyB8fCBrZXlzLmhhc01vcmVFbGVtZW50cygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldHR5UHJpbnQpOwotCi0gICAgICAgIGlmICh3cm90ZUVsZW1lbnQgJiYgcHJldHR5UHJpbnQpCi0gICAgICAgIHsKLSAgICAgICAgICBvdXRwdXQud3JpdGUoJ1xuJyk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIFN5c3RlbS5lcnIucHJpbnRsbihlKTsKLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIHN0YXRpYyBPYmplY3QgX2dldEN1cnJlbmN5RGF0YSgKLSAgICBMb2NhbGUgdGFyZ2V0TG9jYWxlKQotICB7Ci0gICAgRGVjaW1hbEZvcm1hdCBkZiA9IChEZWNpbWFsRm9ybWF0KSBOdW1iZXJGb3JtYXQuZ2V0Q3VycmVuY3lJbnN0YW5jZSh0YXJnZXRMb2NhbGUpOwotICAgIERlY2ltYWxGb3JtYXRTeW1ib2xzIGRlY2ltYWxGb3JtYXRTeW1ib2xzID0gZGYuZ2V0RGVjaW1hbEZvcm1hdFN5bWJvbHMoKTsKLSAgICBPYmplY3RbXSBjdXJyZW5jeURhdGEgPSBuZXcgT2JqZWN0WzZdOwotICAgIGN1cnJlbmN5RGF0YVswXSA9IGRlY2ltYWxGb3JtYXRTeW1ib2xzLmdldEN1cnJlbmN5U3ltYm9sKCk7IAotICAgIGN1cnJlbmN5RGF0YVsxXSA9IGRlY2ltYWxGb3JtYXRTeW1ib2xzLmdldEN1cnJlbmN5KCkuZ2V0Q3VycmVuY3lDb2RlKCk7Ci0gICAgY3VycmVuY3lEYXRhWzJdID0gZGYuZ2V0UG9zaXRpdmVQcmVmaXgoKTsKLSAgICBjdXJyZW5jeURhdGFbM10gPSBkZi5nZXRQb3NpdGl2ZVN1ZmZpeCgpOwotICAgIGN1cnJlbmN5RGF0YVs0XSA9IGRmLmdldE5lZ2F0aXZlUHJlZml4KCk7Ci0gICAgY3VycmVuY3lEYXRhWzVdID0gZGYuZ2V0TmVnYXRpdmVTdWZmaXgoKTsKLQotICAgIHJldHVybiBjdXJyZW5jeURhdGE7Ci0gIH0KLQotICBwcml2YXRlIHN0YXRpYyBPYmplY3QgX2dldEVsZW1lbnREYXRhKAotICAgIFN0cmluZyBjdXJyS2V5LAotICAgIFJlc291cmNlQnVuZGxlIGVsZW1lbnRzRGF0YSwKLSAgICBMb2NhbGUgdGFyZ2V0TG9jYWxlCi0gICApCi0gIHsKLSAgICByZXR1cm4gZWxlbWVudHNEYXRhLmdldE9iamVjdChjdXJyS2V5KTsKLSAgfQotCi0gIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gX3dyaXRlUmVzb3VyY2VFbGVtZW50KAotICAgIFdyaXRlciAgb3V0cHV0LAotICAgIFN0cmluZyAga2V5LAotICAgIE9iamVjdCAgdmFsdWUsCi0gICAgYm9vbGVhbiBub3RMYXN0LAotICAgIGJvb2xlYW4gcHJldHR5UHJpbnQKLSAgICApIHRocm93cyBJT0V4Y2VwdGlvbgotICB7Ci0gICAgaWYgKGtleSAhPSBudWxsKQotICAgIHsKLSAgICAgIC8vIHN0YXJ0IHdyaXRpbmcgZWxlbWVudCwgdXNpbmcga2V5IGFzIHRoZSBwcm9wZXJ0eSBuYW1lCi0gICAgICBvdXRwdXQud3JpdGUoa2V5KTsKLSAgICAgIG91dHB1dC53cml0ZSgnOicpOwotICAgIH0KLQotICAgIE9iamVjdFtdIHZhbHVlcyA9IG51bGw7Ci0gICAgaW50IHZhbHVlQ291bnQgPSAwOwotCi0gICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgT2JqZWN0W10pCi0gICAgewotICAgICAgdmFsdWVzID0gKE9iamVjdFtdKXZhbHVlOwotCi0gICAgICB2YWx1ZUNvdW50ID0gdmFsdWVzLmxlbmd0aDsKLQotICAgICAgaWYgKHZhbHVlQ291bnQgPT0gMCkKLSAgICAgIHsKLSAgICAgICAgdmFsdWUgPSAiIjsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAodmFsdWVDb3VudCAhPSAwKQotICAgIHsKLSAgICAgIC8vIG91dHB1dC53cml0ZSgibmV3IEFycmF5KCIpOwotICAgICAgb3V0cHV0LndyaXRlKCdbJyk7Ci0KLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdmFsdWVDb3VudDsgaSsrKQotICAgICAgewotICAgICAgICBfd3JpdGVSZXNvdXJjZUVsZW1lbnQob3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlc1tpXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgPCB2YWx1ZUNvdW50IC0gMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXR0eVByaW50KTsKLSAgICAgIH0KLQotICAgICAgLy9vdXRwdXQud3JpdGUoJyknKTsKLSAgICAgIG91dHB1dC53cml0ZSgnXScpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgb3V0cHV0LndyaXRlKCdcIicpOwotICAgICAgX3dyaXRlRXNjYXBlZFN0cmluZyhvdXRwdXQsIHZhbHVlLnRvU3RyaW5nKCksIGZhbHNlKTsKLSAgICAgIG91dHB1dC53cml0ZSgnXCInKTsKLSAgICB9Ci0KLSAgICBpZiAobm90TGFzdCkKLSAgICB7Ci0gICAgICBvdXRwdXQud3JpdGUoJywnKTsKLQotICAgICAgaWYgKHByZXR0eVByaW50KQotICAgICAgewotICAgICAgICBvdXRwdXQud3JpdGUoJyAnKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyB3ZSB3cm90ZSBzb21lIG91cHV0Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICBwcml2YXRlIHN0YXRpYyB2b2lkIF93cml0ZUphdmFCdW5kbGVFbGVtZW50KAotICAgIFdyaXRlciAgb3V0cHV0LAotICAgIFN0cmluZyAga2V5LAotICAgIE9iamVjdCAgdmFsdWUsCi0gICAgYm9vbGVhbiB3YXNQcmV2aW91cwotICAgICkgdGhyb3dzIElPRXhjZXB0aW9uCi0gIHsKLSAgICBvdXRwdXQud3JpdGUoIiAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nICIKLSAgICAgICAgICAgICAgICAgKyBfZ2V0S2V5QXJyYXlOYW1lKGtleSkKLSAgICAgICAgICAgICAgICAgKyAiW10iKTsKLSAgICBPYmplY3RbXSB2YWx1ZXMgPSBudWxsOwotICAgIGludCB2YWx1ZUNvdW50ID0gMDsKLSAgICBib29sZWFuIGRvbmVPbmUgPSBmYWxzZTsKLQotICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIE9iamVjdFtdKQotICAgIHsKLSAgICAgIHZhbHVlcyA9IChPYmplY3RbXSkgdmFsdWU7Ci0KLSAgICAgIHZhbHVlQ291bnQgPSB2YWx1ZXMubGVuZ3RoOwotCi0gICAgICBpZiAodmFsdWVDb3VudCA8PSAwKQotICAgICAgewotICAgICAgICB2YWx1ZXMgPSBfRU1QVFlfVkFMVUVTOwotICAgICAgICB2YWx1ZUNvdW50ID0gMTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAodmFsdWVDb3VudCA+IDApCi0gICAgewotICAgICAgb3V0cHV0LndyaXRlKCIgPSBcbiAge1xuIik7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IHZhbHVlQ291bnQ7IGkrKykKLSAgICAgIHsKLSAgICAgICAgb3V0cHV0LndyaXRlKChkb25lT25lID8gIiwgXG4iIDogIiIpICsgIiAgICBcIiIpOwotICAgICAgICBfd3JpdGVFc2NhcGVkU3RyaW5nKG91dHB1dCwgdmFsdWVzW2ldLnRvU3RyaW5nKCksIHRydWUpOwotICAgICAgICBvdXRwdXQud3JpdGUoIlwiIik7Ci0gICAgICAgIGRvbmVPbmUgPSB0cnVlOwotICAgICAgfQotICAgICAgb3V0cHV0LndyaXRlKCJcbiAgfTtcblxuIik7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBvdXRwdXQud3JpdGUoIiA9IG51bGwiKTsKLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIHN0YXRpYyB2b2lkIF93cml0ZUVzY2FwZWRTdHJpbmcoCi0gICAgV3JpdGVyIG91dHB1dCwKLSAgICBTdHJpbmcgdmFsdWUsCi0gICAgYm9vbGVhbiBpc0phdmEKLSAgICApIHRocm93cyBJT0V4Y2VwdGlvbgotICB7Ci0gICAgaW50IGxlbmd0aCA9IHZhbHVlLmxlbmd0aCgpOwotCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBjaGFyIGN1cnJDaGFyID0gdmFsdWUuY2hhckF0KGkpOwotCi0gICAgICBpZiAoY3VyckNoYXIgPiAyNTUpCi0gICAgICB7Ci0gICAgICAgIG91dHB1dC53cml0ZSgiXFx1Iik7Ci0gICAgICAgIG91dHB1dC53cml0ZShfZ2V0SGV4U3RyaW5nKGN1cnJDaGFyLCA0KSk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGlmIChpc0phdmEpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoKGN1cnJDaGFyID4gMzEpCi0gICAgICAgICAgICAgICYmIChjdXJyQ2hhciA8IDEyOCkpCi0gICAgICAgICAgewotICAgICAgICAgICAgaWYgKGN1cnJDaGFyID09ICdcIicpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIG91dHB1dC53cml0ZSgiXFxcIiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBvdXRwdXQud3JpdGUoY3VyckNoYXIpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgewotICAgICAgICAgICAgb3V0cHV0LndyaXRlKCJcXHUiKTsKLSAgICAgICAgICAgIG91dHB1dC53cml0ZShfZ2V0SGV4U3RyaW5nKGN1cnJDaGFyLCA0KSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIC8vIHdyaXRlIGFzY2lpIHByaW50YWJsZSBjaGFyYWN0ZXJzLCBleGNlcHQgZm9yIHRoZSBkb3VibGUgcXVvdGUsCi0gICAgICAgICAgLy8gd2hpY2ggbmVlZHMgdG8gYmUgZXNjYXBlZCBiZWNhdXNlIHdlIGFyZSBhbHJlYWR5IGluIGEgU3RyaW5nLgotICAgICAgICAgIGlmICgoY3VyckNoYXIgPiAzMSkgICAgJiYKLSAgICAgICAgICAgICAgKGN1cnJDaGFyIDwgMTI4KSAgICYmCi0gICAgICAgICAgICAgIChjdXJyQ2hhciAhPSAnXCInKSAmJgotICAgICAgICAgICAgICAoY3VyckNoYXIgIT0gJ1wnJykpCi0gICAgICAgICAgewotICAgICAgICAgICAgb3V0cHV0LndyaXRlKGN1cnJDaGFyKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIG91dHB1dC53cml0ZSgiXFx4Iik7Ci0gICAgICAgICAgICBvdXRwdXQud3JpdGUoX2dldEhleFN0cmluZyhjdXJyQ2hhciwgMikpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotCi0KLSAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIF9nZXRIZXhTdHJpbmcoCi0gICAgaW50IG51bWJlciwKLSAgICBpbnQgbWluRGlnaXRzCi0gICAgKQotICB7Ci0gICAgU3RyaW5nIGhleFN0cmluZyA9IEludGVnZXIudG9IZXhTdHJpbmcobnVtYmVyKTsKLQotICAgIGludCBoZXhMZW5ndGggPSBoZXhTdHJpbmcubGVuZ3RoKCk7Ci0KLSAgICBpbnQgemVyb1BhZGRpbmcgPSBtaW5EaWdpdHMgLSBoZXhMZW5ndGg7Ci0KLSAgICBpZiAoemVyb1BhZGRpbmcgPiAwKQotICAgIHsKLSAgICAgIFN0cmluZyBwYWRkZWRTdHJpbmcgPSAiMCI7Ci0KLSAgICAgIHdoaWxlICh6ZXJvUGFkZGluZyA+IDEpCi0gICAgICB7Ci0gICAgICAgIHBhZGRlZFN0cmluZyArPSAiMCI7Ci0gICAgICAgIHplcm9QYWRkaW5nLS07Ci0gICAgICB9Ci0KLSAgICAgIGhleFN0cmluZyA9IHBhZGRlZFN0cmluZyArIGhleFN0cmluZzsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGlmICh6ZXJvUGFkZGluZyA8IDApCi0gICAgICB7Ci0gICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gaGV4U3RyaW5nOwotICB9Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIF9nZXRLZXlBcnJheU5hbWUoU3RyaW5nIGtleSkKLSAgewotICAgIHJldHVybiAiX2FycmF5IiArIGtleTsKLSAgfQotCi0gIHByaXZhdGUgc3RhdGljIFN0cmluZyBfZ2V0RmlsZU5hbWUoCi0gICAgTG9jYWxlIGxvY2FsZSwKLSAgICBTdHJpbmcgdmVyc2lvbiwKLSAgICBib29sZWFuIGdlbmVyYXRlQnVuZGxlQmFzZU9ubHkKLSAgICApCi0gIHsKLQotICAgIGlmIChnZW5lcmF0ZUJ1bmRsZUJhc2VPbmx5KQotICAgIHsKLSAgICAgIHJldHVybiAiTG9jYWxlRWxlbWVudHMiOwotICAgIH0KLQotICAgIGlmICh2ZXJzaW9uID09IG51bGwpCi0gICAgewotICAgICAgcmV0dXJuICJMb2NhbGVFbGVtZW50c18iICsgbG9jYWxlOwotICAgIH0KLSAgICByZXR1cm4gIkxvY2FsZUVsZW1lbnRzXyIgKyBsb2NhbGUgKyB2ZXJzaW9uOwotICB9Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIF9nZXRMb2NhbGVTdWZmaXgoCi0gICAgTG9jYWxlIGxvY2FsZQotICAgICkKLSAgewotICAgIFN0cmluZyBsb2NhbGVTdHJpbmcgPSAgbG9jYWxlLnRvU3RyaW5nKCk7Ci0KLSAgICByZXR1cm4gbG9jYWxlU3RyaW5nLnN1YnN0cmluZyhsb2NhbGVTdHJpbmcuaW5kZXhPZignXycpKTsKLSAgfQotCi0gIC8vCi0gIC8vIEFycmF5IG9mIERhdGVGb3JtYXRab25lRGF0YSBrZXkgbmFtZXMgdG8gcmV0cmlldmUuCi0gIC8vIE9ubHkga2V5cyBmcm9tIHRoaXMgbGlzdCBhcmUgdXNlZCB0byBnZW5lcmF0ZSBsb2NhbGUgaW5mb3JtYXRpb24KLSAgLy8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gTE9DQUxFX0VMRU1FTlRTX0dFVF9LRVlTID0gCi0gIHsKLSAgICAiTW9udGhOYW1lcyIsCi0gICAgIk1vbnRoQWJicmV2aWF0aW9ucyIsCi0gICAgIkRheU5hbWVzIiwKLSAgICAiRGF5QWJicmV2aWF0aW9ucyIsCi0gICAgIkFtUG1NYXJrZXJzIiwKLSAgICAiRXJhcyIsCi0gICAgIkRhdGVUaW1lUGF0dGVybnMiLAotICAgICJEYXRlVGltZUVsZW1lbnRzIiwKLSAgICAiTnVtYmVyRWxlbWVudHMiLAotICAgICJDdXJyZW5jeUVsZW1lbnRzIiwKLSAgfTsKLQotICAvLwotICAvLyBBcnJheSBvZiBEYXRlRm9ybWF0Wm9uZURhdGEga2V5IG5hbWVzIHRvIHJldHJpZXZlLgotICAvLyBPbmx5IGtleXMgZnJvbSB0aGlzIGxpc3QgYXJlIHVzZWQgdG8gZ2VuZXJhdGUgbG9jYWxlIGluZm9ybWF0aW9uCi0gIC8vCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIExPQ0FMRV9FTEVNRU5UU19NQVBQSU5HUyA9IAotICB7Ci0gICAgIk1vbnRoTmFtZXMiLCAiZ2V0TW9udGhzIiwKLSAgICAiTW9udGhBYmJyZXZpYXRpb25zIiwgImdldFNob3J0TW9udGhzIiwKLSAgICAiRGF5TmFtZXMiLCAiZ2V0V2Vla2RheXMiLAotICAgICJEYXlBYmJyZXZpYXRpb25zIiwgImdldFNob3J0V2Vla2RheXMiLAotICAgICJBbVBtTWFya2VycyIsICJnZXRBbVBtU3RyaW5ncyIsCi0gICAgIkVyYXMiLCAiZ2V0RXJhcyIsCi0gICAgIkRhdGVUaW1lUGF0dGVybnMiLCBudWxsLAotICAgICJEYXRlVGltZUVsZW1lbnRzIiwgbnVsbCwKLSAgICAiTnVtYmVyRWxlbWVudHMiLCBudWxsCi0gIH07Ci0KLSAgLy8KLSAgLy8gQXJyYXkgb2YgTG9jYWxlRWxlbWVudHMga2V5IG5hbWVzIHRvIHJldHJpZXZlLgotICAvLyBPbmx5IGtleXMgZnJvbSB0aGlzIGxpc3QgYXJlIHVzZWQgdG8gZ2VuZXJhdGUgbG9jYWxlIGluZm9ybWF0aW9uCi0gIC8vCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIERBVEVfRk9STUFUX1pPTkVfR0VUX0tFWVMgPSB7fTsKLQotICAvLyBKMlNFIDEuMzoKLSAgLy8gcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIF9SRVNPVVJDRVNfUEFDS0FHRSA9ICJqYXZhLnRleHQucmVzb3VyY2VzIjsKLQotICAvLyBKMlNFIDEuNDoKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIF9SRVNPVVJDRVNfUEFDS0FHRSA9ICJzdW4udGV4dC5yZXNvdXJjZXMiOwotCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBfREFURV9GT1JNQVRfWk9ORV9QQVRIID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgX1JFU09VUkNFU19QQUNLQUdFICsgIi5EYXRlRm9ybWF0Wm9uZURhdGEiOwotCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBfTE9DQUxFX0VMRU1FTlRTX1BBVEggPQotICAgICAgICAgICAgICAgICAgICAgICAgICBfUkVTT1VSQ0VTX1BBQ0tBR0UgKyAiLkxvY2FsZUVsZW1lbnRzIjsKLQotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgX0RFRkFVTFRfTE9DQVRJT05fUEFUSCA9Ci0gICAgICAgICAgIm9yZ1xcYXBhY2hlXFxteWZhY2VzXFx0cmluaWRhZGludGVybmFsXFx1aVxcanNMaWJzXFxyZXNvdXJjZXNcXCIucmVwbGFjZSgnXFwnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGUuc2VwYXJhdG9yQ2hhcik7Ci0KLSAgLy8gTWltaWNraW5nIHRvIGJlIGluIGFwaSBwYXRoLiBJbiB0aGUgdHJpbmlkYWQtZmFjZXMgaW1wbCBzaWRlIHdlIGhhdmUKLSAgLy8gdGhlIGZvbGxvd2luZyBkaXJlY3Rvcnkgc3RydWN0dXJlLiBUaGVyZSBpcyBpZGVudGljYWwgZGlyZWN0b3J5IHN0dXJjdHVyZQotICAvLyBpbiB0cmluaWRhZC1mYWNlcyBhcGkgc2lkZS4KLSAgLy8gT25seSBfVFJJTklEQURfTE9DQUxFX0VMRU1FTlQgYmFzZSBmaWxlIHdpbGwgYmUgYWRkZWQgdG8gdGhlIGFwaSBzaWRlLAotICAvLyB3aGlsZSBhbGwgdGhlIHZhcmlhbnRzIHdpbGwgYmUgaW4gaW1wbCBzaWRlIGluIHRoZSBkaXJlY3Rvcnkgc3RydWN0dXJlCi0gIC8vIGRlZmluZWQgYmVsb3cuCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBfVFJJTklEQURfTE9DQUxFX0VMRU1FTlRTX1BBQ0tBR0UgPQotICAgICJvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQucmVzb3VyY2UiOwotCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIF9ERUZBVUxUX0JVTkRMRV9MT0NBVElPTl9QQVRIID0KLSAgICAoX1RSSU5JREFEX0xPQ0FMRV9FTEVNRU5UU19QQUNLQUdFLnJlcGxhY2UoJy4nLCBGaWxlLnNlcGFyYXRvckNoYXIpCi0gICAgICsgRmlsZS5zZXBhcmF0b3JDaGFyKTsKLQotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgX1RSSU5JREFEX0xPQ0FMRV9FTEVNRU5UU19QQVRIID0KLSAgICBfVFJJTklEQURfTE9DQUxFX0VMRU1FTlRTX1BBQ0tBR0UgKyAiLkxvY2FsZUVsZW1lbnRzIjsKLQotICAvLyBidWZmZXIgc2l6ZSBvZiB0aGUgQnVmZmVyZWRXcml0ZXIgdG8gd2hpY2ggb3V0cHV0IGlzIHdyaXR0ZW4KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IF9ERUZBVUxUX0JVRkZFUl9TSVpFID0gMSA8PCAxNDsKLQotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgX0xPQ0FMRV9MSVNUX1BBVEggPQotICAgICAgICAgICJvcmdcXGFwYWNoZVxcbXlmYWNlc1xcdHJpbmlkYWRpbnRlcm5hbFxcdWlcXGxhZlxcYmFzZVxceGh0bWxcXExvY2FsZUxpc3QuamF2YSIucmVwbGFjZSgnXFwnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGUuc2VwYXJhdG9yQ2hhcik7Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIF9FTVBUWV9WQUxVRVNbXSA9IHsgIiIgfTsKLQotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgX0xPQ0FMRV9MSVNUX0NPREVfU1RBUlQgPQotIi8qXG4iICsKLSIqKlxuIiArCi0iKiozNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OVxuIiArCi0iKi9cbiIgKwotInBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkaW50ZXJuYWwudWkubGFmLmJhc2UueGh0bWw7XG4iICsKLSJcbiIgKwotImltcG9ydCBqYXZhLnV0aWwuTG9jYWxlO1xuIiArCi0iXG4iICsKLSJpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7XG4iICsKLSJcbiIgKwotIi8qXG4iICsKLSIgKiBMaXN0IG9mIHN1cHBvcnRlZCBsb2NhbGVzLiAgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgLSBkbyBub3QgbW9kaWZ5IVxuIiArCi0iICovXG4iICsKLSJwdWJsaWMgY2xhc3MgTG9jYWxlTGlzdFxuIiArCi0ie1xuIiArCi0iICAvKlxuIiArCi0iICAgKiBSZXR1cm5zIHRoZSBsaXN0IG9mIHN1cHBvcnRlZCBsb2NhbGVzLlxuIiArCi0iICAgKi9cbiIgKwotIiAgc3RhdGljIHB1YmxpYyBIYXNoTWFwPExvY2FsZSwgTG9jYWxlPiBnZXRTdXBwb3J0ZWRMb2NhbGVzKClcbiIgKwotIiAge1xuIiArCi0iICAgIHJldHVybiBfc0xvY2FsZU1hcHBlcjtcbiIgKwotIiAgfVxuIiArCi0iICBcbiIgKwotIiAgcHJpdmF0ZSBMb2NhbGVMaXN0KClcbiIgKwotIiAge1xuIiArCi0iICB9XG4iICsKLSJcbiIgKwotIiAgc3RhdGljIHByaXZhdGUgZmluYWwgTG9jYWxlW10gX3NMb2NhbGVzID0gbmV3IExvY2FsZVtdXG4iICsKLSIgIHtcbiI7Ci0KLQotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgX0xPQ0FMRV9MSVNUX0NPREVfRU5EID0KLSIgIH07XG4iICsKLSJcbiIgKwotIiAgc3RhdGljIHByaXZhdGUgSGFzaE1hcDxMb2NhbGUsIExvY2FsZT4gX3NMb2NhbGVNYXBwZXI7XG4iICsKLSJcbiIgKwotIiAgc3RhdGljXG4iICsKLSIgIHtcbiIgKwotIiAgICBfc0xvY2FsZU1hcHBlciA9IG5ldyBIYXNoTWFwPExvY2FsZSwgTG9jYWxlPigpO1xuIiArCi0iICAgIGZvcihMb2NhbGUgbG9jYWxlIDogX3NMb2NhbGVzKVxuIiArCi0iICAgIHtcbiIgKwotIiAgICAgIF9zTG9jYWxlTWFwcGVyLnB1dChsb2NhbGUsIGxvY2FsZSk7XG4iICsKLSIgICAgfVxuIiArCi0iICB9XG4iICsKLSJ9XG4iOwotCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBfTE9DQUxFX0pBVkFfQ09ERV9TVEFSVCA9Ci0gICAgIi8vIERvIG5vdCBlZGl0IHRoaXMgZmlsZSFcbiIKLSAgICArICIvLyBUaGlzIGZpbGUgaGFzIGJlZW4gYXV0b21hdGljYWxseSBnZW5lcmF0ZWQuXG4iCi0gICAgKyAiLy8gRWRpdCBKU0xvY2FsZUVsZW1lbnRzR2VuZXJhdG9yIGluc3RlYWQuXG4vL1xuIgotICAgICsgInBhY2thZ2UgIgotICAgICsgX1RSSU5JREFEX0xPQ0FMRV9FTEVNRU5UU19QQUNLQUdFCi0gICAgKyAiO1xuXG4iCi0gICAgKyAiaW1wb3J0IGphdmEudXRpbC5MaXN0UmVzb3VyY2VCdW5kbGU7XG4iOwotCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBfSkFWQVNDUklQVF9FWFRFTlNJT04gPSAiLmpzIjsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIF9KQVZBX0VYVEVOU0lPTiA9ICIuamF2YSI7Ci0gCi0gIC8vSW50cm9kdWNlZCB0byByZW1vdmUgdGhlIGRlcGVuZGVuY3kgb24gYmFsaS1zaGFyZSBpbiB0aGUgYXBpIHNpZGUuCi0gIHByaXZhdGUgc3RhdGljIGNsYXNzIEFycmF5RW51bWVyYXRpb24gaW1wbGVtZW50cyBFbnVtZXJhdGlvbgotICB7Ci0gICAgcHVibGljIEFycmF5RW51bWVyYXRpb24oT2JqZWN0W10gYXJyYXkpCi0gICAgewotICAgICAgX29iamVjdHMgPSAoYXJyYXkgPT0gbnVsbCk/IF9FTVBUWV9BUlJBWSA6IGFycmF5OwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGhhc01vcmVFbGVtZW50cygpCi0gICAgewotICAgICAgcmV0dXJuIF9jdXJyZW50SW5kZXggPCBfb2JqZWN0cy5sZW5ndGg7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBuZXh0RWxlbWVudCgpCi0gICAgewotICAgICAgcmV0dXJuIF9vYmplY3RzW19jdXJyZW50SW5kZXgrK107Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBPYmplY3RbXSBfb2JqZWN0czsKLQotICAgIHByaXZhdGUgaW50IF9jdXJyZW50SW5kZXg7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3RbXSBfRU1QVFlfQVJSQVkgPSBuZXcgT2JqZWN0WzBdOwotICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWkxOG4tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9pMThuL3VpeHRvb2xzL1ZlcnNpb25VdGlscy5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1pMThuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vaTE4bi91aXh0b29scy9WZXJzaW9uVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDY5ODAxYi4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWkxOG4tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9pMThuL3VpeHRvb2xzL1ZlcnNpb25VdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmkxOG4udWl4dG9vbHM7Ci0KLXB1YmxpYyBjbGFzcyBWZXJzaW9uVXRpbHMKLXsKLSAgLyoqCi0gICAqIE5vcm1hbGl6ZSBhIHZlcnNpb24gbnVtYmVyIGZvciB1c2UgYXMgYSBmaWxlIHN1ZmZpeC4KLSAgICovCi0gIHN0YXRpYyBwdWJsaWMgU3RyaW5nIG5vcm1hbGl6ZVZlcnNpb25TdWZmaXgoU3RyaW5nIHZlcnNpb24pCi0gIHsKLSAgICBpZiAodmVyc2lvbiA9PSBudWxsKQotICAgIHsKLSAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHJldHVybiB2ZXJzaW9uLnJlcGxhY2UoJy4nLCAnXycpOwotICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFjYy1wbHVnaW4vTElDRU5TRS50eHQgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFjYy1wbHVnaW4vTElDRU5TRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3NzVlYTguLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhY2MtcGx1Z2luL0xJQ0VOU0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMjQyICswLDAgQEAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKLSAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8KLQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCi0KLSAgIDEuIERlZmluaXRpb25zLgotCi0gICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLAotICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuCi0KLSAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5Ci0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuCi0KLSAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwKLSAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24KLSAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCi0gICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUKLSAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yCi0gICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKLSAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuCi0KLSAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKLSAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuCi0KLSAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAotICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbgotICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4KLQotICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwKLSAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQKLSAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKLSAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4KLQotICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKLSAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGEKLSAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yawotICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KLQotICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdAotICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQotICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucwotICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMKLSAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgotICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLAotICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4KLQotICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcKLSAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMKLSAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQotICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcgotICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIKLSAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQKLSAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvCi0gICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAotICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUKLSAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dAotICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKLSAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIgotCi0gICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kCi0gICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4KLQotICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsCi0gICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUKLSAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCi0KLSAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKLSAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLAotICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCi0gICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQotICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXIKLSAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKLSAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91Ci0gICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQotICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yawotICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QKLSAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMKLSAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQotICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLgotCi0gICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQotICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0Ci0gICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQotICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0KLSAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yCi0gICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKLQotICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcwotICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAotCi0gICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MKLSAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCi0gICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywKLSAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mCi0gICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAotCi0gICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMKLSAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0Ci0gICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkCi0gICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90Ci0gICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCi0gICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQKLSAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yCi0gICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCi0gICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZAotICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cwotICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKLSAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbgotICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlCi0gICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCi0gICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkCi0gICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLgotCi0gICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQKLSAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMKLSAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKLSAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLAotICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoCi0gICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgotCi0gICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsCi0gICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKLSAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4KLSAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKLSAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkCi0gICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuCi0KLSAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUKLSAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwKLSAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQotICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuCi0KLSAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgotICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaAotICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zCi0gICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBCi0gICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKLSAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQotICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLgotCi0gICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwKLSAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLAotICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKLSAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlCi0gICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsCi0gICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKLSAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUKLSAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwKLSAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCi0gICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yCi0gICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCi0KLSAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcKLSAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsCi0gICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAotICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMKLSAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5Ci0gICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgotICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LAotICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5Ci0gICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCi0gICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4KLQotICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCi0KLSAgIEFQUEVORElYOiBIb3cgdG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yay4KLQotICAgICAgVG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yaywgYXR0YWNoIHRoZSBmb2xsb3dpbmcKLSAgICAgIGJvaWxlcnBsYXRlIG5vdGljZSwgd2l0aCB0aGUgZmllbGRzIGVuY2xvc2VkIGJ5IGJyYWNrZXRzICJbXSIKLSAgICAgIHJlcGxhY2VkIHdpdGggeW91ciBvd24gaWRlbnRpZnlpbmcgaW5mb3JtYXRpb24uIChEb24ndCBpbmNsdWRlCi0gICAgICB0aGUgYnJhY2tldHMhKSAgVGhlIHRleHQgc2hvdWxkIGJlIGVuY2xvc2VkIGluIHRoZSBhcHByb3ByaWF0ZQotICAgICAgY29tbWVudCBzeW50YXggZm9yIHRoZSBmaWxlIGZvcm1hdC4gV2UgYWxzbyByZWNvbW1lbmQgdGhhdCBhCi0gICAgICBmaWxlIG9yIGNsYXNzIG5hbWUgYW5kIGRlc2NyaXB0aW9uIG9mIHB1cnBvc2UgYmUgaW5jbHVkZWQgb24gdGhlCi0gICAgICBzYW1lICJwcmludGVkIHBhZ2UiIGFzIHRoZSBjb3B5cmlnaHQgbm90aWNlIGZvciBlYXNpZXIKLSAgICAgIGlkZW50aWZpY2F0aW9uIHdpdGhpbiB0aGlyZC1wYXJ0eSBhcmNoaXZlcy4KLQotICAgQ29weXJpZ2h0IFt5eXl5XSBbbmFtZSBvZiBjb3B5cmlnaHQgb3duZXJdCi0KLSAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLQotCi0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gIExJQ0VOU0VTIEZPUiBJTkNMVURFRCBERVBFTkRFTkNJRVMKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLUFsbCB0aGUgc291cmNlIGNvZGUgZm9yIHRoZSBUcmluaWRhZCBQbHVnaW5zIHByb2plY3QgaXMgcmVsZWFzZWQgdW5kZXIgdGhlCi1saWNlbnNlIGFib3ZlLiBBZGRpdGlvbmFsbHksIHRoZSBUcmluaWRhZCBQbHVnaW5zIGJpbmFyeSBkaXN0cmlidXRpb24KLWluY2x1ZGVzIGEgbnVtYmVyIG9mIHRoaXJkLXBhcnR5IGZpbGVzIHRoYXQgYXJlIHJlcXVpcmVkIGluCi1vcmRlciB0byB0aGUgc29mdHdhcmUgdG8gZnVuY3Rpb24uIFVubGVzcyBub3RlZCBiZWxvdywgdGhlc2UgamFycwotYW5kIHJlc291cmNlIGZpbGVzIGFyZSBhbHNvIHJlbGVhc2VkIHVuZGVyIHRoZSBBU0YgbGljZW5zZSBhYm92ZS4KLQotVGhlIGV4Y2VwdGlvbnMgYXJlIGFzIGZvbGxvd3M6Ci0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICBqYXZhY2MgaW5jbHVkZWQgaW4gdGhlIG1hdmVuLWphdmFjYy1wbHVnaW4sIHRha2VuIGZyb206Ci0gIGh0dHA6Ly9qYXZhY2MuZGV2LmphdmEubmV0Ci09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCi1Db3B5cmlnaHQgKGMpIDIwMDMgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgIFJpZ2h0cyBSZXNlcnZlZC4KLQotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgCi1hcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6Ci0KLS1SZWRpc3RyaWJ1dGlvbiBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcyAgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0KLS1SZWRpc3RyaWJ1dGlvbiBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgCi10aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciAKLW90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0KLU5laXRoZXIgdGhlIG5hbWUgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBvciB0aGUgbmFtZXMgb2YgY29udHJpYnV0b3JzIG1heSAKLWJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgCi1zcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0KLVRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgIkFTIElTLCIgd2l0aG91dCBhIHdhcnJhbnR5IG9mIGFueSBraW5kLiBBTEwgRVhQUkVTUyBPUiBJTVBMSUVEIENPTkRJVElPTlMsIFJFUFJFU0VOVEFUSU9OUyBBTkQgV0FSUkFOVElFUywgSU5DTFVESU5HIEFOWSBJTVBMSUVEIFdBUlJBTlRZIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgT1IgTk9OLUlORlJJTkdFTUVOVCwgQVJFIEhFUkVCWSBFWENMVURFRC4gU1VOIE1JRFJPU1lTVEVNUywgSU5DLiAoIlNVTiIpIEFORCBJVFMgTElDRU5TT1JTIFNIQUxMIE5PVCBCRSBMSUFCTEUgRk9SIEFOWSBEQU1BR0VTIFNVRkZFUkVEIEJZIExJQ0VOU0VFIEFTIEEgUkVTVUxUIE9GIFVTSU5HLCBNT0RJRllJTkcgT1IgRElTVFJJQlVUSU5HIFRISVMgU09GVFdBUkUgT1IgSVRTIERFUklWQVRJVkVTLiBJTiBOTyBFVkVOVCBXSUxMIFNVTiBPUiBJVFMgTElDRU5TT1JTIEJFIExJQUJMRSBGT1IgQU5ZIExPU1QgUkVWRU5VRSwgUFJPRklUIE9SIERBVEEsIE9SIEZPUiBESVJFQ1QsIElORElSRUNULCBTUEVDSUFMLCBDT05TRVFVRU5USUFMLCBJTkNJREVOVEFMIE9SIFBVTklUSVZFIERBTUFHRVMsIEhPV0VWRVIgQ0FVU0VEIEFORCBSRUdBUkRMRVNTIE9GIFRIRSBUSEVPUlkgT0YgTElBQklMSVRZLCBBUklTSU5HIE9VVCBPRiBUSEUgVVNFIE9GIE9SIElOQUJJTElUWSBUTyBVU0UgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBTVU4gSEFTIEJFRU4gQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgotCi1Zb3UgYWNrbm93bGVkZ2UgdGhhdCAgdGhpcyBzb2Z0d2FyZSBpcyBub3QgZGVzaWduZWQsIGxpY2Vuc2VkIG9yIGludGVuZGVkIGZvciB1c2UgaW4gdGhlIGRlc2lnbiwgY29uc3RydWN0aW9uLCBvcGVyYXRpb24gb3IgbWFpbnRlbmFuY2Ugb2YgYW55IG51Y2xlYXIgZmFjaWxpdHkuClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhY2MtcGx1Z2luL05PVElDRS50eHQgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFjYy1wbHVnaW4vTk9USUNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmRjMTI2Yi4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFjYy1wbHVnaW4vTk9USUNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLT09ICBOT1RJQ0UgZmlsZSBjb3JyZXNwb25kaW5nIHRvIHNlY3Rpb24gNChkKSBvZiB0aGUgQXBhY2hlIExpY2Vuc2UsICAgPT0KLT09ICBWZXJzaW9uIDIuMCwgaW4gdGhpcyBjYXNlIGZvciB0aGUgQXBhY2hlIE15RmFjZXMgTWF2ZW4gUGx1Z2lucyAgICAgPT0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSAKLVRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuCi0KLVBvcnRpb25zIG9mIHRoaXMgc29mdHdhcmUgd2VyZSBvcmlnaW5hbGx5IGJhc2VkIG9uIHRoZSBmb2xsb3dpbmc6Ci0KLS0gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDYsIE9yYWNsZSBDb3JwLCA8aHR0cDovL3d3dy5vcmFjbGUuY29tLz4uCi1hbmQgYXJlIGxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiB1bmRlciB0aGUgCi0iU29mdHdhcmUgR3JhbnQgYW5kIENvcnBvcmF0ZSBDb250cmlidXRpb24gTGljZW5zZSBBZ3JlZW1lbnQiCi0KLVRyaW5pZGFkIFBsdWdpbnMgaXMgYnVuZGxlZCB3aXRoIHRoZSBiaW5hcmllcyBmcm9tIHRoZSBqYXZhY2MgcHJvamVjdCwgYnkKLVN1biBNaWNyb3N5c3RlbXMgYW5kIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0QuIFRoZSBzb3VyY2UgY29kZSBpcwotYXZhaWxhYmxlIGF0OiBodHRwczovL2phdmFjYy5kZXYuamF2YS5uZXQvc291cmNlL2Jyb3dzZS9qYXZhY2MvCi0KLVNlZSB0aGUgTElDRU5TRS50eHQgZmlsZSBmb3IgaW5mb3JtYXRpb24gb24gYWxsIGxpY2Vuc2VzIAotYXNzb2NpYXRlZCB3aXRoIHRoaXMgc29mdHdhcmUuCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFjYy1wbHVnaW4vcG9tLnhtbCBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YWNjLXBsdWdpbi9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZjAyNDQ1Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YWNjLXBsdWdpbi9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+Ci0KLSAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotCi0gIDxwYXJlbnQ+Ci0gICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29sczwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtcGx1Z2luLXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjEuMC41PC92ZXJzaW9uPgotICAgICAgPHJlbGF0aXZlUGF0aD4uLi9teWZhY2VzLXBsdWdpbi1wYXJlbnQvcG9tLnhtbDwvcmVsYXRpdmVQYXRoPgotICA8L3BhcmVudD4KLQotICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29sczwvZ3JvdXBJZD4KLSAgPGFydGlmYWN0SWQ+bXlmYWNlcy1qYXZhY2MtcGx1Z2luPC9hcnRpZmFjdElkPgotICA8dmVyc2lvbj4xLjAuMi1TTkFQU0hPVDwvdmVyc2lvbj4KLSAgPHBhY2thZ2luZz5tYXZlbi1wbHVnaW48L3BhY2thZ2luZz4KLSAgPG5hbWU+QXBhY2hlIE15RmFjZXMgQnVpbGR0b29scyBNYXZlbjIgSmF2YWNjIFBsdWdpbjwvbmFtZT4KLSAgCi0gIDxzY20+Ci0gICAgPGNvbm5lY3Rpb24+c2NtOnN2bjpodHRwOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL215ZmFjZXMvbXlmYWNlcy1idWlsZC10b29scy90cnVuay9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFjYy1wbHVnaW48L2Nvbm5lY3Rpb24+Ci0gICAgPGRldmVsb3BlckNvbm5lY3Rpb24+c2NtOnN2bjpodHRwczovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9teWZhY2VzL215ZmFjZXMtYnVpbGQtdG9vbHMvdHJ1bmsvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhY2MtcGx1Z2luPC9kZXZlbG9wZXJDb25uZWN0aW9uPgotICAgIDx1cmw+aHR0cDovL3N2bi5hcGFjaGUub3JnL3ZpZXd2Yy9teWZhY2VzL215ZmFjZXMtYnVpbGQtdG9vbHMvdHJ1bmsvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhY2MtcGx1Z2luPC91cmw+Ci0gIDwvc2NtPgotCi0gIDxkZXBlbmRlbmNpZXM+Ci0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuPC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tcGx1Z2luLWFwaTwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjIuMDwvdmVyc2lvbj4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuPC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tcHJvamVjdDwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjIuMDwvdmVyc2lvbj4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5wbGV4dXM8L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5wbGV4dXMtY29tcGlsZXItYXBpPC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+MS40PC92ZXJzaW9uPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPnBsZXh1czwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPnBsZXh1cy11dGlsczwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjEuMC4xPC92ZXJzaW9uPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPm5ldC5qYXZhLmRldi5qYXZhY2M8L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5qYXZhY2M8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4zLjI8L3ZlcnNpb24+Ci0gICAgPC9kZXBlbmRlbmN5PgotICA8L2RlcGVuZGVuY2llcz4KLQotICA8cmVwb3J0aW5nPgotICAgIDxwbHVnaW5zPgotICAgICAgPHBsdWdpbj4KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgotICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1wbHVnaW4tcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj4yLjI8L3ZlcnNpb24+Ci0gICAgICA8L3BsdWdpbj4KLSAgICA8L3BsdWdpbnM+Ci0gIDwvcmVwb3J0aW5nPgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhY2MtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhY2MvSmF2YUNDTW9qby5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhY2MtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhY2MvSmF2YUNDTW9qby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZWY5MzIzLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YWNjLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YWNjL0phdmFDQ01vam8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0OCArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YWNjOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLkFic3RyYWN0TW9qbzsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5Nb2pvRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucHJvamVjdC5NYXZlblByb2plY3Q7Ci0KLWltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLmNvbXBpbGVyLnV0aWwuc2Nhbi5JbmNsdXNpb25TY2FuRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMuY29tcGlsZXIudXRpbC5zY2FuLlNvdXJjZUluY2x1c2lvblNjYW5uZXI7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy5jb21waWxlci51dGlsLnNjYW4uU3RhbGVTb3VyY2VTY2FubmVyOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMuY29tcGlsZXIudXRpbC5zY2FuLm1hcHBpbmcuU3VmZml4TWFwcGluZzsKLWltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLnV0aWwuRmlsZVV0aWxzOwotCi0KLS8qKgotICogQGdvYWwgZ2VuZXJhdGUKLSAqIEBwaGFzZSBnZW5lcmF0ZS1zb3VyY2VzCi0gKiBAZGVzY3JpcHRpb24gR29hbCB3aGljaCBwYXJzZSBhIEpKIGZpbGUgYW5kIHRyYW5zZm9ybSBpdCB0byBKYXZhIFNvdXJjZSBGaWxlcy4KLSAqIEB2ZXJzaW9uICRJZCQKLSAqLwotcHVibGljIGNsYXNzIEphdmFDQ01vam8KLSAgZXh0ZW5kcyBBYnN0cmFjdE1vam8KLXsKLSAgLyoqCi0gICAqIEBwYXJhbWV0ZXIgZXhwcmVzc2lvbj0xCi0gICAqIEByZXF1aXJlZAotICAgKi8KLSAgcHJpdmF0ZSBpbnQgbG9va0FoZWFkOwotCi0gIC8qKgotICAgKiBAcGFyYW1ldGVyIGV4cHJlc3Npb249MgotICAgKiBAcmVxdWlyZWQKLSAgICovCi0gIHByaXZhdGUgaW50IGNob2ljZUFtYmlndWl0eUNoZWNrOwotCi0gIC8qKgotICAgKiBAcGFyYW1ldGVyIGV4cHJlc3Npb249MQotICAgKiBAcmVxdWlyZWQKLSAgICovCi0gIHByaXZhdGUgaW50IG90aGVyQW1iaWd1aXR5Q2hlY2s7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbWV0ZXIgZXhwcmVzc2lvbj0idHJ1ZSIKLSAgICogQHJlcXVpcmVkCi0gICAqLwotICBwcml2YXRlIGJvb2xlYW4gaXNTdGF0aWM7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbWV0ZXIgZXhwcmVzc2lvbj0iZmFsc2UiCi0gICAqIEByZXF1aXJlZAotICAgKi8KLSAgcHJpdmF0ZSBib29sZWFuIGRlYnVnUGFyc2VyOwotCi0gIC8qKgotICAgKiBAcGFyYW1ldGVyIGV4cHJlc3Npb249ImZhbHNlIgotICAgKiBAcmVxdWlyZWQKLSAgICovCi0gIHByaXZhdGUgYm9vbGVhbiBkZWJ1Z0xvb2tBaGVhZDsKLQotICAvKioKLSAgICogQHBhcmFtZXRlciBleHByZXNzaW9uPSJmYWxzZSIKLSAgICogQHJlcXVpcmVkCi0gICAqLwotICBwcml2YXRlIGJvb2xlYW4gZGVidWdUb2tlbk1hbmFnZXI7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbWV0ZXIgZXhwcmVzc2lvbj0idHJ1ZSIKLSAgICogQHJlcXVpcmVkCi0gICAqLwotICBwcml2YXRlIGJvb2xlYW4gb3B0aW1pemVUb2tlbk1hbmFnZXI7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbWV0ZXIgZXhwcmVzc2lvbj0idHJ1ZSIKLSAgICogQHJlcXVpcmVkCi0gICAqLwotICBwcml2YXRlIGJvb2xlYW4gZXJyb3JSZXBvcnRpbmc7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbWV0ZXIgZXhwcmVzc2lvbj0iZmFsc2UiCi0gICAqIEByZXF1aXJlZAotICAgKi8KLSAgcHJpdmF0ZSBib29sZWFuIGphdmFVbmljb2RlRXNjYXBlOwotCi0gIC8qKgotICAgKiBAcGFyYW1ldGVyIGV4cHJlc3Npb249ImZhbHNlIgotICAgKiBAcmVxdWlyZWQKLSAgICovCi0gIHByaXZhdGUgYm9vbGVhbiB1bmljb2RlSW5wdXQ7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbWV0ZXIgZXhwcmVzc2lvbj0iZmFsc2UiCi0gICAqIEByZXF1aXJlZAotICAgKi8KLSAgcHJpdmF0ZSBib29sZWFuIGlnbm9yZUNhc2U7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbWV0ZXIgZXhwcmVzc2lvbj0iZmFsc2UiCi0gICAqIEByZXF1aXJlZAotICAgKi8KLSAgcHJpdmF0ZSBib29sZWFuIGNvbW1vblRva2VuQWN0aW9uOwotCi0gIC8qKgotICAgKiBAcGFyYW1ldGVyIGV4cHJlc3Npb249ImZhbHNlIgotICAgKiBAcmVxdWlyZWQKLSAgICovCi0gIHByaXZhdGUgYm9vbGVhbiB1c2VyVG9rZW5NYW5hZ2VyOwotCi0gIC8qKgotICAgKiBAcGFyYW1ldGVyIGV4cHJlc3Npb249ImZhbHNlIgotICAgKiBAcmVxdWlyZWQKLSAgICovCi0gIHByaXZhdGUgYm9vbGVhbiB1c2VyQ2hhclN0cmVhbTsKLQotICAvKioKLSAgICogQHBhcmFtZXRlciBleHByZXNzaW9uPSJ0cnVlIgotICAgKiBAcmVxdWlyZWQKLSAgICovCi0gIHByaXZhdGUgYm9vbGVhbiBidWlsZFBhcnNlcjsKLQotICAvKioKLSAgICogQHBhcmFtZXRlciBleHByZXNzaW9uPSJ0cnVlIgotICAgKiBAcmVxdWlyZWQKLSAgICovCi0gIHByaXZhdGUgYm9vbGVhbiBidWlsZFRva2VuTWFuYWdlcjsKLQotICAvKioKLSAgICogQHBhcmFtZXRlciBleHByZXNzaW9uPSJ0cnVlIgotICAgKiBAcmVxdWlyZWQKLSAgICovCi0gIHByaXZhdGUgYm9vbGVhbiBzYW5pdHlDaGVjazsKLQotICAvKioKLSAgICogQHBhcmFtZXRlciBleHByZXNzaW9uPSJmYWxzZSIKLSAgICogQHJlcXVpcmVkCi0gICAqLwotICBwcml2YXRlIGJvb2xlYW4gZm9yY2VMYUNoZWNrOwotCi0gIC8qKgotICAgKiBAcGFyYW1ldGVyIGV4cHJlc3Npb249ImZhbHNlIgotICAgKiBAcmVxdWlyZWQKLSAgICovCi0gIHByaXZhdGUgYm9vbGVhbiBjYWNoZVRva2VuczsKLQotICAvKioKLSAgICogQHBhcmFtZXRlciBleHByZXNzaW9uPSJ0cnVlIgotICAgKiBAcmVxdWlyZWQKLSAgICovCi0gIHByaXZhdGUgYm9vbGVhbiBrZWVwTGluZUNvbHVtbjsKLQotICAvKioKLSAgICogRGlyZWN0b3J5IHdoZXJlIHRoZSBKSiBmaWxlKHMpIGFyZSBsb2NhdGVkLgotICAgKiBAcGFyYW1ldGVyIGV4cHJlc3Npb249InNyYy9tYWluL2phdmFjYyIKLSAgICovCi0gIHByaXZhdGUgRmlsZSBzb3VyY2VEaXJlY3Rvcnk7Ci0KLSAgLyoqCi0gICAqIFBhdGggdW5kZXIgc291cmNlIGRpcmVjdG9yeSB3aGVyZSB0aGUgSkogZmlsZShzKSBhcmUgbG9jYXRlZC4KLSAgICogQHBhcmFtZXRlciBleHByZXNzaW9uPSIiCi0gICAqLwotICBwcml2YXRlIFN0cmluZyBzb3VyY2VQYXRoOwotCi0gIC8qKgotICAgKiBEaXJlY3Rvcnkgd2hlcmUgdGhlIG91dHB1dCBKYXZhIEZpbGVzIHdpbGwgYmUgbG9jYXRlZC4KLSAgICogQHBhcmFtZXRlciBleHByZXNzaW9uPSIke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9tYXZlbi1qYXZhY2MtcGx1Z2luL3NyYy9tYWluL2phdmEiCi0gICAqLwotICBwcml2YXRlIEZpbGUgb3V0cHV0RGlyZWN0b3J5OwotCi0gIC8qKgotICAgKiBQYXRoIHVuZGVyIG91dHB1dCBkaXJlY3Rvcnkgd2hlcmUgdGhlIG91dHB1dCBKYXZhIEZpbGVzIHdpbGwgYmUgbG9jYXRlZC4KLSAgICogQHBhcmFtZXRlciBleHByZXNzaW9uPSIiCi0gICAqLwotICBwcml2YXRlIFN0cmluZyBvdXRwdXRQYXRoOwotCi0gIC8qKgotICAgKiB0aGUgZGlyZWN0b3J5IHRvIHN0b3JlIHRoZSBwcm9jZXNzZWQgLmpqIGZpbGVzCi0gICAqCi0gICAqIEBwYXJhbWV0ZXIgZXhwcmVzc2lvbj0iJHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vbWF2ZW4tamF2YWNjLXBsdWdpbi9zcmMvbWFpbi9jb25mIgotICAgKi8KLSAgcHJpdmF0ZSBGaWxlIHRpbWVzdGFtcERpcmVjdG9yeTsKLQotICAvKioKLSAgICogVGhlIGdyYW51bGFyaXR5IGluIG1pbGxpc2Vjb25kcyBvZiB0aGUgbGFzdCBtb2RpZmljYXRpb24KLSAgICogZGF0ZSBmb3IgdGVzdGluZyB3aGV0aGVyIGEgc291cmNlIG5lZWRzIHJlY29tcGlsYXRpb24KLSAgICoKLSAgICogQHBhcmFtZXRlciBleHByZXNzaW9uPSIke2xhc3RNb2RHcmFudWxhcml0eU1zfSIgZGVmYXVsdC12YWx1ZT0iMCIKLSAgICovCi0gIHByaXZhdGUgaW50IHN0YWxlTWlsbGlzOwotCi0gIC8qKgotICAgKiBAcGFyYW1ldGVyIGV4cHJlc3Npb249IiR7cHJvamVjdH0iCi0gICAqIEByZXF1aXJlZAotICAgKi8KLSAgcHJpdmF0ZSBNYXZlblByb2plY3QgcHJvamVjdDsKLQotICAvKioKLSAgICogQHBhcmFtZXRlciBleHByZXNzaW9uPWZhbHNlCi0gICAqIEByZXF1aXJlZAotICAgKi8KLSAgcHJpdmF0ZSBib29sZWFuIGRvTm90R2VuZXJhdGVUb2tlbkZpbGU7Ci0KLSAgcHVibGljIHZvaWQgZXhlY3V0ZSgpCi0gICAgdGhyb3dzIE1vam9FeGVjdXRpb25FeGNlcHRpb24KLSAgewotICAgIEZpbGUgb3V0RGlyID0gbmV3IEZpbGUob3V0cHV0RGlyZWN0b3J5LCBvdXRwdXRQYXRoKTsKLQotICAgIGlmICghb3V0RGlyLmV4aXN0cygpKQotICAgIHsKLSAgICAgIG91dERpci5ta2RpcnMoKTsKLSAgICB9Ci0KLSAgICBpZiAoIXRpbWVzdGFtcERpcmVjdG9yeS5leGlzdHMoKSkKLSAgICB7Ci0gICAgICB0aW1lc3RhbXBEaXJlY3RvcnkubWtkaXJzKCk7Ci0gICAgfQotCi0gICAgU2V0IHN0YWxlR3JhbW1hcnMgPSBjb21wdXRlU3RhbGVHcmFtbWFycygpOwotCi0gICAgaWYgKHN0YWxlR3JhbW1hcnMuaXNFbXB0eSgpKQotICAgIHsKLSAgICAgIGdldExvZygpLmluZm8oIk5vdGhpbmcgdG8gcHJvY2VzcyAtIGFsbCBncmFtbWFycyBhcmUgdXAgdG8gZGF0ZSIpOwotICAgICAgaWYgKHByb2plY3QgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgcHJvamVjdC5hZGRDb21waWxlU291cmNlUm9vdChvdXRwdXREaXJlY3RvcnkuZ2V0UGF0aCgpKTsKLSAgICAgIH0KLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBzdGFsZUdyYW1tYXJzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgewotICAgICAgRmlsZSBqYXZhY2NGaWxlID0gKEZpbGUpIGkubmV4dCgpOwotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIG9yZy5qYXZhY2MucGFyc2VyLk1haW4ubWFpblByb2dyYW0oZ2VuZXJhdGVKYXZhQ0NBcmd1bWVudExpc3QoamF2YWNjRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSkpOwotCi0gICAgICAgIEZpbGVVdGlscy5jb3B5RmlsZVRvRGlyZWN0b3J5KGphdmFjY0ZpbGUsIHRpbWVzdGFtcERpcmVjdG9yeSk7Ci0gICAgICAgIGlmIChkb05vdEdlbmVyYXRlVG9rZW5GaWxlID09IHRydWUpCi0gICAgICAgIHsKLSAgICAgICAgICBGaWxlIHRva2VuRmlsZSAgPSBuZXcgRmlsZShvdXREaXIsICJUb2tlbi5qYXZhIik7Ci0gICAgICAgICAgRmlsZVV0aWxzLmZvcmNlRGVsZXRlKHRva2VuRmlsZSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgIHsKLSAgICAgICAgdGhyb3cgbmV3IE1vam9FeGVjdXRpb25FeGNlcHRpb24oIkphdmFDQyBleGVjdXRpb24gZmFpbGVkIiwgZSk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaWYgKHByb2plY3QgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBwcm9qZWN0LmFkZENvbXBpbGVTb3VyY2VSb290KG91dHB1dERpcmVjdG9yeS5nZXRQYXRoKCkpOwotICAgIH0KLSAgfQotCi0KLSAgcHJpdmF0ZSBTdHJpbmdbXSBnZW5lcmF0ZUphdmFDQ0FyZ3VtZW50TGlzdChTdHJpbmcgamF2YWNjSW5wdXQpCi0gIHsKLQotICAgIEZpbGUgb3V0RGlyID0gbmV3IEZpbGUob3V0cHV0RGlyZWN0b3J5LCBvdXRwdXRQYXRoKTsKLQotICAgIEFycmF5TGlzdCBhcmdzTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAgIGFyZ3NMaXN0LmFkZCgiLUxPT0tBSEVBRD0iICsgbG9va0FoZWFkKTsKLSAgICBhcmdzTGlzdC5hZGQoIi1DSE9JQ0VfQU1CSUdVSVRZX0NIRUNLPSIgKyBjaG9pY2VBbWJpZ3VpdHlDaGVjayk7Ci0gICAgYXJnc0xpc3QuYWRkKCItT1RIRVJfQU1CSUdVSVRZX0NIRUNLPSIgKyBvdGhlckFtYmlndWl0eUNoZWNrKTsKLSAgICBhcmdzTGlzdC5hZGQoIi1TVEFUSUM9IiArIGlzU3RhdGljKTsKLSAgICBhcmdzTGlzdC5hZGQoIi1ERUJVR19QQVJTRVI9IiArIGRlYnVnUGFyc2VyKTsKLSAgICBhcmdzTGlzdC5hZGQoIi1ERUJVR19MT09LQUhFQUQ9IiArIGRlYnVnTG9va0FoZWFkKTsKLSAgICBhcmdzTGlzdC5hZGQoIi1ERUJVR19UT0tFTl9NQU5BR0VSPSIgKyBkZWJ1Z1Rva2VuTWFuYWdlcik7Ci0gICAgYXJnc0xpc3QuYWRkKCItT1BUSU1JWkVfVE9LRU5fTUFOQUdFUj0iICsgb3B0aW1pemVUb2tlbk1hbmFnZXIpOwotICAgIGFyZ3NMaXN0LmFkZCgiLUVSUk9SX1JFUE9SVElORz0iICsgZXJyb3JSZXBvcnRpbmcpOwotICAgIGFyZ3NMaXN0LmFkZCgiLUpBVkFfVU5JQ09ERV9FU0NBUEU9IiArIGphdmFVbmljb2RlRXNjYXBlKTsKLSAgICBhcmdzTGlzdC5hZGQoIi1VTklDT0RFX0lOUFVUPSIgKyB1bmljb2RlSW5wdXQpOwotICAgIGFyZ3NMaXN0LmFkZCgiLUlHTk9SRV9DQVNFPSIgKyBpZ25vcmVDYXNlKTsKLSAgICBhcmdzTGlzdC5hZGQoIi1DT01NT05fVE9LRU5fQUNUSU9OPSIgKyBjb21tb25Ub2tlbkFjdGlvbik7Ci0gICAgYXJnc0xpc3QuYWRkKCItVVNFUl9UT0tFTl9NQU5BR0VSPSIgKyB1c2VyVG9rZW5NYW5hZ2VyKTsKLSAgICBhcmdzTGlzdC5hZGQoIi1VU0VSX0NIQVJfU1RSRUFNPSIgKyB1c2VyQ2hhclN0cmVhbSk7Ci0gICAgYXJnc0xpc3QuYWRkKCItQlVJTERfUEFSU0VSPSIgKyBidWlsZFBhcnNlcik7Ci0gICAgYXJnc0xpc3QuYWRkKCItQlVJTERfVE9LRU5fTUFOQUdFUj0iICsgYnVpbGRUb2tlbk1hbmFnZXIpOwotICAgIGFyZ3NMaXN0LmFkZCgiLVNBTklUWV9DSEVDSz0iICsgc2FuaXR5Q2hlY2spOwotICAgIGFyZ3NMaXN0LmFkZCgiLUZPUkNFX0xBX0NIRUNLPSIgKyBmb3JjZUxhQ2hlY2spOwotICAgIGFyZ3NMaXN0LmFkZCgiLUNBQ0hFX1RPS0VOUz0iICsgY2FjaGVUb2tlbnMpOwotICAgIGFyZ3NMaXN0LmFkZCgiLUtFRVBfTElORV9DT0xVTU49IiArIGtlZXBMaW5lQ29sdW1uKTsKLSAgICBhcmdzTGlzdC5hZGQoIi1PVVRQVVRfRElSRUNUT1JZOiIgKyBvdXREaXIuZ2V0UGF0aCgpKTsKLSAgICBhcmdzTGlzdC5hZGQoamF2YWNjSW5wdXQpOwotCi0gICAgZ2V0TG9nKCkuZGVidWcoImFyZ3NsaXN0OiAiICsgYXJnc0xpc3QudG9TdHJpbmcoKSk7Ci0KLSAgICByZXR1cm4gKFN0cmluZ1tdKSBhcmdzTGlzdC50b0FycmF5KG5ldyBTdHJpbmdbYXJnc0xpc3Quc2l6ZSgpXSk7Ci0gIH0KLQotICBwcml2YXRlIFNldCBjb21wdXRlU3RhbGVHcmFtbWFycygpCi0gICAgdGhyb3dzIE1vam9FeGVjdXRpb25FeGNlcHRpb24KLSAgewotICAgIFN1ZmZpeE1hcHBpbmcgbWFwcGluZyA9IG5ldyBTdWZmaXhNYXBwaW5nKCIuamoiLCAiLmpqIik7Ci0gICAgU3VmZml4TWFwcGluZyBtYXBwaW5nQ0FQID0gbmV3IFN1ZmZpeE1hcHBpbmcoIi5KSiIsICIuSkoiKTsKLQotICAgIFNvdXJjZUluY2x1c2lvblNjYW5uZXIgc2Nhbm5lciA9IG5ldyBTdGFsZVNvdXJjZVNjYW5uZXIoc3RhbGVNaWxsaXMpOwotCi0gICAgc2Nhbm5lci5hZGRTb3VyY2VNYXBwaW5nKG1hcHBpbmcpOwotICAgIHNjYW5uZXIuYWRkU291cmNlTWFwcGluZyhtYXBwaW5nQ0FQKTsKLQotICAgIFNldCBzdGFsZVNvdXJjZXMgPSBuZXcgSGFzaFNldCgpOwotCi0gICAgRmlsZSBzb3VyY2VEaXIgPSBuZXcgRmlsZShzb3VyY2VEaXJlY3RvcnksIHNvdXJjZVBhdGgpOwotCi0gICAgdHJ5Ci0gICAgewotICAgICAgc3RhbGVTb3VyY2VzLmFkZEFsbChzY2FubmVyLmdldEluY2x1ZGVkU291cmNlcyhzb3VyY2VEaXIsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXBEaXJlY3RvcnkpKTsKLSAgICB9Ci0gICAgY2F0Y2ggKEluY2x1c2lvblNjYW5FeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbigiRXJyb3Igc2Nhbm5pbmcgc291cmNlIHJvb3Q6IFwnIiArIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlRGlyICsgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXCcgZm9yIHN0YWxlIGdyYW1tYXJzIHRvIHJlcHJvY2Vzcy4iLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUpOwotICAgIH0KLQotICAgIHJldHVybiBzdGFsZVNvdXJjZXM7Ci0gIH0KLQotCi19Ci0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YWNjLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvTk9USUNFIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhY2MtcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9OT1RJQ0UKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhM2RiZDYuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhY2MtcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9OT1RJQ0UKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci09PSAgTk9USUNFIGZpbGUgY29ycmVzcG9uZGluZyB0byBzZWN0aW9uIDQoZCkgb2YgdGhlIEFwYWNoZSBMaWNlbnNlLCAgID09Ci09PSAgVmVyc2lvbiAyLjAsIGluIHRoaXMgY2FzZSBmb3IgdGhlIEFwYWNoZSBNeUZhY2VzIE1hdmVuIFBsdWdpbnMgICAgID09Ci09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgCi1UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLgotCi1Qb3J0aW9ucyBvZiB0aGlzIHNvZnR3YXJlIHdlcmUgb3JpZ2luYWxseSBiYXNlZCBvbiB0aGUgZm9sbG93aW5nOgotCi0gLSBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwNiwgT3JhY2xlIENvcnAsIDxodHRwOi8vd3d3Lm9yYWNsZS5jb20vPi4KLWFuZCBhcmUgbGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIHVuZGVyIHRoZSAKLSJTb2Z0d2FyZSBHcmFudCBhbmQgQ29ycG9yYXRlIENvbnRyaWJ1dGlvbiBMaWNlbnNlIEFncmVlbWVudCIKLQotU2VlIHRoZSBMSUNFTlNFLnR4dCBmaWxlIGZvciBpbmZvcm1hdGlvbiBvbiBhbGwgbGljZW5zZXMgCi1hc3NvY2lhdGVkIHdpdGggdGhpcyBzb2Z0d2FyZS4KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YWNjLXBsdWdpbi9zcmMvc2l0ZS9hcHQvaW5kZXguYXB0IGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhY2MtcGx1Z2luL3NyYy9zaXRlL2FwdC9pbmRleC5hcHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmYzJjM2UuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhY2MtcGx1Z2luL3NyYy9zaXRlL2FwdC9pbmRleC5hcHQKKysrIC9kZXYvbnVsbApAQCAtMSwxMTUgKzAsMCBAQAotfn5MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotfn5vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi1+fmRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotfn5yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotfn50byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotfn4iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotfn53aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotfn4NCi1+fmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLX5+DQotfn5Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotfn5zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLX5+IkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotfn5LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi1+fnNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi1+fnVuZGVyIHRoZSBMaWNlbnNlLg0KLX5+DQotDQotLS0tLS0tDQotIE1hdmVuIDIgSmF2YUNDIHBsdWdpbiANCi0gLS0tLS0tDQotIDxqcnVpekBleGlzdC5jb20+DQotIEplc3NlIE1jQ29ubmVsbCA8amVzc2UubWNjb25uZWxsQGdtYWlsLmNvbT4NCi0gLS0tLS0tDQotIEp1bHkgMjcgMjAwNQ0KLSAtLS0tLS0NCi0NCi1NYXZlbiAyIEphdmFDQyBwbHVnaW4NCi0NCi0gVGhpcyBwbHVnaW4gaXMgZm9yIHByb2Nlc3NpbmcgamF2YWNjIGZpbGVzIGludG8gamF2YSBzb3VyY2VzLg0KLQ0KLSBodHRwczovL2phdmFjYy5kZXYuamF2YS5uZXQNCi0NCi0gVGhpcyBwbHVnaW4gd2lsbCBwcm9jZXNzIGFsbCAqLmpqIGZpbGVzIGluIHRoZSBzb3VyY2VEaXJlY3RvcnkgaW50byBhIA0KLSBjb21tb24gZ2VuZXJhdGVkIHNvdXJjZXMgb3V0cHV0IGRpcmVjdG9yeS4gIFRoaXMgd2lsbCBvY2N1ciBkdXJpbmcgdGhlIA0KLSBnZW5lcmF0ZS1yZXNvdXJjZXMgcGhhc2UgYW5kIHRoZSBzb3VyY2VzIGRpcmVjdG9yeSB3aWxsIGJlIGFkZGVkIHRvIHRoZSBwcm9qZWN0DQotIGZvciB0aGUgY29tcGlsZSBwaGFzZS4NCi0gDQotQXZhaWxhYmxlIENvbmZpZ3VyYXRpb24gT3B0aW9uczogKHBhcmFtIC0gZGVmYXVsdCB2YWx1ZSkNCi0gDQotICogc291cmNlRGlyZWN0b3J5IC0gc3JjL21haW4vamF2YWNjDQotIA0KLSAqIG91dHB1dERpcmVjdG9yeSAtIHRhcmdldC9nZW5lcmF0ZWQtc291cmNlcy9qYXZhY2MNCi0gDQotICogdGltZXN0YW1wRGlyZWN0b3J5IC0gdGFyZ2V0ICh1c2VkIHNvIGdyYW1tZXJzIGFyZSBub3QgY29uc3RhbnRseSByZWdlbmVyYXRlZCkNCi0gDQotICogbG9va0FoZWFkIC0gMQ0KLQ0KLSAqIGNob2ljZUFtYmlndWl0eUNoZWNrIC0gMg0KLQ0KLSAqIG90aGVyQW1iaWd1aXR5Q2hlY2sgLSAxDQotDQotICogaXNTdGF0aWMgLSB0cnVlDQotDQotICogZGVidWdQYXJzZXIgLSBmYWxzZQ0KLQ0KLSAqIGRlYnVnTG9va0FoZWFkIC0gZmFsc2UNCi0NCi0gKiBkZWJ1Z1Rva2VuTWFuYWdlciAtIGZhbHNlDQotDQotICogb3B0aW1pemVUb2tlbk1hbmFnZXIgLSB0cnVlDQotDQotICogZXJyb3JSZXBvcnRpbmcgLSB0cnVlDQotDQotICogamF2YVVuaWNvZGVFc2NhcGUgLSBmYWxzZQ0KLQ0KLSAqIHVuaWNvZGVJbnB1dCAtIGZhbHNlDQotDQotICogaWdub3JlQ2FzZSAtIGZhbHNlDQotDQotICogY29tbW9uVG9rZW5BY3Rpb24gLSBmYWxzZQ0KLQ0KLSAqIHVzZXJUb2tlbk1hbmFnZXIgLSBmYWxzZQ0KLQ0KLSAqIHVzZXJDaGFyU3RyZWFtIC0gZmFsc2UNCi0NCi0gKiBidWlsZFBhcnNlciAtIHRydWUNCi0NCi0gKiBidWlsZFRva2VuTWFuYWdlciAtIHRydWUNCi0NCi0gKiBzYW5pdHlDaGVjayAtIHRydWUNCi0NCi0gKiBmb3JjZUxhQ2hlY2sgLSBmYWxzZQ0KLQ0KLSAqIGNhY2hlVG9rZW5zIC0gZmFsc2UNCi0NCi0gKiBrZWVwTGluZUNvbHVtbiAtIHRydWUNCi0gDQotIFtdDQotIA0KLVVzYWdlOg0KLQ0KLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi08cHJvamVjdD4NCi0gICAuLi4NCi0gICAgICA8YnVpbGQ+DQotICAgICAgICAgPHBsdWdpbnM+DQotICAgICAgICAgICAgPHBsdWdpbj4NCi0gICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+DQotICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tamF2YWNjLXBsdWdpbjwvYXJ0aWZhY3RJZD4NCi0JICAgICAgIDx2ZXJzaW9uPjEuMDwvdmVyc2lvbj4NCi0JICAgICAgIDxleGVjdXRpb25zPg0KLQkgICAgICAgICAgPGV4ZWN1dGlvbj4NCi0JICAgICAgICAgICAgIDxnb2Fscz4NCi0JICAgICAgICAgICAgICAgIDxnb2FsPmdlbmVyYXRlPC9nb2FsPg0KLQkgICAgICAgICAgICAgPC9nb2Fscz4NCi0JICAgICAgICAgIDwvZXhlY3V0aW9uPg0KLQkgICAgICAgPC9leGVjdXRpb25zPg0KLSAgICAgICAgICAgIDwvcGx1Z2luPg0KLSAgICAgICAgIDwvcGx1Z2lucz4NCi0gICAgICAgICAuLi4NCi0gICAgICA8L2J1aWxkPg0KLSAgIC4uLg0KLTwvcHJvamVjdD4NCi0tLS0tLS0tLS0tLS0tLS0tLS0tDQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhY2MtcGx1Z2luL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhY2MvSmF2YUNDTW9qb1Rlc3QuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YWNjLXBsdWdpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YWNjL0phdmFDQ01vam9UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiODY2MzMuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhY2MtcGx1Z2luL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhY2MvSmF2YUNDTW9qb1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhY2M7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi0KLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5Nb2pvRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YWNjLkphdmFDQ01vam87Ci0KLQotcHVibGljIGNsYXNzIEphdmFDQ01vam9UZXN0IGV4dGVuZHMgVGVzdENhc2UKLXsKLSAgcHVibGljIHZvaWQgdGVzdEV4ZWN1dGlvbigpIHRocm93cyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uCi0gIHsKLSAgICBKYXZhQ0NNb2pvIG1vam8gPSBuZXcgSmF2YUNDTW9qbygpOwotICAgIC8vVE9ETzogd3JpdGUgYSB0ZXN0IGhlcmUuLi4KLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhY2MtcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy9TZWxlY3RvclBhcnNlci5qaiBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YWNjLXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvU2VsZWN0b3JQYXJzZXIuamoKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkMDY0OTguLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhY2MtcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy9TZWxlY3RvclBhcnNlci5qagorKysgL2Rldi9udWxsCkBAIC0xLDU3OCArMCwwIEBACi0vKiogCi0gKiA8YSBocmVmPSJodHRwOi8vYWN0aXZlbXEub3JnIj5BY3RpdmVNUTogVGhlIE9wZW4gU291cmNlIE1lc3NhZ2UgRmFicmljPC9hPgotICoKLSAqIENvcHlyaWdodCAyMDA0IEhpcmFtIENoaXJpbm8KLSAqIENvcHlyaWdodCAyMDA0IFByb3RpcXVlIEx0ZAotICogCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKiAKLSAqKi8KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gT1BUSU9OUwotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotb3B0aW9ucyB7Ci0gIFNUQVRJQyA9IHRydWU7Ci0gIFVOSUNPREVfSU5QVVQgPSBmYWxzZTsKLSAgCi0gICAvL3NvbWUgcGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9ucwotICBPUFRJTUlaRV9UT0tFTl9NQU5BR0VSID0gZmFsc2U7Ci0gIEVSUk9SX1JFUE9SVElORyA9IHRydWU7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIFBBUlNFUgotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1QQVJTRVJfQkVHSU4oU2VsZWN0b3JQYXJzZXIpCi0KLXBhY2thZ2Ugb3JnLmFjdGl2ZW1xLnNlbGVjdG9yOwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEudXRpbC4qOwotCi1pbXBvcnQgamF2YXguam1zLkludmFsaWRTZWxlY3RvckV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5hY3RpdmVtcS5maWx0ZXIuKjsKLQotLyoqIAotICogSk1TIFNlbGVjdG9yIFBhcnNlciBnZW5lcmF0ZWQgYnkgSmF2YUNDCi0gKiAKLSAqIERvIG5vdCBlZGl0IHRoaXMgLmphdmEgZmlsZSBkaXJlY3RseSAtIGl0IGlzIGF1dG9nZW5lcmF0ZWQgZnJvbSBTZWxlY3RvclBhcnNlci5qagotICovCi1wdWJsaWMgY2xhc3MgU2VsZWN0b3JQYXJzZXIgewotCi0gICAgcHVibGljIFNlbGVjdG9yUGFyc2VyKCkgewotICAgICAgICB0aGlzKG5ldyBTdHJpbmdSZWFkZXIoIiIpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQm9vbGVhbkV4cHJlc3Npb24gcGFyc2UoU3RyaW5nIHNxbCkgdGhyb3dzIEludmFsaWRTZWxlY3RvckV4Y2VwdGlvbiB7Ci0gICAgICAgIHRoaXMuUmVJbml0KG5ldyBTdHJpbmdSZWFkZXIoc3FsKSk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiB0aGlzLkptc1NlbGVjdG9yKCk7Ci0gICAgICAgIH0gCi0gICAgICAgIGNhdGNoIChUaHJvd2FibGUgZSkgewotCSAgICAgICAgdGhyb3cgKEludmFsaWRTZWxlY3RvckV4Y2VwdGlvbiluZXcgSW52YWxpZFNlbGVjdG9yRXhjZXB0aW9uKCJ0ZXN0IikuaW5pdENhdXNlKGUpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIEJvb2xlYW5FeHByZXNzaW9uIGFzQm9vbGVhbkV4cHJlc3Npb24oRXhwcmVzc2lvbiB2YWx1ZSkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uICB7Ci0gICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEJvb2xlYW5FeHByZXNzaW9uKSB7Ci0gICAgICAgICAgICByZXR1cm4gKEJvb2xlYW5FeHByZXNzaW9uKSB2YWx1ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBQcm9wZXJ0eUV4cHJlc3Npb24pIHsKLSAgICAgICAgICAgIHJldHVybiBVbmFyeUV4cHJlc3Npb24uY3JlYXRlQm9vbGVhbkNhc3QoIHZhbHVlICk7Ci0gICAgICAgIH0KLSAgICAgICAgdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCJFeHByZXNzaW9uIHdpbGwgbm90IHJlc3VsdCBpbiBhIGJvb2xlYW4gdmFsdWU6ICIgKyB2YWx1ZSk7Ci0gICAgfQotICAgIAotCi19Ci0KLVBBUlNFUl9FTkQoU2VsZWN0b3JQYXJzZXIpCi0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIFRva2VucwotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0vKiBXaGl0ZSBTcGFjZSAqLwotU1BFQ0lBTF9UT0tFTiA6Ci17Ci0gICIgIiB8ICJcdCIgfCAiXG4iIHwgIlxyIiB8ICJcZiIKLX0KLQotLyogQ29tbWVudHMgKi8KLVNLSVA6Ci17Ci0gIDxMSU5FX0NPTU1FTlQ6ICItLSIgKH5bIlxuIiwiXHIiXSkqICgiXG4ifCJcciJ8IlxyXG4iKSA+Ci19Ci0KLVNLSVA6Ci17Ci0gIDxCTE9DS19DT01NRU5UOiAiLyoiICh+WyIqIl0pKiAiKiIgKCIqIiB8ICh+WyIqIiwiLyJdICh+WyIqIl0pKiAiKiIpKSogIi8iPgotfQotCi0vKiBSZXNlcnZlZCBXb3JkcyAqLwotVE9LRU4gW0lHTk9SRV9DQVNFXSA6Ci17Ci0gICAgPCAgTk9UICAgICA6ICJOT1QiPgotICB8IDwgIEFORCAgICAgOiAiQU5EIj4KLSAgfCA8ICBPUiAgICAgIDogIk9SIj4KLSAgfCA8ICBCRVRXRUVOIDogIkJFVFdFRU4iPgotICB8IDwgIExJS0UgICAgOiAiTElLRSI+Ci0gIHwgPCAgRVNDQVBFICA6ICJFU0NBUEUiPgotICB8IDwgIElOICAgICAgOiAiSU4iPgotICB8IDwgIElTICAgICAgOiAiSVMiPgotICB8IDwgIFRSVUUgICAgOiAiVFJVRSIgPgotICB8IDwgIEZBTFNFICAgOiAiRkFMU0UiID4KLSAgfCA8ICBOVUxMICAgIDogIk5VTEwiID4KLSAgfCA8ICBYUEFUSCAgIDogIlhQQVRIIiA+Ci0gIHwgPCAgWFFVRVJZICA6ICJYUVVFUlkiID4KLX0KLQotLyogTGl0ZXJhbHMgKi8KLVRPS0VOIFtJR05PUkVfQ0FTRV0gOgotewotCi0gICAgPCBERUNJTUFMX0xJVEVSQUw6IFsiMSItIjkiXSAoWyIwIi0iOSJdKSogKFsibCIsIkwiXSk/ID4KLSAgfCA8IEhFWF9MSVRFUkFMOiAiMCIgWyJ4IiwiWCJdIChbIjAiLSI5IiwiYSItImYiLCJBIi0iRiJdKSsgPgotICB8IDwgT0NUQUxfTElURVJBTDogIjAiIChbIjAiLSI3Il0pKiA+ICAKLSAgfCA8IEZMT0FUSU5HX1BPSU5UX0xJVEVSQUw6ICAJCSAgCi0gICAgICAgICAgKFsiMCItIjkiXSkrICIuIiAoWyIwIi0iOSJdKSogKDxFWFBPTkVOVD4pPyAvLyBtYXRjaGVzOiA1LjUgb3IgNS4gb3IgNS41RTEwIG9yIDUuRTEwCi0gICAgICAgIHwgIi4iIChbIjAiLSI5Il0pKyAoPEVYUE9ORU5UPik/ICAgICAgICAgICAgICAvLyBtYXRjaGVzOiAuNSBvciAuNUUxMAotICAgICAgICB8IChbIjAiLSI5Il0pKyA8RVhQT05FTlQ+ICAgICAgICAgICAgICAgICAgICAgLy8gbWF0Y2hlczogNUUxMAotICAgID4KLSAgfCA8ICNFWFBPTkVOVDogIkUiIChbIisiLCItIl0pPyAoWyIwIi0iOSJdKSsgPgotICB8IDwgU1RSSU5HX0xJVEVSQUw6ICInIiAoICgiJyciKSB8IH5bIiciXSApKiAgIiciID4KLX0KLQotVE9LRU4gW0lHTk9SRV9DQVNFXSA6Ci17Ci0gICAgPCBJRCA6IFsiYSItInoiLCAiXyIsICIkIl0gKFsiYSItInoiLCIwIi0iOSIsIl8iLCAiJCJdKSogPgotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBHcmFtbWVyCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1Cb29sZWFuRXhwcmVzc2lvbiBKbXNTZWxlY3RvcigpIDoKLXsKLSAgICBFeHByZXNzaW9uIGxlZnQ9bnVsbDsKLX0KLXsKLSAgICAoCi0gICAgICAgIGxlZnQgPSBvckV4cHJlc3Npb24oKQotICAgICkgCi0gICAgewotICAgICAgICByZXR1cm4gYXNCb29sZWFuRXhwcmVzc2lvbihsZWZ0KTsKLSAgICB9Ci0KLX0KLQotRXhwcmVzc2lvbiBvckV4cHJlc3Npb24oKSA6Ci17Ci0gICAgRXhwcmVzc2lvbiBsZWZ0OwotICAgIEV4cHJlc3Npb24gcmlnaHQ7Ci19Ci17Ci0gICAgKAotICAgICAgICBsZWZ0ID0gYW5kRXhwcmVzc2lvbigpIAotICAgICAgICAoIAotICAgICAgICAgICAgPE9SPiByaWdodCA9IGFuZEV4cHJlc3Npb24oKSAKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsZWZ0ID0gTG9naWNFeHByZXNzaW9uLmNyZWF0ZU9SKGFzQm9vbGVhbkV4cHJlc3Npb24obGVmdCksIGFzQm9vbGVhbkV4cHJlc3Npb24ocmlnaHQpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgKSoKLSAgICApIAotICAgIHsKLSAgICAgICAgcmV0dXJuIGxlZnQ7Ci0gICAgfQotCi19Ci0KLQotRXhwcmVzc2lvbiBhbmRFeHByZXNzaW9uKCkgOgotewotICAgIEV4cHJlc3Npb24gbGVmdDsKLSAgICBFeHByZXNzaW9uIHJpZ2h0OwotfQotewotICAgICgKLSAgICAgICAgbGVmdCA9IGVxdWFsaXR5RXhwcmVzc2lvbigpIAotICAgICAgICAoIAotICAgICAgICAgICAgPEFORD4gcmlnaHQgPSBlcXVhbGl0eUV4cHJlc3Npb24oKSAKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsZWZ0ID0gTG9naWNFeHByZXNzaW9uLmNyZWF0ZUFORChhc0Jvb2xlYW5FeHByZXNzaW9uKGxlZnQpLCBhc0Jvb2xlYW5FeHByZXNzaW9uKHJpZ2h0KSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICkqCi0gICAgKSAKLSAgICB7Ci0gICAgICAgIHJldHVybiBsZWZ0OwotICAgIH0KLX0KLQotRXhwcmVzc2lvbiBlcXVhbGl0eUV4cHJlc3Npb24oKSA6Ci17Ci0gICAgRXhwcmVzc2lvbiBsZWZ0OwotICAgIEV4cHJlc3Npb24gcmlnaHQ7Ci19Ci17Ci0gICAgKAotICAgICAgICBsZWZ0ID0gY29tcGFyaXNvbkV4cHJlc3Npb24oKSAKLSAgICAgICAgKCAKLSAgICAgICAgICAgIAotICAgICAgICAgICAgIj0iIHJpZ2h0ID0gY29tcGFyaXNvbkV4cHJlc3Npb24oKSAKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsZWZ0ID0gQ29tcGFyaXNvbkV4cHJlc3Npb24uY3JlYXRlRXF1YWwobGVmdCwgcmlnaHQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgfCAgICAgICAgICAgIAotICAgICAgICAgICAgIjw+IiByaWdodCA9IGNvbXBhcmlzb25FeHByZXNzaW9uKCkgCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbGVmdCA9IENvbXBhcmlzb25FeHByZXNzaW9uLmNyZWF0ZU5vdEVxdWFsKGxlZnQsIHJpZ2h0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHwgICAgICAgICAgICAKLSAgICAgICAgICAgIExPT0tBSEVBRCgyKQotICAgICAgICAgICAgPElTPiA8TlVMTD4KLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsZWZ0ID0gQ29tcGFyaXNvbkV4cHJlc3Npb24uY3JlYXRlSXNOdWxsKGxlZnQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgfCAgICAgICAgICAgIAotICAgICAgICAgICAgPElTPiA8Tk9UPiA8TlVMTD4KLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsZWZ0ID0gQ29tcGFyaXNvbkV4cHJlc3Npb24uY3JlYXRlSXNOb3ROdWxsKGxlZnQpOwotICAgICAgICAgICAgfQotICAgICAgICApKgotICAgICkgCi0gICAgewotICAgICAgICByZXR1cm4gbGVmdDsKLSAgICB9Ci19Ci0KLUV4cHJlc3Npb24gY29tcGFyaXNvbkV4cHJlc3Npb24oKSA6Ci17Ci0gICAgRXhwcmVzc2lvbiBsZWZ0OwotICAgIEV4cHJlc3Npb24gcmlnaHQ7Ci0gICAgRXhwcmVzc2lvbiBsb3c7Ci0gICAgRXhwcmVzc2lvbiBoaWdoOwotICAgIFN0cmluZyB0LCB1OwotCWJvb2xlYW4gbm90OwotCUFycmF5TGlzdCBsaXN0OwotfQotewotICAgICgKLSAgICAgICAgbGVmdCA9IGFkZEV4cHJlc3Npb24oKSAKLSAgICAgICAgKCAKLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICI+IiByaWdodCA9IGFkZEV4cHJlc3Npb24oKSAKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxlZnQgPSBDb21wYXJpc29uRXhwcmVzc2lvbi5jcmVhdGVHcmVhdGVyVGhhbihsZWZ0LCByaWdodCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfCAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICI+PSIgcmlnaHQgPSBhZGRFeHByZXNzaW9uKCkgCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsZWZ0ID0gQ29tcGFyaXNvbkV4cHJlc3Npb24uY3JlYXRlR3JlYXRlclRoYW5FcXVhbChsZWZ0LCByaWdodCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfCAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICI8IiByaWdodCA9IGFkZEV4cHJlc3Npb24oKSAKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxlZnQgPSBDb21wYXJpc29uRXhwcmVzc2lvbi5jcmVhdGVMZXNzVGhhbihsZWZ0LCByaWdodCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfCAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICI8PSIgcmlnaHQgPSBhZGRFeHByZXNzaW9uKCkgCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsZWZ0ID0gQ29tcGFyaXNvbkV4cHJlc3Npb24uY3JlYXRlTGVzc1RoYW5FcXVhbChsZWZ0LCByaWdodCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICB8Ci0JCQkJewotCQkJCQl1PW51bGw7Ci0JCQkJfSAgICAgICAgICAgCQkKLQkJICAgICAgICA8TElLRT4gdCA9IHN0cmluZ0xpdHRlcmFsKCkgCi0JCSAgICAgICAgCVsgPEVTQ0FQRT4gdSA9IHN0cmluZ0xpdHRlcmFsKCkgXQotCQkgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbGVmdCA9IENvbXBhcmlzb25FeHByZXNzaW9uLmNyZWF0ZUxpa2UobGVmdCwgdCwgdSk7Ci0JCSAgICAgICAgfQotICAgICAgICAgICB8Ci0JICAgICAgICAJTE9PS0FIRUFEKDIpCi0JCQkJewotCQkJCQl1PW51bGw7Ci0JCQkJfSAgICAgICAgICAgCQkKLQkJICAgICAgICA8Tk9UPiA8TElLRT4gdCA9IHN0cmluZ0xpdHRlcmFsKCkgWyA8RVNDQVBFPiB1ID0gc3RyaW5nTGl0dGVyYWwoKSBdCi0JCSAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsZWZ0ID0gQ29tcGFyaXNvbkV4cHJlc3Npb24uY3JlYXRlTm90TGlrZShsZWZ0LCB0LCB1KTsKLQkJICAgICAgICB9Ci0gICAgICAgICAgICB8Ci0JCSAgICAgICAgPEJFVFdFRU4+IGxvdyA9IGFkZEV4cHJlc3Npb24oKSA8QU5EPiBoaWdoID0gYWRkRXhwcmVzc2lvbigpCi0JCSAgICAgICAgewotCQkJCQlsZWZ0ID0gQ29tcGFyaXNvbkV4cHJlc3Npb24uY3JlYXRlQmV0d2VlbihsZWZ0LCBsb3csIGhpZ2gpOwotCQkgICAgICAgIH0KLQkgICAgICAgIHwKLQkgICAgICAgIAlMT09LQUhFQUQoMikKLQkJICAgICAgICA8Tk9UPiA8QkVUV0VFTj4gbG93ID0gYWRkRXhwcmVzc2lvbigpIDxBTkQ+IGhpZ2ggPSBhZGRFeHByZXNzaW9uKCkKLQkJICAgICAgICB7Ci0JCQkJCWxlZnQgPSBDb21wYXJpc29uRXhwcmVzc2lvbi5jcmVhdGVOb3RCZXR3ZWVuKGxlZnQsIGxvdywgaGlnaCk7Ci0JCSAgICAgICAgfQotICAgICAgICAgICAgfAotCQkJCTxJTj4gCi0JCSAgICAgICAgIigiIAotCQkgICAgICAgICAgICB0ID0gc3RyaW5nTGl0dGVyYWwoKQotCQkgICAgICAgICAgICB7Ci0JCQkgICAgICAgICAgICBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJICAgICAgICAgICAgbGlzdC5hZGQoIHQgKTsKLQkJICAgICAgICAgICAgfQotCQkJICAgICAgICAoIAotCQkJICAgICAgICAJIiwiCi0JCQkgICAgICAgICAgICB0ID0gc3RyaW5nTGl0dGVyYWwoKSAKLQkJCSAgICAgICAgICAgIHsKLQkJCQkgICAgICAgICAgICBsaXN0LmFkZCggdCApOwotCQkJICAgICAgICAgICAgfQotCQkJICAgICAgICAJCi0JCQkgICAgICAgICkqCi0JCSAgICAgICAgIikiCi0JCSAgICAgICAgewotCQkgICAgICAgICAgIGxlZnQgPSBDb21wYXJpc29uRXhwcmVzc2lvbi5jcmVhdGVJbkZpbHRlcihsZWZ0LCBsaXN0KTsKLQkJICAgICAgICB9Ci0gICAgICAgICAgICB8Ci0JICAgICAgICAJTE9PS0FIRUFEKDIpCi0JICAgICAgICAgICAgPE5PVD4gPElOPiAKLQkJICAgICAgICAiKCIgCi0JCSAgICAgICAgICAgIHQgPSBzdHJpbmdMaXR0ZXJhbCgpCi0JCSAgICAgICAgICAgIHsKLQkJCSAgICAgICAgICAgIGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkgICAgICAgICAgICBsaXN0LmFkZCggdCApOwotCQkgICAgICAgICAgICB9Ci0JCQkgICAgICAgICggCi0JCQkgICAgICAgIAkiLCIKLQkJCSAgICAgICAgICAgIHQgPSBzdHJpbmdMaXR0ZXJhbCgpIAotCQkJICAgICAgICAgICAgewotCQkJCSAgICAgICAgICAgIGxpc3QuYWRkKCB0ICk7Ci0JCQkgICAgICAgICAgICB9Ci0JCQkgICAgICAgIAkKLQkJCSAgICAgICAgKSoKLQkJICAgICAgICAiKSIKLQkJICAgICAgICB7Ci0JCSAgICAgICAgICAgbGVmdCA9IENvbXBhcmlzb25FeHByZXNzaW9uLmNyZWF0ZU5vdEluRmlsdGVyKGxlZnQsIGxpc3QpOwotCQkgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICApKgotICAgICkgCi0gICAgewotICAgICAgICByZXR1cm4gbGVmdDsKLSAgICB9Ci19Ci0KLUV4cHJlc3Npb24gYWRkRXhwcmVzc2lvbigpIDoKLXsKLSAgICBFeHByZXNzaW9uIGxlZnQ7Ci0gICAgRXhwcmVzc2lvbiByaWdodDsKLX0KLXsKLSAgICBsZWZ0ID0gbXVsdEV4cHIoKSAKLSAgICAoIAotCSAgICBMT09LQUhFQUQoICgiKyJ8Ii0iKSBtdWx0RXhwcigpKQotCSAgICAoCi0JICAgICAgICAiKyIgcmlnaHQgPSBtdWx0RXhwcigpIAotCSAgICAgICAgewotCSAgICAgICAgICAgIGxlZnQgPSBBcml0aG1ldGljRXhwcmVzc2lvbi5jcmVhdGVQbHVzKGxlZnQsIHJpZ2h0KTsKLQkgICAgICAgIH0KLQkgICAgICAgIHwgICAgICAgICAgICAKLQkgICAgICAgICItIiByaWdodCA9IG11bHRFeHByKCkgCi0JICAgICAgICB7Ci0JICAgICAgICAgICAgbGVmdCA9IEFyaXRobWV0aWNFeHByZXNzaW9uLmNyZWF0ZU1pbnVzKGxlZnQsIHJpZ2h0KTsKLQkgICAgICAgIH0KLSAgICAgICAgKQotICAgICAgICAKLSAgICApKgotICAgIHsKLSAgICAgICAgcmV0dXJuIGxlZnQ7Ci0gICAgfQotfQotCi1FeHByZXNzaW9uIG11bHRFeHByKCkgOgotewotICAgIEV4cHJlc3Npb24gbGVmdDsKLSAgICBFeHByZXNzaW9uIHJpZ2h0OwotfQotewotICAgIGxlZnQgPSB1bmFyeUV4cHIoKSAKLSAgICAoIAotICAgICAgICAiKiIgcmlnaHQgPSB1bmFyeUV4cHIoKSAKLSAgICAgICAgewotCSAgICAgICAgbGVmdCA9IEFyaXRobWV0aWNFeHByZXNzaW9uLmNyZWF0ZU11bHRpcGx5KGxlZnQsIHJpZ2h0KTsKLSAgICAgICAgfQotICAgICAgICB8ICAgICAgICAgICAgCi0gICAgICAgICIvIiByaWdodCA9IHVuYXJ5RXhwcigpIAotICAgICAgICB7Ci0JICAgICAgICBsZWZ0ID0gQXJpdGhtZXRpY0V4cHJlc3Npb24uY3JlYXRlRGl2aWRlKGxlZnQsIHJpZ2h0KTsKLSAgICAgICAgfQotICAgICAgICB8ICAgICAgICAgICAgCi0gICAgICAgICIlIiByaWdodCA9IHVuYXJ5RXhwcigpIAotICAgICAgICB7Ci0JICAgICAgICBsZWZ0ID0gQXJpdGhtZXRpY0V4cHJlc3Npb24uY3JlYXRlTW9kKGxlZnQsIHJpZ2h0KTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICApKgotICAgIHsKLSAgICAgICAgcmV0dXJuIGxlZnQ7Ci0gICAgfQotfQotCi0KLUV4cHJlc3Npb24gdW5hcnlFeHByKCkgOgotewotICAgIFN0cmluZyBzPW51bGw7Ci0gICAgRXhwcmVzc2lvbiBsZWZ0PW51bGw7Ci19Ci17Ci0JKAotCQlMT09LQUhFQUQoICIrIiB1bmFyeUV4cHIoKSApCi0JICAgICIrIiBsZWZ0PXVuYXJ5RXhwcigpCi0JICAgIHwKLQkgICAgIi0iIGxlZnQ9dW5hcnlFeHByKCkKLQkgICAgewotCSAgICAgICAgbGVmdCA9IFVuYXJ5RXhwcmVzc2lvbi5jcmVhdGVOZWdhdGUobGVmdCk7Ci0JICAgIH0KLQkgICAgfAotCSAgICA8Tk9UPiBsZWZ0PXVuYXJ5RXhwcigpCi0JICAgIHsKLQkJICAgIGxlZnQgPSBVbmFyeUV4cHJlc3Npb24uY3JlYXRlTk9UKCBhc0Jvb2xlYW5FeHByZXNzaW9uKGxlZnQpICk7Ci0JICAgIH0KLQkgICAgfAotCSAgICA8WFBBVEg+IHM9c3RyaW5nTGl0dGVyYWwoKQotCSAgICB7Ci0JCSAgICBsZWZ0ID0gVW5hcnlFeHByZXNzaW9uLmNyZWF0ZVhQYXRoKCBzICk7Ci0JICAgIH0KLQkgICAgfAotCSAgICA8WFFVRVJZPiBzPXN0cmluZ0xpdHRlcmFsKCkKLQkgICAgewotCQkgICAgbGVmdCA9IFVuYXJ5RXhwcmVzc2lvbi5jcmVhdGVYUXVlcnkoIHMgKTsKLQkgICAgfQotCSAgICB8Ci0JICAgIGxlZnQgPSBwcmltYXJ5RXhwcigpCi0gICAgKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGxlZnQ7Ci0gICAgfQotCi19Ci0KLUV4cHJlc3Npb24gcHJpbWFyeUV4cHIoKSA6Ci17Ci0gICAgRXhwcmVzc2lvbiBsZWZ0PW51bGw7Ci19Ci17Ci0gICAgKAotICAgICAgICBsZWZ0ID0gbGl0ZXJhbCgpCi0gICAgICAgIHwKLSAgICAgICAgbGVmdCA9IHZhcmlhYmxlKCkKLSAgICAgICAgfAotICAgICAgICAiKCIgbGVmdCA9IG9yRXhwcmVzc2lvbigpICIpIgotICAgICkgCi0gICAgewotICAgICAgICByZXR1cm4gbGVmdDsKLSAgICB9Ci19Ci0KLQotCi1Db25zdGFudEV4cHJlc3Npb24gbGl0ZXJhbCgpIDoKLXsKLSAgICBUb2tlbiB0OwotICAgIFN0cmluZyBzOwotICAgIENvbnN0YW50RXhwcmVzc2lvbiBsZWZ0PW51bGw7Ci19Ci17Ci0gICAgKAotICAgICAgICAoCi0gICAgICAgICAgICBzID0gc3RyaW5nTGl0dGVyYWwoKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxlZnQgPSBuZXcgQ29uc3RhbnRFeHByZXNzaW9uKHMpOwotICAgICAgICAgICAgfQotICAgICAgICApIAotICAgICAgICB8IAotICAgICAgICAoCi0gICAgICAgICAgICB0ID0gPERFQ0lNQUxfTElURVJBTD4KLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgIAlsZWZ0ID0gQ29uc3RhbnRFeHByZXNzaW9uLmNyZWF0ZUZyb21EZWNpbWFsKHQuaW1hZ2UpOwotICAgICAgICAgICAgfSAgICAKLSAgICAgICAgKSAKLSAgICAgICAgfCAKLSAgICAgICAgKAotICAgICAgICAgICAgdCA9IDxIRVhfTElURVJBTD4KLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgIAlsZWZ0ID0gQ29uc3RhbnRFeHByZXNzaW9uLmNyZWF0ZUZyb21IZXgodC5pbWFnZSk7Ci0gICAgICAgICAgICB9ICAgIAotICAgICAgICApIAotICAgICAgICB8IAotICAgICAgICAoCi0gICAgICAgICAgICB0ID0gPE9DVEFMX0xJVEVSQUw+Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAJbGVmdCA9IENvbnN0YW50RXhwcmVzc2lvbi5jcmVhdGVGcm9tT2N0YWwodC5pbWFnZSk7Ci0gICAgICAgICAgICB9ICAgIAotICAgICAgICApIAotICAgICAgICB8IAotICAgICAgICAoCi0gICAgICAgICAgICB0ID0gPEZMT0FUSU5HX1BPSU5UX0xJVEVSQUw+Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAJbGVmdCA9IENvbnN0YW50RXhwcmVzc2lvbi5jcmVhdGVGbG9hdCh0LmltYWdlKTsKLSAgICAgICAgICAgIH0gICAgCi0gICAgICAgICkgCi0gICAgICAgIHwgCi0gICAgICAgICgKLSAgICAgICAgICAgIDxUUlVFPgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxlZnQgPSBDb25zdGFudEV4cHJlc3Npb24uVFJVRTsKLSAgICAgICAgICAgIH0gICAgCi0gICAgICAgICkgCi0gICAgICAgIHwgCi0gICAgICAgICgKLSAgICAgICAgICAgIDxGQUxTRT4KLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsZWZ0ID0gQ29uc3RhbnRFeHByZXNzaW9uLkZBTFNFOwotICAgICAgICAgICAgfSAgICAKLSAgICAgICAgKSAKLSAgICAgICAgfCAKLSAgICAgICAgKAotICAgICAgICAgICAgPE5VTEw+Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbGVmdCA9IENvbnN0YW50RXhwcmVzc2lvbi5OVUxMOwotICAgICAgICAgICAgfSAgICAKLSAgICAgICAgKQotICAgICkKLSAgICB7Ci0gICAgICAgIHJldHVybiBsZWZ0OwotICAgIH0KLX0KLQotU3RyaW5nIHN0cmluZ0xpdHRlcmFsKCkgOgotewotICAgIFRva2VuIHQ7Ci0gICAgU3RyaW5nQnVmZmVyIHJjID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgIGJvb2xlYW4gZmlyc3Q9dHJ1ZTsKLX0KLXsKLSAgICB0ID0gPFNUUklOR19MSVRFUkFMPiAKLSAgICB7Ci0gICAgCS8vIERlY29kZSB0aGUgc3RpbmcgdmFsdWUuCi0gICAgCVN0cmluZyBpbWFnZSA9IHQuaW1hZ2U7Ci0gICAgCWZvciggaW50IGk9MTsgaSA8IGltYWdlLmxlbmd0aCgpLTE7IGkrKyApIHsKLSAgICAJCWNoYXIgYyA9IGltYWdlLmNoYXJBdChpKTsKLSAgICAJCWlmKCBjID09ICdcJycgKQotICAgIAkJCWkrKzsgICAgCQkJCi0gICAJCQlyYy5hcHBlbmQoYyk7Ci0gICAgCX0KLQkgICAgcmV0dXJuIHJjLnRvU3RyaW5nKCk7Ci0gICAgfSAgICAKLX0KLQotUHJvcGVydHlFeHByZXNzaW9uIHZhcmlhYmxlKCkgOgotewotICAgIFRva2VuIHQ7Ci0gICAgUHJvcGVydHlFeHByZXNzaW9uIGxlZnQ9bnVsbDsKLX0KLXsKLSAgICAoIAotICAgICAgICB0ID0gPElEPiAKLSAgICAgICAgewotICAgICAgICAgICAgbGVmdCA9IG5ldyBQcm9wZXJ0eUV4cHJlc3Npb24odC5pbWFnZSk7Ci0gICAgICAgIH0gICAgCi0gICAgKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGxlZnQ7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YWNjLXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvdmFsaWRhdG9yL1BhcnNlRXhjZXB0aW9uLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFjYy1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL3ZhbGlkYXRvci9QYXJzZUV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNWEyNjMwLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YWNjLXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvdmFsaWRhdG9yL1BhcnNlRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTAgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyogR2VuZXJhdGVkIEJ5OkphdmFDQzogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBQYXJzZUV4Y2VwdGlvbi5qYXZhIFZlcnNpb24gMy4wICovCi1wYWNrYWdlIG9yZy5hY3RpdmVtcS5zZWxlY3RvcjsKLQotLyoqCi0gKiBUaGlzIGV4Y2VwdGlvbiBpcyB0aHJvd24gd2hlbiBwYXJzZSBlcnJvcnMgYXJlIGVuY291bnRlcmVkLgotICogWW91IGNhbiBleHBsaWNpdGx5IGNyZWF0ZSBvYmplY3RzIG9mIHRoaXMgZXhjZXB0aW9uIHR5cGUgYnkKLSAqIGNhbGxpbmcgdGhlIG1ldGhvZCBnZW5lcmF0ZVBhcnNlRXhjZXB0aW9uIGluIHRoZSBnZW5lcmF0ZWQKLSAqIHBhcnNlci4KLSAqCi0gKiBZb3UgY2FuIG1vZGlmeSB0aGlzIGNsYXNzIHRvIGN1c3RvbWl6ZSB5b3VyIGVycm9yIHJlcG9ydGluZwotICogbWVjaGFuaXNtcyBzbyBsb25nIGFzIHlvdSByZXRhaW4gdGhlIHB1YmxpYyBmaWVsZHMuCi0gKi8KLXB1YmxpYyBjbGFzcyBQYXJzZUV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbiB7Ci0KLSAgLyoqCi0gICAqIFRoaXMgY29uc3RydWN0b3IgaXMgdXNlZCBieSB0aGUgbWV0aG9kICJnZW5lcmF0ZVBhcnNlRXhjZXB0aW9uIgotICAgKiBpbiB0aGUgZ2VuZXJhdGVkIHBhcnNlci4gIENhbGxpbmcgdGhpcyBjb25zdHJ1Y3RvciBnZW5lcmF0ZXMKLSAgICogYSBuZXcgb2JqZWN0IG9mIHRoaXMgdHlwZSB3aXRoIHRoZSBmaWVsZHMgImN1cnJlbnRUb2tlbiIsCi0gICAqICJleHBlY3RlZFRva2VuU2VxdWVuY2VzIiwgYW5kICJ0b2tlbkltYWdlIiBzZXQuICBUaGUgYm9vbGVhbgotICAgKiBmbGFnICJzcGVjaWFsQ29uc3RydWN0b3IiIGlzIGFsc28gc2V0IHRvIHRydWUgdG8gaW5kaWNhdGUgdGhhdAotICAgKiB0aGlzIGNvbnN0cnVjdG9yIHdhcyB1c2VkIHRvIGNyZWF0ZSB0aGlzIG9iamVjdC4KLSAgICogVGhpcyBjb25zdHJ1Y3RvciBjYWxscyBpdHMgc3VwZXIgY2xhc3Mgd2l0aCB0aGUgZW1wdHkgc3RyaW5nCi0gICAqIHRvIGZvcmNlIHRoZSAidG9TdHJpbmciIG1ldGhvZCBvZiBwYXJlbnQgY2xhc3MgIlRocm93YWJsZSIgdG8KLSAgICogcHJpbnQgdGhlIGVycm9yIG1lc3NhZ2UgaW4gdGhlIGZvcm06Ci0gICAqICAgICBQYXJzZUV4Y2VwdGlvbjogPHJlc3VsdCBvZiBnZXRNZXNzYWdlPgotICAgKi8KLSAgcHVibGljIFBhcnNlRXhjZXB0aW9uKFRva2VuIGN1cnJlbnRUb2tlblZhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGludFtdW10gZXhwZWN0ZWRUb2tlblNlcXVlbmNlc1ZhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1tdIHRva2VuSW1hZ2VWYWwKLSAgICAgICAgICAgICAgICAgICAgICAgKQotICB7Ci0gICAgc3VwZXIoIiIpOwotICAgIHNwZWNpYWxDb25zdHJ1Y3RvciA9IHRydWU7Ci0gICAgY3VycmVudFRva2VuID0gY3VycmVudFRva2VuVmFsOwotICAgIGV4cGVjdGVkVG9rZW5TZXF1ZW5jZXMgPSBleHBlY3RlZFRva2VuU2VxdWVuY2VzVmFsOwotICAgIHRva2VuSW1hZ2UgPSB0b2tlbkltYWdlVmFsOwotICB9Ci0KLSAgLyoqCi0gICAqIFRoZSBmb2xsb3dpbmcgY29uc3RydWN0b3JzIGFyZSBmb3IgdXNlIGJ5IHlvdSBmb3Igd2hhdGV2ZXIKLSAgICogcHVycG9zZSB5b3UgY2FuIHRoaW5rIG9mLiAgQ29uc3RydWN0aW5nIHRoZSBleGNlcHRpb24gaW4gdGhpcwotICAgKiBtYW5uZXIgbWFrZXMgdGhlIGV4Y2VwdGlvbiBiZWhhdmUgaW4gdGhlIG5vcm1hbCB3YXkgLSBpLmUuLCBhcwotICAgKiBkb2N1bWVudGVkIGluIHRoZSBjbGFzcyAiVGhyb3dhYmxlIi4gIFRoZSBmaWVsZHMgImVycm9yVG9rZW4iLAotICAgKiAiZXhwZWN0ZWRUb2tlblNlcXVlbmNlcyIsIGFuZCAidG9rZW5JbWFnZSIgZG8gbm90IGNvbnRhaW4KLSAgICogcmVsZXZhbnQgaW5mb3JtYXRpb24uICBUaGUgSmF2YUNDIGdlbmVyYXRlZCBjb2RlIGRvZXMgbm90IHVzZQotICAgKiB0aGVzZSBjb25zdHJ1Y3RvcnMuCi0gICAqLwotCi0gIHB1YmxpYyBQYXJzZUV4Y2VwdGlvbigpIHsKLSAgICBzdXBlcigpOwotICAgIHNwZWNpYWxDb25zdHJ1Y3RvciA9IGZhbHNlOwotICB9Ci0KLSAgcHVibGljIFBhcnNlRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlKSB7Ci0gICAgc3VwZXIobWVzc2FnZSk7Ci0gICAgc3BlY2lhbENvbnN0cnVjdG9yID0gZmFsc2U7Ci0gIH0KLQotICAvKioKLSAgICogVGhpcyB2YXJpYWJsZSBkZXRlcm1pbmVzIHdoaWNoIGNvbnN0cnVjdG9yIHdhcyB1c2VkIHRvIGNyZWF0ZQotICAgKiB0aGlzIG9iamVjdCBhbmQgdGhlcmVieSBhZmZlY3RzIHRoZSBzZW1hbnRpY3Mgb2YgdGhlCi0gICAqICJnZXRNZXNzYWdlIiBtZXRob2QgKHNlZSBiZWxvdykuCi0gICAqLwotICBwcm90ZWN0ZWQgYm9vbGVhbiBzcGVjaWFsQ29uc3RydWN0b3I7Ci0KLSAgLyoqCi0gICAqIFRoaXMgaXMgdGhlIGxhc3QgdG9rZW4gdGhhdCBoYXMgYmVlbiBjb25zdW1lZCBzdWNjZXNzZnVsbHkuICBJZgotICAgKiB0aGlzIG9iamVjdCBoYXMgYmVlbiBjcmVhdGVkIGR1ZSB0byBhIHBhcnNlIGVycm9yLCB0aGUgdG9rZW4KLSAgICogZm9sbG93bmcgdGhpcyB0b2tlbiB3aWxsICh0aGVyZWZvcmUpIGJlIHRoZSBmaXJzdCBlcnJvciB0b2tlbi4KLSAgICovCi0gIHB1YmxpYyBUb2tlbiBjdXJyZW50VG9rZW47Ci0KLSAgLyoqCi0gICAqIEVhY2ggZW50cnkgaW4gdGhpcyBhcnJheSBpcyBhbiBhcnJheSBvZiBpbnRlZ2Vycy4gIEVhY2ggYXJyYXkKLSAgICogb2YgaW50ZWdlcnMgcmVwcmVzZW50cyBhIHNlcXVlbmNlIG9mIHRva2VucyAoYnkgdGhlaXIgb3JkaW5hbAotICAgKiB2YWx1ZXMpIHRoYXQgaXMgZXhwZWN0ZWQgYXQgdGhpcyBwb2ludCBvZiB0aGUgcGFyc2UuCi0gICAqLwotICBwdWJsaWMgaW50W11bXSBleHBlY3RlZFRva2VuU2VxdWVuY2VzOwotCi0gIC8qKgotICAgKiBUaGlzIGlzIGEgcmVmZXJlbmNlIHRvIHRoZSAidG9rZW5JbWFnZSIgYXJyYXkgb2YgdGhlIGdlbmVyYXRlZAotICAgKiBwYXJzZXIgd2l0aGluIHdoaWNoIHRoZSBwYXJzZSBlcnJvciBvY2N1cnJlZC4gIFRoaXMgYXJyYXkgaXMKLSAgICogZGVmaW5lZCBpbiB0aGUgZ2VuZXJhdGVkIC4uLkNvbnN0YW50cyBpbnRlcmZhY2UuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nW10gdG9rZW5JbWFnZTsKLQotICAvKioKLSAgICogVGhpcyBtZXRob2QgaGFzIHRoZSBzdGFuZGFyZCBiZWhhdmlvciB3aGVuIHRoaXMgb2JqZWN0IGhhcyBiZWVuCi0gICAqIGNyZWF0ZWQgdXNpbmcgdGhlIHN0YW5kYXJkIGNvbnN0cnVjdG9ycy4gIE90aGVyd2lzZSwgaXQgdXNlcwotICAgKiAiY3VycmVudFRva2VuIiBhbmQgImV4cGVjdGVkVG9rZW5TZXF1ZW5jZXMiIHRvIGdlbmVyYXRlIGEgcGFyc2UKLSAgICogZXJyb3IgbWVzc2FnZSBhbmQgcmV0dXJucyBpdC4gIElmIHRoaXMgb2JqZWN0IGhhcyBiZWVuIGNyZWF0ZWQKLSAgICogZHVlIHRvIGEgcGFyc2UgZXJyb3IsIGFuZCB5b3UgZG8gbm90IGNhdGNoIGl0IChpdCBnZXRzIHRocm93bgotICAgKiBmcm9tIHRoZSBwYXJzZXIpLCB0aGVuIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBkdXJpbmcgdGhlIHByaW50aW5nCi0gICAqIG9mIHRoZSBmaW5hbCBzdGFjayB0cmFjZSwgYW5kIGhlbmNlIHRoZSBjb3JyZWN0IGVycm9yIG1lc3NhZ2UKLSAgICogZ2V0cyBkaXNwbGF5ZWQuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UoKSB7Ci0gICAgaWYgKCFzcGVjaWFsQ29uc3RydWN0b3IpIHsKLSAgICAgIHJldHVybiBzdXBlci5nZXRNZXNzYWdlKCk7Ci0gICAgfQotICAgIFN0cmluZyBleHBlY3RlZCA9ICIiOwotICAgIGludCBtYXhTaXplID0gMDsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGV4cGVjdGVkVG9rZW5TZXF1ZW5jZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgIGlmIChtYXhTaXplIDwgZXhwZWN0ZWRUb2tlblNlcXVlbmNlc1tpXS5sZW5ndGgpIHsKLSAgICAgICAgbWF4U2l6ZSA9IGV4cGVjdGVkVG9rZW5TZXF1ZW5jZXNbaV0ubGVuZ3RoOwotICAgICAgfQotICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBleHBlY3RlZFRva2VuU2VxdWVuY2VzW2ldLmxlbmd0aDsgaisrKSB7Ci0gICAgICAgIGV4cGVjdGVkICs9IHRva2VuSW1hZ2VbZXhwZWN0ZWRUb2tlblNlcXVlbmNlc1tpXVtqXV0gKyAiICI7Ci0gICAgICB9Ci0gICAgICBpZiAoZXhwZWN0ZWRUb2tlblNlcXVlbmNlc1tpXVtleHBlY3RlZFRva2VuU2VxdWVuY2VzW2ldLmxlbmd0aCAtIDFdICE9IDApIHsKLSAgICAgICAgZXhwZWN0ZWQgKz0gIi4uLiI7Ci0gICAgICB9Ci0gICAgICBleHBlY3RlZCArPSBlb2wgKyAiICAgICI7Ci0gICAgfQotICAgIFN0cmluZyByZXR2YWwgPSAiRW5jb3VudGVyZWQgXCIiOwotICAgIFRva2VuIHRvayA9IGN1cnJlbnRUb2tlbi5uZXh0OwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWF4U2l6ZTsgaSsrKSB7Ci0gICAgICBpZiAoaSAhPSAwKSByZXR2YWwgKz0gIiAiOwotICAgICAgaWYgKHRvay5raW5kID09IDApIHsKLSAgICAgICAgcmV0dmFsICs9IHRva2VuSW1hZ2VbMF07Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgcmV0dmFsICs9IGFkZF9lc2NhcGVzKHRvay5pbWFnZSk7Ci0gICAgICB0b2sgPSB0b2submV4dDsgCi0gICAgfQotICAgIHJldHZhbCArPSAiXCIgYXQgbGluZSAiICsgY3VycmVudFRva2VuLm5leHQuYmVnaW5MaW5lICsgIiwgY29sdW1uICIgKyBjdXJyZW50VG9rZW4ubmV4dC5iZWdpbkNvbHVtbjsKLSAgICByZXR2YWwgKz0gIi4iICsgZW9sOwotICAgIGlmIChleHBlY3RlZFRva2VuU2VxdWVuY2VzLmxlbmd0aCA9PSAxKSB7Ci0gICAgICByZXR2YWwgKz0gIldhcyBleHBlY3Rpbmc6IiArIGVvbCArICIgICAgIjsKLSAgICB9IGVsc2UgewotICAgICAgcmV0dmFsICs9ICJXYXMgZXhwZWN0aW5nIG9uZSBvZjoiICsgZW9sICsgIiAgICAiOwotICAgIH0KLSAgICByZXR2YWwgKz0gZXhwZWN0ZWQ7Ci0gICAgcmV0dXJuIHJldHZhbDsKLSAgfQotCi0gIC8qKgotICAgKiBUaGUgZW5kIG9mIGxpbmUgc3RyaW5nIGZvciB0aGlzIG1hY2hpbmUuCi0gICAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIGVvbCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiLCAiXG4iKTsKLSAKLSAgLyoqCi0gICAqIFVzZWQgdG8gY29udmVydCByYXcgY2hhcmFjdGVycyB0byB0aGVpciBlc2NhcGVkIHZlcnNpb24KLSAgICogd2hlbiB0aGVzZSByYXcgdmVyc2lvbiBjYW5ub3QgYmUgdXNlZCBhcyBwYXJ0IG9mIGFuIEFTQ0lJCi0gICAqIHN0cmluZyBsaXRlcmFsLgotICAgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyBhZGRfZXNjYXBlcyhTdHJpbmcgc3RyKSB7Ci0gICAgICBTdHJpbmdCdWZmZXIgcmV0dmFsID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgY2hhciBjaDsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3RyLmxlbmd0aCgpOyBpKyspIHsKLSAgICAgICAgc3dpdGNoIChzdHIuY2hhckF0KGkpKQotICAgICAgICB7Ci0gICAgICAgICAgIGNhc2UgMCA6Ci0gICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICBjYXNlICdcYic6Ci0gICAgICAgICAgICAgIHJldHZhbC5hcHBlbmQoIlxcYiIpOwotICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgY2FzZSAnXHQnOgotICAgICAgICAgICAgICByZXR2YWwuYXBwZW5kKCJcXHQiKTsKLSAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgIGNhc2UgJ1xuJzoKLSAgICAgICAgICAgICAgcmV0dmFsLmFwcGVuZCgiXFxuIik7Ci0gICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICBjYXNlICdcZic6Ci0gICAgICAgICAgICAgIHJldHZhbC5hcHBlbmQoIlxcZiIpOwotICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgY2FzZSAnXHInOgotICAgICAgICAgICAgICByZXR2YWwuYXBwZW5kKCJcXHIiKTsKLSAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgIGNhc2UgJ1wiJzoKLSAgICAgICAgICAgICAgcmV0dmFsLmFwcGVuZCgiXFxcIiIpOwotICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgY2FzZSAnXCcnOgotICAgICAgICAgICAgICByZXR2YWwuYXBwZW5kKCJcXFwnIik7Ci0gICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICBjYXNlICdcXCc6Ci0gICAgICAgICAgICAgIHJldHZhbC5hcHBlbmQoIlxcXFwiKTsKLSAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgIGlmICgoY2ggPSBzdHIuY2hhckF0KGkpKSA8IDB4MjAgfHwgY2ggPiAweDdlKSB7Ci0gICAgICAgICAgICAgICAgIFN0cmluZyBzID0gIjAwMDAiICsgSW50ZWdlci50b1N0cmluZyhjaCwgMTYpOwotICAgICAgICAgICAgICAgICByZXR2YWwuYXBwZW5kKCJcXHUiICsgcy5zdWJzdHJpbmcocy5sZW5ndGgoKSAtIDQsIHMubGVuZ3RoKCkpKTsKLSAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgcmV0dmFsLmFwcGVuZChjaCk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHJldHVybiByZXR2YWwudG9TdHJpbmcoKTsKLSAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhY2MtcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy92YWxpZGF0b3IvU2VsZWN0b3JQYXJzZXIuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YWNjLXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvdmFsaWRhdG9yL1NlbGVjdG9yUGFyc2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlYjU5NTguLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhY2MtcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy92YWxpZGF0b3IvU2VsZWN0b3JQYXJzZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExODEgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyogR2VuZXJhdGVkIEJ5OkphdmFDQzogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBTZWxlY3RvclBhcnNlci5qYXZhICovCi1wYWNrYWdlIG9yZy5hY3RpdmVtcS5zZWxlY3RvcjsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotaW1wb3J0IGphdmF4Lmptcy5JbnZhbGlkU2VsZWN0b3JFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuYWN0aXZlbXEuZmlsdGVyLio7Ci0KLS8qKiAKLSAqIEpNUyBTZWxlY3RvciBQYXJzZXIgZ2VuZXJhdGVkIGJ5IEphdmFDQwotICogCi0gKiBEbyBub3QgZWRpdCB0aGlzIC5qYXZhIGZpbGUgZGlyZWN0bHkgLSBpdCBpcyBhdXRvZ2VuZXJhdGVkIGZyb20gU2VsZWN0b3JQYXJzZXIuamoKLSAqLwotcHVibGljIGNsYXNzIFNlbGVjdG9yUGFyc2VyIGltcGxlbWVudHMgU2VsZWN0b3JQYXJzZXJDb25zdGFudHMgewotCi0gICAgcHVibGljIFNlbGVjdG9yUGFyc2VyKCkgewotICAgICAgICB0aGlzKG5ldyBTdHJpbmdSZWFkZXIoIiIpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQm9vbGVhbkV4cHJlc3Npb24gcGFyc2UoU3RyaW5nIHNxbCkgdGhyb3dzIEludmFsaWRTZWxlY3RvckV4Y2VwdGlvbiB7Ci0gICAgICAgIHRoaXMuUmVJbml0KG5ldyBTdHJpbmdSZWFkZXIoc3FsKSk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiB0aGlzLkptc1NlbGVjdG9yKCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFRocm93YWJsZSBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgKEludmFsaWRTZWxlY3RvckV4Y2VwdGlvbiluZXcgSW52YWxpZFNlbGVjdG9yRXhjZXB0aW9uKCJ0ZXN0IikuaW5pdENhdXNlKGUpOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICBwcml2YXRlIEJvb2xlYW5FeHByZXNzaW9uIGFzQm9vbGVhbkV4cHJlc3Npb24oRXhwcmVzc2lvbiB2YWx1ZSkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uICB7Ci0gICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEJvb2xlYW5FeHByZXNzaW9uKSB7Ci0gICAgICAgICAgICByZXR1cm4gKEJvb2xlYW5FeHByZXNzaW9uKSB2YWx1ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBQcm9wZXJ0eUV4cHJlc3Npb24pIHsKLSAgICAgICAgICAgIHJldHVybiBVbmFyeUV4cHJlc3Npb24uY3JlYXRlQm9vbGVhbkNhc3QoIHZhbHVlICk7Ci0gICAgICAgIH0KLSAgICAgICAgdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCJFeHByZXNzaW9uIHdpbGwgbm90IHJlc3VsdCBpbiBhIGJvb2xlYW4gdmFsdWU6ICIgKyB2YWx1ZSk7Ci0gICAgfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBHcmFtbWVyCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gIGZpbmFsIHB1YmxpYyBCb29sZWFuRXhwcmVzc2lvbiBKbXNTZWxlY3RvcigpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gICAgRXhwcmVzc2lvbiBsZWZ0PW51bGw7Ci0gICAgbGVmdCA9IG9yRXhwcmVzc2lvbigpOwotICAgICAgICB7aWYgKHRydWUpIHJldHVybiBhc0Jvb2xlYW5FeHByZXNzaW9uKGxlZnQpO30KLSAgICB0aHJvdyBuZXcgRXJyb3IoIk1pc3NpbmcgcmV0dXJuIHN0YXRlbWVudCBpbiBmdW5jdGlvbiIpOwotICB9Ci0KLSAgZmluYWwgcHVibGljIEV4cHJlc3Npb24gb3JFeHByZXNzaW9uKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAgICBFeHByZXNzaW9uIGxlZnQ7Ci0gICAgRXhwcmVzc2lvbiByaWdodDsKLSAgICBsZWZ0ID0gYW5kRXhwcmVzc2lvbigpOwotICAgIGxhYmVsXzE6Ci0gICAgd2hpbGUgKHRydWUpIHsKLSAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgY2FzZSBPUjoKLSAgICAgICAgOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIGJyZWFrIGxhYmVsXzE7Ci0gICAgICB9Ci0gICAgICBqal9jb25zdW1lX3Rva2VuKE9SKTsKLSAgICAgIHJpZ2h0ID0gYW5kRXhwcmVzc2lvbigpOwotICAgICAgICAgICAgICAgIGxlZnQgPSBMb2dpY0V4cHJlc3Npb24uY3JlYXRlT1IoYXNCb29sZWFuRXhwcmVzc2lvbihsZWZ0KSwgYXNCb29sZWFuRXhwcmVzc2lvbihyaWdodCkpOwotICAgIH0KLSAgICAgICAge2lmICh0cnVlKSByZXR1cm4gbGVmdDt9Ci0gICAgdGhyb3cgbmV3IEVycm9yKCJNaXNzaW5nIHJldHVybiBzdGF0ZW1lbnQgaW4gZnVuY3Rpb24iKTsKLSAgfQotCi0gIGZpbmFsIHB1YmxpYyBFeHByZXNzaW9uIGFuZEV4cHJlc3Npb24oKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotICAgIEV4cHJlc3Npb24gbGVmdDsKLSAgICBFeHByZXNzaW9uIHJpZ2h0OwotICAgIGxlZnQgPSBlcXVhbGl0eUV4cHJlc3Npb24oKTsKLSAgICBsYWJlbF8yOgotICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKLSAgICAgIGNhc2UgQU5EOgotICAgICAgICA7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgYnJlYWsgbGFiZWxfMjsKLSAgICAgIH0KLSAgICAgIGpqX2NvbnN1bWVfdG9rZW4oQU5EKTsKLSAgICAgIHJpZ2h0ID0gZXF1YWxpdHlFeHByZXNzaW9uKCk7Ci0gICAgICAgICAgICAgICAgbGVmdCA9IExvZ2ljRXhwcmVzc2lvbi5jcmVhdGVBTkQoYXNCb29sZWFuRXhwcmVzc2lvbihsZWZ0KSwgYXNCb29sZWFuRXhwcmVzc2lvbihyaWdodCkpOwotICAgIH0KLSAgICAgICAge2lmICh0cnVlKSByZXR1cm4gbGVmdDt9Ci0gICAgdGhyb3cgbmV3IEVycm9yKCJNaXNzaW5nIHJldHVybiBzdGF0ZW1lbnQgaW4gZnVuY3Rpb24iKTsKLSAgfQotCi0gIGZpbmFsIHB1YmxpYyBFeHByZXNzaW9uIGVxdWFsaXR5RXhwcmVzc2lvbigpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gICAgRXhwcmVzc2lvbiBsZWZ0OwotICAgIEV4cHJlc3Npb24gcmlnaHQ7Ci0gICAgbGVmdCA9IGNvbXBhcmlzb25FeHByZXNzaW9uKCk7Ci0gICAgbGFiZWxfMzoKLSAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7Ci0gICAgICBjYXNlIElTOgotICAgICAgY2FzZSAyODoKLSAgICAgIGNhc2UgMjk6Ci0gICAgICAgIDsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICBicmVhayBsYWJlbF8zOwotICAgICAgfQotICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7Ci0gICAgICBjYXNlIDI4OgotICAgICAgICBqal9jb25zdW1lX3Rva2VuKDI4KTsKLSAgICAgICAgcmlnaHQgPSBjb21wYXJpc29uRXhwcmVzc2lvbigpOwotICAgICAgICAgICAgICAgIGxlZnQgPSBDb21wYXJpc29uRXhwcmVzc2lvbi5jcmVhdGVFcXVhbChsZWZ0LCByaWdodCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSAyOToKLSAgICAgICAgampfY29uc3VtZV90b2tlbigyOSk7Ci0gICAgICAgIHJpZ2h0ID0gY29tcGFyaXNvbkV4cHJlc3Npb24oKTsKLSAgICAgICAgICAgICAgICBsZWZ0ID0gQ29tcGFyaXNvbkV4cHJlc3Npb24uY3JlYXRlTm90RXF1YWwobGVmdCwgcmlnaHQpOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIGlmIChqal8yXzEoMikpIHsKLSAgICAgICAgICBqal9jb25zdW1lX3Rva2VuKElTKTsKLSAgICAgICAgICBqal9jb25zdW1lX3Rva2VuKE5VTEwpOwotICAgICAgICAgICAgICAgIGxlZnQgPSBDb21wYXJpc29uRXhwcmVzc2lvbi5jcmVhdGVJc051bGwobGVmdCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7Ci0gICAgICAgICAgY2FzZSBJUzoKLSAgICAgICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oSVMpOwotICAgICAgICAgICAgampfY29uc3VtZV90b2tlbihOT1QpOwotICAgICAgICAgICAgampfY29uc3VtZV90b2tlbihOVUxMKTsKLSAgICAgICAgICAgICAgICBsZWZ0ID0gQ29tcGFyaXNvbkV4cHJlc3Npb24uY3JlYXRlSXNOb3ROdWxsKGxlZnQpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oLTEpOwotICAgICAgICAgICAgdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgICAgICB7aWYgKHRydWUpIHJldHVybiBsZWZ0O30KLSAgICB0aHJvdyBuZXcgRXJyb3IoIk1pc3NpbmcgcmV0dXJuIHN0YXRlbWVudCBpbiBmdW5jdGlvbiIpOwotICB9Ci0KLSAgZmluYWwgcHVibGljIEV4cHJlc3Npb24gY29tcGFyaXNvbkV4cHJlc3Npb24oKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotICAgIEV4cHJlc3Npb24gbGVmdDsKLSAgICBFeHByZXNzaW9uIHJpZ2h0OwotICAgIEV4cHJlc3Npb24gbG93OwotICAgIEV4cHJlc3Npb24gaGlnaDsKLSAgICBTdHJpbmcgdCwgdTsKLSAgICAgICAgYm9vbGVhbiBub3Q7Ci0gICAgICAgIEFycmF5TGlzdCBsaXN0OwotICAgIGxlZnQgPSBhZGRFeHByZXNzaW9uKCk7Ci0gICAgbGFiZWxfNDoKLSAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7Ci0gICAgICBjYXNlIE5PVDoKLSAgICAgIGNhc2UgQkVUV0VFTjoKLSAgICAgIGNhc2UgTElLRToKLSAgICAgIGNhc2UgSU46Ci0gICAgICBjYXNlIDMwOgotICAgICAgY2FzZSAzMToKLSAgICAgIGNhc2UgMzI6Ci0gICAgICBjYXNlIDMzOgotICAgICAgICA7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgYnJlYWsgbGFiZWxfNDsKLSAgICAgIH0KLSAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgY2FzZSAzMDoKLSAgICAgICAgampfY29uc3VtZV90b2tlbigzMCk7Ci0gICAgICAgIHJpZ2h0ID0gYWRkRXhwcmVzc2lvbigpOwotICAgICAgICAgICAgICAgICAgICBsZWZ0ID0gQ29tcGFyaXNvbkV4cHJlc3Npb24uY3JlYXRlR3JlYXRlclRoYW4obGVmdCwgcmlnaHQpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgMzE6Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oMzEpOwotICAgICAgICByaWdodCA9IGFkZEV4cHJlc3Npb24oKTsKLSAgICAgICAgICAgICAgICAgICAgbGVmdCA9IENvbXBhcmlzb25FeHByZXNzaW9uLmNyZWF0ZUdyZWF0ZXJUaGFuRXF1YWwobGVmdCwgcmlnaHQpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgMzI6Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oMzIpOwotICAgICAgICByaWdodCA9IGFkZEV4cHJlc3Npb24oKTsKLSAgICAgICAgICAgICAgICAgICAgbGVmdCA9IENvbXBhcmlzb25FeHByZXNzaW9uLmNyZWF0ZUxlc3NUaGFuKGxlZnQsIHJpZ2h0KTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIDMzOgotICAgICAgICBqal9jb25zdW1lX3Rva2VuKDMzKTsKLSAgICAgICAgcmlnaHQgPSBhZGRFeHByZXNzaW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgIGxlZnQgPSBDb21wYXJpc29uRXhwcmVzc2lvbi5jcmVhdGVMZXNzVGhhbkVxdWFsKGxlZnQsIHJpZ2h0KTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIExJS0U6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdT1udWxsOwotICAgICAgICBqal9jb25zdW1lX3Rva2VuKExJS0UpOwotICAgICAgICB0ID0gc3RyaW5nTGl0dGVyYWwoKTsKLSAgICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7Ci0gICAgICAgIGNhc2UgRVNDQVBFOgotICAgICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oRVNDQVBFKTsKLSAgICAgICAgICB1ID0gc3RyaW5nTGl0dGVyYWwoKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICA7Ci0gICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbGVmdCA9IENvbXBhcmlzb25FeHByZXNzaW9uLmNyZWF0ZUxpa2UobGVmdCwgdCwgdSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgaWYgKGpqXzJfMigyKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHU9bnVsbDsKLSAgICAgICAgICBqal9jb25zdW1lX3Rva2VuKE5PVCk7Ci0gICAgICAgICAgampfY29uc3VtZV90b2tlbihMSUtFKTsKLSAgICAgICAgICB0ID0gc3RyaW5nTGl0dGVyYWwoKTsKLSAgICAgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKLSAgICAgICAgICBjYXNlIEVTQ0FQRToKLSAgICAgICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oRVNDQVBFKTsKLSAgICAgICAgICAgIHUgPSBzdHJpbmdMaXR0ZXJhbCgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIDsKLSAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGxlZnQgPSBDb21wYXJpc29uRXhwcmVzc2lvbi5jcmVhdGVOb3RMaWtlKGxlZnQsIHQsIHUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgICAgIGNhc2UgQkVUV0VFTjoKLSAgICAgICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oQkVUV0VFTik7Ci0gICAgICAgICAgICBsb3cgPSBhZGRFeHByZXNzaW9uKCk7Ci0gICAgICAgICAgICBqal9jb25zdW1lX3Rva2VuKEFORCk7Ci0gICAgICAgICAgICBoaWdoID0gYWRkRXhwcmVzc2lvbigpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQgPSBDb21wYXJpc29uRXhwcmVzc2lvbi5jcmVhdGVCZXR3ZWVuKGxlZnQsIGxvdywgaGlnaCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgaWYgKGpqXzJfMygyKSkgewotICAgICAgICAgICAgICBqal9jb25zdW1lX3Rva2VuKE5PVCk7Ci0gICAgICAgICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oQkVUV0VFTik7Ci0gICAgICAgICAgICAgIGxvdyA9IGFkZEV4cHJlc3Npb24oKTsKLSAgICAgICAgICAgICAgampfY29uc3VtZV90b2tlbihBTkQpOwotICAgICAgICAgICAgICBoaWdoID0gYWRkRXhwcmVzc2lvbigpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQgPSBDb21wYXJpc29uRXhwcmVzc2lvbi5jcmVhdGVOb3RCZXR3ZWVuKGxlZnQsIGxvdywgaGlnaCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKLSAgICAgICAgICAgICAgY2FzZSBJTjoKLSAgICAgICAgICAgICAgICBqal9jb25zdW1lX3Rva2VuKElOKTsKLSAgICAgICAgICAgICAgICBqal9jb25zdW1lX3Rva2VuKDM0KTsKLSAgICAgICAgICAgICAgICB0ID0gc3RyaW5nTGl0dGVyYWwoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0LmFkZCggdCApOwotICAgICAgICAgICAgICAgIGxhYmVsXzU6Ci0gICAgICAgICAgICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgICAgICAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgICAgICAgICAgICAgY2FzZSAzNToKLSAgICAgICAgICAgICAgICAgICAgOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrIGxhYmVsXzU7Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICBqal9jb25zdW1lX3Rva2VuKDM1KTsKLSAgICAgICAgICAgICAgICAgIHQgPSBzdHJpbmdMaXR0ZXJhbCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0LmFkZCggdCApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBqal9jb25zdW1lX3Rva2VuKDM2KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQgPSBDb21wYXJpc29uRXhwcmVzc2lvbi5jcmVhdGVJbkZpbHRlcihsZWZ0LCBsaXN0KTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBpZiAoampfMl80KDIpKSB7Ci0gICAgICAgICAgICAgICAgICBqal9jb25zdW1lX3Rva2VuKE5PVCk7Ci0gICAgICAgICAgICAgICAgICBqal9jb25zdW1lX3Rva2VuKElOKTsKLSAgICAgICAgICAgICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oMzQpOwotICAgICAgICAgICAgICAgICAgdCA9IHN0cmluZ0xpdHRlcmFsKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdC5hZGQoIHQgKTsKLSAgICAgICAgICAgICAgICAgIGxhYmVsXzY6Ci0gICAgICAgICAgICAgICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAzNToKLSAgICAgICAgICAgICAgICAgICAgICA7Ci0gICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgYnJlYWsgbGFiZWxfNjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBqal9jb25zdW1lX3Rva2VuKDM1KTsKLSAgICAgICAgICAgICAgICAgICAgdCA9IHN0cmluZ0xpdHRlcmFsKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3QuYWRkKCB0ICk7Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICBqal9jb25zdW1lX3Rva2VuKDM2KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQgPSBDb21wYXJpc29uRXhwcmVzc2lvbi5jcmVhdGVOb3RJbkZpbHRlcihsZWZ0LCBsaXN0KTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgampfY29uc3VtZV90b2tlbigtMSk7Ci0gICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgICAgIHtpZiAodHJ1ZSkgcmV0dXJuIGxlZnQ7fQotICAgIHRocm93IG5ldyBFcnJvcigiTWlzc2luZyByZXR1cm4gc3RhdGVtZW50IGluIGZ1bmN0aW9uIik7Ci0gIH0KLQotICBmaW5hbCBwdWJsaWMgRXhwcmVzc2lvbiBhZGRFeHByZXNzaW9uKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAgICBFeHByZXNzaW9uIGxlZnQ7Ci0gICAgRXhwcmVzc2lvbiByaWdodDsKLSAgICBsZWZ0ID0gbXVsdEV4cHIoKTsKLSAgICBsYWJlbF83OgotICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICBpZiAoampfMl81KDIxNDc0ODM2NDcpKSB7Ci0gICAgICAgIDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGJyZWFrIGxhYmVsXzc7Ci0gICAgICB9Ci0gICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKLSAgICAgIGNhc2UgMzc6Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oMzcpOwotICAgICAgICByaWdodCA9IG11bHRFeHByKCk7Ci0gICAgICAgICAgICAgICAgICAgIGxlZnQgPSBBcml0aG1ldGljRXhwcmVzc2lvbi5jcmVhdGVQbHVzKGxlZnQsIHJpZ2h0KTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIDM4OgotICAgICAgICBqal9jb25zdW1lX3Rva2VuKDM4KTsKLSAgICAgICAgcmlnaHQgPSBtdWx0RXhwcigpOwotICAgICAgICAgICAgICAgICAgICBsZWZ0ID0gQXJpdGhtZXRpY0V4cHJlc3Npb24uY3JlYXRlTWludXMobGVmdCwgcmlnaHQpOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oLTEpOwotICAgICAgICB0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgICAgIHtpZiAodHJ1ZSkgcmV0dXJuIGxlZnQ7fQotICAgIHRocm93IG5ldyBFcnJvcigiTWlzc2luZyByZXR1cm4gc3RhdGVtZW50IGluIGZ1bmN0aW9uIik7Ci0gIH0KLQotICBmaW5hbCBwdWJsaWMgRXhwcmVzc2lvbiBtdWx0RXhwcigpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gICAgRXhwcmVzc2lvbiBsZWZ0OwotICAgIEV4cHJlc3Npb24gcmlnaHQ7Ci0gICAgbGVmdCA9IHVuYXJ5RXhwcigpOwotICAgIGxhYmVsXzg6Ci0gICAgd2hpbGUgKHRydWUpIHsKLSAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgY2FzZSAzOToKLSAgICAgIGNhc2UgNDA6Ci0gICAgICBjYXNlIDQxOgotICAgICAgICA7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgYnJlYWsgbGFiZWxfODsKLSAgICAgIH0KLSAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgY2FzZSAzOToKLSAgICAgICAgampfY29uc3VtZV90b2tlbigzOSk7Ci0gICAgICAgIHJpZ2h0ID0gdW5hcnlFeHByKCk7Ci0gICAgICAgICAgICAgICAgbGVmdCA9IEFyaXRobWV0aWNFeHByZXNzaW9uLmNyZWF0ZU11bHRpcGx5KGxlZnQsIHJpZ2h0KTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIDQwOgotICAgICAgICBqal9jb25zdW1lX3Rva2VuKDQwKTsKLSAgICAgICAgcmlnaHQgPSB1bmFyeUV4cHIoKTsKLSAgICAgICAgICAgICAgICBsZWZ0ID0gQXJpdGhtZXRpY0V4cHJlc3Npb24uY3JlYXRlRGl2aWRlKGxlZnQsIHJpZ2h0KTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIDQxOgotICAgICAgICBqal9jb25zdW1lX3Rva2VuKDQxKTsKLSAgICAgICAgcmlnaHQgPSB1bmFyeUV4cHIoKTsKLSAgICAgICAgICAgICAgICBsZWZ0ID0gQXJpdGhtZXRpY0V4cHJlc3Npb24uY3JlYXRlTW9kKGxlZnQsIHJpZ2h0KTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICBqal9jb25zdW1lX3Rva2VuKC0xKTsKLSAgICAgICAgdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCk7Ci0gICAgICB9Ci0gICAgfQotICAgICAgICB7aWYgKHRydWUpIHJldHVybiBsZWZ0O30KLSAgICB0aHJvdyBuZXcgRXJyb3IoIk1pc3NpbmcgcmV0dXJuIHN0YXRlbWVudCBpbiBmdW5jdGlvbiIpOwotICB9Ci0KLSAgZmluYWwgcHVibGljIEV4cHJlc3Npb24gdW5hcnlFeHByKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAgICBTdHJpbmcgcz1udWxsOwotICAgIEV4cHJlc3Npb24gbGVmdD1udWxsOwotICAgIGlmIChqal8yXzYoMjE0NzQ4MzY0NykpIHsKLSAgICAgIGpqX2NvbnN1bWVfdG9rZW4oMzcpOwotICAgICAgbGVmdCA9IHVuYXJ5RXhwcigpOwotICAgIH0gZWxzZSB7Ci0gICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKLSAgICAgIGNhc2UgMzg6Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oMzgpOwotICAgICAgICBsZWZ0ID0gdW5hcnlFeHByKCk7Ci0gICAgICAgICAgICAgICAgbGVmdCA9IFVuYXJ5RXhwcmVzc2lvbi5jcmVhdGVOZWdhdGUobGVmdCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBOT1Q6Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oTk9UKTsKLSAgICAgICAgbGVmdCA9IHVuYXJ5RXhwcigpOwotICAgICAgICAgICAgICAgICAgICBsZWZ0ID0gVW5hcnlFeHByZXNzaW9uLmNyZWF0ZU5PVCggYXNCb29sZWFuRXhwcmVzc2lvbihsZWZ0KSApOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgWFBBVEg6Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oWFBBVEgpOwotICAgICAgICBzID0gc3RyaW5nTGl0dGVyYWwoKTsKLSAgICAgICAgICAgICAgICAgICAgbGVmdCA9IFVuYXJ5RXhwcmVzc2lvbi5jcmVhdGVYUGF0aCggcyApOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgWFFVRVJZOgotICAgICAgICBqal9jb25zdW1lX3Rva2VuKFhRVUVSWSk7Ci0gICAgICAgIHMgPSBzdHJpbmdMaXR0ZXJhbCgpOwotICAgICAgICAgICAgICAgICAgICBsZWZ0ID0gVW5hcnlFeHByZXNzaW9uLmNyZWF0ZVhRdWVyeSggcyApOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgVFJVRToKLSAgICAgIGNhc2UgRkFMU0U6Ci0gICAgICBjYXNlIE5VTEw6Ci0gICAgICBjYXNlIERFQ0lNQUxfTElURVJBTDoKLSAgICAgIGNhc2UgSEVYX0xJVEVSQUw6Ci0gICAgICBjYXNlIE9DVEFMX0xJVEVSQUw6Ci0gICAgICBjYXNlIEZMT0FUSU5HX1BPSU5UX0xJVEVSQUw6Ci0gICAgICBjYXNlIFNUUklOR19MSVRFUkFMOgotICAgICAgY2FzZSBJRDoKLSAgICAgIGNhc2UgMzQ6Ci0gICAgICAgIGxlZnQgPSBwcmltYXJ5RXhwcigpOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oLTEpOwotICAgICAgICB0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgICAgIHtpZiAodHJ1ZSkgcmV0dXJuIGxlZnQ7fQotICAgIHRocm93IG5ldyBFcnJvcigiTWlzc2luZyByZXR1cm4gc3RhdGVtZW50IGluIGZ1bmN0aW9uIik7Ci0gIH0KLQotICBmaW5hbCBwdWJsaWMgRXhwcmVzc2lvbiBwcmltYXJ5RXhwcigpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gICAgRXhwcmVzc2lvbiBsZWZ0PW51bGw7Ci0gICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7Ci0gICAgY2FzZSBUUlVFOgotICAgIGNhc2UgRkFMU0U6Ci0gICAgY2FzZSBOVUxMOgotICAgIGNhc2UgREVDSU1BTF9MSVRFUkFMOgotICAgIGNhc2UgSEVYX0xJVEVSQUw6Ci0gICAgY2FzZSBPQ1RBTF9MSVRFUkFMOgotICAgIGNhc2UgRkxPQVRJTkdfUE9JTlRfTElURVJBTDoKLSAgICBjYXNlIFNUUklOR19MSVRFUkFMOgotICAgICAgbGVmdCA9IGxpdGVyYWwoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgSUQ6Ci0gICAgICBsZWZ0ID0gdmFyaWFibGUoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMzQ6Ci0gICAgICBqal9jb25zdW1lX3Rva2VuKDM0KTsKLSAgICAgIGxlZnQgPSBvckV4cHJlc3Npb24oKTsKLSAgICAgIGpqX2NvbnN1bWVfdG9rZW4oMzYpOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGpqX2NvbnN1bWVfdG9rZW4oLTEpOwotICAgICAgdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCk7Ci0gICAgfQotICAgICAgICB7aWYgKHRydWUpIHJldHVybiBsZWZ0O30KLSAgICB0aHJvdyBuZXcgRXJyb3IoIk1pc3NpbmcgcmV0dXJuIHN0YXRlbWVudCBpbiBmdW5jdGlvbiIpOwotICB9Ci0KLSAgZmluYWwgcHVibGljIENvbnN0YW50RXhwcmVzc2lvbiBsaXRlcmFsKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAgICBUb2tlbiB0OwotICAgIFN0cmluZyBzOwotICAgIENvbnN0YW50RXhwcmVzc2lvbiBsZWZ0PW51bGw7Ci0gICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7Ci0gICAgY2FzZSBTVFJJTkdfTElURVJBTDoKLSAgICAgIHMgPSBzdHJpbmdMaXR0ZXJhbCgpOwotICAgICAgICAgICAgICAgIGxlZnQgPSBuZXcgQ29uc3RhbnRFeHByZXNzaW9uKHMpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBERUNJTUFMX0xJVEVSQUw6Ci0gICAgICB0ID0gampfY29uc3VtZV90b2tlbihERUNJTUFMX0xJVEVSQUwpOwotICAgICAgICAgICAgICAgIGxlZnQgPSBDb25zdGFudEV4cHJlc3Npb24uY3JlYXRlRnJvbURlY2ltYWwodC5pbWFnZSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEhFWF9MSVRFUkFMOgotICAgICAgdCA9IGpqX2NvbnN1bWVfdG9rZW4oSEVYX0xJVEVSQUwpOwotICAgICAgICAgICAgICAgIGxlZnQgPSBDb25zdGFudEV4cHJlc3Npb24uY3JlYXRlRnJvbUhleCh0LmltYWdlKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgT0NUQUxfTElURVJBTDoKLSAgICAgIHQgPSBqal9jb25zdW1lX3Rva2VuKE9DVEFMX0xJVEVSQUwpOwotICAgICAgICAgICAgICAgIGxlZnQgPSBDb25zdGFudEV4cHJlc3Npb24uY3JlYXRlRnJvbU9jdGFsKHQuaW1hZ2UpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGTE9BVElOR19QT0lOVF9MSVRFUkFMOgotICAgICAgdCA9IGpqX2NvbnN1bWVfdG9rZW4oRkxPQVRJTkdfUE9JTlRfTElURVJBTCk7Ci0gICAgICAgICAgICAgICAgbGVmdCA9IENvbnN0YW50RXhwcmVzc2lvbi5jcmVhdGVGbG9hdCh0LmltYWdlKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgVFJVRToKLSAgICAgIGpqX2NvbnN1bWVfdG9rZW4oVFJVRSk7Ci0gICAgICAgICAgICAgICAgbGVmdCA9IENvbnN0YW50RXhwcmVzc2lvbi5UUlVFOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGQUxTRToKLSAgICAgIGpqX2NvbnN1bWVfdG9rZW4oRkFMU0UpOwotICAgICAgICAgICAgICAgIGxlZnQgPSBDb25zdGFudEV4cHJlc3Npb24uRkFMU0U7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE5VTEw6Ci0gICAgICBqal9jb25zdW1lX3Rva2VuKE5VTEwpOwotICAgICAgICAgICAgICAgIGxlZnQgPSBDb25zdGFudEV4cHJlc3Npb24uTlVMTDsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBqal9jb25zdW1lX3Rva2VuKC0xKTsKLSAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigpOwotICAgIH0KLSAgICAgICAge2lmICh0cnVlKSByZXR1cm4gbGVmdDt9Ci0gICAgdGhyb3cgbmV3IEVycm9yKCJNaXNzaW5nIHJldHVybiBzdGF0ZW1lbnQgaW4gZnVuY3Rpb24iKTsKLSAgfQotCi0gIGZpbmFsIHB1YmxpYyBTdHJpbmcgc3RyaW5nTGl0dGVyYWwoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotICAgIFRva2VuIHQ7Ci0gICAgU3RyaW5nQnVmZmVyIHJjID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgIGJvb2xlYW4gZmlyc3Q9dHJ1ZTsKLSAgICB0ID0gampfY29uc3VtZV90b2tlbihTVFJJTkdfTElURVJBTCk7Ci0gICAgICAgIC8vIERlY29kZSB0aGUgc3RpbmcgdmFsdWUuCi0gICAgICAgIFN0cmluZyBpbWFnZSA9IHQuaW1hZ2U7Ci0gICAgICAgIGZvciggaW50IGk9MTsgaSA8IGltYWdlLmxlbmd0aCgpLTE7IGkrKyApIHsKLSAgICAgICAgICAgICAgICBjaGFyIGMgPSBpbWFnZS5jaGFyQXQoaSk7Ci0gICAgICAgICAgICAgICAgaWYoIGMgPT0gJ1wnJyApCi0gICAgICAgICAgICAgICAgICAgICAgICBpKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICByYy5hcHBlbmQoYyk7Ci0gICAgICAgIH0KLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgcmV0dXJuIHJjLnRvU3RyaW5nKCk7fQotICAgIHRocm93IG5ldyBFcnJvcigiTWlzc2luZyByZXR1cm4gc3RhdGVtZW50IGluIGZ1bmN0aW9uIik7Ci0gIH0KLQotICBmaW5hbCBwdWJsaWMgUHJvcGVydHlFeHByZXNzaW9uIHZhcmlhYmxlKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAgICBUb2tlbiB0OwotICAgIFByb3BlcnR5RXhwcmVzc2lvbiBsZWZ0PW51bGw7Ci0gICAgdCA9IGpqX2NvbnN1bWVfdG9rZW4oSUQpOwotICAgICAgICAgICAgbGVmdCA9IG5ldyBQcm9wZXJ0eUV4cHJlc3Npb24odC5pbWFnZSk7Ci0gICAgICAgIHtpZiAodHJ1ZSkgcmV0dXJuIGxlZnQ7fQotICAgIHRocm93IG5ldyBFcnJvcigiTWlzc2luZyByZXR1cm4gc3RhdGVtZW50IGluIGZ1bmN0aW9uIik7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfMl8xKGludCB4bGEpIHsKLSAgICBqal9sYSA9IHhsYTsgampfbGFzdHBvcyA9IGpqX3NjYW5wb3MgPSB0b2tlbjsKLSAgICB0cnkgeyByZXR1cm4gIWpqXzNfMSgpOyB9Ci0gICAgY2F0Y2goTG9va2FoZWFkU3VjY2VzcyBscykgeyByZXR1cm4gdHJ1ZTsgfQotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzJfMihpbnQgeGxhKSB7Ci0gICAgampfbGEgPSB4bGE7IGpqX2xhc3Rwb3MgPSBqal9zY2FucG9zID0gdG9rZW47Ci0gICAgdHJ5IHsgcmV0dXJuICFqal8zXzIoKTsgfQotICAgIGNhdGNoKExvb2thaGVhZFN1Y2Nlc3MgbHMpIHsgcmV0dXJuIHRydWU7IH0KLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8yXzMoaW50IHhsYSkgewotICAgIGpqX2xhID0geGxhOyBqal9sYXN0cG9zID0gampfc2NhbnBvcyA9IHRva2VuOwotICAgIHRyeSB7IHJldHVybiAhampfM18zKCk7IH0KLSAgICBjYXRjaChMb29rYWhlYWRTdWNjZXNzIGxzKSB7IHJldHVybiB0cnVlOyB9Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfMl80KGludCB4bGEpIHsKLSAgICBqal9sYSA9IHhsYTsgampfbGFzdHBvcyA9IGpqX3NjYW5wb3MgPSB0b2tlbjsKLSAgICB0cnkgeyByZXR1cm4gIWpqXzNfNCgpOyB9Ci0gICAgY2F0Y2goTG9va2FoZWFkU3VjY2VzcyBscykgeyByZXR1cm4gdHJ1ZTsgfQotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzJfNShpbnQgeGxhKSB7Ci0gICAgampfbGEgPSB4bGE7IGpqX2xhc3Rwb3MgPSBqal9zY2FucG9zID0gdG9rZW47Ci0gICAgdHJ5IHsgcmV0dXJuICFqal8zXzUoKTsgfQotICAgIGNhdGNoKExvb2thaGVhZFN1Y2Nlc3MgbHMpIHsgcmV0dXJuIHRydWU7IH0KLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8yXzYoaW50IHhsYSkgewotICAgIGpqX2xhID0geGxhOyBqal9sYXN0cG9zID0gampfc2NhbnBvcyA9IHRva2VuOwotICAgIHRyeSB7IHJldHVybiAhampfM182KCk7IH0KLSAgICBjYXRjaChMb29rYWhlYWRTdWNjZXNzIGxzKSB7IHJldHVybiB0cnVlOyB9Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfNTEoKSB7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oMzIpKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfM1JfNDMoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzI3KCkgewotICAgIGlmIChqal9zY2FuX3Rva2VuKElEKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzYxKCkgewotICAgIGlmIChqal9zY2FuX3Rva2VuKDM1KSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqXzNSXzIxKCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl80OCgpIHsKLSAgICBUb2tlbiB4c3A7Ci0gICAgeHNwID0gampfc2NhbnBvczsKLSAgICBpZiAoampfM1JfNTYoKSkgewotICAgIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqXzNSXzU3KCkpIHJldHVybiB0cnVlOwotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMzgoKSB7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oT1IpKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfM1JfMzcoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzUwKCkgewotICAgIGlmIChqal9zY2FuX3Rva2VuKDMxKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqXzNSXzQzKCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8yNSgpIHsKLSAgICBpZiAoampfc2Nhbl90b2tlbigzNCkpIHJldHVybiB0cnVlOwotICAgIGlmIChqal8zUl8yOCgpKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfc2Nhbl90b2tlbigzNikpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8yNCgpIHsKLSAgICBpZiAoampfM1JfMjcoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzQ5KCkgewotICAgIGlmIChqal9zY2FuX3Rva2VuKDMwKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqXzNSXzQzKCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl80NCgpIHsKLSAgICBUb2tlbiB4c3A7Ci0gICAgeHNwID0gampfc2NhbnBvczsKLSAgICBpZiAoampfM1JfNDkoKSkgewotICAgIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqXzNSXzUwKCkpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal8zUl81MSgpKSB7Ci0gICAgampfc2NhbnBvcyA9IHhzcDsKLSAgICBpZiAoampfM1JfNTIoKSkgewotICAgIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqXzNSXzUzKCkpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal8zXzIoKSkgewotICAgIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqXzNSXzU0KCkpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal8zXzMoKSkgewotICAgIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqXzNSXzU1KCkpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal8zXzQoKSkgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIH0KLSAgICB9Ci0gICAgfQotICAgIH0KLSAgICB9Ci0gICAgfQotICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzIzKCkgewotICAgIGlmIChqal8zUl8yNigpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfNDMoKSB7Ci0gICAgaWYgKGpqXzNSXzkoKSkgcmV0dXJuIHRydWU7Ci0gICAgVG9rZW4geHNwOwotICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICB4c3AgPSBqal9zY2FucG9zOwotICAgICAgaWYgKGpqXzNSXzQ4KCkpIHsgampfc2NhbnBvcyA9IHhzcDsgYnJlYWs7IH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzI4KCkgewotICAgIGlmIChqal8zUl8zNygpKSByZXR1cm4gdHJ1ZTsKLSAgICBUb2tlbiB4c3A7Ci0gICAgd2hpbGUgKHRydWUpIHsKLSAgICAgIHhzcCA9IGpqX3NjYW5wb3M7Ci0gICAgICBpZiAoampfM1JfMzgoKSkgeyBqal9zY2FucG9zID0geHNwOyBicmVhazsgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMjIoKSB7Ci0gICAgVG9rZW4geHNwOwotICAgIHhzcCA9IGpqX3NjYW5wb3M7Ci0gICAgaWYgKGpqXzNSXzIzKCkpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal8zUl8yNCgpKSB7Ci0gICAgampfc2NhbnBvcyA9IHhzcDsKLSAgICBpZiAoampfM1JfMjUoKSkgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMTcoKSB7Ci0gICAgaWYgKGpqXzNSXzIyKCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8yMSgpIHsKLSAgICBpZiAoampfc2Nhbl90b2tlbihTVFJJTkdfTElURVJBTCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl82MCgpIHsKLSAgICBpZiAoampfc2Nhbl90b2tlbigzNSkpIHJldHVybiB0cnVlOwotICAgIGlmIChqal8zUl8yMSgpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMTYoKSB7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oWFFVRVJZKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqXzNSXzIxKCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl80MSgpIHsKLSAgICBpZiAoampfM1JfNDMoKSkgcmV0dXJuIHRydWU7Ci0gICAgVG9rZW4geHNwOwotICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICB4c3AgPSBqal9zY2FucG9zOwotICAgICAgaWYgKGpqXzNSXzQ0KCkpIHsgampfc2NhbnBvcyA9IHhzcDsgYnJlYWs7IH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzU5KCkgewotICAgIGlmIChqal9zY2FuX3Rva2VuKEVTQ0FQRSkpIHJldHVybiB0cnVlOwotICAgIGlmIChqal8zUl8yMSgpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM180KCkgewotICAgIGlmIChqal9zY2FuX3Rva2VuKE5PVCkpIHJldHVybiB0cnVlOwotICAgIGlmIChqal9zY2FuX3Rva2VuKElOKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oMzQpKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfM1JfMjEoKSkgcmV0dXJuIHRydWU7Ci0gICAgVG9rZW4geHNwOwotICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICB4c3AgPSBqal9zY2FucG9zOwotICAgICAgaWYgKGpqXzNSXzYxKCkpIHsgampfc2NhbnBvcyA9IHhzcDsgYnJlYWs7IH0KLSAgICB9Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oMzYpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM182KCkgewotICAgIGlmIChqal9zY2FuX3Rva2VuKDM3KSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqXzNSXzEwKCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8xNSgpIHsKLSAgICBpZiAoampfc2Nhbl90b2tlbihYUEFUSCkpIHJldHVybiB0cnVlOwotICAgIGlmIChqal8zUl8yMSgpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMTQoKSB7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oTk9UKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqXzNSXzEwKCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8zNigpIHsKLSAgICBpZiAoampfc2Nhbl90b2tlbihOVUxMKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzEyKCkgewotICAgIGlmIChqal9zY2FuX3Rva2VuKDM3KSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqXzNSXzEwKCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl81NSgpIHsKLSAgICBpZiAoampfc2Nhbl90b2tlbihJTikpIHJldHVybiB0cnVlOwotICAgIGlmIChqal9zY2FuX3Rva2VuKDM0KSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqXzNSXzIxKCkpIHJldHVybiB0cnVlOwotICAgIFRva2VuIHhzcDsKLSAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgeHNwID0gampfc2NhbnBvczsKLSAgICAgIGlmIChqal8zUl82MCgpKSB7IGpqX3NjYW5wb3MgPSB4c3A7IGJyZWFrOyB9Ci0gICAgfQotICAgIGlmIChqal9zY2FuX3Rva2VuKDM2KSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzQ3KCkgewotICAgIGlmIChqal9zY2FuX3Rva2VuKElTKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oTk9UKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oTlVMTCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8xMygpIHsKLSAgICBpZiAoampfc2Nhbl90b2tlbigzOCkpIHJldHVybiB0cnVlOwotICAgIGlmIChqal8zUl8xMCgpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMzUoKSB7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oRkFMU0UpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM18xKCkgewotICAgIGlmIChqal9zY2FuX3Rva2VuKElTKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oTlVMTCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8xMCgpIHsKLSAgICBUb2tlbiB4c3A7Ci0gICAgeHNwID0gampfc2NhbnBvczsKLSAgICBpZiAoampfM1JfMTIoKSkgewotICAgIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqXzNSXzEzKCkpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal8zUl8xNCgpKSB7Ci0gICAgampfc2NhbnBvcyA9IHhzcDsKLSAgICBpZiAoampfM1JfMTUoKSkgewotICAgIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqXzNSXzE2KCkpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal8zUl8xNygpKSByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgfQotICAgIH0KLSAgICB9Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8zNCgpIHsKLSAgICBpZiAoampfc2Nhbl90b2tlbihUUlVFKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzQ2KCkgewotICAgIGlmIChqal9zY2FuX3Rva2VuKDI5KSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqXzNSXzQxKCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zXzMoKSB7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oTk9UKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oQkVUV0VFTikpIHJldHVybiB0cnVlOwotICAgIGlmIChqal8zUl80MygpKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfc2Nhbl90b2tlbihBTkQpKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfM1JfNDMoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzQ1KCkgewotICAgIGlmIChqal9zY2FuX3Rva2VuKDI4KSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqXzNSXzQxKCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl80MigpIHsKLSAgICBUb2tlbiB4c3A7Ci0gICAgeHNwID0gampfc2NhbnBvczsKLSAgICBpZiAoampfM1JfNDUoKSkgewotICAgIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqXzNSXzQ2KCkpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal8zXzEoKSkgewotICAgIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqXzNSXzQ3KCkpIHJldHVybiB0cnVlOwotICAgIH0KLSAgICB9Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8zMygpIHsKLSAgICBpZiAoampfc2Nhbl90b2tlbihGTE9BVElOR19QT0lOVF9MSVRFUkFMKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzU0KCkgewotICAgIGlmIChqal9zY2FuX3Rva2VuKEJFVFdFRU4pKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfM1JfNDMoKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oQU5EKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqXzNSXzQzKCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl81OCgpIHsKLSAgICBpZiAoampfc2Nhbl90b2tlbihFU0NBUEUpKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfM1JfMjEoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzMyKCkgewotICAgIGlmIChqal9zY2FuX3Rva2VuKE9DVEFMX0xJVEVSQUwpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMjAoKSB7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oNDEpKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfM1JfMTAoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzM5KCkgewotICAgIGlmIChqal8zUl80MSgpKSByZXR1cm4gdHJ1ZTsKLSAgICBUb2tlbiB4c3A7Ci0gICAgd2hpbGUgKHRydWUpIHsKLSAgICAgIHhzcCA9IGpqX3NjYW5wb3M7Ci0gICAgICBpZiAoampfM1JfNDIoKSkgeyBqal9zY2FucG9zID0geHNwOyBicmVhazsgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM18yKCkgewotICAgIGlmIChqal9zY2FuX3Rva2VuKE5PVCkpIHJldHVybiB0cnVlOwotICAgIGlmIChqal9zY2FuX3Rva2VuKExJS0UpKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfM1JfMjEoKSkgcmV0dXJuIHRydWU7Ci0gICAgVG9rZW4geHNwOwotICAgIHhzcCA9IGpqX3NjYW5wb3M7Ci0gICAgaWYgKGpqXzNSXzU5KCkpIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzUzKCkgewotICAgIGlmIChqal9zY2FuX3Rva2VuKExJS0UpKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfM1JfMjEoKSkgcmV0dXJuIHRydWU7Ci0gICAgVG9rZW4geHNwOwotICAgIHhzcCA9IGpqX3NjYW5wb3M7Ci0gICAgaWYgKGpqXzNSXzU4KCkpIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzMxKCkgewotICAgIGlmIChqal9zY2FuX3Rva2VuKEhFWF9MSVRFUkFMKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzE5KCkgewotICAgIGlmIChqal9zY2FuX3Rva2VuKDQwKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqXzNSXzEwKCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8xOCgpIHsKLSAgICBpZiAoampfc2Nhbl90b2tlbigzOSkpIHJldHVybiB0cnVlOwotICAgIGlmIChqal8zUl8xMCgpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMTEoKSB7Ci0gICAgVG9rZW4geHNwOwotICAgIHhzcCA9IGpqX3NjYW5wb3M7Ci0gICAgaWYgKGpqXzNSXzE4KCkpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal8zUl8xOSgpKSB7Ci0gICAgampfc2NhbnBvcyA9IHhzcDsKLSAgICBpZiAoampfM1JfMjAoKSkgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfNDAoKSB7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oQU5EKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqXzNSXzM5KCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8zMCgpIHsKLSAgICBpZiAoampfc2Nhbl90b2tlbihERUNJTUFMX0xJVEVSQUwpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfOSgpIHsKLSAgICBpZiAoampfM1JfMTAoKSkgcmV0dXJuIHRydWU7Ci0gICAgVG9rZW4geHNwOwotICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICB4c3AgPSBqal9zY2FucG9zOwotICAgICAgaWYgKGpqXzNSXzExKCkpIHsgampfc2NhbnBvcyA9IHhzcDsgYnJlYWs7IH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzI5KCkgewotICAgIGlmIChqal8zUl8yMSgpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfNTcoKSB7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oMzgpKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfM1JfOSgpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMzcoKSB7Ci0gICAgaWYgKGpqXzNSXzM5KCkpIHJldHVybiB0cnVlOwotICAgIFRva2VuIHhzcDsKLSAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgeHNwID0gampfc2NhbnBvczsKLSAgICAgIGlmIChqal8zUl80MCgpKSB7IGpqX3NjYW5wb3MgPSB4c3A7IGJyZWFrOyB9Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zXzUoKSB7Ci0gICAgVG9rZW4geHNwOwotICAgIHhzcCA9IGpqX3NjYW5wb3M7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oMzcpKSB7Ci0gICAgampfc2NhbnBvcyA9IHhzcDsKLSAgICBpZiAoampfc2Nhbl90b2tlbigzOCkpIHJldHVybiB0cnVlOwotICAgIH0KLSAgICBpZiAoampfM1JfOSgpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMjYoKSB7Ci0gICAgVG9rZW4geHNwOwotICAgIHhzcCA9IGpqX3NjYW5wb3M7Ci0gICAgaWYgKGpqXzNSXzI5KCkpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal8zUl8zMCgpKSB7Ci0gICAgampfc2NhbnBvcyA9IHhzcDsKLSAgICBpZiAoampfM1JfMzEoKSkgewotICAgIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqXzNSXzMyKCkpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal8zUl8zMygpKSB7Ci0gICAgampfc2NhbnBvcyA9IHhzcDsKLSAgICBpZiAoampfM1JfMzQoKSkgewotICAgIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqXzNSXzM1KCkpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal8zUl8zNigpKSByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgfQotICAgIH0KLSAgICB9Ci0gICAgfQotICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzUyKCkgewotICAgIGlmIChqal9zY2FuX3Rva2VuKDMzKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqXzNSXzQzKCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl81NigpIHsKLSAgICBpZiAoampfc2Nhbl90b2tlbigzNykpIHJldHVybiB0cnVlOwotICAgIGlmIChqal8zUl85KCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHB1YmxpYyBTZWxlY3RvclBhcnNlclRva2VuTWFuYWdlciB0b2tlbl9zb3VyY2U7Ci0gIFNpbXBsZUNoYXJTdHJlYW0gampfaW5wdXRfc3RyZWFtOwotICBwdWJsaWMgVG9rZW4gdG9rZW4sIGpqX250OwotICBwcml2YXRlIGludCBqal9udGs7Ci0gIHByaXZhdGUgVG9rZW4gampfc2NhbnBvcywgampfbGFzdHBvczsKLSAgcHJpdmF0ZSBpbnQgampfbGE7Ci0gIHB1YmxpYyBib29sZWFuIGxvb2tpbmdBaGVhZCA9IGZhbHNlOwotICBwcml2YXRlIGJvb2xlYW4gampfc2VtTEE7Ci0KLSAgcHVibGljIFNlbGVjdG9yUGFyc2VyKGphdmEuaW8uSW5wdXRTdHJlYW0gc3RyZWFtKSB7Ci0gICAgampfaW5wdXRfc3RyZWFtID0gbmV3IFNpbXBsZUNoYXJTdHJlYW0oc3RyZWFtLCAxLCAxKTsKLSAgICB0b2tlbl9zb3VyY2UgPSBuZXcgU2VsZWN0b3JQYXJzZXJUb2tlbk1hbmFnZXIoampfaW5wdXRfc3RyZWFtKTsKLSAgICB0b2tlbiA9IG5ldyBUb2tlbigpOwotICAgIGpqX250ayA9IC0xOwotICB9Ci0KLSAgcHVibGljIHZvaWQgUmVJbml0KGphdmEuaW8uSW5wdXRTdHJlYW0gc3RyZWFtKSB7Ci0gICAgampfaW5wdXRfc3RyZWFtLlJlSW5pdChzdHJlYW0sIDEsIDEpOwotICAgIHRva2VuX3NvdXJjZS5SZUluaXQoampfaW5wdXRfc3RyZWFtKTsKLSAgICB0b2tlbiA9IG5ldyBUb2tlbigpOwotICAgIGpqX250ayA9IC0xOwotICB9Ci0KLSAgcHVibGljIFNlbGVjdG9yUGFyc2VyKGphdmEuaW8uUmVhZGVyIHN0cmVhbSkgewotICAgIGpqX2lucHV0X3N0cmVhbSA9IG5ldyBTaW1wbGVDaGFyU3RyZWFtKHN0cmVhbSwgMSwgMSk7Ci0gICAgdG9rZW5fc291cmNlID0gbmV3IFNlbGVjdG9yUGFyc2VyVG9rZW5NYW5hZ2VyKGpqX2lucHV0X3N0cmVhbSk7Ci0gICAgdG9rZW4gPSBuZXcgVG9rZW4oKTsKLSAgICBqal9udGsgPSAtMTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIFJlSW5pdChqYXZhLmlvLlJlYWRlciBzdHJlYW0pIHsKLSAgICBqal9pbnB1dF9zdHJlYW0uUmVJbml0KHN0cmVhbSwgMSwgMSk7Ci0gICAgdG9rZW5fc291cmNlLlJlSW5pdChqal9pbnB1dF9zdHJlYW0pOwotICAgIHRva2VuID0gbmV3IFRva2VuKCk7Ci0gICAgampfbnRrID0gLTE7Ci0gIH0KLQotICBwdWJsaWMgU2VsZWN0b3JQYXJzZXIoU2VsZWN0b3JQYXJzZXJUb2tlbk1hbmFnZXIgdG0pIHsKLSAgICB0b2tlbl9zb3VyY2UgPSB0bTsKLSAgICB0b2tlbiA9IG5ldyBUb2tlbigpOwotICAgIGpqX250ayA9IC0xOwotICB9Ci0KLSAgcHVibGljIHZvaWQgUmVJbml0KFNlbGVjdG9yUGFyc2VyVG9rZW5NYW5hZ2VyIHRtKSB7Ci0gICAgdG9rZW5fc291cmNlID0gdG07Ci0gICAgdG9rZW4gPSBuZXcgVG9rZW4oKTsKLSAgICBqal9udGsgPSAtMTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgVG9rZW4gampfY29uc3VtZV90b2tlbihpbnQga2luZCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAgICBUb2tlbiBvbGRUb2tlbjsKLSAgICBpZiAoKG9sZFRva2VuID0gdG9rZW4pLm5leHQgIT0gbnVsbCkgdG9rZW4gPSB0b2tlbi5uZXh0OwotICAgIGVsc2UgdG9rZW4gPSB0b2tlbi5uZXh0ID0gdG9rZW5fc291cmNlLmdldE5leHRUb2tlbigpOwotICAgIGpqX250ayA9IC0xOwotICAgIGlmICh0b2tlbi5raW5kID09IGtpbmQpIHsKLSAgICAgIHJldHVybiB0b2tlbjsKLSAgICB9Ci0gICAgdG9rZW4gPSBvbGRUb2tlbjsKLSAgICB0aHJvdyBnZW5lcmF0ZVBhcnNlRXhjZXB0aW9uKCk7Ci0gIH0KLQotICBzdGF0aWMgcHJpdmF0ZSBmaW5hbCBjbGFzcyBMb29rYWhlYWRTdWNjZXNzIGV4dGVuZHMgamF2YS5sYW5nLkVycm9yIHsgfQotICBmaW5hbCBwcml2YXRlIExvb2thaGVhZFN1Y2Nlc3MgampfbHMgPSBuZXcgTG9va2FoZWFkU3VjY2VzcygpOwotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfc2Nhbl90b2tlbihpbnQga2luZCkgewotICAgIGlmIChqal9zY2FucG9zID09IGpqX2xhc3Rwb3MpIHsKLSAgICAgIGpqX2xhLS07Ci0gICAgICBpZiAoampfc2NhbnBvcy5uZXh0ID09IG51bGwpIHsKLSAgICAgICAgampfbGFzdHBvcyA9IGpqX3NjYW5wb3MgPSBqal9zY2FucG9zLm5leHQgPSB0b2tlbl9zb3VyY2UuZ2V0TmV4dFRva2VuKCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBqal9sYXN0cG9zID0gampfc2NhbnBvcyA9IGpqX3NjYW5wb3MubmV4dDsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgampfc2NhbnBvcyA9IGpqX3NjYW5wb3MubmV4dDsKLSAgICB9Ci0gICAgaWYgKGpqX3NjYW5wb3Mua2luZCAhPSBraW5kKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfbGEgPT0gMCAmJiBqal9zY2FucG9zID09IGpqX2xhc3Rwb3MpIHRocm93IGpqX2xzOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHB1YmxpYyBUb2tlbiBnZXROZXh0VG9rZW4oKSB7Ci0gICAgaWYgKHRva2VuLm5leHQgIT0gbnVsbCkgdG9rZW4gPSB0b2tlbi5uZXh0OwotICAgIGVsc2UgdG9rZW4gPSB0b2tlbi5uZXh0ID0gdG9rZW5fc291cmNlLmdldE5leHRUb2tlbigpOwotICAgIGpqX250ayA9IC0xOwotICAgIHJldHVybiB0b2tlbjsKLSAgfQotCi0gIGZpbmFsIHB1YmxpYyBUb2tlbiBnZXRUb2tlbihpbnQgaW5kZXgpIHsKLSAgICBUb2tlbiB0ID0gbG9va2luZ0FoZWFkID8gampfc2NhbnBvcyA6IHRva2VuOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW5kZXg7IGkrKykgewotICAgICAgaWYgKHQubmV4dCAhPSBudWxsKSB0ID0gdC5uZXh0OwotICAgICAgZWxzZSB0ID0gdC5uZXh0ID0gdG9rZW5fc291cmNlLmdldE5leHRUb2tlbigpOwotICAgIH0KLSAgICByZXR1cm4gdDsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgaW50IGpqX250aygpIHsKLSAgICBpZiAoKGpqX250PXRva2VuLm5leHQpID09IG51bGwpCi0gICAgICByZXR1cm4gKGpqX250ayA9ICh0b2tlbi5uZXh0PXRva2VuX3NvdXJjZS5nZXROZXh0VG9rZW4oKSkua2luZCk7Ci0gICAgZWxzZQotICAgICAgcmV0dXJuIChqal9udGsgPSBqal9udC5raW5kKTsKLSAgfQotCi0gIHB1YmxpYyBQYXJzZUV4Y2VwdGlvbiBnZW5lcmF0ZVBhcnNlRXhjZXB0aW9uKCkgewotICAgIFRva2VuIGVycm9ydG9rID0gdG9rZW4ubmV4dDsKLSAgICBpbnQgbGluZSA9IGVycm9ydG9rLmJlZ2luTGluZSwgY29sdW1uID0gZXJyb3J0b2suYmVnaW5Db2x1bW47Ci0gICAgU3RyaW5nIG1lc3MgPSAoZXJyb3J0b2sua2luZCA9PSAwKSA/IHRva2VuSW1hZ2VbMF0gOiBlcnJvcnRvay5pbWFnZTsKLSAgICByZXR1cm4gbmV3IFBhcnNlRXhjZXB0aW9uKCJQYXJzZSBlcnJvciBhdCBsaW5lICIgKyBsaW5lICsgIiwgY29sdW1uICIgKyBjb2x1bW4gKyAiLiAgRW5jb3VudGVyZWQ6ICIgKyBtZXNzKTsKLSAgfQotCi0gIGZpbmFsIHB1YmxpYyB2b2lkIGVuYWJsZV90cmFjaW5nKCkgewotICB9Ci0KLSAgZmluYWwgcHVibGljIHZvaWQgZGlzYWJsZV90cmFjaW5nKCkgewotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YWNjLXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvdmFsaWRhdG9yL1NlbGVjdG9yUGFyc2VyQ29uc3RhbnRzLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFjYy1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL3ZhbGlkYXRvci9TZWxlY3RvclBhcnNlckNvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MGM0NTc3Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YWNjLXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvdmFsaWRhdG9yL1NlbGVjdG9yUGFyc2VyQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKiBHZW5lcmF0ZWQgQnk6SmF2YUNDOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIFNlbGVjdG9yUGFyc2VyQ29uc3RhbnRzLmphdmEgKi8KLXBhY2thZ2Ugb3JnLmFjdGl2ZW1xLnNlbGVjdG9yOwotCi1wdWJsaWMgaW50ZXJmYWNlIFNlbGVjdG9yUGFyc2VyQ29uc3RhbnRzIHsKLQotICBpbnQgRU9GID0gMDsKLSAgaW50IExJTkVfQ09NTUVOVCA9IDY7Ci0gIGludCBCTE9DS19DT01NRU5UID0gNzsKLSAgaW50IE5PVCA9IDg7Ci0gIGludCBBTkQgPSA5OwotICBpbnQgT1IgPSAxMDsKLSAgaW50IEJFVFdFRU4gPSAxMTsKLSAgaW50IExJS0UgPSAxMjsKLSAgaW50IEVTQ0FQRSA9IDEzOwotICBpbnQgSU4gPSAxNDsKLSAgaW50IElTID0gMTU7Ci0gIGludCBUUlVFID0gMTY7Ci0gIGludCBGQUxTRSA9IDE3OwotICBpbnQgTlVMTCA9IDE4OwotICBpbnQgWFBBVEggPSAxOTsKLSAgaW50IFhRVUVSWSA9IDIwOwotICBpbnQgREVDSU1BTF9MSVRFUkFMID0gMjE7Ci0gIGludCBIRVhfTElURVJBTCA9IDIyOwotICBpbnQgT0NUQUxfTElURVJBTCA9IDIzOwotICBpbnQgRkxPQVRJTkdfUE9JTlRfTElURVJBTCA9IDI0OwotICBpbnQgRVhQT05FTlQgPSAyNTsKLSAgaW50IFNUUklOR19MSVRFUkFMID0gMjY7Ci0gIGludCBJRCA9IDI3OwotCi0gIGludCBERUZBVUxUID0gMDsKLQotICBTdHJpbmdbXSB0b2tlbkltYWdlID0gewotICAgICI8RU9GPiIsCi0gICAgIlwiIFwiIiwKLSAgICAiXCJcXHRcIiIsCi0gICAgIlwiXFxuXCIiLAotICAgICJcIlxcclwiIiwKLSAgICAiXCJcXGZcIiIsCi0gICAgIjxMSU5FX0NPTU1FTlQ+IiwKLSAgICAiPEJMT0NLX0NPTU1FTlQ+IiwKLSAgICAiXCJOT1RcIiIsCi0gICAgIlwiQU5EXCIiLAotICAgICJcIk9SXCIiLAotICAgICJcIkJFVFdFRU5cIiIsCi0gICAgIlwiTElLRVwiIiwKLSAgICAiXCJFU0NBUEVcIiIsCi0gICAgIlwiSU5cIiIsCi0gICAgIlwiSVNcIiIsCi0gICAgIlwiVFJVRVwiIiwKLSAgICAiXCJGQUxTRVwiIiwKLSAgICAiXCJOVUxMXCIiLAotICAgICJcIlhQQVRIXCIiLAotICAgICJcIlhRVUVSWVwiIiwKLSAgICAiPERFQ0lNQUxfTElURVJBTD4iLAotICAgICI8SEVYX0xJVEVSQUw+IiwKLSAgICAiPE9DVEFMX0xJVEVSQUw+IiwKLSAgICAiPEZMT0FUSU5HX1BPSU5UX0xJVEVSQUw+IiwKLSAgICAiPEVYUE9ORU5UPiIsCi0gICAgIjxTVFJJTkdfTElURVJBTD4iLAotICAgICI8SUQ+IiwKLSAgICAiXCI9XCIiLAotICAgICJcIjw+XCIiLAotICAgICJcIj5cIiIsCi0gICAgIlwiPj1cIiIsCi0gICAgIlwiPFwiIiwKLSAgICAiXCI8PVwiIiwKLSAgICAiXCIoXCIiLAotICAgICJcIixcIiIsCi0gICAgIlwiKVwiIiwKLSAgICAiXCIrXCIiLAotICAgICJcIi1cIiIsCi0gICAgIlwiKlwiIiwKLSAgICAiXCIvXCIiLAotICAgICJcIiVcIiIsCi0gIH07Ci0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YWNjLXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvdmFsaWRhdG9yL1NlbGVjdG9yUGFyc2VyVG9rZW5NYW5hZ2VyLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFjYy1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL3ZhbGlkYXRvci9TZWxlY3RvclBhcnNlclRva2VuTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzlkMWYzLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YWNjLXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvdmFsaWRhdG9yL1NlbGVjdG9yUGFyc2VyVG9rZW5NYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYxICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qIEdlbmVyYXRlZCBCeTpKYXZhQ0M6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gU2VsZWN0b3JQYXJzZXJUb2tlbk1hbmFnZXIuamF2YSAqLwotcGFja2FnZSBvcmcuYWN0aXZlbXEuc2VsZWN0b3I7Ci1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IGphdmF4Lmptcy5JbnZhbGlkU2VsZWN0b3JFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFjdGl2ZW1xLmZpbHRlci4qOwotCi1wdWJsaWMgY2xhc3MgU2VsZWN0b3JQYXJzZXJUb2tlbk1hbmFnZXIgaW1wbGVtZW50cyBTZWxlY3RvclBhcnNlckNvbnN0YW50cwotewotICBwdWJsaWMgIGphdmEuaW8uUHJpbnRTdHJlYW0gZGVidWdTdHJlYW0gPSBTeXN0ZW0ub3V0OwotICBwdWJsaWMgIHZvaWQgc2V0RGVidWdTdHJlYW0oamF2YS5pby5QcmludFN0cmVhbSBkcykgeyBkZWJ1Z1N0cmVhbSA9IGRzOyB9Ci1wcml2YXRlIGZpbmFsIGludCBqalN0b3BBdFBvcyhpbnQgcG9zLCBpbnQga2luZCkKLXsKLSAgIGpqbWF0Y2hlZEtpbmQgPSBraW5kOwotICAgamptYXRjaGVkUG9zID0gcG9zOwotICAgcmV0dXJuIHBvcyArIDE7Ci19Ci1wcml2YXRlIGZpbmFsIGludCBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMF8wKCkKLXsKLSAgIHN3aXRjaChjdXJDaGFyKQotICAgewotICAgICAgY2FzZSA5OgotICAgICAgICAgamptYXRjaGVkS2luZCA9IDI7Ci0gICAgICAgICByZXR1cm4gampNb3ZlTmZhXzAoNSwgMCk7Ci0gICAgICBjYXNlIDEwOgotICAgICAgICAgamptYXRjaGVkS2luZCA9IDM7Ci0gICAgICAgICByZXR1cm4gampNb3ZlTmZhXzAoNSwgMCk7Ci0gICAgICBjYXNlIDEyOgotICAgICAgICAgamptYXRjaGVkS2luZCA9IDU7Ci0gICAgICAgICByZXR1cm4gampNb3ZlTmZhXzAoNSwgMCk7Ci0gICAgICBjYXNlIDEzOgotICAgICAgICAgamptYXRjaGVkS2luZCA9IDQ7Ci0gICAgICAgICByZXR1cm4gampNb3ZlTmZhXzAoNSwgMCk7Ci0gICAgICBjYXNlIDMyOgotICAgICAgICAgamptYXRjaGVkS2luZCA9IDE7Ci0gICAgICAgICByZXR1cm4gampNb3ZlTmZhXzAoNSwgMCk7Ci0gICAgICBjYXNlIDM3OgotICAgICAgICAgamptYXRjaGVkS2luZCA9IDQxOwotICAgICAgICAgcmV0dXJuIGpqTW92ZU5mYV8wKDUsIDApOwotICAgICAgY2FzZSA0MDoKLSAgICAgICAgIGpqbWF0Y2hlZEtpbmQgPSAzNDsKLSAgICAgICAgIHJldHVybiBqak1vdmVOZmFfMCg1LCAwKTsKLSAgICAgIGNhc2UgNDE6Ci0gICAgICAgICBqam1hdGNoZWRLaW5kID0gMzY7Ci0gICAgICAgICByZXR1cm4gampNb3ZlTmZhXzAoNSwgMCk7Ci0gICAgICBjYXNlIDQyOgotICAgICAgICAgamptYXRjaGVkS2luZCA9IDM5OwotICAgICAgICAgcmV0dXJuIGpqTW92ZU5mYV8wKDUsIDApOwotICAgICAgY2FzZSA0MzoKLSAgICAgICAgIGpqbWF0Y2hlZEtpbmQgPSAzNzsKLSAgICAgICAgIHJldHVybiBqak1vdmVOZmFfMCg1LCAwKTsKLSAgICAgIGNhc2UgNDQ6Ci0gICAgICAgICBqam1hdGNoZWRLaW5kID0gMzU7Ci0gICAgICAgICByZXR1cm4gampNb3ZlTmZhXzAoNSwgMCk7Ci0gICAgICBjYXNlIDQ1OgotICAgICAgICAgamptYXRjaGVkS2luZCA9IDM4OwotICAgICAgICAgcmV0dXJuIGpqTW92ZU5mYV8wKDUsIDApOwotICAgICAgY2FzZSA0NzoKLSAgICAgICAgIGpqbWF0Y2hlZEtpbmQgPSA0MDsKLSAgICAgICAgIHJldHVybiBqak1vdmVOZmFfMCg1LCAwKTsKLSAgICAgIGNhc2UgNjA6Ci0gICAgICAgICBqam1hdGNoZWRLaW5kID0gMzI7Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTFfMCgweDIyMDAwMDAwMEwpOwotICAgICAgY2FzZSA2MToKLSAgICAgICAgIGpqbWF0Y2hlZEtpbmQgPSAyODsKLSAgICAgICAgIHJldHVybiBqak1vdmVOZmFfMCg1LCAwKTsKLSAgICAgIGNhc2UgNjI6Ci0gICAgICAgICBqam1hdGNoZWRLaW5kID0gMzA7Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTFfMCgweDgwMDAwMDAwTCk7Ci0gICAgICBjYXNlIDY1OgotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmExXzAoMHgyMDBMKTsKLSAgICAgIGNhc2UgNjY6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTFfMCgweDgwMEwpOwotICAgICAgY2FzZSA2OToKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMV8wKDB4MjAwMEwpOwotICAgICAgY2FzZSA3MDoKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMV8wKDB4MjAwMDBMKTsKLSAgICAgIGNhc2UgNzM6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTFfMCgweGMwMDBMKTsKLSAgICAgIGNhc2UgNzY6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTFfMCgweDEwMDBMKTsKLSAgICAgIGNhc2UgNzg6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTFfMCgweDQwMTAwTCk7Ci0gICAgICBjYXNlIDc5OgotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmExXzAoMHg0MDBMKTsKLSAgICAgIGNhc2UgODQ6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTFfMCgweDEwMDAwTCk7Ci0gICAgICBjYXNlIDg4OgotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmExXzAoMHgxODAwMDBMKTsKLSAgICAgIGNhc2UgOTc6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTFfMCgweDIwMEwpOwotICAgICAgY2FzZSA5ODoKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMV8wKDB4ODAwTCk7Ci0gICAgICBjYXNlIDEwMToKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMV8wKDB4MjAwMEwpOwotICAgICAgY2FzZSAxMDI6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTFfMCgweDIwMDAwTCk7Ci0gICAgICBjYXNlIDEwNToKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMV8wKDB4YzAwMEwpOwotICAgICAgY2FzZSAxMDg6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTFfMCgweDEwMDBMKTsKLSAgICAgIGNhc2UgMTEwOgotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmExXzAoMHg0MDEwMEwpOwotICAgICAgY2FzZSAxMTE6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTFfMCgweDQwMEwpOwotICAgICAgY2FzZSAxMTY6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTFfMCgweDEwMDAwTCk7Ci0gICAgICBjYXNlIDEyMDoKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMV8wKDB4MTgwMDAwTCk7Ci0gICAgICBkZWZhdWx0IDoKLSAgICAgICAgIHJldHVybiBqak1vdmVOZmFfMCg1LCAwKTsKLSAgIH0KLX0KLXByaXZhdGUgZmluYWwgaW50IGpqTW92ZVN0cmluZ0xpdGVyYWxEZmExXzAobG9uZyBhY3RpdmUwKQotewotICAgdHJ5IHsgY3VyQ2hhciA9IGlucHV0X3N0cmVhbS5yZWFkQ2hhcigpOyB9Ci0gICBjYXRjaChqYXZhLmlvLklPRXhjZXB0aW9uIGUpIHsKLSAgIHJldHVybiBqak1vdmVOZmFfMCg1LCAwKTsKLSAgIH0KLSAgIHN3aXRjaChjdXJDaGFyKQotICAgewotICAgICAgY2FzZSA2MToKLSAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4ODAwMDAwMDBMKSAhPSAwTCkKLSAgICAgICAgIHsKLSAgICAgICAgICAgIGpqbWF0Y2hlZEtpbmQgPSAzMTsKLSAgICAgICAgICAgIGpqbWF0Y2hlZFBvcyA9IDE7Ci0gICAgICAgICB9Ci0gICAgICAgICBlbHNlIGlmICgoYWN0aXZlMCAmIDB4MjAwMDAwMDAwTCkgIT0gMEwpCi0gICAgICAgICB7Ci0gICAgICAgICAgICBqam1hdGNoZWRLaW5kID0gMzM7Ci0gICAgICAgICAgICBqam1hdGNoZWRQb3MgPSAxOwotICAgICAgICAgfQotICAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIDYyOgotICAgICAgICAgaWYgKChhY3RpdmUwICYgMHgyMDAwMDAwMEwpICE9IDBMKQotICAgICAgICAgewotICAgICAgICAgICAgamptYXRjaGVkS2luZCA9IDI5OwotICAgICAgICAgICAgamptYXRjaGVkUG9zID0gMTsKLSAgICAgICAgIH0KLSAgICAgICAgIGJyZWFrOwotICAgICAgY2FzZSA2NToKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMl8wKGFjdGl2ZTAsIDB4MjAwMDBMKTsKLSAgICAgIGNhc2UgNjk6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTJfMChhY3RpdmUwLCAweDgwMEwpOwotICAgICAgY2FzZSA3MzoKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMl8wKGFjdGl2ZTAsIDB4MTAwMEwpOwotICAgICAgY2FzZSA3ODoKLSAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4NDAwMEwpICE9IDBMKQotICAgICAgICAgewotICAgICAgICAgICAgamptYXRjaGVkS2luZCA9IDE0OwotICAgICAgICAgICAgamptYXRjaGVkUG9zID0gMTsKLSAgICAgICAgIH0KLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMl8wKGFjdGl2ZTAsIDB4MjAwTCk7Ci0gICAgICBjYXNlIDc5OgotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmEyXzAoYWN0aXZlMCwgMHgxMDBMKTsKLSAgICAgIGNhc2UgODA6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTJfMChhY3RpdmUwLCAweDgwMDAwTCk7Ci0gICAgICBjYXNlIDgxOgotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmEyXzAoYWN0aXZlMCwgMHgxMDAwMDBMKTsKLSAgICAgIGNhc2UgODI6Ci0gICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDQwMEwpICE9IDBMKQotICAgICAgICAgewotICAgICAgICAgICAgamptYXRjaGVkS2luZCA9IDEwOwotICAgICAgICAgICAgamptYXRjaGVkUG9zID0gMTsKLSAgICAgICAgIH0KLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMl8wKGFjdGl2ZTAsIDB4MTAwMDBMKTsKLSAgICAgIGNhc2UgODM6Ci0gICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDgwMDBMKSAhPSAwTCkKLSAgICAgICAgIHsKLSAgICAgICAgICAgIGpqbWF0Y2hlZEtpbmQgPSAxNTsKLSAgICAgICAgICAgIGpqbWF0Y2hlZFBvcyA9IDE7Ci0gICAgICAgICB9Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTJfMChhY3RpdmUwLCAweDIwMDBMKTsKLSAgICAgIGNhc2UgODU6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTJfMChhY3RpdmUwLCAweDQwMDAwTCk7Ci0gICAgICBjYXNlIDk3OgotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmEyXzAoYWN0aXZlMCwgMHgyMDAwMEwpOwotICAgICAgY2FzZSAxMDE6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTJfMChhY3RpdmUwLCAweDgwMEwpOwotICAgICAgY2FzZSAxMDU6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTJfMChhY3RpdmUwLCAweDEwMDBMKTsKLSAgICAgIGNhc2UgMTEwOgotICAgICAgICAgaWYgKChhY3RpdmUwICYgMHg0MDAwTCkgIT0gMEwpCi0gICAgICAgICB7Ci0gICAgICAgICAgICBqam1hdGNoZWRLaW5kID0gMTQ7Ci0gICAgICAgICAgICBqam1hdGNoZWRQb3MgPSAxOwotICAgICAgICAgfQotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmEyXzAoYWN0aXZlMCwgMHgyMDBMKTsKLSAgICAgIGNhc2UgMTExOgotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmEyXzAoYWN0aXZlMCwgMHgxMDBMKTsKLSAgICAgIGNhc2UgMTEyOgotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmEyXzAoYWN0aXZlMCwgMHg4MDAwMEwpOwotICAgICAgY2FzZSAxMTM6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTJfMChhY3RpdmUwLCAweDEwMDAwMEwpOwotICAgICAgY2FzZSAxMTQ6Ci0gICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDQwMEwpICE9IDBMKQotICAgICAgICAgewotICAgICAgICAgICAgamptYXRjaGVkS2luZCA9IDEwOwotICAgICAgICAgICAgamptYXRjaGVkUG9zID0gMTsKLSAgICAgICAgIH0KLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMl8wKGFjdGl2ZTAsIDB4MTAwMDBMKTsKLSAgICAgIGNhc2UgMTE1OgotICAgICAgICAgaWYgKChhY3RpdmUwICYgMHg4MDAwTCkgIT0gMEwpCi0gICAgICAgICB7Ci0gICAgICAgICAgICBqam1hdGNoZWRLaW5kID0gMTU7Ci0gICAgICAgICAgICBqam1hdGNoZWRQb3MgPSAxOwotICAgICAgICAgfQotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmEyXzAoYWN0aXZlMCwgMHgyMDAwTCk7Ci0gICAgICBjYXNlIDExNzoKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMl8wKGFjdGl2ZTAsIDB4NDAwMDBMKTsKLSAgICAgIGRlZmF1bHQgOgotICAgICAgICAgYnJlYWs7Ci0gICB9Ci0gICByZXR1cm4gampNb3ZlTmZhXzAoNSwgMSk7Ci19Ci1wcml2YXRlIGZpbmFsIGludCBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMl8wKGxvbmcgb2xkMCwgbG9uZyBhY3RpdmUwKQotewotICAgaWYgKCgoYWN0aXZlMCAmPSBvbGQwKSkgPT0gMEwpCi0gICAgICByZXR1cm4gampNb3ZlTmZhXzAoNSwgMSk7Ci0gICB0cnkgeyBjdXJDaGFyID0gaW5wdXRfc3RyZWFtLnJlYWRDaGFyKCk7IH0KLSAgIGNhdGNoKGphdmEuaW8uSU9FeGNlcHRpb24gZSkgewotICAgcmV0dXJuIGpqTW92ZU5mYV8wKDUsIDEpOwotICAgfQotICAgc3dpdGNoKGN1ckNoYXIpCi0gICB7Ci0gICAgICBjYXNlIDY1OgotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmEzXzAoYWN0aXZlMCwgMHg4MDAwMEwpOwotICAgICAgY2FzZSA2NzoKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhM18wKGFjdGl2ZTAsIDB4MjAwMEwpOwotICAgICAgY2FzZSA2ODoKLSAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4MjAwTCkgIT0gMEwpCi0gICAgICAgICB7Ci0gICAgICAgICAgICBqam1hdGNoZWRLaW5kID0gOTsKLSAgICAgICAgICAgIGpqbWF0Y2hlZFBvcyA9IDI7Ci0gICAgICAgICB9Ci0gICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgNzU6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTNfMChhY3RpdmUwLCAweDEwMDBMKTsKLSAgICAgIGNhc2UgNzY6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTNfMChhY3RpdmUwLCAweDYwMDAwTCk7Ci0gICAgICBjYXNlIDg0OgotICAgICAgICAgaWYgKChhY3RpdmUwICYgMHgxMDBMKSAhPSAwTCkKLSAgICAgICAgIHsKLSAgICAgICAgICAgIGpqbWF0Y2hlZEtpbmQgPSA4OwotICAgICAgICAgICAgamptYXRjaGVkUG9zID0gMjsKLSAgICAgICAgIH0KLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhM18wKGFjdGl2ZTAsIDB4ODAwTCk7Ci0gICAgICBjYXNlIDg1OgotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmEzXzAoYWN0aXZlMCwgMHgxMTAwMDBMKTsKLSAgICAgIGNhc2UgOTc6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTNfMChhY3RpdmUwLCAweDgwMDAwTCk7Ci0gICAgICBjYXNlIDk5OgotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmEzXzAoYWN0aXZlMCwgMHgyMDAwTCk7Ci0gICAgICBjYXNlIDEwMDoKLSAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4MjAwTCkgIT0gMEwpCi0gICAgICAgICB7Ci0gICAgICAgICAgICBqam1hdGNoZWRLaW5kID0gOTsKLSAgICAgICAgICAgIGpqbWF0Y2hlZFBvcyA9IDI7Ci0gICAgICAgICB9Ci0gICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgMTA3OgotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmEzXzAoYWN0aXZlMCwgMHgxMDAwTCk7Ci0gICAgICBjYXNlIDEwODoKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhM18wKGFjdGl2ZTAsIDB4NjAwMDBMKTsKLSAgICAgIGNhc2UgMTE2OgotICAgICAgICAgaWYgKChhY3RpdmUwICYgMHgxMDBMKSAhPSAwTCkKLSAgICAgICAgIHsKLSAgICAgICAgICAgIGpqbWF0Y2hlZEtpbmQgPSA4OwotICAgICAgICAgICAgamptYXRjaGVkUG9zID0gMjsKLSAgICAgICAgIH0KLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhM18wKGFjdGl2ZTAsIDB4ODAwTCk7Ci0gICAgICBjYXNlIDExNzoKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhM18wKGFjdGl2ZTAsIDB4MTEwMDAwTCk7Ci0gICAgICBkZWZhdWx0IDoKLSAgICAgICAgIGJyZWFrOwotICAgfQotICAgcmV0dXJuIGpqTW92ZU5mYV8wKDUsIDIpOwotfQotcHJpdmF0ZSBmaW5hbCBpbnQgampNb3ZlU3RyaW5nTGl0ZXJhbERmYTNfMChsb25nIG9sZDAsIGxvbmcgYWN0aXZlMCkKLXsKLSAgIGlmICgoKGFjdGl2ZTAgJj0gb2xkMCkpID09IDBMKQotICAgICAgcmV0dXJuIGpqTW92ZU5mYV8wKDUsIDIpOwotICAgdHJ5IHsgY3VyQ2hhciA9IGlucHV0X3N0cmVhbS5yZWFkQ2hhcigpOyB9Ci0gICBjYXRjaChqYXZhLmlvLklPRXhjZXB0aW9uIGUpIHsKLSAgIHJldHVybiBqak1vdmVOZmFfMCg1LCAyKTsKLSAgIH0KLSAgIHN3aXRjaChjdXJDaGFyKQotICAgewotICAgICAgY2FzZSA2NToKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhNF8wKGFjdGl2ZTAsIDB4MjAwMEwpOwotICAgICAgY2FzZSA2OToKLSAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4MTAwMEwpICE9IDBMKQotICAgICAgICAgewotICAgICAgICAgICAgamptYXRjaGVkS2luZCA9IDEyOwotICAgICAgICAgICAgamptYXRjaGVkUG9zID0gMzsKLSAgICAgICAgIH0KLSAgICAgICAgIGVsc2UgaWYgKChhY3RpdmUwICYgMHgxMDAwMEwpICE9IDBMKQotICAgICAgICAgewotICAgICAgICAgICAgamptYXRjaGVkS2luZCA9IDE2OwotICAgICAgICAgICAgamptYXRjaGVkUG9zID0gMzsKLSAgICAgICAgIH0KLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhNF8wKGFjdGl2ZTAsIDB4MTAwMDAwTCk7Ci0gICAgICBjYXNlIDc2OgotICAgICAgICAgaWYgKChhY3RpdmUwICYgMHg0MDAwMEwpICE9IDBMKQotICAgICAgICAgewotICAgICAgICAgICAgamptYXRjaGVkS2luZCA9IDE4OwotICAgICAgICAgICAgamptYXRjaGVkUG9zID0gMzsKLSAgICAgICAgIH0KLSAgICAgICAgIGJyZWFrOwotICAgICAgY2FzZSA4MzoKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhNF8wKGFjdGl2ZTAsIDB4MjAwMDBMKTsKLSAgICAgIGNhc2UgODQ6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTRfMChhY3RpdmUwLCAweDgwMDAwTCk7Ci0gICAgICBjYXNlIDg3OgotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmE0XzAoYWN0aXZlMCwgMHg4MDBMKTsKLSAgICAgIGNhc2UgOTc6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTRfMChhY3RpdmUwLCAweDIwMDBMKTsKLSAgICAgIGNhc2UgMTAxOgotICAgICAgICAgaWYgKChhY3RpdmUwICYgMHgxMDAwTCkgIT0gMEwpCi0gICAgICAgICB7Ci0gICAgICAgICAgICBqam1hdGNoZWRLaW5kID0gMTI7Ci0gICAgICAgICAgICBqam1hdGNoZWRQb3MgPSAzOwotICAgICAgICAgfQotICAgICAgICAgZWxzZSBpZiAoKGFjdGl2ZTAgJiAweDEwMDAwTCkgIT0gMEwpCi0gICAgICAgICB7Ci0gICAgICAgICAgICBqam1hdGNoZWRLaW5kID0gMTY7Ci0gICAgICAgICAgICBqam1hdGNoZWRQb3MgPSAzOwotICAgICAgICAgfQotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmE0XzAoYWN0aXZlMCwgMHgxMDAwMDBMKTsKLSAgICAgIGNhc2UgMTA4OgotICAgICAgICAgaWYgKChhY3RpdmUwICYgMHg0MDAwMEwpICE9IDBMKQotICAgICAgICAgewotICAgICAgICAgICAgamptYXRjaGVkS2luZCA9IDE4OwotICAgICAgICAgICAgamptYXRjaGVkUG9zID0gMzsKLSAgICAgICAgIH0KLSAgICAgICAgIGJyZWFrOwotICAgICAgY2FzZSAxMTU6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTRfMChhY3RpdmUwLCAweDIwMDAwTCk7Ci0gICAgICBjYXNlIDExNjoKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhNF8wKGFjdGl2ZTAsIDB4ODAwMDBMKTsKLSAgICAgIGNhc2UgMTE5OgotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmE0XzAoYWN0aXZlMCwgMHg4MDBMKTsKLSAgICAgIGRlZmF1bHQgOgotICAgICAgICAgYnJlYWs7Ci0gICB9Ci0gICByZXR1cm4gampNb3ZlTmZhXzAoNSwgMyk7Ci19Ci1wcml2YXRlIGZpbmFsIGludCBqak1vdmVTdHJpbmdMaXRlcmFsRGZhNF8wKGxvbmcgb2xkMCwgbG9uZyBhY3RpdmUwKQotewotICAgaWYgKCgoYWN0aXZlMCAmPSBvbGQwKSkgPT0gMEwpCi0gICAgICByZXR1cm4gampNb3ZlTmZhXzAoNSwgMyk7Ci0gICB0cnkgeyBjdXJDaGFyID0gaW5wdXRfc3RyZWFtLnJlYWRDaGFyKCk7IH0KLSAgIGNhdGNoKGphdmEuaW8uSU9FeGNlcHRpb24gZSkgewotICAgcmV0dXJuIGpqTW92ZU5mYV8wKDUsIDMpOwotICAgfQotICAgc3dpdGNoKGN1ckNoYXIpCi0gICB7Ci0gICAgICBjYXNlIDY5OgotICAgICAgICAgaWYgKChhY3RpdmUwICYgMHgyMDAwMEwpICE9IDBMKQotICAgICAgICAgewotICAgICAgICAgICAgamptYXRjaGVkS2luZCA9IDE3OwotICAgICAgICAgICAgamptYXRjaGVkUG9zID0gNDsKLSAgICAgICAgIH0KLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhNV8wKGFjdGl2ZTAsIDB4ODAwTCk7Ci0gICAgICBjYXNlIDcyOgotICAgICAgICAgaWYgKChhY3RpdmUwICYgMHg4MDAwMEwpICE9IDBMKQotICAgICAgICAgewotICAgICAgICAgICAgamptYXRjaGVkS2luZCA9IDE5OwotICAgICAgICAgICAgamptYXRjaGVkUG9zID0gNDsKLSAgICAgICAgIH0KLSAgICAgICAgIGJyZWFrOwotICAgICAgY2FzZSA4MDoKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhNV8wKGFjdGl2ZTAsIDB4MjAwMEwpOwotICAgICAgY2FzZSA4MjoKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhNV8wKGFjdGl2ZTAsIDB4MTAwMDAwTCk7Ci0gICAgICBjYXNlIDEwMToKLSAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4MjAwMDBMKSAhPSAwTCkKLSAgICAgICAgIHsKLSAgICAgICAgICAgIGpqbWF0Y2hlZEtpbmQgPSAxNzsKLSAgICAgICAgICAgIGpqbWF0Y2hlZFBvcyA9IDQ7Ci0gICAgICAgICB9Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTVfMChhY3RpdmUwLCAweDgwMEwpOwotICAgICAgY2FzZSAxMDQ6Ci0gICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDgwMDAwTCkgIT0gMEwpCi0gICAgICAgICB7Ci0gICAgICAgICAgICBqam1hdGNoZWRLaW5kID0gMTk7Ci0gICAgICAgICAgICBqam1hdGNoZWRQb3MgPSA0OwotICAgICAgICAgfQotICAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIDExMjoKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhNV8wKGFjdGl2ZTAsIDB4MjAwMEwpOwotICAgICAgY2FzZSAxMTQ6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTVfMChhY3RpdmUwLCAweDEwMDAwMEwpOwotICAgICAgZGVmYXVsdCA6Ci0gICAgICAgICBicmVhazsKLSAgIH0KLSAgIHJldHVybiBqak1vdmVOZmFfMCg1LCA0KTsKLX0KLXByaXZhdGUgZmluYWwgaW50IGpqTW92ZVN0cmluZ0xpdGVyYWxEZmE1XzAobG9uZyBvbGQwLCBsb25nIGFjdGl2ZTApCi17Ci0gICBpZiAoKChhY3RpdmUwICY9IG9sZDApKSA9PSAwTCkKLSAgICAgIHJldHVybiBqak1vdmVOZmFfMCg1LCA0KTsKLSAgIHRyeSB7IGN1ckNoYXIgPSBpbnB1dF9zdHJlYW0ucmVhZENoYXIoKTsgfQotICAgY2F0Y2goamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7Ci0gICByZXR1cm4gampNb3ZlTmZhXzAoNSwgNCk7Ci0gICB9Ci0gICBzd2l0Y2goY3VyQ2hhcikKLSAgIHsKLSAgICAgIGNhc2UgNjk6Ci0gICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDIwMDBMKSAhPSAwTCkKLSAgICAgICAgIHsKLSAgICAgICAgICAgIGpqbWF0Y2hlZEtpbmQgPSAxMzsKLSAgICAgICAgICAgIGpqbWF0Y2hlZFBvcyA9IDU7Ci0gICAgICAgICB9Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTZfMChhY3RpdmUwLCAweDgwMEwpOwotICAgICAgY2FzZSA4OToKLSAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4MTAwMDAwTCkgIT0gMEwpCi0gICAgICAgICB7Ci0gICAgICAgICAgICBqam1hdGNoZWRLaW5kID0gMjA7Ci0gICAgICAgICAgICBqam1hdGNoZWRQb3MgPSA1OwotICAgICAgICAgfQotICAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIDEwMToKLSAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4MjAwMEwpICE9IDBMKQotICAgICAgICAgewotICAgICAgICAgICAgamptYXRjaGVkS2luZCA9IDEzOwotICAgICAgICAgICAgamptYXRjaGVkUG9zID0gNTsKLSAgICAgICAgIH0KLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhNl8wKGFjdGl2ZTAsIDB4ODAwTCk7Ci0gICAgICBjYXNlIDEyMToKLSAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4MTAwMDAwTCkgIT0gMEwpCi0gICAgICAgICB7Ci0gICAgICAgICAgICBqam1hdGNoZWRLaW5kID0gMjA7Ci0gICAgICAgICAgICBqam1hdGNoZWRQb3MgPSA1OwotICAgICAgICAgfQotICAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0IDoKLSAgICAgICAgIGJyZWFrOwotICAgfQotICAgcmV0dXJuIGpqTW92ZU5mYV8wKDUsIDUpOwotfQotcHJpdmF0ZSBmaW5hbCBpbnQgampNb3ZlU3RyaW5nTGl0ZXJhbERmYTZfMChsb25nIG9sZDAsIGxvbmcgYWN0aXZlMCkKLXsKLSAgIGlmICgoKGFjdGl2ZTAgJj0gb2xkMCkpID09IDBMKQotICAgICAgcmV0dXJuIGpqTW92ZU5mYV8wKDUsIDUpOwotICAgdHJ5IHsgY3VyQ2hhciA9IGlucHV0X3N0cmVhbS5yZWFkQ2hhcigpOyB9Ci0gICBjYXRjaChqYXZhLmlvLklPRXhjZXB0aW9uIGUpIHsKLSAgIHJldHVybiBqak1vdmVOZmFfMCg1LCA1KTsKLSAgIH0KLSAgIHN3aXRjaChjdXJDaGFyKQotICAgewotICAgICAgY2FzZSA3ODoKLSAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4ODAwTCkgIT0gMEwpCi0gICAgICAgICB7Ci0gICAgICAgICAgICBqam1hdGNoZWRLaW5kID0gMTE7Ci0gICAgICAgICAgICBqam1hdGNoZWRQb3MgPSA2OwotICAgICAgICAgfQotICAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIDExMDoKLSAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4ODAwTCkgIT0gMEwpCi0gICAgICAgICB7Ci0gICAgICAgICAgICBqam1hdGNoZWRLaW5kID0gMTE7Ci0gICAgICAgICAgICBqam1hdGNoZWRQb3MgPSA2OwotICAgICAgICAgfQotICAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0IDoKLSAgICAgICAgIGJyZWFrOwotICAgfQotICAgcmV0dXJuIGpqTW92ZU5mYV8wKDUsIDYpOwotfQotcHJpdmF0ZSBmaW5hbCB2b2lkIGpqQ2hlY2tOQWRkKGludCBzdGF0ZSkKLXsKLSAgIGlmIChqanJvdW5kc1tzdGF0ZV0gIT0gampyb3VuZCkKLSAgIHsKLSAgICAgIGpqc3RhdGVTZXRbampuZXdTdGF0ZUNudCsrXSA9IHN0YXRlOwotICAgICAgampyb3VuZHNbc3RhdGVdID0gampyb3VuZDsKLSAgIH0KLX0KLXByaXZhdGUgZmluYWwgdm9pZCBqakFkZFN0YXRlcyhpbnQgc3RhcnQsIGludCBlbmQpCi17Ci0gICBkbyB7Ci0gICAgICBqanN0YXRlU2V0W2pqbmV3U3RhdGVDbnQrK10gPSBqam5leHRTdGF0ZXNbc3RhcnRdOwotICAgfSB3aGlsZSAoc3RhcnQrKyAhPSBlbmQpOwotfQotcHJpdmF0ZSBmaW5hbCB2b2lkIGpqQ2hlY2tOQWRkVHdvU3RhdGVzKGludCBzdGF0ZTEsIGludCBzdGF0ZTIpCi17Ci0gICBqakNoZWNrTkFkZChzdGF0ZTEpOwotICAgampDaGVja05BZGQoc3RhdGUyKTsKLX0KLXByaXZhdGUgZmluYWwgdm9pZCBqakNoZWNrTkFkZFN0YXRlcyhpbnQgc3RhcnQsIGludCBlbmQpCi17Ci0gICBkbyB7Ci0gICAgICBqakNoZWNrTkFkZChqam5leHRTdGF0ZXNbc3RhcnRdKTsKLSAgIH0gd2hpbGUgKHN0YXJ0KysgIT0gZW5kKTsKLX0KLXByaXZhdGUgZmluYWwgdm9pZCBqakNoZWNrTkFkZFN0YXRlcyhpbnQgc3RhcnQpCi17Ci0gICBqakNoZWNrTkFkZChqam5leHRTdGF0ZXNbc3RhcnRdKTsKLSAgIGpqQ2hlY2tOQWRkKGpqbmV4dFN0YXRlc1tzdGFydCArIDFdKTsKLX0KLXN0YXRpYyBmaW5hbCBsb25nW10gampiaXRWZWMwID0gewotICAgMHhmZmZmZmZmZmZmZmZmZmZlTCwgMHhmZmZmZmZmZmZmZmZmZmZmTCwgMHhmZmZmZmZmZmZmZmZmZmZmTCwgMHhmZmZmZmZmZmZmZmZmZmZmTAotfTsKLXN0YXRpYyBmaW5hbCBsb25nW10gampiaXRWZWMyID0gewotICAgMHgwTCwgMHgwTCwgMHhmZmZmZmZmZmZmZmZmZmZmTCwgMHhmZmZmZmZmZmZmZmZmZmZmTAotfTsKLXByaXZhdGUgZmluYWwgaW50IGpqTW92ZU5mYV8wKGludCBzdGFydFN0YXRlLCBpbnQgY3VyUG9zKQotewotICAgaW50IHN0cktpbmQgPSBqam1hdGNoZWRLaW5kOwotICAgaW50IHN0clBvcyA9IGpqbWF0Y2hlZFBvczsKLSAgIGludCBzZWVuVXB0bzsKLSAgIGlucHV0X3N0cmVhbS5iYWNrdXAoc2VlblVwdG8gPSBjdXJQb3MgKyAxKTsKLSAgIHRyeSB7IGN1ckNoYXIgPSBpbnB1dF9zdHJlYW0ucmVhZENoYXIoKTsgfQotICAgY2F0Y2goamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7IHRocm93IG5ldyBFcnJvcigiSW50ZXJuYWwgRXJyb3IiKTsgfQotICAgY3VyUG9zID0gMDsKLSAgIGludFtdIG5leHRTdGF0ZXM7Ci0gICBpbnQgc3RhcnRzQXQgPSAwOwotICAgampuZXdTdGF0ZUNudCA9IDQzOwotICAgaW50IGkgPSAxOwotICAgampzdGF0ZVNldFswXSA9IHN0YXJ0U3RhdGU7Ci0gICBpbnQgaiwga2luZCA9IDB4N2ZmZmZmZmY7Ci0gICBmb3IgKDs7KQotICAgewotICAgICAgaWYgKCsrampyb3VuZCA9PSAweDdmZmZmZmZmKQotICAgICAgICAgUmVJbml0Um91bmRzKCk7Ci0gICAgICBpZiAoY3VyQ2hhciA8IDY0KQotICAgICAgewotICAgICAgICAgbG9uZyBsID0gMUwgPDwgY3VyQ2hhcjsKLSAgICAgICAgIE1hdGNoTG9vcDogZG8KLSAgICAgICAgIHsKLSAgICAgICAgICAgIHN3aXRjaChqanN0YXRlU2V0Wy0taV0pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBjYXNlIDU6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4M2ZmMDAwMDAwMDAwMDAwTCAmIGwpICE9IDBMKQotICAgICAgICAgICAgICAgICAgICAgampDaGVja05BZGRTdGF0ZXMoMCwgMyk7Ci0gICAgICAgICAgICAgICAgICBlbHNlIGlmIChjdXJDaGFyID09IDM2KQotICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgaWYgKGtpbmQgPiAyNykKLSAgICAgICAgICAgICAgICAgICAgICAgIGtpbmQgPSAyNzsKLSAgICAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkKDI3KTsKLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGN1ckNoYXIgPT0gMzkpCi0gICAgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZFN0YXRlcyg0LCA2KTsKLSAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGN1ckNoYXIgPT0gNDYpCi0gICAgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZCgxNyk7Ci0gICAgICAgICAgICAgICAgICBlbHNlIGlmIChjdXJDaGFyID09IDQ3KQotICAgICAgICAgICAgICAgICAgICAgampzdGF0ZVNldFtqam5ld1N0YXRlQ250KytdID0gNjsKLSAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGN1ckNoYXIgPT0gNDUpCi0gICAgICAgICAgICAgICAgICAgICBqanN0YXRlU2V0W2pqbmV3U3RhdGVDbnQrK10gPSAwOwotICAgICAgICAgICAgICAgICAgaWYgKCgweDNmZTAwMDAwMDAwMDAwMEwgJiBsKSAhPSAwTCkKLSAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgIGlmIChraW5kID4gMjEpCi0gICAgICAgICAgICAgICAgICAgICAgICBraW5kID0gMjE7Ci0gICAgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZFR3b1N0YXRlcygxNCwgMTUpOwotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoY3VyQ2hhciA9PSA0OCkKLSAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgIGlmIChraW5kID4gMjMpCi0gICAgICAgICAgICAgICAgICAgICAgICBraW5kID0gMjM7Ci0gICAgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZFR3b1N0YXRlcyg0MCwgNDIpOwotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDA6Ci0gICAgICAgICAgICAgICAgICBpZiAoY3VyQ2hhciA9PSA0NSkKLSAgICAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkU3RhdGVzKDcsIDkpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4ZmZmZmZmZmZmZmZmZGJmZkwgJiBsKSAhPSAwTCkKLSAgICAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkU3RhdGVzKDcsIDkpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4MjQwMEwgJiBsKSAhPSAwTCAmJiBraW5kID4gNikKLSAgICAgICAgICAgICAgICAgICAgIGtpbmQgPSA2OwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDM6Ci0gICAgICAgICAgICAgICAgICBpZiAoY3VyQ2hhciA9PSAxMCAmJiBraW5kID4gNikKLSAgICAgICAgICAgICAgICAgICAgIGtpbmQgPSA2OwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDQ6Ci0gICAgICAgICAgICAgICAgICBpZiAoY3VyQ2hhciA9PSAxMykKLSAgICAgICAgICAgICAgICAgICAgIGpqc3RhdGVTZXRbampuZXdTdGF0ZUNudCsrXSA9IDM7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgNjoKLSAgICAgICAgICAgICAgICAgIGlmIChjdXJDaGFyID09IDQyKQotICAgICAgICAgICAgICAgICAgICAgampDaGVja05BZGRUd29TdGF0ZXMoNywgOCk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgNzoKLSAgICAgICAgICAgICAgICAgIGlmICgoMHhmZmZmZmJmZmZmZmZmZmZmTCAmIGwpICE9IDBMKQotICAgICAgICAgICAgICAgICAgICAgampDaGVja05BZGRUd29TdGF0ZXMoNywgOCk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgODoKLSAgICAgICAgICAgICAgICAgIGlmIChjdXJDaGFyID09IDQyKQotICAgICAgICAgICAgICAgICAgICAgampDaGVja05BZGRTdGF0ZXMoMTAsIDEyKTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSA5OgotICAgICAgICAgICAgICAgICAgaWYgKCgweGZmZmY3YmZmZmZmZmZmZmZMICYgbCkgIT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZFR3b1N0YXRlcygxMCwgOCk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgMTA6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4ZmZmZmZiZmZmZmZmZmZmZkwgJiBsKSAhPSAwTCkKLSAgICAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkVHdvU3RhdGVzKDEwLCA4KTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSAxMToKLSAgICAgICAgICAgICAgICAgIGlmIChjdXJDaGFyID09IDQ3ICYmIGtpbmQgPiA3KQotICAgICAgICAgICAgICAgICAgICAga2luZCA9IDc7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgMTI6Ci0gICAgICAgICAgICAgICAgICBpZiAoY3VyQ2hhciA9PSA0NykKLSAgICAgICAgICAgICAgICAgICAgIGpqc3RhdGVTZXRbampuZXdTdGF0ZUNudCsrXSA9IDY7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgMTM6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4M2ZlMDAwMDAwMDAwMDAwTCAmIGwpID09IDBMKQotICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICBpZiAoa2luZCA+IDIxKQotICAgICAgICAgICAgICAgICAgICAga2luZCA9IDIxOwotICAgICAgICAgICAgICAgICAgampDaGVja05BZGRUd29TdGF0ZXMoMTQsIDE1KTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSAxNDoKLSAgICAgICAgICAgICAgICAgIGlmICgoMHgzZmYwMDAwMDAwMDAwMDBMICYgbCkgPT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgIGlmIChraW5kID4gMjEpCi0gICAgICAgICAgICAgICAgICAgICBraW5kID0gMjE7Ci0gICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZFR3b1N0YXRlcygxNCwgMTUpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDE2OgotICAgICAgICAgICAgICAgICAgaWYgKGN1ckNoYXIgPT0gNDYpCi0gICAgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZCgxNyk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgMTc6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4M2ZmMDAwMDAwMDAwMDAwTCAmIGwpID09IDBMKQotICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICBpZiAoa2luZCA+IDI0KQotICAgICAgICAgICAgICAgICAgICAga2luZCA9IDI0OwotICAgICAgICAgICAgICAgICAgampDaGVja05BZGRUd29TdGF0ZXMoMTcsIDE4KTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSAxOToKLSAgICAgICAgICAgICAgICAgIGlmICgoMHgyODAwMDAwMDAwMDBMICYgbCkgIT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZCgyMCk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgMjA6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4M2ZmMDAwMDAwMDAwMDAwTCAmIGwpID09IDBMKQotICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICBpZiAoa2luZCA+IDI0KQotICAgICAgICAgICAgICAgICAgICAga2luZCA9IDI0OwotICAgICAgICAgICAgICAgICAgampDaGVja05BZGQoMjApOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDIxOgotICAgICAgICAgICAgICAgY2FzZSAyMjoKLSAgICAgICAgICAgICAgICAgIGlmIChjdXJDaGFyID09IDM5KQotICAgICAgICAgICAgICAgICAgICAgampDaGVja05BZGRTdGF0ZXMoNCwgNik7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgMjM6Ci0gICAgICAgICAgICAgICAgICBpZiAoY3VyQ2hhciA9PSAzOSkKLSAgICAgICAgICAgICAgICAgICAgIGpqc3RhdGVTZXRbampuZXdTdGF0ZUNudCsrXSA9IDIyOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDI0OgotICAgICAgICAgICAgICAgICAgaWYgKCgweGZmZmZmZjdmZmZmZmZmZmZMICYgbCkgIT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZFN0YXRlcyg0LCA2KTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSAyNToKLSAgICAgICAgICAgICAgICAgIGlmIChjdXJDaGFyID09IDM5ICYmIGtpbmQgPiAyNikKLSAgICAgICAgICAgICAgICAgICAgIGtpbmQgPSAyNjsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSAyNjoKLSAgICAgICAgICAgICAgICAgIGlmIChjdXJDaGFyICE9IDM2KQotICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICBpZiAoa2luZCA+IDI3KQotICAgICAgICAgICAgICAgICAgICAga2luZCA9IDI3OwotICAgICAgICAgICAgICAgICAgampDaGVja05BZGQoMjcpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDI3OgotICAgICAgICAgICAgICAgICAgaWYgKCgweDNmZjAwMTAwMDAwMDAwMEwgJiBsKSA9PSAwTCkKLSAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgaWYgKGtpbmQgPiAyNykKLSAgICAgICAgICAgICAgICAgICAgIGtpbmQgPSAyNzsKLSAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkKDI3KTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSAyODoKLSAgICAgICAgICAgICAgICAgIGlmICgoMHgzZmYwMDAwMDAwMDAwMDBMICYgbCkgIT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZFN0YXRlcygwLCAzKTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSAyOToKLSAgICAgICAgICAgICAgICAgIGlmICgoMHgzZmYwMDAwMDAwMDAwMDBMICYgbCkgIT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZFR3b1N0YXRlcygyOSwgMzApOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDMwOgotICAgICAgICAgICAgICAgICAgaWYgKGN1ckNoYXIgIT0gNDYpCi0gICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgIGlmIChraW5kID4gMjQpCi0gICAgICAgICAgICAgICAgICAgICBraW5kID0gMjQ7Ci0gICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZFR3b1N0YXRlcygzMSwgMzIpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDMxOgotICAgICAgICAgICAgICAgICAgaWYgKCgweDNmZjAwMDAwMDAwMDAwMEwgJiBsKSA9PSAwTCkKLSAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgaWYgKGtpbmQgPiAyNCkKLSAgICAgICAgICAgICAgICAgICAgIGtpbmQgPSAyNDsKLSAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkVHdvU3RhdGVzKDMxLCAzMik7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgMzM6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4MjgwMDAwMDAwMDAwTCAmIGwpICE9IDBMKQotICAgICAgICAgICAgICAgICAgICAgampDaGVja05BZGQoMzQpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDM0OgotICAgICAgICAgICAgICAgICAgaWYgKCgweDNmZjAwMDAwMDAwMDAwMEwgJiBsKSA9PSAwTCkKLSAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgaWYgKGtpbmQgPiAyNCkKLSAgICAgICAgICAgICAgICAgICAgIGtpbmQgPSAyNDsKLSAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkKDM0KTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSAzNToKLSAgICAgICAgICAgICAgICAgIGlmICgoMHgzZmYwMDAwMDAwMDAwMDBMICYgbCkgIT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZFR3b1N0YXRlcygzNSwgMzYpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDM3OgotICAgICAgICAgICAgICAgICAgaWYgKCgweDI4MDAwMDAwMDAwMEwgJiBsKSAhPSAwTCkKLSAgICAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkKDM4KTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSAzODoKLSAgICAgICAgICAgICAgICAgIGlmICgoMHgzZmYwMDAwMDAwMDAwMDBMICYgbCkgPT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgIGlmIChraW5kID4gMjQpCi0gICAgICAgICAgICAgICAgICAgICBraW5kID0gMjQ7Ci0gICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZCgzOCk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgMzk6Ci0gICAgICAgICAgICAgICAgICBpZiAoY3VyQ2hhciAhPSA0OCkKLSAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgaWYgKGtpbmQgPiAyMykKLSAgICAgICAgICAgICAgICAgICAgIGtpbmQgPSAyMzsKLSAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkVHdvU3RhdGVzKDQwLCA0Mik7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgNDE6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4M2ZmMDAwMDAwMDAwMDAwTCAmIGwpID09IDBMKQotICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICBpZiAoa2luZCA+IDIyKQotICAgICAgICAgICAgICAgICAgICAga2luZCA9IDIyOwotICAgICAgICAgICAgICAgICAgampzdGF0ZVNldFtqam5ld1N0YXRlQ250KytdID0gNDE7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgNDI6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4ZmYwMDAwMDAwMDAwMDBMICYgbCkgPT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgIGlmIChraW5kID4gMjMpCi0gICAgICAgICAgICAgICAgICAgICBraW5kID0gMjM7Ci0gICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZCg0Mik7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGRlZmF1bHQgOiBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgIH0gd2hpbGUoaSAhPSBzdGFydHNBdCk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChjdXJDaGFyIDwgMTI4KQotICAgICAgewotICAgICAgICAgbG9uZyBsID0gMUwgPDwgKGN1ckNoYXIgJiAwNzcpOwotICAgICAgICAgTWF0Y2hMb29wOiBkbwotICAgICAgICAgewotICAgICAgICAgICAgc3dpdGNoKGpqc3RhdGVTZXRbLS1pXSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIGNhc2UgNToKLSAgICAgICAgICAgICAgIGNhc2UgMjc6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4N2ZmZmZmZTg3ZmZmZmZlTCAmIGwpID09IDBMKQotICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICBpZiAoa2luZCA+IDI3KQotICAgICAgICAgICAgICAgICAgICAga2luZCA9IDI3OwotICAgICAgICAgICAgICAgICAgampDaGVja05BZGQoMjcpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICAgICAgICBqakFkZFN0YXRlcyg3LCA5KTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSA3OgotICAgICAgICAgICAgICAgICAgampDaGVja05BZGRUd29TdGF0ZXMoNywgOCk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgOToKLSAgICAgICAgICAgICAgIGNhc2UgMTA6Ci0gICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZFR3b1N0YXRlcygxMCwgOCk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgMTU6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4MTAwMDAwMDAxMDAwTCAmIGwpICE9IDBMICYmIGtpbmQgPiAyMSkKLSAgICAgICAgICAgICAgICAgICAgIGtpbmQgPSAyMTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSAxODoKLSAgICAgICAgICAgICAgICAgIGlmICgoMHgyMDAwMDAwMDIwTCAmIGwpICE9IDBMKQotICAgICAgICAgICAgICAgICAgICAgampBZGRTdGF0ZXMoMTMsIDE0KTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSAyNDoKLSAgICAgICAgICAgICAgICAgIGpqQWRkU3RhdGVzKDQsIDYpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDMyOgotICAgICAgICAgICAgICAgICAgaWYgKCgweDIwMDAwMDAwMjBMICYgbCkgIT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBqakFkZFN0YXRlcygxNSwgMTYpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDM2OgotICAgICAgICAgICAgICAgICAgaWYgKCgweDIwMDAwMDAwMjBMICYgbCkgIT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBqakFkZFN0YXRlcygxNywgMTgpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDQwOgotICAgICAgICAgICAgICAgICAgaWYgKCgweDEwMDAwMDAwMTAwMDAwMEwgJiBsKSAhPSAwTCkKLSAgICAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkKDQxKTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSA0MToKLSAgICAgICAgICAgICAgICAgIGlmICgoMHg3ZTAwMDAwMDdlTCAmIGwpID09IDBMKQotICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICBpZiAoa2luZCA+IDIyKQotICAgICAgICAgICAgICAgICAgICAga2luZCA9IDIyOwotICAgICAgICAgICAgICAgICAgampDaGVja05BZGQoNDEpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBkZWZhdWx0IDogYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICB9IHdoaWxlKGkgIT0gc3RhcnRzQXQpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICAgaW50IGhpQnl0ZSA9IChpbnQpKGN1ckNoYXIgPj4gOCk7Ci0gICAgICAgICBpbnQgaTEgPSBoaUJ5dGUgPj4gNjsKLSAgICAgICAgIGxvbmcgbDEgPSAxTCA8PCAoaGlCeXRlICYgMDc3KTsKLSAgICAgICAgIGludCBpMiA9IChjdXJDaGFyICYgMHhmZikgPj4gNjsKLSAgICAgICAgIGxvbmcgbDIgPSAxTCA8PCAoY3VyQ2hhciAmIDA3Nyk7Ci0gICAgICAgICBNYXRjaExvb3A6IGRvCi0gICAgICAgICB7Ci0gICAgICAgICAgICBzd2l0Y2goampzdGF0ZVNldFstLWldKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgICAgICAgaWYgKGpqQ2FuTW92ZV8wKGhpQnl0ZSwgaTEsIGkyLCBsMSwgbDIpKQotICAgICAgICAgICAgICAgICAgICAgampBZGRTdGF0ZXMoNywgOSk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgNzoKLSAgICAgICAgICAgICAgICAgIGlmIChqakNhbk1vdmVfMChoaUJ5dGUsIGkxLCBpMiwgbDEsIGwyKSkKLSAgICAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkVHdvU3RhdGVzKDcsIDgpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDk6Ci0gICAgICAgICAgICAgICBjYXNlIDEwOgotICAgICAgICAgICAgICAgICAgaWYgKGpqQ2FuTW92ZV8wKGhpQnl0ZSwgaTEsIGkyLCBsMSwgbDIpKQotICAgICAgICAgICAgICAgICAgICAgampDaGVja05BZGRUd29TdGF0ZXMoMTAsIDgpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDI0OgotICAgICAgICAgICAgICAgICAgaWYgKGpqQ2FuTW92ZV8wKGhpQnl0ZSwgaTEsIGkyLCBsMSwgbDIpKQotICAgICAgICAgICAgICAgICAgICAgampBZGRTdGF0ZXMoNCwgNik7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGRlZmF1bHQgOiBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgIH0gd2hpbGUoaSAhPSBzdGFydHNBdCk7Ci0gICAgICB9Ci0gICAgICBpZiAoa2luZCAhPSAweDdmZmZmZmZmKQotICAgICAgewotICAgICAgICAgamptYXRjaGVkS2luZCA9IGtpbmQ7Ci0gICAgICAgICBqam1hdGNoZWRQb3MgPSBjdXJQb3M7Ci0gICAgICAgICBraW5kID0gMHg3ZmZmZmZmZjsKLSAgICAgIH0KLSAgICAgICsrY3VyUG9zOwotICAgICAgaWYgKChpID0gampuZXdTdGF0ZUNudCkgPT0gKHN0YXJ0c0F0ID0gNDMgLSAoampuZXdTdGF0ZUNudCA9IHN0YXJ0c0F0KSkpCi0gICAgICAgICBicmVhazsKLSAgICAgIHRyeSB7IGN1ckNoYXIgPSBpbnB1dF9zdHJlYW0ucmVhZENoYXIoKTsgfQotICAgICAgY2F0Y2goamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7IGJyZWFrOyB9Ci0gICB9Ci0gICBpZiAoamptYXRjaGVkUG9zID4gc3RyUG9zKQotICAgICAgcmV0dXJuIGN1clBvczsKLQotICAgaW50IHRvUmV0ID0gTWF0aC5tYXgoY3VyUG9zLCBzZWVuVXB0byk7Ci0KLSAgIGlmIChjdXJQb3MgPCB0b1JldCkKLSAgICAgIGZvciAoaSA9IHRvUmV0IC0gTWF0aC5taW4oY3VyUG9zLCBzZWVuVXB0byk7IGktLSA+IDA7ICkKLSAgICAgICAgIHRyeSB7IGN1ckNoYXIgPSBpbnB1dF9zdHJlYW0ucmVhZENoYXIoKTsgfQotICAgICAgICAgY2F0Y2goamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7IHRocm93IG5ldyBFcnJvcigiSW50ZXJuYWwgRXJyb3IgOiBQbGVhc2Ugc2VuZCBhIGJ1ZyByZXBvcnQuIik7IH0KLQotICAgaWYgKGpqbWF0Y2hlZFBvcyA8IHN0clBvcykKLSAgIHsKLSAgICAgIGpqbWF0Y2hlZEtpbmQgPSBzdHJLaW5kOwotICAgICAgamptYXRjaGVkUG9zID0gc3RyUG9zOwotICAgfQotICAgZWxzZSBpZiAoamptYXRjaGVkUG9zID09IHN0clBvcyAmJiBqam1hdGNoZWRLaW5kID4gc3RyS2luZCkKLSAgICAgIGpqbWF0Y2hlZEtpbmQgPSBzdHJLaW5kOwotCi0gICByZXR1cm4gdG9SZXQ7Ci19Ci1zdGF0aWMgZmluYWwgaW50W10gampuZXh0U3RhdGVzID0gewotICAgMjksIDMwLCAzNSwgMzYsIDIzLCAyNCwgMjUsIDEsIDIsIDQsIDgsIDksIDExLCAxOSwgMjAsIDMzLCAKLSAgIDM0LCAzNywgMzgsIAotfTsKLXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gampDYW5Nb3ZlXzAoaW50IGhpQnl0ZSwgaW50IGkxLCBpbnQgaTIsIGxvbmcgbDEsIGxvbmcgbDIpCi17Ci0gICBzd2l0Y2goaGlCeXRlKQotICAgewotICAgICAgY2FzZSAwOgotICAgICAgICAgcmV0dXJuICgoampiaXRWZWMyW2kyXSAmIGwyKSAhPSAwTCk7Ci0gICAgICBkZWZhdWx0IDogCi0gICAgICAgICBpZiAoKGpqYml0VmVjMFtpMV0gJiBsMSkgIT0gMEwpCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgIH0KLX0KLXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gampzdHJMaXRlcmFsSW1hZ2VzID0gewotIiIsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIAotbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgCi1udWxsLCAiXDc1IiwgIlw3NFw3NiIsICJcNzYiLCAiXDc2XDc1IiwgIlw3NCIsICJcNzRcNzUiLCAiXDUwIiwgIlw1NCIsICJcNTEiLCAiXDUzIiwgCi0iXDU1IiwgIlw1MiIsICJcNTciLCAiXDQ1IiwgfTsKLXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gbGV4U3RhdGVOYW1lcyA9IHsKLSAgICJERUZBVUxUIiwgCi19Owotc3RhdGljIGZpbmFsIGxvbmdbXSBqanRvVG9rZW4gPSB7Ci0gICAweDNmZmZkZmZmZjAxTCwgCi19Owotc3RhdGljIGZpbmFsIGxvbmdbXSBqanRvU2tpcCA9IHsKLSAgIDB4ZmVMLCAKLX07Ci1zdGF0aWMgZmluYWwgbG9uZ1tdIGpqdG9TcGVjaWFsID0gewotICAgMHgzZUwsIAotfTsKLXByb3RlY3RlZCBTaW1wbGVDaGFyU3RyZWFtIGlucHV0X3N0cmVhbTsKLXByaXZhdGUgZmluYWwgaW50W10gampyb3VuZHMgPSBuZXcgaW50WzQzXTsKLXByaXZhdGUgZmluYWwgaW50W10gampzdGF0ZVNldCA9IG5ldyBpbnRbODZdOwotcHJvdGVjdGVkIGNoYXIgY3VyQ2hhcjsKLXB1YmxpYyBTZWxlY3RvclBhcnNlclRva2VuTWFuYWdlcihTaW1wbGVDaGFyU3RyZWFtIHN0cmVhbSkKLXsKLSAgIGlmIChTaW1wbGVDaGFyU3RyZWFtLnN0YXRpY0ZsYWcpCi0gICAgICB0aHJvdyBuZXcgRXJyb3IoIkVSUk9SOiBDYW5ub3QgdXNlIGEgc3RhdGljIENoYXJTdHJlYW0gY2xhc3Mgd2l0aCBhIG5vbi1zdGF0aWMgbGV4aWNhbCBhbmFseXplci4iKTsKLSAgIGlucHV0X3N0cmVhbSA9IHN0cmVhbTsKLX0KLXB1YmxpYyBTZWxlY3RvclBhcnNlclRva2VuTWFuYWdlcihTaW1wbGVDaGFyU3RyZWFtIHN0cmVhbSwgaW50IGxleFN0YXRlKQotewotICAgdGhpcyhzdHJlYW0pOwotICAgU3dpdGNoVG8obGV4U3RhdGUpOwotfQotcHVibGljIHZvaWQgUmVJbml0KFNpbXBsZUNoYXJTdHJlYW0gc3RyZWFtKQotewotICAgamptYXRjaGVkUG9zID0gampuZXdTdGF0ZUNudCA9IDA7Ci0gICBjdXJMZXhTdGF0ZSA9IGRlZmF1bHRMZXhTdGF0ZTsKLSAgIGlucHV0X3N0cmVhbSA9IHN0cmVhbTsKLSAgIFJlSW5pdFJvdW5kcygpOwotfQotcHJpdmF0ZSBmaW5hbCB2b2lkIFJlSW5pdFJvdW5kcygpCi17Ci0gICBpbnQgaTsKLSAgIGpqcm91bmQgPSAweDgwMDAwMDAxOwotICAgZm9yIChpID0gNDM7IGktLSA+IDA7KQotICAgICAgampyb3VuZHNbaV0gPSAweDgwMDAwMDAwOwotfQotcHVibGljIHZvaWQgUmVJbml0KFNpbXBsZUNoYXJTdHJlYW0gc3RyZWFtLCBpbnQgbGV4U3RhdGUpCi17Ci0gICBSZUluaXQoc3RyZWFtKTsKLSAgIFN3aXRjaFRvKGxleFN0YXRlKTsKLX0KLXB1YmxpYyB2b2lkIFN3aXRjaFRvKGludCBsZXhTdGF0ZSkKLXsKLSAgIGlmIChsZXhTdGF0ZSA+PSAxIHx8IGxleFN0YXRlIDwgMCkKLSAgICAgIHRocm93IG5ldyBUb2tlbk1nckVycm9yKCJFcnJvcjogSWdub3JpbmcgaW52YWxpZCBsZXhpY2FsIHN0YXRlIDogIiArIGxleFN0YXRlICsgIi4gU3RhdGUgdW5jaGFuZ2VkLiIsIFRva2VuTWdyRXJyb3IuSU5WQUxJRF9MRVhJQ0FMX1NUQVRFKTsKLSAgIGVsc2UKLSAgICAgIGN1ckxleFN0YXRlID0gbGV4U3RhdGU7Ci19Ci0KLXByb3RlY3RlZCBUb2tlbiBqakZpbGxUb2tlbigpCi17Ci0gICBUb2tlbiB0ID0gVG9rZW4ubmV3VG9rZW4oamptYXRjaGVkS2luZCk7Ci0gICB0LmtpbmQgPSBqam1hdGNoZWRLaW5kOwotICAgU3RyaW5nIGltID0gampzdHJMaXRlcmFsSW1hZ2VzW2pqbWF0Y2hlZEtpbmRdOwotICAgdC5pbWFnZSA9IChpbSA9PSBudWxsKSA/IGlucHV0X3N0cmVhbS5HZXRJbWFnZSgpIDogaW07Ci0gICB0LmJlZ2luTGluZSA9IGlucHV0X3N0cmVhbS5nZXRCZWdpbkxpbmUoKTsKLSAgIHQuYmVnaW5Db2x1bW4gPSBpbnB1dF9zdHJlYW0uZ2V0QmVnaW5Db2x1bW4oKTsKLSAgIHQuZW5kTGluZSA9IGlucHV0X3N0cmVhbS5nZXRFbmRMaW5lKCk7Ci0gICB0LmVuZENvbHVtbiA9IGlucHV0X3N0cmVhbS5nZXRFbmRDb2x1bW4oKTsKLSAgIHJldHVybiB0OwotfQotCi1pbnQgY3VyTGV4U3RhdGUgPSAwOwotaW50IGRlZmF1bHRMZXhTdGF0ZSA9IDA7Ci1pbnQgampuZXdTdGF0ZUNudDsKLWludCBqanJvdW5kOwotaW50IGpqbWF0Y2hlZFBvczsKLWludCBqam1hdGNoZWRLaW5kOwotCi1wdWJsaWMgVG9rZW4gZ2V0TmV4dFRva2VuKCkgCi17Ci0gIGludCBraW5kOwotICBUb2tlbiBzcGVjaWFsVG9rZW4gPSBudWxsOwotICBUb2tlbiBtYXRjaGVkVG9rZW47Ci0gIGludCBjdXJQb3MgPSAwOwotCi0gIEVPRkxvb3AgOgotICBmb3IgKDs7KQotICB7ICAgCi0gICB0cnkgICAKLSAgIHsgICAgIAotICAgICAgY3VyQ2hhciA9IGlucHV0X3N0cmVhbS5CZWdpblRva2VuKCk7Ci0gICB9ICAgICAKLSAgIGNhdGNoKGphdmEuaW8uSU9FeGNlcHRpb24gZSkKLSAgIHsgICAgICAgIAotICAgICAgamptYXRjaGVkS2luZCA9IDA7Ci0gICAgICBtYXRjaGVkVG9rZW4gPSBqakZpbGxUb2tlbigpOwotICAgICAgbWF0Y2hlZFRva2VuLnNwZWNpYWxUb2tlbiA9IHNwZWNpYWxUb2tlbjsKLSAgICAgIHJldHVybiBtYXRjaGVkVG9rZW47Ci0gICB9Ci0KLSAgIGpqbWF0Y2hlZEtpbmQgPSAweDdmZmZmZmZmOwotICAgamptYXRjaGVkUG9zID0gMDsKLSAgIGN1clBvcyA9IGpqTW92ZVN0cmluZ0xpdGVyYWxEZmEwXzAoKTsKLSAgIGlmIChqam1hdGNoZWRLaW5kICE9IDB4N2ZmZmZmZmYpCi0gICB7Ci0gICAgICBpZiAoamptYXRjaGVkUG9zICsgMSA8IGN1clBvcykKLSAgICAgICAgIGlucHV0X3N0cmVhbS5iYWNrdXAoY3VyUG9zIC0gamptYXRjaGVkUG9zIC0gMSk7Ci0gICAgICBpZiAoKGpqdG9Ub2tlbltqam1hdGNoZWRLaW5kID4+IDZdICYgKDFMIDw8IChqam1hdGNoZWRLaW5kICYgMDc3KSkpICE9IDBMKQotICAgICAgewotICAgICAgICAgbWF0Y2hlZFRva2VuID0gampGaWxsVG9rZW4oKTsKLSAgICAgICAgIG1hdGNoZWRUb2tlbi5zcGVjaWFsVG9rZW4gPSBzcGVjaWFsVG9rZW47Ci0gICAgICAgICByZXR1cm4gbWF0Y2hlZFRva2VuOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICAgaWYgKChqanRvU3BlY2lhbFtqam1hdGNoZWRLaW5kID4+IDZdICYgKDFMIDw8IChqam1hdGNoZWRLaW5kICYgMDc3KSkpICE9IDBMKQotICAgICAgICAgewotICAgICAgICAgICAgbWF0Y2hlZFRva2VuID0gampGaWxsVG9rZW4oKTsKLSAgICAgICAgICAgIGlmIChzcGVjaWFsVG9rZW4gPT0gbnVsbCkKLSAgICAgICAgICAgICAgIHNwZWNpYWxUb2tlbiA9IG1hdGNoZWRUb2tlbjsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIG1hdGNoZWRUb2tlbi5zcGVjaWFsVG9rZW4gPSBzcGVjaWFsVG9rZW47Ci0gICAgICAgICAgICAgICBzcGVjaWFsVG9rZW4gPSAoc3BlY2lhbFRva2VuLm5leHQgPSBtYXRjaGVkVG9rZW4pOwotICAgICAgICAgICAgfQotICAgICAgICAgfQotICAgICAgICAgY29udGludWUgRU9GTG9vcDsKLSAgICAgIH0KLSAgIH0KLSAgIGludCBlcnJvcl9saW5lID0gaW5wdXRfc3RyZWFtLmdldEVuZExpbmUoKTsKLSAgIGludCBlcnJvcl9jb2x1bW4gPSBpbnB1dF9zdHJlYW0uZ2V0RW5kQ29sdW1uKCk7Ci0gICBTdHJpbmcgZXJyb3JfYWZ0ZXIgPSBudWxsOwotICAgYm9vbGVhbiBFT0ZTZWVuID0gZmFsc2U7Ci0gICB0cnkgeyBpbnB1dF9zdHJlYW0ucmVhZENoYXIoKTsgaW5wdXRfc3RyZWFtLmJhY2t1cCgxKTsgfQotICAgY2F0Y2ggKGphdmEuaW8uSU9FeGNlcHRpb24gZTEpIHsKLSAgICAgIEVPRlNlZW4gPSB0cnVlOwotICAgICAgZXJyb3JfYWZ0ZXIgPSBjdXJQb3MgPD0gMSA/ICIiIDogaW5wdXRfc3RyZWFtLkdldEltYWdlKCk7Ci0gICAgICBpZiAoY3VyQ2hhciA9PSAnXG4nIHx8IGN1ckNoYXIgPT0gJ1xyJykgewotICAgICAgICAgZXJyb3JfbGluZSsrOwotICAgICAgICAgZXJyb3JfY29sdW1uID0gMDsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgICAgIGVycm9yX2NvbHVtbisrOwotICAgfQotICAgaWYgKCFFT0ZTZWVuKSB7Ci0gICAgICBpbnB1dF9zdHJlYW0uYmFja3VwKDEpOwotICAgICAgZXJyb3JfYWZ0ZXIgPSBjdXJQb3MgPD0gMSA/ICIiIDogaW5wdXRfc3RyZWFtLkdldEltYWdlKCk7Ci0gICB9Ci0gICB0aHJvdyBuZXcgVG9rZW5NZ3JFcnJvcihFT0ZTZWVuLCBjdXJMZXhTdGF0ZSwgZXJyb3JfbGluZSwgZXJyb3JfY29sdW1uLCBlcnJvcl9hZnRlciwgY3VyQ2hhciwgVG9rZW5NZ3JFcnJvci5MRVhJQ0FMX0VSUk9SKTsKLSAgfQotfQotCi19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFjYy1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL3ZhbGlkYXRvci9TaW1wbGVDaGFyU3RyZWFtLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFjYy1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL3ZhbGlkYXRvci9TaW1wbGVDaGFyU3RyZWFtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwZDZhOGUuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhY2MtcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy92YWxpZGF0b3IvU2ltcGxlQ2hhclN0cmVhbS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDE5ICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qIEdlbmVyYXRlZCBCeTpKYXZhQ0M6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gU2ltcGxlQ2hhclN0cmVhbS5qYXZhIFZlcnNpb24gMy4wICovCi1wYWNrYWdlIG9yZy5hY3RpdmVtcS5zZWxlY3RvcjsKLQotLyoqCi0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiBpbnRlcmZhY2UgQ2hhclN0cmVhbSwgd2hlcmUgdGhlIHN0cmVhbSBpcyBhc3N1bWVkIHRvCi0gKiBjb250YWluIG9ubHkgQVNDSUkgY2hhcmFjdGVycyAod2l0aG91dCB1bmljb2RlIHByb2Nlc3NpbmcpLgotICovCi0KLXB1YmxpYyBjbGFzcyBTaW1wbGVDaGFyU3RyZWFtCi17Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBzdGF0aWNGbGFnID0gZmFsc2U7Ci0gIGludCBidWZzaXplOwotICBpbnQgYXZhaWxhYmxlOwotICBpbnQgdG9rZW5CZWdpbjsKLSAgcHVibGljIGludCBidWZwb3MgPSAtMTsKLSAgcHJvdGVjdGVkIGludCBidWZsaW5lW107Ci0gIHByb3RlY3RlZCBpbnQgYnVmY29sdW1uW107Ci0KLSAgcHJvdGVjdGVkIGludCBjb2x1bW4gPSAwOwotICBwcm90ZWN0ZWQgaW50IGxpbmUgPSAxOwotCi0gIHByb3RlY3RlZCBib29sZWFuIHByZXZDaGFySXNDUiA9IGZhbHNlOwotICBwcm90ZWN0ZWQgYm9vbGVhbiBwcmV2Q2hhcklzTEYgPSBmYWxzZTsKLQotICBwcm90ZWN0ZWQgamF2YS5pby5SZWFkZXIgaW5wdXRTdHJlYW07Ci0KLSAgcHJvdGVjdGVkIGNoYXJbXSBidWZmZXI7Ci0gIHByb3RlY3RlZCBpbnQgbWF4TmV4dENoYXJJbmQgPSAwOwotICBwcm90ZWN0ZWQgaW50IGluQnVmID0gMDsKLQotICBwcm90ZWN0ZWQgdm9pZCBFeHBhbmRCdWZmKGJvb2xlYW4gd3JhcEFyb3VuZCkKLSAgewotICAgICBjaGFyW10gbmV3YnVmZmVyID0gbmV3IGNoYXJbYnVmc2l6ZSArIDIwNDhdOwotICAgICBpbnQgbmV3YnVmbGluZVtdID0gbmV3IGludFtidWZzaXplICsgMjA0OF07Ci0gICAgIGludCBuZXdidWZjb2x1bW5bXSA9IG5ldyBpbnRbYnVmc2l6ZSArIDIwNDhdOwotCi0gICAgIHRyeQotICAgICB7Ci0gICAgICAgIGlmICh3cmFwQXJvdW5kKQotICAgICAgICB7Ci0gICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoYnVmZmVyLCB0b2tlbkJlZ2luLCBuZXdidWZmZXIsIDAsIGJ1ZnNpemUgLSB0b2tlbkJlZ2luKTsKLSAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShidWZmZXIsIDAsIG5ld2J1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZnNpemUgLSB0b2tlbkJlZ2luLCBidWZwb3MpOwotICAgICAgICAgICBidWZmZXIgPSBuZXdidWZmZXI7Ci0KLSAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShidWZsaW5lLCB0b2tlbkJlZ2luLCBuZXdidWZsaW5lLCAwLCBidWZzaXplIC0gdG9rZW5CZWdpbik7Ci0gICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoYnVmbGluZSwgMCwgbmV3YnVmbGluZSwgYnVmc2l6ZSAtIHRva2VuQmVnaW4sIGJ1ZnBvcyk7Ci0gICAgICAgICAgIGJ1ZmxpbmUgPSBuZXdidWZsaW5lOwotCi0gICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoYnVmY29sdW1uLCB0b2tlbkJlZ2luLCBuZXdidWZjb2x1bW4sIDAsIGJ1ZnNpemUgLSB0b2tlbkJlZ2luKTsKLSAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShidWZjb2x1bW4sIDAsIG5ld2J1ZmNvbHVtbiwgYnVmc2l6ZSAtIHRva2VuQmVnaW4sIGJ1ZnBvcyk7Ci0gICAgICAgICAgIGJ1ZmNvbHVtbiA9IG5ld2J1ZmNvbHVtbjsKLQotICAgICAgICAgICBtYXhOZXh0Q2hhckluZCA9IChidWZwb3MgKz0gKGJ1ZnNpemUgLSB0b2tlbkJlZ2luKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoYnVmZmVyLCB0b2tlbkJlZ2luLCBuZXdidWZmZXIsIDAsIGJ1ZnNpemUgLSB0b2tlbkJlZ2luKTsKLSAgICAgICAgICAgYnVmZmVyID0gbmV3YnVmZmVyOwotCi0gICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoYnVmbGluZSwgdG9rZW5CZWdpbiwgbmV3YnVmbGluZSwgMCwgYnVmc2l6ZSAtIHRva2VuQmVnaW4pOwotICAgICAgICAgICBidWZsaW5lID0gbmV3YnVmbGluZTsKLQotICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGJ1ZmNvbHVtbiwgdG9rZW5CZWdpbiwgbmV3YnVmY29sdW1uLCAwLCBidWZzaXplIC0gdG9rZW5CZWdpbik7Ci0gICAgICAgICAgIGJ1ZmNvbHVtbiA9IG5ld2J1ZmNvbHVtbjsKLQotICAgICAgICAgICBtYXhOZXh0Q2hhckluZCA9IChidWZwb3MgLT0gdG9rZW5CZWdpbik7Ci0gICAgICAgIH0KLSAgICAgfQotICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpCi0gICAgIHsKLSAgICAgICAgdGhyb3cgbmV3IEVycm9yKHQuZ2V0TWVzc2FnZSgpKTsKLSAgICAgfQotCi0KLSAgICAgYnVmc2l6ZSArPSAyMDQ4OwotICAgICBhdmFpbGFibGUgPSBidWZzaXplOwotICAgICB0b2tlbkJlZ2luID0gMDsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIEZpbGxCdWZmKCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KLSAgewotICAgICBpZiAobWF4TmV4dENoYXJJbmQgPT0gYXZhaWxhYmxlKQotICAgICB7Ci0gICAgICAgIGlmIChhdmFpbGFibGUgPT0gYnVmc2l6ZSkKLSAgICAgICAgewotICAgICAgICAgICBpZiAodG9rZW5CZWdpbiA+IDIwNDgpCi0gICAgICAgICAgIHsKLSAgICAgICAgICAgICAgYnVmcG9zID0gbWF4TmV4dENoYXJJbmQgPSAwOwotICAgICAgICAgICAgICBhdmFpbGFibGUgPSB0b2tlbkJlZ2luOwotICAgICAgICAgICB9Ci0gICAgICAgICAgIGVsc2UgaWYgKHRva2VuQmVnaW4gPCAwKQotICAgICAgICAgICAgICBidWZwb3MgPSBtYXhOZXh0Q2hhckluZCA9IDA7Ci0gICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgRXhwYW5kQnVmZihmYWxzZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoYXZhaWxhYmxlID4gdG9rZW5CZWdpbikKLSAgICAgICAgICAgYXZhaWxhYmxlID0gYnVmc2l6ZTsKLSAgICAgICAgZWxzZSBpZiAoKHRva2VuQmVnaW4gLSBhdmFpbGFibGUpIDwgMjA0OCkKLSAgICAgICAgICAgRXhwYW5kQnVmZih0cnVlKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICBhdmFpbGFibGUgPSB0b2tlbkJlZ2luOwotICAgICB9Ci0KLSAgICAgaW50IGk7Ci0gICAgIHRyeSB7Ci0gICAgICAgIGlmICgoaSA9IGlucHV0U3RyZWFtLnJlYWQoYnVmZmVyLCBtYXhOZXh0Q2hhckluZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZSAtIG1heE5leHRDaGFySW5kKSkgPT0gLTEpCi0gICAgICAgIHsKLSAgICAgICAgICAgaW5wdXRTdHJlYW0uY2xvc2UoKTsKLSAgICAgICAgICAgdGhyb3cgbmV3IGphdmEuaW8uSU9FeGNlcHRpb24oKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgICAgIG1heE5leHRDaGFySW5kICs9IGk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgfQotICAgICBjYXRjaChqYXZhLmlvLklPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgLS1idWZwb3M7Ci0gICAgICAgIGJhY2t1cCgwKTsKLSAgICAgICAgaWYgKHRva2VuQmVnaW4gPT0gLTEpCi0gICAgICAgICAgIHRva2VuQmVnaW4gPSBidWZwb3M7Ci0gICAgICAgIHRocm93IGU7Ci0gICAgIH0KLSAgfQotCi0gIHB1YmxpYyBjaGFyIEJlZ2luVG9rZW4oKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgotICB7Ci0gICAgIHRva2VuQmVnaW4gPSAtMTsKLSAgICAgY2hhciBjID0gcmVhZENoYXIoKTsKLSAgICAgdG9rZW5CZWdpbiA9IGJ1ZnBvczsKLQotICAgICByZXR1cm4gYzsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIFVwZGF0ZUxpbmVDb2x1bW4oY2hhciBjKQotICB7Ci0gICAgIGNvbHVtbisrOwotCi0gICAgIGlmIChwcmV2Q2hhcklzTEYpCi0gICAgIHsKLSAgICAgICAgcHJldkNoYXJJc0xGID0gZmFsc2U7Ci0gICAgICAgIGxpbmUgKz0gKGNvbHVtbiA9IDEpOwotICAgICB9Ci0gICAgIGVsc2UgaWYgKHByZXZDaGFySXNDUikKLSAgICAgewotICAgICAgICBwcmV2Q2hhcklzQ1IgPSBmYWxzZTsKLSAgICAgICAgaWYgKGMgPT0gJ1xuJykKLSAgICAgICAgewotICAgICAgICAgICBwcmV2Q2hhcklzTEYgPSB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgbGluZSArPSAoY29sdW1uID0gMSk7Ci0gICAgIH0KLQotICAgICBzd2l0Y2ggKGMpCi0gICAgIHsKLSAgICAgICAgY2FzZSAnXHInIDoKLSAgICAgICAgICAgcHJldkNoYXJJc0NSID0gdHJ1ZTsKLSAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgJ1xuJyA6Ci0gICAgICAgICAgIHByZXZDaGFySXNMRiA9IHRydWU7Ci0gICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlICdcdCcgOgotICAgICAgICAgICBjb2x1bW4tLTsKLSAgICAgICAgICAgY29sdW1uICs9ICg4IC0gKGNvbHVtbiAmIDA3KSk7Ci0gICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0IDoKLSAgICAgICAgICAgYnJlYWs7Ci0gICAgIH0KLQotICAgICBidWZsaW5lW2J1ZnBvc10gPSBsaW5lOwotICAgICBidWZjb2x1bW5bYnVmcG9zXSA9IGNvbHVtbjsKLSAgfQotCi0gIHB1YmxpYyBjaGFyIHJlYWRDaGFyKCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KLSAgewotICAgICBpZiAoaW5CdWYgPiAwKQotICAgICB7Ci0gICAgICAgIC0taW5CdWY7Ci0KLSAgICAgICAgaWYgKCsrYnVmcG9zID09IGJ1ZnNpemUpCi0gICAgICAgICAgIGJ1ZnBvcyA9IDA7Ci0KLSAgICAgICAgcmV0dXJuIGJ1ZmZlcltidWZwb3NdOwotICAgICB9Ci0KLSAgICAgaWYgKCsrYnVmcG9zID49IG1heE5leHRDaGFySW5kKQotICAgICAgICBGaWxsQnVmZigpOwotCi0gICAgIGNoYXIgYyA9IGJ1ZmZlcltidWZwb3NdOwotCi0gICAgIFVwZGF0ZUxpbmVDb2x1bW4oYyk7Ci0gICAgIHJldHVybiAoYyk7Ci0gIH0KLQotICAvKioKLSAgICogQGRlcHJlY2F0ZWQgCi0gICAqIEBzZWUgI2dldEVuZENvbHVtbgotICAgKi8KLQotICBwdWJsaWMgaW50IGdldENvbHVtbigpIHsKLSAgICAgcmV0dXJuIGJ1ZmNvbHVtbltidWZwb3NdOwotICB9Ci0KLSAgLyoqCi0gICAqIEBkZXByZWNhdGVkIAotICAgKiBAc2VlICNnZXRFbmRMaW5lCi0gICAqLwotCi0gIHB1YmxpYyBpbnQgZ2V0TGluZSgpIHsKLSAgICAgcmV0dXJuIGJ1ZmxpbmVbYnVmcG9zXTsKLSAgfQotCi0gIHB1YmxpYyBpbnQgZ2V0RW5kQ29sdW1uKCkgewotICAgICByZXR1cm4gYnVmY29sdW1uW2J1ZnBvc107Ci0gIH0KLQotICBwdWJsaWMgaW50IGdldEVuZExpbmUoKSB7Ci0gICAgIHJldHVybiBidWZsaW5lW2J1ZnBvc107Ci0gIH0KLQotICBwdWJsaWMgaW50IGdldEJlZ2luQ29sdW1uKCkgewotICAgICByZXR1cm4gYnVmY29sdW1uW3Rva2VuQmVnaW5dOwotICB9Ci0KLSAgcHVibGljIGludCBnZXRCZWdpbkxpbmUoKSB7Ci0gICAgIHJldHVybiBidWZsaW5lW3Rva2VuQmVnaW5dOwotICB9Ci0KLSAgcHVibGljIHZvaWQgYmFja3VwKGludCBhbW91bnQpIHsKLQotICAgIGluQnVmICs9IGFtb3VudDsKLSAgICBpZiAoKGJ1ZnBvcyAtPSBhbW91bnQpIDwgMCkKLSAgICAgICBidWZwb3MgKz0gYnVmc2l6ZTsKLSAgfQotCi0gIHB1YmxpYyBTaW1wbGVDaGFyU3RyZWFtKGphdmEuaW8uUmVhZGVyIGRzdHJlYW0sIGludCBzdGFydGxpbmUsCi0gIGludCBzdGFydGNvbHVtbiwgaW50IGJ1ZmZlcnNpemUpCi0gIHsKLSAgICBpbnB1dFN0cmVhbSA9IGRzdHJlYW07Ci0gICAgbGluZSA9IHN0YXJ0bGluZTsKLSAgICBjb2x1bW4gPSBzdGFydGNvbHVtbiAtIDE7Ci0KLSAgICBhdmFpbGFibGUgPSBidWZzaXplID0gYnVmZmVyc2l6ZTsKLSAgICBidWZmZXIgPSBuZXcgY2hhcltidWZmZXJzaXplXTsKLSAgICBidWZsaW5lID0gbmV3IGludFtidWZmZXJzaXplXTsKLSAgICBidWZjb2x1bW4gPSBuZXcgaW50W2J1ZmZlcnNpemVdOwotICB9Ci0KLSAgcHVibGljIFNpbXBsZUNoYXJTdHJlYW0oamF2YS5pby5SZWFkZXIgZHN0cmVhbSwgaW50IHN0YXJ0bGluZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0Y29sdW1uKQotICB7Ci0gICAgIHRoaXMoZHN0cmVhbSwgc3RhcnRsaW5lLCBzdGFydGNvbHVtbiwgNDA5Nik7Ci0gIH0KLQotICBwdWJsaWMgU2ltcGxlQ2hhclN0cmVhbShqYXZhLmlvLlJlYWRlciBkc3RyZWFtKQotICB7Ci0gICAgIHRoaXMoZHN0cmVhbSwgMSwgMSwgNDA5Nik7Ci0gIH0KLSAgcHVibGljIHZvaWQgUmVJbml0KGphdmEuaW8uUmVhZGVyIGRzdHJlYW0sIGludCBzdGFydGxpbmUsCi0gIGludCBzdGFydGNvbHVtbiwgaW50IGJ1ZmZlcnNpemUpCi0gIHsKLSAgICBpbnB1dFN0cmVhbSA9IGRzdHJlYW07Ci0gICAgbGluZSA9IHN0YXJ0bGluZTsKLSAgICBjb2x1bW4gPSBzdGFydGNvbHVtbiAtIDE7Ci0KLSAgICBpZiAoYnVmZmVyID09IG51bGwgfHwgYnVmZmVyc2l6ZSAhPSBidWZmZXIubGVuZ3RoKQotICAgIHsKLSAgICAgIGF2YWlsYWJsZSA9IGJ1ZnNpemUgPSBidWZmZXJzaXplOwotICAgICAgYnVmZmVyID0gbmV3IGNoYXJbYnVmZmVyc2l6ZV07Ci0gICAgICBidWZsaW5lID0gbmV3IGludFtidWZmZXJzaXplXTsKLSAgICAgIGJ1ZmNvbHVtbiA9IG5ldyBpbnRbYnVmZmVyc2l6ZV07Ci0gICAgfQotICAgIHByZXZDaGFySXNMRiA9IHByZXZDaGFySXNDUiA9IGZhbHNlOwotICAgIHRva2VuQmVnaW4gPSBpbkJ1ZiA9IG1heE5leHRDaGFySW5kID0gMDsKLSAgICBidWZwb3MgPSAtMTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIFJlSW5pdChqYXZhLmlvLlJlYWRlciBkc3RyZWFtLCBpbnQgc3RhcnRsaW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnRjb2x1bW4pCi0gIHsKLSAgICAgUmVJbml0KGRzdHJlYW0sIHN0YXJ0bGluZSwgc3RhcnRjb2x1bW4sIDQwOTYpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgUmVJbml0KGphdmEuaW8uUmVhZGVyIGRzdHJlYW0pCi0gIHsKLSAgICAgUmVJbml0KGRzdHJlYW0sIDEsIDEsIDQwOTYpOwotICB9Ci0gIHB1YmxpYyBTaW1wbGVDaGFyU3RyZWFtKGphdmEuaW8uSW5wdXRTdHJlYW0gZHN0cmVhbSwgaW50IHN0YXJ0bGluZSwKLSAgaW50IHN0YXJ0Y29sdW1uLCBpbnQgYnVmZmVyc2l6ZSkKLSAgewotICAgICB0aGlzKG5ldyBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyKGRzdHJlYW0pLCBzdGFydGxpbmUsIHN0YXJ0Y29sdW1uLCA0MDk2KTsKLSAgfQotCi0gIHB1YmxpYyBTaW1wbGVDaGFyU3RyZWFtKGphdmEuaW8uSW5wdXRTdHJlYW0gZHN0cmVhbSwgaW50IHN0YXJ0bGluZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0Y29sdW1uKQotICB7Ci0gICAgIHRoaXMoZHN0cmVhbSwgc3RhcnRsaW5lLCBzdGFydGNvbHVtbiwgNDA5Nik7Ci0gIH0KLQotICBwdWJsaWMgU2ltcGxlQ2hhclN0cmVhbShqYXZhLmlvLklucHV0U3RyZWFtIGRzdHJlYW0pCi0gIHsKLSAgICAgdGhpcyhkc3RyZWFtLCAxLCAxLCA0MDk2KTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIFJlSW5pdChqYXZhLmlvLklucHV0U3RyZWFtIGRzdHJlYW0sIGludCBzdGFydGxpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydGNvbHVtbiwgaW50IGJ1ZmZlcnNpemUpCi0gIHsKLSAgICAgUmVJbml0KG5ldyBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyKGRzdHJlYW0pLCBzdGFydGxpbmUsIHN0YXJ0Y29sdW1uLCA0MDk2KTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIFJlSW5pdChqYXZhLmlvLklucHV0U3RyZWFtIGRzdHJlYW0pCi0gIHsKLSAgICAgUmVJbml0KGRzdHJlYW0sIDEsIDEsIDQwOTYpOwotICB9Ci0gIHB1YmxpYyB2b2lkIFJlSW5pdChqYXZhLmlvLklucHV0U3RyZWFtIGRzdHJlYW0sIGludCBzdGFydGxpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydGNvbHVtbikKLSAgewotICAgICBSZUluaXQoZHN0cmVhbSwgc3RhcnRsaW5lLCBzdGFydGNvbHVtbiwgNDA5Nik7Ci0gIH0KLSAgcHVibGljIFN0cmluZyBHZXRJbWFnZSgpCi0gIHsKLSAgICAgaWYgKGJ1ZnBvcyA+PSB0b2tlbkJlZ2luKQotICAgICAgICByZXR1cm4gbmV3IFN0cmluZyhidWZmZXIsIHRva2VuQmVnaW4sIGJ1ZnBvcyAtIHRva2VuQmVnaW4gKyAxKTsKLSAgICAgZWxzZQotICAgICAgICByZXR1cm4gbmV3IFN0cmluZyhidWZmZXIsIHRva2VuQmVnaW4sIGJ1ZnNpemUgLSB0b2tlbkJlZ2luKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nKGJ1ZmZlciwgMCwgYnVmcG9zICsgMSk7Ci0gIH0KLQotICBwdWJsaWMgY2hhcltdIEdldFN1ZmZpeChpbnQgbGVuKQotICB7Ci0gICAgIGNoYXJbXSByZXQgPSBuZXcgY2hhcltsZW5dOwotCi0gICAgIGlmICgoYnVmcG9zICsgMSkgPj0gbGVuKQotICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGJ1ZmZlciwgYnVmcG9zIC0gbGVuICsgMSwgcmV0LCAwLCBsZW4pOwotICAgICBlbHNlCi0gICAgIHsKLSAgICAgICAgU3lzdGVtLmFycmF5Y29weShidWZmZXIsIGJ1ZnNpemUgLSAobGVuIC0gYnVmcG9zIC0gMSksIHJldCwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4gLSBidWZwb3MgLSAxKTsKLSAgICAgICAgU3lzdGVtLmFycmF5Y29weShidWZmZXIsIDAsIHJldCwgbGVuIC0gYnVmcG9zIC0gMSwgYnVmcG9zICsgMSk7Ci0gICAgIH0KLQotICAgICByZXR1cm4gcmV0OwotICB9Ci0KLSAgcHVibGljIHZvaWQgRG9uZSgpCi0gIHsKLSAgICAgYnVmZmVyID0gbnVsbDsKLSAgICAgYnVmbGluZSA9IG51bGw7Ci0gICAgIGJ1ZmNvbHVtbiA9IG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogTWV0aG9kIHRvIGFkanVzdCBsaW5lIGFuZCBjb2x1bW4gbnVtYmVycyBmb3IgdGhlIHN0YXJ0IG9mIGEgdG9rZW4uCi0gICAqLwotICBwdWJsaWMgdm9pZCBhZGp1c3RCZWdpbkxpbmVDb2x1bW4oaW50IG5ld0xpbmUsIGludCBuZXdDb2wpCi0gIHsKLSAgICAgaW50IHN0YXJ0ID0gdG9rZW5CZWdpbjsKLSAgICAgaW50IGxlbjsKLQotICAgICBpZiAoYnVmcG9zID49IHRva2VuQmVnaW4pCi0gICAgIHsKLSAgICAgICAgbGVuID0gYnVmcG9zIC0gdG9rZW5CZWdpbiArIGluQnVmICsgMTsKLSAgICAgfQotICAgICBlbHNlCi0gICAgIHsKLSAgICAgICAgbGVuID0gYnVmc2l6ZSAtIHRva2VuQmVnaW4gKyBidWZwb3MgKyAxICsgaW5CdWY7Ci0gICAgIH0KLQotICAgICBpbnQgaSA9IDAsIGogPSAwLCBrID0gMDsKLSAgICAgaW50IG5leHRDb2xEaWZmID0gMCwgY29sdW1uRGlmZiA9IDA7Ci0KLSAgICAgd2hpbGUgKGkgPCBsZW4gJiYKLSAgICAgICAgICAgIGJ1ZmxpbmVbaiA9IHN0YXJ0ICUgYnVmc2l6ZV0gPT0gYnVmbGluZVtrID0gKytzdGFydCAlIGJ1ZnNpemVdKQotICAgICB7Ci0gICAgICAgIGJ1ZmxpbmVbal0gPSBuZXdMaW5lOwotICAgICAgICBuZXh0Q29sRGlmZiA9IGNvbHVtbkRpZmYgKyBidWZjb2x1bW5ba10gLSBidWZjb2x1bW5bal07Ci0gICAgICAgIGJ1ZmNvbHVtbltqXSA9IG5ld0NvbCArIGNvbHVtbkRpZmY7Ci0gICAgICAgIGNvbHVtbkRpZmYgPSBuZXh0Q29sRGlmZjsKLSAgICAgICAgaSsrOwotICAgICB9IAotCi0gICAgIGlmIChpIDwgbGVuKQotICAgICB7Ci0gICAgICAgIGJ1ZmxpbmVbal0gPSBuZXdMaW5lKys7Ci0gICAgICAgIGJ1ZmNvbHVtbltqXSA9IG5ld0NvbCArIGNvbHVtbkRpZmY7Ci0KLSAgICAgICAgd2hpbGUgKGkrKyA8IGxlbikKLSAgICAgICAgewotICAgICAgICAgICBpZiAoYnVmbGluZVtqID0gc3RhcnQgJSBidWZzaXplXSAhPSBidWZsaW5lWysrc3RhcnQgJSBidWZzaXplXSkKLSAgICAgICAgICAgICAgYnVmbGluZVtqXSA9IG5ld0xpbmUrKzsKLSAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICBidWZsaW5lW2pdID0gbmV3TGluZTsKLSAgICAgICAgfQotICAgICB9Ci0KLSAgICAgbGluZSA9IGJ1ZmxpbmVbal07Ci0gICAgIGNvbHVtbiA9IGJ1ZmNvbHVtbltqXTsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFjYy1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL3ZhbGlkYXRvci9Ub2tlbi5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhY2MtcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy92YWxpZGF0b3IvVG9rZW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2FkNGVmZC4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFjYy1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL3ZhbGlkYXRvci9Ub2tlbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyogR2VuZXJhdGVkIEJ5OkphdmFDQzogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBUb2tlbi5qYXZhIFZlcnNpb24gMy4wICovCi1wYWNrYWdlIG9yZy5hY3RpdmVtcS5zZWxlY3RvcjsKLQotLyoqCi0gKiBEZXNjcmliZXMgdGhlIGlucHV0IHRva2VuIHN0cmVhbS4KLSAqLwotCi1wdWJsaWMgY2xhc3MgVG9rZW4gewotCi0gIC8qKgotICAgKiBBbiBpbnRlZ2VyIHRoYXQgZGVzY3JpYmVzIHRoZSBraW5kIG9mIHRoaXMgdG9rZW4uICBUaGlzIG51bWJlcmluZwotICAgKiBzeXN0ZW0gaXMgZGV0ZXJtaW5lZCBieSBKYXZhQ0NQYXJzZXIsIGFuZCBhIHRhYmxlIG9mIHRoZXNlIG51bWJlcnMgaXMKLSAgICogc3RvcmVkIGluIHRoZSBmaWxlIC4uLkNvbnN0YW50cy5qYXZhLgotICAgKi8KLSAgcHVibGljIGludCBraW5kOwotCi0gIC8qKgotICAgKiBiZWdpbkxpbmUgYW5kIGJlZ2luQ29sdW1uIGRlc2NyaWJlIHRoZSBwb3NpdGlvbiBvZiB0aGUgZmlyc3QgY2hhcmFjdGVyCi0gICAqIG9mIHRoaXMgdG9rZW47IGVuZExpbmUgYW5kIGVuZENvbHVtbiBkZXNjcmliZSB0aGUgcG9zaXRpb24gb2YgdGhlCi0gICAqIGxhc3QgY2hhcmFjdGVyIG9mIHRoaXMgdG9rZW4uCi0gICAqLwotICBwdWJsaWMgaW50IGJlZ2luTGluZSwgYmVnaW5Db2x1bW4sIGVuZExpbmUsIGVuZENvbHVtbjsKLQotICAvKioKLSAgICogVGhlIHN0cmluZyBpbWFnZSBvZiB0aGUgdG9rZW4uCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGltYWdlOwotCi0gIC8qKgotICAgKiBBIHJlZmVyZW5jZSB0byB0aGUgbmV4dCByZWd1bGFyIChub24tc3BlY2lhbCkgdG9rZW4gZnJvbSB0aGUgaW5wdXQKLSAgICogc3RyZWFtLiAgSWYgdGhpcyBpcyB0aGUgbGFzdCB0b2tlbiBmcm9tIHRoZSBpbnB1dCBzdHJlYW0sIG9yIGlmIHRoZQotICAgKiB0b2tlbiBtYW5hZ2VyIGhhcyBub3QgcmVhZCB0b2tlbnMgYmV5b25kIHRoaXMgb25lLCB0aGlzIGZpZWxkIGlzCi0gICAqIHNldCB0byBudWxsLiAgVGhpcyBpcyB0cnVlIG9ubHkgaWYgdGhpcyB0b2tlbiBpcyBhbHNvIGEgcmVndWxhcgotICAgKiB0b2tlbi4gIE90aGVyd2lzZSwgc2VlIGJlbG93IGZvciBhIGRlc2NyaXB0aW9uIG9mIHRoZSBjb250ZW50cyBvZgotICAgKiB0aGlzIGZpZWxkLgotICAgKi8KLSAgcHVibGljIFRva2VuIG5leHQ7Ci0KLSAgLyoqCi0gICAqIFRoaXMgZmllbGQgaXMgdXNlZCB0byBhY2Nlc3Mgc3BlY2lhbCB0b2tlbnMgdGhhdCBvY2N1ciBwcmlvciB0byB0aGlzCi0gICAqIHRva2VuLCBidXQgYWZ0ZXIgdGhlIGltbWVkaWF0ZWx5IHByZWNlZGluZyByZWd1bGFyIChub24tc3BlY2lhbCkgdG9rZW4uCi0gICAqIElmIHRoZXJlIGFyZSBubyBzdWNoIHNwZWNpYWwgdG9rZW5zLCB0aGlzIGZpZWxkIGlzIHNldCB0byBudWxsLgotICAgKiBXaGVuIHRoZXJlIGFyZSBtb3JlIHRoYW4gb25lIHN1Y2ggc3BlY2lhbCB0b2tlbiwgdGhpcyBmaWVsZCByZWZlcnMKLSAgICogdG8gdGhlIGxhc3Qgb2YgdGhlc2Ugc3BlY2lhbCB0b2tlbnMsIHdoaWNoIGluIHR1cm4gcmVmZXJzIHRvIHRoZSBuZXh0Ci0gICAqIHByZXZpb3VzIHNwZWNpYWwgdG9rZW4gdGhyb3VnaCBpdHMgc3BlY2lhbFRva2VuIGZpZWxkLCBhbmQgc28gb24KLSAgICogdW50aWwgdGhlIGZpcnN0IHNwZWNpYWwgdG9rZW4gKHdob3NlIHNwZWNpYWxUb2tlbiBmaWVsZCBpcyBudWxsKS4KLSAgICogVGhlIG5leHQgZmllbGRzIG9mIHNwZWNpYWwgdG9rZW5zIHJlZmVyIHRvIG90aGVyIHNwZWNpYWwgdG9rZW5zIHRoYXQKLSAgICogaW1tZWRpYXRlbHkgZm9sbG93IGl0ICh3aXRob3V0IGFuIGludGVydmVuaW5nIHJlZ3VsYXIgdG9rZW4pLiAgSWYgdGhlcmUKLSAgICogaXMgbm8gc3VjaCB0b2tlbiwgdGhpcyBmaWVsZCBpcyBudWxsLgotICAgKi8KLSAgcHVibGljIFRva2VuIHNwZWNpYWxUb2tlbjsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgaW1hZ2UuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLSAgewotICAgICByZXR1cm4gaW1hZ2U7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyBhIG5ldyBUb2tlbiBvYmplY3QsIGJ5IGRlZmF1bHQuIEhvd2V2ZXIsIGlmIHlvdSB3YW50LCB5b3UKLSAgICogY2FuIGNyZWF0ZSBhbmQgcmV0dXJuIHN1YmNsYXNzIG9iamVjdHMgYmFzZWQgb24gdGhlIHZhbHVlIG9mIG9mS2luZC4KLSAgICogU2ltcGx5IGFkZCB0aGUgY2FzZXMgdG8gdGhlIHN3aXRjaCBmb3IgYWxsIHRob3NlIHNwZWNpYWwgY2FzZXMuCi0gICAqIEZvciBleGFtcGxlLCBpZiB5b3UgaGF2ZSBhIHN1YmNsYXNzIG9mIFRva2VuIGNhbGxlZCBJRFRva2VuIHRoYXQKLSAgICogeW91IHdhbnQgdG8gY3JlYXRlIGlmIG9mS2luZCBpcyBJRCwgc2ltbHB5IGFkZCBzb21ldGhpbmcgbGlrZSA6Ci0gICAqCi0gICAqICAgIGNhc2UgTXlQYXJzZXJDb25zdGFudHMuSUQgOiByZXR1cm4gbmV3IElEVG9rZW4oKTsKLSAgICoKLSAgICogdG8gdGhlIGZvbGxvd2luZyBzd2l0Y2ggc3RhdGVtZW50LiBUaGVuIHlvdSBjYW4gY2FzdCBtYXRjaGVkVG9rZW4KLSAgICogdmFyaWFibGUgdG8gdGhlIGFwcHJvcHJpYXRlIHR5cGUgYW5kIHVzZSBpdCBpbiB5b3VyIGxleGljYWwgYWN0aW9ucy4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgVG9rZW4gbmV3VG9rZW4oaW50IG9mS2luZCkKLSAgewotICAgICBzd2l0Y2gob2ZLaW5kKQotICAgICB7Ci0gICAgICAgZGVmYXVsdCA6IHJldHVybiBuZXcgVG9rZW4oKTsKLSAgICAgfQotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YWNjLXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvdmFsaWRhdG9yL1Rva2VuTWdyRXJyb3IuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YWNjLXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvdmFsaWRhdG9yL1Rva2VuTWdyRXJyb3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjhiNzQ1NS4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFjYy1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL3ZhbGlkYXRvci9Ub2tlbk1nckVycm9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTEgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyogR2VuZXJhdGVkIEJ5OkphdmFDQzogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBUb2tlbk1nckVycm9yLmphdmEgVmVyc2lvbiAzLjAgKi8KLXBhY2thZ2Ugb3JnLmFjdGl2ZW1xLnNlbGVjdG9yOwotCi1wdWJsaWMgY2xhc3MgVG9rZW5NZ3JFcnJvciBleHRlbmRzIEVycm9yCi17Ci0gICAvKgotICAgICogT3JkaW5hbHMgZm9yIHZhcmlvdXMgcmVhc29ucyB3aHkgYW4gRXJyb3Igb2YgdGhpcyB0eXBlIGNhbiBiZSB0aHJvd24uCi0gICAgKi8KLQotICAgLyoqCi0gICAgKiBMZXhpY2FsIGVycm9yIG9jY3VyZWQuCi0gICAgKi8KLSAgIHN0YXRpYyBmaW5hbCBpbnQgTEVYSUNBTF9FUlJPUiA9IDA7Ci0KLSAgIC8qKgotICAgICogQW4gYXR0ZW1wdCB3YXNzIG1hZGUgdG8gY3JlYXRlIGEgc2Vjb25kIGluc3RhbmNlIG9mIGEgc3RhdGljIHRva2VuIG1hbmFnZXIuCi0gICAgKi8KLSAgIHN0YXRpYyBmaW5hbCBpbnQgU1RBVElDX0xFWEVSX0VSUk9SID0gMTsKLQotICAgLyoqCi0gICAgKiBUcmllZCB0byBjaGFuZ2UgdG8gYW4gaW52YWxpZCBsZXhpY2FsIHN0YXRlLgotICAgICovCi0gICBzdGF0aWMgZmluYWwgaW50IElOVkFMSURfTEVYSUNBTF9TVEFURSA9IDI7Ci0KLSAgIC8qKgotICAgICogRGV0ZWN0ZWQgKGFuZCBiYWlsZWQgb3V0IG9mKSBhbiBpbmZpbml0ZSBsb29wIGluIHRoZSB0b2tlbiBtYW5hZ2VyLgotICAgICovCi0gICBzdGF0aWMgZmluYWwgaW50IExPT1BfREVURUNURUQgPSAzOwotCi0gICAvKioKLSAgICAqIEluZGljYXRlcyB0aGUgcmVhc29uIHdoeSB0aGUgZXhjZXB0aW9uIGlzIHRocm93bi4gSXQgd2lsbCBoYXZlCi0gICAgKiBvbmUgb2YgdGhlIGFib3ZlIDQgdmFsdWVzLgotICAgICovCi0gICBpbnQgZXJyb3JDb2RlOwotCi0gICAvKioKLSAgICAqIFJlcGxhY2VzIHVucHJpbnRhYmxlIGNoYXJhY3RlcnMgYnkgdGhlaXIgZXNwYWNlZCAob3IgdW5pY29kZSBlc2NhcGVkKQotICAgICogZXF1aXZhbGVudHMgaW4gdGhlIGdpdmVuIHN0cmluZwotICAgICovCi0gICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBhZGRFc2NhcGVzKFN0cmluZyBzdHIpIHsKLSAgICAgIFN0cmluZ0J1ZmZlciByZXR2YWwgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICBjaGFyIGNoOwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzdHIubGVuZ3RoKCk7IGkrKykgewotICAgICAgICBzd2l0Y2ggKHN0ci5jaGFyQXQoaSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgY2FzZSAwIDoKLSAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgIGNhc2UgJ1xiJzoKLSAgICAgICAgICAgICAgcmV0dmFsLmFwcGVuZCgiXFxiIik7Ci0gICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICBjYXNlICdcdCc6Ci0gICAgICAgICAgICAgIHJldHZhbC5hcHBlbmQoIlxcdCIpOwotICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgY2FzZSAnXG4nOgotICAgICAgICAgICAgICByZXR2YWwuYXBwZW5kKCJcXG4iKTsKLSAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgIGNhc2UgJ1xmJzoKLSAgICAgICAgICAgICAgcmV0dmFsLmFwcGVuZCgiXFxmIik7Ci0gICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICBjYXNlICdccic6Ci0gICAgICAgICAgICAgIHJldHZhbC5hcHBlbmQoIlxcciIpOwotICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgY2FzZSAnXCInOgotICAgICAgICAgICAgICByZXR2YWwuYXBwZW5kKCJcXFwiIik7Ci0gICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICBjYXNlICdcJyc6Ci0gICAgICAgICAgICAgIHJldHZhbC5hcHBlbmQoIlxcXCciKTsKLSAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgIGNhc2UgJ1xcJzoKLSAgICAgICAgICAgICAgcmV0dmFsLmFwcGVuZCgiXFxcXCIpOwotICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgaWYgKChjaCA9IHN0ci5jaGFyQXQoaSkpIDwgMHgyMCB8fCBjaCA+IDB4N2UpIHsKLSAgICAgICAgICAgICAgICAgU3RyaW5nIHMgPSAiMDAwMCIgKyBJbnRlZ2VyLnRvU3RyaW5nKGNoLCAxNik7Ci0gICAgICAgICAgICAgICAgIHJldHZhbC5hcHBlbmQoIlxcdSIgKyBzLnN1YnN0cmluZyhzLmxlbmd0aCgpIC0gNCwgcy5sZW5ndGgoKSkpOwotICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICByZXR2YWwuYXBwZW5kKGNoKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgcmV0dXJuIHJldHZhbC50b1N0cmluZygpOwotICAgfQotCi0gICAvKioKLSAgICAqIFJldHVybnMgYSBkZXRhaWxlZCBtZXNzYWdlIGZvciB0aGUgRXJyb3Igd2hlbiBpdCBpcyB0aHJvd24gYnkgdGhlCi0gICAgKiB0b2tlbiBtYW5hZ2VyIHRvIGluZGljYXRlIGEgbGV4aWNhbCBlcnJvci4KLSAgICAqIFBhcmFtZXRlcnMgOiAKLSAgICAqICAgIEVPRlNlZW4gICAgIDogaW5kaWNhdGVzIGlmIEVPRiBjYXVzZWQgdGhlIGxleGljbCBlcnJvcgotICAgICogICAgY3VyTGV4U3RhdGUgOiBsZXhpY2FsIHN0YXRlIGluIHdoaWNoIHRoaXMgZXJyb3Igb2NjdXJlZAotICAgICogICAgZXJyb3JMaW5lICAgOiBsaW5lIG51bWJlciB3aGVuIHRoZSBlcnJvciBvY2N1cmVkCi0gICAgKiAgICBlcnJvckNvbHVtbiA6IGNvbHVtbiBudW1iZXIgd2hlbiB0aGUgZXJyb3Igb2NjdXJlZAotICAgICogICAgZXJyb3JBZnRlciAgOiBwcmVmaXggdGhhdCB3YXMgc2VlbiBiZWZvcmUgdGhpcyBlcnJvciBvY2N1cmVkCi0gICAgKiAgICBjdXJjaGFyICAgICA6IHRoZSBvZmZlbmRpbmcgY2hhcmFjdGVyCi0gICAgKiBOb3RlOiBZb3UgY2FuIGN1c3RvbWl6ZSB0aGUgbGV4aWNhbCBlcnJvciBtZXNzYWdlIGJ5IG1vZGlmeWluZyB0aGlzIG1ldGhvZC4KLSAgICAqLwotICAgcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgTGV4aWNhbEVycm9yKGJvb2xlYW4gRU9GU2VlbiwgaW50IGxleFN0YXRlLCBpbnQgZXJyb3JMaW5lLCBpbnQgZXJyb3JDb2x1bW4sIFN0cmluZyBlcnJvckFmdGVyLCBjaGFyIGN1ckNoYXIpIHsKLSAgICAgIHJldHVybigiTGV4aWNhbCBlcnJvciBhdCBsaW5lICIgKwotICAgICAgICAgICBlcnJvckxpbmUgKyAiLCBjb2x1bW4gIiArCi0gICAgICAgICAgIGVycm9yQ29sdW1uICsgIi4gIEVuY291bnRlcmVkOiAiICsKLSAgICAgICAgICAgKEVPRlNlZW4gPyAiPEVPRj4gIiA6ICgiXCIiICsgYWRkRXNjYXBlcyhTdHJpbmcudmFsdWVPZihjdXJDaGFyKSkgKyAiXCIiKSArICIgKCIgKyAoaW50KWN1ckNoYXIgKyAiKSwgIikgKwotICAgICAgICAgICAiYWZ0ZXIgOiBcIiIgKyBhZGRFc2NhcGVzKGVycm9yQWZ0ZXIpICsgIlwiIik7Ci0gICB9Ci0KLSAgIC8qKgotICAgICogWW91IGNhbiBhbHNvIG1vZGlmeSB0aGUgYm9keSBvZiB0aGlzIG1ldGhvZCB0byBjdXN0b21pemUgeW91ciBlcnJvciBtZXNzYWdlcy4KLSAgICAqIEZvciBleGFtcGxlLCBjYXNlcyBsaWtlIExPT1BfREVURUNURUQgYW5kIElOVkFMSURfTEVYSUNBTF9TVEFURSBhcmUgbm90Ci0gICAgKiBvZiBlbmQtdXNlcnMgY29uY2Vybiwgc28geW91IGNhbiByZXR1cm4gc29tZXRoaW5nIGxpa2UgOiAKLSAgICAqCi0gICAgKiAgICAgIkludGVybmFsIEVycm9yIDogUGxlYXNlIGZpbGUgYSBidWcgcmVwb3J0IC4uLi4gIgotICAgICoKLSAgICAqIGZyb20gdGhpcyBtZXRob2QgZm9yIHN1Y2ggY2FzZXMgaW4gdGhlIHJlbGVhc2UgdmVyc2lvbiBvZiB5b3VyIHBhcnNlci4KLSAgICAqLwotICAgcHVibGljIFN0cmluZyBnZXRNZXNzYWdlKCkgewotICAgICAgcmV0dXJuIHN1cGVyLmdldE1lc3NhZ2UoKTsKLSAgIH0KLQotICAgLyoKLSAgICAqIENvbnN0cnVjdG9ycyBvZiB2YXJpb3VzIGZsYXZvcnMgZm9sbG93LgotICAgICovCi0KLSAgIHB1YmxpYyBUb2tlbk1nckVycm9yKCkgewotICAgfQotCi0gICBwdWJsaWMgVG9rZW5NZ3JFcnJvcihTdHJpbmcgbWVzc2FnZSwgaW50IHJlYXNvbikgewotICAgICAgc3VwZXIobWVzc2FnZSk7Ci0gICAgICBlcnJvckNvZGUgPSByZWFzb247Ci0gICB9Ci0KLSAgIHB1YmxpYyBUb2tlbk1nckVycm9yKGJvb2xlYW4gRU9GU2VlbiwgaW50IGxleFN0YXRlLCBpbnQgZXJyb3JMaW5lLCBpbnQgZXJyb3JDb2x1bW4sIFN0cmluZyBlcnJvckFmdGVyLCBjaGFyIGN1ckNoYXIsIGludCByZWFzb24pIHsKLSAgICAgIHRoaXMoTGV4aWNhbEVycm9yKEVPRlNlZW4sIGxleFN0YXRlLCBlcnJvckxpbmUsIGVycm9yQ29sdW1uLCBlcnJvckFmdGVyLCBjdXJDaGFyKSwgcmVhc29uKTsKLSAgIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vTElDRU5TRS50eHQgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL0xJQ0VOU0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjQ1Njk1Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vTElDRU5TRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwyMDIgKzAsMCBAQAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNAotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLwotCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04KLQotICAgMS4gRGVmaW5pdGlvbnMuCi0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4KLQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4KLQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbgotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwKLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3IKLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KLQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KLQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLgotCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dAotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLAotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgotCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcgotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLgotCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0Ci0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3NlcwotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLgotCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZwotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucwotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5Ci0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIgotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0Ci0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCi0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLgotCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4KLQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywKLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcgotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcwotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCi0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91Ci0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3IKLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZAotCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kCi0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3JrcwotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQKLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YKLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kCi0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cwotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QKLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QKLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUKLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3IKLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwKLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZAotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUKLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQKLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuCi0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucwotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcgotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgKLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuCi0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwKLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yawotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLgotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4KLQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLAotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KLQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEEKLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55Ci0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuCi0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLAotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwKLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KLQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZwotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwKLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcwotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkKLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkKLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgotCi0gICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKLQotICAgQVBQRU5ESVg6IEhvdyB0byBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLgotCi0gICAgICBUbyBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLCBhdHRhY2ggdGhlIGZvbGxvd2luZwotICAgICAgYm9pbGVycGxhdGUgbm90aWNlLCB3aXRoIHRoZSBmaWVsZHMgZW5jbG9zZWQgYnkgYnJhY2tldHMgIltdIgotICAgICAgcmVwbGFjZWQgd2l0aCB5b3VyIG93biBpZGVudGlmeWluZyBpbmZvcm1hdGlvbi4gKERvbid0IGluY2x1ZGUKLSAgICAgIHRoZSBicmFja2V0cyEpICBUaGUgdGV4dCBzaG91bGQgYmUgZW5jbG9zZWQgaW4gdGhlIGFwcHJvcHJpYXRlCi0gICAgICBjb21tZW50IHN5bnRheCBmb3IgdGhlIGZpbGUgZm9ybWF0LiBXZSBhbHNvIHJlY29tbWVuZCB0aGF0IGEKLSAgICAgIGZpbGUgb3IgY2xhc3MgbmFtZSBhbmQgZGVzY3JpcHRpb24gb2YgcHVycG9zZSBiZSBpbmNsdWRlZCBvbiB0aGUKLSAgICAgIHNhbWUgInByaW50ZWQgcGFnZSIgYXMgdGhlIGNvcHlyaWdodCBub3RpY2UgZm9yIGVhc2llcgotICAgICAgaWRlbnRpZmljYXRpb24gd2l0aGluIHRoaXJkLXBhcnR5IGFyY2hpdmVzLgotCi0gICBDb3B5cmlnaHQgW3l5eXldIFtuYW1lIG9mIGNvcHlyaWdodCBvd25lcl0KLQotICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vTk9USUNFLnR4dCBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vTk9USUNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmEzZGJkNi4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL05PVElDRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci09PSAgTk9USUNFIGZpbGUgY29ycmVzcG9uZGluZyB0byBzZWN0aW9uIDQoZCkgb2YgdGhlIEFwYWNoZSBMaWNlbnNlLCAgID09Ci09PSAgVmVyc2lvbiAyLjAsIGluIHRoaXMgY2FzZSBmb3IgdGhlIEFwYWNoZSBNeUZhY2VzIE1hdmVuIFBsdWdpbnMgICAgID09Ci09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgCi1UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLgotCi1Qb3J0aW9ucyBvZiB0aGlzIHNvZnR3YXJlIHdlcmUgb3JpZ2luYWxseSBiYXNlZCBvbiB0aGUgZm9sbG93aW5nOgotCi0gLSBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwNiwgT3JhY2xlIENvcnAsIDxodHRwOi8vd3d3Lm9yYWNsZS5jb20vPi4KLWFuZCBhcmUgbGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIHVuZGVyIHRoZSAKLSJTb2Z0d2FyZSBHcmFudCBhbmQgQ29ycG9yYXRlIENvbnRyaWJ1dGlvbiBMaWNlbnNlIEFncmVlbWVudCIKLQotU2VlIHRoZSBMSUNFTlNFLnR4dCBmaWxlIGZvciBpbmZvcm1hdGlvbiBvbiBhbGwgbGljZW5zZXMgCi1hc3NvY2lhdGVkIHdpdGggdGhpcyBzb2Z0d2FyZS4KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vcG9tLnhtbCBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTMyYjEwOS4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+Ci0KLSAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotCi0gIDxwYXJlbnQ+Ci0gICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29sczwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtcGx1Z2luLXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjEuMC41PC92ZXJzaW9uPgotICAgICAgPHJlbGF0aXZlUGF0aD4uLi9teWZhY2VzLXBsdWdpbi1wYXJlbnQvcG9tLnhtbDwvcmVsYXRpdmVQYXRoPgotICA8L3BhcmVudD4KLQotICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29sczwvZ3JvdXBJZD4KLSAgPGFydGlmYWN0SWQ+bXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgPHZlcnNpb24+MS4wLjMtU05BUFNIT1Q8L3ZlcnNpb24+Ci0gIDxwYWNrYWdpbmc+bWF2ZW4tcGx1Z2luPC9wYWNrYWdpbmc+Ci0gIDxuYW1lPkFwYWNoZSBNeUZhY2VzIEJ1aWxkdG9vbHMgTWF2ZW4yIEphdmFzY3JpcHQgUGx1Z2luPC9uYW1lPgotCi0gIDxzY20+Ci0gICAgPGNvbm5lY3Rpb24+c2NtOnN2bjpodHRwOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL215ZmFjZXMvbXlmYWNlcy1idWlsZC10b29scy90cnVuay9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luPC9jb25uZWN0aW9uPgotICAgIDxkZXZlbG9wZXJDb25uZWN0aW9uPnNjbTpzdm46aHR0cHM6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvbXlmYWNlcy9teWZhY2VzLWJ1aWxkLXRvb2xzL3RydW5rL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW48L2RldmVsb3BlckNvbm5lY3Rpb24+Ci0gICAgPHVybD5odHRwOi8vc3ZuLmFwYWNoZS5vcmcvdmlld3ZjL215ZmFjZXMvbXlmYWNlcy1idWlsZC10b29scy90cnVuay9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luPC91cmw+Ci0gIDwvc2NtPgotCi0gIDxidWlsZD4KLSAgICA8cGx1Z2lucz4KLSAgICAgIDxwbHVnaW4+Ci0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KLSAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY29tcGlsZXItcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICA8aW5oZXJpdGVkPnRydWU8L2luaGVyaXRlZD4KLSAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgPHNvdXJjZT4xLjU8L3NvdXJjZT4KLSAgICAgICAgICA8dGFyZ2V0PjEuNTwvdGFyZ2V0PgotICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICA8L3BsdWdpbj4KLSAgICAgIDxwbHVnaW4+Ci0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzPC9ncm91cElkPgotICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWphdmFjYy1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgIDx2ZXJzaW9uPjEuMC4wPC92ZXJzaW9uPgotICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICA8c291cmNlRGlyZWN0b3J5PnNyYy9tYWluL2phdmE8L3NvdXJjZURpcmVjdG9yeT4KLSAgICAgICAgICA8c291cmNlUGF0aD5vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvb2JmdXNjYXRvci9qYXZhc2NyaXB0MTVwYXJzZXI8L3NvdXJjZVBhdGg+Ci0gICAgICAgICAgPG91dHB1dFBhdGg+b3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L29iZnVzY2F0b3IvamF2YXNjcmlwdDE1cGFyc2VyPC9vdXRwdXRQYXRoPgotICAgICAgICAgIDxpc1N0YXRpYz5mYWxzZTwvaXNTdGF0aWM+Ci0gICAgICAgICAgPGRvTm90R2VuZXJhdGVUb2tlbkZpbGU+dHJ1ZTwvZG9Ob3RHZW5lcmF0ZVRva2VuRmlsZT4KLSAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICA8ZXhlY3V0aW9ucz4KLSAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICA8Z29hbD5nZW5lcmF0ZTwvZ29hbD4KLSAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgIDwvZXhlY3V0aW9ucz4KLSAgICAgIDwvcGx1Z2luPgotICAgICAgPHBsdWdpbj4KLSAgICAgICAgPCEtLQotICAgICAgICAgIC0gT3ZlcnJpZGUgY2hlY2tzdHlsZSBjb25maWcgZmlsZSBkZWZpbml0aW9ucyBmcm9tIHBhcmVudCBwb20uIFRoZSBzb3VyY2Ugb2YKLSAgICAgICAgICAtIHRoaXMgcHJvamVjdCBpcyBub3QgY29tcGxpYW50IHdpdGggdGhlIG5vcm1hbCBNeUZhY2VzIGNvZGUgc3R5bGUgcnVsZXMsIGFuZAotICAgICAgICAgIC0gcHJvYmFibHkgbmV2ZXIgd2lsbCBiZS4KLSAgICAgICAgICAtLT4KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgotICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1jaGVja3N0eWxlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPHZlcnNpb24+Mi4yPC92ZXJzaW9uPgotICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICA8Y29uZmlnTG9jYXRpb24+ZGVmYXVsdC9teWZhY2VzLWNoZWNrcy1taW5pbWFsLnhtbDwvY29uZmlnTG9jYXRpb24+Ci0gICAgICAgICAgPGhlYWRlckxvY2F0aW9uPmRlZmF1bHQvbXlmYWNlcy1oZWFkZXItc3BhY2VzLnR4dDwvaGVhZGVyTG9jYXRpb24+Ci0gICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgIDwvcGx1Z2luPgotICAgICAgPHBsdWdpbj4KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmNvZGVoYXVzLm1vZGVsbG88L2dyb3VwSWQ+Ci0gICAgICAgIDxhcnRpZmFjdElkPm1vZGVsbG8tbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj4xLjAuMTwvdmVyc2lvbj4KLSAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgIDxpZD5kZXNjcmlwdG9yPC9pZD4KLSAgICAgICAgICAgIDxwaGFzZT5nZW5lcmF0ZS1zb3VyY2VzPC9waGFzZT4KLSAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgPGdvYWw+eHBwMy1yZWFkZXI8L2dvYWw+Ci0gICAgICAgICAgICAgIDxnb2FsPmphdmE8L2dvYWw+Ci0gICAgICAgICAgICAgIDxnb2FsPnhzZDwvZ29hbD4KLSAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgPG1vZGVscz4KLSAgICAgICAgICAgICAgICA8bW9kZWw+c3JjL21haW4vbWRvL2Fzc2VtYmxlci5tZG88L21vZGVsPgotICAgICAgICAgICAgICA8L21vZGVscz4KLSAgICAgICAgICAgICAgPHZlcnNpb24+MS4wLjA8L3ZlcnNpb24+Ci0gICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgIDwvZXhlY3V0aW9ucz4KLSAgICAgIDwvcGx1Z2luPgotICAgIDwvcGx1Z2lucz4KLSAgICA8cGx1Z2luTWFuYWdlbWVudD4KLSAgICAgIDxwbHVnaW5zPgotICAgICAgICA8cGx1Z2luPgotICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KLSAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1wbHVnaW4tcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgIDx2ZXJzaW9uPjIuNTwvdmVyc2lvbj4KLSAgICAgICAgPC9wbHVnaW4+ICAgICAgCi0gICAgICA8L3BsdWdpbnM+Ci0gICAgPC9wbHVnaW5NYW5hZ2VtZW50PgotICA8L2J1aWxkPgotICAKLSAgPGRlcGVuZGVuY2llcz4KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW48L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1wbHVnaW4tYXBpPC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+Mi4wPC92ZXJzaW9uPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW48L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1wcm9qZWN0PC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+Mi4wPC92ZXJzaW9uPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPmNvbW1vbnMtaW88L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5jb21tb25zLWlvPC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+MS4wPC92ZXJzaW9uPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgICAKLSAgICA8IS0tIGNvZGVoYXVzIGphdmFzY3JpcHQgLS0+Ci0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuPC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYXJjaGl2ZXI8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4yLjI8L3ZlcnNpb24+Ci0gICAgPC9kZXBlbmRlbmN5PgotICAgIAotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+b3JnLmNvZGVoYXVzLnBsZXh1czwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPnBsZXh1cy11dGlsczwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjEuNS45PC92ZXJzaW9uPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgICAKLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPmNvbW1vbnMtbGFuZzwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPmNvbW1vbnMtbGFuZzwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjIuNDwvdmVyc2lvbj4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPCEtLSBUaGlzIGRlcGVuZGVuY3kgY29uZmxpY3RzIHdpdGggeXVpY29tcHJlc3NvcgotICAgICAgICAgYnV0IHdlIGFyZSBub3QgaW50ZXJlc3RlZCBvbiB0aGlzIGNvbXByZXNzb3IsCi0gICAgICAgICBiZWNhdXNlIHl1aWNvbXByZXNzb3Igd29ya3MgYmV0dGVyLAotICAgICAgICAgc28gd2UganVzdCBjYW4gZ2V0IHJpZCBvZiBpdC4KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPm9yZy5kb2pvdG9vbGtpdDwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPmN1c3RvbV9yaGlubzwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjAuOS4wPC92ZXJzaW9uPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgLS0+Ci0gICAgCi0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5jb20ueWFob28ucGxhdGZvcm0ueXVpPC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+eXVpY29tcHJlc3NvcjwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjIuMy42PC92ZXJzaW9uPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgICAKLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPmNvbW1vbnMtanhwYXRoPC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+Y29tbW9ucy1qeHBhdGg8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4xLjI8L3ZlcnNpb24+Ci0gICAgICA8ZXhjbHVzaW9ucz4KLSAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICA8Z3JvdXBJZD5qYXZheC5zZXJ2bGV0PC9ncm91cElkPgotICAgICAgICAgIDxhcnRpZmFjdElkPnNlcnZsZXQtYXBpPC9hcnRpZmFjdElkPgotICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICA8Z3JvdXBJZD5hbnQ8L2dyb3VwSWQ+Ci0gICAgICAgICAgPGFydGlmYWN0SWQ+YW50LW9wdGlvbmFsPC9hcnRpZmFjdElkPgotICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICA8Z3JvdXBJZD5qdW5pdDwvZ3JvdXBJZD4KLSAgICAgICAgICA8YXJ0aWZhY3RJZD5qdW5pdDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICA8L2V4Y2x1c2lvbnM+Ci0gICAgPC9kZXBlbmRlbmN5PgotICAgIAotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4tdGVzdGluZzwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXBsdWdpbi10ZXN0aW5nLWhhcm5lc3M8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4xLjI8L3ZlcnNpb24+Ci0gICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+Ci0gICAgPC9kZXBlbmRlbmN5PgotICAgIAotICA8L2RlcGVuZGVuY2llcz4KLSAgCi0gIDxyZXBvcnRpbmc+Ci0gICAgPHBsdWdpbnM+Ci0gICAgICA8cGx1Z2luPgotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+Ci0gICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXBsdWdpbi1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgIDx2ZXJzaW9uPjIuMjwvdmVyc2lvbj4KLSAgICAgIDwvcGx1Z2luPgotICAgIDwvcGx1Z2lucz4KLSAgPC9yZXBvcnRpbmc+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L09iZnVzY2F0ZUphdmFzY3JpcHRNb2pvLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L09iZnVzY2F0ZUphdmFzY3JpcHRNb2pvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2YjBjZDYuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9PYmZ1c2NhdGVKYXZhc2NyaXB0TW9qby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0ICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0OwotCi0vL34tLS0gbm9uLUpESyBpbXBvcnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQub2JmdXNjYXRvci5PYmZ1c2NhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5vYmZ1c2NhdG9yLmNvbmZpZ3VyYXRpb24uQ29uZmlnRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5vYmZ1c2NhdG9yLmNvbmZpZ3VyYXRpb24uT2JmdXNjYXRvckNvbmZpZzsKLQotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLkFic3RyYWN0TW9qbzsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5Nb2pvRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucHJvamVjdC5NYXZlblByb2plY3Q7Ci0KLS8vfi0tLSBKREsgaW1wb3J0cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLQotLy9+LS0tIGNsYXNzZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0vKioKLSAqIEB2ZXJzaW9uICRJZCQKLSAqIEByZXF1aXJlc0RlcGVuZGVuY3lSZXNvbHV0aW9uIGNvbXBpbGUKLSAqIEBnb2FsIG9iZnVzY2F0ZS1qYXZhc2NyaXB0Ci0gKiBAcGhhc2UgZ2VuZXJhdGUtcmVzb3VyY2VzCi0gKiBAZGVzY3JpcHRpb24gR29hbCB3aGljaCBvYmZ1c2NhdGVzIHRoZSBKYXZhc2NyaXB0IHNvdXJjZXMKLSAqLwotcHVibGljIGNsYXNzIE9iZnVzY2F0ZUphdmFzY3JpcHRNb2pvCi0gIGV4dGVuZHMgQWJzdHJhY3RNb2pvCi17Ci0KLSAgLy9+LS0tIG1ldGhvZHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgcHVibGljIHZvaWQgZXhlY3V0ZSgpCi0gICAgdGhyb3dzIE1vam9FeGVjdXRpb25FeGNlcHRpb24KLSAgewotLy8gTGlzdCBjb21waWxlU291cmNlUm9vdHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0vLyBjb21waWxlU291cmNlUm9vdHMuYWRkKHNvdXJjZURpcmVjdG9yeSk7Ci0KLSAgICB0cnkKLSAgICB7Ci0gICAgICBfb2JmdXNjYXRvciA9IAotICAgICAgICAgIG5ldyBPYmZ1c2NhdG9yKG9iZnVzY2F0ZSwgc3RyaXBDb21tZW50cywgc3RyaXBXaGl0ZXNwYWNlcywgCi0gICAgICAgICAgICAgICAgICAgICAgICAgc3RyaXBOZXdsaW5lcywgc3RyaXBTcGVjaWFsS2V5d29yZHMsIAotICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxhY2VDaGFyTGl0ZXJhbHMsIG9iZnVzY2F0b3JDb25maWcpOwotCi0vLyAgICAgIEZpbGUgb3V0cHV0RGlyZWN0b3J5ID0gbmV3IEZpbGUodGFyZ2V0RGlyZWN0b3J5LCB0YXJnZXRQYXRoKTsKLQotICAgICAgdGFyZ2V0RGlyZWN0b3J5Lm1rZGlycygpOwotCi0gICAgICBmb3IgKEZpbGUgc291cmNlUm9vdDogc291cmNlRGlyZWN0b3J5KQotICAgICAgewotLy8gICAgICAgIEZpbGUgc291cmNlRGlyZWN0b3J5ID0gbmV3IEZpbGUoc291cmNlUm9vdCwgc291cmNlUGF0aCk7Ci0gICAgICAgIGlmIChzb3VyY2VSb290LmV4aXN0cygpKQotICAgICAgICB7Ci0gICAgICAgICAgX29iZnVzY2F0b3IucHJvY2Vzcyhzb3VyY2VSb290LCB0YXJnZXREaXJlY3RvcnkpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIGNhdGNoIChDb25maWdFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbigiSW52YWxpZCBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMiLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUpOwotICAgIH0KLSAgfQotICBwcml2YXRlIE9iZnVzY2F0b3IgX29iZnVzY2F0b3I7Ci0KLQotICAvKioKLSAgICogQHBhcmFtZXRlcgotICAgKiBAcmVxdWlyZWQKLSAgICovCi0gIHByaXZhdGUgYm9vbGVhbiBvYmZ1c2NhdGUgPSBmYWxzZTsKLQotICAvKioKLSAgICogQHBhcmFtZXRlcgotICAgKiBAcmVxdWlyZWQKLSAgICovCi0gIHByaXZhdGUgYm9vbGVhbiByZXBsYWNlQ2hhckxpdGVyYWxzID0gZmFsc2U7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbWV0ZXIKLSAgICogQHJlcXVpcmVkCi0gICAqLwotICBwcml2YXRlIGJvb2xlYW4gc3RyaXBDb21tZW50cyA9IGZhbHNlOwotCi0gIC8qKgotICAgKiBAcGFyYW1ldGVyCi0gICAqIEByZXF1aXJlZAotICAgKi8KLSAgcHJpdmF0ZSBib29sZWFuIHN0cmlwTmV3bGluZXMgPSBmYWxzZTsKLQotICAvKioKLSAgICogQHBhcmFtZXRlcgotICAgKiBAcmVxdWlyZWQKLSAgICovCi0gIHByaXZhdGUgYm9vbGVhbiBzdHJpcFNwZWNpYWxLZXl3b3JkcyA9IGZhbHNlOwotCi0gIC8qKgotICAgKiBAcGFyYW1ldGVyCi0gICAqIEByZXF1aXJlZAotICAgKi8KLSAgcHJpdmF0ZSBib29sZWFuIHN0cmlwV2hpdGVzcGFjZXMgPSBmYWxzZTsKLQotICAvKioKLSAgICogQHBhcmFtZXRlciAKLSAgICogQHJlcXVpcmVkCi0gICAqLwotICBwcml2YXRlIEZpbGVbXSBzb3VyY2VEaXJlY3Rvcnk7Ci0KLQotICAvKioKLSAgICogQHBhcmFtZXRlciBleHByZXNzaW9uPSIke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9jbGFzc2VzIgotICAgKiBAcmVxdWlyZWQKLSAgICovCi0gIHByaXZhdGUgRmlsZSB0YXJnZXREaXJlY3Rvcnk7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbWV0ZXIKLSAgICogQHJlcXVpcmVkCi0gICAqLwotICBwcml2YXRlIE9iZnVzY2F0b3JDb25maWcgb2JmdXNjYXRvckNvbmZpZzsKLX0KLQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9SZWR1Y2VKYXZhc2NyaXB0TW9qby5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9SZWR1Y2VKYXZhc2NyaXB0TW9qby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZjI2MWQ5Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvUmVkdWNlSmF2YXNjcmlwdE1vam8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LnVpeHRvb2xzLlJlZHVjZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuaW8uRmlsZVV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ubW9kZWwuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uQWJzdHJhY3RNb2pvOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLk1vam9FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wcm9qZWN0Lk1hdmVuUHJvamVjdDsKLQotLyoqCi0gKiBAdmVyc2lvbiAkSWQkCi0gKiBAZ29hbCByZWR1Y2UtamF2YXNjcmlwdAotICogQHBoYXNlIGdlbmVyYXRlLXNvdXJjZXMKLSAqIEBkZXNjcmlwdGlvbiBHb2FsIHdoaWNoIGNvbXBpbGVzIHRoZSBKYXZhc2NyaXB0IHNvdXJjZXMKLSAqLwotcHVibGljIGNsYXNzIFJlZHVjZUphdmFzY3JpcHRNb2pvIGV4dGVuZHMgQWJzdHJhY3RNb2pvCi17Ci0gIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbgotICB7Ci0gICAgTGlzdCBjb21waWxlU291cmNlUm9vdHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgY29tcGlsZVNvdXJjZVJvb3RzLmFkZChzb3VyY2VEaXJlY3RvcnkpOwotICAgIC8vIFRPRE86IHJlZ2lzdGVyIHRoZXNlIHBhdGhzIGZyb20gaW5zaWRlIHJlbGV2YW50IHBsdWdpbnMKLSAgICBjb21waWxlU291cmNlUm9vdHMuYWRkKG5ldyBGaWxlKHByb2plY3QuZ2V0QnVpbGQoKS5nZXREaXJlY3RvcnkoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtYXZlbi1pMThuLXBsdWdpbi9tYWluL2phdmFzY3JpcHQiKSk7Ci0gICAgY29tcGlsZVNvdXJjZVJvb3RzLmFkZChuZXcgRmlsZShwcm9qZWN0LmdldEJ1aWxkKCkuZ2V0RGlyZWN0b3J5KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWF2ZW4tZmFjZXMtcGx1Z2luL21haW4vamF2YXNjcmlwdCIpKTsKLQotICAgIHRyeQotICAgIHsKLSAgICAgIFJlc291cmNlIHJlc291cmNlID0gbmV3IFJlc291cmNlKCk7Ci0gICAgICByZXNvdXJjZS5zZXREaXJlY3RvcnkodGFyZ2V0RGlyZWN0b3J5LmdldENhbm9uaWNhbFBhdGgoKSk7Ci0gICAgICBwcm9qZWN0LmFkZFJlc291cmNlKHJlc291cmNlKTsKLQotICAgICAgLy8gVE9ETzogc3dpdGNoIE9wdGltaXplZCwgbm90IERlYnVnLCB0byBiZSB0aGUgc3BlY2lhbC1jYXNlCi0gICAgICAvLyAgICAgICBzbyB0aGF0IERlYnVnIGNhbiBiZSBwcm9jZXNzZWQgYXMgb3JkaW5hcnkgcmVzb3VyY2UgY29weQotICAgICAgLy8gICAgICAgd2l0aG91dCBoYXZpbmcgdG8gZXhwbGljaXRseSBjb2RlIGl0IGhlcmUKLSAgICAgIEZpbGUgb3V0cHV0RGlyZWN0b3J5ID0gbmV3IEZpbGUodGFyZ2V0RGlyZWN0b3J5LCB0YXJnZXRQYXRoKTsKLSAgICAgIG91dHB1dERpcmVjdG9yeS5ta2RpcnMoKTsKLSAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGNvbXBpbGVTb3VyY2VSb290cy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgICAgewotICAgICAgICBGaWxlIHNvdXJjZVJvb3QgPSAoRmlsZSlpLm5leHQoKTsKLSAgICAgICAgRmlsZSBzb3VyY2VEaXJlY3RvcnkgPSBuZXcgRmlsZShzb3VyY2VSb290LCBzb3VyY2VQYXRoKTsKLSAgICAgICAgaWYgKHNvdXJjZURpcmVjdG9yeS5leGlzdHMoKSkKLSAgICAgICAgewotICAgICAgICAgIF9jb3B5SmF2YXNjcmlwdChzb3VyY2VEaXJlY3RvcnksIG91dHB1dERpcmVjdG9yeSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgdGhyb3cgbmV3IE1vam9FeGVjdXRpb25FeGNlcHRpb24oIkVycm9yIGNvcHlpbmcgSmF2YXNjcmlwdCBmaWxlcyIsIGUpOwotICAgIH0KLQotCi0gICAgdHJ5Ci0gICAgewotICAgICAgaWYgKG9wdGltaXplVGFyZ2V0UGF0aCAhPSBudWxsKQotICAgICAgewotICAgICAgICBGaWxlIG91dHB1dERpcmVjdG9yeSA9IG5ldyBGaWxlKHRhcmdldERpcmVjdG9yeSwgb3B0aW1pemVUYXJnZXRQYXRoKTsKLSAgICAgICAgb3V0cHV0RGlyZWN0b3J5Lm1rZGlycygpOwotICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBjb21waWxlU291cmNlUm9vdHMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICAgICAgewotICAgICAgICAgIEZpbGUgc291cmNlUm9vdCA9IChGaWxlKWkubmV4dCgpOwotICAgICAgICAgIEZpbGUgc291cmNlRGlyZWN0b3J5ID0gbmV3IEZpbGUoc291cmNlUm9vdCwgc291cmNlUGF0aCk7Ci0gICAgICAgICAgaWYgKHNvdXJjZURpcmVjdG9yeS5leGlzdHMoKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmdbXSBhcmdzID0geyBzb3VyY2VEaXJlY3RvcnkuZ2V0Q2Fub25pY2FsUGF0aCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGlyZWN0b3J5LmdldENhbm9uaWNhbFBhdGgoKSB9OwotICAgICAgICAgICAgLy8gVE9ETzogaW5jcmVtZW50YWwgY2hlY2sKLSAgICAgICAgICAgIFJlZHVjZXIubWFpbihhcmdzKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgdGhyb3cgbmV3IE1vam9FeGVjdXRpb25FeGNlcHRpb24oIkVycm9yIGNvbXBpbGluZyBKYXZhc2NyaXB0IGZpbGVzIiwgZSk7Ci0gICAgfQotICB9Ci0KLSAgc3RhdGljIHByaXZhdGUgdm9pZCBfY29weUphdmFzY3JpcHQoRmlsZSBzb3VyY2VEaXIsIEZpbGUgdGFyZ2V0RGlyKQotICAgIHRocm93cyBJT0V4Y2VwdGlvbgotICB7Ci0gICAgRmlsZVtdIHNvdXJjZUZpbGVzID0gc291cmNlRGlyLmxpc3RGaWxlcygpOwotICAgIGlmIChzb3VyY2VGaWxlcyAhPSBudWxsKQotICAgIHsKLSAgICAgIGZvciAoRmlsZSBzb3VyY2VGaWxlIDogc291cmNlRmlsZXMpCi0gICAgICB7Ci0gICAgICAgIGlmIChzb3VyY2VGaWxlLmlzRGlyZWN0b3J5KCkpCi0gICAgICAgIHsKLSAgICAgICAgICBGaWxlIHRhcmdldFN1YmRpciA9IG5ldyBGaWxlKHRhcmdldERpciwgc291cmNlRmlsZS5nZXROYW1lKCkpOwotICAgICAgICAgIGlmICghdGFyZ2V0U3ViZGlyLmV4aXN0cygpKQotICAgICAgICAgICAgdGFyZ2V0U3ViZGlyLm1rZGlyKCk7Ci0gICAgICAgICAgX2NvcHlKYXZhc2NyaXB0KHNvdXJjZUZpbGUsIHRhcmdldFN1YmRpcik7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoc291cmNlRmlsZS5nZXROYW1lKCkuZW5kc1dpdGgoIi5qcyIpKQotICAgICAgICB7Ci0gICAgICAgICAgRmlsZVV0aWxzLmNvcHlGaWxlVG9EaXJlY3Rvcnkoc291cmNlRmlsZSwgdGFyZ2V0RGlyKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBAcGFyYW1ldGVyIGV4cHJlc3Npb249IiR7cHJvamVjdH0iCi0gICAqIEByZXF1aXJlZAotICAgKiBAcmVhZG9ubHkKLSAgICovCi0gIHByaXZhdGUgTWF2ZW5Qcm9qZWN0IHByb2plY3Q7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbWV0ZXIgZXhwcmVzc2lvbj0ic3JjL21haW4vamF2YXNjcmlwdCIKLSAgICogQHJlcXVpcmVkCi0gICAqLwotICBwcml2YXRlIEZpbGUgc291cmNlRGlyZWN0b3J5OwotCi0gIC8qKgotICAgKiBAcGFyYW1ldGVyCi0gICAqIEByZXF1aXJlZAotICAgKi8KLSAgcHJpdmF0ZSBTdHJpbmcgc291cmNlUGF0aDsKLQotICAvKioKLSAgICogQHBhcmFtZXRlciBleHByZXNzaW9uPSIke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9tYXZlbi1qYXZhc2NyaXB0LXBsdWdpbi9tYWluL3Jlc291cmNlcyIKLSAgICogQHJlcXVpcmVkCi0gICAqLwotICBwcml2YXRlIEZpbGUgdGFyZ2V0RGlyZWN0b3J5OwotCi0gIC8qKgotICAgKiBAcGFyYW1ldGVyCi0gICAqLwotICBwcml2YXRlIFN0cmluZyB0YXJnZXRQYXRoOwotCi0gIC8qKgotICAgKiBAcGFyYW1ldGVyCi0gICAqLwotICBwcml2YXRlIFN0cmluZyBvcHRpbWl6ZVRhcmdldFBhdGg7Ci0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVEFkZE9wLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RBZGRPcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjIyYmNmLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVEFkZE9wLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIEFTVEFkZE9wLmphdmEgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuamF2YXNjcmlwdDIwcGFyc2VyOwotCi1wdWJsaWMgY2xhc3MgQVNUQWRkT3AgZXh0ZW5kcyBTaW1wbGVOb2RlCi17Ci0gIHB1YmxpYyBBU1RBZGRPcChpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihpZCk7Ci0gIH0KLQotICBwdWJsaWMgQVNUQWRkT3AoSlNQYXJzZXIyMCBwLCBpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihwLCBpZCk7Ci0gIH0KLQotCi0gIC8qKiBBY2NlcHQgdGhlIHZpc2l0b3IuICoqLwotICBwdWJsaWMgT2JqZWN0IGpqdEFjY2VwdChKU1BhcnNlcjIwVmlzaXRvciB2aXNpdG9yLCBPYmplY3QgZGF0YSkKLSAgewotICAgIHJldHVybiB2aXNpdG9yLnZpc2l0KHRoaXMsIGRhdGEpOwotICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RBZGRpdGl2ZUV4cHJlc3Npb24uamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVEFkZGl0aXZlRXhwcmVzc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZjNlN2Y3Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVEFkZGl0aXZlRXhwcmVzc2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZTogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBBU1RBZGRpdGl2ZUV4cHJlc3Npb24uamF2YSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5qYXZhc2NyaXB0MjBwYXJzZXI7Ci0KLXB1YmxpYyBjbGFzcyBBU1RBZGRpdGl2ZUV4cHJlc3Npb24gZXh0ZW5kcyBTaW1wbGVOb2RlCi17Ci0gIHB1YmxpYyBBU1RBZGRpdGl2ZUV4cHJlc3Npb24oaW50IGlkKQotICB7Ci0gICAgc3VwZXIoaWQpOwotICB9Ci0KLSAgcHVibGljIEFTVEFkZGl0aXZlRXhwcmVzc2lvbihKU1BhcnNlcjIwIHAsIGludCBpZCkKLSAgewotICAgIHN1cGVyKHAsIGlkKTsKLSAgfQotCi0KLSAgLyoqIEFjY2VwdCB0aGUgdmlzaXRvci4gKiovCi0gIHB1YmxpYyBPYmplY3Qgamp0QWNjZXB0KEpTUGFyc2VyMjBWaXNpdG9yIHZpc2l0b3IsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgcmV0dXJuIHZpc2l0b3IudmlzaXQodGhpcywgZGF0YSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVEFubm90YXRhYmxlRGlyZWN0aXZlLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RBbm5vdGF0YWJsZURpcmVjdGl2ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTkwNmRmLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVEFubm90YXRhYmxlRGlyZWN0aXZlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIEFTVEFubm90YXRhYmxlRGlyZWN0aXZlLmphdmEgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuamF2YXNjcmlwdDIwcGFyc2VyOwotCi1wdWJsaWMgY2xhc3MgQVNUQW5ub3RhdGFibGVEaXJlY3RpdmUgZXh0ZW5kcyBTaW1wbGVOb2RlCi17Ci0gIHB1YmxpYyBBU1RBbm5vdGF0YWJsZURpcmVjdGl2ZShpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihpZCk7Ci0gIH0KLQotICBwdWJsaWMgQVNUQW5ub3RhdGFibGVEaXJlY3RpdmUoSlNQYXJzZXIyMCBwLCBpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihwLCBpZCk7Ci0gIH0KLQotCi0gIC8qKiBBY2NlcHQgdGhlIHZpc2l0b3IuICoqLwotICBwdWJsaWMgT2JqZWN0IGpqdEFjY2VwdChKU1BhcnNlcjIwVmlzaXRvciB2aXNpdG9yLCBPYmplY3QgZGF0YSkKLSAgewotICAgIHJldHVybiB2aXNpdG9yLnZpc2l0KHRoaXMsIGRhdGEpOwotICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RBcmd1bWVudHMuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVEFyZ3VtZW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNTE1MmM2Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVEFyZ3VtZW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZTogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBBU1RBcmd1bWVudHMuamF2YSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5qYXZhc2NyaXB0MjBwYXJzZXI7Ci0KLXB1YmxpYyBjbGFzcyBBU1RBcmd1bWVudHMgZXh0ZW5kcyBTaW1wbGVOb2RlCi17Ci0gIHB1YmxpYyBBU1RBcmd1bWVudHMoaW50IGlkKQotICB7Ci0gICAgc3VwZXIoaWQpOwotICB9Ci0KLSAgcHVibGljIEFTVEFyZ3VtZW50cyhKU1BhcnNlcjIwIHAsIGludCBpZCkKLSAgewotICAgIHN1cGVyKHAsIGlkKTsKLSAgfQotCi0KLSAgLyoqIEFjY2VwdCB0aGUgdmlzaXRvci4gKiovCi0gIHB1YmxpYyBPYmplY3Qgamp0QWNjZXB0KEpTUGFyc2VyMjBWaXNpdG9yIHZpc2l0b3IsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgcmV0dXJuIHZpc2l0b3IudmlzaXQodGhpcywgZGF0YSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVEFycmF5TGl0ZXJhbC5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUQXJyYXlMaXRlcmFsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1NWRkNDkuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUQXJyYXlMaXRlcmFsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIEFTVEFycmF5TGl0ZXJhbC5qYXZhICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LmphdmFzY3JpcHQyMHBhcnNlcjsKLQotcHVibGljIGNsYXNzIEFTVEFycmF5TGl0ZXJhbCBleHRlbmRzIFNpbXBsZU5vZGUKLXsKLSAgcHVibGljIEFTVEFycmF5TGl0ZXJhbChpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihpZCk7Ci0gIH0KLQotICBwdWJsaWMgQVNUQXJyYXlMaXRlcmFsKEpTUGFyc2VyMjAgcCwgaW50IGlkKQotICB7Ci0gICAgc3VwZXIocCwgaWQpOwotICB9Ci0KLQotICAvKiogQWNjZXB0IHRoZSB2aXNpdG9yLiAqKi8KLSAgcHVibGljIE9iamVjdCBqanRBY2NlcHQoSlNQYXJzZXIyMFZpc2l0b3IgdmlzaXRvciwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICByZXR1cm4gdmlzaXRvci52aXNpdCh0aGlzLCBkYXRhKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUQXNzaWduZW1lbnRPcGVyYXRvci5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUQXNzaWduZW1lbnRPcGVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwODY3ZTJkLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVEFzc2lnbmVtZW50T3BlcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qIEdlbmVyYXRlZCBCeTpKSlRyZWU6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gQVNUQXNzaWduZW1lbnRPcGVyYXRvci5qYXZhICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LmphdmFzY3JpcHQyMHBhcnNlcjsKLQotcHVibGljIGNsYXNzIEFTVEFzc2lnbmVtZW50T3BlcmF0b3IgZXh0ZW5kcyBTaW1wbGVOb2RlCi17Ci0gIHB1YmxpYyBBU1RBc3NpZ25lbWVudE9wZXJhdG9yKGludCBpZCkKLSAgewotICAgIHN1cGVyKGlkKTsKLSAgfQotCi0gIHB1YmxpYyBBU1RBc3NpZ25lbWVudE9wZXJhdG9yKEpTUGFyc2VyMjAgcCwgaW50IGlkKQotICB7Ci0gICAgc3VwZXIocCwgaWQpOwotICB9Ci0KLQotICAvKiogQWNjZXB0IHRoZSB2aXNpdG9yLiAqKi8KLSAgcHVibGljIE9iamVjdCBqanRBY2NlcHQoSlNQYXJzZXIyMFZpc2l0b3IgdmlzaXRvciwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICByZXR1cm4gdmlzaXRvci52aXNpdCh0aGlzLCBkYXRhKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUQXNzaWdubWVudEV4cHJlc3Npb24uamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVEFzc2lnbm1lbnRFeHByZXNzaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3OWZlN2QuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUQXNzaWdubWVudEV4cHJlc3Npb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qIEdlbmVyYXRlZCBCeTpKSlRyZWU6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gQVNUQXNzaWdubWVudEV4cHJlc3Npb24uamF2YSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5qYXZhc2NyaXB0MjBwYXJzZXI7Ci0KLXB1YmxpYyBjbGFzcyBBU1RBc3NpZ25tZW50RXhwcmVzc2lvbiBleHRlbmRzIFNpbXBsZU5vZGUKLXsKLSAgcHVibGljIEFTVEFzc2lnbm1lbnRFeHByZXNzaW9uKGludCBpZCkKLSAgewotICAgIHN1cGVyKGlkKTsKLSAgfQotCi0gIHB1YmxpYyBBU1RBc3NpZ25tZW50RXhwcmVzc2lvbihKU1BhcnNlcjIwIHAsIGludCBpZCkKLSAgewotICAgIHN1cGVyKHAsIGlkKTsKLSAgfQotCi0KLSAgLyoqIEFjY2VwdCB0aGUgdmlzaXRvci4gKiovCi0gIHB1YmxpYyBPYmplY3Qgamp0QWNjZXB0KEpTUGFyc2VyMjBWaXNpdG9yIHZpc2l0b3IsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgcmV0dXJuIHZpc2l0b3IudmlzaXQodGhpcywgZGF0YSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVEFzc2lnbm1lbnRFeHByZXNzaW9uTm9JTi5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUQXNzaWdubWVudEV4cHJlc3Npb25Ob0lOLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0MWY4YTQuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUQXNzaWdubWVudEV4cHJlc3Npb25Ob0lOLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIEFTVEFzc2lnbm1lbnRFeHByZXNzaW9uTm9JTi5qYXZhICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LmphdmFzY3JpcHQyMHBhcnNlcjsKLQotcHVibGljIGNsYXNzIEFTVEFzc2lnbm1lbnRFeHByZXNzaW9uTm9JTiBleHRlbmRzIFNpbXBsZU5vZGUKLXsKLSAgcHVibGljIEFTVEFzc2lnbm1lbnRFeHByZXNzaW9uTm9JTihpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihpZCk7Ci0gIH0KLQotICBwdWJsaWMgQVNUQXNzaWdubWVudEV4cHJlc3Npb25Ob0lOKEpTUGFyc2VyMjAgcCwgaW50IGlkKQotICB7Ci0gICAgc3VwZXIocCwgaWQpOwotICB9Ci0KLQotICAvKiogQWNjZXB0IHRoZSB2aXNpdG9yLiAqKi8KLSAgcHVibGljIE9iamVjdCBqanRBY2NlcHQoSlNQYXJzZXIyMFZpc2l0b3IgdmlzaXRvciwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICByZXR1cm4gdmlzaXRvci52aXNpdCh0aGlzLCBkYXRhKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUQXR0cmlidXRlLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RBdHRyaWJ1dGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTc3NDY3OC4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RBdHRyaWJ1dGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qIEdlbmVyYXRlZCBCeTpKSlRyZWU6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gQVNUQXR0cmlidXRlLmphdmEgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuamF2YXNjcmlwdDIwcGFyc2VyOwotCi1wdWJsaWMgY2xhc3MgQVNUQXR0cmlidXRlIGV4dGVuZHMgU2ltcGxlTm9kZQotewotICBwdWJsaWMgQVNUQXR0cmlidXRlKGludCBpZCkKLSAgewotICAgIHN1cGVyKGlkKTsKLSAgfQotCi0gIHB1YmxpYyBBU1RBdHRyaWJ1dGUoSlNQYXJzZXIyMCBwLCBpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihwLCBpZCk7Ci0gIH0KLQotCi0gIC8qKiBBY2NlcHQgdGhlIHZpc2l0b3IuICoqLwotICBwdWJsaWMgT2JqZWN0IGpqdEFjY2VwdChKU1BhcnNlcjIwVmlzaXRvciB2aXNpdG9yLCBPYmplY3QgZGF0YSkKLSAgewotICAgIHJldHVybiB2aXNpdG9yLnZpc2l0KHRoaXMsIGRhdGEpOwotICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RBdHRyaWJ1dGVFeHByZXNzaW9uLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RBdHRyaWJ1dGVFeHByZXNzaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViMTdhOTMuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUQXR0cmlidXRlRXhwcmVzc2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZTogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBBU1RBdHRyaWJ1dGVFeHByZXNzaW9uLmphdmEgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuamF2YXNjcmlwdDIwcGFyc2VyOwotCi1wdWJsaWMgY2xhc3MgQVNUQXR0cmlidXRlRXhwcmVzc2lvbiBleHRlbmRzIFNpbXBsZU5vZGUKLXsKLSAgcHVibGljIEFTVEF0dHJpYnV0ZUV4cHJlc3Npb24oaW50IGlkKQotICB7Ci0gICAgc3VwZXIoaWQpOwotICB9Ci0KLSAgcHVibGljIEFTVEF0dHJpYnV0ZUV4cHJlc3Npb24oSlNQYXJzZXIyMCBwLCBpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihwLCBpZCk7Ci0gIH0KLQotCi0gIC8qKiBBY2NlcHQgdGhlIHZpc2l0b3IuICoqLwotICBwdWJsaWMgT2JqZWN0IGpqdEFjY2VwdChKU1BhcnNlcjIwVmlzaXRvciB2aXNpdG9yLCBPYmplY3QgZGF0YSkKLSAgewotICAgIHJldHVybiB2aXNpdG9yLnZpc2l0KHRoaXMsIGRhdGEpOwotICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RBdHRyaWJ1dGVzLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RBdHRyaWJ1dGVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiYmY0ZDYuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUQXR0cmlidXRlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZTogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBBU1RBdHRyaWJ1dGVzLmphdmEgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuamF2YXNjcmlwdDIwcGFyc2VyOwotCi1wdWJsaWMgY2xhc3MgQVNUQXR0cmlidXRlcyBleHRlbmRzIFNpbXBsZU5vZGUKLXsKLSAgcHVibGljIEFTVEF0dHJpYnV0ZXMoaW50IGlkKQotICB7Ci0gICAgc3VwZXIoaWQpOwotICB9Ci0KLSAgcHVibGljIEFTVEF0dHJpYnV0ZXMoSlNQYXJzZXIyMCBwLCBpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihwLCBpZCk7Ci0gIH0KLQotCi0gIC8qKiBBY2NlcHQgdGhlIHZpc2l0b3IuICoqLwotICBwdWJsaWMgT2JqZWN0IGpqdEFjY2VwdChKU1BhcnNlcjIwVmlzaXRvciB2aXNpdG9yLCBPYmplY3QgZGF0YSkKLSAgewotICAgIHJldHVybiB2aXNpdG9yLnZpc2l0KHRoaXMsIGRhdGEpOwotICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RCaXR3aXNlQU5ERXhwcmVzc2lvbi5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUQml0d2lzZUFOREV4cHJlc3Npb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjA1MTJjOC4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RCaXR3aXNlQU5ERXhwcmVzc2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZTogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBBU1RCaXR3aXNlQU5ERXhwcmVzc2lvbi5qYXZhICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LmphdmFzY3JpcHQyMHBhcnNlcjsKLQotcHVibGljIGNsYXNzIEFTVEJpdHdpc2VBTkRFeHByZXNzaW9uIGV4dGVuZHMgU2ltcGxlTm9kZQotewotICBwdWJsaWMgQVNUQml0d2lzZUFOREV4cHJlc3Npb24oaW50IGlkKQotICB7Ci0gICAgc3VwZXIoaWQpOwotICB9Ci0KLSAgcHVibGljIEFTVEJpdHdpc2VBTkRFeHByZXNzaW9uKEpTUGFyc2VyMjAgcCwgaW50IGlkKQotICB7Ci0gICAgc3VwZXIocCwgaWQpOwotICB9Ci0KLQotICAvKiogQWNjZXB0IHRoZSB2aXNpdG9yLiAqKi8KLSAgcHVibGljIE9iamVjdCBqanRBY2NlcHQoSlNQYXJzZXIyMFZpc2l0b3IgdmlzaXRvciwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICByZXR1cm4gdmlzaXRvci52aXNpdCh0aGlzLCBkYXRhKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUQml0d2lzZUFOREV4cHJlc3Npb25Ob0lOLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RCaXR3aXNlQU5ERXhwcmVzc2lvbk5vSU4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODhmNmFhNi4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RCaXR3aXNlQU5ERXhwcmVzc2lvbk5vSU4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qIEdlbmVyYXRlZCBCeTpKSlRyZWU6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gQVNUQml0d2lzZUFOREV4cHJlc3Npb25Ob0lOLmphdmEgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuamF2YXNjcmlwdDIwcGFyc2VyOwotCi1wdWJsaWMgY2xhc3MgQVNUQml0d2lzZUFOREV4cHJlc3Npb25Ob0lOIGV4dGVuZHMgU2ltcGxlTm9kZQotewotICBwdWJsaWMgQVNUQml0d2lzZUFOREV4cHJlc3Npb25Ob0lOKGludCBpZCkKLSAgewotICAgIHN1cGVyKGlkKTsKLSAgfQotCi0gIHB1YmxpYyBBU1RCaXR3aXNlQU5ERXhwcmVzc2lvbk5vSU4oSlNQYXJzZXIyMCBwLCBpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihwLCBpZCk7Ci0gIH0KLQotCi0gIC8qKiBBY2NlcHQgdGhlIHZpc2l0b3IuICoqLwotICBwdWJsaWMgT2JqZWN0IGpqdEFjY2VwdChKU1BhcnNlcjIwVmlzaXRvciB2aXNpdG9yLCBPYmplY3QgZGF0YSkKLSAgewotICAgIHJldHVybiB2aXNpdG9yLnZpc2l0KHRoaXMsIGRhdGEpOwotICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RCaXR3aXNlQU5ET3AuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVEJpdHdpc2VBTkRPcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzVhMzEzLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVEJpdHdpc2VBTkRPcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZTogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBBU1RCaXR3aXNlQU5ET3AuamF2YSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5qYXZhc2NyaXB0MjBwYXJzZXI7Ci0KLXB1YmxpYyBjbGFzcyBBU1RCaXR3aXNlQU5ET3AgZXh0ZW5kcyBTaW1wbGVOb2RlCi17Ci0gIHB1YmxpYyBBU1RCaXR3aXNlQU5ET3AoaW50IGlkKQotICB7Ci0gICAgc3VwZXIoaWQpOwotICB9Ci0KLSAgcHVibGljIEFTVEJpdHdpc2VBTkRPcChKU1BhcnNlcjIwIHAsIGludCBpZCkKLSAgewotICAgIHN1cGVyKHAsIGlkKTsKLSAgfQotCi0KLSAgLyoqIEFjY2VwdCB0aGUgdmlzaXRvci4gKiovCi0gIHB1YmxpYyBPYmplY3Qgamp0QWNjZXB0KEpTUGFyc2VyMjBWaXNpdG9yIHZpc2l0b3IsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgcmV0dXJuIHZpc2l0b3IudmlzaXQodGhpcywgZGF0YSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVEJpdHdpc2VPUkV4cHJlc3Npb24uamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVEJpdHdpc2VPUkV4cHJlc3Npb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2RlZDVhOC4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RCaXR3aXNlT1JFeHByZXNzaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIEFTVEJpdHdpc2VPUkV4cHJlc3Npb24uamF2YSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5qYXZhc2NyaXB0MjBwYXJzZXI7Ci0KLXB1YmxpYyBjbGFzcyBBU1RCaXR3aXNlT1JFeHByZXNzaW9uIGV4dGVuZHMgU2ltcGxlTm9kZQotewotICBwdWJsaWMgQVNUQml0d2lzZU9SRXhwcmVzc2lvbihpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihpZCk7Ci0gIH0KLQotICBwdWJsaWMgQVNUQml0d2lzZU9SRXhwcmVzc2lvbihKU1BhcnNlcjIwIHAsIGludCBpZCkKLSAgewotICAgIHN1cGVyKHAsIGlkKTsKLSAgfQotCi0KLSAgLyoqIEFjY2VwdCB0aGUgdmlzaXRvci4gKiovCi0gIHB1YmxpYyBPYmplY3Qgamp0QWNjZXB0KEpTUGFyc2VyMjBWaXNpdG9yIHZpc2l0b3IsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgcmV0dXJuIHZpc2l0b3IudmlzaXQodGhpcywgZGF0YSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVEJpdHdpc2VPUkV4cHJlc3Npb25Ob0lOLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RCaXR3aXNlT1JFeHByZXNzaW9uTm9JTi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTkyNmZkLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVEJpdHdpc2VPUkV4cHJlc3Npb25Ob0lOLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIEFTVEJpdHdpc2VPUkV4cHJlc3Npb25Ob0lOLmphdmEgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuamF2YXNjcmlwdDIwcGFyc2VyOwotCi1wdWJsaWMgY2xhc3MgQVNUQml0d2lzZU9SRXhwcmVzc2lvbk5vSU4gZXh0ZW5kcyBTaW1wbGVOb2RlCi17Ci0gIHB1YmxpYyBBU1RCaXR3aXNlT1JFeHByZXNzaW9uTm9JTihpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihpZCk7Ci0gIH0KLQotICBwdWJsaWMgQVNUQml0d2lzZU9SRXhwcmVzc2lvbk5vSU4oSlNQYXJzZXIyMCBwLCBpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihwLCBpZCk7Ci0gIH0KLQotCi0gIC8qKiBBY2NlcHQgdGhlIHZpc2l0b3IuICoqLwotICBwdWJsaWMgT2JqZWN0IGpqdEFjY2VwdChKU1BhcnNlcjIwVmlzaXRvciB2aXNpdG9yLCBPYmplY3QgZGF0YSkKLSAgewotICAgIHJldHVybiB2aXNpdG9yLnZpc2l0KHRoaXMsIGRhdGEpOwotICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RCaXR3aXNlT1JPcC5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUQml0d2lzZU9ST3AuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmMwYTA2NC4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RCaXR3aXNlT1JPcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZTogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBBU1RCaXR3aXNlT1JPcC5qYXZhICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LmphdmFzY3JpcHQyMHBhcnNlcjsKLQotcHVibGljIGNsYXNzIEFTVEJpdHdpc2VPUk9wIGV4dGVuZHMgU2ltcGxlTm9kZQotewotICBwdWJsaWMgQVNUQml0d2lzZU9ST3AoaW50IGlkKQotICB7Ci0gICAgc3VwZXIoaWQpOwotICB9Ci0KLSAgcHVibGljIEFTVEJpdHdpc2VPUk9wKEpTUGFyc2VyMjAgcCwgaW50IGlkKQotICB7Ci0gICAgc3VwZXIocCwgaWQpOwotICB9Ci0KLQotICAvKiogQWNjZXB0IHRoZSB2aXNpdG9yLiAqKi8KLSAgcHVibGljIE9iamVjdCBqanRBY2NlcHQoSlNQYXJzZXIyMFZpc2l0b3IgdmlzaXRvciwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICByZXR1cm4gdmlzaXRvci52aXNpdCh0aGlzLCBkYXRhKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUQml0d2lzZVhPUkV4cHJlc3Npb24uamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVEJpdHdpc2VYT1JFeHByZXNzaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzODE0MzMuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUQml0d2lzZVhPUkV4cHJlc3Npb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qIEdlbmVyYXRlZCBCeTpKSlRyZWU6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gQVNUQml0d2lzZVhPUkV4cHJlc3Npb24uamF2YSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5qYXZhc2NyaXB0MjBwYXJzZXI7Ci0KLXB1YmxpYyBjbGFzcyBBU1RCaXR3aXNlWE9SRXhwcmVzc2lvbiBleHRlbmRzIFNpbXBsZU5vZGUKLXsKLSAgcHVibGljIEFTVEJpdHdpc2VYT1JFeHByZXNzaW9uKGludCBpZCkKLSAgewotICAgIHN1cGVyKGlkKTsKLSAgfQotCi0gIHB1YmxpYyBBU1RCaXR3aXNlWE9SRXhwcmVzc2lvbihKU1BhcnNlcjIwIHAsIGludCBpZCkKLSAgewotICAgIHN1cGVyKHAsIGlkKTsKLSAgfQotCi0KLSAgLyoqIEFjY2VwdCB0aGUgdmlzaXRvci4gKiovCi0gIHB1YmxpYyBPYmplY3Qgamp0QWNjZXB0KEpTUGFyc2VyMjBWaXNpdG9yIHZpc2l0b3IsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgcmV0dXJuIHZpc2l0b3IudmlzaXQodGhpcywgZGF0YSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVEJpdHdpc2VYT1JFeHByZXNzaW9uTm9JTi5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUQml0d2lzZVhPUkV4cHJlc3Npb25Ob0lOLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3MWQzOGEuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUQml0d2lzZVhPUkV4cHJlc3Npb25Ob0lOLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIEFTVEJpdHdpc2VYT1JFeHByZXNzaW9uTm9JTi5qYXZhICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LmphdmFzY3JpcHQyMHBhcnNlcjsKLQotcHVibGljIGNsYXNzIEFTVEJpdHdpc2VYT1JFeHByZXNzaW9uTm9JTiBleHRlbmRzIFNpbXBsZU5vZGUKLXsKLSAgcHVibGljIEFTVEJpdHdpc2VYT1JFeHByZXNzaW9uTm9JTihpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihpZCk7Ci0gIH0KLQotICBwdWJsaWMgQVNUQml0d2lzZVhPUkV4cHJlc3Npb25Ob0lOKEpTUGFyc2VyMjAgcCwgaW50IGlkKQotICB7Ci0gICAgc3VwZXIocCwgaWQpOwotICB9Ci0KLQotICAvKiogQWNjZXB0IHRoZSB2aXNpdG9yLiAqKi8KLSAgcHVibGljIE9iamVjdCBqanRBY2NlcHQoSlNQYXJzZXIyMFZpc2l0b3IgdmlzaXRvciwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICByZXR1cm4gdmlzaXRvci52aXNpdCh0aGlzLCBkYXRhKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUQml0d2lzZVhPUk9wLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RCaXR3aXNlWE9ST3AuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzk1OTczMS4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RCaXR3aXNlWE9ST3AuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qIEdlbmVyYXRlZCBCeTpKSlRyZWU6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gQVNUQml0d2lzZVhPUk9wLmphdmEgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuamF2YXNjcmlwdDIwcGFyc2VyOwotCi1wdWJsaWMgY2xhc3MgQVNUQml0d2lzZVhPUk9wIGV4dGVuZHMgU2ltcGxlTm9kZQotewotICBwdWJsaWMgQVNUQml0d2lzZVhPUk9wKGludCBpZCkKLSAgewotICAgIHN1cGVyKGlkKTsKLSAgfQotCi0gIHB1YmxpYyBBU1RCaXR3aXNlWE9ST3AoSlNQYXJzZXIyMCBwLCBpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihwLCBpZCk7Ci0gIH0KLQotCi0gIC8qKiBBY2NlcHQgdGhlIHZpc2l0b3IuICoqLwotICBwdWJsaWMgT2JqZWN0IGpqdEFjY2VwdChKU1BhcnNlcjIwVmlzaXRvciB2aXNpdG9yLCBPYmplY3QgZGF0YSkKLSAgewotICAgIHJldHVybiB2aXNpdG9yLnZpc2l0KHRoaXMsIGRhdGEpOwotICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RCbG9jay5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUQmxvY2suamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjExN2M2NS4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RCbG9jay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZTogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBBU1RCbG9jay5qYXZhICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LmphdmFzY3JpcHQyMHBhcnNlcjsKLQotcHVibGljIGNsYXNzIEFTVEJsb2NrIGV4dGVuZHMgU2ltcGxlTm9kZQotewotICBwdWJsaWMgQVNUQmxvY2soaW50IGlkKQotICB7Ci0gICAgc3VwZXIoaWQpOwotICB9Ci0KLSAgcHVibGljIEFTVEJsb2NrKEpTUGFyc2VyMjAgcCwgaW50IGlkKQotICB7Ci0gICAgc3VwZXIocCwgaWQpOwotICB9Ci0KLQotICAvKiogQWNjZXB0IHRoZSB2aXNpdG9yLiAqKi8KLSAgcHVibGljIE9iamVjdCBqanRBY2NlcHQoSlNQYXJzZXIyMFZpc2l0b3IgdmlzaXRvciwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICByZXR1cm4gdmlzaXRvci52aXNpdCh0aGlzLCBkYXRhKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUQnJlYWtTdGF0ZW1lbnQuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVEJyZWFrU3RhdGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxYjllMDUuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUQnJlYWtTdGF0ZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qIEdlbmVyYXRlZCBCeTpKSlRyZWU6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gQVNUQnJlYWtTdGF0ZW1lbnQuamF2YSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5qYXZhc2NyaXB0MjBwYXJzZXI7Ci0KLXB1YmxpYyBjbGFzcyBBU1RCcmVha1N0YXRlbWVudCBleHRlbmRzIFNpbXBsZU5vZGUKLXsKLSAgcHVibGljIEFTVEJyZWFrU3RhdGVtZW50KGludCBpZCkKLSAgewotICAgIHN1cGVyKGlkKTsKLSAgfQotCi0gIHB1YmxpYyBBU1RCcmVha1N0YXRlbWVudChKU1BhcnNlcjIwIHAsIGludCBpZCkKLSAgewotICAgIHN1cGVyKHAsIGlkKTsKLSAgfQotCi0KLSAgLyoqIEFjY2VwdCB0aGUgdmlzaXRvci4gKiovCi0gIHB1YmxpYyBPYmplY3Qgamp0QWNjZXB0KEpTUGFyc2VyMjBWaXNpdG9yIHZpc2l0b3IsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgcmV0dXJuIHZpc2l0b3IudmlzaXQodGhpcywgZGF0YSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVENhc2VFbGVtZW50LmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RDYXNlRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZThkMjAzLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVENhc2VFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIEFTVENhc2VFbGVtZW50LmphdmEgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuamF2YXNjcmlwdDIwcGFyc2VyOwotCi1wdWJsaWMgY2xhc3MgQVNUQ2FzZUVsZW1lbnQgZXh0ZW5kcyBTaW1wbGVOb2RlCi17Ci0gIHB1YmxpYyBBU1RDYXNlRWxlbWVudChpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihpZCk7Ci0gIH0KLQotICBwdWJsaWMgQVNUQ2FzZUVsZW1lbnQoSlNQYXJzZXIyMCBwLCBpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihwLCBpZCk7Ci0gIH0KLQotCi0gIC8qKiBBY2NlcHQgdGhlIHZpc2l0b3IuICoqLwotICBwdWJsaWMgT2JqZWN0IGpqdEFjY2VwdChKU1BhcnNlcjIwVmlzaXRvciB2aXNpdG9yLCBPYmplY3QgZGF0YSkKLSAgewotICAgIHJldHVybiB2aXNpdG9yLnZpc2l0KHRoaXMsIGRhdGEpOwotICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RDYXNlRWxlbWVudHMuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVENhc2VFbGVtZW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYjg4NTk4Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVENhc2VFbGVtZW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZTogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBBU1RDYXNlRWxlbWVudHMuamF2YSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5qYXZhc2NyaXB0MjBwYXJzZXI7Ci0KLXB1YmxpYyBjbGFzcyBBU1RDYXNlRWxlbWVudHMgZXh0ZW5kcyBTaW1wbGVOb2RlCi17Ci0gIHB1YmxpYyBBU1RDYXNlRWxlbWVudHMoaW50IGlkKQotICB7Ci0gICAgc3VwZXIoaWQpOwotICB9Ci0KLSAgcHVibGljIEFTVENhc2VFbGVtZW50cyhKU1BhcnNlcjIwIHAsIGludCBpZCkKLSAgewotICAgIHN1cGVyKHAsIGlkKTsKLSAgfQotCi0KLSAgLyoqIEFjY2VwdCB0aGUgdmlzaXRvci4gKiovCi0gIHB1YmxpYyBPYmplY3Qgamp0QWNjZXB0KEpTUGFyc2VyMjBWaXNpdG9yIHZpc2l0b3IsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgcmV0dXJuIHZpc2l0b3IudmlzaXQodGhpcywgZGF0YSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVENhc2VMYWJlbC5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUQ2FzZUxhYmVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkNWE3NTQuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUQ2FzZUxhYmVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIEFTVENhc2VMYWJlbC5qYXZhICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LmphdmFzY3JpcHQyMHBhcnNlcjsKLQotcHVibGljIGNsYXNzIEFTVENhc2VMYWJlbCBleHRlbmRzIFNpbXBsZU5vZGUKLXsKLSAgcHVibGljIEFTVENhc2VMYWJlbChpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihpZCk7Ci0gIH0KLQotICBwdWJsaWMgQVNUQ2FzZUxhYmVsKEpTUGFyc2VyMjAgcCwgaW50IGlkKQotICB7Ci0gICAgc3VwZXIocCwgaWQpOwotICB9Ci0KLQotICAvKiogQWNjZXB0IHRoZSB2aXNpdG9yLiAqKi8KLSAgcHVibGljIE9iamVjdCBqanRBY2NlcHQoSlNQYXJzZXIyMFZpc2l0b3IgdmlzaXRvciwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICByZXR1cm4gdmlzaXRvci52aXNpdCh0aGlzLCBkYXRhKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUQ2xhc3NEZWZpbml0aW9uLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RDbGFzc0RlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzBlNmEzYS4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RDbGFzc0RlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qIEdlbmVyYXRlZCBCeTpKSlRyZWU6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gQVNUQ2xhc3NEZWZpbml0aW9uLmphdmEgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuamF2YXNjcmlwdDIwcGFyc2VyOwotCi1wdWJsaWMgY2xhc3MgQVNUQ2xhc3NEZWZpbml0aW9uIGV4dGVuZHMgU2ltcGxlTm9kZQotewotICBwdWJsaWMgQVNUQ2xhc3NEZWZpbml0aW9uKGludCBpZCkKLSAgewotICAgIHN1cGVyKGlkKTsKLSAgfQotCi0gIHB1YmxpYyBBU1RDbGFzc0RlZmluaXRpb24oSlNQYXJzZXIyMCBwLCBpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihwLCBpZCk7Ci0gIH0KLQotCi0gIC8qKiBBY2NlcHQgdGhlIHZpc2l0b3IuICoqLwotICBwdWJsaWMgT2JqZWN0IGpqdEFjY2VwdChKU1BhcnNlcjIwVmlzaXRvciB2aXNpdG9yLCBPYmplY3QgZGF0YSkKLSAgewotICAgIHJldHVybiB2aXNpdG9yLnZpc2l0KHRoaXMsIGRhdGEpOwotICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RDb25kaXRpb25hbEV4cHJlc3Npb24uamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVENvbmRpdGlvbmFsRXhwcmVzc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YzY4ZTJjLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVENvbmRpdGlvbmFsRXhwcmVzc2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZTogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBBU1RDb25kaXRpb25hbEV4cHJlc3Npb24uamF2YSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5qYXZhc2NyaXB0MjBwYXJzZXI7Ci0KLXB1YmxpYyBjbGFzcyBBU1RDb25kaXRpb25hbEV4cHJlc3Npb24gZXh0ZW5kcyBTaW1wbGVOb2RlCi17Ci0gIHB1YmxpYyBBU1RDb25kaXRpb25hbEV4cHJlc3Npb24oaW50IGlkKQotICB7Ci0gICAgc3VwZXIoaWQpOwotICB9Ci0KLSAgcHVibGljIEFTVENvbmRpdGlvbmFsRXhwcmVzc2lvbihKU1BhcnNlcjIwIHAsIGludCBpZCkKLSAgewotICAgIHN1cGVyKHAsIGlkKTsKLSAgfQotCi0KLSAgLyoqIEFjY2VwdCB0aGUgdmlzaXRvci4gKiovCi0gIHB1YmxpYyBPYmplY3Qgamp0QWNjZXB0KEpTUGFyc2VyMjBWaXNpdG9yIHZpc2l0b3IsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgcmV0dXJuIHZpc2l0b3IudmlzaXQodGhpcywgZGF0YSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVENvbmRpdGlvbmFsRXhwcmVzc2lvbk5vSU4uamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVENvbmRpdGlvbmFsRXhwcmVzc2lvbk5vSU4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzc2ZTRlMi4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RDb25kaXRpb25hbEV4cHJlc3Npb25Ob0lOLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIEFTVENvbmRpdGlvbmFsRXhwcmVzc2lvbk5vSU4uamF2YSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5qYXZhc2NyaXB0MjBwYXJzZXI7Ci0KLXB1YmxpYyBjbGFzcyBBU1RDb25kaXRpb25hbEV4cHJlc3Npb25Ob0lOIGV4dGVuZHMgU2ltcGxlTm9kZQotewotICBwdWJsaWMgQVNUQ29uZGl0aW9uYWxFeHByZXNzaW9uTm9JTihpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihpZCk7Ci0gIH0KLQotICBwdWJsaWMgQVNUQ29uZGl0aW9uYWxFeHByZXNzaW9uTm9JTihKU1BhcnNlcjIwIHAsIGludCBpZCkKLSAgewotICAgIHN1cGVyKHAsIGlkKTsKLSAgfQotCi0KLSAgLyoqIEFjY2VwdCB0aGUgdmlzaXRvci4gKiovCi0gIHB1YmxpYyBPYmplY3Qgamp0QWNjZXB0KEpTUGFyc2VyMjBWaXNpdG9yIHZpc2l0b3IsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgcmV0dXJuIHZpc2l0b3IudmlzaXQodGhpcywgZGF0YSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVENvbnRpbnVlU3RhdGVtZW50LmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RDb250aW51ZVN0YXRlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4M2YxOWM0Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVENvbnRpbnVlU3RhdGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIEFTVENvbnRpbnVlU3RhdGVtZW50LmphdmEgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuamF2YXNjcmlwdDIwcGFyc2VyOwotCi1wdWJsaWMgY2xhc3MgQVNUQ29udGludWVTdGF0ZW1lbnQgZXh0ZW5kcyBTaW1wbGVOb2RlCi17Ci0gIHB1YmxpYyBBU1RDb250aW51ZVN0YXRlbWVudChpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihpZCk7Ci0gIH0KLQotICBwdWJsaWMgQVNUQ29udGludWVTdGF0ZW1lbnQoSlNQYXJzZXIyMCBwLCBpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihwLCBpZCk7Ci0gIH0KLQotCi0gIC8qKiBBY2NlcHQgdGhlIHZpc2l0b3IuICoqLwotICBwdWJsaWMgT2JqZWN0IGpqdEFjY2VwdChKU1BhcnNlcjIwVmlzaXRvciB2aXNpdG9yLCBPYmplY3QgZGF0YSkKLSAgewotICAgIHJldHVybiB2aXNpdG9yLnZpc2l0KHRoaXMsIGRhdGEpOwotICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1REaXJlY3RpdmUuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVERpcmVjdGl2ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MTMzMTMzLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVERpcmVjdGl2ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZTogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBBU1REaXJlY3RpdmUuamF2YSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5qYXZhc2NyaXB0MjBwYXJzZXI7Ci0KLXB1YmxpYyBjbGFzcyBBU1REaXJlY3RpdmUgZXh0ZW5kcyBTaW1wbGVOb2RlCi17Ci0gIHB1YmxpYyBBU1REaXJlY3RpdmUoaW50IGlkKQotICB7Ci0gICAgc3VwZXIoaWQpOwotICB9Ci0KLSAgcHVibGljIEFTVERpcmVjdGl2ZShKU1BhcnNlcjIwIHAsIGludCBpZCkKLSAgewotICAgIHN1cGVyKHAsIGlkKTsKLSAgfQotCi0KLSAgLyoqIEFjY2VwdCB0aGUgdmlzaXRvci4gKiovCi0gIHB1YmxpYyBPYmplY3Qgamp0QWNjZXB0KEpTUGFyc2VyMjBWaXNpdG9yIHZpc2l0b3IsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgcmV0dXJuIHZpc2l0b3IudmlzaXQodGhpcywgZGF0YSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVERpcmVjdGl2ZXMuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVERpcmVjdGl2ZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzdkOGExNy4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1REaXJlY3RpdmVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIEFTVERpcmVjdGl2ZXMuamF2YSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5qYXZhc2NyaXB0MjBwYXJzZXI7Ci0KLXB1YmxpYyBjbGFzcyBBU1REaXJlY3RpdmVzIGV4dGVuZHMgU2ltcGxlTm9kZQotewotICBwdWJsaWMgQVNURGlyZWN0aXZlcyhpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihpZCk7Ci0gIH0KLQotICBwdWJsaWMgQVNURGlyZWN0aXZlcyhKU1BhcnNlcjIwIHAsIGludCBpZCkKLSAgewotICAgIHN1cGVyKHAsIGlkKTsKLSAgfQotCi0KLSAgLyoqIEFjY2VwdCB0aGUgdmlzaXRvci4gKiovCi0gIHB1YmxpYyBPYmplY3Qgamp0QWNjZXB0KEpTUGFyc2VyMjBWaXNpdG9yIHZpc2l0b3IsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgcmV0dXJuIHZpc2l0b3IudmlzaXQodGhpcywgZGF0YSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVERvU3RhdGVtZW50LmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1REb1N0YXRlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OTI2NzRhLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVERvU3RhdGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIEFTVERvU3RhdGVtZW50LmphdmEgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuamF2YXNjcmlwdDIwcGFyc2VyOwotCi1wdWJsaWMgY2xhc3MgQVNURG9TdGF0ZW1lbnQgZXh0ZW5kcyBTaW1wbGVOb2RlCi17Ci0gIHB1YmxpYyBBU1REb1N0YXRlbWVudChpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihpZCk7Ci0gIH0KLQotICBwdWJsaWMgQVNURG9TdGF0ZW1lbnQoSlNQYXJzZXIyMCBwLCBpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihwLCBpZCk7Ci0gIH0KLQotCi0gIC8qKiBBY2NlcHQgdGhlIHZpc2l0b3IuICoqLwotICBwdWJsaWMgT2JqZWN0IGpqdEFjY2VwdChKU1BhcnNlcjIwVmlzaXRvciB2aXNpdG9yLCBPYmplY3QgZGF0YSkKLSAgewotICAgIHJldHVybiB2aXNpdG9yLnZpc2l0KHRoaXMsIGRhdGEpOwotICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RFbGVtZW50TGlzdC5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNURWxlbWVudExpc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGQ2NTdkMy4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RFbGVtZW50TGlzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZTogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBBU1RFbGVtZW50TGlzdC5qYXZhICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LmphdmFzY3JpcHQyMHBhcnNlcjsKLQotcHVibGljIGNsYXNzIEFTVEVsZW1lbnRMaXN0IGV4dGVuZHMgU2ltcGxlTm9kZQotewotICBwdWJsaWMgQVNURWxlbWVudExpc3QoaW50IGlkKQotICB7Ci0gICAgc3VwZXIoaWQpOwotICB9Ci0KLSAgcHVibGljIEFTVEVsZW1lbnRMaXN0KEpTUGFyc2VyMjAgcCwgaW50IGlkKQotICB7Ci0gICAgc3VwZXIocCwgaWQpOwotICB9Ci0KLQotICAvKiogQWNjZXB0IHRoZSB2aXNpdG9yLiAqKi8KLSAgcHVibGljIE9iamVjdCBqanRBY2NlcHQoSlNQYXJzZXIyMFZpc2l0b3IgdmlzaXRvciwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICByZXR1cm4gdmlzaXRvci52aXNpdCh0aGlzLCBkYXRhKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNURW1wdHlTdGF0ZW1lbnQuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVEVtcHR5U3RhdGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjNmJmYmIuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNURW1wdHlTdGF0ZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qIEdlbmVyYXRlZCBCeTpKSlRyZWU6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gQVNURW1wdHlTdGF0ZW1lbnQuamF2YSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5qYXZhc2NyaXB0MjBwYXJzZXI7Ci0KLXB1YmxpYyBjbGFzcyBBU1RFbXB0eVN0YXRlbWVudCBleHRlbmRzIFNpbXBsZU5vZGUKLXsKLSAgcHVibGljIEFTVEVtcHR5U3RhdGVtZW50KGludCBpZCkKLSAgewotICAgIHN1cGVyKGlkKTsKLSAgfQotCi0gIHB1YmxpYyBBU1RFbXB0eVN0YXRlbWVudChKU1BhcnNlcjIwIHAsIGludCBpZCkKLSAgewotICAgIHN1cGVyKHAsIGlkKTsKLSAgfQotCi0KLSAgLyoqIEFjY2VwdCB0aGUgdmlzaXRvci4gKiovCi0gIHB1YmxpYyBPYmplY3Qgamp0QWNjZXB0KEpTUGFyc2VyMjBWaXNpdG9yIHZpc2l0b3IsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgcmV0dXJuIHZpc2l0b3IudmlzaXQodGhpcywgZGF0YSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVEVvbENvbW1lbnRTa2lwV3MuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVEVvbENvbW1lbnRTa2lwV3MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzVlMjBjNS4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RFb2xDb21tZW50U2tpcFdzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIEFTVEVvbENvbW1lbnRTa2lwV3MuamF2YSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5qYXZhc2NyaXB0MjBwYXJzZXI7Ci0KLXB1YmxpYyBjbGFzcyBBU1RFb2xDb21tZW50U2tpcFdzIGV4dGVuZHMgU2ltcGxlTm9kZQotewotICBwdWJsaWMgQVNURW9sQ29tbWVudFNraXBXcyhpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihpZCk7Ci0gIH0KLQotICBwdWJsaWMgQVNURW9sQ29tbWVudFNraXBXcyhKU1BhcnNlcjIwIHAsIGludCBpZCkKLSAgewotICAgIHN1cGVyKHAsIGlkKTsKLSAgfQotCi0KLSAgLyoqIEFjY2VwdCB0aGUgdmlzaXRvci4gKiovCi0gIHB1YmxpYyBPYmplY3Qgamp0QWNjZXB0KEpTUGFyc2VyMjBWaXNpdG9yIHZpc2l0b3IsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgcmV0dXJuIHZpc2l0b3IudmlzaXQodGhpcywgZGF0YSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVEVxdWFsT3AuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVEVxdWFsT3AuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwOGI1MC4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RFcXVhbE9wLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIEFTVEVxdWFsT3AuamF2YSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5qYXZhc2NyaXB0MjBwYXJzZXI7Ci0KLXB1YmxpYyBjbGFzcyBBU1RFcXVhbE9wIGV4dGVuZHMgU2ltcGxlTm9kZQotewotICBwdWJsaWMgQVNURXF1YWxPcChpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihpZCk7Ci0gIH0KLQotICBwdWJsaWMgQVNURXF1YWxPcChKU1BhcnNlcjIwIHAsIGludCBpZCkKLSAgewotICAgIHN1cGVyKHAsIGlkKTsKLSAgfQotCi0KLSAgLyoqIEFjY2VwdCB0aGUgdmlzaXRvci4gKiovCi0gIHB1YmxpYyBPYmplY3Qgamp0QWNjZXB0KEpTUGFyc2VyMjBWaXNpdG9yIHZpc2l0b3IsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgcmV0dXJuIHZpc2l0b3IudmlzaXQodGhpcywgZGF0YSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVEVxdWFsaXR5RXhwcmVzc2lvbi5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNURXF1YWxpdHlFeHByZXNzaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlYzE4NGEuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNURXF1YWxpdHlFeHByZXNzaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIEFTVEVxdWFsaXR5RXhwcmVzc2lvbi5qYXZhICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LmphdmFzY3JpcHQyMHBhcnNlcjsKLQotcHVibGljIGNsYXNzIEFTVEVxdWFsaXR5RXhwcmVzc2lvbiBleHRlbmRzIFNpbXBsZU5vZGUKLXsKLSAgcHVibGljIEFTVEVxdWFsaXR5RXhwcmVzc2lvbihpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihpZCk7Ci0gIH0KLQotICBwdWJsaWMgQVNURXF1YWxpdHlFeHByZXNzaW9uKEpTUGFyc2VyMjAgcCwgaW50IGlkKQotICB7Ci0gICAgc3VwZXIocCwgaWQpOwotICB9Ci0KLQotICAvKiogQWNjZXB0IHRoZSB2aXNpdG9yLiAqKi8KLSAgcHVibGljIE9iamVjdCBqanRBY2NlcHQoSlNQYXJzZXIyMFZpc2l0b3IgdmlzaXRvciwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICByZXR1cm4gdmlzaXRvci52aXNpdCh0aGlzLCBkYXRhKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNURXF1YWxpdHlFeHByZXNzaW9uTm9JTi5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNURXF1YWxpdHlFeHByZXNzaW9uTm9JTi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNmE0NzA4Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVEVxdWFsaXR5RXhwcmVzc2lvbk5vSU4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qIEdlbmVyYXRlZCBCeTpKSlRyZWU6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gQVNURXF1YWxpdHlFeHByZXNzaW9uTm9JTi5qYXZhICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LmphdmFzY3JpcHQyMHBhcnNlcjsKLQotcHVibGljIGNsYXNzIEFTVEVxdWFsaXR5RXhwcmVzc2lvbk5vSU4gZXh0ZW5kcyBTaW1wbGVOb2RlCi17Ci0gIHB1YmxpYyBBU1RFcXVhbGl0eUV4cHJlc3Npb25Ob0lOKGludCBpZCkKLSAgewotICAgIHN1cGVyKGlkKTsKLSAgfQotCi0gIHB1YmxpYyBBU1RFcXVhbGl0eUV4cHJlc3Npb25Ob0lOKEpTUGFyc2VyMjAgcCwgaW50IGlkKQotICB7Ci0gICAgc3VwZXIocCwgaWQpOwotICB9Ci0KLQotICAvKiogQWNjZXB0IHRoZSB2aXNpdG9yLiAqKi8KLSAgcHVibGljIE9iamVjdCBqanRBY2NlcHQoSlNQYXJzZXIyMFZpc2l0b3IgdmlzaXRvciwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICByZXR1cm4gdmlzaXRvci52aXNpdCh0aGlzLCBkYXRhKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNURXhwb3J0QmluZGluZy5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNURXhwb3J0QmluZGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYzNmMGFmLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVEV4cG9ydEJpbmRpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qIEdlbmVyYXRlZCBCeTpKSlRyZWU6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gQVNURXhwb3J0QmluZGluZy5qYXZhICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LmphdmFzY3JpcHQyMHBhcnNlcjsKLQotcHVibGljIGNsYXNzIEFTVEV4cG9ydEJpbmRpbmcgZXh0ZW5kcyBTaW1wbGVOb2RlCi17Ci0gIHB1YmxpYyBBU1RFeHBvcnRCaW5kaW5nKGludCBpZCkKLSAgewotICAgIHN1cGVyKGlkKTsKLSAgfQotCi0gIHB1YmxpYyBBU1RFeHBvcnRCaW5kaW5nKEpTUGFyc2VyMjAgcCwgaW50IGlkKQotICB7Ci0gICAgc3VwZXIocCwgaWQpOwotICB9Ci0KLQotICAvKiogQWNjZXB0IHRoZSB2aXNpdG9yLiAqKi8KLSAgcHVibGljIE9iamVjdCBqanRBY2NlcHQoSlNQYXJzZXIyMFZpc2l0b3IgdmlzaXRvciwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICByZXR1cm4gdmlzaXRvci52aXNpdCh0aGlzLCBkYXRhKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNURXhwb3J0QmluZGluZ0xpc3QuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVEV4cG9ydEJpbmRpbmdMaXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5OGRiY2EuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNURXhwb3J0QmluZGluZ0xpc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qIEdlbmVyYXRlZCBCeTpKSlRyZWU6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gQVNURXhwb3J0QmluZGluZ0xpc3QuamF2YSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5qYXZhc2NyaXB0MjBwYXJzZXI7Ci0KLXB1YmxpYyBjbGFzcyBBU1RFeHBvcnRCaW5kaW5nTGlzdCBleHRlbmRzIFNpbXBsZU5vZGUKLXsKLSAgcHVibGljIEFTVEV4cG9ydEJpbmRpbmdMaXN0KGludCBpZCkKLSAgewotICAgIHN1cGVyKGlkKTsKLSAgfQotCi0gIHB1YmxpYyBBU1RFeHBvcnRCaW5kaW5nTGlzdChKU1BhcnNlcjIwIHAsIGludCBpZCkKLSAgewotICAgIHN1cGVyKHAsIGlkKTsKLSAgfQotCi0KLSAgLyoqIEFjY2VwdCB0aGUgdmlzaXRvci4gKiovCi0gIHB1YmxpYyBPYmplY3Qgamp0QWNjZXB0KEpTUGFyc2VyMjBWaXNpdG9yIHZpc2l0b3IsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgcmV0dXJuIHZpc2l0b3IudmlzaXQodGhpcywgZGF0YSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVEV4cG9ydERlZmluaXRpb24uamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVEV4cG9ydERlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDAzYTYzOC4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RFeHBvcnREZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIEFTVEV4cG9ydERlZmluaXRpb24uamF2YSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5qYXZhc2NyaXB0MjBwYXJzZXI7Ci0KLXB1YmxpYyBjbGFzcyBBU1RFeHBvcnREZWZpbml0aW9uIGV4dGVuZHMgU2ltcGxlTm9kZQotewotICBwdWJsaWMgQVNURXhwb3J0RGVmaW5pdGlvbihpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihpZCk7Ci0gIH0KLQotICBwdWJsaWMgQVNURXhwb3J0RGVmaW5pdGlvbihKU1BhcnNlcjIwIHAsIGludCBpZCkKLSAgewotICAgIHN1cGVyKHAsIGlkKTsKLSAgfQotCi0KLSAgLyoqIEFjY2VwdCB0aGUgdmlzaXRvci4gKiovCi0gIHB1YmxpYyBPYmplY3Qgamp0QWNjZXB0KEpTUGFyc2VyMjBWaXNpdG9yIHZpc2l0b3IsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgcmV0dXJuIHZpc2l0b3IudmlzaXQodGhpcywgZGF0YSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVEV4cHJlc3Npb25RdWFsaWZpZWRJZGVudGlmaWVyLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RFeHByZXNzaW9uUXVhbGlmaWVkSWRlbnRpZmllci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNmQzYzVmLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVEV4cHJlc3Npb25RdWFsaWZpZWRJZGVudGlmaWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIEFTVEV4cHJlc3Npb25RdWFsaWZpZWRJZGVudGlmaWVyLmphdmEgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuamF2YXNjcmlwdDIwcGFyc2VyOwotCi1wdWJsaWMgY2xhc3MgQVNURXhwcmVzc2lvblF1YWxpZmllZElkZW50aWZpZXIgZXh0ZW5kcyBTaW1wbGVOb2RlCi17Ci0gIHB1YmxpYyBBU1RFeHByZXNzaW9uUXVhbGlmaWVkSWRlbnRpZmllcihpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihpZCk7Ci0gIH0KLQotICBwdWJsaWMgQVNURXhwcmVzc2lvblF1YWxpZmllZElkZW50aWZpZXIoSlNQYXJzZXIyMCBwLCBpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihwLCBpZCk7Ci0gIH0KLQotCi0gIC8qKiBBY2NlcHQgdGhlIHZpc2l0b3IuICoqLwotICBwdWJsaWMgT2JqZWN0IGpqdEFjY2VwdChKU1BhcnNlcjIwVmlzaXRvciB2aXNpdG9yLCBPYmplY3QgZGF0YSkKLSAgewotICAgIHJldHVybiB2aXNpdG9yLnZpc2l0KHRoaXMsIGRhdGEpOwotICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RFeHByZXNzaW9uU3RhdGVtZW50LmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RFeHByZXNzaW9uU3RhdGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlNzdlNDYuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNURXhwcmVzc2lvblN0YXRlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZTogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBBU1RFeHByZXNzaW9uU3RhdGVtZW50LmphdmEgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuamF2YXNjcmlwdDIwcGFyc2VyOwotCi1wdWJsaWMgY2xhc3MgQVNURXhwcmVzc2lvblN0YXRlbWVudCBleHRlbmRzIFNpbXBsZU5vZGUKLXsKLSAgcHVibGljIEFTVEV4cHJlc3Npb25TdGF0ZW1lbnQoaW50IGlkKQotICB7Ci0gICAgc3VwZXIoaWQpOwotICB9Ci0KLSAgcHVibGljIEFTVEV4cHJlc3Npb25TdGF0ZW1lbnQoSlNQYXJzZXIyMCBwLCBpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihwLCBpZCk7Ci0gIH0KLQotCi0gIC8qKiBBY2NlcHQgdGhlIHZpc2l0b3IuICoqLwotICBwdWJsaWMgT2JqZWN0IGpqdEFjY2VwdChKU1BhcnNlcjIwVmlzaXRvciB2aXNpdG9yLCBPYmplY3QgZGF0YSkKLSAgewotICAgIHJldHVybiB2aXNpdG9yLnZpc2l0KHRoaXMsIGRhdGEpOwotICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RGaWVsZExpc3QuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVEZpZWxkTGlzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjE4MjcxLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVEZpZWxkTGlzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZTogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBBU1RGaWVsZExpc3QuamF2YSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5qYXZhc2NyaXB0MjBwYXJzZXI7Ci0KLXB1YmxpYyBjbGFzcyBBU1RGaWVsZExpc3QgZXh0ZW5kcyBTaW1wbGVOb2RlCi17Ci0gIHB1YmxpYyBBU1RGaWVsZExpc3QoaW50IGlkKQotICB7Ci0gICAgc3VwZXIoaWQpOwotICB9Ci0KLSAgcHVibGljIEFTVEZpZWxkTGlzdChKU1BhcnNlcjIwIHAsIGludCBpZCkKLSAgewotICAgIHN1cGVyKHAsIGlkKTsKLSAgfQotCi0KLSAgLyoqIEFjY2VwdCB0aGUgdmlzaXRvci4gKiovCi0gIHB1YmxpYyBPYmplY3Qgamp0QWNjZXB0KEpTUGFyc2VyMjBWaXNpdG9yIHZpc2l0b3IsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgcmV0dXJuIHZpc2l0b3IudmlzaXQodGhpcywgZGF0YSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVEZpZWxkTmFtZS5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNURmllbGROYW1lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxYmQ1NDEuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNURmllbGROYW1lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIEFTVEZpZWxkTmFtZS5qYXZhICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LmphdmFzY3JpcHQyMHBhcnNlcjsKLQotcHVibGljIGNsYXNzIEFTVEZpZWxkTmFtZSBleHRlbmRzIFNpbXBsZU5vZGUKLXsKLSAgcHVibGljIEFTVEZpZWxkTmFtZShpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihpZCk7Ci0gIH0KLQotICBwdWJsaWMgQVNURmllbGROYW1lKEpTUGFyc2VyMjAgcCwgaW50IGlkKQotICB7Ci0gICAgc3VwZXIocCwgaWQpOwotICB9Ci0KLQotICAvKiogQWNjZXB0IHRoZSB2aXNpdG9yLiAqKi8KLSAgcHVibGljIE9iamVjdCBqanRBY2NlcHQoSlNQYXJzZXIyMFZpc2l0b3IgdmlzaXRvciwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICByZXR1cm4gdmlzaXRvci52aXNpdCh0aGlzLCBkYXRhKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNURm9ySW5CaW5kaW5nLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RGb3JJbkJpbmRpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2YzMzEyOS4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RGb3JJbkJpbmRpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qIEdlbmVyYXRlZCBCeTpKSlRyZWU6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gQVNURm9ySW5CaW5kaW5nLmphdmEgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuamF2YXNjcmlwdDIwcGFyc2VyOwotCi1wdWJsaWMgY2xhc3MgQVNURm9ySW5CaW5kaW5nIGV4dGVuZHMgU2ltcGxlTm9kZQotewotICBwdWJsaWMgQVNURm9ySW5CaW5kaW5nKGludCBpZCkKLSAgewotICAgIHN1cGVyKGlkKTsKLSAgfQotCi0gIHB1YmxpYyBBU1RGb3JJbkJpbmRpbmcoSlNQYXJzZXIyMCBwLCBpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihwLCBpZCk7Ci0gIH0KLQotCi0gIC8qKiBBY2NlcHQgdGhlIHZpc2l0b3IuICoqLwotICBwdWJsaWMgT2JqZWN0IGpqdEFjY2VwdChKU1BhcnNlcjIwVmlzaXRvciB2aXNpdG9yLCBPYmplY3QgZGF0YSkKLSAgewotICAgIHJldHVybiB2aXNpdG9yLnZpc2l0KHRoaXMsIGRhdGEpOwotICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RGb3JJbml0aWFsaXplci5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNURm9ySW5pdGlhbGl6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzlkZDg2Yi4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RGb3JJbml0aWFsaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZTogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBBU1RGb3JJbml0aWFsaXplci5qYXZhICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LmphdmFzY3JpcHQyMHBhcnNlcjsKLQotcHVibGljIGNsYXNzIEFTVEZvckluaXRpYWxpemVyIGV4dGVuZHMgU2ltcGxlTm9kZQotewotICBwdWJsaWMgQVNURm9ySW5pdGlhbGl6ZXIoaW50IGlkKQotICB7Ci0gICAgc3VwZXIoaWQpOwotICB9Ci0KLSAgcHVibGljIEFTVEZvckluaXRpYWxpemVyKEpTUGFyc2VyMjAgcCwgaW50IGlkKQotICB7Ci0gICAgc3VwZXIocCwgaWQpOwotICB9Ci0KLQotICAvKiogQWNjZXB0IHRoZSB2aXNpdG9yLiAqKi8KLSAgcHVibGljIE9iamVjdCBqanRBY2NlcHQoSlNQYXJzZXIyMFZpc2l0b3IgdmlzaXRvciwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICByZXR1cm4gdmlzaXRvci52aXNpdCh0aGlzLCBkYXRhKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNURm9yU3RhdGVtZW50LmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RGb3JTdGF0ZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDk5OTFkOS4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RGb3JTdGF0ZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qIEdlbmVyYXRlZCBCeTpKSlRyZWU6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gQVNURm9yU3RhdGVtZW50LmphdmEgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuamF2YXNjcmlwdDIwcGFyc2VyOwotCi1wdWJsaWMgY2xhc3MgQVNURm9yU3RhdGVtZW50IGV4dGVuZHMgU2ltcGxlTm9kZQotewotICBwdWJsaWMgQVNURm9yU3RhdGVtZW50KGludCBpZCkKLSAgewotICAgIHN1cGVyKGlkKTsKLSAgfQotCi0gIHB1YmxpYyBBU1RGb3JTdGF0ZW1lbnQoSlNQYXJzZXIyMCBwLCBpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihwLCBpZCk7Ci0gIH0KLQotCi0gIC8qKiBBY2NlcHQgdGhlIHZpc2l0b3IuICoqLwotICBwdWJsaWMgT2JqZWN0IGpqdEFjY2VwdChKU1BhcnNlcjIwVmlzaXRvciB2aXNpdG9yLCBPYmplY3QgZGF0YSkKLSAgewotICAgIHJldHVybiB2aXNpdG9yLnZpc2l0KHRoaXMsIGRhdGEpOwotICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RGdWxsTmV3RXhwcmVzc2lvbi5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNURnVsbE5ld0V4cHJlc3Npb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGQ1NTliMC4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RGdWxsTmV3RXhwcmVzc2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZTogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBBU1RGdWxsTmV3RXhwcmVzc2lvbi5qYXZhICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LmphdmFzY3JpcHQyMHBhcnNlcjsKLQotcHVibGljIGNsYXNzIEFTVEZ1bGxOZXdFeHByZXNzaW9uIGV4dGVuZHMgU2ltcGxlTm9kZQotewotICBwdWJsaWMgQVNURnVsbE5ld0V4cHJlc3Npb24oaW50IGlkKQotICB7Ci0gICAgc3VwZXIoaWQpOwotICB9Ci0KLSAgcHVibGljIEFTVEZ1bGxOZXdFeHByZXNzaW9uKEpTUGFyc2VyMjAgcCwgaW50IGlkKQotICB7Ci0gICAgc3VwZXIocCwgaWQpOwotICB9Ci0KLQotICAvKiogQWNjZXB0IHRoZSB2aXNpdG9yLiAqKi8KLSAgcHVibGljIE9iamVjdCBqanRBY2NlcHQoSlNQYXJzZXIyMFZpc2l0b3IgdmlzaXRvciwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICByZXR1cm4gdmlzaXRvci52aXNpdCh0aGlzLCBkYXRhKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNURnVsbE5ld1N1YmV4cHJlc3Npb24uamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVEZ1bGxOZXdTdWJleHByZXNzaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiODBiNGQuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNURnVsbE5ld1N1YmV4cHJlc3Npb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qIEdlbmVyYXRlZCBCeTpKSlRyZWU6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gQVNURnVsbE5ld1N1YmV4cHJlc3Npb24uamF2YSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5qYXZhc2NyaXB0MjBwYXJzZXI7Ci0KLXB1YmxpYyBjbGFzcyBBU1RGdWxsTmV3U3ViZXhwcmVzc2lvbiBleHRlbmRzIFNpbXBsZU5vZGUKLXsKLSAgcHVibGljIEFTVEZ1bGxOZXdTdWJleHByZXNzaW9uKGludCBpZCkKLSAgewotICAgIHN1cGVyKGlkKTsKLSAgfQotCi0gIHB1YmxpYyBBU1RGdWxsTmV3U3ViZXhwcmVzc2lvbihKU1BhcnNlcjIwIHAsIGludCBpZCkKLSAgewotICAgIHN1cGVyKHAsIGlkKTsKLSAgfQotCi0KLSAgLyoqIEFjY2VwdCB0aGUgdmlzaXRvci4gKiovCi0gIHB1YmxpYyBPYmplY3Qgamp0QWNjZXB0KEpTUGFyc2VyMjBWaXNpdG9yIHZpc2l0b3IsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgcmV0dXJuIHZpc2l0b3IudmlzaXQodGhpcywgZGF0YSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVEZ1bGxQb3N0Zml4RXhwcmVzc2lvbi5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNURnVsbFBvc3RmaXhFeHByZXNzaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjYmE5MDQuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNURnVsbFBvc3RmaXhFeHByZXNzaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIEFTVEZ1bGxQb3N0Zml4RXhwcmVzc2lvbi5qYXZhICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LmphdmFzY3JpcHQyMHBhcnNlcjsKLQotcHVibGljIGNsYXNzIEFTVEZ1bGxQb3N0Zml4RXhwcmVzc2lvbiBleHRlbmRzIFNpbXBsZU5vZGUKLXsKLSAgcHVibGljIEFTVEZ1bGxQb3N0Zml4RXhwcmVzc2lvbihpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihpZCk7Ci0gIH0KLQotICBwdWJsaWMgQVNURnVsbFBvc3RmaXhFeHByZXNzaW9uKEpTUGFyc2VyMjAgcCwgaW50IGlkKQotICB7Ci0gICAgc3VwZXIocCwgaWQpOwotICB9Ci0KLQotICAvKiogQWNjZXB0IHRoZSB2aXNpdG9yLiAqKi8KLSAgcHVibGljIE9iamVjdCBqanRBY2NlcHQoSlNQYXJzZXIyMFZpc2l0b3IgdmlzaXRvciwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICByZXR1cm4gdmlzaXRvci52aXNpdCh0aGlzLCBkYXRhKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNURnVuY3Rpb25Db21tb24uamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVEZ1bmN0aW9uQ29tbW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmOTA2NDkuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNURnVuY3Rpb25Db21tb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qIEdlbmVyYXRlZCBCeTpKSlRyZWU6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gQVNURnVuY3Rpb25Db21tb24uamF2YSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5qYXZhc2NyaXB0MjBwYXJzZXI7Ci0KLXB1YmxpYyBjbGFzcyBBU1RGdW5jdGlvbkNvbW1vbiBleHRlbmRzIFNpbXBsZU5vZGUKLXsKLSAgcHVibGljIEFTVEZ1bmN0aW9uQ29tbW9uKGludCBpZCkKLSAgewotICAgIHN1cGVyKGlkKTsKLSAgfQotCi0gIHB1YmxpYyBBU1RGdW5jdGlvbkNvbW1vbihKU1BhcnNlcjIwIHAsIGludCBpZCkKLSAgewotICAgIHN1cGVyKHAsIGlkKTsKLSAgfQotCi0KLSAgLyoqIEFjY2VwdCB0aGUgdmlzaXRvci4gKiovCi0gIHB1YmxpYyBPYmplY3Qgamp0QWNjZXB0KEpTUGFyc2VyMjBWaXNpdG9yIHZpc2l0b3IsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgcmV0dXJuIHZpc2l0b3IudmlzaXQodGhpcywgZGF0YSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVEZ1bmN0aW9uQ29uc3RydWN0b3IuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVEZ1bmN0aW9uQ29uc3RydWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjExODEyOC4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RGdW5jdGlvbkNvbnN0cnVjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIEFTVEZ1bmN0aW9uQ29uc3RydWN0b3IuamF2YSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5qYXZhc2NyaXB0MjBwYXJzZXI7Ci0KLXB1YmxpYyBjbGFzcyBBU1RGdW5jdGlvbkNvbnN0cnVjdG9yIGV4dGVuZHMgU2ltcGxlTm9kZQotewotICBwdWJsaWMgQVNURnVuY3Rpb25Db25zdHJ1Y3RvcihpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihpZCk7Ci0gIH0KLQotICBwdWJsaWMgQVNURnVuY3Rpb25Db25zdHJ1Y3RvcihKU1BhcnNlcjIwIHAsIGludCBpZCkKLSAgewotICAgIHN1cGVyKHAsIGlkKTsKLSAgfQotCi0KLSAgLyoqIEFjY2VwdCB0aGUgdmlzaXRvci4gKiovCi0gIHB1YmxpYyBPYmplY3Qgamp0QWNjZXB0KEpTUGFyc2VyMjBWaXNpdG9yIHZpc2l0b3IsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgcmV0dXJuIHZpc2l0b3IudmlzaXQodGhpcywgZGF0YSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVEZ1bmN0aW9uRGVmaW5pdGlvbi5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNURnVuY3Rpb25EZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2Y2I4ZWEuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNURnVuY3Rpb25EZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIEFTVEZ1bmN0aW9uRGVmaW5pdGlvbi5qYXZhICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LmphdmFzY3JpcHQyMHBhcnNlcjsKLQotcHVibGljIGNsYXNzIEFTVEZ1bmN0aW9uRGVmaW5pdGlvbiBleHRlbmRzIFNpbXBsZU5vZGUKLXsKLSAgcHVibGljIEFTVEZ1bmN0aW9uRGVmaW5pdGlvbihpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihpZCk7Ci0gIH0KLQotICBwdWJsaWMgQVNURnVuY3Rpb25EZWZpbml0aW9uKEpTUGFyc2VyMjAgcCwgaW50IGlkKQotICB7Ci0gICAgc3VwZXIocCwgaWQpOwotICB9Ci0KLQotICAvKiogQWNjZXB0IHRoZSB2aXNpdG9yLiAqKi8KLSAgcHVibGljIE9iamVjdCBqanRBY2NlcHQoSlNQYXJzZXIyMFZpc2l0b3IgdmlzaXRvciwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICByZXR1cm4gdmlzaXRvci52aXNpdCh0aGlzLCBkYXRhKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNURnVuY3Rpb25FeHByZXNzaW9uLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RGdW5jdGlvbkV4cHJlc3Npb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWI4MzczOS4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RGdW5jdGlvbkV4cHJlc3Npb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qIEdlbmVyYXRlZCBCeTpKSlRyZWU6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gQVNURnVuY3Rpb25FeHByZXNzaW9uLmphdmEgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuamF2YXNjcmlwdDIwcGFyc2VyOwotCi1wdWJsaWMgY2xhc3MgQVNURnVuY3Rpb25FeHByZXNzaW9uIGV4dGVuZHMgU2ltcGxlTm9kZQotewotICBwdWJsaWMgQVNURnVuY3Rpb25FeHByZXNzaW9uKGludCBpZCkKLSAgewotICAgIHN1cGVyKGlkKTsKLSAgfQotCi0gIHB1YmxpYyBBU1RGdW5jdGlvbkV4cHJlc3Npb24oSlNQYXJzZXIyMCBwLCBpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihwLCBpZCk7Ci0gIH0KLQotCi0gIC8qKiBBY2NlcHQgdGhlIHZpc2l0b3IuICoqLwotICBwdWJsaWMgT2JqZWN0IGpqdEFjY2VwdChKU1BhcnNlcjIwVmlzaXRvciB2aXNpdG9yLCBPYmplY3QgZGF0YSkKLSAgewotICAgIHJldHVybiB2aXNpdG9yLnZpc2l0KHRoaXMsIGRhdGEpOwotICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RGdW5jdGlvbk5hbWUuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVEZ1bmN0aW9uTmFtZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYzIzNTMzLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVEZ1bmN0aW9uTmFtZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZTogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBBU1RGdW5jdGlvbk5hbWUuamF2YSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5qYXZhc2NyaXB0MjBwYXJzZXI7Ci0KLXB1YmxpYyBjbGFzcyBBU1RGdW5jdGlvbk5hbWUgZXh0ZW5kcyBTaW1wbGVOb2RlCi17Ci0gIHB1YmxpYyBBU1RGdW5jdGlvbk5hbWUoaW50IGlkKQotICB7Ci0gICAgc3VwZXIoaWQpOwotICB9Ci0KLSAgcHVibGljIEFTVEZ1bmN0aW9uTmFtZShKU1BhcnNlcjIwIHAsIGludCBpZCkKLSAgewotICAgIHN1cGVyKHAsIGlkKTsKLSAgfQotCi0KLSAgLyoqIEFjY2VwdCB0aGUgdmlzaXRvci4gKiovCi0gIHB1YmxpYyBPYmplY3Qgamp0QWNjZXB0KEpTUGFyc2VyMjBWaXNpdG9yIHZpc2l0b3IsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgcmV0dXJuIHZpc2l0b3IudmlzaXQodGhpcywgZGF0YSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVElkZW50aWZpZXIuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVElkZW50aWZpZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDFlYjZjMC4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RJZGVudGlmaWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIEFTVElkZW50aWZpZXIuamF2YSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5qYXZhc2NyaXB0MjBwYXJzZXI7Ci0KLXB1YmxpYyBjbGFzcyBBU1RJZGVudGlmaWVyIGV4dGVuZHMgU2ltcGxlTm9kZQotewotICBwdWJsaWMgQVNUSWRlbnRpZmllcihpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihpZCk7Ci0gIH0KLQotICBwdWJsaWMgQVNUSWRlbnRpZmllcihKU1BhcnNlcjIwIHAsIGludCBpZCkKLSAgewotICAgIHN1cGVyKHAsIGlkKTsKLSAgfQotCi0KLSAgLyoqIEFjY2VwdCB0aGUgdmlzaXRvci4gKiovCi0gIHB1YmxpYyBPYmplY3Qgamp0QWNjZXB0KEpTUGFyc2VyMjBWaXNpdG9yIHZpc2l0b3IsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgcmV0dXJuIHZpc2l0b3IudmlzaXQodGhpcywgZGF0YSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVElmU3RhdGVtZW50LmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RJZlN0YXRlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzN2QwNTExLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVElmU3RhdGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIEFTVElmU3RhdGVtZW50LmphdmEgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuamF2YXNjcmlwdDIwcGFyc2VyOwotCi1wdWJsaWMgY2xhc3MgQVNUSWZTdGF0ZW1lbnQgZXh0ZW5kcyBTaW1wbGVOb2RlCi17Ci0gIHB1YmxpYyBBU1RJZlN0YXRlbWVudChpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihpZCk7Ci0gIH0KLQotICBwdWJsaWMgQVNUSWZTdGF0ZW1lbnQoSlNQYXJzZXIyMCBwLCBpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihwLCBpZCk7Ci0gIH0KLQotCi0gIC8qKiBBY2NlcHQgdGhlIHZpc2l0b3IuICoqLwotICBwdWJsaWMgT2JqZWN0IGpqdEFjY2VwdChKU1BhcnNlcjIwVmlzaXRvciB2aXNpdG9yLCBPYmplY3QgZGF0YSkKLSAgewotICAgIHJldHVybiB2aXNpdG9yLnZpc2l0KHRoaXMsIGRhdGEpOwotICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RJbXBvcnREaXJlY3RpdmUuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVEltcG9ydERpcmVjdGl2ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzU1OWQwLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVEltcG9ydERpcmVjdGl2ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZTogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBBU1RJbXBvcnREaXJlY3RpdmUuamF2YSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5qYXZhc2NyaXB0MjBwYXJzZXI7Ci0KLXB1YmxpYyBjbGFzcyBBU1RJbXBvcnREaXJlY3RpdmUgZXh0ZW5kcyBTaW1wbGVOb2RlCi17Ci0gIHB1YmxpYyBBU1RJbXBvcnREaXJlY3RpdmUoaW50IGlkKQotICB7Ci0gICAgc3VwZXIoaWQpOwotICB9Ci0KLSAgcHVibGljIEFTVEltcG9ydERpcmVjdGl2ZShKU1BhcnNlcjIwIHAsIGludCBpZCkKLSAgewotICAgIHN1cGVyKHAsIGlkKTsKLSAgfQotCi0KLSAgLyoqIEFjY2VwdCB0aGUgdmlzaXRvci4gKiovCi0gIHB1YmxpYyBPYmplY3Qgamp0QWNjZXB0KEpTUGFyc2VyMjBWaXNpdG9yIHZpc2l0b3IsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgcmV0dXJuIHZpc2l0b3IudmlzaXQodGhpcywgZGF0YSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVEluY2x1ZGVEaXJlY3RpdmUuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVEluY2x1ZGVEaXJlY3RpdmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODU2YTBmMC4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RJbmNsdWRlRGlyZWN0aXZlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIEFTVEluY2x1ZGVEaXJlY3RpdmUuamF2YSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5qYXZhc2NyaXB0MjBwYXJzZXI7Ci0KLXB1YmxpYyBjbGFzcyBBU1RJbmNsdWRlRGlyZWN0aXZlIGV4dGVuZHMgU2ltcGxlTm9kZQotewotICBwdWJsaWMgQVNUSW5jbHVkZURpcmVjdGl2ZShpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihpZCk7Ci0gIH0KLQotICBwdWJsaWMgQVNUSW5jbHVkZURpcmVjdGl2ZShKU1BhcnNlcjIwIHAsIGludCBpZCkKLSAgewotICAgIHN1cGVyKHAsIGlkKTsKLSAgfQotCi0KLSAgLyoqIEFjY2VwdCB0aGUgdmlzaXRvci4gKiovCi0gIHB1YmxpYyBPYmplY3Qgamp0QWNjZXB0KEpTUGFyc2VyMjBWaXNpdG9yIHZpc2l0b3IsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgcmV0dXJuIHZpc2l0b3IudmlzaXQodGhpcywgZGF0YSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVEluaGVyaXRhbmNlLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RJbmhlcml0YW5jZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjYzYmZjLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVEluaGVyaXRhbmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIEFTVEluaGVyaXRhbmNlLmphdmEgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuamF2YXNjcmlwdDIwcGFyc2VyOwotCi1wdWJsaWMgY2xhc3MgQVNUSW5oZXJpdGFuY2UgZXh0ZW5kcyBTaW1wbGVOb2RlCi17Ci0gIHB1YmxpYyBBU1RJbmhlcml0YW5jZShpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihpZCk7Ci0gIH0KLQotICBwdWJsaWMgQVNUSW5oZXJpdGFuY2UoSlNQYXJzZXIyMCBwLCBpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihwLCBpZCk7Ci0gIH0KLQotCi0gIC8qKiBBY2NlcHQgdGhlIHZpc2l0b3IuICoqLwotICBwdWJsaWMgT2JqZWN0IGpqdEFjY2VwdChKU1BhcnNlcjIwVmlzaXRvciB2aXNpdG9yLCBPYmplY3QgZGF0YSkKLSAgewotICAgIHJldHVybiB2aXNpdG9yLnZpc2l0KHRoaXMsIGRhdGEpOwotICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RJbnRlcmZhY2VEZWZpbml0aW9uLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RJbnRlcmZhY2VEZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExYmYzNzEuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUSW50ZXJmYWNlRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZTogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBBU1RJbnRlcmZhY2VEZWZpbml0aW9uLmphdmEgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuamF2YXNjcmlwdDIwcGFyc2VyOwotCi1wdWJsaWMgY2xhc3MgQVNUSW50ZXJmYWNlRGVmaW5pdGlvbiBleHRlbmRzIFNpbXBsZU5vZGUKLXsKLSAgcHVibGljIEFTVEludGVyZmFjZURlZmluaXRpb24oaW50IGlkKQotICB7Ci0gICAgc3VwZXIoaWQpOwotICB9Ci0KLSAgcHVibGljIEFTVEludGVyZmFjZURlZmluaXRpb24oSlNQYXJzZXIyMCBwLCBpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihwLCBpZCk7Ci0gIH0KLQotCi0gIC8qKiBBY2NlcHQgdGhlIHZpc2l0b3IuICoqLwotICBwdWJsaWMgT2JqZWN0IGpqdEFjY2VwdChKU1BhcnNlcjIwVmlzaXRvciB2aXNpdG9yLCBPYmplY3QgZGF0YSkKLSAgewotICAgIHJldHVybiB2aXNpdG9yLnZpc2l0KHRoaXMsIGRhdGEpOwotICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RMYWJlbGVkU3RhdGVtZW50LmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RMYWJlbGVkU3RhdGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4MDlkN2UuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUTGFiZWxlZFN0YXRlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZTogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBBU1RMYWJlbGVkU3RhdGVtZW50LmphdmEgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuamF2YXNjcmlwdDIwcGFyc2VyOwotCi1wdWJsaWMgY2xhc3MgQVNUTGFiZWxlZFN0YXRlbWVudCBleHRlbmRzIFNpbXBsZU5vZGUKLXsKLSAgcHVibGljIEFTVExhYmVsZWRTdGF0ZW1lbnQoaW50IGlkKQotICB7Ci0gICAgc3VwZXIoaWQpOwotICB9Ci0KLSAgcHVibGljIEFTVExhYmVsZWRTdGF0ZW1lbnQoSlNQYXJzZXIyMCBwLCBpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihwLCBpZCk7Ci0gIH0KLQotCi0gIC8qKiBBY2NlcHQgdGhlIHZpc2l0b3IuICoqLwotICBwdWJsaWMgT2JqZWN0IGpqdEFjY2VwdChKU1BhcnNlcjIwVmlzaXRvciB2aXNpdG9yLCBPYmplY3QgZGF0YSkKLSAgewotICAgIHJldHVybiB2aXNpdG9yLnZpc2l0KHRoaXMsIGRhdGEpOwotICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RMaXN0RXhwcmVzc2lvbi5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUTGlzdEV4cHJlc3Npb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTRkZjA2Ni4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RMaXN0RXhwcmVzc2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZTogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBBU1RMaXN0RXhwcmVzc2lvbi5qYXZhICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LmphdmFzY3JpcHQyMHBhcnNlcjsKLQotcHVibGljIGNsYXNzIEFTVExpc3RFeHByZXNzaW9uIGV4dGVuZHMgU2ltcGxlTm9kZQotewotICBwdWJsaWMgQVNUTGlzdEV4cHJlc3Npb24oaW50IGlkKQotICB7Ci0gICAgc3VwZXIoaWQpOwotICB9Ci0KLSAgcHVibGljIEFTVExpc3RFeHByZXNzaW9uKEpTUGFyc2VyMjAgcCwgaW50IGlkKQotICB7Ci0gICAgc3VwZXIocCwgaWQpOwotICB9Ci0KLQotICAvKiogQWNjZXB0IHRoZSB2aXNpdG9yLiAqKi8KLSAgcHVibGljIE9iamVjdCBqanRBY2NlcHQoSlNQYXJzZXIyMFZpc2l0b3IgdmlzaXRvciwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICByZXR1cm4gdmlzaXRvci52aXNpdCh0aGlzLCBkYXRhKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUTGlzdEV4cHJlc3Npb25Ob0lOLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RMaXN0RXhwcmVzc2lvbk5vSU4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTFkYzQ5OC4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RMaXN0RXhwcmVzc2lvbk5vSU4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qIEdlbmVyYXRlZCBCeTpKSlRyZWU6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gQVNUTGlzdEV4cHJlc3Npb25Ob0lOLmphdmEgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuamF2YXNjcmlwdDIwcGFyc2VyOwotCi1wdWJsaWMgY2xhc3MgQVNUTGlzdEV4cHJlc3Npb25Ob0lOIGV4dGVuZHMgU2ltcGxlTm9kZQotewotICBwdWJsaWMgQVNUTGlzdEV4cHJlc3Npb25Ob0lOKGludCBpZCkKLSAgewotICAgIHN1cGVyKGlkKTsKLSAgfQotCi0gIHB1YmxpYyBBU1RMaXN0RXhwcmVzc2lvbk5vSU4oSlNQYXJzZXIyMCBwLCBpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihwLCBpZCk7Ci0gIH0KLQotCi0gIC8qKiBBY2NlcHQgdGhlIHZpc2l0b3IuICoqLwotICBwdWJsaWMgT2JqZWN0IGpqdEFjY2VwdChKU1BhcnNlcjIwVmlzaXRvciB2aXNpdG9yLCBPYmplY3QgZGF0YSkKLSAgewotICAgIHJldHVybiB2aXNpdG9yLnZpc2l0KHRoaXMsIGRhdGEpOwotICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RMaXRlcmFsRWxlbWVudC5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUTGl0ZXJhbEVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDgwN2RjYi4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RMaXRlcmFsRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZTogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBBU1RMaXRlcmFsRWxlbWVudC5qYXZhICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LmphdmFzY3JpcHQyMHBhcnNlcjsKLQotcHVibGljIGNsYXNzIEFTVExpdGVyYWxFbGVtZW50IGV4dGVuZHMgU2ltcGxlTm9kZQotewotICBwdWJsaWMgQVNUTGl0ZXJhbEVsZW1lbnQoaW50IGlkKQotICB7Ci0gICAgc3VwZXIoaWQpOwotICB9Ci0KLSAgcHVibGljIEFTVExpdGVyYWxFbGVtZW50KEpTUGFyc2VyMjAgcCwgaW50IGlkKQotICB7Ci0gICAgc3VwZXIocCwgaWQpOwotICB9Ci0KLQotICAvKiogQWNjZXB0IHRoZSB2aXNpdG9yLiAqKi8KLSAgcHVibGljIE9iamVjdCBqanRBY2NlcHQoSlNQYXJzZXIyMFZpc2l0b3IgdmlzaXRvciwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICByZXR1cm4gdmlzaXRvci52aXNpdCh0aGlzLCBkYXRhKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUTGl0ZXJhbEZpZWxkLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RMaXRlcmFsRmllbGQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzliMGNmMS4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RMaXRlcmFsRmllbGQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qIEdlbmVyYXRlZCBCeTpKSlRyZWU6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gQVNUTGl0ZXJhbEZpZWxkLmphdmEgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuamF2YXNjcmlwdDIwcGFyc2VyOwotCi1wdWJsaWMgY2xhc3MgQVNUTGl0ZXJhbEZpZWxkIGV4dGVuZHMgU2ltcGxlTm9kZQotewotICBwdWJsaWMgQVNUTGl0ZXJhbEZpZWxkKGludCBpZCkKLSAgewotICAgIHN1cGVyKGlkKTsKLSAgfQotCi0gIHB1YmxpYyBBU1RMaXRlcmFsRmllbGQoSlNQYXJzZXIyMCBwLCBpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihwLCBpZCk7Ci0gIH0KLQotCi0gIC8qKiBBY2NlcHQgdGhlIHZpc2l0b3IuICoqLwotICBwdWJsaWMgT2JqZWN0IGpqdEFjY2VwdChKU1BhcnNlcjIwVmlzaXRvciB2aXNpdG9yLCBPYmplY3QgZGF0YSkKLSAgewotICAgIHJldHVybiB2aXNpdG9yLnZpc2l0KHRoaXMsIGRhdGEpOwotICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RMb2dpY2FsQU5ERXhwcmVzc2lvbi5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUTG9naWNhbEFOREV4cHJlc3Npb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjU4MzdkNS4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RMb2dpY2FsQU5ERXhwcmVzc2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZTogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBBU1RMb2dpY2FsQU5ERXhwcmVzc2lvbi5qYXZhICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LmphdmFzY3JpcHQyMHBhcnNlcjsKLQotcHVibGljIGNsYXNzIEFTVExvZ2ljYWxBTkRFeHByZXNzaW9uIGV4dGVuZHMgU2ltcGxlTm9kZQotewotICBwdWJsaWMgQVNUTG9naWNhbEFOREV4cHJlc3Npb24oaW50IGlkKQotICB7Ci0gICAgc3VwZXIoaWQpOwotICB9Ci0KLSAgcHVibGljIEFTVExvZ2ljYWxBTkRFeHByZXNzaW9uKEpTUGFyc2VyMjAgcCwgaW50IGlkKQotICB7Ci0gICAgc3VwZXIocCwgaWQpOwotICB9Ci0KLQotICAvKiogQWNjZXB0IHRoZSB2aXNpdG9yLiAqKi8KLSAgcHVibGljIE9iamVjdCBqanRBY2NlcHQoSlNQYXJzZXIyMFZpc2l0b3IgdmlzaXRvciwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICByZXR1cm4gdmlzaXRvci52aXNpdCh0aGlzLCBkYXRhKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUTG9naWNhbEFOREV4cHJlc3Npb25Ob0lOLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RMb2dpY2FsQU5ERXhwcmVzc2lvbk5vSU4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGEzZDllMS4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RMb2dpY2FsQU5ERXhwcmVzc2lvbk5vSU4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qIEdlbmVyYXRlZCBCeTpKSlRyZWU6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gQVNUTG9naWNhbEFOREV4cHJlc3Npb25Ob0lOLmphdmEgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuamF2YXNjcmlwdDIwcGFyc2VyOwotCi1wdWJsaWMgY2xhc3MgQVNUTG9naWNhbEFOREV4cHJlc3Npb25Ob0lOIGV4dGVuZHMgU2ltcGxlTm9kZQotewotICBwdWJsaWMgQVNUTG9naWNhbEFOREV4cHJlc3Npb25Ob0lOKGludCBpZCkKLSAgewotICAgIHN1cGVyKGlkKTsKLSAgfQotCi0gIHB1YmxpYyBBU1RMb2dpY2FsQU5ERXhwcmVzc2lvbk5vSU4oSlNQYXJzZXIyMCBwLCBpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihwLCBpZCk7Ci0gIH0KLQotCi0gIC8qKiBBY2NlcHQgdGhlIHZpc2l0b3IuICoqLwotICBwdWJsaWMgT2JqZWN0IGpqdEFjY2VwdChKU1BhcnNlcjIwVmlzaXRvciB2aXNpdG9yLCBPYmplY3QgZGF0YSkKLSAgewotICAgIHJldHVybiB2aXNpdG9yLnZpc2l0KHRoaXMsIGRhdGEpOwotICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RMb2dpY2FsT1JFeHByZXNzaW9uLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RMb2dpY2FsT1JFeHByZXNzaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzYzU3N2MuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUTG9naWNhbE9SRXhwcmVzc2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZTogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBBU1RMb2dpY2FsT1JFeHByZXNzaW9uLmphdmEgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuamF2YXNjcmlwdDIwcGFyc2VyOwotCi1wdWJsaWMgY2xhc3MgQVNUTG9naWNhbE9SRXhwcmVzc2lvbiBleHRlbmRzIFNpbXBsZU5vZGUKLXsKLSAgcHVibGljIEFTVExvZ2ljYWxPUkV4cHJlc3Npb24oaW50IGlkKQotICB7Ci0gICAgc3VwZXIoaWQpOwotICB9Ci0KLSAgcHVibGljIEFTVExvZ2ljYWxPUkV4cHJlc3Npb24oSlNQYXJzZXIyMCBwLCBpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihwLCBpZCk7Ci0gIH0KLQotCi0gIC8qKiBBY2NlcHQgdGhlIHZpc2l0b3IuICoqLwotICBwdWJsaWMgT2JqZWN0IGpqdEFjY2VwdChKU1BhcnNlcjIwVmlzaXRvciB2aXNpdG9yLCBPYmplY3QgZGF0YSkKLSAgewotICAgIHJldHVybiB2aXNpdG9yLnZpc2l0KHRoaXMsIGRhdGEpOwotICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RMb2dpY2FsT1JFeHByZXNzaW9uTm9JTi5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUTG9naWNhbE9SRXhwcmVzc2lvbk5vSU4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTkxYzdmNi4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RMb2dpY2FsT1JFeHByZXNzaW9uTm9JTi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZTogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBBU1RMb2dpY2FsT1JFeHByZXNzaW9uTm9JTi5qYXZhICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LmphdmFzY3JpcHQyMHBhcnNlcjsKLQotcHVibGljIGNsYXNzIEFTVExvZ2ljYWxPUkV4cHJlc3Npb25Ob0lOIGV4dGVuZHMgU2ltcGxlTm9kZQotewotICBwdWJsaWMgQVNUTG9naWNhbE9SRXhwcmVzc2lvbk5vSU4oaW50IGlkKQotICB7Ci0gICAgc3VwZXIoaWQpOwotICB9Ci0KLSAgcHVibGljIEFTVExvZ2ljYWxPUkV4cHJlc3Npb25Ob0lOKEpTUGFyc2VyMjAgcCwgaW50IGlkKQotICB7Ci0gICAgc3VwZXIocCwgaWQpOwotICB9Ci0KLQotICAvKiogQWNjZXB0IHRoZSB2aXNpdG9yLiAqKi8KLSAgcHVibGljIE9iamVjdCBqanRBY2NlcHQoSlNQYXJzZXIyMFZpc2l0b3IgdmlzaXRvciwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICByZXR1cm4gdmlzaXRvci52aXNpdCh0aGlzLCBkYXRhKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUTXVsT3AuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVE11bE9wLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2NDM0ZDMuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUTXVsT3AuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qIEdlbmVyYXRlZCBCeTpKSlRyZWU6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gQVNUTXVsT3AuamF2YSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5qYXZhc2NyaXB0MjBwYXJzZXI7Ci0KLXB1YmxpYyBjbGFzcyBBU1RNdWxPcCBleHRlbmRzIFNpbXBsZU5vZGUKLXsKLSAgcHVibGljIEFTVE11bE9wKGludCBpZCkKLSAgewotICAgIHN1cGVyKGlkKTsKLSAgfQotCi0gIHB1YmxpYyBBU1RNdWxPcChKU1BhcnNlcjIwIHAsIGludCBpZCkKLSAgewotICAgIHN1cGVyKHAsIGlkKTsKLSAgfQotCi0KLSAgLyoqIEFjY2VwdCB0aGUgdmlzaXRvci4gKiovCi0gIHB1YmxpYyBPYmplY3Qgamp0QWNjZXB0KEpTUGFyc2VyMjBWaXNpdG9yIHZpc2l0b3IsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgcmV0dXJuIHZpc2l0b3IudmlzaXQodGhpcywgZGF0YSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbi5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5MWNiYzEuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIEFTVE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbi5qYXZhICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LmphdmFzY3JpcHQyMHBhcnNlcjsKLQotcHVibGljIGNsYXNzIEFTVE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbiBleHRlbmRzIFNpbXBsZU5vZGUKLXsKLSAgcHVibGljIEFTVE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbihpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihpZCk7Ci0gIH0KLQotICBwdWJsaWMgQVNUTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uKEpTUGFyc2VyMjAgcCwgaW50IGlkKQotICB7Ci0gICAgc3VwZXIocCwgaWQpOwotICB9Ci0KLQotICAvKiogQWNjZXB0IHRoZSB2aXNpdG9yLiAqKi8KLSAgcHVibGljIE9iamVjdCBqanRBY2NlcHQoSlNQYXJzZXIyMFZpc2l0b3IgdmlzaXRvciwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICByZXR1cm4gdmlzaXRvci52aXNpdCh0aGlzLCBkYXRhKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUTmFtZXNwYWNlRGVmaW5pdGlvbi5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUTmFtZXNwYWNlRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZWU1MjBhLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVE5hbWVzcGFjZURlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qIEdlbmVyYXRlZCBCeTpKSlRyZWU6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gQVNUTmFtZXNwYWNlRGVmaW5pdGlvbi5qYXZhICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LmphdmFzY3JpcHQyMHBhcnNlcjsKLQotcHVibGljIGNsYXNzIEFTVE5hbWVzcGFjZURlZmluaXRpb24gZXh0ZW5kcyBTaW1wbGVOb2RlCi17Ci0gIHB1YmxpYyBBU1ROYW1lc3BhY2VEZWZpbml0aW9uKGludCBpZCkKLSAgewotICAgIHN1cGVyKGlkKTsKLSAgfQotCi0gIHB1YmxpYyBBU1ROYW1lc3BhY2VEZWZpbml0aW9uKEpTUGFyc2VyMjAgcCwgaW50IGlkKQotICB7Ci0gICAgc3VwZXIocCwgaWQpOwotICB9Ci0KLQotICAvKiogQWNjZXB0IHRoZSB2aXNpdG9yLiAqKi8KLSAgcHVibGljIE9iamVjdCBqanRBY2NlcHQoSlNQYXJzZXIyMFZpc2l0b3IgdmlzaXRvciwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICByZXR1cm4gdmlzaXRvci52aXNpdCh0aGlzLCBkYXRhKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUTm9uQXNzaWdubWVudEV4cHJlc3Npb24uamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVE5vbkFzc2lnbm1lbnRFeHByZXNzaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkNTVjMjcuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUTm9uQXNzaWdubWVudEV4cHJlc3Npb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qIEdlbmVyYXRlZCBCeTpKSlRyZWU6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gQVNUTm9uQXNzaWdubWVudEV4cHJlc3Npb24uamF2YSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5qYXZhc2NyaXB0MjBwYXJzZXI7Ci0KLXB1YmxpYyBjbGFzcyBBU1ROb25Bc3NpZ25tZW50RXhwcmVzc2lvbiBleHRlbmRzIFNpbXBsZU5vZGUKLXsKLSAgcHVibGljIEFTVE5vbkFzc2lnbm1lbnRFeHByZXNzaW9uKGludCBpZCkKLSAgewotICAgIHN1cGVyKGlkKTsKLSAgfQotCi0gIHB1YmxpYyBBU1ROb25Bc3NpZ25tZW50RXhwcmVzc2lvbihKU1BhcnNlcjIwIHAsIGludCBpZCkKLSAgewotICAgIHN1cGVyKHAsIGlkKTsKLSAgfQotCi0KLSAgLyoqIEFjY2VwdCB0aGUgdmlzaXRvci4gKiovCi0gIHB1YmxpYyBPYmplY3Qgamp0QWNjZXB0KEpTUGFyc2VyMjBWaXNpdG9yIHZpc2l0b3IsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgcmV0dXJuIHZpc2l0b3IudmlzaXQodGhpcywgZGF0YSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVE5vbkFzc2lnbm1lbnRFeHByZXNzaW9uTm9JTi5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUTm9uQXNzaWdubWVudEV4cHJlc3Npb25Ob0lOLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwZDFhOTIuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUTm9uQXNzaWdubWVudEV4cHJlc3Npb25Ob0lOLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIEFTVE5vbkFzc2lnbm1lbnRFeHByZXNzaW9uTm9JTi5qYXZhICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LmphdmFzY3JpcHQyMHBhcnNlcjsKLQotcHVibGljIGNsYXNzIEFTVE5vbkFzc2lnbm1lbnRFeHByZXNzaW9uTm9JTiBleHRlbmRzIFNpbXBsZU5vZGUKLXsKLSAgcHVibGljIEFTVE5vbkFzc2lnbm1lbnRFeHByZXNzaW9uTm9JTihpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihpZCk7Ci0gIH0KLQotICBwdWJsaWMgQVNUTm9uQXNzaWdubWVudEV4cHJlc3Npb25Ob0lOKEpTUGFyc2VyMjAgcCwgaW50IGlkKQotICB7Ci0gICAgc3VwZXIocCwgaWQpOwotICB9Ci0KLQotICAvKiogQWNjZXB0IHRoZSB2aXNpdG9yLiAqKi8KLSAgcHVibGljIE9iamVjdCBqanRBY2NlcHQoSlNQYXJzZXIyMFZpc2l0b3IgdmlzaXRvciwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICByZXR1cm4gdmlzaXRvci52aXNpdCh0aGlzLCBkYXRhKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUT2JqZWN0TGl0ZXJhbC5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUT2JqZWN0TGl0ZXJhbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMWNkMTM3Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVE9iamVjdExpdGVyYWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qIEdlbmVyYXRlZCBCeTpKSlRyZWU6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gQVNUT2JqZWN0TGl0ZXJhbC5qYXZhICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LmphdmFzY3JpcHQyMHBhcnNlcjsKLQotcHVibGljIGNsYXNzIEFTVE9iamVjdExpdGVyYWwgZXh0ZW5kcyBTaW1wbGVOb2RlCi17Ci0gIHB1YmxpYyBBU1RPYmplY3RMaXRlcmFsKGludCBpZCkKLSAgewotICAgIHN1cGVyKGlkKTsKLSAgfQotCi0gIHB1YmxpYyBBU1RPYmplY3RMaXRlcmFsKEpTUGFyc2VyMjAgcCwgaW50IGlkKQotICB7Ci0gICAgc3VwZXIocCwgaWQpOwotICB9Ci0KLQotICAvKiogQWNjZXB0IHRoZSB2aXNpdG9yLiAqKi8KLSAgcHVibGljIE9iamVjdCBqanRBY2NlcHQoSlNQYXJzZXIyMFZpc2l0b3IgdmlzaXRvciwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICByZXR1cm4gdmlzaXRvci52aXNpdCh0aGlzLCBkYXRhKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUUGFja2FnZURlZmluaXRpb24uamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVFBhY2thZ2VEZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5Y2M2ZDQuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUUGFja2FnZURlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qIEdlbmVyYXRlZCBCeTpKSlRyZWU6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gQVNUUGFja2FnZURlZmluaXRpb24uamF2YSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5qYXZhc2NyaXB0MjBwYXJzZXI7Ci0KLXB1YmxpYyBjbGFzcyBBU1RQYWNrYWdlRGVmaW5pdGlvbiBleHRlbmRzIFNpbXBsZU5vZGUKLXsKLSAgcHVibGljIEFTVFBhY2thZ2VEZWZpbml0aW9uKGludCBpZCkKLSAgewotICAgIHN1cGVyKGlkKTsKLSAgfQotCi0gIHB1YmxpYyBBU1RQYWNrYWdlRGVmaW5pdGlvbihKU1BhcnNlcjIwIHAsIGludCBpZCkKLSAgewotICAgIHN1cGVyKHAsIGlkKTsKLSAgfQotCi0KLSAgLyoqIEFjY2VwdCB0aGUgdmlzaXRvci4gKiovCi0gIHB1YmxpYyBPYmplY3Qgamp0QWNjZXB0KEpTUGFyc2VyMjBWaXNpdG9yIHZpc2l0b3IsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgcmV0dXJuIHZpc2l0b3IudmlzaXQodGhpcywgZGF0YSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVFBhY2thZ2VJZGVudGlmaWVycy5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUUGFja2FnZUlkZW50aWZpZXJzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0OWY1NzUuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUUGFja2FnZUlkZW50aWZpZXJzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIEFTVFBhY2thZ2VJZGVudGlmaWVycy5qYXZhICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LmphdmFzY3JpcHQyMHBhcnNlcjsKLQotcHVibGljIGNsYXNzIEFTVFBhY2thZ2VJZGVudGlmaWVycyBleHRlbmRzIFNpbXBsZU5vZGUKLXsKLSAgcHVibGljIEFTVFBhY2thZ2VJZGVudGlmaWVycyhpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihpZCk7Ci0gIH0KLQotICBwdWJsaWMgQVNUUGFja2FnZUlkZW50aWZpZXJzKEpTUGFyc2VyMjAgcCwgaW50IGlkKQotICB7Ci0gICAgc3VwZXIocCwgaWQpOwotICB9Ci0KLQotICAvKiogQWNjZXB0IHRoZSB2aXNpdG9yLiAqKi8KLSAgcHVibGljIE9iamVjdCBqanRBY2NlcHQoSlNQYXJzZXIyMFZpc2l0b3IgdmlzaXRvciwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICByZXR1cm4gdmlzaXRvci52aXNpdCh0aGlzLCBkYXRhKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUUGFja2FnZU5hbWUuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVFBhY2thZ2VOYW1lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkYmNkZTAuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUUGFja2FnZU5hbWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qIEdlbmVyYXRlZCBCeTpKSlRyZWU6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gQVNUUGFja2FnZU5hbWUuamF2YSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5qYXZhc2NyaXB0MjBwYXJzZXI7Ci0KLXB1YmxpYyBjbGFzcyBBU1RQYWNrYWdlTmFtZSBleHRlbmRzIFNpbXBsZU5vZGUKLXsKLSAgcHVibGljIEFTVFBhY2thZ2VOYW1lKGludCBpZCkKLSAgewotICAgIHN1cGVyKGlkKTsKLSAgfQotCi0gIHB1YmxpYyBBU1RQYWNrYWdlTmFtZShKU1BhcnNlcjIwIHAsIGludCBpZCkKLSAgewotICAgIHN1cGVyKHAsIGlkKTsKLSAgfQotCi0KLSAgLyoqIEFjY2VwdCB0aGUgdmlzaXRvci4gKiovCi0gIHB1YmxpYyBPYmplY3Qgamp0QWNjZXB0KEpTUGFyc2VyMjBWaXNpdG9yIHZpc2l0b3IsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgcmV0dXJuIHZpc2l0b3IudmlzaXQodGhpcywgZGF0YSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVFBhcmFtZXRlci5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUUGFyYW1ldGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmMzgwNjQuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUUGFyYW1ldGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIEFTVFBhcmFtZXRlci5qYXZhICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LmphdmFzY3JpcHQyMHBhcnNlcjsKLQotcHVibGljIGNsYXNzIEFTVFBhcmFtZXRlciBleHRlbmRzIFNpbXBsZU5vZGUKLXsKLSAgcHVibGljIEFTVFBhcmFtZXRlcihpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihpZCk7Ci0gIH0KLQotICBwdWJsaWMgQVNUUGFyYW1ldGVyKEpTUGFyc2VyMjAgcCwgaW50IGlkKQotICB7Ci0gICAgc3VwZXIocCwgaWQpOwotICB9Ci0KLQotICAvKiogQWNjZXB0IHRoZSB2aXNpdG9yLiAqKi8KLSAgcHVibGljIE9iamVjdCBqanRBY2NlcHQoSlNQYXJzZXIyMFZpc2l0b3IgdmlzaXRvciwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICByZXR1cm4gdmlzaXRvci52aXNpdCh0aGlzLCBkYXRhKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUUGFyYW1ldGVySW5pdC5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUUGFyYW1ldGVySW5pdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNWUzYTQ1Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVFBhcmFtZXRlckluaXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qIEdlbmVyYXRlZCBCeTpKSlRyZWU6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gQVNUUGFyYW1ldGVySW5pdC5qYXZhICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LmphdmFzY3JpcHQyMHBhcnNlcjsKLQotcHVibGljIGNsYXNzIEFTVFBhcmFtZXRlckluaXQgZXh0ZW5kcyBTaW1wbGVOb2RlCi17Ci0gIHB1YmxpYyBBU1RQYXJhbWV0ZXJJbml0KGludCBpZCkKLSAgewotICAgIHN1cGVyKGlkKTsKLSAgfQotCi0gIHB1YmxpYyBBU1RQYXJhbWV0ZXJJbml0KEpTUGFyc2VyMjAgcCwgaW50IGlkKQotICB7Ci0gICAgc3VwZXIocCwgaWQpOwotICB9Ci0KLQotICAvKiogQWNjZXB0IHRoZSB2aXNpdG9yLiAqKi8KLSAgcHVibGljIE9iamVjdCBqanRBY2NlcHQoSlNQYXJzZXIyMFZpc2l0b3IgdmlzaXRvciwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICByZXR1cm4gdmlzaXRvci52aXNpdCh0aGlzLCBkYXRhKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUUGFyYW1ldGVycy5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUUGFyYW1ldGVycy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YWIyY2I1Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVFBhcmFtZXRlcnMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qIEdlbmVyYXRlZCBCeTpKSlRyZWU6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gQVNUUGFyYW1ldGVycy5qYXZhICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LmphdmFzY3JpcHQyMHBhcnNlcjsKLQotcHVibGljIGNsYXNzIEFTVFBhcmFtZXRlcnMgZXh0ZW5kcyBTaW1wbGVOb2RlCi17Ci0gIHB1YmxpYyBBU1RQYXJhbWV0ZXJzKGludCBpZCkKLSAgewotICAgIHN1cGVyKGlkKTsKLSAgfQotCi0gIHB1YmxpYyBBU1RQYXJhbWV0ZXJzKEpTUGFyc2VyMjAgcCwgaW50IGlkKQotICB7Ci0gICAgc3VwZXIocCwgaWQpOwotICB9Ci0KLQotICAvKiogQWNjZXB0IHRoZSB2aXNpdG9yLiAqKi8KLSAgcHVibGljIE9iamVjdCBqanRBY2NlcHQoSlNQYXJzZXIyMFZpc2l0b3IgdmlzaXRvciwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICByZXR1cm4gdmlzaXRvci52aXNpdCh0aGlzLCBkYXRhKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUUG9zdGZpeEV4cHJlc3Npb24uamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVFBvc3RmaXhFeHByZXNzaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4ZmQ0OWIuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUUG9zdGZpeEV4cHJlc3Npb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qIEdlbmVyYXRlZCBCeTpKSlRyZWU6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gQVNUUG9zdGZpeEV4cHJlc3Npb24uamF2YSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5qYXZhc2NyaXB0MjBwYXJzZXI7Ci0KLXB1YmxpYyBjbGFzcyBBU1RQb3N0Zml4RXhwcmVzc2lvbiBleHRlbmRzIFNpbXBsZU5vZGUKLXsKLSAgcHVibGljIEFTVFBvc3RmaXhFeHByZXNzaW9uKGludCBpZCkKLSAgewotICAgIHN1cGVyKGlkKTsKLSAgfQotCi0gIHB1YmxpYyBBU1RQb3N0Zml4RXhwcmVzc2lvbihKU1BhcnNlcjIwIHAsIGludCBpZCkKLSAgewotICAgIHN1cGVyKHAsIGlkKTsKLSAgfQotCi0KLSAgLyoqIEFjY2VwdCB0aGUgdmlzaXRvci4gKiovCi0gIHB1YmxpYyBPYmplY3Qgamp0QWNjZXB0KEpTUGFyc2VyMjBWaXNpdG9yIHZpc2l0b3IsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgcmV0dXJuIHZpc2l0b3IudmlzaXQodGhpcywgZGF0YSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVFBvc3RmaXhPcC5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUUG9zdGZpeE9wLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxMjJlODQuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUUG9zdGZpeE9wLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIEFTVFBvc3RmaXhPcC5qYXZhICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LmphdmFzY3JpcHQyMHBhcnNlcjsKLQotcHVibGljIGNsYXNzIEFTVFBvc3RmaXhPcCBleHRlbmRzIFNpbXBsZU5vZGUKLXsKLSAgcHVibGljIEFTVFBvc3RmaXhPcChpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihpZCk7Ci0gIH0KLQotICBwdWJsaWMgQVNUUG9zdGZpeE9wKEpTUGFyc2VyMjAgcCwgaW50IGlkKQotICB7Ci0gICAgc3VwZXIocCwgaWQpOwotICB9Ci0KLQotICAvKiogQWNjZXB0IHRoZSB2aXNpdG9yLiAqKi8KLSAgcHVibGljIE9iamVjdCBqanRBY2NlcHQoSlNQYXJzZXIyMFZpc2l0b3IgdmlzaXRvciwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICByZXR1cm4gdmlzaXRvci52aXNpdCh0aGlzLCBkYXRhKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUUHJhZ21hLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RQcmFnbWEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTgwN2VmMy4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RQcmFnbWEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qIEdlbmVyYXRlZCBCeTpKSlRyZWU6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gQVNUUHJhZ21hLmphdmEgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuamF2YXNjcmlwdDIwcGFyc2VyOwotCi1wdWJsaWMgY2xhc3MgQVNUUHJhZ21hIGV4dGVuZHMgU2ltcGxlTm9kZQotewotICBwdWJsaWMgQVNUUHJhZ21hKGludCBpZCkKLSAgewotICAgIHN1cGVyKGlkKTsKLSAgfQotCi0gIHB1YmxpYyBBU1RQcmFnbWEoSlNQYXJzZXIyMCBwLCBpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihwLCBpZCk7Ci0gIH0KLQotCi0gIC8qKiBBY2NlcHQgdGhlIHZpc2l0b3IuICoqLwotICBwdWJsaWMgT2JqZWN0IGpqdEFjY2VwdChKU1BhcnNlcjIwVmlzaXRvciB2aXNpdG9yLCBPYmplY3QgZGF0YSkKLSAgewotICAgIHJldHVybiB2aXNpdG9yLnZpc2l0KHRoaXMsIGRhdGEpOwotICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RQcmFnbWFBcmd1bWVudC5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUUHJhZ21hQXJndW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTEwNzRlNy4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RQcmFnbWFBcmd1bWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZTogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBBU1RQcmFnbWFBcmd1bWVudC5qYXZhICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LmphdmFzY3JpcHQyMHBhcnNlcjsKLQotcHVibGljIGNsYXNzIEFTVFByYWdtYUFyZ3VtZW50IGV4dGVuZHMgU2ltcGxlTm9kZQotewotICBwdWJsaWMgQVNUUHJhZ21hQXJndW1lbnQoaW50IGlkKQotICB7Ci0gICAgc3VwZXIoaWQpOwotICB9Ci0KLSAgcHVibGljIEFTVFByYWdtYUFyZ3VtZW50KEpTUGFyc2VyMjAgcCwgaW50IGlkKQotICB7Ci0gICAgc3VwZXIocCwgaWQpOwotICB9Ci0KLQotICAvKiogQWNjZXB0IHRoZSB2aXNpdG9yLiAqKi8KLSAgcHVibGljIE9iamVjdCBqanRBY2NlcHQoSlNQYXJzZXIyMFZpc2l0b3IgdmlzaXRvciwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICByZXR1cm4gdmlzaXRvci52aXNpdCh0aGlzLCBkYXRhKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUUHJhZ21hRXhwci5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUUHJhZ21hRXhwci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZWFlMTgxLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVFByYWdtYUV4cHIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qIEdlbmVyYXRlZCBCeTpKSlRyZWU6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gQVNUUHJhZ21hRXhwci5qYXZhICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LmphdmFzY3JpcHQyMHBhcnNlcjsKLQotcHVibGljIGNsYXNzIEFTVFByYWdtYUV4cHIgZXh0ZW5kcyBTaW1wbGVOb2RlCi17Ci0gIHB1YmxpYyBBU1RQcmFnbWFFeHByKGludCBpZCkKLSAgewotICAgIHN1cGVyKGlkKTsKLSAgfQotCi0gIHB1YmxpYyBBU1RQcmFnbWFFeHByKEpTUGFyc2VyMjAgcCwgaW50IGlkKQotICB7Ci0gICAgc3VwZXIocCwgaWQpOwotICB9Ci0KLQotICAvKiogQWNjZXB0IHRoZSB2aXNpdG9yLiAqKi8KLSAgcHVibGljIE9iamVjdCBqanRBY2NlcHQoSlNQYXJzZXIyMFZpc2l0b3IgdmlzaXRvciwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICByZXR1cm4gdmlzaXRvci52aXNpdCh0aGlzLCBkYXRhKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUUHJhZ21hSXRlbS5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUUHJhZ21hSXRlbS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTU2MTViLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVFByYWdtYUl0ZW0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qIEdlbmVyYXRlZCBCeTpKSlRyZWU6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gQVNUUHJhZ21hSXRlbS5qYXZhICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LmphdmFzY3JpcHQyMHBhcnNlcjsKLQotcHVibGljIGNsYXNzIEFTVFByYWdtYUl0ZW0gZXh0ZW5kcyBTaW1wbGVOb2RlCi17Ci0gIHB1YmxpYyBBU1RQcmFnbWFJdGVtKGludCBpZCkKLSAgewotICAgIHN1cGVyKGlkKTsKLSAgfQotCi0gIHB1YmxpYyBBU1RQcmFnbWFJdGVtKEpTUGFyc2VyMjAgcCwgaW50IGlkKQotICB7Ci0gICAgc3VwZXIocCwgaWQpOwotICB9Ci0KLQotICAvKiogQWNjZXB0IHRoZSB2aXNpdG9yLiAqKi8KLSAgcHVibGljIE9iamVjdCBqanRBY2NlcHQoSlNQYXJzZXIyMFZpc2l0b3IgdmlzaXRvciwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICByZXR1cm4gdmlzaXRvci52aXNpdCh0aGlzLCBkYXRhKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUUHJhZ21hSXRlbXMuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVFByYWdtYUl0ZW1zLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxYTE2N2UuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUUHJhZ21hSXRlbXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qIEdlbmVyYXRlZCBCeTpKSlRyZWU6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gQVNUUHJhZ21hSXRlbXMuamF2YSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5qYXZhc2NyaXB0MjBwYXJzZXI7Ci0KLXB1YmxpYyBjbGFzcyBBU1RQcmFnbWFJdGVtcyBleHRlbmRzIFNpbXBsZU5vZGUKLXsKLSAgcHVibGljIEFTVFByYWdtYUl0ZW1zKGludCBpZCkKLSAgewotICAgIHN1cGVyKGlkKTsKLSAgfQotCi0gIHB1YmxpYyBBU1RQcmFnbWFJdGVtcyhKU1BhcnNlcjIwIHAsIGludCBpZCkKLSAgewotICAgIHN1cGVyKHAsIGlkKTsKLSAgfQotCi0KLSAgLyoqIEFjY2VwdCB0aGUgdmlzaXRvci4gKiovCi0gIHB1YmxpYyBPYmplY3Qgamp0QWNjZXB0KEpTUGFyc2VyMjBWaXNpdG9yIHZpc2l0b3IsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgcmV0dXJuIHZpc2l0b3IudmlzaXQodGhpcywgZGF0YSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVFByaW1hcnlFeHByZXNzaW9uLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RQcmltYXJ5RXhwcmVzc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OTBlNzE5Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVFByaW1hcnlFeHByZXNzaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIEFTVFByaW1hcnlFeHByZXNzaW9uLmphdmEgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuamF2YXNjcmlwdDIwcGFyc2VyOwotCi1wdWJsaWMgY2xhc3MgQVNUUHJpbWFyeUV4cHJlc3Npb24gZXh0ZW5kcyBTaW1wbGVOb2RlCi17Ci0gIHB1YmxpYyBBU1RQcmltYXJ5RXhwcmVzc2lvbihpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihpZCk7Ci0gIH0KLQotICBwdWJsaWMgQVNUUHJpbWFyeUV4cHJlc3Npb24oSlNQYXJzZXIyMCBwLCBpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihwLCBpZCk7Ci0gIH0KLQotCi0gIC8qKiBBY2NlcHQgdGhlIHZpc2l0b3IuICoqLwotICBwdWJsaWMgT2JqZWN0IGpqdEFjY2VwdChKU1BhcnNlcjIwVmlzaXRvciB2aXNpdG9yLCBPYmplY3QgZGF0YSkKLSAgewotICAgIHJldHVybiB2aXNpdG9yLnZpc2l0KHRoaXMsIGRhdGEpOwotICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RQcm9ncmFtLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RQcm9ncmFtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0YWM3NWUuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUUHJvZ3JhbS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZTogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBBU1RQcm9ncmFtLmphdmEgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuamF2YXNjcmlwdDIwcGFyc2VyOwotCi1wdWJsaWMgY2xhc3MgQVNUUHJvZ3JhbSBleHRlbmRzIFNpbXBsZU5vZGUKLXsKLSAgcHVibGljIEFTVFByb2dyYW0oaW50IGlkKQotICB7Ci0gICAgc3VwZXIoaWQpOwotICB9Ci0KLSAgcHVibGljIEFTVFByb2dyYW0oSlNQYXJzZXIyMCBwLCBpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihwLCBpZCk7Ci0gIH0KLQotCi0gIC8qKiBBY2NlcHQgdGhlIHZpc2l0b3IuICoqLwotICBwdWJsaWMgT2JqZWN0IGpqdEFjY2VwdChKU1BhcnNlcjIwVmlzaXRvciB2aXNpdG9yLCBPYmplY3QgZGF0YSkKLSAgewotICAgIHJldHVybiB2aXNpdG9yLnZpc2l0KHRoaXMsIGRhdGEpOwotICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RQcm9wZXJ0eU9wZXJhdG9yLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RQcm9wZXJ0eU9wZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1ZGRlNGUuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUUHJvcGVydHlPcGVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZTogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBBU1RQcm9wZXJ0eU9wZXJhdG9yLmphdmEgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuamF2YXNjcmlwdDIwcGFyc2VyOwotCi1wdWJsaWMgY2xhc3MgQVNUUHJvcGVydHlPcGVyYXRvciBleHRlbmRzIFNpbXBsZU5vZGUKLXsKLSAgcHVibGljIEFTVFByb3BlcnR5T3BlcmF0b3IoaW50IGlkKQotICB7Ci0gICAgc3VwZXIoaWQpOwotICB9Ci0KLSAgcHVibGljIEFTVFByb3BlcnR5T3BlcmF0b3IoSlNQYXJzZXIyMCBwLCBpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihwLCBpZCk7Ci0gIH0KLQotCi0gIC8qKiBBY2NlcHQgdGhlIHZpc2l0b3IuICoqLwotICBwdWJsaWMgT2JqZWN0IGpqdEFjY2VwdChKU1BhcnNlcjIwVmlzaXRvciB2aXNpdG9yLCBPYmplY3QgZGF0YSkKLSAgewotICAgIHJldHVybiB2aXNpdG9yLnZpc2l0KHRoaXMsIGRhdGEpOwotICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RQcm9wZXJ0eU9yQXJndW1lbnRzLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RQcm9wZXJ0eU9yQXJndW1lbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4OGU3ZjcuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUUHJvcGVydHlPckFyZ3VtZW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZTogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBBU1RQcm9wZXJ0eU9yQXJndW1lbnRzLmphdmEgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuamF2YXNjcmlwdDIwcGFyc2VyOwotCi1wdWJsaWMgY2xhc3MgQVNUUHJvcGVydHlPckFyZ3VtZW50cyBleHRlbmRzIFNpbXBsZU5vZGUKLXsKLSAgcHVibGljIEFTVFByb3BlcnR5T3JBcmd1bWVudHMoaW50IGlkKQotICB7Ci0gICAgc3VwZXIoaWQpOwotICB9Ci0KLSAgcHVibGljIEFTVFByb3BlcnR5T3JBcmd1bWVudHMoSlNQYXJzZXIyMCBwLCBpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihwLCBpZCk7Ci0gIH0KLQotCi0gIC8qKiBBY2NlcHQgdGhlIHZpc2l0b3IuICoqLwotICBwdWJsaWMgT2JqZWN0IGpqdEFjY2VwdChKU1BhcnNlcjIwVmlzaXRvciB2aXNpdG9yLCBPYmplY3QgZGF0YSkKLSAgewotICAgIHJldHVybiB2aXNpdG9yLnZpc2l0KHRoaXMsIGRhdGEpOwotICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RRdWFsaWZpZWRJZGVudGlmaWVyLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RRdWFsaWZpZWRJZGVudGlmaWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzMTc5YTYuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUUXVhbGlmaWVkSWRlbnRpZmllci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZTogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBBU1RRdWFsaWZpZWRJZGVudGlmaWVyLmphdmEgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuamF2YXNjcmlwdDIwcGFyc2VyOwotCi1wdWJsaWMgY2xhc3MgQVNUUXVhbGlmaWVkSWRlbnRpZmllciBleHRlbmRzIFNpbXBsZU5vZGUKLXsKLSAgcHVibGljIEFTVFF1YWxpZmllZElkZW50aWZpZXIoaW50IGlkKQotICB7Ci0gICAgc3VwZXIoaWQpOwotICB9Ci0KLSAgcHVibGljIEFTVFF1YWxpZmllZElkZW50aWZpZXIoSlNQYXJzZXIyMCBwLCBpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihwLCBpZCk7Ci0gIH0KLQotCi0gIC8qKiBBY2NlcHQgdGhlIHZpc2l0b3IuICoqLwotICBwdWJsaWMgT2JqZWN0IGpqdEFjY2VwdChKU1BhcnNlcjIwVmlzaXRvciB2aXNpdG9yLCBPYmplY3QgZGF0YSkKLSAgewotICAgIHJldHVybiB2aXNpdG9yLnZpc2l0KHRoaXMsIGRhdGEpOwotICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RSZWxPcC5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUUmVsT3AuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzcxNDc1MC4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RSZWxPcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZTogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBBU1RSZWxPcC5qYXZhICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LmphdmFzY3JpcHQyMHBhcnNlcjsKLQotcHVibGljIGNsYXNzIEFTVFJlbE9wIGV4dGVuZHMgU2ltcGxlTm9kZQotewotICBwdWJsaWMgQVNUUmVsT3AoaW50IGlkKQotICB7Ci0gICAgc3VwZXIoaWQpOwotICB9Ci0KLSAgcHVibGljIEFTVFJlbE9wKEpTUGFyc2VyMjAgcCwgaW50IGlkKQotICB7Ci0gICAgc3VwZXIocCwgaWQpOwotICB9Ci0KLQotICAvKiogQWNjZXB0IHRoZSB2aXNpdG9yLiAqKi8KLSAgcHVibGljIE9iamVjdCBqanRBY2NlcHQoSlNQYXJzZXIyMFZpc2l0b3IgdmlzaXRvciwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICByZXR1cm4gdmlzaXRvci52aXNpdCh0aGlzLCBkYXRhKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUUmVsYXRpb25hbEV4cHJlc3Npb24uamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVFJlbGF0aW9uYWxFeHByZXNzaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkZjNiNzkuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUUmVsYXRpb25hbEV4cHJlc3Npb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qIEdlbmVyYXRlZCBCeTpKSlRyZWU6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gQVNUUmVsYXRpb25hbEV4cHJlc3Npb24uamF2YSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5qYXZhc2NyaXB0MjBwYXJzZXI7Ci0KLXB1YmxpYyBjbGFzcyBBU1RSZWxhdGlvbmFsRXhwcmVzc2lvbiBleHRlbmRzIFNpbXBsZU5vZGUKLXsKLSAgcHVibGljIEFTVFJlbGF0aW9uYWxFeHByZXNzaW9uKGludCBpZCkKLSAgewotICAgIHN1cGVyKGlkKTsKLSAgfQotCi0gIHB1YmxpYyBBU1RSZWxhdGlvbmFsRXhwcmVzc2lvbihKU1BhcnNlcjIwIHAsIGludCBpZCkKLSAgewotICAgIHN1cGVyKHAsIGlkKTsKLSAgfQotCi0KLSAgLyoqIEFjY2VwdCB0aGUgdmlzaXRvci4gKiovCi0gIHB1YmxpYyBPYmplY3Qgamp0QWNjZXB0KEpTUGFyc2VyMjBWaXNpdG9yIHZpc2l0b3IsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgcmV0dXJuIHZpc2l0b3IudmlzaXQodGhpcywgZGF0YSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVFJlbGF0aW9uYWxFeHByZXNzaW9uTm9JTi5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUUmVsYXRpb25hbEV4cHJlc3Npb25Ob0lOLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlYTFhZDYuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUUmVsYXRpb25hbEV4cHJlc3Npb25Ob0lOLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIEFTVFJlbGF0aW9uYWxFeHByZXNzaW9uTm9JTi5qYXZhICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LmphdmFzY3JpcHQyMHBhcnNlcjsKLQotcHVibGljIGNsYXNzIEFTVFJlbGF0aW9uYWxFeHByZXNzaW9uTm9JTiBleHRlbmRzIFNpbXBsZU5vZGUKLXsKLSAgcHVibGljIEFTVFJlbGF0aW9uYWxFeHByZXNzaW9uTm9JTihpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihpZCk7Ci0gIH0KLQotICBwdWJsaWMgQVNUUmVsYXRpb25hbEV4cHJlc3Npb25Ob0lOKEpTUGFyc2VyMjAgcCwgaW50IGlkKQotICB7Ci0gICAgc3VwZXIocCwgaWQpOwotICB9Ci0KLQotICAvKiogQWNjZXB0IHRoZSB2aXNpdG9yLiAqKi8KLSAgcHVibGljIE9iamVjdCBqanRBY2NlcHQoSlNQYXJzZXIyMFZpc2l0b3IgdmlzaXRvciwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICByZXR1cm4gdmlzaXRvci52aXNpdCh0aGlzLCBkYXRhKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUUmVzZXJ2ZWROYW1lc3BhY2UuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVFJlc2VydmVkTmFtZXNwYWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwMzZiZDMuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUUmVzZXJ2ZWROYW1lc3BhY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qIEdlbmVyYXRlZCBCeTpKSlRyZWU6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gQVNUUmVzZXJ2ZWROYW1lc3BhY2UuamF2YSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5qYXZhc2NyaXB0MjBwYXJzZXI7Ci0KLXB1YmxpYyBjbGFzcyBBU1RSZXNlcnZlZE5hbWVzcGFjZSBleHRlbmRzIFNpbXBsZU5vZGUKLXsKLSAgcHVibGljIEFTVFJlc2VydmVkTmFtZXNwYWNlKGludCBpZCkKLSAgewotICAgIHN1cGVyKGlkKTsKLSAgfQotCi0gIHB1YmxpYyBBU1RSZXNlcnZlZE5hbWVzcGFjZShKU1BhcnNlcjIwIHAsIGludCBpZCkKLSAgewotICAgIHN1cGVyKHAsIGlkKTsKLSAgfQotCi0KLSAgLyoqIEFjY2VwdCB0aGUgdmlzaXRvci4gKiovCi0gIHB1YmxpYyBPYmplY3Qgamp0QWNjZXB0KEpTUGFyc2VyMjBWaXNpdG9yIHZpc2l0b3IsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgcmV0dXJuIHZpc2l0b3IudmlzaXQodGhpcywgZGF0YSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVFJlc3RQYXJhbWV0ZXJzLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RSZXN0UGFyYW1ldGVycy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZWIzZGRiLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVFJlc3RQYXJhbWV0ZXJzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIEFTVFJlc3RQYXJhbWV0ZXJzLmphdmEgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuamF2YXNjcmlwdDIwcGFyc2VyOwotCi1wdWJsaWMgY2xhc3MgQVNUUmVzdFBhcmFtZXRlcnMgZXh0ZW5kcyBTaW1wbGVOb2RlCi17Ci0gIHB1YmxpYyBBU1RSZXN0UGFyYW1ldGVycyhpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihpZCk7Ci0gIH0KLQotICBwdWJsaWMgQVNUUmVzdFBhcmFtZXRlcnMoSlNQYXJzZXIyMCBwLCBpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihwLCBpZCk7Ci0gIH0KLQotCi0gIC8qKiBBY2NlcHQgdGhlIHZpc2l0b3IuICoqLwotICBwdWJsaWMgT2JqZWN0IGpqdEFjY2VwdChKU1BhcnNlcjIwVmlzaXRvciB2aXNpdG9yLCBPYmplY3QgZGF0YSkKLSAgewotICAgIHJldHVybiB2aXNpdG9yLnZpc2l0KHRoaXMsIGRhdGEpOwotICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RSZXN1bHQuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVFJlc3VsdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMWZhMWJmLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVFJlc3VsdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZTogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBBU1RSZXN1bHQuamF2YSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5qYXZhc2NyaXB0MjBwYXJzZXI7Ci0KLXB1YmxpYyBjbGFzcyBBU1RSZXN1bHQgZXh0ZW5kcyBTaW1wbGVOb2RlCi17Ci0gIHB1YmxpYyBBU1RSZXN1bHQoaW50IGlkKQotICB7Ci0gICAgc3VwZXIoaWQpOwotICB9Ci0KLSAgcHVibGljIEFTVFJlc3VsdChKU1BhcnNlcjIwIHAsIGludCBpZCkKLSAgewotICAgIHN1cGVyKHAsIGlkKTsKLSAgfQotCi0KLSAgLyoqIEFjY2VwdCB0aGUgdmlzaXRvci4gKiovCi0gIHB1YmxpYyBPYmplY3Qgamp0QWNjZXB0KEpTUGFyc2VyMjBWaXNpdG9yIHZpc2l0b3IsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgcmV0dXJuIHZpc2l0b3IudmlzaXQodGhpcywgZGF0YSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVFJldHVyblN0YXRlbWVudC5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUUmV0dXJuU3RhdGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhNjgzMDIuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUUmV0dXJuU3RhdGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIEFTVFJldHVyblN0YXRlbWVudC5qYXZhICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LmphdmFzY3JpcHQyMHBhcnNlcjsKLQotcHVibGljIGNsYXNzIEFTVFJldHVyblN0YXRlbWVudCBleHRlbmRzIFNpbXBsZU5vZGUKLXsKLSAgcHVibGljIEFTVFJldHVyblN0YXRlbWVudChpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihpZCk7Ci0gIH0KLQotICBwdWJsaWMgQVNUUmV0dXJuU3RhdGVtZW50KEpTUGFyc2VyMjAgcCwgaW50IGlkKQotICB7Ci0gICAgc3VwZXIocCwgaWQpOwotICB9Ci0KLQotICAvKiogQWNjZXB0IHRoZSB2aXNpdG9yLiAqKi8KLSAgcHVibGljIE9iamVjdCBqanRBY2NlcHQoSlNQYXJzZXIyMFZpc2l0b3IgdmlzaXRvciwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICByZXR1cm4gdmlzaXRvci52aXNpdCh0aGlzLCBkYXRhKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUU2MuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVFNjLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3ZjRjZmIuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUU2MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qIEdlbmVyYXRlZCBCeTpKSlRyZWU6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gQVNUU2MuamF2YSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5qYXZhc2NyaXB0MjBwYXJzZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuamF2YXNjcmlwdDIwcGFyc2VyLkpTUGFyc2VyMjBDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LmphdmFzY3JpcHQyMHBhcnNlci5Ub2tlbjsKLQotcHVibGljIGNsYXNzIEFTVFNjIGV4dGVuZHMgU2ltcGxlTm9kZSBpbXBsZW1lbnRzIEpTUGFyc2VyMjBDb25zdGFudHMKLXsKLSAgcHVibGljIEFTVFNjKGludCBpZCkKLSAgewotICAgIHN1cGVyKGlkKTsKLSAgfQotCi0gIHB1YmxpYyBBU1RTYyhKU1BhcnNlcjIwIHAsIGludCBpZCkKLSAgewotICAgIHN1cGVyKHAsIGlkKTsKLSAgfQotCi0KLSAgLyoqIEFjY2VwdCB0aGUgdmlzaXRvci4gKiovCi0gIHB1YmxpYyBPYmplY3Qgamp0QWNjZXB0KEpTUGFyc2VyMjBWaXNpdG9yIHZpc2l0b3IsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgcmV0dXJuIHZpc2l0b3IudmlzaXQodGhpcywgZGF0YSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVFNoaWZ0RXhwcmVzc2lvbi5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUU2hpZnRFeHByZXNzaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4NWUwMWMuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUU2hpZnRFeHByZXNzaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIEFTVFNoaWZ0RXhwcmVzc2lvbi5qYXZhICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LmphdmFzY3JpcHQyMHBhcnNlcjsKLQotcHVibGljIGNsYXNzIEFTVFNoaWZ0RXhwcmVzc2lvbiBleHRlbmRzIFNpbXBsZU5vZGUKLXsKLSAgcHVibGljIEFTVFNoaWZ0RXhwcmVzc2lvbihpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihpZCk7Ci0gIH0KLQotICBwdWJsaWMgQVNUU2hpZnRFeHByZXNzaW9uKEpTUGFyc2VyMjAgcCwgaW50IGlkKQotICB7Ci0gICAgc3VwZXIocCwgaWQpOwotICB9Ci0KLQotICAvKiogQWNjZXB0IHRoZSB2aXNpdG9yLiAqKi8KLSAgcHVibGljIE9iamVjdCBqanRBY2NlcHQoSlNQYXJzZXIyMFZpc2l0b3IgdmlzaXRvciwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICByZXR1cm4gdmlzaXRvci52aXNpdCh0aGlzLCBkYXRhKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUU2hpZnRPcC5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUU2hpZnRPcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YTUzYmVmLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVFNoaWZ0T3AuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qIEdlbmVyYXRlZCBCeTpKSlRyZWU6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gQVNUU2hpZnRPcC5qYXZhICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LmphdmFzY3JpcHQyMHBhcnNlcjsKLQotcHVibGljIGNsYXNzIEFTVFNoaWZ0T3AgZXh0ZW5kcyBTaW1wbGVOb2RlCi17Ci0gIHB1YmxpYyBBU1RTaGlmdE9wKGludCBpZCkKLSAgewotICAgIHN1cGVyKGlkKTsKLSAgfQotCi0gIHB1YmxpYyBBU1RTaGlmdE9wKEpTUGFyc2VyMjAgcCwgaW50IGlkKQotICB7Ci0gICAgc3VwZXIocCwgaWQpOwotICB9Ci0KLQotICAvKiogQWNjZXB0IHRoZSB2aXNpdG9yLiAqKi8KLSAgcHVibGljIE9iamVjdCBqanRBY2NlcHQoSlNQYXJzZXIyMFZpc2l0b3IgdmlzaXRvciwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICByZXR1cm4gdmlzaXRvci52aXNpdCh0aGlzLCBkYXRhKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUU2ltcGxlUXVhbGlmaWVkSWRlbnRpZmllci5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUU2ltcGxlUXVhbGlmaWVkSWRlbnRpZmllci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZTdiNjIwLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVFNpbXBsZVF1YWxpZmllZElkZW50aWZpZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qIEdlbmVyYXRlZCBCeTpKSlRyZWU6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gQVNUU2ltcGxlUXVhbGlmaWVkSWRlbnRpZmllci5qYXZhICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LmphdmFzY3JpcHQyMHBhcnNlcjsKLQotcHVibGljIGNsYXNzIEFTVFNpbXBsZVF1YWxpZmllZElkZW50aWZpZXIgZXh0ZW5kcyBTaW1wbGVOb2RlCi17Ci0gIHB1YmxpYyBBU1RTaW1wbGVRdWFsaWZpZWRJZGVudGlmaWVyKGludCBpZCkKLSAgewotICAgIHN1cGVyKGlkKTsKLSAgfQotCi0gIHB1YmxpYyBBU1RTaW1wbGVRdWFsaWZpZWRJZGVudGlmaWVyKEpTUGFyc2VyMjAgcCwgaW50IGlkKQotICB7Ci0gICAgc3VwZXIocCwgaWQpOwotICB9Ci0KLQotICAvKiogQWNjZXB0IHRoZSB2aXNpdG9yLiAqKi8KLSAgcHVibGljIE9iamVjdCBqanRBY2NlcHQoSlNQYXJzZXIyMFZpc2l0b3IgdmlzaXRvciwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICByZXR1cm4gdmlzaXRvci52aXNpdCh0aGlzLCBkYXRhKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUU2ltcGxlVmFyaWFibGVEZWZpbml0aW9uLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RTaW1wbGVWYXJpYWJsZURlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTJmYzBmYS4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RTaW1wbGVWYXJpYWJsZURlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qIEdlbmVyYXRlZCBCeTpKSlRyZWU6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gQVNUU2ltcGxlVmFyaWFibGVEZWZpbml0aW9uLmphdmEgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuamF2YXNjcmlwdDIwcGFyc2VyOwotCi1wdWJsaWMgY2xhc3MgQVNUU2ltcGxlVmFyaWFibGVEZWZpbml0aW9uIGV4dGVuZHMgU2ltcGxlTm9kZQotewotICBwdWJsaWMgQVNUU2ltcGxlVmFyaWFibGVEZWZpbml0aW9uKGludCBpZCkKLSAgewotICAgIHN1cGVyKGlkKTsKLSAgfQotCi0gIHB1YmxpYyBBU1RTaW1wbGVWYXJpYWJsZURlZmluaXRpb24oSlNQYXJzZXIyMCBwLCBpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihwLCBpZCk7Ci0gIH0KLQotCi0gIC8qKiBBY2NlcHQgdGhlIHZpc2l0b3IuICoqLwotICBwdWJsaWMgT2JqZWN0IGpqdEFjY2VwdChKU1BhcnNlcjIwVmlzaXRvciB2aXNpdG9yLCBPYmplY3QgZGF0YSkKLSAgewotICAgIHJldHVybiB2aXNpdG9yLnZpc2l0KHRoaXMsIGRhdGEpOwotICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RTdGF0ZW1lbnQuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVFN0YXRlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OThmZjhmLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVFN0YXRlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZTogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBBU1RTdGF0ZW1lbnQuamF2YSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5qYXZhc2NyaXB0MjBwYXJzZXI7Ci0KLXB1YmxpYyBjbGFzcyBBU1RTdGF0ZW1lbnQgZXh0ZW5kcyBTaW1wbGVOb2RlCi17Ci0gIHB1YmxpYyBBU1RTdGF0ZW1lbnQoaW50IGlkKQotICB7Ci0gICAgc3VwZXIoaWQpOwotICB9Ci0KLSAgcHVibGljIEFTVFN0YXRlbWVudChKU1BhcnNlcjIwIHAsIGludCBpZCkKLSAgewotICAgIHN1cGVyKHAsIGlkKTsKLSAgfQotCi0KLSAgLyoqIEFjY2VwdCB0aGUgdmlzaXRvci4gKiovCi0gIHB1YmxpYyBPYmplY3Qgamp0QWNjZXB0KEpTUGFyc2VyMjBWaXNpdG9yIHZpc2l0b3IsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgcmV0dXJuIHZpc2l0b3IudmlzaXQodGhpcywgZGF0YSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVFN1YnN0YXRlbWVudC5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUU3Vic3RhdGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiYjE2MDIuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUU3Vic3RhdGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIEFTVFN1YnN0YXRlbWVudC5qYXZhICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LmphdmFzY3JpcHQyMHBhcnNlcjsKLQotcHVibGljIGNsYXNzIEFTVFN1YnN0YXRlbWVudCBleHRlbmRzIFNpbXBsZU5vZGUKLXsKLSAgcHVibGljIEFTVFN1YnN0YXRlbWVudChpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihpZCk7Ci0gIH0KLQotICBwdWJsaWMgQVNUU3Vic3RhdGVtZW50KEpTUGFyc2VyMjAgcCwgaW50IGlkKQotICB7Ci0gICAgc3VwZXIocCwgaWQpOwotICB9Ci0KLQotICAvKiogQWNjZXB0IHRoZSB2aXNpdG9yLiAqKi8KLSAgcHVibGljIE9iamVjdCBqanRBY2NlcHQoSlNQYXJzZXIyMFZpc2l0b3IgdmlzaXRvciwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICByZXR1cm4gdmlzaXRvci52aXNpdCh0aGlzLCBkYXRhKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUU3Vic3RhdGVtZW50cy5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUU3Vic3RhdGVtZW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTk1NDI1Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVFN1YnN0YXRlbWVudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qIEdlbmVyYXRlZCBCeTpKSlRyZWU6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gQVNUU3Vic3RhdGVtZW50cy5qYXZhICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LmphdmFzY3JpcHQyMHBhcnNlcjsKLQotcHVibGljIGNsYXNzIEFTVFN1YnN0YXRlbWVudHMgZXh0ZW5kcyBTaW1wbGVOb2RlCi17Ci0gIHB1YmxpYyBBU1RTdWJzdGF0ZW1lbnRzKGludCBpZCkKLSAgewotICAgIHN1cGVyKGlkKTsKLSAgfQotCi0gIHB1YmxpYyBBU1RTdWJzdGF0ZW1lbnRzKEpTUGFyc2VyMjAgcCwgaW50IGlkKQotICB7Ci0gICAgc3VwZXIocCwgaWQpOwotICB9Ci0KLQotICAvKiogQWNjZXB0IHRoZSB2aXNpdG9yLiAqKi8KLSAgcHVibGljIE9iamVjdCBqanRBY2NlcHQoSlNQYXJzZXIyMFZpc2l0b3IgdmlzaXRvciwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICByZXR1cm4gdmlzaXRvci52aXNpdCh0aGlzLCBkYXRhKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUU3VwZXJFeHByZXNzaW9uLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RTdXBlckV4cHJlc3Npb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzE0MWExYy4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RTdXBlckV4cHJlc3Npb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qIEdlbmVyYXRlZCBCeTpKSlRyZWU6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gQVNUU3VwZXJFeHByZXNzaW9uLmphdmEgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuamF2YXNjcmlwdDIwcGFyc2VyOwotCi1wdWJsaWMgY2xhc3MgQVNUU3VwZXJFeHByZXNzaW9uIGV4dGVuZHMgU2ltcGxlTm9kZQotewotICBwdWJsaWMgQVNUU3VwZXJFeHByZXNzaW9uKGludCBpZCkKLSAgewotICAgIHN1cGVyKGlkKTsKLSAgfQotCi0gIHB1YmxpYyBBU1RTdXBlckV4cHJlc3Npb24oSlNQYXJzZXIyMCBwLCBpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihwLCBpZCk7Ci0gIH0KLQotCi0gIC8qKiBBY2NlcHQgdGhlIHZpc2l0b3IuICoqLwotICBwdWJsaWMgT2JqZWN0IGpqdEFjY2VwdChKU1BhcnNlcjIwVmlzaXRvciB2aXNpdG9yLCBPYmplY3QgZGF0YSkKLSAgewotICAgIHJldHVybiB2aXNpdG9yLnZpc2l0KHRoaXMsIGRhdGEpOwotICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RTdXBlclN0YXRlbWVudC5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUU3VwZXJTdGF0ZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTE0Yzg2ZS4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RTdXBlclN0YXRlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZTogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBBU1RTdXBlclN0YXRlbWVudC5qYXZhICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LmphdmFzY3JpcHQyMHBhcnNlcjsKLQotcHVibGljIGNsYXNzIEFTVFN1cGVyU3RhdGVtZW50IGV4dGVuZHMgU2ltcGxlTm9kZQotewotICBwdWJsaWMgQVNUU3VwZXJTdGF0ZW1lbnQoaW50IGlkKQotICB7Ci0gICAgc3VwZXIoaWQpOwotICB9Ci0KLSAgcHVibGljIEFTVFN1cGVyU3RhdGVtZW50KEpTUGFyc2VyMjAgcCwgaW50IGlkKQotICB7Ci0gICAgc3VwZXIocCwgaWQpOwotICB9Ci0KLQotICAvKiogQWNjZXB0IHRoZSB2aXNpdG9yLiAqKi8KLSAgcHVibGljIE9iamVjdCBqanRBY2NlcHQoSlNQYXJzZXIyMFZpc2l0b3IgdmlzaXRvciwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICByZXR1cm4gdmlzaXRvci52aXNpdCh0aGlzLCBkYXRhKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUU3dpdGNoU3RhdGVtZW50LmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RTd2l0Y2hTdGF0ZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWMyYjEwNy4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RTd2l0Y2hTdGF0ZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qIEdlbmVyYXRlZCBCeTpKSlRyZWU6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gQVNUU3dpdGNoU3RhdGVtZW50LmphdmEgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuamF2YXNjcmlwdDIwcGFyc2VyOwotCi1wdWJsaWMgY2xhc3MgQVNUU3dpdGNoU3RhdGVtZW50IGV4dGVuZHMgU2ltcGxlTm9kZQotewotICBwdWJsaWMgQVNUU3dpdGNoU3RhdGVtZW50KGludCBpZCkKLSAgewotICAgIHN1cGVyKGlkKTsKLSAgfQotCi0gIHB1YmxpYyBBU1RTd2l0Y2hTdGF0ZW1lbnQoSlNQYXJzZXIyMCBwLCBpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihwLCBpZCk7Ci0gIH0KLQotCi0gIC8qKiBBY2NlcHQgdGhlIHZpc2l0b3IuICoqLwotICBwdWJsaWMgT2JqZWN0IGpqdEFjY2VwdChKU1BhcnNlcjIwVmlzaXRvciB2aXNpdG9yLCBPYmplY3QgZGF0YSkKLSAgewotICAgIHJldHVybiB2aXNpdG9yLnZpc2l0KHRoaXMsIGRhdGEpOwotICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RUaHJvd1N0YXRlbWVudC5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUVGhyb3dTdGF0ZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWE0OThlNi4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RUaHJvd1N0YXRlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZTogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBBU1RUaHJvd1N0YXRlbWVudC5qYXZhICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LmphdmFzY3JpcHQyMHBhcnNlcjsKLQotcHVibGljIGNsYXNzIEFTVFRocm93U3RhdGVtZW50IGV4dGVuZHMgU2ltcGxlTm9kZQotewotICBwdWJsaWMgQVNUVGhyb3dTdGF0ZW1lbnQoaW50IGlkKQotICB7Ci0gICAgc3VwZXIoaWQpOwotICB9Ci0KLSAgcHVibGljIEFTVFRocm93U3RhdGVtZW50KEpTUGFyc2VyMjAgcCwgaW50IGlkKQotICB7Ci0gICAgc3VwZXIocCwgaWQpOwotICB9Ci0KLQotICAvKiogQWNjZXB0IHRoZSB2aXNpdG9yLiAqKi8KLSAgcHVibGljIE9iamVjdCBqanRBY2NlcHQoSlNQYXJzZXIyMFZpc2l0b3IgdmlzaXRvciwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICByZXR1cm4gdmlzaXRvci52aXNpdCh0aGlzLCBkYXRhKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUVHJ5U3RhdGVtZW50LmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RUcnlTdGF0ZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGNmM2Q5Yy4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RUcnlTdGF0ZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qIEdlbmVyYXRlZCBCeTpKSlRyZWU6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gQVNUVHJ5U3RhdGVtZW50LmphdmEgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuamF2YXNjcmlwdDIwcGFyc2VyOwotCi1wdWJsaWMgY2xhc3MgQVNUVHJ5U3RhdGVtZW50IGV4dGVuZHMgU2ltcGxlTm9kZQotewotICBwdWJsaWMgQVNUVHJ5U3RhdGVtZW50KGludCBpZCkKLSAgewotICAgIHN1cGVyKGlkKTsKLSAgfQotCi0gIHB1YmxpYyBBU1RUcnlTdGF0ZW1lbnQoSlNQYXJzZXIyMCBwLCBpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihwLCBpZCk7Ci0gIH0KLQotCi0gIC8qKiBBY2NlcHQgdGhlIHZpc2l0b3IuICoqLwotICBwdWJsaWMgT2JqZWN0IGpqdEFjY2VwdChKU1BhcnNlcjIwVmlzaXRvciB2aXNpdG9yLCBPYmplY3QgZGF0YSkKLSAgewotICAgIHJldHVybiB2aXNpdG9yLnZpc2l0KHRoaXMsIGRhdGEpOwotICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RUeXBlRXhwcmVzc2lvbi5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUVHlwZUV4cHJlc3Npb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDJiNjU4OC4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RUeXBlRXhwcmVzc2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZTogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBBU1RUeXBlRXhwcmVzc2lvbi5qYXZhICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LmphdmFzY3JpcHQyMHBhcnNlcjsKLQotcHVibGljIGNsYXNzIEFTVFR5cGVFeHByZXNzaW9uIGV4dGVuZHMgU2ltcGxlTm9kZQotewotICBwdWJsaWMgQVNUVHlwZUV4cHJlc3Npb24oaW50IGlkKQotICB7Ci0gICAgc3VwZXIoaWQpOwotICB9Ci0KLSAgcHVibGljIEFTVFR5cGVFeHByZXNzaW9uKEpTUGFyc2VyMjAgcCwgaW50IGlkKQotICB7Ci0gICAgc3VwZXIocCwgaWQpOwotICB9Ci0KLQotICAvKiogQWNjZXB0IHRoZSB2aXNpdG9yLiAqKi8KLSAgcHVibGljIE9iamVjdCBqanRBY2NlcHQoSlNQYXJzZXIyMFZpc2l0b3IgdmlzaXRvciwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICByZXR1cm4gdmlzaXRvci52aXNpdCh0aGlzLCBkYXRhKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUVHlwZUV4cHJlc3Npb25MaXN0LmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RUeXBlRXhwcmVzc2lvbkxpc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmU3ODI4Mi4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RUeXBlRXhwcmVzc2lvbkxpc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qIEdlbmVyYXRlZCBCeTpKSlRyZWU6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gQVNUVHlwZUV4cHJlc3Npb25MaXN0LmphdmEgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuamF2YXNjcmlwdDIwcGFyc2VyOwotCi1wdWJsaWMgY2xhc3MgQVNUVHlwZUV4cHJlc3Npb25MaXN0IGV4dGVuZHMgU2ltcGxlTm9kZQotewotICBwdWJsaWMgQVNUVHlwZUV4cHJlc3Npb25MaXN0KGludCBpZCkKLSAgewotICAgIHN1cGVyKGlkKTsKLSAgfQotCi0gIHB1YmxpYyBBU1RUeXBlRXhwcmVzc2lvbkxpc3QoSlNQYXJzZXIyMCBwLCBpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihwLCBpZCk7Ci0gIH0KLQotCi0gIC8qKiBBY2NlcHQgdGhlIHZpc2l0b3IuICoqLwotICBwdWJsaWMgT2JqZWN0IGpqdEFjY2VwdChKU1BhcnNlcjIwVmlzaXRvciB2aXNpdG9yLCBPYmplY3QgZGF0YSkKLSAgewotICAgIHJldHVybiB2aXNpdG9yLnZpc2l0KHRoaXMsIGRhdGEpOwotICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RUeXBlRXhwcmVzc2lvbk5vSU4uamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVFR5cGVFeHByZXNzaW9uTm9JTi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZDRlYzJiLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVFR5cGVFeHByZXNzaW9uTm9JTi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZTogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBBU1RUeXBlRXhwcmVzc2lvbk5vSU4uamF2YSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5qYXZhc2NyaXB0MjBwYXJzZXI7Ci0KLXB1YmxpYyBjbGFzcyBBU1RUeXBlRXhwcmVzc2lvbk5vSU4gZXh0ZW5kcyBTaW1wbGVOb2RlCi17Ci0gIHB1YmxpYyBBU1RUeXBlRXhwcmVzc2lvbk5vSU4oaW50IGlkKQotICB7Ci0gICAgc3VwZXIoaWQpOwotICB9Ci0KLSAgcHVibGljIEFTVFR5cGVFeHByZXNzaW9uTm9JTihKU1BhcnNlcjIwIHAsIGludCBpZCkKLSAgewotICAgIHN1cGVyKHAsIGlkKTsKLSAgfQotCi0KLSAgLyoqIEFjY2VwdCB0aGUgdmlzaXRvci4gKiovCi0gIHB1YmxpYyBPYmplY3Qgamp0QWNjZXB0KEpTUGFyc2VyMjBWaXNpdG9yIHZpc2l0b3IsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgcmV0dXJuIHZpc2l0b3IudmlzaXQodGhpcywgZGF0YSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVFR5cGVkSWRlbnRpZmllci5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUVHlwZWRJZGVudGlmaWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4ODhhODQuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUVHlwZWRJZGVudGlmaWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIEFTVFR5cGVkSWRlbnRpZmllci5qYXZhICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LmphdmFzY3JpcHQyMHBhcnNlcjsKLQotcHVibGljIGNsYXNzIEFTVFR5cGVkSWRlbnRpZmllciBleHRlbmRzIFNpbXBsZU5vZGUKLXsKLSAgcHVibGljIEFTVFR5cGVkSWRlbnRpZmllcihpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihpZCk7Ci0gIH0KLQotICBwdWJsaWMgQVNUVHlwZWRJZGVudGlmaWVyKEpTUGFyc2VyMjAgcCwgaW50IGlkKQotICB7Ci0gICAgc3VwZXIocCwgaWQpOwotICB9Ci0KLQotICAvKiogQWNjZXB0IHRoZSB2aXNpdG9yLiAqKi8KLSAgcHVibGljIE9iamVjdCBqanRBY2NlcHQoSlNQYXJzZXIyMFZpc2l0b3IgdmlzaXRvciwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICByZXR1cm4gdmlzaXRvci52aXNpdCh0aGlzLCBkYXRhKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUVHlwZWRJZGVudGlmaWVyTm9JTi5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUVHlwZWRJZGVudGlmaWVyTm9JTi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYWFlZmEwLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVFR5cGVkSWRlbnRpZmllck5vSU4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qIEdlbmVyYXRlZCBCeTpKSlRyZWU6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gQVNUVHlwZWRJZGVudGlmaWVyTm9JTi5qYXZhICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LmphdmFzY3JpcHQyMHBhcnNlcjsKLQotcHVibGljIGNsYXNzIEFTVFR5cGVkSWRlbnRpZmllck5vSU4gZXh0ZW5kcyBTaW1wbGVOb2RlCi17Ci0gIHB1YmxpYyBBU1RUeXBlZElkZW50aWZpZXJOb0lOKGludCBpZCkKLSAgewotICAgIHN1cGVyKGlkKTsKLSAgfQotCi0gIHB1YmxpYyBBU1RUeXBlZElkZW50aWZpZXJOb0lOKEpTUGFyc2VyMjAgcCwgaW50IGlkKQotICB7Ci0gICAgc3VwZXIocCwgaWQpOwotICB9Ci0KLQotICAvKiogQWNjZXB0IHRoZSB2aXNpdG9yLiAqKi8KLSAgcHVibGljIE9iamVjdCBqanRBY2NlcHQoSlNQYXJzZXIyMFZpc2l0b3IgdmlzaXRvciwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICByZXR1cm4gdmlzaXRvci52aXNpdCh0aGlzLCBkYXRhKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUVW5hcnlFeHByZXNzaW9uLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RVbmFyeUV4cHJlc3Npb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTVjYmM0ZC4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RVbmFyeUV4cHJlc3Npb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qIEdlbmVyYXRlZCBCeTpKSlRyZWU6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gQVNUVW5hcnlFeHByZXNzaW9uLmphdmEgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuamF2YXNjcmlwdDIwcGFyc2VyOwotCi1wdWJsaWMgY2xhc3MgQVNUVW5hcnlFeHByZXNzaW9uIGV4dGVuZHMgU2ltcGxlTm9kZQotewotICBwdWJsaWMgQVNUVW5hcnlFeHByZXNzaW9uKGludCBpZCkKLSAgewotICAgIHN1cGVyKGlkKTsKLSAgfQotCi0gIHB1YmxpYyBBU1RVbmFyeUV4cHJlc3Npb24oSlNQYXJzZXIyMCBwLCBpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihwLCBpZCk7Ci0gIH0KLQotCi0gIC8qKiBBY2NlcHQgdGhlIHZpc2l0b3IuICoqLwotICBwdWJsaWMgT2JqZWN0IGpqdEFjY2VwdChKU1BhcnNlcjIwVmlzaXRvciB2aXNpdG9yLCBPYmplY3QgZGF0YSkKLSAgewotICAgIHJldHVybiB2aXNpdG9yLnZpc2l0KHRoaXMsIGRhdGEpOwotICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RVbnR5cGVkVmFyaWFibGVCaW5kaW5nLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RVbnR5cGVkVmFyaWFibGVCaW5kaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzYzdhYmUuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUVW50eXBlZFZhcmlhYmxlQmluZGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZTogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBBU1RVbnR5cGVkVmFyaWFibGVCaW5kaW5nLmphdmEgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuamF2YXNjcmlwdDIwcGFyc2VyOwotCi1wdWJsaWMgY2xhc3MgQVNUVW50eXBlZFZhcmlhYmxlQmluZGluZyBleHRlbmRzIFNpbXBsZU5vZGUKLXsKLSAgcHVibGljIEFTVFVudHlwZWRWYXJpYWJsZUJpbmRpbmcoaW50IGlkKQotICB7Ci0gICAgc3VwZXIoaWQpOwotICB9Ci0KLSAgcHVibGljIEFTVFVudHlwZWRWYXJpYWJsZUJpbmRpbmcoSlNQYXJzZXIyMCBwLCBpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihwLCBpZCk7Ci0gIH0KLQotCi0gIC8qKiBBY2NlcHQgdGhlIHZpc2l0b3IuICoqLwotICBwdWJsaWMgT2JqZWN0IGpqdEFjY2VwdChKU1BhcnNlcjIwVmlzaXRvciB2aXNpdG9yLCBPYmplY3QgZGF0YSkKLSAgewotICAgIHJldHVybiB2aXNpdG9yLnZpc2l0KHRoaXMsIGRhdGEpOwotICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RVbnR5cGVkVmFyaWFibGVCaW5kaW5nTGlzdC5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUVW50eXBlZFZhcmlhYmxlQmluZGluZ0xpc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGNiZjVkZC4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RVbnR5cGVkVmFyaWFibGVCaW5kaW5nTGlzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZTogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBBU1RVbnR5cGVkVmFyaWFibGVCaW5kaW5nTGlzdC5qYXZhICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LmphdmFzY3JpcHQyMHBhcnNlcjsKLQotcHVibGljIGNsYXNzIEFTVFVudHlwZWRWYXJpYWJsZUJpbmRpbmdMaXN0IGV4dGVuZHMgU2ltcGxlTm9kZQotewotICBwdWJsaWMgQVNUVW50eXBlZFZhcmlhYmxlQmluZGluZ0xpc3QoaW50IGlkKQotICB7Ci0gICAgc3VwZXIoaWQpOwotICB9Ci0KLSAgcHVibGljIEFTVFVudHlwZWRWYXJpYWJsZUJpbmRpbmdMaXN0KEpTUGFyc2VyMjAgcCwgaW50IGlkKQotICB7Ci0gICAgc3VwZXIocCwgaWQpOwotICB9Ci0KLQotICAvKiogQWNjZXB0IHRoZSB2aXNpdG9yLiAqKi8KLSAgcHVibGljIE9iamVjdCBqanRBY2NlcHQoSlNQYXJzZXIyMFZpc2l0b3IgdmlzaXRvciwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICByZXR1cm4gdmlzaXRvci52aXNpdCh0aGlzLCBkYXRhKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUVXNlRGlyZWN0aXZlLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RVc2VEaXJlY3RpdmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTFhOWYxNi4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RVc2VEaXJlY3RpdmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qIEdlbmVyYXRlZCBCeTpKSlRyZWU6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gQVNUVXNlRGlyZWN0aXZlLmphdmEgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuamF2YXNjcmlwdDIwcGFyc2VyOwotCi1wdWJsaWMgY2xhc3MgQVNUVXNlRGlyZWN0aXZlIGV4dGVuZHMgU2ltcGxlTm9kZQotewotICBwdWJsaWMgQVNUVXNlRGlyZWN0aXZlKGludCBpZCkKLSAgewotICAgIHN1cGVyKGlkKTsKLSAgfQotCi0gIHB1YmxpYyBBU1RVc2VEaXJlY3RpdmUoSlNQYXJzZXIyMCBwLCBpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihwLCBpZCk7Ci0gIH0KLQotCi0gIC8qKiBBY2NlcHQgdGhlIHZpc2l0b3IuICoqLwotICBwdWJsaWMgT2JqZWN0IGpqdEFjY2VwdChKU1BhcnNlcjIwVmlzaXRvciB2aXNpdG9yLCBPYmplY3QgZGF0YSkKLSAgewotICAgIHJldHVybiB2aXNpdG9yLnZpc2l0KHRoaXMsIGRhdGEpOwotICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RWYXJpYWJsZUJpbmRpbmcuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVFZhcmlhYmxlQmluZGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNzUxNWQxLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVFZhcmlhYmxlQmluZGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZTogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBBU1RWYXJpYWJsZUJpbmRpbmcuamF2YSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5qYXZhc2NyaXB0MjBwYXJzZXI7Ci0KLXB1YmxpYyBjbGFzcyBBU1RWYXJpYWJsZUJpbmRpbmcgZXh0ZW5kcyBTaW1wbGVOb2RlCi17Ci0gIHB1YmxpYyBBU1RWYXJpYWJsZUJpbmRpbmcoaW50IGlkKQotICB7Ci0gICAgc3VwZXIoaWQpOwotICB9Ci0KLSAgcHVibGljIEFTVFZhcmlhYmxlQmluZGluZyhKU1BhcnNlcjIwIHAsIGludCBpZCkKLSAgewotICAgIHN1cGVyKHAsIGlkKTsKLSAgfQotCi0KLSAgLyoqIEFjY2VwdCB0aGUgdmlzaXRvci4gKiovCi0gIHB1YmxpYyBPYmplY3Qgamp0QWNjZXB0KEpTUGFyc2VyMjBWaXNpdG9yIHZpc2l0b3IsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgcmV0dXJuIHZpc2l0b3IudmlzaXQodGhpcywgZGF0YSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVFZhcmlhYmxlQmluZGluZ0xpc3QuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVFZhcmlhYmxlQmluZGluZ0xpc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWU5OTI2ZS4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RWYXJpYWJsZUJpbmRpbmdMaXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIEFTVFZhcmlhYmxlQmluZGluZ0xpc3QuamF2YSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5qYXZhc2NyaXB0MjBwYXJzZXI7Ci0KLXB1YmxpYyBjbGFzcyBBU1RWYXJpYWJsZUJpbmRpbmdMaXN0IGV4dGVuZHMgU2ltcGxlTm9kZQotewotICBwdWJsaWMgQVNUVmFyaWFibGVCaW5kaW5nTGlzdChpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihpZCk7Ci0gIH0KLQotICBwdWJsaWMgQVNUVmFyaWFibGVCaW5kaW5nTGlzdChKU1BhcnNlcjIwIHAsIGludCBpZCkKLSAgewotICAgIHN1cGVyKHAsIGlkKTsKLSAgfQotCi0KLSAgLyoqIEFjY2VwdCB0aGUgdmlzaXRvci4gKiovCi0gIHB1YmxpYyBPYmplY3Qgamp0QWNjZXB0KEpTUGFyc2VyMjBWaXNpdG9yIHZpc2l0b3IsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgcmV0dXJuIHZpc2l0b3IudmlzaXQodGhpcywgZGF0YSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVFZhcmlhYmxlQmluZGluZ0xpc3ROb0lOLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RWYXJpYWJsZUJpbmRpbmdMaXN0Tm9JTi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ODVkNDI2Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVFZhcmlhYmxlQmluZGluZ0xpc3ROb0lOLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIEFTVFZhcmlhYmxlQmluZGluZ0xpc3ROb0lOLmphdmEgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuamF2YXNjcmlwdDIwcGFyc2VyOwotCi1wdWJsaWMgY2xhc3MgQVNUVmFyaWFibGVCaW5kaW5nTGlzdE5vSU4gZXh0ZW5kcyBTaW1wbGVOb2RlCi17Ci0gIHB1YmxpYyBBU1RWYXJpYWJsZUJpbmRpbmdMaXN0Tm9JTihpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihpZCk7Ci0gIH0KLQotICBwdWJsaWMgQVNUVmFyaWFibGVCaW5kaW5nTGlzdE5vSU4oSlNQYXJzZXIyMCBwLCBpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihwLCBpZCk7Ci0gIH0KLQotCi0gIC8qKiBBY2NlcHQgdGhlIHZpc2l0b3IuICoqLwotICBwdWJsaWMgT2JqZWN0IGpqdEFjY2VwdChKU1BhcnNlcjIwVmlzaXRvciB2aXNpdG9yLCBPYmplY3QgZGF0YSkKLSAgewotICAgIHJldHVybiB2aXNpdG9yLnZpc2l0KHRoaXMsIGRhdGEpOwotICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RWYXJpYWJsZUJpbmRpbmdOb0lOLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RWYXJpYWJsZUJpbmRpbmdOb0lOLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmNTA4ODQuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUVmFyaWFibGVCaW5kaW5nTm9JTi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZTogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBBU1RWYXJpYWJsZUJpbmRpbmdOb0lOLmphdmEgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuamF2YXNjcmlwdDIwcGFyc2VyOwotCi1wdWJsaWMgY2xhc3MgQVNUVmFyaWFibGVCaW5kaW5nTm9JTiBleHRlbmRzIFNpbXBsZU5vZGUKLXsKLSAgcHVibGljIEFTVFZhcmlhYmxlQmluZGluZ05vSU4oaW50IGlkKQotICB7Ci0gICAgc3VwZXIoaWQpOwotICB9Ci0KLSAgcHVibGljIEFTVFZhcmlhYmxlQmluZGluZ05vSU4oSlNQYXJzZXIyMCBwLCBpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihwLCBpZCk7Ci0gIH0KLQotCi0gIC8qKiBBY2NlcHQgdGhlIHZpc2l0b3IuICoqLwotICBwdWJsaWMgT2JqZWN0IGpqdEFjY2VwdChKU1BhcnNlcjIwVmlzaXRvciB2aXNpdG9yLCBPYmplY3QgZGF0YSkKLSAgewotICAgIHJldHVybiB2aXNpdG9yLnZpc2l0KHRoaXMsIGRhdGEpOwotICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RWYXJpYWJsZURlZmluaXRpb24uamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVFZhcmlhYmxlRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDgxZmU4Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVFZhcmlhYmxlRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZTogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBBU1RWYXJpYWJsZURlZmluaXRpb24uamF2YSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5qYXZhc2NyaXB0MjBwYXJzZXI7Ci0KLXB1YmxpYyBjbGFzcyBBU1RWYXJpYWJsZURlZmluaXRpb24gZXh0ZW5kcyBTaW1wbGVOb2RlCi17Ci0gIHB1YmxpYyBBU1RWYXJpYWJsZURlZmluaXRpb24oaW50IGlkKQotICB7Ci0gICAgc3VwZXIoaWQpOwotICB9Ci0KLSAgcHVibGljIEFTVFZhcmlhYmxlRGVmaW5pdGlvbihKU1BhcnNlcjIwIHAsIGludCBpZCkKLSAgewotICAgIHN1cGVyKHAsIGlkKTsKLSAgfQotCi0KLSAgLyoqIEFjY2VwdCB0aGUgdmlzaXRvci4gKiovCi0gIHB1YmxpYyBPYmplY3Qgamp0QWNjZXB0KEpTUGFyc2VyMjBWaXNpdG9yIHZpc2l0b3IsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgcmV0dXJuIHZpc2l0b3IudmlzaXQodGhpcywgZGF0YSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVFZhcmlhYmxlRGVmaW5pdGlvbktpbmQuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVFZhcmlhYmxlRGVmaW5pdGlvbktpbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDJhNjg2Yi4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RWYXJpYWJsZURlZmluaXRpb25LaW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIEFTVFZhcmlhYmxlRGVmaW5pdGlvbktpbmQuamF2YSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5qYXZhc2NyaXB0MjBwYXJzZXI7Ci0KLXB1YmxpYyBjbGFzcyBBU1RWYXJpYWJsZURlZmluaXRpb25LaW5kIGV4dGVuZHMgU2ltcGxlTm9kZQotewotICBwdWJsaWMgQVNUVmFyaWFibGVEZWZpbml0aW9uS2luZChpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihpZCk7Ci0gIH0KLQotICBwdWJsaWMgQVNUVmFyaWFibGVEZWZpbml0aW9uS2luZChKU1BhcnNlcjIwIHAsIGludCBpZCkKLSAgewotICAgIHN1cGVyKHAsIGlkKTsKLSAgfQotCi0KLSAgLyoqIEFjY2VwdCB0aGUgdmlzaXRvci4gKiovCi0gIHB1YmxpYyBPYmplY3Qgamp0QWNjZXB0KEpTUGFyc2VyMjBWaXNpdG9yIHZpc2l0b3IsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgcmV0dXJuIHZpc2l0b3IudmlzaXQodGhpcywgZGF0YSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVFZhcmlhYmxlRGVmaW5pdGlvbk5vSU4uamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVFZhcmlhYmxlRGVmaW5pdGlvbk5vSU4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGU5NjU0Zi4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RWYXJpYWJsZURlZmluaXRpb25Ob0lOLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIEFTVFZhcmlhYmxlRGVmaW5pdGlvbk5vSU4uamF2YSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5qYXZhc2NyaXB0MjBwYXJzZXI7Ci0KLXB1YmxpYyBjbGFzcyBBU1RWYXJpYWJsZURlZmluaXRpb25Ob0lOIGV4dGVuZHMgU2ltcGxlTm9kZQotewotICBwdWJsaWMgQVNUVmFyaWFibGVEZWZpbml0aW9uTm9JTihpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihpZCk7Ci0gIH0KLQotICBwdWJsaWMgQVNUVmFyaWFibGVEZWZpbml0aW9uTm9JTihKU1BhcnNlcjIwIHAsIGludCBpZCkKLSAgewotICAgIHN1cGVyKHAsIGlkKTsKLSAgfQotCi0KLSAgLyoqIEFjY2VwdCB0aGUgdmlzaXRvci4gKiovCi0gIHB1YmxpYyBPYmplY3Qgamp0QWNjZXB0KEpTUGFyc2VyMjBWaXNpdG9yIHZpc2l0b3IsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgcmV0dXJuIHZpc2l0b3IudmlzaXQodGhpcywgZGF0YSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVFZhcmlhYmxlSW5pdGlhbGlzYXRpb24uamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVFZhcmlhYmxlSW5pdGlhbGlzYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTA0YTM2Yi4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RWYXJpYWJsZUluaXRpYWxpc2F0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIEFTVFZhcmlhYmxlSW5pdGlhbGlzYXRpb24uamF2YSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5qYXZhc2NyaXB0MjBwYXJzZXI7Ci0KLXB1YmxpYyBjbGFzcyBBU1RWYXJpYWJsZUluaXRpYWxpc2F0aW9uIGV4dGVuZHMgU2ltcGxlTm9kZQotewotICBwdWJsaWMgQVNUVmFyaWFibGVJbml0aWFsaXNhdGlvbihpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihpZCk7Ci0gIH0KLQotICBwdWJsaWMgQVNUVmFyaWFibGVJbml0aWFsaXNhdGlvbihKU1BhcnNlcjIwIHAsIGludCBpZCkKLSAgewotICAgIHN1cGVyKHAsIGlkKTsKLSAgfQotCi0KLSAgLyoqIEFjY2VwdCB0aGUgdmlzaXRvci4gKiovCi0gIHB1YmxpYyBPYmplY3Qgamp0QWNjZXB0KEpTUGFyc2VyMjBWaXNpdG9yIHZpc2l0b3IsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgcmV0dXJuIHZpc2l0b3IudmlzaXQodGhpcywgZGF0YSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVFZhcmlhYmxlSW5pdGlhbGlzYXRpb25Ob0lOLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RWYXJpYWJsZUluaXRpYWxpc2F0aW9uTm9JTi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZTNjYmM5Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVFZhcmlhYmxlSW5pdGlhbGlzYXRpb25Ob0lOLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIEFTVFZhcmlhYmxlSW5pdGlhbGlzYXRpb25Ob0lOLmphdmEgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuamF2YXNjcmlwdDIwcGFyc2VyOwotCi1wdWJsaWMgY2xhc3MgQVNUVmFyaWFibGVJbml0aWFsaXNhdGlvbk5vSU4gZXh0ZW5kcyBTaW1wbGVOb2RlCi17Ci0gIHB1YmxpYyBBU1RWYXJpYWJsZUluaXRpYWxpc2F0aW9uTm9JTihpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihpZCk7Ci0gIH0KLQotICBwdWJsaWMgQVNUVmFyaWFibGVJbml0aWFsaXNhdGlvbk5vSU4oSlNQYXJzZXIyMCBwLCBpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihwLCBpZCk7Ci0gIH0KLQotCi0gIC8qKiBBY2NlcHQgdGhlIHZpc2l0b3IuICoqLwotICBwdWJsaWMgT2JqZWN0IGpqdEFjY2VwdChKU1BhcnNlcjIwVmlzaXRvciB2aXNpdG9yLCBPYmplY3QgZGF0YSkKLSAgewotICAgIHJldHVybiB2aXNpdG9yLnZpc2l0KHRoaXMsIGRhdGEpOwotICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RWYXJpYWJsZUluaXRpYWxpemVyLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RWYXJpYWJsZUluaXRpYWxpemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmMWYzYjkuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUVmFyaWFibGVJbml0aWFsaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZTogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBBU1RWYXJpYWJsZUluaXRpYWxpemVyLmphdmEgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuamF2YXNjcmlwdDIwcGFyc2VyOwotCi1wdWJsaWMgY2xhc3MgQVNUVmFyaWFibGVJbml0aWFsaXplciBleHRlbmRzIFNpbXBsZU5vZGUKLXsKLSAgcHVibGljIEFTVFZhcmlhYmxlSW5pdGlhbGl6ZXIoaW50IGlkKQotICB7Ci0gICAgc3VwZXIoaWQpOwotICB9Ci0KLSAgcHVibGljIEFTVFZhcmlhYmxlSW5pdGlhbGl6ZXIoSlNQYXJzZXIyMCBwLCBpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihwLCBpZCk7Ci0gIH0KLQotCi0gIC8qKiBBY2NlcHQgdGhlIHZpc2l0b3IuICoqLwotICBwdWJsaWMgT2JqZWN0IGpqdEFjY2VwdChKU1BhcnNlcjIwVmlzaXRvciB2aXNpdG9yLCBPYmplY3QgZGF0YSkKLSAgewotICAgIHJldHVybiB2aXNpdG9yLnZpc2l0KHRoaXMsIGRhdGEpOwotICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RWYXJpYWJsZUluaXRpYWxpemVyTm9JTi5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUVmFyaWFibGVJbml0aWFsaXplck5vSU4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGMzYjQ5OS4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RWYXJpYWJsZUluaXRpYWxpemVyTm9JTi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZTogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBBU1RWYXJpYWJsZUluaXRpYWxpemVyTm9JTi5qYXZhICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LmphdmFzY3JpcHQyMHBhcnNlcjsKLQotcHVibGljIGNsYXNzIEFTVFZhcmlhYmxlSW5pdGlhbGl6ZXJOb0lOIGV4dGVuZHMgU2ltcGxlTm9kZQotewotICBwdWJsaWMgQVNUVmFyaWFibGVJbml0aWFsaXplck5vSU4oaW50IGlkKQotICB7Ci0gICAgc3VwZXIoaWQpOwotICB9Ci0KLSAgcHVibGljIEFTVFZhcmlhYmxlSW5pdGlhbGl6ZXJOb0lOKEpTUGFyc2VyMjAgcCwgaW50IGlkKQotICB7Ci0gICAgc3VwZXIocCwgaWQpOwotICB9Ci0KLQotICAvKiogQWNjZXB0IHRoZSB2aXNpdG9yLiAqKi8KLSAgcHVibGljIE9iamVjdCBqanRBY2NlcHQoSlNQYXJzZXIyMFZpc2l0b3IgdmlzaXRvciwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICByZXR1cm4gdmlzaXRvci52aXNpdCh0aGlzLCBkYXRhKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUV2hpbGVTdGF0ZW1lbnQuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVFdoaWxlU3RhdGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiNjY0YzcuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUV2hpbGVTdGF0ZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qIEdlbmVyYXRlZCBCeTpKSlRyZWU6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gQVNUV2hpbGVTdGF0ZW1lbnQuamF2YSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5qYXZhc2NyaXB0MjBwYXJzZXI7Ci0KLXB1YmxpYyBjbGFzcyBBU1RXaGlsZVN0YXRlbWVudCBleHRlbmRzIFNpbXBsZU5vZGUKLXsKLSAgcHVibGljIEFTVFdoaWxlU3RhdGVtZW50KGludCBpZCkKLSAgewotICAgIHN1cGVyKGlkKTsKLSAgfQotCi0gIHB1YmxpYyBBU1RXaGlsZVN0YXRlbWVudChKU1BhcnNlcjIwIHAsIGludCBpZCkKLSAgewotICAgIHN1cGVyKHAsIGlkKTsKLSAgfQotCi0KLSAgLyoqIEFjY2VwdCB0aGUgdmlzaXRvci4gKiovCi0gIHB1YmxpYyBPYmplY3Qgamp0QWNjZXB0KEpTUGFyc2VyMjBWaXNpdG9yIHZpc2l0b3IsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgcmV0dXJuIHZpc2l0b3IudmlzaXQodGhpcywgZGF0YSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVFdpdGhTdGF0ZW1lbnQuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVFdpdGhTdGF0ZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2E5ODEwYi4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RXaXRoU3RhdGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIEFTVFdpdGhTdGF0ZW1lbnQuamF2YSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5qYXZhc2NyaXB0MjBwYXJzZXI7Ci0KLXB1YmxpYyBjbGFzcyBBU1RXaXRoU3RhdGVtZW50IGV4dGVuZHMgU2ltcGxlTm9kZQotewotICBwdWJsaWMgQVNUV2l0aFN0YXRlbWVudChpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihpZCk7Ci0gIH0KLQotICBwdWJsaWMgQVNUV2l0aFN0YXRlbWVudChKU1BhcnNlcjIwIHAsIGludCBpZCkKLSAgewotICAgIHN1cGVyKHAsIGlkKTsKLSAgfQotCi0KLSAgLyoqIEFjY2VwdCB0aGUgdmlzaXRvci4gKiovCi0gIHB1YmxpYyBPYmplY3Qgamp0QWNjZXB0KEpTUGFyc2VyMjBWaXNpdG9yIHZpc2l0b3IsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgcmV0dXJuIHZpc2l0b3IudmlzaXQodGhpcywgZGF0YSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0pKVEpTUGFyc2VyMjBTdGF0ZS5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvSkpUSlNQYXJzZXIyMFN0YXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0MmNiNDMuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvSkpUSlNQYXJzZXIyMFN0YXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzAgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZTogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiAuXEpKVEpTUGFyc2VyMjBTdGF0ZS5qYXZhICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LmphdmFzY3JpcHQyMHBhcnNlcjsKLQotY2xhc3MgSkpUSlNQYXJzZXIyMFN0YXRlCi17Ci0gIHByaXZhdGUgamF2YS51dGlsLlN0YWNrIG5vZGVzOwotICBwcml2YXRlIGphdmEudXRpbC5TdGFjayBtYXJrczsKLQotICBwcml2YXRlIGludCAgICAgc3A7Ly8gbnVtYmVyIG9mIG5vZGVzIG9uIHN0YWNrCi0gIHByaXZhdGUgaW50ICAgICBtazsvLyBjdXJyZW50IG1hcmsKLSAgcHJpdmF0ZSBib29sZWFuIG5vZGVfY3JlYXRlZDsKLQotICBKSlRKU1BhcnNlcjIwU3RhdGUoKQotICB7Ci0gICAgbm9kZXMgPSBuZXcgamF2YS51dGlsLlN0YWNrKCk7Ci0gICAgbWFya3MgPSBuZXcgamF2YS51dGlsLlN0YWNrKCk7Ci0gICAgc3AgPSAwOwotICAgIG1rID0gMDsKLSAgfQotCi0gIC8qIERldGVybWluZXMgd2hldGhlciB0aGUgY3VycmVudCBub2RlIHdhcyBhY3R1YWxseSBjbG9zZWQgYW5kCi0gICAgIHB1c2hlZC4gIFRoaXMgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGluIHRoZSBmaW5hbCB1c2VyIGFjdGlvbiBvZiBhCi0gICAgIG5vZGUgc2NvcGUuICAqLwotICBib29sZWFuIG5vZGVDcmVhdGVkKCkKLSAgewotICAgIHJldHVybiBub2RlX2NyZWF0ZWQ7Ci0gIH0KLQotICAvKiBDYWxsIHRoaXMgdG8gcmVpbml0aWFsaXplIHRoZSBub2RlIHN0YWNrLiAgSXQgaXMgY2FsbGVkCi0gICAgIGF1dG9tYXRpY2FsbHkgYnkgdGhlIHBhcnNlcidzIFJlSW5pdCgpIG1ldGhvZC4gKi8KLSAgdm9pZCByZXNldCgpCi0gIHsKLSAgICBub2Rlcy5yZW1vdmVBbGxFbGVtZW50cygpOwotICAgIG1hcmtzLnJlbW92ZUFsbEVsZW1lbnRzKCk7Ci0gICAgc3AgPSAwOwotICAgIG1rID0gMDsKLSAgfQotCi0gIC8qIFJldHVybnMgdGhlIHJvb3Qgbm9kZSBvZiB0aGUgQVNULiAgSXQgb25seSBtYWtlcyBzZW5zZSB0byBjYWxsCi0gICAgIHRoaXMgYWZ0ZXIgYSBzdWNjZXNzZnVsIHBhcnNlLiAqLwotICBOb2RlIHJvb3ROb2RlKCkKLSAgewotICAgIHJldHVybiAoTm9kZSkgbm9kZXMuZWxlbWVudEF0KDApOwotICB9Ci0KLSAgLyogUHVzaGVzIGEgbm9kZSBvbiB0byB0aGUgc3RhY2suICovCi0gIHZvaWQgcHVzaE5vZGUoTm9kZSBuKQotICB7Ci0gICAgbm9kZXMucHVzaChuKTsKLSAgICArK3NwOwotICB9Ci0KLSAgLyogUmV0dXJucyB0aGUgbm9kZSBvbiB0aGUgdG9wIG9mIHRoZSBzdGFjaywgYW5kIHJlbW92ZSBpdCBmcm9tIHRoZQotICAgICBzdGFjay4gICovCi0gIE5vZGUgcG9wTm9kZSgpCi0gIHsKLQotICAgIGlmICgtLXNwIDwgbWspCi0gICAgewotICAgICAgbWsgPSAoKEludGVnZXIpIG1hcmtzLnBvcCgpKS5pbnRWYWx1ZSgpOwotICAgIH0KLQotICAgIHJldHVybiAoTm9kZSkgbm9kZXMucG9wKCk7Ci0gIH0KLQotICAvKiBSZXR1cm5zIHRoZSBub2RlIGN1cnJlbnRseSBvbiB0aGUgdG9wIG9mIHRoZSBzdGFjay4gKi8KLSAgTm9kZSBwZWVrTm9kZSgpCi0gIHsKLSAgICByZXR1cm4gKE5vZGUpIG5vZGVzLnBlZWsoKTsKLSAgfQotCi0gIC8qIFJldHVybnMgdGhlIG51bWJlciBvZiBjaGlsZHJlbiBvbiB0aGUgc3RhY2sgaW4gdGhlIGN1cnJlbnQgbm9kZQotICAgICBzY29wZS4gKi8KLSAgaW50IG5vZGVBcml0eSgpCi0gIHsKLSAgICByZXR1cm4gc3AgLSBtazsKLSAgfQotCi0KLSAgdm9pZCBjbGVhck5vZGVTY29wZShOb2RlIG4pCi0gIHsKLQotICAgIHdoaWxlIChzcCA+IG1rKQotICAgIHsKLSAgICAgIHBvcE5vZGUoKTsKLSAgICB9Ci0KLSAgICBtayA9ICgoSW50ZWdlcikgbWFya3MucG9wKCkpLmludFZhbHVlKCk7Ci0gIH0KLQotCi0gIHZvaWQgb3Blbk5vZGVTY29wZShOb2RlIG4pCi0gIHsKLSAgICBtYXJrcy5wdXNoKG5ldyBJbnRlZ2VyKG1rKSk7Ci0gICAgbWsgPSBzcDsKLSAgICBuLmpqdE9wZW4oKTsKLSAgfQotCi0KLSAgLyogQSBkZWZpbml0ZSBub2RlIGlzIGNvbnN0cnVjdGVkIGZyb20gYSBzcGVjaWZpZWQgbnVtYmVyIG9mCi0gICAgIGNoaWxkcmVuLiAgVGhhdCBudW1iZXIgb2Ygbm9kZXMgYXJlIHBvcHBlZCBmcm9tIHRoZSBzdGFjayBhbmQKLSAgICAgbWFkZSB0aGUgY2hpbGRyZW4gb2YgdGhlIGRlZmluaXRlIG5vZGUuICBUaGVuIHRoZSBkZWZpbml0ZSBub2RlCi0gICAgIGlzIHB1c2hlZCBvbiB0byB0aGUgc3RhY2suICovCi0gIHZvaWQgY2xvc2VOb2RlU2NvcGUoTm9kZSBuLCBpbnQgbnVtKQotICB7Ci0gICAgbWsgPSAoKEludGVnZXIpIG1hcmtzLnBvcCgpKS5pbnRWYWx1ZSgpOwotCi0gICAgd2hpbGUgKG51bS0tID4gMCkKLSAgICB7Ci0gICAgICBOb2RlIGMgPSBwb3BOb2RlKCk7Ci0gICAgICBjLmpqdFNldFBhcmVudChuKTsKLSAgICAgIG4uamp0QWRkQ2hpbGQoYywgbnVtKTsKLSAgICB9Ci0KLSAgICBuLmpqdENsb3NlKCk7Ci0gICAgcHVzaE5vZGUobik7Ci0gICAgbm9kZV9jcmVhdGVkID0gdHJ1ZTsKLSAgfQotCi0KLSAgLyogQSBjb25kaXRpb25hbCBub2RlIGlzIGNvbnN0cnVjdGVkIGlmIGl0cyBjb25kaXRpb24gaXMgdHJ1ZS4gIEFsbAotICAgICB0aGUgbm9kZXMgdGhhdCBoYXZlIGJlZW4gcHVzaGVkIHNpbmNlIHRoZSBub2RlIHdhcyBvcGVuZWQgYXJlCi0gICAgIG1hZGUgY2hpbGRyZW4gb2YgdGhlIHRoZSBjb25kaXRpb25hbCBub2RlLCB3aGljaCBpcyB0aGVuIHB1c2hlZAotICAgICBvbiB0byB0aGUgc3RhY2suICBJZiB0aGUgY29uZGl0aW9uIGlzIGZhbHNlIHRoZSBub2RlIGlzIG5vdAotICAgICBjb25zdHJ1Y3RlZCBhbmQgdGhleSBhcmUgbGVmdCBvbiB0aGUgc3RhY2suICovCi0gIHZvaWQgY2xvc2VOb2RlU2NvcGUoTm9kZSBuLCBib29sZWFuIGNvbmRpdGlvbikKLSAgewotCi0gICAgaWYgKGNvbmRpdGlvbikKLSAgICB7Ci0gICAgICBpbnQgYSA9IG5vZGVBcml0eSgpOwotICAgICAgbWsgPSAoKEludGVnZXIpIG1hcmtzLnBvcCgpKS5pbnRWYWx1ZSgpOwotCi0gICAgICB3aGlsZSAoYS0tID4gMCkKLSAgICAgIHsKLSAgICAgICAgTm9kZSBjID0gcG9wTm9kZSgpOwotICAgICAgICBjLmpqdFNldFBhcmVudChuKTsKLSAgICAgICAgbi5qanRBZGRDaGlsZChjLCBhKTsKLSAgICAgIH0KLQotICAgICAgbi5qanRDbG9zZSgpOwotICAgICAgcHVzaE5vZGUobik7Ci0gICAgICBub2RlX2NyZWF0ZWQgPSB0cnVlOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgbWsgPSAoKEludGVnZXIpIG1hcmtzLnBvcCgpKS5pbnRWYWx1ZSgpOwotICAgICAgbm9kZV9jcmVhdGVkID0gZmFsc2U7Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9KU1BhcnNlcjIwLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9KU1BhcnNlcjIwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4MTUzNGQuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvSlNQYXJzZXIyMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTQxMCArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlJkphdmFDQzogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBKU1BhcnNlcjIwLmphdmEgKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LmphdmFzY3JpcHQyMHBhcnNlcjsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1wdWJsaWMgY2xhc3MgSlNQYXJzZXIyMC8qQGJnZW4oamp0cmVlKSovaW1wbGVtZW50cyBKU1BhcnNlcjIwVHJlZUNvbnN0YW50cywgSlNQYXJzZXIyMENvbnN0YW50cyB7LypAYmdlbihqanRyZWUpKi8KLSAgcHJvdGVjdGVkIEpKVEpTUGFyc2VyMjBTdGF0ZSBqanRyZWUgPSBuZXcgSkpUSlNQYXJzZXIyMFN0YXRlKCk7Ly8KLSAgICAvLyBUaGlzIGlzIHRoZSByb290IG5vZGUgZm9yIHRoZSBwYXJzZSB0cmVlIChyb290IERPTSBub2RlLCB0cmVlIG9mIFNpbXBsZU5vZGUocykpCi0gICAgLy8KLSAgICBwcm90ZWN0ZWQgQVNUUHJvZ3JhbSBfamp0Um9vdDsKLQotICAgIHB1YmxpYyBBU1RQcm9ncmFtIGdldFJvb3ROb2RlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBfamp0Um9vdDsKLSAgICB9Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIEdSQU1NQVIgU2VjdGlvbgotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICBmaW5hbCBwdWJsaWMgVG9rZW4gUHJvZ3JhbSgpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gLypAYmdlbihqanRyZWUpIFByb2dyYW0gKi8KLSAgICAgICAgQVNUUHJvZ3JhbSBqanRuMDAwID0gbmV3IEFTVFByb2dyYW0odGhpcywgSkpUUFJPR1JBTSk7Ci0gICAgICAgIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7Ci0gICAgICAgIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApO1Rva2VuIHJldHZhbCA9IGdldFRva2VuKDEpOwotICAgIHRyeSB7Ci0gICAgICBsYWJlbF8xOgotICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7Ci0gICAgICAgIGNhc2UgUEFDS0FHRToKLSAgICAgICAgICA7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgampfbGExWzBdID0gampfZ2VuOwotICAgICAgICAgIGJyZWFrIGxhYmVsXzE7Ci0gICAgICAgIH0KLSAgICAgICAgUGFja2FnZURlZmluaXRpb24oKTsKLSAgICAgIH0KLSAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgY2FzZSBCUkVBSzoKLSAgICAgIGNhc2UgQ0xBU1M6Ci0gICAgICBjYXNlIENPTlNUOgotICAgICAgY2FzZSBDT05USU5VRToKLSAgICAgIGNhc2UgREVMRVRFOgotICAgICAgY2FzZSBETzoKLSAgICAgIGNhc2UgRkFMU0U6Ci0gICAgICBjYXNlIEZPUjoKLSAgICAgIGNhc2UgRlVOQ1RJT046Ci0gICAgICBjYXNlIEdFVDoKLSAgICAgIGNhc2UgSUY6Ci0gICAgICBjYXNlIElOQ0xVREU6Ci0gICAgICBjYXNlIE5BTUVTUEFDRToKLSAgICAgIGNhc2UgTkVXOgotICAgICAgY2FzZSBOVUxMOgotICAgICAgY2FzZSBQUklWQVRFOgotICAgICAgY2FzZSBQVUJMSUM6Ci0gICAgICBjYXNlIFJFVFVSTjoKLSAgICAgIGNhc2UgU0VUOgotICAgICAgY2FzZSBTVVBFUjoKLSAgICAgIGNhc2UgU1dJVENIOgotICAgICAgY2FzZSBUSElTOgotICAgICAgY2FzZSBUSFJPVzoKLSAgICAgIGNhc2UgVFJVRToKLSAgICAgIGNhc2UgVFJZOgotICAgICAgY2FzZSBUWVBFT0Y6Ci0gICAgICBjYXNlIFVTRToKLSAgICAgIGNhc2UgVkFSOgotICAgICAgY2FzZSBWT0lEOgotICAgICAgY2FzZSBXSElMRToKLSAgICAgIGNhc2UgV0lUSDoKLSAgICAgIGNhc2UgRVhQT1JUOgotICAgICAgY2FzZSBJTlRFUkZBQ0U6Ci0gICAgICBjYXNlIFBST1RFQ1RFRDoKLSAgICAgIGNhc2UgSU1QT1JUOgotICAgICAgY2FzZSBERUNJTUFMX0xJVEVSQUw6Ci0gICAgICBjYXNlIEhFWF9MSVRFUkFMOgotICAgICAgY2FzZSBPQ1RBTF9MSVRFUkFMOgotICAgICAgY2FzZSBGTE9BVElOR19QT0lOVF9MSVRFUkFMOgotICAgICAgY2FzZSBTVFJJTkdfTElURVJBTDoKLSAgICAgIGNhc2UgUkVHVUxBUl9FWFBSRVNTSU9OOgotICAgICAgY2FzZSBJREVOVElGSUVSOgotICAgICAgY2FzZSBMUEFSRU46Ci0gICAgICBjYXNlIExCUkFDRToKLSAgICAgIGNhc2UgTEJSQUNLRVQ6Ci0gICAgICBjYXNlIFNFTUlDT0xPTjoKLSAgICAgIGNhc2UgQkFORzoKLSAgICAgIGNhc2UgVElMREU6Ci0gICAgICBjYXNlIElOQ1I6Ci0gICAgICBjYXNlIERFQ1I6Ci0gICAgICBjYXNlIFBMVVM6Ci0gICAgICBjYXNlIE1JTlVTOgotICAgICAgICBEaXJlY3RpdmVzKCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgampfbGExWzFdID0gampfZ2VuOwotICAgICAgICA7Ci0gICAgICB9Ci0gICAgICBqal9jb25zdW1lX3Rva2VuKDApOwotICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsKLSAgICAgICAgICBqanRjMDAwID0gZmFsc2U7Ci0gICAgICAgICAgICBfamp0Um9vdCA9IGpqdG4wMDA7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHJldHVybiByZXR2YWw7fQotICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsKLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoRXJyb3Ipamp0ZTAwMDt9Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOwotICAgICAgICAgIH0KLSAgICB9Ci0gICAgdGhyb3cgbmV3IEVycm9yKCJNaXNzaW5nIHJldHVybiBzdGF0ZW1lbnQgaW4gZnVuY3Rpb24iKTsKLSAgfQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gRXhwcmVzc2lvbnMgCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gSWRlbnRpZmllciAKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gIGZpbmFsIHB1YmxpYyB2b2lkIElkZW50aWZpZXIoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotIC8qQGJnZW4oamp0cmVlKSBJZGVudGlmaWVyICovCi0gIEFTVElkZW50aWZpZXIgamp0bjAwMCA9IG5ldyBBU1RJZGVudGlmaWVyKHRoaXMsIEpKVElERU5USUZJRVIpOwotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOwotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsKLSAgICB0cnkgewotICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7Ci0gICAgICBjYXNlIElERU5USUZJRVI6Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oSURFTlRJRklFUik7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBHRVQ6Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oR0VUKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIFNFVDoKLSAgICAgICAgampfY29uc3VtZV90b2tlbihTRVQpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgSU5DTFVERToKLSAgICAgICAgampfY29uc3VtZV90b2tlbihJTkNMVURFKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICBqal9sYTFbMl0gPSBqal9nZW47Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oLTEpOwotICAgICAgICB0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oKTsKLSAgICAgIH0KLSAgICB9IGZpbmFsbHkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7Ci0gICAgICAgICAgfQotICAgIH0KLSAgfQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gUXVhbGlmaWVkIElkZW50aWZpZXIgCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICBmaW5hbCBwdWJsaWMgdm9pZCBTaW1wbGVRdWFsaWZpZWRJZGVudGlmaWVyKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAvKkBiZ2VuKGpqdHJlZSkgU2ltcGxlUXVhbGlmaWVkSWRlbnRpZmllciAqLwotICBBU1RTaW1wbGVRdWFsaWZpZWRJZGVudGlmaWVyIGpqdG4wMDAgPSBuZXcgQVNUU2ltcGxlUXVhbGlmaWVkSWRlbnRpZmllcih0aGlzLCBKSlRTSU1QTEVRVUFMSUZJRURJREVOVElGSUVSKTsKLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsKLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgdHJ5IHsKLSAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgY2FzZSBHRVQ6Ci0gICAgICBjYXNlIElOQ0xVREU6Ci0gICAgICBjYXNlIFNFVDoKLSAgICAgIGNhc2UgSURFTlRJRklFUjoKLSAgICAgICAgSWRlbnRpZmllcigpOwotICAgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKLSAgICAgICAgY2FzZSBRVUFMSUZJRVI6Ci0gICAgICAgICAgampfY29uc3VtZV90b2tlbihRVUFMSUZJRVIpOwotICAgICAgICAgIElkZW50aWZpZXIoKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICBqal9sYTFbM10gPSBqal9nZW47Ci0gICAgICAgICAgOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBQUklWQVRFOgotICAgICAgY2FzZSBQVUJMSUM6Ci0gICAgICBjYXNlIFBST1RFQ1RFRDoKLSAgICAgICAgUmVzZXJ2ZWROYW1lc3BhY2UoKTsKLSAgICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7Ci0gICAgICAgIGNhc2UgUVVBTElGSUVSOgotICAgICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oUVVBTElGSUVSKTsKLSAgICAgICAgICBJZGVudGlmaWVyKCk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgampfbGExWzRdID0gampfZ2VuOwotICAgICAgICAgIDsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIGpqX2xhMVs1XSA9IGpqX2dlbjsKLSAgICAgICAgampfY29uc3VtZV90b2tlbigtMSk7Ci0gICAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigpOwotICAgICAgfQotICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7Ci0gICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsKLSAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7Ci0gICAgICAgICB9Ci0gICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKLSAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgIH0KLSAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsKLSAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICB9Ci0gICAgICAgICB7aWYgKHRydWUpIHRocm93IChFcnJvcilqanRlMDAwO30KLSAgICB9IGZpbmFsbHkgewotICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOwotICAgICAgICAgfQotICAgIH0KLSAgfQotCi0gIGZpbmFsIHB1YmxpYyB2b2lkIEV4cHJlc3Npb25RdWFsaWZpZWRJZGVudGlmaWVyKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAvKkBiZ2VuKGpqdHJlZSkgRXhwcmVzc2lvblF1YWxpZmllZElkZW50aWZpZXIgKi8KLSAgQVNURXhwcmVzc2lvblF1YWxpZmllZElkZW50aWZpZXIgamp0bjAwMCA9IG5ldyBBU1RFeHByZXNzaW9uUXVhbGlmaWVkSWRlbnRpZmllcih0aGlzLCBKSlRFWFBSRVNTSU9OUVVBTElGSUVESURFTlRJRklFUik7Ci0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7Ci0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOwotICAgIHRyeSB7Ci0gICAgICBqal9jb25zdW1lX3Rva2VuKExQQVJFTik7Ci0gICAgICBBc3NpZ25tZW50RXhwcmVzc2lvbigpOwotICAgICAgampfY29uc3VtZV90b2tlbihSUEFSRU4pOwotICAgICAgampfY29uc3VtZV90b2tlbihRVUFMSUZJRVIpOwotICAgICAgSWRlbnRpZmllcigpOwotICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7Ci0gICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsKLSAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7Ci0gICAgICAgICB9Ci0gICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKLSAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgIH0KLSAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsKLSAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICB9Ci0gICAgICAgICB7aWYgKHRydWUpIHRocm93IChFcnJvcilqanRlMDAwO30KLSAgICB9IGZpbmFsbHkgewotICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOwotICAgICAgICAgfQotICAgIH0KLSAgfQotCi0gIGZpbmFsIHB1YmxpYyB2b2lkIFF1YWxpZmllZElkZW50aWZpZXIoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotIC8qQGJnZW4oamp0cmVlKSBRdWFsaWZpZWRJZGVudGlmaWVyICovCi0gIEFTVFF1YWxpZmllZElkZW50aWZpZXIgamp0bjAwMCA9IG5ldyBBU1RRdWFsaWZpZWRJZGVudGlmaWVyKHRoaXMsIEpKVFFVQUxJRklFRElERU5USUZJRVIpOwotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOwotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsKLSAgICB0cnkgewotICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7Ci0gICAgICBjYXNlIEdFVDoKLSAgICAgIGNhc2UgSU5DTFVERToKLSAgICAgIGNhc2UgUFJJVkFURToKLSAgICAgIGNhc2UgUFVCTElDOgotICAgICAgY2FzZSBTRVQ6Ci0gICAgICBjYXNlIFBST1RFQ1RFRDoKLSAgICAgIGNhc2UgSURFTlRJRklFUjoKLSAgICAgICAgU2ltcGxlUXVhbGlmaWVkSWRlbnRpZmllcigpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgTFBBUkVOOgotICAgICAgICBFeHByZXNzaW9uUXVhbGlmaWVkSWRlbnRpZmllcigpOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIGpqX2xhMVs2XSA9IGpqX2dlbjsKLSAgICAgICAgampfY29uc3VtZV90b2tlbigtMSk7Ci0gICAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigpOwotICAgICAgfQotICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7Ci0gICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsKLSAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7Ci0gICAgICAgICB9Ci0gICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKLSAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgIH0KLSAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsKLSAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICB9Ci0gICAgICAgICB7aWYgKHRydWUpIHRocm93IChFcnJvcilqanRlMDAwO30KLSAgICB9IGZpbmFsbHkgewotICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOwotICAgICAgICAgfQotICAgIH0KLSAgfQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gUHJpbWFyeSBFeHByZXNzaW9ucwotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgZmluYWwgcHVibGljIHZvaWQgUHJpbWFyeUV4cHJlc3Npb24oKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotIC8qQGJnZW4oamp0cmVlKSBQcmltYXJ5RXhwcmVzc2lvbiAqLwotICBBU1RQcmltYXJ5RXhwcmVzc2lvbiBqanRuMDAwID0gbmV3IEFTVFByaW1hcnlFeHByZXNzaW9uKHRoaXMsIEpKVFBSSU1BUllFWFBSRVNTSU9OKTsKLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsKLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgdHJ5IHsKLSAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgY2FzZSBOVUxMOgotICAgICAgICBqal9jb25zdW1lX3Rva2VuKE5VTEwpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgVFJVRToKLSAgICAgICAgampfY29uc3VtZV90b2tlbihUUlVFKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIEZBTFNFOgotICAgICAgICBqal9jb25zdW1lX3Rva2VuKEZBTFNFKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIERFQ0lNQUxfTElURVJBTDoKLSAgICAgICAgampfY29uc3VtZV90b2tlbihERUNJTUFMX0xJVEVSQUwpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgT0NUQUxfTElURVJBTDoKLSAgICAgICAgampfY29uc3VtZV90b2tlbihPQ1RBTF9MSVRFUkFMKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIEhFWF9MSVRFUkFMOgotICAgICAgICBqal9jb25zdW1lX3Rva2VuKEhFWF9MSVRFUkFMKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIEZMT0FUSU5HX1BPSU5UX0xJVEVSQUw6Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oRkxPQVRJTkdfUE9JTlRfTElURVJBTCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBTVFJJTkdfTElURVJBTDoKLSAgICAgICAgampfY29uc3VtZV90b2tlbihTVFJJTkdfTElURVJBTCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBUSElTOgotICAgICAgICBqal9jb25zdW1lX3Rva2VuKFRISVMpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgUkVHVUxBUl9FWFBSRVNTSU9OOgotICAgICAgICBqal9jb25zdW1lX3Rva2VuKFJFR1VMQVJfRVhQUkVTU0lPTik7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBMUEFSRU46Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oTFBBUkVOKTsKLSAgICAgICAgTGlzdEV4cHJlc3Npb24oKTsKLSAgICAgICAgampfY29uc3VtZV90b2tlbihSUEFSRU4pOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgTEJSQUNLRVQ6Ci0gICAgICAgIEFycmF5TGl0ZXJhbCgpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgTEJSQUNFOgotICAgICAgICBPYmplY3RMaXRlcmFsKCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBGVU5DVElPTjoKLSAgICAgICAgRnVuY3Rpb25FeHByZXNzaW9uKCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgampfbGExWzddID0gampfZ2VuOwotICAgICAgICBqal9jb25zdW1lX3Rva2VuKC0xKTsKLSAgICAgICAgdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCk7Ci0gICAgICB9Ci0gICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7Ci0gICAgICBqanRjMDAwID0gZmFsc2U7Ci0gICAgICAgIHRva2VuX3NvdXJjZS5zZXRSZWdWYWxpZCgpOwotICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7Ci0gICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgIGpqdGMwMDAgPSBmYWxzZTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7Ci0gICAgICB9Ci0gICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKLSAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgIH0KLSAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsKLSAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICB9Ci0gICAgICB7aWYgKHRydWUpIHRocm93IChFcnJvcilqanRlMDAwO30KLSAgICB9IGZpbmFsbHkgewotICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIGZpbmFsIHB1YmxpYyB2b2lkIFJlc2VydmVkTmFtZXNwYWNlKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAvKkBiZ2VuKGpqdHJlZSkgUmVzZXJ2ZWROYW1lc3BhY2UgKi8KLSAgQVNUUmVzZXJ2ZWROYW1lc3BhY2Ugamp0bjAwMCA9IG5ldyBBU1RSZXNlcnZlZE5hbWVzcGFjZSh0aGlzLCBKSlRSRVNFUlZFRE5BTUVTUEFDRSk7Ci0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7Ci0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOwotICAgIHRyeSB7Ci0gICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKLSAgICAgIGNhc2UgUFVCTElDOgotICAgICAgICBqal9jb25zdW1lX3Rva2VuKFBVQkxJQyk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBQUk9URUNURUQ6Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oUFJPVEVDVEVEKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIFBSSVZBVEU6Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oUFJJVkFURSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgampfbGExWzhdID0gampfZ2VuOwotICAgICAgICBqal9jb25zdW1lX3Rva2VuKC0xKTsKLSAgICAgICAgdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCk7Ci0gICAgICB9Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsKLSAgICAgICAgIH0KLSAgICB9Ci0gIH0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIEZ1bmN0aW9uIEV4cHJlc3Npb24KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gIGZpbmFsIHB1YmxpYyB2b2lkIEZ1bmN0aW9uRXhwcmVzc2lvbigpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gLypAYmdlbihqanRyZWUpIEZ1bmN0aW9uRXhwcmVzc2lvbiAqLwotICBBU1RGdW5jdGlvbkV4cHJlc3Npb24gamp0bjAwMCA9IG5ldyBBU1RGdW5jdGlvbkV4cHJlc3Npb24odGhpcywgSkpURlVOQ1RJT05FWFBSRVNTSU9OKTsKLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsKLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgdHJ5IHsKLSAgICAgIGlmIChqal8yXzEoMikpIHsKLSAgICAgICAgampfY29uc3VtZV90b2tlbihGVU5DVElPTik7Ci0gICAgICAgIEZ1bmN0aW9uQ29tbW9uKCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKLSAgICAgICAgY2FzZSBGVU5DVElPTjoKLSAgICAgICAgICBqal9jb25zdW1lX3Rva2VuKEZVTkNUSU9OKTsKLSAgICAgICAgICBJZGVudGlmaWVyKCk7Ci0gICAgICAgICAgRnVuY3Rpb25Db21tb24oKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICBqal9sYTFbOV0gPSBqal9nZW47Ci0gICAgICAgICAgampfY29uc3VtZV90b2tlbigtMSk7Ci0gICAgICAgICAgdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKEVycm9yKWpqdGUwMDA7fQotICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsKLSAgICAgICAgICB9Ci0gICAgfQotICB9Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyBPYmplY3QgTGl0ZXJhbHMKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gIGZpbmFsIHB1YmxpYyB2b2lkIE9iamVjdExpdGVyYWwoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotIC8qQGJnZW4oamp0cmVlKSBPYmplY3RMaXRlcmFsICovCi0gIEFTVE9iamVjdExpdGVyYWwgamp0bjAwMCA9IG5ldyBBU1RPYmplY3RMaXRlcmFsKHRoaXMsIEpKVE9CSkVDVExJVEVSQUwpOwotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOwotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsKLSAgICB0cnkgewotICAgICAgampfY29uc3VtZV90b2tlbihMQlJBQ0UpOwotICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7Ci0gICAgICBjYXNlIEdFVDoKLSAgICAgIGNhc2UgSU5DTFVERToKLSAgICAgIGNhc2UgUFJJVkFURToKLSAgICAgIGNhc2UgUFVCTElDOgotICAgICAgY2FzZSBTRVQ6Ci0gICAgICBjYXNlIFBST1RFQ1RFRDoKLSAgICAgIGNhc2UgREVDSU1BTF9MSVRFUkFMOgotICAgICAgY2FzZSBTVFJJTkdfTElURVJBTDoKLSAgICAgIGNhc2UgSURFTlRJRklFUjoKLSAgICAgIGNhc2UgTFBBUkVOOgotICAgICAgICBGaWVsZExpc3QoKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICBqal9sYTFbMTBdID0gampfZ2VuOwotICAgICAgICA7Ci0gICAgICB9Ci0gICAgICBqal9jb25zdW1lX3Rva2VuKFJCUkFDRSk7Ci0gICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChFcnJvcilqanRlMDAwO30KLSAgICB9IGZpbmFsbHkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7Ci0gICAgICAgICAgfQotICAgIH0KLSAgfQotCi0gIGZpbmFsIHB1YmxpYyB2b2lkIEZpZWxkTGlzdCgpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gLypAYmdlbihqanRyZWUpIEZpZWxkTGlzdCAqLwotICBBU1RGaWVsZExpc3Qgamp0bjAwMCA9IG5ldyBBU1RGaWVsZExpc3QodGhpcywgSkpURklFTERMSVNUKTsKLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsKLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgdHJ5IHsKLSAgICAgIExpdGVyYWxGaWVsZCgpOwotICAgICAgbGFiZWxfMjoKLSAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgICBjYXNlIENPTU1BOgotICAgICAgICAgIDsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICBqal9sYTFbMTFdID0gampfZ2VuOwotICAgICAgICAgIGJyZWFrIGxhYmVsXzI7Ci0gICAgICAgIH0KLSAgICAgICAgampfY29uc3VtZV90b2tlbihDT01NQSk7Ci0gICAgICAgIExpdGVyYWxGaWVsZCgpOwotICAgICAgfQotICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsKLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoRXJyb3Ipamp0ZTAwMDt9Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOwotICAgICAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBmaW5hbCBwdWJsaWMgdm9pZCBMaXRlcmFsRmllbGQoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotIC8qQGJnZW4oamp0cmVlKSBMaXRlcmFsRmllbGQgKi8KLSAgQVNUTGl0ZXJhbEZpZWxkIGpqdG4wMDAgPSBuZXcgQVNUTGl0ZXJhbEZpZWxkKHRoaXMsIEpKVExJVEVSQUxGSUVMRCk7Ci0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7Ci0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOwotICAgIHRyeSB7Ci0gICAgICBGaWVsZE5hbWUoKTsKLSAgICAgIGpqX2NvbnN1bWVfdG9rZW4oQ09MT04pOwotICAgICAgQXNzaWdubWVudEV4cHJlc3Npb24oKTsKLSAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKEVycm9yKWpqdGUwMDA7fQotICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsKLSAgICAgICAgICB9Ci0gICAgfQotICB9Ci0KLSAgZmluYWwgcHVibGljIHZvaWQgRmllbGROYW1lKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAvKkBiZ2VuKGpqdHJlZSkgRmllbGROYW1lICovCi0gIEFTVEZpZWxkTmFtZSBqanRuMDAwID0gbmV3IEFTVEZpZWxkTmFtZSh0aGlzLCBKSlRGSUVMRE5BTUUpOwotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOwotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsKLSAgICB0cnkgewotICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7Ci0gICAgICBjYXNlIFNUUklOR19MSVRFUkFMOgotICAgICAgICBqal9jb25zdW1lX3Rva2VuKFNUUklOR19MSVRFUkFMKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIERFQ0lNQUxfTElURVJBTDoKLSAgICAgICAgampfY29uc3VtZV90b2tlbihERUNJTUFMX0xJVEVSQUwpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgR0VUOgotICAgICAgY2FzZSBJTkNMVURFOgotICAgICAgY2FzZSBQUklWQVRFOgotICAgICAgY2FzZSBQVUJMSUM6Ci0gICAgICBjYXNlIFNFVDoKLSAgICAgIGNhc2UgUFJPVEVDVEVEOgotICAgICAgY2FzZSBJREVOVElGSUVSOgotICAgICAgICBTaW1wbGVRdWFsaWZpZWRJZGVudGlmaWVyKCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBMUEFSRU46Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oTFBBUkVOKTsKLSAgICAgICAgQXNzaWdubWVudEV4cHJlc3Npb24oKTsKLSAgICAgICAgampfY29uc3VtZV90b2tlbihSUEFSRU4pOwotICAgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKLSAgICAgICAgY2FzZSBRVUFMSUZJRVI6Ci0gICAgICAgICAgampfY29uc3VtZV90b2tlbihRVUFMSUZJRVIpOwotICAgICAgICAgIElkZW50aWZpZXIoKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICBqal9sYTFbMTJdID0gampfZ2VuOwotICAgICAgICAgIDsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIGpqX2xhMVsxM10gPSBqal9nZW47Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oLTEpOwotICAgICAgICB0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oKTsKLSAgICAgIH0KLSAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKEVycm9yKWpqdGUwMDA7fQotICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsKLSAgICAgICAgICB9Ci0gICAgfQotICB9Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyBBcnJheSBMaXRlcmFsCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICBmaW5hbCBwdWJsaWMgdm9pZCBBcnJheUxpdGVyYWwoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotIC8qQGJnZW4oamp0cmVlKSBBcnJheUxpdGVyYWwgKi8KLSAgQVNUQXJyYXlMaXRlcmFsIGpqdG4wMDAgPSBuZXcgQVNUQXJyYXlMaXRlcmFsKHRoaXMsIEpKVEFSUkFZTElURVJBTCk7Ci0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7Ci0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOwotICAgIHRyeSB7Ci0gICAgICBqal9jb25zdW1lX3Rva2VuKExCUkFDS0VUKTsKLSAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgY2FzZSBERUxFVEU6Ci0gICAgICBjYXNlIEZBTFNFOgotICAgICAgY2FzZSBGVU5DVElPTjoKLSAgICAgIGNhc2UgR0VUOgotICAgICAgY2FzZSBJTkNMVURFOgotICAgICAgY2FzZSBORVc6Ci0gICAgICBjYXNlIE5VTEw6Ci0gICAgICBjYXNlIFBSSVZBVEU6Ci0gICAgICBjYXNlIFBVQkxJQzoKLSAgICAgIGNhc2UgU0VUOgotICAgICAgY2FzZSBTVVBFUjoKLSAgICAgIGNhc2UgVEhJUzoKLSAgICAgIGNhc2UgVFJVRToKLSAgICAgIGNhc2UgVFlQRU9GOgotICAgICAgY2FzZSBWT0lEOgotICAgICAgY2FzZSBQUk9URUNURUQ6Ci0gICAgICBjYXNlIERFQ0lNQUxfTElURVJBTDoKLSAgICAgIGNhc2UgSEVYX0xJVEVSQUw6Ci0gICAgICBjYXNlIE9DVEFMX0xJVEVSQUw6Ci0gICAgICBjYXNlIEZMT0FUSU5HX1BPSU5UX0xJVEVSQUw6Ci0gICAgICBjYXNlIFNUUklOR19MSVRFUkFMOgotICAgICAgY2FzZSBSRUdVTEFSX0VYUFJFU1NJT046Ci0gICAgICBjYXNlIElERU5USUZJRVI6Ci0gICAgICBjYXNlIExQQVJFTjoKLSAgICAgIGNhc2UgTEJSQUNFOgotICAgICAgY2FzZSBMQlJBQ0tFVDoKLSAgICAgIGNhc2UgQkFORzoKLSAgICAgIGNhc2UgVElMREU6Ci0gICAgICBjYXNlIElOQ1I6Ci0gICAgICBjYXNlIERFQ1I6Ci0gICAgICBjYXNlIFBMVVM6Ci0gICAgICBjYXNlIE1JTlVTOgotICAgICAgICBFbGVtZW50TGlzdCgpOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIGpqX2xhMVsxNF0gPSBqal9nZW47Ci0gICAgICAgIDsKLSAgICAgIH0KLSAgICAgIGpqX2NvbnN1bWVfdG9rZW4oUkJSQUNLRVQpOwotICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsKLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoRXJyb3Ipamp0ZTAwMDt9Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOwotICAgICAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBmaW5hbCBwdWJsaWMgdm9pZCBFbGVtZW50TGlzdCgpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gLypAYmdlbihqanRyZWUpIEVsZW1lbnRMaXN0ICovCi0gIEFTVEVsZW1lbnRMaXN0IGpqdG4wMDAgPSBuZXcgQVNURWxlbWVudExpc3QodGhpcywgSkpURUxFTUVOVExJU1QpOwotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOwotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsKLSAgICB0cnkgewotICAgICAgTGl0ZXJhbEVsZW1lbnQoKTsKLSAgICAgIGxhYmVsXzM6Ci0gICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKLSAgICAgICAgY2FzZSBDT01NQToKLSAgICAgICAgICA7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgampfbGExWzE1XSA9IGpqX2dlbjsKLSAgICAgICAgICBicmVhayBsYWJlbF8zOwotICAgICAgICB9Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oQ09NTUEpOwotICAgICAgICBMaXRlcmFsRWxlbWVudCgpOwotICAgICAgfQotICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsKLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoRXJyb3Ipamp0ZTAwMDt9Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOwotICAgICAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBmaW5hbCBwdWJsaWMgdm9pZCBMaXRlcmFsRWxlbWVudCgpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gLypAYmdlbihqanRyZWUpIExpdGVyYWxFbGVtZW50ICovCi0gIEFTVExpdGVyYWxFbGVtZW50IGpqdG4wMDAgPSBuZXcgQVNUTGl0ZXJhbEVsZW1lbnQodGhpcywgSkpUTElURVJBTEVMRU1FTlQpOwotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOwotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsKLSAgICB0cnkgewotICAgICAgQXNzaWdubWVudEV4cHJlc3Npb24oKTsKLSAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKEVycm9yKWpqdGUwMDA7fQotICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsKLSAgICAgICAgICB9Ci0gICAgfQotICB9Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyBTdXBlciBFeHByZXNzaW9uCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICBmaW5hbCBwdWJsaWMgdm9pZCBTdXBlckV4cHJlc3Npb24oKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotIC8qQGJnZW4oamp0cmVlKSBTdXBlckV4cHJlc3Npb24gKi8KLSAgQVNUU3VwZXJFeHByZXNzaW9uIGpqdG4wMDAgPSBuZXcgQVNUU3VwZXJFeHByZXNzaW9uKHRoaXMsIEpKVFNVUEVSRVhQUkVTU0lPTik7Ci0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7Ci0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOwotICAgIHRyeSB7Ci0gICAgICBqal9jb25zdW1lX3Rva2VuKFNVUEVSKTsKLSAgICAgIGlmIChqal8yXzIoMikpIHsKLSAgICAgICAgampfY29uc3VtZV90b2tlbihMUEFSRU4pOwotICAgICAgICBBc3NpZ25tZW50RXhwcmVzc2lvbigpOwotICAgICAgICBqal9jb25zdW1lX3Rva2VuKFJQQVJFTik7Ci0gICAgICB9IGVsc2UgewotICAgICAgICA7Ci0gICAgICB9Ci0gICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChFcnJvcilqanRlMDAwO30KLSAgICB9IGZpbmFsbHkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7Ci0gICAgICAgICAgfQotICAgIH0KLSAgfQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gUG9zdGZpeCBFeHByZXNzaW9uCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICBmaW5hbCBwdWJsaWMgdm9pZCBQb3N0Zml4RXhwcmVzc2lvbigpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gLypAYmdlbihqanRyZWUpIFBvc3RmaXhFeHByZXNzaW9uICovCi0gIEFTVFBvc3RmaXhFeHByZXNzaW9uIGpqdG4wMDAgPSBuZXcgQVNUUG9zdGZpeEV4cHJlc3Npb24odGhpcywgSkpUUE9TVEZJWEVYUFJFU1NJT04pOwotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOwotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsKLSAgICB0cnkgewotICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7Ci0gICAgICBjYXNlIEdFVDoKLSAgICAgIGNhc2UgSU5DTFVERToKLSAgICAgIGNhc2UgUFJJVkFURToKLSAgICAgIGNhc2UgUFVCTElDOgotICAgICAgY2FzZSBTRVQ6Ci0gICAgICBjYXNlIFBST1RFQ1RFRDoKLSAgICAgIGNhc2UgSURFTlRJRklFUjoKLSAgICAgICAgQXR0cmlidXRlRXhwcmVzc2lvbigpOwotICAgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKLSAgICAgICAgY2FzZSBJTkNSOgotICAgICAgICBjYXNlIERFQ1I6Ci0gICAgICAgICAgUG9zdGZpeE9wKCk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgampfbGExWzE2XSA9IGpqX2dlbjsKLSAgICAgICAgICA7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIEZBTFNFOgotICAgICAgY2FzZSBGVU5DVElPTjoKLSAgICAgIGNhc2UgTkVXOgotICAgICAgY2FzZSBOVUxMOgotICAgICAgY2FzZSBUSElTOgotICAgICAgY2FzZSBUUlVFOgotICAgICAgY2FzZSBERUNJTUFMX0xJVEVSQUw6Ci0gICAgICBjYXNlIEhFWF9MSVRFUkFMOgotICAgICAgY2FzZSBPQ1RBTF9MSVRFUkFMOgotICAgICAgY2FzZSBGTE9BVElOR19QT0lOVF9MSVRFUkFMOgotICAgICAgY2FzZSBTVFJJTkdfTElURVJBTDoKLSAgICAgIGNhc2UgUkVHVUxBUl9FWFBSRVNTSU9OOgotICAgICAgY2FzZSBMUEFSRU46Ci0gICAgICBjYXNlIExCUkFDRToKLSAgICAgIGNhc2UgTEJSQUNLRVQ6Ci0gICAgICAgICB0b2tlbl9zb3VyY2Uuc2V0UmVnSW52YWxpZCgpOwotICAgICAgICBGdWxsUG9zdGZpeEV4cHJlc3Npb24oKTsKLSAgICAgICAgbGFiZWxfNDoKLSAgICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKLSAgICAgICAgICBjYXNlIExQQVJFTjoKLSAgICAgICAgICBjYXNlIExCUkFDS0VUOgotICAgICAgICAgIGNhc2UgRE9UOgotICAgICAgICAgICAgOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGpqX2xhMVsxN10gPSBqal9nZW47Ci0gICAgICAgICAgICBicmVhayBsYWJlbF80OwotICAgICAgICAgIH0KLSAgICAgICAgICBQcm9wZXJ0eU9yQXJndW1lbnRzKCk7Ci0gICAgICAgIH0KLSAgICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7Ci0gICAgICAgIGNhc2UgSU5DUjoKLSAgICAgICAgY2FzZSBERUNSOgotICAgICAgICAgIFBvc3RmaXhPcCgpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIGpqX2xhMVsxOF0gPSBqal9nZW47Ci0gICAgICAgICAgOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBTVVBFUjoKLSAgICAgICAgU3VwZXJFeHByZXNzaW9uKCk7Ci0gICAgICAgIFByb3BlcnR5T3BlcmF0b3IoKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICBqal9sYTFbMTldID0gampfZ2VuOwotICAgICAgICBqal9jb25zdW1lX3Rva2VuKC0xKTsKLSAgICAgICAgdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCk7Ci0gICAgICB9Ci0gICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChFcnJvcilqanRlMDAwO30KLSAgICB9IGZpbmFsbHkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7Ci0gICAgICAgICAgfQotICAgIH0KLSAgfQotCi0gIGZpbmFsIHB1YmxpYyB2b2lkIEF0dHJpYnV0ZUV4cHJlc3Npb24oKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotIC8qQGJnZW4oamp0cmVlKSBBdHRyaWJ1dGVFeHByZXNzaW9uICovCi0gIEFTVEF0dHJpYnV0ZUV4cHJlc3Npb24gamp0bjAwMCA9IG5ldyBBU1RBdHRyaWJ1dGVFeHByZXNzaW9uKHRoaXMsIEpKVEFUVFJJQlVURUVYUFJFU1NJT04pOwotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOwotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsKLSAgICB0cnkgewotICAgICAgU2ltcGxlUXVhbGlmaWVkSWRlbnRpZmllcigpOwotICAgICAgbGFiZWxfNToKLSAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgICBjYXNlIExQQVJFTjoKLSAgICAgICAgY2FzZSBMQlJBQ0tFVDoKLSAgICAgICAgY2FzZSBET1Q6Ci0gICAgICAgICAgOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIGpqX2xhMVsyMF0gPSBqal9nZW47Ci0gICAgICAgICAgYnJlYWsgbGFiZWxfNTsKLSAgICAgICAgfQotICAgICAgICBQcm9wZXJ0eU9yQXJndW1lbnRzKCk7Ci0gICAgICB9Ci0gICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChFcnJvcilqanRlMDAwO30KLSAgICB9IGZpbmFsbHkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7Ci0gICAgICAgICAgfQotICAgIH0KLSAgfQotCi0gIGZpbmFsIHB1YmxpYyB2b2lkIEZ1bGxQb3N0Zml4RXhwcmVzc2lvbigpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gLypAYmdlbihqanRyZWUpIEZ1bGxQb3N0Zml4RXhwcmVzc2lvbiAqLwotICBBU1RGdWxsUG9zdGZpeEV4cHJlc3Npb24gamp0bjAwMCA9IG5ldyBBU1RGdWxsUG9zdGZpeEV4cHJlc3Npb24odGhpcywgSkpURlVMTFBPU1RGSVhFWFBSRVNTSU9OKTsKLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsKLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgdHJ5IHsKLSAgICAgIGlmIChqal8yXzMoMjE0NzQ4MzY0NykpIHsKLSAgICAgICAgRXhwcmVzc2lvblF1YWxpZmllZElkZW50aWZpZXIoKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgICBjYXNlIEZBTFNFOgotICAgICAgICBjYXNlIEZVTkNUSU9OOgotICAgICAgICBjYXNlIE5VTEw6Ci0gICAgICAgIGNhc2UgVEhJUzoKLSAgICAgICAgY2FzZSBUUlVFOgotICAgICAgICBjYXNlIERFQ0lNQUxfTElURVJBTDoKLSAgICAgICAgY2FzZSBIRVhfTElURVJBTDoKLSAgICAgICAgY2FzZSBPQ1RBTF9MSVRFUkFMOgotICAgICAgICBjYXNlIEZMT0FUSU5HX1BPSU5UX0xJVEVSQUw6Ci0gICAgICAgIGNhc2UgU1RSSU5HX0xJVEVSQUw6Ci0gICAgICAgIGNhc2UgUkVHVUxBUl9FWFBSRVNTSU9OOgotICAgICAgICBjYXNlIExQQVJFTjoKLSAgICAgICAgY2FzZSBMQlJBQ0U6Ci0gICAgICAgIGNhc2UgTEJSQUNLRVQ6Ci0gICAgICAgICAgUHJpbWFyeUV4cHJlc3Npb24oKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBORVc6Ci0gICAgICAgICAgRnVsbE5ld0V4cHJlc3Npb24oKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICBqal9sYTFbMjFdID0gampfZ2VuOwotICAgICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oLTEpOwotICAgICAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsKLSAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsKLSAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOwotICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsKLSAgICAgICAgIH0KLSAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgewotICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgfQotICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgewotICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgIH0KLSAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKEVycm9yKWpqdGUwMDA7fQotICAgIH0gZmluYWxseSB7Ci0gICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7Ci0gICAgICAgICB9Ci0gICAgfQotICB9Ci0KLSAgZmluYWwgcHVibGljIHZvaWQgRnVsbE5ld0V4cHJlc3Npb24oKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotIC8qQGJnZW4oamp0cmVlKSBGdWxsTmV3RXhwcmVzc2lvbiAqLwotICBBU1RGdWxsTmV3RXhwcmVzc2lvbiBqanRuMDAwID0gbmV3IEFTVEZ1bGxOZXdFeHByZXNzaW9uKHRoaXMsIEpKVEZVTExORVdFWFBSRVNTSU9OKTsKLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsKLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgdHJ5IHsKLSAgICAgIGpqX2NvbnN1bWVfdG9rZW4oTkVXKTsKLSAgICAgIEZ1bGxOZXdTdWJleHByZXNzaW9uKCk7Ci0gICAgICBsYWJlbF82OgotICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgaWYgKGpqXzJfNCgyKSkgewotICAgICAgICAgIDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBicmVhayBsYWJlbF82OwotICAgICAgICB9Ci0gICAgICAgIFByb3BlcnR5T3BlcmF0b3IoKTsKLSAgICAgIH0KLSAgICAgIGlmIChqal8yXzUoMikpIHsKLSAgICAgICAgQXJndW1lbnRzKCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICA7Ci0gICAgICB9Ci0gICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChFcnJvcilqanRlMDAwO30KLSAgICB9IGZpbmFsbHkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7Ci0gICAgICAgICAgfQotICAgIH0KLSAgfQotCi0gIGZpbmFsIHB1YmxpYyB2b2lkIEZ1bmN0aW9uQ29uc3RydWN0b3IoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotIC8qQGJnZW4oamp0cmVlKSBGdW5jdGlvbkNvbnN0cnVjdG9yICovCi0gIEFTVEZ1bmN0aW9uQ29uc3RydWN0b3Igamp0bjAwMCA9IG5ldyBBU1RGdW5jdGlvbkNvbnN0cnVjdG9yKHRoaXMsIEpKVEZVTkNUSU9OQ09OU1RSVUNUT1IpOwotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOwotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsKLSAgICB0cnkgewotICAgICAgampfY29uc3VtZV90b2tlbihGVU5DVElPTl8pOwotICAgICAgQXJndW1lbnRzKCk7Ci0gICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChFcnJvcilqanRlMDAwO30KLSAgICB9IGZpbmFsbHkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7Ci0gICAgICAgICAgfQotICAgIH0KLSAgfQotCi0gIGZpbmFsIHB1YmxpYyB2b2lkIEZ1bGxOZXdTdWJleHByZXNzaW9uKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAvKkBiZ2VuKGpqdHJlZSkgRnVsbE5ld1N1YmV4cHJlc3Npb24gKi8KLSAgQVNURnVsbE5ld1N1YmV4cHJlc3Npb24gamp0bjAwMCA9IG5ldyBBU1RGdWxsTmV3U3ViZXhwcmVzc2lvbih0aGlzLCBKSlRGVUxMTkVXU1VCRVhQUkVTU0lPTik7Ci0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7Ci0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOwotICAgIHRyeSB7Ci0gICAgICBpZiAoampfMl82KDIxNDc0ODM2NDcpKSB7Ci0gICAgICAgIEV4cHJlc3Npb25RdWFsaWZpZWRJZGVudGlmaWVyKCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKLSAgICAgICAgY2FzZSBGQUxTRToKLSAgICAgICAgY2FzZSBGVU5DVElPTjoKLSAgICAgICAgY2FzZSBOVUxMOgotICAgICAgICBjYXNlIFRISVM6Ci0gICAgICAgIGNhc2UgVFJVRToKLSAgICAgICAgY2FzZSBERUNJTUFMX0xJVEVSQUw6Ci0gICAgICAgIGNhc2UgSEVYX0xJVEVSQUw6Ci0gICAgICAgIGNhc2UgT0NUQUxfTElURVJBTDoKLSAgICAgICAgY2FzZSBGTE9BVElOR19QT0lOVF9MSVRFUkFMOgotICAgICAgICBjYXNlIFNUUklOR19MSVRFUkFMOgotICAgICAgICBjYXNlIFJFR1VMQVJfRVhQUkVTU0lPTjoKLSAgICAgICAgY2FzZSBMUEFSRU46Ci0gICAgICAgIGNhc2UgTEJSQUNFOgotICAgICAgICBjYXNlIExCUkFDS0VUOgotICAgICAgICAgIFByaW1hcnlFeHByZXNzaW9uKCk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgR0VUOgotICAgICAgICBjYXNlIElOQ0xVREU6Ci0gICAgICAgIGNhc2UgUFJJVkFURToKLSAgICAgICAgY2FzZSBQVUJMSUM6Ci0gICAgICAgIGNhc2UgU0VUOgotICAgICAgICBjYXNlIFBST1RFQ1RFRDoKLSAgICAgICAgY2FzZSBJREVOVElGSUVSOgotICAgICAgICAgIFNpbXBsZVF1YWxpZmllZElkZW50aWZpZXIoKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBTVVBFUjoKLSAgICAgICAgICBTdXBlckV4cHJlc3Npb24oKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBORVc6Ci0gICAgICAgICAgRnVsbE5ld0V4cHJlc3Npb24oKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBGVU5DVElPTl86Ci0gICAgICAgICAgRnVuY3Rpb25Db25zdHJ1Y3RvcigpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIGpqX2xhMVsyMl0gPSBqal9nZW47Ci0gICAgICAgICAgampfY29uc3VtZV90b2tlbigtMSk7Ci0gICAgICAgICAgdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKEVycm9yKWpqdGUwMDA7fQotICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsKLSAgICAgICAgICB9Ci0gICAgfQotICB9Ci0KLSAgZmluYWwgcHVibGljIHZvaWQgUG9zdGZpeE9wKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAvKkBiZ2VuKGpqdHJlZSkgUG9zdGZpeE9wICovCi0gIEFTVFBvc3RmaXhPcCBqanRuMDAwID0gbmV3IEFTVFBvc3RmaXhPcCh0aGlzLCBKSlRQT1NURklYT1ApOwotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOwotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsKLSAgICB0cnkgewotICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7Ci0gICAgICBjYXNlIElOQ1I6Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oSU5DUik7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBERUNSOgotICAgICAgICBqal9jb25zdW1lX3Rva2VuKERFQ1IpOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIGpqX2xhMVsyM10gPSBqal9nZW47Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oLTEpOwotICAgICAgICB0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oKTsKLSAgICAgIH0KLSAgICB9IGZpbmFsbHkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7Ci0gICAgICAgICAgfQotICAgIH0KLSAgfQotCi0gIGZpbmFsIHB1YmxpYyB2b2lkIFByb3BlcnR5T3JBcmd1bWVudHMoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotIC8qQGJnZW4oamp0cmVlKSBQcm9wZXJ0eU9yQXJndW1lbnRzICovCi0gIEFTVFByb3BlcnR5T3JBcmd1bWVudHMgamp0bjAwMCA9IG5ldyBBU1RQcm9wZXJ0eU9yQXJndW1lbnRzKHRoaXMsIEpKVFBST1BFUlRZT1JBUkdVTUVOVFMpOwotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOwotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsKLSAgICB0cnkgewotICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7Ci0gICAgICBjYXNlIExQQVJFTjoKLSAgICAgICAgQXJndW1lbnRzKCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBMQlJBQ0tFVDoKLSAgICAgIGNhc2UgRE9UOgotICAgICAgICBQcm9wZXJ0eU9wZXJhdG9yKCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgampfbGExWzI0XSA9IGpqX2dlbjsKLSAgICAgICAgampfY29uc3VtZV90b2tlbigtMSk7Ci0gICAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigpOwotICAgICAgfQotICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsKLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoRXJyb3Ipamp0ZTAwMDt9Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOwotICAgICAgICAgIH0KLSAgICB9Ci0gIH0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIFByb3BlcnR5IE9wZXJhdG9ycwotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgZmluYWwgcHVibGljIHZvaWQgUHJvcGVydHlPcGVyYXRvcigpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gLypAYmdlbihqanRyZWUpIFByb3BlcnR5T3BlcmF0b3IgKi8KLSAgQVNUUHJvcGVydHlPcGVyYXRvciBqanRuMDAwID0gbmV3IEFTVFByb3BlcnR5T3BlcmF0b3IodGhpcywgSkpUUFJPUEVSVFlPUEVSQVRPUik7Ci0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7Ci0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOwotICAgIHRyeSB7Ci0gICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKLSAgICAgIGNhc2UgRE9UOgotICAgICAgICBqal9jb25zdW1lX3Rva2VuKERPVCk7Ci0gICAgICAgIFF1YWxpZmllZElkZW50aWZpZXIoKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICBqal9sYTFbMjZdID0gampfZ2VuOwotICAgICAgICBpZiAoampfMl83KDIpKSB7Ci0gICAgICAgICAgampfY29uc3VtZV90b2tlbihMQlJBQ0tFVCk7Ci0gICAgICAgICAgampfY29uc3VtZV90b2tlbihSQlJBQ0tFVCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoampfMl84KDIpKSB7Ci0gICAgICAgICAgampfY29uc3VtZV90b2tlbihMQlJBQ0tFVCk7Ci0gICAgICAgICAgampfY29uc3VtZV90b2tlbihFTElQU0UpOwotICAgICAgICAgIEFzc2lnbm1lbnRFeHByZXNzaW9uKCk7Ci0gICAgICAgICAgampfY29uc3VtZV90b2tlbihSQlJBQ0tFVCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7Ci0gICAgICAgICAgY2FzZSBMQlJBQ0tFVDoKLSAgICAgICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oTEJSQUNLRVQpOwotICAgICAgICAgICAgTGlzdEV4cHJlc3Npb24oKTsKLSAgICAgICAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgICAgICAgY2FzZSBFTElQU0U6Ci0gICAgICAgICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oRUxJUFNFKTsKLSAgICAgICAgICAgICAgQXNzaWdubWVudEV4cHJlc3Npb24oKTsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICBqal9sYTFbMjVdID0gampfZ2VuOwotICAgICAgICAgICAgICA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBqal9jb25zdW1lX3Rva2VuKFJCUkFDS0VUKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBqal9sYTFbMjddID0gampfZ2VuOwotICAgICAgICAgICAgampfY29uc3VtZV90b2tlbigtMSk7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKEVycm9yKWpqdGUwMDA7fQotICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsKLSAgICAgICAgICB9Ci0gICAgfQotICB9Ci0KLSAgZmluYWwgcHVibGljIHZvaWQgQXJndW1lbnRzKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAvKkBiZ2VuKGpqdHJlZSkgQXJndW1lbnRzICovCi0gQVNUQXJndW1lbnRzIGpqdG4wMDAgPSBuZXcgQVNUQXJndW1lbnRzKHRoaXMsIEpKVEFSR1VNRU5UUyk7Ci0gYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsKLSBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTt7dG9rZW5fc291cmNlLnNldFJlZ1ZhbGlkKCk7fQotICAgIHRyeSB7Ci0gICAgICBpZiAoampfMl85KDIpKSB7Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oTFBBUkVOKTsKLSAgICAgICAgampfY29uc3VtZV90b2tlbihSUEFSRU4pOwotICAgICAgfSBlbHNlIGlmIChqal8yXzEwKDIpKSB7Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oTFBBUkVOKTsKLSAgICAgICAgampfY29uc3VtZV90b2tlbihFTElQU0UpOwotICAgICAgICBBc3NpZ25tZW50RXhwcmVzc2lvbigpOwotICAgICAgICBqal9jb25zdW1lX3Rva2VuKFJQQVJFTik7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKLSAgICAgICAgY2FzZSBMUEFSRU46Ci0gICAgICAgICAgampfY29uc3VtZV90b2tlbihMUEFSRU4pOwotICAgICAgICAgIExpc3RFeHByZXNzaW9uKCk7Ci0gICAgICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7Ci0gICAgICAgICAgY2FzZSBFTElQU0U6Ci0gICAgICAgICAgICBqal9jb25zdW1lX3Rva2VuKEVMSVBTRSk7Ci0gICAgICAgICAgICBBc3NpZ25tZW50RXhwcmVzc2lvbigpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGpqX2xhMVsyOF0gPSBqal9nZW47Ci0gICAgICAgICAgICA7Ci0gICAgICAgICAgfQotICAgICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oUlBBUkVOKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICBqal9sYTFbMjldID0gampfZ2VuOwotICAgICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oLTEpOwotICAgICAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChFcnJvcilqanRlMDAwO30KLSAgICB9IGZpbmFsbHkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7Ci0gICAgICAgICAgfQotICAgIH0KLSAgfQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gVW5hcnkgT3BlcmF0b3JzIAotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgZmluYWwgcHVibGljIHZvaWQgVW5hcnlFeHByZXNzaW9uKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAvKkBiZ2VuKGpqdHJlZSkgVW5hcnlFeHByZXNzaW9uICovCi0gIEFTVFVuYXJ5RXhwcmVzc2lvbiBqanRuMDAwID0gbmV3IEFTVFVuYXJ5RXhwcmVzc2lvbih0aGlzLCBKSlRVTkFSWUVYUFJFU1NJT04pOwotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOwotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsKLSAgICB0cnkgewotICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7Ci0gICAgICBjYXNlIEZBTFNFOgotICAgICAgY2FzZSBGVU5DVElPTjoKLSAgICAgIGNhc2UgR0VUOgotICAgICAgY2FzZSBJTkNMVURFOgotICAgICAgY2FzZSBORVc6Ci0gICAgICBjYXNlIE5VTEw6Ci0gICAgICBjYXNlIFBSSVZBVEU6Ci0gICAgICBjYXNlIFBVQkxJQzoKLSAgICAgIGNhc2UgU0VUOgotICAgICAgY2FzZSBTVVBFUjoKLSAgICAgIGNhc2UgVEhJUzoKLSAgICAgIGNhc2UgVFJVRToKLSAgICAgIGNhc2UgUFJPVEVDVEVEOgotICAgICAgY2FzZSBERUNJTUFMX0xJVEVSQUw6Ci0gICAgICBjYXNlIEhFWF9MSVRFUkFMOgotICAgICAgY2FzZSBPQ1RBTF9MSVRFUkFMOgotICAgICAgY2FzZSBGTE9BVElOR19QT0lOVF9MSVRFUkFMOgotICAgICAgY2FzZSBTVFJJTkdfTElURVJBTDoKLSAgICAgIGNhc2UgUkVHVUxBUl9FWFBSRVNTSU9OOgotICAgICAgY2FzZSBJREVOVElGSUVSOgotICAgICAgY2FzZSBMUEFSRU46Ci0gICAgICBjYXNlIExCUkFDRToKLSAgICAgIGNhc2UgTEJSQUNLRVQ6Ci0gICAgICAgIFBvc3RmaXhFeHByZXNzaW9uKCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBERUxFVEU6Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oREVMRVRFKTsKLSAgICAgICAgUG9zdGZpeEV4cHJlc3Npb24oKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIFZPSUQ6Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oVk9JRCk7Ci0gICAgICAgIFVuYXJ5RXhwcmVzc2lvbigpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgVFlQRU9GOgotICAgICAgICBqal9jb25zdW1lX3Rva2VuKFRZUEVPRik7Ci0gICAgICAgIFVuYXJ5RXhwcmVzc2lvbigpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgSU5DUjoKLSAgICAgICAgampfY29uc3VtZV90b2tlbihJTkNSKTsKLSAgICAgICAgUG9zdGZpeEV4cHJlc3Npb24oKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIERFQ1I6Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oREVDUik7Ci0gICAgICAgIFBvc3RmaXhFeHByZXNzaW9uKCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBQTFVTOgotICAgICAgICBqal9jb25zdW1lX3Rva2VuKFBMVVMpOwotICAgICAgICBVbmFyeUV4cHJlc3Npb24oKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIE1JTlVTOgotICAgICAgICBqal9jb25zdW1lX3Rva2VuKE1JTlVTKTsKLSAgICAgICAgVW5hcnlFeHByZXNzaW9uKCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBUSUxERToKLSAgICAgICAgampfY29uc3VtZV90b2tlbihUSUxERSk7Ci0gICAgICAgIFVuYXJ5RXhwcmVzc2lvbigpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgQkFORzoKLSAgICAgICAgampfY29uc3VtZV90b2tlbihCQU5HKTsKLSAgICAgICAgVW5hcnlFeHByZXNzaW9uKCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgampfbGExWzMwXSA9IGpqX2dlbjsKLSAgICAgICAgampfY29uc3VtZV90b2tlbigtMSk7Ci0gICAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigpOwotICAgICAgfQotICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7Ci0gICAgICAgICAgICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsKLSAgICAgICAgICAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsKLSAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoRXJyb3Ipamp0ZTAwMDt9Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOwotICAgICAgICAgICAgICAgICAgIH0KLSAgICB9Ci0gIH0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIE11bHRpcGxpY2F0aXZlIE9wZXJhdG9ycyAKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gIGZpbmFsIHB1YmxpYyB2b2lkIE11bE9wKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAvKkBiZ2VuKGpqdHJlZSkgTXVsT3AgKi8KLSAgQVNUTXVsT3Agamp0bjAwMCA9IG5ldyBBU1RNdWxPcCh0aGlzLCBKSlRNVUxPUCk7Ci0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7Ci0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOwotICAgIHRyeSB7Ci0gICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKLSAgICAgIGNhc2UgU1RBUjoKLSAgICAgICAgampfY29uc3VtZV90b2tlbihTVEFSKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIFNMQVNIOgotICAgICAgICBqal9jb25zdW1lX3Rva2VuKFNMQVNIKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIFJFTToKLSAgICAgICAgampfY29uc3VtZV90b2tlbihSRU0pOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIGpqX2xhMVszMV0gPSBqal9nZW47Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oLTEpOwotICAgICAgICB0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oKTsKLSAgICAgIH0KLSAgICB9IGZpbmFsbHkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7Ci0gICAgICAgICAgfQotICAgIH0KLSAgfQotCi0gIGZpbmFsIHB1YmxpYyB2b2lkIE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbigpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gLypAYmdlbihqanRyZWUpIE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbiAqLwotICBBU1RNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24gamp0bjAwMCA9IG5ldyBBU1RNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24odGhpcywgSkpUTVVMVElQTElDQVRJVkVFWFBSRVNTSU9OKTsKLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsKLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgdHJ5IHsKLSAgICAgIFVuYXJ5RXhwcmVzc2lvbigpOwotICAgICAgbGFiZWxfNzoKLSAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgICBjYXNlIFNUQVI6Ci0gICAgICAgIGNhc2UgU0xBU0g6Ci0gICAgICAgIGNhc2UgUkVNOgotICAgICAgICAgIDsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICBqal9sYTFbMzJdID0gampfZ2VuOwotICAgICAgICAgIGJyZWFrIGxhYmVsXzc7Ci0gICAgICAgIH0KLSAgICAgICAgTXVsT3AoKTsKLSAgICAgICAgVW5hcnlFeHByZXNzaW9uKCk7Ci0gICAgICB9Ci0gICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChFcnJvcilqanRlMDAwO30KLSAgICB9IGZpbmFsbHkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7Ci0gICAgICAgICAgfQotICAgIH0KLSAgfQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gQWRkaXRpdmUgT3BlcmF0b3JzIAotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgZmluYWwgcHVibGljIHZvaWQgQWRkT3AoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotIC8qQGJnZW4oamp0cmVlKSBBZGRPcCAqLwotICBBU1RBZGRPcCBqanRuMDAwID0gbmV3IEFTVEFkZE9wKHRoaXMsIEpKVEFERE9QKTsKLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsKLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgdHJ5IHsKLSAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgY2FzZSBQTFVTOgotICAgICAgICBqal9jb25zdW1lX3Rva2VuKFBMVVMpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgTUlOVVM6Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oTUlOVVMpOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIGpqX2xhMVszM10gPSBqal9nZW47Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oLTEpOwotICAgICAgICB0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oKTsKLSAgICAgIH0KLSAgICB9IGZpbmFsbHkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7Ci0gICAgICAgICAgfQotICAgIH0KLSAgfQotCi0gIGZpbmFsIHB1YmxpYyB2b2lkIEFkZGl0aXZlRXhwcmVzc2lvbigpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gLypAYmdlbihqanRyZWUpIEFkZGl0aXZlRXhwcmVzc2lvbiAqLwotICBBU1RBZGRpdGl2ZUV4cHJlc3Npb24gamp0bjAwMCA9IG5ldyBBU1RBZGRpdGl2ZUV4cHJlc3Npb24odGhpcywgSkpUQURESVRJVkVFWFBSRVNTSU9OKTsKLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsKLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgdHJ5IHsKLSAgICAgIE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbigpOwotICAgICAgbGFiZWxfODoKLSAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgICBjYXNlIFBMVVM6Ci0gICAgICAgIGNhc2UgTUlOVVM6Ci0gICAgICAgICAgOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIGpqX2xhMVszNF0gPSBqal9nZW47Ci0gICAgICAgICAgYnJlYWsgbGFiZWxfODsKLSAgICAgICAgfQotICAgICAgICBBZGRPcCgpOwotICAgICAgICBNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24oKTsKLSAgICAgIH0KLSAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKEVycm9yKWpqdGUwMDA7fQotICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsKLSAgICAgICAgICB9Ci0gICAgfQotICB9Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyBCaXR3aXNlIFNoaWZ0IE9wZXJhdG9ycyAKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gIGZpbmFsIHB1YmxpYyB2b2lkIFNoaWZ0T3AoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotIC8qQGJnZW4oamp0cmVlKSBTaGlmdE9wICovCi0gIEFTVFNoaWZ0T3Agamp0bjAwMCA9IG5ldyBBU1RTaGlmdE9wKHRoaXMsIEpKVFNISUZUT1ApOwotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOwotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsKLSAgICB0cnkgewotICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7Ci0gICAgICBjYXNlIExTSElGVDoKLSAgICAgICAgampfY29uc3VtZV90b2tlbihMU0hJRlQpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgUlNJR05FRFNISUZUOgotICAgICAgICBqal9jb25zdW1lX3Rva2VuKFJTSUdORURTSElGVCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBSVU5TSUdORURTSElGVDoKLSAgICAgICAgampfY29uc3VtZV90b2tlbihSVU5TSUdORURTSElGVCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgampfbGExWzM1XSA9IGpqX2dlbjsKLSAgICAgICAgampfY29uc3VtZV90b2tlbigtMSk7Ci0gICAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigpOwotICAgICAgfQotICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsKLSAgICAgICAgICB9Ci0gICAgfQotICB9Ci0KLSAgZmluYWwgcHVibGljIHZvaWQgU2hpZnRFeHByZXNzaW9uKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAvKkBiZ2VuKGpqdHJlZSkgU2hpZnRFeHByZXNzaW9uICovCi0gIEFTVFNoaWZ0RXhwcmVzc2lvbiBqanRuMDAwID0gbmV3IEFTVFNoaWZ0RXhwcmVzc2lvbih0aGlzLCBKSlRTSElGVEVYUFJFU1NJT04pOwotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOwotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsKLSAgICB0cnkgewotICAgICAgQWRkaXRpdmVFeHByZXNzaW9uKCk7Ci0gICAgICBsYWJlbF85OgotICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7Ci0gICAgICAgIGNhc2UgTFNISUZUOgotICAgICAgICBjYXNlIFJTSUdORURTSElGVDoKLSAgICAgICAgY2FzZSBSVU5TSUdORURTSElGVDoKLSAgICAgICAgICA7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgampfbGExWzM2XSA9IGpqX2dlbjsKLSAgICAgICAgICBicmVhayBsYWJlbF85OwotICAgICAgICB9Ci0gICAgICAgIFNoaWZ0T3AoKTsKLSAgICAgICAgQWRkaXRpdmVFeHByZXNzaW9uKCk7Ci0gICAgICB9Ci0gICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChFcnJvcilqanRlMDAwO30KLSAgICB9IGZpbmFsbHkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7Ci0gICAgICAgICAgfQotICAgIH0KLSAgfQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gUmVsYXRpb25hbCBPcGVyYXRvcnMgCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICBmaW5hbCBwdWJsaWMgdm9pZCBSZWxPcCgpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gLypAYmdlbihqanRyZWUpIFJlbE9wICovCi0gIEFTVFJlbE9wIGpqdG4wMDAgPSBuZXcgQVNUUmVsT3AodGhpcywgSkpUUkVMT1ApOwotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOwotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsKLSAgICB0cnkgewotICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7Ci0gICAgICBjYXNlIExUOgotICAgICAgICBqal9jb25zdW1lX3Rva2VuKExUKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIEdUOgotICAgICAgICBqal9jb25zdW1lX3Rva2VuKEdUKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIExFOgotICAgICAgICBqal9jb25zdW1lX3Rva2VuKExFKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIEdFOgotICAgICAgICBqal9jb25zdW1lX3Rva2VuKEdFKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIElTOgotICAgICAgICBqal9jb25zdW1lX3Rva2VuKElTKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIEFTOgotICAgICAgICBqal9jb25zdW1lX3Rva2VuKEFTKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICBqal9sYTFbMzddID0gampfZ2VuOwotICAgICAgICBqal9jb25zdW1lX3Rva2VuKC0xKTsKLSAgICAgICAgdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCk7Ci0gICAgICB9Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOwotICAgICAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBmaW5hbCBwdWJsaWMgdm9pZCBSZWxhdGlvbmFsRXhwcmVzc2lvbigpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gLypAYmdlbihqanRyZWUpIFJlbGF0aW9uYWxFeHByZXNzaW9uICovCi0gIEFTVFJlbGF0aW9uYWxFeHByZXNzaW9uIGpqdG4wMDAgPSBuZXcgQVNUUmVsYXRpb25hbEV4cHJlc3Npb24odGhpcywgSkpUUkVMQVRJT05BTEVYUFJFU1NJT04pOwotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOwotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsKLSAgICB0cnkgewotICAgICAgU2hpZnRFeHByZXNzaW9uKCk7Ci0gICAgICBsYWJlbF8xMDoKLSAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgIGlmIChqal8yXzExKDMpKSB7Ci0gICAgICAgICAgOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGJyZWFrIGxhYmVsXzEwOwotICAgICAgICB9Ci0gICAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgICBjYXNlIEFTOgotICAgICAgICBjYXNlIElTOgotICAgICAgICBjYXNlIEdUOgotICAgICAgICBjYXNlIExUOgotICAgICAgICBjYXNlIExFOgotICAgICAgICBjYXNlIEdFOgotICAgICAgICAgIFJlbE9wKCk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgSU46Ci0gICAgICAgICAgampfY29uc3VtZV90b2tlbihJTik7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgSU5TVEFOQ0VPRjoKLSAgICAgICAgICBqal9jb25zdW1lX3Rva2VuKElOU1RBTkNFT0YpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIGpqX2xhMVszOF0gPSBqal9nZW47Ci0gICAgICAgICAgampfY29uc3VtZV90b2tlbigtMSk7Ci0gICAgICAgICAgdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLSAgICAgICAgU2hpZnRFeHByZXNzaW9uKCk7Ci0gICAgICB9Ci0gICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChFcnJvcilqanRlMDAwO30KLSAgICB9IGZpbmFsbHkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7Ci0gICAgICAgICAgfQotICAgIH0KLSAgfQotCi0gIGZpbmFsIHB1YmxpYyB2b2lkIFJlbGF0aW9uYWxFeHByZXNzaW9uTm9JTigpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gLypAYmdlbihqanRyZWUpIFJlbGF0aW9uYWxFeHByZXNzaW9uTm9JTiAqLwotICBBU1RSZWxhdGlvbmFsRXhwcmVzc2lvbk5vSU4gamp0bjAwMCA9IG5ldyBBU1RSZWxhdGlvbmFsRXhwcmVzc2lvbk5vSU4odGhpcywgSkpUUkVMQVRJT05BTEVYUFJFU1NJT05OT0lOKTsKLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsKLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgdHJ5IHsKLSAgICAgIFNoaWZ0RXhwcmVzc2lvbigpOwotICAgICAgbGFiZWxfMTE6Ci0gICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKLSAgICAgICAgY2FzZSBBUzoKLSAgICAgICAgY2FzZSBJTlNUQU5DRU9GOgotICAgICAgICBjYXNlIElTOgotICAgICAgICBjYXNlIEdUOgotICAgICAgICBjYXNlIExUOgotICAgICAgICBjYXNlIExFOgotICAgICAgICBjYXNlIEdFOgotICAgICAgICAgIDsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICBqal9sYTFbMzldID0gampfZ2VuOwotICAgICAgICAgIGJyZWFrIGxhYmVsXzExOwotICAgICAgICB9Ci0gICAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgICBjYXNlIEFTOgotICAgICAgICBjYXNlIElTOgotICAgICAgICBjYXNlIEdUOgotICAgICAgICBjYXNlIExUOgotICAgICAgICBjYXNlIExFOgotICAgICAgICBjYXNlIEdFOgotICAgICAgICAgIFJlbE9wKCk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgSU5TVEFOQ0VPRjoKLSAgICAgICAgICBqal9jb25zdW1lX3Rva2VuKElOU1RBTkNFT0YpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIGpqX2xhMVs0MF0gPSBqal9nZW47Ci0gICAgICAgICAgampfY29uc3VtZV90b2tlbigtMSk7Ci0gICAgICAgICAgdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLSAgICAgICAgU2hpZnRFeHByZXNzaW9uKCk7Ci0gICAgICB9Ci0gICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChFcnJvcilqanRlMDAwO30KLSAgICB9IGZpbmFsbHkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7Ci0gICAgICAgICAgfQotICAgIH0KLSAgfQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gRXF1YWxpdHkgT3BlcmF0b3JzIAotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgZmluYWwgcHVibGljIHZvaWQgRXF1YWxPcCgpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gLypAYmdlbihqanRyZWUpIEVxdWFsT3AgKi8KLSAgQVNURXF1YWxPcCBqanRuMDAwID0gbmV3IEFTVEVxdWFsT3AodGhpcywgSkpURVFVQUxPUCk7Ci0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7Ci0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOwotICAgIHRyeSB7Ci0gICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKLSAgICAgIGNhc2UgRVE6Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oRVEpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgTkU6Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oTkUpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgSURFTlRJVFlPUEVSOgotICAgICAgICBqal9jb25zdW1lX3Rva2VuKElERU5USVRZT1BFUik7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBOT1RJREVOVElUWU9QRVI6Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oTk9USURFTlRJVFlPUEVSKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICBqal9sYTFbNDFdID0gampfZ2VuOwotICAgICAgICBqal9jb25zdW1lX3Rva2VuKC0xKTsKLSAgICAgICAgdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCk7Ci0gICAgICB9Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOwotICAgICAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBmaW5hbCBwdWJsaWMgdm9pZCBFcXVhbGl0eUV4cHJlc3Npb24oKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotIC8qQGJnZW4oamp0cmVlKSBFcXVhbGl0eUV4cHJlc3Npb24gKi8KLSAgQVNURXF1YWxpdHlFeHByZXNzaW9uIGpqdG4wMDAgPSBuZXcgQVNURXF1YWxpdHlFeHByZXNzaW9uKHRoaXMsIEpKVEVRVUFMSVRZRVhQUkVTU0lPTik7Ci0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7Ci0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOwotICAgIHRyeSB7Ci0gICAgICBSZWxhdGlvbmFsRXhwcmVzc2lvbigpOwotICAgICAgbGFiZWxfMTI6Ci0gICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKLSAgICAgICAgY2FzZSBFUToKLSAgICAgICAgY2FzZSBORToKLSAgICAgICAgY2FzZSBJREVOVElUWU9QRVI6Ci0gICAgICAgIGNhc2UgTk9USURFTlRJVFlPUEVSOgotICAgICAgICAgIDsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICBqal9sYTFbNDJdID0gampfZ2VuOwotICAgICAgICAgIGJyZWFrIGxhYmVsXzEyOwotICAgICAgICB9Ci0gICAgICAgIEVxdWFsT3AoKTsKLSAgICAgICAgUmVsYXRpb25hbEV4cHJlc3Npb24oKTsKLSAgICAgIH0KLSAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKEVycm9yKWpqdGUwMDA7fQotICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsKLSAgICAgICAgICB9Ci0gICAgfQotICB9Ci0KLSAgZmluYWwgcHVibGljIHZvaWQgRXF1YWxpdHlFeHByZXNzaW9uTm9JTigpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gLypAYmdlbihqanRyZWUpIEVxdWFsaXR5RXhwcmVzc2lvbk5vSU4gKi8KLSAgQVNURXF1YWxpdHlFeHByZXNzaW9uTm9JTiBqanRuMDAwID0gbmV3IEFTVEVxdWFsaXR5RXhwcmVzc2lvbk5vSU4odGhpcywgSkpURVFVQUxJVFlFWFBSRVNTSU9OTk9JTik7Ci0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7Ci0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOwotICAgIHRyeSB7Ci0gICAgICBSZWxhdGlvbmFsRXhwcmVzc2lvbk5vSU4oKTsKLSAgICAgIGxhYmVsXzEzOgotICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7Ci0gICAgICAgIGNhc2UgRVE6Ci0gICAgICAgIGNhc2UgTkU6Ci0gICAgICAgIGNhc2UgSURFTlRJVFlPUEVSOgotICAgICAgICBjYXNlIE5PVElERU5USVRZT1BFUjoKLSAgICAgICAgICA7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgampfbGExWzQzXSA9IGpqX2dlbjsKLSAgICAgICAgICBicmVhayBsYWJlbF8xMzsKLSAgICAgICAgfQotICAgICAgICBFcXVhbE9wKCk7Ci0gICAgICAgIFJlbGF0aW9uYWxFeHByZXNzaW9uTm9JTigpOwotICAgICAgfQotICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsKLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoRXJyb3Ipamp0ZTAwMDt9Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOwotICAgICAgICAgIH0KLSAgICB9Ci0gIH0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIEJpbmFyeSBCaXR3aXNlIE9wZXJhdG9ycyAKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gIGZpbmFsIHB1YmxpYyB2b2lkIEJpdHdpc2VBTkRPcCgpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gLypAYmdlbihqanRyZWUpIEJpdHdpc2VBTkRPcCAqLwotICBBU1RCaXR3aXNlQU5ET3Agamp0bjAwMCA9IG5ldyBBU1RCaXR3aXNlQU5ET3AodGhpcywgSkpUQklUV0lTRUFORE9QKTsKLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsKLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgdHJ5IHsKLSAgICAgIGpqX2NvbnN1bWVfdG9rZW4oQklUX0FORCk7Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOwotICAgICAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBmaW5hbCBwdWJsaWMgdm9pZCBCaXR3aXNlQU5ERXhwcmVzc2lvbigpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gLypAYmdlbihqanRyZWUpIEJpdHdpc2VBTkRFeHByZXNzaW9uICovCi0gIEFTVEJpdHdpc2VBTkRFeHByZXNzaW9uIGpqdG4wMDAgPSBuZXcgQVNUQml0d2lzZUFOREV4cHJlc3Npb24odGhpcywgSkpUQklUV0lTRUFOREVYUFJFU1NJT04pOwotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOwotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsKLSAgICB0cnkgewotICAgICAgRXF1YWxpdHlFeHByZXNzaW9uKCk7Ci0gICAgICBsYWJlbF8xNDoKLSAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgICBjYXNlIEJJVF9BTkQ6Ci0gICAgICAgICAgOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIGpqX2xhMVs0NF0gPSBqal9nZW47Ci0gICAgICAgICAgYnJlYWsgbGFiZWxfMTQ7Ci0gICAgICAgIH0KLSAgICAgICAgQml0d2lzZUFORE9wKCk7Ci0gICAgICAgIEVxdWFsaXR5RXhwcmVzc2lvbigpOwotICAgICAgfQotICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsKLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoRXJyb3Ipamp0ZTAwMDt9Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOwotICAgICAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBmaW5hbCBwdWJsaWMgdm9pZCBCaXR3aXNlQU5ERXhwcmVzc2lvbk5vSU4oKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotIC8qQGJnZW4oamp0cmVlKSBCaXR3aXNlQU5ERXhwcmVzc2lvbk5vSU4gKi8KLSAgQVNUQml0d2lzZUFOREV4cHJlc3Npb25Ob0lOIGpqdG4wMDAgPSBuZXcgQVNUQml0d2lzZUFOREV4cHJlc3Npb25Ob0lOKHRoaXMsIEpKVEJJVFdJU0VBTkRFWFBSRVNTSU9OTk9JTik7Ci0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7Ci0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOwotICAgIHRyeSB7Ci0gICAgICBFcXVhbGl0eUV4cHJlc3Npb25Ob0lOKCk7Ci0gICAgICBsYWJlbF8xNToKLSAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgICBjYXNlIEJJVF9BTkQ6Ci0gICAgICAgICAgOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIGpqX2xhMVs0NV0gPSBqal9nZW47Ci0gICAgICAgICAgYnJlYWsgbGFiZWxfMTU7Ci0gICAgICAgIH0KLSAgICAgICAgQml0d2lzZUFORE9wKCk7Ci0gICAgICAgIEVxdWFsaXR5RXhwcmVzc2lvbk5vSU4oKTsKLSAgICAgIH0KLSAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKEVycm9yKWpqdGUwMDA7fQotICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsKLSAgICAgICAgICB9Ci0gICAgfQotICB9Ci0KLSAgZmluYWwgcHVibGljIHZvaWQgQml0d2lzZVhPUk9wKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAvKkBiZ2VuKGpqdHJlZSkgQml0d2lzZVhPUk9wICovCi0gIEFTVEJpdHdpc2VYT1JPcCBqanRuMDAwID0gbmV3IEFTVEJpdHdpc2VYT1JPcCh0aGlzLCBKSlRCSVRXSVNFWE9ST1ApOwotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOwotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsKLSAgICB0cnkgewotICAgICAgampfY29uc3VtZV90b2tlbihYT1IpOwotICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsKLSAgICAgICAgICB9Ci0gICAgfQotICB9Ci0KLSAgZmluYWwgcHVibGljIHZvaWQgQml0d2lzZVhPUkV4cHJlc3Npb24oKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotIC8qQGJnZW4oamp0cmVlKSBCaXR3aXNlWE9SRXhwcmVzc2lvbiAqLwotICBBU1RCaXR3aXNlWE9SRXhwcmVzc2lvbiBqanRuMDAwID0gbmV3IEFTVEJpdHdpc2VYT1JFeHByZXNzaW9uKHRoaXMsIEpKVEJJVFdJU0VYT1JFWFBSRVNTSU9OKTsKLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsKLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgdHJ5IHsKLSAgICAgIEJpdHdpc2VBTkRFeHByZXNzaW9uKCk7Ci0gICAgICBsYWJlbF8xNjoKLSAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgICBjYXNlIFhPUjoKLSAgICAgICAgICA7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgampfbGExWzQ2XSA9IGpqX2dlbjsKLSAgICAgICAgICBicmVhayBsYWJlbF8xNjsKLSAgICAgICAgfQotICAgICAgICBCaXR3aXNlWE9ST3AoKTsKLSAgICAgICAgQml0d2lzZUFOREV4cHJlc3Npb24oKTsKLSAgICAgIH0KLSAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKEVycm9yKWpqdGUwMDA7fQotICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsKLSAgICAgICAgICB9Ci0gICAgfQotICB9Ci0KLSAgZmluYWwgcHVibGljIHZvaWQgQml0d2lzZVhPUkV4cHJlc3Npb25Ob0lOKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAvKkBiZ2VuKGpqdHJlZSkgQml0d2lzZVhPUkV4cHJlc3Npb25Ob0lOICovCi0gIEFTVEJpdHdpc2VYT1JFeHByZXNzaW9uTm9JTiBqanRuMDAwID0gbmV3IEFTVEJpdHdpc2VYT1JFeHByZXNzaW9uTm9JTih0aGlzLCBKSlRCSVRXSVNFWE9SRVhQUkVTU0lPTk5PSU4pOwotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOwotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsKLSAgICB0cnkgewotICAgICAgQml0d2lzZUFOREV4cHJlc3Npb25Ob0lOKCk7Ci0gICAgICBsYWJlbF8xNzoKLSAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgICBjYXNlIFhPUjoKLSAgICAgICAgICA7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgampfbGExWzQ3XSA9IGpqX2dlbjsKLSAgICAgICAgICBicmVhayBsYWJlbF8xNzsKLSAgICAgICAgfQotICAgICAgICBCaXR3aXNlWE9ST3AoKTsKLSAgICAgICAgQml0d2lzZUFOREV4cHJlc3Npb25Ob0lOKCk7Ci0gICAgICB9Ci0gICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChFcnJvcilqanRlMDAwO30KLSAgICB9IGZpbmFsbHkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7Ci0gICAgICAgICAgfQotICAgIH0KLSAgfQotCi0gIGZpbmFsIHB1YmxpYyB2b2lkIEJpdHdpc2VPUk9wKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAvKkBiZ2VuKGpqdHJlZSkgQml0d2lzZU9ST3AgKi8KLSAgQVNUQml0d2lzZU9ST3Agamp0bjAwMCA9IG5ldyBBU1RCaXR3aXNlT1JPcCh0aGlzLCBKSlRCSVRXSVNFT1JPUCk7Ci0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7Ci0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOwotICAgIHRyeSB7Ci0gICAgICBqal9jb25zdW1lX3Rva2VuKEJJVF9PUik7Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOwotICAgICAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBmaW5hbCBwdWJsaWMgdm9pZCBCaXR3aXNlT1JFeHByZXNzaW9uKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAvKkBiZ2VuKGpqdHJlZSkgQml0d2lzZU9SRXhwcmVzc2lvbiAqLwotICBBU1RCaXR3aXNlT1JFeHByZXNzaW9uIGpqdG4wMDAgPSBuZXcgQVNUQml0d2lzZU9SRXhwcmVzc2lvbih0aGlzLCBKSlRCSVRXSVNFT1JFWFBSRVNTSU9OKTsKLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsKLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgdHJ5IHsKLSAgICAgIEJpdHdpc2VYT1JFeHByZXNzaW9uKCk7Ci0gICAgICBsYWJlbF8xODoKLSAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgICBjYXNlIEJJVF9PUjoKLSAgICAgICAgICA7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgampfbGExWzQ4XSA9IGpqX2dlbjsKLSAgICAgICAgICBicmVhayBsYWJlbF8xODsKLSAgICAgICAgfQotICAgICAgICBCaXR3aXNlT1JPcCgpOwotICAgICAgICBCaXR3aXNlWE9SRXhwcmVzc2lvbigpOwotICAgICAgfQotICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsKLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoRXJyb3Ipamp0ZTAwMDt9Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOwotICAgICAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBmaW5hbCBwdWJsaWMgdm9pZCBCaXR3aXNlT1JFeHByZXNzaW9uTm9JTigpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gLypAYmdlbihqanRyZWUpIEJpdHdpc2VPUkV4cHJlc3Npb25Ob0lOICovCi0gIEFTVEJpdHdpc2VPUkV4cHJlc3Npb25Ob0lOIGpqdG4wMDAgPSBuZXcgQVNUQml0d2lzZU9SRXhwcmVzc2lvbk5vSU4odGhpcywgSkpUQklUV0lTRU9SRVhQUkVTU0lPTk5PSU4pOwotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOwotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsKLSAgICB0cnkgewotICAgICAgQml0d2lzZVhPUkV4cHJlc3Npb25Ob0lOKCk7Ci0gICAgICBsYWJlbF8xOToKLSAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgICBjYXNlIEJJVF9PUjoKLSAgICAgICAgICA7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgampfbGExWzQ5XSA9IGpqX2dlbjsKLSAgICAgICAgICBicmVhayBsYWJlbF8xOTsKLSAgICAgICAgfQotICAgICAgICBCaXR3aXNlT1JPcCgpOwotICAgICAgICBCaXR3aXNlWE9SRXhwcmVzc2lvbk5vSU4oKTsKLSAgICAgIH0KLSAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKEVycm9yKWpqdGUwMDA7fQotICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsKLSAgICAgICAgICB9Ci0gICAgfQotICB9Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyBCaW5hcnkgTG9naWNhbCBPcGVyYXRvcnMgCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICBmaW5hbCBwdWJsaWMgdm9pZCBMb2dpY2FsQU5ERXhwcmVzc2lvbigpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gLypAYmdlbihqanRyZWUpIExvZ2ljYWxBTkRFeHByZXNzaW9uICovCi0gIEFTVExvZ2ljYWxBTkRFeHByZXNzaW9uIGpqdG4wMDAgPSBuZXcgQVNUTG9naWNhbEFOREV4cHJlc3Npb24odGhpcywgSkpUTE9HSUNBTEFOREVYUFJFU1NJT04pOwotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOwotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsKLSAgICB0cnkgewotICAgICAgQml0d2lzZU9SRXhwcmVzc2lvbigpOwotICAgICAgbGFiZWxfMjA6Ci0gICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKLSAgICAgICAgY2FzZSBTQ19BTkQ6Ci0gICAgICAgICAgOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIGpqX2xhMVs1MF0gPSBqal9nZW47Ci0gICAgICAgICAgYnJlYWsgbGFiZWxfMjA7Ci0gICAgICAgIH0KLSAgICAgICAgampfY29uc3VtZV90b2tlbihTQ19BTkQpOwotICAgICAgICBCaXR3aXNlT1JFeHByZXNzaW9uKCk7Ci0gICAgICB9Ci0gICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChFcnJvcilqanRlMDAwO30KLSAgICB9IGZpbmFsbHkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7Ci0gICAgICAgICAgfQotICAgIH0KLSAgfQotCi0gIGZpbmFsIHB1YmxpYyB2b2lkIExvZ2ljYWxBTkRFeHByZXNzaW9uTm9JTigpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gLypAYmdlbihqanRyZWUpIExvZ2ljYWxBTkRFeHByZXNzaW9uTm9JTiAqLwotICBBU1RMb2dpY2FsQU5ERXhwcmVzc2lvbk5vSU4gamp0bjAwMCA9IG5ldyBBU1RMb2dpY2FsQU5ERXhwcmVzc2lvbk5vSU4odGhpcywgSkpUTE9HSUNBTEFOREVYUFJFU1NJT05OT0lOKTsKLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsKLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgdHJ5IHsKLSAgICAgIEJpdHdpc2VPUkV4cHJlc3Npb25Ob0lOKCk7Ci0gICAgICBsYWJlbF8yMToKLSAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgICBjYXNlIFNDX0FORDoKLSAgICAgICAgICA7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgampfbGExWzUxXSA9IGpqX2dlbjsKLSAgICAgICAgICBicmVhayBsYWJlbF8yMTsKLSAgICAgICAgfQotICAgICAgICBqal9jb25zdW1lX3Rva2VuKFNDX0FORCk7Ci0gICAgICAgIEJpdHdpc2VPUkV4cHJlc3Npb25Ob0lOKCk7Ci0gICAgICB9Ci0gICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChFcnJvcilqanRlMDAwO30KLSAgICB9IGZpbmFsbHkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7Ci0gICAgICAgICAgfQotICAgIH0KLSAgfQotCi0gIGZpbmFsIHB1YmxpYyB2b2lkIExvZ2ljYWxPUkV4cHJlc3Npb24oKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotIC8qQGJnZW4oamp0cmVlKSBMb2dpY2FsT1JFeHByZXNzaW9uICovCi0gIEFTVExvZ2ljYWxPUkV4cHJlc3Npb24gamp0bjAwMCA9IG5ldyBBU1RMb2dpY2FsT1JFeHByZXNzaW9uKHRoaXMsIEpKVExPR0lDQUxPUkVYUFJFU1NJT04pOwotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOwotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsKLSAgICB0cnkgewotICAgICAgTG9naWNhbEFOREV4cHJlc3Npb24oKTsKLSAgICAgIGxhYmVsXzIyOgotICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7Ci0gICAgICAgIGNhc2UgU0NfT1I6Ci0gICAgICAgICAgOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIGpqX2xhMVs1Ml0gPSBqal9nZW47Ci0gICAgICAgICAgYnJlYWsgbGFiZWxfMjI7Ci0gICAgICAgIH0KLSAgICAgICAgampfY29uc3VtZV90b2tlbihTQ19PUik7Ci0gICAgICAgIExvZ2ljYWxBTkRFeHByZXNzaW9uKCk7Ci0gICAgICB9Ci0gICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChFcnJvcilqanRlMDAwO30KLSAgICB9IGZpbmFsbHkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7Ci0gICAgICAgICAgfQotICAgIH0KLSAgfQotCi0gIGZpbmFsIHB1YmxpYyB2b2lkIExvZ2ljYWxPUkV4cHJlc3Npb25Ob0lOKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAvKkBiZ2VuKGpqdHJlZSkgTG9naWNhbE9SRXhwcmVzc2lvbk5vSU4gKi8KLSAgQVNUTG9naWNhbE9SRXhwcmVzc2lvbk5vSU4gamp0bjAwMCA9IG5ldyBBU1RMb2dpY2FsT1JFeHByZXNzaW9uTm9JTih0aGlzLCBKSlRMT0dJQ0FMT1JFWFBSRVNTSU9OTk9JTik7Ci0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7Ci0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOwotICAgIHRyeSB7Ci0gICAgICBMb2dpY2FsQU5ERXhwcmVzc2lvbk5vSU4oKTsKLSAgICAgIGxhYmVsXzIzOgotICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7Ci0gICAgICAgIGNhc2UgU0NfT1I6Ci0gICAgICAgICAgOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIGpqX2xhMVs1M10gPSBqal9nZW47Ci0gICAgICAgICAgYnJlYWsgbGFiZWxfMjM7Ci0gICAgICAgIH0KLSAgICAgICAgampfY29uc3VtZV90b2tlbihTQ19PUik7Ci0gICAgICAgIExvZ2ljYWxBTkRFeHByZXNzaW9uTm9JTigpOwotICAgICAgfQotICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsKLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoRXJyb3Ipamp0ZTAwMDt9Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOwotICAgICAgICAgIH0KLSAgICB9Ci0gIH0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIENvbmRpdGlvbmFsIE9wZXJhdG9ycyAKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gIGZpbmFsIHB1YmxpYyB2b2lkIENvbmRpdGlvbmFsRXhwcmVzc2lvbigpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gLypAYmdlbihqanRyZWUpIENvbmRpdGlvbmFsRXhwcmVzc2lvbiAqLwotICBBU1RDb25kaXRpb25hbEV4cHJlc3Npb24gamp0bjAwMCA9IG5ldyBBU1RDb25kaXRpb25hbEV4cHJlc3Npb24odGhpcywgSkpUQ09ORElUSU9OQUxFWFBSRVNTSU9OKTsKLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsKLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgdHJ5IHsKLSAgICAgIExvZ2ljYWxPUkV4cHJlc3Npb24oKTsKLSAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgY2FzZSBIT09LOgotICAgICAgICBqal9jb25zdW1lX3Rva2VuKEhPT0spOwotICAgICAgICBBc3NpZ25tZW50RXhwcmVzc2lvbigpOwotICAgICAgICBqal9jb25zdW1lX3Rva2VuKENPTE9OKTsKLSAgICAgICAgQXNzaWdubWVudEV4cHJlc3Npb24oKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICBqal9sYTFbNTRdID0gampfZ2VuOwotICAgICAgICA7Ci0gICAgICB9Ci0gICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChFcnJvcilqanRlMDAwO30KLSAgICB9IGZpbmFsbHkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7Ci0gICAgICAgICAgfQotICAgIH0KLSAgfQotCi0gIGZpbmFsIHB1YmxpYyB2b2lkIENvbmRpdGlvbmFsRXhwcmVzc2lvbk5vSU4oKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotIC8qQGJnZW4oamp0cmVlKSBDb25kaXRpb25hbEV4cHJlc3Npb25Ob0lOICovCi0gIEFTVENvbmRpdGlvbmFsRXhwcmVzc2lvbk5vSU4gamp0bjAwMCA9IG5ldyBBU1RDb25kaXRpb25hbEV4cHJlc3Npb25Ob0lOKHRoaXMsIEpKVENPTkRJVElPTkFMRVhQUkVTU0lPTk5PSU4pOwotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOwotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsKLSAgICB0cnkgewotICAgICAgTG9naWNhbE9SRXhwcmVzc2lvbk5vSU4oKTsKLSAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgY2FzZSBIT09LOgotICAgICAgICBqal9jb25zdW1lX3Rva2VuKEhPT0spOwotICAgICAgICBBc3NpZ25tZW50RXhwcmVzc2lvbk5vSU4oKTsKLSAgICAgICAgampfY29uc3VtZV90b2tlbihDT0xPTik7Ci0gICAgICAgIEFzc2lnbm1lbnRFeHByZXNzaW9uTm9JTigpOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIGpqX2xhMVs1NV0gPSBqal9nZW47Ci0gICAgICAgIDsKLSAgICAgIH0KLSAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKEVycm9yKWpqdGUwMDA7fQotICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsKLSAgICAgICAgICB9Ci0gICAgfQotICB9Ci0KLSAgZmluYWwgcHVibGljIHZvaWQgTm9uQXNzaWdubWVudEV4cHJlc3Npb24oKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotIC8qQGJnZW4oamp0cmVlKSBOb25Bc3NpZ25tZW50RXhwcmVzc2lvbiAqLwotICBBU1ROb25Bc3NpZ25tZW50RXhwcmVzc2lvbiBqanRuMDAwID0gbmV3IEFTVE5vbkFzc2lnbm1lbnRFeHByZXNzaW9uKHRoaXMsIEpKVE5PTkFTU0lHTk1FTlRFWFBSRVNTSU9OKTsKLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsKLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgdHJ5IHsKLSAgICAgIExvZ2ljYWxPUkV4cHJlc3Npb24oKTsKLSAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgY2FzZSBIT09LOgotICAgICAgICBqal9jb25zdW1lX3Rva2VuKEhPT0spOwotICAgICAgICBOb25Bc3NpZ25tZW50RXhwcmVzc2lvbigpOwotICAgICAgICBqal9jb25zdW1lX3Rva2VuKENPTE9OKTsKLSAgICAgICAgTm9uQXNzaWdubWVudEV4cHJlc3Npb24oKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICBqal9sYTFbNTZdID0gampfZ2VuOwotICAgICAgICA7Ci0gICAgICB9Ci0gICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChFcnJvcilqanRlMDAwO30KLSAgICB9IGZpbmFsbHkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7Ci0gICAgICAgICAgfQotICAgIH0KLSAgfQotCi0gIGZpbmFsIHB1YmxpYyB2b2lkIE5vbkFzc2lnbm1lbnRFeHByZXNzaW9uTm9JTigpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gLypAYmdlbihqanRyZWUpIE5vbkFzc2lnbm1lbnRFeHByZXNzaW9uTm9JTiAqLwotICBBU1ROb25Bc3NpZ25tZW50RXhwcmVzc2lvbk5vSU4gamp0bjAwMCA9IG5ldyBBU1ROb25Bc3NpZ25tZW50RXhwcmVzc2lvbk5vSU4odGhpcywgSkpUTk9OQVNTSUdOTUVOVEVYUFJFU1NJT05OT0lOKTsKLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsKLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgdHJ5IHsKLSAgICAgIExvZ2ljYWxPUkV4cHJlc3Npb25Ob0lOKCk7Ci0gICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKLSAgICAgIGNhc2UgSE9PSzoKLSAgICAgICAgampfY29uc3VtZV90b2tlbihIT09LKTsKLSAgICAgICAgTm9uQXNzaWdubWVudEV4cHJlc3Npb25Ob0lOKCk7Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oQ09MT04pOwotICAgICAgICBOb25Bc3NpZ25tZW50RXhwcmVzc2lvbk5vSU4oKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICBqal9sYTFbNTddID0gampfZ2VuOwotICAgICAgICA7Ci0gICAgICB9Ci0gICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChFcnJvcilqanRlMDAwO30KLSAgICB9IGZpbmFsbHkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7Ci0gICAgICAgICAgfQotICAgIH0KLSAgfQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gQXNzaWdubWVudCBPcGVyYXRvcnMgCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICBmaW5hbCBwdWJsaWMgdm9pZCBBc3NpZ25lbWVudE9wZXJhdG9yKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAvKkBiZ2VuKGpqdHJlZSkgQXNzaWduZW1lbnRPcGVyYXRvciAqLwotICBBU1RBc3NpZ25lbWVudE9wZXJhdG9yIGpqdG4wMDAgPSBuZXcgQVNUQXNzaWduZW1lbnRPcGVyYXRvcih0aGlzLCBKSlRBU1NJR05FTUVOVE9QRVJBVE9SKTsKLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsKLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgdHJ5IHsKLSAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgY2FzZSBBU1NJR046Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oQVNTSUdOKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIFNUQVJBU1NJR046Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oU1RBUkFTU0lHTik7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBTTEFTSEFTU0lHTjoKLSAgICAgICAgampfY29uc3VtZV90b2tlbihTTEFTSEFTU0lHTik7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBSRU1BU1NJR046Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oUkVNQVNTSUdOKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIFBMVVNBU1NJR046Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oUExVU0FTU0lHTik7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBNSU5VU0FTU0lHTjoKLSAgICAgICAgampfY29uc3VtZV90b2tlbihNSU5VU0FTU0lHTik7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBMU0hJRlRBU1NJR046Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oTFNISUZUQVNTSUdOKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIFJTSUdORURTSElGVEFTU0lHTjoKLSAgICAgICAgampfY29uc3VtZV90b2tlbihSU0lHTkVEU0hJRlRBU1NJR04pOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgUlVOU0lHTkVEU0hJRlRBU1NJR046Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oUlVOU0lHTkVEU0hJRlRBU1NJR04pOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgQU5EQVNTSUdOOgotICAgICAgICBqal9jb25zdW1lX3Rva2VuKEFOREFTU0lHTik7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBYT1JBU1NJR046Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oWE9SQVNTSUdOKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIE9SQVNTSUdOOgotICAgICAgICBqal9jb25zdW1lX3Rva2VuKE9SQVNTSUdOKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIFNDX0FOREFTU0lHTjoKLSAgICAgICAgampfY29uc3VtZV90b2tlbihTQ19BTkRBU1NJR04pOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgU0NfWE9SQVNTSUdOOgotICAgICAgICBqal9jb25zdW1lX3Rva2VuKFNDX1hPUkFTU0lHTik7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBTQ19PUkFTU0lHTjoKLSAgICAgICAgampfY29uc3VtZV90b2tlbihTQ19PUkFTU0lHTik7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgampfbGExWzU4XSA9IGpqX2dlbjsKLSAgICAgICAgampfY29uc3VtZV90b2tlbigtMSk7Ci0gICAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigpOwotICAgICAgfQotICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsKLSAgICAgICAgICB9Ci0gICAgfQotICB9Ci0KLSAgZmluYWwgcHVibGljIHZvaWQgQXNzaWdubWVudEV4cHJlc3Npb24oKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotIC8qQGJnZW4oamp0cmVlKSBBc3NpZ25tZW50RXhwcmVzc2lvbiAqLwotICBBU1RBc3NpZ25tZW50RXhwcmVzc2lvbiBqanRuMDAwID0gbmV3IEFTVEFzc2lnbm1lbnRFeHByZXNzaW9uKHRoaXMsIEpKVEFTU0lHTk1FTlRFWFBSRVNTSU9OKTsKLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsKLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgdHJ5IHsKLSAgICAgIENvbmRpdGlvbmFsRXhwcmVzc2lvbigpOwotICAgICAgaWYgKGpqXzJfMTIoMikpIHsKLSAgICAgICAgQXNzaWduZW1lbnRPcGVyYXRvcigpOwotICAgICAgICBBc3NpZ25tZW50RXhwcmVzc2lvbigpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgOwotICAgICAgfQotICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsKLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoRXJyb3Ipamp0ZTAwMDt9Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOwotICAgICAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBmaW5hbCBwdWJsaWMgdm9pZCBBc3NpZ25tZW50RXhwcmVzc2lvbk5vSU4oKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotIC8qQGJnZW4oamp0cmVlKSBBc3NpZ25tZW50RXhwcmVzc2lvbk5vSU4gKi8KLSAgQVNUQXNzaWdubWVudEV4cHJlc3Npb25Ob0lOIGpqdG4wMDAgPSBuZXcgQVNUQXNzaWdubWVudEV4cHJlc3Npb25Ob0lOKHRoaXMsIEpKVEFTU0lHTk1FTlRFWFBSRVNTSU9OTk9JTik7Ci0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7Ci0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOwotICAgIHRyeSB7Ci0gICAgICBDb25kaXRpb25hbEV4cHJlc3Npb25Ob0lOKCk7Ci0gICAgICBpZiAoampfMl8xMygyKSkgewotICAgICAgICBBc3NpZ25lbWVudE9wZXJhdG9yKCk7Ci0gICAgICAgIEFzc2lnbm1lbnRFeHByZXNzaW9uTm9JTigpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgOwotICAgICAgfQotICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsKLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoRXJyb3Ipamp0ZTAwMDt9Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOwotICAgICAgICAgIH0KLSAgICB9Ci0gIH0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIENvbW1hIEV4cHJlc3Npb25zCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICBmaW5hbCBwdWJsaWMgdm9pZCBMaXN0RXhwcmVzc2lvbigpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gLypAYmdlbihqanRyZWUpIExpc3RFeHByZXNzaW9uICovCi0gIEFTVExpc3RFeHByZXNzaW9uIGpqdG4wMDAgPSBuZXcgQVNUTGlzdEV4cHJlc3Npb24odGhpcywgSkpUTElTVEVYUFJFU1NJT04pOwotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOwotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsKLSAgICB0cnkgewotICAgICAgQXNzaWdubWVudEV4cHJlc3Npb24oKTsKLSAgICAgIGxhYmVsXzI0OgotICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7Ci0gICAgICAgIGNhc2UgQ09NTUE6Ci0gICAgICAgICAgOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIGpqX2xhMVs1OV0gPSBqal9nZW47Ci0gICAgICAgICAgYnJlYWsgbGFiZWxfMjQ7Ci0gICAgICAgIH0KLSAgICAgICAgampfY29uc3VtZV90b2tlbihDT01NQSk7Ci0gICAgICAgIEFzc2lnbm1lbnRFeHByZXNzaW9uKCk7Ci0gICAgICB9Ci0gICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChFcnJvcilqanRlMDAwO30KLSAgICB9IGZpbmFsbHkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7Ci0gICAgICAgICAgfQotICAgIH0KLSAgfQotCi0gIGZpbmFsIHB1YmxpYyB2b2lkIExpc3RFeHByZXNzaW9uTm9JTigpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gLypAYmdlbihqanRyZWUpIExpc3RFeHByZXNzaW9uTm9JTiAqLwotICBBU1RMaXN0RXhwcmVzc2lvbk5vSU4gamp0bjAwMCA9IG5ldyBBU1RMaXN0RXhwcmVzc2lvbk5vSU4odGhpcywgSkpUTElTVEVYUFJFU1NJT05OT0lOKTsKLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsKLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgdHJ5IHsKLSAgICAgIEFzc2lnbm1lbnRFeHByZXNzaW9uTm9JTigpOwotICAgICAgbGFiZWxfMjU6Ci0gICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKLSAgICAgICAgY2FzZSBDT01NQToKLSAgICAgICAgICA7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgampfbGExWzYwXSA9IGpqX2dlbjsKLSAgICAgICAgICBicmVhayBsYWJlbF8yNTsKLSAgICAgICAgfQotICAgICAgICBqal9jb25zdW1lX3Rva2VuKENPTU1BKTsKLSAgICAgICAgQXNzaWdubWVudEV4cHJlc3Npb25Ob0lOKCk7Ci0gICAgICB9Ci0gICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChFcnJvcilqanRlMDAwO30KLSAgICB9IGZpbmFsbHkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7Ci0gICAgICAgICAgfQotICAgIH0KLSAgfQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gVHlwZSBFeHByZXNzaW9ucwotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgZmluYWwgcHVibGljIHZvaWQgVHlwZUV4cHJlc3Npb24oKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotIC8qQGJnZW4oamp0cmVlKSBUeXBlRXhwcmVzc2lvbiAqLwotICBBU1RUeXBlRXhwcmVzc2lvbiBqanRuMDAwID0gbmV3IEFTVFR5cGVFeHByZXNzaW9uKHRoaXMsIEpKVFRZUEVFWFBSRVNTSU9OKTsKLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsKLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgdHJ5IHsKLSAgICAgIE5vbkFzc2lnbm1lbnRFeHByZXNzaW9uKCk7Ci0gICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChFcnJvcilqanRlMDAwO30KLSAgICB9IGZpbmFsbHkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7Ci0gICAgICAgICAgfQotICAgIH0KLSAgfQotCi0gIGZpbmFsIHB1YmxpYyB2b2lkIFR5cGVFeHByZXNzaW9uTm9JTigpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gLypAYmdlbihqanRyZWUpIFR5cGVFeHByZXNzaW9uTm9JTiAqLwotICBBU1RUeXBlRXhwcmVzc2lvbk5vSU4gamp0bjAwMCA9IG5ldyBBU1RUeXBlRXhwcmVzc2lvbk5vSU4odGhpcywgSkpUVFlQRUVYUFJFU1NJT05OT0lOKTsKLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsKLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgdHJ5IHsKLSAgICAgIE5vbkFzc2lnbm1lbnRFeHByZXNzaW9uTm9JTigpOwotICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsKLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoRXJyb3Ipamp0ZTAwMDt9Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOwotICAgICAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBmaW5hbCBwdWJsaWMgdm9pZCBUeXBlRXhwcmVzc2lvbkxpc3QoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotIC8qQGJnZW4oamp0cmVlKSBUeXBlRXhwcmVzc2lvbkxpc3QgKi8KLSAgQVNUVHlwZUV4cHJlc3Npb25MaXN0IGpqdG4wMDAgPSBuZXcgQVNUVHlwZUV4cHJlc3Npb25MaXN0KHRoaXMsIEpKVFRZUEVFWFBSRVNTSU9OTElTVCk7Ci0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7Ci0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOwotICAgIHRyeSB7Ci0gICAgICBOb25Bc3NpZ25tZW50RXhwcmVzc2lvbigpOwotICAgICAgbGFiZWxfMjY6Ci0gICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKLSAgICAgICAgY2FzZSBDT01NQToKLSAgICAgICAgICA7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgampfbGExWzYxXSA9IGpqX2dlbjsKLSAgICAgICAgICBicmVhayBsYWJlbF8yNjsKLSAgICAgICAgfQotICAgICAgICBqal9jb25zdW1lX3Rva2VuKENPTU1BKTsKLSAgICAgICAgTm9uQXNzaWdubWVudEV4cHJlc3Npb24oKTsKLSAgICAgIH0KLSAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKEVycm9yKWpqdGUwMDA7fQotICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsKLSAgICAgICAgICB9Ci0gICAgfQotICB9Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyBTdGFlbWVudHMgKGFiYnJldiwgbm9TaG9ydElmLCBmdWxsKSAKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gIGZpbmFsIHB1YmxpYyB2b2lkIFN0YXRlbWVudCgpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gLypAYmdlbihqanRyZWUpIFN0YXRlbWVudCAqLwotICBBU1RTdGF0ZW1lbnQgamp0bjAwMCA9IG5ldyBBU1RTdGF0ZW1lbnQodGhpcywgSkpUU1RBVEVNRU5UKTsKLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsKLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgdHJ5IHsKLSAgICAgIGlmIChqal8yXzE0KDMpKSB7Ci0gICAgICAgIEV4cHJlc3Npb25TdGF0ZW1lbnQoKTsKLSAgICAgICAgU2MoKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgICBjYXNlIFNVUEVSOgotICAgICAgICAgIFN1cGVyU3RhdGVtZW50KCk7Ci0gICAgICAgICAgU2MoKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBMQlJBQ0U6Ci0gICAgICAgICAgQmxvY2soKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBHRVQ6Ci0gICAgICAgIGNhc2UgSU5DTFVERToKLSAgICAgICAgY2FzZSBTRVQ6Ci0gICAgICAgIGNhc2UgSURFTlRJRklFUjoKLSAgICAgICAgICBMYWJlbGVkU3RhdGVtZW50KCk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgSUY6Ci0gICAgICAgICAgSWZTdGF0ZW1lbnQoKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBTV0lUQ0g6Ci0gICAgICAgICAgU3dpdGNoU3RhdGVtZW50KCk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgRE86Ci0gICAgICAgICAgRG9TdGF0ZW1lbnQoKTsKLSAgICAgICAgICBTYygpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFdISUxFOgotICAgICAgICAgIFdoaWxlU3RhdGVtZW50KCk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgRk9SOgotICAgICAgICAgIEZvclN0YXRlbWVudCgpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFdJVEg6Ci0gICAgICAgICAgV2l0aFN0YXRlbWVudCgpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIENPTlRJTlVFOgotICAgICAgICAgIENvbnRpbnVlU3RhdGVtZW50KCk7Ci0gICAgICAgICAgU2MoKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBCUkVBSzoKLSAgICAgICAgICBCcmVha1N0YXRlbWVudCgpOwotICAgICAgICAgIFNjKCk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgUkVUVVJOOgotICAgICAgICAgIFJldHVyblN0YXRlbWVudCgpOwotICAgICAgICAgIFNjKCk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgVEhST1c6Ci0gICAgICAgICAgVGhyb3dTdGF0ZW1lbnQoKTsKLSAgICAgICAgICBTYygpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFRSWToKLSAgICAgICAgICBUcnlTdGF0ZW1lbnQoKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICBqal9sYTFbNjJdID0gampfZ2VuOwotICAgICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oLTEpOwotICAgICAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChFcnJvcilqanRlMDAwO30KLSAgICB9IGZpbmFsbHkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7Ci0gICAgICAgICAgfQotICAgIH0KLSAgfQotCi0gIGZpbmFsIHB1YmxpYyB2b2lkIFN1YnN0YXRlbWVudCgpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gLypAYmdlbihqanRyZWUpIFN1YnN0YXRlbWVudCAqLwotICBBU1RTdWJzdGF0ZW1lbnQgamp0bjAwMCA9IG5ldyBBU1RTdWJzdGF0ZW1lbnQodGhpcywgSkpUU1VCU1RBVEVNRU5UKTsKLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsKLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgdHJ5IHsKLSAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgY2FzZSBTRU1JQ09MT046Ci0gICAgICAgIEVtcHR5U3RhdGVtZW50KCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgampfbGExWzYzXSA9IGpqX2dlbjsKLSAgICAgICAgaWYgKGpqXzJfMTUoMikpIHsKLSAgICAgICAgICBTdGF0ZW1lbnQoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKLSAgICAgICAgICBjYXNlIFZBUjoKLSAgICAgICAgICAgIFNpbXBsZVZhcmlhYmxlRGVmaW5pdGlvbigpOwotICAgICAgICAgICAgU2MoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgRkFMU0U6Ci0gICAgICAgICAgY2FzZSBHRVQ6Ci0gICAgICAgICAgY2FzZSBJTkNMVURFOgotICAgICAgICAgIGNhc2UgUFJJVkFURToKLSAgICAgICAgICBjYXNlIFBVQkxJQzoKLSAgICAgICAgICBjYXNlIFNFVDoKLSAgICAgICAgICBjYXNlIFRSVUU6Ci0gICAgICAgICAgY2FzZSBQUk9URUNURUQ6Ci0gICAgICAgICAgY2FzZSBJREVOVElGSUVSOgotICAgICAgICAgICAgQXR0cmlidXRlcygpOwotICAgICAgICAgICAgampfY29uc3VtZV90b2tlbihMQlJBQ0UpOwotICAgICAgICAgICAgU3Vic3RhdGVtZW50cygpOwotICAgICAgICAgICAgampfY29uc3VtZV90b2tlbihSQlJBQ0UpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGpqX2xhMVs2NF0gPSBqal9nZW47Ci0gICAgICAgICAgICBqal9jb25zdW1lX3Rva2VuKC0xKTsKLSAgICAgICAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgICAgICAgICAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOwotICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgewotICAgICAgICAgICAgICAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgewotICAgICAgICAgICAgICAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKEVycm9yKWpqdGUwMDA7fQotICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOwotICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgfQotICB9Ci0KLSAgZmluYWwgcHVibGljIHZvaWQgU3Vic3RhdGVtZW50cygpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gLypAYmdlbihqanRyZWUpIFN1YnN0YXRlbWVudHMgKi8KLSAgQVNUU3Vic3RhdGVtZW50cyBqanRuMDAwID0gbmV3IEFTVFN1YnN0YXRlbWVudHModGhpcywgSkpUU1VCU1RBVEVNRU5UUyk7Ci0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7Ci0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOwotICAgIHRyeSB7Ci0gICAgICBsYWJlbF8yNzoKLSAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgIFN1YnN0YXRlbWVudCgpOwotICAgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKLSAgICAgICAgY2FzZSBCUkVBSzoKLSAgICAgICAgY2FzZSBDT05USU5VRToKLSAgICAgICAgY2FzZSBERUxFVEU6Ci0gICAgICAgIGNhc2UgRE86Ci0gICAgICAgIGNhc2UgRkFMU0U6Ci0gICAgICAgIGNhc2UgRk9SOgotICAgICAgICBjYXNlIEZVTkNUSU9OOgotICAgICAgICBjYXNlIEdFVDoKLSAgICAgICAgY2FzZSBJRjoKLSAgICAgICAgY2FzZSBJTkNMVURFOgotICAgICAgICBjYXNlIE5FVzoKLSAgICAgICAgY2FzZSBOVUxMOgotICAgICAgICBjYXNlIFBSSVZBVEU6Ci0gICAgICAgIGNhc2UgUFVCTElDOgotICAgICAgICBjYXNlIFJFVFVSTjoKLSAgICAgICAgY2FzZSBTRVQ6Ci0gICAgICAgIGNhc2UgU1VQRVI6Ci0gICAgICAgIGNhc2UgU1dJVENIOgotICAgICAgICBjYXNlIFRISVM6Ci0gICAgICAgIGNhc2UgVEhST1c6Ci0gICAgICAgIGNhc2UgVFJVRToKLSAgICAgICAgY2FzZSBUUlk6Ci0gICAgICAgIGNhc2UgVFlQRU9GOgotICAgICAgICBjYXNlIFZBUjoKLSAgICAgICAgY2FzZSBWT0lEOgotICAgICAgICBjYXNlIFdISUxFOgotICAgICAgICBjYXNlIFdJVEg6Ci0gICAgICAgIGNhc2UgUFJPVEVDVEVEOgotICAgICAgICBjYXNlIERFQ0lNQUxfTElURVJBTDoKLSAgICAgICAgY2FzZSBIRVhfTElURVJBTDoKLSAgICAgICAgY2FzZSBPQ1RBTF9MSVRFUkFMOgotICAgICAgICBjYXNlIEZMT0FUSU5HX1BPSU5UX0xJVEVSQUw6Ci0gICAgICAgIGNhc2UgU1RSSU5HX0xJVEVSQUw6Ci0gICAgICAgIGNhc2UgUkVHVUxBUl9FWFBSRVNTSU9OOgotICAgICAgICBjYXNlIElERU5USUZJRVI6Ci0gICAgICAgIGNhc2UgTFBBUkVOOgotICAgICAgICBjYXNlIExCUkFDRToKLSAgICAgICAgY2FzZSBMQlJBQ0tFVDoKLSAgICAgICAgY2FzZSBTRU1JQ09MT046Ci0gICAgICAgIGNhc2UgQkFORzoKLSAgICAgICAgY2FzZSBUSUxERToKLSAgICAgICAgY2FzZSBJTkNSOgotICAgICAgICBjYXNlIERFQ1I6Ci0gICAgICAgIGNhc2UgUExVUzoKLSAgICAgICAgY2FzZSBNSU5VUzoKLSAgICAgICAgICA7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgampfbGExWzY1XSA9IGpqX2dlbjsKLSAgICAgICAgICBicmVhayBsYWJlbF8yNzsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsKLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoRXJyb3Ipamp0ZTAwMDt9Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOwotICAgICAgICAgIH0KLSAgICB9Ci0gIH0KLQotICB2b2lkIFNjKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAvKkBiZ2VuKGpqdHJlZSkgU2MgKi8KLSBBU1RTYyBqanRuMDAwID0gbmV3IEFTVFNjKHRoaXMsIEpKVFNDKTsKLSBib29sZWFuIGpqdGMwMDAgPSB0cnVlOwotIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOwotIHRyeSB7VG9rZW4gdG9rID0gZ2V0VG9rZW4oMSk7Ci0gICAgaWYgKHRvay5raW5kID09IFNFTUlDT0xPTikgewotICAgICAgIHRvayA9IGdldE5leHRUb2tlbigpOwotICAgIH0gZWxzZSBpZiAodG9rLnNwZWNpYWxUb2tlbiAhPSBudWxsKSB7Ci0gICAgICAgaWYgKCFFb2xDb21tZW50U2tpcFdzKHRvay5zcGVjaWFsVG9rZW4pICYmICh0b2sua2luZCAhPSBFT0YpKSB7Ci0gICAgICAgICAgdGhyb3cgZ2VuZXJhdGVQYXJzZUV4Y2VwdGlvbigpOwotICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKCh0b2sua2luZCAhPSBFT0YpICYmICh0b2sua2luZCE9UkJSQUNFKSkgewotICAgICAgICAgdGhyb3cgZ2VuZXJhdGVQYXJzZUV4Y2VwdGlvbigpOwotICAgIH0vKkBiZ2VuKGpqdHJlZSkqLwotIH0gZmluYWxseSB7Ci0gICBpZiAoamp0YzAwMCkgewotICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7Ci0gICB9Ci0gfQotICB9Ci0KLSAgYm9vbGVhbiBFb2xDb21tZW50U2tpcFdzKFRva2VuIHQpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypAYmdlbihqanRyZWUpIEVvbENvbW1lbnRTa2lwV3MgKi8KLSBBU1RFb2xDb21tZW50U2tpcFdzIGpqdG4wMDAgPSBuZXcgQVNURW9sQ29tbWVudFNraXBXcyh0aGlzLCBKSlRFT0xDT01NRU5UU0tJUFdTKTsKLSBib29sZWFuIGpqdGMwMDAgPSB0cnVlOwotIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOwotIHRyeSB7Ym9vbGVhbiByZXRWYWwgPSBmYWxzZTsKLSAgICBUb2tlbiBzcGVjaWFsVG9rZW4gPSB0OwotICAgIHdoaWxlKHNwZWNpYWxUb2tlbiAhPSBudWxsKSB7Ci0gICAgICBpZihzcGVjaWFsVG9rZW4ua2luZCA9PSBXUykgewotICAgICAgICBzcGVjaWFsVG9rZW4gPSBzcGVjaWFsVG9rZW4uc3BlY2lhbFRva2VuOwotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYoc3BlY2lhbFRva2VuLmtpbmQgPT0gRU9MICB8fAotICAgICAgICAgICAgICBzcGVjaWFsVG9rZW4ua2luZCA9PSBTSU5HTEVfTElORV9DT01NRU5UKSB7Ci0gICAgICAgIHJldFZhbCA9IHRydWU7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgZWxzZSB7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmV0VmFsOy8qQGJnZW4oamp0cmVlKSovCi0gfSBmaW5hbGx5IHsKLSAgIGlmIChqanRjMDAwKSB7Ci0gICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsKLSAgIH0KLSB9Ci0gIH0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIEVtcHR5IFN0YXRlbWVudCAKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gIGZpbmFsIHB1YmxpYyB2b2lkIEVtcHR5U3RhdGVtZW50KCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAvKkBiZ2VuKGpqdHJlZSkgRW1wdHlTdGF0ZW1lbnQgKi8KLSAgQVNURW1wdHlTdGF0ZW1lbnQgamp0bjAwMCA9IG5ldyBBU1RFbXB0eVN0YXRlbWVudCh0aGlzLCBKSlRFTVBUWVNUQVRFTUVOVCk7Ci0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7Ci0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOwotICAgIHRyeSB7Ci0gICAgICBqal9jb25zdW1lX3Rva2VuKFNFTUlDT0xPTik7Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOwotICAgICAgICAgIH0KLSAgICB9Ci0gIH0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIEV4cHJlc2lvbiBTdGF0ZW1lbnQgCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICBmaW5hbCBwdWJsaWMgdm9pZCBFeHByZXNzaW9uU3RhdGVtZW50KCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAvKkBiZ2VuKGpqdHJlZSkgRXhwcmVzc2lvblN0YXRlbWVudCAqLwotICBBU1RFeHByZXNzaW9uU3RhdGVtZW50IGpqdG4wMDAgPSBuZXcgQVNURXhwcmVzc2lvblN0YXRlbWVudCh0aGlzLCBKSlRFWFBSRVNTSU9OU1RBVEVNRU5UKTsKLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsKLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgdHJ5IHsKLSAgICAgIExpc3RFeHByZXNzaW9uKCk7Ci0gICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChFcnJvcilqanRlMDAwO30KLSAgICB9IGZpbmFsbHkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7Ci0gICAgICAgICAgfQotICAgIH0KLSAgfQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gU3VwZXIgU3RhdGVtZW50IAotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgZmluYWwgcHVibGljIHZvaWQgU3VwZXJTdGF0ZW1lbnQoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotIC8qQGJnZW4oamp0cmVlKSBTdXBlclN0YXRlbWVudCAqLwotICBBU1RTdXBlclN0YXRlbWVudCBqanRuMDAwID0gbmV3IEFTVFN1cGVyU3RhdGVtZW50KHRoaXMsIEpKVFNVUEVSU1RBVEVNRU5UKTsKLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsKLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgdHJ5IHsKLSAgICAgIGpqX2NvbnN1bWVfdG9rZW4oU1VQRVIpOwotICAgICAgQXJndW1lbnRzKCk7Ci0gICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChFcnJvcilqanRlMDAwO30KLSAgICB9IGZpbmFsbHkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7Ci0gICAgICAgICAgfQotICAgIH0KLSAgfQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gQmxvY2sgU3RhdGVtZW50IAotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgZmluYWwgcHVibGljIHZvaWQgQmxvY2soKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotIC8qQGJnZW4oamp0cmVlKSBCbG9jayAqLwotICBBU1RCbG9jayBqanRuMDAwID0gbmV3IEFTVEJsb2NrKHRoaXMsIEpKVEJMT0NLKTsKLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsKLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgdHJ5IHsKLSAgICAgIGpqX2NvbnN1bWVfdG9rZW4oTEJSQUNFKTsKLSAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgY2FzZSBCUkVBSzoKLSAgICAgIGNhc2UgQ0xBU1M6Ci0gICAgICBjYXNlIENPTlNUOgotICAgICAgY2FzZSBDT05USU5VRToKLSAgICAgIGNhc2UgREVMRVRFOgotICAgICAgY2FzZSBETzoKLSAgICAgIGNhc2UgRkFMU0U6Ci0gICAgICBjYXNlIEZPUjoKLSAgICAgIGNhc2UgRlVOQ1RJT046Ci0gICAgICBjYXNlIEdFVDoKLSAgICAgIGNhc2UgSUY6Ci0gICAgICBjYXNlIElOQ0xVREU6Ci0gICAgICBjYXNlIE5BTUVTUEFDRToKLSAgICAgIGNhc2UgTkVXOgotICAgICAgY2FzZSBOVUxMOgotICAgICAgY2FzZSBQUklWQVRFOgotICAgICAgY2FzZSBQVUJMSUM6Ci0gICAgICBjYXNlIFJFVFVSTjoKLSAgICAgIGNhc2UgU0VUOgotICAgICAgY2FzZSBTVVBFUjoKLSAgICAgIGNhc2UgU1dJVENIOgotICAgICAgY2FzZSBUSElTOgotICAgICAgY2FzZSBUSFJPVzoKLSAgICAgIGNhc2UgVFJVRToKLSAgICAgIGNhc2UgVFJZOgotICAgICAgY2FzZSBUWVBFT0Y6Ci0gICAgICBjYXNlIFVTRToKLSAgICAgIGNhc2UgVkFSOgotICAgICAgY2FzZSBWT0lEOgotICAgICAgY2FzZSBXSElMRToKLSAgICAgIGNhc2UgV0lUSDoKLSAgICAgIGNhc2UgRVhQT1JUOgotICAgICAgY2FzZSBJTlRFUkZBQ0U6Ci0gICAgICBjYXNlIFBST1RFQ1RFRDoKLSAgICAgIGNhc2UgSU1QT1JUOgotICAgICAgY2FzZSBERUNJTUFMX0xJVEVSQUw6Ci0gICAgICBjYXNlIEhFWF9MSVRFUkFMOgotICAgICAgY2FzZSBPQ1RBTF9MSVRFUkFMOgotICAgICAgY2FzZSBGTE9BVElOR19QT0lOVF9MSVRFUkFMOgotICAgICAgY2FzZSBTVFJJTkdfTElURVJBTDoKLSAgICAgIGNhc2UgUkVHVUxBUl9FWFBSRVNTSU9OOgotICAgICAgY2FzZSBJREVOVElGSUVSOgotICAgICAgY2FzZSBMUEFSRU46Ci0gICAgICBjYXNlIExCUkFDRToKLSAgICAgIGNhc2UgTEJSQUNLRVQ6Ci0gICAgICBjYXNlIFNFTUlDT0xPTjoKLSAgICAgIGNhc2UgQkFORzoKLSAgICAgIGNhc2UgVElMREU6Ci0gICAgICBjYXNlIElOQ1I6Ci0gICAgICBjYXNlIERFQ1I6Ci0gICAgICBjYXNlIFBMVVM6Ci0gICAgICBjYXNlIE1JTlVTOgotICAgICAgICBEaXJlY3RpdmVzKCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgampfbGExWzY2XSA9IGpqX2dlbjsKLSAgICAgICAgOwotICAgICAgfQotICAgICAgampfY29uc3VtZV90b2tlbihSQlJBQ0UpOwotICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsKLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoRXJyb3Ipamp0ZTAwMDt9Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOwotICAgICAgICAgIH0KLSAgICB9Ci0gIH0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIExhYmVsZWQgU3RhdGVtZW50IChtYXBzIHRvIGxpdGVyYWwgZmllbGQpCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICBmaW5hbCBwdWJsaWMgdm9pZCBMYWJlbGVkU3RhdGVtZW50KCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAvKkBiZ2VuKGpqdHJlZSkgTGFiZWxlZFN0YXRlbWVudCAqLwotICBBU1RMYWJlbGVkU3RhdGVtZW50IGpqdG4wMDAgPSBuZXcgQVNUTGFiZWxlZFN0YXRlbWVudCh0aGlzLCBKSlRMQUJFTEVEU1RBVEVNRU5UKTsKLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsKLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgdHJ5IHsKLSAgICAgIElkZW50aWZpZXIoKTsKLSAgICAgIGpqX2NvbnN1bWVfdG9rZW4oQ09MT04pOwotICAgICAgU3Vic3RhdGVtZW50KCk7Ci0gICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChFcnJvcilqanRlMDAwO30KLSAgICB9IGZpbmFsbHkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7Ci0gICAgICAgICAgfQotICAgIH0KLSAgfQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gSWYgU3RhdGVtZW50IAotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgZmluYWwgcHVibGljIHZvaWQgSWZTdGF0ZW1lbnQoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotIC8qQGJnZW4oamp0cmVlKSBJZlN0YXRlbWVudCAqLwotICBBU1RJZlN0YXRlbWVudCBqanRuMDAwID0gbmV3IEFTVElmU3RhdGVtZW50KHRoaXMsIEpKVElGU1RBVEVNRU5UKTsKLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsKLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgdHJ5IHsKLSAgICAgIGpqX2NvbnN1bWVfdG9rZW4oSUYpOwotICAgICAgampfY29uc3VtZV90b2tlbihMUEFSRU4pOwotICAgICAgTGlzdEV4cHJlc3Npb24oKTsKLSAgICAgIGpqX2NvbnN1bWVfdG9rZW4oUlBBUkVOKTsKLSAgICAgIFN1YnN0YXRlbWVudCgpOwotICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7Ci0gICAgICBjYXNlIEVMU0U6Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oRUxTRSk7Ci0gICAgICAgIFN1YnN0YXRlbWVudCgpOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIGpqX2xhMVs2N10gPSBqal9nZW47Ci0gICAgICAgIDsKLSAgICAgIH0KLSAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKEVycm9yKWpqdGUwMDA7fQotICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsKLSAgICAgICAgICB9Ci0gICAgfQotICB9Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyBTd2l0Y2ggU3RhdGVtZW50IAotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgZmluYWwgcHVibGljIHZvaWQgU3dpdGNoU3RhdGVtZW50KCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAvKkBiZ2VuKGpqdHJlZSkgU3dpdGNoU3RhdGVtZW50ICovCi0gIEFTVFN3aXRjaFN0YXRlbWVudCBqanRuMDAwID0gbmV3IEFTVFN3aXRjaFN0YXRlbWVudCh0aGlzLCBKSlRTV0lUQ0hTVEFURU1FTlQpOwotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOwotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsKLSAgICB0cnkgewotICAgICAgampfY29uc3VtZV90b2tlbihTV0lUQ0gpOwotICAgICAgampfY29uc3VtZV90b2tlbihMUEFSRU4pOwotICAgICAgTGlzdEV4cHJlc3Npb24oKTsKLSAgICAgIGpqX2NvbnN1bWVfdG9rZW4oUlBBUkVOKTsKLSAgICAgIGpqX2NvbnN1bWVfdG9rZW4oTEJSQUNFKTsKLSAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgY2FzZSBDQVNFOgotICAgICAgY2FzZSBfREVGQVVMVDoKLSAgICAgICAgQ2FzZUVsZW1lbnRzKCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgampfbGExWzY4XSA9IGpqX2dlbjsKLSAgICAgICAgOwotICAgICAgfQotICAgICAgampfY29uc3VtZV90b2tlbihSQlJBQ0UpOwotICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsKLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoRXJyb3Ipamp0ZTAwMDt9Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOwotICAgICAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBmaW5hbCBwdWJsaWMgdm9pZCBDYXNlRWxlbWVudHMoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotIC8qQGJnZW4oamp0cmVlKSBDYXNlRWxlbWVudHMgKi8KLSAgQVNUQ2FzZUVsZW1lbnRzIGpqdG4wMDAgPSBuZXcgQVNUQ2FzZUVsZW1lbnRzKHRoaXMsIEpKVENBU0VFTEVNRU5UUyk7Ci0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7Ci0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOwotICAgIHRyeSB7Ci0gICAgICBDYXNlTGFiZWwoKTsKLSAgICAgIGxhYmVsXzI4OgotICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7Ci0gICAgICAgIGNhc2UgQlJFQUs6Ci0gICAgICAgIGNhc2UgQ0FTRToKLSAgICAgICAgY2FzZSBDTEFTUzoKLSAgICAgICAgY2FzZSBDT05TVDoKLSAgICAgICAgY2FzZSBDT05USU5VRToKLSAgICAgICAgY2FzZSBfREVGQVVMVDoKLSAgICAgICAgY2FzZSBERUxFVEU6Ci0gICAgICAgIGNhc2UgRE86Ci0gICAgICAgIGNhc2UgRkFMU0U6Ci0gICAgICAgIGNhc2UgRk9SOgotICAgICAgICBjYXNlIEZVTkNUSU9OOgotICAgICAgICBjYXNlIEdFVDoKLSAgICAgICAgY2FzZSBJRjoKLSAgICAgICAgY2FzZSBJTkNMVURFOgotICAgICAgICBjYXNlIE5BTUVTUEFDRToKLSAgICAgICAgY2FzZSBORVc6Ci0gICAgICAgIGNhc2UgTlVMTDoKLSAgICAgICAgY2FzZSBQUklWQVRFOgotICAgICAgICBjYXNlIFBVQkxJQzoKLSAgICAgICAgY2FzZSBSRVRVUk46Ci0gICAgICAgIGNhc2UgU0VUOgotICAgICAgICBjYXNlIFNVUEVSOgotICAgICAgICBjYXNlIFNXSVRDSDoKLSAgICAgICAgY2FzZSBUSElTOgotICAgICAgICBjYXNlIFRIUk9XOgotICAgICAgICBjYXNlIFRSVUU6Ci0gICAgICAgIGNhc2UgVFJZOgotICAgICAgICBjYXNlIFRZUEVPRjoKLSAgICAgICAgY2FzZSBVU0U6Ci0gICAgICAgIGNhc2UgVkFSOgotICAgICAgICBjYXNlIFZPSUQ6Ci0gICAgICAgIGNhc2UgV0hJTEU6Ci0gICAgICAgIGNhc2UgV0lUSDoKLSAgICAgICAgY2FzZSBFWFBPUlQ6Ci0gICAgICAgIGNhc2UgSU5URVJGQUNFOgotICAgICAgICBjYXNlIFBST1RFQ1RFRDoKLSAgICAgICAgY2FzZSBJTVBPUlQ6Ci0gICAgICAgIGNhc2UgREVDSU1BTF9MSVRFUkFMOgotICAgICAgICBjYXNlIEhFWF9MSVRFUkFMOgotICAgICAgICBjYXNlIE9DVEFMX0xJVEVSQUw6Ci0gICAgICAgIGNhc2UgRkxPQVRJTkdfUE9JTlRfTElURVJBTDoKLSAgICAgICAgY2FzZSBTVFJJTkdfTElURVJBTDoKLSAgICAgICAgY2FzZSBSRUdVTEFSX0VYUFJFU1NJT046Ci0gICAgICAgIGNhc2UgSURFTlRJRklFUjoKLSAgICAgICAgY2FzZSBMUEFSRU46Ci0gICAgICAgIGNhc2UgTEJSQUNFOgotICAgICAgICBjYXNlIExCUkFDS0VUOgotICAgICAgICBjYXNlIFNFTUlDT0xPTjoKLSAgICAgICAgY2FzZSBCQU5HOgotICAgICAgICBjYXNlIFRJTERFOgotICAgICAgICBjYXNlIElOQ1I6Ci0gICAgICAgIGNhc2UgREVDUjoKLSAgICAgICAgY2FzZSBQTFVTOgotICAgICAgICBjYXNlIE1JTlVTOgotICAgICAgICAgIDsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICBqal9sYTFbNjldID0gampfZ2VuOwotICAgICAgICAgIGJyZWFrIGxhYmVsXzI4OwotICAgICAgICB9Ci0gICAgICAgIENhc2VFbGVtZW50KCk7Ci0gICAgICB9Ci0gICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChFcnJvcilqanRlMDAwO30KLSAgICB9IGZpbmFsbHkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7Ci0gICAgICAgICAgfQotICAgIH0KLSAgfQotCi0gIGZpbmFsIHB1YmxpYyB2b2lkIENhc2VFbGVtZW50KCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAvKkBiZ2VuKGpqdHJlZSkgQ2FzZUVsZW1lbnQgKi8KLSAgQVNUQ2FzZUVsZW1lbnQgamp0bjAwMCA9IG5ldyBBU1RDYXNlRWxlbWVudCh0aGlzLCBKSlRDQVNFRUxFTUVOVCk7Ci0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7Ci0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOwotICAgIHRyeSB7Ci0gICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKLSAgICAgIGNhc2UgQlJFQUs6Ci0gICAgICBjYXNlIENMQVNTOgotICAgICAgY2FzZSBDT05TVDoKLSAgICAgIGNhc2UgQ09OVElOVUU6Ci0gICAgICBjYXNlIERFTEVURToKLSAgICAgIGNhc2UgRE86Ci0gICAgICBjYXNlIEZBTFNFOgotICAgICAgY2FzZSBGT1I6Ci0gICAgICBjYXNlIEZVTkNUSU9OOgotICAgICAgY2FzZSBHRVQ6Ci0gICAgICBjYXNlIElGOgotICAgICAgY2FzZSBJTkNMVURFOgotICAgICAgY2FzZSBOQU1FU1BBQ0U6Ci0gICAgICBjYXNlIE5FVzoKLSAgICAgIGNhc2UgTlVMTDoKLSAgICAgIGNhc2UgUFJJVkFURToKLSAgICAgIGNhc2UgUFVCTElDOgotICAgICAgY2FzZSBSRVRVUk46Ci0gICAgICBjYXNlIFNFVDoKLSAgICAgIGNhc2UgU1VQRVI6Ci0gICAgICBjYXNlIFNXSVRDSDoKLSAgICAgIGNhc2UgVEhJUzoKLSAgICAgIGNhc2UgVEhST1c6Ci0gICAgICBjYXNlIFRSVUU6Ci0gICAgICBjYXNlIFRSWToKLSAgICAgIGNhc2UgVFlQRU9GOgotICAgICAgY2FzZSBVU0U6Ci0gICAgICBjYXNlIFZBUjoKLSAgICAgIGNhc2UgVk9JRDoKLSAgICAgIGNhc2UgV0hJTEU6Ci0gICAgICBjYXNlIFdJVEg6Ci0gICAgICBjYXNlIEVYUE9SVDoKLSAgICAgIGNhc2UgSU5URVJGQUNFOgotICAgICAgY2FzZSBQUk9URUNURUQ6Ci0gICAgICBjYXNlIElNUE9SVDoKLSAgICAgIGNhc2UgREVDSU1BTF9MSVRFUkFMOgotICAgICAgY2FzZSBIRVhfTElURVJBTDoKLSAgICAgIGNhc2UgT0NUQUxfTElURVJBTDoKLSAgICAgIGNhc2UgRkxPQVRJTkdfUE9JTlRfTElURVJBTDoKLSAgICAgIGNhc2UgU1RSSU5HX0xJVEVSQUw6Ci0gICAgICBjYXNlIFJFR1VMQVJfRVhQUkVTU0lPTjoKLSAgICAgIGNhc2UgSURFTlRJRklFUjoKLSAgICAgIGNhc2UgTFBBUkVOOgotICAgICAgY2FzZSBMQlJBQ0U6Ci0gICAgICBjYXNlIExCUkFDS0VUOgotICAgICAgY2FzZSBTRU1JQ09MT046Ci0gICAgICBjYXNlIEJBTkc6Ci0gICAgICBjYXNlIFRJTERFOgotICAgICAgY2FzZSBJTkNSOgotICAgICAgY2FzZSBERUNSOgotICAgICAgY2FzZSBQTFVTOgotICAgICAgY2FzZSBNSU5VUzoKLSAgICAgICAgRGlyZWN0aXZlKCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBDQVNFOgotICAgICAgY2FzZSBfREVGQVVMVDoKLSAgICAgICAgQ2FzZUxhYmVsKCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgampfbGExWzcwXSA9IGpqX2dlbjsKLSAgICAgICAgampfY29uc3VtZV90b2tlbigtMSk7Ci0gICAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigpOwotICAgICAgfQotICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsKLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoRXJyb3Ipamp0ZTAwMDt9Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOwotICAgICAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBmaW5hbCBwdWJsaWMgdm9pZCBDYXNlTGFiZWwoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotIC8qQGJnZW4oamp0cmVlKSBDYXNlTGFiZWwgKi8KLSAgQVNUQ2FzZUxhYmVsIGpqdG4wMDAgPSBuZXcgQVNUQ2FzZUxhYmVsKHRoaXMsIEpKVENBU0VMQUJFTCk7Ci0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7Ci0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOwotICAgIHRyeSB7Ci0gICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKLSAgICAgIGNhc2UgQ0FTRToKLSAgICAgICAgampfY29uc3VtZV90b2tlbihDQVNFKTsKLSAgICAgICAgTGlzdEV4cHJlc3Npb24oKTsKLSAgICAgICAgampfY29uc3VtZV90b2tlbihDT0xPTik7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBfREVGQVVMVDoKLSAgICAgICAgampfY29uc3VtZV90b2tlbihfREVGQVVMVCk7Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oQ09MT04pOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIGpqX2xhMVs3MV0gPSBqal9nZW47Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oLTEpOwotICAgICAgICB0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oKTsKLSAgICAgIH0KLSAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKEVycm9yKWpqdGUwMDA7fQotICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsKLSAgICAgICAgICB9Ci0gICAgfQotICB9Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyBEby1XaGlsZSBTdGF0ZW1lbnQgCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICBmaW5hbCBwdWJsaWMgdm9pZCBEb1N0YXRlbWVudCgpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gLypAYmdlbihqanRyZWUpIERvU3RhdGVtZW50ICovCi0gIEFTVERvU3RhdGVtZW50IGpqdG4wMDAgPSBuZXcgQVNURG9TdGF0ZW1lbnQodGhpcywgSkpURE9TVEFURU1FTlQpOwotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOwotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsKLSAgICB0cnkgewotICAgICAgampfY29uc3VtZV90b2tlbihETyk7Ci0gICAgICBTdWJzdGF0ZW1lbnQoKTsKLSAgICAgIGpqX2NvbnN1bWVfdG9rZW4oV0hJTEUpOwotICAgICAgampfY29uc3VtZV90b2tlbihMUEFSRU4pOwotICAgICAgTGlzdEV4cHJlc3Npb24oKTsKLSAgICAgIGpqX2NvbnN1bWVfdG9rZW4oUlBBUkVOKTsKLSAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKEVycm9yKWpqdGUwMDA7fQotICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsKLSAgICAgICAgICB9Ci0gICAgfQotICB9Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyBXaGlsZSBTdGF0ZW1lbnQKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gIGZpbmFsIHB1YmxpYyB2b2lkIFdoaWxlU3RhdGVtZW50KCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAvKkBiZ2VuKGpqdHJlZSkgV2hpbGVTdGF0ZW1lbnQgKi8KLSAgQVNUV2hpbGVTdGF0ZW1lbnQgamp0bjAwMCA9IG5ldyBBU1RXaGlsZVN0YXRlbWVudCh0aGlzLCBKSlRXSElMRVNUQVRFTUVOVCk7Ci0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7Ci0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOwotICAgIHRyeSB7Ci0gICAgICBqal9jb25zdW1lX3Rva2VuKFdISUxFKTsKLSAgICAgIGpqX2NvbnN1bWVfdG9rZW4oTFBBUkVOKTsKLSAgICAgIExpc3RFeHByZXNzaW9uKCk7Ci0gICAgICBqal9jb25zdW1lX3Rva2VuKFJQQVJFTik7Ci0gICAgICBTdWJzdGF0ZW1lbnQoKTsKLSAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKEVycm9yKWpqdGUwMDA7fQotICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsKLSAgICAgICAgICB9Ci0gICAgfQotICB9Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyBGb3IgU3RhdGVtZW50cyAKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gIGZpbmFsIHB1YmxpYyB2b2lkIEZvclN0YXRlbWVudCgpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gLypAYmdlbihqanRyZWUpIEZvclN0YXRlbWVudCAqLwotICBBU1RGb3JTdGF0ZW1lbnQgamp0bjAwMCA9IG5ldyBBU1RGb3JTdGF0ZW1lbnQodGhpcywgSkpURk9SU1RBVEVNRU5UKTsKLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsKLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgdHJ5IHsKLSAgICAgIGlmIChqal8yXzE2KDIxNDc0ODM2NDcpKSB7Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oRk9SKTsKLSAgICAgICAgampfY29uc3VtZV90b2tlbihMUEFSRU4pOwotICAgICAgICBGb3JJbkJpbmRpbmcoKTsKLSAgICAgICAgampfY29uc3VtZV90b2tlbihJTik7Ci0gICAgICAgIExpc3RFeHByZXNzaW9uKCk7Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oUlBBUkVOKTsKLSAgICAgICAgU3Vic3RhdGVtZW50KCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKLSAgICAgICAgY2FzZSBGT1I6Ci0gICAgICAgICAgampfY29uc3VtZV90b2tlbihGT1IpOwotICAgICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oTFBBUkVOKTsKLSAgICAgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKLSAgICAgICAgICBjYXNlIENPTlNUOgotICAgICAgICAgIGNhc2UgREVMRVRFOgotICAgICAgICAgIGNhc2UgRkFMU0U6Ci0gICAgICAgICAgY2FzZSBGVU5DVElPTjoKLSAgICAgICAgICBjYXNlIEdFVDoKLSAgICAgICAgICBjYXNlIElOQ0xVREU6Ci0gICAgICAgICAgY2FzZSBORVc6Ci0gICAgICAgICAgY2FzZSBOVUxMOgotICAgICAgICAgIGNhc2UgUFJJVkFURToKLSAgICAgICAgICBjYXNlIFBVQkxJQzoKLSAgICAgICAgICBjYXNlIFNFVDoKLSAgICAgICAgICBjYXNlIFNVUEVSOgotICAgICAgICAgIGNhc2UgVEhJUzoKLSAgICAgICAgICBjYXNlIFRSVUU6Ci0gICAgICAgICAgY2FzZSBUWVBFT0Y6Ci0gICAgICAgICAgY2FzZSBWQVI6Ci0gICAgICAgICAgY2FzZSBWT0lEOgotICAgICAgICAgIGNhc2UgUFJPVEVDVEVEOgotICAgICAgICAgIGNhc2UgREVDSU1BTF9MSVRFUkFMOgotICAgICAgICAgIGNhc2UgSEVYX0xJVEVSQUw6Ci0gICAgICAgICAgY2FzZSBPQ1RBTF9MSVRFUkFMOgotICAgICAgICAgIGNhc2UgRkxPQVRJTkdfUE9JTlRfTElURVJBTDoKLSAgICAgICAgICBjYXNlIFNUUklOR19MSVRFUkFMOgotICAgICAgICAgIGNhc2UgUkVHVUxBUl9FWFBSRVNTSU9OOgotICAgICAgICAgIGNhc2UgSURFTlRJRklFUjoKLSAgICAgICAgICBjYXNlIExQQVJFTjoKLSAgICAgICAgICBjYXNlIExCUkFDRToKLSAgICAgICAgICBjYXNlIExCUkFDS0VUOgotICAgICAgICAgIGNhc2UgQkFORzoKLSAgICAgICAgICBjYXNlIFRJTERFOgotICAgICAgICAgIGNhc2UgSU5DUjoKLSAgICAgICAgICBjYXNlIERFQ1I6Ci0gICAgICAgICAgY2FzZSBQTFVTOgotICAgICAgICAgIGNhc2UgTUlOVVM6Ci0gICAgICAgICAgICBGb3JJbml0aWFsaXplcigpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGpqX2xhMVs3Ml0gPSBqal9nZW47Ci0gICAgICAgICAgICA7Ci0gICAgICAgICAgfQotICAgICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oU0VNSUNPTE9OKTsKLSAgICAgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKLSAgICAgICAgICBjYXNlIERFTEVURToKLSAgICAgICAgICBjYXNlIEZBTFNFOgotICAgICAgICAgIGNhc2UgRlVOQ1RJT046Ci0gICAgICAgICAgY2FzZSBHRVQ6Ci0gICAgICAgICAgY2FzZSBJTkNMVURFOgotICAgICAgICAgIGNhc2UgTkVXOgotICAgICAgICAgIGNhc2UgTlVMTDoKLSAgICAgICAgICBjYXNlIFBSSVZBVEU6Ci0gICAgICAgICAgY2FzZSBQVUJMSUM6Ci0gICAgICAgICAgY2FzZSBTRVQ6Ci0gICAgICAgICAgY2FzZSBTVVBFUjoKLSAgICAgICAgICBjYXNlIFRISVM6Ci0gICAgICAgICAgY2FzZSBUUlVFOgotICAgICAgICAgIGNhc2UgVFlQRU9GOgotICAgICAgICAgIGNhc2UgVk9JRDoKLSAgICAgICAgICBjYXNlIFBST1RFQ1RFRDoKLSAgICAgICAgICBjYXNlIERFQ0lNQUxfTElURVJBTDoKLSAgICAgICAgICBjYXNlIEhFWF9MSVRFUkFMOgotICAgICAgICAgIGNhc2UgT0NUQUxfTElURVJBTDoKLSAgICAgICAgICBjYXNlIEZMT0FUSU5HX1BPSU5UX0xJVEVSQUw6Ci0gICAgICAgICAgY2FzZSBTVFJJTkdfTElURVJBTDoKLSAgICAgICAgICBjYXNlIFJFR1VMQVJfRVhQUkVTU0lPTjoKLSAgICAgICAgICBjYXNlIElERU5USUZJRVI6Ci0gICAgICAgICAgY2FzZSBMUEFSRU46Ci0gICAgICAgICAgY2FzZSBMQlJBQ0U6Ci0gICAgICAgICAgY2FzZSBMQlJBQ0tFVDoKLSAgICAgICAgICBjYXNlIEJBTkc6Ci0gICAgICAgICAgY2FzZSBUSUxERToKLSAgICAgICAgICBjYXNlIElOQ1I6Ci0gICAgICAgICAgY2FzZSBERUNSOgotICAgICAgICAgIGNhc2UgUExVUzoKLSAgICAgICAgICBjYXNlIE1JTlVTOgotICAgICAgICAgICAgTGlzdEV4cHJlc3Npb24oKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBqal9sYTFbNzNdID0gampfZ2VuOwotICAgICAgICAgICAgOwotICAgICAgICAgIH0KLSAgICAgICAgICBqal9jb25zdW1lX3Rva2VuKFNFTUlDT0xPTik7Ci0gICAgICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7Ci0gICAgICAgICAgY2FzZSBERUxFVEU6Ci0gICAgICAgICAgY2FzZSBGQUxTRToKLSAgICAgICAgICBjYXNlIEZVTkNUSU9OOgotICAgICAgICAgIGNhc2UgR0VUOgotICAgICAgICAgIGNhc2UgSU5DTFVERToKLSAgICAgICAgICBjYXNlIE5FVzoKLSAgICAgICAgICBjYXNlIE5VTEw6Ci0gICAgICAgICAgY2FzZSBQUklWQVRFOgotICAgICAgICAgIGNhc2UgUFVCTElDOgotICAgICAgICAgIGNhc2UgU0VUOgotICAgICAgICAgIGNhc2UgU1VQRVI6Ci0gICAgICAgICAgY2FzZSBUSElTOgotICAgICAgICAgIGNhc2UgVFJVRToKLSAgICAgICAgICBjYXNlIFRZUEVPRjoKLSAgICAgICAgICBjYXNlIFZPSUQ6Ci0gICAgICAgICAgY2FzZSBQUk9URUNURUQ6Ci0gICAgICAgICAgY2FzZSBERUNJTUFMX0xJVEVSQUw6Ci0gICAgICAgICAgY2FzZSBIRVhfTElURVJBTDoKLSAgICAgICAgICBjYXNlIE9DVEFMX0xJVEVSQUw6Ci0gICAgICAgICAgY2FzZSBGTE9BVElOR19QT0lOVF9MSVRFUkFMOgotICAgICAgICAgIGNhc2UgU1RSSU5HX0xJVEVSQUw6Ci0gICAgICAgICAgY2FzZSBSRUdVTEFSX0VYUFJFU1NJT046Ci0gICAgICAgICAgY2FzZSBJREVOVElGSUVSOgotICAgICAgICAgIGNhc2UgTFBBUkVOOgotICAgICAgICAgIGNhc2UgTEJSQUNFOgotICAgICAgICAgIGNhc2UgTEJSQUNLRVQ6Ci0gICAgICAgICAgY2FzZSBCQU5HOgotICAgICAgICAgIGNhc2UgVElMREU6Ci0gICAgICAgICAgY2FzZSBJTkNSOgotICAgICAgICAgIGNhc2UgREVDUjoKLSAgICAgICAgICBjYXNlIFBMVVM6Ci0gICAgICAgICAgY2FzZSBNSU5VUzoKLSAgICAgICAgICAgIExpc3RFeHByZXNzaW9uKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgampfbGExWzc0XSA9IGpqX2dlbjsKLSAgICAgICAgICAgIDsKLSAgICAgICAgICB9Ci0gICAgICAgICAgampfY29uc3VtZV90b2tlbihSUEFSRU4pOwotICAgICAgICAgIFN1YnN0YXRlbWVudCgpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIGpqX2xhMVs3NV0gPSBqal9nZW47Ci0gICAgICAgICAgampfY29uc3VtZV90b2tlbigtMSk7Ci0gICAgICAgICAgdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgewotICAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsKLSAgICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7Ci0gICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsKLSAgICAgICAgICAgfQotICAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKLSAgICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgICB9Ci0gICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsKLSAgICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICAgfQotICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChFcnJvcilqanRlMDAwO30KLSAgICB9IGZpbmFsbHkgewotICAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsKLSAgICAgICAgICAgfQotICAgIH0KLSAgfQotCi0gIGZpbmFsIHB1YmxpYyB2b2lkIEZvckluaXRpYWxpemVyKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAvKkBiZ2VuKGpqdHJlZSkgRm9ySW5pdGlhbGl6ZXIgKi8KLSAgQVNURm9ySW5pdGlhbGl6ZXIgamp0bjAwMCA9IG5ldyBBU1RGb3JJbml0aWFsaXplcih0aGlzLCBKSlRGT1JJTklUSUFMSVpFUik7Ci0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7Ci0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOwotICAgIHRyeSB7Ci0gICAgICBpZiAoampfMl8xNygzKSkgewotICAgICAgICBMaXN0RXhwcmVzc2lvbk5vSU4oKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgICBjYXNlIENPTlNUOgotICAgICAgICBjYXNlIFZBUjoKLSAgICAgICAgICBWYXJpYWJsZURlZmluaXRpb25Ob0lOKCk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgRkFMU0U6Ci0gICAgICAgIGNhc2UgR0VUOgotICAgICAgICBjYXNlIElOQ0xVREU6Ci0gICAgICAgIGNhc2UgUFJJVkFURToKLSAgICAgICAgY2FzZSBQVUJMSUM6Ci0gICAgICAgIGNhc2UgU0VUOgotICAgICAgICBjYXNlIFRSVUU6Ci0gICAgICAgIGNhc2UgUFJPVEVDVEVEOgotICAgICAgICBjYXNlIElERU5USUZJRVI6Ci0gICAgICAgICAgQXR0cmlidXRlcygpOwotICAgICAgICAgIFZhcmlhYmxlRGVmaW5pdGlvbk5vSU4oKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICBqal9sYTFbNzZdID0gampfZ2VuOwotICAgICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oLTEpOwotICAgICAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChFcnJvcilqanRlMDAwO30KLSAgICB9IGZpbmFsbHkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7Ci0gICAgICAgICAgfQotICAgIH0KLSAgfQotCi0gIGZpbmFsIHB1YmxpYyB2b2lkIEZvckluQmluZGluZygpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gLypAYmdlbihqanRyZWUpIEZvckluQmluZGluZyAqLwotICBBU1RGb3JJbkJpbmRpbmcgamp0bjAwMCA9IG5ldyBBU1RGb3JJbkJpbmRpbmcodGhpcywgSkpURk9SSU5CSU5ESU5HKTsKLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsKLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgdHJ5IHsKLSAgICAgIGlmIChqal8yXzE4KDMpKSB7Ci0gICAgICAgIFBvc3RmaXhFeHByZXNzaW9uKCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKLSAgICAgICAgY2FzZSBDT05TVDoKLSAgICAgICAgY2FzZSBWQVI6Ci0gICAgICAgICAgVmFyaWFibGVEZWZpbml0aW9uS2luZCgpOwotICAgICAgICAgIFZhcmlhYmxlQmluZGluZ05vSU4oKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBGQUxTRToKLSAgICAgICAgY2FzZSBHRVQ6Ci0gICAgICAgIGNhc2UgSU5DTFVERToKLSAgICAgICAgY2FzZSBQUklWQVRFOgotICAgICAgICBjYXNlIFBVQkxJQzoKLSAgICAgICAgY2FzZSBTRVQ6Ci0gICAgICAgIGNhc2UgVFJVRToKLSAgICAgICAgY2FzZSBQUk9URUNURUQ6Ci0gICAgICAgIGNhc2UgSURFTlRJRklFUjoKLSAgICAgICAgICBBdHRyaWJ1dGVzKCk7Ci0gICAgICAgICAgVmFyaWFibGVEZWZpbml0aW9uS2luZCgpOwotICAgICAgICAgIFZhcmlhYmxlQmluZGluZ05vSU4oKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICBqal9sYTFbNzddID0gampfZ2VuOwotICAgICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oLTEpOwotICAgICAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChFcnJvcilqanRlMDAwO30KLSAgICB9IGZpbmFsbHkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7Ci0gICAgICAgICAgfQotICAgIH0KLSAgfQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gV2l0aCBTdGF0ZW1lbnQgCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICBmaW5hbCBwdWJsaWMgdm9pZCBXaXRoU3RhdGVtZW50KCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAvKkBiZ2VuKGpqdHJlZSkgV2l0aFN0YXRlbWVudCAqLwotICBBU1RXaXRoU3RhdGVtZW50IGpqdG4wMDAgPSBuZXcgQVNUV2l0aFN0YXRlbWVudCh0aGlzLCBKSlRXSVRIU1RBVEVNRU5UKTsKLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsKLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgdHJ5IHsKLSAgICAgIGpqX2NvbnN1bWVfdG9rZW4oV0lUSCk7Ci0gICAgICBqal9jb25zdW1lX3Rva2VuKExQQVJFTik7Ci0gICAgICBFeHByZXNzaW9uU3RhdGVtZW50KCk7Ci0gICAgICBqal9jb25zdW1lX3Rva2VuKFJQQVJFTik7Ci0gICAgICBTdWJzdGF0ZW1lbnQoKTsKLSAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKEVycm9yKWpqdGUwMDA7fQotICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsKLSAgICAgICAgICB9Ci0gICAgfQotICB9Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyBDb250aW51ZSBhbmQgQnJlYWsgU3RhdGVtZW50Ci0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICBmaW5hbCBwdWJsaWMgdm9pZCBDb250aW51ZVN0YXRlbWVudCgpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gLypAYmdlbihqanRyZWUpIENvbnRpbnVlU3RhdGVtZW50ICovCi0gIEFTVENvbnRpbnVlU3RhdGVtZW50IGpqdG4wMDAgPSBuZXcgQVNUQ29udGludWVTdGF0ZW1lbnQodGhpcywgSkpUQ09OVElOVUVTVEFURU1FTlQpOwotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOwotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsKLSAgICB0cnkgewotICAgICAgampfY29uc3VtZV90b2tlbihDT05USU5VRSk7Ci0gICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKLSAgICAgIGNhc2UgR0VUOgotICAgICAgY2FzZSBJTkNMVURFOgotICAgICAgY2FzZSBTRVQ6Ci0gICAgICBjYXNlIElERU5USUZJRVI6Ci0gICAgICAgIElkZW50aWZpZXIoKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICBqal9sYTFbNzhdID0gampfZ2VuOwotICAgICAgICA7Ci0gICAgICB9Ci0gICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChFcnJvcilqanRlMDAwO30KLSAgICB9IGZpbmFsbHkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7Ci0gICAgICAgICAgfQotICAgIH0KLSAgfQotCi0gIGZpbmFsIHB1YmxpYyB2b2lkIEJyZWFrU3RhdGVtZW50KCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAvKkBiZ2VuKGpqdHJlZSkgQnJlYWtTdGF0ZW1lbnQgKi8KLSAgQVNUQnJlYWtTdGF0ZW1lbnQgamp0bjAwMCA9IG5ldyBBU1RCcmVha1N0YXRlbWVudCh0aGlzLCBKSlRCUkVBS1NUQVRFTUVOVCk7Ci0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7Ci0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOwotICAgIHRyeSB7Ci0gICAgICBqal9jb25zdW1lX3Rva2VuKEJSRUFLKTsKLSAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgY2FzZSBHRVQ6Ci0gICAgICBjYXNlIElOQ0xVREU6Ci0gICAgICBjYXNlIFNFVDoKLSAgICAgIGNhc2UgSURFTlRJRklFUjoKLSAgICAgICAgSWRlbnRpZmllcigpOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIGpqX2xhMVs3OV0gPSBqal9nZW47Ci0gICAgICAgIDsKLSAgICAgIH0KLSAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKEVycm9yKWpqdGUwMDA7fQotICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsKLSAgICAgICAgICB9Ci0gICAgfQotICB9Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyBSZXR1cm4gU3RhdGVtZW50Ci0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICBmaW5hbCBwdWJsaWMgdm9pZCBSZXR1cm5TdGF0ZW1lbnQoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotIC8qQGJnZW4oamp0cmVlKSBSZXR1cm5TdGF0ZW1lbnQgKi8KLSAgQVNUUmV0dXJuU3RhdGVtZW50IGpqdG4wMDAgPSBuZXcgQVNUUmV0dXJuU3RhdGVtZW50KHRoaXMsIEpKVFJFVFVSTlNUQVRFTUVOVCk7Ci0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7Ci0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOwotICAgIHRyeSB7Ci0gICAgICBqal9jb25zdW1lX3Rva2VuKFJFVFVSTik7Ci0gICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKLSAgICAgIGNhc2UgREVMRVRFOgotICAgICAgY2FzZSBGQUxTRToKLSAgICAgIGNhc2UgRlVOQ1RJT046Ci0gICAgICBjYXNlIEdFVDoKLSAgICAgIGNhc2UgSU5DTFVERToKLSAgICAgIGNhc2UgTkVXOgotICAgICAgY2FzZSBOVUxMOgotICAgICAgY2FzZSBQUklWQVRFOgotICAgICAgY2FzZSBQVUJMSUM6Ci0gICAgICBjYXNlIFNFVDoKLSAgICAgIGNhc2UgU1VQRVI6Ci0gICAgICBjYXNlIFRISVM6Ci0gICAgICBjYXNlIFRSVUU6Ci0gICAgICBjYXNlIFRZUEVPRjoKLSAgICAgIGNhc2UgVk9JRDoKLSAgICAgIGNhc2UgUFJPVEVDVEVEOgotICAgICAgY2FzZSBERUNJTUFMX0xJVEVSQUw6Ci0gICAgICBjYXNlIEhFWF9MSVRFUkFMOgotICAgICAgY2FzZSBPQ1RBTF9MSVRFUkFMOgotICAgICAgY2FzZSBGTE9BVElOR19QT0lOVF9MSVRFUkFMOgotICAgICAgY2FzZSBTVFJJTkdfTElURVJBTDoKLSAgICAgIGNhc2UgUkVHVUxBUl9FWFBSRVNTSU9OOgotICAgICAgY2FzZSBJREVOVElGSUVSOgotICAgICAgY2FzZSBMUEFSRU46Ci0gICAgICBjYXNlIExCUkFDRToKLSAgICAgIGNhc2UgTEJSQUNLRVQ6Ci0gICAgICBjYXNlIEJBTkc6Ci0gICAgICBjYXNlIFRJTERFOgotICAgICAgY2FzZSBJTkNSOgotICAgICAgY2FzZSBERUNSOgotICAgICAgY2FzZSBQTFVTOgotICAgICAgY2FzZSBNSU5VUzoKLSAgICAgICAgTGlzdEV4cHJlc3Npb24oKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICBqal9sYTFbODBdID0gampfZ2VuOwotICAgICAgICA7Ci0gICAgICB9Ci0gICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChFcnJvcilqanRlMDAwO30KLSAgICB9IGZpbmFsbHkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7Ci0gICAgICAgICAgfQotICAgIH0KLSAgfQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gVGhyb3cgU3RhdGVtZW50Ci0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICBmaW5hbCBwdWJsaWMgdm9pZCBUaHJvd1N0YXRlbWVudCgpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gLypAYmdlbihqanRyZWUpIFRocm93U3RhdGVtZW50ICovCi0gIEFTVFRocm93U3RhdGVtZW50IGpqdG4wMDAgPSBuZXcgQVNUVGhyb3dTdGF0ZW1lbnQodGhpcywgSkpUVEhST1dTVEFURU1FTlQpOwotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOwotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsKLSAgICB0cnkgewotICAgICAgampfY29uc3VtZV90b2tlbihUSFJPVyk7Ci0gICAgICBMaXN0RXhwcmVzc2lvbigpOwotICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsKLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoRXJyb3Ipamp0ZTAwMDt9Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOwotICAgICAgICAgIH0KLSAgICB9Ci0gIH0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIFRyeSBTdGF0ZW1lbnQKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gIGZpbmFsIHB1YmxpYyB2b2lkIFRyeVN0YXRlbWVudCgpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gLypAYmdlbihqanRyZWUpIFRyeVN0YXRlbWVudCAqLwotICBBU1RUcnlTdGF0ZW1lbnQgamp0bjAwMCA9IG5ldyBBU1RUcnlTdGF0ZW1lbnQodGhpcywgSkpUVFJZU1RBVEVNRU5UKTsKLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsKLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgdHJ5IHsKLSAgICAgIGpqX2NvbnN1bWVfdG9rZW4oVFJZKTsKLSAgICAgIEJsb2NrKCk7Ci0gICAgICBsYWJlbF8yOToKLSAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgICBjYXNlIENBVENIOgotICAgICAgICAgIDsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICBqal9sYTFbODFdID0gampfZ2VuOwotICAgICAgICAgIGJyZWFrIGxhYmVsXzI5OwotICAgICAgICB9Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oQ0FUQ0gpOwotICAgICAgICBqal9jb25zdW1lX3Rva2VuKExQQVJFTik7Ci0gICAgICAgIElkZW50aWZpZXIoKTsKLSAgICAgICAgampfY29uc3VtZV90b2tlbihSUEFSRU4pOwotICAgICAgICBCbG9jaygpOwotICAgICAgfQotICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7Ci0gICAgICBjYXNlIEZJTkFMTFk6Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oRklOQUxMWSk7Ci0gICAgICAgIEJsb2NrKCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgampfbGExWzgyXSA9IGpqX2dlbjsKLSAgICAgICAgOwotICAgICAgfQotICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsKLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoRXJyb3Ipamp0ZTAwMDt9Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOwotICAgICAgICAgIH0KLSAgICB9Ci0gIH0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIERpcmVjdGl2ZXMgCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICBmaW5hbCBwdWJsaWMgdm9pZCBEaXJlY3RpdmVzKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAvKkBiZ2VuKGpqdHJlZSkgRGlyZWN0aXZlcyAqLwotICBBU1REaXJlY3RpdmVzIGpqdG4wMDAgPSBuZXcgQVNURGlyZWN0aXZlcyh0aGlzLCBKSlRESVJFQ1RJVkVTKTsKLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsKLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgdHJ5IHsKLSAgICAgIGxhYmVsXzMwOgotICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgRGlyZWN0aXZlKCk7Ci0gICAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgICBjYXNlIEJSRUFLOgotICAgICAgICBjYXNlIENMQVNTOgotICAgICAgICBjYXNlIENPTlNUOgotICAgICAgICBjYXNlIENPTlRJTlVFOgotICAgICAgICBjYXNlIERFTEVURToKLSAgICAgICAgY2FzZSBETzoKLSAgICAgICAgY2FzZSBGQUxTRToKLSAgICAgICAgY2FzZSBGT1I6Ci0gICAgICAgIGNhc2UgRlVOQ1RJT046Ci0gICAgICAgIGNhc2UgR0VUOgotICAgICAgICBjYXNlIElGOgotICAgICAgICBjYXNlIElOQ0xVREU6Ci0gICAgICAgIGNhc2UgTkFNRVNQQUNFOgotICAgICAgICBjYXNlIE5FVzoKLSAgICAgICAgY2FzZSBOVUxMOgotICAgICAgICBjYXNlIFBSSVZBVEU6Ci0gICAgICAgIGNhc2UgUFVCTElDOgotICAgICAgICBjYXNlIFJFVFVSTjoKLSAgICAgICAgY2FzZSBTRVQ6Ci0gICAgICAgIGNhc2UgU1VQRVI6Ci0gICAgICAgIGNhc2UgU1dJVENIOgotICAgICAgICBjYXNlIFRISVM6Ci0gICAgICAgIGNhc2UgVEhST1c6Ci0gICAgICAgIGNhc2UgVFJVRToKLSAgICAgICAgY2FzZSBUUlk6Ci0gICAgICAgIGNhc2UgVFlQRU9GOgotICAgICAgICBjYXNlIFVTRToKLSAgICAgICAgY2FzZSBWQVI6Ci0gICAgICAgIGNhc2UgVk9JRDoKLSAgICAgICAgY2FzZSBXSElMRToKLSAgICAgICAgY2FzZSBXSVRIOgotICAgICAgICBjYXNlIEVYUE9SVDoKLSAgICAgICAgY2FzZSBJTlRFUkZBQ0U6Ci0gICAgICAgIGNhc2UgUFJPVEVDVEVEOgotICAgICAgICBjYXNlIElNUE9SVDoKLSAgICAgICAgY2FzZSBERUNJTUFMX0xJVEVSQUw6Ci0gICAgICAgIGNhc2UgSEVYX0xJVEVSQUw6Ci0gICAgICAgIGNhc2UgT0NUQUxfTElURVJBTDoKLSAgICAgICAgY2FzZSBGTE9BVElOR19QT0lOVF9MSVRFUkFMOgotICAgICAgICBjYXNlIFNUUklOR19MSVRFUkFMOgotICAgICAgICBjYXNlIFJFR1VMQVJfRVhQUkVTU0lPTjoKLSAgICAgICAgY2FzZSBJREVOVElGSUVSOgotICAgICAgICBjYXNlIExQQVJFTjoKLSAgICAgICAgY2FzZSBMQlJBQ0U6Ci0gICAgICAgIGNhc2UgTEJSQUNLRVQ6Ci0gICAgICAgIGNhc2UgU0VNSUNPTE9OOgotICAgICAgICBjYXNlIEJBTkc6Ci0gICAgICAgIGNhc2UgVElMREU6Ci0gICAgICAgIGNhc2UgSU5DUjoKLSAgICAgICAgY2FzZSBERUNSOgotICAgICAgICBjYXNlIFBMVVM6Ci0gICAgICAgIGNhc2UgTUlOVVM6Ci0gICAgICAgICAgOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIGpqX2xhMVs4M10gPSBqal9nZW47Ci0gICAgICAgICAgYnJlYWsgbGFiZWxfMzA7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKEVycm9yKWpqdGUwMDA7fQotICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsKLSAgICAgICAgICB9Ci0gICAgfQotICB9Ci0KLSAgZmluYWwgcHVibGljIHZvaWQgRGlyZWN0aXZlKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAvKkBiZ2VuKGpqdHJlZSkgRGlyZWN0aXZlICovCi0gIEFTVERpcmVjdGl2ZSBqanRuMDAwID0gbmV3IEFTVERpcmVjdGl2ZSh0aGlzLCBKSlRESVJFQ1RJVkUpOwotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOwotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsKLSAgICB0cnkgewotICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7Ci0gICAgICBjYXNlIFNFTUlDT0xPTjoKLSAgICAgICAgRW1wdHlTdGF0ZW1lbnQoKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICBqal9sYTFbODRdID0gampfZ2VuOwotICAgICAgICBpZiAoampfMl8xOSgzKSkgewotICAgICAgICAgIFN0YXRlbWVudCgpOwotICAgICAgICB9IGVsc2UgaWYgKGpqXzJfMjAoMikpIHsKLSAgICAgICAgICBBbm5vdGF0YWJsZURpcmVjdGl2ZSgpOwotICAgICAgICB9IGVsc2UgaWYgKGpqXzJfMjEoMikpIHsKLSAgICAgICAgICBBdHRyaWJ1dGVzKCk7Ci0gICAgICAgICAgampfY29uc3VtZV90b2tlbihMQlJBQ0UpOwotICAgICAgICAgIERpcmVjdGl2ZXMoKTsKLSAgICAgICAgICBqal9jb25zdW1lX3Rva2VuKFJCUkFDRSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoampfMl8yMigyKSkgewotICAgICAgICAgIEF0dHJpYnV0ZXMoKTsKLSAgICAgICAgICBBbm5vdGF0YWJsZURpcmVjdGl2ZSgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgICAgIGNhc2UgSU5DTFVERToKLSAgICAgICAgICAgIEluY2x1ZGVEaXJlY3RpdmUoKTsKLSAgICAgICAgICAgIFNjKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIFVTRToKLSAgICAgICAgICAgIFByYWdtYSgpOwotICAgICAgICAgICAgU2MoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBqal9sYTFbODVdID0gampfZ2VuOwotICAgICAgICAgICAgampfY29uc3VtZV90b2tlbigtMSk7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgICAgICAgICAgICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoRXJyb3Ipamp0ZTAwMDt9Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBmaW5hbCBwdWJsaWMgdm9pZCBBbm5vdGF0YWJsZURpcmVjdGl2ZSgpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gLypAYmdlbihqanRyZWUpIEFubm90YXRhYmxlRGlyZWN0aXZlICovCi0gIEFTVEFubm90YXRhYmxlRGlyZWN0aXZlIGpqdG4wMDAgPSBuZXcgQVNUQW5ub3RhdGFibGVEaXJlY3RpdmUodGhpcywgSkpUQU5OT1RBVEFCTEVESVJFQ1RJVkUpOwotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOwotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsKLSAgICB0cnkgewotICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7Ci0gICAgICBjYXNlIENPTlNUOgotICAgICAgY2FzZSBWQVI6Ci0gICAgICAgIFZhcmlhYmxlRGVmaW5pdGlvbigpOwotICAgICAgICBTYygpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgRlVOQ1RJT046Ci0gICAgICAgIEZ1bmN0aW9uRGVmaW5pdGlvbigpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgQ0xBU1M6Ci0gICAgICAgIENsYXNzRGVmaW5pdGlvbigpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgSU5URVJGQUNFOgotICAgICAgICBJbnRlcmZhY2VEZWZpbml0aW9uKCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBOQU1FU1BBQ0U6Ci0gICAgICAgIE5hbWVzcGFjZURlZmluaXRpb24oKTsKLSAgICAgICAgU2MoKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIElNUE9SVDoKLSAgICAgICAgSW1wb3J0RGlyZWN0aXZlKCk7Ci0gICAgICAgIFNjKCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBFWFBPUlQ6Ci0gICAgICAgIEV4cG9ydERlZmluaXRpb24oKTsKLSAgICAgICAgU2MoKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIFVTRToKLSAgICAgICAgVXNlRGlyZWN0aXZlKCk7Ci0gICAgICAgIFNjKCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgampfbGExWzg2XSA9IGpqX2dlbjsKLSAgICAgICAgampfY29uc3VtZV90b2tlbigtMSk7Ci0gICAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigpOwotICAgICAgfQotICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7Ci0gICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsKLSAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOwotICAgICAgICAgICB9Ci0gICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgewotICAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgIH0KLSAgICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgewotICAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgICB9Ci0gICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKEVycm9yKWpqdGUwMDA7fQotICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOwotICAgICAgICAgICB9Ci0gICAgfQotICB9Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyBBdHRyaWJ1dGVzCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICBmaW5hbCBwdWJsaWMgdm9pZCBBdHRyaWJ1dGVzKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAvKkBiZ2VuKGpqdHJlZSkgQXR0cmlidXRlcyAqLwotICBBU1RBdHRyaWJ1dGVzIGpqdG4wMDAgPSBuZXcgQVNUQXR0cmlidXRlcyh0aGlzLCBKSlRBVFRSSUJVVEVTKTsKLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsKLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgdHJ5IHsKLSAgICAgIGxhYmVsXzMxOgotICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgQXR0cmlidXRlKCk7Ci0gICAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgICBjYXNlIEZBTFNFOgotICAgICAgICBjYXNlIEdFVDoKLSAgICAgICAgY2FzZSBJTkNMVURFOgotICAgICAgICBjYXNlIFBSSVZBVEU6Ci0gICAgICAgIGNhc2UgUFVCTElDOgotICAgICAgICBjYXNlIFNFVDoKLSAgICAgICAgY2FzZSBUUlVFOgotICAgICAgICBjYXNlIFBST1RFQ1RFRDoKLSAgICAgICAgY2FzZSBJREVOVElGSUVSOgotICAgICAgICAgIDsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICBqal9sYTFbODddID0gampfZ2VuOwotICAgICAgICAgIGJyZWFrIGxhYmVsXzMxOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChFcnJvcilqanRlMDAwO30KLSAgICB9IGZpbmFsbHkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7Ci0gICAgICAgICAgfQotICAgIH0KLSAgfQotCi0gIGZpbmFsIHB1YmxpYyB2b2lkIEF0dHJpYnV0ZSgpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gLypAYmdlbihqanRyZWUpIEF0dHJpYnV0ZSAqLwotICBBU1RBdHRyaWJ1dGUgamp0bjAwMCA9IG5ldyBBU1RBdHRyaWJ1dGUodGhpcywgSkpUQVRUUklCVVRFKTsKLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsKLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgdHJ5IHsKLSAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgY2FzZSBHRVQ6Ci0gICAgICBjYXNlIElOQ0xVREU6Ci0gICAgICBjYXNlIFBSSVZBVEU6Ci0gICAgICBjYXNlIFBVQkxJQzoKLSAgICAgIGNhc2UgU0VUOgotICAgICAgY2FzZSBQUk9URUNURUQ6Ci0gICAgICBjYXNlIElERU5USUZJRVI6Ci0gICAgICAgIEF0dHJpYnV0ZUV4cHJlc3Npb24oKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIFRSVUU6Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oVFJVRSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBGQUxTRToKLSAgICAgICAgampfY29uc3VtZV90b2tlbihGQUxTRSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgampfbGExWzg4XSA9IGpqX2dlbjsKLSAgICAgICAgampfY29uc3VtZV90b2tlbigtMSk7Ci0gICAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigpOwotICAgICAgfQotICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgICAgICAgICAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOwotICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgewotICAgICAgICAgICAgICAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgewotICAgICAgICAgICAgICAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKEVycm9yKWpqdGUwMDA7fQotICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOwotICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgfQotICB9Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyBVc2UgRGlyZWN0aXZlCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICBmaW5hbCBwdWJsaWMgdm9pZCBVc2VEaXJlY3RpdmUoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotIC8qQGJnZW4oamp0cmVlKSBVc2VEaXJlY3RpdmUgKi8KLSAgQVNUVXNlRGlyZWN0aXZlIGpqdG4wMDAgPSBuZXcgQVNUVXNlRGlyZWN0aXZlKHRoaXMsIEpKVFVTRURJUkVDVElWRSk7Ci0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7Ci0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOwotICAgIHRyeSB7Ci0gICAgICBqal9jb25zdW1lX3Rva2VuKFVTRSk7Ci0gICAgICBqal9jb25zdW1lX3Rva2VuKE5BTUVTUEFDRSk7Ci0gICAgICBqal9jb25zdW1lX3Rva2VuKExQQVJFTik7Ci0gICAgICBMaXN0RXhwcmVzc2lvbigpOwotICAgICAgampfY29uc3VtZV90b2tlbihSUEFSRU4pOwotICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsKLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoRXJyb3Ipamp0ZTAwMDt9Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOwotICAgICAgICAgIH0KLSAgICB9Ci0gIH0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIEltcG9ydCBEaXJlY3RpdmUKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gIGZpbmFsIHB1YmxpYyB2b2lkIEltcG9ydERpcmVjdGl2ZSgpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gLypAYmdlbihqanRyZWUpIEltcG9ydERpcmVjdGl2ZSAqLwotICBBU1RJbXBvcnREaXJlY3RpdmUgamp0bjAwMCA9IG5ldyBBU1RJbXBvcnREaXJlY3RpdmUodGhpcywgSkpUSU1QT1JURElSRUNUSVZFKTsKLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsKLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgdHJ5IHsKLSAgICAgIGlmIChqal8yXzIzKDMpKSB7Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oSU1QT1JUKTsKLSAgICAgICAgUGFja2FnZU5hbWUoKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgICBjYXNlIElNUE9SVDoKLSAgICAgICAgICBqal9jb25zdW1lX3Rva2VuKElNUE9SVCk7Ci0gICAgICAgICAgSWRlbnRpZmllcigpOwotICAgICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oQVNTSUdOKTsKLSAgICAgICAgICBQYWNrYWdlTmFtZSgpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIGpqX2xhMVs4OV0gPSBqal9nZW47Ci0gICAgICAgICAgampfY29uc3VtZV90b2tlbigtMSk7Ci0gICAgICAgICAgdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKEVycm9yKWpqdGUwMDA7fQotICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsKLSAgICAgICAgICB9Ci0gICAgfQotICB9Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyBJbmNsdWRlIERpcmVjdGl2ZQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgZmluYWwgcHVibGljIHZvaWQgSW5jbHVkZURpcmVjdGl2ZSgpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gLypAYmdlbihqanRyZWUpIEluY2x1ZGVEaXJlY3RpdmUgKi8KLSAgQVNUSW5jbHVkZURpcmVjdGl2ZSBqanRuMDAwID0gbmV3IEFTVEluY2x1ZGVEaXJlY3RpdmUodGhpcywgSkpUSU5DTFVERURJUkVDVElWRSk7Ci0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7Ci0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOwotICAgIHRyeSB7Ci0gICAgICBqal9jb25zdW1lX3Rva2VuKElOQ0xVREUpOwotICAgICAgampfY29uc3VtZV90b2tlbihTVFJJTkdfTElURVJBTCk7Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOwotICAgICAgICAgIH0KLSAgICB9Ci0gIH0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIFByYWdtYQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgZmluYWwgcHVibGljIHZvaWQgUHJhZ21hKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAvKkBiZ2VuKGpqdHJlZSkgUHJhZ21hICovCi0gIEFTVFByYWdtYSBqanRuMDAwID0gbmV3IEFTVFByYWdtYSh0aGlzLCBKSlRQUkFHTUEpOwotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOwotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsKLSAgICB0cnkgewotICAgICAgampfY29uc3VtZV90b2tlbihVU0UpOwotICAgICAgUHJhZ21hSXRlbXMoKTsKLSAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKEVycm9yKWpqdGUwMDA7fQotICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsKLSAgICAgICAgICB9Ci0gICAgfQotICB9Ci0KLSAgZmluYWwgcHVibGljIHZvaWQgUHJhZ21hSXRlbXMoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotIC8qQGJnZW4oamp0cmVlKSBQcmFnbWFJdGVtcyAqLwotICBBU1RQcmFnbWFJdGVtcyBqanRuMDAwID0gbmV3IEFTVFByYWdtYUl0ZW1zKHRoaXMsIEpKVFBSQUdNQUlURU1TKTsKLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsKLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgdHJ5IHsKLSAgICAgIFByYWdtYUl0ZW0oKTsKLSAgICAgIGpqX2NvbnN1bWVfdG9rZW4oQ09NTUEpOwotICAgICAgUHJhZ21hSXRlbSgpOwotICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsKLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoRXJyb3Ipamp0ZTAwMDt9Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOwotICAgICAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBmaW5hbCBwdWJsaWMgdm9pZCBQcmFnbWFJdGVtKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAvKkBiZ2VuKGpqdHJlZSkgUHJhZ21hSXRlbSAqLwotICBBU1RQcmFnbWFJdGVtIGpqdG4wMDAgPSBuZXcgQVNUUHJhZ21hSXRlbSh0aGlzLCBKSlRQUkFHTUFJVEVNKTsKLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsKLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgdHJ5IHsKLSAgICAgIFByYWdtYUV4cHIoKTsKLSAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgY2FzZSBIT09LOgotICAgICAgICBqal9jb25zdW1lX3Rva2VuKEhPT0spOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIGpqX2xhMVs5MF0gPSBqal9nZW47Ci0gICAgICAgIDsKLSAgICAgIH0KLSAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKEVycm9yKWpqdGUwMDA7fQotICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsKLSAgICAgICAgICB9Ci0gICAgfQotICB9Ci0KLSAgZmluYWwgcHVibGljIHZvaWQgUHJhZ21hRXhwcigpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gLypAYmdlbihqanRyZWUpIFByYWdtYUV4cHIgKi8KLSAgQVNUUHJhZ21hRXhwciBqanRuMDAwID0gbmV3IEFTVFByYWdtYUV4cHIodGhpcywgSkpUUFJBR01BRVhQUik7Ci0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7Ci0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOwotICAgIHRyeSB7Ci0gICAgICBJZGVudGlmaWVyKCk7Ci0gICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKLSAgICAgIGNhc2UgTFBBUkVOOgotICAgICAgICBqal9jb25zdW1lX3Rva2VuKExQQVJFTik7Ci0gICAgICAgIFByYWdtYUFyZ3VtZW50KCk7Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oUlBBUkVOKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICBqal9sYTFbOTFdID0gampfZ2VuOwotICAgICAgICA7Ci0gICAgICB9Ci0gICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChFcnJvcilqanRlMDAwO30KLSAgICB9IGZpbmFsbHkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7Ci0gICAgICAgICAgfQotICAgIH0KLSAgfQotCi0gIGZpbmFsIHB1YmxpYyB2b2lkIFByYWdtYUFyZ3VtZW50KCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAvKkBiZ2VuKGpqdHJlZSkgUHJhZ21hQXJndW1lbnQgKi8KLSAgQVNUUHJhZ21hQXJndW1lbnQgamp0bjAwMCA9IG5ldyBBU1RQcmFnbWFBcmd1bWVudCh0aGlzLCBKSlRQUkFHTUFBUkdVTUVOVCk7Ci0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7Ci0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOwotICAgIHRyeSB7Ci0gICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKLSAgICAgIGNhc2UgVFJVRToKLSAgICAgICAgampfY29uc3VtZV90b2tlbihUUlVFKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIEZBTFNFOgotICAgICAgICBqal9jb25zdW1lX3Rva2VuKEZBTFNFKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIERFQ0lNQUxfTElURVJBTDoKLSAgICAgICAgampfY29uc3VtZV90b2tlbihERUNJTUFMX0xJVEVSQUwpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgT0NUQUxfTElURVJBTDoKLSAgICAgICAgampfY29uc3VtZV90b2tlbihPQ1RBTF9MSVRFUkFMKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIEhFWF9MSVRFUkFMOgotICAgICAgICBqal9jb25zdW1lX3Rva2VuKEhFWF9MSVRFUkFMKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIEZMT0FUSU5HX1BPSU5UX0xJVEVSQUw6Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oRkxPQVRJTkdfUE9JTlRfTElURVJBTCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBTVFJJTkdfTElURVJBTDoKLSAgICAgICAgampfY29uc3VtZV90b2tlbihTVFJJTkdfTElURVJBTCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgampfbGExWzkyXSA9IGpqX2dlbjsKLSAgICAgICAgampfY29uc3VtZV90b2tlbigtMSk7Ci0gICAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigpOwotICAgICAgfQotICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsKLSAgICAgICAgICB9Ci0gICAgfQotICB9Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyBEZWZpbml0aW9ucyAKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyBFeHBvcnQgRGVmaW5pdGlvbiAKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gIGZpbmFsIHB1YmxpYyB2b2lkIEV4cG9ydERlZmluaXRpb24oKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotIC8qQGJnZW4oamp0cmVlKSBFeHBvcnREZWZpbml0aW9uICovCi0gIEFTVEV4cG9ydERlZmluaXRpb24gamp0bjAwMCA9IG5ldyBBU1RFeHBvcnREZWZpbml0aW9uKHRoaXMsIEpKVEVYUE9SVERFRklOSVRJT04pOwotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOwotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsKLSAgICB0cnkgewotICAgICAgampfY29uc3VtZV90b2tlbihFWFBPUlQpOwotICAgICAgRXhwb3J0QmluZGluZ0xpc3QoKTsKLSAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKEVycm9yKWpqdGUwMDA7fQotICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsKLSAgICAgICAgICB9Ci0gICAgfQotICB9Ci0KLSAgZmluYWwgcHVibGljIHZvaWQgRXhwb3J0QmluZGluZ0xpc3QoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotIC8qQGJnZW4oamp0cmVlKSBFeHBvcnRCaW5kaW5nTGlzdCAqLwotICBBU1RFeHBvcnRCaW5kaW5nTGlzdCBqanRuMDAwID0gbmV3IEFTVEV4cG9ydEJpbmRpbmdMaXN0KHRoaXMsIEpKVEVYUE9SVEJJTkRJTkdMSVNUKTsKLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsKLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgdHJ5IHsKLSAgICAgIEV4cG9ydEJpbmRpbmcoKTsKLSAgICAgIGxhYmVsXzMyOgotICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7Ci0gICAgICAgIGNhc2UgQ09NTUE6Ci0gICAgICAgICAgOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIGpqX2xhMVs5M10gPSBqal9nZW47Ci0gICAgICAgICAgYnJlYWsgbGFiZWxfMzI7Ci0gICAgICAgIH0KLSAgICAgICAgampfY29uc3VtZV90b2tlbihDT01NQSk7Ci0gICAgICAgIEV4cG9ydEJpbmRpbmcoKTsKLSAgICAgIH0KLSAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKEVycm9yKWpqdGUwMDA7fQotICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsKLSAgICAgICAgICB9Ci0gICAgfQotICB9Ci0KLSAgZmluYWwgcHVibGljIHZvaWQgRXhwb3J0QmluZGluZygpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gLypAYmdlbihqanRyZWUpIEV4cG9ydEJpbmRpbmcgKi8KLSAgQVNURXhwb3J0QmluZGluZyBqanRuMDAwID0gbmV3IEFTVEV4cG9ydEJpbmRpbmcodGhpcywgSkpURVhQT1JUQklORElORyk7Ci0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7Ci0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOwotICAgIHRyeSB7Ci0gICAgICBpZiAoampfMl8yNCgyKSkgewotICAgICAgICBGdW5jdGlvbk5hbWUoKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgICBjYXNlIEdFVDoKLSAgICAgICAgY2FzZSBJTkNMVURFOgotICAgICAgICBjYXNlIFNFVDoKLSAgICAgICAgY2FzZSBJREVOVElGSUVSOgotICAgICAgICAgIEZ1bmN0aW9uTmFtZSgpOwotICAgICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oQVNTSUdOKTsKLSAgICAgICAgICBGdW5jdGlvbk5hbWUoKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICBqal9sYTFbOTRdID0gampfZ2VuOwotICAgICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oLTEpOwotICAgICAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChFcnJvcilqanRlMDAwO30KLSAgICB9IGZpbmFsbHkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7Ci0gICAgICAgICAgfQotICAgIH0KLSAgfQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gVmFyaWFibGUgRGVmaW5pdGlvbiAoaW4sIE5vSU4pCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICBmaW5hbCBwdWJsaWMgdm9pZCBWYXJpYWJsZURlZmluaXRpb24oKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotIC8qQGJnZW4oamp0cmVlKSBWYXJpYWJsZURlZmluaXRpb24gKi8KLSAgQVNUVmFyaWFibGVEZWZpbml0aW9uIGpqdG4wMDAgPSBuZXcgQVNUVmFyaWFibGVEZWZpbml0aW9uKHRoaXMsIEpKVFZBUklBQkxFREVGSU5JVElPTik7Ci0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7Ci0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOwotICAgIHRyeSB7Ci0gICAgICBWYXJpYWJsZURlZmluaXRpb25LaW5kKCk7Ci0gICAgICBWYXJpYWJsZUJpbmRpbmdMaXN0KCk7Ci0gICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChFcnJvcilqanRlMDAwO30KLSAgICB9IGZpbmFsbHkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7Ci0gICAgICAgICAgfQotICAgIH0KLSAgfQotCi0gIGZpbmFsIHB1YmxpYyB2b2lkIFZhcmlhYmxlRGVmaW5pdGlvbk5vSU4oKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotIC8qQGJnZW4oamp0cmVlKSBWYXJpYWJsZURlZmluaXRpb25Ob0lOICovCi0gIEFTVFZhcmlhYmxlRGVmaW5pdGlvbk5vSU4gamp0bjAwMCA9IG5ldyBBU1RWYXJpYWJsZURlZmluaXRpb25Ob0lOKHRoaXMsIEpKVFZBUklBQkxFREVGSU5JVElPTk5PSU4pOwotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOwotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsKLSAgICB0cnkgewotICAgICAgVmFyaWFibGVEZWZpbml0aW9uS2luZCgpOwotICAgICAgVmFyaWFibGVCaW5kaW5nTGlzdE5vSU4oKTsKLSAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKEVycm9yKWpqdGUwMDA7fQotICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsKLSAgICAgICAgICB9Ci0gICAgfQotICB9Ci0KLSAgZmluYWwgcHVibGljIHZvaWQgVmFyaWFibGVEZWZpbml0aW9uS2luZCgpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gLypAYmdlbihqanRyZWUpIFZhcmlhYmxlRGVmaW5pdGlvbktpbmQgKi8KLSAgQVNUVmFyaWFibGVEZWZpbml0aW9uS2luZCBqanRuMDAwID0gbmV3IEFTVFZhcmlhYmxlRGVmaW5pdGlvbktpbmQodGhpcywgSkpUVkFSSUFCTEVERUZJTklUSU9OS0lORCk7Ci0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7Ci0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOwotICAgIHRyeSB7Ci0gICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKLSAgICAgIGNhc2UgVkFSOgotICAgICAgICBqal9jb25zdW1lX3Rva2VuKFZBUik7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBDT05TVDoKLSAgICAgICAgampfY29uc3VtZV90b2tlbihDT05TVCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgampfbGExWzk1XSA9IGpqX2dlbjsKLSAgICAgICAgampfY29uc3VtZV90b2tlbigtMSk7Ci0gICAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigpOwotICAgICAgfQotICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsKLSAgICAgICAgICB9Ci0gICAgfQotICB9Ci0KLSAgZmluYWwgcHVibGljIHZvaWQgVmFyaWFibGVCaW5kaW5nTGlzdCgpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gLypAYmdlbihqanRyZWUpIFZhcmlhYmxlQmluZGluZ0xpc3QgKi8KLSAgQVNUVmFyaWFibGVCaW5kaW5nTGlzdCBqanRuMDAwID0gbmV3IEFTVFZhcmlhYmxlQmluZGluZ0xpc3QodGhpcywgSkpUVkFSSUFCTEVCSU5ESU5HTElTVCk7Ci0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7Ci0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOwotICAgIHRyeSB7Ci0gICAgICBWYXJpYWJsZUJpbmRpbmcoKTsKLSAgICAgIGxhYmVsXzMzOgotICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7Ci0gICAgICAgIGNhc2UgQ09NTUE6Ci0gICAgICAgICAgOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIGpqX2xhMVs5Nl0gPSBqal9nZW47Ci0gICAgICAgICAgYnJlYWsgbGFiZWxfMzM7Ci0gICAgICAgIH0KLSAgICAgICAgampfY29uc3VtZV90b2tlbihDT01NQSk7Ci0gICAgICAgIFZhcmlhYmxlQmluZGluZygpOwotICAgICAgfQotICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7Ci0gICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgIGpqdGMwMDAgPSBmYWxzZTsKLSAgICAgfSBlbHNlIHsKLSAgICAgICBqanRyZWUucG9wTm9kZSgpOwotICAgICB9Ci0gICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgewotICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgIH0KLSAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgewotICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICB9Ci0gICAgIHtpZiAodHJ1ZSkgdGhyb3cgKEVycm9yKWpqdGUwMDA7fQotICAgIH0gZmluYWxseSB7Ci0gICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOwotICAgICB9Ci0gICAgfQotICB9Ci0KLSAgZmluYWwgcHVibGljIHZvaWQgVmFyaWFibGVCaW5kaW5nTGlzdE5vSU4oKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotIC8qQGJnZW4oamp0cmVlKSBWYXJpYWJsZUJpbmRpbmdMaXN0Tm9JTiAqLwotICBBU1RWYXJpYWJsZUJpbmRpbmdMaXN0Tm9JTiBqanRuMDAwID0gbmV3IEFTVFZhcmlhYmxlQmluZGluZ0xpc3ROb0lOKHRoaXMsIEpKVFZBUklBQkxFQklORElOR0xJU1ROT0lOKTsKLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsKLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgdHJ5IHsKLSAgICAgIFZhcmlhYmxlQmluZGluZ05vSU4oKTsKLSAgICAgIGxhYmVsXzM0OgotICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7Ci0gICAgICAgIGNhc2UgQ09NTUE6Ci0gICAgICAgICAgOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIGpqX2xhMVs5N10gPSBqal9nZW47Ci0gICAgICAgICAgYnJlYWsgbGFiZWxfMzQ7Ci0gICAgICAgIH0KLSAgICAgICAgampfY29uc3VtZV90b2tlbihDT01NQSk7Ci0gICAgICAgIFZhcmlhYmxlQmluZGluZ05vSU4oKTsKLSAgICAgIH0KLSAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgewotICAgICBpZiAoamp0YzAwMCkgewotICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsKLSAgICAgICBqanRjMDAwID0gZmFsc2U7Ci0gICAgIH0gZWxzZSB7Ci0gICAgICAgamp0cmVlLnBvcE5vZGUoKTsKLSAgICAgfQotICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKLSAgICAgICB7aWYgKHRydWUpIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICB9Ci0gICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsKLSAgICAgICB7aWYgKHRydWUpIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgfQotICAgICB7aWYgKHRydWUpIHRocm93IChFcnJvcilqanRlMDAwO30KLSAgICB9IGZpbmFsbHkgewotICAgICBpZiAoamp0YzAwMCkgewotICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsKLSAgICAgfQotICAgIH0KLSAgfQotCi0gIGZpbmFsIHB1YmxpYyB2b2lkIFZhcmlhYmxlQmluZGluZygpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gLypAYmdlbihqanRyZWUpIFZhcmlhYmxlQmluZGluZyAqLwotICBBU1RWYXJpYWJsZUJpbmRpbmcgamp0bjAwMCA9IG5ldyBBU1RWYXJpYWJsZUJpbmRpbmcodGhpcywgSkpUVkFSSUFCTEVCSU5ESU5HKTsKLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsKLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgdHJ5IHsKLSAgICAgIFR5cGVkSWRlbnRpZmllcigpOwotICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7Ci0gICAgICBjYXNlIEFTU0lHTjoKLSAgICAgICAgVmFyaWFibGVJbml0aWFsaXNhdGlvbigpOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIGpqX2xhMVs5OF0gPSBqal9nZW47Ci0gICAgICAgIDsKLSAgICAgIH0KLSAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKEVycm9yKWpqdGUwMDA7fQotICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsKLSAgICAgICAgICB9Ci0gICAgfQotICB9Ci0KLSAgZmluYWwgcHVibGljIHZvaWQgVmFyaWFibGVCaW5kaW5nTm9JTigpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gLypAYmdlbihqanRyZWUpIFZhcmlhYmxlQmluZGluZ05vSU4gKi8KLSAgQVNUVmFyaWFibGVCaW5kaW5nTm9JTiBqanRuMDAwID0gbmV3IEFTVFZhcmlhYmxlQmluZGluZ05vSU4odGhpcywgSkpUVkFSSUFCTEVCSU5ESU5HTk9JTik7Ci0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7Ci0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOwotICAgIHRyeSB7Ci0gICAgICBUeXBlZElkZW50aWZpZXJOb0lOKCk7Ci0gICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKLSAgICAgIGNhc2UgQVNTSUdOOgotICAgICAgICBWYXJpYWJsZUluaXRpYWxpc2F0aW9uTm9JTigpOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIGpqX2xhMVs5OV0gPSBqal9nZW47Ci0gICAgICAgIDsKLSAgICAgIH0KLSAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKEVycm9yKWpqdGUwMDA7fQotICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsKLSAgICAgICAgICB9Ci0gICAgfQotICB9Ci0KLSAgZmluYWwgcHVibGljIHZvaWQgVmFyaWFibGVJbml0aWFsaXNhdGlvbigpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gLypAYmdlbihqanRyZWUpIFZhcmlhYmxlSW5pdGlhbGlzYXRpb24gKi8KLSAgQVNUVmFyaWFibGVJbml0aWFsaXNhdGlvbiBqanRuMDAwID0gbmV3IEFTVFZhcmlhYmxlSW5pdGlhbGlzYXRpb24odGhpcywgSkpUVkFSSUFCTEVJTklUSUFMSVNBVElPTik7Ci0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7Ci0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOwotICAgIHRyeSB7Ci0gICAgICBqal9jb25zdW1lX3Rva2VuKEFTU0lHTik7Ci0gICAgICBWYXJpYWJsZUluaXRpYWxpemVyKCk7Ci0gICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsKLSAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsKLSAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOwotICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsKLSAgICAgICAgIH0KLSAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgewotICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgfQotICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgewotICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgIH0KLSAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKEVycm9yKWpqdGUwMDA7fQotICAgIH0gZmluYWxseSB7Ci0gICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7Ci0gICAgICAgICB9Ci0gICAgfQotICB9Ci0KLSAgZmluYWwgcHVibGljIHZvaWQgVmFyaWFibGVJbml0aWFsaXNhdGlvbk5vSU4oKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotIC8qQGJnZW4oamp0cmVlKSBWYXJpYWJsZUluaXRpYWxpc2F0aW9uTm9JTiAqLwotICBBU1RWYXJpYWJsZUluaXRpYWxpc2F0aW9uTm9JTiBqanRuMDAwID0gbmV3IEFTVFZhcmlhYmxlSW5pdGlhbGlzYXRpb25Ob0lOKHRoaXMsIEpKVFZBUklBQkxFSU5JVElBTElTQVRJT05OT0lOKTsKLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsKLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgdHJ5IHsKLSAgICAgIGpqX2NvbnN1bWVfdG9rZW4oQVNTSUdOKTsKLSAgICAgIFZhcmlhYmxlSW5pdGlhbGl6ZXJOb0lOKCk7Ci0gICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsKLSAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsKLSAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOwotICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsKLSAgICAgICAgIH0KLSAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgewotICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgfQotICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgewotICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgIH0KLSAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKEVycm9yKWpqdGUwMDA7fQotICAgIH0gZmluYWxseSB7Ci0gICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7Ci0gICAgICAgICB9Ci0gICAgfQotICB9Ci0KLSAgZmluYWwgcHVibGljIHZvaWQgVmFyaWFibGVJbml0aWFsaXplcigpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gLypAYmdlbihqanRyZWUpIFZhcmlhYmxlSW5pdGlhbGl6ZXIgKi8KLSAgQVNUVmFyaWFibGVJbml0aWFsaXplciBqanRuMDAwID0gbmV3IEFTVFZhcmlhYmxlSW5pdGlhbGl6ZXIodGhpcywgSkpUVkFSSUFCTEVJTklUSUFMSVpFUik7Ci0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7Ci0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOwotICAgIHRyeSB7Ci0gICAgICBpZiAoampfMl8yNSgzKSkgewotICAgICAgICBBc3NpZ25tZW50RXhwcmVzc2lvbigpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7Ci0gICAgICAgIGNhc2UgRkFMU0U6Ci0gICAgICAgIGNhc2UgR0VUOgotICAgICAgICBjYXNlIElOQ0xVREU6Ci0gICAgICAgIGNhc2UgUFJJVkFURToKLSAgICAgICAgY2FzZSBQVUJMSUM6Ci0gICAgICAgIGNhc2UgU0VUOgotICAgICAgICBjYXNlIFRSVUU6Ci0gICAgICAgIGNhc2UgUFJPVEVDVEVEOgotICAgICAgICBjYXNlIElERU5USUZJRVI6Ci0gICAgICAgICAgQXR0cmlidXRlcygpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIGpqX2xhMVsxMDBdID0gampfZ2VuOwotICAgICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oLTEpOwotICAgICAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChFcnJvcilqanRlMDAwO30KLSAgICB9IGZpbmFsbHkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7Ci0gICAgICAgICAgfQotICAgIH0KLSAgfQotCi0gIGZpbmFsIHB1YmxpYyB2b2lkIFZhcmlhYmxlSW5pdGlhbGl6ZXJOb0lOKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAvKkBiZ2VuKGpqdHJlZSkgVmFyaWFibGVJbml0aWFsaXplck5vSU4gKi8KLSAgQVNUVmFyaWFibGVJbml0aWFsaXplck5vSU4gamp0bjAwMCA9IG5ldyBBU1RWYXJpYWJsZUluaXRpYWxpemVyTm9JTih0aGlzLCBKSlRWQVJJQUJMRUlOSVRJQUxJWkVSTk9JTik7Ci0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7Ci0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOwotICAgIHRyeSB7Ci0gICAgICBpZiAoampfMl8yNigzKSkgewotICAgICAgICBBc3NpZ25tZW50RXhwcmVzc2lvbk5vSU4oKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgICBjYXNlIEZBTFNFOgotICAgICAgICBjYXNlIEdFVDoKLSAgICAgICAgY2FzZSBJTkNMVURFOgotICAgICAgICBjYXNlIFBSSVZBVEU6Ci0gICAgICAgIGNhc2UgUFVCTElDOgotICAgICAgICBjYXNlIFNFVDoKLSAgICAgICAgY2FzZSBUUlVFOgotICAgICAgICBjYXNlIFBST1RFQ1RFRDoKLSAgICAgICAgY2FzZSBJREVOVElGSUVSOgotICAgICAgICAgIEF0dHJpYnV0ZXMoKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICBqal9sYTFbMTAxXSA9IGpqX2dlbjsKLSAgICAgICAgICBqal9jb25zdW1lX3Rva2VuKC0xKTsKLSAgICAgICAgICB0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsKLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoRXJyb3Ipamp0ZTAwMDt9Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOwotICAgICAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBmaW5hbCBwdWJsaWMgdm9pZCBUeXBlZElkZW50aWZpZXIoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotIC8qQGJnZW4oamp0cmVlKSBUeXBlZElkZW50aWZpZXIgKi8KLSAgQVNUVHlwZWRJZGVudGlmaWVyIGpqdG4wMDAgPSBuZXcgQVNUVHlwZWRJZGVudGlmaWVyKHRoaXMsIEpKVFRZUEVESURFTlRJRklFUik7Ci0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7Ci0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOwotICAgIHRyeSB7Ci0gICAgICBJZGVudGlmaWVyKCk7Ci0gICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKLSAgICAgIGNhc2UgQ09MT046Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oQ09MT04pOwotICAgICAgICBUeXBlRXhwcmVzc2lvbigpOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIGpqX2xhMVsxMDJdID0gampfZ2VuOwotICAgICAgICA7Ci0gICAgICB9Ci0gICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChFcnJvcilqanRlMDAwO30KLSAgICB9IGZpbmFsbHkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7Ci0gICAgICAgICAgfQotICAgIH0KLSAgfQotCi0gIGZpbmFsIHB1YmxpYyB2b2lkIFR5cGVkSWRlbnRpZmllck5vSU4oKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotIC8qQGJnZW4oamp0cmVlKSBUeXBlZElkZW50aWZpZXJOb0lOICovCi0gIEFTVFR5cGVkSWRlbnRpZmllck5vSU4gamp0bjAwMCA9IG5ldyBBU1RUeXBlZElkZW50aWZpZXJOb0lOKHRoaXMsIEpKVFRZUEVESURFTlRJRklFUk5PSU4pOwotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOwotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsKLSAgICB0cnkgewotICAgICAgSWRlbnRpZmllcigpOwotICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7Ci0gICAgICBjYXNlIENPTE9OOgotICAgICAgICBqal9jb25zdW1lX3Rva2VuKENPTE9OKTsKLSAgICAgICAgVHlwZUV4cHJlc3Npb25Ob0lOKCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgampfbGExWzEwM10gPSBqal9nZW47Ci0gICAgICAgIDsKLSAgICAgIH0KLSAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKEVycm9yKWpqdGUwMDA7fQotICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsKLSAgICAgICAgICB9Ci0gICAgfQotICB9Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyBTaW1wbGUgVmFyaWFibGUgRGVmaW5pdGlvbiAKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gIGZpbmFsIHB1YmxpYyB2b2lkIFNpbXBsZVZhcmlhYmxlRGVmaW5pdGlvbigpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gLypAYmdlbihqanRyZWUpIFNpbXBsZVZhcmlhYmxlRGVmaW5pdGlvbiAqLwotICBBU1RTaW1wbGVWYXJpYWJsZURlZmluaXRpb24gamp0bjAwMCA9IG5ldyBBU1RTaW1wbGVWYXJpYWJsZURlZmluaXRpb24odGhpcywgSkpUU0lNUExFVkFSSUFCTEVERUZJTklUSU9OKTsKLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsKLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgdHJ5IHsKLSAgICAgIGpqX2NvbnN1bWVfdG9rZW4oVkFSKTsKLSAgICAgIFVudHlwZWRWYXJpYWJsZUJpbmRpbmdMaXN0KCk7Ci0gICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChFcnJvcilqanRlMDAwO30KLSAgICB9IGZpbmFsbHkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7Ci0gICAgICAgICAgfQotICAgIH0KLSAgfQotCi0gIGZpbmFsIHB1YmxpYyB2b2lkIFVudHlwZWRWYXJpYWJsZUJpbmRpbmdMaXN0KCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAvKkBiZ2VuKGpqdHJlZSkgVW50eXBlZFZhcmlhYmxlQmluZGluZ0xpc3QgKi8KLSAgQVNUVW50eXBlZFZhcmlhYmxlQmluZGluZ0xpc3Qgamp0bjAwMCA9IG5ldyBBU1RVbnR5cGVkVmFyaWFibGVCaW5kaW5nTGlzdCh0aGlzLCBKSlRVTlRZUEVEVkFSSUFCTEVCSU5ESU5HTElTVCk7Ci0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7Ci0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOwotICAgIHRyeSB7Ci0gICAgICBVbnR5cGVkVmFyaWFibGVCaW5kaW5nKCk7Ci0gICAgICBsYWJlbF8zNToKLSAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgICBjYXNlIENPTU1BOgotICAgICAgICAgIDsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICBqal9sYTFbMTA0XSA9IGpqX2dlbjsKLSAgICAgICAgICBicmVhayBsYWJlbF8zNTsKLSAgICAgICAgfQotICAgICAgICBqal9jb25zdW1lX3Rva2VuKENPTU1BKTsKLSAgICAgICAgVW50eXBlZFZhcmlhYmxlQmluZGluZygpOwotICAgICAgfQotICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsKLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoRXJyb3Ipamp0ZTAwMDt9Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOwotICAgICAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBmaW5hbCBwdWJsaWMgdm9pZCBVbnR5cGVkVmFyaWFibGVCaW5kaW5nKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAvKkBiZ2VuKGpqdHJlZSkgVW50eXBlZFZhcmlhYmxlQmluZGluZyAqLwotICBBU1RVbnR5cGVkVmFyaWFibGVCaW5kaW5nIGpqdG4wMDAgPSBuZXcgQVNUVW50eXBlZFZhcmlhYmxlQmluZGluZyh0aGlzLCBKSlRVTlRZUEVEVkFSSUFCTEVCSU5ESU5HKTsKLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsKLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgdHJ5IHsKLSAgICAgIElkZW50aWZpZXIoKTsKLSAgICAgIFZhcmlhYmxlSW5pdGlhbGlzYXRpb24oKTsKLSAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKEVycm9yKWpqdGUwMDA7fQotICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsKLSAgICAgICAgICB9Ci0gICAgfQotICB9Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyBGdW5jdGlvbiBEZWZpbml0aW9uCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICBmaW5hbCBwdWJsaWMgdm9pZCBGdW5jdGlvbkRlZmluaXRpb24oKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotIC8qQGJnZW4oamp0cmVlKSBGdW5jdGlvbkRlZmluaXRpb24gKi8KLSAgQVNURnVuY3Rpb25EZWZpbml0aW9uIGpqdG4wMDAgPSBuZXcgQVNURnVuY3Rpb25EZWZpbml0aW9uKHRoaXMsIEpKVEZVTkNUSU9OREVGSU5JVElPTik7Ci0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7Ci0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOwotICAgIHRyeSB7Ci0gICAgICBqal9jb25zdW1lX3Rva2VuKEZVTkNUSU9OKTsKLSAgICAgIEZ1bmN0aW9uTmFtZSgpOwotICAgICAgRnVuY3Rpb25Db21tb24oKTsKLSAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKEVycm9yKWpqdGUwMDA7fQotICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsKLSAgICAgICAgICB9Ci0gICAgfQotICB9Ci0KLSAgZmluYWwgcHVibGljIHZvaWQgRnVuY3Rpb25OYW1lKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAvKkBiZ2VuKGpqdHJlZSkgRnVuY3Rpb25OYW1lICovCi0gIEFTVEZ1bmN0aW9uTmFtZSBqanRuMDAwID0gbmV3IEFTVEZ1bmN0aW9uTmFtZSh0aGlzLCBKSlRGVU5DVElPTk5BTUUpOwotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOwotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsKLSAgICB0cnkgewotICAgICAgaWYgKGpqXzJfMjcoMikpIHsKLSAgICAgICAgampfY29uc3VtZV90b2tlbihHRVQpOwotICAgICAgICBJZGVudGlmaWVyKCk7Ci0gICAgICB9IGVsc2UgaWYgKGpqXzJfMjgoMikpIHsKLSAgICAgICAgampfY29uc3VtZV90b2tlbihTRVQpOwotICAgICAgICBJZGVudGlmaWVyKCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKLSAgICAgICAgY2FzZSBHRVQ6Ci0gICAgICAgIGNhc2UgSU5DTFVERToKLSAgICAgICAgY2FzZSBTRVQ6Ci0gICAgICAgIGNhc2UgSURFTlRJRklFUjoKLSAgICAgICAgICBJZGVudGlmaWVyKCk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgampfbGExWzEwNV0gPSBqal9nZW47Ci0gICAgICAgICAgampfY29uc3VtZV90b2tlbigtMSk7Ci0gICAgICAgICAgdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKEVycm9yKWpqdGUwMDA7fQotICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsKLSAgICAgICAgICB9Ci0gICAgfQotICB9Ci0KLSAgZmluYWwgcHVibGljIHZvaWQgRnVuY3Rpb25Db21tb24oKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotIC8qQGJnZW4oamp0cmVlKSBGdW5jdGlvbkNvbW1vbiAqLwotICBBU1RGdW5jdGlvbkNvbW1vbiBqanRuMDAwID0gbmV3IEFTVEZ1bmN0aW9uQ29tbW9uKHRoaXMsIEpKVEZVTkNUSU9OQ09NTU9OKTsKLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsKLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgdHJ5IHsKLSAgICAgIGpqX2NvbnN1bWVfdG9rZW4oTFBBUkVOKTsKLSAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgY2FzZSBDT05TVDoKLSAgICAgIGNhc2UgR0VUOgotICAgICAgY2FzZSBJTkNMVURFOgotICAgICAgY2FzZSBTRVQ6Ci0gICAgICBjYXNlIElERU5USUZJRVI6Ci0gICAgICBjYXNlIEVMSVBTRToKLSAgICAgICAgUGFyYW1ldGVycygpOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIGpqX2xhMVsxMDZdID0gampfZ2VuOwotICAgICAgICA7Ci0gICAgICB9Ci0gICAgICBqal9jb25zdW1lX3Rva2VuKFJQQVJFTik7Ci0gICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKLSAgICAgIGNhc2UgQ09MT046Ci0gICAgICAgIFJlc3VsdCgpOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIGpqX2xhMVsxMDddID0gampfZ2VuOwotICAgICAgICA7Ci0gICAgICB9Ci0gICAgICBCbG9jaygpOwotICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsKLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoRXJyb3Ipamp0ZTAwMDt9Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOwotICAgICAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBmaW5hbCBwdWJsaWMgdm9pZCBQYXJhbWV0ZXJzKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAvKkBiZ2VuKGpqdHJlZSkgUGFyYW1ldGVycyAqLwotICBBU1RQYXJhbWV0ZXJzIGpqdG4wMDAgPSBuZXcgQVNUUGFyYW1ldGVycyh0aGlzLCBKSlRQQVJBTUVURVJTKTsKLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsKLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgdHJ5IHsKLSAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgY2FzZSBFTElQU0U6Ci0gICAgICAgIFJlc3RQYXJhbWV0ZXJzKCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBDT05TVDoKLSAgICAgIGNhc2UgR0VUOgotICAgICAgY2FzZSBJTkNMVURFOgotICAgICAgY2FzZSBTRVQ6Ci0gICAgICBjYXNlIElERU5USUZJRVI6Ci0gICAgICAgIFBhcmFtZXRlckluaXQoKTsKLSAgICAgICAgbGFiZWxfMzY6Ci0gICAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7Ci0gICAgICAgICAgY2FzZSBDT01NQToKLSAgICAgICAgICAgIDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBqal9sYTFbMTA4XSA9IGpqX2dlbjsKLSAgICAgICAgICAgIGJyZWFrIGxhYmVsXzM2OwotICAgICAgICAgIH0KLSAgICAgICAgICBqal9jb25zdW1lX3Rva2VuKENPTU1BKTsKLSAgICAgICAgICBQYXJhbWV0ZXJJbml0KCk7Ci0gICAgICAgIH0KLSAgICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7Ci0gICAgICAgIGNhc2UgRUxJUFNFOgotICAgICAgICAgIFJlc3RQYXJhbWV0ZXJzKCk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgampfbGExWzEwOV0gPSBqal9nZW47Ci0gICAgICAgICAgOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgampfbGExWzExMF0gPSBqal9nZW47Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oLTEpOwotICAgICAgICB0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oKTsKLSAgICAgIH0KLSAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKEVycm9yKWpqdGUwMDA7fQotICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsKLSAgICAgICAgICB9Ci0gICAgfQotICB9Ci0KLSAgZmluYWwgcHVibGljIHZvaWQgUGFyYW1ldGVyKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAvKkBiZ2VuKGpqdHJlZSkgUGFyYW1ldGVyICovCi0gIEFTVFBhcmFtZXRlciBqanRuMDAwID0gbmV3IEFTVFBhcmFtZXRlcih0aGlzLCBKSlRQQVJBTUVURVIpOwotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOwotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsKLSAgICB0cnkgewotICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7Ci0gICAgICBjYXNlIENPTlNUOgotICAgICAgICBqal9jb25zdW1lX3Rva2VuKENPTlNUKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICBqal9sYTFbMTExXSA9IGpqX2dlbjsKLSAgICAgICAgOwotICAgICAgfQotICAgICAgVHlwZWRJZGVudGlmaWVyKCk7Ci0gICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChFcnJvcilqanRlMDAwO30KLSAgICB9IGZpbmFsbHkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7Ci0gICAgICAgICAgfQotICAgIH0KLSAgfQotCi0gIGZpbmFsIHB1YmxpYyB2b2lkIFBhcmFtZXRlckluaXQoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotIC8qQGJnZW4oamp0cmVlKSBQYXJhbWV0ZXJJbml0ICovCi0gIEFTVFBhcmFtZXRlckluaXQgamp0bjAwMCA9IG5ldyBBU1RQYXJhbWV0ZXJJbml0KHRoaXMsIEpKVFBBUkFNRVRFUklOSVQpOwotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOwotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsKLSAgICB0cnkgewotICAgICAgUGFyYW1ldGVyKCk7Ci0gICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKLSAgICAgIGNhc2UgQVNTSUdOOgotICAgICAgICBqal9jb25zdW1lX3Rva2VuKEFTU0lHTik7Ci0gICAgICAgIEFzc2lnbm1lbnRFeHByZXNzaW9uKCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgampfbGExWzExMl0gPSBqal9nZW47Ci0gICAgICAgIDsKLSAgICAgIH0KLSAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKEVycm9yKWpqdGUwMDA7fQotICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsKLSAgICAgICAgICB9Ci0gICAgfQotICB9Ci0KLSAgZmluYWwgcHVibGljIHZvaWQgUmVzdFBhcmFtZXRlcnMoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotIC8qQGJnZW4oamp0cmVlKSBSZXN0UGFyYW1ldGVycyAqLwotICBBU1RSZXN0UGFyYW1ldGVycyBqanRuMDAwID0gbmV3IEFTVFJlc3RQYXJhbWV0ZXJzKHRoaXMsIEpKVFJFU1RQQVJBTUVURVJTKTsKLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsKLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgdHJ5IHsKLSAgICAgIGpqX2NvbnN1bWVfdG9rZW4oRUxJUFNFKTsKLSAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgY2FzZSBDT05TVDoKLSAgICAgICAgampfY29uc3VtZV90b2tlbihDT05TVCk7Ci0gICAgICAgIElkZW50aWZpZXIoKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICBqal9sYTFbMTEzXSA9IGpqX2dlbjsKLSAgICAgICAgOwotICAgICAgfQotICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsKLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoRXJyb3Ipamp0ZTAwMDt9Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOwotICAgICAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBmaW5hbCBwdWJsaWMgdm9pZCBSZXN1bHQoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotIC8qQGJnZW4oamp0cmVlKSBSZXN1bHQgKi8KLSAgQVNUUmVzdWx0IGpqdG4wMDAgPSBuZXcgQVNUUmVzdWx0KHRoaXMsIEpKVFJFU1VMVCk7Ci0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7Ci0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOwotICAgIHRyeSB7Ci0gICAgICBqal9jb25zdW1lX3Rva2VuKENPTE9OKTsKLSAgICAgIFR5cGVFeHByZXNzaW9uKCk7Ci0gICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChFcnJvcilqanRlMDAwO30KLSAgICB9IGZpbmFsbHkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7Ci0gICAgICAgICAgfQotICAgIH0KLSAgfQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gQ2xhc3MgRGVmaW5pdGlvbgotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgZmluYWwgcHVibGljIHZvaWQgQ2xhc3NEZWZpbml0aW9uKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAvKkBiZ2VuKGpqdHJlZSkgQ2xhc3NEZWZpbml0aW9uICovCi0gIEFTVENsYXNzRGVmaW5pdGlvbiBqanRuMDAwID0gbmV3IEFTVENsYXNzRGVmaW5pdGlvbih0aGlzLCBKSlRDTEFTU0RFRklOSVRJT04pOwotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOwotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsKLSAgICB0cnkgewotICAgICAgampfY29uc3VtZV90b2tlbihDTEFTUyk7Ci0gICAgICBJZGVudGlmaWVyKCk7Ci0gICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKLSAgICAgIGNhc2UgRVhURU5EUzoKLSAgICAgIGNhc2UgSU1QTEVNRU5UUzoKLSAgICAgICAgSW5oZXJpdGFuY2UoKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICBqal9sYTFbMTE0XSA9IGpqX2dlbjsKLSAgICAgICAgOwotICAgICAgfQotICAgICAgQmxvY2soKTsKLSAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKEVycm9yKWpqdGUwMDA7fQotICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsKLSAgICAgICAgICB9Ci0gICAgfQotICB9Ci0KLSAgZmluYWwgcHVibGljIHZvaWQgSW50ZXJmYWNlRGVmaW5pdGlvbigpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gLypAYmdlbihqanRyZWUpIEludGVyZmFjZURlZmluaXRpb24gKi8KLSAgQVNUSW50ZXJmYWNlRGVmaW5pdGlvbiBqanRuMDAwID0gbmV3IEFTVEludGVyZmFjZURlZmluaXRpb24odGhpcywgSkpUSU5URVJGQUNFREVGSU5JVElPTik7Ci0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7Ci0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOwotICAgIHRyeSB7Ci0gICAgICBpZiAoampfMl8yOSgzKSkgewotICAgICAgICBqal9jb25zdW1lX3Rva2VuKElOVEVSRkFDRSk7Ci0gICAgICAgIElkZW50aWZpZXIoKTsKLSAgICAgICAgU2MoKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgICBjYXNlIElOVEVSRkFDRToKLSAgICAgICAgICBqal9jb25zdW1lX3Rva2VuKElOVEVSRkFDRSk7Ci0gICAgICAgICAgSWRlbnRpZmllcigpOwotICAgICAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgICAgIGNhc2UgRVhURU5EUzoKLSAgICAgICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oRVhURU5EUyk7Ci0gICAgICAgICAgICBUeXBlRXhwcmVzc2lvbkxpc3QoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBqal9sYTFbMTE1XSA9IGpqX2dlbjsKLSAgICAgICAgICAgIDsKLSAgICAgICAgICB9Ci0gICAgICAgICAgQmxvY2soKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICBqal9sYTFbMTE2XSA9IGpqX2dlbjsKLSAgICAgICAgICBqal9jb25zdW1lX3Rva2VuKC0xKTsKLSAgICAgICAgICB0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsKLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoRXJyb3Ipamp0ZTAwMDt9Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOwotICAgICAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBmaW5hbCBwdWJsaWMgdm9pZCBJbmhlcml0YW5jZSgpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gLypAYmdlbihqanRyZWUpIEluaGVyaXRhbmNlICovCi0gIEFTVEluaGVyaXRhbmNlIGpqdG4wMDAgPSBuZXcgQVNUSW5oZXJpdGFuY2UodGhpcywgSkpUSU5IRVJJVEFOQ0UpOwotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOwotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsKLSAgICB0cnkgewotICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7Ci0gICAgICBjYXNlIEVYVEVORFM6Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oRVhURU5EUyk7Ci0gICAgICAgIFR5cGVFeHByZXNzaW9uKCk7Ci0gICAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgICBjYXNlIElNUExFTUVOVFM6Ci0gICAgICAgICAgampfY29uc3VtZV90b2tlbihJTVBMRU1FTlRTKTsKLSAgICAgICAgICBUeXBlRXhwcmVzc2lvbkxpc3QoKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICBqal9sYTFbMTE3XSA9IGpqX2dlbjsKLSAgICAgICAgICA7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIElNUExFTUVOVFM6Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oSU1QTEVNRU5UUyk7Ci0gICAgICAgIFR5cGVFeHByZXNzaW9uTGlzdCgpOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIGpqX2xhMVsxMThdID0gampfZ2VuOwotICAgICAgICBqal9jb25zdW1lX3Rva2VuKC0xKTsKLSAgICAgICAgdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCk7Ci0gICAgICB9Ci0gICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChFcnJvcilqanRlMDAwO30KLSAgICB9IGZpbmFsbHkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7Ci0gICAgICAgICAgfQotICAgIH0KLSAgfQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gTmFtZXNwYWNlIERlZmluaXRpb24gCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICBmaW5hbCBwdWJsaWMgdm9pZCBOYW1lc3BhY2VEZWZpbml0aW9uKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAvKkBiZ2VuKGpqdHJlZSkgTmFtZXNwYWNlRGVmaW5pdGlvbiAqLwotICBBU1ROYW1lc3BhY2VEZWZpbml0aW9uIGpqdG4wMDAgPSBuZXcgQVNUTmFtZXNwYWNlRGVmaW5pdGlvbih0aGlzLCBKSlROQU1FU1BBQ0VERUZJTklUSU9OKTsKLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsKLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgdHJ5IHsKLSAgICAgIGpqX2NvbnN1bWVfdG9rZW4oTkFNRVNQQUNFKTsKLSAgICAgIElkZW50aWZpZXIoKTsKLSAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKEVycm9yKWpqdGUwMDA7fQotICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsKLSAgICAgICAgICB9Ci0gICAgfQotICB9Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyBQYWNrYWdlIERlZmluaXRpb24gCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICBmaW5hbCBwdWJsaWMgdm9pZCBQYWNrYWdlRGVmaW5pdGlvbigpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gLypAYmdlbihqanRyZWUpIFBhY2thZ2VEZWZpbml0aW9uICovCi0gIEFTVFBhY2thZ2VEZWZpbml0aW9uIGpqdG4wMDAgPSBuZXcgQVNUUGFja2FnZURlZmluaXRpb24odGhpcywgSkpUUEFDS0FHRURFRklOSVRJT04pOwotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOwotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsKLSAgICB0cnkgewotICAgICAgampfY29uc3VtZV90b2tlbihQQUNLQUdFKTsKLSAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgY2FzZSBHRVQ6Ci0gICAgICBjYXNlIElOQ0xVREU6Ci0gICAgICBjYXNlIFNFVDoKLSAgICAgIGNhc2UgU1RSSU5HX0xJVEVSQUw6Ci0gICAgICBjYXNlIElERU5USUZJRVI6Ci0gICAgICAgIFBhY2thZ2VOYW1lKCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgampfbGExWzExOV0gPSBqal9nZW47Ci0gICAgICAgIDsKLSAgICAgIH0KLSAgICAgIEJsb2NrKCk7Ci0gICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChFcnJvcilqanRlMDAwO30KLSAgICB9IGZpbmFsbHkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7Ci0gICAgICAgICAgfQotICAgIH0KLSAgfQotCi0gIGZpbmFsIHB1YmxpYyB2b2lkIFBhY2thZ2VOYW1lKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAvKkBiZ2VuKGpqdHJlZSkgUGFja2FnZU5hbWUgKi8KLSAgQVNUUGFja2FnZU5hbWUgamp0bjAwMCA9IG5ldyBBU1RQYWNrYWdlTmFtZSh0aGlzLCBKSlRQQUNLQUdFTkFNRSk7Ci0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7Ci0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOwotICAgIHRyeSB7Ci0gICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKLSAgICAgIGNhc2UgU1RSSU5HX0xJVEVSQUw6Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oU1RSSU5HX0xJVEVSQUwpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgR0VUOgotICAgICAgY2FzZSBJTkNMVURFOgotICAgICAgY2FzZSBTRVQ6Ci0gICAgICBjYXNlIElERU5USUZJRVI6Ci0gICAgICAgIFBhY2thZ2VJZGVudGlmaWVycygpOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIGpqX2xhMVsxMjBdID0gampfZ2VuOwotICAgICAgICBqal9jb25zdW1lX3Rva2VuKC0xKTsKLSAgICAgICAgdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCk7Ci0gICAgICB9Ci0gICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChFcnJvcilqanRlMDAwO30KLSAgICB9IGZpbmFsbHkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7Ci0gICAgICAgICAgfQotICAgIH0KLSAgfQotCi0gIGZpbmFsIHB1YmxpYyB2b2lkIFBhY2thZ2VJZGVudGlmaWVycygpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gLypAYmdlbihqanRyZWUpIFBhY2thZ2VJZGVudGlmaWVycyAqLwotICBBU1RQYWNrYWdlSWRlbnRpZmllcnMgamp0bjAwMCA9IG5ldyBBU1RQYWNrYWdlSWRlbnRpZmllcnModGhpcywgSkpUUEFDS0FHRUlERU5USUZJRVJTKTsKLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsKLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgdHJ5IHsKLSAgICAgIElkZW50aWZpZXIoKTsKLSAgICAgIGxhYmVsXzM3OgotICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7Ci0gICAgICAgIGNhc2UgRE9UOgotICAgICAgICAgIDsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICBqal9sYTFbMTIxXSA9IGpqX2dlbjsKLSAgICAgICAgICBicmVhayBsYWJlbF8zNzsKLSAgICAgICAgfQotICAgICAgICBqal9jb25zdW1lX3Rva2VuKERPVCk7Ci0gICAgICAgIElkZW50aWZpZXIoKTsKLSAgICAgIH0KLSAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKEVycm9yKWpqdGUwMDA7fQotICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsKLSAgICAgICAgICB9Ci0gICAgfQotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzJfMShpbnQgeGxhKSB7Ci0gICAgampfbGEgPSB4bGE7IGpqX2xhc3Rwb3MgPSBqal9zY2FucG9zID0gdG9rZW47Ci0gICAgdHJ5IHsgcmV0dXJuICFqal8zXzEoKTsgfQotICAgIGNhdGNoKExvb2thaGVhZFN1Y2Nlc3MgbHMpIHsgcmV0dXJuIHRydWU7IH0KLSAgICBmaW5hbGx5IHsgampfc2F2ZSgwLCB4bGEpOyB9Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfMl8yKGludCB4bGEpIHsKLSAgICBqal9sYSA9IHhsYTsgampfbGFzdHBvcyA9IGpqX3NjYW5wb3MgPSB0b2tlbjsKLSAgICB0cnkgeyByZXR1cm4gIWpqXzNfMigpOyB9Ci0gICAgY2F0Y2goTG9va2FoZWFkU3VjY2VzcyBscykgeyByZXR1cm4gdHJ1ZTsgfQotICAgIGZpbmFsbHkgeyBqal9zYXZlKDEsIHhsYSk7IH0KLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8yXzMoaW50IHhsYSkgewotICAgIGpqX2xhID0geGxhOyBqal9sYXN0cG9zID0gampfc2NhbnBvcyA9IHRva2VuOwotICAgIHRyeSB7IHJldHVybiAhampfM18zKCk7IH0KLSAgICBjYXRjaChMb29rYWhlYWRTdWNjZXNzIGxzKSB7IHJldHVybiB0cnVlOyB9Ci0gICAgZmluYWxseSB7IGpqX3NhdmUoMiwgeGxhKTsgfQotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzJfNChpbnQgeGxhKSB7Ci0gICAgampfbGEgPSB4bGE7IGpqX2xhc3Rwb3MgPSBqal9zY2FucG9zID0gdG9rZW47Ci0gICAgdHJ5IHsgcmV0dXJuICFqal8zXzQoKTsgfQotICAgIGNhdGNoKExvb2thaGVhZFN1Y2Nlc3MgbHMpIHsgcmV0dXJuIHRydWU7IH0KLSAgICBmaW5hbGx5IHsgampfc2F2ZSgzLCB4bGEpOyB9Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfMl81KGludCB4bGEpIHsKLSAgICBqal9sYSA9IHhsYTsgampfbGFzdHBvcyA9IGpqX3NjYW5wb3MgPSB0b2tlbjsKLSAgICB0cnkgeyByZXR1cm4gIWpqXzNfNSgpOyB9Ci0gICAgY2F0Y2goTG9va2FoZWFkU3VjY2VzcyBscykgeyByZXR1cm4gdHJ1ZTsgfQotICAgIGZpbmFsbHkgeyBqal9zYXZlKDQsIHhsYSk7IH0KLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8yXzYoaW50IHhsYSkgewotICAgIGpqX2xhID0geGxhOyBqal9sYXN0cG9zID0gampfc2NhbnBvcyA9IHRva2VuOwotICAgIHRyeSB7IHJldHVybiAhampfM182KCk7IH0KLSAgICBjYXRjaChMb29rYWhlYWRTdWNjZXNzIGxzKSB7IHJldHVybiB0cnVlOyB9Ci0gICAgZmluYWxseSB7IGpqX3NhdmUoNSwgeGxhKTsgfQotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzJfNyhpbnQgeGxhKSB7Ci0gICAgampfbGEgPSB4bGE7IGpqX2xhc3Rwb3MgPSBqal9zY2FucG9zID0gdG9rZW47Ci0gICAgdHJ5IHsgcmV0dXJuICFqal8zXzcoKTsgfQotICAgIGNhdGNoKExvb2thaGVhZFN1Y2Nlc3MgbHMpIHsgcmV0dXJuIHRydWU7IH0KLSAgICBmaW5hbGx5IHsgampfc2F2ZSg2LCB4bGEpOyB9Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfMl84KGludCB4bGEpIHsKLSAgICBqal9sYSA9IHhsYTsgampfbGFzdHBvcyA9IGpqX3NjYW5wb3MgPSB0b2tlbjsKLSAgICB0cnkgeyByZXR1cm4gIWpqXzNfOCgpOyB9Ci0gICAgY2F0Y2goTG9va2FoZWFkU3VjY2VzcyBscykgeyByZXR1cm4gdHJ1ZTsgfQotICAgIGZpbmFsbHkgeyBqal9zYXZlKDcsIHhsYSk7IH0KLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8yXzkoaW50IHhsYSkgewotICAgIGpqX2xhID0geGxhOyBqal9sYXN0cG9zID0gampfc2NhbnBvcyA9IHRva2VuOwotICAgIHRyeSB7IHJldHVybiAhampfM185KCk7IH0KLSAgICBjYXRjaChMb29rYWhlYWRTdWNjZXNzIGxzKSB7IHJldHVybiB0cnVlOyB9Ci0gICAgZmluYWxseSB7IGpqX3NhdmUoOCwgeGxhKTsgfQotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzJfMTAoaW50IHhsYSkgewotICAgIGpqX2xhID0geGxhOyBqal9sYXN0cG9zID0gampfc2NhbnBvcyA9IHRva2VuOwotICAgIHRyeSB7IHJldHVybiAhampfM18xMCgpOyB9Ci0gICAgY2F0Y2goTG9va2FoZWFkU3VjY2VzcyBscykgeyByZXR1cm4gdHJ1ZTsgfQotICAgIGZpbmFsbHkgeyBqal9zYXZlKDksIHhsYSk7IH0KLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8yXzExKGludCB4bGEpIHsKLSAgICBqal9sYSA9IHhsYTsgampfbGFzdHBvcyA9IGpqX3NjYW5wb3MgPSB0b2tlbjsKLSAgICB0cnkgeyByZXR1cm4gIWpqXzNfMTEoKTsgfQotICAgIGNhdGNoKExvb2thaGVhZFN1Y2Nlc3MgbHMpIHsgcmV0dXJuIHRydWU7IH0KLSAgICBmaW5hbGx5IHsgampfc2F2ZSgxMCwgeGxhKTsgfQotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzJfMTIoaW50IHhsYSkgewotICAgIGpqX2xhID0geGxhOyBqal9sYXN0cG9zID0gampfc2NhbnBvcyA9IHRva2VuOwotICAgIHRyeSB7IHJldHVybiAhampfM18xMigpOyB9Ci0gICAgY2F0Y2goTG9va2FoZWFkU3VjY2VzcyBscykgeyByZXR1cm4gdHJ1ZTsgfQotICAgIGZpbmFsbHkgeyBqal9zYXZlKDExLCB4bGEpOyB9Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfMl8xMyhpbnQgeGxhKSB7Ci0gICAgampfbGEgPSB4bGE7IGpqX2xhc3Rwb3MgPSBqal9zY2FucG9zID0gdG9rZW47Ci0gICAgdHJ5IHsgcmV0dXJuICFqal8zXzEzKCk7IH0KLSAgICBjYXRjaChMb29rYWhlYWRTdWNjZXNzIGxzKSB7IHJldHVybiB0cnVlOyB9Ci0gICAgZmluYWxseSB7IGpqX3NhdmUoMTIsIHhsYSk7IH0KLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8yXzE0KGludCB4bGEpIHsKLSAgICBqal9sYSA9IHhsYTsgampfbGFzdHBvcyA9IGpqX3NjYW5wb3MgPSB0b2tlbjsKLSAgICB0cnkgeyByZXR1cm4gIWpqXzNfMTQoKTsgfQotICAgIGNhdGNoKExvb2thaGVhZFN1Y2Nlc3MgbHMpIHsgcmV0dXJuIHRydWU7IH0KLSAgICBmaW5hbGx5IHsgampfc2F2ZSgxMywgeGxhKTsgfQotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzJfMTUoaW50IHhsYSkgewotICAgIGpqX2xhID0geGxhOyBqal9sYXN0cG9zID0gampfc2NhbnBvcyA9IHRva2VuOwotICAgIHRyeSB7IHJldHVybiAhampfM18xNSgpOyB9Ci0gICAgY2F0Y2goTG9va2FoZWFkU3VjY2VzcyBscykgeyByZXR1cm4gdHJ1ZTsgfQotICAgIGZpbmFsbHkgeyBqal9zYXZlKDE0LCB4bGEpOyB9Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfMl8xNihpbnQgeGxhKSB7Ci0gICAgampfbGEgPSB4bGE7IGpqX2xhc3Rwb3MgPSBqal9zY2FucG9zID0gdG9rZW47Ci0gICAgdHJ5IHsgcmV0dXJuICFqal8zXzE2KCk7IH0KLSAgICBjYXRjaChMb29rYWhlYWRTdWNjZXNzIGxzKSB7IHJldHVybiB0cnVlOyB9Ci0gICAgZmluYWxseSB7IGpqX3NhdmUoMTUsIHhsYSk7IH0KLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8yXzE3KGludCB4bGEpIHsKLSAgICBqal9sYSA9IHhsYTsgampfbGFzdHBvcyA9IGpqX3NjYW5wb3MgPSB0b2tlbjsKLSAgICB0cnkgeyByZXR1cm4gIWpqXzNfMTcoKTsgfQotICAgIGNhdGNoKExvb2thaGVhZFN1Y2Nlc3MgbHMpIHsgcmV0dXJuIHRydWU7IH0KLSAgICBmaW5hbGx5IHsgampfc2F2ZSgxNiwgeGxhKTsgfQotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzJfMTgoaW50IHhsYSkgewotICAgIGpqX2xhID0geGxhOyBqal9sYXN0cG9zID0gampfc2NhbnBvcyA9IHRva2VuOwotICAgIHRyeSB7IHJldHVybiAhampfM18xOCgpOyB9Ci0gICAgY2F0Y2goTG9va2FoZWFkU3VjY2VzcyBscykgeyByZXR1cm4gdHJ1ZTsgfQotICAgIGZpbmFsbHkgeyBqal9zYXZlKDE3LCB4bGEpOyB9Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfMl8xOShpbnQgeGxhKSB7Ci0gICAgampfbGEgPSB4bGE7IGpqX2xhc3Rwb3MgPSBqal9zY2FucG9zID0gdG9rZW47Ci0gICAgdHJ5IHsgcmV0dXJuICFqal8zXzE5KCk7IH0KLSAgICBjYXRjaChMb29rYWhlYWRTdWNjZXNzIGxzKSB7IHJldHVybiB0cnVlOyB9Ci0gICAgZmluYWxseSB7IGpqX3NhdmUoMTgsIHhsYSk7IH0KLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8yXzIwKGludCB4bGEpIHsKLSAgICBqal9sYSA9IHhsYTsgampfbGFzdHBvcyA9IGpqX3NjYW5wb3MgPSB0b2tlbjsKLSAgICB0cnkgeyByZXR1cm4gIWpqXzNfMjAoKTsgfQotICAgIGNhdGNoKExvb2thaGVhZFN1Y2Nlc3MgbHMpIHsgcmV0dXJuIHRydWU7IH0KLSAgICBmaW5hbGx5IHsgampfc2F2ZSgxOSwgeGxhKTsgfQotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzJfMjEoaW50IHhsYSkgewotICAgIGpqX2xhID0geGxhOyBqal9sYXN0cG9zID0gampfc2NhbnBvcyA9IHRva2VuOwotICAgIHRyeSB7IHJldHVybiAhampfM18yMSgpOyB9Ci0gICAgY2F0Y2goTG9va2FoZWFkU3VjY2VzcyBscykgeyByZXR1cm4gdHJ1ZTsgfQotICAgIGZpbmFsbHkgeyBqal9zYXZlKDIwLCB4bGEpOyB9Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfMl8yMihpbnQgeGxhKSB7Ci0gICAgampfbGEgPSB4bGE7IGpqX2xhc3Rwb3MgPSBqal9zY2FucG9zID0gdG9rZW47Ci0gICAgdHJ5IHsgcmV0dXJuICFqal8zXzIyKCk7IH0KLSAgICBjYXRjaChMb29rYWhlYWRTdWNjZXNzIGxzKSB7IHJldHVybiB0cnVlOyB9Ci0gICAgZmluYWxseSB7IGpqX3NhdmUoMjEsIHhsYSk7IH0KLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8yXzIzKGludCB4bGEpIHsKLSAgICBqal9sYSA9IHhsYTsgampfbGFzdHBvcyA9IGpqX3NjYW5wb3MgPSB0b2tlbjsKLSAgICB0cnkgeyByZXR1cm4gIWpqXzNfMjMoKTsgfQotICAgIGNhdGNoKExvb2thaGVhZFN1Y2Nlc3MgbHMpIHsgcmV0dXJuIHRydWU7IH0KLSAgICBmaW5hbGx5IHsgampfc2F2ZSgyMiwgeGxhKTsgfQotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzJfMjQoaW50IHhsYSkgewotICAgIGpqX2xhID0geGxhOyBqal9sYXN0cG9zID0gampfc2NhbnBvcyA9IHRva2VuOwotICAgIHRyeSB7IHJldHVybiAhampfM18yNCgpOyB9Ci0gICAgY2F0Y2goTG9va2FoZWFkU3VjY2VzcyBscykgeyByZXR1cm4gdHJ1ZTsgfQotICAgIGZpbmFsbHkgeyBqal9zYXZlKDIzLCB4bGEpOyB9Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfMl8yNShpbnQgeGxhKSB7Ci0gICAgampfbGEgPSB4bGE7IGpqX2xhc3Rwb3MgPSBqal9zY2FucG9zID0gdG9rZW47Ci0gICAgdHJ5IHsgcmV0dXJuICFqal8zXzI1KCk7IH0KLSAgICBjYXRjaChMb29rYWhlYWRTdWNjZXNzIGxzKSB7IHJldHVybiB0cnVlOyB9Ci0gICAgZmluYWxseSB7IGpqX3NhdmUoMjQsIHhsYSk7IH0KLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8yXzI2KGludCB4bGEpIHsKLSAgICBqal9sYSA9IHhsYTsgampfbGFzdHBvcyA9IGpqX3NjYW5wb3MgPSB0b2tlbjsKLSAgICB0cnkgeyByZXR1cm4gIWpqXzNfMjYoKTsgfQotICAgIGNhdGNoKExvb2thaGVhZFN1Y2Nlc3MgbHMpIHsgcmV0dXJuIHRydWU7IH0KLSAgICBmaW5hbGx5IHsgampfc2F2ZSgyNSwgeGxhKTsgfQotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzJfMjcoaW50IHhsYSkgewotICAgIGpqX2xhID0geGxhOyBqal9sYXN0cG9zID0gampfc2NhbnBvcyA9IHRva2VuOwotICAgIHRyeSB7IHJldHVybiAhampfM18yNygpOyB9Ci0gICAgY2F0Y2goTG9va2FoZWFkU3VjY2VzcyBscykgeyByZXR1cm4gdHJ1ZTsgfQotICAgIGZpbmFsbHkgeyBqal9zYXZlKDI2LCB4bGEpOyB9Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfMl8yOChpbnQgeGxhKSB7Ci0gICAgampfbGEgPSB4bGE7IGpqX2xhc3Rwb3MgPSBqal9zY2FucG9zID0gdG9rZW47Ci0gICAgdHJ5IHsgcmV0dXJuICFqal8zXzI4KCk7IH0KLSAgICBjYXRjaChMb29rYWhlYWRTdWNjZXNzIGxzKSB7IHJldHVybiB0cnVlOyB9Ci0gICAgZmluYWxseSB7IGpqX3NhdmUoMjcsIHhsYSk7IH0KLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8yXzI5KGludCB4bGEpIHsKLSAgICBqal9sYSA9IHhsYTsgampfbGFzdHBvcyA9IGpqX3NjYW5wb3MgPSB0b2tlbjsKLSAgICB0cnkgeyByZXR1cm4gIWpqXzNfMjkoKTsgfQotICAgIGNhdGNoKExvb2thaGVhZFN1Y2Nlc3MgbHMpIHsgcmV0dXJuIHRydWU7IH0KLSAgICBmaW5hbGx5IHsgampfc2F2ZSgyOCwgeGxhKTsgfQotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzE0NCgpIHsKLSAgICBpZiAoampfM1JfMTgyKCkpIHJldHVybiB0cnVlOwotICAgIFRva2VuIHhzcDsKLSAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgeHNwID0gampfc2NhbnBvczsKLSAgICAgIGlmIChqal8zUl8xOTgoKSkgeyBqal9zY2FucG9zID0geHNwOyBicmVhazsgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMjM5KCkgewotICAgIGlmIChqal8zUl8yNDIoKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqXzNSXzIyMigpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMTM3KCkgewotICAgIGlmIChqal8zUl8xNjgoKSkgcmV0dXJuIHRydWU7Ci0gICAgVG9rZW4geHNwOwotICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICB4c3AgPSBqal9zY2FucG9zOwotICAgICAgaWYgKGpqXzNSXzE2OSgpKSB7IGpqX3NjYW5wb3MgPSB4c3A7IGJyZWFrOyB9Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8xNjYoKSB7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oRE9UKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqXzNSXzU1KCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8xODIoKSB7Ci0gICAgaWYgKGpqXzNSXzIwMSgpKSByZXR1cm4gdHJ1ZTsKLSAgICBUb2tlbiB4c3A7Ci0gICAgd2hpbGUgKHRydWUpIHsKLSAgICAgIHhzcCA9IGpqX3NjYW5wb3M7Ci0gICAgICBpZiAoampfM1JfMjE4KCkpIHsgampfc2NhbnBvcyA9IHhzcDsgYnJlYWs7IH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzIyMCgpIHsKLSAgICBpZiAoampfM1JfMjQyKCkpIHJldHVybiB0cnVlOwotICAgIGlmIChqal8zUl8yMTkoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzE2OCgpIHsKLSAgICBpZiAoampfM1JfMTk5KCkpIHJldHVybiB0cnVlOwotICAgIFRva2VuIHhzcDsKLSAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgeHNwID0gampfc2NhbnBvczsKLSAgICAgIGlmIChqal8zUl8yMDAoKSkgeyBqal9zY2FucG9zID0geHNwOyBicmVhazsgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMTM1KCkgewotICAgIGlmIChqal8zUl81NSgpKSByZXR1cm4gdHJ1ZTsKLSAgICBUb2tlbiB4c3A7Ci0gICAgd2hpbGUgKHRydWUpIHsKLSAgICAgIHhzcCA9IGpqX3NjYW5wb3M7Ci0gICAgICBpZiAoampfM1JfMTY2KCkpIHsgampfc2NhbnBvcyA9IHhzcDsgYnJlYWs7IH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzI1NCgpIHsKLSAgICBpZiAoampfM1JfMjU3KCkpIHJldHVybiB0cnVlOwotICAgIGlmIChqal8zUl8yNDMoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzIyMSgpIHsKLSAgICBpZiAoampfc2Nhbl90b2tlbihCSVRfT1IpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMzIyKCkgewotICAgIGlmIChqal9zY2FuX3Rva2VuKElNUExFTUVOVFMpKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfM1JfMzE1KCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl85NCgpIHsKLSAgICBpZiAoampfM1JfMTM1KCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl81MygpIHsKLSAgICBUb2tlbiB4c3A7Ci0gICAgeHNwID0gampfc2NhbnBvczsKLSAgICBpZiAoampfc2Nhbl90b2tlbig3MCkpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal8zUl85NCgpKSByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzIwMSgpIHsKLSAgICBpZiAoampfM1JfMjIyKCkpIHJldHVybiB0cnVlOwotICAgIFRva2VuIHhzcDsKLSAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgeHNwID0gampfc2NhbnBvczsKLSAgICAgIGlmIChqal8zUl8yMzkoKSkgeyBqal9zY2FucG9zID0geHNwOyBicmVhazsgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMjQxKCkgewotICAgIGlmIChqal8zUl8yNTcoKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqXzNSXzI0MCgpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMzA2KCkgewotICAgIGlmIChqal9zY2FuX3Rva2VuKEVYVEVORFMpKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfM1JfMzE1KCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8xOTkoKSB7Ci0gICAgaWYgKGpqXzNSXzIxOSgpKSByZXR1cm4gdHJ1ZTsKLSAgICBUb2tlbiB4c3A7Ci0gICAgd2hpbGUgKHRydWUpIHsKLSAgICAgIHhzcCA9IGpqX3NjYW5wb3M7Ci0gICAgICBpZiAoampfM1JfMjIwKCkpIHsgampfc2NhbnBvcyA9IHhzcDsgYnJlYWs7IH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzI2MygpIHsKLSAgICBpZiAoampfM1JfMjY0KCkpIHJldHVybiB0cnVlOwotICAgIGlmIChqal8zUl8yNTgoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzI0MigpIHsKLSAgICBpZiAoampfc2Nhbl90b2tlbihYT1IpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMTMwKCkgewotICAgIGlmIChqal9zY2FuX3Rva2VuKE5BTUVTUEFDRSkpIHJldHVybiB0cnVlOwotICAgIGlmIChqal8zUl81NSgpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMzAwKCkgewotICAgIGlmIChqal8zUl8zMDUoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzIyMigpIHsKLSAgICBpZiAoampfM1JfMjQzKCkpIHJldHVybiB0cnVlOwotICAgIFRva2VuIHhzcDsKLSAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgeHNwID0gampfc2NhbnBvczsKLSAgICAgIGlmIChqal8zUl8yNTQoKSkgeyBqal9zY2FucG9zID0geHNwOyBicmVhazsgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMTYyKCkgewotICAgIGlmIChqal9zY2FuX3Rva2VuKElOVEVSRkFDRSkpIHJldHVybiB0cnVlOwotICAgIGlmIChqal8zUl81NSgpKSByZXR1cm4gdHJ1ZTsKLSAgICBUb2tlbiB4c3A7Ci0gICAgeHNwID0gampfc2NhbnBvczsKLSAgICBpZiAoampfM1JfMzA2KCkpIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqXzNSXzEwNSgpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMjU2KCkgewotICAgIGlmIChqal8zUl8yNjQoKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqXzNSXzI1NSgpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMzE0KCkgewotICAgIGlmIChqal9zY2FuX3Rva2VuKElNUExFTUVOVFMpKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfM1JfMzE1KCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8zMTMoKSB7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oRVhURU5EUykpIHJldHVybiB0cnVlOwotICAgIGlmIChqal8zUl8yODYoKSkgcmV0dXJuIHRydWU7Ci0gICAgVG9rZW4geHNwOwotICAgIHhzcCA9IGpqX3NjYW5wb3M7Ci0gICAgaWYgKGpqXzNSXzMyMigpKSBqal9zY2FucG9zID0geHNwOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8zMDUoKSB7Ci0gICAgVG9rZW4geHNwOwotICAgIHhzcCA9IGpqX3NjYW5wb3M7Ci0gICAgaWYgKGpqXzNSXzMxMygpKSB7Ci0gICAgampfc2NhbnBvcyA9IHhzcDsKLSAgICBpZiAoampfM1JfMzE0KCkpIHJldHVybiB0cnVlOwotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMjE5KCkgewotICAgIGlmIChqal8zUl8yNDAoKSkgcmV0dXJuIHRydWU7Ci0gICAgVG9rZW4geHNwOwotICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICB4c3AgPSBqal9zY2FucG9zOwotICAgICAgaWYgKGpqXzNSXzI0MSgpKSB7IGpqX3NjYW5wb3MgPSB4c3A7IGJyZWFrOyB9Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8yOTAoKSB7Ci0gICAgaWYgKGpqXzNSXzI4NCgpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMjU3KCkgewotICAgIGlmIChqal9zY2FuX3Rva2VuKEJJVF9BTkQpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMTI5KCkgewotICAgIFRva2VuIHhzcDsKLSAgICB4c3AgPSBqal9zY2FucG9zOwotICAgIGlmIChqal8zXzI5KCkpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal8zUl8xNjIoKSkgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zXzI5KCkgewotICAgIGlmIChqal9zY2FuX3Rva2VuKElOVEVSRkFDRSkpIHJldHVybiB0cnVlOwotICAgIGlmIChqal8zUl81NSgpKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAodHJ1ZSkgeyBqal9sYSA9IDA7IGpqX3NjYW5wb3MgPSBqal9sYXN0cG9zOyByZXR1cm4gZmFsc2U7fQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8xMjgoKSB7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oQ0xBU1MpKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfM1JfNTUoKSkgcmV0dXJuIHRydWU7Ci0gICAgVG9rZW4geHNwOwotICAgIHhzcCA9IGpqX3NjYW5wb3M7Ci0gICAgaWYgKGpqXzNSXzMwMCgpKSBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal8zUl8xMDUoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzI0MygpIHsKLSAgICBpZiAoampfM1JfMjU4KCkpIHJldHVybiB0cnVlOwotICAgIFRva2VuIHhzcDsKLSAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgeHNwID0gampfc2NhbnBvczsKLSAgICAgIGlmIChqal8zUl8yNjMoKSkgeyBqal9zY2FucG9zID0geHNwOyBicmVhazsgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMjkyKCkgewotICAgIGlmIChqal9zY2FuX3Rva2VuKENPTlNUKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqXzNSXzU1KCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8yNzcoKSB7Ci0gICAgaWYgKGpqXzNSXzI4MygpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMjQwKCkgewotICAgIGlmIChqal8zUl8yNTUoKSkgcmV0dXJuIHRydWU7Ci0gICAgVG9rZW4geHNwOwotICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICB4c3AgPSBqal9zY2FucG9zOwotICAgICAgaWYgKGpqXzNSXzI1NigpKSB7IGpqX3NjYW5wb3MgPSB4c3A7IGJyZWFrOyB9Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8yOTMoKSB7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oQVNTSUdOKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqXzNSXzM5KCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8yODMoKSB7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oQ09MT04pKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfM1JfMjg2KCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl80MigpIHsKLSAgICBpZiAoampfM1JfNjAoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzI4NCgpIHsKLSAgICBpZiAoampfc2Nhbl90b2tlbihFTElQU0UpKSByZXR1cm4gdHJ1ZTsKLSAgICBUb2tlbiB4c3A7Ci0gICAgeHNwID0gampfc2NhbnBvczsKLSAgICBpZiAoampfM1JfMjkyKCkpIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzI4OSgpIHsKLSAgICBpZiAoampfc2Nhbl90b2tlbihDT01NQSkpIHJldHVybiB0cnVlOwotICAgIGlmIChqal8zUl8yODUoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzI2NCgpIHsKLSAgICBUb2tlbiB4c3A7Ci0gICAgeHNwID0gampfc2NhbnBvczsKLSAgICBpZiAoampfc2Nhbl90b2tlbig5OSkpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal9zY2FuX3Rva2VuKDEwMikpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal9zY2FuX3Rva2VuKDEzMykpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal9zY2FuX3Rva2VuKDEzNCkpIHJldHVybiB0cnVlOwotICAgIH0KLSAgICB9Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8yNzUoKSB7Ci0gICAgaWYgKGpqXzNSXzYwKCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8yNzEoKSB7Ci0gICAgVG9rZW4geHNwOwotICAgIHhzcCA9IGpqX3NjYW5wb3M7Ci0gICAgaWYgKGpqXzNSXzI3NSgpKSB7Ci0gICAgampfc2NhbnBvcyA9IHhzcDsKLSAgICBpZiAoampfc2Nhbl90b2tlbigyOSkpIHJldHVybiB0cnVlOwotICAgIH0KLSAgICBpZiAoampfM1JfNDMoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzI4NSgpIHsKLSAgICBpZiAoampfM1JfMjg3KCkpIHJldHVybiB0cnVlOwotICAgIFRva2VuIHhzcDsKLSAgICB4c3AgPSBqal9zY2FucG9zOwotICAgIGlmIChqal8zUl8yOTMoKSkgampfc2NhbnBvcyA9IHhzcDsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMjU4KCkgewotICAgIGlmIChqal8zUl80MygpKSByZXR1cm4gdHJ1ZTsKLSAgICBUb2tlbiB4c3A7Ci0gICAgd2hpbGUgKHRydWUpIHsKLSAgICAgIHhzcCA9IGpqX3NjYW5wb3M7Ci0gICAgICBpZiAoampfM1JfMjcxKCkpIHsgampfc2NhbnBvcyA9IHhzcDsgYnJlYWs7IH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzI4NygpIHsKLSAgICBUb2tlbiB4c3A7Ci0gICAgeHNwID0gampfc2NhbnBvczsKLSAgICBpZiAoampfc2Nhbl90b2tlbigxMykpIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqXzNSXzIxNigpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM18xMSgpIHsKLSAgICBUb2tlbiB4c3A7Ci0gICAgeHNwID0gampfc2NhbnBvczsKLSAgICBpZiAoampfM1JfNDIoKSkgewotICAgIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oMjcpKSB7Ci0gICAgampfc2NhbnBvcyA9IHhzcDsKLSAgICBpZiAoampfc2Nhbl90b2tlbigyOSkpIHJldHVybiB0cnVlOwotICAgIH0KLSAgICB9Ci0gICAgaWYgKGpqXzNSXzQzKCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8yNjkoKSB7Ci0gICAgaWYgKGpqXzNSXzI3MygpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfNjIoKSB7Ci0gICAgaWYgKGpqXzNSXzEwMSgpKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfM1JfNjEoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzk1KCkgewotICAgIGlmIChqal8zUl81NSgpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMjgxKCkgewotICAgIGlmIChqal8zUl8yODUoKSkgcmV0dXJuIHRydWU7Ci0gICAgVG9rZW4geHNwOwotICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICB4c3AgPSBqal9zY2FucG9zOwotICAgICAgaWYgKGpqXzNSXzI4OSgpKSB7IGpqX3NjYW5wb3MgPSB4c3A7IGJyZWFrOyB9Ci0gICAgfQotICAgIHhzcCA9IGpqX3NjYW5wb3M7Ci0gICAgaWYgKGpqXzNSXzI5MCgpKSBqal9zY2FucG9zID0geHNwOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8yNTUoKSB7Ci0gICAgaWYgKGpqXzNSXzQzKCkpIHJldHVybiB0cnVlOwotICAgIFRva2VuIHhzcDsKLSAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgeHNwID0gampfc2NhbnBvczsKLSAgICAgIGlmIChqal8zXzExKCkpIHsgampfc2NhbnBvcyA9IHhzcDsgYnJlYWs7IH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzI4MCgpIHsKLSAgICBpZiAoampfM1JfMjg0KCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8yNzMoKSB7Ci0gICAgVG9rZW4geHNwOwotICAgIHhzcCA9IGpqX3NjYW5wb3M7Ci0gICAgaWYgKGpqXzNSXzI4MCgpKSB7Ci0gICAgampfc2NhbnBvcyA9IHhzcDsKLSAgICBpZiAoampfM1JfMjgxKCkpIHJldHVybiB0cnVlOwotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMzgoKSB7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oTFBBUkVOKSkgcmV0dXJuIHRydWU7Ci0gICAgVG9rZW4geHNwOwotICAgIHhzcCA9IGpqX3NjYW5wb3M7Ci0gICAgaWYgKGpqXzNSXzI2OSgpKSBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal9zY2FuX3Rva2VuKFJQQVJFTikpIHJldHVybiB0cnVlOwotICAgIHhzcCA9IGpqX3NjYW5wb3M7Ci0gICAgaWYgKGpqXzNSXzI3NygpKSBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal8zUl8xMDUoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzEwMCgpIHsKLSAgICBpZiAoampfM1JfMTQzKCkpIHJldHVybiB0cnVlOwotICAgIGlmIChqal8zUl85OSgpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfNjAoKSB7Ci0gICAgVG9rZW4geHNwOwotICAgIHhzcCA9IGpqX3NjYW5wb3M7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oOTQpKSB7Ci0gICAgampfc2NhbnBvcyA9IHhzcDsKLSAgICBpZiAoampfc2Nhbl90b2tlbig5MykpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal9zY2FuX3Rva2VuKDEwMCkpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal9zY2FuX3Rva2VuKDEwMSkpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal9zY2FuX3Rva2VuKDMwKSkgewotICAgIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oOCkpIHJldHVybiB0cnVlOwotICAgIH0KLSAgICB9Ci0gICAgfQotICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzMyNCgpIHsKLSAgICBpZiAoampfc2Nhbl90b2tlbihDT01NQSkpIHJldHVybiB0cnVlOwotICAgIGlmIChqal8zUl8yNTIoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNfMjgoKSB7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oU0VUKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqXzNSXzU1KCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zXzI3KCkgewotICAgIGlmIChqal9zY2FuX3Rva2VuKEdFVCkpIHJldHVybiB0cnVlOwotICAgIGlmIChqal8zUl81NSgpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfNTQoKSB7Ci0gICAgVG9rZW4geHNwOwotICAgIHhzcCA9IGpqX3NjYW5wb3M7Ci0gICAgaWYgKGpqXzNfMjcoKSkgewotICAgIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqXzNfMjgoKSkgewotICAgIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqXzNSXzk1KCkpIHJldHVybiB0cnVlOwotICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzQzKCkgewotICAgIGlmIChqal8zUl82MSgpKSByZXR1cm4gdHJ1ZTsKLSAgICBUb2tlbiB4c3A7Ci0gICAgd2hpbGUgKHRydWUpIHsKLSAgICAgIHhzcCA9IGpqX3NjYW5wb3M7Ci0gICAgICBpZiAoampfM1JfNjIoKSkgeyBqal9zY2FucG9zID0geHNwOyBicmVhazsgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMTI3KCkgewotICAgIGlmIChqal9zY2FuX3Rva2VuKEZVTkNUSU9OKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqXzNSXzU0KCkpIHJldHVybiB0cnVlOwotICAgIGlmIChqal8zUl8zOCgpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMTAxKCkgewotICAgIFRva2VuIHhzcDsKLSAgICB4c3AgPSBqal9zY2FucG9zOwotICAgIGlmIChqal9zY2FuX3Rva2VuKDExNikpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal9zY2FuX3Rva2VuKDExNykpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal9zY2FuX3Rva2VuKDExOCkpIHJldHVybiB0cnVlOwotICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzI1MigpIHsKLSAgICBpZiAoampfM1JfNTUoKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqXzNSXzMyMSgpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMTQyKCkgewotICAgIGlmIChqal8zUl8xODEoKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqXzNSXzE0MSgpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfNjEoKSB7Ci0gICAgaWYgKGpqXzNSXzk5KCkpIHJldHVybiB0cnVlOwotICAgIFRva2VuIHhzcDsKLSAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgeHNwID0gampfc2NhbnBvczsKLSAgICAgIGlmIChqal8zUl8xMDAoKSkgeyBqal9zY2FucG9zID0geHNwOyBicmVhazsgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMTg3KCkgewotICAgIGlmIChqal9zY2FuX3Rva2VuKENPTE9OKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqXzNSXzIwNSgpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMjM2KCkgewotICAgIGlmIChqal8zUl8yNTIoKSkgcmV0dXJuIHRydWU7Ci0gICAgVG9rZW4geHNwOwotICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICB4c3AgPSBqal9zY2FucG9zOwotICAgICAgaWYgKGpqXzNSXzMyNCgpKSB7IGpqX3NjYW5wb3MgPSB4c3A7IGJyZWFrOyB9Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8yOTUoKSB7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oQ09MT04pKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfM1JfMjg2KCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8xNDMoKSB7Ci0gICAgVG9rZW4geHNwOwotICAgIHhzcCA9IGpqX3NjYW5wb3M7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oMTA4KSkgewotICAgIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oMTA5KSkgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8yMDQoKSB7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oVkFSKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqXzNSXzIzNigpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMjY1KCkgewotICAgIGlmIChqal9zY2FuX3Rva2VuKEVMSVBTRSkpIHJldHVybiB0cnVlOwotICAgIGlmIChqal8zUl8zOSgpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMTUyKCkgewotICAgIGlmIChqal8zUl81NSgpKSByZXR1cm4gdHJ1ZTsKLSAgICBUb2tlbiB4c3A7Ci0gICAgeHNwID0gampfc2NhbnBvczsKLSAgICBpZiAoampfM1JfMTg3KCkpIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzIyNigpIHsKLSAgICBpZiAoampfM1JfNTIoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzk5KCkgewotICAgIGlmIChqal8zUl8xNDEoKSkgcmV0dXJuIHRydWU7Ci0gICAgVG9rZW4geHNwOwotICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICB4c3AgPSBqal9zY2FucG9zOwotICAgICAgaWYgKGpqXzNSXzE0MigpKSB7IGpqX3NjYW5wb3MgPSB4c3A7IGJyZWFrOyB9Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8yMjQoKSB7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oRUxJUFNFKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqXzNSXzM5KCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8yMTYoKSB7Ci0gICAgaWYgKGpqXzNSXzU1KCkpIHJldHVybiB0cnVlOwotICAgIFRva2VuIHhzcDsKLSAgICB4c3AgPSBqal9zY2FucG9zOwotICAgIGlmIChqal8zUl8yOTUoKSkgampfc2NhbnBvcyA9IHhzcDsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMzI5KCkgewotICAgIGlmIChqal8zUl81MigpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMTgxKCkgewotICAgIFRva2VuIHhzcDsKLSAgICB4c3AgPSBqal9zY2FucG9zOwotICAgIGlmIChqal9zY2FuX3Rva2VuKDExMCkpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal9zY2FuX3Rva2VuKDExMSkpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal9zY2FuX3Rva2VuKDExNSkpIHJldHVybiB0cnVlOwotICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNfMjYoKSB7Ci0gICAgaWYgKGpqXzNSXzQ1KCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8yMDYoKSB7Ci0gICAgVG9rZW4geHNwOwotICAgIHhzcCA9IGpqX3NjYW5wb3M7Ci0gICAgaWYgKGpqXzNfMjYoKSkgewotICAgIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqXzNSXzIyNigpKSByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzE1MygpIHsKLSAgICBpZiAoampfM1JfMTg4KCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8xNDEoKSB7Ci0gICAgVG9rZW4geHNwOwotICAgIHhzcCA9IGpqX3NjYW5wb3M7Ci0gICAgaWYgKGpqXzNSXzE3MSgpKSB7Ci0gICAgampfc2NhbnBvcyA9IHhzcDsKLSAgICBpZiAoampfM1JfMTcyKCkpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal8zUl8xNzMoKSkgewotICAgIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqXzNSXzE3NCgpKSB7Ci0gICAgampfc2NhbnBvcyA9IHhzcDsKLSAgICBpZiAoampfM1JfMTc1KCkpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal8zUl8xNzYoKSkgewotICAgIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqXzNSXzE3NygpKSB7Ci0gICAgampfc2NhbnBvcyA9IHhzcDsKLSAgICBpZiAoampfM1JfMTc4KCkpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal8zUl8xNzkoKSkgewotICAgIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqXzNSXzE4MCgpKSByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgfQotICAgIH0KLSAgICB9Ci0gICAgfQotICAgIH0KLSAgICB9Ci0gICAgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMTcxKCkgewotICAgIGlmIChqal8zUl81MCgpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMTgwKCkgewotICAgIGlmIChqal9zY2FuX3Rva2VuKEJBTkcpKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfM1JfMTQxKCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8xNzkoKSB7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oVElMREUpKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfM1JfMTQxKCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8xNzgoKSB7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oTUlOVVMpKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfM1JfMTQxKCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8zMjcoKSB7Ci0gICAgVG9rZW4geHNwOwotICAgIHhzcCA9IGpqX3NjYW5wb3M7Ci0gICAgaWYgKGpqXzNfMjUoKSkgewotICAgIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqXzNSXzMyOSgpKSByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzE3NygpIHsKLSAgICBpZiAoampfc2Nhbl90b2tlbihQTFVTKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqXzNSXzE0MSgpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM18yNSgpIHsKLSAgICBpZiAoampfM1JfMzkoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzE3NigpIHsKLSAgICBpZiAoampfc2Nhbl90b2tlbihERUNSKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqXzNSXzUwKCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zXzUoKSB7Ci0gICAgaWYgKGpqXzNSXzQxKCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl81OSgpIHsKLSAgICBpZiAoampfc2Nhbl90b2tlbihMUEFSRU4pKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfM1JfNjQoKSkgcmV0dXJuIHRydWU7Ci0gICAgVG9rZW4geHNwOwotICAgIHhzcCA9IGpqX3NjYW5wb3M7Ci0gICAgaWYgKGpqXzNSXzI2NSgpKSBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal9zY2FuX3Rva2VuKFJQQVJFTikpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8xNzUoKSB7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oSU5DUikpIHJldHVybiB0cnVlOwotICAgIGlmIChqal8zUl81MCgpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMTc0KCkgewotICAgIGlmIChqal9zY2FuX3Rva2VuKFRZUEVPRikpIHJldHVybiB0cnVlOwotICAgIGlmIChqal8zUl8xNDEoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzE3MygpIHsKLSAgICBpZiAoampfc2Nhbl90b2tlbihWT0lEKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqXzNSXzE0MSgpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMTcyKCkgewotICAgIGlmIChqal9zY2FuX3Rva2VuKERFTEVURSkpIHJldHVybiB0cnVlOwotICAgIGlmIChqal8zUl81MCgpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMzEyKCkgewotICAgIGlmIChqal8zUl8zMjEoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzE4OCgpIHsKLSAgICBpZiAoampfc2Nhbl90b2tlbihBU1NJR04pKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfM1JfMjA2KCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl81OCgpIHsKLSAgICBpZiAoampfc2Nhbl90b2tlbihMQlJBQ0tFVCkpIHJldHVybiB0cnVlOwotICAgIGlmIChqal8zUl82NCgpKSByZXR1cm4gdHJ1ZTsKLSAgICBUb2tlbiB4c3A7Ci0gICAgeHNwID0gampfc2NhbnBvczsKLSAgICBpZiAoampfM1JfMjI0KCkpIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oUkJSQUNLRVQpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMzMwKCkgewotICAgIGlmIChqal9zY2FuX3Rva2VuKENPTU1BKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqXzNSXzExOSgpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMzIxKCkgewotICAgIGlmIChqal9zY2FuX3Rva2VuKEFTU0lHTikpIHJldHVybiB0cnVlOwotICAgIGlmIChqal8zUl8zMjcoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNfMTAoKSB7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oTFBBUkVOKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oRUxJUFNFKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqXzNSXzM5KCkpIHJldHVybiB0cnVlOwotICAgIGlmIChqal9zY2FuX3Rva2VuKFJQQVJFTikpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl80MSgpIHsKLSAgICBUb2tlbiB4c3A7Ci0gICAgeHNwID0gampfc2NhbnBvczsKLSAgICBpZiAoampfM185KCkpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal8zXzEwKCkpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal8zUl81OSgpKSByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zXzkoKSB7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oTFBBUkVOKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oUlBBUkVOKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzExOSgpIHsKLSAgICBpZiAoampfM1JfMTUyKCkpIHJldHVybiB0cnVlOwotICAgIFRva2VuIHhzcDsKLSAgICB4c3AgPSBqal9zY2FucG9zOwotICAgIGlmIChqal8zUl8xNTMoKSkgampfc2NhbnBvcyA9IHhzcDsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMzA0KCkgewotICAgIGlmIChqal9zY2FuX3Rva2VuKENPTU1BKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqXzNSXzE5NigpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM184KCkgewotICAgIGlmIChqal9zY2FuX3Rva2VuKExCUkFDS0VUKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oRUxJUFNFKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqXzNSXzM5KCkpIHJldHVybiB0cnVlOwotICAgIGlmIChqal9zY2FuX3Rva2VuKFJCUkFDS0VUKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNfNygpIHsKLSAgICBpZiAoampfc2Nhbl90b2tlbihMQlJBQ0tFVCkpIHJldHVybiB0cnVlOwotICAgIGlmIChqal9zY2FuX3Rva2VuKFJCUkFDS0VUKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzE5NigpIHsKLSAgICBpZiAoampfM1JfMjE2KCkpIHJldHVybiB0cnVlOwotICAgIFRva2VuIHhzcDsKLSAgICB4c3AgPSBqal9zY2FucG9zOwotICAgIGlmIChqal8zUl8zMTIoKSkgampfc2NhbnBvcyA9IHhzcDsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfNDAoKSB7Ci0gICAgVG9rZW4geHNwOwotICAgIHhzcCA9IGpqX3NjYW5wb3M7Ci0gICAgaWYgKGpqXzNSXzU3KCkpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal8zXzcoKSkgewotICAgIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqXzNfOCgpKSB7Ci0gICAgampfc2NhbnBvcyA9IHhzcDsKLSAgICBpZiAoampfM1JfNTgoKSkgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzU3KCkgewotICAgIGlmIChqal9zY2FuX3Rva2VuKERPVCkpIHJldHVybiB0cnVlOwotICAgIGlmIChqal8zUl85OCgpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMTk0KCkgewotICAgIGlmIChqal8zUl80MCgpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMzI4KCkgewotICAgIGlmIChqal8zUl8xMTkoKSkgcmV0dXJuIHRydWU7Ci0gICAgVG9rZW4geHNwOwotICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICB4c3AgPSBqal9zY2FucG9zOwotICAgICAgaWYgKGpqXzNSXzMzMCgpKSB7IGpqX3NjYW5wb3MgPSB4c3A7IGJyZWFrOyB9Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8xNjAoKSB7Ci0gICAgVG9rZW4geHNwOwotICAgIHhzcCA9IGpqX3NjYW5wb3M7Ci0gICAgaWYgKGpqXzNSXzE5MygpKSB7Ci0gICAgampfc2NhbnBvcyA9IHhzcDsKLSAgICBpZiAoampfM1JfMTk0KCkpIHJldHVybiB0cnVlOwotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMTkzKCkgewotICAgIGlmIChqal8zUl80MSgpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM180KCkgewotICAgIGlmIChqal8zUl80MCgpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMTI0KCkgewotICAgIGlmIChqal8zUl8xNTYoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzEyMSgpIHsKLSAgICBpZiAoampfM1JfMTU2KCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8xNjEoKSB7Ci0gICAgaWYgKGpqXzNSXzE5NigpKSByZXR1cm4gdHJ1ZTsKLSAgICBUb2tlbiB4c3A7Ci0gICAgd2hpbGUgKHRydWUpIHsKLSAgICAgIHhzcCA9IGpqX3NjYW5wb3M7Ci0gICAgICBpZiAoampfM1JfMzA0KCkpIHsgampfc2NhbnBvcyA9IHhzcDsgYnJlYWs7IH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzE1NigpIHsKLSAgICBUb2tlbiB4c3A7Ci0gICAgeHNwID0gampfc2NhbnBvczsKLSAgICBpZiAoampfc2Nhbl90b2tlbigxMDYpKSB7Ci0gICAgampfc2NhbnBvcyA9IHhzcDsKLSAgICBpZiAoampfc2Nhbl90b2tlbigxMDcpKSByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzExOCgpIHsKLSAgICBUb2tlbiB4c3A7Ci0gICAgeHNwID0gampfc2NhbnBvczsKLSAgICBpZiAoampfc2Nhbl90b2tlbig0NykpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal9zY2FuX3Rva2VuKDEzKSkgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zXzYoKSB7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oTFBBUkVOKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqXzNSXzM5KCkpIHJldHVybiB0cnVlOwotICAgIGlmIChqal9zY2FuX3Rva2VuKFJQQVJFTikpIHJldHVybiB0cnVlOwotICAgIGlmIChqal9zY2FuX3Rva2VuKFFVQUxJRklFUikpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8yMzUoKSB7Ci0gICAgaWYgKGpqXzNSXzI1MSgpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMjM0KCkgewotICAgIGlmIChqal8zUl8xOTIoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzI1MygpIHsKLSAgICBpZiAoampfM1JfMTE4KCkpIHJldHVybiB0cnVlOwotICAgIGlmIChqal8zUl8zMjgoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzIzMygpIHsKLSAgICBpZiAoampfM1JfMTI1KCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8xNTUoKSB7Ci0gICAgaWYgKGpqXzNSXzE2MCgpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMjMyKCkgewotICAgIGlmIChqal8zUl8xNTQoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzIxNygpIHsKLSAgICBpZiAoampfM1JfNTQoKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oQVNTSUdOKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqXzNSXzU0KCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8yMzEoKSB7Ci0gICAgaWYgKGpqXzNSXzE5MSgpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMzA3KCkgewotICAgIGlmIChqal9zY2FuX3Rva2VuKENPTU1BKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqXzNSXzE5NygpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMjE0KCkgewotICAgIFRva2VuIHhzcDsKLSAgICB4c3AgPSBqal9zY2FucG9zOwotICAgIGlmIChqal8zUl8yMzAoKSkgewotICAgIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqXzNSXzIzMSgpKSB7Ci0gICAgampfc2NhbnBvcyA9IHhzcDsKLSAgICBpZiAoampfM1JfMjMyKCkpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal8zUl8yMzMoKSkgewotICAgIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqXzNSXzIzNCgpKSB7Ci0gICAgampfc2NhbnBvcyA9IHhzcDsKLSAgICBpZiAoampfM1JfMjM1KCkpIHJldHVybiB0cnVlOwotICAgIH0KLSAgICB9Ci0gICAgfQotICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzIzMCgpIHsKLSAgICBpZiAoampfM1JfMTcwKCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8xMjYoKSB7Ci0gICAgaWYgKGpqXzNSXzExOCgpKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfM1JfMTYxKCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8yNTEoKSB7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oRlVOQ1RJT05fKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqXzNSXzQxKCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8xMjMoKSB7Ci0gICAgaWYgKGpqXzNSXzE2MCgpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM18yNCgpIHsKLSAgICBpZiAoampfM1JfNTQoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzE5NygpIHsKLSAgICBUb2tlbiB4c3A7Ci0gICAgeHNwID0gampfc2NhbnBvczsKLSAgICBpZiAoampfM18yNCgpKSB7Ci0gICAgampfc2NhbnBvcyA9IHhzcDsKLSAgICBpZiAoampfM1JfMjE3KCkpIHJldHVybiB0cnVlOwotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM18zKCkgewotICAgIGlmIChqal9zY2FuX3Rva2VuKExQQVJFTikpIHJldHVybiB0cnVlOwotICAgIGlmIChqal8zUl8zOSgpKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfc2Nhbl90b2tlbihSUEFSRU4pKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfc2Nhbl90b2tlbihRVUFMSUZJRVIpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMTkyKCkgewotICAgIGlmIChqal9zY2FuX3Rva2VuKE5FVykpIHJldHVybiB0cnVlOwotICAgIGlmIChqal8zUl8yMTQoKSkgcmV0dXJuIHRydWU7Ci0gICAgVG9rZW4geHNwOwotICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICB4c3AgPSBqal9zY2FucG9zOwotICAgICAgaWYgKGpqXzNfNCgpKSB7IGpqX3NjYW5wb3MgPSB4c3A7IGJyZWFrOyB9Ci0gICAgfQotICAgIHhzcCA9IGpqX3NjYW5wb3M7Ci0gICAgaWYgKGpqXzNfNSgpKSBqal9zY2FucG9zID0geHNwOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8xNjQoKSB7Ci0gICAgaWYgKGpqXzNSXzE5NygpKSByZXR1cm4gdHJ1ZTsKLSAgICBUb2tlbiB4c3A7Ci0gICAgd2hpbGUgKHRydWUpIHsKLSAgICAgIHhzcCA9IGpqX3NjYW5wb3M7Ci0gICAgICBpZiAoampfM1JfMzA3KCkpIHsgampfc2NhbnBvcyA9IHhzcDsgYnJlYWs7IH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzE1OSgpIHsKLSAgICBpZiAoampfM1JfMTkyKCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8xNTgoKSB7Ci0gICAgaWYgKGpqXzNSXzE5MSgpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMTIyKCkgewotICAgIFRva2VuIHhzcDsKLSAgICB4c3AgPSBqal9zY2FucG9zOwotICAgIGlmIChqal8zUl8xNTcoKSkgewotICAgIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqXzNSXzE1OCgpKSB7Ci0gICAgampfc2NhbnBvcyA9IHhzcDsKLSAgICBpZiAoampfM1JfMTU5KCkpIHJldHVybiB0cnVlOwotICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzE1NygpIHsKLSAgICBpZiAoampfM1JfMTcwKCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8xMzIoKSB7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oRVhQT1JUKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqXzNSXzE2NCgpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMTIwKCkgewotICAgIGlmIChqal8zUl8xNTQoKSkgcmV0dXJuIHRydWU7Ci0gICAgVG9rZW4geHNwOwotICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICB4c3AgPSBqal9zY2FucG9zOwotICAgICAgaWYgKGpqXzNSXzE1NSgpKSB7IGpqX3NjYW5wb3MgPSB4c3A7IGJyZWFrOyB9Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8yODgoKSB7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oUVVBTElGSUVSKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqXzNSXzU1KCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl84NCgpIHsKLSAgICBpZiAoampfM1JfMTI1KCkpIHJldHVybiB0cnVlOwotICAgIGlmIChqal8zUl80MCgpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMzA4KCkgewotICAgIGlmIChqal9zY2FuX3Rva2VuKExQQVJFTikpIHJldHVybiB0cnVlOwotICAgIGlmIChqal8zUl8zMTYoKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oUlBBUkVOKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzgzKCkgewotICAgIGlmIChqal8zUl8xMjIoKSkgcmV0dXJuIHRydWU7Ci0gICAgVG9rZW4geHNwOwotICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICB4c3AgPSBqal9zY2FucG9zOwotICAgICAgaWYgKGpqXzNSXzEyMygpKSB7IGpqX3NjYW5wb3MgPSB4c3A7IGJyZWFrOyB9Ci0gICAgfQotICAgIHhzcCA9IGpqX3NjYW5wb3M7Ci0gICAgaWYgKGpqXzNSXzEyNCgpKSBqal9zY2FucG9zID0geHNwOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl84MigpIHsKLSAgICBpZiAoampfM1JfMTIwKCkpIHJldHVybiB0cnVlOwotICAgIFRva2VuIHhzcDsKLSAgICB4c3AgPSBqal9zY2FucG9zOwotICAgIGlmIChqal8zUl8xMjEoKSkgampfc2NhbnBvcyA9IHhzcDsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM18yKCkgewotICAgIGlmIChqal9zY2FuX3Rva2VuKExQQVJFTikpIHJldHVybiB0cnVlOwotICAgIGlmIChqal8zUl8zOSgpKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfc2Nhbl90b2tlbihSUEFSRU4pKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfNTAoKSB7Ci0gICAgVG9rZW4geHNwOwotICAgIHhzcCA9IGpqX3NjYW5wb3M7Ci0gICAgaWYgKGpqXzNSXzgyKCkpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal8zUl84MygpKSB7Ci0gICAgampfc2NhbnBvcyA9IHhzcDsKLSAgICBpZiAoampfM1JfODQoKSkgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMzE2KCkgewotICAgIFRva2VuIHhzcDsKLSAgICB4c3AgPSBqal9zY2FucG9zOwotICAgIGlmIChqal9zY2FuX3Rva2VuKDQzKSkgewotICAgIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oMjApKSB7Ci0gICAgampfc2NhbnBvcyA9IHhzcDsKLSAgICBpZiAoampfc2Nhbl90b2tlbig2NSkpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal9zY2FuX3Rva2VuKDY3KSkgewotICAgIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oNjYpKSB7Ci0gICAgampfc2NhbnBvcyA9IHhzcDsKLSAgICBpZiAoampfc2Nhbl90b2tlbig2OCkpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal9zY2FuX3Rva2VuKDcwKSkgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIH0KLSAgICB9Ci0gICAgfQotICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzI2NygpIHsKLSAgICBpZiAoampfc2Nhbl90b2tlbihDT01NQSkpIHJldHVybiB0cnVlOwotICAgIGlmIChqal8zUl8yNjYoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzEyNSgpIHsKLSAgICBpZiAoampfc2Nhbl90b2tlbihTVVBFUikpIHJldHVybiB0cnVlOwotICAgIFRva2VuIHhzcDsKLSAgICB4c3AgPSBqal9zY2FucG9zOwotICAgIGlmIChqal8zXzIoKSkgampfc2NhbnBvcyA9IHhzcDsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMjgyKCkgewotICAgIGlmIChqal8zUl81NSgpKSByZXR1cm4gdHJ1ZTsKLSAgICBUb2tlbiB4c3A7Ci0gICAgeHNwID0gampfc2NhbnBvczsKLSAgICBpZiAoampfM1JfMzA4KCkpIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzI2NigpIHsKLSAgICBpZiAoampfM1JfMzkoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzI0OCgpIHsKLSAgICBpZiAoampfM1JfMjYxKCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8yNzQoKSB7Ci0gICAgaWYgKGpqXzNSXzI4MigpKSByZXR1cm4gdHJ1ZTsKLSAgICBUb2tlbiB4c3A7Ci0gICAgeHNwID0gampfc2NhbnBvczsKLSAgICBpZiAoampfc2Nhbl90b2tlbig5NykpIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzI2MSgpIHsKLSAgICBpZiAoampfM1JfMjY2KCkpIHJldHVybiB0cnVlOwotICAgIFRva2VuIHhzcDsKLSAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgeHNwID0gampfc2NhbnBvczsKLSAgICAgIGlmIChqal8zUl8yNjcoKSkgeyBqal9zY2FucG9zID0geHNwOyBicmVhazsgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMjcwKCkgewotICAgIGlmIChqal8zUl8yNzQoKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oQ09NTUEpKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfM1JfMjc0KCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8yMjcoKSB7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oTEJSQUNLRVQpKSByZXR1cm4gdHJ1ZTsKLSAgICBUb2tlbiB4c3A7Ci0gICAgeHNwID0gampfc2NhbnBvczsKLSAgICBpZiAoampfM1JfMjQ4KCkpIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oUkJSQUNLRVQpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMjYwKCkgewotICAgIGlmIChqal9zY2FuX3Rva2VuKFVTRSkpIHJldHVybiB0cnVlOwotICAgIGlmIChqal8zUl8yNzAoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzE2MygpIHsKLSAgICBpZiAoampfc2Nhbl90b2tlbihJTVBPUlQpKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfM1JfNTUoKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oQVNTSUdOKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqXzNSXzUzKCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8yNzYoKSB7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oQ09NTUEpKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfM1JfMjY4KCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8yNzkoKSB7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oTFBBUkVOKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqXzNSXzM5KCkpIHJldHVybiB0cnVlOwotICAgIGlmIChqal9zY2FuX3Rva2VuKFJQQVJFTikpIHJldHVybiB0cnVlOwotICAgIFRva2VuIHhzcDsKLSAgICB4c3AgPSBqal9zY2FucG9zOwotICAgIGlmIChqal8zUl8yODgoKSkgampfc2NhbnBvcyA9IHhzcDsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMjc4KCkgewotICAgIGlmIChqal8zUl8xNTQoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzI1OSgpIHsKLSAgICBpZiAoampfc2Nhbl90b2tlbihJTkNMVURFKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oU1RSSU5HX0xJVEVSQUwpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMjcyKCkgewotICAgIFRva2VuIHhzcDsKLSAgICB4c3AgPSBqal9zY2FucG9zOwotICAgIGlmIChqal9zY2FuX3Rva2VuKDcwKSkgewotICAgIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oNjUpKSB7Ci0gICAgampfc2NhbnBvcyA9IHhzcDsKLSAgICBpZiAoampfM1JfMjc4KCkpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal8zUl8yNzkoKSkgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzI2OCgpIHsKLSAgICBpZiAoampfM1JfMjcyKCkpIHJldHVybiB0cnVlOwotICAgIGlmIChqal9zY2FuX3Rva2VuKENPTE9OKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqXzNSXzM5KCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8yNDkoKSB7Ci0gICAgaWYgKGpqXzNSXzI2MigpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMTMxKCkgewotICAgIFRva2VuIHhzcDsKLSAgICB4c3AgPSBqal9zY2FucG9zOwotICAgIGlmIChqal8zXzIzKCkpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal8zUl8xNjMoKSkgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zXzIzKCkgewotICAgIGlmIChqal9zY2FuX3Rva2VuKElNUE9SVCkpIHJldHVybiB0cnVlOwotICAgIGlmIChqal8zUl81MygpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMjYyKCkgewotICAgIGlmIChqal8zUl8yNjgoKSkgcmV0dXJuIHRydWU7Ci0gICAgVG9rZW4geHNwOwotICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICB4c3AgPSBqal9zY2FucG9zOwotICAgICAgaWYgKGpqXzNSXzI3NigpKSB7IGpqX3NjYW5wb3MgPSB4c3A7IGJyZWFrOyB9Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8yNTAoKSB7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oRlVOQ1RJT04pKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfM1JfNTUoKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqXzNSXzM4KCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8xMzQoKSB7Ci0gICAgVG9rZW4geHNwOwotICAgIHhzcCA9IGpqX3NjYW5wb3M7Ci0gICAgaWYgKGpqXzNSXzE2NSgpKSB7Ci0gICAgampfc2NhbnBvcyA9IHhzcDsKLSAgICBpZiAoampfc2Nhbl90b2tlbig0MykpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal9zY2FuX3Rva2VuKDIwKSkgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMTY1KCkgewotICAgIGlmIChqal8zUl8xMjAoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzEzMygpIHsKLSAgICBpZiAoampfc2Nhbl90b2tlbihVU0UpKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfc2Nhbl90b2tlbihOQU1FU1BBQ0UpKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfc2Nhbl90b2tlbihMUEFSRU4pKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfM1JfNjQoKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oUlBBUkVOKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzIyOCgpIHsKLSAgICBpZiAoampfc2Nhbl90b2tlbihMQlJBQ0UpKSByZXR1cm4gdHJ1ZTsKLSAgICBUb2tlbiB4c3A7Ci0gICAgeHNwID0gampfc2NhbnBvczsKLSAgICBpZiAoampfM1JfMjQ5KCkpIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oUkJSQUNFKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNfMSgpIHsKLSAgICBpZiAoampfc2Nhbl90b2tlbihGVU5DVElPTikpIHJldHVybiB0cnVlOwotICAgIGlmIChqal8zUl8zOCgpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMjI5KCkgewotICAgIFRva2VuIHhzcDsKLSAgICB4c3AgPSBqal9zY2FucG9zOwotICAgIGlmIChqal8zXzEoKSkgewotICAgIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqXzNSXzI1MCgpKSByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzkzKCkgewotICAgIGlmIChqal8zUl8xMzQoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzUyKCkgewotICAgIFRva2VuIHhzcDsKLSAgICBpZiAoampfM1JfOTMoKSkgcmV0dXJuIHRydWU7Ci0gICAgd2hpbGUgKHRydWUpIHsKLSAgICAgIHhzcCA9IGpqX3NjYW5wb3M7Ci0gICAgICBpZiAoampfM1JfOTMoKSkgeyBqal9zY2FucG9zID0geHNwOyBicmVhazsgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMjA4KCkgewotICAgIFRva2VuIHhzcDsKLSAgICB4c3AgPSBqal9zY2FucG9zOwotICAgIGlmIChqal9zY2FuX3Rva2VuKDM2KSkgewotICAgIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oNTkpKSB7Ci0gICAgampfc2NhbnBvcyA9IHhzcDsKLSAgICBpZiAoampfc2Nhbl90b2tlbigzNSkpIHJldHVybiB0cnVlOwotICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzkyKCkgewotICAgIGlmIChqal8zUl8xMzMoKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKHRydWUpIHsgampfbGEgPSAwOyBqal9zY2FucG9zID0gampfbGFzdHBvczsgcmV0dXJuIGZhbHNlO30KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMjQ2KCkgewotICAgIGlmIChqal8zUl8yNjAoKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKHRydWUpIHsgampfbGEgPSAwOyBqal9zY2FucG9zID0gampfbGFzdHBvczsgcmV0dXJuIGZhbHNlO30KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfOTEoKSB7Ci0gICAgaWYgKGpqXzNSXzEzMigpKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAodHJ1ZSkgeyBqal9sYSA9IDA7IGpqX3NjYW5wb3MgPSBqal9sYXN0cG9zOyByZXR1cm4gZmFsc2U7fQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8yNDUoKSB7Ci0gICAgaWYgKGpqXzNSXzI1OSgpKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAodHJ1ZSkgeyBqal9sYSA9IDA7IGpqX3NjYW5wb3MgPSBqal9sYXN0cG9zOyByZXR1cm4gZmFsc2U7fQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl85MCgpIHsKLSAgICBpZiAoampfM1JfMTMxKCkpIHJldHVybiB0cnVlOwotICAgIGlmICh0cnVlKSB7IGpqX2xhID0gMDsgampfc2NhbnBvcyA9IGpqX2xhc3Rwb3M7IHJldHVybiBmYWxzZTt9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzg5KCkgewotICAgIGlmIChqal8zUl8xMzAoKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKHRydWUpIHsgampfbGEgPSAwOyBqal9zY2FucG9zID0gampfbGFzdHBvczsgcmV0dXJuIGZhbHNlO30KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfODgoKSB7Ci0gICAgaWYgKGpqXzNSXzEyOSgpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfODcoKSB7Ci0gICAgaWYgKGpqXzNSXzEyOCgpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfODYoKSB7Ci0gICAgaWYgKGpqXzNSXzEyNygpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMjIzKCkgewotICAgIFRva2VuIHhzcDsKLSAgICB4c3AgPSBqal9zY2FucG9zOwotICAgIGlmIChqal8zUl8yNDQoKSkgewotICAgIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqXzNfMTkoKSkgewotICAgIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqXzNfMjAoKSkgewotICAgIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqXzNfMjEoKSkgewotICAgIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqXzNfMjIoKSkgewotICAgIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqXzNSXzI0NSgpKSB7Ci0gICAgampfc2NhbnBvcyA9IHhzcDsKLSAgICBpZiAoampfM1JfMjQ2KCkpIHJldHVybiB0cnVlOwotICAgIH0KLSAgICB9Ci0gICAgfQotICAgIH0KLSAgICB9Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8yNDQoKSB7Ci0gICAgaWYgKGpqXzNSXzIwMygpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfODUoKSB7Ci0gICAgaWYgKGpqXzNSXzEyNigpKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAodHJ1ZSkgeyBqal9sYSA9IDA7IGpqX3NjYW5wb3MgPSBqal9sYXN0cG9zOyByZXR1cm4gZmFsc2U7fQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl81MSgpIHsKLSAgICBUb2tlbiB4c3A7Ci0gICAgeHNwID0gampfc2NhbnBvczsKLSAgICBpZiAoampfM1JfODUoKSkgewotICAgIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqXzNSXzg2KCkpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal8zUl84NygpKSB7Ci0gICAgampfc2NhbnBvcyA9IHhzcDsKLSAgICBpZiAoampfM1JfODgoKSkgewotICAgIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqXzNSXzg5KCkpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal8zUl85MCgpKSB7Ci0gICAgampfc2NhbnBvcyA9IHhzcDsKLSAgICBpZiAoampfM1JfOTEoKSkgewotICAgIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqXzNSXzkyKCkpIHJldHVybiB0cnVlOwotICAgIH0KLSAgICB9Ci0gICAgfQotICAgIH0KLSAgICB9Ci0gICAgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMjEzKCkgewotICAgIGlmIChqal8zUl8yMjkoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzIxMigpIHsKLSAgICBpZiAoampfM1JfMjI4KCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8yMTEoKSB7Ci0gICAgaWYgKGpqXzNSXzIyNygpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMjEwKCkgewotICAgIGlmIChqal9zY2FuX3Rva2VuKExQQVJFTikpIHJldHVybiB0cnVlOwotICAgIGlmIChqal8zUl82NCgpKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfc2Nhbl90b2tlbihSUEFSRU4pKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM18yMigpIHsKLSAgICBpZiAoampfM1JfNTIoKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqXzNSXzUxKCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zXzIxKCkgewotICAgIGlmIChqal8zUl81MigpKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfc2Nhbl90b2tlbihMQlJBQ0UpKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfM1JfMTgzKCkpIHJldHVybiB0cnVlOwotICAgIGlmIChqal9zY2FuX3Rva2VuKFJCUkFDRSkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zXzIwKCkgewotICAgIGlmIChqal8zUl81MSgpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM18xOSgpIHsKLSAgICBpZiAoampfM1JfNDcoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzIwOSgpIHsKLSAgICBpZiAoampfc2Nhbl90b2tlbihRVUFMSUZJRVIpKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfM1JfNTUoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzIwMigpIHsKLSAgICBpZiAoampfM1JfMjIzKCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8xOTEoKSB7Ci0gICAgVG9rZW4geHNwOwotICAgIHhzcCA9IGpqX3NjYW5wb3M7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oMzMpKSB7Ci0gICAgampfc2NhbnBvcyA9IHhzcDsKLSAgICBpZiAoampfc2Nhbl90b2tlbig0MykpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal9zY2FuX3Rva2VuKDIwKSkgewotICAgIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oNjUpKSB7Ci0gICAgampfc2NhbnBvcyA9IHhzcDsKLSAgICBpZiAoampfc2Nhbl90b2tlbig2NykpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal9zY2FuX3Rva2VuKDY2KSkgewotICAgIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oNjgpKSB7Ci0gICAgampfc2NhbnBvcyA9IHhzcDsKLSAgICBpZiAoampfc2Nhbl90b2tlbig3MCkpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal9zY2FuX3Rva2VuKDQxKSkgewotICAgIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oNzcpKSB7Ci0gICAgampfc2NhbnBvcyA9IHhzcDsKLSAgICBpZiAoampfM1JfMjEwKCkpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal8zUl8yMTEoKSkgewotICAgIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqXzNSXzIxMigpKSB7Ci0gICAgampfc2NhbnBvcyA9IHhzcDsKLSAgICBpZiAoampfM1JfMjEzKCkpIHJldHVybiB0cnVlOwotICAgIH0KLSAgICB9Ci0gICAgfQotICAgIH0KLSAgICB9Ci0gICAgfQotICAgIH0KLSAgICB9Ci0gICAgfQotICAgIH0KLSAgICB9Ci0gICAgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMTgzKCkgewotICAgIFRva2VuIHhzcDsKLSAgICBpZiAoampfM1JfMjAyKCkpIHJldHVybiB0cnVlOwotICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICB4c3AgPSBqal9zY2FucG9zOwotICAgICAgaWYgKGpqXzNSXzIwMigpKSB7IGpqX3NjYW5wb3MgPSB4c3A7IGJyZWFrOyB9Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8xNDAoKSB7Ci0gICAgaWYgKGpqXzNSXzE3MCgpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMjA3KCkgewotICAgIGlmIChqal9zY2FuX3Rva2VuKFFVQUxJRklFUikpIHJldHVybiB0cnVlOwotICAgIGlmIChqal8zUl81NSgpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfOTgoKSB7Ci0gICAgVG9rZW4geHNwOwotICAgIHhzcCA9IGpqX3NjYW5wb3M7Ci0gICAgaWYgKGpqXzNSXzEzOSgpKSB7Ci0gICAgampfc2NhbnBvcyA9IHhzcDsKLSAgICBpZiAoampfM1JfMTQwKCkpIHJldHVybiB0cnVlOwotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMTM5KCkgewotICAgIGlmIChqal8zUl8xNTQoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzI5OSgpIHsKLSAgICBpZiAoampfc2Nhbl90b2tlbihGSU5BTExZKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqXzNSXzEwNSgpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMjk4KCkgewotICAgIGlmIChqal9zY2FuX3Rva2VuKENBVENIKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oTFBBUkVOKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqXzNSXzU1KCkpIHJldHVybiB0cnVlOwotICAgIGlmIChqal9zY2FuX3Rva2VuKFJQQVJFTikpIHJldHVybiB0cnVlOwotICAgIGlmIChqal8zUl8xMDUoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzExNygpIHsKLSAgICBpZiAoampfc2Nhbl90b2tlbihUUlkpKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfM1JfMTA1KCkpIHJldHVybiB0cnVlOwotICAgIFRva2VuIHhzcDsKLSAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgeHNwID0gampfc2NhbnBvczsKLSAgICAgIGlmIChqal8zUl8yOTgoKSkgeyBqal9zY2FucG9zID0geHNwOyBicmVhazsgfQotICAgIH0KLSAgICB4c3AgPSBqal9zY2FucG9zOwotICAgIGlmIChqal8zUl8yOTkoKSkgampfc2NhbnBvcyA9IHhzcDsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMTcwKCkgewotICAgIGlmIChqal9zY2FuX3Rva2VuKExQQVJFTikpIHJldHVybiB0cnVlOwotICAgIGlmIChqal8zUl8zOSgpKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfc2Nhbl90b2tlbihSUEFSRU4pKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfc2Nhbl90b2tlbihRVUFMSUZJRVIpKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfM1JfNTUoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzE5MCgpIHsKLSAgICBpZiAoampfM1JfMjA4KCkpIHJldHVybiB0cnVlOwotICAgIFRva2VuIHhzcDsKLSAgICB4c3AgPSBqal9zY2FucG9zOwotICAgIGlmIChqal8zUl8yMDkoKSkgampfc2NhbnBvcyA9IHhzcDsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMTUxKCkgewotICAgIGlmIChqal8zUl82NCgpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMTU0KCkgewotICAgIFRva2VuIHhzcDsKLSAgICB4c3AgPSBqal9zY2FucG9zOwotICAgIGlmIChqal8zUl8xODkoKSkgewotICAgIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqXzNSXzE5MCgpKSByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzE4OSgpIHsKLSAgICBpZiAoampfM1JfNTUoKSkgcmV0dXJuIHRydWU7Ci0gICAgVG9rZW4geHNwOwotICAgIHhzcCA9IGpqX3NjYW5wb3M7Ci0gICAgaWYgKGpqXzNSXzIwNygpKSBqal9zY2FucG9zID0geHNwOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8xMTYoKSB7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oVEhST1cpKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfM1JfNjQoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzExNSgpIHsKLSAgICBpZiAoampfc2Nhbl90b2tlbihSRVRVUk4pKSByZXR1cm4gdHJ1ZTsKLSAgICBUb2tlbiB4c3A7Ci0gICAgeHNwID0gampfc2NhbnBvczsKLSAgICBpZiAoampfM1JfMTUxKCkpIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzE1MCgpIHsKLSAgICBpZiAoampfM1JfNTUoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzU1KCkgewotICAgIFRva2VuIHhzcDsKLSAgICB4c3AgPSBqal9zY2FucG9zOwotICAgIGlmIChqal9zY2FuX3Rva2VuKDc4KSkgewotICAgIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oMjUpKSB7Ci0gICAgampfc2NhbnBvcyA9IHhzcDsKLSAgICBpZiAoampfc2Nhbl90b2tlbigzOCkpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal9zY2FuX3Rva2VuKDI4KSkgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzE0OSgpIHsKLSAgICBpZiAoampfM1JfNTUoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzExNCgpIHsKLSAgICBpZiAoampfc2Nhbl90b2tlbihCUkVBSykpIHJldHVybiB0cnVlOwotICAgIFRva2VuIHhzcDsKLSAgICB4c3AgPSBqal9zY2FucG9zOwotICAgIGlmIChqal8zUl8xNTAoKSkgampfc2NhbnBvcyA9IHhzcDsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMTEzKCkgewotICAgIGlmIChqal9zY2FuX3Rva2VuKENPTlRJTlVFKSkgcmV0dXJuIHRydWU7Ci0gICAgVG9rZW4geHNwOwotICAgIHhzcCA9IGpqX3NjYW5wb3M7Ci0gICAgaWYgKGpqXzNSXzE0OSgpKSBqal9zY2FucG9zID0geHNwOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl84MCgpIHsKLSAgICBpZiAoampfM1JfNTIoKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqXzNSXzExOCgpKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfM1JfMTE5KCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl83OSgpIHsKLSAgICBpZiAoampfM1JfMTE4KCkpIHJldHVybiB0cnVlOwotICAgIGlmIChqal8zUl8xMTkoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzExMigpIHsKLSAgICBpZiAoampfc2Nhbl90b2tlbihXSVRIKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oTFBBUkVOKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqXzNSXzQ2KCkpIHJldHVybiB0cnVlOwotICAgIGlmIChqal9zY2FuX3Rva2VuKFJQQVJFTikpIHJldHVybiB0cnVlOwotICAgIGlmIChqal8zUl8xNDYoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzE5NSgpIHsKLSAgICBpZiAoampfM1JfMjE1KCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8yMzgoKSB7Ci0gICAgaWYgKGpqXzNSXzUyKCkpIHJldHVybiB0cnVlOwotICAgIGlmIChqal8zUl8yNTMoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzIzNygpIHsKLSAgICBpZiAoampfM1JfMjUzKCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8zMDMoKSB7Ci0gICAgaWYgKGpqXzNSXzY0KCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8zMDIoKSB7Ci0gICAgaWYgKGpqXzNSXzY0KCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zXzE4KCkgewotICAgIGlmIChqal8zUl81MCgpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfNDgoKSB7Ci0gICAgVG9rZW4geHNwOwotICAgIHhzcCA9IGpqX3NjYW5wb3M7Ci0gICAgaWYgKGpqXzNfMTgoKSkgewotICAgIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqXzNSXzc5KCkpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal8zUl84MCgpKSByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8xNDgoKSB7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oRk9SKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oTFBBUkVOKSkgcmV0dXJuIHRydWU7Ci0gICAgVG9rZW4geHNwOwotICAgIHhzcCA9IGpqX3NjYW5wb3M7Ci0gICAgaWYgKGpqXzNSXzE5NSgpKSBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal9zY2FuX3Rva2VuKFNFTUlDT0xPTikpIHJldHVybiB0cnVlOwotICAgIHhzcCA9IGpqX3NjYW5wb3M7Ci0gICAgaWYgKGpqXzNSXzMwMigpKSBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal9zY2FuX3Rva2VuKFNFTUlDT0xPTikpIHJldHVybiB0cnVlOwotICAgIHhzcCA9IGpqX3NjYW5wb3M7Ci0gICAgaWYgKGpqXzNSXzMwMygpKSBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal9zY2FuX3Rva2VuKFJQQVJFTikpIHJldHVybiB0cnVlOwotICAgIGlmIChqal8zUl8xNDYoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNfMTcoKSB7Ci0gICAgaWYgKGpqXzNSXzQ5KCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8yMTUoKSB7Ci0gICAgVG9rZW4geHNwOwotICAgIHhzcCA9IGpqX3NjYW5wb3M7Ci0gICAgaWYgKGpqXzNfMTcoKSkgewotICAgIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqXzNSXzIzNygpKSB7Ci0gICAgampfc2NhbnBvcyA9IHhzcDsKLSAgICBpZiAoampfM1JfMjM4KCkpIHJldHVybiB0cnVlOwotICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNfMTYoKSB7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oRk9SKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oTFBBUkVOKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqXzNSXzQ4KCkpIHJldHVybiB0cnVlOwotICAgIGlmIChqal9zY2FuX3Rva2VuKElOKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzExMSgpIHsKLSAgICBUb2tlbiB4c3A7Ci0gICAgeHNwID0gampfc2NhbnBvczsKLSAgICBpZiAoampfM1JfMTQ3KCkpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal8zUl8xNDgoKSkgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8xNDcoKSB7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oRk9SKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oTFBBUkVOKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqXzNSXzQ4KCkpIHJldHVybiB0cnVlOwotICAgIGlmIChqal9zY2FuX3Rva2VuKElOKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqXzNSXzY0KCkpIHJldHVybiB0cnVlOwotICAgIGlmIChqal9zY2FuX3Rva2VuKFJQQVJFTikpIHJldHVybiB0cnVlOwotICAgIGlmIChqal8zUl8xNDYoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzExMCgpIHsKLSAgICBpZiAoampfc2Nhbl90b2tlbihXSElMRSkpIHJldHVybiB0cnVlOwotICAgIGlmIChqal9zY2FuX3Rva2VuKExQQVJFTikpIHJldHVybiB0cnVlOwotICAgIGlmIChqal8zUl82NCgpKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfc2Nhbl90b2tlbihSUEFSRU4pKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfM1JfMTQ2KCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8xMDkoKSB7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oRE8pKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfM1JfMTQ2KCkpIHJldHVybiB0cnVlOwotICAgIGlmIChqal9zY2FuX3Rva2VuKFdISUxFKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oTFBBUkVOKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqXzNSXzY0KCkpIHJldHVybiB0cnVlOwotICAgIGlmIChqal9zY2FuX3Rva2VuKFJQQVJFTikpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8zMTkoKSB7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oX0RFRkFVTFQpKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfc2Nhbl90b2tlbihDT0xPTikpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8zMTgoKSB7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oQ0FTRSkpIHJldHVybiB0cnVlOwotICAgIGlmIChqal8zUl82NCgpKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfc2Nhbl90b2tlbihDT0xPTikpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8zMTEoKSB7Ci0gICAgaWYgKGpqXzNSXzMyMCgpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMzEwKCkgewotICAgIFRva2VuIHhzcDsKLSAgICB4c3AgPSBqal9zY2FucG9zOwotICAgIGlmIChqal8zUl8zMTgoKSkgewotICAgIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqXzNSXzMxOSgpKSByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzI5NygpIHsKLSAgICBpZiAoampfM1JfMzAxKCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8zMjYoKSB7Ci0gICAgaWYgKGpqXzNSXzMxMCgpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMzI1KCkgewotICAgIGlmIChqal8zUl8yMjMoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzMyMCgpIHsKLSAgICBUb2tlbiB4c3A7Ci0gICAgeHNwID0gampfc2NhbnBvczsKLSAgICBpZiAoampfM1JfMzI1KCkpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal8zUl8zMjYoKSkgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8zMDEoKSB7Ci0gICAgaWYgKGpqXzNSXzMxMCgpKSByZXR1cm4gdHJ1ZTsKLSAgICBUb2tlbiB4c3A7Ci0gICAgd2hpbGUgKHRydWUpIHsKLSAgICAgIHhzcCA9IGpqX3NjYW5wb3M7Ci0gICAgICBpZiAoampfM1JfMzExKCkpIHsgampfc2NhbnBvcyA9IHhzcDsgYnJlYWs7IH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzEwOCgpIHsKLSAgICBpZiAoampfc2Nhbl90b2tlbihTV0lUQ0gpKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfc2Nhbl90b2tlbihMUEFSRU4pKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfM1JfNjQoKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oUlBBUkVOKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oTEJSQUNFKSkgcmV0dXJuIHRydWU7Ci0gICAgVG9rZW4geHNwOwotICAgIHhzcCA9IGpqX3NjYW5wb3M7Ci0gICAgaWYgKGpqXzNSXzI5NygpKSBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal9zY2FuX3Rva2VuKFJCUkFDRSkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8yOTYoKSB7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oRUxTRSkpIHJldHVybiB0cnVlOwotICAgIGlmIChqal8zUl8xNDYoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzEwNygpIHsKLSAgICBpZiAoampfc2Nhbl90b2tlbihJRikpIHJldHVybiB0cnVlOwotICAgIGlmIChqal9zY2FuX3Rva2VuKExQQVJFTikpIHJldHVybiB0cnVlOwotICAgIGlmIChqal8zUl82NCgpKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfc2Nhbl90b2tlbihSUEFSRU4pKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfM1JfMTQ2KCkpIHJldHVybiB0cnVlOwotICAgIFRva2VuIHhzcDsKLSAgICB4c3AgPSBqal9zY2FucG9zOwotICAgIGlmIChqal8zUl8yOTYoKSkgampfc2NhbnBvcyA9IHhzcDsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMTQ1KCkgewotICAgIGlmIChqal8zUl8xODMoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzEwNigpIHsKLSAgICBpZiAoampfM1JfNTUoKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oQ09MT04pKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfM1JfMTQ2KCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8xMDUoKSB7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oTEJSQUNFKSkgcmV0dXJuIHRydWU7Ci0gICAgVG9rZW4geHNwOwotICAgIHhzcCA9IGpqX3NjYW5wb3M7Ci0gICAgaWYgKGpqXzNSXzE0NSgpKSBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal9zY2FuX3Rva2VuKFJCUkFDRSkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8xMDQoKSB7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oU1VQRVIpKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfM1JfNDEoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzQ2KCkgewotICAgIGlmIChqal8zUl82NCgpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMjAzKCkgewotICAgIGlmIChqal9zY2FuX3Rva2VuKFNFTUlDT0xPTikpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8xODYoKSB7Ci0gICAgaWYgKGpqXzNSXzUyKCkpIHJldHVybiB0cnVlOwotICAgIGlmIChqal9zY2FuX3Rva2VuKExCUkFDRSkpIHJldHVybiB0cnVlOwotICAgIGlmIChqal8zUl8zMDkoKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oUkJSQUNFKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzE4NSgpIHsKLSAgICBpZiAoampfM1JfMjA0KCkpIHJldHVybiB0cnVlOwotICAgIGlmICh0cnVlKSB7IGpqX2xhID0gMDsgampfc2NhbnBvcyA9IGpqX2xhc3Rwb3M7IHJldHVybiBmYWxzZTt9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzE0NigpIHsKLSAgICBUb2tlbiB4c3A7Ci0gICAgeHNwID0gampfc2NhbnBvczsKLSAgICBpZiAoampfM1JfMTg0KCkpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal8zXzE1KCkpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal8zUl8xODUoKSkgewotICAgIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqXzNSXzE4NigpKSByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMTg0KCkgewotICAgIGlmIChqal8zUl8yMDMoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzMxNygpIHsKLSAgICBpZiAoampfM1JfMTQ2KCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8zMDkoKSB7Ci0gICAgVG9rZW4geHNwOwotICAgIGlmIChqal8zUl8zMTcoKSkgcmV0dXJuIHRydWU7Ci0gICAgd2hpbGUgKHRydWUpIHsKLSAgICAgIHhzcCA9IGpqX3NjYW5wb3M7Ci0gICAgICBpZiAoampfM1JfMzE3KCkpIHsgampfc2NhbnBvcyA9IHhzcDsgYnJlYWs7IH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzc4KCkgewotICAgIGlmIChqal8zUl8xMTcoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzc3KCkgewotICAgIGlmIChqal8zUl8xMTYoKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKHRydWUpIHsgampfbGEgPSAwOyBqal9zY2FucG9zID0gampfbGFzdHBvczsgcmV0dXJuIGZhbHNlO30KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfNzYoKSB7Ci0gICAgaWYgKGpqXzNSXzExNSgpKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAodHJ1ZSkgeyBqal9sYSA9IDA7IGpqX3NjYW5wb3MgPSBqal9sYXN0cG9zOyByZXR1cm4gZmFsc2U7fQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl83NSgpIHsKLSAgICBpZiAoampfM1JfMTE0KCkpIHJldHVybiB0cnVlOwotICAgIGlmICh0cnVlKSB7IGpqX2xhID0gMDsgampfc2NhbnBvcyA9IGpqX2xhc3Rwb3M7IHJldHVybiBmYWxzZTt9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzc0KCkgewotICAgIGlmIChqal8zUl8xMTMoKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKHRydWUpIHsgampfbGEgPSAwOyBqal9zY2FucG9zID0gampfbGFzdHBvczsgcmV0dXJuIGZhbHNlO30KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfNzMoKSB7Ci0gICAgaWYgKGpqXzNSXzExMigpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM18xNSgpIHsKLSAgICBpZiAoampfM1JfNDcoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzcyKCkgewotICAgIGlmIChqal8zUl8xMTEoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzcxKCkgewotICAgIGlmIChqal8zUl8xMTAoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzMyMygpIHsKLSAgICBpZiAoampfc2Nhbl90b2tlbihDT01NQSkpIHJldHVybiB0cnVlOwotICAgIGlmIChqal8zUl8yOTEoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzcwKCkgewotICAgIGlmIChqal8zUl8xMDkoKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKHRydWUpIHsgampfbGEgPSAwOyBqal9zY2FucG9zID0gampfbGFzdHBvczsgcmV0dXJuIGZhbHNlO30KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfNjkoKSB7Ci0gICAgaWYgKGpqXzNSXzEwOCgpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfNjgoKSB7Ci0gICAgaWYgKGpqXzNSXzEwNygpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfNjcoKSB7Ci0gICAgaWYgKGpqXzNSXzEwNigpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfNjYoKSB7Ci0gICAgaWYgKGpqXzNSXzEwNSgpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfNjUoKSB7Ci0gICAgaWYgKGpqXzNSXzEwNCgpKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAodHJ1ZSkgeyBqal9sYSA9IDA7IGpqX3NjYW5wb3MgPSBqal9sYXN0cG9zOyByZXR1cm4gZmFsc2U7fQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zXzE0KCkgewotICAgIGlmIChqal8zUl80NigpKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAodHJ1ZSkgeyBqal9sYSA9IDA7IGpqX3NjYW5wb3MgPSBqal9sYXN0cG9zOyByZXR1cm4gZmFsc2U7fQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl80NygpIHsKLSAgICBUb2tlbiB4c3A7Ci0gICAgeHNwID0gampfc2NhbnBvczsKLSAgICBpZiAoampfM18xNCgpKSB7Ci0gICAgampfc2NhbnBvcyA9IHhzcDsKLSAgICBpZiAoampfM1JfNjUoKSkgewotICAgIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqXzNSXzY2KCkpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal8zUl82NygpKSB7Ci0gICAgampfc2NhbnBvcyA9IHhzcDsKLSAgICBpZiAoampfM1JfNjgoKSkgewotICAgIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqXzNSXzY5KCkpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal8zUl83MCgpKSB7Ci0gICAgampfc2NhbnBvcyA9IHhzcDsKLSAgICBpZiAoampfM1JfNzEoKSkgewotICAgIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqXzNSXzcyKCkpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal8zUl83MygpKSB7Ci0gICAgampfc2NhbnBvcyA9IHhzcDsKLSAgICBpZiAoampfM1JfNzQoKSkgewotICAgIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqXzNSXzc1KCkpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal8zUl83NigpKSB7Ci0gICAgampfc2NhbnBvcyA9IHhzcDsKLSAgICBpZiAoampfM1JfNzcoKSkgewotICAgIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqXzNSXzc4KCkpIHJldHVybiB0cnVlOwotICAgIH0KLSAgICB9Ci0gICAgfQotICAgIH0KLSAgICB9Ci0gICAgfQotICAgIH0KLSAgICB9Ci0gICAgfQotICAgIH0KLSAgICB9Ci0gICAgfQotICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzgxKCkgewotICAgIGlmIChqal9zY2FuX3Rva2VuKENPTU1BKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqXzNSXzQ1KCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8zMTUoKSB7Ci0gICAgaWYgKGpqXzNSXzI5MSgpKSByZXR1cm4gdHJ1ZTsKLSAgICBUb2tlbiB4c3A7Ci0gICAgd2hpbGUgKHRydWUpIHsKLSAgICAgIHhzcCA9IGpqX3NjYW5wb3M7Ci0gICAgICBpZiAoampfM1JfMzIzKCkpIHsgampfc2NhbnBvcyA9IHhzcDsgYnJlYWs7IH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzEwMygpIHsKLSAgICBpZiAoampfc2Nhbl90b2tlbihDT01NQSkpIHJldHVybiB0cnVlOwotICAgIGlmIChqal8zUl8zOSgpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMjA1KCkgewotICAgIGlmIChqal8zUl8yMjUoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNfMTMoKSB7Ci0gICAgaWYgKGpqXzNSXzQ0KCkpIHJldHVybiB0cnVlOwotICAgIGlmIChqal8zUl80NSgpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMjg2KCkgewotICAgIGlmIChqal8zUl8yOTEoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNfMTIoKSB7Ci0gICAgaWYgKGpqXzNSXzQ0KCkpIHJldHVybiB0cnVlOwotICAgIGlmIChqal8zUl8zOSgpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfNDkoKSB7Ci0gICAgaWYgKGpqXzNSXzQ1KCkpIHJldHVybiB0cnVlOwotICAgIFRva2VuIHhzcDsKLSAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgeHNwID0gampfc2NhbnBvczsKLSAgICAgIGlmIChqal8zUl84MSgpKSB7IGpqX3NjYW5wb3MgPSB4c3A7IGJyZWFrOyB9Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl82NCgpIHsKLSAgICBpZiAoampfM1JfMzkoKSkgcmV0dXJuIHRydWU7Ci0gICAgVG9rZW4geHNwOwotICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICB4c3AgPSBqal9zY2FucG9zOwotICAgICAgaWYgKGpqXzNSXzEwMygpKSB7IGpqX3NjYW5wb3MgPSB4c3A7IGJyZWFrOyB9Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl80NSgpIHsKLSAgICBpZiAoampfM1JfNjMoKSkgcmV0dXJuIHRydWU7Ci0gICAgVG9rZW4geHNwOwotICAgIHhzcCA9IGpqX3NjYW5wb3M7Ci0gICAgaWYgKGpqXzNfMTMoKSkgampfc2NhbnBvcyA9IHhzcDsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMzkoKSB7Ci0gICAgaWYgKGpqXzNSXzU2KCkpIHJldHVybiB0cnVlOwotICAgIFRva2VuIHhzcDsKLSAgICB4c3AgPSBqal9zY2FucG9zOwotICAgIGlmIChqal8zXzEyKCkpIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzI0NygpIHsKLSAgICBpZiAoampfc2Nhbl90b2tlbihIT09LKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqXzNSXzIyNSgpKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfc2Nhbl90b2tlbihDT0xPTikpIHJldHVybiB0cnVlOwotICAgIGlmIChqal8zUl8yMjUoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzI5NCgpIHsKLSAgICBpZiAoampfc2Nhbl90b2tlbihIT09LKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqXzNSXzI5MSgpKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfc2Nhbl90b2tlbihDT0xPTikpIHJldHVybiB0cnVlOwotICAgIGlmIChqal8zUl8yOTEoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzEzNigpIHsKLSAgICBpZiAoampfc2Nhbl90b2tlbihIT09LKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqXzNSXzQ1KCkpIHJldHVybiB0cnVlOwotICAgIGlmIChqal9zY2FuX3Rva2VuKENPTE9OKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqXzNSXzQ1KCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl80NCgpIHsKLSAgICBUb2tlbiB4c3A7Ci0gICAgeHNwID0gampfc2NhbnBvczsKLSAgICBpZiAoampfc2Nhbl90b2tlbig5MikpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal9zY2FuX3Rva2VuKDEyMSkpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal9zY2FuX3Rva2VuKDEyMikpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal9zY2FuX3Rva2VuKDEyNikpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal9zY2FuX3Rva2VuKDExOSkpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal9zY2FuX3Rva2VuKDEyMCkpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal9zY2FuX3Rva2VuKDEyNykpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal9zY2FuX3Rva2VuKDEyOCkpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal9zY2FuX3Rva2VuKDEyOSkpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal9zY2FuX3Rva2VuKDEyMykpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal9zY2FuX3Rva2VuKDEyNSkpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal9zY2FuX3Rva2VuKDEyNCkpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal9zY2FuX3Rva2VuKDEzMSkpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal9zY2FuX3Rva2VuKDEzMikpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal9zY2FuX3Rva2VuKDEzMCkpIHJldHVybiB0cnVlOwotICAgIH0KLSAgICB9Ci0gICAgfQotICAgIH0KLSAgICB9Ci0gICAgfQotICAgIH0KLSAgICB9Ci0gICAgfQotICAgIH0KLSAgICB9Ci0gICAgfQotICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzk3KCkgewotICAgIGlmIChqal9zY2FuX3Rva2VuKEhPT0spKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfM1JfMzkoKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oQ09MT04pKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfM1JfMzkoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzIyNSgpIHsKLSAgICBpZiAoampfM1JfMTAyKCkpIHJldHVybiB0cnVlOwotICAgIFRva2VuIHhzcDsKLSAgICB4c3AgPSBqal9zY2FucG9zOwotICAgIGlmIChqal8zUl8yNDcoKSkgampfc2NhbnBvcyA9IHhzcDsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMTY3KCkgewotICAgIGlmIChqal9zY2FuX3Rva2VuKFNDX09SKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqXzNSXzE0NCgpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMjkxKCkgewotICAgIGlmIChqal8zUl85NigpKSByZXR1cm4gdHJ1ZTsKLSAgICBUb2tlbiB4c3A7Ci0gICAgeHNwID0gampfc2NhbnBvczsKLSAgICBpZiAoampfM1JfMjk0KCkpIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzEzOCgpIHsKLSAgICBpZiAoampfc2Nhbl90b2tlbihTQ19PUikpIHJldHVybiB0cnVlOwotICAgIGlmIChqal8zUl8xMzcoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzYzKCkgewotICAgIGlmIChqal8zUl8xMDIoKSkgcmV0dXJuIHRydWU7Ci0gICAgVG9rZW4geHNwOwotICAgIHhzcCA9IGpqX3NjYW5wb3M7Ci0gICAgaWYgKGpqXzNSXzEzNigpKSBqal9zY2FucG9zID0geHNwOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8xOTgoKSB7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oU0NfQU5EKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqXzNSXzE4MigpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfNTYoKSB7Ci0gICAgaWYgKGpqXzNSXzk2KCkpIHJldHVybiB0cnVlOwotICAgIFRva2VuIHhzcDsKLSAgICB4c3AgPSBqal9zY2FucG9zOwotICAgIGlmIChqal8zUl85NygpKSBqal9zY2FucG9zID0geHNwOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8xNjkoKSB7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oU0NfQU5EKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqXzNSXzE2OCgpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMjE4KCkgewotICAgIGlmIChqal8zUl8yMjEoKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqXzNSXzIwMSgpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMTAyKCkgewotICAgIGlmIChqal8zUl8xNDQoKSkgcmV0dXJuIHRydWU7Ci0gICAgVG9rZW4geHNwOwotICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICB4c3AgPSBqal9zY2FucG9zOwotICAgICAgaWYgKGpqXzNSXzE2NygpKSB7IGpqX3NjYW5wb3MgPSB4c3A7IGJyZWFrOyB9Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl85NigpIHsKLSAgICBpZiAoampfM1JfMTM3KCkpIHJldHVybiB0cnVlOwotICAgIFRva2VuIHhzcDsKLSAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgeHNwID0gampfc2NhbnBvczsKLSAgICAgIGlmIChqal8zUl8xMzgoKSkgeyBqal9zY2FucG9zID0geHNwOyBicmVhazsgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMjAwKCkgewotICAgIGlmIChqal8zUl8yMjEoKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqXzNSXzE5OSgpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBwdWJsaWMgSlNQYXJzZXIyMFRva2VuTWFuYWdlciB0b2tlbl9zb3VyY2U7Ci0gIFNpbXBsZUNoYXJTdHJlYW0gampfaW5wdXRfc3RyZWFtOwotICBwdWJsaWMgVG9rZW4gdG9rZW4sIGpqX250OwotICBwcml2YXRlIGludCBqal9udGs7Ci0gIHByaXZhdGUgVG9rZW4gampfc2NhbnBvcywgampfbGFzdHBvczsKLSAgcHJpdmF0ZSBpbnQgampfbGE7Ci0gIHB1YmxpYyBib29sZWFuIGxvb2tpbmdBaGVhZCA9IGZhbHNlOwotICBwcml2YXRlIGJvb2xlYW4gampfc2VtTEE7Ci0gIHByaXZhdGUgaW50IGpqX2dlbjsKLSAgZmluYWwgcHJpdmF0ZSBpbnRbXSBqal9sYTEgPSBuZXcgaW50WzEyMl07Ci0gIHN0YXRpYyBwcml2YXRlIGludFtdIGpqX2xhMV8wOwotICBzdGF0aWMgcHJpdmF0ZSBpbnRbXSBqal9sYTFfMTsKLSAgc3RhdGljIHByaXZhdGUgaW50W10gampfbGExXzI7Ci0gIHN0YXRpYyBwcml2YXRlIGludFtdIGpqX2xhMV8zOwotICBzdGF0aWMgcHJpdmF0ZSBpbnRbXSBqal9sYTFfNDsKLSAgc3RhdGljIHsKLSAgICAgIGpqX2xhMV8wKCk7Ci0gICAgICBqal9sYTFfMSgpOwotICAgICAgampfbGExXzIoKTsKLSAgICAgIGpqX2xhMV8zKCk7Ci0gICAgICBqal9sYTFfNCgpOwotICAgfQotICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBqal9sYTFfMCgpIHsKLSAgICAgIGpqX2xhMV8wID0gbmV3IGludFtdIHsweDAsMHg5NmQzNzIwMCwweDEyMDAwMDAwLDB4MCwweDAsMHgxMjAwMDAwMCwweDEyMDAwMDAwLDB4OTAwMDAwLDB4MCwweDgwMDAwMCwweDEyMDAwMDAwLDB4MCwweDAsMHgxMjAwMDAwMCwweDEyOTEwMDAwLDB4MCwweDAsMHgwLDB4MCwweDEyOTAwMDAwLDB4MCwweDkwMDAwMCwweDEzOTAwMDAwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDEyOTEwMDAwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4NDAwMDAxMDAsMHg2ODAwMDEwMCwweDYwMDAwMTAwLDB4NjAwMDAxMDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgxNjQyNDIwMCwweDAsMHgxMjEwMDAwMCwweDE2ZDM0MjAwLDB4OTZkMzcyMDAsMHg0MDAwMCwweDg0MDAsMHg5NmQzZjYwMCwweDk2ZDNmNjAwLDB4ODQwMCwweDEyOTEyMDAwLDB4MTI5MTAwMDAsMHgxMjkxMDAwMCwweDQwMDAwMCwweDEyMTAyMDAwLDB4MTIxMDIwMDAsMHgxMjAwMDAwMCwweDEyMDAwMDAwLDB4MTI5MTAwMDAsMHg4MDAsMHgyMDAwMDAsMHg5NmQzNzIwMCwweDAsMHgxMDAwMDAwMCwweDgwODAzMDAwLDB4MTIxMDAwMDAsMHgxMjEwMDAwMCwweDAsMHgwLDB4MCwweDEwMDAwMCwweDAsMHgxMjAwMDAwMCwweDIwMDAsMHgwLDB4MCwweDAsMHgwLDB4MTIxMDAwMDAsMHgxMjEwMDAwMCwweDAsMHgwLDB4MCwweDEyMDAwMDAwLDB4MTIwMDIwMDAsMHgwLDB4MCwweDAsMHgxMjAwMjAwMCwweDIwMDAsMHgwLDB4MjAwMCwweDgwMDAwLDB4ODAwMDAsMHgwLDB4MCwweDgwMDAwLDB4MTIwMDAwMDAsMHgxMjAwMDAwMCwweDAsfTsKLSAgIH0KLSAgIHByaXZhdGUgc3RhdGljIHZvaWQgampfbGExXzEoKSB7Ci0gICAgICBqal9sYTFfMSA9IG5ldyBpbnRbXSB7MHg0LDB4YTQ3ZmZmYiwweDQwLDB4MCwweDAsMHg4MDAwMDU4LDB4ODAwMDA1OCwweGEwMiwweDgwMDAwMTgsMHgwLDB4ODAwMDA1OCwweDAsMHgwLDB4ODAwMDA1OCwweDgwMTJhZGIsMHgwLDB4MCwweDAsMHgwLDB4ODAwMGFkYiwweDAsMHhhMDMsMHg4MDAwYWRiLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDgwMTJhZGIsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4NjE1ZTAsMHgwLDB4ODAwODg1OCwweDgwN2JmZmIsMHhhNDdmZmZiLDB4MCwweDAsMHhhNDdmZmZiLDB4YTQ3ZmZmYiwweDAsMHg4MDFhYWRiLDB4ODAxMmFkYiwweDgwMTJhZGIsMHgwLDB4ODAwODg1OCwweDgwMDg4NTgsMHg0MCwweDQwLDB4ODAxMmFkYiwweDAsMHgwLDB4YTQ3ZmZmYiwweDAsMHg0MDAwLDB4MjQwYzAwMCwweDgwMDA4NTgsMHg4MDAwODU4LDB4MCwweDAsMHgwLDB4ODAwLDB4MCwweDQwLDB4ODAwMCwweDAsMHgwLDB4MCwweDAsMHg4MDAwODU4LDB4ODAwMDg1OCwweDAsMHgwLDB4MCwweDQwLDB4NDAsMHgwLDB4MCwweDAsMHg0MCwweDAsMHgwLDB4MCwweDEwMDAwMDAsMHgwLDB4MjAwMDAwMCwweDEwMDAwMDAsMHgxMDAwMDAwLDB4NDAsMHg0MCwweDAsfTsKLSAgIH0KLSAgIHByaXZhdGUgc3RhdGljIHZvaWQgampfbGExXzIoKSB7Ci0gICAgICBqal9sYTFfMiA9IG5ldyBpbnRbXSB7MHgwLDB4ODBhYTYwNWYsMHg0MDAwLDB4NDAwMDAwMCwweDQwMDAwMDAsMHg0MDAwLDB4MjQwMDAsMHgyYTIwNWUsMHgwLDB4MCwweDI0MDQyLDB4MTAwMDAwMCwweDQwMDAwMDAsMHgyNDA0MiwweDgwMmE2MDVlLDB4MTAwMDAwMCwweDAsMHgyMjIwMDAwLDB4MCwweDJhNjA1ZSwweDIyMjAwMDAsMHgyYTIwNWUsMHgyYTYwNWUsMHgwLDB4MjIyMDAwMCwweDgwMDAwMDAsMHgyMDAwMDAwLDB4MjAwMDAwLDB4ODAwMDAwMCwweDIwMDAwLDB4ODAyYTYwNWUsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHg2MDAwMDAwMCwweDYwMDAwMDAwLDB4NjAwMDAwMDAsMHg2MDAwMDAwMCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MTAwMDAwMDAsMHgxMDAwMDAwLDB4MTAwMDAwMCwweDEwMDAwMDAsMHg4NDAwMCwweDgwMDAwMCwweDQwMDAsMHg4MGFhNjA1ZSwweDgwYWE2MDVmLDB4MCwweDAsMHg4MGFhNjA1ZiwweDgwYWE2MDVmLDB4MCwweDgwMmE2MDVlLDB4ODAyYTYwNWUsMHg4MDJhNjA1ZSwweDAsMHg0MDAwLDB4NDAwMCwweDQwMDAsMHg0MDAwLDB4ODAyYTYwNWUsMHgwLDB4MCwweDgwYWE2MDVmLDB4ODAwMDAwLDB4MCwweDEsMHg0MDAwLDB4NDAwMCwweDEsMHgwLDB4MjAwMDAsMHg1ZSwweDEwMDAwMDAsMHg0MDAwLDB4MCwweDEwMDAwMDAsMHgxMDAwMDAwLDB4MTAwMDAwMDAsMHgxMDAwMDAwMCwweDQwMDAsMHg0MDAwLDB4MCwweDAsMHgxMDAwMDAwLDB4NDAwMCwweDgwMDQwMDAsMHgwLDB4MTAwMDAwMCwweDgwMDAwMDAsMHg4MDA0MDAwLDB4MCwweDEwMDAwMDAwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4NDA0MCwweDQwNDAsMHgyMDAwMDAwLH07Ci0gICB9Ci0gICBwcml2YXRlIHN0YXRpYyB2b2lkIGpqX2xhMV8zKCkgewotICAgICAgampfbGExXzMgPSBuZXcgaW50W10gezB4MCwweDNjMDEsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgzYzAxLDB4MCwweGMwMCwweDAsMHhjMDAsMHgwLDB4MCwweDAsMHgwLDB4YzAwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4M2MwMSwweDhjMDAwLDB4OGMwMDAsMHgzMDAwLDB4MzAwMCwweDcwMDAwMCwweDcwMDAwMCwweDMwLDB4MzAsMHgzMCwweDMwLDB4NDgsMHg0OCwweDQ4LDB4MTAwMDAsMHgxMDAwMCwweDQwMDAwLDB4NDAwMDAsMHgyMDAwMCwweDIwMDAwLDB4MTAwLDB4MTAwLDB4ODAsMHg4MCwweDIsMHgyLDB4MiwweDIsMHhmZjgwMDAwMCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDNjMDEsMHgzYzAxLDB4MCwweDAsMHgzYzAxLDB4M2MwMSwweDAsMHgzYzAxLDB4M2MwMSwweDNjMDEsMHgwLDB4MCwweDAsMHgwLDB4MCwweDNjMDEsMHgwLDB4MCwweDNjMDEsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgyLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHg0LDB4NCwweDAsMHgwLDB4MCwweDQsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCx9OwotICAgfQotICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBqal9sYTFfNCgpIHsKLSAgICAgIGpqX2xhMV80ID0gbmV3IGludFtdIHsweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4NjAsMHg2MCwweDYwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgxZiwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCx9OwotICAgfQotICBmaW5hbCBwcml2YXRlIEpKQ2FsbHNbXSBqal8yX3J0bnMgPSBuZXcgSkpDYWxsc1syOV07Ci0gIHByaXZhdGUgYm9vbGVhbiBqal9yZXNjYW4gPSBmYWxzZTsKLSAgcHJpdmF0ZSBpbnQgampfZ2MgPSAwOwotCi0gIHB1YmxpYyBKU1BhcnNlcjIwKGphdmEuaW8uSW5wdXRTdHJlYW0gc3RyZWFtKSB7Ci0gICAgIHRoaXMoc3RyZWFtLCBudWxsKTsKLSAgfQotICBwdWJsaWMgSlNQYXJzZXIyMChqYXZhLmlvLklucHV0U3RyZWFtIHN0cmVhbSwgU3RyaW5nIGVuY29kaW5nKSB7Ci0gICAgdHJ5IHsgampfaW5wdXRfc3RyZWFtID0gbmV3IFNpbXBsZUNoYXJTdHJlYW0oc3RyZWFtLCBlbmNvZGluZywgMSwgMSk7IH0gY2F0Y2goamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7IH0KLSAgICB0b2tlbl9zb3VyY2UgPSBuZXcgSlNQYXJzZXIyMFRva2VuTWFuYWdlcihqal9pbnB1dF9zdHJlYW0pOwotICAgIHRva2VuID0gbmV3IFRva2VuKCk7Ci0gICAgampfbnRrID0gLTE7Ci0gICAgampfZ2VuID0gMDsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IDEyMjsgaSsrKSBqal9sYTFbaV0gPSAtMTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGpqXzJfcnRucy5sZW5ndGg7IGkrKykgampfMl9ydG5zW2ldID0gbmV3IEpKQ2FsbHMoKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIFJlSW5pdChqYXZhLmlvLklucHV0U3RyZWFtIHN0cmVhbSkgewotICAgICBSZUluaXQoc3RyZWFtLCBudWxsKTsKLSAgfQotICBwdWJsaWMgdm9pZCBSZUluaXQoamF2YS5pby5JbnB1dFN0cmVhbSBzdHJlYW0sIFN0cmluZyBlbmNvZGluZykgewotICAgIHRyeSB7IGpqX2lucHV0X3N0cmVhbS5SZUluaXQoc3RyZWFtLCBlbmNvZGluZywgMSwgMSk7IH0gY2F0Y2goamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7IH0KLSAgICB0b2tlbl9zb3VyY2UuUmVJbml0KGpqX2lucHV0X3N0cmVhbSk7Ci0gICAgdG9rZW4gPSBuZXcgVG9rZW4oKTsKLSAgICBqal9udGsgPSAtMTsKLSAgICBqanRyZWUucmVzZXQoKTsKLSAgICBqal9nZW4gPSAwOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTIyOyBpKyspIGpqX2xhMVtpXSA9IC0xOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgampfMl9ydG5zLmxlbmd0aDsgaSsrKSBqal8yX3J0bnNbaV0gPSBuZXcgSkpDYWxscygpOwotICB9Ci0KLSAgcHVibGljIEpTUGFyc2VyMjAoamF2YS5pby5SZWFkZXIgc3RyZWFtKSB7Ci0gICAgampfaW5wdXRfc3RyZWFtID0gbmV3IFNpbXBsZUNoYXJTdHJlYW0oc3RyZWFtLCAxLCAxKTsKLSAgICB0b2tlbl9zb3VyY2UgPSBuZXcgSlNQYXJzZXIyMFRva2VuTWFuYWdlcihqal9pbnB1dF9zdHJlYW0pOwotICAgIHRva2VuID0gbmV3IFRva2VuKCk7Ci0gICAgampfbnRrID0gLTE7Ci0gICAgampfZ2VuID0gMDsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IDEyMjsgaSsrKSBqal9sYTFbaV0gPSAtMTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGpqXzJfcnRucy5sZW5ndGg7IGkrKykgampfMl9ydG5zW2ldID0gbmV3IEpKQ2FsbHMoKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIFJlSW5pdChqYXZhLmlvLlJlYWRlciBzdHJlYW0pIHsKLSAgICBqal9pbnB1dF9zdHJlYW0uUmVJbml0KHN0cmVhbSwgMSwgMSk7Ci0gICAgdG9rZW5fc291cmNlLlJlSW5pdChqal9pbnB1dF9zdHJlYW0pOwotICAgIHRva2VuID0gbmV3IFRva2VuKCk7Ci0gICAgampfbnRrID0gLTE7Ci0gICAgamp0cmVlLnJlc2V0KCk7Ci0gICAgampfZ2VuID0gMDsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IDEyMjsgaSsrKSBqal9sYTFbaV0gPSAtMTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGpqXzJfcnRucy5sZW5ndGg7IGkrKykgampfMl9ydG5zW2ldID0gbmV3IEpKQ2FsbHMoKTsKLSAgfQotCi0gIHB1YmxpYyBKU1BhcnNlcjIwKEpTUGFyc2VyMjBUb2tlbk1hbmFnZXIgdG0pIHsKLSAgICB0b2tlbl9zb3VyY2UgPSB0bTsKLSAgICB0b2tlbiA9IG5ldyBUb2tlbigpOwotICAgIGpqX250ayA9IC0xOwotICAgIGpqX2dlbiA9IDA7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMjI7IGkrKykgampfbGExW2ldID0gLTE7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBqal8yX3J0bnMubGVuZ3RoOyBpKyspIGpqXzJfcnRuc1tpXSA9IG5ldyBKSkNhbGxzKCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBSZUluaXQoSlNQYXJzZXIyMFRva2VuTWFuYWdlciB0bSkgewotICAgIHRva2VuX3NvdXJjZSA9IHRtOwotICAgIHRva2VuID0gbmV3IFRva2VuKCk7Ci0gICAgampfbnRrID0gLTE7Ci0gICAgamp0cmVlLnJlc2V0KCk7Ci0gICAgampfZ2VuID0gMDsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IDEyMjsgaSsrKSBqal9sYTFbaV0gPSAtMTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGpqXzJfcnRucy5sZW5ndGg7IGkrKykgampfMl9ydG5zW2ldID0gbmV3IEpKQ2FsbHMoKTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgVG9rZW4gampfY29uc3VtZV90b2tlbihpbnQga2luZCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAgICBUb2tlbiBvbGRUb2tlbjsKLSAgICBpZiAoKG9sZFRva2VuID0gdG9rZW4pLm5leHQgIT0gbnVsbCkgdG9rZW4gPSB0b2tlbi5uZXh0OwotICAgIGVsc2UgdG9rZW4gPSB0b2tlbi5uZXh0ID0gdG9rZW5fc291cmNlLmdldE5leHRUb2tlbigpOwotICAgIGpqX250ayA9IC0xOwotICAgIGlmICh0b2tlbi5raW5kID09IGtpbmQpIHsKLSAgICAgIGpqX2dlbisrOwotICAgICAgaWYgKCsrampfZ2MgPiAxMDApIHsKLSAgICAgICAgampfZ2MgPSAwOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGpqXzJfcnRucy5sZW5ndGg7IGkrKykgewotICAgICAgICAgIEpKQ2FsbHMgYyA9IGpqXzJfcnRuc1tpXTsKLSAgICAgICAgICB3aGlsZSAoYyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoYy5nZW4gPCBqal9nZW4pIGMuZmlyc3QgPSBudWxsOwotICAgICAgICAgICAgYyA9IGMubmV4dDsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHJldHVybiB0b2tlbjsKLSAgICB9Ci0gICAgdG9rZW4gPSBvbGRUb2tlbjsKLSAgICBqal9raW5kID0ga2luZDsKLSAgICB0aHJvdyBnZW5lcmF0ZVBhcnNlRXhjZXB0aW9uKCk7Ci0gIH0KLQotICBzdGF0aWMgcHJpdmF0ZSBmaW5hbCBjbGFzcyBMb29rYWhlYWRTdWNjZXNzIGV4dGVuZHMgamF2YS5sYW5nLkVycm9yIHsgfQotICBmaW5hbCBwcml2YXRlIExvb2thaGVhZFN1Y2Nlc3MgampfbHMgPSBuZXcgTG9va2FoZWFkU3VjY2VzcygpOwotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfc2Nhbl90b2tlbihpbnQga2luZCkgewotICAgIGlmIChqal9zY2FucG9zID09IGpqX2xhc3Rwb3MpIHsKLSAgICAgIGpqX2xhLS07Ci0gICAgICBpZiAoampfc2NhbnBvcy5uZXh0ID09IG51bGwpIHsKLSAgICAgICAgampfbGFzdHBvcyA9IGpqX3NjYW5wb3MgPSBqal9zY2FucG9zLm5leHQgPSB0b2tlbl9zb3VyY2UuZ2V0TmV4dFRva2VuKCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBqal9sYXN0cG9zID0gampfc2NhbnBvcyA9IGpqX3NjYW5wb3MubmV4dDsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgampfc2NhbnBvcyA9IGpqX3NjYW5wb3MubmV4dDsKLSAgICB9Ci0gICAgaWYgKGpqX3Jlc2NhbikgewotICAgICAgaW50IGkgPSAwOyBUb2tlbiB0b2sgPSB0b2tlbjsKLSAgICAgIHdoaWxlICh0b2sgIT0gbnVsbCAmJiB0b2sgIT0gampfc2NhbnBvcykgeyBpKys7IHRvayA9IHRvay5uZXh0OyB9Ci0gICAgICBpZiAodG9rICE9IG51bGwpIGpqX2FkZF9lcnJvcl90b2tlbihraW5kLCBpKTsKLSAgICB9Ci0gICAgaWYgKGpqX3NjYW5wb3Mua2luZCAhPSBraW5kKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfbGEgPT0gMCAmJiBqal9zY2FucG9zID09IGpqX2xhc3Rwb3MpIHRocm93IGpqX2xzOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHB1YmxpYyBUb2tlbiBnZXROZXh0VG9rZW4oKSB7Ci0gICAgaWYgKHRva2VuLm5leHQgIT0gbnVsbCkgdG9rZW4gPSB0b2tlbi5uZXh0OwotICAgIGVsc2UgdG9rZW4gPSB0b2tlbi5uZXh0ID0gdG9rZW5fc291cmNlLmdldE5leHRUb2tlbigpOwotICAgIGpqX250ayA9IC0xOwotICAgIGpqX2dlbisrOwotICAgIHJldHVybiB0b2tlbjsKLSAgfQotCi0gIGZpbmFsIHB1YmxpYyBUb2tlbiBnZXRUb2tlbihpbnQgaW5kZXgpIHsKLSAgICBUb2tlbiB0ID0gbG9va2luZ0FoZWFkID8gampfc2NhbnBvcyA6IHRva2VuOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW5kZXg7IGkrKykgewotICAgICAgaWYgKHQubmV4dCAhPSBudWxsKSB0ID0gdC5uZXh0OwotICAgICAgZWxzZSB0ID0gdC5uZXh0ID0gdG9rZW5fc291cmNlLmdldE5leHRUb2tlbigpOwotICAgIH0KLSAgICByZXR1cm4gdDsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgaW50IGpqX250aygpIHsKLSAgICBpZiAoKGpqX250PXRva2VuLm5leHQpID09IG51bGwpCi0gICAgICByZXR1cm4gKGpqX250ayA9ICh0b2tlbi5uZXh0PXRva2VuX3NvdXJjZS5nZXROZXh0VG9rZW4oKSkua2luZCk7Ci0gICAgZWxzZQotICAgICAgcmV0dXJuIChqal9udGsgPSBqal9udC5raW5kKTsKLSAgfQotCi0gIHByaXZhdGUgamF2YS51dGlsLlZlY3RvciBqal9leHBlbnRyaWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLSAgcHJpdmF0ZSBpbnRbXSBqal9leHBlbnRyeTsKLSAgcHJpdmF0ZSBpbnQgampfa2luZCA9IC0xOwotICBwcml2YXRlIGludFtdIGpqX2xhc3R0b2tlbnMgPSBuZXcgaW50WzEwMF07Ci0gIHByaXZhdGUgaW50IGpqX2VuZHBvczsKLQotICBwcml2YXRlIHZvaWQgampfYWRkX2Vycm9yX3Rva2VuKGludCBraW5kLCBpbnQgcG9zKSB7Ci0gICAgaWYgKHBvcyA+PSAxMDApIHJldHVybjsKLSAgICBpZiAocG9zID09IGpqX2VuZHBvcyArIDEpIHsKLSAgICAgIGpqX2xhc3R0b2tlbnNbampfZW5kcG9zKytdID0ga2luZDsKLSAgICB9IGVsc2UgaWYgKGpqX2VuZHBvcyAhPSAwKSB7Ci0gICAgICBqal9leHBlbnRyeSA9IG5ldyBpbnRbampfZW5kcG9zXTsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgampfZW5kcG9zOyBpKyspIHsKLSAgICAgICAgampfZXhwZW50cnlbaV0gPSBqal9sYXN0dG9rZW5zW2ldOwotICAgICAgfQotICAgICAgYm9vbGVhbiBleGlzdHMgPSBmYWxzZTsKLSAgICAgIGZvciAoamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBqal9leHBlbnRyaWVzLmVsZW1lbnRzKCk7IGUuaGFzTW9yZUVsZW1lbnRzKCk7KSB7Ci0gICAgICAgIGludFtdIG9sZGVudHJ5ID0gKGludFtdKShlLm5leHRFbGVtZW50KCkpOwotICAgICAgICBpZiAob2xkZW50cnkubGVuZ3RoID09IGpqX2V4cGVudHJ5Lmxlbmd0aCkgewotICAgICAgICAgIGV4aXN0cyA9IHRydWU7Ci0gICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBqal9leHBlbnRyeS5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgaWYgKG9sZGVudHJ5W2ldICE9IGpqX2V4cGVudHJ5W2ldKSB7Ci0gICAgICAgICAgICAgIGV4aXN0cyA9IGZhbHNlOwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGV4aXN0cykgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGlmICghZXhpc3RzKSBqal9leHBlbnRyaWVzLmFkZEVsZW1lbnQoampfZXhwZW50cnkpOwotICAgICAgaWYgKHBvcyAhPSAwKSBqal9sYXN0dG9rZW5zWyhqal9lbmRwb3MgPSBwb3MpIC0gMV0gPSBraW5kOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBQYXJzZUV4Y2VwdGlvbiBnZW5lcmF0ZVBhcnNlRXhjZXB0aW9uKCkgewotICAgIGpqX2V4cGVudHJpZXMucmVtb3ZlQWxsRWxlbWVudHMoKTsKLSAgICBib29sZWFuW10gbGExdG9rZW5zID0gbmV3IGJvb2xlYW5bMTM1XTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IDEzNTsgaSsrKSB7Ci0gICAgICBsYTF0b2tlbnNbaV0gPSBmYWxzZTsKLSAgICB9Ci0gICAgaWYgKGpqX2tpbmQgPj0gMCkgewotICAgICAgbGExdG9rZW5zW2pqX2tpbmRdID0gdHJ1ZTsKLSAgICAgIGpqX2tpbmQgPSAtMTsKLSAgICB9Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMjI7IGkrKykgewotICAgICAgaWYgKGpqX2xhMVtpXSA9PSBqal9nZW4pIHsKLSAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCAzMjsgaisrKSB7Ci0gICAgICAgICAgaWYgKChqal9sYTFfMFtpXSAmICgxPDxqKSkgIT0gMCkgewotICAgICAgICAgICAgbGExdG9rZW5zW2pdID0gdHJ1ZTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKChqal9sYTFfMVtpXSAmICgxPDxqKSkgIT0gMCkgewotICAgICAgICAgICAgbGExdG9rZW5zWzMyK2pdID0gdHJ1ZTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKChqal9sYTFfMltpXSAmICgxPDxqKSkgIT0gMCkgewotICAgICAgICAgICAgbGExdG9rZW5zWzY0K2pdID0gdHJ1ZTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKChqal9sYTFfM1tpXSAmICgxPDxqKSkgIT0gMCkgewotICAgICAgICAgICAgbGExdG9rZW5zWzk2K2pdID0gdHJ1ZTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKChqal9sYTFfNFtpXSAmICgxPDxqKSkgIT0gMCkgewotICAgICAgICAgICAgbGExdG9rZW5zWzEyOCtqXSA9IHRydWU7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTM1OyBpKyspIHsKLSAgICAgIGlmIChsYTF0b2tlbnNbaV0pIHsKLSAgICAgICAgampfZXhwZW50cnkgPSBuZXcgaW50WzFdOwotICAgICAgICBqal9leHBlbnRyeVswXSA9IGk7Ci0gICAgICAgIGpqX2V4cGVudHJpZXMuYWRkRWxlbWVudChqal9leHBlbnRyeSk7Ci0gICAgICB9Ci0gICAgfQotICAgIGpqX2VuZHBvcyA9IDA7Ci0gICAgampfcmVzY2FuX3Rva2VuKCk7Ci0gICAgampfYWRkX2Vycm9yX3Rva2VuKDAsIDApOwotICAgIGludFtdW10gZXhwdG9rc2VxID0gbmV3IGludFtqal9leHBlbnRyaWVzLnNpemUoKV1bXTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGpqX2V4cGVudHJpZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgIGV4cHRva3NlcVtpXSA9IChpbnRbXSlqal9leHBlbnRyaWVzLmVsZW1lbnRBdChpKTsKLSAgICB9Ci0gICAgcmV0dXJuIG5ldyBQYXJzZUV4Y2VwdGlvbih0b2tlbiwgZXhwdG9rc2VxLCB0b2tlbkltYWdlKTsKLSAgfQotCi0gIGZpbmFsIHB1YmxpYyB2b2lkIGVuYWJsZV90cmFjaW5nKCkgewotICB9Ci0KLSAgZmluYWwgcHVibGljIHZvaWQgZGlzYWJsZV90cmFjaW5nKCkgewotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSB2b2lkIGpqX3Jlc2Nhbl90b2tlbigpIHsKLSAgICBqal9yZXNjYW4gPSB0cnVlOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjk7IGkrKykgewotICAgIHRyeSB7Ci0gICAgICBKSkNhbGxzIHAgPSBqal8yX3J0bnNbaV07Ci0gICAgICBkbyB7Ci0gICAgICAgIGlmIChwLmdlbiA+IGpqX2dlbikgewotICAgICAgICAgIGpqX2xhID0gcC5hcmc7IGpqX2xhc3Rwb3MgPSBqal9zY2FucG9zID0gcC5maXJzdDsKLSAgICAgICAgICBzd2l0Y2ggKGkpIHsKLSAgICAgICAgICAgIGNhc2UgMDogampfM18xKCk7IGJyZWFrOwotICAgICAgICAgICAgY2FzZSAxOiBqal8zXzIoKTsgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDI6IGpqXzNfMygpOyBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMzogampfM180KCk7IGJyZWFrOwotICAgICAgICAgICAgY2FzZSA0OiBqal8zXzUoKTsgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDU6IGpqXzNfNigpOyBicmVhazsKLSAgICAgICAgICAgIGNhc2UgNjogampfM183KCk7IGJyZWFrOwotICAgICAgICAgICAgY2FzZSA3OiBqal8zXzgoKTsgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDg6IGpqXzNfOSgpOyBicmVhazsKLSAgICAgICAgICAgIGNhc2UgOTogampfM18xMCgpOyBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMTA6IGpqXzNfMTEoKTsgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDExOiBqal8zXzEyKCk7IGJyZWFrOwotICAgICAgICAgICAgY2FzZSAxMjogampfM18xMygpOyBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMTM6IGpqXzNfMTQoKTsgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDE0OiBqal8zXzE1KCk7IGJyZWFrOwotICAgICAgICAgICAgY2FzZSAxNTogampfM18xNigpOyBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMTY6IGpqXzNfMTcoKTsgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDE3OiBqal8zXzE4KCk7IGJyZWFrOwotICAgICAgICAgICAgY2FzZSAxODogampfM18xOSgpOyBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMTk6IGpqXzNfMjAoKTsgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDIwOiBqal8zXzIxKCk7IGJyZWFrOwotICAgICAgICAgICAgY2FzZSAyMTogampfM18yMigpOyBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMjI6IGpqXzNfMjMoKTsgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDIzOiBqal8zXzI0KCk7IGJyZWFrOwotICAgICAgICAgICAgY2FzZSAyNDogampfM18yNSgpOyBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMjU6IGpqXzNfMjYoKTsgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDI2OiBqal8zXzI3KCk7IGJyZWFrOwotICAgICAgICAgICAgY2FzZSAyNzogampfM18yOCgpOyBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMjg6IGpqXzNfMjkoKTsgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHAgPSBwLm5leHQ7Ci0gICAgICB9IHdoaWxlIChwICE9IG51bGwpOwotICAgICAgfSBjYXRjaChMb29rYWhlYWRTdWNjZXNzIGxzKSB7IH0KLSAgICB9Ci0gICAgampfcmVzY2FuID0gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIHZvaWQgampfc2F2ZShpbnQgaW5kZXgsIGludCB4bGEpIHsKLSAgICBKSkNhbGxzIHAgPSBqal8yX3J0bnNbaW5kZXhdOwotICAgIHdoaWxlIChwLmdlbiA+IGpqX2dlbikgewotICAgICAgaWYgKHAubmV4dCA9PSBudWxsKSB7IHAgPSBwLm5leHQgPSBuZXcgSkpDYWxscygpOyBicmVhazsgfQotICAgICAgcCA9IHAubmV4dDsKLSAgICB9Ci0gICAgcC5nZW4gPSBqal9nZW4gKyB4bGEgLSBqal9sYTsgcC5maXJzdCA9IHRva2VuOyBwLmFyZyA9IHhsYTsKLSAgfQotCi0gIHN0YXRpYyBmaW5hbCBjbGFzcyBKSkNhbGxzIHsKLSAgICBpbnQgZ2VuOwotICAgIFRva2VuIGZpcnN0OwotICAgIGludCBhcmc7Ci0gICAgSkpDYWxscyBuZXh0OwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0pTUGFyc2VyMjBDb25zdGFudHMuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0pTUGFyc2VyMjBDb25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWVkYzc3Yy4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9KU1BhcnNlcjIwQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTkgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZSZKYXZhQ0M6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gSlNQYXJzZXIyMENvbnN0YW50cy5qYXZhICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5qYXZhc2NyaXB0MjBwYXJzZXI7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSlNQYXJzZXIyMENvbnN0YW50cyB7Ci0KLSAgaW50IEVPRiA9IDA7Ci0gIGludCBFT0wgPSAxOwotICBpbnQgV1MgPSAyOwotICBpbnQgU0lOR0xFX0xJTkVfQ09NTUVOVCA9IDU7Ci0gIGludCBNVUxUSV9MSU5FX0NPTU1FTlQgPSA2OwotICBpbnQgQVMgPSA4OwotICBpbnQgQlJFQUsgPSA5OwotICBpbnQgQ0FTRSA9IDEwOwotICBpbnQgQ0FUQ0ggPSAxMTsKLSAgaW50IENMQVNTID0gMTI7Ci0gIGludCBDT05TVCA9IDEzOwotICBpbnQgQ09OVElOVUUgPSAxNDsKLSAgaW50IF9ERUZBVUxUID0gMTU7Ci0gIGludCBERUxFVEUgPSAxNjsKLSAgaW50IERPID0gMTc7Ci0gIGludCBFTFNFID0gMTg7Ci0gIGludCBFWFRFTkRTID0gMTk7Ci0gIGludCBGQUxTRSA9IDIwOwotICBpbnQgRklOQUxMWSA9IDIxOwotICBpbnQgRk9SID0gMjI7Ci0gIGludCBGVU5DVElPTiA9IDIzOwotICBpbnQgRlVOQ1RJT05fID0gMjQ7Ci0gIGludCBHRVQgPSAyNTsKLSAgaW50IElGID0gMjY7Ci0gIGludCBJTiA9IDI3OwotICBpbnQgSU5DTFVERSA9IDI4OwotICBpbnQgSU5TVEFOQ0VPRiA9IDI5OwotICBpbnQgSVMgPSAzMDsKLSAgaW50IE5BTUVTUEFDRSA9IDMxOwotICBpbnQgTkVXID0gMzI7Ci0gIGludCBOVUxMID0gMzM7Ci0gIGludCBQQUNLQUdFID0gMzQ7Ci0gIGludCBQUklWQVRFID0gMzU7Ci0gIGludCBQVUJMSUMgPSAzNjsKLSAgaW50IFJFVFVSTiA9IDM3OwotICBpbnQgU0VUID0gMzg7Ci0gIGludCBTVVBFUiA9IDM5OwotICBpbnQgU1dJVENIID0gNDA7Ci0gIGludCBUSElTID0gNDE7Ci0gIGludCBUSFJPVyA9IDQyOwotICBpbnQgVFJVRSA9IDQzOwotICBpbnQgVFJZID0gNDQ7Ci0gIGludCBUWVBFT0YgPSA0NTsKLSAgaW50IFVTRSA9IDQ2OwotICBpbnQgVkFSID0gNDc7Ci0gIGludCBWT0lEID0gNDg7Ci0gIGludCBXSElMRSA9IDQ5OwotICBpbnQgV0lUSCA9IDUwOwotICBpbnQgQUJTVFJBQ1QgPSA1MTsKLSAgaW50IERFQlVHR0VSID0gNTI7Ci0gIGludCBFTlVNID0gNTM7Ci0gIGludCBFWFBPUlQgPSA1NDsKLSAgaW50IEdPVE8gPSA1NTsKLSAgaW50IElNUExFTUVOVFMgPSA1NjsKLSAgaW50IElOVEVSRkFDRSA9IDU3OwotICBpbnQgTkFUSVZFID0gNTg7Ci0gIGludCBQUk9URUNURUQgPSA1OTsKLSAgaW50IFNZTkNIUk9OSVpFRCA9IDYwOwotICBpbnQgVEhST1dTID0gNjE7Ci0gIGludCBUUkFOU0lFTlQgPSA2MjsKLSAgaW50IFZPTEFUSUxFID0gNjM7Ci0gIGludCBJTVBPUlQgPSA2NDsKLSAgaW50IERFQ0lNQUxfTElURVJBTCA9IDY1OwotICBpbnQgSEVYX0xJVEVSQUwgPSA2NjsKLSAgaW50IE9DVEFMX0xJVEVSQUwgPSA2NzsKLSAgaW50IEZMT0FUSU5HX1BPSU5UX0xJVEVSQUwgPSA2ODsKLSAgaW50IEVYUE9ORU5UID0gNjk7Ci0gIGludCBTVFJJTkdfTElURVJBTCA9IDcwOwotICBpbnQgRVNDQVBFX1NFUVVFTkNFID0gNzE7Ci0gIGludCBVTlRFUk1JTkFURURfU1RSSU5HX0xJVEVSQUwgPSA3MjsKLSAgaW50IFJFR1hfU1RBUlRfQ0hBUiA9IDczOwotICBpbnQgUkVHWF9CT0RZX0NIQVJfRVhDTFVTSU9OID0gNzQ7Ci0gIGludCBSRUdYX0JPRFlfQ0hBUiA9IDc1OwotICBpbnQgUkVHRVhfRU5EX0NIQVIgPSA3NjsKLSAgaW50IFJFR1VMQVJfRVhQUkVTU0lPTiA9IDc3OwotICBpbnQgSURFTlRJRklFUiA9IDc4OwotICBpbnQgTEVUVEVSID0gNzk7Ci0gIGludCBESUdJVCA9IDgwOwotICBpbnQgTFBBUkVOID0gODE7Ci0gIGludCBSUEFSRU4gPSA4MjsKLSAgaW50IExCUkFDRSA9IDgzOwotICBpbnQgUkJSQUNFID0gODQ7Ci0gIGludCBMQlJBQ0tFVCA9IDg1OwotICBpbnQgUkJSQUNLRVQgPSA4NjsKLSAgaW50IFNFTUlDT0xPTiA9IDg3OwotICBpbnQgQ09NTUEgPSA4ODsKLSAgaW50IERPVCA9IDg5OwotICBpbnQgUVVBTElGSUVSID0gOTA7Ci0gIGludCBFTElQU0UgPSA5MTsKLSAgaW50IEFTU0lHTiA9IDkyOwotICBpbnQgR1QgPSA5MzsKLSAgaW50IExUID0gOTQ7Ci0gIGludCBCQU5HID0gOTU7Ci0gIGludCBUSUxERSA9IDk2OwotICBpbnQgSE9PSyA9IDk3OwotICBpbnQgQ09MT04gPSA5ODsKLSAgaW50IEVRID0gOTk7Ci0gIGludCBMRSA9IDEwMDsKLSAgaW50IEdFID0gMTAxOwotICBpbnQgTkUgPSAxMDI7Ci0gIGludCBTQ19PUiA9IDEwMzsKLSAgaW50IFNDX0FORCA9IDEwNDsKLSAgaW50IFNDX1hPUiA9IDEwNTsKLSAgaW50IElOQ1IgPSAxMDY7Ci0gIGludCBERUNSID0gMTA3OwotICBpbnQgUExVUyA9IDEwODsKLSAgaW50IE1JTlVTID0gMTA5OwotICBpbnQgU1RBUiA9IDExMDsKLSAgaW50IFNMQVNIID0gMTExOwotICBpbnQgQklUX0FORCA9IDExMjsKLSAgaW50IEJJVF9PUiA9IDExMzsKLSAgaW50IFhPUiA9IDExNDsKLSAgaW50IFJFTSA9IDExNTsKLSAgaW50IExTSElGVCA9IDExNjsKLSAgaW50IFJTSUdORURTSElGVCA9IDExNzsKLSAgaW50IFJVTlNJR05FRFNISUZUID0gMTE4OwotICBpbnQgUExVU0FTU0lHTiA9IDExOTsKLSAgaW50IE1JTlVTQVNTSUdOID0gMTIwOwotICBpbnQgU1RBUkFTU0lHTiA9IDEyMTsKLSAgaW50IFNMQVNIQVNTSUdOID0gMTIyOwotICBpbnQgQU5EQVNTSUdOID0gMTIzOwotICBpbnQgT1JBU1NJR04gPSAxMjQ7Ci0gIGludCBYT1JBU1NJR04gPSAxMjU7Ci0gIGludCBSRU1BU1NJR04gPSAxMjY7Ci0gIGludCBMU0hJRlRBU1NJR04gPSAxMjc7Ci0gIGludCBSU0lHTkVEU0hJRlRBU1NJR04gPSAxMjg7Ci0gIGludCBSVU5TSUdORURTSElGVEFTU0lHTiA9IDEyOTsKLSAgaW50IFNDX09SQVNTSUdOID0gMTMwOwotICBpbnQgU0NfQU5EQVNTSUdOID0gMTMxOwotICBpbnQgU0NfWE9SQVNTSUdOID0gMTMyOwotICBpbnQgSURFTlRJVFlPUEVSID0gMTMzOwotICBpbnQgTk9USURFTlRJVFlPUEVSID0gMTM0OwotCi0gIGludCBERUZBVUxUID0gMDsKLSAgaW50IElOX1NJTkdMRV9MSU5FX0NPTU1FTlQgPSAxOwotICBpbnQgSU5fTVVMVElfTElORV9DT01NRU5UID0gMjsKLQotICBTdHJpbmdbXSB0b2tlbkltYWdlID0gewotICAgICI8RU9GPiIsCi0gICAgIjxFT0w+IiwKLSAgICAiPFdTPiIsCi0gICAgIlwiLy9cIiIsCi0gICAgIlwiLypcIiIsCi0gICAgIjxTSU5HTEVfTElORV9DT01NRU5UPiIsCi0gICAgIlwiKi9cIiIsCi0gICAgIjx0b2tlbiBvZiBraW5kIDc+IiwKLSAgICAiXCJhc1wiIiwKLSAgICAiXCJicmVha1wiIiwKLSAgICAiXCJjYXNlXCIiLAotICAgICJcImNhdGNoXCIiLAotICAgICJcImNsYXNzXCIiLAotICAgICJcImNvbnN0XCIiLAotICAgICJcImNvbnRpbnVlXCIiLAotICAgICJcImRlZmF1bHRcIiIsCi0gICAgIlwiZGVsZXRlXCIiLAotICAgICJcImRvXCIiLAotICAgICJcImVsc2VcIiIsCi0gICAgIlwiZXh0ZW5kc1wiIiwKLSAgICAiXCJmYWxzZVwiIiwKLSAgICAiXCJmaW5hbGx5XCIiLAotICAgICJcImZvclwiIiwKLSAgICAiXCJmdW5jdGlvblwiIiwKLSAgICAiXCJGdW5jdGlvblwiIiwKLSAgICAiXCJnZXRcIiIsCi0gICAgIlwiaWZcIiIsCi0gICAgIlwiaW5cIiIsCi0gICAgIlwiaW5jbHVkZVwiIiwKLSAgICAiXCJpbnN0YW5jZW9mXCIiLAotICAgICJcImlzXCIiLAotICAgICJcIm5hbWVzcGFjZVwiIiwKLSAgICAiXCJuZXdcIiIsCi0gICAgIlwibnVsbFwiIiwKLSAgICAiXCJwYWNrYWdlXCIiLAotICAgICJcInByaXZhdGVcIiIsCi0gICAgIlwicHVibGljXCIiLAotICAgICJcInJldHVyblwiIiwKLSAgICAiXCJzZXRcIiIsCi0gICAgIlwic3VwZXJcIiIsCi0gICAgIlwic3dpdGNoXCIiLAotICAgICJcInRoaXNcIiIsCi0gICAgIlwidGhyb3dcIiIsCi0gICAgIlwidHJ1ZVwiIiwKLSAgICAiXCJ0cnlcIiIsCi0gICAgIlwidHlwZW9mXCIiLAotICAgICJcInVzZVwiIiwKLSAgICAiXCJ2YXJcIiIsCi0gICAgIlwidm9pZFwiIiwKLSAgICAiXCJ3aGlsZVwiIiwKLSAgICAiXCJ3aXRoXCIiLAotICAgICJcImFic3RyYWN0XCIiLAotICAgICJcImRlYnVnZ2VyXCIiLAotICAgICJcImVudW1cIiIsCi0gICAgIlwiZXhwb3J0XCIiLAotICAgICJcImdvdG9cIiIsCi0gICAgIlwiaW1wbGVtZW50c1wiIiwKLSAgICAiXCJpbnRlcmZhY2VcIiIsCi0gICAgIlwibmF0aXZlXCIiLAotICAgICJcInByb3RlY3RlZFwiIiwKLSAgICAiXCJzeW5jaHJvbml6ZWRcIiIsCi0gICAgIlwidGhyb3dzXCIiLAotICAgICJcInRyYW5zaWVudFwiIiwKLSAgICAiXCJ2b2xhdGlsZVwiIiwKLSAgICAiXCJpbXBvcnRcIiIsCi0gICAgIjxERUNJTUFMX0xJVEVSQUw+IiwKLSAgICAiPEhFWF9MSVRFUkFMPiIsCi0gICAgIjxPQ1RBTF9MSVRFUkFMPiIsCi0gICAgIjxGTE9BVElOR19QT0lOVF9MSVRFUkFMPiIsCi0gICAgIjxFWFBPTkVOVD4iLAotICAgICI8U1RSSU5HX0xJVEVSQUw+IiwKLSAgICAiPEVTQ0FQRV9TRVFVRU5DRT4iLAotICAgICI8VU5URVJNSU5BVEVEX1NUUklOR19MSVRFUkFMPiIsCi0gICAgIjxSRUdYX1NUQVJUX0NIQVI+IiwKLSAgICAiPFJFR1hfQk9EWV9DSEFSX0VYQ0xVU0lPTj4iLAotICAgICI8UkVHWF9CT0RZX0NIQVI+IiwKLSAgICAiPFJFR0VYX0VORF9DSEFSPiIsCi0gICAgIjxSRUdVTEFSX0VYUFJFU1NJT04+IiwKLSAgICAiPElERU5USUZJRVI+IiwKLSAgICAiPExFVFRFUj4iLAotICAgICI8RElHSVQ+IiwKLSAgICAiXCIoXCIiLAotICAgICJcIilcIiIsCi0gICAgIlwie1wiIiwKLSAgICAiXCJ9XCIiLAotICAgICJcIltcIiIsCi0gICAgIlwiXVwiIiwKLSAgICAiXCI7XCIiLAotICAgICJcIixcIiIsCi0gICAgIlwiLlwiIiwKLSAgICAiXCI6OlwiIiwKLSAgICAiXCIuLi5cIiIsCi0gICAgIlwiPVwiIiwKLSAgICAiXCI+XCIiLAotICAgICJcIjxcIiIsCi0gICAgIlwiIVwiIiwKLSAgICAiXCJ+XCIiLAotICAgICJcIj9cIiIsCi0gICAgIlwiOlwiIiwKLSAgICAiXCI9PVwiIiwKLSAgICAiXCI8PVwiIiwKLSAgICAiXCI+PVwiIiwKLSAgICAiXCIhPVwiIiwKLSAgICAiXCJ8fFwiIiwKLSAgICAiXCImJlwiIiwKLSAgICAiXCJeXlwiIiwKLSAgICAiXCIrK1wiIiwKLSAgICAiXCItLVwiIiwKLSAgICAiXCIrXCIiLAotICAgICJcIi1cIiIsCi0gICAgIlwiKlwiIiwKLSAgICAiXCIvXCIiLAotICAgICJcIiZcIiIsCi0gICAgIlwifFwiIiwKLSAgICAiXCJeXCIiLAotICAgICJcIiVcIiIsCi0gICAgIlwiPDxcIiIsCi0gICAgIlwiPj5cIiIsCi0gICAgIlwiPj4+XCIiLAotICAgICJcIis9XCIiLAotICAgICJcIi09XCIiLAotICAgICJcIio9XCIiLAotICAgICJcIi89XCIiLAotICAgICJcIiY9XCIiLAotICAgICJcInw9XCIiLAotICAgICJcIl49XCIiLAotICAgICJcIiU9XCIiLAotICAgICJcIjw8PVwiIiwKLSAgICAiXCI+Pj1cIiIsCi0gICAgIlwiPj4+PVwiIiwKLSAgICAiXCJ8fD1cIiIsCi0gICAgIlwiJiY9XCIiLAotICAgICJcIl5ePVwiIiwKLSAgICAiXCI9PT1cIiIsCi0gICAgIlwiIT09XCIiLAotICB9OwotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvSlNQYXJzZXIyMFRva2VuTWFuYWdlci5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvSlNQYXJzZXIyMFRva2VuTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NDU2ZjM2Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0pTUGFyc2VyMjBUb2tlbk1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyNDYgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZSZKYXZhQ0M6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gSlNQYXJzZXIyMFRva2VuTWFuYWdlci5qYXZhICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5qYXZhc2NyaXB0MjBwYXJzZXI7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotcHVibGljIGNsYXNzIEpTUGFyc2VyMjBUb2tlbk1hbmFnZXIgaW1wbGVtZW50cyBKU1BhcnNlcjIwQ29uc3RhbnRzCi17Ci0gICAgcHJpdmF0ZSBib29sZWFuIGlzUmVnVmFsaWQgPSB0cnVlOwotICAgIHB1YmxpYyB2b2lkIHNldFJlZ0ludmFsaWQoKQotICAgIHsKLSAgICAgICAgaXNSZWdWYWxpZCA9IGZhbHNlOwotICAgIH0KLSAgICBwdWJsaWMgdm9pZCBzZXRSZWdWYWxpZCgpCi0gICAgewotICAgICAgICBpc1JlZ1ZhbGlkID0gdHJ1ZTsKLSAgICB9Ci0gIHB1YmxpYyAgamF2YS5pby5QcmludFN0cmVhbSBkZWJ1Z1N0cmVhbSA9IFN5c3RlbS5vdXQ7Ci0gIHB1YmxpYyAgdm9pZCBzZXREZWJ1Z1N0cmVhbShqYXZhLmlvLlByaW50U3RyZWFtIGRzKSB7IGRlYnVnU3RyZWFtID0gZHM7IH0KLXByaXZhdGUgZmluYWwgaW50IGpqU3RvcFN0cmluZ0xpdGVyYWxEZmFfMChpbnQgcG9zLCBsb25nIGFjdGl2ZTAsIGxvbmcgYWN0aXZlMSwgbG9uZyBhY3RpdmUyKQotewotICAgc3dpdGNoIChwb3MpCi0gICB7Ci0gICAgICBjYXNlIDA6Ci0gICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDE4TCkgIT0gMEwgfHwgKGFjdGl2ZTEgJiAweDQwMDgwMDAwMDAwMDAwMEwpICE9IDBMKQotICAgICAgICAgICAgcmV0dXJuIDEwOwotICAgICAgICAgaWYgKChhY3RpdmUwICYgMHhmZmZmZmZmZmZmZmZmZjAwTCkgIT0gMEwgfHwgKGFjdGl2ZTEgJiAweDFMKSAhPSAwTCkKLSAgICAgICAgIHsKLSAgICAgICAgICAgIGpqbWF0Y2hlZEtpbmQgPSA3ODsKLSAgICAgICAgICAgIHJldHVybiAzMDsKLSAgICAgICAgIH0KLSAgICAgICAgIGlmICgoYWN0aXZlMSAmIDB4YTAwMDAwMEwpICE9IDBMKQotICAgICAgICAgICAgcmV0dXJuIDU7Ci0gICAgICAgICByZXR1cm4gLTE7Ci0gICAgICBjYXNlIDE6Ci0gICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDIwMDAwMDA3YzAyMDEwMEwpICE9IDBMKQotICAgICAgICAgICAgcmV0dXJuIDMwOwotICAgICAgICAgaWYgKChhY3RpdmUwICYgMHhmZGZmZmZmZjgzZmRmZTAwTCkgIT0gMEwgfHwgKGFjdGl2ZTEgJiAweDFMKSAhPSAwTCkKLSAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChqam1hdGNoZWRQb3MgIT0gMSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIGpqbWF0Y2hlZEtpbmQgPSA3ODsKLSAgICAgICAgICAgICAgIGpqbWF0Y2hlZFBvcyA9IDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gMzA7Ci0gICAgICAgICB9Ci0gICAgICAgICByZXR1cm4gLTE7Ci0gICAgICBjYXNlIDI6Ci0gICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweGZmZmYyZmJlYjFiZGZlMDBMKSAhPSAwTCB8fCAoYWN0aXZlMSAmIDB4MUwpICE9IDBMKQotICAgICAgICAgewotICAgICAgICAgICAgaWYgKGpqbWF0Y2hlZFBvcyAhPSAyKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgamptYXRjaGVkS2luZCA9IDc4OwotICAgICAgICAgICAgICAgamptYXRjaGVkUG9zID0gMjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiAzMDsKLSAgICAgICAgIH0KLSAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4ZDA0MTAyNDAwMDAwTCkgIT0gMEwpCi0gICAgICAgICAgICByZXR1cm4gMzA7Ci0gICAgICAgICByZXR1cm4gLTE7Ci0gICAgICBjYXNlIDM6Ci0gICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweGZmNWEyNWJjYjFiOWZhMDBMKSAhPSAwTCB8fCAoYWN0aXZlMSAmIDB4MUwpICE9IDBMKQotICAgICAgICAgewotICAgICAgICAgICAgamptYXRjaGVkS2luZCA9IDc4OwotICAgICAgICAgICAgamptYXRjaGVkUG9zID0gMzsKLSAgICAgICAgICAgIHJldHVybiAzMDsKLSAgICAgICAgIH0KLSAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4YTUwYTAyMDAwNDA0MDBMKSAhPSAwTCkKLSAgICAgICAgICAgIHJldHVybiAzMDsKLSAgICAgICAgIHJldHVybiAtMTsKLSAgICAgIGNhc2UgNDoKLSAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4ZGY1ODIxM2NiMWE5YzAwMEwpICE9IDBMIHx8IChhY3RpdmUxICYgMHgxTCkgIT0gMEwpCi0gICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoamptYXRjaGVkUG9zICE9IDQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBqam1hdGNoZWRLaW5kID0gNzg7Ci0gICAgICAgICAgICAgICBqam1hdGNoZWRQb3MgPSA0OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIDMwOwotICAgICAgICAgfQotICAgICAgICAgaWYgKChhY3RpdmUwICYgMHgyMDAyMDQ4MDAwMTAzYTAwTCkgIT0gMEwpCi0gICAgICAgICAgICByZXR1cm4gMzA7Ci0gICAgICAgICByZXR1cm4gLTE7Ci0gICAgICBjYXNlIDU6Ci0gICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweGRiMTgwMDBjYjFhOGMwMDBMKSAhPSAwTCkKLSAgICAgICAgIHsKLSAgICAgICAgICAgIGpqbWF0Y2hlZEtpbmQgPSA3ODsKLSAgICAgICAgICAgIGpqbWF0Y2hlZFBvcyA9IDU7Ci0gICAgICAgICAgICByZXR1cm4gMzA7Ci0gICAgICAgICB9Ci0gICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDI0NDAyMTMwMDAwMTAwMDBMKSAhPSAwTCB8fCAoYWN0aXZlMSAmIDB4MUwpICE9IDBMKQotICAgICAgICAgICAgcmV0dXJuIDMwOwotICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgY2FzZSA2OgotICAgICAgICAgaWYgKChhY3RpdmUwICYgMHhkYjE4MDAwMGExODA0MDAwTCkgIT0gMEwpCi0gICAgICAgICB7Ci0gICAgICAgICAgICBqam1hdGNoZWRLaW5kID0gNzg7Ci0gICAgICAgICAgICBqam1hdGNoZWRQb3MgPSA2OwotICAgICAgICAgICAgcmV0dXJuIDMwOwotICAgICAgICAgfQotICAgICAgICAgaWYgKChhY3RpdmUwICYgMHhjMTAyODgwMDBMKSAhPSAwTCkKLSAgICAgICAgICAgIHJldHVybiAzMDsKLSAgICAgICAgIHJldHVybiAtMTsKLSAgICAgIGNhc2UgNzoKLSAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4NWIwMDAwMDBhMDAwMDAwMEwpICE9IDBMKQotICAgICAgICAgewotICAgICAgICAgICAgamptYXRjaGVkS2luZCA9IDc4OwotICAgICAgICAgICAgamptYXRjaGVkUG9zID0gNzsKLSAgICAgICAgICAgIHJldHVybiAzMDsKLSAgICAgICAgIH0KLSAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4ODAxODAwMDAwMTgwNDAwMEwpICE9IDBMKQotICAgICAgICAgICAgcmV0dXJuIDMwOwotICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgY2FzZSA4OgotICAgICAgICAgaWYgKChhY3RpdmUwICYgMHgxMTAwMDAwMDIwMDAwMDAwTCkgIT0gMEwpCi0gICAgICAgICB7Ci0gICAgICAgICAgICBqam1hdGNoZWRLaW5kID0gNzg7Ci0gICAgICAgICAgICBqam1hdGNoZWRQb3MgPSA4OwotICAgICAgICAgICAgcmV0dXJuIDMwOwotICAgICAgICAgfQotICAgICAgICAgaWYgKChhY3RpdmUwICYgMHg0YTAwMDAwMDgwMDAwMDAwTCkgIT0gMEwpCi0gICAgICAgICAgICByZXR1cm4gMzA7Ci0gICAgICAgICByZXR1cm4gLTE7Ci0gICAgICBjYXNlIDk6Ci0gICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDEwMDAwMDAwMDAwMDAwMDBMKSAhPSAwTCkKLSAgICAgICAgIHsKLSAgICAgICAgICAgIGpqbWF0Y2hlZEtpbmQgPSA3ODsKLSAgICAgICAgICAgIGpqbWF0Y2hlZFBvcyA9IDk7Ci0gICAgICAgICAgICByZXR1cm4gMzA7Ci0gICAgICAgICB9Ci0gICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDEwMDAwMDAyMDAwMDAwMEwpICE9IDBMKQotICAgICAgICAgICAgcmV0dXJuIDMwOwotICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgY2FzZSAxMDoKLSAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4MTAwMDAwMDAwMDAwMDAwMEwpICE9IDBMKQotICAgICAgICAgewotICAgICAgICAgICAgamptYXRjaGVkS2luZCA9IDc4OwotICAgICAgICAgICAgamptYXRjaGVkUG9zID0gMTA7Ci0gICAgICAgICAgICByZXR1cm4gMzA7Ci0gICAgICAgICB9Ci0gICAgICAgICByZXR1cm4gLTE7Ci0gICAgICBkZWZhdWx0IDoKLSAgICAgICAgIHJldHVybiAtMTsKLSAgIH0KLX0KLXByaXZhdGUgZmluYWwgaW50IGpqU3RhcnROZmFfMChpbnQgcG9zLCBsb25nIGFjdGl2ZTAsIGxvbmcgYWN0aXZlMSwgbG9uZyBhY3RpdmUyKQotewotICAgcmV0dXJuIGpqTW92ZU5mYV8wKGpqU3RvcFN0cmluZ0xpdGVyYWxEZmFfMChwb3MsIGFjdGl2ZTAsIGFjdGl2ZTEsIGFjdGl2ZTIpLCBwb3MgKyAxKTsKLX0KLXByaXZhdGUgZmluYWwgaW50IGpqU3RvcEF0UG9zKGludCBwb3MsIGludCBraW5kKQotewotICAgamptYXRjaGVkS2luZCA9IGtpbmQ7Ci0gICBqam1hdGNoZWRQb3MgPSBwb3M7Ci0gICByZXR1cm4gcG9zICsgMTsKLX0KLXByaXZhdGUgZmluYWwgaW50IGpqU3RhcnROZmFXaXRoU3RhdGVzXzAoaW50IHBvcywgaW50IGtpbmQsIGludCBzdGF0ZSkKLXsKLSAgIGpqbWF0Y2hlZEtpbmQgPSBraW5kOwotICAgamptYXRjaGVkUG9zID0gcG9zOwotICAgdHJ5IHsgY3VyQ2hhciA9IGlucHV0X3N0cmVhbS5yZWFkQ2hhcigpOyB9Ci0gICBjYXRjaChqYXZhLmlvLklPRXhjZXB0aW9uIGUpIHsgcmV0dXJuIHBvcyArIDE7IH0KLSAgIHJldHVybiBqak1vdmVOZmFfMChzdGF0ZSwgcG9zICsgMSk7Ci19Ci1wcml2YXRlIGZpbmFsIGludCBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMF8wKCkKLXsKLSAgIHN3aXRjaChjdXJDaGFyKQotICAgewotICAgICAgY2FzZSAzMzoKLSAgICAgICAgIGpqbWF0Y2hlZEtpbmQgPSA5NTsKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMV8wKDB4MEwsIDB4NDAwMDAwMDAwMEwsIDB4NDBMKTsKLSAgICAgIGNhc2UgMzc6Ci0gICAgICAgICBqam1hdGNoZWRLaW5kID0gMTE1OwotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmExXzAoMHgwTCwgMHg0MDAwMDAwMDAwMDAwMDAwTCwgMHgwTCk7Ci0gICAgICBjYXNlIDM4OgotICAgICAgICAgamptYXRjaGVkS2luZCA9IDExMjsKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMV8wKDB4MEwsIDB4ODAwMDEwMDAwMDAwMDAwTCwgMHg4TCk7Ci0gICAgICBjYXNlIDQwOgotICAgICAgICAgcmV0dXJuIGpqU3RvcEF0UG9zKDAsIDgxKTsKLSAgICAgIGNhc2UgNDE6Ci0gICAgICAgICByZXR1cm4gampTdG9wQXRQb3MoMCwgODIpOwotICAgICAgY2FzZSA0MjoKLSAgICAgICAgIGpqbWF0Y2hlZEtpbmQgPSAxMTA7Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTFfMCgweDBMLCAweDIwMDAwMDAwMDAwMDAwMEwsIDB4MEwpOwotICAgICAgY2FzZSA0MzoKLSAgICAgICAgIGpqbWF0Y2hlZEtpbmQgPSAxMDg7Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTFfMCgweDBMLCAweDgwMDQwMDAwMDAwMDAwTCwgMHgwTCk7Ci0gICAgICBjYXNlIDQ0OgotICAgICAgICAgcmV0dXJuIGpqU3RvcEF0UG9zKDAsIDg4KTsKLSAgICAgIGNhc2UgNDU6Ci0gICAgICAgICBqam1hdGNoZWRLaW5kID0gMTA5OwotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmExXzAoMHgwTCwgMHgxMDAwODAwMDAwMDAwMDBMLCAweDBMKTsKLSAgICAgIGNhc2UgNDY6Ci0gICAgICAgICBqam1hdGNoZWRLaW5kID0gODk7Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTFfMCgweDBMLCAweDgwMDAwMDBMLCAweDBMKTsKLSAgICAgIGNhc2UgNDc6Ci0gICAgICAgICBqam1hdGNoZWRLaW5kID0gMTExOwotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmExXzAoMHgxOEwsIDB4NDAwMDAwMDAwMDAwMDAwTCwgMHgwTCk7Ci0gICAgICBjYXNlIDU4OgotICAgICAgICAgamptYXRjaGVkS2luZCA9IDk4OwotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmExXzAoMHgwTCwgMHg0MDAwMDAwTCwgMHgwTCk7Ci0gICAgICBjYXNlIDU5OgotICAgICAgICAgcmV0dXJuIGpqU3RvcEF0UG9zKDAsIDg3KTsKLSAgICAgIGNhc2UgNjA6Ci0gICAgICAgICBqam1hdGNoZWRLaW5kID0gOTQ7Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTFfMCgweDBMLCAweDgwMTAwMDEwMDAwMDAwMDBMLCAweDBMKTsKLSAgICAgIGNhc2UgNjE6Ci0gICAgICAgICBqam1hdGNoZWRLaW5kID0gOTI7Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTFfMCgweDBMLCAweDgwMDAwMDAwMEwsIDB4MjBMKTsKLSAgICAgIGNhc2UgNjI6Ci0gICAgICAgICBqam1hdGNoZWRLaW5kID0gOTM7Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTFfMCgweDBMLCAweDYwMDAyMDAwMDAwMDAwTCwgMHgzTCk7Ci0gICAgICBjYXNlIDYzOgotICAgICAgICAgcmV0dXJuIGpqU3RvcEF0UG9zKDAsIDk3KTsKLSAgICAgIGNhc2UgNzA6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTFfMCgweDEwMDAwMDBMLCAweDBMLCAweDBMKTsKLSAgICAgIGNhc2UgOTE6Ci0gICAgICAgICByZXR1cm4gampTdG9wQXRQb3MoMCwgODUpOwotICAgICAgY2FzZSA5MzoKLSAgICAgICAgIHJldHVybiBqalN0b3BBdFBvcygwLCA4Nik7Ci0gICAgICBjYXNlIDk0OgotICAgICAgICAgamptYXRjaGVkS2luZCA9IDExNDsKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMV8wKDB4MEwsIDB4MjAwMDAyMDAwMDAwMDAwMEwsIDB4MTBMKTsKLSAgICAgIGNhc2UgOTc6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTFfMCgweDgwMDAwMDAwMDAxMDBMLCAweDBMLCAweDBMKTsKLSAgICAgIGNhc2UgOTg6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTFfMCgweDIwMEwsIDB4MEwsIDB4MEwpOwotICAgICAgY2FzZSA5OToKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMV8wKDB4N2MwMEwsIDB4MEwsIDB4MEwpOwotICAgICAgY2FzZSAxMDA6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTFfMCgweDEwMDAwMDAwMDM4MDAwTCwgMHgwTCwgMHgwTCk7Ci0gICAgICBjYXNlIDEwMToKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMV8wKDB4NjAwMDAwMDAwYzAwMDBMLCAweDBMLCAweDBMKTsKLSAgICAgIGNhc2UgMTAyOgotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmExXzAoMHhmMDAwMDBMLCAweDBMLCAweDBMKTsKLSAgICAgIGNhc2UgMTAzOgotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmExXzAoMHg4MDAwMDAwMjAwMDAwMEwsIDB4MEwsIDB4MEwpOwotICAgICAgY2FzZSAxMDU6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTFfMCgweDMwMDAwMDA3YzAwMDAwMEwsIDB4MUwsIDB4MEwpOwotICAgICAgY2FzZSAxMTA6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTFfMCgweDQwMDAwMDM4MDAwMDAwMEwsIDB4MEwsIDB4MEwpOwotICAgICAgY2FzZSAxMTI6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTFfMCgweDgwMDAwMWMwMDAwMDAwMEwsIDB4MEwsIDB4MEwpOwotICAgICAgY2FzZSAxMTQ6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTFfMCgweDIwMDAwMDAwMDBMLCAweDBMLCAweDBMKTsKLSAgICAgIGNhc2UgMTE1OgotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmExXzAoMHgxMDAwMDFjMDAwMDAwMDAwTCwgMHgwTCwgMHgwTCk7Ci0gICAgICBjYXNlIDExNjoKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMV8wKDB4NjAwMDNlMDAwMDAwMDAwMEwsIDB4MEwsIDB4MEwpOwotICAgICAgY2FzZSAxMTc6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTFfMCgweDQwMDAwMDAwMDAwMEwsIDB4MEwsIDB4MEwpOwotICAgICAgY2FzZSAxMTg6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTFfMCgweDgwMDE4MDAwMDAwMDAwMDBMLCAweDBMLCAweDBMKTsKLSAgICAgIGNhc2UgMTE5OgotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmExXzAoMHg2MDAwMDAwMDAwMDAwTCwgMHgwTCwgMHgwTCk7Ci0gICAgICBjYXNlIDEyMzoKLSAgICAgICAgIHJldHVybiBqalN0b3BBdFBvcygwLCA4Myk7Ci0gICAgICBjYXNlIDEyNDoKLSAgICAgICAgIGpqbWF0Y2hlZEtpbmQgPSAxMTM7Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTFfMCgweDBMLCAweDEwMDAwMDgwMDAwMDAwMDBMLCAweDRMKTsKLSAgICAgIGNhc2UgMTI1OgotICAgICAgICAgcmV0dXJuIGpqU3RvcEF0UG9zKDAsIDg0KTsKLSAgICAgIGNhc2UgMTI2OgotICAgICAgICAgcmV0dXJuIGpqU3RvcEF0UG9zKDAsIDk2KTsKLSAgICAgIGRlZmF1bHQgOgotICAgICAgICAgcmV0dXJuIGpqTW92ZU5mYV8wKDIsIDApOwotICAgfQotfQotcHJpdmF0ZSBmaW5hbCBpbnQgampNb3ZlU3RyaW5nTGl0ZXJhbERmYTFfMChsb25nIGFjdGl2ZTAsIGxvbmcgYWN0aXZlMSwgbG9uZyBhY3RpdmUyKQotewotICAgdHJ5IHsgY3VyQ2hhciA9IGlucHV0X3N0cmVhbS5yZWFkQ2hhcigpOyB9Ci0gICBjYXRjaChqYXZhLmlvLklPRXhjZXB0aW9uIGUpIHsKLSAgICAgIGpqU3RvcFN0cmluZ0xpdGVyYWxEZmFfMCgwLCBhY3RpdmUwLCBhY3RpdmUxLCBhY3RpdmUyKTsKLSAgICAgIHJldHVybiAxOwotICAgfQotICAgc3dpdGNoKGN1ckNoYXIpCi0gICB7Ci0gICAgICBjYXNlIDM4OgotICAgICAgICAgaWYgKChhY3RpdmUxICYgMHgxMDAwMDAwMDAwMEwpICE9IDBMKQotICAgICAgICAgewotICAgICAgICAgICAgamptYXRjaGVkS2luZCA9IDEwNDsKLSAgICAgICAgICAgIGpqbWF0Y2hlZFBvcyA9IDE7Ci0gICAgICAgICB9Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTJfMChhY3RpdmUwLCAwTCwgYWN0aXZlMSwgMEwsIGFjdGl2ZTIsIDB4OEwpOwotICAgICAgY2FzZSA0MjoKLSAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4MTBMKSAhPSAwTCkKLSAgICAgICAgICAgIHJldHVybiBqalN0b3BBdFBvcygxLCA0KTsKLSAgICAgICAgIGJyZWFrOwotICAgICAgY2FzZSA0MzoKLSAgICAgICAgIGlmICgoYWN0aXZlMSAmIDB4NDAwMDAwMDAwMDBMKSAhPSAwTCkKLSAgICAgICAgICAgIHJldHVybiBqalN0b3BBdFBvcygxLCAxMDYpOwotICAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIDQ1OgotICAgICAgICAgaWYgKChhY3RpdmUxICYgMHg4MDAwMDAwMDAwMEwpICE9IDBMKQotICAgICAgICAgICAgcmV0dXJuIGpqU3RvcEF0UG9zKDEsIDEwNyk7Ci0gICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgNDY6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTJfMChhY3RpdmUwLCAwTCwgYWN0aXZlMSwgMHg4MDAwMDAwTCwgYWN0aXZlMiwgMEwpOwotICAgICAgY2FzZSA0NzoKLSAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4OEwpICE9IDBMKQotICAgICAgICAgICAgcmV0dXJuIGpqU3RvcEF0UG9zKDEsIDMpOwotICAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIDU4OgotICAgICAgICAgaWYgKChhY3RpdmUxICYgMHg0MDAwMDAwTCkgIT0gMEwpCi0gICAgICAgICAgICByZXR1cm4gampTdG9wQXRQb3MoMSwgOTApOwotICAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIDYwOgotICAgICAgICAgaWYgKChhY3RpdmUxICYgMHgxMDAwMDAwMDAwMDAwMEwpICE9IDBMKQotICAgICAgICAgewotICAgICAgICAgICAgamptYXRjaGVkS2luZCA9IDExNjsKLSAgICAgICAgICAgIGpqbWF0Y2hlZFBvcyA9IDE7Ci0gICAgICAgICB9Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTJfMChhY3RpdmUwLCAwTCwgYWN0aXZlMSwgMHg4MDAwMDAwMDAwMDAwMDAwTCwgYWN0aXZlMiwgMEwpOwotICAgICAgY2FzZSA2MToKLSAgICAgICAgIGlmICgoYWN0aXZlMSAmIDB4ODAwMDAwMDAwTCkgIT0gMEwpCi0gICAgICAgICB7Ci0gICAgICAgICAgICBqam1hdGNoZWRLaW5kID0gOTk7Ci0gICAgICAgICAgICBqam1hdGNoZWRQb3MgPSAxOwotICAgICAgICAgfQotICAgICAgICAgZWxzZSBpZiAoKGFjdGl2ZTEgJiAweDEwMDAwMDAwMDBMKSAhPSAwTCkKLSAgICAgICAgICAgIHJldHVybiBqalN0b3BBdFBvcygxLCAxMDApOwotICAgICAgICAgZWxzZSBpZiAoKGFjdGl2ZTEgJiAweDIwMDAwMDAwMDBMKSAhPSAwTCkKLSAgICAgICAgICAgIHJldHVybiBqalN0b3BBdFBvcygxLCAxMDEpOwotICAgICAgICAgZWxzZSBpZiAoKGFjdGl2ZTEgJiAweDQwMDAwMDAwMDBMKSAhPSAwTCkKLSAgICAgICAgIHsKLSAgICAgICAgICAgIGpqbWF0Y2hlZEtpbmQgPSAxMDI7Ci0gICAgICAgICAgICBqam1hdGNoZWRQb3MgPSAxOwotICAgICAgICAgfQotICAgICAgICAgZWxzZSBpZiAoKGFjdGl2ZTEgJiAweDgwMDAwMDAwMDAwMDAwTCkgIT0gMEwpCi0gICAgICAgICAgICByZXR1cm4gampTdG9wQXRQb3MoMSwgMTE5KTsKLSAgICAgICAgIGVsc2UgaWYgKChhY3RpdmUxICYgMHgxMDAwMDAwMDAwMDAwMDBMKSAhPSAwTCkKLSAgICAgICAgICAgIHJldHVybiBqalN0b3BBdFBvcygxLCAxMjApOwotICAgICAgICAgZWxzZSBpZiAoKGFjdGl2ZTEgJiAweDIwMDAwMDAwMDAwMDAwMEwpICE9IDBMKQotICAgICAgICAgICAgcmV0dXJuIGpqU3RvcEF0UG9zKDEsIDEyMSk7Ci0gICAgICAgICBlbHNlIGlmICgoYWN0aXZlMSAmIDB4NDAwMDAwMDAwMDAwMDAwTCkgIT0gMEwpCi0gICAgICAgICAgICByZXR1cm4gampTdG9wQXRQb3MoMSwgMTIyKTsKLSAgICAgICAgIGVsc2UgaWYgKChhY3RpdmUxICYgMHg4MDAwMDAwMDAwMDAwMDBMKSAhPSAwTCkKLSAgICAgICAgICAgIHJldHVybiBqalN0b3BBdFBvcygxLCAxMjMpOwotICAgICAgICAgZWxzZSBpZiAoKGFjdGl2ZTEgJiAweDEwMDAwMDAwMDAwMDAwMDBMKSAhPSAwTCkKLSAgICAgICAgICAgIHJldHVybiBqalN0b3BBdFBvcygxLCAxMjQpOwotICAgICAgICAgZWxzZSBpZiAoKGFjdGl2ZTEgJiAweDIwMDAwMDAwMDAwMDAwMDBMKSAhPSAwTCkKLSAgICAgICAgICAgIHJldHVybiBqalN0b3BBdFBvcygxLCAxMjUpOwotICAgICAgICAgZWxzZSBpZiAoKGFjdGl2ZTEgJiAweDQwMDAwMDAwMDAwMDAwMDBMKSAhPSAwTCkKLSAgICAgICAgICAgIHJldHVybiBqalN0b3BBdFBvcygxLCAxMjYpOwotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmEyXzAoYWN0aXZlMCwgMEwsIGFjdGl2ZTEsIDBMLCBhY3RpdmUyLCAweDYwTCk7Ci0gICAgICBjYXNlIDYyOgotICAgICAgICAgaWYgKChhY3RpdmUxICYgMHgyMDAwMDAwMDAwMDAwMEwpICE9IDBMKQotICAgICAgICAgewotICAgICAgICAgICAgamptYXRjaGVkS2luZCA9IDExNzsKLSAgICAgICAgICAgIGpqbWF0Y2hlZFBvcyA9IDE7Ci0gICAgICAgICB9Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTJfMChhY3RpdmUwLCAwTCwgYWN0aXZlMSwgMHg0MDAwMDAwMDAwMDAwMEwsIGFjdGl2ZTIsIDB4M0wpOwotICAgICAgY2FzZSA5NDoKLSAgICAgICAgIGlmICgoYWN0aXZlMSAmIDB4MjAwMDAwMDAwMDBMKSAhPSAwTCkKLSAgICAgICAgIHsKLSAgICAgICAgICAgIGpqbWF0Y2hlZEtpbmQgPSAxMDU7Ci0gICAgICAgICAgICBqam1hdGNoZWRQb3MgPSAxOwotICAgICAgICAgfQotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmEyXzAoYWN0aXZlMCwgMEwsIGFjdGl2ZTEsIDBMLCBhY3RpdmUyLCAweDEwTCk7Ci0gICAgICBjYXNlIDk3OgotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmEyXzAoYWN0aXZlMCwgMHg0MDA4MDA0ODAxMDBjMDBMLCBhY3RpdmUxLCAwTCwgYWN0aXZlMiwgMEwpOwotICAgICAgY2FzZSA5ODoKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMl8wKGFjdGl2ZTAsIDB4ODAwMDAwMDAwMDAwMEwsIGFjdGl2ZTEsIDBMLCBhY3RpdmUyLCAwTCk7Ci0gICAgICBjYXNlIDEwMToKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMl8wKGFjdGl2ZTAsIDB4MTAwMDYxMDIwMTgwMDBMLCBhY3RpdmUxLCAwTCwgYWN0aXZlMiwgMEwpOwotICAgICAgY2FzZSAxMDI6Ci0gICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDQwMDAwMDBMKSAhPSAwTCkKLSAgICAgICAgICAgIHJldHVybiBqalN0YXJ0TmZhV2l0aFN0YXRlc18wKDEsIDI2LCAzMCk7Ci0gICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgMTA0OgotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmEyXzAoYWN0aXZlMCwgMHgyMDAyMDYwMDAwMDAwMDAwTCwgYWN0aXZlMSwgMEwsIGFjdGl2ZTIsIDBMKTsKLSAgICAgIGNhc2UgMTA1OgotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmEyXzAoYWN0aXZlMCwgMHg0MDAwMDAwMjAwMDAwTCwgYWN0aXZlMSwgMEwsIGFjdGl2ZTIsIDBMKTsKLSAgICAgIGNhc2UgMTA4OgotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmEyXzAoYWN0aXZlMCwgMHg0MTAwMEwsIGFjdGl2ZTEsIDBMLCBhY3RpdmUyLCAwTCk7Ci0gICAgICBjYXNlIDEwOToKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMl8wKGFjdGl2ZTAsIDB4MTAwMDAwMDAwMDAwMDAwTCwgYWN0aXZlMSwgMHgxTCwgYWN0aXZlMiwgMEwpOwotICAgICAgY2FzZSAxMTA6Ci0gICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDgwMDAwMDBMKSAhPSAwTCkKLSAgICAgICAgIHsKLSAgICAgICAgICAgIGpqbWF0Y2hlZEtpbmQgPSAyNzsKLSAgICAgICAgICAgIGpqbWF0Y2hlZFBvcyA9IDE7Ci0gICAgICAgICB9Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTJfMChhY3RpdmUwLCAweDIyMDAwMDAzMDAwMDAwMEwsIGFjdGl2ZTEsIDBMLCBhY3RpdmUyLCAwTCk7Ci0gICAgICBjYXNlIDExMToKLSAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4MjAwMDBMKSAhPSAwTCkKLSAgICAgICAgICAgIHJldHVybiBqalN0YXJ0TmZhV2l0aFN0YXRlc18wKDEsIDE3LCAzMCk7Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTJfMChhY3RpdmUwLCAweDgwODEwMDAwMDA0MDYwMDBMLCBhY3RpdmUxLCAwTCwgYWN0aXZlMiwgMEwpOwotICAgICAgY2FzZSAxMTQ6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTJfMChhY3RpdmUwLCAweDQ4MDAxODA4MDAwMDAyMDBMLCBhY3RpdmUxLCAwTCwgYWN0aXZlMiwgMEwpOwotICAgICAgY2FzZSAxMTU6Ci0gICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDEwMEwpICE9IDBMKQotICAgICAgICAgICAgcmV0dXJuIGpqU3RhcnROZmFXaXRoU3RhdGVzXzAoMSwgOCwgMzApOwotICAgICAgICAgZWxzZSBpZiAoKGFjdGl2ZTAgJiAweDQwMDAwMDAwTCkgIT0gMEwpCi0gICAgICAgICAgICByZXR1cm4gampTdGFydE5mYVdpdGhTdGF0ZXNfMCgxLCAzMCwgMzApOwotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmEyXzAoYWN0aXZlMCwgMHg0MDAwMDAwMDAwMDBMLCBhY3RpdmUxLCAwTCwgYWN0aXZlMiwgMEwpOwotICAgICAgY2FzZSAxMTc6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTJfMChhY3RpdmUwLCAweDkyMDE4MDAwMDBMLCBhY3RpdmUxLCAwTCwgYWN0aXZlMiwgMEwpOwotICAgICAgY2FzZSAxMTk6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTJfMChhY3RpdmUwLCAweDEwMDAwMDAwMDAwTCwgYWN0aXZlMSwgMEwsIGFjdGl2ZTIsIDBMKTsKLSAgICAgIGNhc2UgMTIwOgotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmEyXzAoYWN0aXZlMCwgMHg0MDAwMDAwMDA4MDAwMEwsIGFjdGl2ZTEsIDBMLCBhY3RpdmUyLCAwTCk7Ci0gICAgICBjYXNlIDEyMToKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMl8wKGFjdGl2ZTAsIDB4MTAwMDIwMDAwMDAwMDAwMEwsIGFjdGl2ZTEsIDBMLCBhY3RpdmUyLCAwTCk7Ci0gICAgICBjYXNlIDEyNDoKLSAgICAgICAgIGlmICgoYWN0aXZlMSAmIDB4ODAwMDAwMDAwMEwpICE9IDBMKQotICAgICAgICAgewotICAgICAgICAgICAgamptYXRjaGVkS2luZCA9IDEwMzsKLSAgICAgICAgICAgIGpqbWF0Y2hlZFBvcyA9IDE7Ci0gICAgICAgICB9Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTJfMChhY3RpdmUwLCAwTCwgYWN0aXZlMSwgMEwsIGFjdGl2ZTIsIDB4NEwpOwotICAgICAgZGVmYXVsdCA6Ci0gICAgICAgICBicmVhazsKLSAgIH0KLSAgIHJldHVybiBqalN0YXJ0TmZhXzAoMCwgYWN0aXZlMCwgYWN0aXZlMSwgYWN0aXZlMik7Ci19Ci1wcml2YXRlIGZpbmFsIGludCBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMl8wKGxvbmcgb2xkMCwgbG9uZyBhY3RpdmUwLCBsb25nIG9sZDEsIGxvbmcgYWN0aXZlMSwgbG9uZyBvbGQyLCBsb25nIGFjdGl2ZTIpCi17Ci0gICBpZiAoKChhY3RpdmUwICY9IG9sZDApIHwgKGFjdGl2ZTEgJj0gb2xkMSkgfCAoYWN0aXZlMiAmPSBvbGQyKSkgPT0gMEwpCi0gICAgICByZXR1cm4gampTdGFydE5mYV8wKDAsIG9sZDAsIG9sZDEsIG9sZDIpOyAKLSAgIHRyeSB7IGN1ckNoYXIgPSBpbnB1dF9zdHJlYW0ucmVhZENoYXIoKTsgfQotICAgY2F0Y2goamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICBqalN0b3BTdHJpbmdMaXRlcmFsRGZhXzAoMSwgYWN0aXZlMCwgYWN0aXZlMSwgYWN0aXZlMik7Ci0gICAgICByZXR1cm4gMjsKLSAgIH0KLSAgIHN3aXRjaChjdXJDaGFyKQotICAgewotICAgICAgY2FzZSA0NjoKLSAgICAgICAgIGlmICgoYWN0aXZlMSAmIDB4ODAwMDAwMEwpICE9IDBMKQotICAgICAgICAgICAgcmV0dXJuIGpqU3RvcEF0UG9zKDIsIDkxKTsKLSAgICAgICAgIGJyZWFrOwotICAgICAgY2FzZSA2MToKLSAgICAgICAgIGlmICgoYWN0aXZlMSAmIDB4ODAwMDAwMDAwMDAwMDAwMEwpICE9IDBMKQotICAgICAgICAgICAgcmV0dXJuIGpqU3RvcEF0UG9zKDIsIDEyNyk7Ci0gICAgICAgICBlbHNlIGlmICgoYWN0aXZlMiAmIDB4MUwpICE9IDBMKQotICAgICAgICAgICAgcmV0dXJuIGpqU3RvcEF0UG9zKDIsIDEyOCk7Ci0gICAgICAgICBlbHNlIGlmICgoYWN0aXZlMiAmIDB4NEwpICE9IDBMKQotICAgICAgICAgICAgcmV0dXJuIGpqU3RvcEF0UG9zKDIsIDEzMCk7Ci0gICAgICAgICBlbHNlIGlmICgoYWN0aXZlMiAmIDB4OEwpICE9IDBMKQotICAgICAgICAgICAgcmV0dXJuIGpqU3RvcEF0UG9zKDIsIDEzMSk7Ci0gICAgICAgICBlbHNlIGlmICgoYWN0aXZlMiAmIDB4MTBMKSAhPSAwTCkKLSAgICAgICAgICAgIHJldHVybiBqalN0b3BBdFBvcygyLCAxMzIpOwotICAgICAgICAgZWxzZSBpZiAoKGFjdGl2ZTIgJiAweDIwTCkgIT0gMEwpCi0gICAgICAgICAgICByZXR1cm4gampTdG9wQXRQb3MoMiwgMTMzKTsKLSAgICAgICAgIGVsc2UgaWYgKChhY3RpdmUyICYgMHg0MEwpICE9IDBMKQotICAgICAgICAgICAgcmV0dXJuIGpqU3RvcEF0UG9zKDIsIDEzNCk7Ci0gICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgNjI6Ci0gICAgICAgICBpZiAoKGFjdGl2ZTEgJiAweDQwMDAwMDAwMDAwMDAwTCkgIT0gMEwpCi0gICAgICAgICB7Ci0gICAgICAgICAgICBqam1hdGNoZWRLaW5kID0gMTE4OwotICAgICAgICAgICAgamptYXRjaGVkUG9zID0gMjsKLSAgICAgICAgIH0KLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhM18wKGFjdGl2ZTAsIDBMLCBhY3RpdmUxLCAwTCwgYWN0aXZlMiwgMHgyTCk7Ci0gICAgICBjYXNlIDk3OgotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmEzXzAoYWN0aXZlMCwgMHg0MDAwMDAwMDAwMDAxMDAwTCwgYWN0aXZlMSwgMEwsIGFjdGl2ZTIsIDBMKTsKLSAgICAgIGNhc2UgOTg6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTNfMChhY3RpdmUwLCAweDEwMDAxMDAwMDAwMDAwTCwgYWN0aXZlMSwgMEwsIGFjdGl2ZTIsIDBMKTsKLSAgICAgIGNhc2UgOTk6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTNfMChhY3RpdmUwLCAweDQxMDAwMDAwMEwsIGFjdGl2ZTEsIDBMLCBhY3RpdmUyLCAwTCk7Ci0gICAgICBjYXNlIDEwMToKLSAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4NDAwMDAwMDAwMDAwTCkgIT0gMEwpCi0gICAgICAgICAgICByZXR1cm4gampTdGFydE5mYVdpdGhTdGF0ZXNfMCgyLCA0NiwgMzApOwotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmEzXzAoYWN0aXZlMCwgMHgyMDBMLCBhY3RpdmUxLCAwTCwgYWN0aXZlMiwgMEwpOwotICAgICAgY2FzZSAxMDI6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTNfMChhY3RpdmUwLCAweDgwMDBMLCBhY3RpdmUxLCAwTCwgYWN0aXZlMiwgMEwpOwotICAgICAgY2FzZSAxMDU6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTNfMChhY3RpdmUwLCAweDMwMzA4MDAwMDAwMDBMLCBhY3RpdmUxLCAwTCwgYWN0aXZlMiwgMEwpOwotICAgICAgY2FzZSAxMDg6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTNfMChhY3RpdmUwLCAweDgwMDAwMDAyMDAxMTAwMDBMLCBhY3RpdmUxLCAwTCwgYWN0aXZlMiwgMEwpOwotICAgICAgY2FzZSAxMDk6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTNfMChhY3RpdmUwLCAweDgwMDAwMDAwTCwgYWN0aXZlMSwgMEwsIGFjdGl2ZTIsIDBMKTsKLSAgICAgIGNhc2UgMTEwOgotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmEzXzAoYWN0aXZlMCwgMHgxMDAwMDAwMDAxYTA2MDAwTCwgYWN0aXZlMSwgMEwsIGFjdGl2ZTIsIDBMKTsKLSAgICAgIGNhc2UgMTExOgotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmEzXzAoYWN0aXZlMCwgMHg4MDAwMDAwMDAwMDAwMDBMLCBhY3RpdmUxLCAwTCwgYWN0aXZlMiwgMEwpOwotICAgICAgY2FzZSAxMTI6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTNfMChhY3RpdmUwLCAweDE0MDIwODAwMDAwMDAwMEwsIGFjdGl2ZTEsIDB4MUwsIGFjdGl2ZTIsIDBMKTsKLSAgICAgIGNhc2UgMTE0OgotICAgICAgICAgaWYgKChhY3RpdmUwICYgMHg0MDAwMDBMKSAhPSAwTCkKLSAgICAgICAgICAgIHJldHVybiBqalN0YXJ0TmZhV2l0aFN0YXRlc18wKDIsIDIyLCAzMCk7Ci0gICAgICAgICBlbHNlIGlmICgoYWN0aXZlMCAmIDB4ODAwMDAwMDAwMDAwTCkgIT0gMEwpCi0gICAgICAgICAgICByZXR1cm4gampTdGFydE5mYVdpdGhTdGF0ZXNfMCgyLCA0NywgMzApOwotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmEzXzAoYWN0aXZlMCwgMHgyMDAwMDQwMDAwMDAwMDAwTCwgYWN0aXZlMSwgMEwsIGFjdGl2ZTIsIDBMKTsKLSAgICAgIGNhc2UgMTE1OgotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmEzXzAoYWN0aXZlMCwgMHg4MDAwMDIwMDQwNDAwTCwgYWN0aXZlMSwgMEwsIGFjdGl2ZTIsIDBMKTsKLSAgICAgIGNhc2UgMTE2OgotICAgICAgICAgaWYgKChhY3RpdmUwICYgMHgyMDAwMDAwTCkgIT0gMEwpCi0gICAgICAgICAgICByZXR1cm4gampTdGFydE5mYVdpdGhTdGF0ZXNfMCgyLCAyNSwgMzApOwotICAgICAgICAgZWxzZSBpZiAoKGFjdGl2ZTAgJiAweDQwMDAwMDAwMDBMKSAhPSAwTCkKLSAgICAgICAgICAgIHJldHVybiBqalN0YXJ0TmZhV2l0aFN0YXRlc18wKDIsIDM4LCAzMCk7Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTNfMChhY3RpdmUwLCAweDY4NDAwMjAwMDA4MDgwMEwsIGFjdGl2ZTEsIDBMLCBhY3RpdmUyLCAwTCk7Ci0gICAgICBjYXNlIDExNzoKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhM18wKGFjdGl2ZTAsIDB4MjAwODAwMDAwMDAwMDBMLCBhY3RpdmUxLCAwTCwgYWN0aXZlMiwgMEwpOwotICAgICAgY2FzZSAxMTk6Ci0gICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDEwMDAwMDAwMEwpICE9IDBMKQotICAgICAgICAgICAgcmV0dXJuIGpqU3RhcnROZmFXaXRoU3RhdGVzXzAoMiwgMzIsIDMwKTsKLSAgICAgICAgIGJyZWFrOwotICAgICAgY2FzZSAxMjE6Ci0gICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDEwMDAwMDAwMDAwMEwpICE9IDBMKQotICAgICAgICAgICAgcmV0dXJuIGpqU3RhcnROZmFXaXRoU3RhdGVzXzAoMiwgNDQsIDMwKTsKLSAgICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdCA6Ci0gICAgICAgICBicmVhazsKLSAgIH0KLSAgIHJldHVybiBqalN0YXJ0TmZhXzAoMSwgYWN0aXZlMCwgYWN0aXZlMSwgYWN0aXZlMik7Ci19Ci1wcml2YXRlIGZpbmFsIGludCBqak1vdmVTdHJpbmdMaXRlcmFsRGZhM18wKGxvbmcgb2xkMCwgbG9uZyBhY3RpdmUwLCBsb25nIG9sZDEsIGxvbmcgYWN0aXZlMSwgbG9uZyBvbGQyLCBsb25nIGFjdGl2ZTIpCi17Ci0gICBpZiAoKChhY3RpdmUwICY9IG9sZDApIHwgKGFjdGl2ZTEgJj0gb2xkMSkgfCAoYWN0aXZlMiAmPSBvbGQyKSkgPT0gMEwpCi0gICAgICByZXR1cm4gampTdGFydE5mYV8wKDEsIG9sZDAsIG9sZDEsIG9sZDIpOyAKLSAgIHRyeSB7IGN1ckNoYXIgPSBpbnB1dF9zdHJlYW0ucmVhZENoYXIoKTsgfQotICAgY2F0Y2goamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICBqalN0b3BTdHJpbmdMaXRlcmFsRGZhXzAoMiwgYWN0aXZlMCwgYWN0aXZlMSwgYWN0aXZlMik7Ci0gICAgICByZXR1cm4gMzsKLSAgIH0KLSAgIHN3aXRjaChjdXJDaGFyKQotICAgewotICAgICAgY2FzZSA2MToKLSAgICAgICAgIGlmICgoYWN0aXZlMiAmIDB4MkwpICE9IDBMKQotICAgICAgICAgICAgcmV0dXJuIGpqU3RvcEF0UG9zKDMsIDEyOSk7Ci0gICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgOTc6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTRfMChhY3RpdmUwLCAweDgwMDAwMDAwMDAyMDgyMDBMLCBhY3RpdmUxLCAwTCwgYWN0aXZlMiwgMEwpOwotICAgICAgY2FzZSA5OToKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhNF8wKGFjdGl2ZTAsIDB4MTAwMDAwMDAwMTgwMDgwMEwsIGFjdGl2ZTEsIDBMLCBhY3RpdmUyLCAwTCk7Ci0gICAgICBjYXNlIDEwMDoKLSAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4MTAwMDAwMDAwMDAwMEwpICE9IDBMKQotICAgICAgICAgICAgcmV0dXJuIGpqU3RhcnROZmFXaXRoU3RhdGVzXzAoMywgNDgsIDMwKTsKLSAgICAgICAgIGJyZWFrOwotICAgICAgY2FzZSAxMDE6Ci0gICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDQwMEwpICE9IDBMKQotICAgICAgICAgICAgcmV0dXJuIGpqU3RhcnROZmFXaXRoU3RhdGVzXzAoMywgMTAsIDMwKTsKLSAgICAgICAgIGVsc2UgaWYgKChhY3RpdmUwICYgMHg0MDAwMEwpICE9IDBMKQotICAgICAgICAgICAgcmV0dXJuIGpqU3RhcnROZmFXaXRoU3RhdGVzXzAoMywgMTgsIDMwKTsKLSAgICAgICAgIGVsc2UgaWYgKChhY3RpdmUwICYgMHg4MDAwMDAwMDAwMEwpICE9IDBMKQotICAgICAgICAgICAgcmV0dXJuIGpqU3RhcnROZmFXaXRoU3RhdGVzXzAoMywgNDMsIDMwKTsKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhNF8wKGFjdGl2ZTAsIDB4MjAwMjA4MDgwMDkwMDAwTCwgYWN0aXZlMSwgMEwsIGFjdGl2ZTIsIDBMKTsKLSAgICAgIGNhc2UgMTA0OgotICAgICAgICAgaWYgKChhY3RpdmUwICYgMHg0MDAwMDAwMDAwMDAwTCkgIT0gMEwpCi0gICAgICAgICAgICByZXR1cm4gampTdGFydE5mYVdpdGhTdGF0ZXNfMCgzLCA1MCwgMzApOwotICAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIDEwNToKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhNF8wKGFjdGl2ZTAsIDB4NDAwMDAwMDAwMDAwMDAwTCwgYWN0aXZlMSwgMEwsIGFjdGl2ZTIsIDBMKTsKLSAgICAgIGNhc2UgMTA3OgotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmE0XzAoYWN0aXZlMCwgMHg0MDAwMDAwMDBMLCBhY3RpdmUxLCAwTCwgYWN0aXZlMiwgMEwpOwotICAgICAgY2FzZSAxMDg6Ci0gICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDIwMDAwMDAwMEwpICE9IDBMKQotICAgICAgICAgICAgcmV0dXJuIGpqU3RhcnROZmFXaXRoU3RhdGVzXzAoMywgMzMsIDMwKTsKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhNF8wKGFjdGl2ZTAsIDB4MTAyMDAxMDEwMDAwMDAwTCwgYWN0aXZlMSwgMEwsIGFjdGl2ZTIsIDBMKTsKLSAgICAgIGNhc2UgMTA5OgotICAgICAgICAgaWYgKChhY3RpdmUwICYgMHgyMDAwMDAwMDAwMDAwMEwpICE9IDBMKQotICAgICAgICAgICAgcmV0dXJuIGpqU3RhcnROZmFXaXRoU3RhdGVzXzAoMywgNTMsIDMwKTsKLSAgICAgICAgIGJyZWFrOwotICAgICAgY2FzZSAxMTA6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTRfMChhY3RpdmUwLCAweDQwMDAwMDAwMDAwMDAwMDBMLCBhY3RpdmUxLCAwTCwgYWN0aXZlMiwgMEwpOwotICAgICAgY2FzZSAxMTE6Ci0gICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDgwMDAwMDAwMDAwMDAwTCkgIT0gMEwpCi0gICAgICAgICAgICByZXR1cm4gampTdGFydE5mYVdpdGhTdGF0ZXNfMCgzLCA1NSwgMzApOwotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmE0XzAoYWN0aXZlMCwgMHgyMDQwMDQwMDAwMDAwMDAwTCwgYWN0aXZlMSwgMHgxTCwgYWN0aXZlMiwgMEwpOwotICAgICAgY2FzZSAxMTU6Ci0gICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDIwMDAwMDAwMDAwTCkgIT0gMEwpCi0gICAgICAgICAgICByZXR1cm4gampTdGFydE5mYVdpdGhTdGF0ZXNfMCgzLCA0MSwgMzApOwotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmE0XzAoYWN0aXZlMCwgMHgxMDMwMDBMLCBhY3RpdmUxLCAwTCwgYWN0aXZlMiwgMEwpOwotICAgICAgY2FzZSAxMTY6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTRfMChhY3RpdmUwLCAweDgwODAxMDAyMDAwNDAwMEwsIGFjdGl2ZTEsIDBMLCBhY3RpdmUyLCAwTCk7Ci0gICAgICBjYXNlIDExNzoKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhNF8wKGFjdGl2ZTAsIDB4MTAwMDIwMDAwMDAwMDBMLCBhY3RpdmUxLCAwTCwgYWN0aXZlMiwgMEwpOwotICAgICAgY2FzZSAxMTg6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTRfMChhY3RpdmUwLCAweDgwMDAwMDAwMEwsIGFjdGl2ZTEsIDBMLCBhY3RpdmUyLCAwTCk7Ci0gICAgICBkZWZhdWx0IDoKLSAgICAgICAgIGJyZWFrOwotICAgfQotICAgcmV0dXJuIGpqU3RhcnROZmFfMCgyLCBhY3RpdmUwLCBhY3RpdmUxLCBhY3RpdmUyKTsKLX0KLXByaXZhdGUgZmluYWwgaW50IGpqTW92ZVN0cmluZ0xpdGVyYWxEZmE0XzAobG9uZyBvbGQwLCBsb25nIGFjdGl2ZTAsIGxvbmcgb2xkMSwgbG9uZyBhY3RpdmUxLCBsb25nIG9sZDIsIGxvbmcgYWN0aXZlMikKLXsKLSAgIGlmICgoKGFjdGl2ZTAgJj0gb2xkMCkgfCAoYWN0aXZlMSAmPSBvbGQxKSB8IChhY3RpdmUyICY9IG9sZDIpKSA9PSAwTCkKLSAgICAgIHJldHVybiBqalN0YXJ0TmZhXzAoMiwgb2xkMCwgb2xkMSwgb2xkMik7IAotICAgdHJ5IHsgY3VyQ2hhciA9IGlucHV0X3N0cmVhbS5yZWFkQ2hhcigpOyB9Ci0gICBjYXRjaChqYXZhLmlvLklPRXhjZXB0aW9uIGUpIHsKLSAgICAgIGpqU3RvcFN0cmluZ0xpdGVyYWxEZmFfMCgzLCBhY3RpdmUwLCBhY3RpdmUxLCAwTCk7Ci0gICAgICByZXR1cm4gNDsKLSAgIH0KLSAgIHN3aXRjaChjdXJDaGFyKQotICAgewotICAgICAgY2FzZSA5NzoKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhNV8wKGFjdGl2ZTAsIDB4YzIwMDAwMDAwTCwgYWN0aXZlMSwgMEwpOwotICAgICAgY2FzZSA5OToKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhNV8wKGFjdGl2ZTAsIDB4MTAwMDAwMDAwMDBMLCBhY3RpdmUxLCAwTCk7Ci0gICAgICBjYXNlIDEwMToKLSAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4MTAwMDAwTCkgIT0gMEwpCi0gICAgICAgICAgICByZXR1cm4gampTdGFydE5mYVdpdGhTdGF0ZXNfMCg0LCAyMCwgMzApOwotICAgICAgICAgZWxzZSBpZiAoKGFjdGl2ZTAgJiAweDIwMDAwMDAwMDAwMDBMKSAhPSAwTCkKLSAgICAgICAgICAgIHJldHVybiBqalN0YXJ0TmZhV2l0aFN0YXRlc18wKDQsIDQ5LCAzMCk7Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTVfMChhY3RpdmUwLCAweDkwMDAwMDAwMDAwMDAwMEwsIGFjdGl2ZTEsIDBMKTsKLSAgICAgIGNhc2UgMTAzOgotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmE1XzAoYWN0aXZlMCwgMHgxMDAwMDAwMDAwMDAwMEwsIGFjdGl2ZTEsIDBMKTsKLSAgICAgIGNhc2UgMTA0OgotICAgICAgICAgaWYgKChhY3RpdmUwICYgMHg4MDBMKSAhPSAwTCkKLSAgICAgICAgICAgIHJldHVybiBqalN0YXJ0TmZhV2l0aFN0YXRlc18wKDQsIDExLCAzMCk7Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTVfMChhY3RpdmUwLCAweDEwMDAwMDAwMDAwMDAwMDBMLCBhY3RpdmUxLCAwTCk7Ci0gICAgICBjYXNlIDEwNToKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhNV8wKGFjdGl2ZTAsIDB4MTAwMDAwNDAwMEwsIGFjdGl2ZTEsIDBMKTsKLSAgICAgIGNhc2UgMTA3OgotICAgICAgICAgaWYgKChhY3RpdmUwICYgMHgyMDBMKSAhPSAwTCkKLSAgICAgICAgICAgIHJldHVybiBqalN0YXJ0TmZhV2l0aFN0YXRlc18wKDQsIDksIDMwKTsKLSAgICAgICAgIGJyZWFrOwotICAgICAgY2FzZSAxMDg6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTVfMChhY3RpdmUwLCAweDIwMDAwMEwsIGFjdGl2ZTEsIDBMKTsKLSAgICAgIGNhc2UgMTEwOgotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmE1XzAoYWN0aXZlMCwgMHg4MDAwMEwsIGFjdGl2ZTEsIDBMKTsKLSAgICAgIGNhc2UgMTExOgotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmE1XzAoYWN0aXZlMCwgMHgyMDAwMDAwMDAwMDBMLCBhY3RpdmUxLCAwTCk7Ci0gICAgICBjYXNlIDExNDoKLSAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4ODAwMDAwMDAwMEwpICE9IDBMKQotICAgICAgICAgICAgcmV0dXJuIGpqU3RhcnROZmFXaXRoU3RhdGVzXzAoNCwgMzksIDMwKTsKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhNV8wKGFjdGl2ZTAsIDB4MjQ4MDAyMDAwMDAwMDAwTCwgYWN0aXZlMSwgMHgxTCk7Ci0gICAgICBjYXNlIDExNToKLSAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4MTAwMEwpICE9IDBMKQotICAgICAgICAgICAgcmV0dXJuIGpqU3RhcnROZmFXaXRoU3RhdGVzXzAoNCwgMTIsIDMwKTsKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhNV8wKGFjdGl2ZTAsIDB4NDAwMDAwMDA4MDAwMDAwMEwsIGFjdGl2ZTEsIDBMKTsKLSAgICAgIGNhc2UgMTE2OgotICAgICAgICAgaWYgKChhY3RpdmUwICYgMHgyMDAwTCkgIT0gMEwpCi0gICAgICAgICAgICByZXR1cm4gampTdGFydE5mYVdpdGhTdGF0ZXNfMCg0LCAxMywgMzApOwotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmE1XzAoYWN0aXZlMCwgMHg4MDAwMDAwMDAxODEwMDAwTCwgYWN0aXZlMSwgMEwpOwotICAgICAgY2FzZSAxMTc6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTVfMChhY3RpdmUwLCAweDEwMDA4MDAwTCwgYWN0aXZlMSwgMEwpOwotICAgICAgY2FzZSAxMTg6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTVfMChhY3RpdmUwLCAweDQwMDAwMDAwMDAwMDAwMEwsIGFjdGl2ZTEsIDBMKTsKLSAgICAgIGNhc2UgMTE5OgotICAgICAgICAgaWYgKChhY3RpdmUwICYgMHg0MDAwMDAwMDAwMEwpICE9IDBMKQotICAgICAgICAgewotICAgICAgICAgICAgamptYXRjaGVkS2luZCA9IDQyOwotICAgICAgICAgICAgamptYXRjaGVkUG9zID0gNDsKLSAgICAgICAgIH0KLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhNV8wKGFjdGl2ZTAsIDB4MjAwMDAwMDAwMDAwMDAwMEwsIGFjdGl2ZTEsIDBMKTsKLSAgICAgIGRlZmF1bHQgOgotICAgICAgICAgYnJlYWs7Ci0gICB9Ci0gICByZXR1cm4gampTdGFydE5mYV8wKDMsIGFjdGl2ZTAsIGFjdGl2ZTEsIDBMKTsKLX0KLXByaXZhdGUgZmluYWwgaW50IGpqTW92ZVN0cmluZ0xpdGVyYWxEZmE1XzAobG9uZyBvbGQwLCBsb25nIGFjdGl2ZTAsIGxvbmcgb2xkMSwgbG9uZyBhY3RpdmUxKQotewotICAgaWYgKCgoYWN0aXZlMCAmPSBvbGQwKSB8IChhY3RpdmUxICY9IG9sZDEpKSA9PSAwTCkKLSAgICAgIHJldHVybiBqalN0YXJ0TmZhXzAoMywgb2xkMCwgb2xkMSwgMEwpOwotICAgdHJ5IHsgY3VyQ2hhciA9IGlucHV0X3N0cmVhbS5yZWFkQ2hhcigpOyB9Ci0gICBjYXRjaChqYXZhLmlvLklPRXhjZXB0aW9uIGUpIHsKLSAgICAgIGpqU3RvcFN0cmluZ0xpdGVyYWxEZmFfMCg0LCBhY3RpdmUwLCBhY3RpdmUxLCAwTCk7Ci0gICAgICByZXR1cm4gNTsKLSAgIH0KLSAgIHN3aXRjaChjdXJDaGFyKQotICAgewotICAgICAgY2FzZSA5NzoKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhNl8wKGFjdGl2ZTAsIDB4ODAwMDAwMDAwMDAwMEwsIGFjdGl2ZTEsIDBMKTsKLSAgICAgIGNhc2UgOTk6Ci0gICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDEwMDAwMDAwMDBMKSAhPSAwTCkKLSAgICAgICAgICAgIHJldHVybiBqalN0YXJ0TmZhV2l0aFN0YXRlc18wKDUsIDM2LCAzMCk7Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTZfMChhY3RpdmUwLCAweDgwMDAwMDAwMDAwMDAwMEwsIGFjdGl2ZTEsIDBMKTsKLSAgICAgIGNhc2UgMTAwOgotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmE2XzAoYWN0aXZlMCwgMHgxMDA4MDAwMEwsIGFjdGl2ZTEsIDBMKTsKLSAgICAgIGNhc2UgMTAxOgotICAgICAgICAgaWYgKChhY3RpdmUwICYgMHgxMDAwMEwpICE9IDBMKQotICAgICAgICAgICAgcmV0dXJuIGpqU3RhcnROZmFXaXRoU3RhdGVzXzAoNSwgMTYsIDMwKTsKLSAgICAgICAgIGVsc2UgaWYgKChhY3RpdmUwICYgMHg0MDAwMDAwMDAwMDAwMDBMKSAhPSAwTCkKLSAgICAgICAgICAgIHJldHVybiBqalN0YXJ0TmZhV2l0aFN0YXRlc18wKDUsIDU4LCAzMCk7Ci0gICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgMTAyOgotICAgICAgICAgaWYgKChhY3RpdmUwICYgMHgyMDAwMDAwMDAwMDBMKSAhPSAwTCkKLSAgICAgICAgICAgIHJldHVybiBqalN0YXJ0TmZhV2l0aFN0YXRlc18wKDUsIDQ1LCAzMCk7Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTZfMChhY3RpdmUwLCAweDIwMDAwMDAwMDAwMDAwMEwsIGFjdGl2ZTEsIDBMKTsKLSAgICAgIGNhc2UgMTAzOgotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmE2XzAoYWN0aXZlMCwgMHgxMDAwMDQwMDAwMDAwMEwsIGFjdGl2ZTEsIDBMKTsKLSAgICAgIGNhc2UgMTA0OgotICAgICAgICAgaWYgKChhY3RpdmUwICYgMHgxMDAwMDAwMDAwMEwpICE9IDBMKQotICAgICAgICAgICAgcmV0dXJuIGpqU3RhcnROZmFXaXRoU3RhdGVzXzAoNSwgNDAsIDMwKTsKLSAgICAgICAgIGJyZWFrOwotICAgICAgY2FzZSAxMDU6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTZfMChhY3RpdmUwLCAweGMwMDAwMDAwMDE4MDAwMDBMLCBhY3RpdmUxLCAwTCk7Ci0gICAgICBjYXNlIDEwODoKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhNl8wKGFjdGl2ZTAsIDB4MjA4MDAwTCwgYWN0aXZlMSwgMEwpOwotICAgICAgY2FzZSAxMDk6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTZfMChhY3RpdmUwLCAweDEwMDAwMDAwMDAwMDAwMEwsIGFjdGl2ZTEsIDBMKTsKLSAgICAgIGNhc2UgMTEwOgotICAgICAgICAgaWYgKChhY3RpdmUwICYgMHgyMDAwMDAwMDAwTCkgIT0gMEwpCi0gICAgICAgICAgICByZXR1cm4gampTdGFydE5mYVdpdGhTdGF0ZXNfMCg1LCAzNywgMzApOwotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmE2XzAoYWN0aXZlMCwgMHgyMDAwNDAwMEwsIGFjdGl2ZTEsIDBMKTsKLSAgICAgIGNhc2UgMTEyOgotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmE2XzAoYWN0aXZlMCwgMHg4MDAwMDAwMEwsIGFjdGl2ZTEsIDBMKTsKLSAgICAgIGNhc2UgMTE0OgotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmE2XzAoYWN0aXZlMCwgMHgxMDAwMDAwMDAwMDAwMDAwTCwgYWN0aXZlMSwgMEwpOwotICAgICAgY2FzZSAxMTU6Ci0gICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDIwMDAwMDAwMDAwMDAwMDBMKSAhPSAwTCkKLSAgICAgICAgICAgIHJldHVybiBqalN0YXJ0TmZhV2l0aFN0YXRlc18wKDUsIDYxLCAzMCk7Ci0gICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgMTE2OgotICAgICAgICAgaWYgKChhY3RpdmUwICYgMHg0MDAwMDAwMDAwMDAwMEwpICE9IDBMKQotICAgICAgICAgICAgcmV0dXJuIGpqU3RhcnROZmFXaXRoU3RhdGVzXzAoNSwgNTQsIDMwKTsKLSAgICAgICAgIGVsc2UgaWYgKChhY3RpdmUxICYgMHgxTCkgIT0gMEwpCi0gICAgICAgICAgICByZXR1cm4gampTdGFydE5mYVdpdGhTdGF0ZXNfMCg1LCA2NCwgMzApOwotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmE2XzAoYWN0aXZlMCwgMHg4MDAwMDAwMDBMLCBhY3RpdmUxLCAwTCk7Ci0gICAgICBkZWZhdWx0IDoKLSAgICAgICAgIGJyZWFrOwotICAgfQotICAgcmV0dXJuIGpqU3RhcnROZmFfMCg0LCBhY3RpdmUwLCBhY3RpdmUxLCAwTCk7Ci19Ci1wcml2YXRlIGZpbmFsIGludCBqak1vdmVTdHJpbmdMaXRlcmFsRGZhNl8wKGxvbmcgb2xkMCwgbG9uZyBhY3RpdmUwLCBsb25nIG9sZDEsIGxvbmcgYWN0aXZlMSkKLXsKLSAgIGlmICgoKGFjdGl2ZTAgJj0gb2xkMCkgfCAoYWN0aXZlMSAmPSBvbGQxKSkgPT0gMEwpCi0gICAgICByZXR1cm4gampTdGFydE5mYV8wKDQsIG9sZDAsIG9sZDEsIDBMKTsKLSAgIHRyeSB7IGN1ckNoYXIgPSBpbnB1dF9zdHJlYW0ucmVhZENoYXIoKTsgfQotICAgY2F0Y2goamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICBqalN0b3BTdHJpbmdMaXRlcmFsRGZhXzAoNSwgYWN0aXZlMCwgMEwsIDBMKTsKLSAgICAgIHJldHVybiA2OwotICAgfQotICAgc3dpdGNoKGN1ckNoYXIpCi0gICB7Ci0gICAgICBjYXNlIDk3OgotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmE3XzAoYWN0aXZlMCwgMHgyMDAwMDAwODAwMDAwMDBMKTsKLSAgICAgIGNhc2UgOTk6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTdfMChhY3RpdmUwLCAweDgwMDAwMjAwMDAwMDBMKTsKLSAgICAgIGNhc2UgMTAxOgotICAgICAgICAgaWYgKChhY3RpdmUwICYgMHgxMDAwMDAwMEwpICE9IDBMKQotICAgICAgICAgICAgcmV0dXJuIGpqU3RhcnROZmFXaXRoU3RhdGVzXzAoNiwgMjgsIDMwKTsKLSAgICAgICAgIGVsc2UgaWYgKChhY3RpdmUwICYgMHg0MDAwMDAwMDBMKSAhPSAwTCkKLSAgICAgICAgICAgIHJldHVybiBqalN0YXJ0TmZhV2l0aFN0YXRlc18wKDYsIDM0LCAzMCk7Ci0gICAgICAgICBlbHNlIGlmICgoYWN0aXZlMCAmIDB4ODAwMDAwMDAwTCkgIT0gMEwpCi0gICAgICAgICAgICByZXR1cm4gampTdGFydE5mYVdpdGhTdGF0ZXNfMCg2LCAzNSwgMzApOwotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmE3XzAoYWN0aXZlMCwgMHg0MTEwMDAwMDAwMDAwMDAwTCk7Ci0gICAgICBjYXNlIDEwODoKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhN18wKGFjdGl2ZTAsIDB4ODAwMDAwMDAwMDAwMDAwMEwpOwotICAgICAgY2FzZSAxMTE6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTdfMChhY3RpdmUwLCAweDEwMDAwMDAwMDE4MDAwMDBMKTsKLSAgICAgIGNhc2UgMTE1OgotICAgICAgICAgaWYgKChhY3RpdmUwICYgMHg4MDAwMEwpICE9IDBMKQotICAgICAgICAgICAgcmV0dXJuIGpqU3RhcnROZmFXaXRoU3RhdGVzXzAoNiwgMTksIDMwKTsKLSAgICAgICAgIGJyZWFrOwotICAgICAgY2FzZSAxMTY6Ci0gICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDgwMDBMKSAhPSAwTCkKLSAgICAgICAgICAgIHJldHVybiBqalN0YXJ0TmZhV2l0aFN0YXRlc18wKDYsIDE1LCAzMCk7Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTdfMChhY3RpdmUwLCAweDgwMDAwMDAwMDAwMDAwMEwpOwotICAgICAgY2FzZSAxMTc6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTdfMChhY3RpdmUwLCAweDQwMDBMKTsKLSAgICAgIGNhc2UgMTIxOgotICAgICAgICAgaWYgKChhY3RpdmUwICYgMHgyMDAwMDBMKSAhPSAwTCkKLSAgICAgICAgICAgIHJldHVybiBqalN0YXJ0TmZhV2l0aFN0YXRlc18wKDYsIDIxLCAzMCk7Ci0gICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQgOgotICAgICAgICAgYnJlYWs7Ci0gICB9Ci0gICByZXR1cm4gampTdGFydE5mYV8wKDUsIGFjdGl2ZTAsIDBMLCAwTCk7Ci19Ci1wcml2YXRlIGZpbmFsIGludCBqak1vdmVTdHJpbmdMaXRlcmFsRGZhN18wKGxvbmcgb2xkMCwgbG9uZyBhY3RpdmUwKQotewotICAgaWYgKCgoYWN0aXZlMCAmPSBvbGQwKSkgPT0gMEwpCi0gICAgICByZXR1cm4gampTdGFydE5mYV8wKDUsIG9sZDAsIDBMLCAwTCk7Ci0gICB0cnkgeyBjdXJDaGFyID0gaW5wdXRfc3RyZWFtLnJlYWRDaGFyKCk7IH0KLSAgIGNhdGNoKGphdmEuaW8uSU9FeGNlcHRpb24gZSkgewotICAgICAgampTdG9wU3RyaW5nTGl0ZXJhbERmYV8wKDYsIGFjdGl2ZTAsIDBMLCAwTCk7Ci0gICAgICByZXR1cm4gNzsKLSAgIH0KLSAgIHN3aXRjaChjdXJDaGFyKQotICAgewotICAgICAgY2FzZSA5OToKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhOF8wKGFjdGl2ZTAsIDB4MjAwMDAwMDgwMDAwMDAwTCk7Ci0gICAgICBjYXNlIDEwMToKLSAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4NDAwMEwpICE9IDBMKQotICAgICAgICAgICAgcmV0dXJuIGpqU3RhcnROZmFXaXRoU3RhdGVzXzAoNywgMTQsIDMwKTsKLSAgICAgICAgIGVsc2UgaWYgKChhY3RpdmUwICYgMHg4MDAwMDAwMDAwMDAwMDAwTCkgIT0gMEwpCi0gICAgICAgICAgICByZXR1cm4gampTdGFydE5mYVdpdGhTdGF0ZXNfMCg3LCA2MywgMzApOwotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmE4XzAoYWN0aXZlMCwgMHg4MDAwMDAwMjAwMDAwMDBMKTsKLSAgICAgIGNhc2UgMTEwOgotICAgICAgICAgaWYgKChhY3RpdmUwICYgMHg4MDAwMDBMKSAhPSAwTCkKLSAgICAgICAgICAgIHJldHVybiBqalN0YXJ0TmZhV2l0aFN0YXRlc18wKDcsIDIzLCAzMCk7Ci0gICAgICAgICBlbHNlIGlmICgoYWN0aXZlMCAmIDB4MTAwMDAwMEwpICE9IDBMKQotICAgICAgICAgICAgcmV0dXJuIGpqU3RhcnROZmFXaXRoU3RhdGVzXzAoNywgMjQsIDMwKTsKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhOF8wKGFjdGl2ZTAsIDB4NTEwMDAwMDAwMDAwMDAwMEwpOwotICAgICAgY2FzZSAxMTQ6Ci0gICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDEwMDAwMDAwMDAwMDAwTCkgIT0gMEwpCi0gICAgICAgICAgICByZXR1cm4gampTdGFydE5mYVdpdGhTdGF0ZXNfMCg3LCA1MiwgMzApOwotICAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIDExNjoKLSAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4ODAwMDAwMDAwMDAwMEwpICE9IDBMKQotICAgICAgICAgICAgcmV0dXJuIGpqU3RhcnROZmFXaXRoU3RhdGVzXzAoNywgNTEsIDMwKTsKLSAgICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdCA6Ci0gICAgICAgICBicmVhazsKLSAgIH0KLSAgIHJldHVybiBqalN0YXJ0TmZhXzAoNiwgYWN0aXZlMCwgMEwsIDBMKTsKLX0KLXByaXZhdGUgZmluYWwgaW50IGpqTW92ZVN0cmluZ0xpdGVyYWxEZmE4XzAobG9uZyBvbGQwLCBsb25nIGFjdGl2ZTApCi17Ci0gICBpZiAoKChhY3RpdmUwICY9IG9sZDApKSA9PSAwTCkKLSAgICAgIHJldHVybiBqalN0YXJ0TmZhXzAoNiwgb2xkMCwgMEwsIDBMKTsKLSAgIHRyeSB7IGN1ckNoYXIgPSBpbnB1dF9zdHJlYW0ucmVhZENoYXIoKTsgfQotICAgY2F0Y2goamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICBqalN0b3BTdHJpbmdMaXRlcmFsRGZhXzAoNywgYWN0aXZlMCwgMEwsIDBMKTsKLSAgICAgIHJldHVybiA4OwotICAgfQotICAgc3dpdGNoKGN1ckNoYXIpCi0gICB7Ci0gICAgICBjYXNlIDEwMDoKLSAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4ODAwMDAwMDAwMDAwMDAwTCkgIT0gMEwpCi0gICAgICAgICAgICByZXR1cm4gampTdGFydE5mYVdpdGhTdGF0ZXNfMCg4LCA1OSwgMzApOwotICAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIDEwMToKLSAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4ODAwMDAwMDBMKSAhPSAwTCkKLSAgICAgICAgICAgIHJldHVybiBqalN0YXJ0TmZhV2l0aFN0YXRlc18wKDgsIDMxLCAzMCk7Ci0gICAgICAgICBlbHNlIGlmICgoYWN0aXZlMCAmIDB4MjAwMDAwMDAwMDAwMDAwTCkgIT0gMEwpCi0gICAgICAgICAgICByZXR1cm4gampTdGFydE5mYVdpdGhTdGF0ZXNfMCg4LCA1NywgMzApOwotICAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIDEwNToKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhOV8wKGFjdGl2ZTAsIDB4MTAwMDAwMDAwMDAwMDAwMEwpOwotICAgICAgY2FzZSAxMTE6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTlfMChhY3RpdmUwLCAweDIwMDAwMDAwTCk7Ci0gICAgICBjYXNlIDExNjoKLSAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4NDAwMDAwMDAwMDAwMDAwMEwpICE9IDBMKQotICAgICAgICAgICAgcmV0dXJuIGpqU3RhcnROZmFXaXRoU3RhdGVzXzAoOCwgNjIsIDMwKTsKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhOV8wKGFjdGl2ZTAsIDB4MTAwMDAwMDAwMDAwMDAwTCk7Ci0gICAgICBkZWZhdWx0IDoKLSAgICAgICAgIGJyZWFrOwotICAgfQotICAgcmV0dXJuIGpqU3RhcnROZmFfMCg3LCBhY3RpdmUwLCAwTCwgMEwpOwotfQotcHJpdmF0ZSBmaW5hbCBpbnQgampNb3ZlU3RyaW5nTGl0ZXJhbERmYTlfMChsb25nIG9sZDAsIGxvbmcgYWN0aXZlMCkKLXsKLSAgIGlmICgoKGFjdGl2ZTAgJj0gb2xkMCkpID09IDBMKQotICAgICAgcmV0dXJuIGpqU3RhcnROZmFfMCg3LCBvbGQwLCAwTCwgMEwpOwotICAgdHJ5IHsgY3VyQ2hhciA9IGlucHV0X3N0cmVhbS5yZWFkQ2hhcigpOyB9Ci0gICBjYXRjaChqYXZhLmlvLklPRXhjZXB0aW9uIGUpIHsKLSAgICAgIGpqU3RvcFN0cmluZ0xpdGVyYWxEZmFfMCg4LCBhY3RpdmUwLCAwTCwgMEwpOwotICAgICAgcmV0dXJuIDk7Ci0gICB9Ci0gICBzd2l0Y2goY3VyQ2hhcikKLSAgIHsKLSAgICAgIGNhc2UgMTAyOgotICAgICAgICAgaWYgKChhY3RpdmUwICYgMHgyMDAwMDAwMEwpICE9IDBMKQotICAgICAgICAgICAgcmV0dXJuIGpqU3RhcnROZmFXaXRoU3RhdGVzXzAoOSwgMjksIDMwKTsKLSAgICAgICAgIGJyZWFrOwotICAgICAgY2FzZSAxMTU6Ci0gICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDEwMDAwMDAwMDAwMDAwMEwpICE9IDBMKQotICAgICAgICAgICAgcmV0dXJuIGpqU3RhcnROZmFXaXRoU3RhdGVzXzAoOSwgNTYsIDMwKTsKLSAgICAgICAgIGJyZWFrOwotICAgICAgY2FzZSAxMjI6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTEwXzAoYWN0aXZlMCwgMHgxMDAwMDAwMDAwMDAwMDAwTCk7Ci0gICAgICBkZWZhdWx0IDoKLSAgICAgICAgIGJyZWFrOwotICAgfQotICAgcmV0dXJuIGpqU3RhcnROZmFfMCg4LCBhY3RpdmUwLCAwTCwgMEwpOwotfQotcHJpdmF0ZSBmaW5hbCBpbnQgampNb3ZlU3RyaW5nTGl0ZXJhbERmYTEwXzAobG9uZyBvbGQwLCBsb25nIGFjdGl2ZTApCi17Ci0gICBpZiAoKChhY3RpdmUwICY9IG9sZDApKSA9PSAwTCkKLSAgICAgIHJldHVybiBqalN0YXJ0TmZhXzAoOCwgb2xkMCwgMEwsIDBMKTsKLSAgIHRyeSB7IGN1ckNoYXIgPSBpbnB1dF9zdHJlYW0ucmVhZENoYXIoKTsgfQotICAgY2F0Y2goamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICBqalN0b3BTdHJpbmdMaXRlcmFsRGZhXzAoOSwgYWN0aXZlMCwgMEwsIDBMKTsKLSAgICAgIHJldHVybiAxMDsKLSAgIH0KLSAgIHN3aXRjaChjdXJDaGFyKQotICAgewotICAgICAgY2FzZSAxMDE6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTExXzAoYWN0aXZlMCwgMHgxMDAwMDAwMDAwMDAwMDAwTCk7Ci0gICAgICBkZWZhdWx0IDoKLSAgICAgICAgIGJyZWFrOwotICAgfQotICAgcmV0dXJuIGpqU3RhcnROZmFfMCg5LCBhY3RpdmUwLCAwTCwgMEwpOwotfQotcHJpdmF0ZSBmaW5hbCBpbnQgampNb3ZlU3RyaW5nTGl0ZXJhbERmYTExXzAobG9uZyBvbGQwLCBsb25nIGFjdGl2ZTApCi17Ci0gICBpZiAoKChhY3RpdmUwICY9IG9sZDApKSA9PSAwTCkKLSAgICAgIHJldHVybiBqalN0YXJ0TmZhXzAoOSwgb2xkMCwgMEwsIDBMKTsKLSAgIHRyeSB7IGN1ckNoYXIgPSBpbnB1dF9zdHJlYW0ucmVhZENoYXIoKTsgfQotICAgY2F0Y2goamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICBqalN0b3BTdHJpbmdMaXRlcmFsRGZhXzAoMTAsIGFjdGl2ZTAsIDBMLCAwTCk7Ci0gICAgICByZXR1cm4gMTE7Ci0gICB9Ci0gICBzd2l0Y2goY3VyQ2hhcikKLSAgIHsKLSAgICAgIGNhc2UgMTAwOgotICAgICAgICAgaWYgKChhY3RpdmUwICYgMHgxMDAwMDAwMDAwMDAwMDAwTCkgIT0gMEwpCi0gICAgICAgICAgICByZXR1cm4gampTdGFydE5mYVdpdGhTdGF0ZXNfMCgxMSwgNjAsIDMwKTsKLSAgICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdCA6Ci0gICAgICAgICBicmVhazsKLSAgIH0KLSAgIHJldHVybiBqalN0YXJ0TmZhXzAoMTAsIGFjdGl2ZTAsIDBMLCAwTCk7Ci19Ci1wcml2YXRlIGZpbmFsIHZvaWQgampDaGVja05BZGQoaW50IHN0YXRlKQotewotICAgaWYgKGpqcm91bmRzW3N0YXRlXSAhPSBqanJvdW5kKQotICAgewotICAgICAgampzdGF0ZVNldFtqam5ld1N0YXRlQ250KytdID0gc3RhdGU7Ci0gICAgICBqanJvdW5kc1tzdGF0ZV0gPSBqanJvdW5kOwotICAgfQotfQotcHJpdmF0ZSBmaW5hbCB2b2lkIGpqQWRkU3RhdGVzKGludCBzdGFydCwgaW50IGVuZCkKLXsKLSAgIGRvIHsKLSAgICAgIGpqc3RhdGVTZXRbampuZXdTdGF0ZUNudCsrXSA9IGpqbmV4dFN0YXRlc1tzdGFydF07Ci0gICB9IHdoaWxlIChzdGFydCsrICE9IGVuZCk7Ci19Ci1wcml2YXRlIGZpbmFsIHZvaWQgampDaGVja05BZGRUd29TdGF0ZXMoaW50IHN0YXRlMSwgaW50IHN0YXRlMikKLXsKLSAgIGpqQ2hlY2tOQWRkKHN0YXRlMSk7Ci0gICBqakNoZWNrTkFkZChzdGF0ZTIpOwotfQotcHJpdmF0ZSBmaW5hbCB2b2lkIGpqQ2hlY2tOQWRkU3RhdGVzKGludCBzdGFydCwgaW50IGVuZCkKLXsKLSAgIGRvIHsKLSAgICAgIGpqQ2hlY2tOQWRkKGpqbmV4dFN0YXRlc1tzdGFydF0pOwotICAgfSB3aGlsZSAoc3RhcnQrKyAhPSBlbmQpOwotfQotcHJpdmF0ZSBmaW5hbCB2b2lkIGpqQ2hlY2tOQWRkU3RhdGVzKGludCBzdGFydCkKLXsKLSAgIGpqQ2hlY2tOQWRkKGpqbmV4dFN0YXRlc1tzdGFydF0pOwotICAgampDaGVja05BZGQoampuZXh0U3RhdGVzW3N0YXJ0ICsgMV0pOwotfQotc3RhdGljIGZpbmFsIGxvbmdbXSBqamJpdFZlYzAgPSB7Ci0gICAweDBMLCAweDBMLCAweGZmZmZmZmZmZmZmZmZmZmZMLCAweGZmZmZmZmZmZmZmZmZmZmZMCi19OwotcHJpdmF0ZSBmaW5hbCBpbnQgampNb3ZlTmZhXzAoaW50IHN0YXJ0U3RhdGUsIGludCBjdXJQb3MpCi17Ci0gICBpbnRbXSBuZXh0U3RhdGVzOwotICAgaW50IHN0YXJ0c0F0ID0gMDsKLSAgIGpqbmV3U3RhdGVDbnQgPSAxMjQ7Ci0gICBpbnQgaSA9IDE7Ci0gICBqanN0YXRlU2V0WzBdID0gc3RhcnRTdGF0ZTsKLSAgIGludCBqLCBraW5kID0gMHg3ZmZmZmZmZjsKLSAgIGZvciAoOzspCi0gICB7Ci0gICAgICBpZiAoKytqanJvdW5kID09IDB4N2ZmZmZmZmYpCi0gICAgICAgICBSZUluaXRSb3VuZHMoKTsKLSAgICAgIGlmIChjdXJDaGFyIDwgNjQpCi0gICAgICB7Ci0gICAgICAgICBsb25nIGwgPSAxTCA8PCBjdXJDaGFyOwotICAgICAgICAgTWF0Y2hMb29wOiBkbwotICAgICAgICAgewotICAgICAgICAgICAgc3dpdGNoKGpqc3RhdGVTZXRbLS1pXSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgICAgICAgIGlmICgoMHgzZmYwMDAwMDAwMDAwMDBMICYgbCkgIT0gMEwpCi0gICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICBpZiAoa2luZCA+IDY4KQotICAgICAgICAgICAgICAgICAgICAgICAga2luZCA9IDY4OwotICAgICAgICAgICAgICAgICAgICAgampDaGVja05BZGRTdGF0ZXMoMCwgMyk7Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICBlbHNlIGlmICgoMHgxMDAwMDAyMDBMICYgbCkgIT0gMEwpCi0gICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICBpZiAoa2luZCA+IDIpCi0gICAgICAgICAgICAgICAgICAgICAgICBraW5kID0gMjsKLSAgICAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkKDEpOwotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoKDB4MjQwMEwgJiBsKSAhPSAwTCkKLSAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgIGlmIChraW5kID4gMSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGtpbmQgPSAxOwotICAgICAgICAgICAgICAgICAgICAgampDaGVja05BZGQoMCk7Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICBlbHNlIGlmIChjdXJDaGFyID09IDM0KQotICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgaWYgKGtpbmQgPiA3MikKLSAgICAgICAgICAgICAgICAgICAgICAgIGtpbmQgPSA3MjsKLSAgICAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkU3RhdGVzKDQsIDEyKTsKLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGN1ckNoYXIgPT0gMzkpCi0gICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICBpZiAoa2luZCA+IDcyKQotICAgICAgICAgICAgICAgICAgICAgICAga2luZCA9IDcyOwotICAgICAgICAgICAgICAgICAgICAgampDaGVja05BZGRTdGF0ZXMoMTMsIDE4KTsKLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGN1ckNoYXIgPT0gMzYpCi0gICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICBpZiAoa2luZCA+IDc4KQotICAgICAgICAgICAgICAgICAgICAgICAga2luZCA9IDc4OwotICAgICAgICAgICAgICAgICAgICAgampDaGVja05BZGQoMzApOwotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoY3VyQ2hhciA9PSA0NykKLSAgICAgICAgICAgICAgICAgICAgIGpqQWRkU3RhdGVzKDE5LCAyMCk7Ci0gICAgICAgICAgICAgICAgICBlbHNlIGlmIChjdXJDaGFyID09IDQ2KQotICAgICAgICAgICAgICAgICAgICAgampDaGVja05BZGQoNSk7Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4M2ZlMDAwMDAwMDAwMDAwTCAmIGwpICE9IDBMKQotICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgaWYgKGtpbmQgPiA2NSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGtpbmQgPSA2NTsKLSAgICAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkKDMpOwotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoY3VyQ2hhciA9PSA0OCkKLSAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgIGlmIChraW5kID4gNjcpCi0gICAgICAgICAgICAgICAgICAgICAgICBraW5kID0gNjc7Ci0gICAgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZFR3b1N0YXRlcyg0MywgNDUpOwotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDEwOgotICAgICAgICAgICAgICAgICAgaWYgKCgweGRmZmY3YmZmZmZmZmRiZmZMICYgbCkgIT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZFN0YXRlcygyMSwgMjMpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDA6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4MjQwMEwgJiBsKSA9PSAwTCkKLSAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgaWYgKGtpbmQgPiAxKQotICAgICAgICAgICAgICAgICAgICAga2luZCA9IDE7Ci0gICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZCgwKTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgICAgICAgaWYgKCgweDEwMDAwMDIwMEwgJiBsKSA9PSAwTCkKLSAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgaWYgKGtpbmQgPiAyKQotICAgICAgICAgICAgICAgICAgICAga2luZCA9IDI7Ci0gICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZCgxKTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSAzOgotICAgICAgICAgICAgICAgICAgaWYgKCgweDNmZjAwMDAwMDAwMDAwMEwgJiBsKSA9PSAwTCkKLSAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgaWYgKGtpbmQgPiA2NSkKLSAgICAgICAgICAgICAgICAgICAgIGtpbmQgPSA2NTsKLSAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkKDMpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDQ6Ci0gICAgICAgICAgICAgICAgICBpZiAoY3VyQ2hhciA9PSA0NikKLSAgICAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkKDUpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDU6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4M2ZmMDAwMDAwMDAwMDAwTCAmIGwpID09IDBMKQotICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICBpZiAoa2luZCA+IDY4KQotICAgICAgICAgICAgICAgICAgICAga2luZCA9IDY4OwotICAgICAgICAgICAgICAgICAgampDaGVja05BZGRUd29TdGF0ZXMoNSwgNik7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgNzoKLSAgICAgICAgICAgICAgICAgIGlmICgoMHgyODAwMDAwMDAwMDBMICYgbCkgIT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZCg4KTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSA4OgotICAgICAgICAgICAgICAgICAgaWYgKCgweDNmZjAwMDAwMDAwMDAwMEwgJiBsKSA9PSAwTCkKLSAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgaWYgKGtpbmQgPiA2OCkKLSAgICAgICAgICAgICAgICAgICAgIGtpbmQgPSA2ODsKLSAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkKDgpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDk6Ci0gICAgICAgICAgICAgICAgICBpZiAoY3VyQ2hhciA9PSA0NykKLSAgICAgICAgICAgICAgICAgICAgIGpqQWRkU3RhdGVzKDE5LCAyMCk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgMTE6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4ZmZmZjdmZmZmZmZmZGJmZkwgJiBsKSAhPSAwTCkKLSAgICAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkU3RhdGVzKDIxLCAyMyk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgMTI6Ci0gICAgICAgICAgICAgICAgICBpZiAoY3VyQ2hhciA9PSA0NykKLSAgICAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkU3RhdGVzKDIxLCAyMyk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgMTQ6Ci0gICAgICAgICAgICAgICAgICBpZiAoY3VyQ2hhciAhPSA0NykKLSAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgaWYgKGtpbmQgPiA3NykKLSAgICAgICAgICAgICAgICAgICAgIGtpbmQgPSA3NzsKLSAgICAgICAgICAgICAgICAgIGpqQWRkU3RhdGVzKDI0LCAyNyk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgMjk6Ci0gICAgICAgICAgICAgICAgICBpZiAoY3VyQ2hhciAhPSAzNikKLSAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgaWYgKGtpbmQgPiA3OCkKLSAgICAgICAgICAgICAgICAgICAgIGtpbmQgPSA3ODsKLSAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkKDMwKTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSAzMDoKLSAgICAgICAgICAgICAgICAgIGlmICgoMHgzZmYwMDEwMDAwMDAwMDBMICYgbCkgPT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgIGlmIChraW5kID4gNzgpCi0gICAgICAgICAgICAgICAgICAgICBraW5kID0gNzg7Ci0gICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZCgzMCk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgMzE6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4M2ZmMDAwMDAwMDAwMDAwTCAmIGwpID09IDBMKQotICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICBpZiAoa2luZCA+IDY4KQotICAgICAgICAgICAgICAgICAgICAga2luZCA9IDY4OwotICAgICAgICAgICAgICAgICAgampDaGVja05BZGRTdGF0ZXMoMCwgMyk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgMzI6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4M2ZmMDAwMDAwMDAwMDAwTCAmIGwpICE9IDBMKQotICAgICAgICAgICAgICAgICAgICAgampDaGVja05BZGRUd29TdGF0ZXMoMzIsIDMzKTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSAzMzoKLSAgICAgICAgICAgICAgICAgIGlmIChjdXJDaGFyICE9IDQ2KQotICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICBpZiAoa2luZCA+IDY4KQotICAgICAgICAgICAgICAgICAgICAga2luZCA9IDY4OwotICAgICAgICAgICAgICAgICAgampDaGVja05BZGRUd29TdGF0ZXMoMzQsIDM1KTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSAzNDoKLSAgICAgICAgICAgICAgICAgIGlmICgoMHgzZmYwMDAwMDAwMDAwMDBMICYgbCkgPT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgIGlmIChraW5kID4gNjgpCi0gICAgICAgICAgICAgICAgICAgICBraW5kID0gNjg7Ci0gICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZFR3b1N0YXRlcygzNCwgMzUpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDM2OgotICAgICAgICAgICAgICAgICAgaWYgKCgweDI4MDAwMDAwMDAwMEwgJiBsKSAhPSAwTCkKLSAgICAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkKDM3KTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSAzNzoKLSAgICAgICAgICAgICAgICAgIGlmICgoMHgzZmYwMDAwMDAwMDAwMDBMICYgbCkgPT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgIGlmIChraW5kID4gNjgpCi0gICAgICAgICAgICAgICAgICAgICBraW5kID0gNjg7Ci0gICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZCgzNyk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgMzg6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4M2ZmMDAwMDAwMDAwMDAwTCAmIGwpID09IDBMKQotICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICBpZiAoa2luZCA+IDY4KQotICAgICAgICAgICAgICAgICAgICAga2luZCA9IDY4OwotICAgICAgICAgICAgICAgICAgampDaGVja05BZGRUd29TdGF0ZXMoMzgsIDM5KTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSA0MDoKLSAgICAgICAgICAgICAgICAgIGlmICgoMHgyODAwMDAwMDAwMDBMICYgbCkgIT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZCg0MSk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgNDE6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4M2ZmMDAwMDAwMDAwMDAwTCAmIGwpID09IDBMKQotICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICBpZiAoa2luZCA+IDY4KQotICAgICAgICAgICAgICAgICAgICAga2luZCA9IDY4OwotICAgICAgICAgICAgICAgICAgampDaGVja05BZGQoNDEpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDQyOgotICAgICAgICAgICAgICAgICAgaWYgKGN1ckNoYXIgIT0gNDgpCi0gICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgIGlmIChraW5kID4gNjcpCi0gICAgICAgICAgICAgICAgICAgICBraW5kID0gNjc7Ci0gICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZFR3b1N0YXRlcyg0MywgNDUpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDQ0OgotICAgICAgICAgICAgICAgICAgaWYgKCgweDNmZjAwMDAwMDAwMDAwMEwgJiBsKSA9PSAwTCkKLSAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgaWYgKGtpbmQgPiA2NikKLSAgICAgICAgICAgICAgICAgICAgIGtpbmQgPSA2NjsKLSAgICAgICAgICAgICAgICAgIGpqc3RhdGVTZXRbampuZXdTdGF0ZUNudCsrXSA9IDQ0OwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDQ1OgotICAgICAgICAgICAgICAgICAgaWYgKCgweGZmMDAwMDAwMDAwMDAwTCAmIGwpID09IDBMKQotICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICBpZiAoa2luZCA+IDY3KQotICAgICAgICAgICAgICAgICAgICAga2luZCA9IDY3OwotICAgICAgICAgICAgICAgICAgampDaGVja05BZGQoNDUpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDQ2OgotICAgICAgICAgICAgICAgICAgaWYgKGN1ckNoYXIgIT0gMzkpCi0gICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgIGlmIChraW5kID4gNzIpCi0gICAgICAgICAgICAgICAgICAgICBraW5kID0gNzI7Ci0gICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZFN0YXRlcygxMywgMTgpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDQ3OgotICAgICAgICAgICAgICAgICAgaWYgKCgweGZmZmZmZjdmZmZmZmRiZmZMICYgbCkgIT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZFN0YXRlcygyOCwgMzApOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDQ5OgotICAgICAgICAgICAgICAgICAgaWYgKCgweDg0MDAwMDAwMDBMICYgbCkgIT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZFN0YXRlcygyOCwgMzApOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDUwOgotICAgICAgICAgICAgICAgICAgaWYgKGN1ckNoYXIgPT0gMzkgJiYga2luZCA+IDcwKQotICAgICAgICAgICAgICAgICAgICAga2luZCA9IDcwOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDUxOgotICAgICAgICAgICAgICAgICAgaWYgKCgweGZmMDAwMDAwMDAwMDAwTCAmIGwpICE9IDBMKQotICAgICAgICAgICAgICAgICAgICAgampDaGVja05BZGRTdGF0ZXMoMzEsIDM0KTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSA1MjoKLSAgICAgICAgICAgICAgICAgIGlmICgoMHhmZjAwMDAwMDAwMDAwMEwgJiBsKSAhPSAwTCkKLSAgICAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkU3RhdGVzKDI4LCAzMCk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgNTM6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4ZjAwMDAwMDAwMDAwMEwgJiBsKSAhPSAwTCkKLSAgICAgICAgICAgICAgICAgICAgIGpqc3RhdGVTZXRbampuZXdTdGF0ZUNudCsrXSA9IDU0OwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDU0OgotICAgICAgICAgICAgICAgICAgaWYgKCgweGZmMDAwMDAwMDAwMDAwTCAmIGwpICE9IDBMKQotICAgICAgICAgICAgICAgICAgICAgampDaGVja05BZGQoNTIpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDU2OgotICAgICAgICAgICAgICAgY2FzZSA2MToKLSAgICAgICAgICAgICAgICAgIGlmICgoMHgzZmYwMDAwMDAwMDAwMDBMICYgbCkgIT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZCg1Nyk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgNTc6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4M2ZmMDAwMDAwMDAwMDAwTCAmIGwpICE9IDBMKQotICAgICAgICAgICAgICAgICAgICAgampDaGVja05BZGRTdGF0ZXMoMjgsIDMwKTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSA1OToKLSAgICAgICAgICAgICAgICAgIGlmICgoMHgzZmYwMDAwMDAwMDAwMDBMICYgbCkgIT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBqanN0YXRlU2V0W2pqbmV3U3RhdGVDbnQrK10gPSA2MDsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSA2MDoKLSAgICAgICAgICAgICAgICAgIGlmICgoMHgzZmYwMDAwMDAwMDAwMDBMICYgbCkgIT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBqanN0YXRlU2V0W2pqbmV3U3RhdGVDbnQrK10gPSA2MTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSA2MjoKLSAgICAgICAgICAgICAgICAgIGlmICgoMHhmZmZmZmY3ZmZmZmZkYmZmTCAmIGwpID09IDBMKQotICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICBpZiAoa2luZCA+IDcyKQotICAgICAgICAgICAgICAgICAgICAga2luZCA9IDcyOwotICAgICAgICAgICAgICAgICAgampDaGVja05BZGRTdGF0ZXMoMzUsIDM3KTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSA2NDoKLSAgICAgICAgICAgICAgICAgIGlmICgoMHg4NDAwMDAwMDAwTCAmIGwpID09IDBMKQotICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICBpZiAoa2luZCA+IDcyKQotICAgICAgICAgICAgICAgICAgICAga2luZCA9IDcyOwotICAgICAgICAgICAgICAgICAgampDaGVja05BZGRTdGF0ZXMoMzUsIDM3KTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSA2NToKLSAgICAgICAgICAgICAgICAgIGlmICgoMHgyNDAwTCAmIGwpICE9IDBMICYmIGtpbmQgPiA3MikKLSAgICAgICAgICAgICAgICAgICAgIGtpbmQgPSA3MjsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSA2NjoKLSAgICAgICAgICAgICAgICAgIGlmICgoMHhmZjAwMDAwMDAwMDAwMEwgJiBsKSA9PSAwTCkKLSAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgaWYgKGtpbmQgPiA3MikKLSAgICAgICAgICAgICAgICAgICAgIGtpbmQgPSA3MjsKLSAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkU3RhdGVzKDM4LCA0MSk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgNjc6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4ZmYwMDAwMDAwMDAwMDBMICYgbCkgPT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgIGlmIChraW5kID4gNzIpCi0gICAgICAgICAgICAgICAgICAgICBraW5kID0gNzI7Ci0gICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZFN0YXRlcygzNSwgMzcpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDY4OgotICAgICAgICAgICAgICAgICAgaWYgKCgweGYwMDAwMDAwMDAwMDBMICYgbCkgIT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBqanN0YXRlU2V0W2pqbmV3U3RhdGVDbnQrK10gPSA2OTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSA2OToKLSAgICAgICAgICAgICAgICAgIGlmICgoMHhmZjAwMDAwMDAwMDAwMEwgJiBsKSAhPSAwTCkKLSAgICAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkKDY3KTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSA3MToKLSAgICAgICAgICAgICAgIGNhc2UgNzY6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4M2ZmMDAwMDAwMDAwMDAwTCAmIGwpICE9IDBMKQotICAgICAgICAgICAgICAgICAgICAgampDaGVja05BZGQoNzIpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDcyOgotICAgICAgICAgICAgICAgICAgaWYgKCgweDNmZjAwMDAwMDAwMDAwMEwgJiBsKSA9PSAwTCkKLSAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgaWYgKGtpbmQgPiA3MikKLSAgICAgICAgICAgICAgICAgICAgIGtpbmQgPSA3MjsKLSAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkU3RhdGVzKDM1LCAzNyk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgNzQ6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4M2ZmMDAwMDAwMDAwMDAwTCAmIGwpICE9IDBMKQotICAgICAgICAgICAgICAgICAgICAgampzdGF0ZVNldFtqam5ld1N0YXRlQ250KytdID0gNzU7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgNzU6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4M2ZmMDAwMDAwMDAwMDAwTCAmIGwpICE9IDBMKQotICAgICAgICAgICAgICAgICAgICAgampzdGF0ZVNldFtqam5ld1N0YXRlQ250KytdID0gNzY7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgNzc6Ci0gICAgICAgICAgICAgICAgICBpZiAoY3VyQ2hhciAhPSAzNCkKLSAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgaWYgKGtpbmQgPiA3MikKLSAgICAgICAgICAgICAgICAgICAgIGtpbmQgPSA3MjsKLSAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkU3RhdGVzKDQsIDEyKTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSA3ODoKLSAgICAgICAgICAgICAgICAgIGlmICgoMHhmZmZmZmZmYmZmZmZkYmZmTCAmIGwpICE9IDBMKQotICAgICAgICAgICAgICAgICAgICAgampDaGVja05BZGRTdGF0ZXMoNDIsIDQ0KTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSA4MDoKLSAgICAgICAgICAgICAgICAgIGlmICgoMHg4NDAwMDAwMDAwTCAmIGwpICE9IDBMKQotICAgICAgICAgICAgICAgICAgICAgampDaGVja05BZGRTdGF0ZXMoNDIsIDQ0KTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSA4MToKLSAgICAgICAgICAgICAgICAgIGlmIChjdXJDaGFyID09IDM0ICYmIGtpbmQgPiA3MCkKLSAgICAgICAgICAgICAgICAgICAgIGtpbmQgPSA3MDsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSA4MjoKLSAgICAgICAgICAgICAgICAgIGlmICgoMHhmZjAwMDAwMDAwMDAwMEwgJiBsKSAhPSAwTCkKLSAgICAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkU3RhdGVzKDQ1LCA0OCk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgODM6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4ZmYwMDAwMDAwMDAwMDBMICYgbCkgIT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZFN0YXRlcyg0MiwgNDQpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDg0OgotICAgICAgICAgICAgICAgICAgaWYgKCgweGYwMDAwMDAwMDAwMDBMICYgbCkgIT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBqanN0YXRlU2V0W2pqbmV3U3RhdGVDbnQrK10gPSA4NTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSA4NToKLSAgICAgICAgICAgICAgICAgIGlmICgoMHhmZjAwMDAwMDAwMDAwMEwgJiBsKSAhPSAwTCkKLSAgICAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkKDgzKTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSA4NzoKLSAgICAgICAgICAgICAgIGNhc2UgOTI6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4M2ZmMDAwMDAwMDAwMDAwTCAmIGwpICE9IDBMKQotICAgICAgICAgICAgICAgICAgICAgampDaGVja05BZGQoODgpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDg4OgotICAgICAgICAgICAgICAgICAgaWYgKCgweDNmZjAwMDAwMDAwMDAwMEwgJiBsKSAhPSAwTCkKLSAgICAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkU3RhdGVzKDQyLCA0NCk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgOTA6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4M2ZmMDAwMDAwMDAwMDAwTCAmIGwpICE9IDBMKQotICAgICAgICAgICAgICAgICAgICAgampzdGF0ZVNldFtqam5ld1N0YXRlQ250KytdID0gOTE7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgOTE6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4M2ZmMDAwMDAwMDAwMDAwTCAmIGwpICE9IDBMKQotICAgICAgICAgICAgICAgICAgICAgampzdGF0ZVNldFtqam5ld1N0YXRlQ250KytdID0gOTI7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgOTM6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4ZmZmZmZmZmJmZmZmZmZmZkwgJiBsKSAhPSAwTCkKLSAgICAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkU3RhdGVzKDQ5LCA1MSk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgOTU6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4MjQwMEwgJiBsKSAhPSAwTCkKLSAgICAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkU3RhdGVzKDQ5LCA1MSk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgOTY6Ci0gICAgICAgICAgICAgICAgICBpZiAoY3VyQ2hhciA9PSAxMCkKLSAgICAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkU3RhdGVzKDQ5LCA1MSk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgOTc6Ci0gICAgICAgICAgICAgICAgICBpZiAoY3VyQ2hhciA9PSAxMykKLSAgICAgICAgICAgICAgICAgICAgIGpqc3RhdGVTZXRbampuZXdTdGF0ZUNudCsrXSA9IDk2OwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDk4OgotICAgICAgICAgICAgICAgICAgaWYgKCgweDg0MDAwMDAwMDBMICYgbCkgIT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZFN0YXRlcyg0OSwgNTEpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDk5OgotICAgICAgICAgICAgICAgICAgaWYgKCgweGZmMDAwMDAwMDAwMDAwTCAmIGwpICE9IDBMKQotICAgICAgICAgICAgICAgICAgICAgampDaGVja05BZGRTdGF0ZXMoNTIsIDU1KTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSAxMDA6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4ZmYwMDAwMDAwMDAwMDBMICYgbCkgIT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZFN0YXRlcyg0OSwgNTEpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDEwMToKLSAgICAgICAgICAgICAgICAgIGlmICgoMHhmMDAwMDAwMDAwMDAwTCAmIGwpICE9IDBMKQotICAgICAgICAgICAgICAgICAgICAgampzdGF0ZVNldFtqam5ld1N0YXRlQ250KytdID0gMTAyOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDEwMjoKLSAgICAgICAgICAgICAgICAgIGlmICgoMHhmZjAwMDAwMDAwMDAwMEwgJiBsKSAhPSAwTCkKLSAgICAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkKDEwMCk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgMTA0OgotICAgICAgICAgICAgICAgY2FzZSAxMDk6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4M2ZmMDAwMDAwMDAwMDAwTCAmIGwpICE9IDBMKQotICAgICAgICAgICAgICAgICAgICAgampDaGVja05BZGQoMTA1KTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSAxMDU6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4M2ZmMDAwMDAwMDAwMDAwTCAmIGwpICE9IDBMKQotICAgICAgICAgICAgICAgICAgICAgampDaGVja05BZGRTdGF0ZXMoNDksIDUxKTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSAxMDc6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4M2ZmMDAwMDAwMDAwMDAwTCAmIGwpICE9IDBMKQotICAgICAgICAgICAgICAgICAgICAgampzdGF0ZVNldFtqam5ld1N0YXRlQ250KytdID0gMTA4OwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDEwODoKLSAgICAgICAgICAgICAgICAgIGlmICgoMHgzZmYwMDAwMDAwMDAwMDBMICYgbCkgIT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBqanN0YXRlU2V0W2pqbmV3U3RhdGVDbnQrK10gPSAxMDk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgMTEwOgotICAgICAgICAgICAgICAgICAgaWYgKCgweGZmZmZmZmZiZmZmZmRiZmZMICYgbCkgPT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgIGlmIChraW5kID4gNzIpCi0gICAgICAgICAgICAgICAgICAgICBraW5kID0gNzI7Ci0gICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZFN0YXRlcyg1NiwgNTgpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDExMjoKLSAgICAgICAgICAgICAgICAgIGlmICgoMHg4NDAwMDAwMDAwTCAmIGwpID09IDBMKQotICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICBpZiAoa2luZCA+IDcyKQotICAgICAgICAgICAgICAgICAgICAga2luZCA9IDcyOwotICAgICAgICAgICAgICAgICAgampDaGVja05BZGRTdGF0ZXMoNTYsIDU4KTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSAxMTM6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4ZmYwMDAwMDAwMDAwMDBMICYgbCkgPT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgIGlmIChraW5kID4gNzIpCi0gICAgICAgICAgICAgICAgICAgICBraW5kID0gNzI7Ci0gICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZFN0YXRlcyg1OSwgNjIpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDExNDoKLSAgICAgICAgICAgICAgICAgIGlmICgoMHhmZjAwMDAwMDAwMDAwMEwgJiBsKSA9PSAwTCkKLSAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgaWYgKGtpbmQgPiA3MikKLSAgICAgICAgICAgICAgICAgICAgIGtpbmQgPSA3MjsKLSAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkU3RhdGVzKDU2LCA1OCk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgMTE1OgotICAgICAgICAgICAgICAgICAgaWYgKCgweGYwMDAwMDAwMDAwMDBMICYgbCkgIT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBqanN0YXRlU2V0W2pqbmV3U3RhdGVDbnQrK10gPSAxMTY7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgMTE2OgotICAgICAgICAgICAgICAgICAgaWYgKCgweGZmMDAwMDAwMDAwMDAwTCAmIGwpICE9IDBMKQotICAgICAgICAgICAgICAgICAgICAgampDaGVja05BZGQoMTE0KTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSAxMTg6Ci0gICAgICAgICAgICAgICBjYXNlIDEyMzoKLSAgICAgICAgICAgICAgICAgIGlmICgoMHgzZmYwMDAwMDAwMDAwMDBMICYgbCkgIT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZCgxMTkpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDExOToKLSAgICAgICAgICAgICAgICAgIGlmICgoMHgzZmYwMDAwMDAwMDAwMDBMICYgbCkgPT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgIGlmIChraW5kID4gNzIpCi0gICAgICAgICAgICAgICAgICAgICBraW5kID0gNzI7Ci0gICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZFN0YXRlcyg1NiwgNTgpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDEyMToKLSAgICAgICAgICAgICAgICAgIGlmICgoMHgzZmYwMDAwMDAwMDAwMDBMICYgbCkgIT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBqanN0YXRlU2V0W2pqbmV3U3RhdGVDbnQrK10gPSAxMjI7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgMTIyOgotICAgICAgICAgICAgICAgICAgaWYgKCgweDNmZjAwMDAwMDAwMDAwMEwgJiBsKSAhPSAwTCkKLSAgICAgICAgICAgICAgICAgICAgIGpqc3RhdGVTZXRbampuZXdTdGF0ZUNudCsrXSA9IDEyMzsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgZGVmYXVsdCA6IGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgfSB3aGlsZShpICE9IHN0YXJ0c0F0KTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGN1ckNoYXIgPCAxMjgpCi0gICAgICB7Ci0gICAgICAgICBsb25nIGwgPSAxTCA8PCAoY3VyQ2hhciAmIDA3Nyk7Ci0gICAgICAgICBNYXRjaExvb3A6IGRvCi0gICAgICAgICB7Ci0gICAgICAgICAgICBzd2l0Y2goampzdGF0ZVNldFstLWldKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgICAgY2FzZSAzMDoKLSAgICAgICAgICAgICAgICAgIGlmICgoMHg3ZmZmZmZlODdmZmZmZmVMICYgbCkgPT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgIGlmIChraW5kID4gNzgpCi0gICAgICAgICAgICAgICAgICAgICBraW5kID0gNzg7Ci0gICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZCgzMCk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgMTA6Ci0gICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZFN0YXRlcygyMSwgMjMpOwotICAgICAgICAgICAgICAgICAgaWYgKGN1ckNoYXIgPT0gOTIpCi0gICAgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZCgxMik7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgNjoKLSAgICAgICAgICAgICAgICAgIGlmICgoMHgyMDAwMDAwMDIwTCAmIGwpICE9IDBMKQotICAgICAgICAgICAgICAgICAgICAgampBZGRTdGF0ZXMoNjMsIDY0KTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSAxMToKLSAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkU3RhdGVzKDIxLCAyMyk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgMTM6Ci0gICAgICAgICAgICAgICAgICBpZiAoY3VyQ2hhciA9PSA5MikKLSAgICAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkKDEyKTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSAxNToKLSAgICAgICAgICAgICAgICAgIGlmICgoMHgyMjgwMDAwMDAwMDBMICYgbCkgIT0gMEwgJiYga2luZCA+IDc3KQotICAgICAgICAgICAgICAgICAgICAga2luZCA9IDc3OwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDE2OgotICAgICAgICAgICAgICAgICAgaWYgKGN1ckNoYXIgPT0gMTA1KQotICAgICAgICAgICAgICAgICAgICAgampDaGVja05BZGRTdGF0ZXMoNjUsIDY4KTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSAxNzoKLSAgICAgICAgICAgICAgICAgIGlmIChjdXJDaGFyID09IDEwMyAmJiBraW5kID4gNzcpCi0gICAgICAgICAgICAgICAgICAgICBraW5kID0gNzc7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgMTg6Ci0gICAgICAgICAgICAgICAgICBpZiAoY3VyQ2hhciA9PSAxMDkgJiYga2luZCA+IDc3KQotICAgICAgICAgICAgICAgICAgICAga2luZCA9IDc3OwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDE5OgotICAgICAgICAgICAgICAgICAgaWYgKGN1ckNoYXIgPT0gMTAzKQotICAgICAgICAgICAgICAgICAgICAgampDaGVja05BZGQoMTgpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDIwOgotICAgICAgICAgICAgICAgICAgaWYgKGN1ckNoYXIgPT0gMTA5KQotICAgICAgICAgICAgICAgICAgICAgampDaGVja05BZGQoMTcpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDIxOgotICAgICAgICAgICAgICAgICAgaWYgKGN1ckNoYXIgPT0gMTAzKQotICAgICAgICAgICAgICAgICAgICAgampDaGVja05BZGRTdGF0ZXMoNjksIDcyKTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSAyMjoKLSAgICAgICAgICAgICAgICAgIGlmIChjdXJDaGFyID09IDEwNSAmJiBraW5kID4gNzcpCi0gICAgICAgICAgICAgICAgICAgICBraW5kID0gNzc7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgMjM6Ci0gICAgICAgICAgICAgICAgICBpZiAoY3VyQ2hhciA9PSAxMDkpCi0gICAgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZCgyMik7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgMjQ6Ci0gICAgICAgICAgICAgICAgICBpZiAoY3VyQ2hhciA9PSAxMDUpCi0gICAgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZCgxOCk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgMjU6Ci0gICAgICAgICAgICAgICAgICBpZiAoY3VyQ2hhciA9PSAxMDkpCi0gICAgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZFN0YXRlcyg3MywgNzYpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDI2OgotICAgICAgICAgICAgICAgICAgaWYgKGN1ckNoYXIgPT0gMTA1KQotICAgICAgICAgICAgICAgICAgICAgampDaGVja05BZGQoMTcpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDI3OgotICAgICAgICAgICAgICAgICAgaWYgKGN1ckNoYXIgPT0gMTAzKQotICAgICAgICAgICAgICAgICAgICAgampDaGVja05BZGQoMjIpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDI4OgotICAgICAgICAgICAgICAgICAgaWYgKGN1ckNoYXIgPT0gOTIpCi0gICAgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZCgxMik7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgMzU6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4MjAwMDAwMDAyMEwgJiBsKSAhPSAwTCkKLSAgICAgICAgICAgICAgICAgICAgIGpqQWRkU3RhdGVzKDc3LCA3OCk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgMzk6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4MjAwMDAwMDAyMEwgJiBsKSAhPSAwTCkKLSAgICAgICAgICAgICAgICAgICAgIGpqQWRkU3RhdGVzKDc5LCA4MCk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgNDM6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4MTAwMDAwMDAxMDAwMDAwTCAmIGwpICE9IDBMKQotICAgICAgICAgICAgICAgICAgICAgampDaGVja05BZGQoNDQpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDQ0OgotICAgICAgICAgICAgICAgICAgaWYgKCgweDdlMDAwMDAwN2VMICYgbCkgPT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgIGlmIChraW5kID4gNjYpCi0gICAgICAgICAgICAgICAgICAgICBraW5kID0gNjY7Ci0gICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZCg0NCk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgNDc6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4ZmZmZmZmZmZlZmZmZmZmZkwgJiBsKSAhPSAwTCkKLSAgICAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkU3RhdGVzKDI4LCAzMCk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgNDg6Ci0gICAgICAgICAgICAgICAgICBpZiAoY3VyQ2hhciA9PSA5MikKLSAgICAgICAgICAgICAgICAgICAgIGpqQWRkU3RhdGVzKDgxLCA4NSk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgNDk6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4MTQ0MDQ0MzgwMDAwMDBMICYgbCkgIT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZFN0YXRlcygyOCwgMzApOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDU1OgotICAgICAgICAgICAgICAgICAgaWYgKGN1ckNoYXIgPT0gMTIwKQotICAgICAgICAgICAgICAgICAgICAgampzdGF0ZVNldFtqam5ld1N0YXRlQ250KytdID0gNTY7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgNTY6Ci0gICAgICAgICAgICAgICBjYXNlIDYxOgotICAgICAgICAgICAgICAgICAgaWYgKCgweDdlMDAwMDAwN2VMICYgbCkgIT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZCg1Nyk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgNTc6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4N2UwMDAwMDA3ZUwgJiBsKSAhPSAwTCkKLSAgICAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkU3RhdGVzKDI4LCAzMCk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgNTg6Ci0gICAgICAgICAgICAgICAgICBpZiAoY3VyQ2hhciA9PSAxMTcpCi0gICAgICAgICAgICAgICAgICAgICBqanN0YXRlU2V0W2pqbmV3U3RhdGVDbnQrK10gPSA1OTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSA1OToKLSAgICAgICAgICAgICAgICAgIGlmICgoMHg3ZTAwMDAwMDdlTCAmIGwpICE9IDBMKQotICAgICAgICAgICAgICAgICAgICAgampzdGF0ZVNldFtqam5ld1N0YXRlQ250KytdID0gNjA7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgNjA6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4N2UwMDAwMDA3ZUwgJiBsKSAhPSAwTCkKLSAgICAgICAgICAgICAgICAgICAgIGpqc3RhdGVTZXRbampuZXdTdGF0ZUNudCsrXSA9IDYxOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDYyOgotICAgICAgICAgICAgICAgICAgaWYgKCgweGZmZmZmZmZmZWZmZmZmZmZMICYgbCkgPT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgIGlmIChraW5kID4gNzIpCi0gICAgICAgICAgICAgICAgICAgICBraW5kID0gNzI7Ci0gICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZFN0YXRlcygzNSwgMzcpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDYzOgotICAgICAgICAgICAgICAgICAgaWYgKGN1ckNoYXIgPT0gOTIpCi0gICAgICAgICAgICAgICAgICAgICBqakFkZFN0YXRlcyg4NiwgOTApOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDY0OgotICAgICAgICAgICAgICAgICAgaWYgKCgweDE0NDA0NDM4MDAwMDAwTCAmIGwpID09IDBMKQotICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICBpZiAoa2luZCA+IDcyKQotICAgICAgICAgICAgICAgICAgICAga2luZCA9IDcyOwotICAgICAgICAgICAgICAgICAgampDaGVja05BZGRTdGF0ZXMoMzUsIDM3KTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSA3MDoKLSAgICAgICAgICAgICAgICAgIGlmIChjdXJDaGFyID09IDEyMCkKLSAgICAgICAgICAgICAgICAgICAgIGpqc3RhdGVTZXRbampuZXdTdGF0ZUNudCsrXSA9IDcxOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDcxOgotICAgICAgICAgICAgICAgY2FzZSA3NjoKLSAgICAgICAgICAgICAgICAgIGlmICgoMHg3ZTAwMDAwMDdlTCAmIGwpICE9IDBMKQotICAgICAgICAgICAgICAgICAgICAgampDaGVja05BZGQoNzIpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDcyOgotICAgICAgICAgICAgICAgICAgaWYgKCgweDdlMDAwMDAwN2VMICYgbCkgPT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgIGlmIChraW5kID4gNzIpCi0gICAgICAgICAgICAgICAgICAgICBraW5kID0gNzI7Ci0gICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZFN0YXRlcygzNSwgMzcpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDczOgotICAgICAgICAgICAgICAgICAgaWYgKGN1ckNoYXIgPT0gMTE3KQotICAgICAgICAgICAgICAgICAgICAgampzdGF0ZVNldFtqam5ld1N0YXRlQ250KytdID0gNzQ7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgNzQ6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4N2UwMDAwMDA3ZUwgJiBsKSAhPSAwTCkKLSAgICAgICAgICAgICAgICAgICAgIGpqc3RhdGVTZXRbampuZXdTdGF0ZUNudCsrXSA9IDc1OwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDc1OgotICAgICAgICAgICAgICAgICAgaWYgKCgweDdlMDAwMDAwN2VMICYgbCkgIT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBqanN0YXRlU2V0W2pqbmV3U3RhdGVDbnQrK10gPSA3NjsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSA3ODoKLSAgICAgICAgICAgICAgICAgIGlmICgoMHhmZmZmZmZmZmVmZmZmZmZmTCAmIGwpICE9IDBMKQotICAgICAgICAgICAgICAgICAgICAgampDaGVja05BZGRTdGF0ZXMoNDIsIDQ0KTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSA3OToKLSAgICAgICAgICAgICAgICAgIGlmIChjdXJDaGFyID09IDkyKQotICAgICAgICAgICAgICAgICAgICAgampBZGRTdGF0ZXMoOTEsIDk1KTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSA4MDoKLSAgICAgICAgICAgICAgICAgIGlmICgoMHgxNDQwNDQzODAwMDAwMEwgJiBsKSAhPSAwTCkKLSAgICAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkU3RhdGVzKDQyLCA0NCk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgODY6Ci0gICAgICAgICAgICAgICAgICBpZiAoY3VyQ2hhciA9PSAxMjApCi0gICAgICAgICAgICAgICAgICAgICBqanN0YXRlU2V0W2pqbmV3U3RhdGVDbnQrK10gPSA4NzsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSA4NzoKLSAgICAgICAgICAgICAgIGNhc2UgOTI6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4N2UwMDAwMDA3ZUwgJiBsKSAhPSAwTCkKLSAgICAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkKDg4KTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSA4ODoKLSAgICAgICAgICAgICAgICAgIGlmICgoMHg3ZTAwMDAwMDdlTCAmIGwpICE9IDBMKQotICAgICAgICAgICAgICAgICAgICAgampDaGVja05BZGRTdGF0ZXMoNDIsIDQ0KTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSA4OToKLSAgICAgICAgICAgICAgICAgIGlmIChjdXJDaGFyID09IDExNykKLSAgICAgICAgICAgICAgICAgICAgIGpqc3RhdGVTZXRbampuZXdTdGF0ZUNudCsrXSA9IDkwOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDkwOgotICAgICAgICAgICAgICAgICAgaWYgKCgweDdlMDAwMDAwN2VMICYgbCkgIT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBqanN0YXRlU2V0W2pqbmV3U3RhdGVDbnQrK10gPSA5MTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSA5MToKLSAgICAgICAgICAgICAgICAgIGlmICgoMHg3ZTAwMDAwMDdlTCAmIGwpICE9IDBMKQotICAgICAgICAgICAgICAgICAgICAgampzdGF0ZVNldFtqam5ld1N0YXRlQ250KytdID0gOTI7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgOTM6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4ZmZmZmZmZmZlZmZmZmZmZkwgJiBsKSAhPSAwTCkKLSAgICAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkU3RhdGVzKDQ5LCA1MSk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgOTQ6Ci0gICAgICAgICAgICAgICAgICBpZiAoY3VyQ2hhciA9PSA5MikKLSAgICAgICAgICAgICAgICAgICAgIGpqQWRkU3RhdGVzKDk2LCAxMDIpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDk4OgotICAgICAgICAgICAgICAgICAgaWYgKCgweDE0NDA0NDM4MDAwMDAwTCAmIGwpICE9IDBMKQotICAgICAgICAgICAgICAgICAgICAgampDaGVja05BZGRTdGF0ZXMoNDksIDUxKTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSAxMDM6Ci0gICAgICAgICAgICAgICAgICBpZiAoY3VyQ2hhciA9PSAxMjApCi0gICAgICAgICAgICAgICAgICAgICBqanN0YXRlU2V0W2pqbmV3U3RhdGVDbnQrK10gPSAxMDQ7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgMTA0OgotICAgICAgICAgICAgICAgY2FzZSAxMDk6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4N2UwMDAwMDA3ZUwgJiBsKSAhPSAwTCkKLSAgICAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkKDEwNSk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgMTA1OgotICAgICAgICAgICAgICAgICAgaWYgKCgweDdlMDAwMDAwN2VMICYgbCkgIT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZFN0YXRlcyg0OSwgNTEpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDEwNjoKLSAgICAgICAgICAgICAgICAgIGlmIChjdXJDaGFyID09IDExNykKLSAgICAgICAgICAgICAgICAgICAgIGpqc3RhdGVTZXRbampuZXdTdGF0ZUNudCsrXSA9IDEwNzsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSAxMDc6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4N2UwMDAwMDA3ZUwgJiBsKSAhPSAwTCkKLSAgICAgICAgICAgICAgICAgICAgIGpqc3RhdGVTZXRbampuZXdTdGF0ZUNudCsrXSA9IDEwODsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSAxMDg6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4N2UwMDAwMDA3ZUwgJiBsKSAhPSAwTCkKLSAgICAgICAgICAgICAgICAgICAgIGpqc3RhdGVTZXRbampuZXdTdGF0ZUNudCsrXSA9IDEwOTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSAxMTA6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4ZmZmZmZmZmZlZmZmZmZmZkwgJiBsKSA9PSAwTCkKLSAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgaWYgKGtpbmQgPiA3MikKLSAgICAgICAgICAgICAgICAgICAgIGtpbmQgPSA3MjsKLSAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkU3RhdGVzKDU2LCA1OCk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgMTExOgotICAgICAgICAgICAgICAgICAgaWYgKGN1ckNoYXIgPT0gOTIpCi0gICAgICAgICAgICAgICAgICAgICBqakFkZFN0YXRlcygxMDMsIDEwNyk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgMTEyOgotICAgICAgICAgICAgICAgICAgaWYgKCgweDE0NDA0NDM4MDAwMDAwTCAmIGwpID09IDBMKQotICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICBpZiAoa2luZCA+IDcyKQotICAgICAgICAgICAgICAgICAgICAga2luZCA9IDcyOwotICAgICAgICAgICAgICAgICAgampDaGVja05BZGRTdGF0ZXMoNTYsIDU4KTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSAxMTc6Ci0gICAgICAgICAgICAgICAgICBpZiAoY3VyQ2hhciA9PSAxMjApCi0gICAgICAgICAgICAgICAgICAgICBqanN0YXRlU2V0W2pqbmV3U3RhdGVDbnQrK10gPSAxMTg7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgMTE4OgotICAgICAgICAgICAgICAgY2FzZSAxMjM6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4N2UwMDAwMDA3ZUwgJiBsKSAhPSAwTCkKLSAgICAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkKDExOSk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgMTE5OgotICAgICAgICAgICAgICAgICAgaWYgKCgweDdlMDAwMDAwN2VMICYgbCkgPT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgIGlmIChraW5kID4gNzIpCi0gICAgICAgICAgICAgICAgICAgICBraW5kID0gNzI7Ci0gICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZFN0YXRlcyg1NiwgNTgpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDEyMDoKLSAgICAgICAgICAgICAgICAgIGlmIChjdXJDaGFyID09IDExNykKLSAgICAgICAgICAgICAgICAgICAgIGpqc3RhdGVTZXRbampuZXdTdGF0ZUNudCsrXSA9IDEyMTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSAxMjE6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4N2UwMDAwMDA3ZUwgJiBsKSAhPSAwTCkKLSAgICAgICAgICAgICAgICAgICAgIGpqc3RhdGVTZXRbampuZXdTdGF0ZUNudCsrXSA9IDEyMjsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSAxMjI6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4N2UwMDAwMDA3ZUwgJiBsKSAhPSAwTCkKLSAgICAgICAgICAgICAgICAgICAgIGpqc3RhdGVTZXRbampuZXdTdGF0ZUNudCsrXSA9IDEyMzsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgZGVmYXVsdCA6IGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgfSB3aGlsZShpICE9IHN0YXJ0c0F0KTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgIGludCBpMiA9IChjdXJDaGFyICYgMHhmZikgPj4gNjsKLSAgICAgICAgIGxvbmcgbDIgPSAxTCA8PCAoY3VyQ2hhciAmIDA3Nyk7Ci0gICAgICAgICBNYXRjaExvb3A6IGRvCi0gICAgICAgICB7Ci0gICAgICAgICAgICBzd2l0Y2goampzdGF0ZVNldFstLWldKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgY2FzZSAxMDoKLSAgICAgICAgICAgICAgIGNhc2UgMTE6Ci0gICAgICAgICAgICAgICAgICBpZiAoKGpqYml0VmVjMFtpMl0gJiBsMikgIT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZFN0YXRlcygyMSwgMjMpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDQ3OgotICAgICAgICAgICAgICAgICAgaWYgKChqamJpdFZlYzBbaTJdICYgbDIpICE9IDBMKQotICAgICAgICAgICAgICAgICAgICAgampBZGRTdGF0ZXMoMjgsIDMwKTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSA2MjoKLSAgICAgICAgICAgICAgICAgIGlmICgoampiaXRWZWMwW2kyXSAmIGwyKSA9PSAwTCkKLSAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgaWYgKGtpbmQgPiA3MikKLSAgICAgICAgICAgICAgICAgICAgIGtpbmQgPSA3MjsKLSAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkU3RhdGVzKDM1LCAzNyk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgNzg6Ci0gICAgICAgICAgICAgICAgICBpZiAoKGpqYml0VmVjMFtpMl0gJiBsMikgIT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZFN0YXRlcyg0MiwgNDQpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDkzOgotICAgICAgICAgICAgICAgICAgaWYgKChqamJpdFZlYzBbaTJdICYgbDIpICE9IDBMKQotICAgICAgICAgICAgICAgICAgICAgampDaGVja05BZGRTdGF0ZXMoNDksIDUxKTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSAxMTA6Ci0gICAgICAgICAgICAgICAgICBpZiAoKGpqYml0VmVjMFtpMl0gJiBsMikgPT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgIGlmIChraW5kID4gNzIpCi0gICAgICAgICAgICAgICAgICAgICBraW5kID0gNzI7Ci0gICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZFN0YXRlcyg1NiwgNTgpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBkZWZhdWx0IDogYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICB9IHdoaWxlKGkgIT0gc3RhcnRzQXQpOwotICAgICAgfQotICAgICAgaWYgKGtpbmQgIT0gMHg3ZmZmZmZmZikKLSAgICAgIHsKLSAgICAgICAgIGpqbWF0Y2hlZEtpbmQgPSBraW5kOwotICAgICAgICAgamptYXRjaGVkUG9zID0gY3VyUG9zOwotICAgICAgICAga2luZCA9IDB4N2ZmZmZmZmY7Ci0gICAgICB9Ci0gICAgICArK2N1clBvczsKLSAgICAgIGlmICgoaSA9IGpqbmV3U3RhdGVDbnQpID09IChzdGFydHNBdCA9IDEyNCAtIChqam5ld1N0YXRlQ250ID0gc3RhcnRzQXQpKSkKLSAgICAgICAgIHJldHVybiBjdXJQb3M7Ci0gICAgICB0cnkgeyBjdXJDaGFyID0gaW5wdXRfc3RyZWFtLnJlYWRDaGFyKCk7IH0KLSAgICAgIGNhdGNoKGphdmEuaW8uSU9FeGNlcHRpb24gZSkgeyByZXR1cm4gY3VyUG9zOyB9Ci0gICB9Ci19Ci1wcml2YXRlIGZpbmFsIGludCBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMF8yKCkKLXsKLSAgIHN3aXRjaChjdXJDaGFyKQotICAgewotICAgICAgY2FzZSA0MjoKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMV8yKDB4NDBMKTsKLSAgICAgIGRlZmF1bHQgOgotICAgICAgICAgcmV0dXJuIDE7Ci0gICB9Ci19Ci1wcml2YXRlIGZpbmFsIGludCBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMV8yKGxvbmcgYWN0aXZlMCkKLXsKLSAgIHRyeSB7IGN1ckNoYXIgPSBpbnB1dF9zdHJlYW0ucmVhZENoYXIoKTsgfQotICAgY2F0Y2goamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICByZXR1cm4gMTsKLSAgIH0KLSAgIHN3aXRjaChjdXJDaGFyKQotICAgewotICAgICAgY2FzZSA0NzoKLSAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4NDBMKSAhPSAwTCkKLSAgICAgICAgICAgIHJldHVybiBqalN0b3BBdFBvcygxLCA2KTsKLSAgICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdCA6Ci0gICAgICAgICByZXR1cm4gMjsKLSAgIH0KLSAgIHJldHVybiAyOwotfQotcHJpdmF0ZSBmaW5hbCBpbnQgampNb3ZlU3RyaW5nTGl0ZXJhbERmYTBfMSgpCi17Ci0gICByZXR1cm4gampNb3ZlTmZhXzEoNCwgMCk7Ci19Ci1wcml2YXRlIGZpbmFsIGludCBqak1vdmVOZmFfMShpbnQgc3RhcnRTdGF0ZSwgaW50IGN1clBvcykKLXsKLSAgIGludFtdIG5leHRTdGF0ZXM7Ci0gICBpbnQgc3RhcnRzQXQgPSAwOwotICAgampuZXdTdGF0ZUNudCA9IDQ7Ci0gICBpbnQgaSA9IDE7Ci0gICBqanN0YXRlU2V0WzBdID0gc3RhcnRTdGF0ZTsKLSAgIGludCBqLCBraW5kID0gMHg3ZmZmZmZmZjsKLSAgIGZvciAoOzspCi0gICB7Ci0gICAgICBpZiAoKytqanJvdW5kID09IDB4N2ZmZmZmZmYpCi0gICAgICAgICBSZUluaXRSb3VuZHMoKTsKLSAgICAgIGlmIChjdXJDaGFyIDwgNjQpCi0gICAgICB7Ci0gICAgICAgICBsb25nIGwgPSAxTCA8PCBjdXJDaGFyOwotICAgICAgICAgTWF0Y2hMb29wOiBkbwotICAgICAgICAgewotICAgICAgICAgICAgc3dpdGNoKGpqc3RhdGVTZXRbLS1pXSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIGNhc2UgNDoKLSAgICAgICAgICAgICAgICAgIGlmICgoMHhmZmZmZmZmZmZmZmZkYmZmTCAmIGwpICE9IDBMKQotICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgaWYgKGtpbmQgPiA1KQotICAgICAgICAgICAgICAgICAgICAgICAga2luZCA9IDU7Ci0gICAgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZFN0YXRlcygxMDgsIDExMCk7Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICBlbHNlIGlmICgoMHgyNDAwTCAmIGwpICE9IDBMKQotICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgaWYgKGtpbmQgPiA1KQotICAgICAgICAgICAgICAgICAgICAgICAga2luZCA9IDU7Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICBpZiAoY3VyQ2hhciA9PSAxMykKLSAgICAgICAgICAgICAgICAgICAgIGpqc3RhdGVTZXRbampuZXdTdGF0ZUNudCsrXSA9IDI7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgMDoKLSAgICAgICAgICAgICAgICAgIGlmICgoMHhmZmZmZmZmZmZmZmZkYmZmTCAmIGwpID09IDBMKQotICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICBraW5kID0gNTsKLSAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkU3RhdGVzKDEwOCwgMTEwKTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgICAgICAgaWYgKCgweDI0MDBMICYgbCkgIT0gMEwgJiYga2luZCA+IDUpCi0gICAgICAgICAgICAgICAgICAgICBraW5kID0gNTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgICAgICAgaWYgKGN1ckNoYXIgPT0gMTAgJiYga2luZCA+IDUpCi0gICAgICAgICAgICAgICAgICAgICBraW5kID0gNTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSAzOgotICAgICAgICAgICAgICAgICAgaWYgKGN1ckNoYXIgPT0gMTMpCi0gICAgICAgICAgICAgICAgICAgICBqanN0YXRlU2V0W2pqbmV3U3RhdGVDbnQrK10gPSAyOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBkZWZhdWx0IDogYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICB9IHdoaWxlKGkgIT0gc3RhcnRzQXQpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoY3VyQ2hhciA8IDEyOCkKLSAgICAgIHsKLSAgICAgICAgIGxvbmcgbCA9IDFMIDw8IChjdXJDaGFyICYgMDc3KTsKLSAgICAgICAgIE1hdGNoTG9vcDogZG8KLSAgICAgICAgIHsKLSAgICAgICAgICAgIHN3aXRjaChqanN0YXRlU2V0Wy0taV0pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBjYXNlIDQ6Ci0gICAgICAgICAgICAgICBjYXNlIDA6Ci0gICAgICAgICAgICAgICAgICBraW5kID0gNTsKLSAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkU3RhdGVzKDEwOCwgMTEwKTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgZGVmYXVsdCA6IGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgfSB3aGlsZShpICE9IHN0YXJ0c0F0KTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgIGludCBpMiA9IChjdXJDaGFyICYgMHhmZikgPj4gNjsKLSAgICAgICAgIGxvbmcgbDIgPSAxTCA8PCAoY3VyQ2hhciAmIDA3Nyk7Ci0gICAgICAgICBNYXRjaExvb3A6IGRvCi0gICAgICAgICB7Ci0gICAgICAgICAgICBzd2l0Y2goampzdGF0ZVNldFstLWldKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgY2FzZSA0OgotICAgICAgICAgICAgICAgY2FzZSAwOgotICAgICAgICAgICAgICAgICAgaWYgKChqamJpdFZlYzBbaTJdICYgbDIpID09IDBMKQotICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICBpZiAoa2luZCA+IDUpCi0gICAgICAgICAgICAgICAgICAgICBraW5kID0gNTsKLSAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkU3RhdGVzKDEwOCwgMTEwKTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgZGVmYXVsdCA6IGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgfSB3aGlsZShpICE9IHN0YXJ0c0F0KTsKLSAgICAgIH0KLSAgICAgIGlmIChraW5kICE9IDB4N2ZmZmZmZmYpCi0gICAgICB7Ci0gICAgICAgICBqam1hdGNoZWRLaW5kID0ga2luZDsKLSAgICAgICAgIGpqbWF0Y2hlZFBvcyA9IGN1clBvczsKLSAgICAgICAgIGtpbmQgPSAweDdmZmZmZmZmOwotICAgICAgfQotICAgICAgKytjdXJQb3M7Ci0gICAgICBpZiAoKGkgPSBqam5ld1N0YXRlQ250KSA9PSAoc3RhcnRzQXQgPSA0IC0gKGpqbmV3U3RhdGVDbnQgPSBzdGFydHNBdCkpKQotICAgICAgICAgcmV0dXJuIGN1clBvczsKLSAgICAgIHRyeSB7IGN1ckNoYXIgPSBpbnB1dF9zdHJlYW0ucmVhZENoYXIoKTsgfQotICAgICAgY2F0Y2goamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7IHJldHVybiBjdXJQb3M7IH0KLSAgIH0KLX0KLXN0YXRpYyBmaW5hbCBpbnRbXSBqam5leHRTdGF0ZXMgPSB7Ci0gICAzMiwgMzMsIDM4LCAzOSwgNzgsIDc5LCA4MSwgOTMsIDgxLCAxMTAsIDExMSwgNjUsIDk0LCA0NywgNDgsIDUwLCAKLSAgIDYyLCA2MywgNjUsIDEwLCAyOCwgMTEsIDEzLCAxNCwgMTUsIDE2LCAyMSwgMjUsIDQ3LCA0OCwgNTAsIDQ3LCAKLSAgIDQ4LCA1MiwgNTAsIDYyLCA2MywgNjUsIDYyLCA2MywgNjcsIDY1LCA3OCwgNzksIDgxLCA3OCwgNzksIDgzLCAKLSAgIDgxLCA5MywgODEsIDk0LCA5MywgMTAwLCA4MSwgOTQsIDExMCwgMTExLCA2NSwgMTEwLCAxMTEsIDExNCwgNjUsIDcsIAotICAgOCwgMTcsIDE4LCAxOSwgMjAsIDIyLCAxOCwgMjMsIDI0LCAyMiwgMTcsIDI2LCAyNywgMzYsIDM3LCA0MCwgCi0gICA0MSwgNDksIDUxLCA1MywgNTUsIDU4LCA2NCwgNjYsIDY4LCA3MCwgNzMsIDgwLCA4MiwgODQsIDg2LCA4OSwgCi0gICA5NSwgOTcsIDk4LCA5OSwgMTAxLCAxMDMsIDEwNiwgMTEyLCAxMTMsIDExNSwgMTE3LCAxMjAsIDAsIDEsIDMsIAotfTsKLXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gampzdHJMaXRlcmFsSW1hZ2VzID0gewotIiIsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsICJcMTQxXDE2MyIsIAotIlwxNDJcMTYyXDE0NVwxNDFcMTUzIiwgIlwxNDNcMTQxXDE2M1wxNDUiLCAiXDE0M1wxNDFcMTY0XDE0M1wxNTAiLCAiXDE0M1wxNTRcMTQxXDE2M1wxNjMiLCAKLSJcMTQzXDE1N1wxNTZcMTYzXDE2NCIsICJcMTQzXDE1N1wxNTZcMTY0XDE1MVwxNTZcMTY1XDE0NSIsICJcMTQ0XDE0NVwxNDZcMTQxXDE2NVwxNTRcMTY0IiwgCi0iXDE0NFwxNDVcMTU0XDE0NVwxNjRcMTQ1IiwgIlwxNDRcMTU3IiwgIlwxNDVcMTU0XDE2M1wxNDUiLCAiXDE0NVwxNzBcMTY0XDE0NVwxNTZcMTQ0XDE2MyIsIAotIlwxNDZcMTQxXDE1NFwxNjNcMTQ1IiwgIlwxNDZcMTUxXDE1NlwxNDFcMTU0XDE1NFwxNzEiLCAiXDE0NlwxNTdcMTYyIiwgCi0iXDE0NlwxNjVcMTU2XDE0M1wxNjRcMTUxXDE1N1wxNTYiLCAiXDEwNlwxNjVcMTU2XDE0M1wxNjRcMTUxXDE1N1wxNTYiLCAiXDE0N1wxNDVcMTY0IiwgIlwxNTFcMTQ2IiwgIlwxNTFcMTU2IiwgCi0iXDE1MVwxNTZcMTQzXDE1NFwxNjVcMTQ0XDE0NSIsICJcMTUxXDE1NlwxNjNcMTY0XDE0MVwxNTZcMTQzXDE0NVwxNTdcMTQ2IiwgIlwxNTFcMTYzIiwgCi0iXDE1NlwxNDFcMTU1XDE0NVwxNjNcMTYwXDE0MVwxNDNcMTQ1IiwgIlwxNTZcMTQ1XDE2NyIsICJcMTU2XDE2NVwxNTRcMTU0IiwgIlwxNjBcMTQxXDE0M1wxNTNcMTQxXDE0N1wxNDUiLCAKLSJcMTYwXDE2MlwxNTFcMTY2XDE0MVwxNjRcMTQ1IiwgIlwxNjBcMTY1XDE0MlwxNTRcMTUxXDE0MyIsICJcMTYyXDE0NVwxNjRcMTY1XDE2MlwxNTYiLCAiXDE2M1wxNDVcMTY0IiwgCi0iXDE2M1wxNjVcMTYwXDE0NVwxNjIiLCAiXDE2M1wxNjdcMTUxXDE2NFwxNDNcMTUwIiwgIlwxNjRcMTUwXDE1MVwxNjMiLCAiXDE2NFwxNTBcMTYyXDE1N1wxNjciLCAKLSJcMTY0XDE2MlwxNjVcMTQ1IiwgIlwxNjRcMTYyXDE3MSIsICJcMTY0XDE3MVwxNjBcMTQ1XDE1N1wxNDYiLCAiXDE2NVwxNjNcMTQ1IiwgIlwxNjZcMTQxXDE2MiIsIAotIlwxNjZcMTU3XDE1MVwxNDQiLCAiXDE2N1wxNTBcMTUxXDE1NFwxNDUiLCAiXDE2N1wxNTFcMTY0XDE1MCIsIAotIlwxNDFcMTQyXDE2M1wxNjRcMTYyXDE0MVwxNDNcMTY0IiwgIlwxNDRcMTQ1XDE0MlwxNjVcMTQ3XDE0N1wxNDVcMTYyIiwgIlwxNDVcMTU2XDE2NVwxNTUiLCAKLSJcMTQ1XDE3MFwxNjBcMTU3XDE2MlwxNjQiLCAiXDE0N1wxNTdcMTY0XDE1NyIsICJcMTUxXDE1NVwxNjBcMTU0XDE0NVwxNTVcMTQ1XDE1NlwxNjRcMTYzIiwgCi0iXDE1MVwxNTZcMTY0XDE0NVwxNjJcMTQ2XDE0MVwxNDNcMTQ1IiwgIlwxNTZcMTQxXDE2NFwxNTFcMTY2XDE0NSIsICJcMTYwXDE2MlwxNTdcMTY0XDE0NVwxNDNcMTY0XDE0NVwxNDQiLCAKLSJcMTYzXDE3MVwxNTZcMTQzXDE1MFwxNjJcMTU3XDE1NlwxNTFcMTcyXDE0NVwxNDQiLCAiXDE2NFwxNTBcMTYyXDE1N1wxNjdcMTYzIiwgIlwxNjRcMTYyXDE0MVwxNTZcMTYzXDE1MVwxNDVcMTU2XDE2NCIsIAotIlwxNjZcMTU3XDE1NFwxNDFcMTY0XDE1MVwxNTRcMTQ1IiwgIlwxNTFcMTU1XDE2MFwxNTdcMTYyXDE2NCIsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIAotbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgIlw1MCIsICJcNTEiLCAiXDE3MyIsICJcMTc1IiwgCi0iXDEzMyIsICJcMTM1IiwgIlw3MyIsICJcNTQiLCAiXDU2IiwgIlw3Mlw3MiIsICJcNTZcNTZcNTYiLCAiXDc1IiwgIlw3NiIsICJcNzQiLCAKLSJcNDEiLCAiXDE3NiIsICJcNzciLCAiXDcyIiwgIlw3NVw3NSIsICJcNzRcNzUiLCAiXDc2XDc1IiwgIlw0MVw3NSIsICJcMTc0XDE3NCIsIAotIlw0Nlw0NiIsICJcMTM2XDEzNiIsICJcNTNcNTMiLCAiXDU1XDU1IiwgIlw1MyIsICJcNTUiLCAiXDUyIiwgIlw1NyIsICJcNDYiLCAiXDE3NCIsIAotIlwxMzYiLCAiXDQ1IiwgIlw3NFw3NCIsICJcNzZcNzYiLCAiXDc2XDc2XDc2IiwgIlw1M1w3NSIsICJcNTVcNzUiLCAiXDUyXDc1IiwgCi0iXDU3XDc1IiwgIlw0Nlw3NSIsICJcMTc0XDc1IiwgIlwxMzZcNzUiLCAiXDQ1XDc1IiwgIlw3NFw3NFw3NSIsICJcNzZcNzZcNzUiLCAKLSJcNzZcNzZcNzZcNzUiLCAiXDE3NFwxNzRcNzUiLCAiXDQ2XDQ2XDc1IiwgIlwxMzZcMTM2XDc1IiwgIlw3NVw3NVw3NSIsICJcNDFcNzVcNzUiLCB9OwotcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBsZXhTdGF0ZU5hbWVzID0gewotICAgIkRFRkFVTFQiLCAKLSAgICJJTl9TSU5HTEVfTElORV9DT01NRU5UIiwgCi0gICAiSU5fTVVMVElfTElORV9DT01NRU5UIiwgCi19OwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnRbXSBqam5ld0xleFN0YXRlID0gewotICAgLTEsIC0xLCAtMSwgMSwgMiwgMCwgMCwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgCi0gICAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgCi0gICAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgCi0gICAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgCi0gICAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgCi0gICAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgCi19Owotc3RhdGljIGZpbmFsIGxvbmdbXSBqanRvVG9rZW4gPSB7Ci0gICAweGZmZmZmZmZmZmZmZmZmMDFMLCAweGZmZmZmZmZmZmZmZTYxNWZMLCAweDdmTCwgCi19Owotc3RhdGljIGZpbmFsIGxvbmdbXSBqanRvU2tpcCA9IHsKLSAgIDB4NjZMLCAweDBMLCAweDBMLCAKLX07Ci1zdGF0aWMgZmluYWwgbG9uZ1tdIGpqdG9TcGVjaWFsID0gewotICAgMHg2NkwsIDB4MEwsIDB4MEwsIAotfTsKLXN0YXRpYyBmaW5hbCBsb25nW10gamp0b01vcmUgPSB7Ci0gICAweDk4TCwgMHgwTCwgMHgwTCwgCi19OwotcHJvdGVjdGVkIFNpbXBsZUNoYXJTdHJlYW0gaW5wdXRfc3RyZWFtOwotcHJpdmF0ZSBmaW5hbCBpbnRbXSBqanJvdW5kcyA9IG5ldyBpbnRbMTI0XTsKLXByaXZhdGUgZmluYWwgaW50W10gampzdGF0ZVNldCA9IG5ldyBpbnRbMjQ4XTsKLVN0cmluZ0J1ZmZlciBpbWFnZTsKLWludCBqamltYWdlTGVuOwotaW50IGxlbmd0aE9mTWF0Y2g7Ci1wcm90ZWN0ZWQgY2hhciBjdXJDaGFyOwotcHVibGljIEpTUGFyc2VyMjBUb2tlbk1hbmFnZXIoU2ltcGxlQ2hhclN0cmVhbSBzdHJlYW0pewotICAgaWYgKFNpbXBsZUNoYXJTdHJlYW0uc3RhdGljRmxhZykKLSAgICAgIHRocm93IG5ldyBFcnJvcigiRVJST1I6IENhbm5vdCB1c2UgYSBzdGF0aWMgQ2hhclN0cmVhbSBjbGFzcyB3aXRoIGEgbm9uLXN0YXRpYyBsZXhpY2FsIGFuYWx5emVyLiIpOwotICAgaW5wdXRfc3RyZWFtID0gc3RyZWFtOwotfQotcHVibGljIEpTUGFyc2VyMjBUb2tlbk1hbmFnZXIoU2ltcGxlQ2hhclN0cmVhbSBzdHJlYW0sIGludCBsZXhTdGF0ZSl7Ci0gICB0aGlzKHN0cmVhbSk7Ci0gICBTd2l0Y2hUbyhsZXhTdGF0ZSk7Ci19Ci1wdWJsaWMgdm9pZCBSZUluaXQoU2ltcGxlQ2hhclN0cmVhbSBzdHJlYW0pCi17Ci0gICBqam1hdGNoZWRQb3MgPSBqam5ld1N0YXRlQ250ID0gMDsKLSAgIGN1ckxleFN0YXRlID0gZGVmYXVsdExleFN0YXRlOwotICAgaW5wdXRfc3RyZWFtID0gc3RyZWFtOwotICAgUmVJbml0Um91bmRzKCk7Ci19Ci1wcml2YXRlIGZpbmFsIHZvaWQgUmVJbml0Um91bmRzKCkKLXsKLSAgIGludCBpOwotICAgampyb3VuZCA9IDB4ODAwMDAwMDE7Ci0gICBmb3IgKGkgPSAxMjQ7IGktLSA+IDA7KQotICAgICAgampyb3VuZHNbaV0gPSAweDgwMDAwMDAwOwotfQotcHVibGljIHZvaWQgUmVJbml0KFNpbXBsZUNoYXJTdHJlYW0gc3RyZWFtLCBpbnQgbGV4U3RhdGUpCi17Ci0gICBSZUluaXQoc3RyZWFtKTsKLSAgIFN3aXRjaFRvKGxleFN0YXRlKTsKLX0KLXB1YmxpYyB2b2lkIFN3aXRjaFRvKGludCBsZXhTdGF0ZSkKLXsKLSAgIGlmIChsZXhTdGF0ZSA+PSAzIHx8IGxleFN0YXRlIDwgMCkKLSAgICAgIHRocm93IG5ldyBUb2tlbk1nckVycm9yKCJFcnJvcjogSWdub3JpbmcgaW52YWxpZCBsZXhpY2FsIHN0YXRlIDogIiArIGxleFN0YXRlICsgIi4gU3RhdGUgdW5jaGFuZ2VkLiIsIFRva2VuTWdyRXJyb3IuSU5WQUxJRF9MRVhJQ0FMX1NUQVRFKTsKLSAgIGVsc2UKLSAgICAgIGN1ckxleFN0YXRlID0gbGV4U3RhdGU7Ci19Ci0KLXByb3RlY3RlZCBUb2tlbiBqakZpbGxUb2tlbigpCi17Ci0gICBUb2tlbiB0ID0gVG9rZW4ubmV3VG9rZW4oamptYXRjaGVkS2luZCk7Ci0gICB0LmtpbmQgPSBqam1hdGNoZWRLaW5kOwotICAgaWYgKGpqbWF0Y2hlZFBvcyA8IDApCi0gICB7Ci0gICAgICBpZiAoaW1hZ2UgPT0gbnVsbCkKLSAgICAgICAgIHQuaW1hZ2UgPSAiIjsKLSAgICAgIGVsc2UKLSAgICAgICAgIHQuaW1hZ2UgPSBpbWFnZS50b1N0cmluZygpOwotICAgICAgdC5iZWdpbkxpbmUgPSB0LmVuZExpbmUgPSBpbnB1dF9zdHJlYW0uZ2V0QmVnaW5MaW5lKCk7Ci0gICAgICB0LmJlZ2luQ29sdW1uID0gdC5lbmRDb2x1bW4gPSBpbnB1dF9zdHJlYW0uZ2V0QmVnaW5Db2x1bW4oKTsKLSAgIH0KLSAgIGVsc2UKLSAgIHsKLSAgICAgIFN0cmluZyBpbSA9IGpqc3RyTGl0ZXJhbEltYWdlc1tqam1hdGNoZWRLaW5kXTsKLSAgICAgIHQuaW1hZ2UgPSAoaW0gPT0gbnVsbCkgPyBpbnB1dF9zdHJlYW0uR2V0SW1hZ2UoKSA6IGltOwotICAgICAgdC5iZWdpbkxpbmUgPSBpbnB1dF9zdHJlYW0uZ2V0QmVnaW5MaW5lKCk7Ci0gICAgICB0LmJlZ2luQ29sdW1uID0gaW5wdXRfc3RyZWFtLmdldEJlZ2luQ29sdW1uKCk7Ci0gICAgICB0LmVuZExpbmUgPSBpbnB1dF9zdHJlYW0uZ2V0RW5kTGluZSgpOwotICAgICAgdC5lbmRDb2x1bW4gPSBpbnB1dF9zdHJlYW0uZ2V0RW5kQ29sdW1uKCk7Ci0gICB9Ci0gICByZXR1cm4gdDsKLX0KLQotaW50IGN1ckxleFN0YXRlID0gMDsKLWludCBkZWZhdWx0TGV4U3RhdGUgPSAwOwotaW50IGpqbmV3U3RhdGVDbnQ7Ci1pbnQgampyb3VuZDsKLWludCBqam1hdGNoZWRQb3M7Ci1pbnQgamptYXRjaGVkS2luZDsKLQotcHVibGljIFRva2VuIGdldE5leHRUb2tlbigpIAotewotICBpbnQga2luZDsKLSAgVG9rZW4gc3BlY2lhbFRva2VuID0gbnVsbDsKLSAgVG9rZW4gbWF0Y2hlZFRva2VuOwotICBpbnQgY3VyUG9zID0gMDsKLQotICBFT0ZMb29wIDoKLSAgZm9yICg7OykKLSAgeyAgIAotICAgdHJ5ICAgCi0gICB7ICAgICAKLSAgICAgIGN1ckNoYXIgPSBpbnB1dF9zdHJlYW0uQmVnaW5Ub2tlbigpOwotICAgfSAgICAgCi0gICBjYXRjaChqYXZhLmlvLklPRXhjZXB0aW9uIGUpCi0gICB7ICAgICAgICAKLSAgICAgIGpqbWF0Y2hlZEtpbmQgPSAwOwotICAgICAgbWF0Y2hlZFRva2VuID0gampGaWxsVG9rZW4oKTsKLSAgICAgIG1hdGNoZWRUb2tlbi5zcGVjaWFsVG9rZW4gPSBzcGVjaWFsVG9rZW47Ci0gICAgICByZXR1cm4gbWF0Y2hlZFRva2VuOwotICAgfQotICAgaW1hZ2UgPSBudWxsOwotICAgamppbWFnZUxlbiA9IDA7Ci0KLSAgIGZvciAoOzspCi0gICB7Ci0gICAgIHN3aXRjaChjdXJMZXhTdGF0ZSkKLSAgICAgewotICAgICAgIGNhc2UgMDoKLSAgICAgICAgIGpqbWF0Y2hlZEtpbmQgPSAweDdmZmZmZmZmOwotICAgICAgICAgamptYXRjaGVkUG9zID0gMDsKLSAgICAgICAgIGN1clBvcyA9IGpqTW92ZVN0cmluZ0xpdGVyYWxEZmEwXzAoKTsKLSAgICAgICAgIGJyZWFrOwotICAgICAgIGNhc2UgMToKLSAgICAgICAgIGpqbWF0Y2hlZEtpbmQgPSA1OwotICAgICAgICAgamptYXRjaGVkUG9zID0gLTE7Ci0gICAgICAgICBjdXJQb3MgPSAwOwotICAgICAgICAgY3VyUG9zID0gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTBfMSgpOwotICAgICAgICAgaWYgKGpqbWF0Y2hlZFBvcyA8IDAgfHwgKGpqbWF0Y2hlZFBvcyA9PSAwICYmIGpqbWF0Y2hlZEtpbmQgPiA3KSkKLSAgICAgICAgIHsKLSAgICAgICAgICAgIGpqbWF0Y2hlZEtpbmQgPSA3OwotICAgICAgICAgICAgamptYXRjaGVkUG9zID0gMDsKLSAgICAgICAgIH0KLSAgICAgICAgIGJyZWFrOwotICAgICAgIGNhc2UgMjoKLSAgICAgICAgIGpqbWF0Y2hlZEtpbmQgPSAweDdmZmZmZmZmOwotICAgICAgICAgamptYXRjaGVkUG9zID0gMDsKLSAgICAgICAgIGN1clBvcyA9IGpqTW92ZVN0cmluZ0xpdGVyYWxEZmEwXzIoKTsKLSAgICAgICAgIGlmIChqam1hdGNoZWRQb3MgPT0gMCAmJiBqam1hdGNoZWRLaW5kID4gNykKLSAgICAgICAgIHsKLSAgICAgICAgICAgIGpqbWF0Y2hlZEtpbmQgPSA3OwotICAgICAgICAgfQotICAgICAgICAgYnJlYWs7Ci0gICAgIH0KLSAgICAgaWYgKGpqbWF0Y2hlZEtpbmQgIT0gMHg3ZmZmZmZmZikKLSAgICAgewotICAgICAgICBpZiAoamptYXRjaGVkUG9zICsgMSA8IGN1clBvcykKLSAgICAgICAgICAgaW5wdXRfc3RyZWFtLmJhY2t1cChjdXJQb3MgLSBqam1hdGNoZWRQb3MgLSAxKTsKLSAgICAgICAgaWYgKChqanRvVG9rZW5bamptYXRjaGVkS2luZCA+PiA2XSAmICgxTCA8PCAoamptYXRjaGVkS2luZCAmIDA3NykpKSAhPSAwTCkKLSAgICAgICAgewotICAgICAgICAgICBtYXRjaGVkVG9rZW4gPSBqakZpbGxUb2tlbigpOwotICAgICAgICAgICBtYXRjaGVkVG9rZW4uc3BlY2lhbFRva2VuID0gc3BlY2lhbFRva2VuOwotICAgICAgICAgICBUb2tlbkxleGljYWxBY3Rpb25zKG1hdGNoZWRUb2tlbik7Ci0gICAgICAgaWYgKGpqbmV3TGV4U3RhdGVbamptYXRjaGVkS2luZF0gIT0gLTEpCi0gICAgICAgICBjdXJMZXhTdGF0ZSA9IGpqbmV3TGV4U3RhdGVbamptYXRjaGVkS2luZF07Ci0gICAgICAgICAgIHJldHVybiBtYXRjaGVkVG9rZW47Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoKGpqdG9Ta2lwW2pqbWF0Y2hlZEtpbmQgPj4gNl0gJiAoMUwgPDwgKGpqbWF0Y2hlZEtpbmQgJiAwNzcpKSkgIT0gMEwpCi0gICAgICAgIHsKLSAgICAgICAgICAgaWYgKChqanRvU3BlY2lhbFtqam1hdGNoZWRLaW5kID4+IDZdICYgKDFMIDw8IChqam1hdGNoZWRLaW5kICYgMDc3KSkpICE9IDBMKQotICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIG1hdGNoZWRUb2tlbiA9IGpqRmlsbFRva2VuKCk7Ci0gICAgICAgICAgICAgIGlmIChzcGVjaWFsVG9rZW4gPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgc3BlY2lhbFRva2VuID0gbWF0Y2hlZFRva2VuOwotICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgbWF0Y2hlZFRva2VuLnNwZWNpYWxUb2tlbiA9IHNwZWNpYWxUb2tlbjsKLSAgICAgICAgICAgICAgICAgc3BlY2lhbFRva2VuID0gKHNwZWNpYWxUb2tlbi5uZXh0ID0gbWF0Y2hlZFRva2VuKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBTa2lwTGV4aWNhbEFjdGlvbnMobWF0Y2hlZFRva2VuKTsKLSAgICAgICAgICAgfQotICAgICAgICAgICBlbHNlIAotICAgICAgICAgICAgICBTa2lwTGV4aWNhbEFjdGlvbnMobnVsbCk7Ci0gICAgICAgICBpZiAoampuZXdMZXhTdGF0ZVtqam1hdGNoZWRLaW5kXSAhPSAtMSkKLSAgICAgICAgICAgY3VyTGV4U3RhdGUgPSBqam5ld0xleFN0YXRlW2pqbWF0Y2hlZEtpbmRdOwotICAgICAgICAgICBjb250aW51ZSBFT0ZMb29wOwotICAgICAgICB9Ci0gICAgICAgIGpqaW1hZ2VMZW4gKz0gamptYXRjaGVkUG9zICsgMTsKLSAgICAgIGlmIChqam5ld0xleFN0YXRlW2pqbWF0Y2hlZEtpbmRdICE9IC0xKQotICAgICAgICBjdXJMZXhTdGF0ZSA9IGpqbmV3TGV4U3RhdGVbamptYXRjaGVkS2luZF07Ci0gICAgICAgIGN1clBvcyA9IDA7Ci0gICAgICAgIGpqbWF0Y2hlZEtpbmQgPSAweDdmZmZmZmZmOwotICAgICAgICB0cnkgewotICAgICAgICAgICBjdXJDaGFyID0gaW5wdXRfc3RyZWFtLnJlYWRDaGFyKCk7Ci0gICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChqYXZhLmlvLklPRXhjZXB0aW9uIGUxKSB7IH0KLSAgICAgfQotICAgICBpbnQgZXJyb3JfbGluZSA9IGlucHV0X3N0cmVhbS5nZXRFbmRMaW5lKCk7Ci0gICAgIGludCBlcnJvcl9jb2x1bW4gPSBpbnB1dF9zdHJlYW0uZ2V0RW5kQ29sdW1uKCk7Ci0gICAgIFN0cmluZyBlcnJvcl9hZnRlciA9IG51bGw7Ci0gICAgIGJvb2xlYW4gRU9GU2VlbiA9IGZhbHNlOwotICAgICB0cnkgeyBpbnB1dF9zdHJlYW0ucmVhZENoYXIoKTsgaW5wdXRfc3RyZWFtLmJhY2t1cCgxKTsgfQotICAgICBjYXRjaCAoamF2YS5pby5JT0V4Y2VwdGlvbiBlMSkgewotICAgICAgICBFT0ZTZWVuID0gdHJ1ZTsKLSAgICAgICAgZXJyb3JfYWZ0ZXIgPSBjdXJQb3MgPD0gMSA/ICIiIDogaW5wdXRfc3RyZWFtLkdldEltYWdlKCk7Ci0gICAgICAgIGlmIChjdXJDaGFyID09ICdcbicgfHwgY3VyQ2hhciA9PSAnXHInKSB7Ci0gICAgICAgICAgIGVycm9yX2xpbmUrKzsKLSAgICAgICAgICAgZXJyb3JfY29sdW1uID0gMDsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgICAgIGVycm9yX2NvbHVtbisrOwotICAgICB9Ci0gICAgIGlmICghRU9GU2VlbikgewotICAgICAgICBpbnB1dF9zdHJlYW0uYmFja3VwKDEpOwotICAgICAgICBlcnJvcl9hZnRlciA9IGN1clBvcyA8PSAxID8gIiIgOiBpbnB1dF9zdHJlYW0uR2V0SW1hZ2UoKTsKLSAgICAgfQotICAgICB0aHJvdyBuZXcgVG9rZW5NZ3JFcnJvcihFT0ZTZWVuLCBjdXJMZXhTdGF0ZSwgZXJyb3JfbGluZSwgZXJyb3JfY29sdW1uLCBlcnJvcl9hZnRlciwgY3VyQ2hhciwgVG9rZW5NZ3JFcnJvci5MRVhJQ0FMX0VSUk9SKTsKLSAgIH0KLSAgfQotfQotCi12b2lkIFNraXBMZXhpY2FsQWN0aW9ucyhUb2tlbiBtYXRjaGVkVG9rZW4pCi17Ci0gICBzd2l0Y2goamptYXRjaGVkS2luZCkKLSAgIHsKLSAgICAgIGRlZmF1bHQgOgotICAgICAgICAgYnJlYWs7Ci0gICB9Ci19Ci12b2lkIFRva2VuTGV4aWNhbEFjdGlvbnMoVG9rZW4gbWF0Y2hlZFRva2VuKQotewotICAgc3dpdGNoKGpqbWF0Y2hlZEtpbmQpCi0gICB7Ci0gICAgICBjYXNlIDc3IDoKLSAgICAgICAgaWYgKGltYWdlID09IG51bGwpCi0gICAgICAgICAgICBpbWFnZSA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgICAgIGltYWdlLmFwcGVuZChpbnB1dF9zdHJlYW0uR2V0U3VmZml4KGpqaW1hZ2VMZW4gKyAobGVuZ3RoT2ZNYXRjaCA9IGpqbWF0Y2hlZFBvcyArIDEpKSk7Ci0gICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgLy8gUGVlayBhdCB0aGUgbmV4dCBjaGFyYWN0ZXIuCi0gICAgICAgICAgICAgICAgY2hhciBuZXh0Q2ggPSBpbnB1dF9zdHJlYW0ucmVhZENoYXIoKTsKLSAgICAgICAgICAgICAgICBpbnB1dF9zdHJlYW0uYmFja3VwKDEpOwotICAgICAgICAgICAgICAgIGlmIChpc1JlZ1ZhbGlkID09IGZhbHNlIHx8IG5leHRDaCA9PSAnLycgfHwgbmV4dENoID09ICcqJykgewotICAgICAgICAgICAgICAgICAgICAvLwotICAgICAgICAgICAgICAgICAgICAvLyBMZXhlY2FsIGFuYWx5c2VyIHRoaW5rcyBpdCBpcyBhIFJFCi0gICAgICAgICAgICAgICAgICAgIC8vIG9wZXJhdG9yIHN1Y2ggYXMgLy4uLi4uLwotICAgICAgICAgICAgICAgICAgICAvLyBQdXQgdGhlIGV2ZXJ5dGhpbmcgdG8gdGhlIGZpcnN0ICIvIiBiYWNrIG9uIHRoZSBpbnB1dCBzdHJlYW0KLSAgICAgICAgICAgICAgICAgICAgLy8KLSAgICAgICAgICAgICAgICAgICAgaW5wdXRfc3RyZWFtLmJhY2t1cChsZW5ndGhPZk1hdGNoLTEpOwotICAgICAgICAgICAgICAgICAgICAvLwotICAgICAgICAgICAgICAgICAgICAvLyBBbmQgcmVtb3ZlIGl0IGZyb20gdGhlIHRva2VuCi0gICAgICAgICAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAgICAgICAgIG1hdGNoZWRUb2tlbi5pbWFnZSA9IG1hdGNoZWRUb2tlbi5pbWFnZS5zdWJzdHJpbmcoMCwgMSk7Ci0gICAgICAgICAgICAgICAgICAgIGltYWdlLmRlbGV0ZSgwLCBpbWFnZS5sZW5ndGgoKSAtIDEpOwotICAgICAgICAgICAgICAgICAgICBpbWFnZS5hcHBlbmQoJy8nKTsKLSAgICAgICAgICAgICAgICAgICAgbWF0Y2hlZFRva2VuLmtpbmQ9U0xBU0g7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoZS50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgIH0KLSAgICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdCA6IAotICAgICAgICAgYnJlYWs7Ci0gICB9Ci19Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvSlNQYXJzZXIyMFRyZWVDb25zdGFudHMuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0pTUGFyc2VyMjBUcmVlQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3ZTQwMTIuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvSlNQYXJzZXIyMFRyZWVDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwMyArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIC5cSlNQYXJzZXIyMFRyZWVDb25zdGFudHMuamF2YSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5qYXZhc2NyaXB0MjBwYXJzZXI7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSlNQYXJzZXIyMFRyZWVDb25zdGFudHMKLXsKLSAgcHVibGljIGludCBKSlRQUk9HUkFNID0gMDsKLSAgcHVibGljIGludCBKSlRJREVOVElGSUVSID0gMTsKLSAgcHVibGljIGludCBKSlRTSU1QTEVRVUFMSUZJRURJREVOVElGSUVSID0gMjsKLSAgcHVibGljIGludCBKSlRFWFBSRVNTSU9OUVVBTElGSUVESURFTlRJRklFUiA9IDM7Ci0gIHB1YmxpYyBpbnQgSkpUUVVBTElGSUVESURFTlRJRklFUiA9IDQ7Ci0gIHB1YmxpYyBpbnQgSkpUUFJJTUFSWUVYUFJFU1NJT04gPSA1OwotICBwdWJsaWMgaW50IEpKVFJFU0VSVkVETkFNRVNQQUNFID0gNjsKLSAgcHVibGljIGludCBKSlRGVU5DVElPTkVYUFJFU1NJT04gPSA3OwotICBwdWJsaWMgaW50IEpKVE9CSkVDVExJVEVSQUwgPSA4OwotICBwdWJsaWMgaW50IEpKVEZJRUxETElTVCA9IDk7Ci0gIHB1YmxpYyBpbnQgSkpUTElURVJBTEZJRUxEID0gMTA7Ci0gIHB1YmxpYyBpbnQgSkpURklFTEROQU1FID0gMTE7Ci0gIHB1YmxpYyBpbnQgSkpUQVJSQVlMSVRFUkFMID0gMTI7Ci0gIHB1YmxpYyBpbnQgSkpURUxFTUVOVExJU1QgPSAxMzsKLSAgcHVibGljIGludCBKSlRMSVRFUkFMRUxFTUVOVCA9IDE0OwotICBwdWJsaWMgaW50IEpKVFNVUEVSRVhQUkVTU0lPTiA9IDE1OwotICBwdWJsaWMgaW50IEpKVFBPU1RGSVhFWFBSRVNTSU9OID0gMTY7Ci0gIHB1YmxpYyBpbnQgSkpUQVRUUklCVVRFRVhQUkVTU0lPTiA9IDE3OwotICBwdWJsaWMgaW50IEpKVEZVTExQT1NURklYRVhQUkVTU0lPTiA9IDE4OwotICBwdWJsaWMgaW50IEpKVEZVTExORVdFWFBSRVNTSU9OID0gMTk7Ci0gIHB1YmxpYyBpbnQgSkpURlVOQ1RJT05DT05TVFJVQ1RPUiA9IDIwOwotICBwdWJsaWMgaW50IEpKVEZVTExORVdTVUJFWFBSRVNTSU9OID0gMjE7Ci0gIHB1YmxpYyBpbnQgSkpUUE9TVEZJWE9QID0gMjI7Ci0gIHB1YmxpYyBpbnQgSkpUUFJPUEVSVFlPUkFSR1VNRU5UUyA9IDIzOwotICBwdWJsaWMgaW50IEpKVFBST1BFUlRZT1BFUkFUT1IgPSAyNDsKLSAgcHVibGljIGludCBKSlRBUkdVTUVOVFMgPSAyNTsKLSAgcHVibGljIGludCBKSlRVTkFSWUVYUFJFU1NJT04gPSAyNjsKLSAgcHVibGljIGludCBKSlRNVUxPUCA9IDI3OwotICBwdWJsaWMgaW50IEpKVE1VTFRJUExJQ0FUSVZFRVhQUkVTU0lPTiA9IDI4OwotICBwdWJsaWMgaW50IEpKVEFERE9QID0gMjk7Ci0gIHB1YmxpYyBpbnQgSkpUQURESVRJVkVFWFBSRVNTSU9OID0gMzA7Ci0gIHB1YmxpYyBpbnQgSkpUU0hJRlRPUCA9IDMxOwotICBwdWJsaWMgaW50IEpKVFNISUZURVhQUkVTU0lPTiA9IDMyOwotICBwdWJsaWMgaW50IEpKVFJFTE9QID0gMzM7Ci0gIHB1YmxpYyBpbnQgSkpUUkVMQVRJT05BTEVYUFJFU1NJT04gPSAzNDsKLSAgcHVibGljIGludCBKSlRSRUxBVElPTkFMRVhQUkVTU0lPTk5PSU4gPSAzNTsKLSAgcHVibGljIGludCBKSlRFUVVBTE9QID0gMzY7Ci0gIHB1YmxpYyBpbnQgSkpURVFVQUxJVFlFWFBSRVNTSU9OID0gMzc7Ci0gIHB1YmxpYyBpbnQgSkpURVFVQUxJVFlFWFBSRVNTSU9OTk9JTiA9IDM4OwotICBwdWJsaWMgaW50IEpKVEJJVFdJU0VBTkRPUCA9IDM5OwotICBwdWJsaWMgaW50IEpKVEJJVFdJU0VBTkRFWFBSRVNTSU9OID0gNDA7Ci0gIHB1YmxpYyBpbnQgSkpUQklUV0lTRUFOREVYUFJFU1NJT05OT0lOID0gNDE7Ci0gIHB1YmxpYyBpbnQgSkpUQklUV0lTRVhPUk9QID0gNDI7Ci0gIHB1YmxpYyBpbnQgSkpUQklUV0lTRVhPUkVYUFJFU1NJT04gPSA0MzsKLSAgcHVibGljIGludCBKSlRCSVRXSVNFWE9SRVhQUkVTU0lPTk5PSU4gPSA0NDsKLSAgcHVibGljIGludCBKSlRCSVRXSVNFT1JPUCA9IDQ1OwotICBwdWJsaWMgaW50IEpKVEJJVFdJU0VPUkVYUFJFU1NJT04gPSA0NjsKLSAgcHVibGljIGludCBKSlRCSVRXSVNFT1JFWFBSRVNTSU9OTk9JTiA9IDQ3OwotICBwdWJsaWMgaW50IEpKVExPR0lDQUxBTkRFWFBSRVNTSU9OID0gNDg7Ci0gIHB1YmxpYyBpbnQgSkpUTE9HSUNBTEFOREVYUFJFU1NJT05OT0lOID0gNDk7Ci0gIHB1YmxpYyBpbnQgSkpUTE9HSUNBTE9SRVhQUkVTU0lPTiA9IDUwOwotICBwdWJsaWMgaW50IEpKVExPR0lDQUxPUkVYUFJFU1NJT05OT0lOID0gNTE7Ci0gIHB1YmxpYyBpbnQgSkpUQ09ORElUSU9OQUxFWFBSRVNTSU9OID0gNTI7Ci0gIHB1YmxpYyBpbnQgSkpUQ09ORElUSU9OQUxFWFBSRVNTSU9OTk9JTiA9IDUzOwotICBwdWJsaWMgaW50IEpKVE5PTkFTU0lHTk1FTlRFWFBSRVNTSU9OID0gNTQ7Ci0gIHB1YmxpYyBpbnQgSkpUTk9OQVNTSUdOTUVOVEVYUFJFU1NJT05OT0lOID0gNTU7Ci0gIHB1YmxpYyBpbnQgSkpUQVNTSUdORU1FTlRPUEVSQVRPUiA9IDU2OwotICBwdWJsaWMgaW50IEpKVEFTU0lHTk1FTlRFWFBSRVNTSU9OID0gNTc7Ci0gIHB1YmxpYyBpbnQgSkpUQVNTSUdOTUVOVEVYUFJFU1NJT05OT0lOID0gNTg7Ci0gIHB1YmxpYyBpbnQgSkpUTElTVEVYUFJFU1NJT04gPSA1OTsKLSAgcHVibGljIGludCBKSlRMSVNURVhQUkVTU0lPTk5PSU4gPSA2MDsKLSAgcHVibGljIGludCBKSlRUWVBFRVhQUkVTU0lPTiA9IDYxOwotICBwdWJsaWMgaW50IEpKVFRZUEVFWFBSRVNTSU9OTk9JTiA9IDYyOwotICBwdWJsaWMgaW50IEpKVFRZUEVFWFBSRVNTSU9OTElTVCA9IDYzOwotICBwdWJsaWMgaW50IEpKVFNUQVRFTUVOVCA9IDY0OwotICBwdWJsaWMgaW50IEpKVFNVQlNUQVRFTUVOVCA9IDY1OwotICBwdWJsaWMgaW50IEpKVFNVQlNUQVRFTUVOVFMgPSA2NjsKLSAgcHVibGljIGludCBKSlRTQyA9IDY3OwotICBwdWJsaWMgaW50IEpKVEVPTENPTU1FTlRTS0lQV1MgPSA2ODsKLSAgcHVibGljIGludCBKSlRFTVBUWVNUQVRFTUVOVCA9IDY5OwotICBwdWJsaWMgaW50IEpKVEVYUFJFU1NJT05TVEFURU1FTlQgPSA3MDsKLSAgcHVibGljIGludCBKSlRTVVBFUlNUQVRFTUVOVCA9IDcxOwotICBwdWJsaWMgaW50IEpKVEJMT0NLID0gNzI7Ci0gIHB1YmxpYyBpbnQgSkpUTEFCRUxFRFNUQVRFTUVOVCA9IDczOwotICBwdWJsaWMgaW50IEpKVElGU1RBVEVNRU5UID0gNzQ7Ci0gIHB1YmxpYyBpbnQgSkpUU1dJVENIU1RBVEVNRU5UID0gNzU7Ci0gIHB1YmxpYyBpbnQgSkpUQ0FTRUVMRU1FTlRTID0gNzY7Ci0gIHB1YmxpYyBpbnQgSkpUQ0FTRUVMRU1FTlQgPSA3NzsKLSAgcHVibGljIGludCBKSlRDQVNFTEFCRUwgPSA3ODsKLSAgcHVibGljIGludCBKSlRET1NUQVRFTUVOVCA9IDc5OwotICBwdWJsaWMgaW50IEpKVFdISUxFU1RBVEVNRU5UID0gODA7Ci0gIHB1YmxpYyBpbnQgSkpURk9SU1RBVEVNRU5UID0gODE7Ci0gIHB1YmxpYyBpbnQgSkpURk9SSU5JVElBTElaRVIgPSA4MjsKLSAgcHVibGljIGludCBKSlRGT1JJTkJJTkRJTkcgPSA4MzsKLSAgcHVibGljIGludCBKSlRXSVRIU1RBVEVNRU5UID0gODQ7Ci0gIHB1YmxpYyBpbnQgSkpUQ09OVElOVUVTVEFURU1FTlQgPSA4NTsKLSAgcHVibGljIGludCBKSlRCUkVBS1NUQVRFTUVOVCA9IDg2OwotICBwdWJsaWMgaW50IEpKVFJFVFVSTlNUQVRFTUVOVCA9IDg3OwotICBwdWJsaWMgaW50IEpKVFRIUk9XU1RBVEVNRU5UID0gODg7Ci0gIHB1YmxpYyBpbnQgSkpUVFJZU1RBVEVNRU5UID0gODk7Ci0gIHB1YmxpYyBpbnQgSkpURElSRUNUSVZFUyA9IDkwOwotICBwdWJsaWMgaW50IEpKVERJUkVDVElWRSA9IDkxOwotICBwdWJsaWMgaW50IEpKVEFOTk9UQVRBQkxFRElSRUNUSVZFID0gOTI7Ci0gIHB1YmxpYyBpbnQgSkpUQVRUUklCVVRFUyA9IDkzOwotICBwdWJsaWMgaW50IEpKVEFUVFJJQlVURSA9IDk0OwotICBwdWJsaWMgaW50IEpKVFVTRURJUkVDVElWRSA9IDk1OwotICBwdWJsaWMgaW50IEpKVElNUE9SVERJUkVDVElWRSA9IDk2OwotICBwdWJsaWMgaW50IEpKVElOQ0xVREVESVJFQ1RJVkUgPSA5NzsKLSAgcHVibGljIGludCBKSlRQUkFHTUEgPSA5ODsKLSAgcHVibGljIGludCBKSlRQUkFHTUFJVEVNUyA9IDk5OwotICBwdWJsaWMgaW50IEpKVFBSQUdNQUlURU0gPSAxMDA7Ci0gIHB1YmxpYyBpbnQgSkpUUFJBR01BRVhQUiA9IDEwMTsKLSAgcHVibGljIGludCBKSlRQUkFHTUFBUkdVTUVOVCA9IDEwMjsKLSAgcHVibGljIGludCBKSlRFWFBPUlRERUZJTklUSU9OID0gMTAzOwotICBwdWJsaWMgaW50IEpKVEVYUE9SVEJJTkRJTkdMSVNUID0gMTA0OwotICBwdWJsaWMgaW50IEpKVEVYUE9SVEJJTkRJTkcgPSAxMDU7Ci0gIHB1YmxpYyBpbnQgSkpUVkFSSUFCTEVERUZJTklUSU9OID0gMTA2OwotICBwdWJsaWMgaW50IEpKVFZBUklBQkxFREVGSU5JVElPTk5PSU4gPSAxMDc7Ci0gIHB1YmxpYyBpbnQgSkpUVkFSSUFCTEVERUZJTklUSU9OS0lORCA9IDEwODsKLSAgcHVibGljIGludCBKSlRWQVJJQUJMRUJJTkRJTkdMSVNUID0gMTA5OwotICBwdWJsaWMgaW50IEpKVFZBUklBQkxFQklORElOR0xJU1ROT0lOID0gMTEwOwotICBwdWJsaWMgaW50IEpKVFZBUklBQkxFQklORElORyA9IDExMTsKLSAgcHVibGljIGludCBKSlRWQVJJQUJMRUJJTkRJTkdOT0lOID0gMTEyOwotICBwdWJsaWMgaW50IEpKVFZBUklBQkxFSU5JVElBTElTQVRJT04gPSAxMTM7Ci0gIHB1YmxpYyBpbnQgSkpUVkFSSUFCTEVJTklUSUFMSVNBVElPTk5PSU4gPSAxMTQ7Ci0gIHB1YmxpYyBpbnQgSkpUVkFSSUFCTEVJTklUSUFMSVpFUiA9IDExNTsKLSAgcHVibGljIGludCBKSlRWQVJJQUJMRUlOSVRJQUxJWkVSTk9JTiA9IDExNjsKLSAgcHVibGljIGludCBKSlRUWVBFRElERU5USUZJRVIgPSAxMTc7Ci0gIHB1YmxpYyBpbnQgSkpUVFlQRURJREVOVElGSUVSTk9JTiA9IDExODsKLSAgcHVibGljIGludCBKSlRTSU1QTEVWQVJJQUJMRURFRklOSVRJT04gPSAxMTk7Ci0gIHB1YmxpYyBpbnQgSkpUVU5UWVBFRFZBUklBQkxFQklORElOR0xJU1QgPSAxMjA7Ci0gIHB1YmxpYyBpbnQgSkpUVU5UWVBFRFZBUklBQkxFQklORElORyA9IDEyMTsKLSAgcHVibGljIGludCBKSlRGVU5DVElPTkRFRklOSVRJT04gPSAxMjI7Ci0gIHB1YmxpYyBpbnQgSkpURlVOQ1RJT05OQU1FID0gMTIzOwotICBwdWJsaWMgaW50IEpKVEZVTkNUSU9OQ09NTU9OID0gMTI0OwotICBwdWJsaWMgaW50IEpKVFBBUkFNRVRFUlMgPSAxMjU7Ci0gIHB1YmxpYyBpbnQgSkpUUEFSQU1FVEVSID0gMTI2OwotICBwdWJsaWMgaW50IEpKVFBBUkFNRVRFUklOSVQgPSAxMjc7Ci0gIHB1YmxpYyBpbnQgSkpUUkVTVFBBUkFNRVRFUlMgPSAxMjg7Ci0gIHB1YmxpYyBpbnQgSkpUUkVTVUxUID0gMTI5OwotICBwdWJsaWMgaW50IEpKVENMQVNTREVGSU5JVElPTiA9IDEzMDsKLSAgcHVibGljIGludCBKSlRJTlRFUkZBQ0VERUZJTklUSU9OID0gMTMxOwotICBwdWJsaWMgaW50IEpKVElOSEVSSVRBTkNFID0gMTMyOwotICBwdWJsaWMgaW50IEpKVE5BTUVTUEFDRURFRklOSVRJT04gPSAxMzM7Ci0gIHB1YmxpYyBpbnQgSkpUUEFDS0FHRURFRklOSVRJT04gPSAxMzQ7Ci0gIHB1YmxpYyBpbnQgSkpUUEFDS0FHRU5BTUUgPSAxMzU7Ci0gIHB1YmxpYyBpbnQgSkpUUEFDS0FHRUlERU5USUZJRVJTID0gMTM2OwotCi0KLSAgcHVibGljIFN0cmluZ1tdIGpqdE5vZGVOYW1lID0gewotICAgICJQcm9ncmFtIiwKLSAgICAiSWRlbnRpZmllciIsCi0gICAgIlNpbXBsZVF1YWxpZmllZElkZW50aWZpZXIiLAotICAgICJFeHByZXNzaW9uUXVhbGlmaWVkSWRlbnRpZmllciIsCi0gICAgIlF1YWxpZmllZElkZW50aWZpZXIiLAotICAgICJQcmltYXJ5RXhwcmVzc2lvbiIsCi0gICAgIlJlc2VydmVkTmFtZXNwYWNlIiwKLSAgICAiRnVuY3Rpb25FeHByZXNzaW9uIiwKLSAgICAiT2JqZWN0TGl0ZXJhbCIsCi0gICAgIkZpZWxkTGlzdCIsCi0gICAgIkxpdGVyYWxGaWVsZCIsCi0gICAgIkZpZWxkTmFtZSIsCi0gICAgIkFycmF5TGl0ZXJhbCIsCi0gICAgIkVsZW1lbnRMaXN0IiwKLSAgICAiTGl0ZXJhbEVsZW1lbnQiLAotICAgICJTdXBlckV4cHJlc3Npb24iLAotICAgICJQb3N0Zml4RXhwcmVzc2lvbiIsCi0gICAgIkF0dHJpYnV0ZUV4cHJlc3Npb24iLAotICAgICJGdWxsUG9zdGZpeEV4cHJlc3Npb24iLAotICAgICJGdWxsTmV3RXhwcmVzc2lvbiIsCi0gICAgIkZ1bmN0aW9uQ29uc3RydWN0b3IiLAotICAgICJGdWxsTmV3U3ViZXhwcmVzc2lvbiIsCi0gICAgIlBvc3RmaXhPcCIsCi0gICAgIlByb3BlcnR5T3JBcmd1bWVudHMiLAotICAgICJQcm9wZXJ0eU9wZXJhdG9yIiwKLSAgICAiQXJndW1lbnRzIiwKLSAgICAiVW5hcnlFeHByZXNzaW9uIiwKLSAgICAiTXVsT3AiLAotICAgICJNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24iLAotICAgICJBZGRPcCIsCi0gICAgIkFkZGl0aXZlRXhwcmVzc2lvbiIsCi0gICAgIlNoaWZ0T3AiLAotICAgICJTaGlmdEV4cHJlc3Npb24iLAotICAgICJSZWxPcCIsCi0gICAgIlJlbGF0aW9uYWxFeHByZXNzaW9uIiwKLSAgICAiUmVsYXRpb25hbEV4cHJlc3Npb25Ob0lOIiwKLSAgICAiRXF1YWxPcCIsCi0gICAgIkVxdWFsaXR5RXhwcmVzc2lvbiIsCi0gICAgIkVxdWFsaXR5RXhwcmVzc2lvbk5vSU4iLAotICAgICJCaXR3aXNlQU5ET3AiLAotICAgICJCaXR3aXNlQU5ERXhwcmVzc2lvbiIsCi0gICAgIkJpdHdpc2VBTkRFeHByZXNzaW9uTm9JTiIsCi0gICAgIkJpdHdpc2VYT1JPcCIsCi0gICAgIkJpdHdpc2VYT1JFeHByZXNzaW9uIiwKLSAgICAiQml0d2lzZVhPUkV4cHJlc3Npb25Ob0lOIiwKLSAgICAiQml0d2lzZU9ST3AiLAotICAgICJCaXR3aXNlT1JFeHByZXNzaW9uIiwKLSAgICAiQml0d2lzZU9SRXhwcmVzc2lvbk5vSU4iLAotICAgICJMb2dpY2FsQU5ERXhwcmVzc2lvbiIsCi0gICAgIkxvZ2ljYWxBTkRFeHByZXNzaW9uTm9JTiIsCi0gICAgIkxvZ2ljYWxPUkV4cHJlc3Npb24iLAotICAgICJMb2dpY2FsT1JFeHByZXNzaW9uTm9JTiIsCi0gICAgIkNvbmRpdGlvbmFsRXhwcmVzc2lvbiIsCi0gICAgIkNvbmRpdGlvbmFsRXhwcmVzc2lvbk5vSU4iLAotICAgICJOb25Bc3NpZ25tZW50RXhwcmVzc2lvbiIsCi0gICAgIk5vbkFzc2lnbm1lbnRFeHByZXNzaW9uTm9JTiIsCi0gICAgIkFzc2lnbmVtZW50T3BlcmF0b3IiLAotICAgICJBc3NpZ25tZW50RXhwcmVzc2lvbiIsCi0gICAgIkFzc2lnbm1lbnRFeHByZXNzaW9uTm9JTiIsCi0gICAgIkxpc3RFeHByZXNzaW9uIiwKLSAgICAiTGlzdEV4cHJlc3Npb25Ob0lOIiwKLSAgICAiVHlwZUV4cHJlc3Npb24iLAotICAgICJUeXBlRXhwcmVzc2lvbk5vSU4iLAotICAgICJUeXBlRXhwcmVzc2lvbkxpc3QiLAotICAgICJTdGF0ZW1lbnQiLAotICAgICJTdWJzdGF0ZW1lbnQiLAotICAgICJTdWJzdGF0ZW1lbnRzIiwKLSAgICAiU2MiLAotICAgICJFb2xDb21tZW50U2tpcFdzIiwKLSAgICAiRW1wdHlTdGF0ZW1lbnQiLAotICAgICJFeHByZXNzaW9uU3RhdGVtZW50IiwKLSAgICAiU3VwZXJTdGF0ZW1lbnQiLAotICAgICJCbG9jayIsCi0gICAgIkxhYmVsZWRTdGF0ZW1lbnQiLAotICAgICJJZlN0YXRlbWVudCIsCi0gICAgIlN3aXRjaFN0YXRlbWVudCIsCi0gICAgIkNhc2VFbGVtZW50cyIsCi0gICAgIkNhc2VFbGVtZW50IiwKLSAgICAiQ2FzZUxhYmVsIiwKLSAgICAiRG9TdGF0ZW1lbnQiLAotICAgICJXaGlsZVN0YXRlbWVudCIsCi0gICAgIkZvclN0YXRlbWVudCIsCi0gICAgIkZvckluaXRpYWxpemVyIiwKLSAgICAiRm9ySW5CaW5kaW5nIiwKLSAgICAiV2l0aFN0YXRlbWVudCIsCi0gICAgIkNvbnRpbnVlU3RhdGVtZW50IiwKLSAgICAiQnJlYWtTdGF0ZW1lbnQiLAotICAgICJSZXR1cm5TdGF0ZW1lbnQiLAotICAgICJUaHJvd1N0YXRlbWVudCIsCi0gICAgIlRyeVN0YXRlbWVudCIsCi0gICAgIkRpcmVjdGl2ZXMiLAotICAgICJEaXJlY3RpdmUiLAotICAgICJBbm5vdGF0YWJsZURpcmVjdGl2ZSIsCi0gICAgIkF0dHJpYnV0ZXMiLAotICAgICJBdHRyaWJ1dGUiLAotICAgICJVc2VEaXJlY3RpdmUiLAotICAgICJJbXBvcnREaXJlY3RpdmUiLAotICAgICJJbmNsdWRlRGlyZWN0aXZlIiwKLSAgICAiUHJhZ21hIiwKLSAgICAiUHJhZ21hSXRlbXMiLAotICAgICJQcmFnbWFJdGVtIiwKLSAgICAiUHJhZ21hRXhwciIsCi0gICAgIlByYWdtYUFyZ3VtZW50IiwKLSAgICAiRXhwb3J0RGVmaW5pdGlvbiIsCi0gICAgIkV4cG9ydEJpbmRpbmdMaXN0IiwKLSAgICAiRXhwb3J0QmluZGluZyIsCi0gICAgIlZhcmlhYmxlRGVmaW5pdGlvbiIsCi0gICAgIlZhcmlhYmxlRGVmaW5pdGlvbk5vSU4iLAotICAgICJWYXJpYWJsZURlZmluaXRpb25LaW5kIiwKLSAgICAiVmFyaWFibGVCaW5kaW5nTGlzdCIsCi0gICAgIlZhcmlhYmxlQmluZGluZ0xpc3ROb0lOIiwKLSAgICAiVmFyaWFibGVCaW5kaW5nIiwKLSAgICAiVmFyaWFibGVCaW5kaW5nTm9JTiIsCi0gICAgIlZhcmlhYmxlSW5pdGlhbGlzYXRpb24iLAotICAgICJWYXJpYWJsZUluaXRpYWxpc2F0aW9uTm9JTiIsCi0gICAgIlZhcmlhYmxlSW5pdGlhbGl6ZXIiLAotICAgICJWYXJpYWJsZUluaXRpYWxpemVyTm9JTiIsCi0gICAgIlR5cGVkSWRlbnRpZmllciIsCi0gICAgIlR5cGVkSWRlbnRpZmllck5vSU4iLAotICAgICJTaW1wbGVWYXJpYWJsZURlZmluaXRpb24iLAotICAgICJVbnR5cGVkVmFyaWFibGVCaW5kaW5nTGlzdCIsCi0gICAgIlVudHlwZWRWYXJpYWJsZUJpbmRpbmciLAotICAgICJGdW5jdGlvbkRlZmluaXRpb24iLAotICAgICJGdW5jdGlvbk5hbWUiLAotICAgICJGdW5jdGlvbkNvbW1vbiIsCi0gICAgIlBhcmFtZXRlcnMiLAotICAgICJQYXJhbWV0ZXIiLAotICAgICJQYXJhbWV0ZXJJbml0IiwKLSAgICAiUmVzdFBhcmFtZXRlcnMiLAotICAgICJSZXN1bHQiLAotICAgICJDbGFzc0RlZmluaXRpb24iLAotICAgICJJbnRlcmZhY2VEZWZpbml0aW9uIiwKLSAgICAiSW5oZXJpdGFuY2UiLAotICAgICJOYW1lc3BhY2VEZWZpbml0aW9uIiwKLSAgICAiUGFja2FnZURlZmluaXRpb24iLAotICAgICJQYWNrYWdlTmFtZSIsCi0gICAgIlBhY2thZ2VJZGVudGlmaWVycyIsCi0gIH07Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvSlNQYXJzZXIyMFZpc2l0b3IuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0pTUGFyc2VyMjBWaXNpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwNjJkMDEuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvSlNQYXJzZXIyMFZpc2l0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MyArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIC5cSlNQYXJzZXIyMFZpc2l0b3IuamF2YSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5qYXZhc2NyaXB0MjBwYXJzZXI7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSlNQYXJzZXIyMFZpc2l0b3IKLXsKLSAgcHVibGljIE9iamVjdCB2aXNpdChTaW1wbGVOb2RlIG5vZGUsIE9iamVjdCBkYXRhKTsKLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RQcm9ncmFtIG5vZGUsIE9iamVjdCBkYXRhKTsKLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RJZGVudGlmaWVyIG5vZGUsIE9iamVjdCBkYXRhKTsKLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RTaW1wbGVRdWFsaWZpZWRJZGVudGlmaWVyIG5vZGUsIE9iamVjdCBkYXRhKTsKLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RFeHByZXNzaW9uUXVhbGlmaWVkSWRlbnRpZmllciBub2RlLCBPYmplY3QgZGF0YSk7Ci0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUUXVhbGlmaWVkSWRlbnRpZmllciBub2RlLCBPYmplY3QgZGF0YSk7Ci0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUUHJpbWFyeUV4cHJlc3Npb24gbm9kZSwgT2JqZWN0IGRhdGEpOwotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVFJlc2VydmVkTmFtZXNwYWNlIG5vZGUsIE9iamVjdCBkYXRhKTsKLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RGdW5jdGlvbkV4cHJlc3Npb24gbm9kZSwgT2JqZWN0IGRhdGEpOwotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVE9iamVjdExpdGVyYWwgbm9kZSwgT2JqZWN0IGRhdGEpOwotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVEZpZWxkTGlzdCBub2RlLCBPYmplY3QgZGF0YSk7Ci0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUTGl0ZXJhbEZpZWxkIG5vZGUsIE9iamVjdCBkYXRhKTsKLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RGaWVsZE5hbWUgbm9kZSwgT2JqZWN0IGRhdGEpOwotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVEFycmF5TGl0ZXJhbCBub2RlLCBPYmplY3QgZGF0YSk7Ci0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNURWxlbWVudExpc3Qgbm9kZSwgT2JqZWN0IGRhdGEpOwotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVExpdGVyYWxFbGVtZW50IG5vZGUsIE9iamVjdCBkYXRhKTsKLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RTdXBlckV4cHJlc3Npb24gbm9kZSwgT2JqZWN0IGRhdGEpOwotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVFBvc3RmaXhFeHByZXNzaW9uIG5vZGUsIE9iamVjdCBkYXRhKTsKLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RBdHRyaWJ1dGVFeHByZXNzaW9uIG5vZGUsIE9iamVjdCBkYXRhKTsKLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RGdWxsUG9zdGZpeEV4cHJlc3Npb24gbm9kZSwgT2JqZWN0IGRhdGEpOwotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVEZ1bGxOZXdFeHByZXNzaW9uIG5vZGUsIE9iamVjdCBkYXRhKTsKLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RGdW5jdGlvbkNvbnN0cnVjdG9yIG5vZGUsIE9iamVjdCBkYXRhKTsKLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RGdWxsTmV3U3ViZXhwcmVzc2lvbiBub2RlLCBPYmplY3QgZGF0YSk7Ci0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUUG9zdGZpeE9wIG5vZGUsIE9iamVjdCBkYXRhKTsKLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RQcm9wZXJ0eU9yQXJndW1lbnRzIG5vZGUsIE9iamVjdCBkYXRhKTsKLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RQcm9wZXJ0eU9wZXJhdG9yIG5vZGUsIE9iamVjdCBkYXRhKTsKLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RBcmd1bWVudHMgbm9kZSwgT2JqZWN0IGRhdGEpOwotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVFVuYXJ5RXhwcmVzc2lvbiBub2RlLCBPYmplY3QgZGF0YSk7Ci0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUTXVsT3Agbm9kZSwgT2JqZWN0IGRhdGEpOwotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbiBub2RlLCBPYmplY3QgZGF0YSk7Ci0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUQWRkT3Agbm9kZSwgT2JqZWN0IGRhdGEpOwotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVEFkZGl0aXZlRXhwcmVzc2lvbiBub2RlLCBPYmplY3QgZGF0YSk7Ci0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUU2hpZnRPcCBub2RlLCBPYmplY3QgZGF0YSk7Ci0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUU2hpZnRFeHByZXNzaW9uIG5vZGUsIE9iamVjdCBkYXRhKTsKLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RSZWxPcCBub2RlLCBPYmplY3QgZGF0YSk7Ci0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUUmVsYXRpb25hbEV4cHJlc3Npb24gbm9kZSwgT2JqZWN0IGRhdGEpOwotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVFJlbGF0aW9uYWxFeHByZXNzaW9uTm9JTiBub2RlLCBPYmplY3QgZGF0YSk7Ci0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNURXF1YWxPcCBub2RlLCBPYmplY3QgZGF0YSk7Ci0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNURXF1YWxpdHlFeHByZXNzaW9uIG5vZGUsIE9iamVjdCBkYXRhKTsKLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RFcXVhbGl0eUV4cHJlc3Npb25Ob0lOIG5vZGUsIE9iamVjdCBkYXRhKTsKLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RCaXR3aXNlQU5ET3Agbm9kZSwgT2JqZWN0IGRhdGEpOwotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVEJpdHdpc2VBTkRFeHByZXNzaW9uIG5vZGUsIE9iamVjdCBkYXRhKTsKLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RCaXR3aXNlQU5ERXhwcmVzc2lvbk5vSU4gbm9kZSwgT2JqZWN0IGRhdGEpOwotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVEJpdHdpc2VYT1JPcCBub2RlLCBPYmplY3QgZGF0YSk7Ci0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUQml0d2lzZVhPUkV4cHJlc3Npb24gbm9kZSwgT2JqZWN0IGRhdGEpOwotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVEJpdHdpc2VYT1JFeHByZXNzaW9uTm9JTiBub2RlLCBPYmplY3QgZGF0YSk7Ci0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUQml0d2lzZU9ST3Agbm9kZSwgT2JqZWN0IGRhdGEpOwotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVEJpdHdpc2VPUkV4cHJlc3Npb24gbm9kZSwgT2JqZWN0IGRhdGEpOwotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVEJpdHdpc2VPUkV4cHJlc3Npb25Ob0lOIG5vZGUsIE9iamVjdCBkYXRhKTsKLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RMb2dpY2FsQU5ERXhwcmVzc2lvbiBub2RlLCBPYmplY3QgZGF0YSk7Ci0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUTG9naWNhbEFOREV4cHJlc3Npb25Ob0lOIG5vZGUsIE9iamVjdCBkYXRhKTsKLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RMb2dpY2FsT1JFeHByZXNzaW9uIG5vZGUsIE9iamVjdCBkYXRhKTsKLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RMb2dpY2FsT1JFeHByZXNzaW9uTm9JTiBub2RlLCBPYmplY3QgZGF0YSk7Ci0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUQ29uZGl0aW9uYWxFeHByZXNzaW9uIG5vZGUsIE9iamVjdCBkYXRhKTsKLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RDb25kaXRpb25hbEV4cHJlc3Npb25Ob0lOIG5vZGUsIE9iamVjdCBkYXRhKTsKLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1ROb25Bc3NpZ25tZW50RXhwcmVzc2lvbiBub2RlLCBPYmplY3QgZGF0YSk7Ci0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUTm9uQXNzaWdubWVudEV4cHJlc3Npb25Ob0lOIG5vZGUsIE9iamVjdCBkYXRhKTsKLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RBc3NpZ25lbWVudE9wZXJhdG9yIG5vZGUsIE9iamVjdCBkYXRhKTsKLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RBc3NpZ25tZW50RXhwcmVzc2lvbiBub2RlLCBPYmplY3QgZGF0YSk7Ci0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUQXNzaWdubWVudEV4cHJlc3Npb25Ob0lOIG5vZGUsIE9iamVjdCBkYXRhKTsKLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RMaXN0RXhwcmVzc2lvbiBub2RlLCBPYmplY3QgZGF0YSk7Ci0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUTGlzdEV4cHJlc3Npb25Ob0lOIG5vZGUsIE9iamVjdCBkYXRhKTsKLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RUeXBlRXhwcmVzc2lvbiBub2RlLCBPYmplY3QgZGF0YSk7Ci0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUVHlwZUV4cHJlc3Npb25Ob0lOIG5vZGUsIE9iamVjdCBkYXRhKTsKLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RUeXBlRXhwcmVzc2lvbkxpc3Qgbm9kZSwgT2JqZWN0IGRhdGEpOwotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVFN0YXRlbWVudCBub2RlLCBPYmplY3QgZGF0YSk7Ci0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUU3Vic3RhdGVtZW50IG5vZGUsIE9iamVjdCBkYXRhKTsKLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RTdWJzdGF0ZW1lbnRzIG5vZGUsIE9iamVjdCBkYXRhKTsKLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RTYyBub2RlLCBPYmplY3QgZGF0YSk7Ci0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNURW9sQ29tbWVudFNraXBXcyBub2RlLCBPYmplY3QgZGF0YSk7Ci0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNURW1wdHlTdGF0ZW1lbnQgbm9kZSwgT2JqZWN0IGRhdGEpOwotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVEV4cHJlc3Npb25TdGF0ZW1lbnQgbm9kZSwgT2JqZWN0IGRhdGEpOwotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVFN1cGVyU3RhdGVtZW50IG5vZGUsIE9iamVjdCBkYXRhKTsKLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RCbG9jayBub2RlLCBPYmplY3QgZGF0YSk7Ci0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUTGFiZWxlZFN0YXRlbWVudCBub2RlLCBPYmplY3QgZGF0YSk7Ci0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUSWZTdGF0ZW1lbnQgbm9kZSwgT2JqZWN0IGRhdGEpOwotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVFN3aXRjaFN0YXRlbWVudCBub2RlLCBPYmplY3QgZGF0YSk7Ci0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUQ2FzZUVsZW1lbnRzIG5vZGUsIE9iamVjdCBkYXRhKTsKLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RDYXNlRWxlbWVudCBub2RlLCBPYmplY3QgZGF0YSk7Ci0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUQ2FzZUxhYmVsIG5vZGUsIE9iamVjdCBkYXRhKTsKLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1REb1N0YXRlbWVudCBub2RlLCBPYmplY3QgZGF0YSk7Ci0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUV2hpbGVTdGF0ZW1lbnQgbm9kZSwgT2JqZWN0IGRhdGEpOwotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVEZvclN0YXRlbWVudCBub2RlLCBPYmplY3QgZGF0YSk7Ci0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNURm9ySW5pdGlhbGl6ZXIgbm9kZSwgT2JqZWN0IGRhdGEpOwotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVEZvckluQmluZGluZyBub2RlLCBPYmplY3QgZGF0YSk7Ci0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUV2l0aFN0YXRlbWVudCBub2RlLCBPYmplY3QgZGF0YSk7Ci0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUQ29udGludWVTdGF0ZW1lbnQgbm9kZSwgT2JqZWN0IGRhdGEpOwotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVEJyZWFrU3RhdGVtZW50IG5vZGUsIE9iamVjdCBkYXRhKTsKLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RSZXR1cm5TdGF0ZW1lbnQgbm9kZSwgT2JqZWN0IGRhdGEpOwotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVFRocm93U3RhdGVtZW50IG5vZGUsIE9iamVjdCBkYXRhKTsKLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RUcnlTdGF0ZW1lbnQgbm9kZSwgT2JqZWN0IGRhdGEpOwotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVERpcmVjdGl2ZXMgbm9kZSwgT2JqZWN0IGRhdGEpOwotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVERpcmVjdGl2ZSBub2RlLCBPYmplY3QgZGF0YSk7Ci0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUQW5ub3RhdGFibGVEaXJlY3RpdmUgbm9kZSwgT2JqZWN0IGRhdGEpOwotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVEF0dHJpYnV0ZXMgbm9kZSwgT2JqZWN0IGRhdGEpOwotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVEF0dHJpYnV0ZSBub2RlLCBPYmplY3QgZGF0YSk7Ci0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUVXNlRGlyZWN0aXZlIG5vZGUsIE9iamVjdCBkYXRhKTsKLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RJbXBvcnREaXJlY3RpdmUgbm9kZSwgT2JqZWN0IGRhdGEpOwotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVEluY2x1ZGVEaXJlY3RpdmUgbm9kZSwgT2JqZWN0IGRhdGEpOwotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVFByYWdtYSBub2RlLCBPYmplY3QgZGF0YSk7Ci0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUUHJhZ21hSXRlbXMgbm9kZSwgT2JqZWN0IGRhdGEpOwotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVFByYWdtYUl0ZW0gbm9kZSwgT2JqZWN0IGRhdGEpOwotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVFByYWdtYUV4cHIgbm9kZSwgT2JqZWN0IGRhdGEpOwotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVFByYWdtYUFyZ3VtZW50IG5vZGUsIE9iamVjdCBkYXRhKTsKLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RFeHBvcnREZWZpbml0aW9uIG5vZGUsIE9iamVjdCBkYXRhKTsKLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RFeHBvcnRCaW5kaW5nTGlzdCBub2RlLCBPYmplY3QgZGF0YSk7Ci0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNURXhwb3J0QmluZGluZyBub2RlLCBPYmplY3QgZGF0YSk7Ci0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUVmFyaWFibGVEZWZpbml0aW9uIG5vZGUsIE9iamVjdCBkYXRhKTsKLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RWYXJpYWJsZURlZmluaXRpb25Ob0lOIG5vZGUsIE9iamVjdCBkYXRhKTsKLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RWYXJpYWJsZURlZmluaXRpb25LaW5kIG5vZGUsIE9iamVjdCBkYXRhKTsKLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RWYXJpYWJsZUJpbmRpbmdMaXN0IG5vZGUsIE9iamVjdCBkYXRhKTsKLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RWYXJpYWJsZUJpbmRpbmdMaXN0Tm9JTiBub2RlLCBPYmplY3QgZGF0YSk7Ci0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUVmFyaWFibGVCaW5kaW5nIG5vZGUsIE9iamVjdCBkYXRhKTsKLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RWYXJpYWJsZUJpbmRpbmdOb0lOIG5vZGUsIE9iamVjdCBkYXRhKTsKLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RWYXJpYWJsZUluaXRpYWxpc2F0aW9uIG5vZGUsIE9iamVjdCBkYXRhKTsKLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RWYXJpYWJsZUluaXRpYWxpc2F0aW9uTm9JTiBub2RlLCBPYmplY3QgZGF0YSk7Ci0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUVmFyaWFibGVJbml0aWFsaXplciBub2RlLCBPYmplY3QgZGF0YSk7Ci0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUVmFyaWFibGVJbml0aWFsaXplck5vSU4gbm9kZSwgT2JqZWN0IGRhdGEpOwotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVFR5cGVkSWRlbnRpZmllciBub2RlLCBPYmplY3QgZGF0YSk7Ci0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUVHlwZWRJZGVudGlmaWVyTm9JTiBub2RlLCBPYmplY3QgZGF0YSk7Ci0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUU2ltcGxlVmFyaWFibGVEZWZpbml0aW9uIG5vZGUsIE9iamVjdCBkYXRhKTsKLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RVbnR5cGVkVmFyaWFibGVCaW5kaW5nTGlzdCBub2RlLCBPYmplY3QgZGF0YSk7Ci0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUVW50eXBlZFZhcmlhYmxlQmluZGluZyBub2RlLCBPYmplY3QgZGF0YSk7Ci0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNURnVuY3Rpb25EZWZpbml0aW9uIG5vZGUsIE9iamVjdCBkYXRhKTsKLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RGdW5jdGlvbk5hbWUgbm9kZSwgT2JqZWN0IGRhdGEpOwotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVEZ1bmN0aW9uQ29tbW9uIG5vZGUsIE9iamVjdCBkYXRhKTsKLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RQYXJhbWV0ZXJzIG5vZGUsIE9iamVjdCBkYXRhKTsKLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RQYXJhbWV0ZXIgbm9kZSwgT2JqZWN0IGRhdGEpOwotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVFBhcmFtZXRlckluaXQgbm9kZSwgT2JqZWN0IGRhdGEpOwotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVFJlc3RQYXJhbWV0ZXJzIG5vZGUsIE9iamVjdCBkYXRhKTsKLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RSZXN1bHQgbm9kZSwgT2JqZWN0IGRhdGEpOwotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVENsYXNzRGVmaW5pdGlvbiBub2RlLCBPYmplY3QgZGF0YSk7Ci0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUSW50ZXJmYWNlRGVmaW5pdGlvbiBub2RlLCBPYmplY3QgZGF0YSk7Ci0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUSW5oZXJpdGFuY2Ugbm9kZSwgT2JqZWN0IGRhdGEpOwotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVE5hbWVzcGFjZURlZmluaXRpb24gbm9kZSwgT2JqZWN0IGRhdGEpOwotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVFBhY2thZ2VEZWZpbml0aW9uIG5vZGUsIE9iamVjdCBkYXRhKTsKLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RQYWNrYWdlTmFtZSBub2RlLCBPYmplY3QgZGF0YSk7Ci0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUUGFja2FnZUlkZW50aWZpZXJzIG5vZGUsIE9iamVjdCBkYXRhKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9Ob2RlLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9Ob2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzM2VhMmIuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvTm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZTogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBOb2RlLmphdmEgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuamF2YXNjcmlwdDIwcGFyc2VyOwotCi0vKiBBbGwgQVNUIG5vZGVzIG11c3QgaW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlLiAgSXQgcHJvdmlkZXMgYmFzaWMKLSAgIG1hY2hpbmVyeSBmb3IgY29uc3RydWN0aW5nIHRoZSBwYXJlbnQgYW5kIGNoaWxkIHJlbGF0aW9uc2hpcHMKLSAgIGJldHdlZW4gbm9kZXMuICovCi0KLXB1YmxpYyBpbnRlcmZhY2UgTm9kZQotewotCi0gIC8qKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYWZ0ZXIgdGhlIG5vZGUgaGFzIGJlZW4gbWFkZSB0aGUgY3VycmVudAotICAgIG5vZGUuICBJdCBpbmRpY2F0ZXMgdGhhdCBjaGlsZCBub2RlcyBjYW4gbm93IGJlIGFkZGVkIHRvIGl0LiAqLwotICBwdWJsaWMgdm9pZCBqanRPcGVuKCk7Ci0KLSAgLyoqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBhZnRlciBhbGwgdGhlIGNoaWxkIG5vZGVzIGhhdmUgYmVlbgotICAgIGFkZGVkLiAqLwotICBwdWJsaWMgdm9pZCBqanRDbG9zZSgpOwotCi0gIC8qKiBUaGlzIHBhaXIgb2YgbWV0aG9kcyBhcmUgdXNlZCB0byBpbmZvcm0gdGhlIG5vZGUgb2YgaXRzCi0gICAgcGFyZW50LiAqLwotICBwdWJsaWMgdm9pZCBqanRTZXRQYXJlbnQoTm9kZSBuKTsKLQotICBwdWJsaWMgTm9kZSBqanRHZXRQYXJlbnQoKTsKLQotICAvKiogVGhpcyBtZXRob2QgdGVsbHMgdGhlIG5vZGUgdG8gYWRkIGl0cyBhcmd1bWVudCB0byB0aGUgbm9kZSdzCi0gICAgbGlzdCBvZiBjaGlsZHJlbi4gICovCi0gIHB1YmxpYyB2b2lkIGpqdEFkZENoaWxkKE5vZGUgbiwgaW50IGkpOwotCi0gIC8qKiBUaGlzIG1ldGhvZCByZXR1cm5zIGEgY2hpbGQgbm9kZS4gIFRoZSBjaGlsZHJlbiBhcmUgbnVtYmVyZWQKLSAgICAgZnJvbSB6ZXJvLCBsZWZ0IHRvIHJpZ2h0LiAqLwotICBwdWJsaWMgTm9kZSBqanRHZXRDaGlsZChpbnQgaSk7Ci0KLSAgLyoqIFJldHVybiB0aGUgbnVtYmVyIG9mIGNoaWxkcmVuIHRoZSBub2RlIGhhcy4gKi8KLSAgcHVibGljIGludCBqanRHZXROdW1DaGlsZHJlbigpOwotCi0gIC8qKiBBY2NlcHQgdGhlIHZpc2l0b3IuICoqLwotICBwdWJsaWMgT2JqZWN0IGpqdEFjY2VwdChKU1BhcnNlcjIwVmlzaXRvciB2aXNpdG9yLCBPYmplY3QgZGF0YSk7Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9QYXJzZUV4Y2VwdGlvbi5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvUGFyc2VFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2JlOGQ1Yi4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9QYXJzZUV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkyICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qIEdlbmVyYXRlZCBCeTpKYXZhQ0M6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gUGFyc2VFeGNlcHRpb24uamF2YSBWZXJzaW9uIDMuMCAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuamF2YXNjcmlwdDIwcGFyc2VyOwotCi0vKioKLSAqIFRoaXMgZXhjZXB0aW9uIGlzIHRocm93biB3aGVuIHBhcnNlIGVycm9ycyBhcmUgZW5jb3VudGVyZWQuCi0gKiBZb3UgY2FuIGV4cGxpY2l0bHkgY3JlYXRlIG9iamVjdHMgb2YgdGhpcyBleGNlcHRpb24gdHlwZSBieQotICogY2FsbGluZyB0aGUgbWV0aG9kIGdlbmVyYXRlUGFyc2VFeGNlcHRpb24gaW4gdGhlIGdlbmVyYXRlZAotICogcGFyc2VyLgotICoKLSAqIFlvdSBjYW4gbW9kaWZ5IHRoaXMgY2xhc3MgdG8gY3VzdG9taXplIHlvdXIgZXJyb3IgcmVwb3J0aW5nCi0gKiBtZWNoYW5pc21zIHNvIGxvbmcgYXMgeW91IHJldGFpbiB0aGUgcHVibGljIGZpZWxkcy4KLSAqLwotcHVibGljIGNsYXNzIFBhcnNlRXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uCi17Ci0KLSAgLyoqCi0gICAqIFRoaXMgdmFyaWFibGUgZGV0ZXJtaW5lcyB3aGljaCBjb25zdHJ1Y3RvciB3YXMgdXNlZCB0byBjcmVhdGUKLSAgICogdGhpcyBvYmplY3QgYW5kIHRoZXJlYnkgYWZmZWN0cyB0aGUgc2VtYW50aWNzIG9mIHRoZQotICAgKiAiZ2V0TWVzc2FnZSIgbWV0aG9kIChzZWUgYmVsb3cpLgotICAgKi8KLSAgcHJvdGVjdGVkIGJvb2xlYW4gc3BlY2lhbENvbnN0cnVjdG9yOwotCi0gIC8qKgotICAgKiBUaGlzIGlzIHRoZSBsYXN0IHRva2VuIHRoYXQgaGFzIGJlZW4gY29uc3VtZWQgc3VjY2Vzc2Z1bGx5LiAgSWYKLSAgICogdGhpcyBvYmplY3QgaGFzIGJlZW4gY3JlYXRlZCBkdWUgdG8gYSBwYXJzZSBlcnJvciwgdGhlIHRva2VuCi0gICAqIGZvbGxvd25nIHRoaXMgdG9rZW4gd2lsbCAodGhlcmVmb3JlKSBiZSB0aGUgZmlyc3QgZXJyb3IgdG9rZW4uCi0gICAqLwotICBwdWJsaWMgVG9rZW4gY3VycmVudFRva2VuOwotCi0gIC8qKgotICAgKiBFYWNoIGVudHJ5IGluIHRoaXMgYXJyYXkgaXMgYW4gYXJyYXkgb2YgaW50ZWdlcnMuICBFYWNoIGFycmF5Ci0gICAqIG9mIGludGVnZXJzIHJlcHJlc2VudHMgYSBzZXF1ZW5jZSBvZiB0b2tlbnMgKGJ5IHRoZWlyIG9yZGluYWwKLSAgICogdmFsdWVzKSB0aGF0IGlzIGV4cGVjdGVkIGF0IHRoaXMgcG9pbnQgb2YgdGhlIHBhcnNlLgotICAgKi8KLSAgcHVibGljIGludFtdW10gZXhwZWN0ZWRUb2tlblNlcXVlbmNlczsKLQotICAvKioKLSAgICogVGhpcyBpcyBhIHJlZmVyZW5jZSB0byB0aGUgInRva2VuSW1hZ2UiIGFycmF5IG9mIHRoZSBnZW5lcmF0ZWQKLSAgICogcGFyc2VyIHdpdGhpbiB3aGljaCB0aGUgcGFyc2UgZXJyb3Igb2NjdXJyZWQuICBUaGlzIGFycmF5IGlzCi0gICAqIGRlZmluZWQgaW4gdGhlIGdlbmVyYXRlZCAuLi5Db25zdGFudHMgaW50ZXJmYWNlLgotICAgKi8KLSAgcHVibGljIFN0cmluZ1tdIHRva2VuSW1hZ2U7Ci0KLSAgLyoqCi0gICAqIFRoZSBlbmQgb2YgbGluZSBzdHJpbmcgZm9yIHRoaXMgbWFjaGluZS4KLSAgICovCi0gIHByb3RlY3RlZCBTdHJpbmcgZW9sID0gU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIsICJcbiIpOwotCi0gIC8qKgotICAgKiBUaGlzIGNvbnN0cnVjdG9yIGlzIHVzZWQgYnkgdGhlIG1ldGhvZCAiZ2VuZXJhdGVQYXJzZUV4Y2VwdGlvbiIKLSAgICogaW4gdGhlIGdlbmVyYXRlZCBwYXJzZXIuICBDYWxsaW5nIHRoaXMgY29uc3RydWN0b3IgZ2VuZXJhdGVzCi0gICAqIGEgbmV3IG9iamVjdCBvZiB0aGlzIHR5cGUgd2l0aCB0aGUgZmllbGRzICJjdXJyZW50VG9rZW4iLAotICAgKiAiZXhwZWN0ZWRUb2tlblNlcXVlbmNlcyIsIGFuZCAidG9rZW5JbWFnZSIgc2V0LiAgVGhlIGJvb2xlYW4KLSAgICogZmxhZyAic3BlY2lhbENvbnN0cnVjdG9yIiBpcyBhbHNvIHNldCB0byB0cnVlIHRvIGluZGljYXRlIHRoYXQKLSAgICogdGhpcyBjb25zdHJ1Y3RvciB3YXMgdXNlZCB0byBjcmVhdGUgdGhpcyBvYmplY3QuCi0gICAqIFRoaXMgY29uc3RydWN0b3IgY2FsbHMgaXRzIHN1cGVyIGNsYXNzIHdpdGggdGhlIGVtcHR5IHN0cmluZwotICAgKiB0byBmb3JjZSB0aGUgInRvU3RyaW5nIiBtZXRob2Qgb2YgcGFyZW50IGNsYXNzICJUaHJvd2FibGUiIHRvCi0gICAqIHByaW50IHRoZSBlcnJvciBtZXNzYWdlIGluIHRoZSBmb3JtOgotICAgKiAgICAgUGFyc2VFeGNlcHRpb246IDxyZXN1bHQgb2YgZ2V0TWVzc2FnZT4KLSAgICovCi0gIHB1YmxpYyBQYXJzZUV4Y2VwdGlvbihUb2tlbiAgICBjdXJyZW50VG9rZW5WYWwsCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnRbXVtdICBleHBlY3RlZFRva2VuU2VxdWVuY2VzVmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nW10gdG9rZW5JbWFnZVZhbCkKLSAgewotICAgIHN1cGVyKCIiKTsKLSAgICBzcGVjaWFsQ29uc3RydWN0b3IgPSB0cnVlOwotICAgIGN1cnJlbnRUb2tlbiA9IGN1cnJlbnRUb2tlblZhbDsKLSAgICBleHBlY3RlZFRva2VuU2VxdWVuY2VzID0gZXhwZWN0ZWRUb2tlblNlcXVlbmNlc1ZhbDsKLSAgICB0b2tlbkltYWdlID0gdG9rZW5JbWFnZVZhbDsKLSAgfQotCi0gIC8qKgotICAgKiBUaGUgZm9sbG93aW5nIGNvbnN0cnVjdG9ycyBhcmUgZm9yIHVzZSBieSB5b3UgZm9yIHdoYXRldmVyCi0gICAqIHB1cnBvc2UgeW91IGNhbiB0aGluayBvZi4gIENvbnN0cnVjdGluZyB0aGUgZXhjZXB0aW9uIGluIHRoaXMKLSAgICogbWFubmVyIG1ha2VzIHRoZSBleGNlcHRpb24gYmVoYXZlIGluIHRoZSBub3JtYWwgd2F5IC0gaS5lLiwgYXMKLSAgICogZG9jdW1lbnRlZCBpbiB0aGUgY2xhc3MgIlRocm93YWJsZSIuICBUaGUgZmllbGRzICJlcnJvclRva2VuIiwKLSAgICogImV4cGVjdGVkVG9rZW5TZXF1ZW5jZXMiLCBhbmQgInRva2VuSW1hZ2UiIGRvIG5vdCBjb250YWluCi0gICAqIHJlbGV2YW50IGluZm9ybWF0aW9uLiAgVGhlIEphdmFDQyBnZW5lcmF0ZWQgY29kZSBkb2VzIG5vdCB1c2UKLSAgICogdGhlc2UgY29uc3RydWN0b3JzLgotICAgKi8KLQotICBwdWJsaWMgUGFyc2VFeGNlcHRpb24oKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgICBzcGVjaWFsQ29uc3RydWN0b3IgPSBmYWxzZTsKLSAgfQotCi0gIHB1YmxpYyBQYXJzZUV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSkKLSAgewotICAgIHN1cGVyKG1lc3NhZ2UpOwotICAgIHNwZWNpYWxDb25zdHJ1Y3RvciA9IGZhbHNlOwotICB9Ci0KLSAgLyoqCi0gICAqIFRoaXMgbWV0aG9kIGhhcyB0aGUgc3RhbmRhcmQgYmVoYXZpb3Igd2hlbiB0aGlzIG9iamVjdCBoYXMgYmVlbgotICAgKiBjcmVhdGVkIHVzaW5nIHRoZSBzdGFuZGFyZCBjb25zdHJ1Y3RvcnMuICBPdGhlcndpc2UsIGl0IHVzZXMKLSAgICogImN1cnJlbnRUb2tlbiIgYW5kICJleHBlY3RlZFRva2VuU2VxdWVuY2VzIiB0byBnZW5lcmF0ZSBhIHBhcnNlCi0gICAqIGVycm9yIG1lc3NhZ2UgYW5kIHJldHVybnMgaXQuICBJZiB0aGlzIG9iamVjdCBoYXMgYmVlbiBjcmVhdGVkCi0gICAqIGR1ZSB0byBhIHBhcnNlIGVycm9yLCBhbmQgeW91IGRvIG5vdCBjYXRjaCBpdCAoaXQgZ2V0cyB0aHJvd24KLSAgICogZnJvbSB0aGUgcGFyc2VyKSwgdGhlbiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgZHVyaW5nIHRoZSBwcmludGluZwotICAgKiBvZiB0aGUgZmluYWwgc3RhY2sgdHJhY2UsIGFuZCBoZW5jZSB0aGUgY29ycmVjdCBlcnJvciBtZXNzYWdlCi0gICAqIGdldHMgZGlzcGxheWVkLgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRNZXNzYWdlKCkKLSAgewotCi0gICAgaWYgKCFzcGVjaWFsQ29uc3RydWN0b3IpCi0gICAgewotICAgICAgcmV0dXJuIHN1cGVyLmdldE1lc3NhZ2UoKTsKLSAgICB9Ci0KLSAgICBTdHJpbmcgZXhwZWN0ZWQgPSAiIjsKLSAgICBpbnQgICAgbWF4U2l6ZSA9IDA7Ci0KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGV4cGVjdGVkVG9rZW5TZXF1ZW5jZXMubGVuZ3RoOyBpKyspCi0gICAgewotCi0gICAgICBpZiAobWF4U2l6ZSA8IGV4cGVjdGVkVG9rZW5TZXF1ZW5jZXNbaV0ubGVuZ3RoKQotICAgICAgewotICAgICAgICBtYXhTaXplID0gZXhwZWN0ZWRUb2tlblNlcXVlbmNlc1tpXS5sZW5ndGg7Ci0gICAgICB9Ci0KLSAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgZXhwZWN0ZWRUb2tlblNlcXVlbmNlc1tpXS5sZW5ndGg7IGorKykKLSAgICAgIHsKLSAgICAgICAgZXhwZWN0ZWQgKz0gdG9rZW5JbWFnZVtleHBlY3RlZFRva2VuU2VxdWVuY2VzW2ldW2pdXSArICIgIjsKLSAgICAgIH0KLQotICAgICAgaWYgKGV4cGVjdGVkVG9rZW5TZXF1ZW5jZXNbaV1bZXhwZWN0ZWRUb2tlblNlcXVlbmNlc1tpXS5sZW5ndGggLSAxXSAhPSAwKQotICAgICAgewotICAgICAgICBleHBlY3RlZCArPSAiLi4uIjsKLSAgICAgIH0KLQotICAgICAgZXhwZWN0ZWQgKz0gZW9sICsgIiAgICAiOwotICAgIH0KLQotICAgIFN0cmluZyByZXR2YWwgPSAiRW5jb3VudGVyZWQgXCIiOwotICAgIFRva2VuICB0b2sgPSBjdXJyZW50VG9rZW4ubmV4dDsKLQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWF4U2l6ZTsgaSsrKQotICAgIHsKLQotICAgICAgaWYgKGkgIT0gMCkKLSAgICAgIHsKLSAgICAgICAgcmV0dmFsICs9ICIgIjsKLSAgICAgIH0KLQotICAgICAgaWYgKHRvay5raW5kID09IDApCi0gICAgICB7Ci0gICAgICAgIHJldHZhbCArPSB0b2tlbkltYWdlWzBdOwotCi0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICByZXR2YWwgKz0gYWRkX2VzY2FwZXModG9rLmltYWdlKTsKLSAgICAgIHRvayA9IHRvay5uZXh0OwotICAgIH0KLQotICAgIHJldHZhbCArPSAiXCIgYXQgbGluZSAiICsgY3VycmVudFRva2VuLm5leHQuYmVnaW5MaW5lICsgIiwgY29sdW1uICIgKwotICAgICAgY3VycmVudFRva2VuLm5leHQuYmVnaW5Db2x1bW47Ci0gICAgcmV0dmFsICs9ICIuIiArIGVvbDsKLQotICAgIGlmIChleHBlY3RlZFRva2VuU2VxdWVuY2VzLmxlbmd0aCA9PSAxKQotICAgIHsKLSAgICAgIHJldHZhbCArPSAiV2FzIGV4cGVjdGluZzoiICsgZW9sICsgIiAgICAiOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgcmV0dmFsICs9ICJXYXMgZXhwZWN0aW5nIG9uZSBvZjoiICsgZW9sICsgIiAgICAiOwotICAgIH0KLQotICAgIHJldHZhbCArPSBleHBlY3RlZDsKLQotICAgIHJldHVybiByZXR2YWw7Ci0gIH0KLQotICAvKioKLSAgICogVXNlZCB0byBjb252ZXJ0IHJhdyBjaGFyYWN0ZXJzIHRvIHRoZWlyIGVzY2FwZWQgdmVyc2lvbgotICAgKiB3aGVuIHRoZXNlIHJhdyB2ZXJzaW9uIGNhbm5vdCBiZSB1c2VkIGFzIHBhcnQgb2YgYW4gQVNDSUkKLSAgICogc3RyaW5nIGxpdGVyYWwuCi0gICAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIGFkZF9lc2NhcGVzKFN0cmluZyBzdHIpCi0gIHsKLSAgICBTdHJpbmdCdWZmZXIgcmV0dmFsID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgIGNoYXIgICAgICAgICBjaDsKLQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3RyLmxlbmd0aCgpOyBpKyspCi0gICAgewotCi0gICAgICBzd2l0Y2ggKHN0ci5jaGFyQXQoaSkpCi0gICAgICB7Ci0KLSAgICAgIGNhc2UgMDoKLSAgICAgIHsKLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0KLSAgICAgIGNhc2UgJ1xiJzoKLSAgICAgIHsKLSAgICAgICAgcmV0dmFsLmFwcGVuZCgiXFxiIik7Ci0KLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0KLSAgICAgIGNhc2UgJ1x0JzoKLSAgICAgIHsKLSAgICAgICAgcmV0dmFsLmFwcGVuZCgiXFx0Iik7Ci0KLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0KLSAgICAgIGNhc2UgJ1xuJzoKLSAgICAgIHsKLSAgICAgICAgcmV0dmFsLmFwcGVuZCgiXFxuIik7Ci0KLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0KLSAgICAgIGNhc2UgJ1xmJzoKLSAgICAgIHsKLSAgICAgICAgcmV0dmFsLmFwcGVuZCgiXFxmIik7Ci0KLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0KLSAgICAgIGNhc2UgJ1xyJzoKLSAgICAgIHsKLSAgICAgICAgcmV0dmFsLmFwcGVuZCgiXFxyIik7Ci0KLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0KLSAgICAgIGNhc2UgJ1wiJzoKLSAgICAgIHsKLSAgICAgICAgcmV0dmFsLmFwcGVuZCgiXFxcIiIpOwotCi0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotCi0gICAgICBjYXNlICdcJyc6Ci0gICAgICB7Ci0gICAgICAgIHJldHZhbC5hcHBlbmQoIlxcXCciKTsKLQotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLQotICAgICAgY2FzZSAnXFwnOgotICAgICAgewotICAgICAgICByZXR2YWwuYXBwZW5kKCJcXFxcIik7Ci0KLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0KLSAgICAgIGRlZmF1bHQ6Ci0gICAgICB7Ci0KLSAgICAgICAgaWYgKCgoY2ggPSBzdHIuY2hhckF0KGkpKSA8IDB4MjApIHx8IChjaCA+IDB4N2UpKQotICAgICAgICB7Ci0gICAgICAgICAgU3RyaW5nIHMgPSAiMDAwMCIgKyBJbnRlZ2VyLnRvU3RyaW5nKGNoLCAxNik7Ci0gICAgICAgICAgcmV0dmFsLmFwcGVuZCgiXFx1IiArIHMuc3Vic3RyaW5nKHMubGVuZ3RoKCkgLSA0LCBzLmxlbmd0aCgpKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgcmV0dmFsLmFwcGVuZChjaCk7Ci0gICAgICAgIH0KLQotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gcmV0dmFsLnRvU3RyaW5nKCk7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvU2ltcGxlQ2hhclN0cmVhbS5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvU2ltcGxlQ2hhclN0cmVhbS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYmI3ZTAxLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL1NpbXBsZUNoYXJTdHJlYW0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1OSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKiBHZW5lcmF0ZWQgQnk6SmF2YUNDOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIFNpbXBsZUNoYXJTdHJlYW0uamF2YSBWZXJzaW9uIDQuMCAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuamF2YXNjcmlwdDIwcGFyc2VyOwotCi0vKioKLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIGludGVyZmFjZSBDaGFyU3RyZWFtLCB3aGVyZSB0aGUgc3RyZWFtIGlzIGFzc3VtZWQgdG8KLSAqIGNvbnRhaW4gb25seSBBU0NJSSBjaGFyYWN0ZXJzICh3aXRob3V0IHVuaWNvZGUgcHJvY2Vzc2luZykuCi0gKi8KLQotcHVibGljIGNsYXNzIFNpbXBsZUNoYXJTdHJlYW0KLXsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIHN0YXRpY0ZsYWcgPSBmYWxzZTsKLSAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZnNpemU7Ci0gIGludCAgICAgICAgICAgICAgICAgICAgICAgICBhdmFpbGFibGU7Ci0gIGludCAgICAgICAgICAgICAgICAgICAgICAgICB0b2tlbkJlZ2luOwotICBwdWJsaWMgaW50ICAgICAgICAgICAgICAgICAgYnVmcG9zID0gLTE7Ci0gIHByb3RlY3RlZCBpbnRbXSAgICAgICAgICAgICBidWZsaW5lOwotICBwcm90ZWN0ZWQgaW50W10gICAgICAgICAgICAgYnVmY29sdW1uOwotCi0gIHByb3RlY3RlZCBpbnQgY29sdW1uID0gMDsKLSAgcHJvdGVjdGVkIGludCBsaW5lID0gMTsKLQotICBwcm90ZWN0ZWQgYm9vbGVhbiBwcmV2Q2hhcklzQ1IgPSBmYWxzZTsKLSAgcHJvdGVjdGVkIGJvb2xlYW4gcHJldkNoYXJJc0xGID0gZmFsc2U7Ci0KLSAgcHJvdGVjdGVkIGphdmEuaW8uUmVhZGVyIGlucHV0U3RyZWFtOwotCi0gIHByb3RlY3RlZCBjaGFyW10gYnVmZmVyOwotICBwcm90ZWN0ZWQgaW50ICAgIG1heE5leHRDaGFySW5kID0gMDsKLSAgcHJvdGVjdGVkIGludCAgICBpbkJ1ZiA9IDA7Ci0gIHByb3RlY3RlZCBpbnQgICAgdGFiU2l6ZSA9IDg7Ci0KLSAgcHVibGljIFNpbXBsZUNoYXJTdHJlYW0oamF2YS5pby5SZWFkZXIgZHN0cmVhbSwgaW50IHN0YXJ0bGluZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0Y29sdW1uLCBpbnQgYnVmZmVyc2l6ZSkKLSAgewotICAgIGlucHV0U3RyZWFtID0gZHN0cmVhbTsKLSAgICBsaW5lID0gc3RhcnRsaW5lOwotICAgIGNvbHVtbiA9IHN0YXJ0Y29sdW1uIC0gMTsKLQotICAgIGF2YWlsYWJsZSA9IGJ1ZnNpemUgPSBidWZmZXJzaXplOwotICAgIGJ1ZmZlciA9IG5ldyBjaGFyW2J1ZmZlcnNpemVdOwotICAgIGJ1ZmxpbmUgPSBuZXcgaW50W2J1ZmZlcnNpemVdOwotICAgIGJ1ZmNvbHVtbiA9IG5ldyBpbnRbYnVmZmVyc2l6ZV07Ci0gIH0KLQotICBwdWJsaWMgU2ltcGxlQ2hhclN0cmVhbShqYXZhLmlvLlJlYWRlciBkc3RyZWFtLCBpbnQgc3RhcnRsaW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnRjb2x1bW4pCi0gIHsKLSAgICB0aGlzKGRzdHJlYW0sIHN0YXJ0bGluZSwgc3RhcnRjb2x1bW4sIDQwOTYpOwotICB9Ci0KLSAgcHVibGljIFNpbXBsZUNoYXJTdHJlYW0oamF2YS5pby5SZWFkZXIgZHN0cmVhbSkKLSAgewotICAgIHRoaXMoZHN0cmVhbSwgMSwgMSwgNDA5Nik7Ci0gIH0KLQotICBwdWJsaWMgU2ltcGxlQ2hhclN0cmVhbShqYXZhLmlvLklucHV0U3RyZWFtIGRzdHJlYW0sIFN0cmluZyBlbmNvZGluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0bGluZSwgaW50IHN0YXJ0Y29sdW1uLCBpbnQgYnVmZmVyc2l6ZSkKLSAgICAgICAgICAgICAgICAgICB0aHJvd3MgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uCi0gIHsKLSAgICB0aGlzKChlbmNvZGluZyA9PSBudWxsKSA/IG5ldyBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyKGRzdHJlYW0pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBuZXcgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcihkc3RyZWFtLCBlbmNvZGluZyksCi0gICAgICAgICBzdGFydGxpbmUsIHN0YXJ0Y29sdW1uLCBidWZmZXJzaXplKTsKLSAgfQotCi0gIHB1YmxpYyBTaW1wbGVDaGFyU3RyZWFtKGphdmEuaW8uSW5wdXRTdHJlYW0gZHN0cmVhbSwgaW50IHN0YXJ0bGluZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0Y29sdW1uLCBpbnQgYnVmZmVyc2l6ZSkKLSAgewotICAgIHRoaXMobmV3IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXIoZHN0cmVhbSksIHN0YXJ0bGluZSwgc3RhcnRjb2x1bW4sCi0gICAgICAgICBidWZmZXJzaXplKTsKLSAgfQotCi0gIHB1YmxpYyBTaW1wbGVDaGFyU3RyZWFtKGphdmEuaW8uSW5wdXRTdHJlYW0gZHN0cmVhbSwgU3RyaW5nIGVuY29kaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnRsaW5lLCBpbnQgc3RhcnRjb2x1bW4pCi0gICAgICAgICAgICAgICAgICAgdGhyb3dzIGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbgotICB7Ci0gICAgdGhpcyhkc3RyZWFtLCBlbmNvZGluZywgc3RhcnRsaW5lLCBzdGFydGNvbHVtbiwgNDA5Nik7Ci0gIH0KLQotICBwdWJsaWMgU2ltcGxlQ2hhclN0cmVhbShqYXZhLmlvLklucHV0U3RyZWFtIGRzdHJlYW0sIGludCBzdGFydGxpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydGNvbHVtbikKLSAgewotICAgIHRoaXMoZHN0cmVhbSwgc3RhcnRsaW5lLCBzdGFydGNvbHVtbiwgNDA5Nik7Ci0gIH0KLQotICBwdWJsaWMgU2ltcGxlQ2hhclN0cmVhbShqYXZhLmlvLklucHV0U3RyZWFtIGRzdHJlYW0sIFN0cmluZyBlbmNvZGluZykKLSAgICAgICAgICAgICAgICAgICB0aHJvd3MgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uCi0gIHsKLSAgICB0aGlzKGRzdHJlYW0sIGVuY29kaW5nLCAxLCAxLCA0MDk2KTsKLSAgfQotCi0gIHB1YmxpYyBTaW1wbGVDaGFyU3RyZWFtKGphdmEuaW8uSW5wdXRTdHJlYW0gZHN0cmVhbSkKLSAgewotICAgIHRoaXMoZHN0cmVhbSwgMSwgMSwgNDA5Nik7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBzZXRUYWJTaXplKGludCBpKQotICB7Ci0gICAgdGFiU2l6ZSA9IGk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgaW50IGdldFRhYlNpemUoaW50IGkpCi0gIHsKLSAgICByZXR1cm4gdGFiU2l6ZTsKLSAgfQotCi0KLSAgcHJvdGVjdGVkIHZvaWQgRXhwYW5kQnVmZihib29sZWFuIHdyYXBBcm91bmQpCi0gIHsKLSAgICBjaGFyW10gbmV3YnVmZmVyID0gbmV3IGNoYXJbYnVmc2l6ZSArIDIwNDhdOwotICAgIGludFtdICBuZXdidWZsaW5lID0gbmV3IGludFtidWZzaXplICsgMjA0OF07Ci0gICAgaW50W10gIG5ld2J1ZmNvbHVtbiA9IG5ldyBpbnRbYnVmc2l6ZSArIDIwNDhdOwotCi0gICAgdHJ5Ci0gICAgewotCi0gICAgICBpZiAod3JhcEFyb3VuZCkKLSAgICAgIHsKLSAgICAgICAgU3lzdGVtLmFycmF5Y29weShidWZmZXIsIHRva2VuQmVnaW4sIG5ld2J1ZmZlciwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBidWZzaXplIC0gdG9rZW5CZWdpbik7Ci0gICAgICAgIFN5c3RlbS5hcnJheWNvcHkoYnVmZmVyLCAwLCBuZXdidWZmZXIsIGJ1ZnNpemUgLSB0b2tlbkJlZ2luLCBidWZwb3MpOwotICAgICAgICBidWZmZXIgPSBuZXdidWZmZXI7Ci0KLSAgICAgICAgU3lzdGVtLmFycmF5Y29weShidWZsaW5lLCB0b2tlbkJlZ2luLCBuZXdidWZsaW5lLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZnNpemUgLSB0b2tlbkJlZ2luKTsKLSAgICAgICAgU3lzdGVtLmFycmF5Y29weShidWZsaW5lLCAwLCBuZXdidWZsaW5lLCBidWZzaXplIC0gdG9rZW5CZWdpbiwgYnVmcG9zKTsKLSAgICAgICAgYnVmbGluZSA9IG5ld2J1ZmxpbmU7Ci0KLSAgICAgICAgU3lzdGVtLmFycmF5Y29weShidWZjb2x1bW4sIHRva2VuQmVnaW4sIG5ld2J1ZmNvbHVtbiwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBidWZzaXplIC0gdG9rZW5CZWdpbik7Ci0gICAgICAgIFN5c3RlbS5hcnJheWNvcHkoYnVmY29sdW1uLCAwLCBuZXdidWZjb2x1bW4sIGJ1ZnNpemUgLSB0b2tlbkJlZ2luLAotICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZnBvcyk7Ci0gICAgICAgIGJ1ZmNvbHVtbiA9IG5ld2J1ZmNvbHVtbjsKLQotICAgICAgICBtYXhOZXh0Q2hhckluZCA9IChidWZwb3MgKz0gKGJ1ZnNpemUgLSB0b2tlbkJlZ2luKSk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIFN5c3RlbS5hcnJheWNvcHkoYnVmZmVyLCB0b2tlbkJlZ2luLCBuZXdidWZmZXIsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgYnVmc2l6ZSAtIHRva2VuQmVnaW4pOwotICAgICAgICBidWZmZXIgPSBuZXdidWZmZXI7Ci0KLSAgICAgICAgU3lzdGVtLmFycmF5Y29weShidWZsaW5lLCB0b2tlbkJlZ2luLCBuZXdidWZsaW5lLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZnNpemUgLSB0b2tlbkJlZ2luKTsKLSAgICAgICAgYnVmbGluZSA9IG5ld2J1ZmxpbmU7Ci0KLSAgICAgICAgU3lzdGVtLmFycmF5Y29weShidWZjb2x1bW4sIHRva2VuQmVnaW4sIG5ld2J1ZmNvbHVtbiwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBidWZzaXplIC0gdG9rZW5CZWdpbik7Ci0gICAgICAgIGJ1ZmNvbHVtbiA9IG5ld2J1ZmNvbHVtbjsKLQotICAgICAgICBtYXhOZXh0Q2hhckluZCA9IChidWZwb3MgLT0gdG9rZW5CZWdpbik7Ci0gICAgICB9Ci0gICAgfQotICAgIGNhdGNoIChUaHJvd2FibGUgdCkKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgRXJyb3IodC5nZXRNZXNzYWdlKCkpOwotICAgIH0KLQotICAgIGJ1ZnNpemUgKz0gMjA0ODsKLSAgICBhdmFpbGFibGUgPSBidWZzaXplOwotICAgIHRva2VuQmVnaW4gPSAwOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgRmlsbEJ1ZmYoKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgotICB7Ci0KLSAgICBpZiAobWF4TmV4dENoYXJJbmQgPT0gYXZhaWxhYmxlKQotICAgIHsKLQotICAgICAgaWYgKGF2YWlsYWJsZSA9PSBidWZzaXplKQotICAgICAgewotCi0gICAgICAgIGlmICh0b2tlbkJlZ2luID4gMjA0OCkKLSAgICAgICAgewotICAgICAgICAgIGJ1ZnBvcyA9IG1heE5leHRDaGFySW5kID0gMDsKLSAgICAgICAgICBhdmFpbGFibGUgPSB0b2tlbkJlZ2luOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHRva2VuQmVnaW4gPCAwKQotICAgICAgICB7Ci0gICAgICAgICAgYnVmcG9zID0gbWF4TmV4dENoYXJJbmQgPSAwOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIEV4cGFuZEJ1ZmYoZmFsc2UpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChhdmFpbGFibGUgPiB0b2tlbkJlZ2luKQotICAgICAgewotICAgICAgICBhdmFpbGFibGUgPSBidWZzaXplOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoKHRva2VuQmVnaW4gLSBhdmFpbGFibGUpIDwgMjA0OCkKLSAgICAgIHsKLSAgICAgICAgRXhwYW5kQnVmZih0cnVlKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgYXZhaWxhYmxlID0gdG9rZW5CZWdpbjsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpbnQgaTsKLQotICAgIHRyeQotICAgIHsKLQotICAgICAgaWYgKChpID0gaW5wdXRTdHJlYW0ucmVhZChidWZmZXIsIG1heE5leHRDaGFySW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZSAtIG1heE5leHRDaGFySW5kKSkgPT0gLTEpCi0gICAgICB7Ci0gICAgICAgIGlucHV0U3RyZWFtLmNsb3NlKCk7Ci0gICAgICAgIHRocm93IG5ldyBqYXZhLmlvLklPRXhjZXB0aW9uKCk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIG1heE5leHRDaGFySW5kICs9IGk7Ci0gICAgICB9Ci0KLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgY2F0Y2ggKGphdmEuaW8uSU9FeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICAtLWJ1ZnBvczsKLSAgICAgIGJhY2t1cCgwKTsKLQotICAgICAgaWYgKHRva2VuQmVnaW4gPT0gLTEpCi0gICAgICB7Ci0gICAgICAgIHRva2VuQmVnaW4gPSBidWZwb3M7Ci0gICAgICB9Ci0KLSAgICAgIHRocm93IGU7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIGNoYXIgQmVnaW5Ub2tlbigpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCi0gIHsKLSAgICB0b2tlbkJlZ2luID0gLTE7Ci0KLSAgICBjaGFyIGMgPSByZWFkQ2hhcigpOwotICAgIHRva2VuQmVnaW4gPSBidWZwb3M7Ci0KLSAgICByZXR1cm4gYzsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIFVwZGF0ZUxpbmVDb2x1bW4oY2hhciBjKQotICB7Ci0gICAgY29sdW1uKys7Ci0KLSAgICBpZiAocHJldkNoYXJJc0xGKQotICAgIHsKLSAgICAgIHByZXZDaGFySXNMRiA9IGZhbHNlOwotICAgICAgbGluZSArPSAoY29sdW1uID0gMSk7Ci0gICAgfQotICAgIGVsc2UgaWYgKHByZXZDaGFySXNDUikKLSAgICB7Ci0gICAgICBwcmV2Q2hhcklzQ1IgPSBmYWxzZTsKLQotICAgICAgaWYgKGMgPT0gJ1xuJykKLSAgICAgIHsKLSAgICAgICAgcHJldkNoYXJJc0xGID0gdHJ1ZTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgbGluZSArPSAoY29sdW1uID0gMSk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgc3dpdGNoIChjKQotICAgIHsKLQotICAgIGNhc2UgJ1xyJzoKLSAgICB7Ci0gICAgICBwcmV2Q2hhcklzQ1IgPSB0cnVlOwotCi0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBjYXNlICdcbic6Ci0gICAgewotICAgICAgcHJldkNoYXJJc0xGID0gdHJ1ZTsKLQotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgY2FzZSAnXHQnOgotICAgIHsKLSAgICAgIGNvbHVtbi0tOwotICAgICAgY29sdW1uICs9ICh0YWJTaXplIC0gKGNvbHVtbiAlIHRhYlNpemUpKTsKLQotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgZGVmYXVsdDoKLSAgICB7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgfQotCi0gICAgYnVmbGluZVtidWZwb3NdID0gbGluZTsKLSAgICBidWZjb2x1bW5bYnVmcG9zXSA9IGNvbHVtbjsKLSAgfQotCi0gIHB1YmxpYyBjaGFyIHJlYWRDaGFyKCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KLSAgewotCi0gICAgaWYgKGluQnVmID4gMCkKLSAgICB7Ci0gICAgICAtLWluQnVmOwotCi0gICAgICBpZiAoKytidWZwb3MgPT0gYnVmc2l6ZSkKLSAgICAgIHsKLSAgICAgICAgYnVmcG9zID0gMDsKLSAgICAgIH0KLQotICAgICAgcmV0dXJuIGJ1ZmZlcltidWZwb3NdOwotICAgIH0KLQotICAgIGlmICgrK2J1ZnBvcyA+PSBtYXhOZXh0Q2hhckluZCkKLSAgICB7Ci0gICAgICBGaWxsQnVmZigpOwotICAgIH0KLQotICAgIGNoYXIgYyA9IGJ1ZmZlcltidWZwb3NdOwotCi0gICAgVXBkYXRlTGluZUNvbHVtbihjKTsKLQotICAgIHJldHVybiAoYyk7Ci0gIH0KLQotICAvKioKLSAgICogQGRlcHJlY2F0ZWQKLSAgICogQHNlZSAjZ2V0RW5kQ29sdW1uCi0gICAqLwotCi0gIHB1YmxpYyBpbnQgZ2V0Q29sdW1uKCkKLSAgewotICAgIHJldHVybiBidWZjb2x1bW5bYnVmcG9zXTsKLSAgfQotCi0gIC8qKgotICAgKiBAZGVwcmVjYXRlZAotICAgKiBAc2VlICNnZXRFbmRMaW5lCi0gICAqLwotCi0gIHB1YmxpYyBpbnQgZ2V0TGluZSgpCi0gIHsKLSAgICByZXR1cm4gYnVmbGluZVtidWZwb3NdOwotICB9Ci0KLSAgcHVibGljIGludCBnZXRFbmRDb2x1bW4oKQotICB7Ci0gICAgcmV0dXJuIGJ1ZmNvbHVtbltidWZwb3NdOwotICB9Ci0KLSAgcHVibGljIGludCBnZXRFbmRMaW5lKCkKLSAgewotICAgIHJldHVybiBidWZsaW5lW2J1ZnBvc107Ci0gIH0KLQotICBwdWJsaWMgaW50IGdldEJlZ2luQ29sdW1uKCkKLSAgewotICAgIHJldHVybiBidWZjb2x1bW5bdG9rZW5CZWdpbl07Ci0gIH0KLQotICBwdWJsaWMgaW50IGdldEJlZ2luTGluZSgpCi0gIHsKLSAgICByZXR1cm4gYnVmbGluZVt0b2tlbkJlZ2luXTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGJhY2t1cChpbnQgYW1vdW50KQotICB7Ci0KLSAgICBpbkJ1ZiArPSBhbW91bnQ7Ci0KLSAgICBpZiAoKGJ1ZnBvcyAtPSBhbW91bnQpIDwgMCkKLSAgICB7Ci0gICAgICBidWZwb3MgKz0gYnVmc2l6ZTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBSZUluaXQoamF2YS5pby5SZWFkZXIgZHN0cmVhbSwgaW50IHN0YXJ0bGluZSwgaW50IHN0YXJ0Y29sdW1uLAotICAgICAgICAgICAgICAgICAgICAgaW50IGJ1ZmZlcnNpemUpCi0gIHsKLSAgICBpbnB1dFN0cmVhbSA9IGRzdHJlYW07Ci0gICAgbGluZSA9IHN0YXJ0bGluZTsKLSAgICBjb2x1bW4gPSBzdGFydGNvbHVtbiAtIDE7Ci0KLSAgICBpZiAoKGJ1ZmZlciA9PSBudWxsKSB8fCAoYnVmZmVyc2l6ZSAhPSBidWZmZXIubGVuZ3RoKSkKLSAgICB7Ci0gICAgICBhdmFpbGFibGUgPSBidWZzaXplID0gYnVmZmVyc2l6ZTsKLSAgICAgIGJ1ZmZlciA9IG5ldyBjaGFyW2J1ZmZlcnNpemVdOwotICAgICAgYnVmbGluZSA9IG5ldyBpbnRbYnVmZmVyc2l6ZV07Ci0gICAgICBidWZjb2x1bW4gPSBuZXcgaW50W2J1ZmZlcnNpemVdOwotICAgIH0KLQotICAgIHByZXZDaGFySXNMRiA9IHByZXZDaGFySXNDUiA9IGZhbHNlOwotICAgIHRva2VuQmVnaW4gPSBpbkJ1ZiA9IG1heE5leHRDaGFySW5kID0gMDsKLSAgICBidWZwb3MgPSAtMTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIFJlSW5pdChqYXZhLmlvLlJlYWRlciBkc3RyZWFtLCBpbnQgc3RhcnRsaW5lLCBpbnQgc3RhcnRjb2x1bW4pCi0gIHsKLSAgICBSZUluaXQoZHN0cmVhbSwgc3RhcnRsaW5lLCBzdGFydGNvbHVtbiwgNDA5Nik7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBSZUluaXQoamF2YS5pby5SZWFkZXIgZHN0cmVhbSkKLSAgewotICAgIFJlSW5pdChkc3RyZWFtLCAxLCAxLCA0MDk2KTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIFJlSW5pdChqYXZhLmlvLklucHV0U3RyZWFtIGRzdHJlYW0sIFN0cmluZyBlbmNvZGluZywKLSAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydGxpbmUsIGludCBzdGFydGNvbHVtbiwgaW50IGJ1ZmZlcnNpemUpCi0gICAgICAgICAgICAgIHRocm93cyBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24KLSAgewotICAgIFJlSW5pdCgoZW5jb2RpbmcgPT0gbnVsbCkKLSAgICAgICAgICAgPyBuZXcgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcihkc3RyZWFtKQotICAgICAgICAgICA6IG5ldyBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyKGRzdHJlYW0sIGVuY29kaW5nKSwgc3RhcnRsaW5lLAotICAgICAgICAgICBzdGFydGNvbHVtbiwgYnVmZmVyc2l6ZSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBSZUluaXQoamF2YS5pby5JbnB1dFN0cmVhbSBkc3RyZWFtLCBpbnQgc3RhcnRsaW5lLAotICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0Y29sdW1uLCBpbnQgYnVmZmVyc2l6ZSkKLSAgewotICAgIFJlSW5pdChuZXcgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcihkc3RyZWFtKSwgc3RhcnRsaW5lLCBzdGFydGNvbHVtbiwKLSAgICAgICAgICAgYnVmZmVyc2l6ZSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBSZUluaXQoamF2YS5pby5JbnB1dFN0cmVhbSBkc3RyZWFtLCBTdHJpbmcgZW5jb2RpbmcpCi0gICAgICAgICAgICAgIHRocm93cyBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24KLSAgewotICAgIFJlSW5pdChkc3RyZWFtLCBlbmNvZGluZywgMSwgMSwgNDA5Nik7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBSZUluaXQoamF2YS5pby5JbnB1dFN0cmVhbSBkc3RyZWFtKQotICB7Ci0gICAgUmVJbml0KGRzdHJlYW0sIDEsIDEsIDQwOTYpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgUmVJbml0KGphdmEuaW8uSW5wdXRTdHJlYW0gZHN0cmVhbSwgU3RyaW5nIGVuY29kaW5nLAotICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0bGluZSwgaW50IHN0YXJ0Y29sdW1uKQotICAgICAgICAgICAgICB0aHJvd3MgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uCi0gIHsKLSAgICBSZUluaXQoZHN0cmVhbSwgZW5jb2RpbmcsIHN0YXJ0bGluZSwgc3RhcnRjb2x1bW4sIDQwOTYpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgUmVJbml0KGphdmEuaW8uSW5wdXRTdHJlYW0gZHN0cmVhbSwgaW50IHN0YXJ0bGluZSwKLSAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydGNvbHVtbikKLSAgewotICAgIFJlSW5pdChkc3RyZWFtLCBzdGFydGxpbmUsIHN0YXJ0Y29sdW1uLCA0MDk2KTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgR2V0SW1hZ2UoKQotICB7Ci0KLSAgICBpZiAoYnVmcG9zID49IHRva2VuQmVnaW4pCi0gICAgewotICAgICAgcmV0dXJuIG5ldyBTdHJpbmcoYnVmZmVyLCB0b2tlbkJlZ2luLCBidWZwb3MgLSB0b2tlbkJlZ2luICsgMSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICByZXR1cm4gbmV3IFN0cmluZyhidWZmZXIsIHRva2VuQmVnaW4sIGJ1ZnNpemUgLSB0b2tlbkJlZ2luKSArCi0gICAgICAgIG5ldyBTdHJpbmcoYnVmZmVyLCAwLCBidWZwb3MgKyAxKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgY2hhcltdIEdldFN1ZmZpeChpbnQgbGVuKQotICB7Ci0gICAgY2hhcltdIHJldCA9IG5ldyBjaGFyW2xlbl07Ci0KLSAgICBpZiAoKGJ1ZnBvcyArIDEpID49IGxlbikKLSAgICB7Ci0gICAgICBTeXN0ZW0uYXJyYXljb3B5KGJ1ZmZlciwgYnVmcG9zIC0gbGVuICsgMSwgcmV0LCAwLCBsZW4pOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgU3lzdGVtLmFycmF5Y29weShidWZmZXIsIGJ1ZnNpemUgLSAobGVuIC0gYnVmcG9zIC0gMSksIHJldCwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgbGVuIC0gYnVmcG9zIC0gMSk7Ci0gICAgICBTeXN0ZW0uYXJyYXljb3B5KGJ1ZmZlciwgMCwgcmV0LCBsZW4gLSBidWZwb3MgLSAxLCBidWZwb3MgKyAxKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gcmV0OwotICB9Ci0KLSAgcHVibGljIHZvaWQgRG9uZSgpCi0gIHsKLSAgICBidWZmZXIgPSBudWxsOwotICAgIGJ1ZmxpbmUgPSBudWxsOwotICAgIGJ1ZmNvbHVtbiA9IG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogTWV0aG9kIHRvIGFkanVzdCBsaW5lIGFuZCBjb2x1bW4gbnVtYmVycyBmb3IgdGhlIHN0YXJ0IG9mIGEgdG9rZW4uCi0gICAqLwotICBwdWJsaWMgdm9pZCBhZGp1c3RCZWdpbkxpbmVDb2x1bW4oaW50IG5ld0xpbmUsIGludCBuZXdDb2wpCi0gIHsKLSAgICBpbnQgc3RhcnQgPSB0b2tlbkJlZ2luOwotICAgIGludCBsZW47Ci0KLSAgICBpZiAoYnVmcG9zID49IHRva2VuQmVnaW4pCi0gICAgewotICAgICAgbGVuID0gYnVmcG9zIC0gdG9rZW5CZWdpbiArIGluQnVmICsgMTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGxlbiA9IGJ1ZnNpemUgLSB0b2tlbkJlZ2luICsgYnVmcG9zICsgMSArIGluQnVmOwotICAgIH0KLQotICAgIGludCBpID0gMCwgaiA9IDAsIGsgPSAwOwotICAgIGludCBuZXh0Q29sRGlmZiA9IDAsIGNvbHVtbkRpZmYgPSAwOwotCi0gICAgd2hpbGUgKChpIDwgbGVuKSAmJgotICAgICAgICAoYnVmbGluZVtqID0gc3RhcnQgJSBidWZzaXplXSA9PSBidWZsaW5lW2sgPSArK3N0YXJ0ICUgYnVmc2l6ZV0pKQotICAgIHsKLSAgICAgIGJ1ZmxpbmVbal0gPSBuZXdMaW5lOwotICAgICAgbmV4dENvbERpZmYgPSBjb2x1bW5EaWZmICsgYnVmY29sdW1uW2tdIC0gYnVmY29sdW1uW2pdOwotICAgICAgYnVmY29sdW1uW2pdID0gbmV3Q29sICsgY29sdW1uRGlmZjsKLSAgICAgIGNvbHVtbkRpZmYgPSBuZXh0Q29sRGlmZjsKLSAgICAgIGkrKzsKLSAgICB9Ci0KLSAgICBpZiAoaSA8IGxlbikKLSAgICB7Ci0gICAgICBidWZsaW5lW2pdID0gbmV3TGluZSsrOwotICAgICAgYnVmY29sdW1uW2pdID0gbmV3Q29sICsgY29sdW1uRGlmZjsKLQotICAgICAgd2hpbGUgKGkrKyA8IGxlbikKLSAgICAgIHsKLQotICAgICAgICBpZiAoYnVmbGluZVtqID0gc3RhcnQgJSBidWZzaXplXSAhPSBidWZsaW5lWysrc3RhcnQgJSBidWZzaXplXSkKLSAgICAgICAgewotICAgICAgICAgIGJ1ZmxpbmVbal0gPSBuZXdMaW5lKys7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgYnVmbGluZVtqXSA9IG5ld0xpbmU7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICBsaW5lID0gYnVmbGluZVtqXTsKLSAgICBjb2x1bW4gPSBidWZjb2x1bW5bal07Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvU2ltcGxlTm9kZS5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvU2ltcGxlTm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOWNlZTkzLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL1NpbXBsZU5vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MyArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIFNpbXBsZU5vZGUuamF2YSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5qYXZhc2NyaXB0MjBwYXJzZXI7Ci0KLXB1YmxpYyBjbGFzcyBTaW1wbGVOb2RlIGltcGxlbWVudHMgTm9kZQotewotICBwcm90ZWN0ZWQgTm9kZSAgICAgICBwYXJlbnQ7Ci0gIHByb3RlY3RlZCBOb2RlW10gICAgIGNoaWxkcmVuOwotICBwcm90ZWN0ZWQgaW50ICAgICAgICBpZDsKLSAgcHJvdGVjdGVkIEpTUGFyc2VyMjAgcGFyc2VyOwotCi0gIHByb3RlY3RlZCBUb2tlbiAgICAgIGZpcnN0OwotICBwcm90ZWN0ZWQgVG9rZW4gICAgICBsYXN0OwotCi0gIHB1YmxpYyBTaW1wbGVOb2RlKGludCBpKQotICB7Ci0gICAgaWQgPSBpOwotICB9Ci0KLSAgcHVibGljIFNpbXBsZU5vZGUoSlNQYXJzZXIyMCBwLCBpbnQgaSkKLSAgewotICAgIHRoaXMoaSk7Ci0gICAgcGFyc2VyID0gcDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGpqdE9wZW4oKQotICB7Ci0gICAgZmlyc3QgPSBwYXJzZXIuZ2V0VG9rZW4oMSk7IC8vIG5ldwotICB9Ci0KLSAgcHVibGljIHZvaWQgamp0Q2xvc2UoKQotICB7Ci0gICAgbGFzdCA9IHBhcnNlci5nZXRUb2tlbigwKTsgLy8gbmV3Ci0gIH0KLQotICBwdWJsaWMgVG9rZW4gZ2V0Rmlyc3RUb2tlbigpIHsgcmV0dXJuIGZpcnN0OyB9IC8vIG5ldwotICBwdWJsaWMgVG9rZW4gZ2V0TGFzdFRva2VuKCkgeyByZXR1cm4gbGFzdDsgfSAgIC8vIG5ldwotCi0gIHB1YmxpYyB2b2lkIGpqdFNldFBhcmVudChOb2RlIG4pCi0gIHsKLSAgICBwYXJlbnQgPSBuOwotICB9Ci0KLSAgcHVibGljIE5vZGUgamp0R2V0UGFyZW50KCkKLSAgewotICAgIHJldHVybiBwYXJlbnQ7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBqanRBZGRDaGlsZChOb2RlIG4sIGludCBpKQotICB7Ci0KLSAgICBpZiAoY2hpbGRyZW4gPT0gbnVsbCkKLSAgICB7Ci0gICAgICBjaGlsZHJlbiA9IG5ldyBOb2RlW2kgKyAxXTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoaSA+PSBjaGlsZHJlbi5sZW5ndGgpCi0gICAgewotICAgICAgTm9kZVtdIGMgPSBuZXcgTm9kZVtpICsgMV07Ci0gICAgICBTeXN0ZW0uYXJyYXljb3B5KGNoaWxkcmVuLCAwLCBjLCAwLCBjaGlsZHJlbi5sZW5ndGgpOwotICAgICAgY2hpbGRyZW4gPSBjOwotICAgIH0KLQotICAgIGNoaWxkcmVuW2ldID0gbjsKLSAgfQotCi0gIHB1YmxpYyBOb2RlIGpqdEdldENoaWxkKGludCBpKQotICB7Ci0gICAgcmV0dXJuIGNoaWxkcmVuW2ldOwotICB9Ci0KLSAgcHVibGljIGludCBqanRHZXROdW1DaGlsZHJlbigpCi0gIHsKLSAgICByZXR1cm4gKGNoaWxkcmVuID09IG51bGwpID8gMCA6IGNoaWxkcmVuLmxlbmd0aDsKLSAgfQotCi0gIC8qKiBBY2NlcHQgdGhlIHZpc2l0b3IuICoqLwotICBwdWJsaWMgT2JqZWN0IGpqdEFjY2VwdChKU1BhcnNlcjIwVmlzaXRvciB2aXNpdG9yLCBPYmplY3QgZGF0YSkKLSAgewotICAgIHJldHVybiB2aXNpdG9yLnZpc2l0KHRoaXMsIGRhdGEpOwotICB9Ci0KLSAgLyoqIEFjY2VwdCB0aGUgdmlzaXRvci4gKiovCi0gIHB1YmxpYyBPYmplY3QgY2hpbGRyZW5BY2NlcHQoSlNQYXJzZXIyMFZpc2l0b3IgdmlzaXRvciwgT2JqZWN0IGRhdGEpCi0gIHsKLQotICAgIGlmIChjaGlsZHJlbiAhPSBudWxsKQotICAgIHsKLQotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7ICsraSkKLSAgICAgIHsKLSAgICAgICAgY2hpbGRyZW5baV0uamp0QWNjZXB0KHZpc2l0b3IsIGRhdGEpOwotICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBkYXRhOwotICB9Ci0KLSAgLyogWW91IGNhbiBvdmVycmlkZSB0aGVzZSB0d28gbWV0aG9kcyBpbiBzdWJjbGFzc2VzIG9mIFNpbXBsZU5vZGUgdG8KLSAgICAgY3VzdG9taXplIHRoZSB3YXkgdGhlIG5vZGUgYXBwZWFycyB3aGVuIHRoZSB0cmVlIGlzIGR1bXBlZC4gIElmCi0gICAgIHlvdXIgb3V0cHV0IHVzZXMgbW9yZSB0aGFuIG9uZSBsaW5lIHlvdSBzaG91bGQgb3ZlcnJpZGUKLSAgICAgdG9TdHJpbmcoU3RyaW5nKSwgb3RoZXJ3aXNlIG92ZXJyaWRpbmcgdG9TdHJpbmcoKSBpcyBwcm9iYWJseSBhbGwKLSAgICAgeW91IG5lZWQgdG8gZG8uICovCi0KLSAgcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0gIHsKLSAgICByZXR1cm4gSlNQYXJzZXIyMFRyZWVDb25zdGFudHMuamp0Tm9kZU5hbWVbaWRdOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyB0b1N0cmluZyhTdHJpbmcgcHJlZml4KQotICB7Ci0gICAgcmV0dXJuIHByZWZpeCArIHRvU3RyaW5nKCk7Ci0gIH0KLQotICAvKiBPdmVycmlkZSB0aGlzIG1ldGhvZCBpZiB5b3Ugd2FudCB0byBjdXN0b21pemUgaG93IHRoZSBub2RlIGR1bXBzCi0gICAgIG91dCBpdHMgY2hpbGRyZW4uICovCi0KLSAgcHVibGljIHZvaWQgZHVtcChTdHJpbmcgcHJlZml4KQotICB7Ci0gICAgU3lzdGVtLm91dC5wcmludGxuKHRvU3RyaW5nKHByZWZpeCkpOwotCi0gICAgaWYgKGNoaWxkcmVuICE9IG51bGwpCi0gICAgewotCi0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgKytpKQotICAgICAgewotICAgICAgICBTaW1wbGVOb2RlIG4gPSAoU2ltcGxlTm9kZSkgY2hpbGRyZW5baV07Ci0KLSAgICAgICAgaWYgKG4gIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIG4uZHVtcChwcmVmaXggKyAiICIpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9Ub2tlbi5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvVG9rZW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzliMzg4Ny4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9Ub2tlbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA1ICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qIEdlbmVyYXRlZCBCeTpKYXZhQ0M6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gVG9rZW4uamF2YSBWZXJzaW9uIDMuMCAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuamF2YXNjcmlwdDIwcGFyc2VyOwotCi0vKioKLSAqIERlc2NyaWJlcyB0aGUgaW5wdXQgdG9rZW4gc3RyZWFtLgotICovCi0KLXB1YmxpYyBjbGFzcyBUb2tlbgotewotICBwdWJsaWMgYm9vbGVhbiBoYXNQcmludGVkID0gZmFsc2U7Ci0gIC8qKgotICAgKiBBbiBpbnRlZ2VyIHRoYXQgZGVzY3JpYmVzIHRoZSBraW5kIG9mIHRoaXMgdG9rZW4uICBUaGlzIG51bWJlcmluZwotICAgKiBzeXN0ZW0gaXMgZGV0ZXJtaW5lZCBieSBKYXZhQ0NQYXJzZXIsIGFuZCBhIHRhYmxlIG9mIHRoZXNlIG51bWJlcnMgaXMKLSAgICogc3RvcmVkIGluIHRoZSBmaWxlIC4uLkNvbnN0YW50cy5qYXZhLgotICAgKi8KLSAgcHVibGljIGludCBraW5kOwotCi0gIC8qKgotICAgKiBiZWdpbkxpbmUgYW5kIGJlZ2luQ29sdW1uIGRlc2NyaWJlIHRoZSBwb3NpdGlvbiBvZiB0aGUgZmlyc3QgY2hhcmFjdGVyCi0gICAqIG9mIHRoaXMgdG9rZW47IGVuZExpbmUgYW5kIGVuZENvbHVtbiBkZXNjcmliZSB0aGUgcG9zaXRpb24gb2YgdGhlCi0gICAqIGxhc3QgY2hhcmFjdGVyIG9mIHRoaXMgdG9rZW4uCi0gICAqLwotICBwdWJsaWMgaW50IGJlZ2luTGluZSwgYmVnaW5Db2x1bW4sIGVuZExpbmUsIGVuZENvbHVtbjsKLQotICAvKioKLSAgICogVGhlIHN0cmluZyBpbWFnZSBvZiB0aGUgdG9rZW4uCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGltYWdlOwotCi0gIC8qKgotICAgKiBBIHJlZmVyZW5jZSB0byB0aGUgbmV4dCByZWd1bGFyIChub24tc3BlY2lhbCkgdG9rZW4gZnJvbSB0aGUgaW5wdXQKLSAgICogc3RyZWFtLiAgSWYgdGhpcyBpcyB0aGUgbGFzdCB0b2tlbiBmcm9tIHRoZSBpbnB1dCBzdHJlYW0sIG9yIGlmIHRoZQotICAgKiB0b2tlbiBtYW5hZ2VyIGhhcyBub3QgcmVhZCB0b2tlbnMgYmV5b25kIHRoaXMgb25lLCB0aGlzIGZpZWxkIGlzCi0gICAqIHNldCB0byBudWxsLiAgVGhpcyBpcyB0cnVlIG9ubHkgaWYgdGhpcyB0b2tlbiBpcyBhbHNvIGEgcmVndWxhcgotICAgKiB0b2tlbi4gIE90aGVyd2lzZSwgc2VlIGJlbG93IGZvciBhIGRlc2NyaXB0aW9uIG9mIHRoZSBjb250ZW50cyBvZgotICAgKiB0aGlzIGZpZWxkLgotICAgKi8KLSAgcHVibGljIFRva2VuIG5leHQ7Ci0KLSAgLyoqCi0gICAqIFRoaXMgZmllbGQgaXMgdXNlZCB0byBhY2Nlc3Mgc3BlY2lhbCB0b2tlbnMgdGhhdCBvY2N1ciBwcmlvciB0byB0aGlzCi0gICAqIHRva2VuLCBidXQgYWZ0ZXIgdGhlIGltbWVkaWF0ZWx5IHByZWNlZGluZyByZWd1bGFyIChub24tc3BlY2lhbCkgdG9rZW4uCi0gICAqIElmIHRoZXJlIGFyZSBubyBzdWNoIHNwZWNpYWwgdG9rZW5zLCB0aGlzIGZpZWxkIGlzIHNldCB0byBudWxsLgotICAgKiBXaGVuIHRoZXJlIGFyZSBtb3JlIHRoYW4gb25lIHN1Y2ggc3BlY2lhbCB0b2tlbiwgdGhpcyBmaWVsZCByZWZlcnMKLSAgICogdG8gdGhlIGxhc3Qgb2YgdGhlc2Ugc3BlY2lhbCB0b2tlbnMsIHdoaWNoIGluIHR1cm4gcmVmZXJzIHRvIHRoZSBuZXh0Ci0gICAqIHByZXZpb3VzIHNwZWNpYWwgdG9rZW4gdGhyb3VnaCBpdHMgc3BlY2lhbFRva2VuIGZpZWxkLCBhbmQgc28gb24KLSAgICogdW50aWwgdGhlIGZpcnN0IHNwZWNpYWwgdG9rZW4gKHdob3NlIHNwZWNpYWxUb2tlbiBmaWVsZCBpcyBudWxsKS4KLSAgICogVGhlIG5leHQgZmllbGRzIG9mIHNwZWNpYWwgdG9rZW5zIHJlZmVyIHRvIG90aGVyIHNwZWNpYWwgdG9rZW5zIHRoYXQKLSAgICogaW1tZWRpYXRlbHkgZm9sbG93IGl0ICh3aXRob3V0IGFuIGludGVydmVuaW5nIHJlZ3VsYXIgdG9rZW4pLiAgSWYgdGhlcmUKLSAgICogaXMgbm8gc3VjaCB0b2tlbiwgdGhpcyBmaWVsZCBpcyBudWxsLgotICAgKi8KLSAgcHVibGljIFRva2VuIHNwZWNpYWxUb2tlbjsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgaW1hZ2UuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLSAgewotICAgIHJldHVybiBpbWFnZTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIGEgbmV3IFRva2VuIG9iamVjdCwgYnkgZGVmYXVsdC4gSG93ZXZlciwgaWYgeW91IHdhbnQsIHlvdQotICAgKiBjYW4gY3JlYXRlIGFuZCByZXR1cm4gc3ViY2xhc3Mgb2JqZWN0cyBiYXNlZCBvbiB0aGUgdmFsdWUgb2Ygb2ZLaW5kLgotICAgKiBTaW1wbHkgYWRkIHRoZSBjYXNlcyB0byB0aGUgc3dpdGNoIGZvciBhbGwgdGhvc2Ugc3BlY2lhbCBjYXNlcy4KLSAgICogRm9yIGV4YW1wbGUsIGlmIHlvdSBoYXZlIGEgc3ViY2xhc3Mgb2YgVG9rZW4gY2FsbGVkIElEVG9rZW4gdGhhdAotICAgKiB5b3Ugd2FudCB0byBjcmVhdGUgaWYgb2ZLaW5kIGlzIElELCBzaW1scHkgYWRkIHNvbWV0aGluZyBsaWtlIDoKLSAgICoKLSAgICogICAgY2FzZSBNeVBhcnNlckNvbnN0YW50cy5JRCA6IHJldHVybiBuZXcgSURUb2tlbigpOwotICAgKgotICAgKiB0byB0aGUgZm9sbG93aW5nIHN3aXRjaCBzdGF0ZW1lbnQuIFRoZW4geW91IGNhbiBjYXN0IG1hdGNoZWRUb2tlbgotICAgKiB2YXJpYWJsZSB0byB0aGUgYXBwcm9wcmlhdGUgdHlwZSBhbmQgdXNlIGl0IGluIHlvdXIgbGV4aWNhbCBhY3Rpb25zLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBUb2tlbiBuZXdUb2tlbihpbnQgb2ZLaW5kKQotICB7Ci0KLSAgICBzd2l0Y2ggKG9mS2luZCkKLSAgICB7Ci0KLSAgICBkZWZhdWx0OgotICAgIHsKLSAgICAgIHJldHVybiBuZXcgVG9rZW4oKTsKLSAgICB9Ci0gICAgfQotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL1Rva2VuTWdyRXJyb3IuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL1Rva2VuTWdyRXJyb3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQ0MzI5NC4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9Ub2tlbk1nckVycm9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTEgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyogR2VuZXJhdGVkIEJ5OkphdmFDQzogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBUb2tlbk1nckVycm9yLmphdmEgVmVyc2lvbiAzLjAgKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LmphdmFzY3JpcHQyMHBhcnNlcjsKLQotcHVibGljIGNsYXNzIFRva2VuTWdyRXJyb3IgZXh0ZW5kcyBFcnJvcgotewotICAvKgotICAgKiBPcmRpbmFscyBmb3IgdmFyaW91cyByZWFzb25zIHdoeSBhbiBFcnJvciBvZiB0aGlzIHR5cGUgY2FuIGJlIHRocm93bi4KLSAgICovCi0KLSAgLyoqCi0gICAqIExleGljYWwgZXJyb3Igb2NjdXJlZC4KLSAgICovCi0gIHN0YXRpYyBmaW5hbCBpbnQgTEVYSUNBTF9FUlJPUiA9IDA7Ci0KLSAgLyoqCi0gICAqIEFuIGF0dGVtcHQgd2FzcyBtYWRlIHRvIGNyZWF0ZSBhIHNlY29uZCBpbnN0YW5jZSBvZiBhIHN0YXRpYyB0b2tlbiBtYW5hZ2VyLgotICAgKi8KLSAgc3RhdGljIGZpbmFsIGludCBTVEFUSUNfTEVYRVJfRVJST1IgPSAxOwotCi0gIC8qKgotICAgKiBUcmllZCB0byBjaGFuZ2UgdG8gYW4gaW52YWxpZCBsZXhpY2FsIHN0YXRlLgotICAgKi8KLSAgc3RhdGljIGZpbmFsIGludCBJTlZBTElEX0xFWElDQUxfU1RBVEUgPSAyOwotCi0gIC8qKgotICAgKiBEZXRlY3RlZCAoYW5kIGJhaWxlZCBvdXQgb2YpIGFuIGluZmluaXRlIGxvb3AgaW4gdGhlIHRva2VuIG1hbmFnZXIuCi0gICAqLwotICBzdGF0aWMgZmluYWwgaW50IExPT1BfREVURUNURUQgPSAzOwotCi0gIC8qKgotICAgKiBJbmRpY2F0ZXMgdGhlIHJlYXNvbiB3aHkgdGhlIGV4Y2VwdGlvbiBpcyB0aHJvd24uIEl0IHdpbGwgaGF2ZQotICAgKiBvbmUgb2YgdGhlIGFib3ZlIDQgdmFsdWVzLgotICAgKi8KLSAgaW50IGVycm9yQ29kZTsKLQotICAvKgotICAgKiBDb25zdHJ1Y3RvcnMgb2YgdmFyaW91cyBmbGF2b3JzIGZvbGxvdy4KLSAgICovCi0KLSAgcHVibGljIFRva2VuTWdyRXJyb3IoKQotICB7Ci0gIH0KLQotICBwdWJsaWMgVG9rZW5NZ3JFcnJvcihTdHJpbmcgbWVzc2FnZSwgaW50IHJlYXNvbikKLSAgewotICAgIHN1cGVyKG1lc3NhZ2UpOwotICAgIGVycm9yQ29kZSA9IHJlYXNvbjsKLSAgfQotCi0gIHB1YmxpYyBUb2tlbk1nckVycm9yKGJvb2xlYW4gRU9GU2VlbiwgaW50IGxleFN0YXRlLCBpbnQgZXJyb3JMaW5lLAotICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXJyb3JDb2x1bW4sIFN0cmluZyBlcnJvckFmdGVyLCBjaGFyIGN1ckNoYXIsCi0gICAgICAgICAgICAgICAgICAgICAgIGludCByZWFzb24pCi0gIHsKLSAgICB0aGlzKExleGljYWxFcnJvcihFT0ZTZWVuLCBsZXhTdGF0ZSwgZXJyb3JMaW5lLCBlcnJvckNvbHVtbiwgZXJyb3JBZnRlciwKLSAgICAgICAgICAgICAgICAgICAgICBjdXJDaGFyKSwgcmVhc29uKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXBsYWNlcyB1bnByaW50YWJsZSBjaGFyYWN0ZXJzIGJ5IHRoZWlyIGVzcGFjZWQgKG9yIHVuaWNvZGUgZXNjYXBlZCkKLSAgICogZXF1aXZhbGVudHMgaW4gdGhlIGdpdmVuIHN0cmluZwotICAgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgYWRkRXNjYXBlcyhTdHJpbmcgc3RyKQotICB7Ci0gICAgU3RyaW5nQnVmZmVyIHJldHZhbCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICBjaGFyICAgICAgICAgY2g7Ci0KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHN0ci5sZW5ndGgoKTsgaSsrKQotICAgIHsKLQotICAgICAgc3dpdGNoIChzdHIuY2hhckF0KGkpKQotICAgICAgewotCi0gICAgICBjYXNlIDA6Ci0gICAgICB7Ci0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotCi0gICAgICBjYXNlICdcYic6Ci0gICAgICB7Ci0gICAgICAgIHJldHZhbC5hcHBlbmQoIlxcYiIpOwotCi0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotCi0gICAgICBjYXNlICdcdCc6Ci0gICAgICB7Ci0gICAgICAgIHJldHZhbC5hcHBlbmQoIlxcdCIpOwotCi0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotCi0gICAgICBjYXNlICdcbic6Ci0gICAgICB7Ci0gICAgICAgIHJldHZhbC5hcHBlbmQoIlxcbiIpOwotCi0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotCi0gICAgICBjYXNlICdcZic6Ci0gICAgICB7Ci0gICAgICAgIHJldHZhbC5hcHBlbmQoIlxcZiIpOwotCi0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotCi0gICAgICBjYXNlICdccic6Ci0gICAgICB7Ci0gICAgICAgIHJldHZhbC5hcHBlbmQoIlxcciIpOwotCi0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotCi0gICAgICBjYXNlICdcIic6Ci0gICAgICB7Ci0gICAgICAgIHJldHZhbC5hcHBlbmQoIlxcXCIiKTsKLQotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLQotICAgICAgY2FzZSAnXCcnOgotICAgICAgewotICAgICAgICByZXR2YWwuYXBwZW5kKCJcXFwnIik7Ci0KLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0KLSAgICAgIGNhc2UgJ1xcJzoKLSAgICAgIHsKLSAgICAgICAgcmV0dmFsLmFwcGVuZCgiXFxcXCIpOwotCi0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotCi0gICAgICBkZWZhdWx0OgotICAgICAgewotCi0gICAgICAgIGlmICgoKGNoID0gc3RyLmNoYXJBdChpKSkgPCAweDIwKSB8fCAoY2ggPiAweDdlKSkKLSAgICAgICAgewotICAgICAgICAgIFN0cmluZyBzID0gIjAwMDAiICsgSW50ZWdlci50b1N0cmluZyhjaCwgMTYpOwotICAgICAgICAgIHJldHZhbC5hcHBlbmQoIlxcdSIgKyBzLnN1YnN0cmluZyhzLmxlbmd0aCgpIC0gNCwgcy5sZW5ndGgoKSkpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIHJldHZhbC5hcHBlbmQoY2gpOwotICAgICAgICB9Ci0KLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIHJldHZhbC50b1N0cmluZygpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgYSBkZXRhaWxlZCBtZXNzYWdlIGZvciB0aGUgRXJyb3Igd2hlbiBpdCBpcyB0aHJvd24gYnkgdGhlCi0gICAqIHRva2VuIG1hbmFnZXIgdG8gaW5kaWNhdGUgYSBsZXhpY2FsIGVycm9yLgotICAgKiBQYXJhbWV0ZXJzIDoKLSAgICogICAgRU9GU2VlbiAgICAgOiBpbmRpY2F0ZXMgaWYgRU9GIGNhdXNlZCB0aGUgbGV4aWNsIGVycm9yCi0gICAqICAgIGN1ckxleFN0YXRlIDogbGV4aWNhbCBzdGF0ZSBpbiB3aGljaCB0aGlzIGVycm9yIG9jY3VyZWQKLSAgICogICAgZXJyb3JMaW5lICAgOiBsaW5lIG51bWJlciB3aGVuIHRoZSBlcnJvciBvY2N1cmVkCi0gICAqICAgIGVycm9yQ29sdW1uIDogY29sdW1uIG51bWJlciB3aGVuIHRoZSBlcnJvciBvY2N1cmVkCi0gICAqICAgIGVycm9yQWZ0ZXIgIDogcHJlZml4IHRoYXQgd2FzIHNlZW4gYmVmb3JlIHRoaXMgZXJyb3Igb2NjdXJlZAotICAgKiAgICBjdXJjaGFyICAgICA6IHRoZSBvZmZlbmRpbmcgY2hhcmFjdGVyCi0gICAqIE5vdGU6IFlvdSBjYW4gY3VzdG9taXplIHRoZSBsZXhpY2FsIGVycm9yIG1lc3NhZ2UgYnkgbW9kaWZ5aW5nIHRoaXMgbWV0aG9kLgotICAgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgTGV4aWNhbEVycm9yKGJvb2xlYW4gRU9GU2VlbiwgaW50IGxleFN0YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGVycm9yTGluZSwgaW50IGVycm9yQ29sdW1uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGVycm9yQWZ0ZXIsIGNoYXIgY3VyQ2hhcikKLSAgewotICAgIHJldHVybiAoIkxleGljYWwgZXJyb3IgYXQgbGluZSAiICsgZXJyb3JMaW5lICsgIiwgY29sdW1uICIgKyBlcnJvckNvbHVtbiArCi0gICAgICAgICIuICBFbmNvdW50ZXJlZDogIiArCi0gICAgICAgIChFT0ZTZWVuCi0gICAgICAgICAgPyAiPEVPRj4gIgotICAgICAgICAgIDogKCgiXCIiICsgYWRkRXNjYXBlcyhTdHJpbmcudmFsdWVPZihjdXJDaGFyKSkgKyAiXCIiKSArICIgKCIgKwotICAgICAgICAgICAgKGludCkgY3VyQ2hhciArICIpLCAiKSkgKyAiYWZ0ZXIgOiBcIiIgKyBhZGRFc2NhcGVzKGVycm9yQWZ0ZXIpICsKLSAgICAgICAgIlwiIik7Ci0gIH0KLQotICAvKioKLSAgICogWW91IGNhbiBhbHNvIG1vZGlmeSB0aGUgYm9keSBvZiB0aGlzIG1ldGhvZCB0byBjdXN0b21pemUgeW91ciBlcnJvciBtZXNzYWdlcy4KLSAgICogRm9yIGV4YW1wbGUsIGNhc2VzIGxpa2UgTE9PUF9ERVRFQ1RFRCBhbmQgSU5WQUxJRF9MRVhJQ0FMX1NUQVRFIGFyZSBub3QKLSAgICogb2YgZW5kLXVzZXJzIGNvbmNlcm4sIHNvIHlvdSBjYW4gcmV0dXJuIHNvbWV0aGluZyBsaWtlIDoKLSAgICoKLSAgICogICAgICJJbnRlcm5hbCBFcnJvciA6IFBsZWFzZSBmaWxlIGEgYnVnIHJlcG9ydCAuLi4uICIKLSAgICoKLSAgICogZnJvbSB0aGlzIG1ldGhvZCBmb3Igc3VjaCBjYXNlcyBpbiB0aGUgcmVsZWFzZSB2ZXJzaW9uIG9mIHlvdXIgcGFyc2VyLgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRNZXNzYWdlKCkKLSAgewotICAgIHJldHVybiBzdXBlci5nZXRNZXNzYWdlKCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL2pzMi4wLmpqIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvanMyLjAuamoKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkZGQyNDQuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvanMyLjAuamoKKysrIC9kZXYvbnVsbApAQCAtMSw0ODM5ICswLDAgQEAKLS8qDQotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKiANCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICogDQotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQotLypAYmdlbihqanRyZWUpIEdlbmVyYXRlZCBCeTpKSlRyZWU6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gLlxqczIuMC5qaiAqLw0KLS8qQGVnZW4qL29wdGlvbnMgew0KLSAgICBTVEFUSUM9ZmFsc2U7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KLSAgICBERUJVR19UT0tFTl9NQU5BR0VSPWZhbHNlOw0KLSAgICBERUJVR19QQVJTRVI9ZmFsc2U7DQotfQ0KLQ0KLVBBUlNFUl9CRUdJTihKU1BhcnNlcjIwKQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LmphdmFzY3JpcHQyMHBhcnNlcjsNCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsNCi1wdWJsaWMgY2xhc3MgSlNQYXJzZXIyMC8qQGJnZW4oamp0cmVlKSovaW1wbGVtZW50cyBKU1BhcnNlcjIwVHJlZUNvbnN0YW50cy8qQGVnZW4qLyANCi17LypAYmdlbihqanRyZWUpKi8NCi0gIHByb3RlY3RlZCBKSlRKU1BhcnNlcjIwU3RhdGUgamp0cmVlID0gbmV3IEpKVEpTUGFyc2VyMjBTdGF0ZSgpOw0KLQ0KLS8qQGVnZW4qLw0KLSAgICAvLw0KLSAgICAvLyBUaGlzIGlzIHRoZSByb290IG5vZGUgZm9yIHRoZSBwYXJzZSB0cmVlIChyb290IERPTSBub2RlLCB0cmVlIG9mIFNpbXBsZU5vZGUocykpDQotICAgIC8vDQotICAgIHByb3RlY3RlZCBBU1RQcm9ncmFtIF9qanRSb290Ow0KLSAgICANCi0gICAgcHVibGljIEFTVFByb2dyYW0gZ2V0Um9vdE5vZGUoKQ0KLSAgICB7DQotICAgIAlyZXR1cm4gX2pqdFJvb3Q7DQotICAgIH0NCi0gICAgDQotfQ0KLQ0KLVBBUlNFUl9FTkQoSlNQYXJzZXIyMCkNCi0NCi0NCi0NCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KLS8vIExFWElDQUwgUlVMRVMgU2VjdGlvbg0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQotVE9LRU5fTUdSX0RFQ0xTIDoNCi17DQotICAgIHByaXZhdGUgYm9vbGVhbiBpc1JlZ1ZhbGlkID0gdHJ1ZTsNCi0gICAgcHVibGljIHZvaWQgc2V0UmVnSW52YWxpZCgpDQotICAgIHsNCi0gICAgICAgIGlzUmVnVmFsaWQgPSBmYWxzZTsNCi0gICAgfQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRSZWdWYWxpZCgpDQotICAgIHsNCi0gICAgICAgIGlzUmVnVmFsaWQgPSB0cnVlOw0KLSAgICB9DQotfQ0KLQ0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQotLy8gV0hJVEUgU1BBQ0UgDQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCi1TUEVDSUFMX1RPS0VOIDoNCi17DQotICAgICAgICA8RU9MOiAgIChbIlxuIiwiXHIiXSkrID4NCi0gICAgfCAgIDxXUzogICAgKFsiICIsIlx0Il0pKyA+DQotfQ0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQotLy8gQ09NTUVOVFMgDQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCi1NT1JFIDoNCi17DQotICAgICAgICAiLy8iIDogSU5fU0lOR0xFX0xJTkVfQ09NTUVOVA0KLSAgICB8ICAgIi8qIiA6IElOX01VTFRJX0xJTkVfQ09NTUVOVA0KLX0NCi0NCi08SU5fU0lOR0xFX0xJTkVfQ09NTUVOVD4NCi1TUEVDSUFMX1RPS0VOIDoNCi17DQotICAgICAgICA8IFNJTkdMRV9MSU5FX0NPTU1FTlQ6ICh+WyJcbiIsIlxyIl0pKiAoIlxuInwiXHIifCJcclxuIik/ID4gIDogREVGQVVMVA0KLX0NCi0NCi08SU5fTVVMVElfTElORV9DT01NRU5UPg0KLVNQRUNJQUxfVE9LRU4gOg0KLXsNCi0gICAgICAgIDxNVUxUSV9MSU5FX0NPTU1FTlQ6ICIqLyIgPiA6IERFRkFVTFQNCi19DQotDQotPElOX1NJTkdMRV9MSU5FX0NPTU1FTlQsIElOX01VTFRJX0xJTkVfQ09NTUVOVD4NCi1NT1JFIDoNCi17DQotICAgICAgICA8IH5bXSA+DQotfQ0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQotLy8gUkVTRVJWRUQgV09SRFMgQU5EIExJVEVSQUxTDQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCi1UT0tFTiA6DQotew0KLSAgICAgICAgPCBBUzogICAgICAgICAgICJhcyIgICAgICAgICA+DQotICAgIHwgICA8IEJSRUFLOiAgICAgICAgImJyZWFrIiAgICAgID4NCi0gICAgfCAgIDwgQ0FTRTogICAgICAgICAiY2FzZSIgICAgICAgPg0KLSAgICB8ICAgPCBDQVRDSDogICAgICAgICJjYXRjaCIgICAgICA+DQotICAgIHwgICA8IENMQVNTOiAgICAgICAgImNsYXNzIiAgICAgID4NCi0gICAgfCAgIDwgQ09OU1Q6ICAgICAgICAiY29uc3QiICAgICAgPg0KLSAgICB8ICAgPCBDT05USU5VRTogICAgICJjb250aW51ZSIgICA+DQotICAgIHwgICA8IF9ERUZBVUxUOiAgICAgImRlZmF1bHQiICAgID4NCi0gICAgfCAgIDwgREVMRVRFOiAgICAgICAiZGVsZXRlIiAgICAgPg0KLSAgICB8ICAgPCBETzogICAgICAgICAgICJkbyIgICAgICAgICA+DQotICAgIHwgICA8IEVMU0U6ICAgICAgICAgImVsc2UiICAgICAgID4NCi0gICAgfCAgIDwgRVhURU5EUzogICAgICAiZXh0ZW5kcyIgICAgPg0KLSAgICB8ICAgPCBGQUxTRTogICAgICAgICJmYWxzZSIgICAgICA+ICAgDQotICAgIHwgICA8IEZJTkFMTFk6ICAgICAgImZpbmFsbHkiICAgID4NCi0gICAgfCAgIDwgRk9SOiAgICAgICAgICAiZm9yIiAgICAgICAgPg0KLSAgICB8ICAgPCBGVU5DVElPTjogICAgICJmdW5jdGlvbiIgICA+DQotICAgIHwgICA8IEZVTkNUSU9OXzogICAgIkZ1bmN0aW9uIiAgID4NCi0gICAgfCAgIDwgR0VUOiAgICAgICAgICAiZ2V0IiAgICAgICAgPg0KLSAgICB8ICAgPCBJRjogICAgICAgICAgICJpZiIgICAgICAgICA+DQotICAgIHwgICA8IElOOiAgICAgICAgICAgImluIiAgICAgICAgID4NCi0gICAgfCAgIDwgSU5DTFVERTogICAgICAiaW5jbHVkZSIgICAgPg0KLSAgICB8ICAgPCBJTlNUQU5DRU9GOiAgICJpbnN0YW5jZW9mIiA+DQotICAgIHwgICA8IElTOiAgICAgICAgICAgImlzIiAgICAgICAgID4NCi0gICAgfCAgIDwgTkFNRVNQQUNFOiAgICAibmFtZXNwYWNlIiAgPg0KLSAgICB8ICAgPCBORVc6ICAgICAgICAgICJuZXciICAgICAgICA+DQotICAgIHwgICA8IE5VTEw6ICAgICAgICAgIm51bGwiICAgICAgID4gICAgDQotICAgIHwgICA8IFBBQ0tBR0U6ICAgICAgInBhY2thZ2UiICAgID4gDQotICAgIHwgICA8IFBSSVZBVEU6ICAgICAgInByaXZhdGUiICAgID4NCi0gICAgfCAgIDwgUFVCTElDOiAgICAgICAicHVibGljIiAgICAgPg0KLSAgICB8ICAgPCBSRVRVUk46ICAgICAgICJyZXR1cm4iICAgICA+DQotICAgIHwgICA8IFNFVDogICAgICAgICAgInNldCIgICAgICAgID4NCi0gICAgfCAgIDwgU1VQRVI6ICAgICAgICAic3VwZXIiICAgICAgPg0KLSAgICB8ICAgPCBTV0lUQ0g6ICAgICAgICJzd2l0Y2giICAgICA+DQotICAgIHwgICA8IFRISVM6ICAgICAgICAgInRoaXMiICAgICAgID4NCi0gICAgfCAgIDwgVEhST1c6ICAgICAgICAidGhyb3ciICAgICAgPg0KLSAgICB8ICAgPCBUUlVFOiAgICAgICAgICJ0cnVlIiAgICAgICA+IA0KLSAgICB8ICAgPCBUUlk6ICAgICAgICAgICJ0cnkiICAgICAgICA+DQotICAgIHwgICA8IFRZUEVPRjogICAgICAgInR5cGVvZiIgICAgID4NCi0gICAgfCAgIDwgVVNFOiAgICAgICAgICAidXNlIiAgICAgICAgPg0KLSAgICB8ICAgPCBWQVI6ICAgICAgICAgICJ2YXIiICAgICAgICA+DQotICAgIHwgICA8IFZPSUQ6ICAgICAgICAgInZvaWQiICAgICAgID4NCi0gICAgfCAgIDwgV0hJTEU6ICAgICAgICAid2hpbGUiICAgICAgPg0KLSAgICB8ICAgPCBXSVRIOiAgICAgICAgICJ3aXRoIiAgICAgICA+DQotfQ0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQotLy8gRlVUVVJFIFJFU0VSVkVEIFdPUkRTDQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCi1UT0tFTiA6DQotew0KLSAgICAgICAgPCBBQlNUUkFDVDogICAgICJhYnN0cmFjdCIgICAgID4NCi0gICAgfCAgIDwgREVCVUdHRVI6ICAgICAiZGVidWdnZXIiICAgICA+DQotICAgIHwgICA8IEVOVU06ICAgICAgICAgImVudW0iICAgICAgICAgPg0KLSAgICB8ICAgPCBFWFBPUlQ6ICAgICAgICJleHBvcnQiICAgICAgID4NCi0gICAgfCAgIDwgR09UTzogICAgICAgICAiZ290byIgICAgICAgICA+DQotICAgIHwgICA8IElNUExFTUVOVFM6ICAgImltcGxlbWVudHMiICAgPg0KLSAgICB8ICAgPCBJTlRFUkZBQ0U6ICAgICJpbnRlcmZhY2UiICAgID4NCi0gICAgfCAgIDwgTkFUSVZFOiAgICAgICAibmF0aXZlIiAgICAgICA+DQotICAgIHwgICA8IFBST1RFQ1RFRDogICAgInByb3RlY3RlZCIgICAgPg0KLSAgICB8ICAgPCBTWU5DSFJPTklaRUQ6ICJzeW5jaHJvbml6ZWQiID4NCi0gICAgfCAgIDwgVEhST1dTOiAgICAgICAidGhyb3dzIiAgICAgICA+DQotICAgIHwgICA8IFRSQU5TSUVOVDogICAgInRyYW5zaWVudCIgICAgPg0KLSAgICB8ICAgPCBWT0xBVElMRTogICAgICJ2b2xhdGlsZSIgICAgID4NCi0gICAgfCAgIDwgSU1QT1JUOiAgICAgICAiaW1wb3J0IiAgICAgICA+DQotfQ0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQotLy8gTElURVJBTFMgDQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCi1UT0tFTiA6DQotew0KLSAgICAgICAgPCBERUNJTUFMX0xJVEVSQUw6IFsiMSItIjkiXSAoWyIwIi0iOSJdKSogPg0KLSAgICB8ICAgPCBIRVhfTElURVJBTDogIjAiIFsieCIsIlgiXSAoWyIwIi0iOSIsImEiLSJmIiwiQSItIkYiXSkrID4NCi0gICAgfCAgIDwgT0NUQUxfTElURVJBTDogIjAiIChbIjAiLSI3Il0pKiA+DQotICAgIHwgICA8IEZMT0FUSU5HX1BPSU5UX0xJVEVSQUw6IChbIjAiLSI5Il0pKyAiLiIgKFsiMCItIjkiXSkqICg8RVhQT05FTlQ+KT8gDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgIi4iIChbIjAiLSI5Il0pKyAoPEVYUE9ORU5UPik/IA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIChbIjAiLSI5Il0pKyAoPEVYUE9ORU5UPik/IA0KLSAgICAgICAgPg0KLSAgICB8ICAgPCAjRVhQT05FTlQ6IFsiZSIsIkUiXSAoWyIrIiwiLSJdKT8gKFsiMCItIjkiXSkrID4NCi0gICAgfCAgIDwgU1RSSU5HX0xJVEVSQUw6ICAgIlwiIiAgDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICggKH5bIlwiIiwiXFwiLCJcbiIsIlxyIl0pIHwgPEVTQ0FQRV9TRVFVRU5DRT4gKSogDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcIiINCi0gICAgICAgICAgICAgICAgICAgICAgICB8ICAgIlwiIiANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKCAoflsiXCIiLCJcXCJdKSB8ICJcXCIgKCJcbiIgfCAiXHIiIHwgIlxyXG4iKSB8IDxFU0NBUEVfU0VRVUVOQ0U+ICkqIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXCIiICANCi0gICAgICAgICAgICAgICAgICAgICAgICB8ICAgIiciDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICggKH5bIiciLCJcXCIsIlxuIiwiXHIiXSkgfCA8RVNDQVBFX1NFUVVFTkNFPiApKg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJyINCi0gICAgICAgID4NCi0gICAgfCAgIDwgI0VTQ0FQRV9TRVFVRU5DRTogDQotICAgICAgICAgICAgIlxcIg0KLSAgICAgICAgICAgICggICAgICAgWyJuIiwidCIsImIiLCJyIiwiZiIsIlxcIiwiJyIsIlwiIiwiWyIsIl0iXQ0KLSAgICAgICAgICAgICAgICB8ICAgWyIwIi0iNyJdICggWyIwIi0iNyJdICk/DQotICAgICAgICAgICAgICAgIHwgICBbIjAiLSIzIl0gWyIwIi0iNyJdIFsiMCItIjciXQ0KLSAgICAgICAgICAgICAgICB8ICAgWyJ4Il0gWyIwIi0iOSIsImEiLSJmIiwiQSItIkYiXSBbIjAiLSI5IiwiYSItImYiLCJBIi0iRiJdDQotICAgICAgICAgICAgICAgIHwgICBbInUiXSBbIjAiLSI5IiwiYSItImYiLCJBIi0iRiJdIFsiMCItIjkiLCJhIi0iZiIsIkEiLSJGIl0gDQotICAgICAgICAgICAgICAgICAgICAgICAgICBbIjAiLSI5IiwiYSItImYiLCJBIi0iRiJdIFsiMCItIjkiLCJhIi0iZiIsIkEiLSJGIl0NCi0gICAgICAgICAgICApDQotICAgICAgICA+DQotICAgIHwgICA8IFVOVEVSTUlOQVRFRF9TVFJJTkdfTElURVJBTDoNCi0gICAgICAgICAgICAgICAgIlwiIiAoICh+WyJcIiIsIlxcIiwiXG4iLCJcciJdKSB8IDxFU0NBUEVfU0VRVUVOQ0U+ICkqICggWyJcbiIsIlxyIl0gKT8NCi0gICAgICAgICAgICB8ICAgIiciICAoICh+WyInIiwiXFwiLCJcbiIsIlxyIl0pICB8IDxFU0NBUEVfU0VRVUVOQ0U+ICkqICggWyJcbiIsIlxyIl0gKT8NCi0gICAgICAgID4NCi19DQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCi0vLyBSRUdVTEFSIEVYUFJFU1NJT05TIA0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQotVE9LRU4gOg0KLXsgDQotICAgICAgICA8ICNSRUdYX1NUQVJUX0NIQVIgOiB+WyJcciIsIlxuIiwiLyIsIj0iLCIqIl0gfCAiXFwvIj4NCi0gICAgfCAgIDwgI1JFR1hfQk9EWV9DSEFSX0VYQ0xVU0lPTiA6IH5bIlxyIiwiXG4iLCIvIl0gPiAgDQotICAgIHwgICA8ICNSRUdYX0JPRFlfQ0hBUiA6ICggPFJFR1hfQk9EWV9DSEFSX0VYQ0xVU0lPTj4gfCAiXFwvIiApID4NCi0gICAgfCAgIDwgI1JFR0VYX0VORF9DSEFSIDogICAgICJpIiANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICJnIiANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICJtIiANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICJpZyIgDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAiaW0iIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgImdpIiANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICJnbSIgDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAibWkiIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgIm1nIiANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICJpZ20iIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgImltZyIgDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAiZ21pIiANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICJnaW0iIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgIm1pZyIgDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAibWdpIiANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgDQotICAgICAgICA+DQotfQ0KLQ0KLVRPS0VOIDoNCi17DQotICAgICAgICA8UkVHVUxBUl9FWFBSRVNTSU9OIDogIi8iIDxSRUdYX1NUQVJUX0NIQVI+ICg8UkVHWF9CT0RZX0NIQVI+KSogIi8iICAoPFJFR0VYX0VORF9DSEFSPik/ID4NCi0gICAgICAgIHsNCi0gICAgICAgICAgIHRyeSB7DQotICAgICAgICAgICAgICAgIC8vIFBlZWsgYXQgdGhlIG5leHQgY2hhcmFjdGVyLg0KLSAgICAgICAgICAgICAgICBjaGFyIG5leHRDaCA9IGlucHV0X3N0cmVhbS5yZWFkQ2hhcigpOw0KLSAgICAgICAgICAgICAgICBpbnB1dF9zdHJlYW0uYmFja3VwKDEpOw0KLSAgICAgICAgICAgICAgICBpZiAoaXNSZWdWYWxpZCA9PSBmYWxzZSB8fCBuZXh0Q2ggPT0gJy8nIHx8IG5leHRDaCA9PSAnKicpIHsNCi0gICAgICAgICAgICAgICAgICAgIC8vDQotICAgICAgICAgICAgICAgICAgICAvLyBMZXhlY2FsIGFuYWx5c2VyIHRoaW5rcyBpdCBpcyBhIFJFDQotICAgICAgICAgICAgICAgICAgICAvLyBvcGVyYXRvciBzdWNoIGFzIC8uLi4uLi8NCi0gICAgICAgICAgICAgICAgICAgIC8vIFB1dCB0aGUgZXZlcnl0aGluZyB0byB0aGUgZmlyc3QgIi8iIGJhY2sgb24gdGhlIGlucHV0IHN0cmVhbQ0KLSAgICAgICAgICAgICAgICAgICAgLy8NCi0gICAgICAgICAgICAgICAgICAgIGlucHV0X3N0cmVhbS5iYWNrdXAobGVuZ3RoT2ZNYXRjaC0xKTsNCi0gICAgICAgICAgICAgICAgICAgIC8vDQotICAgICAgICAgICAgICAgICAgICAvLyBBbmQgcmVtb3ZlIGl0IGZyb20gdGhlIHRva2VuDQotICAgICAgICAgICAgICAgICAgICAvLw0KLSAgICAgICAgICAgICAgICAgICAgbWF0Y2hlZFRva2VuLmltYWdlID0gbWF0Y2hlZFRva2VuLmltYWdlLnN1YnN0cmluZygwLCAxKTsNCi0gICAgICAgICAgICAgICAgICAgIGltYWdlLmRlbGV0ZSgwLCBpbWFnZS5sZW5ndGgoKSAtIDEpOw0KLSAgICAgICAgICAgICAgICAgICAgaW1hZ2UuYXBwZW5kKCcvJyk7DQotICAgICAgICAgICAgICAgICAgICBtYXRjaGVkVG9rZW4ua2luZD1TTEFTSDsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihlLnRvU3RyaW5nKCkpOw0KLSAgICAgICAgICAgICAgIH0NCi0gICAgICAgfSAgICAgICAgDQotICAgICAgICANCi19DQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCi0vLyBJREVOVElGSUVSUyANCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KLVRPS0VOIDoNCi17DQotICAgICAgICA8IElERU5USUZJRVI6IDxMRVRURVI+ICg8TEVUVEVSPnw8RElHSVQ+KSogPg0KLSAgICB8ICAgPCAjTEVUVEVSOiBbImEiLSJ6IiwiQSItIloiLCIkIiwiXyJdID4NCi0gICAgfCAgIDwgI0RJR0lUOiBbIjAiLSI5Il0+DQotfQ0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQotLy8gU0VQQVJBVE9SUyANCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KLVRPS0VOIDoNCi17DQotICAgICAgICA8IExQQVJFTjogICAgIigiICAgPg0KLSAgICB8ICAgPCBSUEFSRU46ICAgICIpIiAgID4NCi0gICAgfCAgIDwgTEJSQUNFOiAgICAieyIgICA+DQotICAgIHwgICA8IFJCUkFDRTogICAgIn0iICAgPg0KLSAgICB8ICAgPCBMQlJBQ0tFVDogICJbIiAgID4NCi0gICAgfCAgIDwgUkJSQUNLRVQ6ICAiXSIgICA+DQotICAgIHwgICA8IFNFTUlDT0xPTjogIjsiICAgPg0KLSAgICB8ICAgPCBDT01NQTogICAgICIsIiAgID4NCi0gICAgfCAgIDwgRE9UOiAgICAgICAiLiIgICA+DQotICAgIHwgICA8IFFVQUxJRklFUjogIjo6IiAgPg0KLSAgICB8ICAgPCBFTElQU0U6ICAgICIuLi4iID4NCi19DQotDQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCi0vLyBPUEVSQVRPUlMgDQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCi1UT0tFTiA6DQotew0KLSAgICAgICAgPCBBU1NJR046ICAgICAgICAgICAgICAgIj0iICAgID4NCi0gICAgfCAgIDwgR1Q6ICAgICAgICAgICAgICAgICAgICI+IiAgICA+DQotICAgIHwgICA8IExUOiAgICAgICAgICAgICAgICAgICAiPCIgICAgPg0KLSAgICB8ICAgPCBCQU5HOiAgICAgICAgICAgICAgICAgIiEiICAgID4NCi0gICAgfCAgIDwgVElMREU6ICAgICAgICAgICAgICAgICJ+IiAgICA+DQotICAgIHwgICA8IEhPT0s6ICAgICAgICAgICAgICAgICAiPyIgICAgPg0KLSAgICB8ICAgPCBDT0xPTjogICAgICAgICAgICAgICAgIjoiICAgID4NCi0gICAgfCAgIDwgRVE6ICAgICAgICAgICAgICAgICAgICI9PSIgICA+DQotICAgIHwgICA8IExFOiAgICAgICAgICAgICAgICAgICAiPD0iICAgPg0KLSAgICB8ICAgPCBHRTogICAgICAgICAgICAgICAgICAgIj49IiAgID4NCi0gICAgfCAgIDwgTkU6ICAgICAgICAgICAgICAgICAgICIhPSIgICA+DQotICAgIHwgICA8IFNDX09SOiAgICAgICAgICAgICAgICAifHwiICAgPg0KLSAgICB8ICAgPCBTQ19BTkQ6ICAgICAgICAgICAgICAgIiYmIiAgID4NCi0gICAgfCAgIDwgU0NfWE9SOiAgICAgICAgICAgICAgICJeXiIgICA+DQotICAgIHwgICA8IElOQ1I6ICAgICAgICAgICAgICAgICAiKysiICAgPg0KLSAgICB8ICAgPCBERUNSOiAgICAgICAgICAgICAgICAgIi0tIiAgID4NCi0gICAgfCAgIDwgUExVUzogICAgICAgICAgICAgICAgICIrIiAgICA+DQotICAgIHwgICA8IE1JTlVTOiAgICAgICAgICAgICAgICAiLSIgICAgPg0KLSAgICB8ICAgPCBTVEFSOiAgICAgICAgICAgICAgICAgIioiICAgID4NCi0gICAgfCAgIDwgU0xBU0g6ICAgICAgICAgICAgICAgICIvIiAgICA+DQotICAgIHwgICA8IEJJVF9BTkQ6ICAgICAgICAgICAgICAiJiIgICAgPg0KLSAgICB8ICAgPCBCSVRfT1I6ICAgICAgICAgICAgICAgInwiICAgID4NCi0gICAgfCAgIDwgWE9SOiAgICAgICAgICAgICAgICAgICJeIiAgICA+DQotICAgIHwgICA8IFJFTTogICAgICAgICAgICAgICAgICAiJSIgICAgPg0KLSAgICB8ICAgPCBMU0hJRlQ6ICAgICAgICAgICAgICAgIjw8IiAgID4NCi0gICAgfCAgIDwgUlNJR05FRFNISUZUOiAgICAgICAgICI+PiIgICA+DQotICAgIHwgICA8IFJVTlNJR05FRFNISUZUOiAgICAgICAiPj4+IiAgPg0KLSAgICB8ICAgPCBQTFVTQVNTSUdOOiAgICAgICAgICAgIis9IiAgID4NCi0gICAgfCAgIDwgTUlOVVNBU1NJR046ICAgICAgICAgICItPSIgICA+DQotICAgIHwgICA8IFNUQVJBU1NJR046ICAgICAgICAgICAiKj0iICAgPg0KLSAgICB8ICAgPCBTTEFTSEFTU0lHTjogICAgICAgICAgIi89IiAgID4NCi0gICAgfCAgIDwgQU5EQVNTSUdOOiAgICAgICAgICAgICImPSIgICA+DQotICAgIHwgICA8IE9SQVNTSUdOOiAgICAgICAgICAgICAifD0iICAgPg0KLSAgICB8ICAgPCBYT1JBU1NJR046ICAgICAgICAgICAgIl49IiAgID4NCi0gICAgfCAgIDwgUkVNQVNTSUdOOiAgICAgICAgICAgICIlPSIgICA+DQotICAgIHwgICA8IExTSElGVEFTU0lHTjogICAgICAgICAiPDw9IiAgPg0KLSAgICB8ICAgPCBSU0lHTkVEU0hJRlRBU1NJR046ICAgIj4+PSIgID4NCi0gICAgfCAgIDwgUlVOU0lHTkVEU0hJRlRBU1NJR046ICI+Pj49IiA+DQotICAgIHwgICA8IFNDX09SQVNTSUdOOiAgICAgICAgICAifHw9IiAgPg0KLSAgICB8ICAgPCBTQ19BTkRBU1NJR046ICAgICAgICAgIiYmPSIgID4NCi0gICAgfCAgIDwgU0NfWE9SQVNTSUdOOiAgICAgICAgICJeXj0iICA+DQotICAgIHwgICA8IElERU5USVRZT1BFUjogICAgICAgICAiPT09IiAgPg0KLSAgICB8ICAgPCBOT1RJREVOVElUWU9QRVI6ICAgICAgIiE9PSIgID4NCi19DQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KLS8vIEdSQU1NQVIgU2VjdGlvbg0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCi0NCi1Ub2tlbiBQcm9ncmFtKCk6DQotey8qQGJnZW4oamp0cmVlKSBQcm9ncmFtICovDQotICAgICAgICBBU1RQcm9ncmFtIGpqdG4wMDAgPSBuZXcgQVNUUHJvZ3JhbSh0aGlzLCBKSlRQUk9HUkFNKTsNCi0gICAgICAgIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7DQotICAgICAgICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0vKkBlZ2VuKi8NCi0gICAgICAgIFRva2VuIHJldHZhbCA9IGdldFRva2VuKDEpOw0KLX0NCi17LypAYmdlbihqanRyZWUpIFByb2dyYW0gKi8NCi0gICAgICAgIHRyeSB7DQotLypAZWdlbiovDQotICAgICAgICAoUGFja2FnZURlZmluaXRpb24oKSkqIFtEaXJlY3RpdmVzKCldIDxFT0Y+LypAYmdlbihqanRyZWUpKi8NCi0gICAgICAgIHsNCi0gICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOw0KLSAgICAgICAgICBqanRjMDAwID0gZmFsc2U7DQotICAgICAgICB9DQotLypAZWdlbiovDQotICAgICAgICB7DQotICAgICAgICAgICAgX2pqdFJvb3QgPSBqanRuMDAwOw0KLSAgICAgICAgICAgIHJldHVybiByZXR2YWw7DQotICAgICAgICB9LypAYmdlbihqanRyZWUpKi8NCi0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsNCi0gICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIHRocm93IChFcnJvcilqanRlMDAwOw0KLSAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0vKkBlZ2VuKi8NCi19DQotDQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCi0vLyBFeHByZXNzaW9ucyANCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KLQ0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQotLy8gSWRlbnRpZmllciANCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KLXZvaWQgSWRlbnRpZmllcigpOg0KLXsvKkBiZ2VuKGpqdHJlZSkgSWRlbnRpZmllciAqLw0KLSAgQVNUSWRlbnRpZmllciBqanRuMDAwID0gbmV3IEFTVElkZW50aWZpZXIodGhpcywgSkpUSURFTlRJRklFUik7DQotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOw0KLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotLypAZWdlbiovfQ0KLXsvKkBiZ2VuKGpqdHJlZSkgSWRlbnRpZmllciAqLw0KLSAgICAgICAgdHJ5IHsNCi0vKkBlZ2VuKi8NCi0gICAgICAgIDxJREVOVElGSUVSPg0KLSAgICB8ICAgPEdFVD4NCi0gICAgfCAgIDxTRVQ+DQotICAgIHwgICA8SU5DTFVERT4vKkBiZ2VuKGpqdHJlZSkqLw0KLSAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0vKkBlZ2VuKi8NCi0vLyAgICB8ICAgPE5BTUVTUEFDRT4NCi19DQotDQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCi0vLyBRdWFsaWZpZWQgSWRlbnRpZmllciANCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KLXZvaWQgU2ltcGxlUXVhbGlmaWVkSWRlbnRpZmllcigpOg0KLXsvKkBiZ2VuKGpqdHJlZSkgU2ltcGxlUXVhbGlmaWVkSWRlbnRpZmllciAqLw0KLSAgQVNUU2ltcGxlUXVhbGlmaWVkSWRlbnRpZmllciBqanRuMDAwID0gbmV3IEFTVFNpbXBsZVF1YWxpZmllZElkZW50aWZpZXIodGhpcywgSkpUU0lNUExFUVVBTElGSUVESURFTlRJRklFUik7DQotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOw0KLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotLypAZWdlbiovfQ0KLXsvKkBiZ2VuKGpqdHJlZSkgU2ltcGxlUXVhbGlmaWVkSWRlbnRpZmllciAqLw0KLSAgICAgICB0cnkgew0KLS8qQGVnZW4qLw0KLSAgICAgICBJZGVudGlmaWVyKCkgWzxRVUFMSUZJRVI+IElkZW50aWZpZXIoKV0NCi0gICAgfCAgUmVzZXJ2ZWROYW1lc3BhY2UoKSBbPFFVQUxJRklFUj4gSWRlbnRpZmllcigpXS8qQGJnZW4oamp0cmVlKSovDQotICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7DQotICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsNCi0gICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsNCi0gICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsNCi0gICAgICAgICB9DQotICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7DQotICAgICAgICAgICB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgIH0NCi0gICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7DQotICAgICAgICAgICB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICB9DQotICAgICAgICAgdGhyb3cgKEVycm9yKWpqdGUwMDA7DQotICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsNCi0gICAgICAgICB9DQotICAgICAgIH0NCi0vKkBlZ2VuKi8gDQotfQ0KLQ0KLXZvaWQgRXhwcmVzc2lvblF1YWxpZmllZElkZW50aWZpZXIoKToNCi17LypAYmdlbihqanRyZWUpIEV4cHJlc3Npb25RdWFsaWZpZWRJZGVudGlmaWVyICovDQotICBBU1RFeHByZXNzaW9uUXVhbGlmaWVkSWRlbnRpZmllciBqanRuMDAwID0gbmV3IEFTVEV4cHJlc3Npb25RdWFsaWZpZWRJZGVudGlmaWVyKHRoaXMsIEpKVEVYUFJFU1NJT05RVUFMSUZJRURJREVOVElGSUVSKTsNCi0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7DQotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0vKkBlZ2VuKi99DQotey8qQGJnZW4oamp0cmVlKSBFeHByZXNzaW9uUXVhbGlmaWVkSWRlbnRpZmllciAqLw0KLSAgICAgICB0cnkgew0KLS8qQGVnZW4qLw0KLSAgICAgICA8TFBBUkVOPiBBc3NpZ25tZW50RXhwcmVzc2lvbigpIDxSUEFSRU4+IDxRVUFMSUZJRVI+IElkZW50aWZpZXIoKS8qQGJnZW4oamp0cmVlKSovDQotICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7DQotICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsNCi0gICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsNCi0gICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsNCi0gICAgICAgICB9DQotICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7DQotICAgICAgICAgICB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgIH0NCi0gICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7DQotICAgICAgICAgICB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICB9DQotICAgICAgICAgdGhyb3cgKEVycm9yKWpqdGUwMDA7DQotICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsNCi0gICAgICAgICB9DQotICAgICAgIH0NCi0vKkBlZ2VuKi8NCi19DQotDQotdm9pZCBRdWFsaWZpZWRJZGVudGlmaWVyKCk6DQotey8qQGJnZW4oamp0cmVlKSBRdWFsaWZpZWRJZGVudGlmaWVyICovDQotICBBU1RRdWFsaWZpZWRJZGVudGlmaWVyIGpqdG4wMDAgPSBuZXcgQVNUUXVhbGlmaWVkSWRlbnRpZmllcih0aGlzLCBKSlRRVUFMSUZJRURJREVOVElGSUVSKTsNCi0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7DQotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0vKkBlZ2VuKi99DQotey8qQGJnZW4oamp0cmVlKSBRdWFsaWZpZWRJZGVudGlmaWVyICovDQotICAgICAgIHRyeSB7DQotLypAZWdlbiovDQotICAgICAgIFNpbXBsZVF1YWxpZmllZElkZW50aWZpZXIoKQ0KLSAgICB8ICBFeHByZXNzaW9uUXVhbGlmaWVkSWRlbnRpZmllcigpLypAYmdlbihqanRyZWUpKi8NCi0gICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsNCi0gICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOw0KLSAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOw0KLSAgICAgICAgIH0NCi0gICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsNCi0gICAgICAgICAgIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgfQ0KLSAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsNCi0gICAgICAgICAgIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgIH0NCi0gICAgICAgICB0aHJvdyAoRXJyb3Ipamp0ZTAwMDsNCi0gICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOw0KLSAgICAgICAgIH0NCi0gICAgICAgfQ0KLS8qQGVnZW4qLw0KLX0NCi0NCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KLS8vIFByaW1hcnkgRXhwcmVzc2lvbnMNCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KLXZvaWQgUHJpbWFyeUV4cHJlc3Npb24gKCk6DQotey8qQGJnZW4oamp0cmVlKSBQcmltYXJ5RXhwcmVzc2lvbiAqLw0KLSAgQVNUUHJpbWFyeUV4cHJlc3Npb24gamp0bjAwMCA9IG5ldyBBU1RQcmltYXJ5RXhwcmVzc2lvbih0aGlzLCBKSlRQUklNQVJZRVhQUkVTU0lPTik7DQotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOw0KLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotLypAZWdlbiovfQ0KLXsvKkBiZ2VuKGpqdHJlZSkgUHJpbWFyeUV4cHJlc3Npb24gKi8NCi0gICAgdHJ5IHsNCi0vKkBlZ2VuKi8NCi0gICAgKA0KLSAgICAgICAgPE5VTEw+DQotICAgIHwgICA8VFJVRT4NCi0gICAgfCAgIDxGQUxTRT4NCi0gICAgfCAgIDxERUNJTUFMX0xJVEVSQUw+IA0KLSAgICB8ICAgPE9DVEFMX0xJVEVSQUw+DQotICAgIHwgICA8SEVYX0xJVEVSQUw+DQotICAgIHwgICA8RkxPQVRJTkdfUE9JTlRfTElURVJBTD4gDQotICAgIHwgICA8U1RSSU5HX0xJVEVSQUw+IA0KLSAgICB8ICAgPFRISVM+DQotICAgIHwgICA8UkVHVUxBUl9FWFBSRVNTSU9OPg0KLSAgICB8ICAgPExQQVJFTj4gTGlzdEV4cHJlc3Npb24oKSA8UlBBUkVOPg0KLSAgICB8ICAgQXJyYXlMaXRlcmFsKCkNCi0gICAgfCAgIE9iamVjdExpdGVyYWwoKQ0KLSAgICB8ICAgRnVuY3Rpb25FeHByZXNzaW9uKCkNCi0gICAgKS8qQGJnZW4oamp0cmVlKSovDQotICAgIHsNCi0gICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7DQotICAgICAgamp0YzAwMCA9IGZhbHNlOw0KLSAgICB9DQotLypAZWdlbiovDQotICAgIHsNCi0gICAgICAgIHRva2VuX3NvdXJjZS5zZXRSZWdWYWxpZCgpOw0KLSAgICB9LypAYmdlbihqanRyZWUpKi8NCi0gICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsNCi0gICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgICAgamp0YzAwMCA9IGZhbHNlOw0KLSAgICAgIH0gZWxzZSB7DQotICAgICAgICBqanRyZWUucG9wTm9kZSgpOw0KLSAgICAgIH0NCi0gICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsNCi0gICAgICAgIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgfQ0KLSAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsNCi0gICAgICAgIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgIH0NCi0gICAgICB0aHJvdyAoRXJyb3Ipamp0ZTAwMDsNCi0gICAgfSBmaW5hbGx5IHsNCi0gICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOw0KLSAgICAgIH0NCi0gICAgfQ0KLS8qQGVnZW4qLw0KLX0NCi0NCi12b2lkIFJlc2VydmVkTmFtZXNwYWNlICgpOg0KLXsvKkBiZ2VuKGpqdHJlZSkgUmVzZXJ2ZWROYW1lc3BhY2UgKi8NCi0gIEFTVFJlc2VydmVkTmFtZXNwYWNlIGpqdG4wMDAgPSBuZXcgQVNUUmVzZXJ2ZWROYW1lc3BhY2UodGhpcywgSkpUUkVTRVJWRUROQU1FU1BBQ0UpOw0KLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsNCi0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOw0KLS8qQGVnZW4qL30NCi17LypAYmdlbihqanRyZWUpIFJlc2VydmVkTmFtZXNwYWNlICovDQotICAgICAgIHRyeSB7DQotLypAZWdlbiovDQotICAgICAgIDxQVUJMSUM+DQotICAgIHwgIDxQUk9URUNURUQ+DQotICAgIHwgIDxQUklWQVRFPi8qQGJnZW4oamp0cmVlKSovDQotICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsNCi0gICAgICAgICB9DQotICAgICAgIH0NCi0vKkBlZ2VuKi8NCi19DQotDQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCi0vLyBGdW5jdGlvbiBFeHByZXNzaW9uDQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCi12b2lkICBGdW5jdGlvbkV4cHJlc3Npb24gKCk6DQotey8qQGJnZW4oamp0cmVlKSBGdW5jdGlvbkV4cHJlc3Npb24gKi8NCi0gIEFTVEZ1bmN0aW9uRXhwcmVzc2lvbiBqanRuMDAwID0gbmV3IEFTVEZ1bmN0aW9uRXhwcmVzc2lvbih0aGlzLCBKSlRGVU5DVElPTkVYUFJFU1NJT04pOw0KLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsNCi0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOw0KLS8qQGVnZW4qL30NCi17LypAYmdlbihqanRyZWUpIEZ1bmN0aW9uRXhwcmVzc2lvbiAqLw0KLSAgICAgICAgdHJ5IHsNCi0vKkBlZ2VuKi8NCi0gICAgICAgIExPT0tBSEVBRCgyKSA8RlVOQ1RJT04+IEZ1bmN0aW9uQ29tbW9uKCkNCi0gICAgfCAgICAgICAgICAgICAgICA8RlVOQ1RJT04+IElkZW50aWZpZXIoKSBGdW5jdGlvbkNvbW1vbigpLypAYmdlbihqanRyZWUpKi8NCi0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsNCi0gICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIHRocm93IChFcnJvcilqanRlMDAwOw0KLSAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0vKkBlZ2VuKi8NCi19DQotDQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCi0vLyBPYmplY3QgTGl0ZXJhbHMNCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KLXZvaWQgT2JqZWN0TGl0ZXJhbCAoKToNCi17LypAYmdlbihqanRyZWUpIE9iamVjdExpdGVyYWwgKi8NCi0gIEFTVE9iamVjdExpdGVyYWwgamp0bjAwMCA9IG5ldyBBU1RPYmplY3RMaXRlcmFsKHRoaXMsIEpKVE9CSkVDVExJVEVSQUwpOw0KLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsNCi0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOw0KLS8qQGVnZW4qL30NCi17LypAYmdlbihqanRyZWUpIE9iamVjdExpdGVyYWwgKi8NCi0gICAgICAgIHRyeSB7DQotLypAZWdlbiovDQotICAgICAgICA8TEJSQUNFPiBbRmllbGRMaXN0KCldIDxSQlJBQ0U+LypAYmdlbihqanRyZWUpKi8NCi0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsNCi0gICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIHRocm93IChFcnJvcilqanRlMDAwOw0KLSAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0vKkBlZ2VuKi8gIA0KLX0gICAgICAgIA0KLQ0KLXZvaWQgRmllbGRMaXN0KCk6DQotey8qQGJnZW4oamp0cmVlKSBGaWVsZExpc3QgKi8NCi0gIEFTVEZpZWxkTGlzdCBqanRuMDAwID0gbmV3IEFTVEZpZWxkTGlzdCh0aGlzLCBKSlRGSUVMRExJU1QpOw0KLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsNCi0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOw0KLS8qQGVnZW4qL30NCi17LypAYmdlbihqanRyZWUpIEZpZWxkTGlzdCAqLw0KLSAgICAgICAgdHJ5IHsNCi0vKkBlZ2VuKi8NCi0gICAgICAgIExpdGVyYWxGaWVsZCgpICg8Q09NTUE+IExpdGVyYWxGaWVsZCgpKSovKkBiZ2VuKGpqdHJlZSkqLw0KLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7DQotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOw0KLSAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgdGhyb3cgKEVycm9yKWpqdGUwMDA7DQotICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLS8qQGVnZW4qLw0KLX0NCi0NCi12b2lkIExpdGVyYWxGaWVsZCAoKToNCi17LypAYmdlbihqanRyZWUpIExpdGVyYWxGaWVsZCAqLw0KLSAgQVNUTGl0ZXJhbEZpZWxkIGpqdG4wMDAgPSBuZXcgQVNUTGl0ZXJhbEZpZWxkKHRoaXMsIEpKVExJVEVSQUxGSUVMRCk7DQotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOw0KLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotLypAZWdlbiovfQ0KLXsvKkBiZ2VuKGpqdHJlZSkgTGl0ZXJhbEZpZWxkICovDQotICAgICAgICB0cnkgew0KLS8qQGVnZW4qLw0KLSAgICAgICAgRmllbGROYW1lKCkgPENPTE9OPiBBc3NpZ25tZW50RXhwcmVzc2lvbigpLypAYmdlbihqanRyZWUpKi8NCi0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsNCi0gICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIHRocm93IChFcnJvcilqanRlMDAwOw0KLSAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0vKkBlZ2VuKi8NCi19DQotDQotdm9pZCBGaWVsZE5hbWUgKCk6DQotey8qQGJnZW4oamp0cmVlKSBGaWVsZE5hbWUgKi8NCi0gIEFTVEZpZWxkTmFtZSBqanRuMDAwID0gbmV3IEFTVEZpZWxkTmFtZSh0aGlzLCBKSlRGSUVMRE5BTUUpOw0KLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsNCi0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOw0KLS8qQGVnZW4qL30NCi17LypAYmdlbihqanRyZWUpIEZpZWxkTmFtZSAqLw0KLSAgICAgICAgdHJ5IHsNCi0vKkBlZ2VuKi8NCi0gICAgICAgIDxTVFJJTkdfTElURVJBTD4NCi0gICAgfCAgIDxERUNJTUFMX0xJVEVSQUw+DQotICAgIHwgICBTaW1wbGVRdWFsaWZpZWRJZGVudGlmaWVyKCkNCi0gICAgfCAgIDxMUEFSRU4+IEFzc2lnbm1lbnRFeHByZXNzaW9uKCkgPFJQQVJFTj4gWzxRVUFMSUZJRVI+IElkZW50aWZpZXIoKV0vKkBiZ2VuKGpqdHJlZSkqLw0KLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7DQotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOw0KLSAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgdGhyb3cgKEVycm9yKWpqdGUwMDA7DQotICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLS8qQGVnZW4qLw0KLX0JDQotDQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCi0vLyBBcnJheSBMaXRlcmFsDQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCi12b2lkIEFycmF5TGl0ZXJhbCgpOg0KLXsvKkBiZ2VuKGpqdHJlZSkgQXJyYXlMaXRlcmFsICovDQotICBBU1RBcnJheUxpdGVyYWwgamp0bjAwMCA9IG5ldyBBU1RBcnJheUxpdGVyYWwodGhpcywgSkpUQVJSQVlMSVRFUkFMKTsNCi0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7DQotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0vKkBlZ2VuKi99DQotey8qQGJnZW4oamp0cmVlKSBBcnJheUxpdGVyYWwgKi8NCi0gICAgICAgIHRyeSB7DQotLypAZWdlbiovDQotICAgICAgICA8TEJSQUNLRVQ+IFtFbGVtZW50TGlzdCgpXSA8UkJSQUNLRVQ+LypAYmdlbihqanRyZWUpKi8NCi0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsNCi0gICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIHRocm93IChFcnJvcilqanRlMDAwOw0KLSAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0vKkBlZ2VuKi8NCi19DQotDQotdm9pZCBFbGVtZW50TGlzdCgpOg0KLXsvKkBiZ2VuKGpqdHJlZSkgRWxlbWVudExpc3QgKi8NCi0gIEFTVEVsZW1lbnRMaXN0IGpqdG4wMDAgPSBuZXcgQVNURWxlbWVudExpc3QodGhpcywgSkpURUxFTUVOVExJU1QpOw0KLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsNCi0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOw0KLS8qQGVnZW4qL30NCi17LypAYmdlbihqanRyZWUpIEVsZW1lbnRMaXN0ICovDQotICAgICAgICB0cnkgew0KLS8qQGVnZW4qLw0KLSAgICAgICAgTGl0ZXJhbEVsZW1lbnQoKSAoPENPTU1BPiBMaXRlcmFsRWxlbWVudCgpKSovKkBiZ2VuKGpqdHJlZSkqLw0KLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7DQotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOw0KLSAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgdGhyb3cgKEVycm9yKWpqdGUwMDA7DQotICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLS8qQGVnZW4qLw0KLX0NCi0NCi12b2lkIExpdGVyYWxFbGVtZW50KCk6DQotey8qQGJnZW4oamp0cmVlKSBMaXRlcmFsRWxlbWVudCAqLw0KLSAgQVNUTGl0ZXJhbEVsZW1lbnQgamp0bjAwMCA9IG5ldyBBU1RMaXRlcmFsRWxlbWVudCh0aGlzLCBKSlRMSVRFUkFMRUxFTUVOVCk7DQotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOw0KLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotLypAZWdlbiovfQ0KLXsvKkBiZ2VuKGpqdHJlZSkgTGl0ZXJhbEVsZW1lbnQgKi8NCi0gICAgICAgIHRyeSB7DQotLypAZWdlbiovDQotICAgICAgICBBc3NpZ25tZW50RXhwcmVzc2lvbigpLypAYmdlbihqanRyZWUpKi8NCi0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsNCi0gICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIHRocm93IChFcnJvcilqanRlMDAwOw0KLSAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0vKkBlZ2VuKi8NCi19DQotDQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCi0vLyBTdXBlciBFeHByZXNzaW9uDQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCi12b2lkIFN1cGVyRXhwcmVzc2lvbiAoKToNCi17LypAYmdlbihqanRyZWUpIFN1cGVyRXhwcmVzc2lvbiAqLw0KLSAgQVNUU3VwZXJFeHByZXNzaW9uIGpqdG4wMDAgPSBuZXcgQVNUU3VwZXJFeHByZXNzaW9uKHRoaXMsIEpKVFNVUEVSRVhQUkVTU0lPTik7DQotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOw0KLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotLypAZWdlbiovfQ0KLXsvKkBiZ2VuKGpqdHJlZSkgU3VwZXJFeHByZXNzaW9uICovDQotICAgICAgICB0cnkgew0KLS8qQGVnZW4qLw0KLSAgICAgICAgPFNVUEVSPiBbTE9PS0FIRUFEKDIpIDxMUEFSRU4+IEFzc2lnbm1lbnRFeHByZXNzaW9uKCkgPFJQQVJFTj5dLypAYmdlbihqanRyZWUpKi8NCi0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsNCi0gICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIHRocm93IChFcnJvcilqanRlMDAwOw0KLSAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0vKkBlZ2VuKi8NCi19DQotDQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCi0vLyBQb3N0Zml4IEV4cHJlc3Npb24NCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KLXZvaWQgUG9zdGZpeEV4cHJlc3Npb24gKCk6DQotey8qQGJnZW4oamp0cmVlKSBQb3N0Zml4RXhwcmVzc2lvbiAqLw0KLSAgQVNUUG9zdGZpeEV4cHJlc3Npb24gamp0bjAwMCA9IG5ldyBBU1RQb3N0Zml4RXhwcmVzc2lvbih0aGlzLCBKSlRQT1NURklYRVhQUkVTU0lPTik7DQotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOw0KLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotLypAZWdlbiovfQ0KLXsvKkBiZ2VuKGpqdHJlZSkgUG9zdGZpeEV4cHJlc3Npb24gKi8NCi0gICAgICAgIHRyeSB7DQotLypAZWdlbiovDQotICAgICAgICBBdHRyaWJ1dGVFeHByZXNzaW9uICgpICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtQb3N0Zml4T3AoKV0NCi0gICAgfCAgIHt0b2tlbl9zb3VyY2Uuc2V0UmVnSW52YWxpZCgpO30gDQotICAgICAgICBGdWxsUG9zdGZpeEV4cHJlc3Npb24gKCkgKFByb3BlcnR5T3JBcmd1bWVudHMoKSkqIFtQb3N0Zml4T3AoKV0NCi0gICAgfCAgIFN1cGVyRXhwcmVzc2lvbigpICAgICAgICAgUHJvcGVydHlPcGVyYXRvcigpLypAYmdlbihqanRyZWUpKi8NCi0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsNCi0gICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIHRocm93IChFcnJvcilqanRlMDAwOw0KLSAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0vKkBlZ2VuKi8NCi19ICAgIA0KLQ0KLXZvaWQgQXR0cmlidXRlRXhwcmVzc2lvbiAoKToNCi17LypAYmdlbihqanRyZWUpIEF0dHJpYnV0ZUV4cHJlc3Npb24gKi8NCi0gIEFTVEF0dHJpYnV0ZUV4cHJlc3Npb24gamp0bjAwMCA9IG5ldyBBU1RBdHRyaWJ1dGVFeHByZXNzaW9uKHRoaXMsIEpKVEFUVFJJQlVURUVYUFJFU1NJT04pOw0KLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsNCi0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOw0KLS8qQGVnZW4qL30NCi17LypAYmdlbihqanRyZWUpIEF0dHJpYnV0ZUV4cHJlc3Npb24gKi8NCi0gICAgICAgIHRyeSB7DQotLypAZWdlbiovDQotICAgICAgICBTaW1wbGVRdWFsaWZpZWRJZGVudGlmaWVyKCkgIChQcm9wZXJ0eU9yQXJndW1lbnRzKCkpKi8qQGJnZW4oamp0cmVlKSovDQotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsNCi0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7DQotICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICB0aHJvdyAoRXJyb3Ipamp0ZTAwMDsNCi0gICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOw0KLSAgICAgICAgICB9DQotICAgICAgICB9DQotLypAZWdlbiovDQotfQ0KLQ0KLXZvaWQgRnVsbFBvc3RmaXhFeHByZXNzaW9uICgpOg0KLXsvKkBiZ2VuKGpqdHJlZSkgRnVsbFBvc3RmaXhFeHByZXNzaW9uICovDQotICBBU1RGdWxsUG9zdGZpeEV4cHJlc3Npb24gamp0bjAwMCA9IG5ldyBBU1RGdWxsUG9zdGZpeEV4cHJlc3Npb24odGhpcywgSkpURlVMTFBPU1RGSVhFWFBSRVNTSU9OKTsNCi0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7DQotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0vKkBlZ2VuKi99DQotey8qQGJnZW4oamp0cmVlKSBGdWxsUG9zdGZpeEV4cHJlc3Npb24gKi8NCi0gICAgICAgdHJ5IHsNCi0vKkBlZ2VuKi8NCi0gICAgICAgTE9PS0FIRUFEKDxMUEFSRU4+IEFzc2lnbm1lbnRFeHByZXNzaW9uKCkgPFJQQVJFTj4gPFFVQUxJRklFUj4pIA0KLSAgICAgICBFeHByZXNzaW9uUXVhbGlmaWVkSWRlbnRpZmllcigpDQotICAgIHwgIFByaW1hcnlFeHByZXNzaW9uKCkgDQotICAgIHwgIEZ1bGxOZXdFeHByZXNzaW9uKCkvKkBiZ2VuKGpqdHJlZSkqLw0KLSAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgew0KLSAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7DQotICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7DQotICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7DQotICAgICAgICAgfQ0KLSAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICB9DQotICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgfQ0KLSAgICAgICAgIHRocm93IChFcnJvcilqanRlMDAwOw0KLSAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7DQotICAgICAgICAgfQ0KLSAgICAgICB9DQotLypAZWdlbiovICAgICAgICAgICAgIA0KLX0NCi0NCi12b2lkIEZ1bGxOZXdFeHByZXNzaW9uICgpOg0KLXsvKkBiZ2VuKGpqdHJlZSkgRnVsbE5ld0V4cHJlc3Npb24gKi8NCi0gIEFTVEZ1bGxOZXdFeHByZXNzaW9uIGpqdG4wMDAgPSBuZXcgQVNURnVsbE5ld0V4cHJlc3Npb24odGhpcywgSkpURlVMTE5FV0VYUFJFU1NJT04pOw0KLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsNCi0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOw0KLS8qQGVnZW4qL30NCi17LypAYmdlbihqanRyZWUpIEZ1bGxOZXdFeHByZXNzaW9uICovDQotICAgICAgICB0cnkgew0KLS8qQGVnZW4qLw0KLSAgICAgICAgPE5FVz4gRnVsbE5ld1N1YmV4cHJlc3Npb24oKSAgKExPT0tBSEVBRCgyKSBQcm9wZXJ0eU9wZXJhdG9yKCkpKiBbTE9PS0FIRUFEKDIpIEFyZ3VtZW50cygpXS8qQGJnZW4oamp0cmVlKSovDQotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsNCi0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7DQotICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICB0aHJvdyAoRXJyb3Ipamp0ZTAwMDsNCi0gICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOw0KLSAgICAgICAgICB9DQotICAgICAgICB9DQotLypAZWdlbiovDQotfQ0KLQ0KLXZvaWQgRnVuY3Rpb25Db25zdHJ1Y3RvcigpOg0KLXsvKkBiZ2VuKGpqdHJlZSkgRnVuY3Rpb25Db25zdHJ1Y3RvciAqLw0KLSAgQVNURnVuY3Rpb25Db25zdHJ1Y3RvciBqanRuMDAwID0gbmV3IEFTVEZ1bmN0aW9uQ29uc3RydWN0b3IodGhpcywgSkpURlVOQ1RJT05DT05TVFJVQ1RPUik7DQotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOw0KLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotLypAZWdlbiovfQ0KLXsvKkBiZ2VuKGpqdHJlZSkgRnVuY3Rpb25Db25zdHJ1Y3RvciAqLw0KLSAgICAgICAgdHJ5IHsNCi0vKkBlZ2VuKi8gICAgDQotICAgICAgICA8RlVOQ1RJT05fPiBBcmd1bWVudHMoKS8qQGJnZW4oamp0cmVlKSovDQotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsNCi0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7DQotICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICB0aHJvdyAoRXJyb3Ipamp0ZTAwMDsNCi0gICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOw0KLSAgICAgICAgICB9DQotICAgICAgICB9DQotLypAZWdlbiovDQotfQ0KLQ0KLXZvaWQgRnVsbE5ld1N1YmV4cHJlc3Npb24gKCk6DQotey8qQGJnZW4oamp0cmVlKSBGdWxsTmV3U3ViZXhwcmVzc2lvbiAqLw0KLSAgQVNURnVsbE5ld1N1YmV4cHJlc3Npb24gamp0bjAwMCA9IG5ldyBBU1RGdWxsTmV3U3ViZXhwcmVzc2lvbih0aGlzLCBKSlRGVUxMTkVXU1VCRVhQUkVTU0lPTik7DQotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOw0KLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotLypAZWdlbiovfQ0KLXsvKkBiZ2VuKGpqdHJlZSkgRnVsbE5ld1N1YmV4cHJlc3Npb24gKi8NCi0gICAgICAgIHRyeSB7DQotLypAZWdlbiovDQotICAgICAgICBMT09LQUhFQUQoPExQQVJFTj4gQXNzaWdubWVudEV4cHJlc3Npb24oKSA8UlBBUkVOPiA8UVVBTElGSUVSPikgDQotICAgICAgICBFeHByZXNzaW9uUXVhbGlmaWVkSWRlbnRpZmllcigpICAgICAgICANCi0gICAgfCAgIFByaW1hcnlFeHByZXNzaW9uKCkgDQotICAgIHwgICBTaW1wbGVRdWFsaWZpZWRJZGVudGlmaWVyKCkNCi0gICAgfCAgIFN1cGVyRXhwcmVzc2lvbigpIA0KLSAgICB8ICAgRnVsbE5ld0V4cHJlc3Npb24oKQ0KLSAgICB8ICAgRnVuY3Rpb25Db25zdHJ1Y3RvcigpLypAYmdlbihqanRyZWUpKi8NCi0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsNCi0gICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIHRocm93IChFcnJvcilqanRlMDAwOw0KLSAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0vKkBlZ2VuKi8NCi19DQotDQotDQotdm9pZCBQb3N0Zml4T3AoKToNCi17LypAYmdlbihqanRyZWUpIFBvc3RmaXhPcCAqLw0KLSAgQVNUUG9zdGZpeE9wIGpqdG4wMDAgPSBuZXcgQVNUUG9zdGZpeE9wKHRoaXMsIEpKVFBPU1RGSVhPUCk7DQotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOw0KLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotLypAZWdlbiovfQ0KLXsvKkBiZ2VuKGpqdHJlZSkgUG9zdGZpeE9wICovDQotICAgICAgICB0cnkgew0KLS8qQGVnZW4qLw0KLSAgICAgICAgPElOQ1I+DQotICAgIHwgICA8REVDUj4vKkBiZ2VuKGpqdHJlZSkqLw0KLSAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0vKkBlZ2VuKi8NCi19DQotDQotdm9pZCBQcm9wZXJ0eU9yQXJndW1lbnRzICgpOg0KLXsvKkBiZ2VuKGpqdHJlZSkgUHJvcGVydHlPckFyZ3VtZW50cyAqLw0KLSAgQVNUUHJvcGVydHlPckFyZ3VtZW50cyBqanRuMDAwID0gbmV3IEFTVFByb3BlcnR5T3JBcmd1bWVudHModGhpcywgSkpUUFJPUEVSVFlPUkFSR1VNRU5UUyk7DQotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOw0KLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotLypAZWdlbiovfQ0KLXsvKkBiZ2VuKGpqdHJlZSkgUHJvcGVydHlPckFyZ3VtZW50cyAqLw0KLSAgICAgICAgdHJ5IHsNCi0vKkBlZ2VuKi8NCi0gICAgICAgIEFyZ3VtZW50cygpICAgICAgICANCi0gICAgfCAgIFByb3BlcnR5T3BlcmF0b3IoKS8qQGJnZW4oamp0cmVlKSovDQotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsNCi0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7DQotICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICB0aHJvdyAoRXJyb3Ipamp0ZTAwMDsNCi0gICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOw0KLSAgICAgICAgICB9DQotICAgICAgICB9DQotLypAZWdlbiovDQotfQ0KLQ0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQotLy8gUHJvcGVydHkgT3BlcmF0b3JzDQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCi12b2lkIFByb3BlcnR5T3BlcmF0b3IgKCk6DQotey8qQGJnZW4oamp0cmVlKSBQcm9wZXJ0eU9wZXJhdG9yICovDQotICBBU1RQcm9wZXJ0eU9wZXJhdG9yIGpqdG4wMDAgPSBuZXcgQVNUUHJvcGVydHlPcGVyYXRvcih0aGlzLCBKSlRQUk9QRVJUWU9QRVJBVE9SKTsNCi0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7DQotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0vKkBlZ2VuKi99DQotey8qQGJnZW4oamp0cmVlKSBQcm9wZXJ0eU9wZXJhdG9yICovDQotICAgICAgICB0cnkgew0KLS8qQGVnZW4qLyAgICAgICAgICANCi0gICAgICAgIDxET1Q+ICAgICAgUXVhbGlmaWVkSWRlbnRpZmllcigpDQotICAgIHwgICBMT09LQUhFQUQoMikgPExCUkFDS0VUPiA8UkJSQUNLRVQ+DQotICAgIHwgICBMT09LQUhFQUQoMikgPExCUkFDS0VUPiA8RUxJUFNFPiBBc3NpZ25tZW50RXhwcmVzc2lvbigpIDxSQlJBQ0tFVD4NCi0gICAgfCAgICAgICAgICAgICAgICA8TEJSQUNLRVQ+IExpc3RFeHByZXNzaW9uKCkgWzxFTElQU0U+IEFzc2lnbm1lbnRFeHByZXNzaW9uKCldIDxSQlJBQ0tFVD4vKkBiZ2VuKGpqdHJlZSkqLw0KLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7DQotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOw0KLSAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgdGhyb3cgKEVycm9yKWpqdGUwMDA7DQotICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLS8qQGVnZW4qLw0KLX0NCi0NCi12b2lkIEFyZ3VtZW50cyAoKToNCi17LypAYmdlbihqanRyZWUpIEFyZ3VtZW50cyAqLw0KLSBBU1RBcmd1bWVudHMgamp0bjAwMCA9IG5ldyBBU1RBcmd1bWVudHModGhpcywgSkpUQVJHVU1FTlRTKTsNCi0gYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsNCi0gamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotLypAZWdlbiove3Rva2VuX3NvdXJjZS5zZXRSZWdWYWxpZCgpO319DQotey8qQGJnZW4oamp0cmVlKSBBcmd1bWVudHMgKi8NCi0gICAgICAgIHRyeSB7DQotLypAZWdlbiovDQotICAgICAgICBMT09LQUhFQUQoMikgPExQQVJFTj4gPFJQQVJFTj4NCi0gICAgfCAgIExPT0tBSEVBRCgyKSA8TFBBUkVOPiA8RUxJUFNFPiBBc3NpZ25tZW50RXhwcmVzc2lvbigpIDxSUEFSRU4+DQotICAgIHwgICAgICAgICAgICAgICAgPExQQVJFTj4gTGlzdEV4cHJlc3Npb24oKSBbPEVMSVBTRT4gQXNzaWdubWVudEV4cHJlc3Npb24oKV0gPFJQQVJFTj4vKkBiZ2VuKGpqdHJlZSkqLw0KLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7DQotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOw0KLSAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgdGhyb3cgKEVycm9yKWpqdGUwMDA7DQotICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLS8qQGVnZW4qLw0KLX0NCi0NCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KLS8vIFVuYXJ5IE9wZXJhdG9ycyANCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KLXZvaWQgVW5hcnlFeHByZXNzaW9uICgpOg0KLXsvKkBiZ2VuKGpqdHJlZSkgVW5hcnlFeHByZXNzaW9uICovDQotICBBU1RVbmFyeUV4cHJlc3Npb24gamp0bjAwMCA9IG5ldyBBU1RVbmFyeUV4cHJlc3Npb24odGhpcywgSkpUVU5BUllFWFBSRVNTSU9OKTsNCi0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7DQotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0vKkBlZ2VuKi99DQotey8qQGJnZW4oamp0cmVlKSBVbmFyeUV4cHJlc3Npb24gKi8NCi0gICAgICAgICAgICAgICAgIHRyeSB7DQotLypAZWdlbiovDQotICAgICAgICAgICAgICAgICBQb3N0Zml4RXhwcmVzc2lvbigpDQotICAgIHwgICA8REVMRVRFPiBQb3N0Zml4RXhwcmVzc2lvbigpDQotICAgIHwgICA8Vk9JRD4gICBVbmFyeUV4cHJlc3Npb24oKQ0KLSAgICB8ICAgPFRZUEVPRj4gVW5hcnlFeHByZXNzaW9uKCkNCi0gICAgfCAgIDxJTkNSPiAgIFBvc3RmaXhFeHByZXNzaW9uKCkNCi0gICAgfCAgIDxERUNSPiAgIFBvc3RmaXhFeHByZXNzaW9uKCkNCi0gICAgfCAgIDxQTFVTPiAgIFVuYXJ5RXhwcmVzc2lvbigpDQotICAgIHwgICA8TUlOVVM+ICBVbmFyeUV4cHJlc3Npb24oKQ0KLSAgICB8ICAgPFRJTERFPiAgVW5hcnlFeHByZXNzaW9uKCkNCi0gICAgfCAgIDxCQU5HPiAgIFVuYXJ5RXhwcmVzc2lvbigpLypAYmdlbihqanRyZWUpKi8NCi0gICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7DQotICAgICAgICAgICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgICAgICAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsNCi0gICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOw0KLSAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgICAgICAgICAgIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgICAgICAgICAgIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgIHRocm93IChFcnJvcilqanRlMDAwOw0KLSAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7DQotICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgIH0NCi0vKkBlZ2VuKi8NCi19DQotDQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCi0vLyBNdWx0aXBsaWNhdGl2ZSBPcGVyYXRvcnMgDQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCi12b2lkIE11bE9wKCk6DQotey8qQGJnZW4oamp0cmVlKSBNdWxPcCAqLw0KLSAgQVNUTXVsT3Agamp0bjAwMCA9IG5ldyBBU1RNdWxPcCh0aGlzLCBKSlRNVUxPUCk7DQotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOw0KLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotLypAZWdlbiovfQ0KLXsvKkBiZ2VuKGpqdHJlZSkgTXVsT3AgKi8NCi0gICAgICAgIHRyeSB7DQotLypAZWdlbiovDQotICAgICAgICA8U1RBUj4NCi0gICAgfCAgIDxTTEFTSD4NCi0gICAgfCAgIDxSRU0+LypAYmdlbihqanRyZWUpKi8NCi0gICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOw0KLSAgICAgICAgICB9DQotICAgICAgICB9DQotLypAZWdlbiovIA0KLX0NCi0NCi12b2lkIE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbigpOg0KLXsvKkBiZ2VuKGpqdHJlZSkgTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uICovDQotICBBU1RNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24gamp0bjAwMCA9IG5ldyBBU1RNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24odGhpcywgSkpUTVVMVElQTElDQVRJVkVFWFBSRVNTSU9OKTsNCi0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7DQotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0vKkBlZ2VuKi99DQotey8qQGJnZW4oamp0cmVlKSBNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24gKi8NCi0gICAgICAgIHRyeSB7DQotLypAZWdlbiovDQotICAgICAgICBVbmFyeUV4cHJlc3Npb24oKSAoTXVsT3AoKSBVbmFyeUV4cHJlc3Npb24oKSkqLypAYmdlbihqanRyZWUpKi8NCi0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsNCi0gICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIHRocm93IChFcnJvcilqanRlMDAwOw0KLSAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0vKkBlZ2VuKi8NCi0NCi19DQotDQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCi0vLyBBZGRpdGl2ZSBPcGVyYXRvcnMgDQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCi12b2lkIEFkZE9wKCk6DQotey8qQGJnZW4oamp0cmVlKSBBZGRPcCAqLw0KLSAgQVNUQWRkT3Agamp0bjAwMCA9IG5ldyBBU1RBZGRPcCh0aGlzLCBKSlRBRERPUCk7DQotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOw0KLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotLypAZWdlbiovfQ0KLXsvKkBiZ2VuKGpqdHJlZSkgQWRkT3AgKi8NCi0gICAgICAgIHRyeSB7DQotLypAZWdlbiovDQotICAgICAgICA8UExVUz4NCi0gICAgfCAgIDxNSU5VUz4vKkBiZ2VuKGpqdHJlZSkqLw0KLSAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0vKkBlZ2VuKi8NCi19DQotDQotdm9pZCBBZGRpdGl2ZUV4cHJlc3Npb24oKToNCi17LypAYmdlbihqanRyZWUpIEFkZGl0aXZlRXhwcmVzc2lvbiAqLw0KLSAgQVNUQWRkaXRpdmVFeHByZXNzaW9uIGpqdG4wMDAgPSBuZXcgQVNUQWRkaXRpdmVFeHByZXNzaW9uKHRoaXMsIEpKVEFERElUSVZFRVhQUkVTU0lPTik7DQotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOw0KLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotLypAZWdlbiovfQ0KLXsvKkBiZ2VuKGpqdHJlZSkgQWRkaXRpdmVFeHByZXNzaW9uICovDQotICAgICAgICB0cnkgew0KLS8qQGVnZW4qLw0KLSAgICAgICAgTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uKCkgKEFkZE9wKCkgTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uKCkpKi8qQGJnZW4oamp0cmVlKSovDQotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsNCi0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7DQotICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICB0aHJvdyAoRXJyb3Ipamp0ZTAwMDsNCi0gICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOw0KLSAgICAgICAgICB9DQotICAgICAgICB9DQotLypAZWdlbiovDQotfSANCi0NCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KLS8vIEJpdHdpc2UgU2hpZnQgT3BlcmF0b3JzIA0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQotdm9pZCBTaGlmdE9wKCk6DQotey8qQGJnZW4oamp0cmVlKSBTaGlmdE9wICovDQotICBBU1RTaGlmdE9wIGpqdG4wMDAgPSBuZXcgQVNUU2hpZnRPcCh0aGlzLCBKSlRTSElGVE9QKTsNCi0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7DQotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0vKkBlZ2VuKi99DQotey8qQGJnZW4oamp0cmVlKSBTaGlmdE9wICovDQotICAgICAgICB0cnkgew0KLS8qQGVnZW4qLw0KLSAgICAgICAgPExTSElGVD4NCi0gICAgfCAgIDxSU0lHTkVEU0hJRlQ+DQotICAgIHwgICA8UlVOU0lHTkVEU0hJRlQ+LypAYmdlbihqanRyZWUpKi8NCi0gICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOw0KLSAgICAgICAgICB9DQotICAgICAgICB9DQotLypAZWdlbiovDQotfQ0KLQ0KLXZvaWQgU2hpZnRFeHByZXNzaW9uKCk6DQotey8qQGJnZW4oamp0cmVlKSBTaGlmdEV4cHJlc3Npb24gKi8NCi0gIEFTVFNoaWZ0RXhwcmVzc2lvbiBqanRuMDAwID0gbmV3IEFTVFNoaWZ0RXhwcmVzc2lvbih0aGlzLCBKSlRTSElGVEVYUFJFU1NJT04pOw0KLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsNCi0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOw0KLS8qQGVnZW4qL30NCi17LypAYmdlbihqanRyZWUpIFNoaWZ0RXhwcmVzc2lvbiAqLw0KLSAgICAgICAgdHJ5IHsNCi0vKkBlZ2VuKi8NCi0gICAgICAgIEFkZGl0aXZlRXhwcmVzc2lvbigpIChTaGlmdE9wKCkgQWRkaXRpdmVFeHByZXNzaW9uKCkpKi8qQGJnZW4oamp0cmVlKSovDQotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsNCi0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7DQotICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICB0aHJvdyAoRXJyb3Ipamp0ZTAwMDsNCi0gICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOw0KLSAgICAgICAgICB9DQotICAgICAgICB9DQotLypAZWdlbiovDQotfQ0KLQ0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQotLy8gUmVsYXRpb25hbCBPcGVyYXRvcnMgDQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCi12b2lkIFJlbE9wKCk6DQotey8qQGJnZW4oamp0cmVlKSBSZWxPcCAqLw0KLSAgQVNUUmVsT3Agamp0bjAwMCA9IG5ldyBBU1RSZWxPcCh0aGlzLCBKSlRSRUxPUCk7DQotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOw0KLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotLypAZWdlbiovfQ0KLXsvKkBiZ2VuKGpqdHJlZSkgUmVsT3AgKi8NCi0gICAgICAgIHRyeSB7DQotLypAZWdlbiovDQotICAgICAgICA8TFQ+DQotICAgIHwgICA8R1Q+IA0KLSAgICB8ICAgPExFPiANCi0gICAgfCAgIDxHRT4NCi0gICAgfCAgIDxJUz4NCi0gICAgfCAgIDxBUz4vKkBiZ2VuKGpqdHJlZSkqLw0KLSAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0vKkBlZ2VuKi8NCi19DQotDQotdm9pZCBSZWxhdGlvbmFsRXhwcmVzc2lvbigpOg0KLXsvKkBiZ2VuKGpqdHJlZSkgUmVsYXRpb25hbEV4cHJlc3Npb24gKi8NCi0gIEFTVFJlbGF0aW9uYWxFeHByZXNzaW9uIGpqdG4wMDAgPSBuZXcgQVNUUmVsYXRpb25hbEV4cHJlc3Npb24odGhpcywgSkpUUkVMQVRJT05BTEVYUFJFU1NJT04pOw0KLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsNCi0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOw0KLS8qQGVnZW4qL30NCi17LypAYmdlbihqanRyZWUpIFJlbGF0aW9uYWxFeHByZXNzaW9uICovDQotICAgICAgICB0cnkgew0KLS8qQGVnZW4qLw0KLSAgICAgICAgU2hpZnRFeHByZXNzaW9uKCkgDQotICAgICAgICAgICAgKExPT0tBSEVBRCgzKShSZWxPcCgpIHwgPElOPiB8IDxJTlNUQU5DRU9GPiApIFNoaWZ0RXhwcmVzc2lvbigpKSovKkBiZ2VuKGpqdHJlZSkqLw0KLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7DQotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOw0KLSAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgdGhyb3cgKEVycm9yKWpqdGUwMDA7DQotICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLS8qQGVnZW4qLw0KLX0NCi0NCi12b2lkIFJlbGF0aW9uYWxFeHByZXNzaW9uTm9JTigpOg0KLXsvKkBiZ2VuKGpqdHJlZSkgUmVsYXRpb25hbEV4cHJlc3Npb25Ob0lOICovDQotICBBU1RSZWxhdGlvbmFsRXhwcmVzc2lvbk5vSU4gamp0bjAwMCA9IG5ldyBBU1RSZWxhdGlvbmFsRXhwcmVzc2lvbk5vSU4odGhpcywgSkpUUkVMQVRJT05BTEVYUFJFU1NJT05OT0lOKTsNCi0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7DQotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0vKkBlZ2VuKi99DQotey8qQGJnZW4oamp0cmVlKSBSZWxhdGlvbmFsRXhwcmVzc2lvbk5vSU4gKi8NCi0gICAgICAgIHRyeSB7DQotLypAZWdlbiovDQotICAgICAgICBTaGlmdEV4cHJlc3Npb24oKSANCi0gICAgICAgICAgICAoKFJlbE9wKCkgfCA8SU5TVEFOQ0VPRj4pICBTaGlmdEV4cHJlc3Npb24oKSkqLypAYmdlbihqanRyZWUpKi8NCi0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsNCi0gICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIHRocm93IChFcnJvcilqanRlMDAwOw0KLSAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0vKkBlZ2VuKi8NCi19DQotDQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCi0vLyBFcXVhbGl0eSBPcGVyYXRvcnMgDQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCi12b2lkIEVxdWFsT3AoKToNCi17LypAYmdlbihqanRyZWUpIEVxdWFsT3AgKi8NCi0gIEFTVEVxdWFsT3Agamp0bjAwMCA9IG5ldyBBU1RFcXVhbE9wKHRoaXMsIEpKVEVRVUFMT1ApOw0KLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsNCi0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOw0KLS8qQGVnZW4qL30NCi17LypAYmdlbihqanRyZWUpIEVxdWFsT3AgKi8NCi0gICAgICAgIHRyeSB7DQotLypAZWdlbiovDQotICAgICAgICA8RVE+IA0KLSAgICB8ICAgPE5FPiANCi0gICAgfCAgIDxJREVOVElUWU9QRVI+IA0KLSAgICB8ICAgPE5PVElERU5USVRZT1BFUj4vKkBiZ2VuKGpqdHJlZSkqLw0KLSAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0vKkBlZ2VuKi8NCi19DQotDQotdm9pZCBFcXVhbGl0eUV4cHJlc3Npb24oKToNCi17LypAYmdlbihqanRyZWUpIEVxdWFsaXR5RXhwcmVzc2lvbiAqLw0KLSAgQVNURXF1YWxpdHlFeHByZXNzaW9uIGpqdG4wMDAgPSBuZXcgQVNURXF1YWxpdHlFeHByZXNzaW9uKHRoaXMsIEpKVEVRVUFMSVRZRVhQUkVTU0lPTik7DQotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOw0KLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotLypAZWdlbiovfQ0KLXsvKkBiZ2VuKGpqdHJlZSkgRXF1YWxpdHlFeHByZXNzaW9uICovDQotICAgICAgICB0cnkgew0KLS8qQGVnZW4qLw0KLSAgICAgICAgUmVsYXRpb25hbEV4cHJlc3Npb24oKSAoRXF1YWxPcCgpIFJlbGF0aW9uYWxFeHByZXNzaW9uKCkpKi8qQGJnZW4oamp0cmVlKSovDQotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsNCi0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7DQotICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICB0aHJvdyAoRXJyb3Ipamp0ZTAwMDsNCi0gICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOw0KLSAgICAgICAgICB9DQotICAgICAgICB9DQotLypAZWdlbiovDQotfQ0KLQ0KLXZvaWQgRXF1YWxpdHlFeHByZXNzaW9uTm9JTigpOg0KLXsvKkBiZ2VuKGpqdHJlZSkgRXF1YWxpdHlFeHByZXNzaW9uTm9JTiAqLw0KLSAgQVNURXF1YWxpdHlFeHByZXNzaW9uTm9JTiBqanRuMDAwID0gbmV3IEFTVEVxdWFsaXR5RXhwcmVzc2lvbk5vSU4odGhpcywgSkpURVFVQUxJVFlFWFBSRVNTSU9OTk9JTik7DQotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOw0KLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotLypAZWdlbiovfQ0KLXsvKkBiZ2VuKGpqdHJlZSkgRXF1YWxpdHlFeHByZXNzaW9uTm9JTiAqLw0KLSAgICAgICAgdHJ5IHsNCi0vKkBlZ2VuKi8NCi0gICAgICAgIFJlbGF0aW9uYWxFeHByZXNzaW9uTm9JTigpIChFcXVhbE9wKCkgUmVsYXRpb25hbEV4cHJlc3Npb25Ob0lOKCkpKi8qQGJnZW4oamp0cmVlKSovDQotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsNCi0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7DQotICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICB0aHJvdyAoRXJyb3Ipamp0ZTAwMDsNCi0gICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOw0KLSAgICAgICAgICB9DQotICAgICAgICB9DQotLypAZWdlbiovDQotfQ0KLQ0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQotLy8gQmluYXJ5IEJpdHdpc2UgT3BlcmF0b3JzIA0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQotdm9pZCBCaXR3aXNlQU5ET3AoKToNCi17LypAYmdlbihqanRyZWUpIEJpdHdpc2VBTkRPcCAqLw0KLSAgQVNUQml0d2lzZUFORE9wIGpqdG4wMDAgPSBuZXcgQVNUQml0d2lzZUFORE9wKHRoaXMsIEpKVEJJVFdJU0VBTkRPUCk7DQotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOw0KLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotLypAZWdlbiovfQ0KLXsvKkBiZ2VuKGpqdHJlZSkgQml0d2lzZUFORE9wICovDQotICAgICAgICB0cnkgew0KLS8qQGVnZW4qLw0KLSAgICAgICAgPEJJVF9BTkQ+LypAYmdlbihqanRyZWUpKi8NCi0gICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOw0KLSAgICAgICAgICB9DQotICAgICAgICB9DQotLypAZWdlbiovDQotfQ0KLQ0KLXZvaWQgQml0d2lzZUFOREV4cHJlc3Npb24oKToNCi17LypAYmdlbihqanRyZWUpIEJpdHdpc2VBTkRFeHByZXNzaW9uICovDQotICBBU1RCaXR3aXNlQU5ERXhwcmVzc2lvbiBqanRuMDAwID0gbmV3IEFTVEJpdHdpc2VBTkRFeHByZXNzaW9uKHRoaXMsIEpKVEJJVFdJU0VBTkRFWFBSRVNTSU9OKTsNCi0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7DQotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0vKkBlZ2VuKi99DQotey8qQGJnZW4oamp0cmVlKSBCaXR3aXNlQU5ERXhwcmVzc2lvbiAqLw0KLSAgICAgICAgdHJ5IHsNCi0vKkBlZ2VuKi8NCi0gICAgICAgIEVxdWFsaXR5RXhwcmVzc2lvbigpIChCaXR3aXNlQU5ET3AoKSBFcXVhbGl0eUV4cHJlc3Npb24oKSkqLypAYmdlbihqanRyZWUpKi8NCi0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsNCi0gICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIHRocm93IChFcnJvcilqanRlMDAwOw0KLSAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0vKkBlZ2VuKi8NCi19DQotDQotdm9pZCBCaXR3aXNlQU5ERXhwcmVzc2lvbk5vSU4oKToNCi17LypAYmdlbihqanRyZWUpIEJpdHdpc2VBTkRFeHByZXNzaW9uTm9JTiAqLw0KLSAgQVNUQml0d2lzZUFOREV4cHJlc3Npb25Ob0lOIGpqdG4wMDAgPSBuZXcgQVNUQml0d2lzZUFOREV4cHJlc3Npb25Ob0lOKHRoaXMsIEpKVEJJVFdJU0VBTkRFWFBSRVNTSU9OTk9JTik7DQotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOw0KLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotLypAZWdlbiovfQ0KLXsvKkBiZ2VuKGpqdHJlZSkgQml0d2lzZUFOREV4cHJlc3Npb25Ob0lOICovDQotICAgICAgICB0cnkgew0KLS8qQGVnZW4qLw0KLSAgICAgICAgRXF1YWxpdHlFeHByZXNzaW9uTm9JTigpIChCaXR3aXNlQU5ET3AoKSBFcXVhbGl0eUV4cHJlc3Npb25Ob0lOKCkpKi8qQGJnZW4oamp0cmVlKSovDQotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsNCi0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7DQotICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICB0aHJvdyAoRXJyb3Ipamp0ZTAwMDsNCi0gICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOw0KLSAgICAgICAgICB9DQotICAgICAgICB9DQotLypAZWdlbiovDQotfQ0KLQ0KLQ0KLXZvaWQgQml0d2lzZVhPUk9wKCk6DQotey8qQGJnZW4oamp0cmVlKSBCaXR3aXNlWE9ST3AgKi8NCi0gIEFTVEJpdHdpc2VYT1JPcCBqanRuMDAwID0gbmV3IEFTVEJpdHdpc2VYT1JPcCh0aGlzLCBKSlRCSVRXSVNFWE9ST1ApOw0KLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsNCi0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOw0KLS8qQGVnZW4qL30NCi17LypAYmdlbihqanRyZWUpIEJpdHdpc2VYT1JPcCAqLw0KLSAgICAgICAgdHJ5IHsNCi0vKkBlZ2VuKi8NCi0gICAgICAgIDxYT1I+LypAYmdlbihqanRyZWUpKi8NCi0gICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOw0KLSAgICAgICAgICB9DQotICAgICAgICB9DQotLypAZWdlbiovDQotfQ0KLQ0KLXZvaWQgQml0d2lzZVhPUkV4cHJlc3Npb24oKToNCi17LypAYmdlbihqanRyZWUpIEJpdHdpc2VYT1JFeHByZXNzaW9uICovDQotICBBU1RCaXR3aXNlWE9SRXhwcmVzc2lvbiBqanRuMDAwID0gbmV3IEFTVEJpdHdpc2VYT1JFeHByZXNzaW9uKHRoaXMsIEpKVEJJVFdJU0VYT1JFWFBSRVNTSU9OKTsNCi0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7DQotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0vKkBlZ2VuKi99DQotey8qQGJnZW4oamp0cmVlKSBCaXR3aXNlWE9SRXhwcmVzc2lvbiAqLw0KLSAgICAgICAgdHJ5IHsNCi0vKkBlZ2VuKi8NCi0gICAgICAgIEJpdHdpc2VBTkRFeHByZXNzaW9uKCkgKEJpdHdpc2VYT1JPcCgpIEJpdHdpc2VBTkRFeHByZXNzaW9uKCkpKi8qQGJnZW4oamp0cmVlKSovDQotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsNCi0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7DQotICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICB0aHJvdyAoRXJyb3Ipamp0ZTAwMDsNCi0gICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOw0KLSAgICAgICAgICB9DQotICAgICAgICB9DQotLypAZWdlbiovDQotfQ0KLQ0KLXZvaWQgQml0d2lzZVhPUkV4cHJlc3Npb25Ob0lOKCk6DQotey8qQGJnZW4oamp0cmVlKSBCaXR3aXNlWE9SRXhwcmVzc2lvbk5vSU4gKi8NCi0gIEFTVEJpdHdpc2VYT1JFeHByZXNzaW9uTm9JTiBqanRuMDAwID0gbmV3IEFTVEJpdHdpc2VYT1JFeHByZXNzaW9uTm9JTih0aGlzLCBKSlRCSVRXSVNFWE9SRVhQUkVTU0lPTk5PSU4pOw0KLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsNCi0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOw0KLS8qQGVnZW4qL30NCi17LypAYmdlbihqanRyZWUpIEJpdHdpc2VYT1JFeHByZXNzaW9uTm9JTiAqLw0KLSAgICAgICAgdHJ5IHsNCi0vKkBlZ2VuKi8NCi0gICAgICAgIEJpdHdpc2VBTkRFeHByZXNzaW9uTm9JTigpIChCaXR3aXNlWE9ST3AoKSBCaXR3aXNlQU5ERXhwcmVzc2lvbk5vSU4oKSkqLypAYmdlbihqanRyZWUpKi8NCi0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsNCi0gICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIHRocm93IChFcnJvcilqanRlMDAwOw0KLSAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0vKkBlZ2VuKi8NCi19DQotDQotdm9pZCBCaXR3aXNlT1JPcCgpOg0KLXsvKkBiZ2VuKGpqdHJlZSkgQml0d2lzZU9ST3AgKi8NCi0gIEFTVEJpdHdpc2VPUk9wIGpqdG4wMDAgPSBuZXcgQVNUQml0d2lzZU9ST3AodGhpcywgSkpUQklUV0lTRU9ST1ApOw0KLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsNCi0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOw0KLS8qQGVnZW4qL30NCi17LypAYmdlbihqanRyZWUpIEJpdHdpc2VPUk9wICovDQotICAgICAgICB0cnkgew0KLS8qQGVnZW4qLw0KLSAgICAgICAgPEJJVF9PUj4vKkBiZ2VuKGpqdHJlZSkqLw0KLSAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0vKkBlZ2VuKi8NCi19DQotDQotdm9pZCBCaXR3aXNlT1JFeHByZXNzaW9uKCk6DQotey8qQGJnZW4oamp0cmVlKSBCaXR3aXNlT1JFeHByZXNzaW9uICovDQotICBBU1RCaXR3aXNlT1JFeHByZXNzaW9uIGpqdG4wMDAgPSBuZXcgQVNUQml0d2lzZU9SRXhwcmVzc2lvbih0aGlzLCBKSlRCSVRXSVNFT1JFWFBSRVNTSU9OKTsNCi0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7DQotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0vKkBlZ2VuKi99DQotey8qQGJnZW4oamp0cmVlKSBCaXR3aXNlT1JFeHByZXNzaW9uICovDQotICAgICAgICB0cnkgew0KLS8qQGVnZW4qLw0KLSAgICAgICAgQml0d2lzZVhPUkV4cHJlc3Npb24oKSAoQml0d2lzZU9ST3AoKSBCaXR3aXNlWE9SRXhwcmVzc2lvbigpKSovKkBiZ2VuKGpqdHJlZSkqLw0KLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7DQotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOw0KLSAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgdGhyb3cgKEVycm9yKWpqdGUwMDA7DQotICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLS8qQGVnZW4qLw0KLX0NCi0NCi12b2lkIEJpdHdpc2VPUkV4cHJlc3Npb25Ob0lOKCk6DQotey8qQGJnZW4oamp0cmVlKSBCaXR3aXNlT1JFeHByZXNzaW9uTm9JTiAqLw0KLSAgQVNUQml0d2lzZU9SRXhwcmVzc2lvbk5vSU4gamp0bjAwMCA9IG5ldyBBU1RCaXR3aXNlT1JFeHByZXNzaW9uTm9JTih0aGlzLCBKSlRCSVRXSVNFT1JFWFBSRVNTSU9OTk9JTik7DQotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOw0KLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotLypAZWdlbiovfQ0KLXsvKkBiZ2VuKGpqdHJlZSkgQml0d2lzZU9SRXhwcmVzc2lvbk5vSU4gKi8NCi0gICAgICAgIHRyeSB7DQotLypAZWdlbiovDQotICAgICAgICBCaXR3aXNlWE9SRXhwcmVzc2lvbk5vSU4oKSAoQml0d2lzZU9ST3AoKSBCaXR3aXNlWE9SRXhwcmVzc2lvbk5vSU4oKSkqLypAYmdlbihqanRyZWUpKi8NCi0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsNCi0gICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIHRocm93IChFcnJvcilqanRlMDAwOw0KLSAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0vKkBlZ2VuKi8NCi19DQotDQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCi0vLyBCaW5hcnkgTG9naWNhbCBPcGVyYXRvcnMgDQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCi12b2lkIExvZ2ljYWxBTkRFeHByZXNzaW9uKCk6DQotey8qQGJnZW4oamp0cmVlKSBMb2dpY2FsQU5ERXhwcmVzc2lvbiAqLw0KLSAgQVNUTG9naWNhbEFOREV4cHJlc3Npb24gamp0bjAwMCA9IG5ldyBBU1RMb2dpY2FsQU5ERXhwcmVzc2lvbih0aGlzLCBKSlRMT0dJQ0FMQU5ERVhQUkVTU0lPTik7DQotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOw0KLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotLypAZWdlbiovfQ0KLXsvKkBiZ2VuKGpqdHJlZSkgTG9naWNhbEFOREV4cHJlc3Npb24gKi8NCi0gICAgICAgIHRyeSB7DQotLypAZWdlbiovDQotICAgICAgICBCaXR3aXNlT1JFeHByZXNzaW9uKCkgKDxTQ19BTkQ+IEJpdHdpc2VPUkV4cHJlc3Npb24oKSkqLypAYmdlbihqanRyZWUpKi8NCi0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsNCi0gICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIHRocm93IChFcnJvcilqanRlMDAwOw0KLSAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0vKkBlZ2VuKi8NCi19DQotDQotdm9pZCBMb2dpY2FsQU5ERXhwcmVzc2lvbk5vSU4oKToNCi17LypAYmdlbihqanRyZWUpIExvZ2ljYWxBTkRFeHByZXNzaW9uTm9JTiAqLw0KLSAgQVNUTG9naWNhbEFOREV4cHJlc3Npb25Ob0lOIGpqdG4wMDAgPSBuZXcgQVNUTG9naWNhbEFOREV4cHJlc3Npb25Ob0lOKHRoaXMsIEpKVExPR0lDQUxBTkRFWFBSRVNTSU9OTk9JTik7DQotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOw0KLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotLypAZWdlbiovfQ0KLXsvKkBiZ2VuKGpqdHJlZSkgTG9naWNhbEFOREV4cHJlc3Npb25Ob0lOICovDQotICAgICAgICB0cnkgew0KLS8qQGVnZW4qLw0KLSAgICAgICAgQml0d2lzZU9SRXhwcmVzc2lvbk5vSU4oKSAoPFNDX0FORD4gQml0d2lzZU9SRXhwcmVzc2lvbk5vSU4oKSkqLypAYmdlbihqanRyZWUpKi8NCi0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsNCi0gICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIHRocm93IChFcnJvcilqanRlMDAwOw0KLSAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0vKkBlZ2VuKi8NCi19DQotDQotdm9pZCBMb2dpY2FsT1JFeHByZXNzaW9uKCk6DQotey8qQGJnZW4oamp0cmVlKSBMb2dpY2FsT1JFeHByZXNzaW9uICovDQotICBBU1RMb2dpY2FsT1JFeHByZXNzaW9uIGpqdG4wMDAgPSBuZXcgQVNUTG9naWNhbE9SRXhwcmVzc2lvbih0aGlzLCBKSlRMT0dJQ0FMT1JFWFBSRVNTSU9OKTsNCi0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7DQotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0vKkBlZ2VuKi99DQotey8qQGJnZW4oamp0cmVlKSBMb2dpY2FsT1JFeHByZXNzaW9uICovDQotICAgICAgICB0cnkgew0KLS8qQGVnZW4qLw0KLSAgICAgICAgTG9naWNhbEFOREV4cHJlc3Npb24oKSAoPFNDX09SPiBMb2dpY2FsQU5ERXhwcmVzc2lvbigpKSovKkBiZ2VuKGpqdHJlZSkqLw0KLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7DQotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOw0KLSAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgdGhyb3cgKEVycm9yKWpqdGUwMDA7DQotICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLS8qQGVnZW4qLw0KLX0NCi0NCi12b2lkIExvZ2ljYWxPUkV4cHJlc3Npb25Ob0lOKCk6DQotey8qQGJnZW4oamp0cmVlKSBMb2dpY2FsT1JFeHByZXNzaW9uTm9JTiAqLw0KLSAgQVNUTG9naWNhbE9SRXhwcmVzc2lvbk5vSU4gamp0bjAwMCA9IG5ldyBBU1RMb2dpY2FsT1JFeHByZXNzaW9uTm9JTih0aGlzLCBKSlRMT0dJQ0FMT1JFWFBSRVNTSU9OTk9JTik7DQotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOw0KLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotLypAZWdlbiovfQ0KLXsvKkBiZ2VuKGpqdHJlZSkgTG9naWNhbE9SRXhwcmVzc2lvbk5vSU4gKi8NCi0gICAgICAgIHRyeSB7DQotLypAZWdlbiovDQotICAgICAgICBMb2dpY2FsQU5ERXhwcmVzc2lvbk5vSU4oKSAoPFNDX09SPiBMb2dpY2FsQU5ERXhwcmVzc2lvbk5vSU4oKSkqLypAYmdlbihqanRyZWUpKi8NCi0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsNCi0gICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIHRocm93IChFcnJvcilqanRlMDAwOw0KLSAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0vKkBlZ2VuKi8NCi19DQotDQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCi0vLyBDb25kaXRpb25hbCBPcGVyYXRvcnMgDQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCi12b2lkIENvbmRpdGlvbmFsRXhwcmVzc2lvbigpOg0KLXsvKkBiZ2VuKGpqdHJlZSkgQ29uZGl0aW9uYWxFeHByZXNzaW9uICovDQotICBBU1RDb25kaXRpb25hbEV4cHJlc3Npb24gamp0bjAwMCA9IG5ldyBBU1RDb25kaXRpb25hbEV4cHJlc3Npb24odGhpcywgSkpUQ09ORElUSU9OQUxFWFBSRVNTSU9OKTsNCi0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7DQotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0vKkBlZ2VuKi99DQotey8qQGJnZW4oamp0cmVlKSBDb25kaXRpb25hbEV4cHJlc3Npb24gKi8NCi0gICAgICAgIHRyeSB7DQotLypAZWdlbiovDQotICAgICAgICBMb2dpY2FsT1JFeHByZXNzaW9uKCkgWzxIT09LPiAgQXNzaWdubWVudEV4cHJlc3Npb24oKSANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPENPTE9OPiBBc3NpZ25tZW50RXhwcmVzc2lvbigpXS8qQGJnZW4oamp0cmVlKSovDQotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsNCi0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7DQotICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICB0aHJvdyAoRXJyb3Ipamp0ZTAwMDsNCi0gICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOw0KLSAgICAgICAgICB9DQotICAgICAgICB9DQotLypAZWdlbiovDQotfQ0KLQ0KLXZvaWQgQ29uZGl0aW9uYWxFeHByZXNzaW9uTm9JTigpOg0KLXsvKkBiZ2VuKGpqdHJlZSkgQ29uZGl0aW9uYWxFeHByZXNzaW9uTm9JTiAqLw0KLSAgQVNUQ29uZGl0aW9uYWxFeHByZXNzaW9uTm9JTiBqanRuMDAwID0gbmV3IEFTVENvbmRpdGlvbmFsRXhwcmVzc2lvbk5vSU4odGhpcywgSkpUQ09ORElUSU9OQUxFWFBSRVNTSU9OTk9JTik7DQotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOw0KLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotLypAZWdlbiovfQ0KLXsvKkBiZ2VuKGpqdHJlZSkgQ29uZGl0aW9uYWxFeHByZXNzaW9uTm9JTiAqLw0KLSAgICAgICAgdHJ5IHsNCi0vKkBlZ2VuKi8NCi0gICAgICAgIExvZ2ljYWxPUkV4cHJlc3Npb25Ob0lOKCkgIFs8SE9PSz4gIEFzc2lnbm1lbnRFeHByZXNzaW9uTm9JTigpIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxDT0xPTj4gQXNzaWdubWVudEV4cHJlc3Npb25Ob0lOKCldLypAYmdlbihqanRyZWUpKi8NCi0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsNCi0gICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIHRocm93IChFcnJvcilqanRlMDAwOw0KLSAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0vKkBlZ2VuKi8NCi19DQotDQotdm9pZCBOb25Bc3NpZ25tZW50RXhwcmVzc2lvbigpOg0KLXsvKkBiZ2VuKGpqdHJlZSkgTm9uQXNzaWdubWVudEV4cHJlc3Npb24gKi8NCi0gIEFTVE5vbkFzc2lnbm1lbnRFeHByZXNzaW9uIGpqdG4wMDAgPSBuZXcgQVNUTm9uQXNzaWdubWVudEV4cHJlc3Npb24odGhpcywgSkpUTk9OQVNTSUdOTUVOVEVYUFJFU1NJT04pOw0KLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsNCi0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOw0KLS8qQGVnZW4qL30NCi17LypAYmdlbihqanRyZWUpIE5vbkFzc2lnbm1lbnRFeHByZXNzaW9uICovDQotICAgICAgICB0cnkgew0KLS8qQGVnZW4qLw0KLSAgICAgICAgTG9naWNhbE9SRXhwcmVzc2lvbigpIFs8SE9PSz4gIE5vbkFzc2lnbm1lbnRFeHByZXNzaW9uKCkgDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxDT0xPTj4gTm9uQXNzaWdubWVudEV4cHJlc3Npb24oKV0vKkBiZ2VuKGpqdHJlZSkqLw0KLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7DQotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOw0KLSAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgdGhyb3cgKEVycm9yKWpqdGUwMDA7DQotICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLS8qQGVnZW4qLw0KLX0NCi0NCi12b2lkIE5vbkFzc2lnbm1lbnRFeHByZXNzaW9uTm9JTigpOg0KLXsvKkBiZ2VuKGpqdHJlZSkgTm9uQXNzaWdubWVudEV4cHJlc3Npb25Ob0lOICovDQotICBBU1ROb25Bc3NpZ25tZW50RXhwcmVzc2lvbk5vSU4gamp0bjAwMCA9IG5ldyBBU1ROb25Bc3NpZ25tZW50RXhwcmVzc2lvbk5vSU4odGhpcywgSkpUTk9OQVNTSUdOTUVOVEVYUFJFU1NJT05OT0lOKTsNCi0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7DQotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0vKkBlZ2VuKi99DQotey8qQGJnZW4oamp0cmVlKSBOb25Bc3NpZ25tZW50RXhwcmVzc2lvbk5vSU4gKi8NCi0gICAgICAgIHRyeSB7DQotLypAZWdlbiovDQotICAgICAgICBMb2dpY2FsT1JFeHByZXNzaW9uTm9JTigpIFs8SE9PSz4gIE5vbkFzc2lnbm1lbnRFeHByZXNzaW9uTm9JTigpIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPENPTE9OPiBOb25Bc3NpZ25tZW50RXhwcmVzc2lvbk5vSU4oKV0vKkBiZ2VuKGpqdHJlZSkqLw0KLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7DQotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOw0KLSAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgdGhyb3cgKEVycm9yKWpqdGUwMDA7DQotICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLS8qQGVnZW4qLw0KLX0NCi0NCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KLS8vIEFzc2lnbm1lbnQgT3BlcmF0b3JzIA0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQotdm9pZCBBc3NpZ25lbWVudE9wZXJhdG9yKCk6DQotey8qQGJnZW4oamp0cmVlKSBBc3NpZ25lbWVudE9wZXJhdG9yICovDQotICBBU1RBc3NpZ25lbWVudE9wZXJhdG9yIGpqdG4wMDAgPSBuZXcgQVNUQXNzaWduZW1lbnRPcGVyYXRvcih0aGlzLCBKSlRBU1NJR05FTUVOVE9QRVJBVE9SKTsNCi0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7DQotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0vKkBlZ2VuKi99DQotey8qQGJnZW4oamp0cmVlKSBBc3NpZ25lbWVudE9wZXJhdG9yICovDQotICAgICAgICB0cnkgew0KLS8qQGVnZW4qLw0KLSAgICAgICAgPEFTU0lHTj4NCi0gICAgfCAgIDxTVEFSQVNTSUdOPg0KLSAgICB8ICAgPFNMQVNIQVNTSUdOPiANCi0gICAgfCAgIDxSRU1BU1NJR04+IA0KLSAgICB8ICAgPFBMVVNBU1NJR04+DQotICAgIHwgICA8TUlOVVNBU1NJR04+IA0KLSAgICB8ICAgPExTSElGVEFTU0lHTj4gDQotICAgIHwgICA8UlNJR05FRFNISUZUQVNTSUdOPg0KLSAgICB8ICAgPFJVTlNJR05FRFNISUZUQVNTSUdOPg0KLSAgICB8ICAgPEFOREFTU0lHTj4gDQotICAgIHwgICA8WE9SQVNTSUdOPiANCi0gICAgfCAgIDxPUkFTU0lHTj4NCi0gICAgfCAgIDxTQ19BTkRBU1NJR04+DQotICAgIHwgICA8U0NfWE9SQVNTSUdOPg0KLSAgICB8ICAgPFNDX09SQVNTSUdOPi8qQGJnZW4oamp0cmVlKSovDQotICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLS8qQGVnZW4qLw0KLSANCi19DQotDQotdm9pZCBBc3NpZ25tZW50RXhwcmVzc2lvbigpOg0KLXsvKkBiZ2VuKGpqdHJlZSkgQXNzaWdubWVudEV4cHJlc3Npb24gKi8NCi0gIEFTVEFzc2lnbm1lbnRFeHByZXNzaW9uIGpqdG4wMDAgPSBuZXcgQVNUQXNzaWdubWVudEV4cHJlc3Npb24odGhpcywgSkpUQVNTSUdOTUVOVEVYUFJFU1NJT04pOw0KLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsNCi0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOw0KLS8qQGVnZW4qL30NCi17LypAYmdlbihqanRyZWUpIEFzc2lnbm1lbnRFeHByZXNzaW9uICovDQotICAgICAgICB0cnkgew0KLS8qQGVnZW4qLw0KLSAgICAgICAgQ29uZGl0aW9uYWxFeHByZXNzaW9uKCkgW0xPT0tBSEVBRCgyKSBBc3NpZ25lbWVudE9wZXJhdG9yKCkgQXNzaWdubWVudEV4cHJlc3Npb24oKV0vKkBiZ2VuKGpqdHJlZSkqLw0KLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7DQotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOw0KLSAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgdGhyb3cgKEVycm9yKWpqdGUwMDA7DQotICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLS8qQGVnZW4qLw0KLX0NCi0NCi12b2lkIEFzc2lnbm1lbnRFeHByZXNzaW9uTm9JTigpOg0KLXsvKkBiZ2VuKGpqdHJlZSkgQXNzaWdubWVudEV4cHJlc3Npb25Ob0lOICovDQotICBBU1RBc3NpZ25tZW50RXhwcmVzc2lvbk5vSU4gamp0bjAwMCA9IG5ldyBBU1RBc3NpZ25tZW50RXhwcmVzc2lvbk5vSU4odGhpcywgSkpUQVNTSUdOTUVOVEVYUFJFU1NJT05OT0lOKTsNCi0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7DQotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0vKkBlZ2VuKi99DQotey8qQGJnZW4oamp0cmVlKSBBc3NpZ25tZW50RXhwcmVzc2lvbk5vSU4gKi8NCi0gICAgICAgIHRyeSB7DQotLypAZWdlbiovDQotICAgICAgICBDb25kaXRpb25hbEV4cHJlc3Npb25Ob0lOKCkgW0xPT0tBSEVBRCgyKSBBc3NpZ25lbWVudE9wZXJhdG9yKCkgQXNzaWdubWVudEV4cHJlc3Npb25Ob0lOKCldLypAYmdlbihqanRyZWUpKi8NCi0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsNCi0gICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIHRocm93IChFcnJvcilqanRlMDAwOw0KLSAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0vKkBlZ2VuKi8NCi19DQotDQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCi0vLyBDb21tYSBFeHByZXNzaW9ucw0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQotdm9pZCBMaXN0RXhwcmVzc2lvbiAoKToNCi17LypAYmdlbihqanRyZWUpIExpc3RFeHByZXNzaW9uICovDQotICBBU1RMaXN0RXhwcmVzc2lvbiBqanRuMDAwID0gbmV3IEFTVExpc3RFeHByZXNzaW9uKHRoaXMsIEpKVExJU1RFWFBSRVNTSU9OKTsNCi0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7DQotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0vKkBlZ2VuKi99DQotey8qQGJnZW4oamp0cmVlKSBMaXN0RXhwcmVzc2lvbiAqLw0KLSAgICAgICAgdHJ5IHsNCi0vKkBlZ2VuKi8NCi0gICAgICAgIEFzc2lnbm1lbnRFeHByZXNzaW9uKCkgKDxDT01NQT4gQXNzaWdubWVudEV4cHJlc3Npb24oKSkqLypAYmdlbihqanRyZWUpKi8NCi0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsNCi0gICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIHRocm93IChFcnJvcilqanRlMDAwOw0KLSAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0vKkBlZ2VuKi8NCi19ICAgDQotDQotdm9pZCBMaXN0RXhwcmVzc2lvbk5vSU4gKCk6DQotey8qQGJnZW4oamp0cmVlKSBMaXN0RXhwcmVzc2lvbk5vSU4gKi8NCi0gIEFTVExpc3RFeHByZXNzaW9uTm9JTiBqanRuMDAwID0gbmV3IEFTVExpc3RFeHByZXNzaW9uTm9JTih0aGlzLCBKSlRMSVNURVhQUkVTU0lPTk5PSU4pOw0KLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsNCi0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOw0KLS8qQGVnZW4qL30NCi17LypAYmdlbihqanRyZWUpIExpc3RFeHByZXNzaW9uTm9JTiAqLw0KLSAgICAgICAgdHJ5IHsNCi0vKkBlZ2VuKi8NCi0gICAgICAgIEFzc2lnbm1lbnRFeHByZXNzaW9uTm9JTigpICg8Q09NTUE+IEFzc2lnbm1lbnRFeHByZXNzaW9uTm9JTigpKSovKkBiZ2VuKGpqdHJlZSkqLw0KLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7DQotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOw0KLSAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgdGhyb3cgKEVycm9yKWpqdGUwMDA7DQotICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLS8qQGVnZW4qLw0KLX0gICANCi0NCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KLS8vIFR5cGUgRXhwcmVzc2lvbnMNCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KLXZvaWQgVHlwZUV4cHJlc3Npb24gKCk6DQotey8qQGJnZW4oamp0cmVlKSBUeXBlRXhwcmVzc2lvbiAqLw0KLSAgQVNUVHlwZUV4cHJlc3Npb24gamp0bjAwMCA9IG5ldyBBU1RUeXBlRXhwcmVzc2lvbih0aGlzLCBKSlRUWVBFRVhQUkVTU0lPTik7DQotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOw0KLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotLypAZWdlbiovfQ0KLXsvKkBiZ2VuKGpqdHJlZSkgVHlwZUV4cHJlc3Npb24gKi8NCi0gICAgICAgIHRyeSB7DQotLypAZWdlbiovDQotICAgICAgICBOb25Bc3NpZ25tZW50RXhwcmVzc2lvbigpLypAYmdlbihqanRyZWUpKi8NCi0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsNCi0gICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIHRocm93IChFcnJvcilqanRlMDAwOw0KLSAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0vKkBlZ2VuKi8NCi19DQotDQotdm9pZCBUeXBlRXhwcmVzc2lvbk5vSU4gKCk6DQotey8qQGJnZW4oamp0cmVlKSBUeXBlRXhwcmVzc2lvbk5vSU4gKi8NCi0gIEFTVFR5cGVFeHByZXNzaW9uTm9JTiBqanRuMDAwID0gbmV3IEFTVFR5cGVFeHByZXNzaW9uTm9JTih0aGlzLCBKSlRUWVBFRVhQUkVTU0lPTk5PSU4pOw0KLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsNCi0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOw0KLS8qQGVnZW4qL30NCi17LypAYmdlbihqanRyZWUpIFR5cGVFeHByZXNzaW9uTm9JTiAqLw0KLSAgICAgICAgdHJ5IHsNCi0vKkBlZ2VuKi8NCi0gICAgICAgIE5vbkFzc2lnbm1lbnRFeHByZXNzaW9uTm9JTigpLypAYmdlbihqanRyZWUpKi8NCi0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsNCi0gICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIHRocm93IChFcnJvcilqanRlMDAwOw0KLSAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0vKkBlZ2VuKi8NCi19DQotDQotdm9pZCBUeXBlRXhwcmVzc2lvbkxpc3QgKCk6DQotey8qQGJnZW4oamp0cmVlKSBUeXBlRXhwcmVzc2lvbkxpc3QgKi8NCi0gIEFTVFR5cGVFeHByZXNzaW9uTGlzdCBqanRuMDAwID0gbmV3IEFTVFR5cGVFeHByZXNzaW9uTGlzdCh0aGlzLCBKSlRUWVBFRVhQUkVTU0lPTkxJU1QpOw0KLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsNCi0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOw0KLS8qQGVnZW4qL30NCi17LypAYmdlbihqanRyZWUpIFR5cGVFeHByZXNzaW9uTGlzdCAqLw0KLSAgICAgICAgdHJ5IHsNCi0vKkBlZ2VuKi8NCi0gICAgICAgIE5vbkFzc2lnbm1lbnRFeHByZXNzaW9uKCkgKDxDT01NQT4gTm9uQXNzaWdubWVudEV4cHJlc3Npb24oKSkqLypAYmdlbihqanRyZWUpKi8NCi0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsNCi0gICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIHRocm93IChFcnJvcilqanRlMDAwOw0KLSAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0vKkBlZ2VuKi8NCi19DQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCi0vLyBTdGFlbWVudHMgKGFiYnJldiwgbm9TaG9ydElmLCBmdWxsKSANCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KLXZvaWQgU3RhdGVtZW50ICgpOg0KLXsvKkBiZ2VuKGpqdHJlZSkgU3RhdGVtZW50ICovDQotICBBU1RTdGF0ZW1lbnQgamp0bjAwMCA9IG5ldyBBU1RTdGF0ZW1lbnQodGhpcywgSkpUU1RBVEVNRU5UKTsNCi0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7DQotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0vKkBlZ2VuKi99DQotey8qQGJnZW4oamp0cmVlKSBTdGF0ZW1lbnQgKi8NCi0gICAgICAgIHRyeSB7DQotLypAZWdlbiovDQotICAgICAgICBMT09LQUhFQUQoMykgRXhwcmVzc2lvblN0YXRlbWVudCgpIFNjKCkNCi0gICAgfCAgICAgICAgICAgICAgICBTdXBlclN0YXRlbWVudCgpIFNjKCkNCi0gICAgfCAgICAgICAgICAgICAgICBCbG9jaygpDQotICAgIHwgICAgICAgICAgICAgICAgTGFiZWxlZFN0YXRlbWVudCgpDQotICAgIHwgICAgICAgICAgICAgICAgSWZTdGF0ZW1lbnQoKQ0KLSAgICB8ICAgICAgICAgICAgICAgIFN3aXRjaFN0YXRlbWVudCgpDQotICAgIHwgICAgICAgICAgICAgICAgRG9TdGF0ZW1lbnQoKSBTYygpDQotICAgIHwgICAgICAgICAgICAgICAgV2hpbGVTdGF0ZW1lbnQoKQ0KLSAgICB8ICAgICAgICAgICAgICAgIEZvclN0YXRlbWVudCgpDQotICAgIHwgICAgICAgICAgICAgICAgV2l0aFN0YXRlbWVudCgpDQotICAgIHwgICAgICAgICAgICAgICAgQ29udGludWVTdGF0ZW1lbnQoKSBTYygpDQotICAgIHwgICAgICAgICAgICAgICAgQnJlYWtTdGF0ZW1lbnQoKSBTYygpDQotICAgIHwgICAgICAgICAgICAgICAgUmV0dXJuU3RhdGVtZW50KCkgU2MoKQ0KLSAgICB8ICAgICAgICAgICAgICAgIFRocm93U3RhdGVtZW50KCkgU2MoKQ0KLSAgICB8ICAgICAgICAgICAgICAgIFRyeVN0YXRlbWVudCgpLypAYmdlbihqanRyZWUpKi8NCi0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsNCi0gICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIHRocm93IChFcnJvcilqanRlMDAwOw0KLSAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0vKkBlZ2VuKi8NCi19DQotDQotdm9pZCBTdWJzdGF0ZW1lbnQgKCk6DQotey8qQGJnZW4oamp0cmVlKSBTdWJzdGF0ZW1lbnQgKi8NCi0gIEFTVFN1YnN0YXRlbWVudCBqanRuMDAwID0gbmV3IEFTVFN1YnN0YXRlbWVudCh0aGlzLCBKSlRTVUJTVEFURU1FTlQpOw0KLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsNCi0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOw0KLS8qQGVnZW4qL30NCi17LypAYmdlbihqanRyZWUpIFN1YnN0YXRlbWVudCAqLw0KLSAgICAgICAgICAgICAgICAgICAgIHRyeSB7DQotLypAZWdlbiovDQotICAgICAgICAgICAgICAgICAgICAgRW1wdHlTdGF0ZW1lbnQoKQ0KLSAgICB8ICAgTE9PS0FIRUFEKDIpIFN0YXRlbWVudCgpDQotICAgIHwgICAgICAgICAgICAgICAgU2ltcGxlVmFyaWFibGVEZWZpbml0aW9uKCkgU2MoKQ0KLSAgICB8ICAgICAgICAgICAgICAgIEF0dHJpYnV0ZXMoKSAgICAgICAgICAgICAgIDxMQlJBQ0U+IFN1YnN0YXRlbWVudHMoKSA8UkJSQUNFPi8qQGJnZW4oamp0cmVlKSovDQotICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsNCi0gICAgICAgICAgICAgICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOw0KLSAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsNCi0gICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgIHRocm93IChFcnJvcilqanRlMDAwOw0KLSAgICAgICAgICAgICAgICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgICAgICAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7DQotICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgfQ0KLS8qQGVnZW4qLw0KLX0NCi0NCi12b2lkIFN1YnN0YXRlbWVudHMgKCk6DQotey8qQGJnZW4oamp0cmVlKSBTdWJzdGF0ZW1lbnRzICovDQotICBBU1RTdWJzdGF0ZW1lbnRzIGpqdG4wMDAgPSBuZXcgQVNUU3Vic3RhdGVtZW50cyh0aGlzLCBKSlRTVUJTVEFURU1FTlRTKTsNCi0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7DQotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0vKkBlZ2VuKi99DQotey8qQGJnZW4oamp0cmVlKSBTdWJzdGF0ZW1lbnRzICovDQotICAgICAgICB0cnkgew0KLS8qQGVnZW4qLw0KLSAgICAgICAgKFN1YnN0YXRlbWVudCgpKSsvKkBiZ2VuKGpqdHJlZSkqLw0KLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7DQotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOw0KLSAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgdGhyb3cgKEVycm9yKWpqdGUwMDA7DQotICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLS8qQGVnZW4qLw0KLX0NCi0NCi1KQVZBQ09ERQ0KLSAgdm9pZCBTYygpIHsvKkBiZ2VuKGpqdHJlZSkgU2MgKi8NCi0gQVNUU2Mgamp0bjAwMCA9IG5ldyBBU1RTYyh0aGlzLCBKSlRTQyk7DQotIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7DQotIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOw0KLSB0cnkgew0KLS8qQGVnZW4qLw0KLSAgICBUb2tlbiB0b2sgPSBnZXRUb2tlbigxKTsNCi0gICAgaWYgKHRvay5raW5kID09IFNFTUlDT0xPTikgew0KLSAgICAgICB0b2sgPSBnZXROZXh0VG9rZW4oKTsNCi0gICAgfSBlbHNlIGlmICh0b2suc3BlY2lhbFRva2VuICE9IG51bGwpIHsNCi0gICAgICAgaWYgKCFFb2xDb21tZW50U2tpcFdzKHRvay5zcGVjaWFsVG9rZW4pICYmICh0b2sua2luZCAhPSBFT0YpKSB7DQotICAgICAgICAgIHRocm93IGdlbmVyYXRlUGFyc2VFeGNlcHRpb24oKTsNCi0gICAgICAgfQ0KLSAgICB9IGVsc2UgaWYgKCh0b2sua2luZCAhPSBFT0YpICYmICh0b2sua2luZCE9UkJSQUNFKSkgew0KLSAgICAgICAgIHRocm93IGdlbmVyYXRlUGFyc2VFeGNlcHRpb24oKTsNCi0gICAgfS8qQGJnZW4oamp0cmVlKSovDQotIH0gZmluYWxseSB7DQotICAgaWYgKGpqdGMwMDApIHsNCi0gICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsNCi0gICB9DQotIH0NCi0vKkBlZ2VuKi8NCi0gIH0NCi0gDQotSkFWQUNPREUNCi0gIGJvb2xlYW4gRW9sQ29tbWVudFNraXBXcyhUb2tlbiB0KSB7LypAYmdlbihqanRyZWUpIEVvbENvbW1lbnRTa2lwV3MgKi8NCi0gQVNURW9sQ29tbWVudFNraXBXcyBqanRuMDAwID0gbmV3IEFTVEVvbENvbW1lbnRTa2lwV3ModGhpcywgSkpURU9MQ09NTUVOVFNLSVBXUyk7DQotIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7DQotIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOw0KLSB0cnkgew0KLS8qQGVnZW4qLw0KLSAgICBib29sZWFuIHJldFZhbCA9IGZhbHNlOw0KLSAgICBUb2tlbiBzcGVjaWFsVG9rZW4gPSB0Ow0KLSAgICB3aGlsZShzcGVjaWFsVG9rZW4gIT0gbnVsbCkgew0KLSAgICAgIGlmKHNwZWNpYWxUb2tlbi5raW5kID09IFdTKSB7DQotICAgICAgICBzcGVjaWFsVG9rZW4gPSBzcGVjaWFsVG9rZW4uc3BlY2lhbFRva2VuOw0KLSAgICAgICAgY29udGludWU7DQotICAgICAgfQ0KLSAgICAgIGVsc2UgaWYoc3BlY2lhbFRva2VuLmtpbmQgPT0gRU9MICB8fA0KLSAgICAgICAgICAgICAgc3BlY2lhbFRva2VuLmtpbmQgPT0gU0lOR0xFX0xJTkVfQ09NTUVOVCkgew0KLSAgICAgICAgcmV0VmFsID0gdHJ1ZTsNCi0gICAgICAgIGJyZWFrOw0KLSAgICAgIH0NCi0gICAgICBlbHNlIHsNCi0gICAgICAgIGJyZWFrOw0KLSAgICAgIH0NCi0gICAgfQ0KLSAgICByZXR1cm4gcmV0VmFsOy8qQGJnZW4oamp0cmVlKSovDQotIH0gZmluYWxseSB7DQotICAgaWYgKGpqdGMwMDApIHsNCi0gICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsNCi0gICB9DQotIH0NCi0vKkBlZ2VuKi8NCi0gIH0NCi0gDQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCi0vLyBFbXB0eSBTdGF0ZW1lbnQgDQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCi12b2lkIEVtcHR5U3RhdGVtZW50KCk6DQotey8qQGJnZW4oamp0cmVlKSBFbXB0eVN0YXRlbWVudCAqLw0KLSAgQVNURW1wdHlTdGF0ZW1lbnQgamp0bjAwMCA9IG5ldyBBU1RFbXB0eVN0YXRlbWVudCh0aGlzLCBKSlRFTVBUWVNUQVRFTUVOVCk7DQotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOw0KLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotLypAZWdlbiovfQ0KLXsvKkBiZ2VuKGpqdHJlZSkgRW1wdHlTdGF0ZW1lbnQgKi8NCi0gICAgICAgIHRyeSB7DQotLypAZWdlbiovDQotICAgICAgICA8U0VNSUNPTE9OPi8qQGJnZW4oamp0cmVlKSovDQotICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLS8qQGVnZW4qLw0KLX0NCi0NCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KLS8vIEV4cHJlc2lvbiBTdGF0ZW1lbnQgDQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCi12b2lkIEV4cHJlc3Npb25TdGF0ZW1lbnQoKToNCi17LypAYmdlbihqanRyZWUpIEV4cHJlc3Npb25TdGF0ZW1lbnQgKi8NCi0gIEFTVEV4cHJlc3Npb25TdGF0ZW1lbnQgamp0bjAwMCA9IG5ldyBBU1RFeHByZXNzaW9uU3RhdGVtZW50KHRoaXMsIEpKVEVYUFJFU1NJT05TVEFURU1FTlQpOw0KLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsNCi0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOw0KLS8qQGVnZW4qL30NCi17LypAYmdlbihqanRyZWUpIEV4cHJlc3Npb25TdGF0ZW1lbnQgKi8NCi0gICAgICAgIHRyeSB7DQotLypAZWdlbiovDQotICAgICAgICBMaXN0RXhwcmVzc2lvbigpLypAYmdlbihqanRyZWUpKi8NCi0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsNCi0gICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIHRocm93IChFcnJvcilqanRlMDAwOw0KLSAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0vKkBlZ2VuKi8gDQotfQ0KLQ0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQotLy8gU3VwZXIgU3RhdGVtZW50IA0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQotdm9pZCBTdXBlclN0YXRlbWVudCAoKToNCi17LypAYmdlbihqanRyZWUpIFN1cGVyU3RhdGVtZW50ICovDQotICBBU1RTdXBlclN0YXRlbWVudCBqanRuMDAwID0gbmV3IEFTVFN1cGVyU3RhdGVtZW50KHRoaXMsIEpKVFNVUEVSU1RBVEVNRU5UKTsNCi0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7DQotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0vKkBlZ2VuKi99DQotey8qQGJnZW4oamp0cmVlKSBTdXBlclN0YXRlbWVudCAqLw0KLSAgICAgICAgdHJ5IHsNCi0vKkBlZ2VuKi8NCi0gICAgICAgIDxTVVBFUj4gQXJndW1lbnRzKCkvKkBiZ2VuKGpqdHJlZSkqLw0KLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7DQotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOw0KLSAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgdGhyb3cgKEVycm9yKWpqdGUwMDA7DQotICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLS8qQGVnZW4qLw0KLX0NCi0NCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KLS8vIEJsb2NrIFN0YXRlbWVudCANCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KLXZvaWQgQmxvY2sgKCk6DQotey8qQGJnZW4oamp0cmVlKSBCbG9jayAqLw0KLSAgQVNUQmxvY2sgamp0bjAwMCA9IG5ldyBBU1RCbG9jayh0aGlzLCBKSlRCTE9DSyk7DQotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOw0KLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotLypAZWdlbiovfQ0KLXsvKkBiZ2VuKGpqdHJlZSkgQmxvY2sgKi8NCi0gICAgICAgIHRyeSB7DQotLypAZWdlbiovICAgDQotICAgICAgICA8TEJSQUNFPiBbRGlyZWN0aXZlcygpXSA8UkJSQUNFPi8qQGJnZW4oamp0cmVlKSovDQotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsNCi0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7DQotICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICB0aHJvdyAoRXJyb3Ipamp0ZTAwMDsNCi0gICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOw0KLSAgICAgICAgICB9DQotICAgICAgICB9DQotLypAZWdlbiovDQotfQ0KLQ0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQotLy8gTGFiZWxlZCBTdGF0ZW1lbnQgKG1hcHMgdG8gbGl0ZXJhbCBmaWVsZCkNCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KLXZvaWQgTGFiZWxlZFN0YXRlbWVudCAoKToNCi17LypAYmdlbihqanRyZWUpIExhYmVsZWRTdGF0ZW1lbnQgKi8NCi0gIEFTVExhYmVsZWRTdGF0ZW1lbnQgamp0bjAwMCA9IG5ldyBBU1RMYWJlbGVkU3RhdGVtZW50KHRoaXMsIEpKVExBQkVMRURTVEFURU1FTlQpOw0KLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsNCi0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOw0KLS8qQGVnZW4qL30NCi17LypAYmdlbihqanRyZWUpIExhYmVsZWRTdGF0ZW1lbnQgKi8NCi0gICAgICAgIHRyeSB7DQotLypAZWdlbiovDQotICAgICAgICBJZGVudGlmaWVyKCkgPENPTE9OPiBTdWJzdGF0ZW1lbnQoKS8qQGJnZW4oamp0cmVlKSovDQotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsNCi0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7DQotICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICB0aHJvdyAoRXJyb3Ipamp0ZTAwMDsNCi0gICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOw0KLSAgICAgICAgICB9DQotICAgICAgICB9DQotLypAZWdlbiovDQotfQ0KLQ0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQotLy8gSWYgU3RhdGVtZW50IA0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQotdm9pZCBJZlN0YXRlbWVudCgpOg0KLXsvKkBiZ2VuKGpqdHJlZSkgSWZTdGF0ZW1lbnQgKi8NCi0gIEFTVElmU3RhdGVtZW50IGpqdG4wMDAgPSBuZXcgQVNUSWZTdGF0ZW1lbnQodGhpcywgSkpUSUZTVEFURU1FTlQpOw0KLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsNCi0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOw0KLS8qQGVnZW4qL30NCi17LypAYmdlbihqanRyZWUpIElmU3RhdGVtZW50ICovDQotICAgICAgICB0cnkgew0KLS8qQGVnZW4qLw0KLSAgICAgICAgPElGPiA8TFBBUkVOPiBMaXN0RXhwcmVzc2lvbigpIDxSUEFSRU4+IA0KLSAgICAgICAgICAgIFN1YnN0YXRlbWVudCgpIA0KLSAgICAgICAgICAgIFtMT09LQUhFQUQoMSkgPEVMU0U+IFN1YnN0YXRlbWVudCgpXS8qQGJnZW4oamp0cmVlKSovDQotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsNCi0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7DQotICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICB0aHJvdyAoRXJyb3Ipamp0ZTAwMDsNCi0gICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOw0KLSAgICAgICAgICB9DQotICAgICAgICB9DQotLypAZWdlbiovDQotfQ0KLQ0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQotLy8gU3dpdGNoIFN0YXRlbWVudCANCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KLXZvaWQgU3dpdGNoU3RhdGVtZW50ICgpOg0KLXsvKkBiZ2VuKGpqdHJlZSkgU3dpdGNoU3RhdGVtZW50ICovDQotICBBU1RTd2l0Y2hTdGF0ZW1lbnQgamp0bjAwMCA9IG5ldyBBU1RTd2l0Y2hTdGF0ZW1lbnQodGhpcywgSkpUU1dJVENIU1RBVEVNRU5UKTsNCi0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7DQotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0vKkBlZ2VuKi99DQotey8qQGJnZW4oamp0cmVlKSBTd2l0Y2hTdGF0ZW1lbnQgKi8NCi0gICAgICAgIHRyeSB7DQotLypAZWdlbiovDQotICAgICAgICA8U1dJVENIPiA8TFBBUkVOPiBMaXN0RXhwcmVzc2lvbigpIDxSUEFSRU4+DQotICAgICAgICAgICAgICAgICA8TEJSQUNFPiBbQ2FzZUVsZW1lbnRzKCldIDxSQlJBQ0U+LypAYmdlbihqanRyZWUpKi8NCi0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsNCi0gICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIHRocm93IChFcnJvcilqanRlMDAwOw0KLSAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0vKkBlZ2VuKi8NCi19DQotDQotdm9pZCBDYXNlRWxlbWVudHMgKCk6DQotey8qQGJnZW4oamp0cmVlKSBDYXNlRWxlbWVudHMgKi8NCi0gIEFTVENhc2VFbGVtZW50cyBqanRuMDAwID0gbmV3IEFTVENhc2VFbGVtZW50cyh0aGlzLCBKSlRDQVNFRUxFTUVOVFMpOw0KLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsNCi0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOw0KLS8qQGVnZW4qL30NCi17LypAYmdlbihqanRyZWUpIENhc2VFbGVtZW50cyAqLw0KLSAgICAgICAgdHJ5IHsNCi0vKkBlZ2VuKi8NCi0gICAgICAgIENhc2VMYWJlbCgpIChDYXNlRWxlbWVudCgpKSovKkBiZ2VuKGpqdHJlZSkqLw0KLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7DQotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOw0KLSAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgdGhyb3cgKEVycm9yKWpqdGUwMDA7DQotICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLS8qQGVnZW4qLw0KLX0NCi0NCi12b2lkIENhc2VFbGVtZW50ICgpOg0KLXsvKkBiZ2VuKGpqdHJlZSkgQ2FzZUVsZW1lbnQgKi8NCi0gIEFTVENhc2VFbGVtZW50IGpqdG4wMDAgPSBuZXcgQVNUQ2FzZUVsZW1lbnQodGhpcywgSkpUQ0FTRUVMRU1FTlQpOw0KLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsNCi0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOw0KLS8qQGVnZW4qL30NCi17LypAYmdlbihqanRyZWUpIENhc2VFbGVtZW50ICovDQotICAgICAgICB0cnkgew0KLS8qQGVnZW4qLw0KLSAgICAgICAgRGlyZWN0aXZlKCkNCi0gICAgfCAgIENhc2VMYWJlbCgpLypAYmdlbihqanRyZWUpKi8NCi0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsNCi0gICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIHRocm93IChFcnJvcilqanRlMDAwOw0KLSAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0vKkBlZ2VuKi8NCi19DQotDQotdm9pZCBDYXNlTGFiZWwgKCk6DQotey8qQGJnZW4oamp0cmVlKSBDYXNlTGFiZWwgKi8NCi0gIEFTVENhc2VMYWJlbCBqanRuMDAwID0gbmV3IEFTVENhc2VMYWJlbCh0aGlzLCBKSlRDQVNFTEFCRUwpOw0KLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsNCi0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOw0KLS8qQGVnZW4qL30NCi17LypAYmdlbihqanRyZWUpIENhc2VMYWJlbCAqLw0KLSAgICAgICAgdHJ5IHsNCi0vKkBlZ2VuKi8NCi0gICAgICAgIDxDQVNFPiBMaXN0RXhwcmVzc2lvbigpIDxDT0xPTj4NCi0gICAgfCAgIDxfREVGQVVMVD4gPENPTE9OPi8qQGJnZW4oamp0cmVlKSovDQotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsNCi0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7DQotICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICB0aHJvdyAoRXJyb3Ipamp0ZTAwMDsNCi0gICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOw0KLSAgICAgICAgICB9DQotICAgICAgICB9DQotLypAZWdlbiovDQotfQ0KLQ0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQotLy8gRG8tV2hpbGUgU3RhdGVtZW50IA0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQotdm9pZCBEb1N0YXRlbWVudCgpOiANCi17LypAYmdlbihqanRyZWUpIERvU3RhdGVtZW50ICovDQotICBBU1REb1N0YXRlbWVudCBqanRuMDAwID0gbmV3IEFTVERvU3RhdGVtZW50KHRoaXMsIEpKVERPU1RBVEVNRU5UKTsNCi0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7DQotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0vKkBlZ2VuKi99DQotey8qQGJnZW4oamp0cmVlKSBEb1N0YXRlbWVudCAqLw0KLSAgICAgICAgdHJ5IHsNCi0vKkBlZ2VuKi8NCi0gICAgICAgIDxETz4gU3Vic3RhdGVtZW50KCkgPFdISUxFPiA8TFBBUkVOPiBMaXN0RXhwcmVzc2lvbigpIDxSUEFSRU4+LypAYmdlbihqanRyZWUpKi8NCi0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsNCi0gICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIHRocm93IChFcnJvcilqanRlMDAwOw0KLSAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0vKkBlZ2VuKi8NCi19DQotDQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCi0vLyBXaGlsZSBTdGF0ZW1lbnQNCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KLXZvaWQgV2hpbGVTdGF0ZW1lbnQgKCk6DQotey8qQGJnZW4oamp0cmVlKSBXaGlsZVN0YXRlbWVudCAqLw0KLSAgQVNUV2hpbGVTdGF0ZW1lbnQgamp0bjAwMCA9IG5ldyBBU1RXaGlsZVN0YXRlbWVudCh0aGlzLCBKSlRXSElMRVNUQVRFTUVOVCk7DQotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOw0KLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotLypAZWdlbiovfQ0KLXsvKkBiZ2VuKGpqdHJlZSkgV2hpbGVTdGF0ZW1lbnQgKi8NCi0gICAgICAgIHRyeSB7DQotLypAZWdlbiovDQotICAgICAgICA8V0hJTEU+IDxMUEFSRU4+IExpc3RFeHByZXNzaW9uKCkgPFJQQVJFTj4NCi0gICAgICAgICAgIFN1YnN0YXRlbWVudCgpLypAYmdlbihqanRyZWUpKi8NCi0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsNCi0gICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIHRocm93IChFcnJvcilqanRlMDAwOw0KLSAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0vKkBlZ2VuKi8NCi19DQotDQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCi0vLyBGb3IgU3RhdGVtZW50cyANCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KLXZvaWQgRm9yU3RhdGVtZW50ICgpOg0KLXsvKkBiZ2VuKGpqdHJlZSkgRm9yU3RhdGVtZW50ICovDQotICBBU1RGb3JTdGF0ZW1lbnQgamp0bjAwMCA9IG5ldyBBU1RGb3JTdGF0ZW1lbnQodGhpcywgSkpURk9SU1RBVEVNRU5UKTsNCi0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7DQotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0vKkBlZ2VuKi99DQotey8qQGJnZW4oamp0cmVlKSBGb3JTdGF0ZW1lbnQgKi8NCi0gICAgICAgICB0cnkgew0KLS8qQGVnZW4qLw0KLSAgICAgICAgIExPT0tBSEVBRCg8Rk9SPiA8TFBBUkVOPiBGb3JJbkJpbmRpbmcoKSA8SU4+KQ0KLSAgICAgICAgICAgICAgICAgICA8Rk9SPiA8TFBBUkVOPiBGb3JJbkJpbmRpbmcoKSA8SU4+IExpc3RFeHByZXNzaW9uKCkgPFJQQVJFTj4NCi0gICAgICAgICAgICAgICAgICAgICAgU3Vic3RhdGVtZW50KCkNCi0gICAgfCAgICAgICAgICAgICAgPEZPUj4gPExQQVJFTj4gW0ZvckluaXRpYWxpemVyKCldIDxTRU1JQ09MT04+IA0KLSAgICAgICAgICAgICAgICAgICAgICAgW0xpc3RFeHByZXNzaW9uKCldIDxTRU1JQ09MT04+IA0KLSAgICAgICAgICAgICAgICAgICAgICAgW0xpc3RFeHByZXNzaW9uKCldIDxSUEFSRU4+IA0KLSAgICAgICAgICAgICAgICAgICAgICBTdWJzdGF0ZW1lbnQoKS8qQGJnZW4oamp0cmVlKSovDQotICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsNCi0gICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsNCi0gICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOw0KLSAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsNCi0gICAgICAgICAgIH0NCi0gICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgICB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICAgfQ0KLSAgICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgICB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgIH0NCi0gICAgICAgICAgIHRocm93IChFcnJvcilqanRlMDAwOw0KLSAgICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7DQotICAgICAgICAgICB9DQotICAgICAgICAgfQ0KLS8qQGVnZW4qLw0KLX0NCi0NCi12b2lkIEZvckluaXRpYWxpemVyICgpOg0KLXsvKkBiZ2VuKGpqdHJlZSkgRm9ySW5pdGlhbGl6ZXIgKi8NCi0gIEFTVEZvckluaXRpYWxpemVyIGpqdG4wMDAgPSBuZXcgQVNURm9ySW5pdGlhbGl6ZXIodGhpcywgSkpURk9SSU5JVElBTElaRVIpOw0KLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsNCi0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOw0KLS8qQGVnZW4qL30NCi17LypAYmdlbihqanRyZWUpIEZvckluaXRpYWxpemVyICovDQotICAgICAgICB0cnkgew0KLS8qQGVnZW4qLw0KLSAgICAgICAgTE9PS0FIRUFEKDMpIExpc3RFeHByZXNzaW9uTm9JTigpDQotICAgIHwgICAgICAgICAgICAgICAgVmFyaWFibGVEZWZpbml0aW9uTm9JTigpDQotICAgIHwgICAgICAgICAgICAgICAgQXR0cmlidXRlcygpICAgICAgICAgICAgIFZhcmlhYmxlRGVmaW5pdGlvbk5vSU4oKS8qQGJnZW4oamp0cmVlKSovDQotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsNCi0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7DQotICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICB0aHJvdyAoRXJyb3Ipamp0ZTAwMDsNCi0gICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOw0KLSAgICAgICAgICB9DQotICAgICAgICB9DQotLypAZWdlbiovDQotfQ0KLQ0KLXZvaWQgRm9ySW5CaW5kaW5nICgpOg0KLXsvKkBiZ2VuKGpqdHJlZSkgRm9ySW5CaW5kaW5nICovDQotICBBU1RGb3JJbkJpbmRpbmcgamp0bjAwMCA9IG5ldyBBU1RGb3JJbkJpbmRpbmcodGhpcywgSkpURk9SSU5CSU5ESU5HKTsNCi0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7DQotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0vKkBlZ2VuKi99DQotey8qQGJnZW4oamp0cmVlKSBGb3JJbkJpbmRpbmcgKi8NCi0gICAgICAgIHRyeSB7DQotLypAZWdlbiovDQotICAgICAgICBMT09LQUhFQUQoMykgUG9zdGZpeEV4cHJlc3Npb24oKQ0KLSAgICB8ICAgICAgICAgICAgICAgIFZhcmlhYmxlRGVmaW5pdGlvbktpbmQoKSBWYXJpYWJsZUJpbmRpbmdOb0lOKCkNCi0gICAgfCAgICAgICAgICAgICAgICBBdHRyaWJ1dGVzKCkgICAgICAgICAgICAgVmFyaWFibGVEZWZpbml0aW9uS2luZCgpIFZhcmlhYmxlQmluZGluZ05vSU4oKS8qQGJnZW4oamp0cmVlKSovDQotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsNCi0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7DQotICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICB0aHJvdyAoRXJyb3Ipamp0ZTAwMDsNCi0gICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOw0KLSAgICAgICAgICB9DQotICAgICAgICB9DQotLypAZWdlbiovDQotfQ0KLQ0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQotLy8gV2l0aCBTdGF0ZW1lbnQgDQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCi12b2lkIFdpdGhTdGF0ZW1lbnQoKToNCi17LypAYmdlbihqanRyZWUpIFdpdGhTdGF0ZW1lbnQgKi8NCi0gIEFTVFdpdGhTdGF0ZW1lbnQgamp0bjAwMCA9IG5ldyBBU1RXaXRoU3RhdGVtZW50KHRoaXMsIEpKVFdJVEhTVEFURU1FTlQpOw0KLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsNCi0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOw0KLS8qQGVnZW4qL30NCi17LypAYmdlbihqanRyZWUpIFdpdGhTdGF0ZW1lbnQgKi8NCi0gICAgICAgIHRyeSB7DQotLypAZWdlbiovDQotICAgICAgICA8V0lUSD4gPExQQVJFTj4gRXhwcmVzc2lvblN0YXRlbWVudCgpIDxSUEFSRU4+DQotICAgICAgICAgICAgU3Vic3RhdGVtZW50KCkvKkBiZ2VuKGpqdHJlZSkqLw0KLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7DQotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOw0KLSAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgdGhyb3cgKEVycm9yKWpqdGUwMDA7DQotICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLS8qQGVnZW4qLw0KLX0NCi0NCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KLS8vIENvbnRpbnVlIGFuZCBCcmVhayBTdGF0ZW1lbnQNCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KLXZvaWQgQ29udGludWVTdGF0ZW1lbnQoKToNCi17LypAYmdlbihqanRyZWUpIENvbnRpbnVlU3RhdGVtZW50ICovDQotICBBU1RDb250aW51ZVN0YXRlbWVudCBqanRuMDAwID0gbmV3IEFTVENvbnRpbnVlU3RhdGVtZW50KHRoaXMsIEpKVENPTlRJTlVFU1RBVEVNRU5UKTsNCi0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7DQotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0vKkBlZ2VuKi99DQotey8qQGJnZW4oamp0cmVlKSBDb250aW51ZVN0YXRlbWVudCAqLw0KLSAgICAgICAgdHJ5IHsNCi0vKkBlZ2VuKi8NCi0gICAgICAgIDxDT05USU5VRT4gW0lkZW50aWZpZXIoKV0vKkBiZ2VuKGpqdHJlZSkqLw0KLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7DQotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOw0KLSAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgdGhyb3cgKEVycm9yKWpqdGUwMDA7DQotICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLS8qQGVnZW4qLw0KLX0NCi0NCi12b2lkIEJyZWFrU3RhdGVtZW50KCk6DQotey8qQGJnZW4oamp0cmVlKSBCcmVha1N0YXRlbWVudCAqLw0KLSAgQVNUQnJlYWtTdGF0ZW1lbnQgamp0bjAwMCA9IG5ldyBBU1RCcmVha1N0YXRlbWVudCh0aGlzLCBKSlRCUkVBS1NUQVRFTUVOVCk7DQotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOw0KLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotLypAZWdlbiovfQ0KLXsvKkBiZ2VuKGpqdHJlZSkgQnJlYWtTdGF0ZW1lbnQgKi8NCi0gICAgICAgIHRyeSB7DQotLypAZWdlbiovDQotICAgICAgICA8QlJFQUs+IFtJZGVudGlmaWVyKCldLypAYmdlbihqanRyZWUpKi8NCi0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsNCi0gICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIHRocm93IChFcnJvcilqanRlMDAwOw0KLSAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0vKkBlZ2VuKi8NCi19DQotIA0KLQ0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQotLy8gUmV0dXJuIFN0YXRlbWVudA0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQotdm9pZCBSZXR1cm5TdGF0ZW1lbnQoKToNCi17LypAYmdlbihqanRyZWUpIFJldHVyblN0YXRlbWVudCAqLw0KLSAgQVNUUmV0dXJuU3RhdGVtZW50IGpqdG4wMDAgPSBuZXcgQVNUUmV0dXJuU3RhdGVtZW50KHRoaXMsIEpKVFJFVFVSTlNUQVRFTUVOVCk7DQotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOw0KLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotLypAZWdlbiovfQ0KLXsvKkBiZ2VuKGpqdHJlZSkgUmV0dXJuU3RhdGVtZW50ICovDQotICAgICAgICB0cnkgew0KLS8qQGVnZW4qLw0KLSAgICAgICAgPFJFVFVSTj4gW0xpc3RFeHByZXNzaW9uKCldLypAYmdlbihqanRyZWUpKi8NCi0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsNCi0gICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIHRocm93IChFcnJvcilqanRlMDAwOw0KLSAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0vKkBlZ2VuKi8NCi19DQotDQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCi0vLyBUaHJvdyBTdGF0ZW1lbnQNCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KLXZvaWQgVGhyb3dTdGF0ZW1lbnQoKToNCi17LypAYmdlbihqanRyZWUpIFRocm93U3RhdGVtZW50ICovDQotICBBU1RUaHJvd1N0YXRlbWVudCBqanRuMDAwID0gbmV3IEFTVFRocm93U3RhdGVtZW50KHRoaXMsIEpKVFRIUk9XU1RBVEVNRU5UKTsNCi0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7DQotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0vKkBlZ2VuKi99DQotey8qQGJnZW4oamp0cmVlKSBUaHJvd1N0YXRlbWVudCAqLw0KLSAgICAgICAgdHJ5IHsNCi0vKkBlZ2VuKi8NCi0gICAgICAgIDxUSFJPVz4gTGlzdEV4cHJlc3Npb24oKS8qQGJnZW4oamp0cmVlKSovDQotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsNCi0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7DQotICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICB0aHJvdyAoRXJyb3Ipamp0ZTAwMDsNCi0gICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOw0KLSAgICAgICAgICB9DQotICAgICAgICB9DQotLypAZWdlbiovDQotfQ0KLQ0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQotLy8gVHJ5IFN0YXRlbWVudA0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQotdm9pZCBUcnlTdGF0ZW1lbnQoKToNCi17LypAYmdlbihqanRyZWUpIFRyeVN0YXRlbWVudCAqLw0KLSAgQVNUVHJ5U3RhdGVtZW50IGpqdG4wMDAgPSBuZXcgQVNUVHJ5U3RhdGVtZW50KHRoaXMsIEpKVFRSWVNUQVRFTUVOVCk7DQotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOw0KLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotLypAZWdlbiovfQ0KLXsvKkBiZ2VuKGpqdHJlZSkgVHJ5U3RhdGVtZW50ICovDQotICAgICAgICB0cnkgew0KLS8qQGVnZW4qLw0KLSAgICAgICAgPFRSWT4gQmxvY2soKQ0KLSAgICAgICAgKDxDQVRDSD4gPExQQVJFTj4gSWRlbnRpZmllcigpIDxSUEFSRU4+IEJsb2NrKCkpKg0KLSAgICAgICAgWzxGSU5BTExZPiBCbG9jaygpXS8qQGJnZW4oamp0cmVlKSovDQotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsNCi0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7DQotICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICB0aHJvdyAoRXJyb3Ipamp0ZTAwMDsNCi0gICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOw0KLSAgICAgICAgICB9DQotICAgICAgICB9DQotLypAZWdlbiovDQotfSANCi0gDQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCi0vLyBEaXJlY3RpdmVzIA0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQotdm9pZCBEaXJlY3RpdmVzICgpOg0KLXsvKkBiZ2VuKGpqdHJlZSkgRGlyZWN0aXZlcyAqLw0KLSAgQVNURGlyZWN0aXZlcyBqanRuMDAwID0gbmV3IEFTVERpcmVjdGl2ZXModGhpcywgSkpURElSRUNUSVZFUyk7DQotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOw0KLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotLypAZWdlbiovfQ0KLXsvKkBiZ2VuKGpqdHJlZSkgRGlyZWN0aXZlcyAqLw0KLSAgICAgICAgdHJ5IHsNCi0vKkBlZ2VuKi8NCi0gICAgICAgIChEaXJlY3RpdmUoKSkrLypAYmdlbihqanRyZWUpKi8NCi0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsNCi0gICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIHRocm93IChFcnJvcilqanRlMDAwOw0KLSAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0vKkBlZ2VuKi8NCi19DQotDQotdm9pZCBEaXJlY3RpdmUgKCk6DQotey8qQGJnZW4oamp0cmVlKSBEaXJlY3RpdmUgKi8NCi0gIEFTVERpcmVjdGl2ZSBqanRuMDAwID0gbmV3IEFTVERpcmVjdGl2ZSh0aGlzLCBKSlRESVJFQ1RJVkUpOw0KLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsNCi0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOw0KLS8qQGVnZW4qL30NCi17LypAYmdlbihqanRyZWUpIERpcmVjdGl2ZSAqLw0KLSAgICAgICAgICAgICAgICAgICAgICB0cnkgew0KLS8qQGVnZW4qLw0KLSAgICAgICAgICAgICAgICAgICAgICBFbXB0eVN0YXRlbWVudCgpDQotICAgICB8ICAgTE9PS0FIRUFEKDMpIFN0YXRlbWVudCgpDQotICAgICB8ICAgTE9PS0FIRUFEKDIpIEFubm90YXRhYmxlRGlyZWN0aXZlKCkNCi0gICAgIHwgICBMT09LQUhFQUQoMikgQXR0cmlidXRlcygpICAgICAgICAgICAgPExCUkFDRT4gRGlyZWN0aXZlcygpIDxSQlJBQ0U+DQotICAgICB8ICAgTE9PS0FIRUFEKDIpIEF0dHJpYnV0ZXMoKSAgICAgICAgICAgIEFubm90YXRhYmxlRGlyZWN0aXZlKCkgDQotICAgICB8ICAgICAgICAgICAgICAgIEluY2x1ZGVEaXJlY3RpdmUoKSAgICAgIFNjKCkNCi0gICAgIHwgICAgICAgICAgICAgICAgUHJhZ21hKCkgICAgICAgICAgICAgICAgU2MoKS8qQGJnZW4oamp0cmVlKSovDQotICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgKEVycm9yKWpqdGUwMDA7DQotICAgICAgICAgICAgICAgICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgIH0NCi0vKkBlZ2VuKi8NCi19DQotDQotdm9pZCBBbm5vdGF0YWJsZURpcmVjdGl2ZSAoKToNCi17LypAYmdlbihqanRyZWUpIEFubm90YXRhYmxlRGlyZWN0aXZlICovDQotICBBU1RBbm5vdGF0YWJsZURpcmVjdGl2ZSBqanRuMDAwID0gbmV3IEFTVEFubm90YXRhYmxlRGlyZWN0aXZlKHRoaXMsIEpKVEFOTk9UQVRBQkxFRElSRUNUSVZFKTsNCi0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7DQotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0vKkBlZ2VuKi99DQotey8qQGJnZW4oamp0cmVlKSBBbm5vdGF0YWJsZURpcmVjdGl2ZSAqLw0KLSAgICAgICAgIHRyeSB7DQotLypAZWdlbiovDQotICAgICAgICAgVmFyaWFibGVEZWZpbml0aW9uKCkgU2MoKQ0KLSAgICAgfCAgIEZ1bmN0aW9uRGVmaW5pdGlvbigpDQotICAgICB8ICAgQ2xhc3NEZWZpbml0aW9uKCkNCi0gICAgIHwgICBJbnRlcmZhY2VEZWZpbml0aW9uKCkNCi0gICAgIHwgICBOYW1lc3BhY2VEZWZpbml0aW9uKCkgU2MoKQ0KLSAgICAgfCAgIEltcG9ydERpcmVjdGl2ZSgpIFNjKCkNCi0gICAgIHwgICBFeHBvcnREZWZpbml0aW9uKCkgU2MoKQ0KLSAgICAgfCAgIFVzZURpcmVjdGl2ZSgpIFNjKCkvKkBiZ2VuKGpqdHJlZSkqLw0KLSAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7DQotICAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7DQotICAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsNCi0gICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7DQotICAgICAgICAgICB9DQotICAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICAgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgIH0NCi0gICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICAgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgICB9DQotICAgICAgICAgICB0aHJvdyAoRXJyb3Ipamp0ZTAwMDsNCi0gICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOw0KLSAgICAgICAgICAgfQ0KLSAgICAgICAgIH0NCi0vKkBlZ2VuKi8NCi19DQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCi0vLyBBdHRyaWJ1dGVzDQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCi12b2lkIEF0dHJpYnV0ZXMgKCk6DQotey8qQGJnZW4oamp0cmVlKSBBdHRyaWJ1dGVzICovDQotICBBU1RBdHRyaWJ1dGVzIGpqdG4wMDAgPSBuZXcgQVNUQXR0cmlidXRlcyh0aGlzLCBKSlRBVFRSSUJVVEVTKTsNCi0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7DQotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0vKkBlZ2VuKi99DQotey8qQGJnZW4oamp0cmVlKSBBdHRyaWJ1dGVzICovDQotICAgICAgICB0cnkgew0KLS8qQGVnZW4qLw0KLSAgICAgICAgKEF0dHJpYnV0ZSAoKSkrLypAYmdlbihqanRyZWUpKi8NCi0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsNCi0gICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIHRocm93IChFcnJvcilqanRlMDAwOw0KLSAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0vKkBlZ2VuKi8NCi19DQotDQotdm9pZCBBdHRyaWJ1dGUgKCk6DQotey8qQGJnZW4oamp0cmVlKSBBdHRyaWJ1dGUgKi8NCi0gIEFTVEF0dHJpYnV0ZSBqanRuMDAwID0gbmV3IEFTVEF0dHJpYnV0ZSh0aGlzLCBKSlRBVFRSSUJVVEUpOw0KLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsNCi0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOw0KLS8qQGVnZW4qL30NCi17LypAYmdlbihqanRyZWUpIEF0dHJpYnV0ZSAqLw0KLSAgICAgICAgICAgICAgICAgICAgIHRyeSB7DQotLypAZWdlbiovDQotICAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlRXhwcmVzc2lvbigpDQotICAgIHwgICAgICAgICAgICAgICAgPFRSVUU+DQotICAgIHwgICAgICAgICAgICAgICAgPEZBTFNFPi8qQGJnZW4oamp0cmVlKSovDQotICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsNCi0gICAgICAgICAgICAgICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOw0KLSAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsNCi0gICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgIHRocm93IChFcnJvcilqanRlMDAwOw0KLSAgICAgICAgICAgICAgICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgICAgICAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7DQotICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgfQ0KLS8qQGVnZW4qLw0KLX0NCi0NCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KLS8vIFVzZSBEaXJlY3RpdmUNCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KLXZvaWQgVXNlRGlyZWN0aXZlICgpOg0KLXsvKkBiZ2VuKGpqdHJlZSkgVXNlRGlyZWN0aXZlICovDQotICBBU1RVc2VEaXJlY3RpdmUgamp0bjAwMCA9IG5ldyBBU1RVc2VEaXJlY3RpdmUodGhpcywgSkpUVVNFRElSRUNUSVZFKTsNCi0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7DQotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0vKkBlZ2VuKi99DQotey8qQGJnZW4oamp0cmVlKSBVc2VEaXJlY3RpdmUgKi8NCi0gICAgICAgIHRyeSB7DQotLypAZWdlbiovIA0KLSAgICAgICAgPFVTRT4gPE5BTUVTUEFDRT4gPExQQVJFTj4gTGlzdEV4cHJlc3Npb24oKSA8UlBBUkVOPi8qQGJnZW4oamp0cmVlKSovDQotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsNCi0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7DQotICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICB0aHJvdyAoRXJyb3Ipamp0ZTAwMDsNCi0gICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOw0KLSAgICAgICAgICB9DQotICAgICAgICB9DQotLypAZWdlbiovDQotfQ0KLQ0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQotLy8gSW1wb3J0IERpcmVjdGl2ZQ0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQotdm9pZCBJbXBvcnREaXJlY3RpdmUgKCk6DQotey8qQGJnZW4oamp0cmVlKSBJbXBvcnREaXJlY3RpdmUgKi8NCi0gIEFTVEltcG9ydERpcmVjdGl2ZSBqanRuMDAwID0gbmV3IEFTVEltcG9ydERpcmVjdGl2ZSh0aGlzLCBKSlRJTVBPUlRESVJFQ1RJVkUpOw0KLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsNCi0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOw0KLS8qQGVnZW4qL30NCi17LypAYmdlbihqanRyZWUpIEltcG9ydERpcmVjdGl2ZSAqLw0KLSAgICAgICAgdHJ5IHsNCi0vKkBlZ2VuKi8NCi0gICAgICAgIExPT0tBSEVBRCgzKSA8SU1QT1JUPiBQYWNrYWdlTmFtZSgpDQotICAgIHwgICAgICAgICAgICAgICAgPElNUE9SVD4gSWRlbnRpZmllcigpIDxBU1NJR04+IFBhY2thZ2VOYW1lKCkvKkBiZ2VuKGpqdHJlZSkqLw0KLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7DQotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOw0KLSAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgdGhyb3cgKEVycm9yKWpqdGUwMDA7DQotICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLS8qQGVnZW4qLw0KLX0NCi0NCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KLS8vIEluY2x1ZGUgRGlyZWN0aXZlDQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCi12b2lkIEluY2x1ZGVEaXJlY3RpdmUgKCk6IA0KLXsvKkBiZ2VuKGpqdHJlZSkgSW5jbHVkZURpcmVjdGl2ZSAqLw0KLSAgQVNUSW5jbHVkZURpcmVjdGl2ZSBqanRuMDAwID0gbmV3IEFTVEluY2x1ZGVEaXJlY3RpdmUodGhpcywgSkpUSU5DTFVERURJUkVDVElWRSk7DQotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOw0KLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotLypAZWdlbiovfQ0KLXsvKkBiZ2VuKGpqdHJlZSkgSW5jbHVkZURpcmVjdGl2ZSAqLw0KLSAgICAgICAgdHJ5IHsNCi0vKkBlZ2VuKi8NCi0gICAgICAgIDxJTkNMVURFPiA8U1RSSU5HX0xJVEVSQUw+LypAYmdlbihqanRyZWUpKi8NCi0gICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOw0KLSAgICAgICAgICB9DQotICAgICAgICB9DQotLypAZWdlbiovDQotfQ0KLQ0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQotLy8gUHJhZ21hDQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCi12b2lkIFByYWdtYSAoKToNCi17LypAYmdlbihqanRyZWUpIFByYWdtYSAqLw0KLSAgQVNUUHJhZ21hIGpqdG4wMDAgPSBuZXcgQVNUUHJhZ21hKHRoaXMsIEpKVFBSQUdNQSk7DQotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOw0KLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotLypAZWdlbiovfQ0KLXsvKkBiZ2VuKGpqdHJlZSkgUHJhZ21hICovDQotICAgICAgICB0cnkgew0KLS8qQGVnZW4qLw0KLSAgICAgICAgPFVTRT4gUHJhZ21hSXRlbXMoKS8qQGJnZW4oamp0cmVlKSovDQotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsNCi0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7DQotICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICB0aHJvdyAoRXJyb3Ipamp0ZTAwMDsNCi0gICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOw0KLSAgICAgICAgICB9DQotICAgICAgICB9DQotLypAZWdlbiovDQotfQ0KLQ0KLXZvaWQgUHJhZ21hSXRlbXMgKCk6DQotey8qQGJnZW4oamp0cmVlKSBQcmFnbWFJdGVtcyAqLw0KLSAgQVNUUHJhZ21hSXRlbXMgamp0bjAwMCA9IG5ldyBBU1RQcmFnbWFJdGVtcyh0aGlzLCBKSlRQUkFHTUFJVEVNUyk7DQotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOw0KLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotLypAZWdlbiovfQ0KLXsvKkBiZ2VuKGpqdHJlZSkgUHJhZ21hSXRlbXMgKi8NCi0gICAgICAgIHRyeSB7DQotLypAZWdlbiovDQotICAgICAgICBQcmFnbWFJdGVtKCkgKDxDT01NQT4gUHJhZ21hSXRlbSgpKS8qQGJnZW4oamp0cmVlKSovDQotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsNCi0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7DQotICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICB0aHJvdyAoRXJyb3Ipamp0ZTAwMDsNCi0gICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOw0KLSAgICAgICAgICB9DQotICAgICAgICB9DQotLypAZWdlbiovDQotfQ0KLQ0KLXZvaWQgUHJhZ21hSXRlbSAoKToNCi17LypAYmdlbihqanRyZWUpIFByYWdtYUl0ZW0gKi8NCi0gIEFTVFByYWdtYUl0ZW0gamp0bjAwMCA9IG5ldyBBU1RQcmFnbWFJdGVtKHRoaXMsIEpKVFBSQUdNQUlURU0pOw0KLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsNCi0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOw0KLS8qQGVnZW4qL30NCi17LypAYmdlbihqanRyZWUpIFByYWdtYUl0ZW0gKi8NCi0gICAgICAgIHRyeSB7DQotLypAZWdlbiovDQotICAgICAgICBQcmFnbWFFeHByKCkgWzxIT09LPl0vKkBiZ2VuKGpqdHJlZSkqLw0KLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7DQotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOw0KLSAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgdGhyb3cgKEVycm9yKWpqdGUwMDA7DQotICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLS8qQGVnZW4qLw0KLX0NCi0NCi0NCi12b2lkIFByYWdtYUV4cHIgKCk6DQotey8qQGJnZW4oamp0cmVlKSBQcmFnbWFFeHByICovDQotICBBU1RQcmFnbWFFeHByIGpqdG4wMDAgPSBuZXcgQVNUUHJhZ21hRXhwcih0aGlzLCBKSlRQUkFHTUFFWFBSKTsNCi0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7DQotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0vKkBlZ2VuKi99DQotey8qQGJnZW4oamp0cmVlKSBQcmFnbWFFeHByICovDQotICAgICAgICB0cnkgew0KLS8qQGVnZW4qLw0KLSAgICAgICAgSWRlbnRpZmllcigpIFs8TFBBUkVOPiBQcmFnbWFBcmd1bWVudCgpIDxSUEFSRU4+XS8qQGJnZW4oamp0cmVlKSovDQotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsNCi0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7DQotICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICB0aHJvdyAoRXJyb3Ipamp0ZTAwMDsNCi0gICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOw0KLSAgICAgICAgICB9DQotICAgICAgICB9DQotLypAZWdlbiovDQotfQ0KLQ0KLXZvaWQgUHJhZ21hQXJndW1lbnQgKCk6DQotey8qQGJnZW4oamp0cmVlKSBQcmFnbWFBcmd1bWVudCAqLw0KLSAgQVNUUHJhZ21hQXJndW1lbnQgamp0bjAwMCA9IG5ldyBBU1RQcmFnbWFBcmd1bWVudCh0aGlzLCBKSlRQUkFHTUFBUkdVTUVOVCk7DQotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOw0KLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotLypAZWdlbiovfQ0KLXsvKkBiZ2VuKGpqdHJlZSkgUHJhZ21hQXJndW1lbnQgKi8NCi0gICAgICAgIHRyeSB7DQotLypAZWdlbiovDQotICAgICAgICA8VFJVRT4NCi0gICAgfCAgIDxGQUxTRT4NCi0gICAgfCAgIDxERUNJTUFMX0xJVEVSQUw+IA0KLSAgICB8ICAgPE9DVEFMX0xJVEVSQUw+DQotICAgIHwgICA8SEVYX0xJVEVSQUw+DQotICAgIHwgICA8RkxPQVRJTkdfUE9JTlRfTElURVJBTD4gDQotICAgIHwgICA8U1RSSU5HX0xJVEVSQUw+LypAYmdlbihqanRyZWUpKi8NCi0gICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOw0KLSAgICAgICAgICB9DQotICAgICAgICB9DQotLypAZWdlbiovIA0KLX0NCi0NCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KLS8vIERlZmluaXRpb25zIA0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQotDQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCi0vLyBFeHBvcnQgRGVmaW5pdGlvbiANCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KLXZvaWQgRXhwb3J0RGVmaW5pdGlvbiAoKToNCi17LypAYmdlbihqanRyZWUpIEV4cG9ydERlZmluaXRpb24gKi8NCi0gIEFTVEV4cG9ydERlZmluaXRpb24gamp0bjAwMCA9IG5ldyBBU1RFeHBvcnREZWZpbml0aW9uKHRoaXMsIEpKVEVYUE9SVERFRklOSVRJT04pOw0KLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsNCi0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOw0KLS8qQGVnZW4qL30NCi17LypAYmdlbihqanRyZWUpIEV4cG9ydERlZmluaXRpb24gKi8NCi0gICAgICAgIHRyeSB7DQotLypAZWdlbiovDQotICAgICAgICA8RVhQT1JUPiBFeHBvcnRCaW5kaW5nTGlzdCAoKS8qQGJnZW4oamp0cmVlKSovDQotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsNCi0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7DQotICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICB0aHJvdyAoRXJyb3Ipamp0ZTAwMDsNCi0gICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOw0KLSAgICAgICAgICB9DQotICAgICAgICB9DQotLypAZWdlbiovDQotfQ0KLQ0KLXZvaWQgRXhwb3J0QmluZGluZ0xpc3QgKCk6DQotey8qQGJnZW4oamp0cmVlKSBFeHBvcnRCaW5kaW5nTGlzdCAqLw0KLSAgQVNURXhwb3J0QmluZGluZ0xpc3Qgamp0bjAwMCA9IG5ldyBBU1RFeHBvcnRCaW5kaW5nTGlzdCh0aGlzLCBKSlRFWFBPUlRCSU5ESU5HTElTVCk7DQotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOw0KLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotLypAZWdlbiovfQ0KLXsvKkBiZ2VuKGpqdHJlZSkgRXhwb3J0QmluZGluZ0xpc3QgKi8NCi0gICAgICAgIHRyeSB7DQotLypAZWdlbiovDQotICAgICAgICBFeHBvcnRCaW5kaW5nKCkgKDxDT01NQT4gRXhwb3J0QmluZGluZygpKSovKkBiZ2VuKGpqdHJlZSkqLw0KLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7DQotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOw0KLSAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgdGhyb3cgKEVycm9yKWpqdGUwMDA7DQotICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLS8qQGVnZW4qLw0KLX0NCi0NCi12b2lkIEV4cG9ydEJpbmRpbmcgKCk6DQotey8qQGJnZW4oamp0cmVlKSBFeHBvcnRCaW5kaW5nICovDQotICBBU1RFeHBvcnRCaW5kaW5nIGpqdG4wMDAgPSBuZXcgQVNURXhwb3J0QmluZGluZyh0aGlzLCBKSlRFWFBPUlRCSU5ESU5HKTsNCi0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7DQotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0vKkBlZ2VuKi99DQotey8qQGJnZW4oamp0cmVlKSBFeHBvcnRCaW5kaW5nICovDQotICAgICAgICB0cnkgew0KLS8qQGVnZW4qLw0KLSAgICAgICAgTE9PS0FIRUFEKDIpIEZ1bmN0aW9uTmFtZSAoKQ0KLSAgICB8ICAgICAgICAgICAgICAgIEZ1bmN0aW9uTmFtZSAoKSA8QVNTSUdOPiBGdW5jdGlvbk5hbWUgKCkvKkBiZ2VuKGpqdHJlZSkqLw0KLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7DQotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOw0KLSAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgdGhyb3cgKEVycm9yKWpqdGUwMDA7DQotICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLS8qQGVnZW4qLw0KLX0NCi0NCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KLS8vIFZhcmlhYmxlIERlZmluaXRpb24gKGluLCBOb0lOKQ0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQotdm9pZCBWYXJpYWJsZURlZmluaXRpb24gKCk6DQotey8qQGJnZW4oamp0cmVlKSBWYXJpYWJsZURlZmluaXRpb24gKi8NCi0gIEFTVFZhcmlhYmxlRGVmaW5pdGlvbiBqanRuMDAwID0gbmV3IEFTVFZhcmlhYmxlRGVmaW5pdGlvbih0aGlzLCBKSlRWQVJJQUJMRURFRklOSVRJT04pOw0KLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsNCi0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOw0KLS8qQGVnZW4qL30NCi17LypAYmdlbihqanRyZWUpIFZhcmlhYmxlRGVmaW5pdGlvbiAqLw0KLSAgICAgICAgdHJ5IHsNCi0vKkBlZ2VuKi8NCi0gICAgICAgIFZhcmlhYmxlRGVmaW5pdGlvbktpbmQoKSBWYXJpYWJsZUJpbmRpbmdMaXN0KCkvKkBiZ2VuKGpqdHJlZSkqLw0KLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7DQotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOw0KLSAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgdGhyb3cgKEVycm9yKWpqdGUwMDA7DQotICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLS8qQGVnZW4qLw0KLX0NCi0NCi12b2lkIFZhcmlhYmxlRGVmaW5pdGlvbk5vSU4gKCk6DQotey8qQGJnZW4oamp0cmVlKSBWYXJpYWJsZURlZmluaXRpb25Ob0lOICovDQotICBBU1RWYXJpYWJsZURlZmluaXRpb25Ob0lOIGpqdG4wMDAgPSBuZXcgQVNUVmFyaWFibGVEZWZpbml0aW9uTm9JTih0aGlzLCBKSlRWQVJJQUJMRURFRklOSVRJT05OT0lOKTsNCi0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7DQotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0vKkBlZ2VuKi99DQotey8qQGJnZW4oamp0cmVlKSBWYXJpYWJsZURlZmluaXRpb25Ob0lOICovDQotICAgICAgICB0cnkgew0KLS8qQGVnZW4qLw0KLSAgICAgICAgVmFyaWFibGVEZWZpbml0aW9uS2luZCgpIFZhcmlhYmxlQmluZGluZ0xpc3ROb0lOKCkvKkBiZ2VuKGpqdHJlZSkqLw0KLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7DQotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOw0KLSAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgdGhyb3cgKEVycm9yKWpqdGUwMDA7DQotICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLS8qQGVnZW4qLw0KLX0NCi0NCi0NCi12b2lkIFZhcmlhYmxlRGVmaW5pdGlvbktpbmQgKCk6DQotey8qQGJnZW4oamp0cmVlKSBWYXJpYWJsZURlZmluaXRpb25LaW5kICovDQotICBBU1RWYXJpYWJsZURlZmluaXRpb25LaW5kIGpqdG4wMDAgPSBuZXcgQVNUVmFyaWFibGVEZWZpbml0aW9uS2luZCh0aGlzLCBKSlRWQVJJQUJMRURFRklOSVRJT05LSU5EKTsNCi0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7DQotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0vKkBlZ2VuKi99DQotey8qQGJnZW4oamp0cmVlKSBWYXJpYWJsZURlZmluaXRpb25LaW5kICovDQotICAgICAgICB0cnkgew0KLS8qQGVnZW4qLw0KLSAgICAgICAgPFZBUj4NCi0gICAgfCAgIDxDT05TVD4vKkBiZ2VuKGpqdHJlZSkqLw0KLSAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0vKkBlZ2VuKi8NCi19DQotDQotdm9pZCBWYXJpYWJsZUJpbmRpbmdMaXN0ICgpOg0KLXsvKkBiZ2VuKGpqdHJlZSkgVmFyaWFibGVCaW5kaW5nTGlzdCAqLw0KLSAgQVNUVmFyaWFibGVCaW5kaW5nTGlzdCBqanRuMDAwID0gbmV3IEFTVFZhcmlhYmxlQmluZGluZ0xpc3QodGhpcywgSkpUVkFSSUFCTEVCSU5ESU5HTElTVCk7DQotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOw0KLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotLypAZWdlbiovfQ0KLXsvKkBiZ2VuKGpqdHJlZSkgVmFyaWFibGVCaW5kaW5nTGlzdCAqLw0KLSAgIHRyeSB7DQotLypAZWdlbiovDQotICAgVmFyaWFibGVCaW5kaW5nKCkgKDxDT01NQT4gVmFyaWFibGVCaW5kaW5nICgpKSovKkBiZ2VuKGpqdHJlZSkqLw0KLSAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7DQotICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7DQotICAgICAgIGpqdGMwMDAgPSBmYWxzZTsNCi0gICAgIH0gZWxzZSB7DQotICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7DQotICAgICB9DQotICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsNCi0gICAgICAgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgIH0NCi0gICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsNCi0gICAgICAgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICB9DQotICAgICB0aHJvdyAoRXJyb3Ipamp0ZTAwMDsNCi0gICB9IGZpbmFsbHkgew0KLSAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOw0KLSAgICAgfQ0KLSAgIH0NCi0vKkBlZ2VuKi8NCi19DQotDQotdm9pZCBWYXJpYWJsZUJpbmRpbmdMaXN0Tm9JTiAoKToNCi17LypAYmdlbihqanRyZWUpIFZhcmlhYmxlQmluZGluZ0xpc3ROb0lOICovDQotICBBU1RWYXJpYWJsZUJpbmRpbmdMaXN0Tm9JTiBqanRuMDAwID0gbmV3IEFTVFZhcmlhYmxlQmluZGluZ0xpc3ROb0lOKHRoaXMsIEpKVFZBUklBQkxFQklORElOR0xJU1ROT0lOKTsNCi0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7DQotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0vKkBlZ2VuKi99DQotey8qQGJnZW4oamp0cmVlKSBWYXJpYWJsZUJpbmRpbmdMaXN0Tm9JTiAqLw0KLSAgIHRyeSB7DQotLypAZWdlbiovDQotICAgVmFyaWFibGVCaW5kaW5nTm9JTigpICg8Q09NTUE+IFZhcmlhYmxlQmluZGluZ05vSU4oKSkqLypAYmdlbihqanRyZWUpKi8NCi0gICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgew0KLSAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgICBqanRjMDAwID0gZmFsc2U7DQotICAgICB9IGVsc2Ugew0KLSAgICAgICBqanRyZWUucG9wTm9kZSgpOw0KLSAgICAgfQ0KLSAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7DQotICAgICAgIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICB9DQotICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7DQotICAgICAgIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgfQ0KLSAgICAgdGhyb3cgKEVycm9yKWpqdGUwMDA7DQotICAgfSBmaW5hbGx5IHsNCi0gICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsNCi0gICAgIH0NCi0gICB9DQotLypAZWdlbiovDQotfQ0KLQ0KLXZvaWQgVmFyaWFibGVCaW5kaW5nICgpOg0KLXsvKkBiZ2VuKGpqdHJlZSkgVmFyaWFibGVCaW5kaW5nICovDQotICBBU1RWYXJpYWJsZUJpbmRpbmcgamp0bjAwMCA9IG5ldyBBU1RWYXJpYWJsZUJpbmRpbmcodGhpcywgSkpUVkFSSUFCTEVCSU5ESU5HKTsNCi0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7DQotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0vKkBlZ2VuKi99DQotey8qQGJnZW4oamp0cmVlKSBWYXJpYWJsZUJpbmRpbmcgKi8NCi0gICAgICAgIHRyeSB7DQotLypAZWdlbiovDQotICAgICAgICBUeXBlZElkZW50aWZpZXIoKSBbVmFyaWFibGVJbml0aWFsaXNhdGlvbigpXS8qQGJnZW4oamp0cmVlKSovDQotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsNCi0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7DQotICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICB0aHJvdyAoRXJyb3Ipamp0ZTAwMDsNCi0gICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOw0KLSAgICAgICAgICB9DQotICAgICAgICB9DQotLypAZWdlbiovDQotfQ0KLQ0KLXZvaWQgVmFyaWFibGVCaW5kaW5nTm9JTiAoKToNCi17LypAYmdlbihqanRyZWUpIFZhcmlhYmxlQmluZGluZ05vSU4gKi8NCi0gIEFTVFZhcmlhYmxlQmluZGluZ05vSU4gamp0bjAwMCA9IG5ldyBBU1RWYXJpYWJsZUJpbmRpbmdOb0lOKHRoaXMsIEpKVFZBUklBQkxFQklORElOR05PSU4pOw0KLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsNCi0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOw0KLS8qQGVnZW4qL30NCi17LypAYmdlbihqanRyZWUpIFZhcmlhYmxlQmluZGluZ05vSU4gKi8NCi0gICAgICAgIHRyeSB7DQotLypAZWdlbiovDQotICAgICAgICBUeXBlZElkZW50aWZpZXJOb0lOKCkgW1ZhcmlhYmxlSW5pdGlhbGlzYXRpb25Ob0lOKCldLypAYmdlbihqanRyZWUpKi8NCi0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsNCi0gICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIHRocm93IChFcnJvcilqanRlMDAwOw0KLSAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0vKkBlZ2VuKi8NCi19DQotDQotDQotdm9pZCBWYXJpYWJsZUluaXRpYWxpc2F0aW9uICgpOg0KLXsvKkBiZ2VuKGpqdHJlZSkgVmFyaWFibGVJbml0aWFsaXNhdGlvbiAqLw0KLSAgQVNUVmFyaWFibGVJbml0aWFsaXNhdGlvbiBqanRuMDAwID0gbmV3IEFTVFZhcmlhYmxlSW5pdGlhbGlzYXRpb24odGhpcywgSkpUVkFSSUFCTEVJTklUSUFMSVNBVElPTik7DQotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOw0KLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotLypAZWdlbiovfQ0KLXsvKkBiZ2VuKGpqdHJlZSkgVmFyaWFibGVJbml0aWFsaXNhdGlvbiAqLw0KLSAgICAgICB0cnkgew0KLS8qQGVnZW4qLw0KLSAgICAgICA8QVNTSUdOPiAgVmFyaWFibGVJbml0aWFsaXplciAoKS8qQGJnZW4oamp0cmVlKSovDQotICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7DQotICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsNCi0gICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsNCi0gICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsNCi0gICAgICAgICB9DQotICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7DQotICAgICAgICAgICB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgIH0NCi0gICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7DQotICAgICAgICAgICB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICB9DQotICAgICAgICAgdGhyb3cgKEVycm9yKWpqdGUwMDA7DQotICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsNCi0gICAgICAgICB9DQotICAgICAgIH0NCi0vKkBlZ2VuKi8NCi19DQotDQotdm9pZCBWYXJpYWJsZUluaXRpYWxpc2F0aW9uTm9JTiAoKToNCi17LypAYmdlbihqanRyZWUpIFZhcmlhYmxlSW5pdGlhbGlzYXRpb25Ob0lOICovDQotICBBU1RWYXJpYWJsZUluaXRpYWxpc2F0aW9uTm9JTiBqanRuMDAwID0gbmV3IEFTVFZhcmlhYmxlSW5pdGlhbGlzYXRpb25Ob0lOKHRoaXMsIEpKVFZBUklBQkxFSU5JVElBTElTQVRJT05OT0lOKTsNCi0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7DQotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0vKkBlZ2VuKi99DQotey8qQGJnZW4oamp0cmVlKSBWYXJpYWJsZUluaXRpYWxpc2F0aW9uTm9JTiAqLw0KLSAgICAgICB0cnkgew0KLS8qQGVnZW4qLw0KLSAgICAgICA8QVNTSUdOPiAgVmFyaWFibGVJbml0aWFsaXplck5vSU4gKCkvKkBiZ2VuKGpqdHJlZSkqLw0KLSAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgew0KLSAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7DQotICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7DQotICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7DQotICAgICAgICAgfQ0KLSAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICB9DQotICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgfQ0KLSAgICAgICAgIHRocm93IChFcnJvcilqanRlMDAwOw0KLSAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7DQotICAgICAgICAgfQ0KLSAgICAgICB9DQotLypAZWdlbiovDQotfQ0KLQ0KLXZvaWQgVmFyaWFibGVJbml0aWFsaXplciAoKToNCi17LypAYmdlbihqanRyZWUpIFZhcmlhYmxlSW5pdGlhbGl6ZXIgKi8NCi0gIEFTVFZhcmlhYmxlSW5pdGlhbGl6ZXIgamp0bjAwMCA9IG5ldyBBU1RWYXJpYWJsZUluaXRpYWxpemVyKHRoaXMsIEpKVFZBUklBQkxFSU5JVElBTElaRVIpOw0KLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsNCi0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOw0KLS8qQGVnZW4qL30NCi17LypAYmdlbihqanRyZWUpIFZhcmlhYmxlSW5pdGlhbGl6ZXIgKi8NCi0gICAgICAgIHRyeSB7DQotLypAZWdlbiovDQotICAgICAgICBMT09LQUhFQUQoMykgQXNzaWdubWVudEV4cHJlc3Npb24gKCkNCi0gICAgfCAgICAgICAgICAgICAgICBBdHRyaWJ1dGVzICgpLypAYmdlbihqanRyZWUpKi8NCi0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsNCi0gICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIHRocm93IChFcnJvcilqanRlMDAwOw0KLSAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0vKkBlZ2VuKi8NCi19DQotDQotdm9pZCBWYXJpYWJsZUluaXRpYWxpemVyTm9JTiAoKToNCi17LypAYmdlbihqanRyZWUpIFZhcmlhYmxlSW5pdGlhbGl6ZXJOb0lOICovDQotICBBU1RWYXJpYWJsZUluaXRpYWxpemVyTm9JTiBqanRuMDAwID0gbmV3IEFTVFZhcmlhYmxlSW5pdGlhbGl6ZXJOb0lOKHRoaXMsIEpKVFZBUklBQkxFSU5JVElBTElaRVJOT0lOKTsNCi0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7DQotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0vKkBlZ2VuKi99DQotey8qQGJnZW4oamp0cmVlKSBWYXJpYWJsZUluaXRpYWxpemVyTm9JTiAqLw0KLSAgICAgICAgdHJ5IHsNCi0vKkBlZ2VuKi8NCi0gICAgICAgIExPT0tBSEVBRCgzKSBBc3NpZ25tZW50RXhwcmVzc2lvbk5vSU4gKCkNCi0gICAgfCAgICAgICAgICAgICAgICBBdHRyaWJ1dGVzICgpLypAYmdlbihqanRyZWUpKi8NCi0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsNCi0gICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIHRocm93IChFcnJvcilqanRlMDAwOw0KLSAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0vKkBlZ2VuKi8NCi19DQotDQotDQotdm9pZCBUeXBlZElkZW50aWZpZXIgKCk6DQotey8qQGJnZW4oamp0cmVlKSBUeXBlZElkZW50aWZpZXIgKi8NCi0gIEFTVFR5cGVkSWRlbnRpZmllciBqanRuMDAwID0gbmV3IEFTVFR5cGVkSWRlbnRpZmllcih0aGlzLCBKSlRUWVBFRElERU5USUZJRVIpOw0KLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsNCi0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOw0KLS8qQGVnZW4qL30NCi17LypAYmdlbihqanRyZWUpIFR5cGVkSWRlbnRpZmllciAqLw0KLSAgICAgICAgdHJ5IHsNCi0vKkBlZ2VuKi8NCi0gICAgICAgIElkZW50aWZpZXIgKCkgWzxDT0xPTj4gVHlwZUV4cHJlc3Npb24oKV0vKkBiZ2VuKGpqdHJlZSkqLw0KLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7DQotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOw0KLSAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgdGhyb3cgKEVycm9yKWpqdGUwMDA7DQotICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLS8qQGVnZW4qLw0KLX0NCi0NCi12b2lkIFR5cGVkSWRlbnRpZmllck5vSU4gKCk6DQotey8qQGJnZW4oamp0cmVlKSBUeXBlZElkZW50aWZpZXJOb0lOICovDQotICBBU1RUeXBlZElkZW50aWZpZXJOb0lOIGpqdG4wMDAgPSBuZXcgQVNUVHlwZWRJZGVudGlmaWVyTm9JTih0aGlzLCBKSlRUWVBFRElERU5USUZJRVJOT0lOKTsNCi0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7DQotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0vKkBlZ2VuKi99DQotey8qQGJnZW4oamp0cmVlKSBUeXBlZElkZW50aWZpZXJOb0lOICovDQotICAgICAgICB0cnkgew0KLS8qQGVnZW4qLw0KLSAgICAgICAgSWRlbnRpZmllciAoKSBbPENPTE9OPiBUeXBlRXhwcmVzc2lvbk5vSU4oKV0vKkBiZ2VuKGpqdHJlZSkqLw0KLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7DQotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOw0KLSAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgdGhyb3cgKEVycm9yKWpqdGUwMDA7DQotICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLS8qQGVnZW4qLw0KLX0NCi0NCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KLS8vIFNpbXBsZSBWYXJpYWJsZSBEZWZpbml0aW9uIA0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQotdm9pZCBTaW1wbGVWYXJpYWJsZURlZmluaXRpb24gKCk6DQotey8qQGJnZW4oamp0cmVlKSBTaW1wbGVWYXJpYWJsZURlZmluaXRpb24gKi8NCi0gIEFTVFNpbXBsZVZhcmlhYmxlRGVmaW5pdGlvbiBqanRuMDAwID0gbmV3IEFTVFNpbXBsZVZhcmlhYmxlRGVmaW5pdGlvbih0aGlzLCBKSlRTSU1QTEVWQVJJQUJMRURFRklOSVRJT04pOw0KLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsNCi0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOw0KLS8qQGVnZW4qL30NCi17LypAYmdlbihqanRyZWUpIFNpbXBsZVZhcmlhYmxlRGVmaW5pdGlvbiAqLw0KLSAgICAgICAgdHJ5IHsNCi0vKkBlZ2VuKi8NCi0gICAgICAgIDxWQVI+IFVudHlwZWRWYXJpYWJsZUJpbmRpbmdMaXN0KCkvKkBiZ2VuKGpqdHJlZSkqLw0KLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7DQotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOw0KLSAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgdGhyb3cgKEVycm9yKWpqdGUwMDA7DQotICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLS8qQGVnZW4qLw0KLX0NCi0NCi12b2lkIFVudHlwZWRWYXJpYWJsZUJpbmRpbmdMaXN0ICgpOg0KLXsvKkBiZ2VuKGpqdHJlZSkgVW50eXBlZFZhcmlhYmxlQmluZGluZ0xpc3QgKi8NCi0gIEFTVFVudHlwZWRWYXJpYWJsZUJpbmRpbmdMaXN0IGpqdG4wMDAgPSBuZXcgQVNUVW50eXBlZFZhcmlhYmxlQmluZGluZ0xpc3QodGhpcywgSkpUVU5UWVBFRFZBUklBQkxFQklORElOR0xJU1QpOw0KLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsNCi0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOw0KLS8qQGVnZW4qL30NCi17LypAYmdlbihqanRyZWUpIFVudHlwZWRWYXJpYWJsZUJpbmRpbmdMaXN0ICovDQotICAgICAgICB0cnkgew0KLS8qQGVnZW4qLw0KLSAgICAgICAgVW50eXBlZFZhcmlhYmxlQmluZGluZygpICg8Q09NTUE+IFVudHlwZWRWYXJpYWJsZUJpbmRpbmcoKSkqLypAYmdlbihqanRyZWUpKi8NCi0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsNCi0gICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIHRocm93IChFcnJvcilqanRlMDAwOw0KLSAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0vKkBlZ2VuKi8NCi19DQotDQotdm9pZCBVbnR5cGVkVmFyaWFibGVCaW5kaW5nICgpOg0KLXsvKkBiZ2VuKGpqdHJlZSkgVW50eXBlZFZhcmlhYmxlQmluZGluZyAqLw0KLSAgQVNUVW50eXBlZFZhcmlhYmxlQmluZGluZyBqanRuMDAwID0gbmV3IEFTVFVudHlwZWRWYXJpYWJsZUJpbmRpbmcodGhpcywgSkpUVU5UWVBFRFZBUklBQkxFQklORElORyk7DQotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOw0KLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotLypAZWdlbiovfQ0KLXsvKkBiZ2VuKGpqdHJlZSkgVW50eXBlZFZhcmlhYmxlQmluZGluZyAqLw0KLSAgICAgICAgdHJ5IHsNCi0vKkBlZ2VuKi8NCi0gICAgICAgIElkZW50aWZpZXIoKSBWYXJpYWJsZUluaXRpYWxpc2F0aW9uKCkvKkBiZ2VuKGpqdHJlZSkqLw0KLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7DQotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOw0KLSAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgdGhyb3cgKEVycm9yKWpqdGUwMDA7DQotICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLS8qQGVnZW4qLw0KLX0NCi0NCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KLS8vIEZ1bmN0aW9uIERlZmluaXRpb24NCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KLXZvaWQgRnVuY3Rpb25EZWZpbml0aW9uICgpOg0KLXsvKkBiZ2VuKGpqdHJlZSkgRnVuY3Rpb25EZWZpbml0aW9uICovDQotICBBU1RGdW5jdGlvbkRlZmluaXRpb24gamp0bjAwMCA9IG5ldyBBU1RGdW5jdGlvbkRlZmluaXRpb24odGhpcywgSkpURlVOQ1RJT05ERUZJTklUSU9OKTsNCi0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7DQotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0vKkBlZ2VuKi99DQotey8qQGJnZW4oamp0cmVlKSBGdW5jdGlvbkRlZmluaXRpb24gKi8NCi0gICAgICAgIHRyeSB7DQotLypAZWdlbiovDQotICAgICAgICA8RlVOQ1RJT04+IEZ1bmN0aW9uTmFtZSgpIEZ1bmN0aW9uQ29tbW9uKCkvKkBiZ2VuKGpqdHJlZSkqLw0KLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7DQotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOw0KLSAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgdGhyb3cgKEVycm9yKWpqdGUwMDA7DQotICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLS8qQGVnZW4qLw0KLX0NCi0NCi12b2lkIEZ1bmN0aW9uTmFtZSAoKToNCi17LypAYmdlbihqanRyZWUpIEZ1bmN0aW9uTmFtZSAqLw0KLSAgQVNURnVuY3Rpb25OYW1lIGpqdG4wMDAgPSBuZXcgQVNURnVuY3Rpb25OYW1lKHRoaXMsIEpKVEZVTkNUSU9OTkFNRSk7DQotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOw0KLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotLypAZWdlbiovfQ0KLXsvKkBiZ2VuKGpqdHJlZSkgRnVuY3Rpb25OYW1lICovDQotICAgICAgICB0cnkgew0KLS8qQGVnZW4qLw0KLSAgICAgICAgLy8gbm8gbGluZSBicmVhayBhZnRlciBnZXQNCi0gICAgICAgIExPT0tBSEVBRCgyKSA8R0VUPiBJZGVudGlmaWVyKCkNCi0gICAgICAgIC8vIG5vIGxpbmUgYnJlYWsgYWZ0ZXIgZ2V0DQotICAgIHwgICBMT09LQUhFQUQoMikgPFNFVD4gSWRlbnRpZmllcigpDQotICAgIHwgICAgICAgICAgICAgICAgIElkZW50aWZpZXIoKS8qQGJnZW4oamp0cmVlKSovDQotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsNCi0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7DQotICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICB0aHJvdyAoRXJyb3Ipamp0ZTAwMDsNCi0gICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOw0KLSAgICAgICAgICB9DQotICAgICAgICB9DQotLypAZWdlbiovDQotfQ0KLQ0KLXZvaWQgRnVuY3Rpb25Db21tb24gKCk6DQotey8qQGJnZW4oamp0cmVlKSBGdW5jdGlvbkNvbW1vbiAqLw0KLSAgQVNURnVuY3Rpb25Db21tb24gamp0bjAwMCA9IG5ldyBBU1RGdW5jdGlvbkNvbW1vbih0aGlzLCBKSlRGVU5DVElPTkNPTU1PTik7DQotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOw0KLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotLypAZWdlbiovfQ0KLXsvKkBiZ2VuKGpqdHJlZSkgRnVuY3Rpb25Db21tb24gKi8NCi0gICAgICAgIHRyeSB7DQotLypAZWdlbiovDQotICAgICAgICA8TFBBUkVOPiBbUGFyYW1ldGVycygpXSA8UlBBUkVOPiBbUmVzdWx0KCldIEJsb2NrKCkvKkBiZ2VuKGpqdHJlZSkqLw0KLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7DQotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOw0KLSAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgdGhyb3cgKEVycm9yKWpqdGUwMDA7DQotICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLS8qQGVnZW4qLw0KLX0NCi0NCi12b2lkIFBhcmFtZXRlcnMgKCk6DQotey8qQGJnZW4oamp0cmVlKSBQYXJhbWV0ZXJzICovDQotICBBU1RQYXJhbWV0ZXJzIGpqdG4wMDAgPSBuZXcgQVNUUGFyYW1ldGVycyh0aGlzLCBKSlRQQVJBTUVURVJTKTsNCi0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7DQotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0vKkBlZ2VuKi99DQotey8qQGJnZW4oamp0cmVlKSBQYXJhbWV0ZXJzICovDQotICAgICAgICB0cnkgew0KLS8qQGVnZW4qLw0KLSAgICAgICAgUmVzdFBhcmFtZXRlcnMoKQ0KLSAgICB8ICAgUGFyYW1ldGVySW5pdCgpICg8Q09NTUE+IFBhcmFtZXRlckluaXQoKSkqIFtSZXN0UGFyYW1ldGVycygpXS8qQGJnZW4oamp0cmVlKSovDQotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsNCi0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7DQotICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICB0aHJvdyAoRXJyb3Ipamp0ZTAwMDsNCi0gICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOw0KLSAgICAgICAgICB9DQotICAgICAgICB9DQotLypAZWdlbiovDQotfQ0KLQ0KLXZvaWQgUGFyYW1ldGVyICgpOg0KLXsvKkBiZ2VuKGpqdHJlZSkgUGFyYW1ldGVyICovDQotICBBU1RQYXJhbWV0ZXIgamp0bjAwMCA9IG5ldyBBU1RQYXJhbWV0ZXIodGhpcywgSkpUUEFSQU1FVEVSKTsNCi0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7DQotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0vKkBlZ2VuKi99DQotey8qQGJnZW4oamp0cmVlKSBQYXJhbWV0ZXIgKi8NCi0gICAgICAgIHRyeSB7DQotLypAZWdlbiovDQotICAgICAgICBbPENPTlNUPl0gVHlwZWRJZGVudGlmaWVyKCkvKkBiZ2VuKGpqdHJlZSkqLw0KLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7DQotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOw0KLSAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgdGhyb3cgKEVycm9yKWpqdGUwMDA7DQotICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLS8qQGVnZW4qLw0KLX0NCi0NCi12b2lkIFBhcmFtZXRlckluaXQgKCk6DQotey8qQGJnZW4oamp0cmVlKSBQYXJhbWV0ZXJJbml0ICovDQotICBBU1RQYXJhbWV0ZXJJbml0IGpqdG4wMDAgPSBuZXcgQVNUUGFyYW1ldGVySW5pdCh0aGlzLCBKSlRQQVJBTUVURVJJTklUKTsNCi0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7DQotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0vKkBlZ2VuKi99DQotey8qQGJnZW4oamp0cmVlKSBQYXJhbWV0ZXJJbml0ICovDQotICAgICAgICB0cnkgew0KLS8qQGVnZW4qLw0KLSAgICAgICAgUGFyYW1ldGVyKCkgWzxBU1NJR04+IEFzc2lnbm1lbnRFeHByZXNzaW9uKCldLypAYmdlbihqanRyZWUpKi8NCi0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsNCi0gICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIHRocm93IChFcnJvcilqanRlMDAwOw0KLSAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0vKkBlZ2VuKi8NCi19DQotDQotdm9pZCBSZXN0UGFyYW1ldGVycyAoKToNCi17LypAYmdlbihqanRyZWUpIFJlc3RQYXJhbWV0ZXJzICovDQotICBBU1RSZXN0UGFyYW1ldGVycyBqanRuMDAwID0gbmV3IEFTVFJlc3RQYXJhbWV0ZXJzKHRoaXMsIEpKVFJFU1RQQVJBTUVURVJTKTsNCi0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7DQotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0vKkBlZ2VuKi99DQotey8qQGJnZW4oamp0cmVlKSBSZXN0UGFyYW1ldGVycyAqLw0KLSAgICAgICAgdHJ5IHsNCi0vKkBlZ2VuKi8NCi0gICAgICAgIDxFTElQU0U+IFs8Q09OU1Q+IElkZW50aWZpZXIoKV0vKkBiZ2VuKGpqdHJlZSkqLw0KLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7DQotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOw0KLSAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgdGhyb3cgKEVycm9yKWpqdGUwMDA7DQotICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLS8qQGVnZW4qLw0KLX0NCi0NCi12b2lkIFJlc3VsdCAoKToNCi17LypAYmdlbihqanRyZWUpIFJlc3VsdCAqLw0KLSAgQVNUUmVzdWx0IGpqdG4wMDAgPSBuZXcgQVNUUmVzdWx0KHRoaXMsIEpKVFJFU1VMVCk7DQotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOw0KLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotLypAZWdlbiovfQ0KLXsvKkBiZ2VuKGpqdHJlZSkgUmVzdWx0ICovDQotICAgICAgICB0cnkgew0KLS8qQGVnZW4qLw0KLSAgICAgICAgPENPTE9OPiBUeXBlRXhwcmVzc2lvbigpLypAYmdlbihqanRyZWUpKi8NCi0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsNCi0gICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIHRocm93IChFcnJvcilqanRlMDAwOw0KLSAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0vKkBlZ2VuKi8NCi19DQotDQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCi0vLyBDbGFzcyBEZWZpbml0aW9uDQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCi12b2lkIENsYXNzRGVmaW5pdGlvbiAoKToNCi17LypAYmdlbihqanRyZWUpIENsYXNzRGVmaW5pdGlvbiAqLw0KLSAgQVNUQ2xhc3NEZWZpbml0aW9uIGpqdG4wMDAgPSBuZXcgQVNUQ2xhc3NEZWZpbml0aW9uKHRoaXMsIEpKVENMQVNTREVGSU5JVElPTik7DQotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOw0KLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotLypAZWdlbiovfQ0KLXsvKkBiZ2VuKGpqdHJlZSkgQ2xhc3NEZWZpbml0aW9uICovDQotICAgICAgICB0cnkgew0KLS8qQGVnZW4qLw0KLSAgICAgICAgPENMQVNTPiBJZGVudGlmaWVyKCkgW0luaGVyaXRhbmNlKCldIEJsb2NrKCkvKkBiZ2VuKGpqdHJlZSkqLw0KLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7DQotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOw0KLSAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgdGhyb3cgKEVycm9yKWpqdGUwMDA7DQotICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLS8qQGVnZW4qLw0KLX0NCi0NCi12b2lkIEludGVyZmFjZURlZmluaXRpb24gKCk6DQotey8qQGJnZW4oamp0cmVlKSBJbnRlcmZhY2VEZWZpbml0aW9uICovDQotICBBU1RJbnRlcmZhY2VEZWZpbml0aW9uIGpqdG4wMDAgPSBuZXcgQVNUSW50ZXJmYWNlRGVmaW5pdGlvbih0aGlzLCBKSlRJTlRFUkZBQ0VERUZJTklUSU9OKTsNCi0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7DQotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0vKkBlZ2VuKi99DQotey8qQGJnZW4oamp0cmVlKSBJbnRlcmZhY2VEZWZpbml0aW9uICovDQotICAgICAgICB0cnkgew0KLS8qQGVnZW4qLw0KLSAgICAgICAgTE9PS0FIRUFEKDMpIDxJTlRFUkZBQ0U+IElkZW50aWZpZXIoKSBTYygpDQotICAgIHwgICAgICAgICAgICAgICAgPElOVEVSRkFDRT4gSWRlbnRpZmllcigpIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFs8RVhURU5EUz4gVHlwZUV4cHJlc3Npb25MaXN0KCldIEJsb2NrKCkvKkBiZ2VuKGpqdHJlZSkqLw0KLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7DQotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOw0KLSAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgdGhyb3cgKEVycm9yKWpqdGUwMDA7DQotICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLS8qQGVnZW4qLw0KLX0NCi0NCi0NCi12b2lkIEluaGVyaXRhbmNlICgpOg0KLXsvKkBiZ2VuKGpqdHJlZSkgSW5oZXJpdGFuY2UgKi8NCi0gIEFTVEluaGVyaXRhbmNlIGpqdG4wMDAgPSBuZXcgQVNUSW5oZXJpdGFuY2UodGhpcywgSkpUSU5IRVJJVEFOQ0UpOw0KLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsNCi0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOw0KLS8qQGVnZW4qL30NCi17LypAYmdlbihqanRyZWUpIEluaGVyaXRhbmNlICovDQotICAgICAgICB0cnkgew0KLS8qQGVnZW4qLyANCi0gICAgICAgIDxFWFRFTkRTPiBUeXBlRXhwcmVzc2lvbigpIFs8SU1QTEVNRU5UUz4gVHlwZUV4cHJlc3Npb25MaXN0KCldDQotICAgIHwgICA8SU1QTEVNRU5UUz4gVHlwZUV4cHJlc3Npb25MaXN0KCkvKkBiZ2VuKGpqdHJlZSkqLw0KLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7DQotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOw0KLSAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgdGhyb3cgKEVycm9yKWpqdGUwMDA7DQotICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLS8qQGVnZW4qLw0KLX0NCi0NCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KLS8vIE5hbWVzcGFjZSBEZWZpbml0aW9uIA0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQotdm9pZCBOYW1lc3BhY2VEZWZpbml0aW9uICgpOg0KLXsvKkBiZ2VuKGpqdHJlZSkgTmFtZXNwYWNlRGVmaW5pdGlvbiAqLw0KLSAgQVNUTmFtZXNwYWNlRGVmaW5pdGlvbiBqanRuMDAwID0gbmV3IEFTVE5hbWVzcGFjZURlZmluaXRpb24odGhpcywgSkpUTkFNRVNQQUNFREVGSU5JVElPTik7DQotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOw0KLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotLypAZWdlbiovfQ0KLXsvKkBiZ2VuKGpqdHJlZSkgTmFtZXNwYWNlRGVmaW5pdGlvbiAqLw0KLSAgICAgICAgdHJ5IHsNCi0vKkBlZ2VuKi8NCi0gICAgICAgIDxOQU1FU1BBQ0U+IElkZW50aWZpZXIoKS8qQGJnZW4oamp0cmVlKSovDQotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsNCi0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7DQotICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICB0aHJvdyAoRXJyb3Ipamp0ZTAwMDsNCi0gICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOw0KLSAgICAgICAgICB9DQotICAgICAgICB9DQotLypAZWdlbiovDQotfQ0KLQ0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQotLy8gUGFja2FnZSBEZWZpbml0aW9uIA0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQotdm9pZCBQYWNrYWdlRGVmaW5pdGlvbiAoKToNCi17LypAYmdlbihqanRyZWUpIFBhY2thZ2VEZWZpbml0aW9uICovDQotICBBU1RQYWNrYWdlRGVmaW5pdGlvbiBqanRuMDAwID0gbmV3IEFTVFBhY2thZ2VEZWZpbml0aW9uKHRoaXMsIEpKVFBBQ0tBR0VERUZJTklUSU9OKTsNCi0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7DQotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0vKkBlZ2VuKi99DQotey8qQGJnZW4oamp0cmVlKSBQYWNrYWdlRGVmaW5pdGlvbiAqLw0KLSAgICAgICAgdHJ5IHsNCi0vKkBlZ2VuKi8NCi0gICAgICAgIDxQQUNLQUdFPiBbUGFja2FnZU5hbWUoKV0gQmxvY2soKS8qQGJnZW4oamp0cmVlKSovDQotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsNCi0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7DQotICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICB0aHJvdyAoRXJyb3Ipamp0ZTAwMDsNCi0gICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOw0KLSAgICAgICAgICB9DQotICAgICAgICB9DQotLypAZWdlbiovDQotfQ0KLQ0KLXZvaWQgUGFja2FnZU5hbWUgKCk6DQotey8qQGJnZW4oamp0cmVlKSBQYWNrYWdlTmFtZSAqLw0KLSAgQVNUUGFja2FnZU5hbWUgamp0bjAwMCA9IG5ldyBBU1RQYWNrYWdlTmFtZSh0aGlzLCBKSlRQQUNLQUdFTkFNRSk7DQotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOw0KLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotLypAZWdlbiovfQ0KLXsvKkBiZ2VuKGpqdHJlZSkgUGFja2FnZU5hbWUgKi8NCi0gICAgICAgIHRyeSB7DQotLypAZWdlbiovDQotICAgICAgICA8U1RSSU5HX0xJVEVSQUw+DQotICAgIHwgICBQYWNrYWdlSWRlbnRpZmllcnMoKS8qQGJnZW4oamp0cmVlKSovDQotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsNCi0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7DQotICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICB0aHJvdyAoRXJyb3Ipamp0ZTAwMDsNCi0gICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOw0KLSAgICAgICAgICB9DQotICAgICAgICB9DQotLypAZWdlbiovDQotfQ0KLQ0KLXZvaWQgUGFja2FnZUlkZW50aWZpZXJzICgpOg0KLXsvKkBiZ2VuKGpqdHJlZSkgUGFja2FnZUlkZW50aWZpZXJzICovDQotICBBU1RQYWNrYWdlSWRlbnRpZmllcnMgamp0bjAwMCA9IG5ldyBBU1RQYWNrYWdlSWRlbnRpZmllcnModGhpcywgSkpUUEFDS0FHRUlERU5USUZJRVJTKTsNCi0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7DQotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0vKkBlZ2VuKi99DQotey8qQGJnZW4oamp0cmVlKSBQYWNrYWdlSWRlbnRpZmllcnMgKi8NCi0gICAgICAgIHRyeSB7DQotLypAZWdlbiovDQotICAgICAgICBJZGVudGlmaWVyKCkgKDxET1Q+IElkZW50aWZpZXIoKSkqLypAYmdlbihqanRyZWUpKi8NCi0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsNCi0gICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIHRocm93IChFcnJvcilqanRlMDAwOw0KLSAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0vKkBlZ2VuKi8NCi19DQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvanMyLjAuamp0IGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvanMyLjAuamp0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyODAzNWJjLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL2pzMi4wLmpqdAorKysgL2Rldi9udWxsCkBAIC0xLDE1MDEgKzAsMCBAQAotb3B0aW9ucyB7Ci0gICAgU1RBVElDPWZhbHNlOwotICAgIE1VTFRJPXRydWU7Ci0gICAgVklTSVRPUj10cnVlOwotICAgIE5PREVfVVNFU19QQVJTRVI9dHJ1ZTsKLSAgICBERUJVR19UT0tFTl9NQU5BR0VSPWZhbHNlOwotICAgIERFQlVHX1BBUlNFUj1mYWxzZTsKLX0KLQotUEFSU0VSX0JFR0lOKEpTUGFyc2VyMjApCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5qYXZhc2NyaXB0MjBwYXJzZXI7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLXB1YmxpYyBjbGFzcyBKU1BhcnNlcjIwIAotewotICAgIC8vCi0gICAgLy8gVGhpcyBpcyB0aGUgcm9vdCBub2RlIGZvciB0aGUgcGFyc2UgdHJlZSAocm9vdCBET00gbm9kZSwgdHJlZSBvZiBTaW1wbGVOb2RlKHMpKQotICAgIC8vCi0gICAgcHJvdGVjdGVkIEFTVFByb2dyYW0gX2pqdFJvb3Q7Ci0gICAgCi0gICAgcHVibGljIEFTVFByb2dyYW0gZ2V0Um9vdE5vZGUoKQotICAgIHsKLSAgICAJcmV0dXJuIF9qanRSb290OwotICAgIH0KLSAgICAKLX0KLQotUEFSU0VSX0VORChKU1BhcnNlcjIwKQotCi0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIExFWElDQUwgUlVMRVMgU2VjdGlvbgotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLVRPS0VOX01HUl9ERUNMUyA6Ci17Ci0gICAgcHJpdmF0ZSBib29sZWFuIGlzUmVnVmFsaWQgPSB0cnVlOwotICAgIHB1YmxpYyB2b2lkIHNldFJlZ0ludmFsaWQoKQotICAgIHsKLSAgICAgICAgaXNSZWdWYWxpZCA9IGZhbHNlOwotICAgIH0KLSAgICBwdWJsaWMgdm9pZCBzZXRSZWdWYWxpZCgpCi0gICAgewotICAgICAgICBpc1JlZ1ZhbGlkID0gdHJ1ZTsKLSAgICB9Ci19Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyBXSElURSBTUEFDRSAKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi1TUEVDSUFMX1RPS0VOIDoKLXsKLSAgICAgICAgPEVPTDogICAoWyJcbiIsIlxyIl0pKyA+Ci0gICAgfCAgIDxXUzogICAgKFsiICIsIlx0Il0pKyA+Ci19Ci0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gQ09NTUVOVFMgCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotTU9SRSA6Ci17Ci0gICAgICAgICIvLyIgOiBJTl9TSU5HTEVfTElORV9DT01NRU5UCi0gICAgfCAgICIvKiIgOiBJTl9NVUxUSV9MSU5FX0NPTU1FTlQKLX0KLQotPElOX1NJTkdMRV9MSU5FX0NPTU1FTlQ+Ci1TUEVDSUFMX1RPS0VOIDoKLXsKLSAgICAgICAgPCBTSU5HTEVfTElORV9DT01NRU5UOiAoflsiXG4iLCJcciJdKSogKCJcbiJ8IlxyInwiXHJcbiIpPyA+ICA6IERFRkFVTFQKLX0KLQotPElOX01VTFRJX0xJTkVfQ09NTUVOVD4KLVNQRUNJQUxfVE9LRU4gOgotewotICAgICAgICA8TVVMVElfTElORV9DT01NRU5UOiAiKi8iID4gOiBERUZBVUxUCi19Ci0KLTxJTl9TSU5HTEVfTElORV9DT01NRU5ULCBJTl9NVUxUSV9MSU5FX0NPTU1FTlQ+Ci1NT1JFIDoKLXsKLSAgICAgICAgPCB+W10gPgotfQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIFJFU0VSVkVEIFdPUkRTIEFORCBMSVRFUkFMUwotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLVRPS0VOIDoKLXsKLSAgICAgICAgPCBBUzogICAgICAgICAgICJhcyIgICAgICAgICA+Ci0gICAgfCAgIDwgQlJFQUs6ICAgICAgICAiYnJlYWsiICAgICAgPgotICAgIHwgICA8IENBU0U6ICAgICAgICAgImNhc2UiICAgICAgID4KLSAgICB8ICAgPCBDQVRDSDogICAgICAgICJjYXRjaCIgICAgICA+Ci0gICAgfCAgIDwgQ0xBU1M6ICAgICAgICAiY2xhc3MiICAgICAgPgotICAgIHwgICA8IENPTlNUOiAgICAgICAgImNvbnN0IiAgICAgID4KLSAgICB8ICAgPCBDT05USU5VRTogICAgICJjb250aW51ZSIgICA+Ci0gICAgfCAgIDwgX0RFRkFVTFQ6ICAgICAiZGVmYXVsdCIgICAgPgotICAgIHwgICA8IERFTEVURTogICAgICAgImRlbGV0ZSIgICAgID4KLSAgICB8ICAgPCBETzogICAgICAgICAgICJkbyIgICAgICAgICA+Ci0gICAgfCAgIDwgRUxTRTogICAgICAgICAiZWxzZSIgICAgICAgPgotICAgIHwgICA8IEVYVEVORFM6ICAgICAgImV4dGVuZHMiICAgID4KLSAgICB8ICAgPCBGQUxTRTogICAgICAgICJmYWxzZSIgICAgICA+ICAgCi0gICAgfCAgIDwgRklOQUxMWTogICAgICAiZmluYWxseSIgICAgPgotICAgIHwgICA8IEZPUjogICAgICAgICAgImZvciIgICAgICAgID4KLSAgICB8ICAgPCBGVU5DVElPTjogICAgICJmdW5jdGlvbiIgICA+Ci0gICAgfCAgIDwgRlVOQ1RJT05fOiAgICAiRnVuY3Rpb24iICAgPgotICAgIHwgICA8IEdFVDogICAgICAgICAgImdldCIgICAgICAgID4KLSAgICB8ICAgPCBJRjogICAgICAgICAgICJpZiIgICAgICAgICA+Ci0gICAgfCAgIDwgSU46ICAgICAgICAgICAiaW4iICAgICAgICAgPgotICAgIHwgICA8IElOQ0xVREU6ICAgICAgImluY2x1ZGUiICAgID4KLSAgICB8ICAgPCBJTlNUQU5DRU9GOiAgICJpbnN0YW5jZW9mIiA+Ci0gICAgfCAgIDwgSVM6ICAgICAgICAgICAiaXMiICAgICAgICAgPgotICAgIHwgICA8IE5BTUVTUEFDRTogICAgIm5hbWVzcGFjZSIgID4KLSAgICB8ICAgPCBORVc6ICAgICAgICAgICJuZXciICAgICAgICA+Ci0gICAgfCAgIDwgTlVMTDogICAgICAgICAibnVsbCIgICAgICAgPiAgICAKLSAgICB8ICAgPCBQQUNLQUdFOiAgICAgICJwYWNrYWdlIiAgICA+IAotICAgIHwgICA8IFBSSVZBVEU6ICAgICAgInByaXZhdGUiICAgID4KLSAgICB8ICAgPCBQVUJMSUM6ICAgICAgICJwdWJsaWMiICAgICA+Ci0gICAgfCAgIDwgUkVUVVJOOiAgICAgICAicmV0dXJuIiAgICAgPgotICAgIHwgICA8IFNFVDogICAgICAgICAgInNldCIgICAgICAgID4KLSAgICB8ICAgPCBTVVBFUjogICAgICAgICJzdXBlciIgICAgICA+Ci0gICAgfCAgIDwgU1dJVENIOiAgICAgICAic3dpdGNoIiAgICAgPgotICAgIHwgICA8IFRISVM6ICAgICAgICAgInRoaXMiICAgICAgID4KLSAgICB8ICAgPCBUSFJPVzogICAgICAgICJ0aHJvdyIgICAgICA+Ci0gICAgfCAgIDwgVFJVRTogICAgICAgICAidHJ1ZSIgICAgICAgPiAKLSAgICB8ICAgPCBUUlk6ICAgICAgICAgICJ0cnkiICAgICAgICA+Ci0gICAgfCAgIDwgVFlQRU9GOiAgICAgICAidHlwZW9mIiAgICAgPgotICAgIHwgICA8IFVTRTogICAgICAgICAgInVzZSIgICAgICAgID4KLSAgICB8ICAgPCBWQVI6ICAgICAgICAgICJ2YXIiICAgICAgICA+Ci0gICAgfCAgIDwgVk9JRDogICAgICAgICAidm9pZCIgICAgICAgPgotICAgIHwgICA8IFdISUxFOiAgICAgICAgIndoaWxlIiAgICAgID4KLSAgICB8ICAgPCBXSVRIOiAgICAgICAgICJ3aXRoIiAgICAgICA+Ci19Ci0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gRlVUVVJFIFJFU0VSVkVEIFdPUkRTCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotVE9LRU4gOgotewotICAgICAgICA8IEFCU1RSQUNUOiAgICAgImFic3RyYWN0IiAgICAgPgotICAgIHwgICA8IERFQlVHR0VSOiAgICAgImRlYnVnZ2VyIiAgICAgPgotICAgIHwgICA8IEVOVU06ICAgICAgICAgImVudW0iICAgICAgICAgPgotICAgIHwgICA8IEVYUE9SVDogICAgICAgImV4cG9ydCIgICAgICAgPgotICAgIHwgICA8IEdPVE86ICAgICAgICAgImdvdG8iICAgICAgICAgPgotICAgIHwgICA8IElNUExFTUVOVFM6ICAgImltcGxlbWVudHMiICAgPgotICAgIHwgICA8IElOVEVSRkFDRTogICAgImludGVyZmFjZSIgICAgPgotICAgIHwgICA8IE5BVElWRTogICAgICAgIm5hdGl2ZSIgICAgICAgPgotICAgIHwgICA8IFBST1RFQ1RFRDogICAgInByb3RlY3RlZCIgICAgPgotICAgIHwgICA8IFNZTkNIUk9OSVpFRDogInN5bmNocm9uaXplZCIgPgotICAgIHwgICA8IFRIUk9XUzogICAgICAgInRocm93cyIgICAgICAgPgotICAgIHwgICA8IFRSQU5TSUVOVDogICAgInRyYW5zaWVudCIgICAgPgotICAgIHwgICA8IFZPTEFUSUxFOiAgICAgInZvbGF0aWxlIiAgICAgPgotICAgIHwgICA8IElNUE9SVDogICAgICAgImltcG9ydCIgICAgICAgPgotfQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIExJVEVSQUxTIAotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLVRPS0VOIDoKLXsKLSAgICAgICAgPCBERUNJTUFMX0xJVEVSQUw6IFsiMSItIjkiXSAoWyIwIi0iOSJdKSogPgotICAgIHwgICA8IEhFWF9MSVRFUkFMOiAiMCIgWyJ4IiwiWCJdIChbIjAiLSI5IiwiYSItImYiLCJBIi0iRiJdKSsgPgotICAgIHwgICA8IE9DVEFMX0xJVEVSQUw6ICIwIiAoWyIwIi0iNyJdKSogPgotICAgIHwgICA8IEZMT0FUSU5HX1BPSU5UX0xJVEVSQUw6IChbIjAiLSI5Il0pKyAiLiIgKFsiMCItIjkiXSkqICg8RVhQT05FTlQ+KT8gCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAiLiIgKFsiMCItIjkiXSkrICg8RVhQT05FTlQ+KT8gCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAoWyIwIi0iOSJdKSsgKDxFWFBPTkVOVD4pPyAKLSAgICAgICAgPgotICAgIHwgICA8ICNFWFBPTkVOVDogWyJlIiwiRSJdIChbIisiLCItIl0pPyAoWyIwIi0iOSJdKSsgPgotICAgIHwgICA8IFNUUklOR19MSVRFUkFMOiAgICJcIiIgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICggKH5bIlwiIiwiXFwiLCJcbiIsIlxyIl0pIHwgPEVTQ0FQRV9TRVFVRU5DRT4gKSogCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiIgotICAgICAgICAgICAgICAgICAgICAgICAgfCAgICJcIiIgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKCAoflsiXCIiLCJcXCJdKSB8ICJcXCIgKCJcbiIgfCAiXHIiIHwgIlxyXG4iKSB8IDxFU0NBUEVfU0VRVUVOQ0U+ICkqIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcIiIgIAotICAgICAgICAgICAgICAgICAgICAgICAgfCAgICInIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICggKH5bIiciLCJcXCIsIlxuIiwiXHIiXSkgfCA8RVNDQVBFX1NFUVVFTkNFPiApKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICInIgotICAgICAgICA+Ci0gICAgfCAgIDwgI0VTQ0FQRV9TRVFVRU5DRTogCi0gICAgICAgICAgICAiXFwiCi0gICAgICAgICAgICAoICAgICAgIFsibiIsInQiLCJiIiwiciIsImYiLCJcXCIsIiciLCJcIiIsIlsiLCJdIl0KLSAgICAgICAgICAgICAgICB8ICAgWyIwIi0iNyJdICggWyIwIi0iNyJdICk/Ci0gICAgICAgICAgICAgICAgfCAgIFsiMCItIjMiXSBbIjAiLSI3Il0gWyIwIi0iNyJdCi0gICAgICAgICAgICAgICAgfCAgIFsieCJdIFsiMCItIjkiLCJhIi0iZiIsIkEiLSJGIl0gWyIwIi0iOSIsImEiLSJmIiwiQSItIkYiXQotICAgICAgICAgICAgICAgIHwgICBbInUiXSBbIjAiLSI5IiwiYSItImYiLCJBIi0iRiJdIFsiMCItIjkiLCJhIi0iZiIsIkEiLSJGIl0gCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFsiMCItIjkiLCJhIi0iZiIsIkEiLSJGIl0gWyIwIi0iOSIsImEiLSJmIiwiQSItIkYiXQotICAgICAgICAgICAgKQotICAgICAgICA+Ci0gICAgfCAgIDwgVU5URVJNSU5BVEVEX1NUUklOR19MSVRFUkFMOgotICAgICAgICAgICAgICAgICJcIiIgKCAoflsiXCIiLCJcXCIsIlxuIiwiXHIiXSkgfCA8RVNDQVBFX1NFUVVFTkNFPiApKiAoIFsiXG4iLCJcciJdICk/Ci0gICAgICAgICAgICB8ICAgIiciICAoICh+WyInIiwiXFwiLCJcbiIsIlxyIl0pICB8IDxFU0NBUEVfU0VRVUVOQ0U+ICkqICggWyJcbiIsIlxyIl0gKT8KLSAgICAgICAgPgotfQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIFJFR1VMQVIgRVhQUkVTU0lPTlMgCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotVE9LRU4gOgoteyAKLSAgICAgICAgPCAjUkVHWF9TVEFSVF9DSEFSIDogflsiXHIiLCJcbiIsIi8iLCI9IiwiKiJdIHwgIlxcLyI+Ci0gICAgfCAgIDwgI1JFR1hfQk9EWV9DSEFSX0VYQ0xVU0lPTiA6IH5bIlxyIiwiXG4iLCIvIl0gPiAgCi0gICAgfCAgIDwgI1JFR1hfQk9EWV9DSEFSIDogKCA8UkVHWF9CT0RZX0NIQVJfRVhDTFVTSU9OPiB8ICJcXC8iICkgPgotICAgIHwgICA8ICNSRUdFWF9FTkRfQ0hBUiA6ICAgICAiaSIgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICJnIiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgIm0iIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAiaWciIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAiaW0iIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAiZ2kiIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAiZ20iIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAibWkiIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAibWciIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAiaWdtIiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgImltZyIgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICJnbWkiIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAiZ2ltIiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgIm1pZyIgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICJtZ2kiIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICA+Ci19Ci0KLVRPS0VOIDoKLXsKLSAgICAgICAgPFJFR1VMQVJfRVhQUkVTU0lPTiA6ICIvIiA8UkVHWF9TVEFSVF9DSEFSPiAoPFJFR1hfQk9EWV9DSEFSPikqICIvIiAgKDxSRUdFWF9FTkRfQ0hBUj4pPyA+Ci0gICAgICAgIHsKLSAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAvLyBQZWVrIGF0IHRoZSBuZXh0IGNoYXJhY3Rlci4KLSAgICAgICAgICAgICAgICBjaGFyIG5leHRDaCA9IGlucHV0X3N0cmVhbS5yZWFkQ2hhcigpOwotICAgICAgICAgICAgICAgIGlucHV0X3N0cmVhbS5iYWNrdXAoMSk7Ci0gICAgICAgICAgICAgICAgaWYgKGlzUmVnVmFsaWQgPT0gZmFsc2UgfHwgbmV4dENoID09ICcvJyB8fCBuZXh0Q2ggPT0gJyonKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAgICAgICAgIC8vIExleGVjYWwgYW5hbHlzZXIgdGhpbmtzIGl0IGlzIGEgUkUKLSAgICAgICAgICAgICAgICAgICAgLy8gb3BlcmF0b3Igc3VjaCBhcyAvLi4uLi4vCi0gICAgICAgICAgICAgICAgICAgIC8vIFB1dCB0aGUgZXZlcnl0aGluZyB0byB0aGUgZmlyc3QgIi8iIGJhY2sgb24gdGhlIGlucHV0IHN0cmVhbQotICAgICAgICAgICAgICAgICAgICAvLwotICAgICAgICAgICAgICAgICAgICBpbnB1dF9zdHJlYW0uYmFja3VwKGxlbmd0aE9mTWF0Y2gtMSk7Ci0gICAgICAgICAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAgICAgICAgIC8vIEFuZCByZW1vdmUgaXQgZnJvbSB0aGUgdG9rZW4KLSAgICAgICAgICAgICAgICAgICAgLy8KLSAgICAgICAgICAgICAgICAgICAgbWF0Y2hlZFRva2VuLmltYWdlID0gbWF0Y2hlZFRva2VuLmltYWdlLnN1YnN0cmluZygwLCAxKTsKLSAgICAgICAgICAgICAgICAgICAgaW1hZ2UuZGVsZXRlKDAsIGltYWdlLmxlbmd0aCgpIC0gMSk7Ci0gICAgICAgICAgICAgICAgICAgIGltYWdlLmFwcGVuZCgnLycpOwotICAgICAgICAgICAgICAgICAgICBtYXRjaGVkVG9rZW4ua2luZD1TTEFTSDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihlLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgfQotICAgICAgIH0gICAgICAgIAotICAgICAgICAKLX0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyBJREVOVElGSUVSUyAKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi1UT0tFTiA6Ci17Ci0gICAgICAgIDwgSURFTlRJRklFUjogPExFVFRFUj4gKDxMRVRURVI+fDxESUdJVD4pKiA+Ci0gICAgfCAgIDwgI0xFVFRFUjogWyJhIi0ieiIsIkEiLSJaIiwiJCIsIl8iXSA+Ci0gICAgfCAgIDwgI0RJR0lUOiBbIjAiLSI5Il0+Ci19Ci0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gU0VQQVJBVE9SUyAKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi1UT0tFTiA6Ci17Ci0gICAgICAgIDwgTFBBUkVOOiAgICAiKCIgICA+Ci0gICAgfCAgIDwgUlBBUkVOOiAgICAiKSIgICA+Ci0gICAgfCAgIDwgTEJSQUNFOiAgICAieyIgICA+Ci0gICAgfCAgIDwgUkJSQUNFOiAgICAifSIgICA+Ci0gICAgfCAgIDwgTEJSQUNLRVQ6ICAiWyIgICA+Ci0gICAgfCAgIDwgUkJSQUNLRVQ6ICAiXSIgICA+Ci0gICAgfCAgIDwgU0VNSUNPTE9OOiAiOyIgICA+Ci0gICAgfCAgIDwgQ09NTUE6ICAgICAiLCIgICA+Ci0gICAgfCAgIDwgRE9UOiAgICAgICAiLiIgICA+Ci0gICAgfCAgIDwgUVVBTElGSUVSOiAiOjoiICA+Ci0gICAgfCAgIDwgRUxJUFNFOiAgICAiLi4uIiA+Ci19Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyBPUEVSQVRPUlMgCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotVE9LRU4gOgotewotICAgICAgICA8IEFTU0lHTjogICAgICAgICAgICAgICAiPSIgICAgPgotICAgIHwgICA8IEdUOiAgICAgICAgICAgICAgICAgICAiPiIgICAgPgotICAgIHwgICA8IExUOiAgICAgICAgICAgICAgICAgICAiPCIgICAgPgotICAgIHwgICA8IEJBTkc6ICAgICAgICAgICAgICAgICAiISIgICAgPgotICAgIHwgICA8IFRJTERFOiAgICAgICAgICAgICAgICAifiIgICAgPgotICAgIHwgICA8IEhPT0s6ICAgICAgICAgICAgICAgICAiPyIgICAgPgotICAgIHwgICA8IENPTE9OOiAgICAgICAgICAgICAgICAiOiIgICAgPgotICAgIHwgICA8IEVROiAgICAgICAgICAgICAgICAgICAiPT0iICAgPgotICAgIHwgICA8IExFOiAgICAgICAgICAgICAgICAgICAiPD0iICAgPgotICAgIHwgICA8IEdFOiAgICAgICAgICAgICAgICAgICAiPj0iICAgPgotICAgIHwgICA8IE5FOiAgICAgICAgICAgICAgICAgICAiIT0iICAgPgotICAgIHwgICA8IFNDX09SOiAgICAgICAgICAgICAgICAifHwiICAgPgotICAgIHwgICA8IFNDX0FORDogICAgICAgICAgICAgICAiJiYiICAgPgotICAgIHwgICA8IFNDX1hPUjogICAgICAgICAgICAgICAiXl4iICAgPgotICAgIHwgICA8IElOQ1I6ICAgICAgICAgICAgICAgICAiKysiICAgPgotICAgIHwgICA8IERFQ1I6ICAgICAgICAgICAgICAgICAiLS0iICAgPgotICAgIHwgICA8IFBMVVM6ICAgICAgICAgICAgICAgICAiKyIgICAgPgotICAgIHwgICA8IE1JTlVTOiAgICAgICAgICAgICAgICAiLSIgICAgPgotICAgIHwgICA8IFNUQVI6ICAgICAgICAgICAgICAgICAiKiIgICAgPgotICAgIHwgICA8IFNMQVNIOiAgICAgICAgICAgICAgICAiLyIgICAgPgotICAgIHwgICA8IEJJVF9BTkQ6ICAgICAgICAgICAgICAiJiIgICAgPgotICAgIHwgICA8IEJJVF9PUjogICAgICAgICAgICAgICAifCIgICAgPgotICAgIHwgICA8IFhPUjogICAgICAgICAgICAgICAgICAiXiIgICAgPgotICAgIHwgICA8IFJFTTogICAgICAgICAgICAgICAgICAiJSIgICAgPgotICAgIHwgICA8IExTSElGVDogICAgICAgICAgICAgICAiPDwiICAgPgotICAgIHwgICA8IFJTSUdORURTSElGVDogICAgICAgICAiPj4iICAgPgotICAgIHwgICA8IFJVTlNJR05FRFNISUZUOiAgICAgICAiPj4+IiAgPgotICAgIHwgICA8IFBMVVNBU1NJR046ICAgICAgICAgICAiKz0iICAgPgotICAgIHwgICA8IE1JTlVTQVNTSUdOOiAgICAgICAgICAiLT0iICAgPgotICAgIHwgICA8IFNUQVJBU1NJR046ICAgICAgICAgICAiKj0iICAgPgotICAgIHwgICA8IFNMQVNIQVNTSUdOOiAgICAgICAgICAiLz0iICAgPgotICAgIHwgICA8IEFOREFTU0lHTjogICAgICAgICAgICAiJj0iICAgPgotICAgIHwgICA8IE9SQVNTSUdOOiAgICAgICAgICAgICAifD0iICAgPgotICAgIHwgICA8IFhPUkFTU0lHTjogICAgICAgICAgICAiXj0iICAgPgotICAgIHwgICA8IFJFTUFTU0lHTjogICAgICAgICAgICAiJT0iICAgPgotICAgIHwgICA8IExTSElGVEFTU0lHTjogICAgICAgICAiPDw9IiAgPgotICAgIHwgICA8IFJTSUdORURTSElGVEFTU0lHTjogICAiPj49IiAgPgotICAgIHwgICA8IFJVTlNJR05FRFNISUZUQVNTSUdOOiAiPj4+PSIgPgotICAgIHwgICA8IFNDX09SQVNTSUdOOiAgICAgICAgICAifHw9IiAgPgotICAgIHwgICA8IFNDX0FOREFTU0lHTjogICAgICAgICAiJiY9IiAgPgotICAgIHwgICA8IFNDX1hPUkFTU0lHTjogICAgICAgICAiXl49IiAgPgotICAgIHwgICA8IElERU5USVRZT1BFUjogICAgICAgICAiPT09IiAgPgotICAgIHwgICA8IE5PVElERU5USVRZT1BFUjogICAgICAiIT09IiAgPgotfQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gR1JBTU1BUiBTZWN0aW9uCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLVRva2VuIFByb2dyYW0oKToKLXsKLSAgICAgICAgVG9rZW4gcmV0dmFsID0gZ2V0VG9rZW4oMSk7Ci19Ci17Ci0gICAgICAgIChQYWNrYWdlRGVmaW5pdGlvbigpKSogW0RpcmVjdGl2ZXMoKV0gPEVPRj4KLSAgICAgICAgewotICAgICAgICAgICAgX2pqdFJvb3QgPSBqanRUaGlzOwotICAgICAgICAgICAgcmV0dXJuIHJldHZhbDsKLSAgICAgICAgfQotfQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gRXhwcmVzc2lvbnMgCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gSWRlbnRpZmllciAKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi12b2lkIElkZW50aWZpZXIoKToKLXt9Ci17Ci0gICAgICAgIDxJREVOVElGSUVSPgotICAgIHwgICA8R0VUPgotICAgIHwgICA8U0VUPgotICAgIHwgICA8SU5DTFVERT4KLS8vICAgIHwgICA8TkFNRVNQQUNFPgotfQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gUXVhbGlmaWVkIElkZW50aWZpZXIgCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotdm9pZCBTaW1wbGVRdWFsaWZpZWRJZGVudGlmaWVyKCk6Ci17fQotewotICAgICAgIElkZW50aWZpZXIoKSBbPFFVQUxJRklFUj4gSWRlbnRpZmllcigpXQotICAgIHwgIFJlc2VydmVkTmFtZXNwYWNlKCkgWzxRVUFMSUZJRVI+IElkZW50aWZpZXIoKV0gCi19Ci0KLXZvaWQgRXhwcmVzc2lvblF1YWxpZmllZElkZW50aWZpZXIoKToKLXt9Ci17Ci0gICAgICAgPExQQVJFTj4gQXNzaWdubWVudEV4cHJlc3Npb24oKSA8UlBBUkVOPiA8UVVBTElGSUVSPiBJZGVudGlmaWVyKCkKLX0KLQotdm9pZCBRdWFsaWZpZWRJZGVudGlmaWVyKCk6Ci17fQotewotICAgICAgIFNpbXBsZVF1YWxpZmllZElkZW50aWZpZXIoKQotICAgIHwgIEV4cHJlc3Npb25RdWFsaWZpZWRJZGVudGlmaWVyKCkKLX0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIFByaW1hcnkgRXhwcmVzc2lvbnMKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi12b2lkIFByaW1hcnlFeHByZXNzaW9uICgpOgote30KLXsKLSAgICAoCi0gICAgICAgIDxOVUxMPgotICAgIHwgICA8VFJVRT4KLSAgICB8ICAgPEZBTFNFPgotICAgIHwgICA8REVDSU1BTF9MSVRFUkFMPiAKLSAgICB8ICAgPE9DVEFMX0xJVEVSQUw+Ci0gICAgfCAgIDxIRVhfTElURVJBTD4KLSAgICB8ICAgPEZMT0FUSU5HX1BPSU5UX0xJVEVSQUw+IAotICAgIHwgICA8U1RSSU5HX0xJVEVSQUw+IAotICAgIHwgICA8VEhJUz4KLSAgICB8ICAgPFJFR1VMQVJfRVhQUkVTU0lPTj4KLSAgICB8ICAgPExQQVJFTj4gTGlzdEV4cHJlc3Npb24oKSA8UlBBUkVOPgotICAgIHwgICBBcnJheUxpdGVyYWwoKQotICAgIHwgICBPYmplY3RMaXRlcmFsKCkKLSAgICB8ICAgRnVuY3Rpb25FeHByZXNzaW9uKCkKLSAgICApCi0gICAgewotICAgICAgICB0b2tlbl9zb3VyY2Uuc2V0UmVnVmFsaWQoKTsKLSAgICB9Ci19Ci0KLXZvaWQgUmVzZXJ2ZWROYW1lc3BhY2UgKCk6Ci17fQotewotICAgICAgIDxQVUJMSUM+Ci0gICAgfCAgPFBST1RFQ1RFRD4KLSAgICB8ICA8UFJJVkFURT4KLX0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIEZ1bmN0aW9uIEV4cHJlc3Npb24KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi12b2lkICBGdW5jdGlvbkV4cHJlc3Npb24gKCk6Ci17fQotewotICAgICAgICBMT09LQUhFQUQoMikgPEZVTkNUSU9OPiBGdW5jdGlvbkNvbW1vbigpCi0gICAgfCAgICAgICAgICAgICAgICA8RlVOQ1RJT04+IElkZW50aWZpZXIoKSBGdW5jdGlvbkNvbW1vbigpCi19Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyBPYmplY3QgTGl0ZXJhbHMKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi12b2lkIE9iamVjdExpdGVyYWwgKCk6Ci17fQotewotICAgICAgICA8TEJSQUNFPiBbRmllbGRMaXN0KCldIDxSQlJBQ0U+ICAKLX0gICAgICAgIAotCi12b2lkIEZpZWxkTGlzdCgpOgote30KLXsKLSAgICAgICAgTGl0ZXJhbEZpZWxkKCkgKDxDT01NQT4gTGl0ZXJhbEZpZWxkKCkpKgotfQotCi12b2lkIExpdGVyYWxGaWVsZCAoKToKLXt9Ci17Ci0gICAgICAgIEZpZWxkTmFtZSgpIDxDT0xPTj4gQXNzaWdubWVudEV4cHJlc3Npb24oKQotfQotCi12b2lkIEZpZWxkTmFtZSAoKToKLXt9Ci17Ci0gICAgICAgIDxTVFJJTkdfTElURVJBTD4KLSAgICB8ICAgPERFQ0lNQUxfTElURVJBTD4KLSAgICB8ICAgU2ltcGxlUXVhbGlmaWVkSWRlbnRpZmllcigpCi0gICAgfCAgIDxMUEFSRU4+IEFzc2lnbm1lbnRFeHByZXNzaW9uKCkgPFJQQVJFTj4gWzxRVUFMSUZJRVI+IElkZW50aWZpZXIoKV0KLX0JCi0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyBBcnJheSBMaXRlcmFsCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotdm9pZCBBcnJheUxpdGVyYWwoKToKLXt9Ci17Ci0gICAgICAgIDxMQlJBQ0tFVD4gW0VsZW1lbnRMaXN0KCldIDxSQlJBQ0tFVD4KLX0KLQotdm9pZCBFbGVtZW50TGlzdCgpOgote30KLXsKLSAgICAgICAgTGl0ZXJhbEVsZW1lbnQoKSAoPENPTU1BPiBMaXRlcmFsRWxlbWVudCgpKSoKLX0KLQotdm9pZCBMaXRlcmFsRWxlbWVudCgpOgote30KLXsKLSAgICAgICAgQXNzaWdubWVudEV4cHJlc3Npb24oKQotfQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gU3VwZXIgRXhwcmVzc2lvbgotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLXZvaWQgU3VwZXJFeHByZXNzaW9uICgpOgote30KLXsKLSAgICAgICAgPFNVUEVSPiBbTE9PS0FIRUFEKDIpIDxMUEFSRU4+IEFzc2lnbm1lbnRFeHByZXNzaW9uKCkgPFJQQVJFTj5dCi19Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyBQb3N0Zml4IEV4cHJlc3Npb24KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi12b2lkIFBvc3RmaXhFeHByZXNzaW9uICgpOgote30KLXsKLSAgICAgICAgQXR0cmlidXRlRXhwcmVzc2lvbiAoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBbUG9zdGZpeE9wKCldCi0gICAgfCAgIHt0b2tlbl9zb3VyY2Uuc2V0UmVnSW52YWxpZCgpO30gCi0gICAgICAgIEZ1bGxQb3N0Zml4RXhwcmVzc2lvbiAoKSAoUHJvcGVydHlPckFyZ3VtZW50cygpKSogW1Bvc3RmaXhPcCgpXQotICAgIHwgICBTdXBlckV4cHJlc3Npb24oKSAgICAgICAgIFByb3BlcnR5T3BlcmF0b3IoKQotfSAgICAKLQotdm9pZCBBdHRyaWJ1dGVFeHByZXNzaW9uICgpOgote30KLXsKLSAgICAgICAgU2ltcGxlUXVhbGlmaWVkSWRlbnRpZmllcigpICAoUHJvcGVydHlPckFyZ3VtZW50cygpKSoKLX0KLQotdm9pZCBGdWxsUG9zdGZpeEV4cHJlc3Npb24gKCk6Ci17fQotewotICAgICAgIExPT0tBSEVBRCg8TFBBUkVOPiBBc3NpZ25tZW50RXhwcmVzc2lvbigpIDxSUEFSRU4+IDxRVUFMSUZJRVI+KSAKLSAgICAgICBFeHByZXNzaW9uUXVhbGlmaWVkSWRlbnRpZmllcigpCi0gICAgfCAgUHJpbWFyeUV4cHJlc3Npb24oKSAKLSAgICB8ICBGdWxsTmV3RXhwcmVzc2lvbigpICAgICAgICAgICAgIAotfQotCi12b2lkIEZ1bGxOZXdFeHByZXNzaW9uICgpOgote30KLXsKLSAgICAgICAgPE5FVz4gRnVsbE5ld1N1YmV4cHJlc3Npb24oKSAgKExPT0tBSEVBRCgyKSBQcm9wZXJ0eU9wZXJhdG9yKCkpKiBbTE9PS0FIRUFEKDIpIEFyZ3VtZW50cygpXQotfQotCi12b2lkIEZ1bmN0aW9uQ29uc3RydWN0b3IoKToKLXt9Ci17ICAgIAotICAgICAgICA8RlVOQ1RJT05fPiBBcmd1bWVudHMoKQotfQotCi12b2lkIEZ1bGxOZXdTdWJleHByZXNzaW9uICgpOgote30KLXsKLSAgICAgICAgTE9PS0FIRUFEKDxMUEFSRU4+IEFzc2lnbm1lbnRFeHByZXNzaW9uKCkgPFJQQVJFTj4gPFFVQUxJRklFUj4pIAotICAgICAgICBFeHByZXNzaW9uUXVhbGlmaWVkSWRlbnRpZmllcigpICAgICAgICAKLSAgICB8ICAgUHJpbWFyeUV4cHJlc3Npb24oKSAKLSAgICB8ICAgU2ltcGxlUXVhbGlmaWVkSWRlbnRpZmllcigpCi0gICAgfCAgIFN1cGVyRXhwcmVzc2lvbigpIAotICAgIHwgICBGdWxsTmV3RXhwcmVzc2lvbigpCi0gICAgfCAgIEZ1bmN0aW9uQ29uc3RydWN0b3IoKQotfQotCi0KLXZvaWQgUG9zdGZpeE9wKCk6Ci17fQotewotICAgICAgICA8SU5DUj4KLSAgICB8ICAgPERFQ1I+Ci19Ci0KLXZvaWQgUHJvcGVydHlPckFyZ3VtZW50cyAoKToKLXt9Ci17Ci0gICAgICAgIEFyZ3VtZW50cygpICAgICAgICAKLSAgICB8ICAgUHJvcGVydHlPcGVyYXRvcigpCi19Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyBQcm9wZXJ0eSBPcGVyYXRvcnMKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi12b2lkIFByb3BlcnR5T3BlcmF0b3IgKCk6Ci17fQoteyAgICAgICAgICAKLSAgICAgICAgPERPVD4gICAgICBRdWFsaWZpZWRJZGVudGlmaWVyKCkKLSAgICB8ICAgTE9PS0FIRUFEKDIpIDxMQlJBQ0tFVD4gPFJCUkFDS0VUPgotICAgIHwgICBMT09LQUhFQUQoMikgPExCUkFDS0VUPiA8RUxJUFNFPiBBc3NpZ25tZW50RXhwcmVzc2lvbigpIDxSQlJBQ0tFVD4KLSAgICB8ICAgICAgICAgICAgICAgIDxMQlJBQ0tFVD4gTGlzdEV4cHJlc3Npb24oKSBbPEVMSVBTRT4gQXNzaWdubWVudEV4cHJlc3Npb24oKV0gPFJCUkFDS0VUPgotfQotCi12b2lkIEFyZ3VtZW50cyAoKToKLXt7dG9rZW5fc291cmNlLnNldFJlZ1ZhbGlkKCk7fX0KLXsKLSAgICAgICAgTE9PS0FIRUFEKDIpIDxMUEFSRU4+IDxSUEFSRU4+Ci0gICAgfCAgIExPT0tBSEVBRCgyKSA8TFBBUkVOPiA8RUxJUFNFPiBBc3NpZ25tZW50RXhwcmVzc2lvbigpIDxSUEFSRU4+Ci0gICAgfCAgICAgICAgICAgICAgICA8TFBBUkVOPiBMaXN0RXhwcmVzc2lvbigpIFs8RUxJUFNFPiBBc3NpZ25tZW50RXhwcmVzc2lvbigpXSA8UlBBUkVOPgotfQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gVW5hcnkgT3BlcmF0b3JzIAotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLXZvaWQgVW5hcnlFeHByZXNzaW9uICgpOgote30KLXsKLSAgICAgICAgICAgICAgICAgUG9zdGZpeEV4cHJlc3Npb24oKQotICAgIHwgICA8REVMRVRFPiBQb3N0Zml4RXhwcmVzc2lvbigpCi0gICAgfCAgIDxWT0lEPiAgIFVuYXJ5RXhwcmVzc2lvbigpCi0gICAgfCAgIDxUWVBFT0Y+IFVuYXJ5RXhwcmVzc2lvbigpCi0gICAgfCAgIDxJTkNSPiAgIFBvc3RmaXhFeHByZXNzaW9uKCkKLSAgICB8ICAgPERFQ1I+ICAgUG9zdGZpeEV4cHJlc3Npb24oKQotICAgIHwgICA8UExVUz4gICBVbmFyeUV4cHJlc3Npb24oKQotICAgIHwgICA8TUlOVVM+ICBVbmFyeUV4cHJlc3Npb24oKQotICAgIHwgICA8VElMREU+ICBVbmFyeUV4cHJlc3Npb24oKQotICAgIHwgICA8QkFORz4gICBVbmFyeUV4cHJlc3Npb24oKQotfQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gTXVsdGlwbGljYXRpdmUgT3BlcmF0b3JzIAotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLXZvaWQgTXVsT3AoKToKLXt9Ci17Ci0gICAgICAgIDxTVEFSPgotICAgIHwgICA8U0xBU0g+Ci0gICAgfCAgIDxSRU0+IAotfQotCi12b2lkIE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbigpOgote30KLXsKLSAgICAgICAgVW5hcnlFeHByZXNzaW9uKCkgKE11bE9wKCkgVW5hcnlFeHByZXNzaW9uKCkpKgotCi19Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyBBZGRpdGl2ZSBPcGVyYXRvcnMgCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotdm9pZCBBZGRPcCgpOgote30KLXsKLSAgICAgICAgPFBMVVM+Ci0gICAgfCAgIDxNSU5VUz4KLX0KLQotdm9pZCBBZGRpdGl2ZUV4cHJlc3Npb24oKToKLXt9Ci17Ci0gICAgICAgIE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbigpIChBZGRPcCgpIE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbigpKSoKLX0gCi0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyBCaXR3aXNlIFNoaWZ0IE9wZXJhdG9ycyAKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi12b2lkIFNoaWZ0T3AoKToKLXt9Ci17Ci0gICAgICAgIDxMU0hJRlQ+Ci0gICAgfCAgIDxSU0lHTkVEU0hJRlQ+Ci0gICAgfCAgIDxSVU5TSUdORURTSElGVD4KLX0KLQotdm9pZCBTaGlmdEV4cHJlc3Npb24oKToKLXt9Ci17Ci0gICAgICAgIEFkZGl0aXZlRXhwcmVzc2lvbigpIChTaGlmdE9wKCkgQWRkaXRpdmVFeHByZXNzaW9uKCkpKgotfQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gUmVsYXRpb25hbCBPcGVyYXRvcnMgCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotdm9pZCBSZWxPcCgpOgote30KLXsKLSAgICAgICAgPExUPgotICAgIHwgICA8R1Q+IAotICAgIHwgICA8TEU+IAotICAgIHwgICA8R0U+Ci0gICAgfCAgIDxJUz4KLSAgICB8ICAgPEFTPgotfQotCi12b2lkIFJlbGF0aW9uYWxFeHByZXNzaW9uKCk6Ci17fQotewotICAgICAgICBTaGlmdEV4cHJlc3Npb24oKSAKLSAgICAgICAgICAgIChMT09LQUhFQUQoMykoUmVsT3AoKSB8IDxJTj4gfCA8SU5TVEFOQ0VPRj4gKSBTaGlmdEV4cHJlc3Npb24oKSkqCi19Ci0KLXZvaWQgUmVsYXRpb25hbEV4cHJlc3Npb25Ob0lOKCk6Ci17fQotewotICAgICAgICBTaGlmdEV4cHJlc3Npb24oKSAKLSAgICAgICAgICAgICgoUmVsT3AoKSB8IDxJTlNUQU5DRU9GPikgIFNoaWZ0RXhwcmVzc2lvbigpKSoKLX0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIEVxdWFsaXR5IE9wZXJhdG9ycyAKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi12b2lkIEVxdWFsT3AoKToKLXt9Ci17Ci0gICAgICAgIDxFUT4gCi0gICAgfCAgIDxORT4gCi0gICAgfCAgIDxJREVOVElUWU9QRVI+IAotICAgIHwgICA8Tk9USURFTlRJVFlPUEVSPgotfQotCi12b2lkIEVxdWFsaXR5RXhwcmVzc2lvbigpOgote30KLXsKLSAgICAgICAgUmVsYXRpb25hbEV4cHJlc3Npb24oKSAoRXF1YWxPcCgpIFJlbGF0aW9uYWxFeHByZXNzaW9uKCkpKgotfQotCi12b2lkIEVxdWFsaXR5RXhwcmVzc2lvbk5vSU4oKToKLXt9Ci17Ci0gICAgICAgIFJlbGF0aW9uYWxFeHByZXNzaW9uTm9JTigpIChFcXVhbE9wKCkgUmVsYXRpb25hbEV4cHJlc3Npb25Ob0lOKCkpKgotfQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gQmluYXJ5IEJpdHdpc2UgT3BlcmF0b3JzIAotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLXZvaWQgQml0d2lzZUFORE9wKCk6Ci17fQotewotICAgICAgICA8QklUX0FORD4KLX0KLQotdm9pZCBCaXR3aXNlQU5ERXhwcmVzc2lvbigpOgote30KLXsKLSAgICAgICAgRXF1YWxpdHlFeHByZXNzaW9uKCkgKEJpdHdpc2VBTkRPcCgpIEVxdWFsaXR5RXhwcmVzc2lvbigpKSoKLX0KLQotdm9pZCBCaXR3aXNlQU5ERXhwcmVzc2lvbk5vSU4oKToKLXt9Ci17Ci0gICAgICAgIEVxdWFsaXR5RXhwcmVzc2lvbk5vSU4oKSAoQml0d2lzZUFORE9wKCkgRXF1YWxpdHlFeHByZXNzaW9uTm9JTigpKSoKLX0KLQotCi12b2lkIEJpdHdpc2VYT1JPcCgpOgote30KLXsKLSAgICAgICAgPFhPUj4KLX0KLQotdm9pZCBCaXR3aXNlWE9SRXhwcmVzc2lvbigpOgote30KLXsKLSAgICAgICAgQml0d2lzZUFOREV4cHJlc3Npb24oKSAoQml0d2lzZVhPUk9wKCkgQml0d2lzZUFOREV4cHJlc3Npb24oKSkqCi19Ci0KLXZvaWQgQml0d2lzZVhPUkV4cHJlc3Npb25Ob0lOKCk6Ci17fQotewotICAgICAgICBCaXR3aXNlQU5ERXhwcmVzc2lvbk5vSU4oKSAoQml0d2lzZVhPUk9wKCkgQml0d2lzZUFOREV4cHJlc3Npb25Ob0lOKCkpKgotfQotCi12b2lkIEJpdHdpc2VPUk9wKCk6Ci17fQotewotICAgICAgICA8QklUX09SPgotfQotCi12b2lkIEJpdHdpc2VPUkV4cHJlc3Npb24oKToKLXt9Ci17Ci0gICAgICAgIEJpdHdpc2VYT1JFeHByZXNzaW9uKCkgKEJpdHdpc2VPUk9wKCkgQml0d2lzZVhPUkV4cHJlc3Npb24oKSkqCi19Ci0KLXZvaWQgQml0d2lzZU9SRXhwcmVzc2lvbk5vSU4oKToKLXt9Ci17Ci0gICAgICAgIEJpdHdpc2VYT1JFeHByZXNzaW9uTm9JTigpIChCaXR3aXNlT1JPcCgpIEJpdHdpc2VYT1JFeHByZXNzaW9uTm9JTigpKSoKLX0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIEJpbmFyeSBMb2dpY2FsIE9wZXJhdG9ycyAKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi12b2lkIExvZ2ljYWxBTkRFeHByZXNzaW9uKCk6Ci17fQotewotICAgICAgICBCaXR3aXNlT1JFeHByZXNzaW9uKCkgKDxTQ19BTkQ+IEJpdHdpc2VPUkV4cHJlc3Npb24oKSkqCi19Ci0KLXZvaWQgTG9naWNhbEFOREV4cHJlc3Npb25Ob0lOKCk6Ci17fQotewotICAgICAgICBCaXR3aXNlT1JFeHByZXNzaW9uTm9JTigpICg8U0NfQU5EPiBCaXR3aXNlT1JFeHByZXNzaW9uTm9JTigpKSoKLX0KLQotdm9pZCBMb2dpY2FsT1JFeHByZXNzaW9uKCk6Ci17fQotewotICAgICAgICBMb2dpY2FsQU5ERXhwcmVzc2lvbigpICg8U0NfT1I+IExvZ2ljYWxBTkRFeHByZXNzaW9uKCkpKgotfQotCi12b2lkIExvZ2ljYWxPUkV4cHJlc3Npb25Ob0lOKCk6Ci17fQotewotICAgICAgICBMb2dpY2FsQU5ERXhwcmVzc2lvbk5vSU4oKSAoPFNDX09SPiBMb2dpY2FsQU5ERXhwcmVzc2lvbk5vSU4oKSkqCi19Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyBDb25kaXRpb25hbCBPcGVyYXRvcnMgCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotdm9pZCBDb25kaXRpb25hbEV4cHJlc3Npb24oKToKLXt9Ci17Ci0gICAgICAgIExvZ2ljYWxPUkV4cHJlc3Npb24oKSBbPEhPT0s+ICBBc3NpZ25tZW50RXhwcmVzc2lvbigpIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxDT0xPTj4gQXNzaWdubWVudEV4cHJlc3Npb24oKV0KLX0KLQotdm9pZCBDb25kaXRpb25hbEV4cHJlc3Npb25Ob0lOKCk6Ci17fQotewotICAgICAgICBMb2dpY2FsT1JFeHByZXNzaW9uTm9JTigpICBbPEhPT0s+ICBBc3NpZ25tZW50RXhwcmVzc2lvbk5vSU4oKSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxDT0xPTj4gQXNzaWdubWVudEV4cHJlc3Npb25Ob0lOKCldCi19Ci0KLXZvaWQgTm9uQXNzaWdubWVudEV4cHJlc3Npb24oKToKLXt9Ci17Ci0gICAgICAgIExvZ2ljYWxPUkV4cHJlc3Npb24oKSBbPEhPT0s+ICBOb25Bc3NpZ25tZW50RXhwcmVzc2lvbigpIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxDT0xPTj4gTm9uQXNzaWdubWVudEV4cHJlc3Npb24oKV0KLX0KLQotdm9pZCBOb25Bc3NpZ25tZW50RXhwcmVzc2lvbk5vSU4oKToKLXt9Ci17Ci0gICAgICAgIExvZ2ljYWxPUkV4cHJlc3Npb25Ob0lOKCkgWzxIT09LPiAgTm9uQXNzaWdubWVudEV4cHJlc3Npb25Ob0lOKCkgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxDT0xPTj4gTm9uQXNzaWdubWVudEV4cHJlc3Npb25Ob0lOKCldCi19Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyBBc3NpZ25tZW50IE9wZXJhdG9ycyAKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi12b2lkIEFzc2lnbmVtZW50T3BlcmF0b3IoKToKLXt9Ci17Ci0gICAgICAgIDxBU1NJR04+Ci0gICAgfCAgIDxTVEFSQVNTSUdOPgotICAgIHwgICA8U0xBU0hBU1NJR04+IAotICAgIHwgICA8UkVNQVNTSUdOPiAKLSAgICB8ICAgPFBMVVNBU1NJR04+Ci0gICAgfCAgIDxNSU5VU0FTU0lHTj4gCi0gICAgfCAgIDxMU0hJRlRBU1NJR04+IAotICAgIHwgICA8UlNJR05FRFNISUZUQVNTSUdOPgotICAgIHwgICA8UlVOU0lHTkVEU0hJRlRBU1NJR04+Ci0gICAgfCAgIDxBTkRBU1NJR04+IAotICAgIHwgICA8WE9SQVNTSUdOPiAKLSAgICB8ICAgPE9SQVNTSUdOPgotICAgIHwgICA8U0NfQU5EQVNTSUdOPgotICAgIHwgICA8U0NfWE9SQVNTSUdOPgotICAgIHwgICA8U0NfT1JBU1NJR04+Ci0gCi19Ci0KLXZvaWQgQXNzaWdubWVudEV4cHJlc3Npb24oKToKLXt9Ci17Ci0gICAgICAgIENvbmRpdGlvbmFsRXhwcmVzc2lvbigpIFtMT09LQUhFQUQoMikgQXNzaWduZW1lbnRPcGVyYXRvcigpIEFzc2lnbm1lbnRFeHByZXNzaW9uKCldCi19Ci0KLXZvaWQgQXNzaWdubWVudEV4cHJlc3Npb25Ob0lOKCk6Ci17fQotewotICAgICAgICBDb25kaXRpb25hbEV4cHJlc3Npb25Ob0lOKCkgW0xPT0tBSEVBRCgyKSBBc3NpZ25lbWVudE9wZXJhdG9yKCkgQXNzaWdubWVudEV4cHJlc3Npb25Ob0lOKCldCi19Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyBDb21tYSBFeHByZXNzaW9ucwotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLXZvaWQgTGlzdEV4cHJlc3Npb24gKCk6Ci17fQotewotICAgICAgICBBc3NpZ25tZW50RXhwcmVzc2lvbigpICg8Q09NTUE+IEFzc2lnbm1lbnRFeHByZXNzaW9uKCkpKgotfSAgIAotCi12b2lkIExpc3RFeHByZXNzaW9uTm9JTiAoKToKLXt9Ci17Ci0gICAgICAgIEFzc2lnbm1lbnRFeHByZXNzaW9uTm9JTigpICg8Q09NTUE+IEFzc2lnbm1lbnRFeHByZXNzaW9uTm9JTigpKSoKLX0gICAKLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIFR5cGUgRXhwcmVzc2lvbnMKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi12b2lkIFR5cGVFeHByZXNzaW9uICgpOgote30KLXsKLSAgICAgICAgTm9uQXNzaWdubWVudEV4cHJlc3Npb24oKQotfQotCi12b2lkIFR5cGVFeHByZXNzaW9uTm9JTiAoKToKLXt9Ci17Ci0gICAgICAgIE5vbkFzc2lnbm1lbnRFeHByZXNzaW9uTm9JTigpCi19Ci0KLXZvaWQgVHlwZUV4cHJlc3Npb25MaXN0ICgpOgote30KLXsKLSAgICAgICAgTm9uQXNzaWdubWVudEV4cHJlc3Npb24oKSAoPENPTU1BPiBOb25Bc3NpZ25tZW50RXhwcmVzc2lvbigpKSoKLX0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyBTdGFlbWVudHMgKGFiYnJldiwgbm9TaG9ydElmLCBmdWxsKSAKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi12b2lkIFN0YXRlbWVudCAoKToKLXt9Ci17Ci0gICAgICAgIExPT0tBSEVBRCgzKSBFeHByZXNzaW9uU3RhdGVtZW50KCkgU2MoKQotICAgIHwgICAgICAgICAgICAgICAgU3VwZXJTdGF0ZW1lbnQoKSBTYygpCi0gICAgfCAgICAgICAgICAgICAgICBCbG9jaygpCi0gICAgfCAgICAgICAgICAgICAgICBMYWJlbGVkU3RhdGVtZW50KCkKLSAgICB8ICAgICAgICAgICAgICAgIElmU3RhdGVtZW50KCkKLSAgICB8ICAgICAgICAgICAgICAgIFN3aXRjaFN0YXRlbWVudCgpCi0gICAgfCAgICAgICAgICAgICAgICBEb1N0YXRlbWVudCgpIFNjKCkKLSAgICB8ICAgICAgICAgICAgICAgIFdoaWxlU3RhdGVtZW50KCkKLSAgICB8ICAgICAgICAgICAgICAgIEZvclN0YXRlbWVudCgpCi0gICAgfCAgICAgICAgICAgICAgICBXaXRoU3RhdGVtZW50KCkKLSAgICB8ICAgICAgICAgICAgICAgIENvbnRpbnVlU3RhdGVtZW50KCkgU2MoKQotICAgIHwgICAgICAgICAgICAgICAgQnJlYWtTdGF0ZW1lbnQoKSBTYygpCi0gICAgfCAgICAgICAgICAgICAgICBSZXR1cm5TdGF0ZW1lbnQoKSBTYygpCi0gICAgfCAgICAgICAgICAgICAgICBUaHJvd1N0YXRlbWVudCgpIFNjKCkKLSAgICB8ICAgICAgICAgICAgICAgIFRyeVN0YXRlbWVudCgpCi19Ci0KLXZvaWQgU3Vic3RhdGVtZW50ICgpOgote30KLXsKLSAgICAgICAgICAgICAgICAgICAgIEVtcHR5U3RhdGVtZW50KCkKLSAgICB8ICAgTE9PS0FIRUFEKDIpIFN0YXRlbWVudCgpCi0gICAgfCAgICAgICAgICAgICAgICBTaW1wbGVWYXJpYWJsZURlZmluaXRpb24oKSBTYygpCi0gICAgfCAgICAgICAgICAgICAgICBBdHRyaWJ1dGVzKCkgICAgICAgICAgICAgICA8TEJSQUNFPiBTdWJzdGF0ZW1lbnRzKCkgPFJCUkFDRT4KLX0KLQotdm9pZCBTdWJzdGF0ZW1lbnRzICgpOgote30KLXsKLSAgICAgICAgKFN1YnN0YXRlbWVudCgpKSsKLX0KLQotSkFWQUNPREUKLSAgdm9pZCBTYygpIHsKLSAgICBUb2tlbiB0b2sgPSBnZXRUb2tlbigxKTsKLSAgICBpZiAodG9rLmtpbmQgPT0gU0VNSUNPTE9OKSB7Ci0gICAgICAgdG9rID0gZ2V0TmV4dFRva2VuKCk7Ci0gICAgfSBlbHNlIGlmICh0b2suc3BlY2lhbFRva2VuICE9IG51bGwpIHsKLSAgICAgICBpZiAoIUVvbENvbW1lbnRTa2lwV3ModG9rLnNwZWNpYWxUb2tlbikgJiYgKHRvay5raW5kICE9IEVPRikpIHsKLSAgICAgICAgICB0aHJvdyBnZW5lcmF0ZVBhcnNlRXhjZXB0aW9uKCk7Ci0gICAgICAgfQotICAgIH0gZWxzZSBpZiAoKHRvay5raW5kICE9IEVPRikgJiYgKHRvay5raW5kIT1SQlJBQ0UpKSB7Ci0gICAgICAgICB0aHJvdyBnZW5lcmF0ZVBhcnNlRXhjZXB0aW9uKCk7Ci0gICAgfQotICB9Ci0gCi1KQVZBQ09ERQotICBib29sZWFuIEVvbENvbW1lbnRTa2lwV3MoVG9rZW4gdCkgewotICAgIGJvb2xlYW4gcmV0VmFsID0gZmFsc2U7Ci0gICAgVG9rZW4gc3BlY2lhbFRva2VuID0gdDsKLSAgICB3aGlsZShzcGVjaWFsVG9rZW4gIT0gbnVsbCkgewotICAgICAgaWYoc3BlY2lhbFRva2VuLmtpbmQgPT0gV1MpIHsKLSAgICAgICAgc3BlY2lhbFRva2VuID0gc3BlY2lhbFRva2VuLnNwZWNpYWxUb2tlbjsKLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmKHNwZWNpYWxUb2tlbi5raW5kID09IEVPTCAgfHwKLSAgICAgICAgICAgICAgc3BlY2lhbFRva2VuLmtpbmQgPT0gU0lOR0xFX0xJTkVfQ09NTUVOVCkgewotICAgICAgICByZXRWYWwgPSB0cnVlOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGVsc2UgewotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJldFZhbDsKLSAgfQotIAotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIEVtcHR5IFN0YXRlbWVudCAKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi12b2lkIEVtcHR5U3RhdGVtZW50KCk6Ci17fQotewotICAgICAgICA8U0VNSUNPTE9OPgotfQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gRXhwcmVzaW9uIFN0YXRlbWVudCAKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi12b2lkIEV4cHJlc3Npb25TdGF0ZW1lbnQoKToKLXt9Ci17Ci0gICAgICAgIExpc3RFeHByZXNzaW9uKCkgCi19Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyBTdXBlciBTdGF0ZW1lbnQgCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotdm9pZCBTdXBlclN0YXRlbWVudCAoKToKLXt9Ci17Ci0gICAgICAgIDxTVVBFUj4gQXJndW1lbnRzKCkKLX0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIEJsb2NrIFN0YXRlbWVudCAKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi12b2lkIEJsb2NrICgpOgote30KLXsgICAKLSAgICAgICAgPExCUkFDRT4gW0RpcmVjdGl2ZXMoKV0gPFJCUkFDRT4KLX0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIExhYmVsZWQgU3RhdGVtZW50IChtYXBzIHRvIGxpdGVyYWwgZmllbGQpCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotdm9pZCBMYWJlbGVkU3RhdGVtZW50ICgpOgote30KLXsKLSAgICAgICAgSWRlbnRpZmllcigpIDxDT0xPTj4gU3Vic3RhdGVtZW50KCkKLX0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIElmIFN0YXRlbWVudCAKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi12b2lkIElmU3RhdGVtZW50KCk6Ci17fQotewotICAgICAgICA8SUY+IDxMUEFSRU4+IExpc3RFeHByZXNzaW9uKCkgPFJQQVJFTj4gCi0gICAgICAgICAgICBTdWJzdGF0ZW1lbnQoKSAKLSAgICAgICAgICAgIFtMT09LQUhFQUQoMSkgPEVMU0U+IFN1YnN0YXRlbWVudCgpXQotfQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gU3dpdGNoIFN0YXRlbWVudCAKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi12b2lkIFN3aXRjaFN0YXRlbWVudCAoKToKLXt9Ci17Ci0gICAgICAgIDxTV0lUQ0g+IDxMUEFSRU4+IExpc3RFeHByZXNzaW9uKCkgPFJQQVJFTj4KLSAgICAgICAgICAgICAgICAgPExCUkFDRT4gW0Nhc2VFbGVtZW50cygpXSA8UkJSQUNFPgotfQotCi12b2lkIENhc2VFbGVtZW50cyAoKToKLXt9Ci17Ci0gICAgICAgIENhc2VMYWJlbCgpIChDYXNlRWxlbWVudCgpKSoKLX0KLQotdm9pZCBDYXNlRWxlbWVudCAoKToKLXt9Ci17Ci0gICAgICAgIERpcmVjdGl2ZSgpCi0gICAgfCAgIENhc2VMYWJlbCgpCi19Ci0KLXZvaWQgQ2FzZUxhYmVsICgpOgote30KLXsKLSAgICAgICAgPENBU0U+IExpc3RFeHByZXNzaW9uKCkgPENPTE9OPgotICAgIHwgICA8X0RFRkFVTFQ+IDxDT0xPTj4KLX0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIERvLVdoaWxlIFN0YXRlbWVudCAKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi12b2lkIERvU3RhdGVtZW50KCk6IAote30KLXsKLSAgICAgICAgPERPPiBTdWJzdGF0ZW1lbnQoKSA8V0hJTEU+IDxMUEFSRU4+IExpc3RFeHByZXNzaW9uKCkgPFJQQVJFTj4KLX0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIFdoaWxlIFN0YXRlbWVudAotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLXZvaWQgV2hpbGVTdGF0ZW1lbnQgKCk6Ci17fQotewotICAgICAgICA8V0hJTEU+IDxMUEFSRU4+IExpc3RFeHByZXNzaW9uKCkgPFJQQVJFTj4KLSAgICAgICAgICAgU3Vic3RhdGVtZW50KCkKLX0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIEZvciBTdGF0ZW1lbnRzIAotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLXZvaWQgRm9yU3RhdGVtZW50ICgpOgote30KLXsKLSAgICAgICAgIExPT0tBSEVBRCg8Rk9SPiA8TFBBUkVOPiBGb3JJbkJpbmRpbmcoKSA8SU4+KQotICAgICAgICAgICAgICAgICAgIDxGT1I+IDxMUEFSRU4+IEZvckluQmluZGluZygpIDxJTj4gTGlzdEV4cHJlc3Npb24oKSA8UlBBUkVOPgotICAgICAgICAgICAgICAgICAgICAgIFN1YnN0YXRlbWVudCgpCi0gICAgfCAgICAgICAgICAgICAgPEZPUj4gPExQQVJFTj4gW0ZvckluaXRpYWxpemVyKCldIDxTRU1JQ09MT04+IAotICAgICAgICAgICAgICAgICAgICAgICBbTGlzdEV4cHJlc3Npb24oKV0gPFNFTUlDT0xPTj4gCi0gICAgICAgICAgICAgICAgICAgICAgIFtMaXN0RXhwcmVzc2lvbigpXSA8UlBBUkVOPiAKLSAgICAgICAgICAgICAgICAgICAgICBTdWJzdGF0ZW1lbnQoKQotfQotCi12b2lkIEZvckluaXRpYWxpemVyICgpOgote30KLXsKLSAgICAgICAgTE9PS0FIRUFEKDMpIExpc3RFeHByZXNzaW9uTm9JTigpCi0gICAgfCAgICAgICAgICAgICAgICBWYXJpYWJsZURlZmluaXRpb25Ob0lOKCkKLSAgICB8ICAgICAgICAgICAgICAgIEF0dHJpYnV0ZXMoKSAgICAgICAgICAgICBWYXJpYWJsZURlZmluaXRpb25Ob0lOKCkKLX0KLQotdm9pZCBGb3JJbkJpbmRpbmcgKCk6Ci17fQotewotICAgICAgICBMT09LQUhFQUQoMykgUG9zdGZpeEV4cHJlc3Npb24oKQotICAgIHwgICAgICAgICAgICAgICAgVmFyaWFibGVEZWZpbml0aW9uS2luZCgpIFZhcmlhYmxlQmluZGluZ05vSU4oKQotICAgIHwgICAgICAgICAgICAgICAgQXR0cmlidXRlcygpICAgICAgICAgICAgIFZhcmlhYmxlRGVmaW5pdGlvbktpbmQoKSBWYXJpYWJsZUJpbmRpbmdOb0lOKCkKLX0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIFdpdGggU3RhdGVtZW50IAotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLXZvaWQgV2l0aFN0YXRlbWVudCgpOgote30KLXsKLSAgICAgICAgPFdJVEg+IDxMUEFSRU4+IEV4cHJlc3Npb25TdGF0ZW1lbnQoKSA8UlBBUkVOPgotICAgICAgICAgICAgU3Vic3RhdGVtZW50KCkKLX0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIENvbnRpbnVlIGFuZCBCcmVhayBTdGF0ZW1lbnQKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi12b2lkIENvbnRpbnVlU3RhdGVtZW50KCk6Ci17fQotewotICAgICAgICA8Q09OVElOVUU+IFtJZGVudGlmaWVyKCldCi19Ci0KLXZvaWQgQnJlYWtTdGF0ZW1lbnQoKToKLXt9Ci17Ci0gICAgICAgIDxCUkVBSz4gW0lkZW50aWZpZXIoKV0KLX0KLSAKLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIFJldHVybiBTdGF0ZW1lbnQKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi12b2lkIFJldHVyblN0YXRlbWVudCgpOgote30KLXsKLSAgICAgICAgPFJFVFVSTj4gW0xpc3RFeHByZXNzaW9uKCldCi19Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyBUaHJvdyBTdGF0ZW1lbnQKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi12b2lkIFRocm93U3RhdGVtZW50KCk6Ci17fQotewotICAgICAgICA8VEhST1c+IExpc3RFeHByZXNzaW9uKCkKLX0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIFRyeSBTdGF0ZW1lbnQKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi12b2lkIFRyeVN0YXRlbWVudCgpOgote30KLXsKLSAgICAgICAgPFRSWT4gQmxvY2soKQotICAgICAgICAoPENBVENIPiA8TFBBUkVOPiBJZGVudGlmaWVyKCkgPFJQQVJFTj4gQmxvY2soKSkqCi0gICAgICAgIFs8RklOQUxMWT4gQmxvY2soKV0KLX0gCi0gCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gRGlyZWN0aXZlcyAKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi12b2lkIERpcmVjdGl2ZXMgKCk6Ci17fQotewotICAgICAgICAoRGlyZWN0aXZlKCkpKwotfQotCi12b2lkIERpcmVjdGl2ZSAoKToKLXt9Ci17Ci0gICAgICAgICAgICAgICAgICAgICAgRW1wdHlTdGF0ZW1lbnQoKQotICAgICB8ICAgTE9PS0FIRUFEKDMpIFN0YXRlbWVudCgpCi0gICAgIHwgICBMT09LQUhFQUQoMikgQW5ub3RhdGFibGVEaXJlY3RpdmUoKQotICAgICB8ICAgTE9PS0FIRUFEKDIpIEF0dHJpYnV0ZXMoKSAgICAgICAgICAgIDxMQlJBQ0U+IERpcmVjdGl2ZXMoKSA8UkJSQUNFPgotICAgICB8ICAgTE9PS0FIRUFEKDIpIEF0dHJpYnV0ZXMoKSAgICAgICAgICAgIEFubm90YXRhYmxlRGlyZWN0aXZlKCkgCi0gICAgIHwgICAgICAgICAgICAgICAgSW5jbHVkZURpcmVjdGl2ZSgpICAgICAgU2MoKQotICAgICB8ICAgICAgICAgICAgICAgIFByYWdtYSgpICAgICAgICAgICAgICAgIFNjKCkKLX0KLQotdm9pZCBBbm5vdGF0YWJsZURpcmVjdGl2ZSAoKToKLXt9Ci17Ci0gICAgICAgICBWYXJpYWJsZURlZmluaXRpb24oKSBTYygpCi0gICAgIHwgICBGdW5jdGlvbkRlZmluaXRpb24oKQotICAgICB8ICAgQ2xhc3NEZWZpbml0aW9uKCkKLSAgICAgfCAgIEludGVyZmFjZURlZmluaXRpb24oKQotICAgICB8ICAgTmFtZXNwYWNlRGVmaW5pdGlvbigpIFNjKCkKLSAgICAgfCAgIEltcG9ydERpcmVjdGl2ZSgpIFNjKCkKLSAgICAgfCAgIEV4cG9ydERlZmluaXRpb24oKSBTYygpCi0gICAgIHwgICBVc2VEaXJlY3RpdmUoKSBTYygpCi19Ci0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gQXR0cmlidXRlcwotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLXZvaWQgQXR0cmlidXRlcyAoKToKLXt9Ci17Ci0gICAgICAgIChBdHRyaWJ1dGUgKCkpKwotfQotCi12b2lkIEF0dHJpYnV0ZSAoKToKLXt9Ci17Ci0gICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGVFeHByZXNzaW9uKCkKLSAgICB8ICAgICAgICAgICAgICAgIDxUUlVFPgotICAgIHwgICAgICAgICAgICAgICAgPEZBTFNFPgotfQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gVXNlIERpcmVjdGl2ZQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLXZvaWQgVXNlRGlyZWN0aXZlICgpOgote30KLXsgCi0gICAgICAgIDxVU0U+IDxOQU1FU1BBQ0U+IDxMUEFSRU4+IExpc3RFeHByZXNzaW9uKCkgPFJQQVJFTj4KLX0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIEltcG9ydCBEaXJlY3RpdmUKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi12b2lkIEltcG9ydERpcmVjdGl2ZSAoKToKLXt9Ci17Ci0gICAgICAgIExPT0tBSEVBRCgzKSA8SU1QT1JUPiBQYWNrYWdlTmFtZSgpCi0gICAgfCAgICAgICAgICAgICAgICA8SU1QT1JUPiBJZGVudGlmaWVyKCkgPEFTU0lHTj4gUGFja2FnZU5hbWUoKQotfQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gSW5jbHVkZSBEaXJlY3RpdmUKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi12b2lkIEluY2x1ZGVEaXJlY3RpdmUgKCk6IAote30KLXsKLSAgICAgICAgPElOQ0xVREU+IDxTVFJJTkdfTElURVJBTD4KLX0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIFByYWdtYQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLXZvaWQgUHJhZ21hICgpOgote30KLXsKLSAgICAgICAgPFVTRT4gUHJhZ21hSXRlbXMoKQotfQotCi12b2lkIFByYWdtYUl0ZW1zICgpOgote30KLXsKLSAgICAgICAgUHJhZ21hSXRlbSgpICg8Q09NTUE+IFByYWdtYUl0ZW0oKSkKLX0KLQotdm9pZCBQcmFnbWFJdGVtICgpOgote30KLXsKLSAgICAgICAgUHJhZ21hRXhwcigpIFs8SE9PSz5dCi19Ci0KLQotdm9pZCBQcmFnbWFFeHByICgpOgote30KLXsKLSAgICAgICAgSWRlbnRpZmllcigpIFs8TFBBUkVOPiBQcmFnbWFBcmd1bWVudCgpIDxSUEFSRU4+XQotfQotCi12b2lkIFByYWdtYUFyZ3VtZW50ICgpOgote30KLXsKLSAgICAgICAgPFRSVUU+Ci0gICAgfCAgIDxGQUxTRT4KLSAgICB8ICAgPERFQ0lNQUxfTElURVJBTD4gCi0gICAgfCAgIDxPQ1RBTF9MSVRFUkFMPgotICAgIHwgICA8SEVYX0xJVEVSQUw+Ci0gICAgfCAgIDxGTE9BVElOR19QT0lOVF9MSVRFUkFMPiAKLSAgICB8ICAgPFNUUklOR19MSVRFUkFMPiAKLX0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIERlZmluaXRpb25zIAotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIEV4cG9ydCBEZWZpbml0aW9uIAotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLXZvaWQgRXhwb3J0RGVmaW5pdGlvbiAoKToKLXt9Ci17Ci0gICAgICAgIDxFWFBPUlQ+IEV4cG9ydEJpbmRpbmdMaXN0ICgpCi19Ci0KLXZvaWQgRXhwb3J0QmluZGluZ0xpc3QgKCk6Ci17fQotewotICAgICAgICBFeHBvcnRCaW5kaW5nKCkgKDxDT01NQT4gRXhwb3J0QmluZGluZygpKSoKLX0KLQotdm9pZCBFeHBvcnRCaW5kaW5nICgpOgote30KLXsKLSAgICAgICAgTE9PS0FIRUFEKDIpIEZ1bmN0aW9uTmFtZSAoKQotICAgIHwgICAgICAgICAgICAgICAgRnVuY3Rpb25OYW1lICgpIDxBU1NJR04+IEZ1bmN0aW9uTmFtZSAoKQotfQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gVmFyaWFibGUgRGVmaW5pdGlvbiAoaW4sIE5vSU4pCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotdm9pZCBWYXJpYWJsZURlZmluaXRpb24gKCk6Ci17fQotewotICAgICAgICBWYXJpYWJsZURlZmluaXRpb25LaW5kKCkgVmFyaWFibGVCaW5kaW5nTGlzdCgpCi19Ci0KLXZvaWQgVmFyaWFibGVEZWZpbml0aW9uTm9JTiAoKToKLXt9Ci17Ci0gICAgICAgIFZhcmlhYmxlRGVmaW5pdGlvbktpbmQoKSBWYXJpYWJsZUJpbmRpbmdMaXN0Tm9JTigpCi19Ci0KLQotdm9pZCBWYXJpYWJsZURlZmluaXRpb25LaW5kICgpOgote30KLXsKLSAgICAgICAgPFZBUj4KLSAgICB8ICAgPENPTlNUPgotfQotCi12b2lkIFZhcmlhYmxlQmluZGluZ0xpc3QgKCk6Ci17fQotewotICAgVmFyaWFibGVCaW5kaW5nKCkgKDxDT01NQT4gVmFyaWFibGVCaW5kaW5nICgpKSoKLX0KLQotdm9pZCBWYXJpYWJsZUJpbmRpbmdMaXN0Tm9JTiAoKToKLXt9Ci17Ci0gICBWYXJpYWJsZUJpbmRpbmdOb0lOKCkgKDxDT01NQT4gVmFyaWFibGVCaW5kaW5nTm9JTigpKSoKLX0KLQotdm9pZCBWYXJpYWJsZUJpbmRpbmcgKCk6Ci17fQotewotICAgICAgICBUeXBlZElkZW50aWZpZXIoKSBbVmFyaWFibGVJbml0aWFsaXNhdGlvbigpXQotfQotCi12b2lkIFZhcmlhYmxlQmluZGluZ05vSU4gKCk6Ci17fQotewotICAgICAgICBUeXBlZElkZW50aWZpZXJOb0lOKCkgW1ZhcmlhYmxlSW5pdGlhbGlzYXRpb25Ob0lOKCldCi19Ci0KLQotdm9pZCBWYXJpYWJsZUluaXRpYWxpc2F0aW9uICgpOgote30KLXsKLSAgICAgICA8QVNTSUdOPiAgVmFyaWFibGVJbml0aWFsaXplciAoKQotfQotCi12b2lkIFZhcmlhYmxlSW5pdGlhbGlzYXRpb25Ob0lOICgpOgote30KLXsKLSAgICAgICA8QVNTSUdOPiAgVmFyaWFibGVJbml0aWFsaXplck5vSU4gKCkKLX0KLQotdm9pZCBWYXJpYWJsZUluaXRpYWxpemVyICgpOgote30KLXsKLSAgICAgICAgTE9PS0FIRUFEKDMpIEFzc2lnbm1lbnRFeHByZXNzaW9uICgpCi0gICAgfCAgICAgICAgICAgICAgICBBdHRyaWJ1dGVzICgpCi19Ci0KLXZvaWQgVmFyaWFibGVJbml0aWFsaXplck5vSU4gKCk6Ci17fQotewotICAgICAgICBMT09LQUhFQUQoMykgQXNzaWdubWVudEV4cHJlc3Npb25Ob0lOICgpCi0gICAgfCAgICAgICAgICAgICAgICBBdHRyaWJ1dGVzICgpCi19Ci0KLQotdm9pZCBUeXBlZElkZW50aWZpZXIgKCk6Ci17fQotewotICAgICAgICBJZGVudGlmaWVyICgpIFs8Q09MT04+IFR5cGVFeHByZXNzaW9uKCldCi19Ci0KLXZvaWQgVHlwZWRJZGVudGlmaWVyTm9JTiAoKToKLXt9Ci17Ci0gICAgICAgIElkZW50aWZpZXIgKCkgWzxDT0xPTj4gVHlwZUV4cHJlc3Npb25Ob0lOKCldCi19Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyBTaW1wbGUgVmFyaWFibGUgRGVmaW5pdGlvbiAKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi12b2lkIFNpbXBsZVZhcmlhYmxlRGVmaW5pdGlvbiAoKToKLXt9Ci17Ci0gICAgICAgIDxWQVI+IFVudHlwZWRWYXJpYWJsZUJpbmRpbmdMaXN0KCkKLX0KLQotdm9pZCBVbnR5cGVkVmFyaWFibGVCaW5kaW5nTGlzdCAoKToKLXt9Ci17Ci0gICAgICAgIFVudHlwZWRWYXJpYWJsZUJpbmRpbmcoKSAoPENPTU1BPiBVbnR5cGVkVmFyaWFibGVCaW5kaW5nKCkpKgotfQotCi12b2lkIFVudHlwZWRWYXJpYWJsZUJpbmRpbmcgKCk6Ci17fQotewotICAgICAgICBJZGVudGlmaWVyKCkgVmFyaWFibGVJbml0aWFsaXNhdGlvbigpCi19Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyBGdW5jdGlvbiBEZWZpbml0aW9uCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotdm9pZCBGdW5jdGlvbkRlZmluaXRpb24gKCk6Ci17fQotewotICAgICAgICA8RlVOQ1RJT04+IEZ1bmN0aW9uTmFtZSgpIEZ1bmN0aW9uQ29tbW9uKCkKLX0KLQotdm9pZCBGdW5jdGlvbk5hbWUgKCk6Ci17fQotewotICAgICAgICAvLyBubyBsaW5lIGJyZWFrIGFmdGVyIGdldAotICAgICAgICBMT09LQUhFQUQoMikgPEdFVD4gSWRlbnRpZmllcigpCi0gICAgICAgIC8vIG5vIGxpbmUgYnJlYWsgYWZ0ZXIgZ2V0Ci0gICAgfCAgIExPT0tBSEVBRCgyKSA8U0VUPiBJZGVudGlmaWVyKCkKLSAgICB8ICAgICAgICAgICAgICAgICBJZGVudGlmaWVyKCkKLX0KLQotdm9pZCBGdW5jdGlvbkNvbW1vbiAoKToKLXt9Ci17Ci0gICAgICAgIDxMUEFSRU4+IFtQYXJhbWV0ZXJzKCldIDxSUEFSRU4+IFtSZXN1bHQoKV0gQmxvY2soKQotfQotCi12b2lkIFBhcmFtZXRlcnMgKCk6Ci17fQotewotICAgICAgICBSZXN0UGFyYW1ldGVycygpCi0gICAgfCAgIFBhcmFtZXRlckluaXQoKSAoPENPTU1BPiBQYXJhbWV0ZXJJbml0KCkpKiBbUmVzdFBhcmFtZXRlcnMoKV0KLX0KLQotdm9pZCBQYXJhbWV0ZXIgKCk6Ci17fQotewotICAgICAgICBbPENPTlNUPl0gVHlwZWRJZGVudGlmaWVyKCkKLX0KLQotdm9pZCBQYXJhbWV0ZXJJbml0ICgpOgote30KLXsKLSAgICAgICAgUGFyYW1ldGVyKCkgWzxBU1NJR04+IEFzc2lnbm1lbnRFeHByZXNzaW9uKCldCi19Ci0KLXZvaWQgUmVzdFBhcmFtZXRlcnMgKCk6Ci17fQotewotICAgICAgICA8RUxJUFNFPiBbPENPTlNUPiBJZGVudGlmaWVyKCldCi19Ci0KLXZvaWQgUmVzdWx0ICgpOgote30KLXsKLSAgICAgICAgPENPTE9OPiBUeXBlRXhwcmVzc2lvbigpCi19Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyBDbGFzcyBEZWZpbml0aW9uCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotdm9pZCBDbGFzc0RlZmluaXRpb24gKCk6Ci17fQotewotICAgICAgICA8Q0xBU1M+IElkZW50aWZpZXIoKSBbSW5oZXJpdGFuY2UoKV0gQmxvY2soKQotfQotCi12b2lkIEludGVyZmFjZURlZmluaXRpb24gKCk6Ci17fQotewotICAgICAgICBMT09LQUhFQUQoMykgPElOVEVSRkFDRT4gSWRlbnRpZmllcigpIFNjKCkKLSAgICB8ICAgICAgICAgICAgICAgIDxJTlRFUkZBQ0U+IElkZW50aWZpZXIoKSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFs8RVhURU5EUz4gVHlwZUV4cHJlc3Npb25MaXN0KCldIEJsb2NrKCkKLX0KLQotCi12b2lkIEluaGVyaXRhbmNlICgpOgote30KLXsgCi0gICAgICAgIDxFWFRFTkRTPiBUeXBlRXhwcmVzc2lvbigpIFs8SU1QTEVNRU5UUz4gVHlwZUV4cHJlc3Npb25MaXN0KCldCi0gICAgfCAgIDxJTVBMRU1FTlRTPiBUeXBlRXhwcmVzc2lvbkxpc3QoKQotfQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gTmFtZXNwYWNlIERlZmluaXRpb24gCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotdm9pZCBOYW1lc3BhY2VEZWZpbml0aW9uICgpOgote30KLXsKLSAgICAgICAgPE5BTUVTUEFDRT4gSWRlbnRpZmllcigpCi19Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyBQYWNrYWdlIERlZmluaXRpb24gCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotdm9pZCBQYWNrYWdlRGVmaW5pdGlvbiAoKToKLXt9Ci17Ci0gICAgICAgIDxQQUNLQUdFPiBbUGFja2FnZU5hbWUoKV0gQmxvY2soKQotfQotCi12b2lkIFBhY2thZ2VOYW1lICgpOgote30KLXsKLSAgICAgICAgPFNUUklOR19MSVRFUkFMPgotICAgIHwgICBQYWNrYWdlSWRlbnRpZmllcnMoKQotfQotCi12b2lkIFBhY2thZ2VJZGVudGlmaWVycyAoKToKLXt9Ci17Ci0gICAgICAgIElkZW50aWZpZXIoKSAoPERPVD4gSWRlbnRpZmllcigpKSoKLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdGNvbXBpbGVyL0RlcHRoRmlyc3RUcmF2ZXJzYWwuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdGNvbXBpbGVyL0RlcHRoRmlyc3RUcmF2ZXJzYWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmM0YTQzMy4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHRjb21waWxlci9EZXB0aEZpcnN0VHJhdmVyc2FsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjE0ICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LmphdmFzY3JpcHRjb21waWxlcjsKLQotaW1wb3J0IGphdmEuaW8uUHJpbnRTdHJlYW07Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLQotaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuamF2YXNjcmlwdDIwcGFyc2VyLio7Ci0KLXB1YmxpYyBjbGFzcyBEZXB0aEZpcnN0VHJhdmVyc2FsIGltcGxlbWVudHMgSlNQYXJzZXIyMFZpc2l0b3IKLXsKLSAgcHJvdGVjdGVkIFByaW50U3RyZWFtIG91dDsKLSAgcHJpdmF0ZSBib29sZWFuIF9kZWJ1ZzsKLSAgcHJpdmF0ZSBpbnQgZGVwdGg7Ci0gIHByaXZhdGUgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4gbmFtZVRhYmxlOwotCi0gIHB1YmxpYyBEZXB0aEZpcnN0VHJhdmVyc2FsKCkKLSAgewotICAgIG91dCA9IFN5c3RlbS5vdXQ7Ci0gICAgX2RlYnVnID0gdHJ1ZTsKLSAgICBkZXB0aCA9IDA7Ci0gIH0KLQotCi0gIHB1YmxpYyBEZXB0aEZpcnN0VHJhdmVyc2FsKFByaW50U3RyZWFtIG8pCi0gIHsKLSAgICBvdXQgPSBvOwotICAgIF9kZWJ1ZyA9IHRydWU7Ci0gICAgZGVwdGggPSAwOwotICB9Ci0KLSAgcHVibGljIERlcHRoRmlyc3RUcmF2ZXJzYWwoUHJpbnRTdHJlYW0gbywgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4gdE1hcCkKLSAgewotICAgIG91dCA9IG87Ci0gICAgX2RlYnVnID0gdHJ1ZTsKLSAgICBkZXB0aCA9IDA7Ci0gICAgbmFtZVRhYmxlID0gdE1hcDsKLSAgfQotCi0KLSAgcHVibGljIE9iamVjdCBkZXB0aEZpcnN0VHJhdmVyc2FsKFNpbXBsZU5vZGUgbm9kZSwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICBkZXB0aCsrOwotCi0gICAgVG9rZW4gdDEgPSBub2RlLmdldEZpcnN0VG9rZW4oKTsKLSAgICBUb2tlbiB0ID0gbmV3IFRva2VuKCk7Ci0gICAgdC5uZXh0ID0gdDE7Ci0KLSAgICBTaW1wbGVOb2RlIG47Ci0KLSAgICBmb3IgKGludCBvcmQgPSAwOyBvcmQgPCBub2RlLmpqdEdldE51bUNoaWxkcmVuKCk7IG9yZCsrKQotICAgIHsKLSAgICAgIC8vCi0gICAgICAvLyAgR2V0IHRoZSBuZXh0IGNoaWQgbm9kZSBpbiBzZXF1ZW5jZS4KLSAgICAgIC8vCi0gICAgICBuID0gKFNpbXBsZU5vZGUpIG5vZGUuamp0R2V0Q2hpbGQob3JkKTsKLQotICAgICAgLy8KLSAgICAgIC8vIExvb3AgdGhyb3VnaCBhbGwgdGhlIFRva2VucyB0aGF0IGFyZSBhdHRhY2hlZCB0byB0aGlzIG5vZGUuCi0gICAgICAvLwotICAgICAgaWYgKF9kZWJ1ZyA9PSB0cnVlKQotICAgICAgewotICAgICAgICB3aGlsZSAodHJ1ZSkKLSAgICAgICAgewotICAgICAgICAgIHQgPSB0Lm5leHQ7Ci0KLSAgICAgICAgICBpZiAodCA9PSBuLmdldEZpcnN0VG9rZW4oKSkgYnJlYWs7Ci0KLSAgICAgICAgICBwcmludCh0KTsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICAvLwotICAgICAgLy8gRGVwdGggRmlzdCBzZWFyY2ggc28gdmlzaXQgdGhpcyBub2RlcyBjaGlsZHJlbiBiZWZvcmUgc2libGluZ3MKLSAgICAgIC8vCi0gICAgICBuLmpqdEFjY2VwdCh0aGlzLCBkYXRhKTsKLQotICAgICAgdCA9IG4uZ2V0TGFzdFRva2VuKCk7Ci0gICAgfQotCi0gICAgaWYgKF9kZWJ1ZyA9PSB0cnVlKQotICAgIHsKLSAgICAgIHdoaWxlICh0ICE9IG5vZGUuZ2V0TGFzdFRva2VuKCkpCi0gICAgICB7Ci0gICAgICAgIGlmICh0Lm5leHQgPT0gbnVsbCkgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgdCA9IHQubmV4dDsKLSAgICAgICAgcHJpbnQodCk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgZGVwdGgtLTsKLQotICAgIHJldHVybiBkYXRhOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgcHJpbnROb2RlKFNpbXBsZU5vZGUgbm9kZSkKLSAgewotICAgIFRva2VuIHQgPSBub2RlLmdldEZpcnN0VG9rZW4oKTsKLQotICAgIHdoaWxlICh0ICE9IG5vZGUuZ2V0TGFzdFRva2VuKCkpCi0gICAgewotICAgICAgcHJpbnQodCk7Ci0gICAgICB0ID0gdC5uZXh0OwotICAgIH0KLQotICAgIHByaW50KG5vZGUuZ2V0TGFzdFRva2VuKCkpOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgcHJpbnQoVG9rZW4gdCkKLSAgewotICAgIC8vCi0gICAgLy8gIEhhY2sgQWxlcnQ6IER1ZSB0byBhbiBlcnJvciB3aXRoIHRoZSBsZWFmIG5vZGUgQVNURW9sV2l0aENvbW1lbnRzCi0gICAgLy8gIFdpY2ggb25seSBtYXRjaGVzIHNwZWNpYWwgYW5kIG5vIHJlZ3VsYXIgdG9rZW5zIHRodXMgd2UgZ2V0IHRoZSBuZXh0Ci0gICAgLy8gIHZhbGlkIGxlYWZzIHRva2VuIHN0dWNrIGluIGhlcmUuIFRodXMgd2UgZ2V0IGR1cGxpY2F0ZSBpbmZvIGluIGVhY2ggZmlsZS4KLSAgICAvLyAgRml4ZWQgdGhpcyB3aXRoIHNpbXBsZSBmbGFnIHRvIHJlY29nbml6ZXMgaWYgdGhlIHRva2VuIGhhcyBhbHJlYWR5IGJlZW4gCi0gICAgLy8gIHdyaXR0ZW4gb3V0Lk5lZWQgdG8gcmVmYWN0b3IgdGhhdCB0ZXJtaW5hbC4KLSAgICAvLwotICAgIGlmICh0Lmhhc1ByaW50ZWQgPT0gdHJ1ZSkgcmV0dXJuOwotICAgIAotICAgIFRva2VuIHR0ID0gdC5zcGVjaWFsVG9rZW47Ci0KLSAgICBpZiAodHQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICB3aGlsZSAodHQuc3BlY2lhbFRva2VuICE9IG51bGwpCi0gICAgICAgIHR0ID0gdHQuc3BlY2lhbFRva2VuOwotCi0gICAgICB3aGlsZSAodHQgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgb3V0LnByaW50KGFkZFVuaWNvZGVFc2NhcGVzKHR0LmltYWdlKSk7Ci0gICAgICAgIHR0ID0gdHQubmV4dDsKLSAgICAgIH0KLSAgICB9Ci0gICAgLy8KLSAgICAvLyAgQ2hlY2sgdG8gc2VlIGlmIHRoZSBUb2tlbiBpcyBhbiBpZGVudGlmaWVyIGtpbmQuCi0gICAgLy8KLSAgICBpZiAodC5raW5kID09IDc4KSAKLSAgICB7Ci0gICAgICAvLwotICAgICAgLy8gIFBvdGVudGlhbCBpdGVtIHRvIHN3YXAgb3V0LgotICAgICAgLy8KLSAgICAgIFN0cmluZyB0ZW1wID0gbmFtZVRhYmxlLmdldCh0LmltYWdlKTsKLSAgICAgIGlmICh0ZW1wICE9IG51bGwpIAotICAgICAgewotICAgICAgICB0LmltYWdlID0gdGVtcDsKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHQua2luZCA9PSA3MCB8fCB0LmtpbmQgPT0gNzIgfHwgdC5raW5kID09IDc3KSAKLSAgICB7Ci0gICAgICAvLwotICAgICAgLy8gICBHb3Qgc3RyaW5nIHRoYXQgY291bGQgaGF2ZSBhIHBvdGVudGlhbCBjbGFzcyBpbiBpdCAobGlrZSBFdmFsIG9yIAotICAgICAgLy8gICBSZWdFeHAgc28gbmVlZCB0byBzY2FuIHRoZSBzdHJpbmcuCi0gICAgICAvLwotICAgICAgU3RyaW5nVG9rZW5pemVyIHN0OwotICAgICAgaWYgKHQuaW1hZ2UuY2hhckF0KDApID09ICciJyAmJiB0LmltYWdlLmxlbmd0aCgpID4gMikgCi0gICAgICB7Ci0gICAgICAgIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcih0LmltYWdlLnN1YnN0cmluZygxLCAodC5pbWFnZS5sZW5ndGgoKS0xKSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIH0gZWxzZSAKLSAgICAgIHsKLSAgICAgICAgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHQuaW1hZ2UpOwotICAgICAgfQotICAgICAgU3RyaW5nQnVpbGRlciByZXBsYWNlbWVudFN0cmluZyA9IG5ldyBTdHJpbmdCdWlsZGVyKHQuaW1hZ2UpOwotICAgICAgYm9vbGVhbiB1cGRhdGUgPSBmYWxzZTsKLSAgICAgIHdoaWxlIChzdC5oYXNNb3JlVG9rZW5zKCkpIHsKLSAgICAgICAgICBTdHJpbmcgdGVtcDEgPSBzdC5uZXh0VG9rZW4oKTsKLSAgICAgICAgICBTdHJpbmcgdGVtcCA9IG5hbWVUYWJsZS5nZXQodGVtcDEpOwotICAgICAgICAgIGlmICh0ZW1wICE9IG51bGwpIAotICAgICAgICAgIHsKLSAgICAgICAgICAgIGludCBzdGFydCA9IHJlcGxhY2VtZW50U3RyaW5nLmluZGV4T2YodGVtcDEpOwotICAgICAgICAgICAgaW50IGVuZCA9IHN0YXJ0ICsgdGVtcDEubGVuZ3RoKCk7Ci0gICAgICAgICAgICB1cGRhdGUgPSB0cnVlOwotICAgICAgICAgICAgcmVwbGFjZW1lbnRTdHJpbmcuZGVsZXRlKHN0YXJ0LCBlbmQpOwotICAgICAgICAgICAgcmVwbGFjZW1lbnRTdHJpbmcuaW5zZXJ0KHN0YXJ0LCB0ZW1wKTsKLSAgICAgICAgICB9IAotICAgICAgfQotICAgICAgaWYgKHVwZGF0ZSA9PSB0cnVlKSAKLSAgICAgIHsKLSAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9sZCBTdHJpbmcgaXM6IiArIHQuaW1hZ2UpOwotICAgICAgICAgIHQuaW1hZ2UgPSByZXBsYWNlbWVudFN0cmluZy50b1N0cmluZygpOwotICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiTmV3IFN0cmluZyBpczoiICsgdC5pbWFnZSk7Ci0gICAgICB9Ci0gICAgfQotICAgIG91dC5wcmludChhZGRVbmljb2RlRXNjYXBlcyh0LmltYWdlKSk7Ci0gICAgdC5oYXNQcmludGVkID0gdHJ1ZTsKLSAgfQotCi0gIHByaXZhdGUgU3RyaW5nIGFkZFVuaWNvZGVFc2NhcGVzKFN0cmluZyBzdHIpCi0gIHsKLSAgICBTdHJpbmcgcmV0dmFsID0gIiI7Ci0gICAgY2hhciBjaDsKLQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3RyLmxlbmd0aCgpOyBpKyspCi0gICAgewotICAgICAgY2ggPSBzdHIuY2hhckF0KGkpOwotCi0gICAgICBpZiAoKChjaCA8IDB4MjApIHx8IChjaCA+IDB4N2UpKSAmJiAoY2ggIT0gJ1x0JykgJiYgKGNoICE9ICdcbicpICYmCi0gICAgICAgICAgKGNoICE9ICdccicpICYmIChjaCAhPSAnXGYnKSkKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIHMgPSAiMDAwMCIgKyBJbnRlZ2VyLnRvU3RyaW5nKGNoLCAxNik7Ci0gICAgICAgIHJldHZhbCArPSAoIlxcdSIgKyBzLnN1YnN0cmluZyhzLmxlbmd0aCgpIC0gNCwgcy5sZW5ndGgoKSkpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICByZXR2YWwgKz0gY2g7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIHJldHZhbDsKLSAgfQotCi0gIHByaXZhdGUgU3RyaW5nIGJ1aWxkUGFkZGVkU3RyaW5nKFN0cmluZyBzKQotICB7Ci0gICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCi0gICAgZm9yIChpbnQgY291bnQgPSAwOyBjb3VudCA8PSBkZXB0aDsgY291bnQrKykKLSAgICB7Ci0gICAgICBzYiA9IHNiLmFwcGVuZCgiICIpOwotICAgIH0KLQotICAgIHNiID0gc2IuYXBwZW5kKHMpOwotCi0gICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IHZpc2l0KFNpbXBsZU5vZGUgbm9kZSwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICBkZXB0aEZpcnN0VHJhdmVyc2FsKG5vZGUsIGRhdGEpOwotCi0gICAgcmV0dXJuIGRhdGE7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVFByb2dyYW0gbm9kZSwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICBkZXB0aEZpcnN0VHJhdmVyc2FsKG5vZGUsIGRhdGEpOwotCi0gICAgcmV0dXJuIGRhdGE7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVElkZW50aWZpZXIgbm9kZSwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICBkZXB0aEZpcnN0VHJhdmVyc2FsKG5vZGUsIGRhdGEpOwotCi0gICAgcmV0dXJuIGRhdGE7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVFNpbXBsZVF1YWxpZmllZElkZW50aWZpZXIgbm9kZSwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICBkZXB0aEZpcnN0VHJhdmVyc2FsKG5vZGUsIGRhdGEpOwotCi0gICAgcmV0dXJuIGRhdGE7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVEV4cHJlc3Npb25RdWFsaWZpZWRJZGVudGlmaWVyIG5vZGUsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgZGVwdGhGaXJzdFRyYXZlcnNhbChub2RlLCBkYXRhKTsKLQotICAgIHJldHVybiBkYXRhOwotICB9Ci0KLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RRdWFsaWZpZWRJZGVudGlmaWVyIG5vZGUsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgZGVwdGhGaXJzdFRyYXZlcnNhbChub2RlLCBkYXRhKTsKLQotICAgIHJldHVybiBkYXRhOwotICB9Ci0KLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RQcmltYXJ5RXhwcmVzc2lvbiBub2RlLCBPYmplY3QgZGF0YSkKLSAgewotICAgIGRlcHRoRmlyc3RUcmF2ZXJzYWwobm9kZSwgZGF0YSk7Ci0KLSAgICByZXR1cm4gZGF0YTsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUUmVzZXJ2ZWROYW1lc3BhY2Ugbm9kZSwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICBkZXB0aEZpcnN0VHJhdmVyc2FsKG5vZGUsIGRhdGEpOwotCi0gICAgcmV0dXJuIGRhdGE7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVEZ1bmN0aW9uRXhwcmVzc2lvbiBub2RlLCBPYmplY3QgZGF0YSkKLSAgewotICAgIGRlcHRoRmlyc3RUcmF2ZXJzYWwobm9kZSwgZGF0YSk7Ci0KLSAgICByZXR1cm4gZGF0YTsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUT2JqZWN0TGl0ZXJhbCBub2RlLCBPYmplY3QgZGF0YSkKLSAgewotICAgIGRlcHRoRmlyc3RUcmF2ZXJzYWwobm9kZSwgZGF0YSk7Ci0KLSAgICByZXR1cm4gZGF0YTsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNURmllbGRMaXN0IG5vZGUsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgZGVwdGhGaXJzdFRyYXZlcnNhbChub2RlLCBkYXRhKTsKLQotICAgIHJldHVybiBkYXRhOwotICB9Ci0KLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RMaXRlcmFsRmllbGQgbm9kZSwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICBkZXB0aEZpcnN0VHJhdmVyc2FsKG5vZGUsIGRhdGEpOwotCi0gICAgcmV0dXJuIGRhdGE7Ci0gfQotCi0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNURmllbGROYW1lIG5vZGUsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgZGVwdGhGaXJzdFRyYXZlcnNhbChub2RlLCBkYXRhKTsKLQotICAgIHJldHVybiBkYXRhOwotICB9Ci0KLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RBcnJheUxpdGVyYWwgbm9kZSwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICBkZXB0aEZpcnN0VHJhdmVyc2FsKG5vZGUsIGRhdGEpOwotCi0gICAgcmV0dXJuIGRhdGE7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVEVsZW1lbnRMaXN0IG5vZGUsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgZGVwdGhGaXJzdFRyYXZlcnNhbChub2RlLCBkYXRhKTsKLQotICAgIHJldHVybiBkYXRhOwotICB9Ci0KLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RMaXRlcmFsRWxlbWVudCBub2RlLCBPYmplY3QgZGF0YSkKLSAgewotICAgIGRlcHRoRmlyc3RUcmF2ZXJzYWwobm9kZSwgZGF0YSk7Ci0KLSAgICByZXR1cm4gZGF0YTsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUU3VwZXJFeHByZXNzaW9uIG5vZGUsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgZGVwdGhGaXJzdFRyYXZlcnNhbChub2RlLCBkYXRhKTsKLQotICAgIHJldHVybiBkYXRhOwotICB9Ci0KLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RQb3N0Zml4RXhwcmVzc2lvbiBub2RlLCBPYmplY3QgZGF0YSkKLSAgewotICAgIGRlcHRoRmlyc3RUcmF2ZXJzYWwobm9kZSwgZGF0YSk7Ci0KLSAgICByZXR1cm4gZGF0YTsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUQXR0cmlidXRlRXhwcmVzc2lvbiBub2RlLCBPYmplY3QgZGF0YSkKLSAgewotICAgIGRlcHRoRmlyc3RUcmF2ZXJzYWwobm9kZSwgZGF0YSk7Ci0KLSAgICByZXR1cm4gZGF0YTsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNURnVsbFBvc3RmaXhFeHByZXNzaW9uIG5vZGUsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgZGVwdGhGaXJzdFRyYXZlcnNhbChub2RlLCBkYXRhKTsKLQotICAgIHJldHVybiBkYXRhOwotICB9Ci0KLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RGdWxsTmV3RXhwcmVzc2lvbiBub2RlLCBPYmplY3QgZGF0YSkKLSAgewotICAgIGRlcHRoRmlyc3RUcmF2ZXJzYWwobm9kZSwgZGF0YSk7Ci0KLSAgICByZXR1cm4gZGF0YTsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNURnVuY3Rpb25Db25zdHJ1Y3RvciBub2RlLCBPYmplY3QgZGF0YSkKLSAgewotICAgIGRlcHRoRmlyc3RUcmF2ZXJzYWwobm9kZSwgZGF0YSk7Ci0KLSAgICByZXR1cm4gZGF0YTsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNURnVsbE5ld1N1YmV4cHJlc3Npb24gbm9kZSwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICBkZXB0aEZpcnN0VHJhdmVyc2FsKG5vZGUsIGRhdGEpOwotCi0gICAgcmV0dXJuIGRhdGE7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVFBvc3RmaXhPcCBub2RlLCBPYmplY3QgZGF0YSkKLSAgewotICAgIGRlcHRoRmlyc3RUcmF2ZXJzYWwobm9kZSwgZGF0YSk7Ci0KLSAgICByZXR1cm4gZGF0YTsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUUHJvcGVydHlPckFyZ3VtZW50cyBub2RlLCBPYmplY3QgZGF0YSkKLSAgewotICAgIGRlcHRoRmlyc3RUcmF2ZXJzYWwobm9kZSwgZGF0YSk7Ci0KLSAgICByZXR1cm4gZGF0YTsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUUHJvcGVydHlPcGVyYXRvciBub2RlLCBPYmplY3QgZGF0YSkKLSAgewotICAgIGRlcHRoRmlyc3RUcmF2ZXJzYWwobm9kZSwgZGF0YSk7Ci0KLSAgICByZXR1cm4gZGF0YTsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUQXJndW1lbnRzIG5vZGUsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgZGVwdGhGaXJzdFRyYXZlcnNhbChub2RlLCBkYXRhKTsKLQotICAgIHJldHVybiBkYXRhOwotICB9Ci0KLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RVbmFyeUV4cHJlc3Npb24gbm9kZSwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICBkZXB0aEZpcnN0VHJhdmVyc2FsKG5vZGUsIGRhdGEpOwotCi0gICAgcmV0dXJuIGRhdGE7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVE11bE9wIG5vZGUsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgZGVwdGhGaXJzdFRyYXZlcnNhbChub2RlLCBkYXRhKTsKLQotICAgIHJldHVybiBkYXRhOwotICB9Ci0KLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24gbm9kZSwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICBkZXB0aEZpcnN0VHJhdmVyc2FsKG5vZGUsIGRhdGEpOwotCi0gICAgcmV0dXJuIGRhdGE7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVEFkZE9wIG5vZGUsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgZGVwdGhGaXJzdFRyYXZlcnNhbChub2RlLCBkYXRhKTsKLQotICAgIHJldHVybiBkYXRhOwotICB9Ci0KLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RBZGRpdGl2ZUV4cHJlc3Npb24gbm9kZSwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICBkZXB0aEZpcnN0VHJhdmVyc2FsKG5vZGUsIGRhdGEpOwotCi0gICAgcmV0dXJuIGRhdGE7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVFNoaWZ0T3Agbm9kZSwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICBkZXB0aEZpcnN0VHJhdmVyc2FsKG5vZGUsIGRhdGEpOwotCi0gICAgcmV0dXJuIGRhdGE7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVFNoaWZ0RXhwcmVzc2lvbiBub2RlLCBPYmplY3QgZGF0YSkKLSAgewotICAgIGRlcHRoRmlyc3RUcmF2ZXJzYWwobm9kZSwgZGF0YSk7Ci0KLSAgICByZXR1cm4gZGF0YTsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUUmVsT3Agbm9kZSwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICBkZXB0aEZpcnN0VHJhdmVyc2FsKG5vZGUsIGRhdGEpOwotCi0gICAgcmV0dXJuIGRhdGE7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVFJlbGF0aW9uYWxFeHByZXNzaW9uIG5vZGUsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgZGVwdGhGaXJzdFRyYXZlcnNhbChub2RlLCBkYXRhKTsKLQotICAgIHJldHVybiBkYXRhOwotICB9Ci0KLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RSZWxhdGlvbmFsRXhwcmVzc2lvbk5vSU4gbm9kZSwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICBkZXB0aEZpcnN0VHJhdmVyc2FsKG5vZGUsIGRhdGEpOwotCi0gICAgcmV0dXJuIGRhdGE7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVEVxdWFsT3Agbm9kZSwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICBkZXB0aEZpcnN0VHJhdmVyc2FsKG5vZGUsIGRhdGEpOwotCi0gICAgcmV0dXJuIGRhdGE7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVEVxdWFsaXR5RXhwcmVzc2lvbiBub2RlLCBPYmplY3QgZGF0YSkKLSAgewotICAgIGRlcHRoRmlyc3RUcmF2ZXJzYWwobm9kZSwgZGF0YSk7Ci0KLSAgICByZXR1cm4gZGF0YTsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNURXF1YWxpdHlFeHByZXNzaW9uTm9JTiBub2RlLCBPYmplY3QgZGF0YSkKLSAgewotICAgIGRlcHRoRmlyc3RUcmF2ZXJzYWwobm9kZSwgZGF0YSk7Ci0KLSAgICByZXR1cm4gZGF0YTsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUQml0d2lzZUFORE9wIG5vZGUsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgZGVwdGhGaXJzdFRyYXZlcnNhbChub2RlLCBkYXRhKTsKLQotICAgIHJldHVybiBkYXRhOwotICB9Ci0KLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RCaXR3aXNlQU5ERXhwcmVzc2lvbiBub2RlLCBPYmplY3QgZGF0YSkKLSAgewotICAgIGRlcHRoRmlyc3RUcmF2ZXJzYWwobm9kZSwgZGF0YSk7Ci0KLSAgICByZXR1cm4gZGF0YTsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUQml0d2lzZUFOREV4cHJlc3Npb25Ob0lOIG5vZGUsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgZGVwdGhGaXJzdFRyYXZlcnNhbChub2RlLCBkYXRhKTsKLQotICAgIHJldHVybiBkYXRhOwotICB9Ci0KLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RCaXR3aXNlWE9ST3Agbm9kZSwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICBkZXB0aEZpcnN0VHJhdmVyc2FsKG5vZGUsIGRhdGEpOwotCi0gICAgcmV0dXJuIGRhdGE7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVEJpdHdpc2VYT1JFeHByZXNzaW9uIG5vZGUsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgZGVwdGhGaXJzdFRyYXZlcnNhbChub2RlLCBkYXRhKTsKLQotICAgIHJldHVybiBkYXRhOwotICB9Ci0KLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RCaXR3aXNlWE9SRXhwcmVzc2lvbk5vSU4gbm9kZSwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICBkZXB0aEZpcnN0VHJhdmVyc2FsKG5vZGUsIGRhdGEpOwotCi0gICAgcmV0dXJuIGRhdGE7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVEJpdHdpc2VPUk9wIG5vZGUsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgZGVwdGhGaXJzdFRyYXZlcnNhbChub2RlLCBkYXRhKTsKLQotICAgIHJldHVybiBkYXRhOwotICB9Ci0KLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RCaXR3aXNlT1JFeHByZXNzaW9uIG5vZGUsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgZGVwdGhGaXJzdFRyYXZlcnNhbChub2RlLCBkYXRhKTsKLQotICAgIHJldHVybiBkYXRhOwotICB9Ci0KLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RCaXR3aXNlT1JFeHByZXNzaW9uTm9JTiBub2RlLCBPYmplY3QgZGF0YSkKLSAgewotICAgIGRlcHRoRmlyc3RUcmF2ZXJzYWwobm9kZSwgZGF0YSk7Ci0KLSAgICByZXR1cm4gZGF0YTsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUTG9naWNhbEFOREV4cHJlc3Npb24gbm9kZSwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICBkZXB0aEZpcnN0VHJhdmVyc2FsKG5vZGUsIGRhdGEpOwotCi0gICAgcmV0dXJuIGRhdGE7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVExvZ2ljYWxBTkRFeHByZXNzaW9uTm9JTiBub2RlLCBPYmplY3QgZGF0YSkKLSAgewotICAgIGRlcHRoRmlyc3RUcmF2ZXJzYWwobm9kZSwgZGF0YSk7Ci0KLSAgICByZXR1cm4gZGF0YTsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUTG9naWNhbE9SRXhwcmVzc2lvbiBub2RlLCBPYmplY3QgZGF0YSkKLSAgewotICAgIGRlcHRoRmlyc3RUcmF2ZXJzYWwobm9kZSwgZGF0YSk7Ci0KLSAgICByZXR1cm4gZGF0YTsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUTG9naWNhbE9SRXhwcmVzc2lvbk5vSU4gbm9kZSwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICBkZXB0aEZpcnN0VHJhdmVyc2FsKG5vZGUsIGRhdGEpOwotCi0gICAgcmV0dXJuIGRhdGE7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVENvbmRpdGlvbmFsRXhwcmVzc2lvbiBub2RlLCBPYmplY3QgZGF0YSkKLSAgewotICAgIGRlcHRoRmlyc3RUcmF2ZXJzYWwobm9kZSwgZGF0YSk7Ci0KLSAgICByZXR1cm4gZGF0YTsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUQ29uZGl0aW9uYWxFeHByZXNzaW9uTm9JTiBub2RlLCBPYmplY3QgZGF0YSkKLSAgewotICAgIGRlcHRoRmlyc3RUcmF2ZXJzYWwobm9kZSwgZGF0YSk7Ci0KLSAgICByZXR1cm4gZGF0YTsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUTm9uQXNzaWdubWVudEV4cHJlc3Npb24gbm9kZSwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICBkZXB0aEZpcnN0VHJhdmVyc2FsKG5vZGUsIGRhdGEpOwotCi0gICAgcmV0dXJuIGRhdGE7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVE5vbkFzc2lnbm1lbnRFeHByZXNzaW9uTm9JTiBub2RlLCBPYmplY3QgZGF0YSkKLSAgewotICAgIGRlcHRoRmlyc3RUcmF2ZXJzYWwobm9kZSwgZGF0YSk7Ci0KLSAgICByZXR1cm4gZGF0YTsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUQXNzaWduZW1lbnRPcGVyYXRvciBub2RlLCBPYmplY3QgZGF0YSkKLSAgewotICAgIGRlcHRoRmlyc3RUcmF2ZXJzYWwobm9kZSwgZGF0YSk7Ci0KLSAgICByZXR1cm4gZGF0YTsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUQXNzaWdubWVudEV4cHJlc3Npb24gbm9kZSwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICBkZXB0aEZpcnN0VHJhdmVyc2FsKG5vZGUsIGRhdGEpOwotCi0gICAgcmV0dXJuIGRhdGE7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVEFzc2lnbm1lbnRFeHByZXNzaW9uTm9JTiBub2RlLCBPYmplY3QgZGF0YSkKLSAgewotICAgIGRlcHRoRmlyc3RUcmF2ZXJzYWwobm9kZSwgZGF0YSk7Ci0KLSAgICByZXR1cm4gZGF0YTsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUTGlzdEV4cHJlc3Npb24gbm9kZSwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICBkZXB0aEZpcnN0VHJhdmVyc2FsKG5vZGUsIGRhdGEpOwotCi0gICAgcmV0dXJuIGRhdGE7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVExpc3RFeHByZXNzaW9uTm9JTiBub2RlLCBPYmplY3QgZGF0YSkKLSAgewotICAgIGRlcHRoRmlyc3RUcmF2ZXJzYWwobm9kZSwgZGF0YSk7Ci0KLSAgICByZXR1cm4gZGF0YTsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUVHlwZUV4cHJlc3Npb24gbm9kZSwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICBkZXB0aEZpcnN0VHJhdmVyc2FsKG5vZGUsIGRhdGEpOwotCi0gICAgcmV0dXJuIGRhdGE7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVFR5cGVFeHByZXNzaW9uTm9JTiBub2RlLCBPYmplY3QgZGF0YSkKLSAgewotICAgIGRlcHRoRmlyc3RUcmF2ZXJzYWwobm9kZSwgZGF0YSk7Ci0KLSAgICByZXR1cm4gZGF0YTsKLQotICB9Ci0KLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RUeXBlRXhwcmVzc2lvbkxpc3Qgbm9kZSwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICBkZXB0aEZpcnN0VHJhdmVyc2FsKG5vZGUsIGRhdGEpOwotCi0gICAgcmV0dXJuIGRhdGE7Ci0KLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUU3RhdGVtZW50IG5vZGUsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgZGVwdGhGaXJzdFRyYXZlcnNhbChub2RlLCBkYXRhKTsKLQotICAgIHJldHVybiBkYXRhOwotCi0gIH0KLQotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVFN1YnN0YXRlbWVudCBub2RlLCBPYmplY3QgZGF0YSkKLSAgewotICAgIGRlcHRoRmlyc3RUcmF2ZXJzYWwobm9kZSwgZGF0YSk7Ci0KLSAgICByZXR1cm4gZGF0YTsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUU3Vic3RhdGVtZW50cyBub2RlLCBPYmplY3QgZGF0YSkKLSAgewotICAgIGRlcHRoRmlyc3RUcmF2ZXJzYWwobm9kZSwgZGF0YSk7Ci0KLSAgICByZXR1cm4gZGF0YTsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUU2Mgbm9kZSwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICBkZXB0aEZpcnN0VHJhdmVyc2FsKG5vZGUsIGRhdGEpOwotCi0gICAgcmV0dXJuIGRhdGE7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVEVvbENvbW1lbnRTa2lwV3Mgbm9kZSwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICBkZXB0aEZpcnN0VHJhdmVyc2FsKG5vZGUsIGRhdGEpOwotCi0gICAgcmV0dXJuIGRhdGE7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVEVtcHR5U3RhdGVtZW50IG5vZGUsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgZGVwdGhGaXJzdFRyYXZlcnNhbChub2RlLCBkYXRhKTsKLQotICAgIHJldHVybiBkYXRhOwotICB9Ci0KLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RFeHByZXNzaW9uU3RhdGVtZW50IG5vZGUsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgZGVwdGhGaXJzdFRyYXZlcnNhbChub2RlLCBkYXRhKTsKLQotICAgIHJldHVybiBkYXRhOwotICB9Ci0KLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RTdXBlclN0YXRlbWVudCBub2RlLCBPYmplY3QgZGF0YSkKLSAgewotICAgIGRlcHRoRmlyc3RUcmF2ZXJzYWwobm9kZSwgZGF0YSk7Ci0KLSAgICByZXR1cm4gZGF0YTsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUQmxvY2sgbm9kZSwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICBkZXB0aEZpcnN0VHJhdmVyc2FsKG5vZGUsIGRhdGEpOwotCi0gICAgcmV0dXJuIGRhdGE7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVExhYmVsZWRTdGF0ZW1lbnQgbm9kZSwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICBkZXB0aEZpcnN0VHJhdmVyc2FsKG5vZGUsIGRhdGEpOwotCi0gICAgcmV0dXJuIGRhdGE7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVElmU3RhdGVtZW50IG5vZGUsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgZGVwdGhGaXJzdFRyYXZlcnNhbChub2RlLCBkYXRhKTsKLQotICAgIHJldHVybiBkYXRhOwotICB9Ci0KLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RTd2l0Y2hTdGF0ZW1lbnQgbm9kZSwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICBkZXB0aEZpcnN0VHJhdmVyc2FsKG5vZGUsIGRhdGEpOwotCi0gICAgcmV0dXJuIGRhdGE7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVENhc2VFbGVtZW50cyBub2RlLCBPYmplY3QgZGF0YSkKLSAgewotICAgIGRlcHRoRmlyc3RUcmF2ZXJzYWwobm9kZSwgZGF0YSk7Ci0KLSAgICByZXR1cm4gZGF0YTsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUQ2FzZUVsZW1lbnQgbm9kZSwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICBkZXB0aEZpcnN0VHJhdmVyc2FsKG5vZGUsIGRhdGEpOwotCi0gICAgcmV0dXJuIGRhdGE7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVENhc2VMYWJlbCBub2RlLCBPYmplY3QgZGF0YSkKLSAgewotICAgIGRlcHRoRmlyc3RUcmF2ZXJzYWwobm9kZSwgZGF0YSk7Ci0KLSAgICByZXR1cm4gZGF0YTsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNURG9TdGF0ZW1lbnQgbm9kZSwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICBkZXB0aEZpcnN0VHJhdmVyc2FsKG5vZGUsIGRhdGEpOwotCi0gICAgcmV0dXJuIGRhdGE7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVFdoaWxlU3RhdGVtZW50IG5vZGUsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgZGVwdGhGaXJzdFRyYXZlcnNhbChub2RlLCBkYXRhKTsKLQotICAgIHJldHVybiBkYXRhOwotICB9Ci0KLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RGb3JTdGF0ZW1lbnQgbm9kZSwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICBkZXB0aEZpcnN0VHJhdmVyc2FsKG5vZGUsIGRhdGEpOwotCi0gICAgcmV0dXJuIGRhdGE7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVEZvckluaXRpYWxpemVyIG5vZGUsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgZGVwdGhGaXJzdFRyYXZlcnNhbChub2RlLCBkYXRhKTsKLQotICAgIHJldHVybiBkYXRhOwotICB9Ci0KLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RGb3JJbkJpbmRpbmcgbm9kZSwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICBkZXB0aEZpcnN0VHJhdmVyc2FsKG5vZGUsIGRhdGEpOwotCi0gICAgcmV0dXJuIGRhdGE7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVFdpdGhTdGF0ZW1lbnQgbm9kZSwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICBkZXB0aEZpcnN0VHJhdmVyc2FsKG5vZGUsIGRhdGEpOwotCi0gICAgcmV0dXJuIGRhdGE7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVENvbnRpbnVlU3RhdGVtZW50IG5vZGUsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgZGVwdGhGaXJzdFRyYXZlcnNhbChub2RlLCBkYXRhKTsKLQotICAgIHJldHVybiBkYXRhOwotICB9Ci0KLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RCcmVha1N0YXRlbWVudCBub2RlLCBPYmplY3QgZGF0YSkKLSAgewotICAgIGRlcHRoRmlyc3RUcmF2ZXJzYWwobm9kZSwgZGF0YSk7Ci0KLSAgICByZXR1cm4gZGF0YTsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUUmV0dXJuU3RhdGVtZW50IG5vZGUsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgZGVwdGhGaXJzdFRyYXZlcnNhbChub2RlLCBkYXRhKTsKLQotICAgIHJldHVybiBkYXRhOwotICB9Ci0KLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RUaHJvd1N0YXRlbWVudCBub2RlLCBPYmplY3QgZGF0YSkKLSAgewotICAgIGRlcHRoRmlyc3RUcmF2ZXJzYWwobm9kZSwgZGF0YSk7Ci0KLSAgICByZXR1cm4gZGF0YTsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUVHJ5U3RhdGVtZW50IG5vZGUsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgZGVwdGhGaXJzdFRyYXZlcnNhbChub2RlLCBkYXRhKTsKLQotICAgIHJldHVybiBkYXRhOwotICB9Ci0KLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1REaXJlY3RpdmVzIG5vZGUsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgZGVwdGhGaXJzdFRyYXZlcnNhbChub2RlLCBkYXRhKTsKLQotICAgIHJldHVybiBkYXRhOwotICB9Ci0KLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1REaXJlY3RpdmUgbm9kZSwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICBkZXB0aEZpcnN0VHJhdmVyc2FsKG5vZGUsIGRhdGEpOwotCi0gICAgcmV0dXJuIGRhdGE7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVEFubm90YXRhYmxlRGlyZWN0aXZlIG5vZGUsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgZGVwdGhGaXJzdFRyYXZlcnNhbChub2RlLCBkYXRhKTsKLQotICAgIHJldHVybiBkYXRhOwotICB9Ci0KLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RBdHRyaWJ1dGVzIG5vZGUsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgZGVwdGhGaXJzdFRyYXZlcnNhbChub2RlLCBkYXRhKTsKLQotICAgIHJldHVybiBkYXRhOwotICB9Ci0KLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RBdHRyaWJ1dGUgbm9kZSwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICBkZXB0aEZpcnN0VHJhdmVyc2FsKG5vZGUsIGRhdGEpOwotCi0gICAgcmV0dXJuIGRhdGE7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVFVzZURpcmVjdGl2ZSBub2RlLCBPYmplY3QgZGF0YSkKLSAgewotICAgIGRlcHRoRmlyc3RUcmF2ZXJzYWwobm9kZSwgZGF0YSk7Ci0KLSAgICByZXR1cm4gZGF0YTsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUSW1wb3J0RGlyZWN0aXZlIG5vZGUsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgZGVwdGhGaXJzdFRyYXZlcnNhbChub2RlLCBkYXRhKTsKLQotICAgIHJldHVybiBkYXRhOwotICB9Ci0KLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RJbmNsdWRlRGlyZWN0aXZlIG5vZGUsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgZGVwdGhGaXJzdFRyYXZlcnNhbChub2RlLCBkYXRhKTsKLQotICAgIHJldHVybiBkYXRhOwotICB9Ci0KLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RQcmFnbWEgbm9kZSwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICBkZXB0aEZpcnN0VHJhdmVyc2FsKG5vZGUsIGRhdGEpOwotCi0gICAgcmV0dXJuIGRhdGE7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVFByYWdtYUl0ZW1zIG5vZGUsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgZGVwdGhGaXJzdFRyYXZlcnNhbChub2RlLCBkYXRhKTsKLQotICAgIHJldHVybiBkYXRhOwotICB9Ci0KLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RQcmFnbWFJdGVtIG5vZGUsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgZGVwdGhGaXJzdFRyYXZlcnNhbChub2RlLCBkYXRhKTsKLQotICAgIHJldHVybiBkYXRhOwotICB9Ci0KLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RQcmFnbWFFeHByIG5vZGUsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgZGVwdGhGaXJzdFRyYXZlcnNhbChub2RlLCBkYXRhKTsKLQotICAgIHJldHVybiBkYXRhOwotICB9Ci0KLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RQcmFnbWFBcmd1bWVudCBub2RlLCBPYmplY3QgZGF0YSkKLSAgewotICAgIGRlcHRoRmlyc3RUcmF2ZXJzYWwobm9kZSwgZGF0YSk7Ci0KLSAgICByZXR1cm4gZGF0YTsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNURXhwb3J0RGVmaW5pdGlvbiBub2RlLCBPYmplY3QgZGF0YSkKLSAgewotICAgIGRlcHRoRmlyc3RUcmF2ZXJzYWwobm9kZSwgZGF0YSk7Ci0KLSAgICByZXR1cm4gZGF0YTsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNURXhwb3J0QmluZGluZ0xpc3Qgbm9kZSwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICBkZXB0aEZpcnN0VHJhdmVyc2FsKG5vZGUsIGRhdGEpOwotCi0gICAgcmV0dXJuIGRhdGE7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVEV4cG9ydEJpbmRpbmcgbm9kZSwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICBkZXB0aEZpcnN0VHJhdmVyc2FsKG5vZGUsIGRhdGEpOwotCi0gICAgcmV0dXJuIGRhdGE7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVFZhcmlhYmxlRGVmaW5pdGlvbiBub2RlLCBPYmplY3QgZGF0YSkKLSAgewotICAgIGRlcHRoRmlyc3RUcmF2ZXJzYWwobm9kZSwgZGF0YSk7Ci0KLSAgICByZXR1cm4gZGF0YTsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUVmFyaWFibGVEZWZpbml0aW9uTm9JTiBub2RlLCBPYmplY3QgZGF0YSkKLSAgewotICAgIGRlcHRoRmlyc3RUcmF2ZXJzYWwobm9kZSwgZGF0YSk7Ci0KLSAgICByZXR1cm4gZGF0YTsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUVmFyaWFibGVEZWZpbml0aW9uS2luZCBub2RlLCBPYmplY3QgZGF0YSkKLSAgewotICAgIGRlcHRoRmlyc3RUcmF2ZXJzYWwobm9kZSwgZGF0YSk7Ci0KLSAgICByZXR1cm4gZGF0YTsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUVmFyaWFibGVCaW5kaW5nTGlzdCBub2RlLCBPYmplY3QgZGF0YSkKLSAgewotICAgIGRlcHRoRmlyc3RUcmF2ZXJzYWwobm9kZSwgZGF0YSk7Ci0KLSAgICByZXR1cm4gZGF0YTsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUVmFyaWFibGVCaW5kaW5nTGlzdE5vSU4gbm9kZSwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICBkZXB0aEZpcnN0VHJhdmVyc2FsKG5vZGUsIGRhdGEpOwotCi0gICAgcmV0dXJuIGRhdGE7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVFZhcmlhYmxlQmluZGluZyBub2RlLCBPYmplY3QgZGF0YSkKLSAgewotICAgIGRlcHRoRmlyc3RUcmF2ZXJzYWwobm9kZSwgZGF0YSk7Ci0KLSAgICByZXR1cm4gZGF0YTsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUVmFyaWFibGVCaW5kaW5nTm9JTiBub2RlLCBPYmplY3QgZGF0YSkKLSAgewotICAgIGRlcHRoRmlyc3RUcmF2ZXJzYWwobm9kZSwgZGF0YSk7Ci0KLSAgICByZXR1cm4gZGF0YTsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUVmFyaWFibGVJbml0aWFsaXNhdGlvbiBub2RlLCBPYmplY3QgZGF0YSkKLSAgewotICAgIGRlcHRoRmlyc3RUcmF2ZXJzYWwobm9kZSwgZGF0YSk7Ci0KLSAgICByZXR1cm4gZGF0YTsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUVmFyaWFibGVJbml0aWFsaXNhdGlvbk5vSU4gbm9kZSwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICBkZXB0aEZpcnN0VHJhdmVyc2FsKG5vZGUsIGRhdGEpOwotCi0gICAgcmV0dXJuIGRhdGE7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVFZhcmlhYmxlSW5pdGlhbGl6ZXIgbm9kZSwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICBkZXB0aEZpcnN0VHJhdmVyc2FsKG5vZGUsIGRhdGEpOwotCi0gICAgcmV0dXJuIGRhdGE7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVFZhcmlhYmxlSW5pdGlhbGl6ZXJOb0lOIG5vZGUsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgZGVwdGhGaXJzdFRyYXZlcnNhbChub2RlLCBkYXRhKTsKLQotICAgIHJldHVybiBkYXRhOwotICB9Ci0KLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RUeXBlZElkZW50aWZpZXIgbm9kZSwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICBkZXB0aEZpcnN0VHJhdmVyc2FsKG5vZGUsIGRhdGEpOwotCi0gICAgcmV0dXJuIGRhdGE7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVFR5cGVkSWRlbnRpZmllck5vSU4gbm9kZSwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICBkZXB0aEZpcnN0VHJhdmVyc2FsKG5vZGUsIGRhdGEpOwotCi0gICAgcmV0dXJuIGRhdGE7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVFNpbXBsZVZhcmlhYmxlRGVmaW5pdGlvbiBub2RlLCBPYmplY3QgZGF0YSkKLSAgewotICAgIGRlcHRoRmlyc3RUcmF2ZXJzYWwobm9kZSwgZGF0YSk7Ci0KLSAgICByZXR1cm4gZGF0YTsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUVW50eXBlZFZhcmlhYmxlQmluZGluZ0xpc3Qgbm9kZSwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICBkZXB0aEZpcnN0VHJhdmVyc2FsKG5vZGUsIGRhdGEpOwotCi0gICAgcmV0dXJuIGRhdGE7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVFVudHlwZWRWYXJpYWJsZUJpbmRpbmcgbm9kZSwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICBkZXB0aEZpcnN0VHJhdmVyc2FsKG5vZGUsIGRhdGEpOwotCi0gICAgcmV0dXJuIGRhdGE7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVEZ1bmN0aW9uRGVmaW5pdGlvbiBub2RlLCBPYmplY3QgZGF0YSkKLSAgewotICAgIGRlcHRoRmlyc3RUcmF2ZXJzYWwobm9kZSwgZGF0YSk7Ci0KLSAgICByZXR1cm4gZGF0YTsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNURnVuY3Rpb25OYW1lIG5vZGUsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgZGVwdGhGaXJzdFRyYXZlcnNhbChub2RlLCBkYXRhKTsKLQotICAgIHJldHVybiBkYXRhOwotICB9Ci0KLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RGdW5jdGlvbkNvbW1vbiBub2RlLCBPYmplY3QgZGF0YSkKLSAgewotICAgIGRlcHRoRmlyc3RUcmF2ZXJzYWwobm9kZSwgZGF0YSk7Ci0KLSAgICByZXR1cm4gZGF0YTsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUUGFyYW1ldGVycyBub2RlLCBPYmplY3QgZGF0YSkKLSAgewotICAgIGRlcHRoRmlyc3RUcmF2ZXJzYWwobm9kZSwgZGF0YSk7Ci0KLSAgICByZXR1cm4gZGF0YTsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUUGFyYW1ldGVyIG5vZGUsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgZGVwdGhGaXJzdFRyYXZlcnNhbChub2RlLCBkYXRhKTsKLQotICAgIHJldHVybiBkYXRhOwotICB9Ci0KLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RQYXJhbWV0ZXJJbml0IG5vZGUsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgZGVwdGhGaXJzdFRyYXZlcnNhbChub2RlLCBkYXRhKTsKLQotICAgIHJldHVybiBkYXRhOwotICB9Ci0KLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RSZXN0UGFyYW1ldGVycyBub2RlLCBPYmplY3QgZGF0YSkKLSAgewotICAgIGRlcHRoRmlyc3RUcmF2ZXJzYWwobm9kZSwgZGF0YSk7Ci0KLSAgICByZXR1cm4gZGF0YTsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUUmVzdWx0IG5vZGUsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgZGVwdGhGaXJzdFRyYXZlcnNhbChub2RlLCBkYXRhKTsKLQotICAgIHJldHVybiBkYXRhOwotICB9Ci0KLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RDbGFzc0RlZmluaXRpb24gbm9kZSwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICBkZXB0aEZpcnN0VHJhdmVyc2FsKG5vZGUsIGRhdGEpOwotCi0gICAgcmV0dXJuIGRhdGE7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVEludGVyZmFjZURlZmluaXRpb24gbm9kZSwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICBkZXB0aEZpcnN0VHJhdmVyc2FsKG5vZGUsIGRhdGEpOwotCi0gICAgcmV0dXJuIGRhdGE7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVEluaGVyaXRhbmNlIG5vZGUsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgZGVwdGhGaXJzdFRyYXZlcnNhbChub2RlLCBkYXRhKTsKLQotICAgIHJldHVybiBkYXRhOwotICB9Ci0KLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1ROYW1lc3BhY2VEZWZpbml0aW9uIG5vZGUsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgZGVwdGhGaXJzdFRyYXZlcnNhbChub2RlLCBkYXRhKTsKLQotICAgIHJldHVybiBkYXRhOwotICB9Ci0KLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RQYWNrYWdlRGVmaW5pdGlvbiBub2RlLCBPYmplY3QgZGF0YSkKLSAgewotICAgIGRlcHRoRmlyc3RUcmF2ZXJzYWwobm9kZSwgZGF0YSk7Ci0KLSAgICByZXR1cm4gZGF0YTsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUUGFja2FnZU5hbWUgbm9kZSwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICBkZXB0aEZpcnN0VHJhdmVyc2FsKG5vZGUsIGRhdGEpOwotCi0gICAgcmV0dXJuIGRhdGE7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVFBhY2thZ2VJZGVudGlmaWVycyBub2RlLCBPYmplY3QgZGF0YSkKLSAgewotICAgIGRlcHRoRmlyc3RUcmF2ZXJzYWwobm9kZSwgZGF0YSk7Ci0KLSAgICByZXR1cm4gZGF0YTsKLSAgfQotfQotCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHRjb21waWxlci9KYXZhc2NyaXB0Q29tcGlsZXIuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdGNvbXBpbGVyL0phdmFzY3JpcHRDb21waWxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YTE0NmI2Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdGNvbXBpbGVyL0phdmFzY3JpcHRDb21waWxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LmphdmFzY3JpcHRjb21waWxlcjsKLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRPdXRwdXRTdHJlYW07Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuamF2YXNjcmlwdDIwcGFyc2VyLkpTUGFyc2VyMjA7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LmphdmFzY3JpcHQyMHBhcnNlci5QYXJzZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuamF2YXNjcmlwdDIwcGFyc2VyLlRva2VuOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC51aXh0b29scy5GaWxlUHJvY2Vzc29yOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5QcmludFN0cmVhbTsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotCi1wdWJsaWMgY2xhc3MgSmF2YXNjcmlwdENvbXBpbGVyIGV4dGVuZHMgRmlsZVByb2Nlc3NvcgotewotICBwcml2YXRlIEpTUGFyc2VyMjAgICAgICAgIF9qc1BhcnNlcjsKLSAgcHVibGljICBIYXNoTWFwPFN0cmluZywgU3RyaW5nPiAgICAgICAgIGZpbGVUYWJsZTsKLQotICBwdWJsaWMgSmF2YXNjcmlwdENvbXBpbGVyKCkKLSAgewotICAgIHN1cGVyKCJqcyIsIGZhbHNlKTsKLSAgICBmaWxlVGFibGUgPSBuZXcgSGFzaE1hcDxTdHJpbmcsU3RyaW5nPigpOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIGluaXQoSW5wdXRTdHJlYW0gaW4pCi0gIHsKLSAgICAvLyBhcHBseSBvdmVycmlkZXMKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NGaWxlKEZpbGUgaW4sIEZpbGUgb3V0KQotICAgIHRocm93cyBFeGNlcHRpb24KLSAgewotICAgIFN0cmluZyBjbGFzc05hbWUsIG5ld0NsYXNzTmFtZTsKLSAgICBGaWxlSW5wdXRTdHJlYW0gaW5TdHJlYW0gPSBuZXcgRmlsZUlucHV0U3RyZWFtKGluKTsKLSAgICAvLwotICAgIC8vICBHZXQgdGhlIG5hbWUgb2YgdGhlIGZpbGUKLSAgICAvLwotICAgIGNsYXNzTmFtZSA9IGluLmdldE5hbWUoKTsKLSAgICBjbGFzc05hbWUgPSBjbGFzc05hbWUuc3Vic3RyaW5nKDAsIGNsYXNzTmFtZS5pbmRleE9mKCcuJykpOwotICAgIC8vCi0gICAgLy8gIENoZWNrIHRvIHNlZSBpZiB0aGUgbmFtZSBleGlzdHMgYXMgd2UgZG8gbm90IHdhbnQgdG8gb3ZlciB3cml0ZSB0aGUgZm91cgotICAgIC8vICBzcGVjaWFsIG5hbWVzIHdlIGFyZSB1c2luZy4KLSAgICAvLwotICAgIG5ld0NsYXNzTmFtZSA9IGZpbGVUYWJsZS5nZXQoY2xhc3NOYW1lKTsKLSAgICBpZiAoIG5ld0NsYXNzTmFtZSA9PSBudWxsKSAKLSAgICB7Ci0vLyAgICAgICBuZXdDbGFzc05hbWUgPSAiQWRmIiArIGNsYXNzTmFtZTsKLS8vICAgICAgZmlsZVRhYmxlLnB1dChjbGFzc05hbWUsIG5ld0NsYXNzTmFtZSk7Ci0gICAgICBuZXdDbGFzc05hbWUgPSBjbGFzc05hbWU7Ci0gICAgfQotICAgIG91dCA9IG5ldyBGaWxlKG91dC5nZXRQYXJlbnRGaWxlKCksIG5ld0NsYXNzTmFtZSArICIuanMiKTsKLSAgICBQcmludFN0cmVhbSBvdXRTdHJlYW0gPSBuZXcgUHJpbnRTdHJlYW0obmV3IEJ1ZmZlcmVkT3V0cHV0U3RyZWFtKG5ldyBGaWxlT3V0cHV0U3RyZWFtKG91dCkpKTsKLSAgICBwcm9jZXNzKGluU3RyZWFtLCBvdXRTdHJlYW0pOwotICAgIGluU3RyZWFtLmNsb3NlKCk7Ci0gICAgb3V0U3RyZWFtLmZsdXNoKCk7Ci0gICAgb3V0U3RyZWFtLmNsb3NlKCk7Ci0gIH0KLSAgcHJpdmF0ZSB2b2lkIGluaXRQYXJzZXIoSW5wdXRTdHJlYW0gaW4pCi0gIHsKLQotICAgIGlmIChfanNQYXJzZXIgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBfanNQYXJzZXIgPSBuZXcgSlNQYXJzZXIyMChpbik7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBfanNQYXJzZXIuUmVJbml0KG5ldyBJbnB1dFN0cmVhbVJlYWRlcihpbikpOwotICAgIH0KLSAgfQotICBwdWJsaWMgdm9pZCBwcm9jZXNzKElucHV0U3RyZWFtIGluLCBQcmludFN0cmVhbSBvKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24KLSAgewotICAgIFRva2VuIHRva2VuID0gbnVsbDsKLSAgICBEZXB0aEZpcnN0VHJhdmVyc2FsIHZzdHI7Ci0gICAgaW5pdChpbik7Ci0gICAgdG9rZW4gPSB0b2tlbml6ZShpbik7Ci0gICAgLy8KLSAgICAvLyAgIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiBEZXB0aEZpcnN0VHJhdmVyc2FsCi0gICAgLy8KLSAgICB2c3RyID0gbmV3IERlcHRoRmlyc3RUcmF2ZXJzYWwobywgZmlsZVRhYmxlKTsgCi0gICAgX2pzUGFyc2VyLmdldFJvb3ROb2RlKCkuamp0QWNjZXB0KHZzdHIsIG51bGwpOwotICB9Ci0gIHByaXZhdGUgVG9rZW4gdG9rZW5pemUoSW5wdXRTdHJlYW0gaW4pIHRocm93cyBQYXJzZUV4Y2VwdGlvbgotICB7Ci0gICAgaW5pdFBhcnNlcihpbik7Ci0gICAgcmV0dXJuIChUb2tlbikgX2pzUGFyc2VyLlByb2dyYW0oKTsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHRjb21waWxlci9KYXZhc2NyaXB0Q29tcGlsZXJNYWluLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHRjb21waWxlci9KYXZhc2NyaXB0Q29tcGlsZXJNYWluLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0NWMwY2QuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0Y29tcGlsZXIvSmF2YXNjcmlwdENvbXBpbGVyTWFpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LmphdmFzY3JpcHRjb21waWxlcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5qYXZhc2NyaXB0Y29tcGlsZXIuSmF2YXNjcmlwdENvbXBpbGVyOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT2JqZWN0SW5wdXRTdHJlYW07Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLQotCi1wdWJsaWMgY2xhc3MgSmF2YXNjcmlwdENvbXBpbGVyTWFpbgotewotICBwcml2YXRlIEphdmFzY3JpcHRDb21waWxlciBfamF2YXNjcmlwdENvbXBpbGVyOwotCi0gIHB1YmxpYyBKYXZhc2NyaXB0Q29tcGlsZXJNYWluKCkKLSAgewotICB9Ci0KLSAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykKLSAgewotICAgIEphdmFzY3JpcHRDb21waWxlck1haW4gX21haW4gPSBuZXcgSmF2YXNjcmlwdENvbXBpbGVyTWFpbigpOwotICAgIF9tYWluLl9qYXZhc2NyaXB0Q29tcGlsZXIgPSBuZXcgSmF2YXNjcmlwdENvbXBpbGVyKCk7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgRmlsZUlucHV0U3RyZWFtIGZpcyA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oIkQ6XFxGb29cXGRhdGExLnR4dCIpOwotICAgICAgT2JqZWN0SW5wdXRTdHJlYW0gb2lzID0gbmV3IE9iamVjdElucHV0U3RyZWFtKGZpcyk7Ci0gICAgICBfbWFpbi5famF2YXNjcmlwdENvbXBpbGVyLmZpbGVUYWJsZSA9ICAoSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4pb2lzLnJlYWRPYmplY3QoKTsgLy8gUmVhZCB0aGUgb2JqZWN0IGJhY2sgaW4gaGVyZQotICAgICAgLy8KLSAgICAgIC8vIAotICAgICAgX21haW4uX2phdmFzY3JpcHRDb21waWxlci5maWxlVGFibGUucHV0KCJSaWNoT2JqZWN0IiwgIkFkZk9iamVjdCIpOwotICAgICAgX21haW4uX2phdmFzY3JpcHRDb21waWxlci5maWxlVGFibGUucHV0KCJSaWNoUGFnZSIsICJBZGZQYWdlIik7Ci0gICAgICBfbWFpbi5famF2YXNjcmlwdENvbXBpbGVyLmZpbGVUYWJsZS5wdXQoIlJpY2hDb252ZXJ0ZXIiLCAiQWRmQ29udmVydGVyIik7Ci0gICAgICBfbWFpbi5famF2YXNjcmlwdENvbXBpbGVyLmZpbGVUYWJsZS5wdXQoIlJpY2hWYWxpZGF0b3IiLCAiQWRmVmFsaWRhdG9yIik7Ci0gICAgICBfbWFpbi5famF2YXNjcmlwdENvbXBpbGVyLmZpbGVUYWJsZS5wdXQoIkJvb3RzdHJhcCIsICJBZGZCb290c3RyYXAiKTsKLSAgICAgIF9tYWluLl9qYXZhc2NyaXB0Q29tcGlsZXIuZmlsZVRhYmxlLnB1dCgiQm9vdHN0cmFwRmFjZXMiLCAiQWRmQm9vdHN0cmFwRmFjZXMiKTsKLSAgICAgIF9tYWluLl9qYXZhc2NyaXB0Q29tcGlsZXIuZmlsZVRhYmxlLnB1dCgiWE1MUmVxdWVzdCIsICJBZGZYTUxSZXF1ZXN0Iik7Ci0gICAgICBfbWFpbi5famF2YXNjcmlwdENvbXBpbGVyLmZpbGVUYWJsZS5wdXQoIk1hcnNoYWxpbmdTZXJ2aWNlIiwgIkFkZk1hcnNoYWxpbmdTZXJ2aWNlIik7Ci0gICAgICBfbWFpbi5famF2YXNjcmlwdENvbXBpbGVyLmZpbGVUYWJsZS5wdXQoIk1lc3NhZ2luZ1NlcnZpY2UiLCAiQWRmTWVzc2FnaW5nU2VydmljZSIpOwotICAgICAgb2lzLmNsb3NlKCk7Ci0gICAgICBmaXMuY2xvc2UoKTsKLSAgICB9Ci0gICAgY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIC8vIFRPRE8KLSAgICB9Ci0gICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgLy8gVE9ETwotICAgIH0KLSAgICBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSAKLSAgICB7Ci0gICAgICAvLyBUT0RPCi0gICAgfQotICAgIEZpbGUgaW4gPSAKLSAgICAgIG5ldyBGaWxlKCJEOlxcamRldnJ0XFxhZGYtZmFjZXNcXHRydW5rXFxhZGYtcmljaGNsaWVudC1kZW1vXFxzcmNcXG1haW5cXHdlYmFwcFxcanNMaWJzIik7Ci0gICAgRmlsZSBvdXQgPSBuZXcgRmlsZSgiRDpcXEZvb1xcRGVtb1xcanNMaWJzIik7Ci0gICAgX21haW4uX2phdmFzY3JpcHRDb21waWxlci5wcm9jZXNzKGluLCBvdXQpOwotICAgIGluID0gCi0gICAgICBuZXcgRmlsZSgiRDpcXGpkZXZydFxcYWRmLWZhY2VzXFx0cnVua1xcYWRmLXJpY2hjbGllbnQtZGVtby1jcm1cXHNyY1xcbWFpblxcd2ViYXBwXFxqc0xpYnMiKTsKLSAgICBvdXQgPSBuZXcgRmlsZSgiRDpcXEZvb1xcY3JtXFxqc0xpYnMiKTsKLSAgICBfbWFpbi5famF2YXNjcmlwdENvbXBpbGVyLnByb2Nlc3MoaW4sIG91dCk7Ci0KLSAgICAvLwotICAgIC8vICBUcmFuc2Zvcm0gdGhlIEFwaSBKYXZhU2NyaXB0IGZpbGVzCi0gICAgLy8KLS8vICAgIEZpbGUgaW4gPSAKLS8vICAgICAgbmV3IEZpbGUoIkQ6XFxqZGV2cnRcXGFkZi1mYWNlc1xcdHJ1bmtcXGFkZi1yaWNoY2xpZW50LWFwaVxcc3JjXFxtYWluXFxqYXZhc2NyaXB0XFxvcmFjbGVcXGFkZlxcdmlldyIpOwotLy8gICAgRmlsZSBvdXQgPSBuZXcgRmlsZSgiRDpcXEZvb1xcYXBpIik7Ci0vLyAgICBfbWFpbi5famF2YXNjcmlwdENvbXBpbGVyLnByb2Nlc3MoaW4sIG91dCk7Ci0gICAgLy8KLSAgICAvLyAgVHJhbnNmb3JtIHRoZSBJbXBsIEphdmFTY3JpcHQgZmlsZXMKLSAgICAvLwotLy8gICAgaW4gPSAKLS8vICAgICAgIG5ldyBGaWxlKCJEOlxcamRldnJ0XFxhZGYtZmFjZXNcXHRydW5rXFxhZGYtcmljaGNsaWVudC1pbXBsXFxzcmNcXG1haW5cXGphdmFzY3JpcHRcXG9yYWNsZVxcYWRmaW50ZXJuYWxcXHZpZXdcXCIpOwotLy8gICAgb3V0ID0gbmV3IEZpbGUoIkQ6XFxGb29cXGltcGwiKTsKLS8vICAgIF9tYWluLl9qYXZhc2NyaXB0Q29tcGlsZXIucHJvY2Vzcyhpbiwgb3V0KTsKLSAgICAvLwotICAgIC8vICBVb2RhdGUgdGhlIHNlcmlhbGl6ZWQgdmVyc2lvbiBvZiB0aGUgSGFzaE1hcAotICAgIC8vCi0gICAgRmlsZU91dHB1dFN0cmVhbSBmb3M7Ci0gICAgT2JqZWN0T3V0cHV0U3RyZWFtIG9vczsKLSAgICB0cnkKLSAgICB7Ci0KLSAgICAgIGZvcyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKCJEOlxcRm9vXFxkYXRhMS50eHQiKTsKLSAgICAgIG9vcyA9IG5ldyBPYmplY3RPdXRwdXRTdHJlYW0oZm9zKTsKLSAgICAgIG9vcy53cml0ZU9iamVjdChfbWFpbi5famF2YXNjcmlwdENvbXBpbGVyLmZpbGVUYWJsZSk7Ci0gICAgICBvb3MuZmx1c2goKTsKLSAgICAgIG9vcy5jbG9zZSgpOwotICAgIH0KLSAgICBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgLy8gVE9ETwotICAgIH0KLSAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICAvLyBUT0RPCi0gICAgfQotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qbXQvQWJzdHJhY3RDb21wcmVzc01vam8uamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvam10L0Fic3RyYWN0Q29tcHJlc3NNb2pvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkMTllODcuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qbXQvQWJzdHJhY3RDb21wcmVzc01vam8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzNiArMCwwIEBACi0vKg0KLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICogDQotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqIA0KLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqICB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5qbXQ7DQotDQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7DQotaW1wb3J0IGphdmEuaW8uRmlsZTsNCi1pbXBvcnQgamF2YS5pby5GaWxlUmVhZGVyOw0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOw0KLWltcG9ydCBqYXZhLnRleHQuTnVtYmVyRm9ybWF0Ow0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7DQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmcuU3RyaW5nVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4uYXJ0aWZhY3QuQXJ0aWZhY3Q7DQotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4uYXJ0aWZhY3QuZmFjdG9yeS5BcnRpZmFjdEZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4uYXJ0aWZhY3QubWV0YWRhdGEuQXJ0aWZhY3RNZXRhZGF0YVNvdXJjZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5hcnRpZmFjdC5yZXBvc2l0b3J5LkFydGlmYWN0UmVwb3NpdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5hcnRpZmFjdC5yZXNvbHZlci5BcnRpZmFjdFJlc29sdXRpb25SZXN1bHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4uYXJ0aWZhY3QucmVzb2x2ZXIuQXJ0aWZhY3RSZXNvbHZlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5hcnRpZmFjdC52ZXJzaW9uaW5nLlZlcnNpb25SYW5nZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uQWJzdHJhY3RNb2pvOw0KLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5Nb2pvRXhlY3V0aW9uRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnByb2plY3QuTWF2ZW5Qcm9qZWN0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuam10LmNvbXByZXNzLkNvbXByZXNzaW9uRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuam10LmNvbXByZXNzLklzb2xhdGVkQ2xhc3NMb2FkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5qbXQuY29tcHJlc3MuSlNDb21wcmVzc29yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuam10LmNvbXByZXNzLkpTQ29tcHJlc3NvclByb3h5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuam10LmNvbXByZXNzLkpTTWluQ29tcHJlc3NvcjsNCi1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy51dGlsLkRpcmVjdG9yeVNjYW5uZXI7DQotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMudXRpbC5GaWxlVXRpbHM7DQotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMudXRpbC5JT1V0aWw7DQotDQotLyoqDQotICogQWJzdGFjdCBtb2pvIGZvciBjb21wcmVzc2luZyBKYXZhU2NyaXB0cy4NCi0gKiANCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpuaWNvbGFzQGFwYWNoZS5vcmciPm5pY29sYXMgRGUgTG9vZjwvYT4NCi0gKi8NCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RDb21wcmVzc01vam8NCi0gICAgZXh0ZW5kcyBBYnN0cmFjdE1vam8NCi17DQotDQotICAgIC8qKg0KLSAgICAgKiBSZXNvbHZlcyB0aGUgYXJ0aWZhY3RzIGFuZCBkZXBlbmRlbmNpZXMuDQotICAgICAqIA0KLSAgICAgKiBAY29tcG9uZW50DQotICAgICAqLw0KLSAgICBwcml2YXRlIEFydGlmYWN0UmVzb2x2ZXIgYXJ0aWZhY3RSZXNvbHZlcjsNCi0NCi0gICAgLyoqDQotICAgICAqIENyZWF0ZSBBcnRpZmFjdCByZWZlcmVuY2VzDQotICAgICAqIA0KLSAgICAgKiBAY29tcG9uZW50DQotICAgICAqLw0KLSAgICBwcml2YXRlIEFydGlmYWN0RmFjdG9yeSBhcnRpZmFjdEZhY3Rvcnk7DQotDQotICAgIC8qKg0KLSAgICAgKiBUaGUgbG9jYWwgcmVwb3NpdG9yeQ0KLSAgICAgKiANCi0gICAgICogQHBhcmFtZXRlciBleHByZXNzaW9uPSIke2xvY2FsUmVwb3NpdG9yeX0iDQotICAgICAqIEByZXF1aXJlZA0KLSAgICAgKi8NCi0gICAgcHJpdmF0ZSBBcnRpZmFjdFJlcG9zaXRvcnkgbG9jYWxSZXBvc2l0b3J5Ow0KLQ0KLSAgICAvKioNCi0gICAgICogRm9yIHJldHJpZXZhbCBvZiBhcnRpZmFjdCdzIG1ldGFkYXRhLg0KLSAgICAgKiANCi0gICAgICogQGNvbXBvbmVudA0KLSAgICAgKi8NCi0gICAgcHJpdmF0ZSBBcnRpZmFjdE1ldGFkYXRhU291cmNlIG1ldGFkYXRhU291cmNlOw0KLQ0KLSAgICAvKioNCi0gICAgICogVGhlIHJlbW90ZSByZXBvc2l0b3JpZXMgZGVjbGFyZWQgaW4gdGhlIHBvbS4NCi0gICAgICogDQotICAgICAqIEBwYXJhbWV0ZXIgZXhwcmVzc2lvbj0iJHtwcm9qZWN0LnBsdWdpbkFydGlmYWN0UmVwb3NpdG9yaWVzfSINCi0gICAgICovDQotICAgIHByaXZhdGUgTGlzdCByZW1vdGVSZXBvc2l0b3JpZXM7DQotDQotICAgIC8qKg0KLSAgICAgKg0KLSAgICAgKi8NCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTnVtYmVyRm9ybWF0IElOVEVHRVIgPSBOdW1iZXJGb3JtYXQuZ2V0SW50ZWdlckluc3RhbmNlKCk7DQotDQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBIUiA9IFN0cmluZ1V0aWxzLnJpZ2h0UGFkKCAiIiwgNzgsICItIiApOw0KLQ0KLSAgICAvKioNCi0gICAgICogVGhlIG1hdmVuIHByb2plY3Qgd2UgYXJlIHdvcmtpbmcgb24uDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW1ldGVyIGRlZmF1bHQtdmFsdWU9IiR7cHJvamVjdH0iDQotICAgICAqIEByZXF1aXJlZA0KLSAgICAgKiBAcmVhZG9ubHkNCi0gICAgICovDQotICAgIE1hdmVuUHJvamVjdCBwcm9qZWN0Ow0KLQ0KLSAgICAvKioNCi0gICAgICogVGhlIGF2YWlsYWJsZSBjb21wcmVzc29ycw0KLSAgICAgKi8NCi0gICAgcHJpdmF0ZSBNYXAgY29tcHJlc3NvcnMgPSBuZXcgSGFzaE1hcCgpOw0KLSAgICB7DQotICAgICAgICBjb21wcmVzc29ycy5wdXQoICJqc21pbiIsIG5ldyBKU01pbkNvbXByZXNzb3IoKSApOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBPcHRpbWl6YXRpb24gbGV2ZWwsIGZyb20gMCB0byA5DQotICAgICAqIA0KLSAgICAgKiBAcGFyYW1ldGVyIGRlZmF1bHQtdmFsdWU9IjkiDQotICAgICAqLw0KLSAgICBwcml2YXRlIGludCBvcHRpbWl6YXRpb25MZXZlbDsNCi0NCi0gICAgLyoqDQotICAgICAqIEpTIExhbmd1YWdlIHZlcnNpb24gKDEzMCBmb3IgSlMgMS4zKQ0KLSAgICAgKiANCi0gICAgICogQHBhcmFtZXRlciBkZWZhdWx0LXZhbHVlPSIxMzAiDQotICAgICAqLw0KLSAgICBwcml2YXRlIGludCBsYW5ndWFnZVZlcnNpb247DQotDQotICAgIC8qKg0KLSAgICAgKiBUaGUgY29tcHJlc3NvciB0byB1c2VkLiBFaXRoZXIgInNocmlua3NhZmUiLCAieWFob291aSIgb3IgImpzbWluIiBmb3IgZGVmYXVsdCBjb21wcmVzc29yLCANCi0gICAgICogb3IgYSBjdXN0b20gb25lIHByb3ZpZGVkIGFzIGFuIGFydGlmYWN0IGluIHJlcG8gb3JnLmNvZGVoYXVzLm1vam8uamF2YXNjcmlwdDo8eHh4Pi1jb21wcmVzc29yLg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtZXRlciBkZWZhdWx0LXZhbHVlPSJqc21pbiINCi0gICAgICovDQotICAgIHByaXZhdGUgU3RyaW5nIGNvbXByZXNzb3I7DQotDQotICAgIC8qKg0KLSAgICAgKiBEb24ndCBkaXNwbGF5IGNvbXByZXNzaW9uIHN0YXRzDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW1ldGVyDQotICAgICAqLw0KLSAgICBwcml2YXRlIGJvb2xlYW4gc2tpcFN0YXRzOw0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBERUZBVUxUX0lOQ0xVREVTID0gbmV3IFN0cmluZ1tdIHsgIioqLyouanMiIH07DQotDQotICAgIC8qKg0KLSAgICAgKiBJbmNsdXNpb24gcGF0dGVybnMNCi0gICAgICogDQotICAgICAqIEBwYXJhbWV0ZXINCi0gICAgICovDQotICAgIHByaXZhdGUgU3RyaW5nW10gaW5jbHVkZXM7DQotDQotICAgIC8qKg0KLSAgICAgKiBFeGNsdXNpb24gcGF0dGVybnMNCi0gICAgICogDQotICAgICAqIEBwYXJhbWV0ZXINCi0gICAgICovDQotICAgIHByaXZhdGUgU3RyaW5nW10gZXhjbHVkZXM7DQotDQotICAgIC8qKg0KLSAgICAgKiBBIHNwZWNpYWwgdG9rZW4gdG8gcmVjb2duaXplIGxpbmVzIHRvIGJlIHJlbW92ZWQgZnJvbSBzY3JpcHRzIChkZWJ1Z2dpbmcNCi0gICAgICogY29kZSkuDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW1ldGVyDQotICAgICAqLw0KLSAgICBwcml2YXRlIFN0cmluZyBzdHJpcDsNCi0NCi0gICAgLyoqDQotICAgICAqIHtAaW5oZXJpdERvY30NCi0gICAgICogDQotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uQWJzdHJhY3RNb2pvI2V4ZWN1dGUoKQ0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpDQotICAgICAgICB0aHJvd3MgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBEaXJlY3RvcnlTY2FubmVyIHNjYW5uZXIgPSBuZXcgRGlyZWN0b3J5U2Nhbm5lcigpOw0KLSAgICAgICAgc2Nhbm5lci5zZXRCYXNlZGlyKCBnZXRTb3VyY2VEaXJlY3RvcnkoKSApOw0KLSAgICAgICAgaWYgKCBpbmNsdWRlcyA9PSBudWxsICkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpbmNsdWRlcyA9IERFRkFVTFRfSU5DTFVERVM7DQotICAgICAgICB9DQotICAgICAgICBzY2FubmVyLnNldEluY2x1ZGVzKCBpbmNsdWRlcyApOw0KLSAgICAgICAgc2Nhbm5lci5hZGREZWZhdWx0RXhjbHVkZXMoKTsNCi0gICAgICAgIGlmICggZXhjbHVkZXMgIT0gbnVsbCApDQotICAgICAgICB7DQotICAgICAgICAgICAgc2Nhbm5lci5zZXRFeGNsdWRlcyggZXhjbHVkZXMgKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHNjYW5uZXIuc2NhbigpOw0KLSAgICAgICAgU3RyaW5nW10gZmlsZXMgPSBzY2FubmVyLmdldEluY2x1ZGVkRmlsZXMoKTsNCi0NCi0gICAgICAgIC8vIGlmICggIUNvbnRleHQuaXNWYWxpZE9wdGltaXphdGlvbkxldmVsKCBvcHRpbWl6YXRpb25MZXZlbCApICkNCi0gICAgICAgIC8vIHsNCi0gICAgICAgIC8vIHRocm93IG5ldyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uKCAib3B0aW1pemF0aW9uTGV2ZWwgaXMgaW52YWxpZCIgKTsNCi0gICAgICAgIC8vIH0NCi0gICAgICAgIC8vIGlmICggIUNvbnRleHQuaXNWYWxpZExhbmd1YWdlVmVyc2lvbiggbGFuZ3VhZ2VWZXJzaW9uICkgKQ0KLSAgICAgICAgLy8gew0KLSAgICAgICAgLy8gdGhyb3cgbmV3IE1vam9FeGVjdXRpb25FeGNlcHRpb24oICJsYW5ndWFnZVZlcnNpb24gaXMgaW52YWxpZCIgKTsNCi0gICAgICAgIC8vIH0NCi0NCi0gICAgICAgIEpTQ29tcHJlc3NvciBqc2NvbXByZXNzb3IgPSBnZXRDb21wcmVzc29yKCk7DQotDQotICAgICAgICBsb2dTdGF0cyggSFIgKTsNCi0gICAgICAgIGdldE91dHB1dERpcmVjdG9yeSgpLm1rZGlycygpOw0KLSAgICAgICAgbG9uZyBzYXZlZCA9IDA7DQotICAgICAgICBmb3IgKCBpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKyApDQotICAgICAgICB7DQotICAgICAgICAgICAgU3RyaW5nIGZpbGUgPSBmaWxlc1tpXTsNCi0gICAgICAgICAgICBzYXZlZCA9IGNvbXByZXNzKCBqc2NvbXByZXNzb3IsIGZpbGUgKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGxvZ1N0YXRzKCBIUiApOw0KLSAgICAgICAgbG9nU3RhdHMoICJjb21wcmVzc2lvbiBzYXZlZCAiICsgSU5URUdFUi5mb3JtYXQoIHNhdmVkICkgKyAiIGJ5dGVzIiApOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgRmlsZSBzdHJpcERlYnVncyggRmlsZSBmaWxlICkNCi0gICAgICAgIHRocm93cyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIGlmICggc3RyaXAgPT0gbnVsbCApDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGZpbGU7DQotICAgICAgICB9DQotICAgICAgICB0cnkNCi0gICAgICAgIHsNCi0NCi0gICAgICAgICAgICBGaWxlIHN0cmlwcGVkID0gRmlsZS5jcmVhdGVUZW1wRmlsZSggInN0cmlwcGVkIiwgIi5qcyIgKTsNCi0NCi0gICAgICAgICAgICBCdWZmZXJlZFJlYWRlciByZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIoIG5ldyBGaWxlUmVhZGVyKCBmaWxlICkgKTsNCi0gICAgICAgICAgICBQcmludFdyaXRlciB3cml0ZXIgPSBuZXcgUHJpbnRXcml0ZXIoIHN0cmlwcGVkICk7DQotICAgICAgICAgICAgU3RyaW5nIGxpbmU7DQotICAgICAgICAgICAgd2hpbGUgKCAoIGxpbmUgPSByZWFkZXIucmVhZExpbmUoKSApICE9IG51bGwgKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgaWYgKCAhbGluZS50cmltKCkuc3RhcnRzV2l0aCggc3RyaXAgKSApDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCBsaW5lICk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgSU9VdGlsLmNsb3NlKCByZWFkZXIgKTsNCi0gICAgICAgICAgICBJT1V0aWwuY2xvc2UoIHdyaXRlciApOw0KLQ0KLSAgICAgICAgICAgIEZpbGVVdGlscy5jb3B5RmlsZSggc3RyaXBwZWQsIGZpbGUgKTsNCi0gICAgICAgICAgICBzdHJpcHBlZC5kZWxldGUoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoICggSU9FeGNlcHRpb24gZSApDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhyb3cgbmV3IE1vam9FeGVjdXRpb25FeGNlcHRpb24oICJGYWlsZWQgdG8gc3RyaXAgZGVidWcgY29kZSBpbiAiICsgZmlsZSwgZSApOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIGZpbGU7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBKU0NvbXByZXNzb3IgZ2V0Q29tcHJlc3NvcigpDQotICAgICAgICB0aHJvd3MgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBpZiAoIGNvbXByZXNzb3JzLmNvbnRhaW5zS2V5KCBjb21wcmVzc29yICkgKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiAoSlNDb21wcmVzc29yKSBjb21wcmVzc29ycy5nZXQoIGNvbXByZXNzb3IgKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8vIEluc3BpcmVkIGJ5IHRoZSBzdXJlZmlyZSBwbHVnaW4NCi0gICAgICAgIC8vIGFsbG93cyB0byB1c2UgbXVsdGlwbGUgY29tcHJlc3NvciB0aGF0IHJlbHkgb24gbW9kaWZpZXIgUmhpbm8gZW5naW5lcw0KLSAgICAgICAgLy8gd2l0aG91dCBkZXBlbmRlbmNpZXMvY2xhc3NwYXRoIGNvbmZsaWN0cw0KLQ0KLSAgICAgICAgLy9TdHJpbmcgaWQgPSBjb21wcmVzc29yLnRvTG93ZXJDYXNlKCkgKyAiLWNvbXByZXNzb3IiOw0KLSAgICAgICAgLyoNCi0gICAgICAgIFN0cmluZyBpZCA9ICJteWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luIjsNCi0NCi0gICAgICAgIC8vIFRPRE8gZG9uJ3QgaGF2ZSB2ZXJzaW9uIGhhcmRjb2RlZA0KLSAgICAgICAgQXJ0aWZhY3QgY29tcHJlc3NvckFydGlmYWN0ID0NCi0gICAgICAgICAgICBhcnRpZmFjdEZhY3RvcnkuY3JlYXRlRGVwZW5kZW5jeUFydGlmYWN0KCAib3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMiLCBpZCwNCi0gICAgICAgICAgICAgICAgVmVyc2lvblJhbmdlLmNyZWF0ZUZyb21WZXJzaW9uKCAiMS4wLjEtU05BUFNIT1QiICksICJqYXIiLCBudWxsLA0KLSAgICAgICAgICAgICAgICBBcnRpZmFjdC5TQ09QRV9SVU5USU1FICk7DQotDQotICAgICAgICBBcnRpZmFjdCBvcmlnaW5hdGluZ0FydGlmYWN0ID0NCi0gICAgICAgICAgICBhcnRpZmFjdEZhY3RvcnkuY3JlYXRlQnVpbGRBcnRpZmFjdCggImR1bW15IiwgImR1bW15IiwgIjEuMCIsICJqYXIiICk7DQotDQotICAgICAgICBBcnRpZmFjdFJlc29sdXRpb25SZXN1bHQgZGVwZW5kZW5jaWVzOw0KLSAgICAgICAgdHJ5DQotICAgICAgICB7DQotICAgICAgICAgICAgZGVwZW5kZW5jaWVzID0NCi0gICAgICAgICAgICAgICAgYXJ0aWZhY3RSZXNvbHZlci5yZXNvbHZlVHJhbnNpdGl2ZWx5KCBDb2xsZWN0aW9ucy5zaW5nbGV0b24oIGNvbXByZXNzb3JBcnRpZmFjdCApLA0KLSAgICAgICAgICAgICAgICAgICAgb3JpZ2luYXRpbmdBcnRpZmFjdCwgbG9jYWxSZXBvc2l0b3J5LCByZW1vdGVSZXBvc2l0b3JpZXMsIG1ldGFkYXRhU291cmNlLCBudWxsICk7DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoIEV4Y2VwdGlvbiBlICkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBnZXRMb2coKS5pbmZvKCAiRmFpbGVkIHRvIGxvYWQgY29tcHJlc3NvciBhcnRpZmFjdCAiICsgY29tcHJlc3NvckFydGlmYWN0LnRvU3RyaW5nKCkgKTsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbiggIkZhaWxlZCB0byBsb2FkIGNvbXByZXNzb3IgYXJ0aWZhY3QiDQotICAgICAgICAgICAgICAgICsgY29tcHJlc3NvckFydGlmYWN0LnRvU3RyaW5nKCksIGUgKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIElzb2xhdGVkQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIgPSBuZXcgSXNvbGF0ZWRDbGFzc0xvYWRlciggZGVwZW5kZW5jaWVzLmdldEFydGlmYWN0cygpICk7DQotICAgICAgICAqLw0KLSAgICAgICAgY29tcHJlc3NvciA9IFN0cmluZ1V0aWxzLmNhcGl0YWxpemUoIGNvbXByZXNzb3IgKTsNCi0gICAgICAgIFN0cmluZyBjb21wcmVzc29yQ2xhc3NOYW1lID0NCi0gICAgICAgICAgICAib3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LmptdC5jb21wcmVzcy4iICsgY29tcHJlc3NvciArICJDb21wcmVzc29yIjsNCi0gICAgICAgIENsYXNzIGNvbXByZXNzb3JDbGFzczsNCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGNvbXByZXNzb3JDbGFzcyA9IGdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKS5sb2FkQ2xhc3MoIGNvbXByZXNzb3JDbGFzc05hbWUgKTsNCi0gICAgICAgICAgICAvL2NvbXByZXNzb3JDbGFzcyA9IGNsYXNzTG9hZGVyLmxvYWRDbGFzcyggY29tcHJlc3NvckNsYXNzTmFtZSApOw0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUgKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGdldExvZygpLmluZm8oICJGYWlsZWQgdG8gbG9hZCBjb21wcmVzc29yIGNsYXNzICIgKyBjb21wcmVzc29yQ2xhc3NOYW1lICk7DQotICAgICAgICAgICAgdGhyb3cgbmV3IE1vam9FeGVjdXRpb25FeGNlcHRpb24oICJGYWlsZWQgdG8gbG9hZCBjb21wcmVzc29yIGNsYXNzIg0KLSAgICAgICAgICAgICAgICArIGNvbXByZXNzb3JDbGFzc05hbWUsIGUgKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIEpTQ29tcHJlc3NvciBqc2NvbXByZXNzb3I7DQotICAgICAgICB0cnkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBqc2NvbXByZXNzb3IgPSBuZXcgSlNDb21wcmVzc29yUHJveHkoIGNvbXByZXNzb3JDbGFzcy5uZXdJbnN0YW5jZSgpICk7DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoIEV4Y2VwdGlvbiBlICkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBnZXRMb2coKS5pbmZvKA0KLSAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGNyZWF0ZSBhIGlzb2xhdGVkLWNsYXNzbG9hZGVyIHByb3h5IGZvciAiICsgY29tcHJlc3NvckNsYXNzTmFtZSApOw0KLSAgICAgICAgICAgIHRocm93IG5ldyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uKCAiRmFpbGVkIHRvIGNyZWF0ZSBhIGlzb2xhdGVkLWNsYXNzbG9hZGVyIHByb3h5IGZvciAiDQotICAgICAgICAgICAgICAgICsgY29tcHJlc3NvckNsYXNzTmFtZSwgZSApOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZ2V0TG9nKCkuaW5mbyggIkNvbXByZXNzaW5nIGphdmFzY3JpcHQgdXNpbmcgIiArIGNvbXByZXNzb3IgKTsNCi0NCi0gICAgICAgIGNvbXByZXNzb3JzLnB1dCggY29tcHJlc3NvciwganNjb21wcmVzc29yICk7DQotICAgICAgICByZXR1cm4ganNjb21wcmVzc29yOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgbG9uZyBjb21wcmVzcyggSlNDb21wcmVzc29yIGpzY29tcHJlc3NvciwgU3RyaW5nIGZpbGUgKQ0KLSAgICAgICAgdGhyb3dzIE1vam9FeGVjdXRpb25FeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgU3RyaW5nIG5hbWUgPSBmaWxlOw0KLSAgICAgICAgaWYgKCBnZXRFeHRlbnNpb24oKSAhPSBudWxsICkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpbnQgZXh0ID0gZmlsZS5sYXN0SW5kZXhPZiggJy4nICk7DQotICAgICAgICAgICAgbmFtZSA9IGZpbGUuc3Vic3RyaW5nKCAwLCBleHQgKSArICItIiArIGdldEV4dGVuc2lvbigpICsgZmlsZS5zdWJzdHJpbmcoIGV4dCApOw0KLSAgICAgICAgfQ0KLSAgICAgICAgRmlsZSBjb21wcmVzc2VkID0gbmV3IEZpbGUoIGdldE91dHB1dERpcmVjdG9yeSgpLCBuYW1lICk7DQotICAgICAgICBjb21wcmVzc2VkLmdldFBhcmVudEZpbGUoKS5ta2RpcnMoKTsNCi0gICAgICAgIEZpbGUgaW4gPSBuZXcgRmlsZSggZ2V0U291cmNlRGlyZWN0b3J5KCksIGZpbGUgKTsNCi0gICAgICAgIGlmICggaW4uZXF1YWxzKCBjb21wcmVzc2VkICkgKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRyeQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgRmlsZSB0ZW1wID0gRmlsZS5jcmVhdGVUZW1wRmlsZSggImNvbXByZXNzIiwgIi5qcyIgKTsNCi0gICAgICAgICAgICAgICAgbG9uZyBzaXplID0gY29tcHJlc3MoIGluLCB0ZW1wLCBqc2NvbXByZXNzb3IgKTsNCi0gICAgICAgICAgICAgICAgRmlsZVV0aWxzLmNvcHlGaWxlKCB0ZW1wLCBjb21wcmVzc2VkICk7DQotICAgICAgICAgICAgICAgIHRlbXAuZGVsZXRlKCk7DQotICAgICAgICAgICAgICAgIHJldHVybiBzaXplOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBjYXRjaCAoIElPRXhjZXB0aW9uIGUgKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IE1vam9FeGVjdXRpb25FeGNlcHRpb24oICJFcnJvciBjcmVhdGluZyB0ZW1wIGZpbGUgZm9yIGNvbXByZXNzaW9uIiwgZSApOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gY29tcHJlc3MoIGluLCBjb21wcmVzc2VkLCBqc2NvbXByZXNzb3IgKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIGxvbmcgY29tcHJlc3MoIEZpbGUgaW4sIEZpbGUgY29tcHJlc3NlZCwgSlNDb21wcmVzc29yIGpzY29tcHJlc3NvciApDQotICAgICAgICB0aHJvd3MgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBpZiAoIGluLmxlbmd0aCgpID4gMCApDQotICAgICAgICB7DQotICAgICAgICAgICAgRmlsZSBzdHJpcHBlZCA9IHN0cmlwRGVidWdzKCBpbiApOw0KLSAgICAgICAgICAgIHRyeQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAganNjb21wcmVzc29yLmNvbXByZXNzKCBzdHJpcHBlZCwgY29tcHJlc3NlZCwgb3B0aW1pemF0aW9uTGV2ZWwsIGxhbmd1YWdlVmVyc2lvbiApOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBjYXRjaCAoIENvbXByZXNzaW9uRXhjZXB0aW9uIGUgKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IE1vam9FeGVjdXRpb25FeGNlcHRpb24oICJGYWlsZWQgdG8gY29tcHJlc3MgSmF2YXNjcmlwdCBmaWxlICINCi0gICAgICAgICAgICAgICAgICAgICsgZS5nZXRTY3JpcHQoKSwgZSApOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBTdHJpbmcgZGVzY3JpYmUgPSBpbi5nZXROYW1lKCkgKyAiICgiICsgSU5URUdFUi5mb3JtYXQoIGluLmxlbmd0aCgpICkgKyAiIGJ5dGVzKSAiOw0KLSAgICAgICAgICAgIFN0cmluZyB0aXRsZSA9IFN0cmluZ1V0aWxzLnJpZ2h0UGFkKCBkZXNjcmliZSwgNjAsICIuIiApOw0KLSAgICAgICAgICAgIGxvZ1N0YXRzKCB0aXRsZSArICIgY29tcHJlc3NlZCBhdCAiICsgcmF0aW8oIGNvbXByZXNzZWQsIGluICkgKyAiJSIgKTsNCi0gICAgICAgICAgICByZXR1cm4gaW4ubGVuZ3RoKCkgLSBjb21wcmVzc2VkLmxlbmd0aCgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRyeQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgY29tcHJlc3NlZC5jcmVhdGVOZXdGaWxlKCk7DQotICAgICAgICAgICAgICAgIGdldExvZygpLmluZm8oIGluLmdldE5hbWUoKSArICIgd2FzIHplcm8gbGVuZ3RoOyBub3QgY29tcHJlc3NlZC4iICk7DQotICAgICAgICAgICAgICAgIHJldHVybiAwOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBjYXRjaCAoIElPRXhjZXB0aW9uIGUgKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IE1vam9FeGVjdXRpb25FeGNlcHRpb24oICJFcnJvciBoYW5kbGluZyB6ZXJvIGxlbmd0aCBmaWxlLiIsIGUgKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBsb25nIHJhdGlvKCBGaWxlIGNvbXByZXNzZWQsIEZpbGUgaW4gKQ0KLSAgICB7DQotICAgICAgICBsb25nIGxlbmd0aCA9IGluLmxlbmd0aCgpOw0KLSAgICAgICAgaWYgKCBsZW5ndGggPT0gMCApDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIDA7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gKCAoICggbGVuZ3RoIC0gY29tcHJlc3NlZC5sZW5ndGgoKSApICogMTAwICkgLyBsZW5ndGggKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgbG9nU3RhdHMoIFN0cmluZyBsaW5lICkNCi0gICAgew0KLSAgICAgICAgaWYgKCBza2lwU3RhdHMgKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgIH0NCi0gICAgICAgIGdldExvZygpLmluZm8oIGxpbmUgKTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogQHJldHVybiB0aGUgZXh0ZW5zaW9uIHRvIGFwcGVuZCB0byBjb21wcmVzc2VkIHNjcmlwdHMuDQotICAgICAqLw0KLSAgICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldEV4dGVuc2lvbigpOw0KLQ0KLSAgICAvKioNCi0gICAgICogQHJldHVybiB0aGUgb3V0cHV0RGlyZWN0b3J5DQotICAgICAqLw0KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgRmlsZSBnZXRPdXRwdXREaXJlY3RvcnkoKTsNCi0NCi0gICAgLyoqDQotICAgICAqIEByZXR1cm4gdGhlIHNvdXJjZURpcmVjdG9yeQ0KLSAgICAgKi8NCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IEZpbGUgZ2V0U291cmNlRGlyZWN0b3J5KCk7DQotDQotICAgIHByb3RlY3RlZCB2b2lkIHNldExvY2FsUmVwb3NpdG9yeSggQXJ0aWZhY3RSZXBvc2l0b3J5IGxvY2FsUmVwb3NpdG9yeSApDQotICAgIHsNCi0gICAgICAgIHRoaXMubG9jYWxSZXBvc2l0b3J5ID0gbG9jYWxSZXBvc2l0b3J5Ow0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvam10L0Fic3RyYWN0SmF2YXNjcmlwdE1vam8uamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvam10L0Fic3RyYWN0SmF2YXNjcmlwdE1vam8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGI4OWJiMS4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2ptdC9BYnN0cmFjdEphdmFzY3JpcHRNb2pvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKg0KLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICogDQotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqIA0KLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqICB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5qbXQ7DQotDQotaW1wb3J0IGphdmEuaW8uRmlsZTsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5hcnRpZmFjdC5BcnRpZmFjdDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uQWJzdHJhY3RNb2pvOw0KLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5Nb2pvRXhlY3V0aW9uRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuam10LmFyY2hpdmUuSmF2YXNjcmlwdEFydGlmYWN0TWFuYWdlcjsNCi1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy5hcmNoaXZlci5BcmNoaXZlckV4Y2VwdGlvbjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpuaWNvbGFzQGFwYWNoZS5vcmciPk5pY29sYXMgRGUgTG9vZjwvYT4NCi0gKi8NCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RKYXZhc2NyaXB0TW9qbw0KLSAgICBleHRlbmRzIEFic3RyYWN0TW9qbw0KLXsNCi0NCi0gICAgLyoqDQotICAgICAqIE1hcCBvZiBvZiBwbHVnaW4gYXJ0aWZhY3RzLg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtZXRlciBleHByZXNzaW9uPSIke3BsdWdpbi5hcnRpZmFjdE1hcH0iDQotICAgICAqIEByZXF1aXJlZA0KLSAgICAgKiBAcmVhZG9ubHkNCi0gICAgICovDQotICAgIHByaXZhdGUgTWFwIHBsdWdpbkFydGlmYWN0TWFwOw0KLQ0KLSAgICAvKioNCi0gICAgICogQGNvbXBvbmVudCANCi0gICAgICovDQotICAgIHByaXZhdGUgSmF2YXNjcmlwdEFydGlmYWN0TWFuYWdlciBqYXZhc2NyaXB0QXJ0aWZhY3RNYW5hZ2VyOw0KLQ0KLSAgICAvKioNCi0gICAgICogVW5wYWNrIGEgamF2YXNjcmlwdCBkZXBlbmRlbmN5DQotICAgICAqLw0KLSAgICBwcm90ZWN0ZWQgdm9pZCB1bnBhY2tKYXZhc2NyaXB0RGVwZW5kZW5jeSggU3RyaW5nIGFydGlmYWN0LCBGaWxlIGRlc3QgKQ0KLSAgICAgICAgdGhyb3dzIE1vam9FeGVjdXRpb25FeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgaWYgKCAhcGx1Z2luQXJ0aWZhY3RNYXAuY29udGFpbnNLZXkoIGFydGlmYWN0ICkgKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uKCAiRmFpbGVkIHRvIHJlc29sdmUgZGVwZW5kZW5jeSAiICsgYXJ0aWZhY3QNCi0gICAgICAgICAgICAgICAgKyAiIHJlcXVpcmVkIGJ5IHRoZSBwbHVnaW4iICk7DQotICAgICAgICB9DQotICAgICAgICBBcnRpZmFjdCBqYXZhc2NyaXB0ID0gKEFydGlmYWN0KSBwbHVnaW5BcnRpZmFjdE1hcC5nZXQoIGFydGlmYWN0ICk7DQotDQotICAgICAgICB0cnkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBqYXZhc2NyaXB0QXJ0aWZhY3RNYW5hZ2VyLnVucGFjayggamF2YXNjcmlwdCwgZGVzdCApOw0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKCBBcmNoaXZlckV4Y2VwdGlvbiBlICkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbiggIkZhaWxlZCB0byB1bnBhY2sgamF2YXNjcmlwdCBkZXBlbmRlbmN5ICIgKyBhcnRpZmFjdCwNCi0gICAgICAgICAgICAgICAgZSApOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotfQ0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvam10L0F0dGFjaENvbXByZXNzZWRNb2pvLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2ptdC9BdHRhY2hDb21wcmVzc2VkTW9qby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjdmMTEwLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvam10L0F0dGFjaENvbXByZXNzZWRNb2pvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzEgKzAsMCBAQAotLyoNCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqIA0KLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKiANCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuam10Ow0KLQ0KLWltcG9ydCBqYXZhLmlvLkZpbGU7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLk1vam9FeGVjdXRpb25FeGNlcHRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucHJvamVjdC5NYXZlblByb2plY3RIZWxwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5qbXQuYXJjaGl2ZS5KYXZhc2NyaXB0QXJjaGl2ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5qbXQuYXJjaGl2ZS5UeXBlczsNCi0NCi0vKioNCi0gKiBHb2FsIHVzZWQgdG8gYnVpbGQgamF2YXNjcmlwdCBsaWJyYXJpZXMgd2l0aCBtYXZlbi4gQ29tcHJlc3MgdGhlIEphdmFTY3JpcHQNCi0gKiBmaWxlcyBmcm9tIHRoZSBwYWNrYWdpbmcgZGlyZWN0b3J5LCBwYWthZ2UgdGhlbSBhcyBhIGphdmFzY3JpcHQgYXJjaGl2ZSBhbmQNCi0gKiBhdHRhY2ggdGhpcyBuZXcgYXJ0aWZhY3QgdG8gdGhlIHByb2plY3QgZm9yIGJlZWluZyBpbnN0YWxsZWQgLyBkZXBsb3llZCB3aXRoDQotICogdGhlIHJlZ3VsYXIgdW5jb21wcmVzc2VkIGpzLWFyY2hpdmUuDQotICogDQotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86bmljb2xhc0BhcGFjaGUub3JnIj5uaWNvbGFzIERlIExvb2Y8L2E+DQotICogQGdvYWwgYXR0YWNoLWNvbXByZXNzZWQNCi0gKiBAcGhhc2UgcGFja2FnZQ0KLSAqLw0KLXB1YmxpYyBjbGFzcyBBdHRhY2hDb21wcmVzc2VkTW9qbw0KLSAgICBleHRlbmRzIEFic3RyYWN0Q29tcHJlc3NNb2pvDQotew0KLQ0KLSAgICAvKioNCi0gICAgICogQGNvbXBvbmVudA0KLSAgICAgKi8NCi0gICAgTWF2ZW5Qcm9qZWN0SGVscGVyIHByb2plY3RIZWxwZXI7DQotDQotICAgIC8qKg0KLSAgICAgKiBQbGV4dXMgYXJjaGl2ZXIuDQotICAgICAqIA0KLSAgICAgKiBAY29tcG9uZW50IHJvbGU9Im9yZy5jb2RlaGF1cy5wbGV4dXMuYXJjaGl2ZXIuQXJjaGl2ZXIiIHJvbGUtaGludD0iamF2YXNjcmlwdCINCi0gICAgICogQHJlcXVpcmVkDQotICAgICAqLw0KLSAgICBwcml2YXRlIEphdmFzY3JpcHRBcmNoaXZlciBhcmNoaXZlcjsNCi0NCi0gICAgLyoqDQotICAgICAqIFRoZSBvdXRwdXQgZGlyZWN0b3J5IG9mIHRoZSBjb21wcmVzc2VkIGphdmFzY3JpcHQgZmlsZXMuDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW1ldGVyIGRlZmF1bHQtdmFsdWU9IiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L2NvbXByZXNzZWQiDQotICAgICAqLw0KLSAgICBwcml2YXRlIEZpbGUgY29tcHJlc3NlZERpcmVjdG9yeTsNCi0NCi0gICAgLyoqDQotICAgICAqIFRoZSBvdXRwdXQgZGlyZWN0b3J5IG9mIHRoZSBjb21wcmVzc2VkIGphdmFzY3JpcHQgYXJjaGl2ZS4NCi0gICAgICogDQotICAgICAqIEBwYXJhbWV0ZXIgZGVmYXVsdC12YWx1ZT0iJHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0iDQotICAgICAqLw0KLSAgICBwcml2YXRlIEZpbGUgYnVpbGREaXJlY3Rvcnk7DQotDQotICAgIC8qKg0KLSAgICAgKiBUaGUgZmlsZW5hbWUgb2YgdGhlIGNvbXByZXNzZWQganMgZmlsZS4NCi0gICAgICogDQotICAgICAqIEBwYXJhbWV0ZXIgZGVmYXVsdC12YWx1ZT0iJHtwcm9qZWN0LmJ1aWxkLmZpbmFsTmFtZX0iDQotICAgICAqLw0KLSAgICBwcml2YXRlIFN0cmluZyBmaW5hbE5hbWU7DQotDQotICAgIC8qKg0KLSAgICAgKiBjbGFzc2lmaWVyIGZvciB0aGUgY29tcHJlc3NlZCBhcnRpZmFjdA0KLSAgICAgKiANCi0gICAgICogQHBhcmFtZXRlciBkZWZhdWx0LXZhbHVlPSJjb21wcmVzc2VkIg0KLSAgICAgKi8NCi0gICAgcHJpdmF0ZSBTdHJpbmcgY2xhc3NpZmllcjsNCi0NCi0gICAgLyoqDQotICAgICAqIG9wdGlvbmFsIGV4dGVuc2lvbiBmb3IgdGhlIGNvbXByZXNzZWQgYXJ0aWZhY3QuIEV4YW1wbGUgImNvbXByZXNzZWQiDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW1ldGVyDQotICAgICAqLw0KLSAgICBwcml2YXRlIFN0cmluZyBzY3JpcHRDbGFzc2lmaWVyOw0KLQ0KLSAgICAvKioNCi0gICAgICogVGhlIGludHB1dCBkaXJlY3RvcnkgZm9yIHRoZSBzb3VyY2UgamF2YXNjcmlwdCBmaWxlcy4NCi0gICAgICogDQotICAgICAqIEBwYXJhbWV0ZXIgZGVmYXVsdC12YWx1ZT0iJHtwcm9qZWN0LmJ1aWxkLm91dHB1dERpcmVjdG9yeX0iDQotICAgICAqLw0KLSAgICBwcml2YXRlIEZpbGUgc2NyaXB0c0RpcmVjdG9yeTsNCi0NCi0gICAgLyoqDQotICAgICAqIHtAaW5oZXJpdERvY30NCi0gICAgICogDQotICAgICAqIEBzZWUgb3JnLmNvZGVoYXVzLm1vam8uamF2YXNjcmlwdC5BYnN0cmFjdENvbXByZXNzTW9qbyNnZXRFeHRlbnNpb24oKQ0KLSAgICAgKi8NCi0gICAgcHVibGljIFN0cmluZyBnZXRFeHRlbnNpb24oKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gc2NyaXB0Q2xhc3NpZmllcjsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICoge0Bpbmhlcml0RG9jfQ0KLSAgICAgKiANCi0gICAgICogQHNlZSBvcmcuY29kZWhhdXMubW9qby5qYXZhc2NyaXB0LkFic3RyYWN0Q29tcHJlc3NNb2pvI2dldE91dHB1dERpcmVjdG9yeSgpDQotICAgICAqLw0KLSAgICBwcm90ZWN0ZWQgRmlsZSBnZXRPdXRwdXREaXJlY3RvcnkoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gY29tcHJlc3NlZERpcmVjdG9yeTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICoge0Bpbmhlcml0RG9jfQ0KLSAgICAgKiANCi0gICAgICogQHNlZSBvcmcuY29kZWhhdXMubW9qby5qYXZhc2NyaXB0LkFic3RyYWN0Q29tcHJlc3NNb2pvI2dldFNvdXJjZURpcmVjdG9yeSgpDQotICAgICAqLw0KLSAgICBwcm90ZWN0ZWQgRmlsZSBnZXRTb3VyY2VEaXJlY3RvcnkoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gc2NyaXB0c0RpcmVjdG9yeTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogQHBhcmFtZXRlcg0KLSAgICAgKi8NCi0gICAgcHJpdmF0ZSBGaWxlIG1hbmlmZXN0Ow0KLQ0KLSAgICAvKioNCi0gICAgICoge0Bpbmhlcml0RG9jfQ0KLSAgICAgKiANCi0gICAgICogQHNlZSBvcmcuY29kZWhhdXMubW9qby5qYXZhc2NyaXB0LkFic3RyYWN0Q29tcHJlc3NNb2pvI2V4ZWN1dGUoKQ0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpDQotICAgICAgICB0aHJvd3MgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBzdXBlci5leGVjdXRlKCk7DQotDQotICAgICAgICBGaWxlIGNvbXByZXNzZWQgPQ0KLSAgICAgICAgICAgIG5ldyBGaWxlKCBidWlsZERpcmVjdG9yeSwgZmluYWxOYW1lICsgIi0iICsgY2xhc3NpZmllciArICIuIg0KLSAgICAgICAgICAgICAgICArIFR5cGVzLkpBVkFTQ1JJUFRfRVhURU5TSU9OICk7DQotICAgICAgICB0cnkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAoIG1hbmlmZXN0ICE9IG51bGwgKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgYXJjaGl2ZXIuc2V0TWFuaWZlc3QoIG1hbmlmZXN0ICk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGFyY2hpdmVyLmNyZWF0ZURlZmF1bHRNYW5pZmVzdCggcHJvamVjdCApOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBhcmNoaXZlci5hZGREaXJlY3RvcnkoIGNvbXByZXNzZWREaXJlY3RvcnkgKTsNCi0gICAgICAgICAgICBTdHJpbmcgZ3JvdXBJZCA9IHByb2plY3QuZ2V0R3JvdXBJZCgpOw0KLSAgICAgICAgICAgIFN0cmluZyBhcnRpZmFjdElkID0gcHJvamVjdC5nZXRBcnRpZmFjdElkKCk7DQotICAgICAgICAgICAgYXJjaGl2ZXIuYWRkRmlsZSggcHJvamVjdC5nZXRGaWxlKCksICJNRVRBLUlORi9tYXZlbi8iICsgZ3JvdXBJZCArICIvIiArIGFydGlmYWN0SWQNCi0gICAgICAgICAgICAgICAgKyAiL3BvbS54bWwiICk7DQotICAgICAgICAgICAgYXJjaGl2ZXIuc2V0RGVzdEZpbGUoIGNvbXByZXNzZWQgKTsNCi0gICAgICAgICAgICBhcmNoaXZlci5jcmVhdGVBcmNoaXZlKCk7DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoIEV4Y2VwdGlvbiBlICkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbiggIkZhaWxlZCB0byBjcmVhdGUgdGhlIGphdmFzY3JpcHQgYXJjaGl2ZSIsIGUgKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHByb2plY3RIZWxwZXIuYXR0YWNoQXJ0aWZhY3QoIHByb2plY3QsIFR5cGVzLkpBVkFTQ1JJUFRfRVhURU5TSU9OLCBjbGFzc2lmaWVyLCBjb21wcmVzc2VkICk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qbXQvQ29tcGlsZU1vam8uamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvam10L0NvbXBpbGVNb2pvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmMWQ3NTMuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qbXQvQ29tcGlsZU1vam8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2NCArMCwwIEBACi0vKg0KLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICogDQotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqIA0KLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqICB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5qbXQ7DQotDQotaW1wb3J0IGphdmEuaW8uRmlsZTsNCi1pbXBvcnQgamF2YS5pby5GaWxlUmVhZGVyOw0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOw0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7DQotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0Ow0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuU2V0Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5BYnN0cmFjdE1vam87DQotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLk1vam9FeGVjdXRpb25FeGNlcHRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLk1vam9GYWlsdXJlRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnByb2plY3QuTWF2ZW5Qcm9qZWN0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuam10LmFzc2VtYmxlci5Bc3NlbWJsZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5qbXQuYXNzZW1ibGVyLkFzc2VtYmxlclJlYWRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LmptdC5hc3NlbWJsZXIuQXNzZW1ibGVyUmVhZGVyTWFuYWdlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LmptdC5hc3NlbWJsZXIuU2NyaXB0Ow0KLWltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLnV0aWwuRGlyZWN0b3J5U2Nhbm5lcjsNCi1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy51dGlsLkZpbGVVdGlsczsNCi1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy51dGlsLklPVXRpbDsNCi0NCi0vKioNCi0gKiBHb2FsIHdoaWNoIGFzc2VtYmxlIGphdmFzY3JpcHQgc291cmNlcyBpbnRvIHRoZSBwYWNrYWdpbmcgZGlyZWN0b3J5LiBBbg0KLSAqIG9wdGlvbmFsIGFzc2VtYmxlciBkZXNjcmlwdG9yIGNhbiBiZSBzZXQgdG8gY29uZmlndXJlIHNjcmlwdHMgdG8gYmUgbWVyZ2VkLg0KLSAqIE90aGVyIHNjcmlwdHMgYXJlIHNpbXBseSBjb3BpZWQgdG8gdGhlIG91dHB1dCBkaXJlY3RvcnkuDQotICogDQotICogQGdvYWwgY29tcGlsZQ0KLSAqIEBwaGFzZSBjb21waWxlDQotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86bmljb2xhc0BhcGFjaGUub3JnIj5OaWNvbGFzIERlIExvb2Y8L2E+DQotICovDQotcHVibGljIGNsYXNzIENvbXBpbGVNb2pvDQotICAgIGV4dGVuZHMgQWJzdHJhY3RNb2pvDQotew0KLSAgICAvKiogZGVmYXVsdCBpbmNsdWRlcyBwYXR0ZXJuICovDQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIERFRkFVTFRfSU5DTFVERVMgPSB7ICIqKi8qLmpzIiB9Ow0KLQ0KLSAgICAvKioNCi0gICAgICogVGhlIG1hdmVuIHByb2plY3QuDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW1ldGVyIGV4cHJlc3Npb249IiR7cHJvamVjdH0iDQotICAgICAqIEByZXF1aXJlZA0KLSAgICAgKiBAcmVhZG9ubHkNCi0gICAgICovDQotICAgIHByaXZhdGUgTWF2ZW5Qcm9qZWN0IHByb2plY3Q7DQotDQotICAgIC8qKg0KLSAgICAgKiBMb2NhdGlvbiBvZiB0aGUgc291cmNlIGZpbGVzLg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtZXRlciBkZWZhdWx0LXZhbHVlPSIke2Jhc2VkaXJ9L3NyYy9tYWluL2phdmFzY3JpcHQiDQotICAgICAqLw0KLSAgICBwcm90ZWN0ZWQgRmlsZSBzb3VyY2VEaXJlY3Rvcnk7DQotDQotICAgIC8qKg0KLSAgICAgKiBUaGUgb3V0cHV0IGRpcmVjdG9yeSBvZiB0aGUgYXNzZW1ibGVkIGpzIGZpbGUuDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW1ldGVyIGRlZmF1bHQtdmFsdWU9IiR7cHJvamVjdC5idWlsZC5vdXRwdXREaXJlY3Rvcnl9Ig0KLSAgICAgKi8NCi0gICAgcHJvdGVjdGVkIEZpbGUgb3V0cHV0RGlyZWN0b3J5Ow0KLQ0KLSAgICAvKioNCi0gICAgICogRXhjbHVzaW9uIHBhdHRlcm4uDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW1ldGVyDQotICAgICAqLw0KLSAgICBwcml2YXRlIFN0cmluZ1tdIGV4Y2x1ZGVzOw0KLQ0KLSAgICAvKioNCi0gICAgICogSW5jbHVzaW9uIHBhdHRlcm4uDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW1ldGVyDQotICAgICAqLw0KLSAgICBwcml2YXRlIFN0cmluZ1tdIGluY2x1ZGVzOw0KLQ0KLSAgICAvKioNCi0gICAgICogQGNvbXBvbmVudA0KLSAgICAgKi8NCi0gICAgcHJpdmF0ZSBBc3NlbWJsZXJSZWFkZXJNYW5hZ2VyIGFzc2VtYmxlclJlYWRlck1hbmFnZXI7DQotDQotICAgIC8qKg0KLSAgICAgKiBEZXNjcmlwdG9yIGZvciB0aGUgc3RyYXRlZ3kgdG8gYXNzZW1ibGUgaW5kaXZpZHVhbCBzY3JpcHRzIHNvdXJjZXMgaW50bw0KLSAgICAgKiBkZXN0aW5hdGlvbi4NCi0gICAgICogDQotICAgICAqIEBwYXJhbWV0ZXIgZGVmYXVsdC12YWx1ZT0ic3JjL2Fzc2VtYmxlci8ke3Byb2plY3QuYXJ0aWZhY3RJZH0ueG1sIg0KLSAgICAgKi8NCi0gICAgcHJpdmF0ZSBGaWxlIGRlc2NyaXB0b3I7DQotDQotICAgIC8qKg0KLSAgICAgKiBEZXNjcmlwdG9yIGZpbGUgZm9ybWF0IChkZWZhdWx0IG9yIGpzYnVpbGRlcikNCi0gICAgICogDQotICAgICAqIEBwYXJhbWV0ZXINCi0gICAgICovDQotICAgIHByaXZhdGUgU3RyaW5nIGRlc2NyaXB0b3JGb3JtYXQ7DQotDQotICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKQ0KLSAgICAgICAgdGhyb3dzIE1vam9FeGVjdXRpb25FeGNlcHRpb24sIE1vam9GYWlsdXJlRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIG91dHB1dERpcmVjdG9yeS5ta2RpcnMoKTsNCi0NCi0gICAgICAgIFNldCBtZXJnZWQgPSBhc3NlbWJsZSgpOw0KLQ0KLSAgICAgICAgaWYgKCBpbmNsdWRlcyA9PSBudWxsICkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpbmNsdWRlcyA9IERFRkFVTFRfSU5DTFVERVM7DQotICAgICAgICB9DQotICAgICAgICBEaXJlY3RvcnlTY2FubmVyIHNjYW5uZXIgPSBuZXcgRGlyZWN0b3J5U2Nhbm5lcigpOw0KLSAgICAgICAgc2Nhbm5lci5zZXRCYXNlZGlyKCBzb3VyY2VEaXJlY3RvcnkgKTsNCi0gICAgICAgIHNjYW5uZXIuc2V0RXhjbHVkZXMoIGV4Y2x1ZGVzICk7DQotICAgICAgICBzY2FubmVyLmFkZERlZmF1bHRFeGNsdWRlcygpOw0KLQ0KLSAgICAgICAgc2Nhbm5lci5zZXRJbmNsdWRlcyggaW5jbHVkZXMgKTsNCi0gICAgICAgIHNjYW5uZXIuc2NhbigpOw0KLQ0KLSAgICAgICAgdHJ5DQotICAgICAgICB7DQotICAgICAgICAgICAgU3RyaW5nW10gZmlsZXMgPSBzY2FubmVyLmdldEluY2x1ZGVkRmlsZXMoKTsNCi0gICAgICAgICAgICBmb3IgKCBpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKyApDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBTdHJpbmcgZmlsZSA9IGZpbGVzW2ldOw0KLSAgICAgICAgICAgICAgICBpZiAoIG1lcmdlZC5jb250YWlucyggZmlsZSApICkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgRmlsZSBzb3VyY2UgPSBuZXcgRmlsZSggc291cmNlRGlyZWN0b3J5LCBmaWxlICk7DQotICAgICAgICAgICAgICAgIEZpbGUgZGVzdCA9IG5ldyBGaWxlKCBvdXRwdXREaXJlY3RvcnksIGZpbGUgKTsNCi0gICAgICAgICAgICAgICAgZGVzdC5nZXRQYXJlbnRGaWxlKCkubWtkaXIoKTsNCi0gICAgICAgICAgICAgICAgRmlsZVV0aWxzLmNvcHlGaWxlKCBzb3VyY2UsIGRlc3QgKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoIElPRXhjZXB0aW9uIGUgKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uKCAiRmFpbGVkIHRvIGNvcHkgc291cmNlIGZpbGVzIHRvICIgKyBvdXRwdXREaXJlY3RvcnksDQotICAgICAgICAgICAgICAgIGUgKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogSG9ub3IgdGhlIGFzc2VtYmx5IHJ1bGVzIHRvIGJ1aWxkIG1lcmdlZCBzY3JpcHRzIGZyb20gaW5kaXZpZHVhbCBvbmVzLg0KLSAgICAgKiANCi0gICAgICogQHJldHVybiBhIHNldCBvZiBhbGwgc2NyaXB0IG1lcmdlZCwgdG8gYmUgc2tpcGVkIGZyb20gdGhlIHRhcmdldA0KLSAgICAgKiBkaXJlY3RvcnkuDQotICAgICAqIEB0aHJvd3MgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbg0KLSAgICAgKi8NCi0gICAgcHJvdGVjdGVkIFNldCBhc3NlbWJsZSgpDQotICAgICAgICB0aHJvd3MgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBpZiAoIGRlc2NyaXB0b3IgPT0gbnVsbCApDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX1NFVDsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmICggIWRlc2NyaXB0b3IuZXhpc3RzKCkgKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmICggZGVzY3JpcHRvci5nZXROYW1lKCkuZXF1YWxzKCBwcm9qZWN0LmdldEFydGlmYWN0SWQoKSArICIueG1sIiApICkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGdldExvZygpLmluZm8oICJObyBkZWZhdWx0IGFzc2VtYmxlciBkZXNjcmlwdG9yIC0ganVzdCBjb3B5IHNjcmlwdHMiICk7DQotICAgICAgICAgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9TRVQ7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHRocm93IG5ldyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uKCAiVGhlIGFzc2VtYmxlciBkZXNjcmlwdG9yIGRvZXMgbm90IGV4aXN0cyA6ICINCi0gICAgICAgICAgICAgICAgKyBkZXNjcmlwdG9yICk7DQotICAgICAgICB9DQotDQotICAgICAgICBpZiAoIGRlc2NyaXB0b3JGb3JtYXQgPT0gbnVsbCApDQotICAgICAgICB7DQotICAgICAgICAgICAgZGVzY3JpcHRvckZvcm1hdCA9ICJkZWZhdWx0IjsNCi0gICAgICAgICAgICBpZiAoIGRlc2NyaXB0b3IuZ2V0TmFtZSgpLnRvTG93ZXJDYXNlKCkuZW5kc1dpdGgoICIuanNiIiApICkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JGb3JtYXQgPSAianNidWlsZGVyIjsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICBBc3NlbWJsZXIgYXNzZW1ibGVyOw0KLSAgICAgICAgdHJ5DQotICAgICAgICB7DQotICAgICAgICAgICAgQXNzZW1ibGVyUmVhZGVyIHJlYWRlciA9IGFzc2VtYmxlclJlYWRlck1hbmFnZXIuZ2V0QXNzZW1ibGVyUmVhZGVyKCBkZXNjcmlwdG9yRm9ybWF0ICk7DQotICAgICAgICAgICAgYXNzZW1ibGVyID0gcmVhZGVyLmdldEFzc2VtYmxlciggZGVzY3JpcHRvciApOw0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKCBFeGNlcHRpb24gZSApDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhyb3cgbmV3IE1vam9FeGVjdXRpb25FeGNlcHRpb24oICJGYWlsZWQgdG8gcmVhZCB0aGUgYXNzZW1ibGVyIGRlc2NyaXB0b3IgIg0KLSAgICAgICAgICAgICAgICArIGRlc2NyaXB0b3IuZ2V0QWJzb2x1dGVQYXRoKCksIGUgKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBhc3NlbWJsZSggYXNzZW1ibGVyICk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBTZXQgYXNzZW1ibGUoIEFzc2VtYmxlciBhc3NlbWJsZXIgKQ0KLSAgICAgICAgdGhyb3dzIE1vam9FeGVjdXRpb25FeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgU2V0IG1lcmdlZCA9IG5ldyBIYXNoU2V0KCk7DQotDQotICAgICAgICBEaXJlY3RvcnlTY2FubmVyIHNjYW5uZXIgPSBuZXcgRGlyZWN0b3J5U2Nhbm5lcigpOw0KLSAgICAgICAgc2Nhbm5lci5zZXRCYXNlZGlyKCBzb3VyY2VEaXJlY3RvcnkgKTsNCi0gICAgICAgIHNjYW5uZXIuc2V0RXhjbHVkZXMoIGV4Y2x1ZGVzICk7DQotICAgICAgICBzY2FubmVyLmFkZERlZmF1bHRFeGNsdWRlcygpOw0KLQ0KLSAgICAgICAgZm9yICggSXRlcmF0b3IgaXRlcmF0b3IgPSBhc3NlbWJsZXIuZ2V0U2NyaXB0cygpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTsgKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIFNjcmlwdCBzY3JpcHQgPSAoU2NyaXB0KSBpdGVyYXRvci5uZXh0KCk7DQotICAgICAgICAgICAgU3RyaW5nIGZpbGVOYW1lID0gc2NyaXB0LmdldEZpbGVOYW1lKCk7DQotICAgICAgICAgICAgUHJpbnRXcml0ZXIgd3JpdGVyID0gbnVsbDsNCi0gICAgICAgICAgICB0cnkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIEZpbGUgdGFyZ2V0ID0gbmV3IEZpbGUoIG91dHB1dERpcmVjdG9yeSwgZmlsZU5hbWUgKTsNCi0gICAgICAgICAgICAgICAgdGFyZ2V0LmdldFBhcmVudEZpbGUoKS5ta2RpcnMoKTsNCi0gICAgICAgICAgICAgICAgd3JpdGVyID0gbmV3IFByaW50V3JpdGVyKCB0YXJnZXQgKTsNCi0NCi0gICAgICAgICAgICAgICAgTGlzdCBzY3JpcHRPcmRlcmVkSW5jbHVkZXMgPSBzY3JpcHQuZ2V0SW5jbHVkZXMoKTsNCi0gICAgICAgICAgICAgICAgZm9yICggSXRlcmF0b3IgaXRlciA9IHNjcmlwdE9yZGVyZWRJbmNsdWRlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTsgKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc2NyaXB0SW5jbHVkZSA9IChTdHJpbmcpIGl0ZXIubmV4dCgpOw0KLSAgICAgICAgICAgICAgICAgICAgc2Nhbm5lci5zZXRJbmNsdWRlcyggbmV3IFN0cmluZ1tdIHsgc2NyaXB0SW5jbHVkZSB9ICk7DQotICAgICAgICAgICAgICAgICAgICBzY2FubmVyLnNjYW4oKTsNCi0NCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZ1tdIGZpbGVzID0gc2Nhbm5lci5nZXRJbmNsdWRlZEZpbGVzKCk7DQotICAgICAgICAgICAgICAgICAgICBmb3IgKCBpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKyApDQotICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGZpbGUgPSBmaWxlc1tpXTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBGaWxlIHNvdXJjZSA9IG5ldyBGaWxlKCBzb3VyY2VEaXJlY3RvcnkuZ2V0QWJzb2x1dGVQYXRoKCkgKyAiLyIgKyBmaWxlICk7DQotICAgICAgICAgICAgICAgICAgICAgICAgSU9VdGlsLmNvcHkoIG5ldyBGaWxlUmVhZGVyKCBzb3VyY2UgKSwgd3JpdGVyICk7DQotICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBtZXJnZWQuYWRkKCBmaWxlICk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgY2F0Y2ggKCBJT0V4Y2VwdGlvbiBlICkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uKCAiRmFpbGVkIHRvIHdyaXRlIG1lcmdlZCBmaWxlICIgKyBmaWxlTmFtZSwgZSApOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBmaW5hbGx5DQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBJT1V0aWwuY2xvc2UoIHdyaXRlciApOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBtZXJnZWQ7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIEByZXR1cm4gdGhlIHByb2plY3QNCi0gICAgICovDQotICAgIHByb3RlY3RlZCBNYXZlblByb2plY3QgZ2V0UHJvamVjdCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBwcm9qZWN0Ow0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvam10L0RpcmVjdG9yeUNvbXByZXNzTW9qby5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qbXQvRGlyZWN0b3J5Q29tcHJlc3NNb2pvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0NzQ4MGYuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qbXQvRGlyZWN0b3J5Q29tcHJlc3NNb2pvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vKg0KLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICogDQotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqIA0KLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqICB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5qbXQ7DQotDQotaW1wb3J0IGphdmEuaW8uRmlsZTsNCi0NCi0vKioNCi0gKiBHb2FsIHRvIGJlIHVzZWQgZnJvbSBhIGphciBwcm9qZWN0LCB0byBjb21wcmVzcyB0aGUgc2NyaXB0cyBwcmVzZW50IGluIA0KLSAqIHNvbWUgZm9sZGVyLCBhbmQgcHV0IHRoZSByZXN1bHQgaW4gb3RoZXIgZm9sZGVyLg0KLSAqIA0KLSAqIEBnb2FsIGRpcmVjdG9yeS1jb21wcmVzcw0KLSAqIEBwaGFzZSB0ZXN0DQotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86bmljb2xhc0BhcGFjaGUub3JnIj5uaWNvbGFzIERlIExvb2Y8L2E+DQotICovDQotcHVibGljIGNsYXNzIERpcmVjdG9yeUNvbXByZXNzTW9qbw0KLSAgICBleHRlbmRzIEFic3RyYWN0Q29tcHJlc3NNb2pvDQotew0KLQ0KLSAgICAvKioNCi0gICAgICogVGhlIGRpcmVjdG9yeSB3aGVyZSB0aGUgZmlsZXMgYXJlIHRha2VuLg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtZXRlcg0KLSAgICAgKiBAcmVxdWlyZWQNCi0gICAgICovDQotICAgIHByaXZhdGUgRmlsZSBzb3VyY2VEaXJlY3Rvcnk7DQotICAgIA0KLSAgICAvKioNCi0gICAgICogVGhlIGRpcmVjdG9yeSB3aGVyZSB0aGUgY29tcHJlc3NlZCBmaWxlcyBhcmUgY29waWVkLg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtZXRlcg0KLSAgICAgKiBAcmVxdWlyZWQNCi0gICAgICovDQotICAgIHByaXZhdGUgRmlsZSBvdXRwdXREaXJlY3Rvcnk7DQotDQotICAgIC8qKg0KLSAgICAgKiBjbGFzc2lmaWVyIGZvciB0aGUgY29tcHJlc3NlZCBhcnRpZmFjdC4gSWYgbm90IHNldCwgY29tcHJlc3NlZCBzY3JpcHQNCi0gICAgICogd2lsbCByZXBsYWNlIHVuY29tcHJlc3NlZCBvbmVzLCBhbmQgd2lsbCBhcHBseSB3aXRob3V0IGFueSBjaGFuZ2UgaW4NCi0gICAgICogSFRNTC9KU1AuDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW1ldGVyDQotICAgICAqLw0KLSAgICBwcml2YXRlIFN0cmluZyBjbGFzc2lmaWVyOw0KLQ0KLSAgICAvKioNCi0gICAgICoge0Bpbmhlcml0RG9jfQ0KLSAgICAgKiANCi0gICAgICogQHNlZSBvcmcuY29kZWhhdXMubW9qby5qYXZhc2NyaXB0LkFic3RyYWN0Q29tcHJlc3NNb2pvI2dldEV4dGVuc2lvbigpDQotICAgICAqLw0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEV4dGVuc2lvbigpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBjbGFzc2lmaWVyOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiB7QGluaGVyaXREb2N9DQotICAgICAqIA0KLSAgICAgKiBAc2VlIG9yZy5jb2RlaGF1cy5tb2pvLmphdmFzY3JpcHQuQWJzdHJhY3RDb21wcmVzc01vam8jZ2V0T3V0cHV0RGlyZWN0b3J5KCkNCi0gICAgICovDQotICAgIHByb3RlY3RlZCBGaWxlIGdldE91dHB1dERpcmVjdG9yeSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBvdXRwdXREaXJlY3Rvcnk7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIHtAaW5oZXJpdERvY30NCi0gICAgICogDQotICAgICAqIEBzZWUgb3JnLmNvZGVoYXVzLm1vam8uamF2YXNjcmlwdC5BYnN0cmFjdENvbXByZXNzTW9qbyNnZXRTb3VyY2VEaXJlY3RvcnkoKQ0KLSAgICAgKi8NCi0gICAgcHJvdGVjdGVkIEZpbGUgZ2V0U291cmNlRGlyZWN0b3J5KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHNvdXJjZURpcmVjdG9yeTsNCi0gICAgfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2ptdC9JblBsYWNlTW9qby5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qbXQvSW5QbGFjZU1vam8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWE3NDAzYi4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2ptdC9JblBsYWNlTW9qby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLS8qDQotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKiANCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICogDQotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LmptdDsNCi0NCi1pbXBvcnQgamF2YS5pby5GaWxlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLmFydGlmYWN0LkRlZmF1bHRBcnRpZmFjdDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uQWJzdHJhY3RNb2pvOw0KLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5Nb2pvRXhlY3V0aW9uRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5Nb2pvRmFpbHVyZUV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wcm9qZWN0Lk1hdmVuUHJvamVjdDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LmptdC5hcmNoaXZlLkphdmFzY3JpcHRBcnRpZmFjdE1hbmFnZXI7DQotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMuYXJjaGl2ZXIuQXJjaGl2ZXJFeGNlcHRpb247DQotDQotLyoqDQotICogR29hbCB0aGF0IGNvcGllcyBqYXZhc2NyaXB0IGRlcGVuZGVuY2llcyB0byB0aGUgd2ViIGFwcGxpY2F0aW9uIHNjcmlwdA0KLSAqIGZvbGRlciwgaW5zaWRlIHRoZSB3ZWJhcHAgc291cmNlIGRpcmVjdG9yeS4gVGhpcyBhbGxvd3MgdG8gcHJlcGFyZSB0aGUgd2ViYXBwDQotICogZm9yIHJ1bm5pbmcgb24gYSBsaWdodHdlaWdodCBzZXJ2bGV0IGNvbnRhaW5lciB0aGF0IGRvZXMgbm90IHJlcXVpcmVzDQotICogcGFja2FnaW5nICh3aGVuIHVzaW5nIHRoZSBqZXR0eTpydW4gZ29hbCkuDQotICogDQotICogQGdvYWwgaW5wbGFjZQ0KLSAqIEByZXF1aXJlc0RlcGVuZGVuY3lSZXNvbHV0aW9uIHJ1bnRpbWUNCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpuaWNvbGFzQGFwYWNoZS5vcmciPm5pY29sYXMgRGUgTG9vZjwvYT4NCi0gKi8NCi1wdWJsaWMgY2xhc3MgSW5QbGFjZU1vam8NCi0gICAgZXh0ZW5kcyBBYnN0cmFjdE1vam8NCi17DQotDQotICAgIC8qKg0KLSAgICAgKiBUaGUgbWF2ZW4gcHJvamVjdC4NCi0gICAgICogDQotICAgICAqIEBwYXJhbWV0ZXIgZXhwcmVzc2lvbj0iJHtwcm9qZWN0fSINCi0gICAgICogQHJlcXVpcmVkDQotICAgICAqIEByZWFkb25seQ0KLSAgICAgKi8NCi0gICAgcHJpdmF0ZSBNYXZlblByb2plY3QgcHJvamVjdDsNCi0NCi0gICAgLyoqDQotICAgICAqIFNpbmdsZSBkaXJlY3RvcnkgZm9yIGV4dHJhIGZpbGVzIHRvIGluY2x1ZGUgaW4gdGhlIFdBUi4NCi0gICAgICogDQotICAgICAqIEBwYXJhbWV0ZXIgZXhwcmVzc2lvbj0iJHtiYXNlZGlyfS9zcmMvbWFpbi93ZWJhcHAiDQotICAgICAqIEByZXF1aXJlZA0KLSAgICAgKi8NCi0gICAgcHJpdmF0ZSBGaWxlIHdhclNvdXJjZURpcmVjdG9yeTsNCi0NCi0gICAgLyoqDQotICAgICAqIFRoZSBmb2xkZXIgaW4gd2ViYXBwIGZvciBqYXZhc2NyaXB0cw0KLSAgICAgKiANCi0gICAgICogQHBhcmFtZXRlciBleHByZXNzaW9uPSIke3NjcmlwdHN9IiBkZWZhdWx0LXZhbHVlPSJzY3JpcHRzL2xpYnMiDQotICAgICAqLw0KLSAgICBwcml2YXRlIFN0cmluZyBzY3JpcHRzRGlyZWN0b3J5Ow0KLQ0KLSAgICAvKioNCi0gICAgICogVGhlIGZvbGRlciBmb3IgamF2YXNjcmlwdHMgZGVwZW5kZW5jaWVzDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW1ldGVyIGV4cHJlc3Npb249IiR7c2NyaXB0c30iIGRlZmF1bHQtdmFsdWU9ImxpYiINCi0gICAgICovDQotICAgIHByaXZhdGUgU3RyaW5nIGxpYnNEaXJlY3Rvcnk7DQotDQotICAgIC8qKg0KLSAgICAgKiBVc2UgdGhlIGFydGlmYWN0SWQgYXMgZm9sZGVyDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW1ldGVyDQotICAgICAqLw0KLSAgICBwcml2YXRlIGJvb2xlYW4gdXNlQXJ0aWZhY3RJZDsNCi0NCi0gICAgLyoqDQotICAgICAqIEBjb21wb25lbnQNCi0gICAgICovDQotICAgIHByaXZhdGUgSmF2YXNjcmlwdEFydGlmYWN0TWFuYWdlciBqYXZhc2NyaXB0QXJ0aWZhY3RNYW5hZ2VyOw0KLQ0KLSAgICAvKioNCi0gICAgICoge0Bpbmhlcml0RG9jfQ0KLSAgICAgKiANCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5Nb2pvI2V4ZWN1dGUoKQ0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpDQotICAgICAgICB0aHJvd3MgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbiwgTW9qb0ZhaWx1cmVFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgdHJ5DQotICAgICAgICB7DQotICAgICAgICAgICAgamF2YXNjcmlwdEFydGlmYWN0TWFuYWdlci51bnBhY2soIHByb2plY3QsIERlZmF1bHRBcnRpZmFjdC5TQ09QRV9SVU5USU1FLCBuZXcgRmlsZSgNCi0gICAgICAgICAgICAgICAgd2FyU291cmNlRGlyZWN0b3J5LCBzY3JpcHRzRGlyZWN0b3J5ICsgIi8iICsgbGlic0RpcmVjdG9yeSApLCB1c2VBcnRpZmFjdElkICk7DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoIEFyY2hpdmVyRXhjZXB0aW9uIGUgKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uKCAiRmFpbGVkIHRvIHVucGFjayBqYXZhc2NyaXB0IGRlcGVuZGVuY2llcyIsIGUgKTsNCi0gICAgICAgIH0NCi0NCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2ptdC9QYWNrYWdlTW9qby5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qbXQvUGFja2FnZU1vam8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQ5ZjI0Zi4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2ptdC9QYWNrYWdlTW9qby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMyICswLDAgQEAKLS8qDQotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKiANCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICogDQotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LmptdDsNCi0NCi1pbXBvcnQgamF2YS5pby5GaWxlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5BYnN0cmFjdE1vam87DQotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLk1vam9FeGVjdXRpb25FeGNlcHRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucHJvamVjdC5NYXZlblByb2plY3Q7DQotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucHJvamVjdC5NYXZlblByb2plY3RIZWxwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5qbXQuYXJjaGl2ZS5KYXZhc2NyaXB0QXJjaGl2ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5qbXQuYXJjaGl2ZS5UeXBlczsNCi0NCi0vKioNCi0gKiBHb2FsIHdoaWNoIHBhY2thZ2VzIHNjcmlwdHMgYW5kIHJlc291cmNlcyBhcyBhIGphdmFzY3JpcHQgYXJjaGl2ZSB0byBiZQ0KLSAqIGluc3RhbGxlZCAvIGRlcGxveWVkIGluIG1hdmVuIHJlcG9zaXRvcmllcy4NCi0gKiANCi0gKiBAZ29hbCBwYWNrYWdlDQotICogQHBoYXNlIHBhY2thZ2UNCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpuaWNvbGFzQGFwYWNoZS5vcmciPk5pY29sYXMgRGUgTG9vZjwvYT4NCi0gKi8NCi1wdWJsaWMgY2xhc3MgUGFja2FnZU1vam8NCi0gICAgZXh0ZW5kcyBBYnN0cmFjdE1vam8NCi17DQotICAgIC8qKg0KLSAgICAgKiBUaGUgbWF2ZW4gcHJvamVjdC4NCi0gICAgICogDQotICAgICAqIEBwYXJhbWV0ZXIgZXhwcmVzc2lvbj0iJHtwcm9qZWN0fSINCi0gICAgICogQHJlcXVpcmVkDQotICAgICAqIEByZWFkb25seQ0KLSAgICAgKi8NCi0gICAgcHJpdmF0ZSBNYXZlblByb2plY3QgcHJvamVjdDsNCi0NCi0gICAgLyoqDQotICAgICAqIEBjb21wb25lbnQNCi0gICAgICovDQotICAgIE1hdmVuUHJvamVjdEhlbHBlciBwcm9qZWN0SGVscGVyOw0KLQ0KLSAgICAvKioNCi0gICAgICogVGhlIG91dHB1dCBkaXJlY3Rvcnkgb2YgdGhlIGpzIGZpbGUuDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW1ldGVyIGRlZmF1bHQtdmFsdWU9IiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9Ig0KLSAgICAgKi8NCi0gICAgcHJpdmF0ZSBGaWxlIG91dHB1dERpcmVjdG9yeTsNCi0NCi0gICAgLyoqDQotICAgICAqIFRoZSBmaWxlbmFtZSBvZiB0aGUganMgZmlsZS4NCi0gICAgICogDQotICAgICAqIEBwYXJhbWV0ZXIgZGVmYXVsdC12YWx1ZT0iJHtwcm9qZWN0LmJ1aWxkLmZpbmFsTmFtZX0iDQotICAgICAqLw0KLSAgICBwcml2YXRlIFN0cmluZyBmaW5hbE5hbWU7DQotDQotICAgIC8qKg0KLSAgICAgKiBQbGV4dXMgYXJjaGl2ZXIuDQotICAgICAqIA0KLSAgICAgKiBAY29tcG9uZW50IHJvbGU9Im9yZy5jb2RlaGF1cy5wbGV4dXMuYXJjaGl2ZXIuQXJjaGl2ZXIiIHJvbGUtaGludD0iamF2YXNjcmlwdCINCi0gICAgICogQHJlcXVpcmVkDQotICAgICAqLw0KLSAgICBwcml2YXRlIEphdmFzY3JpcHRBcmNoaXZlciBhcmNoaXZlcjsNCi0NCi0gICAgLyoqDQotICAgICAqIE9wdGlvbmFsIGNsYXNzaWZpZXINCi0gICAgICogDQotICAgICAqIEBwYXJhbWV0ZXINCi0gICAgICovDQotICAgIHByaXZhdGUgU3RyaW5nIGNsYXNzaWZpZXI7DQotDQotICAgIC8qKg0KLSAgICAgKiBAcGFyYW1ldGVyDQotICAgICAqLw0KLSAgICBwcml2YXRlIEZpbGUgbWFuaWZlc3Q7DQotDQotICAgIC8qKg0KLSAgICAgKiBMb2NhdGlvbiBvZiB0aGUgc2NyaXB0cyBmaWxlcy4NCi0gICAgICogDQotICAgICAqIEBwYXJhbWV0ZXIgZGVmYXVsdC12YWx1ZT0iJHtwcm9qZWN0LmJ1aWxkLm91dHB1dERpcmVjdG9yeX0iDQotICAgICAqLw0KLSAgICBwcml2YXRlIEZpbGUgc2NyaXB0c0RpcmVjdG9yeTsNCi0NCi0gICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpDQotICAgICAgICB0aHJvd3MgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBGaWxlIGpzYXJjaGl2ZSA9IG5ldyBGaWxlKCBvdXRwdXREaXJlY3RvcnksIGZpbmFsTmFtZSArICIuIiArIFR5cGVzLkpBVkFTQ1JJUFRfRVhURU5TSU9OICk7DQotICAgICAgICB0cnkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAoIG1hbmlmZXN0ICE9IG51bGwgKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgYXJjaGl2ZXIuc2V0TWFuaWZlc3QoIG1hbmlmZXN0ICk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGFyY2hpdmVyLmNyZWF0ZURlZmF1bHRNYW5pZmVzdCggcHJvamVjdCApOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBhcmNoaXZlci5hZGREaXJlY3RvcnkoIHNjcmlwdHNEaXJlY3RvcnkgKTsNCi0gICAgICAgICAgICBTdHJpbmcgZ3JvdXBJZCA9IHByb2plY3QuZ2V0R3JvdXBJZCgpOw0KLSAgICAgICAgICAgIFN0cmluZyBhcnRpZmFjdElkID0gcHJvamVjdC5nZXRBcnRpZmFjdElkKCk7DQotICAgICAgICAgICAgYXJjaGl2ZXIuYWRkRmlsZSggcHJvamVjdC5nZXRGaWxlKCksICJNRVRBLUlORi9tYXZlbi8iICsgZ3JvdXBJZCArICIvIiArIGFydGlmYWN0SWQNCi0gICAgICAgICAgICAgICAgKyAiL3BvbS54bWwiICk7DQotICAgICAgICAgICAgYXJjaGl2ZXIuc2V0RGVzdEZpbGUoIGpzYXJjaGl2ZSApOw0KLSAgICAgICAgICAgIGFyY2hpdmVyLmNyZWF0ZUFyY2hpdmUoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoICggRXhjZXB0aW9uIGUgKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uKCAiRmFpbGVkIHRvIGNyZWF0ZSB0aGUgamF2YXNjcmlwdCBhcmNoaXZlIiwgZSApOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYgKCBjbGFzc2lmaWVyICE9IG51bGwgKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHByb2plY3RIZWxwZXIuYXR0YWNoQXJ0aWZhY3QoIHByb2plY3QsIFR5cGVzLkpBVkFTQ1JJUFRfVFlQRSwgY2xhc3NpZmllciwganNhcmNoaXZlICk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgcHJvamVjdC5nZXRBcnRpZmFjdCgpLnNldEZpbGUoIGpzYXJjaGl2ZSApOw0KLSAgICAgICAgfQ0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvam10L1dhclBhY2thZ2VNb2pvLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2ptdC9XYXJQYWNrYWdlTW9qby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MTdmZWE3Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvam10L1dhclBhY2thZ2VNb2pvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi0vKg0KLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICogDQotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqIA0KLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqICB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5qbXQ7DQotDQotaW1wb3J0IGphdmEuaW8uRmlsZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5hcnRpZmFjdC5EZWZhdWx0QXJ0aWZhY3Q7DQotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLk1vam9FeGVjdXRpb25FeGNlcHRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLk1vam9GYWlsdXJlRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuam10LmFyY2hpdmUuSmF2YXNjcmlwdEFydGlmYWN0TWFuYWdlcjsNCi1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy5hcmNoaXZlci5BcmNoaXZlckV4Y2VwdGlvbjsNCi0NCi0vKioNCi0gKiBHb2FsIHRoYXQgcHJlcGFyZXMgc2NyaXB0cyBmb3IgcGFja2FnaW5nIGFzIGEgd2ViIGFwcGxpY2F0aW9uLg0KLSAqIA0KLSAqIEBnb2FsIHdhci1wYWNrYWdlDQotICogQHJlcXVpcmVzRGVwZW5kZW5jeVJlc29sdXRpb24gcnVudGltZQ0KLSAqIEBwaGFzZSBjb21waWxlDQotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86bmljb2xhc0BhcGFjaGUub3JnIj5OaWNvbGFzIERlIExvb2Y8L2E+DQotICovDQotcHVibGljIGNsYXNzIFdhclBhY2thZ2VNb2pvDQotICAgIGV4dGVuZHMgQ29tcGlsZU1vam8NCi17DQotDQotICAgIC8qKg0KLSAgICAgKiBUaGUgZGlyZWN0b3J5IHdoZXJlIHRoZSB3ZWJhcHAgaXMgYnVpbHQuDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW1ldGVyIGV4cHJlc3Npb249IiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9LyR7cHJvamVjdC5idWlsZC5maW5hbE5hbWV9Ig0KLSAgICAgKiBAcmVxdWlyZWQNCi0gICAgICovDQotICAgIHByaXZhdGUgRmlsZSB3ZWJhcHBEaXJlY3Rvcnk7DQotDQotICAgIC8qKg0KLSAgICAgKiBUaGUgZm9sZGVyIGluIHdlYmFwcCBmb3IgamF2YXNjcmlwdHMNCi0gICAgICogDQotICAgICAqIEBwYXJhbWV0ZXIgZXhwcmVzc2lvbj0iJHtzY3JpcHRzfSIgZGVmYXVsdC12YWx1ZT0ic2NyaXB0cyINCi0gICAgICovDQotICAgIHByaXZhdGUgU3RyaW5nIHNjcmlwdHNEaXJlY3Rvcnk7DQotDQotICAgIC8qKg0KLSAgICAgKiBUaGUgZm9sZGVyIGZvciBqYXZhc2NyaXB0cyBkZXBlbmRlbmNpZXMNCi0gICAgICogDQotICAgICAqIEBwYXJhbWV0ZXIgZXhwcmVzc2lvbj0iJHtzY3JpcHRzfSIgZGVmYXVsdC12YWx1ZT0ibGliIg0KLSAgICAgKi8NCi0gICAgcHJpdmF0ZSBTdHJpbmcgbGlic0RpcmVjdG9yeTsNCi0NCi0gICAgLyoqDQotICAgICAqIFVzZSB0aGUgYXJ0aWZhY3RJZCBhcyBmb2xkZXINCi0gICAgICogDQotICAgICAqIEBwYXJhbWV0ZXINCi0gICAgICovDQotICAgIHByaXZhdGUgYm9vbGVhbiB1c2VBcnRpZmFjdElkOw0KLQ0KLSAgICAvKioNCi0gICAgICogQGNvbXBvbmVudCANCi0gICAgICovDQotICAgIHByaXZhdGUgSmF2YXNjcmlwdEFydGlmYWN0TWFuYWdlciBqYXZhc2NyaXB0QXJ0aWZhY3RNYW5hZ2VyOw0KLQ0KLSAgICAvKioNCi0gICAgICoge0Bpbmhlcml0RG9jfQ0KLSAgICAgKiANCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5Nb2pvI2V4ZWN1dGUoKQ0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpDQotICAgICAgICB0aHJvd3MgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbiwgTW9qb0ZhaWx1cmVFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgc3VwZXIub3V0cHV0RGlyZWN0b3J5ID0gbmV3IEZpbGUoIHdlYmFwcERpcmVjdG9yeSwgc2NyaXB0c0RpcmVjdG9yeSApOw0KLSAgICAgICAgc3VwZXIuZXhlY3V0ZSgpOw0KLQ0KLSAgICAgICAgdHJ5DQotICAgICAgICB7DQotICAgICAgICAgICAgamF2YXNjcmlwdEFydGlmYWN0TWFuYWdlci51bnBhY2soIGdldFByb2plY3QoKSwgRGVmYXVsdEFydGlmYWN0LlNDT1BFX1JVTlRJTUUsDQotICAgICAgICAgICAgICAgIG5ldyBGaWxlKCB3ZWJhcHBEaXJlY3RvcnksIHNjcmlwdHNEaXJlY3RvcnkgKyAiLyIgKyBsaWJzRGlyZWN0b3J5ICksIHVzZUFydGlmYWN0SWQgKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoICggQXJjaGl2ZXJFeGNlcHRpb24gZSApDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhyb3cgbmV3IE1vam9FeGVjdXRpb25FeGNlcHRpb24oICJGYWlsZWQgdG8gdW5wYWNrIGphdmFzY3JpcHQgZGVwZW5kZW5jaWVzIiwgZSApOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotfQ0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvam10L1dlYmFwcENvbXByZXNzTW9qby5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qbXQvV2ViYXBwQ29tcHJlc3NNb2pvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzYzQ5NzAuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qbXQvV2ViYXBwQ29tcHJlc3NNb2pvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vKg0KLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICogDQotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqIA0KLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqICB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5qbXQ7DQotDQotaW1wb3J0IGphdmEuaW8uRmlsZTsNCi0NCi0vKioNCi0gKiBHb2FsIHRvIGJlIHVzZWQgZnJvbSBhIHdhciBwcm9qZWN0LCB0byBjb21wcmVzcyB0aGUgc2NyaXB0cyBwcmVzZW50IGluIHRoZQ0KLSAqIHdlYmFwcCBwYWNrYWdpbmcgZm9sZGVyLiBDb25maWd1cmVkIHRvIHJ1biBpbiB0aGUgdGVzdCBwaGFzZSBhcyB0aGVyZSBpcyBubw0KLSAqIHdheSAoaW4gbWF2ZW4gMi4wKSB0byBydW4gYmV0d2VlbiBleHBsb2RlZCB3ZWJhcHAgYXNzZW1ibHkgYW5kIC53YXINCi0gKiBwYWNrYWdpbmcuDQotICogDQotICogQGdvYWwgY29tcHJlc3MNCi0gKiBAcGhhc2UgdGVzdA0KLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOm5pY29sYXNAYXBhY2hlLm9yZyI+bmljb2xhcyBEZSBMb29mPC9hPg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBXZWJhcHBDb21wcmVzc01vam8NCi0gICAgZXh0ZW5kcyBBYnN0cmFjdENvbXByZXNzTW9qbw0KLXsNCi0NCi0gICAgLyoqDQotICAgICAqIFRoZSBkaXJlY3Rvcnkgd2hlcmUgdGhlIHdlYmFwcCBpcyBidWlsdC4NCi0gICAgICogDQotICAgICAqIEBwYXJhbWV0ZXIgZXhwcmVzc2lvbj0iJHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vJHtwcm9qZWN0LmJ1aWxkLmZpbmFsTmFtZX0iDQotICAgICAqIEByZXF1aXJlZA0KLSAgICAgKi8NCi0gICAgcHJpdmF0ZSBGaWxlIHdlYmFwcERpcmVjdG9yeTsNCi0NCi0gICAgLyoqDQotICAgICAqIEZvbGRlciBpbiB3ZWJhcHAgY29udGFpbmluZyBqYXZhc2NyaXB0cw0KLSAgICAgKiANCi0gICAgICogQHBhcmFtZXRlciBkZWZhdWx0LXZhbHVlPSJzY3JpcHRzIg0KLSAgICAgKi8NCi0gICAgcHJpdmF0ZSBTdHJpbmcgc2NyaXB0czsNCi0NCi0gICAgLyoqDQotICAgICAqIGNsYXNzaWZpZXIgZm9yIHRoZSBjb21wcmVzc2VkIGFydGlmYWN0LiBJZiBub3Qgc2V0LCBjb21wcmVzc2VkIHNjcmlwdA0KLSAgICAgKiB3aWxsIHJlcGxhY2UgdW5jb21wcmVzc2VkIG9uZXMsIGFuZCB3aWxsIGFwcGx5IHdpdGhvdXQgYW55IGNoYW5nZSBpbg0KLSAgICAgKiBIVE1ML0pTUC4NCi0gICAgICogDQotICAgICAqIEBwYXJhbWV0ZXINCi0gICAgICovDQotICAgIHByaXZhdGUgU3RyaW5nIGNsYXNzaWZpZXI7DQotDQotICAgIC8qKg0KLSAgICAgKiB7QGluaGVyaXREb2N9DQotICAgICAqIA0KLSAgICAgKiBAc2VlIG9yZy5jb2RlaGF1cy5tb2pvLmphdmFzY3JpcHQuQWJzdHJhY3RDb21wcmVzc01vam8jZ2V0RXh0ZW5zaW9uKCkNCi0gICAgICovDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RXh0ZW5zaW9uKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGNsYXNzaWZpZXI7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIHtAaW5oZXJpdERvY30NCi0gICAgICogDQotICAgICAqIEBzZWUgb3JnLmNvZGVoYXVzLm1vam8uamF2YXNjcmlwdC5BYnN0cmFjdENvbXByZXNzTW9qbyNnZXRPdXRwdXREaXJlY3RvcnkoKQ0KLSAgICAgKi8NCi0gICAgcHJvdGVjdGVkIEZpbGUgZ2V0T3V0cHV0RGlyZWN0b3J5KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGdldFNvdXJjZURpcmVjdG9yeSgpOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiB7QGluaGVyaXREb2N9DQotICAgICAqIA0KLSAgICAgKiBAc2VlIG9yZy5jb2RlaGF1cy5tb2pvLmphdmFzY3JpcHQuQWJzdHJhY3RDb21wcmVzc01vam8jZ2V0U291cmNlRGlyZWN0b3J5KCkNCi0gICAgICovDQotICAgIHByb3RlY3RlZCBGaWxlIGdldFNvdXJjZURpcmVjdG9yeSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuZXcgRmlsZSggd2ViYXBwRGlyZWN0b3J5LCBzY3JpcHRzICk7DQotICAgIH0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qbXQvYXJjaGl2ZS9KYXZhc2NyaXB0QXJjaGl2ZXIuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvam10L2FyY2hpdmUvSmF2YXNjcmlwdEFyY2hpdmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0NGU3NzUuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qbXQvYXJjaGl2ZS9KYXZhc2NyaXB0QXJjaGl2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qDQotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKiANCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICogDQotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LmptdC5hcmNoaXZlOw0KLQ0KLWltcG9ydCBqYXZhLmlvLkZpbGU7DQotaW1wb3J0IGphdmEuaW8uRmlsZVdyaXRlcjsNCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wcm9qZWN0Lk1hdmVuUHJvamVjdDsNCi1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy5hcmNoaXZlci5BcmNoaXZlckV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy5hcmNoaXZlci5qYXIuSmFyQXJjaGl2ZXI7DQotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMuYXJjaGl2ZXIuamFyLk1hbmlmZXN0Ow0KLWltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLmFyY2hpdmVyLmphci5NYW5pZmVzdEV4Y2VwdGlvbjsNCi0NCi0vKioNCi0gKiBDdXN0b20gYXJjaGl2ZXIgZm9yIGphdmFzY3JpcHQgZGVwZW5kZW5jaWVzLCBwYWNrYWdlZCBhcyAianNhciIgKEphdmFTY3JpcHQNCi0gKiBBUmNoaXZlKSwgdGhhdCBhcmUgc2ltcGx5IGEgamFyIG9mIHNjcmlwdHMgYW5kIHJlc291cmNlcy4NCi0gKiANCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpuaWNvbGFzLmRlbG9vZkBnbWFpbC5jb20iPk5pY29sYXMgRGUgTG9vZjwvYT4NCi0gKiBAcGxleHVzLmNvbXBvbmVudCByb2xlPSJvcmcuY29kZWhhdXMucGxleHVzLmFyY2hpdmVyLkFyY2hpdmVyIg0KLSAqIHJvbGUtaGludD0iamF2YXNjcmlwdCIgaW5zdGFudGlhdGlvbi1zdHJhdGVneT0icGVyLWxvb2t1cCINCi0gKi8NCi1wdWJsaWMgY2xhc3MgSmF2YXNjcmlwdEFyY2hpdmVyDQotICAgIGV4dGVuZHMgSmFyQXJjaGl2ZXINCi17DQotICAgIC8qKg0KLSAgICAgKg0KLSAgICAgKi8NCi0gICAgcHVibGljIEphdmFzY3JpcHRBcmNoaXZlcigpDQotICAgIHsNCi0gICAgICAgIHN1cGVyKCk7DQotICAgICAgICBhcmNoaXZlVHlwZSA9IFR5cGVzLkpBVkFTQ1JJUFRfRVhURU5TSU9OOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIGNyZWF0ZURlZmF1bHRNYW5pZmVzdCggTWF2ZW5Qcm9qZWN0IHByb2plY3QgKQ0KLSAgICAgICAgdGhyb3dzIE1hbmlmZXN0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgQXJjaGl2ZXJFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgTWFuaWZlc3QgbWFuaWZlc3QgPSBuZXcgTWFuaWZlc3QoKTsNCi0gICAgICAgIE1hbmlmZXN0LkF0dHJpYnV0ZSBhdHRyID0gbmV3IE1hbmlmZXN0LkF0dHJpYnV0ZSggIkNyZWF0ZWQtQnkiLCAiQXBhY2hlIE1hdmVuIiApOw0KLSAgICAgICAgbWFuaWZlc3QuYWRkQ29uZmlndXJlZEF0dHJpYnV0ZSggYXR0ciApOw0KLSAgICAgICAgYXR0ciA9IG5ldyBNYW5pZmVzdC5BdHRyaWJ1dGUoICJJbXBsZW1lbnRhdGlvbi1UaXRsZSIsIHByb2plY3QuZ2V0TmFtZSgpICk7DQotICAgICAgICBtYW5pZmVzdC5hZGRDb25maWd1cmVkQXR0cmlidXRlKCBhdHRyICk7DQotICAgICAgICBhdHRyID0gbmV3IE1hbmlmZXN0LkF0dHJpYnV0ZSggIkltcGxlbWVudGF0aW9uLVZlcnNpb24iLCBwcm9qZWN0LmdldFZlcnNpb24oKSApOw0KLSAgICAgICAgbWFuaWZlc3QuYWRkQ29uZmlndXJlZEF0dHJpYnV0ZSggYXR0ciApOw0KLSAgICAgICAgYXR0ciA9IG5ldyBNYW5pZmVzdC5BdHRyaWJ1dGUoICJJbXBsZW1lbnRhdGlvbi1WZW5kb3ItSWQiLCBwcm9qZWN0LmdldEdyb3VwSWQoKSApOw0KLSAgICAgICAgbWFuaWZlc3QuYWRkQ29uZmlndXJlZEF0dHJpYnV0ZSggYXR0ciApOw0KLSAgICAgICAgaWYgKCBwcm9qZWN0LmdldE9yZ2FuaXphdGlvbigpICE9IG51bGwgKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIFN0cmluZyB2ZW5kb3IgPSBwcm9qZWN0LmdldE9yZ2FuaXphdGlvbigpLmdldE5hbWUoKTsNCi0gICAgICAgICAgICBhdHRyID0gbmV3IE1hbmlmZXN0LkF0dHJpYnV0ZSggIkltcGxlbWVudGF0aW9uLVZlbmRvciIsIHZlbmRvciApOw0KLSAgICAgICAgICAgIG1hbmlmZXN0LmFkZENvbmZpZ3VyZWRBdHRyaWJ1dGUoIGF0dHIgKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGF0dHIgPSBuZXcgTWFuaWZlc3QuQXR0cmlidXRlKCAiQnVpbHQtQnkiLCBTeXN0ZW0uZ2V0UHJvcGVydHkoICJ1c2VyLm5hbWUiICkgKTsNCi0gICAgICAgIG1hbmlmZXN0LmFkZENvbmZpZ3VyZWRBdHRyaWJ1dGUoIGF0dHIgKTsNCi0NCi0gICAgICAgIEZpbGUgbWYgPSBGaWxlLmNyZWF0ZVRlbXBGaWxlKCAibWF2ZW4iLCAiLm1mIiApOw0KLSAgICAgICAgbWYuZGVsZXRlT25FeGl0KCk7DQotICAgICAgICBQcmludFdyaXRlciB3cml0ZXIgPSBuZXcgUHJpbnRXcml0ZXIoIG5ldyBGaWxlV3JpdGVyKCBtZiApICk7DQotICAgICAgICBtYW5pZmVzdC53cml0ZSggd3JpdGVyICk7DQotICAgICAgICB3cml0ZXIuY2xvc2UoKTsNCi0gICAgICAgIHNldE1hbmlmZXN0KCBtZiApOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvam10L2FyY2hpdmUvSmF2YXNjcmlwdEFydGlmYWN0TWFuYWdlci5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qbXQvYXJjaGl2ZS9KYXZhc2NyaXB0QXJ0aWZhY3RNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhNDk1ZGEuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qbXQvYXJjaGl2ZS9KYXZhc2NyaXB0QXJ0aWZhY3RNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotLyoNCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqIA0KLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKiANCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuam10LmFyY2hpdmU7DQotDQotaW1wb3J0IGphdmEuaW8uRmlsZTsNCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOw0KLWltcG9ydCBqYXZhLnV0aWwuU2V0Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLmFydGlmYWN0LkFydGlmYWN0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLmFydGlmYWN0LnJlc29sdmVyLmZpbHRlci5BcnRpZmFjdEZpbHRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5hcnRpZmFjdC5yZXNvbHZlci5maWx0ZXIuU2NvcGVBcnRpZmFjdEZpbHRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wcm9qZWN0Lk1hdmVuUHJvamVjdDsNCi1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy5hcmNoaXZlci5BcmNoaXZlckV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy5hcmNoaXZlci5VbkFyY2hpdmVyOw0KLWltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLmxvZ2dpbmcuQWJzdHJhY3RMb2dFbmFibGVkOw0KLQ0KLS8qKg0KLSAqIEEgY29tcG9uZW50IHRvIGhhbmRsZSBqYXZhc2NyaXB0IGRlcGVuZGVuY2llcy4NCi0gKiANCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpuaWNvbGFzLmRlbG9vZkBnbWFpbC5jb20iPm5pY29sYXMgRGUgTG9vZjwvYT4NCi0gKiBAcGxleHVzLmNvbXBvbmVudCByb2xlPSJvcmcuY29kZWhhdXMubW9qby5qYXZhc2NyaXB0LmFyY2hpdmUuSmF2YXNjcmlwdEFydGlmYWN0TWFuYWdlciINCi0gKi8NCi1wdWJsaWMgY2xhc3MgSmF2YXNjcmlwdEFydGlmYWN0TWFuYWdlcg0KLSAgICBleHRlbmRzIEFic3RyYWN0TG9nRW5hYmxlZA0KLXsNCi0NCi0gICAgLyoqDQotICAgICAqIFBsZXh1cyB1bi1hcmNoaXZlci4NCi0gICAgICogDQotICAgICAqIEBwbGV4dXMucmVxdWlyZW1lbnQgcm9sZS1oaW50PSJqYXZhc2NyaXB0Ig0KLSAgICAgKi8NCi0gICAgcHJpdmF0ZSBVbkFyY2hpdmVyIGFyY2hpdmVyOw0KLQ0KLSAgICBwdWJsaWMgSmF2YXNjcmlwdEFydGlmYWN0TWFuYWdlcigpDQotICAgIHsNCi0gICAgICAgIHN1cGVyKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdW5wYWNrKCBNYXZlblByb2plY3QgcHJvamVjdCwgU3RyaW5nIHNjb3BlLCBGaWxlIHRhcmdldCwgYm9vbGVhbiB1c2VBcnRpZmFjdElkICkNCi0gICAgICAgIHRocm93cyBBcmNoaXZlckV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBhcmNoaXZlci5zZXRPdmVyd3JpdGUoIGZhbHNlICk7DQotDQotICAgICAgICBTZXQgZGVwZW5kZW5jaWVzID0gcHJvamVjdC5nZXRBcnRpZmFjdHMoKTsNCi0gICAgICAgIEFydGlmYWN0RmlsdGVyIHJ1bnRpbWUgPSBuZXcgU2NvcGVBcnRpZmFjdEZpbHRlciggc2NvcGUgKTsNCi0gICAgICAgIGZvciAoIEl0ZXJhdG9yIGl0ZXJhdG9yID0gZGVwZW5kZW5jaWVzLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTsgKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIEFydGlmYWN0IGRlcGVuZGVuY3kgPSAoQXJ0aWZhY3QpIGl0ZXJhdG9yLm5leHQoKTsNCi0gICAgICAgICAgICBpZiAoICFkZXBlbmRlbmN5LmlzT3B0aW9uYWwoKSAmJiBUeXBlcy5KQVZBU0NSSVBUX1RZUEUuZXF1YWxzKCBkZXBlbmRlbmN5LmdldFR5cGUoKSApDQotICAgICAgICAgICAgICAgICYmIHJ1bnRpbWUuaW5jbHVkZSggZGVwZW5kZW5jeSApICkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGdldExvZ2dlcigpLmluZm8oICJVbnBhY2sgamF2YXNjcmlwdCBkZXBlbmRlbmN5IFsiICsgZGVwZW5kZW5jeS50b1N0cmluZygpICsgIl0iICk7DQotICAgICAgICAgICAgICAgIGFyY2hpdmVyLnNldFNvdXJjZUZpbGUoIGRlcGVuZGVuY3kuZ2V0RmlsZSgpICk7DQotDQotICAgICAgICAgICAgICAgIEZpbGUgZGVzdCA9IHRhcmdldDsNCi0gICAgICAgICAgICAgICAgaWYgKCB1c2VBcnRpZmFjdElkICkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgZGVzdCA9IG5ldyBGaWxlKCB0YXJnZXQsIGRlcGVuZGVuY3kuZ2V0QXJ0aWZhY3RJZCgpICk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgdW5wYWNrKCBkZXBlbmRlbmN5LCBkZXN0ICk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKg0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgdW5wYWNrKCBBcnRpZmFjdCBhcnRpZmFjdCwgRmlsZSB0YXJnZXQgKQ0KLSAgICAgICAgdGhyb3dzIEFyY2hpdmVyRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIGFyY2hpdmVyLnNldFNvdXJjZUZpbGUoIGFydGlmYWN0LmdldEZpbGUoKSApOw0KLSAgICAgICAgdGFyZ2V0Lm1rZGlycygpOw0KLSAgICAgICAgYXJjaGl2ZXIuc2V0RGVzdERpcmVjdG9yeSggdGFyZ2V0ICk7DQotICAgICAgICBhcmNoaXZlci5zZXRPdmVyd3JpdGUoIGZhbHNlICk7DQotICAgICAgICB0cnkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBhcmNoaXZlci5leHRyYWN0KCk7DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoIEV4Y2VwdGlvbiBlICkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgQXJjaGl2ZXJFeGNlcHRpb24oICJGYWlsZWQgdG8gZXh0cmFjdCBqYXZhc2NyaXB0IGFydGlmYWN0IHRvICIgKyB0YXJnZXQsIGUgKTsNCi0gICAgICAgIH0NCi0NCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2ptdC9hcmNoaXZlL0phdmFzY3JpcHRVbkFyY2hpdmVyLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2ptdC9hcmNoaXZlL0phdmFzY3JpcHRVbkFyY2hpdmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkODViNmEuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qbXQvYXJjaGl2ZS9KYXZhc2NyaXB0VW5BcmNoaXZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoNCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqIA0KLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKiANCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuam10LmFyY2hpdmU7DQotDQotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07DQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247DQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsNCi0NCi1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy5hcmNoaXZlci5BcmNoaXZlckV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy5hcmNoaXZlci5BcmNoaXZlRmlsZUZpbHRlcjsNCi1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy5hcmNoaXZlci5BcmNoaXZlRmlsdGVyRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLmFyY2hpdmVyLnppcC5aaXBVbkFyY2hpdmVyOw0KLQ0KLS8qKg0KLSAqIEN1c3RvbSBhcmNoaXZlciBmb3IgamF2YXNjcmlwdCBkZXBlbmRlbmNpZXMsIHBhY2thZ2VkIGFzICJqc2FyIiAoSmF2YVNjcmlwdA0KLSAqIEFSY2hpdmUpLCB0aGF0IGFyZSBzaW1wbHkgYSBqYXIgb2Ygc2NyaXB0cyBhbmQgcmVzb3VyY2VzLg0KLSAqIA0KLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOm5pY29sYXMuZGVsb29mQGdtYWlsLmNvbSI+Tmljb2xhcyBEZSBMb29mPC9hPg0KLSAqIEBwbGV4dXMuY29tcG9uZW50IHJvbGU9Im9yZy5jb2RlaGF1cy5wbGV4dXMuYXJjaGl2ZXIuVW5BcmNoaXZlciINCi0gKiByb2xlLWhpbnQ9ImphdmFzY3JpcHQiDQotICovDQotcHVibGljIGNsYXNzIEphdmFzY3JpcHRVbkFyY2hpdmVyDQotICAgIGV4dGVuZHMgWmlwVW5BcmNoaXZlcg0KLXsNCi0gICAgLyoqDQotICAgICAqDQotICAgICAqLw0KLSAgICBwdWJsaWMgSmF2YXNjcmlwdFVuQXJjaGl2ZXIoKQ0KLSAgICB7DQotICAgICAgICBzdXBlcigpOw0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogb3ZlcndyaXRlIHRoZSBzdXBlci5leHRyYWN0KCkgdG8gc2V0IHRoZSBkZWZhdWx0IGZpbHRlci4NCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIGV4dHJhY3QoKSB0aHJvd3MgQXJjaGl2ZXJFeGNlcHRpb24sIElPRXhjZXB0aW9uIA0KLSAgICB7DQotICAgICAgICBzZXRBcmNoaXZlRmlsdGVycyggQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdCggbmV3IEFyY2hpdmVGaWxlRmlsdGVyKCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBpbmNsdWRlKCBJbnB1dFN0cmVhbSBkYXRhU3RyZWFtLCBTdHJpbmcgZW50cnlOYW1lICkNCi0gICAgICAgICAgICAgICAgdGhyb3dzIEFyY2hpdmVGaWx0ZXJFeGNlcHRpb24NCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiAhZW50cnlOYW1lLnN0YXJ0c1dpdGgoICJNRVRBLUlORiIgKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9ICkgKTsNCi0gICAgICAgIHN1cGVyLmV4dHJhY3QoKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2ptdC9hcmNoaXZlL1R5cGVzLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2ptdC9hcmNoaXZlL1R5cGVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3N2E4MGYuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qbXQvYXJjaGl2ZS9UeXBlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoNCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqIA0KLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKiANCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuam10LmFyY2hpdmU7DQotDQotLyoqDQotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86bmljb2xhcy5kZWxvb2ZAZ21haWwuY29tIj5uaWNvbGFzIERlIExvb2Y8L2E+DQotICovDQotcHVibGljIGNsYXNzIFR5cGVzDQotew0KLQ0KLSAgICAvKioNCi0gICAgICogdHlwZSBmb3IgZGVwZW5kZW5jaWVzIGhhbmRsZWQgYnkgdGhlIHBsdWdpbg0KLSAgICAgKi8NCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFWQVNDUklQVF9UWVBFID0gImphdmFzY3JpcHQiOw0KLQ0KLSAgICAvKioNCi0gICAgICogZXh0ZW5zaW9uIGZvciBkZXBlbmRlbmNpZXMgaGFuZGxlZCBieSB0aGUgcGx1Z2luDQotICAgICAqLw0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKQVZBU0NSSVBUX0VYVEVOU0lPTiA9ICJqYXIiOw0KLQ0KLX0NCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2ptdC9hc3NlbWJsZXIvQXNzZW1ibGVyUmVhZGVyLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2ptdC9hc3NlbWJsZXIvQXNzZW1ibGVyUmVhZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1Yjg2YzcuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qbXQvYXNzZW1ibGVyL0Fzc2VtYmxlclJlYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoNCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqIA0KLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKiANCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuam10LmFzc2VtYmxlcjsNCi0NCi1pbXBvcnQgamF2YS5pby5GaWxlOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOm5pY29sYXNAYXBhY2hlLm9yZyI+Tmljb2xhcyBEZSBMb29mPC9hPg0KLSAqLw0KLXB1YmxpYyBpbnRlcmZhY2UgQXNzZW1ibGVyUmVhZGVyDQotew0KLSAgICBTdHJpbmcgUk9MRSA9IEFzc2VtYmxlclJlYWRlci5jbGFzcy5nZXROYW1lKCk7DQotDQotICAgIEFzc2VtYmxlciBnZXRBc3NlbWJsZXIoIEZpbGUgZmlsZSApDQotICAgICAgICB0aHJvd3MgRXhjZXB0aW9uOw0KLX0NCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2ptdC9hc3NlbWJsZXIvQXNzZW1ibGVyUmVhZGVyTWFuYWdlci5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qbXQvYXNzZW1ibGVyL0Fzc2VtYmxlclJlYWRlck1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjUzOGJkNi4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2ptdC9hc3NlbWJsZXIvQXNzZW1ibGVyUmVhZGVyTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoNCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqIA0KLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKiANCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuam10LmFzc2VtYmxlcjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpuaWNvbGFzQGFwYWNoZS5vcmciPk5pY29sYXMgRGUgTG9vZjwvYT4NCi0gKi8NCi1wdWJsaWMgaW50ZXJmYWNlIEFzc2VtYmxlclJlYWRlck1hbmFnZXINCi17DQotICAgIFN0cmluZyBST0xFID0gQXNzZW1ibGVyUmVhZGVyTWFuYWdlci5jbGFzcy5nZXROYW1lKCk7DQotDQotICAgIEFzc2VtYmxlclJlYWRlciBnZXRBc3NlbWJsZXJSZWFkZXIoIFN0cmluZyBuYW1lICkNCi0gICAgICAgIHRocm93cyBOb1N1Y2hBc3NlbWJsZXJSZWFkZXJFeGNlcHRpb247DQotfQ0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvam10L2Fzc2VtYmxlci9EZWZhdWx0QXNzZW1ibGVyUmVhZGVyLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2ptdC9hc3NlbWJsZXIvRGVmYXVsdEFzc2VtYmxlclJlYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTljNWE5Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvam10L2Fzc2VtYmxlci9EZWZhdWx0QXNzZW1ibGVyUmVhZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKg0KLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICogDQotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqIA0KLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqICB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5qbXQuYXNzZW1ibGVyOw0KLQ0KLWltcG9ydCBqYXZhLmlvLkZpbGU7DQotaW1wb3J0IGphdmEuaW8uRmlsZVJlYWRlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LmptdC5hc3NlbWJsZXIuaW8ueHBwMy5Bc3NlbWJsZXJYcHAzUmVhZGVyOw0KLWltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLmxvZ2dpbmcuTG9nRW5hYmxlZDsNCi1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy5sb2dnaW5nLkxvZ2dlcjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpuaWNvbGFzQGFwYWNoZS5vcmciPk5pY29sYXMgRGUgTG9vZjwvYT4NCi0gKi8NCi1wdWJsaWMgY2xhc3MgRGVmYXVsdEFzc2VtYmxlclJlYWRlcg0KLSAgICBpbXBsZW1lbnRzIEFzc2VtYmxlclJlYWRlciwgTG9nRW5hYmxlZA0KLXsNCi0gICAgcHJpdmF0ZSBMb2dnZXIgbG9nZ2VyOw0KLQ0KLSAgICAvKioNCi0gICAgICoge0Bpbmhlcml0RG9jfQ0KLSAgICAgKiANCi0gICAgICogQHNlZSBvcmcuY29kZWhhdXMucGxleHVzLmxvZ2dpbmcuTG9nRW5hYmxlZCNlbmFibGVMb2dnaW5nKG9yZy5jb2RlaGF1cy5wbGV4dXMubG9nZ2luZy5Mb2dnZXIpDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCBlbmFibGVMb2dnaW5nKCBMb2dnZXIgbG9nZ2VyICkNCi0gICAgew0KLSAgICAgICAgdGhpcy5sb2dnZXIgPSBsb2dnZXI7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIHtAaW5oZXJpdERvY30NCi0gICAgICogDQotICAgICAqIEBzZWUgb3JnLmNvZGVoYXVzLm1vam8uamF2YXNjcmlwdC5hc3NlbWJsZXIuQXNzZW1ibGVyUmVhZGVyI2dldEFzc2VtYmxlcihqYXZhLmlvLkZpbGUpDQotICAgICAqLw0KLSAgICBwdWJsaWMgQXNzZW1ibGVyIGdldEFzc2VtYmxlciggRmlsZSBmaWxlICkNCi0gICAgICAgIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgQXNzZW1ibGVyWHBwM1JlYWRlciByZWFkZXIgPSBuZXcgQXNzZW1ibGVyWHBwM1JlYWRlcigpOw0KLSAgICAgICAgdHJ5DQotICAgICAgICB7DQotICAgICAgICAgICAgbG9nZ2VyLmluZm8oICJSZWFkaW5nIGFzc2VtYmxlciBkZXNjcmlwdG9yICIgKyBmaWxlLmdldEFic29sdXRlUGF0aCgpICk7DQotICAgICAgICAgICAgcmV0dXJuIHJlYWRlci5yZWFkKCBuZXcgRmlsZVJlYWRlciggZmlsZSApICk7DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoIEV4Y2VwdGlvbiBlICkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbiggIkZhaWxlZCB0byByZWFkIHRoZSBzY3JpcHQgYXNzZW1ibGVyIGRlc2NyaXB0b3IiLCBlICk7DQotICAgICAgICB9DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qbXQvYXNzZW1ibGVyL0RlZmF1bHRBc3NlbWJsZXJSZWFkZXJNYW5hZ2VyLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2ptdC9hc3NlbWJsZXIvRGVmYXVsdEFzc2VtYmxlclJlYWRlck1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWEyNWY0Zi4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2ptdC9hc3NlbWJsZXIvRGVmYXVsdEFzc2VtYmxlclJlYWRlck1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8qDQotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKiANCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICogDQotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LmptdC5hc3NlbWJsZXI7DQotDQotaW1wb3J0IGphdmEuaW8uRmlsZTsNCi0NCi1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy5QbGV4dXNDb25zdGFudHM7DQotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMuUGxleHVzQ29udGFpbmVyOw0KLWltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLmNvbXBvbmVudC5yZXBvc2l0b3J5LmV4Y2VwdGlvbi5Db21wb25lbnRMb29rdXBFeGNlcHRpb247DQotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMuY29udGV4dC5Db250ZXh0Ow0KLWltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLmNvbnRleHQuQ29udGV4dEV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy5wZXJzb25hbGl0eS5wbGV4dXMubGlmZWN5Y2xlLnBoYXNlLkNvbnRleHR1YWxpemFibGU7DQotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMudXRpbC5GaWxlVXRpbHM7DQotDQotLyoqDQotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86bmljb2xhc0BhcGFjaGUub3JnIj5OaWNvbGFzIERlIExvb2Y8L2E+DQotICovDQotcHVibGljIGNsYXNzIERlZmF1bHRBc3NlbWJsZXJSZWFkZXJNYW5hZ2VyDQotICAgIGltcGxlbWVudHMgQXNzZW1ibGVyUmVhZGVyTWFuYWdlciwgQ29udGV4dHVhbGl6YWJsZQ0KLXsNCi0gICAgcHJpdmF0ZSBQbGV4dXNDb250YWluZXIgY29udGFpbmVyOw0KLQ0KLSAgICBwdWJsaWMgdm9pZCBjb250ZXh0dWFsaXplKCBDb250ZXh0IGNvbnRleHQgKQ0KLSAgICAgICAgdGhyb3dzIENvbnRleHRFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgY29udGFpbmVyID0gKFBsZXh1c0NvbnRhaW5lcikgY29udGV4dC5nZXQoIFBsZXh1c0NvbnN0YW50cy5QTEVYVVNfS0VZICk7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIHtAaW5oZXJpdERvY30NCi0gICAgICogDQotICAgICAqIEBzZWUgb3JnLmNvZGVoYXVzLm1vam8uamF2YXNjcmlwdC5hc3NlbWJsZXIuQXNzZW1ibGVyUmVhZGVyTWFuYWdlciNnZXRBc3NlbWJsZXJSZWFkZXIoamF2YS5pby5GaWxlKQ0KLSAgICAgKi8NCi0gICAgcHVibGljIEFzc2VtYmxlclJlYWRlciBnZXRBc3NlbWJsZXJSZWFkZXIoIEZpbGUgZmlsZSApDQotICAgICAgICB0aHJvd3MgTm9TdWNoQXNzZW1ibGVyUmVhZGVyRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBleHQgPSBGaWxlVXRpbHMuZ2V0RXh0ZW5zaW9uKCBmaWxlLmdldE5hbWUoKSApLnRvTG93ZXJDYXNlKCk7DQotICAgICAgICBpZiAoICJ4bWwiLmVxdWFscyggZXh0ICkgKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBnZXRBc3NlbWJsZXJSZWFkZXIoICJkZWZhdWx0IiApOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIGdldEFzc2VtYmxlclJlYWRlciggZXh0ICk7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIHtAaW5oZXJpdERvY30NCi0gICAgICogDQotICAgICAqIEBzZWUgb3JnLmNvZGVoYXVzLm1vam8uamF2YXNjcmlwdC5hc3NlbWJsZXIuQXNzZW1ibGVyUmVhZGVyTWFuYWdlciNnZXRBc3NlbWJsZXJSZWFkZXIoamF2YS5sYW5nLlN0cmluZykNCi0gICAgICovDQotICAgIHB1YmxpYyBBc3NlbWJsZXJSZWFkZXIgZ2V0QXNzZW1ibGVyUmVhZGVyKCBTdHJpbmcgbmFtZSApDQotICAgICAgICB0aHJvd3MgTm9TdWNoQXNzZW1ibGVyUmVhZGVyRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiAoQXNzZW1ibGVyUmVhZGVyKSBjb250YWluZXIubG9va3VwKCBBc3NlbWJsZXJSZWFkZXIuUk9MRSwgbmFtZSApOw0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKCBDb21wb25lbnRMb29rdXBFeGNlcHRpb24gZSApDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhyb3cgbmV3IE5vU3VjaEFzc2VtYmxlclJlYWRlckV4Y2VwdGlvbiggbmFtZSApOw0KLSAgICAgICAgfQ0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvam10L2Fzc2VtYmxlci9Kc0J1aWxkZXJBc3NlbWJsZXJSZWFkZXIuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvam10L2Fzc2VtYmxlci9Kc0J1aWxkZXJBc3NlbWJsZXJSZWFkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzgyZmZhZC4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2ptdC9hc3NlbWJsZXIvSnNCdWlsZGVyQXNzZW1ibGVyUmVhZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi0vKg0KLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICogDQotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqIA0KLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqICB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5qbXQuYXNzZW1ibGVyOw0KLQ0KLWltcG9ydCBqYXZhLmlvLkZpbGU7DQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotDQotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlcjsNCi1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyRmFjdG9yeTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmp4cGF0aC5KWFBhdGhDb250ZXh0Ow0KLWltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLmxvZ2dpbmcuTG9nRW5hYmxlZDsNCi1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy5sb2dnaW5nLkxvZ2dlcjsNCi1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7DQotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7DQotDQotLyoqDQotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86bmljb2xhc0BhcGFjaGUub3JnIj5OaWNvbGFzIERlIExvb2Y8L2E+DQotICovDQotcHVibGljIGNsYXNzIEpzQnVpbGRlckFzc2VtYmxlclJlYWRlcg0KLSAgICBpbXBsZW1lbnRzIEFzc2VtYmxlclJlYWRlciwgTG9nRW5hYmxlZA0KLXsNCi0gICAgcHJpdmF0ZSBMb2dnZXIgbG9nZ2VyOw0KLQ0KLSAgICAvKioNCi0gICAgICoge0Bpbmhlcml0RG9jfQ0KLSAgICAgKiANCi0gICAgICogQHNlZSBvcmcuY29kZWhhdXMucGxleHVzLmxvZ2dpbmcuTG9nRW5hYmxlZCNlbmFibGVMb2dnaW5nKG9yZy5jb2RlaGF1cy5wbGV4dXMubG9nZ2luZy5Mb2dnZXIpDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCBlbmFibGVMb2dnaW5nKCBMb2dnZXIgbG9nZ2VyICkNCi0gICAgew0KLSAgICAgICAgdGhpcy5sb2dnZXIgPSBsb2dnZXI7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE9VVFBVVCA9ICIkb3V0cHV0LyI7DQotDQotICAgIC8qKg0KLSAgICAgKiB7QGluaGVyaXREb2N9DQotICAgICAqIA0KLSAgICAgKiBAc2VlIG9yZy5jb2RlaGF1cy5tb2pvLmphdmFzY3JpcHQuYXNzZW1ibGVyLkFzc2VtYmxlclJlYWRlciNnZXRBc3NlbWJsZXIoamF2YS5pby5GaWxlKQ0KLSAgICAgKi8NCi0gICAgcHVibGljIEFzc2VtYmxlciBnZXRBc3NlbWJsZXIoIEZpbGUgZmlsZSApDQotICAgICAgICB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIGxvZ2dlci5pbmZvKCAiUmVhZGluZyBhc3NlbWJsZXIgZGVzY3JpcHRvciAiICsgZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSApOw0KLSAgICAgICAgRG9jdW1lbnRCdWlsZGVyIGJ1aWxkZXIgPSBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCkubmV3RG9jdW1lbnRCdWlsZGVyKCk7DQotICAgICAgICBEb2N1bWVudCBkb20gPSBidWlsZGVyLnBhcnNlKCBmaWxlICk7DQotDQotICAgICAgICBBc3NlbWJsZXIgYXNzZW1ibGVyID0gbmV3IEFzc2VtYmxlcigpOw0KLSAgICAgICAgSlhQYXRoQ29udGV4dCB4cGF0aCA9IEpYUGF0aENvbnRleHQubmV3Q29udGV4dCggZG9tICk7DQotICAgICAgICB4cGF0aC5zZXRMZW5pZW50KCB0cnVlICk7DQotICAgICAgICBTdHJpbmcgc3JjID0gKFN0cmluZykgeHBhdGguZ2V0VmFsdWUoICIvL2RpcmVjdG9yeS9AbmFtZSIgKTsNCi0gICAgICAgIExpc3Qgbm9kZXMgPSB4cGF0aC5zZWxlY3ROb2RlcyggIi8vdGFyZ2V0IiApOw0KLSAgICAgICAgZm9yICggSXRlcmF0b3IgaXRlcmF0b3IgPSBub2Rlcy5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7ICkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBOb2RlIG5vZGUgPSAoTm9kZSkgaXRlcmF0b3IubmV4dCgpOw0KLSAgICAgICAgICAgIFNjcmlwdCBzY3JpcHQgPSBuZXcgU2NyaXB0KCk7DQotICAgICAgICAgICAgYXNzZW1ibGVyLmFkZFNjcmlwdCggc2NyaXB0ICk7DQotICAgICAgICAgICAgSlhQYXRoQ29udGV4dCBub2RlQ29udGV4dCA9IEpYUGF0aENvbnRleHQubmV3Q29udGV4dCggbm9kZSApOw0KLSAgICAgICAgICAgIFN0cmluZyBmaWxlTmFtZSA9IChTdHJpbmcpIG5vZGVDb250ZXh0LmdldFZhbHVlKCAiQGZpbGUiICk7DQotICAgICAgICAgICAgZmlsZU5hbWUgPSBmaWxlTmFtZS5yZXBsYWNlKCAnXFwnLCAnLycgKTsNCi0gICAgICAgICAgICBpZiAoIGZpbGVOYW1lLnN0YXJ0c1dpdGgoIE9VVFBVVCApICkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGZpbGVOYW1lID0gZmlsZU5hbWUuc3Vic3RyaW5nKCBPVVRQVVQubGVuZ3RoKCkgKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgc2NyaXB0LnNldEZpbGVOYW1lKCBmaWxlTmFtZSApOw0KLQ0KLSAgICAgICAgICAgIGZvciAoIEl0ZXJhdG9yIGl0ZXIgPSBub2RlQ29udGV4dC5pdGVyYXRlKCAiLy9pbmNsdWRlL0BuYW1lIiApOyBpdGVyLmhhc05leHQoKTsgKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgU3RyaW5nIGluY2x1ZGUgPSAoIChTdHJpbmcpIGl0ZXIubmV4dCgpICkucmVwbGFjZSggJ1xcJywgJy8nICk7DQotICAgICAgICAgICAgICAgIGlmICggc3JjICE9IG51bGwgJiYgc3JjLmxlbmd0aCgpID4gMCApDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGluY2x1ZGUgPSBpbmNsdWRlLnN1YnN0cmluZyggc3JjLmxlbmd0aCgpICsgMSApOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIHNjcmlwdC5hZGRJbmNsdWRlKCBpbmNsdWRlICk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIGFzc2VtYmxlcjsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2ptdC9hc3NlbWJsZXIvTm9TdWNoQXNzZW1ibGVyUmVhZGVyRXhjZXB0aW9uLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2ptdC9hc3NlbWJsZXIvTm9TdWNoQXNzZW1ibGVyUmVhZGVyRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwMWE0NjIuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qbXQvYXNzZW1ibGVyL05vU3VjaEFzc2VtYmxlclJlYWRlckV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoNCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqIA0KLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKiANCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuam10LmFzc2VtYmxlcjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpuaWNvbGFzQGFwYWNoZS5vcmciPk5pY29sYXMgRGUgTG9vZjwvYT4NCi0gKi8NCi1wdWJsaWMgY2xhc3MgTm9TdWNoQXNzZW1ibGVyUmVhZGVyRXhjZXB0aW9uDQotICAgIGV4dGVuZHMgRXhjZXB0aW9uDQotew0KLSAgICBwcml2YXRlIFN0cmluZyBhc3NlbWJsZXJOYW1lOw0KLQ0KLSAgICBwdWJsaWMgTm9TdWNoQXNzZW1ibGVyUmVhZGVyRXhjZXB0aW9uKCBTdHJpbmcgbmFtZSApDQotICAgIHsNCi0gICAgICAgIHN1cGVyKCAiTm8gc3VjaCBhc3NlbWJsZXIgcmVhZGVyOiAnIiArIG5hbWUgKyAiJy4iICk7DQotICAgICAgICB0aGlzLmFzc2VtYmxlck5hbWUgPSBuYW1lOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBAcmV0dXJuIHRoZSBhc3NlbWJsZXJOYW1lDQotICAgICAqLw0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEFzc2VtYmxlck5hbWUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gYXNzZW1ibGVyTmFtZTsNCi0gICAgfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2ptdC9jb21wcmVzcy9Db21wcmVzc2lvbkV4Y2VwdGlvbi5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qbXQvY29tcHJlc3MvQ29tcHJlc3Npb25FeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTg2ZGVmOS4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2ptdC9jb21wcmVzcy9Db21wcmVzc2lvbkV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoNCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqIA0KLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKiANCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuam10LmNvbXByZXNzOw0KLQ0KLWltcG9ydCBqYXZhLmlvLkZpbGU7DQotDQotLyoqDQotICogRXhjZXB0aW9uIGR1cmluZyBjb21wcmVzc2lvbiBvZiBzb21lIEphdmFTY3JpcHQgZmlsZQ0KLSAqLw0KLXB1YmxpYyBjbGFzcyBDb21wcmVzc2lvbkV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbiB7DQotDQotICAgIC8qKiBnZW5lcmF0ZWQgKi8NCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMTI4MjQxODA2Njk4NTM4Mjg1Nkw7DQotICAgIA0KLSAgICAvKiogVGhlIHNjcmlwdCB0aGF0IGNhbm5vdCBiZSBjb21wcmVzc2VkICovDQotICAgIHByaXZhdGUgRmlsZSBzY3JpcHQ7DQotICAgIA0KLSAgICBwdWJsaWMgQ29tcHJlc3Npb25FeGNlcHRpb24oKSB7DQotICAgICAgICBzdXBlcigpOw0KLSAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgQ29tcHJlc3Npb25FeGNlcHRpb24oIEZpbGUgc2NyaXB0ICkgew0KLSAgICAgICAgc3VwZXIoKTsNCi0gICAgICAgIHRoaXMuc2NyaXB0ID0gc2NyaXB0Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyBDb21wcmVzc2lvbkV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGNhdXNlLCBGaWxlIHNjcmlwdCkgew0KLSAgICAgICAgc3VwZXIobWVzc2FnZSwgY2F1c2UpOw0KLSAgICAgICAgdGhpcy5zY3JpcHQgPSBzY3JpcHQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIENvbXByZXNzaW9uRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBGaWxlIHNjcmlwdCkgew0KLSAgICAgICAgc3VwZXIobWVzc2FnZSk7DQotICAgICAgICB0aGlzLnNjcmlwdCA9IHNjcmlwdDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgQ29tcHJlc3Npb25FeGNlcHRpb24oVGhyb3dhYmxlIGNhdXNlLCBGaWxlIHNjcmlwdCkgew0KLSAgICAgICAgc3VwZXIoY2F1c2UpOw0KLSAgICAgICAgdGhpcy5zY3JpcHQgPSBzY3JpcHQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIEZpbGUgZ2V0U2NyaXB0KCkgew0KLSAgICAgICAgcmV0dXJuIHNjcmlwdDsNCi0gICAgfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2ptdC9jb21wcmVzcy9Jc29sYXRlZENsYXNzTG9hZGVyLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2ptdC9jb21wcmVzcy9Jc29sYXRlZENsYXNzTG9hZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhNTMzNzkuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qbXQvY29tcHJlc3MvSXNvbGF0ZWRDbGFzc0xvYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLyoNCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqIA0KLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKiANCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuam10LmNvbXByZXNzOw0KLQ0KLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247DQotaW1wb3J0IGphdmEubmV0LlVSTDsNCi1pbXBvcnQgamF2YS5uZXQuVVJMQ2xhc3NMb2FkZXI7DQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOw0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4uYXJ0aWZhY3QuQXJ0aWZhY3Q7DQotDQotLyoqDQotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86bmljb2xhc0BhcGFjaGUub3JnIj5OaWNvbGFzIERlIExvb2Y8L2E+DQotICovDQotcHVibGljIGNsYXNzIElzb2xhdGVkQ2xhc3NMb2FkZXINCi0gICAgZXh0ZW5kcyBVUkxDbGFzc0xvYWRlcg0KLXsNCi0NCi0gICAgcHVibGljIElzb2xhdGVkQ2xhc3NMb2FkZXIoIEFydGlmYWN0IGFydGlmYWN0ICkNCi0gICAgew0KLSAgICAgICAgc3VwZXIoIGdldEFydGlmYWN0VVJMcyggYXJ0aWZhY3QgKSApOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBJc29sYXRlZENsYXNzTG9hZGVyKCBDb2xsZWN0aW9uIGFydGlmYWN0cyApDQotICAgIHsNCi0gICAgICAgIHN1cGVyKCBnZXRBcnRpZmFjdFVSTHMoIGFydGlmYWN0cyApICk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgVVJMW10gZ2V0QXJ0aWZhY3RVUkxzKCBDb2xsZWN0aW9uIGFydGlmYWN0cyApDQotICAgIHsNCi0gICAgICAgIFVSTFtdIHVybHMgPSBuZXcgVVJMW2FydGlmYWN0cy5zaXplKCldOw0KLSAgICAgICAgdHJ5DQotICAgICAgICB7DQotICAgICAgICAgICAgaW50IGkgPSAwOw0KLSAgICAgICAgICAgIGZvciAoIEl0ZXJhdG9yIGl0ZXJhdG9yID0gYXJ0aWZhY3RzLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTsgKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgQXJ0aWZhY3QgYXJ0aWZhY3QgPSAoQXJ0aWZhY3QpIGl0ZXJhdG9yLm5leHQoKTsNCi0gICAgICAgICAgICAgICAgdXJsc1tpKytdID0gYXJ0aWZhY3QuZ2V0RmlsZSgpLnRvVVJMKCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKCBNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSApDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gdXJsczsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBVUkxbXSBnZXRBcnRpZmFjdFVSTHMoIEFydGlmYWN0IGFydGlmYWN0ICkNCi0gICAgew0KLSAgICAgICAgVVJMIHVybDsNCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHVybCA9IGFydGlmYWN0LmdldEZpbGUoKS50b1VSTCgpOw0KLSAgICAgICAgICAgIHJldHVybiBuZXcgVVJMW10geyB1cmwgfTsNCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoICggTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUgKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBDbGFzcyBsb2FkQ2xhc3MoIFN0cmluZyBuYW1lICkNCi0gICAgICAgIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uDQotICAgIHsNCi0NCi0gICAgICAgIENsYXNzIGMgPSBmaW5kTG9hZGVkQ2xhc3MoIG5hbWUgKTsNCi0gICAgICAgIGlmICggYyA9PSBudWxsICkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0cnkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiBmaW5kQ2xhc3MoIG5hbWUgKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgY2F0Y2ggKCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUgKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmxvYWRDbGFzcyggbmFtZSApOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBzdXBlci5sb2FkQ2xhc3MoIG5hbWUgKTsNCi0gICAgfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2ptdC9jb21wcmVzcy9KU0NvbXByZXNzb3IuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvam10L2NvbXByZXNzL0pTQ29tcHJlc3Nvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ODAwYzUwLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvam10L2NvbXByZXNzL0pTQ29tcHJlc3Nvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoNCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqIA0KLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKiANCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuam10LmNvbXByZXNzOw0KLQ0KLWltcG9ydCBqYXZhLmlvLkZpbGU7DQotDQotLyoqDQotICogQWJzdHJhY3Rpb24gb2YgYSBKUyBjb21wcmVzc2lvbiB0b29sLg0KLSAqLw0KLXB1YmxpYyBpbnRlcmZhY2UgSlNDb21wcmVzc29yDQotew0KLQ0KLSAgICAvKioNCi0gICAgICogQ29uc3RhbnRzIGZvciBvcHRpbWl6YXRpb24gbGV2ZWwNCi0gICAgICovDQotICAgIGludCBOT05FID0gMDsNCi0NCi0gICAgaW50IE1BWCA9IDk7DQotDQotICAgIC8qKg0KLSAgICAgKiBKYXZhc2NyaXB0IGxhbmd1YWdlIHZlcnNpb25zDQotICAgICAqLw0KLSAgICBpbnQgSkFWQVNDUklQVF8xXzEgPSAxMTA7DQotDQotICAgIGludCBKQVZBU0NSSVBUXzFfMiA9IDEyMDsNCi0NCi0gICAgaW50IEpBVkFTQ1JJUFRfMV8zID0gMTMwOw0KLQ0KLSAgICAvKioNCi0gICAgICogQ29tcHJlc3MgdGhlIGlucHV0IHNjcmlwdCBmaWxlIGludG8gdGhlIG91dHB1dCBmaWxlIChtYXkgYmUgc2FtZSkuDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gaW5wdXQgc291cmNlIHRvIGdldCBjb21wcmVzc2VkDQotICAgICAqIEBwYXJhbSBvdXRwdXQgY29tcHJlc3NlZCBzY3JpcHQNCi0gICAgICogQHBhcmFtIGxldmVsIG9wdGltaXphdGlvbiBsZXZlbCBmcm9tIDAgdG8gOS4gTWF5IGhhdmUgdmFyaW91cw0KLSAgICAgKiBzaWduaWZpY2F0aW9uIGRlcGVuZGVuZGluZyBvbiB0aGUgY29tcHJlc3NvciwgZnJvbSBiZWVpbmcgaWdub3JlZCB0byBzb21lDQotICAgICAqIGZpbmUgdHdlYWtpbmcgdGhlIG91dHB1dC4NCi0gICAgICogQHBhcmFtIGxhbmd1YWdlIHZlcnNpb24gb2YgamF2YXNjcmlwdCB0byBiZSB1c2VkICgiMTMwIiBmb3IgSlMgMS4zKSwgYXMNCi0gICAgICogZGVmaW5lZCBieSBNb3ppbGxhIFJoaW5vIGVuZ2luZQ0KLSAgICAgKiBAdGhyb3dzIENvbXByZXNzaW9uRXhjZXB0aW9uIGFueSBlcnJvciBkdXJpbmcgY29tcHJlc3Npb24NCi0gICAgICovDQotICAgIHZvaWQgY29tcHJlc3MoIEZpbGUgaW5wdXQsIEZpbGUgb3V0cHV0LCBpbnQgbGV2ZWwsIGludCBsYW5ndWFnZSApDQotICAgICAgICB0aHJvd3MgQ29tcHJlc3Npb25FeGNlcHRpb247DQotfQ0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvam10L2NvbXByZXNzL0pTQ29tcHJlc3NvclByb3h5LmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2ptdC9jb21wcmVzcy9KU0NvbXByZXNzb3JQcm94eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYWQzZTMzLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvam10L2NvbXByZXNzL0pTQ29tcHJlc3NvclByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKg0KLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICogDQotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqIA0KLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqICB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5qbXQuY29tcHJlc3M7DQotDQotaW1wb3J0IGphdmEuaW8uRmlsZTsNCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOw0KLQ0KLWltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLnBlcnNvbmFsaXR5LnBsZXh1cy5saWZlY3ljbGUucGhhc2UuSW5pdGlhbGl6YXRpb25FeGNlcHRpb247DQotDQotLyoqDQotICogQGF1dGhvciBuZGVsb29mDQotICovDQotcHVibGljIGNsYXNzIEpTQ29tcHJlc3NvclByb3h5DQotICAgIGltcGxlbWVudHMgSlNDb21wcmVzc29yDQotew0KLQ0KLSAgICBwcml2YXRlIE9iamVjdCBjb21wcmVzc29yOw0KLQ0KLSAgICBwcml2YXRlIE1ldGhvZCBjb21wcmVzczsNCi0NCi0gICAgcHVibGljIEpTQ29tcHJlc3NvclByb3h5KCBPYmplY3QgY29tcHJlc3NvciApDQotICAgICAgICB0aHJvd3MgSW5pdGlhbGl6YXRpb25FeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgc3VwZXIoKTsNCi0gICAgICAgIHRoaXMuY29tcHJlc3NvciA9IGNvbXByZXNzb3I7DQotICAgICAgICB0cnkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aGlzLmNvbXByZXNzID0NCi0gICAgICAgICAgICAgICAgY29tcHJlc3Nvci5nZXRDbGFzcygpLmdldE1ldGhvZCggImNvbXByZXNzIiwNCi0gICAgICAgICAgICAgICAgICAgIG5ldyBDbGFzc1tdIHsgRmlsZS5jbGFzcywgRmlsZS5jbGFzcywgaW50LmNsYXNzLCBpbnQuY2xhc3MgfSApOw0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKCBFeGNlcHRpb24gZSApDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhyb3cgbmV3IEluaXRpYWxpemF0aW9uRXhjZXB0aW9uKA0KLSAgICAgICAgICAgICAgICAicHJveGllZCBvYmplY3QgaGFzIG5vIG1ldGhvZCBjb21wcmVzcyhGaWxlLEZpbGUsaW50LGludCkiICk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgY29tcHJlc3MoIEZpbGUgaW5wdXQsIEZpbGUgb3V0cHV0LCBpbnQgbGV2ZWwsIGludCBsYW5ndWFnZSApDQotICAgICAgICB0aHJvd3MgQ29tcHJlc3Npb25FeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgdHJ5DQotICAgICAgICB7DQotICAgICAgICAgICAgY29tcHJlc3MuaW52b2tlKCBjb21wcmVzc29yLCBuZXcgT2JqZWN0W10geyBpbnB1dCwgb3V0cHV0LCBJbnRlZ2VyLnZhbHVlT2YoIGxldmVsICksDQotICAgICAgICAgICAgICAgIEludGVnZXIudmFsdWVPZiggbGFuZ3VhZ2UgKSB9ICk7DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSApDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKCBlLmdldFRhcmdldEV4Y2VwdGlvbigpIGluc3RhbmNlb2YgQ29tcHJlc3Npb25FeGNlcHRpb24gKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdGhyb3cgKENvbXByZXNzaW9uRXhjZXB0aW9uKSBlLmdldFRhcmdldEV4Y2VwdGlvbigpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB0aHJvdyBuZXcgQ29tcHJlc3Npb25FeGNlcHRpb24oICJGYWlsZWQgdG8gY29tcHJlc3MgSlMgZmlsZSIsIGUsIGlucHV0ICk7DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoIEV4Y2VwdGlvbiBlICkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgQ29tcHJlc3Npb25FeGNlcHRpb24oICJGYWlsZWQgdG8gY29tcHJlc3MgSlMgZmlsZSIsIGUsIGlucHV0ICk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qbXQvY29tcHJlc3MvSlNNaW5Db21wcmVzc29yLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2ptdC9jb21wcmVzcy9KU01pbkNvbXByZXNzb3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTI2MDlhMC4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2ptdC9jb21wcmVzcy9KU01pbkNvbXByZXNzb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxNyArMCwwIEBACi0vKg0KLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICogDQotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqIA0KLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqICB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5qbXQuY29tcHJlc3M7DQotDQotaW1wb3J0IGphdmEuaW8uRmlsZTsNCi1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07DQotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07DQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247DQotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07DQotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOw0KLWltcG9ydCBqYXZhLmlvLlB1c2hiYWNrSW5wdXRTdHJlYW07DQotDQotLyoqDQotICogVXNlIHRoZSBKYXZhIHZlcnNpb24gb2YgdGhlIEpTTWluIGFsZ29yaXRobSB0byBjb21wcmVzcyBhIHNldCBvZiBKUyBmaWxlcy4NCi0gKiBGb3Igc2ltcGxpY2l0eSwgdGhlIEpTTWluIGNvZGUgKG9uZSBjbGFzcykgaXMgaW5jbHVkZWQgaW4gdGhlIHBsdWdpbi4NCi0gKiANCi0gKiBAc2VlIGh0dHA6Ly93d3cuY3JvY2tmb3JkLmNvbS9qYXZhc2NyaXB0L2pzbWluLmh0bWwNCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpuaWNvbGFzQGFwYWNoZS5vcmciPm5pY29sYXMgRGUgTG9vZjwvYT4NCi0gKi8NCi1wdWJsaWMgY2xhc3MgSlNNaW5Db21wcmVzc29yDQotICAgIGltcGxlbWVudHMgSlNDb21wcmVzc29yDQotew0KLQ0KLSAgICAvKioNCi0gICAgICoge0Bpbmhlcml0RG9jfQ0KLSAgICAgKiANCi0gICAgICogQHNlZSBvcmcuY29kZWhhdXMubW9qby5qYXZhc2NyaXB0LmNvbXByZXNzLkpTQ29tcHJlc3NvciNjb21wcmVzcyhqYXZhLmlvLkZpbGUsDQotICAgICAqIGphdmEuaW8uRmlsZSwgaW50LCBpbnQpDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCBjb21wcmVzcyggRmlsZSBpbnB1dCwgRmlsZSBvdXRwdXQsIGludCBsZXZlbCwgaW50IGxhbmd1YWdlICkNCi0gICAgICAgIHRocm93cyBDb21wcmVzc2lvbkV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICB0cnkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBuZXcgSlNNaW4oIG5ldyBGaWxlSW5wdXRTdHJlYW0oIGlucHV0ICksIG5ldyBGaWxlT3V0cHV0U3RyZWFtKCBvdXRwdXQgKSApLmpzbWluKCk7DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoIEV4Y2VwdGlvbiBlICkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgQ29tcHJlc3Npb25FeGNlcHRpb24oICJGYWlsZWQgdG8gY3JlYXRlIGNvbXByZXNzZWQgZmlsZSIsIGUsIGlucHV0ICk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBKU01pbiB7DQotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRU9GID0gLTE7DQotDQotICAgICAgICBwcml2YXRlIFB1c2hiYWNrSW5wdXRTdHJlYW0gaW47DQotICAgICAgICBwcml2YXRlIE91dHB1dFN0cmVhbSBvdXQ7DQotDQotICAgICAgICBwcml2YXRlIGludCB0aGVBOw0KLSAgICAgICAgcHJpdmF0ZSBpbnQgdGhlQjsNCi0NCi0gICAgICAgIHB1YmxpYyBKU01pbihJbnB1dFN0cmVhbSBpbiwgT3V0cHV0U3RyZWFtIG91dCkgew0KLSAgICAgICAgICAgIHRoaXMuaW4gPSBuZXcgUHVzaGJhY2tJbnB1dFN0cmVhbShpbik7DQotICAgICAgICAgICAgdGhpcy5vdXQgPSBvdXQ7DQotICAgICAgICB9DQotDQotICAgICAgICAvKioNCi0gICAgICAgICAqIGlzQWxwaGFudW0gLS0gcmV0dXJuIHRydWUgaWYgdGhlIGNoYXJhY3RlciBpcyBhIGxldHRlciwgZGlnaXQsDQotICAgICAgICAgKiB1bmRlcnNjb3JlLCBkb2xsYXIgc2lnbiwgb3Igbm9uLUFTQ0lJIGNoYXJhY3Rlci4NCi0gICAgICAgICAqLw0KLSAgICAgICAgc3RhdGljIGJvb2xlYW4gaXNBbHBoYW51bShpbnQgYykgew0KLSAgICAgICAgICAgIHJldHVybiAoIChjID49ICdhJyAmJiBjIDw9ICd6JykgfHwgKGMgPj0gJzAnICYmIGMgPD0gJzknKSB8fA0KLSAgICAgICAgICAgICAgICAgICAgIChjID49ICdBJyAmJiBjIDw9ICdaJykgfHwgYyA9PSAnXycgfHwgYyA9PSAnJCcgfHwgYyA9PSAnXFwnIHx8DQotICAgICAgICAgICAgICAgICAgICAgYyA+IDEyNik7DQotICAgICAgICB9DQotDQotICAgICAgICAvKioNCi0gICAgICAgICAqIGdldCAtLSByZXR1cm4gdGhlIG5leHQgY2hhcmFjdGVyIGZyb20gc3RkaW4uIFdhdGNoIG91dCBmb3IgbG9va2FoZWFkLiBJZg0KLSAgICAgICAgICogdGhlIGNoYXJhY3RlciBpcyBhIGNvbnRyb2wgY2hhcmFjdGVyLCB0cmFuc2xhdGUgaXQgdG8gYSBzcGFjZSBvcg0KLSAgICAgICAgICogbGluZWZlZWQuDQotICAgICAgICAgKi8NCi0gICAgICAgIGludCBnZXQoKSB0aHJvd3MgSU9FeGNlcHRpb24gew0KLSAgICAgICAgICAgIGludCBjID0gaW4ucmVhZCgpOw0KLQ0KLSAgICAgICAgICAgIGlmIChjID49ICcgJyB8fCBjID09ICdcbicgfHwgYyA9PSBFT0YpIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIGM7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIGlmIChjID09ICdccicpIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuICdcbic7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIHJldHVybiAnICc7DQotICAgICAgICB9DQotDQotDQotDQotICAgICAgICAvKioNCi0gICAgICAgICAqIEdldCB0aGUgbmV4dCBjaGFyYWN0ZXIgd2l0aG91dCBnZXR0aW5nIGl0Lg0KLSAgICAgICAgICovDQotICAgICAgICBpbnQgcGVlaygpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQotICAgICAgICAgICAgaW50IGxvb2thaGVhZENoYXIgPSBpbi5yZWFkKCk7DQotICAgICAgICAgICAgaW4udW5yZWFkKGxvb2thaGVhZENoYXIpOw0KLSAgICAgICAgICAgIHJldHVybiBsb29rYWhlYWRDaGFyOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLyoqDQotICAgICAgICAgKiBuZXh0IC0tIGdldCB0aGUgbmV4dCBjaGFyYWN0ZXIsIGV4Y2x1ZGluZyBjb21tZW50cy4gcGVlaygpIGlzIHVzZWQgdG8gc2VlDQotICAgICAgICAgKiBpZiBhICcvJyBpcyBmb2xsb3dlZCBieSBhICcvJyBvciAnKicuDQotICAgICAgICAgKi8NCi0gICAgICAgIGludCBuZXh0KCkgdGhyb3dzIElPRXhjZXB0aW9uLCBVbnRlcm1pbmF0ZWRDb21tZW50RXhjZXB0aW9uIHsNCi0gICAgICAgICAgICBpbnQgYyA9IGdldCgpOw0KLSAgICAgICAgICAgIGlmIChjID09ICcvJykgew0KLSAgICAgICAgICAgICAgICBzd2l0Y2ggKHBlZWsoKSkgew0KLSAgICAgICAgICAgICAgICBjYXNlICcvJzoNCi0gICAgICAgICAgICAgICAgICAgIGZvciAoOzspIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBjID0gZ2V0KCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGMgPD0gJ1xuJykgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYzsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIGNhc2UgJyonOg0KLSAgICAgICAgICAgICAgICAgICAgZ2V0KCk7DQotICAgICAgICAgICAgICAgICAgICBmb3IgKDs7KSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChnZXQoKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJyonOg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGVlaygpID09ICcvJykgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0KCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJyAnOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRU9GOg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW50ZXJtaW5hdGVkQ29tbWVudEV4Y2VwdGlvbigpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgZGVmYXVsdDoNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBjOw0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHJldHVybiBjOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLyoqDQotICAgICAgICAgKiBhY3Rpb24gLS0gZG8gc29tZXRoaW5nISBXaGF0IHlvdSBkbyBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBhcmd1bWVudDogMQ0KLSAgICAgICAgICogT3V0cHV0IEEuIENvcHkgQiB0byBBLiBHZXQgdGhlIG5leHQgQi4gMiBDb3B5IEIgdG8gQS4gR2V0IHRoZSBuZXh0IEIuDQotICAgICAgICAgKiAoRGVsZXRlIEEpLiAzIEdldCB0aGUgbmV4dCBCLiAoRGVsZXRlIEIpLiBhY3Rpb24gdHJlYXRzIGEgc3RyaW5nIGFzIGENCi0gICAgICAgICAqIHNpbmdsZSBjaGFyYWN0ZXIuIFdvdyEgYWN0aW9uIHJlY29nbml6ZXMgYSByZWd1bGFyIGV4cHJlc3Npb24gaWYgaXQgaXMNCi0gICAgICAgICAqIHByZWNlZGVkIGJ5ICggb3IgLCBvciA9Lg0KLSAgICAgICAgICovDQotDQotICAgICAgICB2b2lkIGFjdGlvbihpbnQgZCkgdGhyb3dzIElPRXhjZXB0aW9uLCBVbnRlcm1pbmF0ZWRSZWdFeHBMaXRlcmFsRXhjZXB0aW9uLA0KLSAgICAgICAgICAgICAgICBVbnRlcm1pbmF0ZWRDb21tZW50RXhjZXB0aW9uLCBVbnRlcm1pbmF0ZWRTdHJpbmdMaXRlcmFsRXhjZXB0aW9uIHsNCi0gICAgICAgICAgICBzd2l0Y2ggKGQpIHsNCi0gICAgICAgICAgICBjYXNlIDE6DQotICAgICAgICAgICAgICAgIG91dC53cml0ZSh0aGVBKTsNCi0gICAgICAgICAgICBjYXNlIDI6DQotICAgICAgICAgICAgICAgIHRoZUEgPSB0aGVCOw0KLQ0KLSAgICAgICAgICAgICAgICBpZiAodGhlQSA9PSAnXCcnIHx8IHRoZUEgPT0gJyInKSB7DQotICAgICAgICAgICAgICAgICAgICBmb3IgKDs7KSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgb3V0LndyaXRlKHRoZUEpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIHRoZUEgPSBnZXQoKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhlQSA9PSB0aGVCKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhlQSA8PSAnXG4nKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbnRlcm1pbmF0ZWRTdHJpbmdMaXRlcmFsRXhjZXB0aW9uKCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGVBID09ICdcXCcpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0LndyaXRlKHRoZUEpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVBID0gZ2V0KCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgY2FzZSAzOg0KLSAgICAgICAgICAgICAgICB0aGVCID0gbmV4dCgpOw0KLSAgICAgICAgICAgICAgICBpZiAodGhlQiA9PSAnLycgJiYgKHRoZUEgPT0gJygnIHx8IHRoZUEgPT0gJywnIHx8IHRoZUEgPT0gJz0nIHx8DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlQSA9PSAnOicgfHwgdGhlQSA9PSAnWycgfHwgdGhlQSA9PSAnIScgfHwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVBID09ICcmJyB8fCB0aGVBID09ICd8JyB8fCB0aGVBID09ICc/JyB8fA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZUEgPT0gJ3snIHx8IHRoZUEgPT0gJ30nIHx8IHRoZUEgPT0gJzsnIHx8DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlQSA9PSAnXG4nKSkgew0KLSAgICAgICAgICAgICAgICAgICAgb3V0LndyaXRlKHRoZUEpOw0KLSAgICAgICAgICAgICAgICAgICAgb3V0LndyaXRlKHRoZUIpOw0KLSAgICAgICAgICAgICAgICAgICAgZm9yICg7Oykgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHRoZUEgPSBnZXQoKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhlQSA9PSAnLycpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGVBID09ICdcXCcpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0LndyaXRlKHRoZUEpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVBID0gZ2V0KCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGVBIDw9ICdcbicpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVudGVybWluYXRlZFJlZ0V4cExpdGVyYWxFeGNlcHRpb24oKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgb3V0LndyaXRlKHRoZUEpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgdGhlQiA9IG5leHQoKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8qKg0KLSAgICAgICAgICoganNtaW4gLS0gQ29weSB0aGUgaW5wdXQgdG8gdGhlIG91dHB1dCwgZGVsZXRpbmcgdGhlIGNoYXJhY3RlcnMgd2hpY2ggYXJlDQotICAgICAgICAgKiBpbnNpZ25pZmljYW50IHRvIEphdmFTY3JpcHQuIENvbW1lbnRzIHdpbGwgYmUgcmVtb3ZlZC4gVGFicyB3aWxsIGJlDQotICAgICAgICAgKiByZXBsYWNlZCB3aXRoIHNwYWNlcy4gQ2FycmlhZ2UgcmV0dXJucyB3aWxsIGJlIHJlcGxhY2VkIHdpdGggbGluZWZlZWRzLg0KLSAgICAgICAgICogTW9zdCBzcGFjZXMgYW5kIGxpbmVmZWVkcyB3aWxsIGJlIHJlbW92ZWQuDQotICAgICAgICAgKi8NCi0gICAgICAgIHB1YmxpYyB2b2lkIGpzbWluKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBVbnRlcm1pbmF0ZWRSZWdFeHBMaXRlcmFsRXhjZXB0aW9uLCBVbnRlcm1pbmF0ZWRDb21tZW50RXhjZXB0aW9uLCBVbnRlcm1pbmF0ZWRTdHJpbmdMaXRlcmFsRXhjZXB0aW9uew0KLSAgICAgICAgICAgIHRoZUEgPSAnXG4nOw0KLSAgICAgICAgICAgIGFjdGlvbigzKTsNCi0gICAgICAgICAgICB3aGlsZSAodGhlQSAhPSBFT0YpIHsNCi0gICAgICAgICAgICAgICAgc3dpdGNoICh0aGVBKSB7DQotICAgICAgICAgICAgICAgIGNhc2UgJyAnOg0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGlzQWxwaGFudW0odGhlQikpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb24oMSk7DQotICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbigyKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlICdcbic6DQotICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHRoZUIpIHsNCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgJ3snOg0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSAnWyc6DQotICAgICAgICAgICAgICAgICAgICBjYXNlICcoJzoNCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgJysnOg0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSAnLSc6DQotICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uKDEpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSAnICc6DQotICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uKDMpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNBbHBoYW51bSh0aGVCKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb24oMSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uKDIpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBkZWZhdWx0Og0KLSAgICAgICAgICAgICAgICAgICAgc3dpdGNoICh0aGVCKSB7DQotICAgICAgICAgICAgICAgICAgICBjYXNlICcgJzoNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNBbHBoYW51bSh0aGVBKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb24oMSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb24oMyk7DQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgICAgICBjYXNlICdcbic6DQotICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoICh0aGVBKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnfSc6DQotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnXSc6DQotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnKSc6DQotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnKyc6DQotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnLSc6DQotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnIic6DQotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnXCcnOg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb24oMSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc0FscGhhbnVtKHRoZUEpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb24oMSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb24oMyk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgICAgICBkZWZhdWx0Og0KLSAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbigxKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBvdXQuZmx1c2goKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGNsYXNzIFVudGVybWluYXRlZENvbW1lbnRFeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24gew0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgY2xhc3MgVW50ZXJtaW5hdGVkU3RyaW5nTGl0ZXJhbEV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbiB7DQotICAgICAgICB9DQotDQotICAgICAgICBjbGFzcyBVbnRlcm1pbmF0ZWRSZWdFeHBMaXRlcmFsRXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uIHsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBhcmdbXSkgew0KLSAgICAgICAgICAgIHRyeSB7DQotICAgICAgICAgICAgICAgIEpTTWluIGpzbWluID0gbmV3IEpTTWluKG5ldyBGaWxlSW5wdXRTdHJlYW0oYXJnWzBdKSwgU3lzdGVtLm91dCk7DQotICAgICAgICAgICAgICAgIGpzbWluLmpzbWluKCk7DQotICAgICAgICAgICAgfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsNCi0gICAgICAgICAgICB9IGNhdGNoIChBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOw0KLSAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsNCi0gICAgICAgICAgICB9IGNhdGNoIChVbnRlcm1pbmF0ZWRSZWdFeHBMaXRlcmFsRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsNCi0gICAgICAgICAgICB9IGNhdGNoIChVbnRlcm1pbmF0ZWRDb21tZW50RXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsNCi0gICAgICAgICAgICB9IGNhdGNoIChVbnRlcm1pbmF0ZWRTdHJpbmdMaXRlcmFsRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotDQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qbXQvY29tcHJlc3MvU2hyaW5rc2FmZUNvbXByZXNzb3IuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvam10L2NvbXByZXNzL1Nocmlua3NhZmVDb21wcmVzc29yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3ZjRlMDEuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qbXQvY29tcHJlc3MvU2hyaW5rc2FmZUNvbXByZXNzb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qDQotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKiANCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICogDQotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LmptdC5jb21wcmVzczsNCi0NCi1pbXBvcnQgamF2YS5pby5GaWxlOw0KLWltcG9ydCBqYXZhLmlvLlByaW50U3RyZWFtOw0KLQ0KLWltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLnV0aWwuSU9VdGlsOw0KLWltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLnV0aWwuU3RyaW5nT3V0cHV0U3RyZWFtOw0KLWltcG9ydCBvcmcubW96aWxsYS5qYXZhc2NyaXB0LkNvbnRleHQ7DQotaW1wb3J0IG9yZy5tb3ppbGxhLmphdmFzY3JpcHQuQ29udGV4dEFjdGlvbjsNCi1pbXBvcnQgb3JnLm1vemlsbGEuamF2YXNjcmlwdC5TY3JpcHRhYmxlT2JqZWN0Ow0KLWltcG9ydCBvcmcubW96aWxsYS5qYXZhc2NyaXB0LnRvb2xzLlRvb2xFcnJvclJlcG9ydGVyOw0KLWltcG9ydCBvcmcubW96aWxsYS5qYXZhc2NyaXB0LnRvb2xzLnNoZWxsLkdsb2JhbDsNCi1pbXBvcnQgb3JnLm1vemlsbGEuamF2YXNjcmlwdC50b29scy5zaGVsbC5NYWluOw0KLWltcG9ydCBvcmcubW96aWxsYS5qYXZhc2NyaXB0LnRvb2xzLnNoZWxsLlNoZWxsQ29udGV4dEZhY3Rvcnk7DQotDQotLyoqDQotICogQSBKUyBjb21wcmVzc29yIHRoYXQgdXNlcyBEb2pvIG1vZGlmaWVkIFJoaW5vIGVuZ2luZSB0byBjb21wcmVzcyB0aGUgc2NyaXB0Lg0KLSAqIFRoZSByZXN1bHRpbmcgY29tcHJlc3NlZC1qcyBpcyBnYXJhbnRlZWQgdG8gYmUgZnVuY3Rpb25hbHkgZXF1aXZhbGVudCBhcyB0aGlzDQotICogaXMgdGhlIGludGVybmFsIHZpZXcgb2YgdGhlIHJoaW5vIGNvbnRleHQuDQotICogDQotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86bmljb2xhc0BhcGFjaGUub3JnIj5uaWNvbGFzIERlIExvb2Y8L2E+DQotICovDQotcHVibGljIGNsYXNzIFNocmlua3NhZmVDb21wcmVzc29yDQotICAgIGltcGxlbWVudHMgSlNDb21wcmVzc29yDQotew0KLSAgICAvKioNCi0gICAgICoge0Bpbmhlcml0RG9jfQ0KLSAgICAgKiANCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuam10LmNvbXByZXNzLm1vam8uamF2YXNjcmlwdC5jb21wcmVzcy5KU0NvbXByZXNzb3IjY29tcHJlc3MoamF2YS5pby5GaWxlLA0KLSAgICAgKiBqYXZhLmlvLkZpbGUsIGludCwgaW50KQ0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgY29tcHJlc3MoIGZpbmFsIEZpbGUgaW5wdXQsIEZpbGUgY29tcHJlc3NlZCwgaW50IGxldmVsLCBpbnQgbGFuZ3VhZ2UgKQ0KLSAgICAgICAgdGhyb3dzIENvbXByZXNzaW9uRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIFByaW50U3RyZWFtIG8gPSBTeXN0ZW0ub3V0Ow0KLSAgICAgICAgU3lzdGVtLnNldE91dCggbmV3IFByaW50U3RyZWFtKCBuZXcgU3RyaW5nT3V0cHV0U3RyZWFtKCkgKSApOw0KLSAgICAgICAgUHJpbnRTdHJlYW0gb3V0ID0gbnVsbDsNCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIFN0cmluZ1tdIGFyZ3MgPSBuZXcgU3RyaW5nWzNdOw0KLSAgICAgICAgICAgIGFyZ3NbMF0gPSAiLWMiOyAvLyBTZXQgTWFpbi5vdXRwdXRDb21wcmVzc2VkID0gdHJ1ZQ0KLSAgICAgICAgICAgIGFyZ3NbMV0gPSAiLW8iOyAvLyBTZXQgTWFpbi5vdXRwdXRGaWxlTmFtZQ0KLSAgICAgICAgICAgIGFyZ3NbMl0gPSBjb21wcmVzc2VkLmdldEFic29sdXRlUGF0aCgpOw0KLQ0KLSAgICAgICAgICAgIE1haW4ucHJvY2Vzc09wdGlvbnMoIGFyZ3MgKTsNCi0NCi0gICAgICAgICAgICBmaW5hbCBUb29sRXJyb3JSZXBvcnRlciBlcnJvclJlcG9ydGVyID0gbmV3IFRvb2xFcnJvclJlcG9ydGVyKCBmYWxzZSwgU3lzdGVtLmVyciApOw0KLSAgICAgICAgICAgIGVycm9yUmVwb3J0ZXIuc2V0SXNSZXBvcnRpbmdXYXJuaW5ncyggZmFsc2UgKTsNCi0NCi0gICAgICAgICAgICBmaW5hbCBTaGVsbENvbnRleHRGYWN0b3J5IHNoZWxsQ29udGV4dEZhY3RvcnkgPSBuZXcgU2hlbGxDb250ZXh0RmFjdG9yeSgpOw0KLSAgICAgICAgICAgIHNoZWxsQ29udGV4dEZhY3Rvcnkuc2V0TGFuZ3VhZ2VWZXJzaW9uKCBsYW5ndWFnZSApOw0KLSAgICAgICAgICAgIHNoZWxsQ29udGV4dEZhY3Rvcnkuc2V0T3B0aW1pemF0aW9uTGV2ZWwoIGxldmVsICk7DQotICAgICAgICAgICAgc2hlbGxDb250ZXh0RmFjdG9yeS5zZXRFcnJvclJlcG9ydGVyKCBlcnJvclJlcG9ydGVyICk7DQotICAgICAgICAgICAgc2hlbGxDb250ZXh0RmFjdG9yeS5zZXRTdHJpY3RNb2RlKCB0cnVlICk7DQotDQotICAgICAgICAgICAgZmluYWwgR2xvYmFsIHNjb3BlID0gbmV3IEdsb2JhbCgpOw0KLSAgICAgICAgICAgIHNjb3BlLmluaXQoIHNoZWxsQ29udGV4dEZhY3RvcnkgKTsNCi0NCi0gICAgICAgICAgICBzaGVsbENvbnRleHRGYWN0b3J5LmNhbGwoIG5ldyBDb250ZXh0QWN0aW9uKCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCBDb250ZXh0IGNvbnRleHQgKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBPYmplY3RbXSBhcmdzID0gbmV3IE9iamVjdFsxXTsNCi0gICAgICAgICAgICAgICAgICAgIHNjb3BlLmRlZmluZVByb3BlcnR5KCAiYXJndW1lbnRzIiwgYXJncywgU2NyaXB0YWJsZU9iamVjdC5ET05URU5VTSApOw0KLSAgICAgICAgICAgICAgICAgICAgTWFpbi5wcm9jZXNzRmlsZSggY29udGV4dCwgc2NvcGUsIGlucHV0LmdldEFic29sdXRlUGF0aCgpICk7DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0gKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoICggRXhjZXB0aW9uIGUgKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBDb21wcmVzc2lvbkV4Y2VwdGlvbiggIkZhaWxlZCB0byBjcmVhdGUgY29tcHJlc3NlZCBmaWxlIiwgZSwgaW5wdXQgKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGZpbmFsbHkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBTeXN0ZW0uc2V0T3V0KCBvICk7DQotICAgICAgICAgICAgSU9VdGlsLmNsb3NlKCBvdXQgKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2ptdC9jb21wcmVzcy9ZYWhvb1VJQ29tcHJlc3Nvci5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qbXQvY29tcHJlc3MvWWFob29VSUNvbXByZXNzb3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Y5MDFlZS4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2ptdC9jb21wcmVzcy9ZYWhvb1VJQ29tcHJlc3Nvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLS8qDQotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKiANCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICogDQotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LmptdC5jb21wcmVzczsNCi0NCi1pbXBvcnQgamF2YS5pby5GaWxlOw0KLWltcG9ydCBqYXZhLmlvLkZpbGVSZWFkZXI7DQotaW1wb3J0IGphdmEuaW8uRmlsZVdyaXRlcjsNCi0NCi1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy51dGlsLklPVXRpbDsNCi1pbXBvcnQgb3JnLm1vemlsbGEuamF2YXNjcmlwdC5FcnJvclJlcG9ydGVyOw0KLWltcG9ydCBvcmcubW96aWxsYS5qYXZhc2NyaXB0LkV2YWx1YXRvckV4Y2VwdGlvbjsNCi0NCi1pbXBvcnQgY29tLnlhaG9vLnBsYXRmb3JtLnl1aS5jb21wcmVzc29yLkphdmFTY3JpcHRDb21wcmVzc29yOw0KLQ0KLS8qKg0KLSAqIEEgSlMgY29tcHJlc3NvciB0aGF0IHVzZXMgRG9qbyBtb2RpZmllZCBSaGlubyBlbmdpbmUgdG8gY29tcHJlc3MgdGhlIHNjcmlwdC4NCi0gKiBUaGUgcmVzdWx0aW5nIGNvbXByZXNzZWQtanMgaXMgZ2FyYW50ZWVkIHRvIGJlIGZ1bmN0aW9uYWx5IGVxdWl2YWxlbnQgYXMgdGhpcw0KLSAqIGlzIHRoZSBpbnRlcm5hbCB2aWV3IG9mIHRoZSByaGlubyBjb250ZXh0Lg0KLSAqIA0KLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOm5pY29sYXNAYXBhY2hlLm9yZyI+bmljb2xhcyBEZSBMb29mPC9hPg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBZYWhvb1VJQ29tcHJlc3Nvcg0KLSAgICBpbXBsZW1lbnRzIEpTQ29tcHJlc3Nvcg0KLXsNCi0gICAgLyoqDQotICAgICAqIHtAaW5oZXJpdERvY30NCi0gICAgICogDQotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LmptdC5jb21wcmVzcy5tb2pvLmphdmFzY3JpcHQuY29tcHJlc3MuSlNDb21wcmVzc29yI2NvbXByZXNzKGphdmEuaW8uRmlsZSwNCi0gICAgICogamF2YS5pby5GaWxlLCBpbnQsIGludCkNCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIGNvbXByZXNzKCBmaW5hbCBGaWxlIGlucHV0LCBGaWxlIGNvbXByZXNzZWQsIGludCBsZXZlbCwgaW50IGxhbmd1YWdlICkNCi0gICAgICAgIHRocm93cyBDb21wcmVzc2lvbkV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBGaWxlV3JpdGVyIG91dCA9IG51bGw7DQotICAgICAgICB0cnkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBKYXZhU2NyaXB0Q29tcHJlc3NvciBjb21wcmVzc29yID0NCi0gICAgICAgICAgICAgICAgbmV3IEphdmFTY3JpcHRDb21wcmVzc29yKCBuZXcgRmlsZVJlYWRlciggaW5wdXQgKSwgbmV3IEVycm9yUmVwb3J0ZXIoKQ0KLSAgICAgICAgICAgICAgICB7DQotDQotICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCB3YXJuaW5nKCBTdHJpbmcgbWVzc2FnZSwgU3RyaW5nIHNvdXJjZU5hbWUsIGludCBsaW5lLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGxpbmVTb3VyY2UsIGludCBsaW5lT2Zmc2V0ICkNCi0gICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIGxpbmUgPCAwICkNCi0gICAgICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbiggIlxuW1dBUk5JTkddICIgKyBtZXNzYWdlICk7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbiggIlxuIiArIGxpbmUgKyAnOicgKyBsaW5lT2Zmc2V0ICsgJzonICsgbWVzc2FnZSApOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGVycm9yKCBTdHJpbmcgbWVzc2FnZSwgU3RyaW5nIHNvdXJjZU5hbWUsIGludCBsaW5lLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBsaW5lU291cmNlLCBpbnQgbGluZU9mZnNldCApDQotICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBsaW5lIDwgMCApDQotICAgICAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oICJcbltFUlJPUl0gIiArIG1lc3NhZ2UgKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCAiXG4iICsgbGluZSArICc6JyArIGxpbmVPZmZzZXQgKyAnOicgKyBtZXNzYWdlICk7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICAgICAgcHVibGljIEV2YWx1YXRvckV4Y2VwdGlvbiBydW50aW1lRXJyb3IoIFN0cmluZyBtZXNzYWdlLCBTdHJpbmcgc291cmNlTmFtZSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGluZSwgU3RyaW5nIGxpbmVTb3VyY2UsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxpbmVPZmZzZXQgKQ0KLSAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKCBtZXNzYWdlLCBzb3VyY2VOYW1lLCBsaW5lLCBsaW5lU291cmNlLCBsaW5lT2Zmc2V0ICk7DQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBFdmFsdWF0b3JFeGNlcHRpb24oIG1lc3NhZ2UgKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfSApOw0KLQ0KLSAgICAgICAgICAgIGludCBsaW5lYnJlYWtwb3MgPSBsZXZlbCA8IDQgPyAtMSA6IDgwOw0KLSAgICAgICAgICAgIGJvb2xlYW4gbXVuZ2UgPSBsZXZlbCA8IDM7DQotICAgICAgICAgICAgYm9vbGVhbiBwcmVzZXJ2ZUFsbFNlbWlDb2xvbnMgPSBsZXZlbCA8IDI7DQotICAgICAgICAgICAgYm9vbGVhbiBwcmVzZXJ2ZVN0cmluZ0xpdGVyYWxzID0gbGV2ZWwgPCAxOw0KLQ0KLSAgICAgICAgICAgIG91dCA9IG5ldyBGaWxlV3JpdGVyKCBjb21wcmVzc2VkICk7DQotICAgICAgICAgICAgY29tcHJlc3Nvci5jb21wcmVzcyggb3V0LCBsaW5lYnJlYWtwb3MsIG11bmdlLCB0cnVlLCBwcmVzZXJ2ZUFsbFNlbWlDb2xvbnMsDQotICAgICAgICAgICAgICAgIHByZXNlcnZlU3RyaW5nTGl0ZXJhbHMgKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoICggRXhjZXB0aW9uIGUgKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBDb21wcmVzc2lvbkV4Y2VwdGlvbiggIkZhaWxlZCB0byBjcmVhdGUgY29tcHJlc3NlZCBmaWxlIiwgZSwgaW5wdXQgKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGZpbmFsbHkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBJT1V0aWwuY2xvc2UoIG91dCApOw0KLSAgICAgICAgfQ0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvb2JmdXNjYXRvci9JbnB1dFNvdXJjZS5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9vYmZ1c2NhdG9yL0lucHV0U291cmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4MzRkYzUuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9vYmZ1c2NhdG9yL0lucHV0U291cmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5vYmZ1c2NhdG9yOwotCi1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLQotCi1wdWJsaWMgY2xhc3MgSW5wdXRTb3VyY2UKLXsKLSAgcHJpdmF0ZSBib29sZWFuIF9za2lwT2JmdXNjYXRpb247Ci0gIHByaXZhdGUgYm9vbGVhbiBfc2tpcFN0cmlwQ29tbWVudHM7Ci0gIHByaXZhdGUgYm9vbGVhbiBfc2tpcFN0cmlwV2hpdGVzcGFjZXM7Ci0gIHByaXZhdGUgYm9vbGVhbiBfc2tpcFN0cmlwTmV3bGluZXM7Ci0gIHByaXZhdGUgYm9vbGVhbiBfc2tpcFN0cmlwU3BlY2lhbEtleXdvcmRzOwotICBwcml2YXRlIElucHV0U3RyZWFtIF9pbjsKLQotICBwdWJsaWMgSW5wdXRTb3VyY2UoSW5wdXRTdHJlYW0gaW4sIGJvb2xlYW4gc2tpcE9iZnVzY2F0aW9uLAotICAgIGJvb2xlYW4gc2tpcFN0cmlwQ29tbWVudHMsIGJvb2xlYW4gc2tpcFN0cmlwV2hpdGVzcGFjZXMsCi0gICAgYm9vbGVhbiBza2lwU3RyaXBOZXdsaW5lcywgYm9vbGVhbiBza2lwU3RyaXBTcGVjaWFsS2V5d29yZHMpCi0gIHsKLSAgICBfaW4gPSBpbjsKLSAgICBfc2tpcE9iZnVzY2F0aW9uID0gc2tpcE9iZnVzY2F0aW9uOwotICAgIF9za2lwU3RyaXBDb21tZW50cyA9IHNraXBTdHJpcENvbW1lbnRzOwotICAgIF9za2lwU3RyaXBXaGl0ZXNwYWNlcyA9IHNraXBTdHJpcFdoaXRlc3BhY2VzOwotICAgIF9za2lwU3RyaXBOZXdsaW5lcyA9IHNraXBTdHJpcE5ld2xpbmVzOwotICAgIF9za2lwU3RyaXBTcGVjaWFsS2V5d29yZHMgPSBza2lwU3RyaXBTcGVjaWFsS2V5d29yZHM7Ci0gIH0KLQotICBwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW0oKQotICB7Ci0gICAgcmV0dXJuIF9pbjsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIHNraXBPYmZ1c2NhdGlvbigpCi0gIHsKLSAgICByZXR1cm4gX3NraXBPYmZ1c2NhdGlvbjsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIHNraXBTdHJpcENvbW1lbnRzKCkKLSAgewotICAgIHJldHVybiBfc2tpcFN0cmlwQ29tbWVudHM7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBza2lwU3RyaXBXaGl0ZXNwYWNlcygpCi0gIHsKLSAgICByZXR1cm4gX3NraXBTdHJpcFdoaXRlc3BhY2VzOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gc2tpcFN0cmlwTmV3bGluZXMoKQotICB7Ci0gICAgcmV0dXJuIF9za2lwU3RyaXBOZXdsaW5lczsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIHNraXBTdHJpcFNwZWNpYWxLZXl3b3JkcygpCi0gIHsKLSAgICByZXR1cm4gX3NraXBTdHJpcFNwZWNpYWxLZXl3b3JkczsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9vYmZ1c2NhdG9yL09iZnVzY2F0b3IuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvb2JmdXNjYXRvci9PYmZ1c2NhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiMzNmNTkuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9vYmZ1c2NhdG9yL09iZnVzY2F0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NyArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0Lm9iZnVzY2F0b3I7Ci0KLS8vfi0tLSBub24tSkRLIGltcG9ydHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5vYmZ1c2NhdG9yLmNvbmZpZ3VyYXRpb24uQ29uZmlnRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5vYmZ1c2NhdG9yLmNvbmZpZ3VyYXRpb24uT2JmdXNjYXRvckNvbmZpZzsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQub2JmdXNjYXRvci5maWx0ZXJzLk9iZnVzY2F0b3JGaWx0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0Lm9iZnVzY2F0b3IuZmlsdGVycy5jb21wcmVzc2lvbi5Db21wcmVzc2lvbkZpbHRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQub2JmdXNjYXRvci5maWx0ZXJzLmtleXdvcmRzLlNwZWNpYWxLZXl3b3Jkc0ZpbHRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQub2JmdXNjYXRvci5maWx0ZXJzLm9iZnVzY2F0aW9uLk9iZnVzY2F0aW9uRmlsdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5vYmZ1c2NhdG9yLmZpbHRlcnMub3V0cHV0Lk91dHB1dEdlbmVyYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQub2JmdXNjYXRvci5qYXZhc2NyaXB0MTVwYXJzZXIuQW5ub3RhdGVkVG9rZW47Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0Lm9iZnVzY2F0b3IuamF2YXNjcmlwdDE1cGFyc2VyLkpTUGFyc2VyMTU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0Lm9iZnVzY2F0b3IuamF2YXNjcmlwdDE1cGFyc2VyLlBhcnNlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC51aXh0b29scy5GaWxlUHJvY2Vzc29yOwotCi0vL34tLS0gSkRLIGltcG9ydHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5pby5GaWxlVXRpbHM7Ci0KLS8vfi0tLSBjbGFzc2VzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIGNsYXNzIE9iZnVzY2F0b3IKLSAgZXh0ZW5kcyBGaWxlUHJvY2Vzc29yCi17Ci0gIHByaXZhdGUgVmVjdG9yIF9maWx0ZXJzID0gbmV3IFZlY3RvcigpOwotCi0gIHByaXZhdGUgT2JmdXNjYXRvckZpbHRlciBfa2V5d29yZHNGaWx0ZXIgPSBuZXcgU3BlY2lhbEtleXdvcmRzRmlsdGVyKCk7Ci0KLSAgcHJpdmF0ZSBPYmZ1c2NhdGlvbkZpbHRlciBfb2JmdXNjYXRpb25GaWx0ZXIgPSBuZXcgT2JmdXNjYXRpb25GaWx0ZXIoKTsKLQotICBwcml2YXRlIE91dHB1dEdlbmVyYXRvciBfb3V0cHV0R2VuZXJhdG9yID0gbmV3IE91dHB1dEdlbmVyYXRvcigpOwotCi0gIHByaXZhdGUgT2JmdXNjYXRvckNvbmZpZyBfY29uZmlnOwotCi0gIHByaXZhdGUgSlNQYXJzZXIxNSBfanNQYXJzZXI7Ci0KLSAgcHJpdmF0ZSBib29sZWFuIF9vYmZ1c2NhdGU7Ci0KLSAgcHJpdmF0ZSBib29sZWFuIF9yZXBsYWNlQ2hhckxpdGVyYWxzOwotCi0gIHByaXZhdGUgYm9vbGVhbiBfc3RyaXBDb21tZW50czsKLQotICBwcml2YXRlIGJvb2xlYW4gX3N0cmlwTmV3bGluZXM7Ci0KLSAgcHJpdmF0ZSBib29sZWFuIF9zdHJpcFNwZWNpYWxLZXl3b3JkczsKLQotICBwcml2YXRlIGJvb2xlYW4gX3N0cmlwV2hpdGVzcGFjZXM7Ci0KLSAgLy9+LS0tIGNvbnN0cnVjdG9ycyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgcHVibGljIE9iZnVzY2F0b3IoYm9vbGVhbiBvYmZ1c2NhdGUsIGJvb2xlYW4gc3RyaXBDb21tZW50cywKLSAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBzdHJpcFdoaXRlc3BhY2VzLCBib29sZWFuIHN0cmlwTmV3bGluZXMsCi0gICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gc3RyaXBTcGVjaWFsS2V5d29yZHMsCi0gICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gcmVwbGFjZUNoYXJMaXRlcmFscywgT2JmdXNjYXRvckNvbmZpZyBjb25maWcpCi0gICAgdGhyb3dzIENvbmZpZ0V4Y2VwdGlvbgotICB7Ci0gICAgc3VwZXIoImpzIiwgZmFsc2UpOwotICAgIF9vYmZ1c2NhdGUgPSBvYmZ1c2NhdGU7Ci0gICAgX3N0cmlwQ29tbWVudHMgPSBzdHJpcENvbW1lbnRzOwotICAgIF9zdHJpcFdoaXRlc3BhY2VzID0gc3RyaXBXaGl0ZXNwYWNlczsKLSAgICBfc3RyaXBOZXdsaW5lcyA9IHN0cmlwTmV3bGluZXM7Ci0gICAgX3N0cmlwU3BlY2lhbEtleXdvcmRzID0gc3RyaXBTcGVjaWFsS2V5d29yZHM7Ci0gICAgX3JlcGxhY2VDaGFyTGl0ZXJhbHMgPSByZXBsYWNlQ2hhckxpdGVyYWxzOwotICAgIF9jb25maWcgPSBjb25maWc7Ci0gIH0KLQotICAvL34tLS0gbWV0aG9kcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICBwcml2YXRlIHZvaWQgaW5pdChJbnB1dFNvdXJjZSBpbikKLSAgewotCi0gICAgLy8gYXBwbHkgb3ZlcnJpZGVzCi0gICAgYm9vbGVhbiBvYmZ1c2NhdGUgPSBpbi5za2lwT2JmdXNjYXRpb24oKT8gZmFsc2U6IF9vYmZ1c2NhdGU7Ci0gICAgYm9vbGVhbiBzdHJpcENvbW1lbnRzID0gaW4uc2tpcFN0cmlwQ29tbWVudHMoKT8gZmFsc2U6IF9zdHJpcENvbW1lbnRzOwotICAgIGJvb2xlYW4gc3RyaXBXaGl0ZXNwYWNlcyA9Ci0gICAgICBpbi5za2lwU3RyaXBXaGl0ZXNwYWNlcygpPyBmYWxzZTogX3N0cmlwV2hpdGVzcGFjZXM7Ci0gICAgYm9vbGVhbiBzdHJpcE5ld0xpbmVzID0gaW4uc2tpcFN0cmlwTmV3bGluZXMoKT8gZmFsc2U6IF9zdHJpcE5ld2xpbmVzOwotICAgIGJvb2xlYW4gc3RyaXBTcGVjaWFsS2V5d29yZHMgPQotICAgICAgaW4uc2tpcFN0cmlwU3BlY2lhbEtleXdvcmRzKCk/IGZhbHNlOiBfc3RyaXBTcGVjaWFsS2V5d29yZHM7Ci0KLSAgICAvLyBzZXR1cCBmaWx0ZXJzCi0gICAgX2ZpbHRlcnMuY2xlYXIoKTsKLQotICAgIGlmIChzdHJpcFNwZWNpYWxLZXl3b3JkcykKLSAgICB7Ci0gICAgICBfZmlsdGVycy5hZGQoX2tleXdvcmRzRmlsdGVyKTsKLSAgICB9Ci0KLSAgICBpZiAoc3RyaXBXaGl0ZXNwYWNlcyB8fCBzdHJpcE5ld0xpbmVzIHx8IHN0cmlwQ29tbWVudHMpCi0gICAgewotICAgICAgX2ZpbHRlcnMKLSAgICAgIC5hZGQobmV3IENvbXByZXNzaW9uRmlsdGVyKHN0cmlwQ29tbWVudHMsIHN0cmlwV2hpdGVzcGFjZXMsIHN0cmlwTmV3TGluZXMpKTsKLSAgICB9Ci0KLSAgICBpZiAob2JmdXNjYXRlKQotICAgIHsKLSAgICAgIF9maWx0ZXJzLmFkZChfb2JmdXNjYXRpb25GaWx0ZXIpOwotICAgIH0KLQotICAgIC8vIG1ha2Ugb3V0cHV0IGdlbmVyYXRvciB0aGUgbGFzdCBmaWx0ZXIKLSAgICBfZmlsdGVycy5hZGQoX291dHB1dEdlbmVyYXRvcik7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgaW5pdFBhcnNlcihJbnB1dFN0cmVhbSBpbikKLSAgewotICAgIGlmIChfanNQYXJzZXIgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBfanNQYXJzZXIgPSBuZXcgSlNQYXJzZXIxNShpbik7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBfanNQYXJzZXIuUmVJbml0KGluKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBwcm9jZXNzKElucHV0U291cmNlIGluLCBPdXRwdXRTdHJlYW0gb3V0KQotICAgIHRocm93cyBQYXJzZUV4Y2VwdGlvbgotICB7Ci0gICAgaW5pdChpbik7Ci0gICAgX291dHB1dEdlbmVyYXRvci5zZXRPdXRwdXRTdHJlYW0ob3V0KTsKLQotICAgIEFubm90YXRlZFRva2VuIHRva2VuID0gdG9rZW5pemUoaW4uZ2V0SW5wdXRTdHJlYW0oKSk7Ci0KLSAgICBmb3IgKEl0ZXJhdG9yIGl0ciA9IF9maWx0ZXJzLml0ZXJhdG9yKCk7IGl0ci5oYXNOZXh0KCk7ICkKLSAgICB7Ci0gICAgICBPYmZ1c2NhdG9yRmlsdGVyIGZpbHRlciA9IChPYmZ1c2NhdG9yRmlsdGVyKSBpdHIubmV4dCgpOwotCi0gICAgICB0b2tlbiA9IGZpbHRlci5maWx0ZXIodG9rZW4pOwotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NGaWxlKEZpbGUgaW4sIEZpbGUgb3V0KQotICAgIHRocm93cyBFeGNlcHRpb24KLSAgewotICAgIGlmIChfb2JmdXNjYXRlID09IHRydWUpCi0gICAgewotICAgICAgRmlsZUlucHV0U3RyZWFtIGluU3RyZWFtID0gbmV3IEZpbGVJbnB1dFN0cmVhbShpbik7Ci0gICAgICBGaWxlT3V0cHV0U3RyZWFtIG91dFN0cmVhbSA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKG91dCk7Ci0gICAgICBTdHJpbmcgZmlsZU5hbWUgPSBpbi5nZXROYW1lKCk7Ci0gICAgICBJbnB1dFNvdXJjZSBpbnBTb3VyY2UgPQotICAgICAgICBuZXcgSW5wdXRTb3VyY2UoaW5TdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIF9jb25maWcuc2tpcE9iZnVzY2F0aW9uKGZpbGVOYW1lKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbmZpZy5za2lwU3RyaXBDb21tZW50cyhmaWxlTmFtZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIF9jb25maWcuc2tpcFN0cmlwV2hpdGVzcGFjZXMoZmlsZU5hbWUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICBfY29uZmlnLnNraXBTdHJpcE5ld2xpbmVzKGZpbGVOYW1lKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbmZpZy5za2lwU3RyaXBTcGVjaWFsS2V5d29yZHMoZmlsZU5hbWUpKTsKLQotICAgICAgcHJvY2VzcyhpbnBTb3VyY2UsIG91dFN0cmVhbSk7Ci0gICAgICBpblN0cmVhbS5jbG9zZSgpOwotICAgICAgb3V0U3RyZWFtLmNsb3NlKCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAvLyBKdXN0IGNvcHkgdGhlIGZpbGVzIG92ZXIuCi0gICAgICBGaWxlVXRpbHMudG91Y2gob3V0KTsKLSAgICAgIEZpbGVVdGlscy5jb3B5RmlsZShpbixvdXQpOwotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgQW5ub3RhdGVkVG9rZW4gdG9rZW5pemUoSW5wdXRTdHJlYW0gaW4pCi0gICAgdGhyb3dzIFBhcnNlRXhjZXB0aW9uCi0gIHsKLSAgICBpbml0UGFyc2VyKGluKTsKLQotICAgIHJldHVybiAoQW5ub3RhdGVkVG9rZW4pIF9qc1BhcnNlci5Qcm9ncmFtKCk7Ci0gIH0KLX0KLQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9vYmZ1c2NhdG9yL2NvbmZpZ3VyYXRpb24vQ29uZmlnRXhjZXB0aW9uLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L29iZnVzY2F0b3IvY29uZmlndXJhdGlvbi9Db25maWdFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTFmOTczMS4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L29iZnVzY2F0b3IvY29uZmlndXJhdGlvbi9Db25maWdFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0Lm9iZnVzY2F0b3IuY29uZmlndXJhdGlvbjsKLQotcHVibGljIGNsYXNzIENvbmZpZ0V4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbgotewotICBwdWJsaWMgQ29uZmlnRXhjZXB0aW9uKCkKLSAgewotICB9Ci0KLSAgcHVibGljIENvbmZpZ0V4Y2VwdGlvbihUaHJvd2FibGUgdCkKLSAgewotICAgIHN1cGVyKHQpOwotICB9Ci0KLSAgcHVibGljIENvbmZpZ0V4Y2VwdGlvbihTdHJpbmcgbXNnKQotICB7Ci0gICAgc3VwZXIobXNnKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9vYmZ1c2NhdG9yL2NvbmZpZ3VyYXRpb24vT2JmdXNjYXRvckNvbmZpZy5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9vYmZ1c2NhdG9yL2NvbmZpZ3VyYXRpb24vT2JmdXNjYXRvckNvbmZpZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZTcyODJlLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvb2JmdXNjYXRvci9jb25maWd1cmF0aW9uL09iZnVzY2F0b3JDb25maWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0Lm9iZnVzY2F0b3IuY29uZmlndXJhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLXB1YmxpYyBjbGFzcyBPYmZ1c2NhdG9yQ29uZmlnCi17Ci0gIHByaXZhdGUgVmVjdG9yIF9vYmZFeGNsdXNpb25zID0gbmV3IFZlY3RvcigpOwotICBwcml2YXRlIFZlY3RvciBfY29tbWVudHNFeGNsdXNpb25zID0gbmV3IFZlY3RvcigpOwotICBwcml2YXRlIFZlY3RvciBfd3NFeGNsdXNpb25zID0gbmV3IFZlY3RvcigpOwotICBwcml2YXRlIFZlY3RvciBfbmxFeGNsdXNpb25zID0gbmV3IFZlY3RvcigpOwotICBwcml2YXRlIFZlY3RvciBfa2V5d29yZEV4Y2x1c2lvbnMgPSBuZXcgVmVjdG9yKCk7Ci0KLSAgcHVibGljIE9iZnVzY2F0b3JDb25maWcoKSB0aHJvd3MgQ29uZmlnRXhjZXB0aW9uCi0gIHsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIHNraXBPYmZ1c2NhdGlvbihTdHJpbmcgZmlsZSkKLSAgewotICAgIHJldHVybiBfb2JmRXhjbHVzaW9ucy5jb250YWlucyhmaWxlKTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIHNraXBTdHJpcENvbW1lbnRzKFN0cmluZyBmaWxlKQotICB7Ci0gICAgcmV0dXJuIF9jb21tZW50c0V4Y2x1c2lvbnMuY29udGFpbnMoZmlsZSk7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBza2lwU3RyaXBXaGl0ZXNwYWNlcyhTdHJpbmcgZmlsZSkKLSAgewotICAgIHJldHVybiBfd3NFeGNsdXNpb25zLmNvbnRhaW5zKGZpbGUpOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gc2tpcFN0cmlwTmV3bGluZXMoU3RyaW5nIGZpbGUpCi0gIHsKLSAgICByZXR1cm4gX25sRXhjbHVzaW9ucy5jb250YWlucyhmaWxlKTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIHNraXBTdHJpcFNwZWNpYWxLZXl3b3JkcyhTdHJpbmcgZmlsZSkKLSAgewotICAgIHJldHVybiBfa2V5d29yZEV4Y2x1c2lvbnMuY29udGFpbnMoZmlsZSk7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgaW5pdCgpIHRocm93cyBDb25maWdFeGNlcHRpb24KLSAgewotICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L29iZnVzY2F0b3IvY29uZmlndXJhdGlvbi9jb25maWcueG1sIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9vYmZ1c2NhdG9yL2NvbmZpZ3VyYXRpb24vY29uZmlnLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGMxZjY2Yi4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L29iZnVzY2F0b3IvY29uZmlndXJhdGlvbi9jb25maWcueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0id2luZG93cy0xMjUyIiA/Pg0KLTwhLS0NCi0gICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gICAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gICAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICAgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gICAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi0gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gICAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gICAgdW5kZXIgdGhlIExpY2Vuc2UuDQotCSAgIA0KLS0tPg0KLTxvYmZ1c2NhdG9yPg0KLSAgPGlucHV0Pg0KLSAgICA8ZXhjbHVzaW9ucz4NCi0gICAgICA8b2JmdXNjYXRpb24+DQotICAgICAgPC9vYmZ1c2NhdGlvbj4NCi0gICAgICA8Y29tbWVudHM+DQotICAgICAgPC9jb21tZW50cz4NCi0gICAgICA8d2hpdGVzcGFjZXM+DQotICAgICAgPC93aGl0ZXNwYWNlcz4NCi0gICAgICA8bmV3bGluZXM+DQotICAgICAgPC9uZXdsaW5lcz4NCi0gICAgICA8c3BlY2lhbGtleXdvcmRzPg0KLSAgICAgICAgPGZpbGU+QXNzZXJ0LmpzPC9maWxlPg0KLSAgICAgICAgPGZpbGU+TG9nZ2VyLmpzPC9maWxlPiAgICAgIA0KLSAgICAgIDwvc3BlY2lhbGtleXdvcmRzPg0KLSAgICA8L2V4Y2x1c2lvbnM+DQotICA8L2lucHV0Pg0KLTwvb2JmdXNjYXRvcj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L29iZnVzY2F0b3IvZmlsdGVycy9PYmZ1c2NhdG9yRmlsdGVyLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L29iZnVzY2F0b3IvZmlsdGVycy9PYmZ1c2NhdG9yRmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkMjc0MDIuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9vYmZ1c2NhdG9yL2ZpbHRlcnMvT2JmdXNjYXRvckZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQub2JmdXNjYXRvci5maWx0ZXJzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0Lm9iZnVzY2F0b3IuamF2YXNjcmlwdDE1cGFyc2VyLkFubm90YXRlZFRva2VuOwotCi0KLXB1YmxpYyBpbnRlcmZhY2UgT2JmdXNjYXRvckZpbHRlcgotewotICBBbm5vdGF0ZWRUb2tlbiBmaWx0ZXIoQW5ub3RhdGVkVG9rZW4gc3RhcnRUb2tlbik7Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L29iZnVzY2F0b3IvZmlsdGVycy9jb21wcmVzc2lvbi9Db21tZW50c0hhbmRsZXIuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvb2JmdXNjYXRvci9maWx0ZXJzL2NvbXByZXNzaW9uL0NvbW1lbnRzSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZjIxMzE4Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvb2JmdXNjYXRvci9maWx0ZXJzL2NvbXByZXNzaW9uL0NvbW1lbnRzSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQub2JmdXNjYXRvci5maWx0ZXJzLmNvbXByZXNzaW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0Lm9iZnVzY2F0b3IuamF2YXNjcmlwdDE1cGFyc2VyLkFubm90YXRlZFRva2VuOwotCi0KLXB1YmxpYyBjbGFzcyBDb21tZW50c0hhbmRsZXIgaW1wbGVtZW50cyBDb21wcmVzc2lvbkhhbmRsZXIKLXsKLSAgcHVibGljIENvbW1lbnRzSGFuZGxlcigpCi0gIHsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGhhbmRsZShBbm5vdGF0ZWRUb2tlbiB0b2tlbiwgQW5ub3RhdGVkVG9rZW4gcHJldlRva2VuKQotICB7Ci0gICAgQW5ub3RhdGVkVG9rZW4gc3BlY2lhbFRva2VuID0gdG9rZW4uZ2V0U3BlY2lhbFRva2VuKCk7Ci0gICAgQW5ub3RhdGVkVG9rZW4gcHJldlNwZWNpYWxUb2tlbiA9IHRva2VuOwotCi0gICAgd2hpbGUgKHNwZWNpYWxUb2tlbiAhPSBudWxsKQotICAgIHsKLSAgICAgIC8vIHJlbW92ZSBzaW5nbGUgbGluZSBhbmQgbXVsdGlsaW5lIGNvbW1lbnRzCi0gICAgICBpZiAoc3BlY2lhbFRva2VuLmlzQ29tbWVudCgpKQotICAgICAgewotICAgICAgICBwcmV2U3BlY2lhbFRva2VuLnNwZWNpYWxUb2tlbiA9IHNwZWNpYWxUb2tlbi5zcGVjaWFsVG9rZW47Ci0gICAgICAgIHNwZWNpYWxUb2tlbiA9IHNwZWNpYWxUb2tlbi5nZXRTcGVjaWFsVG9rZW4oKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgcHJldlNwZWNpYWxUb2tlbiA9IHNwZWNpYWxUb2tlbjsKLSAgICAgICAgc3BlY2lhbFRva2VuID0gc3BlY2lhbFRva2VuLmdldFNwZWNpYWxUb2tlbigpOwotICAgICAgfQotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9vYmZ1c2NhdG9yL2ZpbHRlcnMvY29tcHJlc3Npb24vQ29tcHJlc3Npb25GaWx0ZXIuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvb2JmdXNjYXRvci9maWx0ZXJzL2NvbXByZXNzaW9uL0NvbXByZXNzaW9uRmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzNzVhNGIuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9vYmZ1c2NhdG9yL2ZpbHRlcnMvY29tcHJlc3Npb24vQ29tcHJlc3Npb25GaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0Lm9iZnVzY2F0b3IuZmlsdGVycy5jb21wcmVzc2lvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5vYmZ1c2NhdG9yLmZpbHRlcnMuT2JmdXNjYXRvckZpbHRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQub2JmdXNjYXRvci5qYXZhc2NyaXB0MTVwYXJzZXIuQW5ub3RhdGVkVG9rZW47Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotCi1wdWJsaWMgY2xhc3MgQ29tcHJlc3Npb25GaWx0ZXIgaW1wbGVtZW50cyBPYmZ1c2NhdG9yRmlsdGVyCi17Ci0gIHByaXZhdGUgYm9vbGVhbiBfc3RyaXBDb21tZW50czsKLSAgcHJpdmF0ZSBib29sZWFuIF9zdHJpcFdoaXRlc3BhY2VzOwotICBwcml2YXRlIGJvb2xlYW4gX3N0cmlwTmV3bGluZXM7Ci0gIHByaXZhdGUgVmVjdG9yIF9oYW5kbGVycyA9IG5ldyBWZWN0b3IoKTsKLQotICBwdWJsaWMgQ29tcHJlc3Npb25GaWx0ZXIoYm9vbGVhbiBzdHJpcENvbW1lbnRzLCBib29sZWFuIHN0cmlwV2hpdGVzcGFjZXMsCi0gICAgYm9vbGVhbiBzdHJpcE5ld2xpbmVzKQotICB7Ci0gICAgX3N0cmlwQ29tbWVudHMgPSBzdHJpcENvbW1lbnRzOwotICAgIF9zdHJpcFdoaXRlc3BhY2VzID0gc3RyaXBXaGl0ZXNwYWNlczsKLSAgICBfc3RyaXBOZXdsaW5lcyA9IHN0cmlwTmV3bGluZXM7Ci0KLSAgICAvLyBjcmVhdGUgYSBzZXQgb2YgaGFuZGxlcnMgYmFzZWQgb24gc3VwcGxpZWQgb3B0aW9ucwotICAgIGluaXQoKTsKLSAgfQotCi0gIHB1YmxpYyBBbm5vdGF0ZWRUb2tlbiBmaWx0ZXIoQW5ub3RhdGVkVG9rZW4gc3RhcnRUb2tlbikKLSAgewotICAgIEFubm90YXRlZFRva2VuIHRva2VuID0gc3RhcnRUb2tlbjsKLSAgICBBbm5vdGF0ZWRUb2tlbiBwcmV2VG9rZW4gPSBudWxsOwotCi0gICAgd2hpbGUgKHRva2VuICE9IG51bGwpCi0gICAgewotICAgICAgLy8gaGFuZCBvZmYgdG8gaGFuZGxlcnMKLSAgICAgIC8vIHRvZG86IGlubGluZSB0aGVzZSBpZiB0aGlzIGlzIHRvbyBleHBlbnNpdmUKLSAgICAgIGZvciAoSXRlcmF0b3IgaXRyID0gX2hhbmRsZXJzLml0ZXJhdG9yKCk7IGl0ci5oYXNOZXh0KCk7KQotICAgICAgewotICAgICAgICBDb21wcmVzc2lvbkhhbmRsZXIgaGFuZGxlciA9IChDb21wcmVzc2lvbkhhbmRsZXIpIGl0ci5uZXh0KCk7Ci0gICAgICAgIGhhbmRsZXIuaGFuZGxlKHRva2VuLCBwcmV2VG9rZW4pOwotICAgICAgfQotCi0gICAgICBwcmV2VG9rZW4gPSB0b2tlbjsKLSAgICAgIHRva2VuID0gdG9rZW4uZ2V0TmV4dCgpOwotICAgIH0KLQotICAgIHJldHVybiBzdGFydFRva2VuOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIGluaXQoKQotICB7Ci0gICAgaWYgKF9zdHJpcENvbW1lbnRzKQotICAgIHsKLSAgICAgIF9oYW5kbGVycy5hZGQobmV3IENvbW1lbnRzSGFuZGxlcigpKTsKLSAgICB9Ci0KLSAgICBpZiAoX3N0cmlwV2hpdGVzcGFjZXMpCi0gICAgewotICAgICAgX2hhbmRsZXJzLmFkZChuZXcgV2hpdGVzcGFjZUhhbmRsZXIoKSk7Ci0gICAgfQotCi0gICAgaWYgKF9zdHJpcE5ld2xpbmVzKQotICAgIHsKLSAgICAgIF9oYW5kbGVycy5hZGQobmV3IE5ld2xpbmVIYW5kbGVyKCkpOwotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9vYmZ1c2NhdG9yL2ZpbHRlcnMvY29tcHJlc3Npb24vQ29tcHJlc3Npb25IYW5kbGVyLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L29iZnVzY2F0b3IvZmlsdGVycy9jb21wcmVzc2lvbi9Db21wcmVzc2lvbkhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzIwYmEzNi4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L29iZnVzY2F0b3IvZmlsdGVycy9jb21wcmVzc2lvbi9Db21wcmVzc2lvbkhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0Lm9iZnVzY2F0b3IuZmlsdGVycy5jb21wcmVzc2lvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5vYmZ1c2NhdG9yLmphdmFzY3JpcHQxNXBhcnNlci5Bbm5vdGF0ZWRUb2tlbjsKLQotCi1wdWJsaWMgaW50ZXJmYWNlIENvbXByZXNzaW9uSGFuZGxlcgotewotICB2b2lkIGhhbmRsZShBbm5vdGF0ZWRUb2tlbiB0b2tlbiwgQW5ub3RhdGVkVG9rZW4gcHJldlRva2VuKTsKLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvb2JmdXNjYXRvci9maWx0ZXJzL2NvbXByZXNzaW9uL05ld2xpbmVIYW5kbGVyLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L29iZnVzY2F0b3IvZmlsdGVycy9jb21wcmVzc2lvbi9OZXdsaW5lSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MDIyYmY3Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvb2JmdXNjYXRvci9maWx0ZXJzL2NvbXByZXNzaW9uL05ld2xpbmVIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5vYmZ1c2NhdG9yLmZpbHRlcnMuY29tcHJlc3Npb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQub2JmdXNjYXRvci5qYXZhc2NyaXB0MTVwYXJzZXIuQW5ub3RhdGVkVG9rZW47Ci0KLQotcHVibGljIGNsYXNzIE5ld2xpbmVIYW5kbGVyIGltcGxlbWVudHMgQ29tcHJlc3Npb25IYW5kbGVyCi17Ci0gIHB1YmxpYyBOZXdsaW5lSGFuZGxlcigpCi0gIHsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGhhbmRsZShBbm5vdGF0ZWRUb2tlbiB0b2tlbiwgQW5ub3RhdGVkVG9rZW4gcHJldlRva2VuKQotICB7Ci0gICAgQW5ub3RhdGVkVG9rZW4gc3BlY2lhbFRva2VuID0gdG9rZW4uZ2V0U3BlY2lhbFRva2VuKCk7Ci0gICAgQW5ub3RhdGVkVG9rZW4gcHJldlNwZWNpYWxUb2tlbiA9IHRva2VuOwotICAgIGJvb2xlYW4gc2tpcE9uZSA9IChwcmV2VG9rZW4gPT0gbnVsbCkgPyBmYWxzZSA6IHRydWU7Ci0KLSAgICB3aGlsZSAoc3BlY2lhbFRva2VuICE9IG51bGwpCi0gICAgewotICAgICAgaWYgKHNwZWNpYWxUb2tlbi5pc05ld0xpbmUoKSkKLSAgICAgIHsKLSAgICAgICAgaWYgKHNraXBPbmUpCi0gICAgICAgIHsKLSAgICAgICAgICBza2lwT25lID0gZmFsc2U7Ci0gICAgICAgICAgc3BlY2lhbFRva2VuLmltYWdlID0gIlxyXG4iOwotICAgICAgICAgIHByZXZTcGVjaWFsVG9rZW4gPSBzcGVjaWFsVG9rZW47Ci0gICAgICAgICAgc3BlY2lhbFRva2VuID0gc3BlY2lhbFRva2VuLmdldFNwZWNpYWxUb2tlbigpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIHByZXZTcGVjaWFsVG9rZW4uc3BlY2lhbFRva2VuID0gc3BlY2lhbFRva2VuLnNwZWNpYWxUb2tlbjsKLSAgICAgICAgICBzcGVjaWFsVG9rZW4gPSBzcGVjaWFsVG9rZW4uZ2V0U3BlY2lhbFRva2VuKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgcHJldlNwZWNpYWxUb2tlbiA9IHNwZWNpYWxUb2tlbjsKLSAgICAgICAgc3BlY2lhbFRva2VuID0gc3BlY2lhbFRva2VuLmdldFNwZWNpYWxUb2tlbigpOwotICAgICAgfQotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9vYmZ1c2NhdG9yL2ZpbHRlcnMvY29tcHJlc3Npb24vV2hpdGVzcGFjZUhhbmRsZXIuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvb2JmdXNjYXRvci9maWx0ZXJzL2NvbXByZXNzaW9uL1doaXRlc3BhY2VIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjNmI4MzguLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9vYmZ1c2NhdG9yL2ZpbHRlcnMvY29tcHJlc3Npb24vV2hpdGVzcGFjZUhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0Lm9iZnVzY2F0b3IuZmlsdGVycy5jb21wcmVzc2lvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5vYmZ1c2NhdG9yLmphdmFzY3JpcHQxNXBhcnNlci5Bbm5vdGF0ZWRUb2tlbjsKLQotCi1wdWJsaWMgY2xhc3MgV2hpdGVzcGFjZUhhbmRsZXIgaW1wbGVtZW50cyBDb21wcmVzc2lvbkhhbmRsZXIKLXsKLSAgcHVibGljIFdoaXRlc3BhY2VIYW5kbGVyKCkKLSAgewotICB9Ci0KLSAgcHVibGljIHZvaWQgaGFuZGxlKEFubm90YXRlZFRva2VuIHRva2VuLCBBbm5vdGF0ZWRUb2tlbiBwcmV2VG9rZW4pCi0gIHsKLSAgICBBbm5vdGF0ZWRUb2tlbiBzcGVjaWFsVG9rZW4gPSB0b2tlbi5nZXRTcGVjaWFsVG9rZW4oKTsKLSAgICBBbm5vdGF0ZWRUb2tlbiBwcmV2U3BlY2lhbFRva2VuID0gdG9rZW47Ci0gICAgYm9vbGVhbiBza2lwT25lID0gKHByZXZUb2tlbiA9PSBudWxsKSA/IGZhbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IChwcmV2VG9rZW4uaXNXU1NlbnNpdGl2ZSgpIHx8Ci0gICAgICB0b2tlbi5pc0luZml4V1NTZW5zaXRpdmUoKSk7Ci0KLSAgICB3aGlsZSAoc3BlY2lhbFRva2VuICE9IG51bGwpCi0gICAgewotICAgICAgLy8gcmVtb3ZlIHdoaXRlc3BhY2UuIEtlZXAgb25lIGlmIHRoZSB0b2tlbiBpcyB3aGl0ZXNwYWNlIHNlbnNpdGl2ZQotICAgICAgaWYgKHNwZWNpYWxUb2tlbi5pc1doaXRlU3BhY2UoKSkKLSAgICAgIHsKLSAgICAgICAgaWYgKHNraXBPbmUpCi0gICAgICAgIHsKLSAgICAgICAgICBza2lwT25lID0gZmFsc2U7Ci0gICAgICAgICAgc3BlY2lhbFRva2VuLmltYWdlID0gIiAiOwotICAgICAgICAgIHByZXZTcGVjaWFsVG9rZW4gPSBzcGVjaWFsVG9rZW47Ci0gICAgICAgICAgc3BlY2lhbFRva2VuID0gc3BlY2lhbFRva2VuLmdldFNwZWNpYWxUb2tlbigpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIHByZXZTcGVjaWFsVG9rZW4uc3BlY2lhbFRva2VuID0gc3BlY2lhbFRva2VuLnNwZWNpYWxUb2tlbjsKLSAgICAgICAgICBzcGVjaWFsVG9rZW4gPSBzcGVjaWFsVG9rZW4uZ2V0U3BlY2lhbFRva2VuKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgcHJldlNwZWNpYWxUb2tlbiA9IHNwZWNpYWxUb2tlbjsKLSAgICAgICAgc3BlY2lhbFRva2VuID0gc3BlY2lhbFRva2VuLmdldFNwZWNpYWxUb2tlbigpOwotICAgICAgfQotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9vYmZ1c2NhdG9yL2ZpbHRlcnMva2V5d29yZHMvU3BlY2lhbEtleXdvcmRzRmlsdGVyLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L29iZnVzY2F0b3IvZmlsdGVycy9rZXl3b3Jkcy9TcGVjaWFsS2V5d29yZHNGaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDE5YzA1MC4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L29iZnVzY2F0b3IvZmlsdGVycy9rZXl3b3Jkcy9TcGVjaWFsS2V5d29yZHNGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMCArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5vYmZ1c2NhdG9yLmZpbHRlcnMua2V5d29yZHM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQub2JmdXNjYXRvci5maWx0ZXJzLk9iZnVzY2F0b3JGaWx0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0Lm9iZnVzY2F0b3IuamF2YXNjcmlwdDE1cGFyc2VyLkFubm90YXRlZFRva2VuOwotCi0KLXB1YmxpYyBjbGFzcyBTcGVjaWFsS2V5d29yZHNGaWx0ZXIgaW1wbGVtZW50cyBPYmZ1c2NhdG9yRmlsdGVyCi17Ci0gIHB1YmxpYyBTcGVjaWFsS2V5d29yZHNGaWx0ZXIoKQotICB7Ci0gIH0KLQotICBwdWJsaWMgQW5ub3RhdGVkVG9rZW4gZmlsdGVyKEFubm90YXRlZFRva2VuIHN0YXJ0VG9rZW4pCi0gIHsKLSAgICBBbm5vdGF0ZWRUb2tlbiB0b2tlbiA9IHN0YXJ0VG9rZW47Ci0gICAgdG9rZW4gPSByZW1vdmVTcGVjaWFsVHlwZXModG9rZW4pOwotCi0gICAgcmV0dXJuIHRva2VuOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgcmVtb3ZlU3BlY2lhbFRva2VucyhBbm5vdGF0ZWRUb2tlbiB0b2tlbikKLSAgewotICAgIEFubm90YXRlZFRva2VuIHNwZWNpYWxUb2tlbiA9IHRva2VuLmdldFNwZWNpYWxUb2tlbigpOwotICAgIEFubm90YXRlZFRva2VuIHByZXZTcGVjaWFsVG9rZW4gPSB0b2tlbjsKLQotICAgIHdoaWxlIChzcGVjaWFsVG9rZW4gIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpZiAoc3BlY2lhbFRva2VuLmlzUmVtb3ZhYmxlS2V5d29yZCgpKQotICAgICAgewotICAgICAgICBwcmV2U3BlY2lhbFRva2VuLnNwZWNpYWxUb2tlbiA9IHNwZWNpYWxUb2tlbi5zcGVjaWFsVG9rZW47Ci0gICAgICAgIHNwZWNpYWxUb2tlbiA9IHNwZWNpYWxUb2tlbi5nZXRTcGVjaWFsVG9rZW4oKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgcHJldlNwZWNpYWxUb2tlbiA9IHNwZWNpYWxUb2tlbjsKLSAgICAgICAgc3BlY2lhbFRva2VuID0gc3BlY2lhbFRva2VuLmdldFNwZWNpYWxUb2tlbigpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBUaGUgbWFpbiBsb29wIHJlbW92ZXMgc3BlY2lhbCB0eXBlcyAobGlrZSBQcm9maWxlciwgYW5kIENoZWNrUG9pbnQpIGFuZAotICAgKiBhbGwgbWV0aG9kIGludm9jYXRpb25zIHVzaW5nIHZhcmlhYmxlcyBvZiB0aGVzZSB0eXBlcy4gVGhlIG1haW4KLSAgICogbG9vcCBjYWxscyByZW1vdmVTcGVjaWFsVG9rZW5zIHdoaWNoIHJlbW92ZXMgc3BlY2lhbCBrZXl3b3JkcyBsaWtlIEFzc2VydAotICAgKiBhbmQgTG9nZ2VyLCB3aGljaCB3ZXJlIHRhZ2dlZCBieSB0aGUgcGFyc2VyIGFzIFNwZWNpYWxUb2tlbnMKLSAgICogQHBhcmFtIHN0YXJ0VG9rZW4KLSAgICogQHJldHVybgotICAgKi8KLSAgcHJvdGVjdGVkIEFubm90YXRlZFRva2VuIHJlbW92ZVNwZWNpYWxUeXBlcyhBbm5vdGF0ZWRUb2tlbiBzdGFydFRva2VuKQotICB7Ci0gICAgQW5ub3RhdGVkVG9rZW4gdG9rZW4gPSBzdGFydFRva2VuOwotICAgIEFubm90YXRlZFRva2VuIHByZXZUb2tlbiA9IG51bGw7Ci0gICAgQW5ub3RhdGVkVG9rZW4gbmV3U3RhcnRUb2tlbiA9IG51bGw7Ci0KLSAgICB3aGlsZSAodG9rZW4gIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpZiAodG9rZW4uY2FuUmVtb3ZlKCkpCi0gICAgICB7Ci0gICAgICAgIGlmIChwcmV2VG9rZW4gIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIHByZXZUb2tlbi5uZXh0ID0gdG9rZW4uZ2V0TmV4dCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgdG9rZW4gPSB0b2tlbi5nZXROZXh0KCk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHJlbW92ZVNwZWNpYWxUb2tlbnModG9rZW4pOwotCi0gICAgICAgIGlmIChuZXdTdGFydFRva2VuID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBuZXdTdGFydFRva2VuID0gdG9rZW47Ci0gICAgICAgIH0KLQotICAgICAgICBwcmV2VG9rZW4gPSB0b2tlbjsKLSAgICAgICAgdG9rZW4gPSB0b2tlbi5nZXROZXh0KCk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIG5ld1N0YXJ0VG9rZW47Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvb2JmdXNjYXRvci9maWx0ZXJzL29iZnVzY2F0aW9uL09iZnVzY2F0aW9uRmlsdGVyLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L29iZnVzY2F0b3IvZmlsdGVycy9vYmZ1c2NhdGlvbi9PYmZ1c2NhdGlvbkZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNTkwNzMxLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvb2JmdXNjYXRvci9maWx0ZXJzL29iZnVzY2F0aW9uL09iZnVzY2F0aW9uRmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5vYmZ1c2NhdG9yLmZpbHRlcnMub2JmdXNjYXRpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQub2JmdXNjYXRvci5maWx0ZXJzLk9iZnVzY2F0b3JGaWx0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0Lm9iZnVzY2F0b3IuZmlsdGVycy5vYmZ1c2NhdGlvbi5zdGF0ZS5Sb290U3RhdGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0Lm9iZnVzY2F0b3IuamF2YXNjcmlwdDE1cGFyc2VyLkFubm90YXRlZFRva2VuOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5vYmZ1c2NhdG9yLmphdmFzY3JpcHQxNXBhcnNlci5Qcm9ncmFtQ29udGV4dFN0YWNrOwotCi0KLXB1YmxpYyBjbGFzcyBPYmZ1c2NhdGlvbkZpbHRlciBpbXBsZW1lbnRzIE9iZnVzY2F0b3JGaWx0ZXIKLXsKLSAgcHVibGljIE9iZnVzY2F0aW9uRmlsdGVyKCkKLSAgewotICB9Ci0KLSAgcHVibGljIEFubm90YXRlZFRva2VuIGZpbHRlcihBbm5vdGF0ZWRUb2tlbiBzdGFydFRva2VuKQotICB7Ci0gICAgaWYgKHN0YXJ0VG9rZW4gIT0gbnVsbCkKLSAgICB7Ci0gICAgICAvLyB0cmFuc2l0aW9uIHRvIHJvb3Qgc3RhdGUKLSAgICAgIFByb2dyYW1Db250ZXh0U3RhY2sgcHJvZ3JhbUNvbnRleHRTdGFjayA9IG5ldyBQcm9ncmFtQ29udGV4dFN0YWNrKCk7Ci0gICAgICBSb290U3RhdGUuZ2V0SW5zdGFuY2UoKS5lbnRlclN0YXRlKHByb2dyYW1Db250ZXh0U3RhY2ssIHN0YXJ0VG9rZW4sIG51bGwpOwotICAgIH0KLQotICAgIHJldHVybiBzdGFydFRva2VuOwotICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L29iZnVzY2F0b3IvZmlsdGVycy9vYmZ1c2NhdGlvbi9zdGF0ZS9GdW5jdGlvbkNvbnRleHQuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvb2JmdXNjYXRvci9maWx0ZXJzL29iZnVzY2F0aW9uL3N0YXRlL0Z1bmN0aW9uQ29udGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MTlhMWM0Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvb2JmdXNjYXRvci9maWx0ZXJzL29iZnVzY2F0aW9uL3N0YXRlL0Z1bmN0aW9uQ29udGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQub2JmdXNjYXRvci5maWx0ZXJzLm9iZnVzY2F0aW9uLnN0YXRlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0Lm9iZnVzY2F0b3IuamF2YXNjcmlwdDE1cGFyc2VyLk5hbWVHZW47Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0Lm9iZnVzY2F0b3IuamF2YXNjcmlwdDE1cGFyc2VyLlByb2dyYW1Db250ZXh0OwotCi0KLXB1YmxpYyBjbGFzcyBGdW5jdGlvbkNvbnRleHQgZXh0ZW5kcyBQcm9ncmFtQ29udGV4dCB7Ci0gICAgcHJpdmF0ZSBib29sZWFuIF9vYmZ1c2NhdGVMb2NhbFZhcnM7Ci0KLSAgICBwdWJsaWMgRnVuY3Rpb25Db250ZXh0KFN0cmluZyBuYW1lLCBib29sZWFuIG9iZnVzY2F0ZUxvY2FsVmFycykgewotICAgICAgICBzdXBlcihuYW1lKTsKLSAgICAgICAgX29iZnVzY2F0ZUxvY2FsVmFycyA9IG9iZnVzY2F0ZUxvY2FsVmFyczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRnVuY3Rpb25Db250ZXh0KFN0cmluZyBuYW1lLCBOYW1lR2VuIG5hbWVHZW4sIGJvb2xlYW4gdXNlc0V2YWwpIHsKLSAgICAgICAgc3VwZXIobmFtZSwgbmFtZUdlbik7Ci0gICAgICAgIF9vYmZ1c2NhdGVMb2NhbFZhcnMgPSB1c2VzRXZhbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRPYmZ1c2NhdGVMb2NhbFZhcnMoYm9vbGVhbiBvYmZ1c2NhdGVMb2NhbFZhcnMpIHsKLSAgICAgICAgX29iZnVzY2F0ZUxvY2FsVmFycyA9IG9iZnVzY2F0ZUxvY2FsVmFyczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBjYW5PYmZ1c2NhdGVMb2NhbFZhcnMoKSB7Ci0gICAgICAgIHJldHVybiBfb2JmdXNjYXRlTG9jYWxWYXJzOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvb2JmdXNjYXRvci9maWx0ZXJzL29iZnVzY2F0aW9uL3N0YXRlL0Z1bmN0aW9uU3RhdGUuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvb2JmdXNjYXRvci9maWx0ZXJzL29iZnVzY2F0aW9uL3N0YXRlL0Z1bmN0aW9uU3RhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTk4OTU4Mi4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L29iZnVzY2F0b3IvZmlsdGVycy9vYmZ1c2NhdGlvbi9zdGF0ZS9GdW5jdGlvblN0YXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQub2JmdXNjYXRvci5maWx0ZXJzLm9iZnVzY2F0aW9uLnN0YXRlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0Lm9iZnVzY2F0b3IuamF2YXNjcmlwdDE1cGFyc2VyLkFubm90YXRlZFRva2VuOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5vYmZ1c2NhdG9yLmphdmFzY3JpcHQxNXBhcnNlci5Bbm5vdGF0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5vYmZ1c2NhdG9yLmphdmFzY3JpcHQxNXBhcnNlci5KU1BhcnNlcjE1Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5vYmZ1c2NhdG9yLmphdmFzY3JpcHQxNXBhcnNlci5OYW1lR2VuOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5vYmZ1c2NhdG9yLmphdmFzY3JpcHQxNXBhcnNlci5Qcm9ncmFtQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQub2JmdXNjYXRvci5qYXZhc2NyaXB0MTVwYXJzZXIuUHJvZ3JhbUNvbnRleHRTdGFjazsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi0KLXB1YmxpYyBjbGFzcyBGdW5jdGlvblN0YXRlIGV4dGVuZHMgT2JmdXNjYXRpb25TdGF0ZQotewotICBzdGF0aWMgcHJpdmF0ZSBGdW5jdGlvblN0YXRlIF9pbnN0YW5jZTsKLQotICAvLyBwcml2YXRlIGNvbnN0cnVuY3RvciBmb3Igc2luZ2xldG9uCi0gIHByaXZhdGUgRnVuY3Rpb25TdGF0ZSgpCi0gIHsKLSAgfQotCi0gIHN0YXRpYyBwdWJsaWMgRnVuY3Rpb25TdGF0ZSBnZXRJbnN0YW5jZSgpCi0gIHsKLSAgICBpZiAoX2luc3RhbmNlID09IG51bGwpCi0gICAgewotICAgICAgc3luY2hyb25pemVkIChGdW5jdGlvblN0YXRlLmNsYXNzKQotICAgICAgewotICAgICAgICBpZiAoX2luc3RhbmNlID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBfaW5zdGFuY2UgPSBuZXcgRnVuY3Rpb25TdGF0ZSgpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIF9pbnN0YW5jZTsKLSAgfQotCi0gIHB1YmxpYyBBbm5vdGF0ZWRUb2tlbiBlbnRlclN0YXRlKFByb2dyYW1Db250ZXh0U3RhY2sgY29udGV4dFN0YWNrLAotICAgIEFubm90YXRlZFRva2VuIHN0YXJ0VG9rZW4sIE5hbWVHZW4gbmFtZUdlbikKLSAgewotICAgIEZ1bmN0aW9uQ29udGV4dCBmdW5jdGlvbkNvbnRleHQ7Ci0gICAgQW5ub3RhdGVkVG9rZW4gdG9rZW4gPSBzdGFydFRva2VuOwotICAgIFN0cmluZyBjb250ZXh0TmFtZSA9ICJBbm9ueW1vdXNGdW5jdGlvbiI7Ci0gICAgVmVjdG9yIHBhcmFtcyA9IChWZWN0b3IpIHRva2VuLmdldEFubm90YXRpb25PYmplY3QoKTsKLSAgICBib29sZWFuIG9iZnVzY2F0ZUxvY2FsVmFycyA9ICF0b2tlbi5mdW5jdGlvblVzZXNFdmFsKCk7Ci0KLSAgICBpZiAodG9rZW4uZ2V0S2luZCgpID09IEFubm90YXRpb25Db25zdGFudHMuTkFNRURfRlVOQ1RJT04pCi0gICAgewotICAgICAgLy8gZ3JhYiB0aGUgZnVuY3Rpb24gbmFtZQotICAgICAgdG9rZW4gPSB0b2tlbi5nZXROZXh0KCk7Ci0gICAgICBjb250ZXh0TmFtZSA9IHRva2VuLmltYWdlOwotICAgICAgZnVuY3Rpb25Db250ZXh0ID0gbmV3IEZ1bmN0aW9uQ29udGV4dChjb250ZXh0TmFtZSwgb2JmdXNjYXRlTG9jYWxWYXJzKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIC8vIHJldXNlIHRoZSBzeW1ib2wgbmFtZSBnZW5lcmF0b3IgZm9yIGFub255bW91cyBmdW5jdGlvbnMKLSAgICAgIGZ1bmN0aW9uQ29udGV4dCA9IG5ldyBGdW5jdGlvbkNvbnRleHQoY29udGV4dE5hbWUsIG5hbWVHZW4sCi0gICAgICAgICAgb2JmdXNjYXRlTG9jYWxWYXJzKTsKLSAgICB9Ci0KLSAgICBpZiAob2JmdXNjYXRlTG9jYWxWYXJzKQotICAgIHsKLSAgICAgIG9iZnVzY2F0ZUZ1bmN0aW9uUGFyYW1zKHBhcmFtcywgZnVuY3Rpb25Db250ZXh0KTsKLSAgICB9Ci0KLSAgICB3aGlsZSAodG9rZW4ua2luZCAhPSBKU1BhcnNlcjE1Q29uc3RhbnRzLkxCUkFDRSkKLSAgICB7Ci0gICAgICB0b2tlbiA9IHRva2VuLmdldE5leHQoKTsKLSAgICB9Ci0KLSAgICB0b2tlbiA9IHRva2VuLmdldE5leHQoKTsKLSAgICBjb250ZXh0U3RhY2sucHVzaENvbnRleHQoZnVuY3Rpb25Db250ZXh0KTsKLQotICAgIHJldHVybiBwcm9jZXNzQ29kZUJsb2NrKGNvbnRleHRTdGFjaywgdG9rZW4pOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIG9iZnVzY2F0ZUZ1bmN0aW9uUGFyYW1zKFZlY3RvciBwYXJhbXMsCi0gICAgUHJvZ3JhbUNvbnRleHQgZnVuY3Rpb25Db250ZXh0KQotICB7Ci0gICAgZm9yIChJdGVyYXRvciBpdHIgPSBwYXJhbXMuaXRlcmF0b3IoKTsgaXRyLmhhc05leHQoKTspCi0gICAgewotICAgICAgQW5ub3RhdGVkVG9rZW4gcGFyYW1Ub2tlbiA9IChBbm5vdGF0ZWRUb2tlbikgaXRyLm5leHQoKTsKLSAgICAgIGZ1bmN0aW9uQ29udGV4dC5hZGRUb2tlbihwYXJhbVRva2VuLmltYWdlLCBwYXJhbVRva2VuKTsKLSAgICAgIHBhcmFtVG9rZW4uaW1hZ2UgPSBmdW5jdGlvbkNvbnRleHQuZ2VuZXJhdGVTeW1ib2xOYW1lKCk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgZXhpdFN0YXRlKFByb2dyYW1Db250ZXh0U3RhY2sgY29udGV4dFN0YWNrKQotICB7Ci0gICAgY29udGV4dFN0YWNrLnBvcENvbnRleHQoKTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NWYXJJZGVudGlmaWVyKFByb2dyYW1Db250ZXh0U3RhY2sgY29udGV4dFN0YWNrLAotICAgIEFubm90YXRlZFRva2VuIHRva2VuKQotICB7Ci0gICAgRnVuY3Rpb25Db250ZXh0IGZ1bmN0aW9uQ29udGV4dCA9IChGdW5jdGlvbkNvbnRleHQpIGNvbnRleHRTdGFjay5wZWVrKCk7Ci0KLSAgICAvLyBub3JtYWwgcHJvY2Vzc2luZyBmb3IgZnVuY3Rpb25zIHRoYXQgZG8gbm90IHVzZSBldmFsKCkgY2FsbHMKLSAgICBpZiAoZnVuY3Rpb25Db250ZXh0LmNhbk9iZnVzY2F0ZUxvY2FsVmFycygpKQotICAgIHsKLSAgICAgIHN1cGVyLnByb2Nlc3NWYXJJZGVudGlmaWVyKGNvbnRleHRTdGFjaywgdG9rZW4pOwotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9vYmZ1c2NhdG9yL2ZpbHRlcnMvb2JmdXNjYXRpb24vc3RhdGUvT2JmdXNjYXRpb25TdGF0ZS5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9vYmZ1c2NhdG9yL2ZpbHRlcnMvb2JmdXNjYXRpb24vc3RhdGUvT2JmdXNjYXRpb25TdGF0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMGUxNmM5Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvb2JmdXNjYXRvci9maWx0ZXJzL29iZnVzY2F0aW9uL3N0YXRlL09iZnVzY2F0aW9uU3RhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNyArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5vYmZ1c2NhdG9yLmZpbHRlcnMub2JmdXNjYXRpb24uc3RhdGU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQub2JmdXNjYXRvci5qYXZhc2NyaXB0MTVwYXJzZXIuQW5ub3RhdGVkVG9rZW47Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0Lm9iZnVzY2F0b3IuamF2YXNjcmlwdDE1cGFyc2VyLkFubm90YXRpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0Lm9iZnVzY2F0b3IuamF2YXNjcmlwdDE1cGFyc2VyLkpTUGFyc2VyMTVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0Lm9iZnVzY2F0b3IuamF2YXNjcmlwdDE1cGFyc2VyLk5hbWVHZW47Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0Lm9iZnVzY2F0b3IuamF2YXNjcmlwdDE1cGFyc2VyLlByb2dyYW1Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5vYmZ1c2NhdG9yLmphdmFzY3JpcHQxNXBhcnNlci5Qcm9ncmFtQ29udGV4dFN0YWNrOwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBPYmZ1c2NhdGlvblN0YXRlCi17Ci0gIHB1YmxpYyBhYnN0cmFjdCBBbm5vdGF0ZWRUb2tlbiBlbnRlclN0YXRlKFByb2dyYW1Db250ZXh0U3RhY2sgY29udGV4dFN0YWNrLAotICAgIEFubm90YXRlZFRva2VuIHN0YXJ0VG9rZW4sIE5hbWVHZW4gbmFtZUdlbik7Ci0KLSAgcHVibGljIGFic3RyYWN0IHZvaWQgZXhpdFN0YXRlKFByb2dyYW1Db250ZXh0U3RhY2sgY29udGV4dFN0YWNrKTsKLQotICAvKioKLSAgKiBPYmZ1c2NhdGVzIHZhcmlhYmxlIGRlY2xhcmF0aW9ucwotICAqIEBwYXJhbSBjb250ZXh0U3RhY2sKLSAgKiBAcGFyYW0gdG9rZW4KLSAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc1ZhcklkZW50aWZpZXIoUHJvZ3JhbUNvbnRleHRTdGFjayBjb250ZXh0U3RhY2ssCi0gICAgQW5ub3RhdGVkVG9rZW4gdG9rZW4pCi0gIHsKLSAgICBQcm9ncmFtQ29udGV4dCBibG9ja0NvbnRleHQgPSAoUHJvZ3JhbUNvbnRleHQpIGNvbnRleHRTdGFjay5wZWVrKCk7Ci0KLSAgICAvLyBza2lwIGdsb2JhbCB2YXJzCi0gICAgaWYgKGNvbnRleHRTdGFjay5zaXplKCkgPiAxKQotICAgIHsKLSAgICAgIC8vIGFkZCBvbmx5IGlmIHdlIGhhdmUgbm90IHNlZW4gdGhpcyB2YXJpYWJsZSBiZWZvcmUgaW4gdGhpcyBjb250ZXh0LgotICAgICAgQW5ub3RhdGVkVG9rZW4gc2F2ZWRUb2tlbiA9IGJsb2NrQ29udGV4dC5nZXRUb2tlbih0b2tlbi5pbWFnZSk7Ci0gICAgICBTdHJpbmcgdG9rZW5JbWFnZTsKLQotICAgICAgaWYgKHNhdmVkVG9rZW4gPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgdG9rZW5JbWFnZSA9IGJsb2NrQ29udGV4dC5nZW5lcmF0ZVN5bWJvbE5hbWUoKTsKLSAgICAgICAgYmxvY2tDb250ZXh0LmFkZFRva2VuKHRva2VuLmltYWdlLCB0b2tlbik7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHRva2VuSW1hZ2UgPSBzYXZlZFRva2VuLmltYWdlOwotICAgICAgfQotCi0gICAgICB0b2tlbi5pbWFnZSA9IHRva2VuSW1hZ2U7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICoKLSAgKiBAcGFyYW0gY29udGV4dFN0YWNrCi0gICogQHBhcmFtIHN0YXJ0VG9rZW4KLSAgKiBAcmV0dXJuCi0gICovCi0gIHB1YmxpYyBBbm5vdGF0ZWRUb2tlbiBwcm9jZXNzQ29kZUJsb2NrKFByb2dyYW1Db250ZXh0U3RhY2sgY29udGV4dFN0YWNrLAotICAgIEFubm90YXRlZFRva2VuIHN0YXJ0VG9rZW4pCi0gIHsKLSAgICAvLyBncmFiIHRoZSBjb250ZXh0IG9uIHRvcCBvZiB0aGUgc3RhY2sKLSAgICBQcm9ncmFtQ29udGV4dCBibG9ja0NvbnRleHQgPSAoUHJvZ3JhbUNvbnRleHQpIGNvbnRleHRTdGFjay5wZWVrKCk7Ci0gICAgQW5ub3RhdGVkVG9rZW4gdG9rZW4gPSBzdGFydFRva2VuOwotCi0gICAgd2hpbGUgKHRva2VuICE9IG51bGwpCi0gICAgewotICAgICAgc3dpdGNoICh0b2tlbi5nZXRLaW5kKCkpCi0gICAgICB7Ci0gICAgICBjYXNlIEFubm90YXRpb25Db25zdGFudHMuTkFNRURfRlVOQ1RJT046Ci0gICAgICBjYXNlIEFubm90YXRpb25Db25zdGFudHMuQU5PTllNT1VTX0ZVTkNUSU9OOgotICAgICAgICB0b2tlbiA9IEZ1bmN0aW9uU3RhdGUuZ2V0SW5zdGFuY2UoKS5lbnRlclN0YXRlKGNvbnRleHRTdGFjaywgdG9rZW4sCi0gICAgICAgICAgICBibG9ja0NvbnRleHQuZ2V0TmFtZUdlbigpKTsKLQotICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSBBbm5vdGF0aW9uQ29uc3RhbnRzLlZBUl9JREVOVElGSUVSOgotICAgICAgewotICAgICAgICBwcm9jZXNzVmFySWRlbnRpZmllcihjb250ZXh0U3RhY2ssIHRva2VuKTsKLQotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgY2FzZSBKU1BhcnNlcjE1Q29uc3RhbnRzLklERU5USUZJRVI6Ci0gICAgICBjYXNlIEFubm90YXRpb25Db25zdGFudHMuT0JKRUNUX0lERU5USUZJRVI6Ci0KLSAgICAgICAgQW5ub3RhdGVkVG9rZW4gb2JmdXNjYXRlZFRva2VuID0gY29udGV4dFN0YWNrLmdldFRva2VuKHRva2VuLmltYWdlKTsKLQotICAgICAgICBpZiAob2JmdXNjYXRlZFRva2VuICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICB0b2tlbi5pbWFnZSA9IG9iZnVzY2F0ZWRUb2tlbi5pbWFnZTsKLSAgICAgICAgfQotCi0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIEpTUGFyc2VyMTVDb25zdGFudHMuTEJSQUNFOgotICAgICAgICB0b2tlbiA9IFN0YXRlbWVudEJsb2NrU3RhdGUuZ2V0SW5zdGFuY2UoKS5lbnRlclN0YXRlKGNvbnRleHRTdGFjaywKLSAgICAgICAgICAgIHRva2VuLCBibG9ja0NvbnRleHQuZ2V0TmFtZUdlbigpKTsKLQotICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSBKU1BhcnNlcjE1Q29uc3RhbnRzLlJCUkFDRToKLSAgICAgICAgZXhpdFN0YXRlKGNvbnRleHRTdGFjayk7Ci0KLSAgICAgICAgcmV0dXJuIHRva2VuOwotICAgICAgfQotCi0gICAgICB0b2tlbiA9IHRva2VuLmdldE5leHQoKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gdG9rZW47Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvb2JmdXNjYXRvci9maWx0ZXJzL29iZnVzY2F0aW9uL3N0YXRlL1Jvb3RTdGF0ZS5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9vYmZ1c2NhdG9yL2ZpbHRlcnMvb2JmdXNjYXRpb24vc3RhdGUvUm9vdFN0YXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmMDgyYzYuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9vYmZ1c2NhdG9yL2ZpbHRlcnMvb2JmdXNjYXRpb24vc3RhdGUvUm9vdFN0YXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5vYmZ1c2NhdG9yLmZpbHRlcnMub2JmdXNjYXRpb24uc3RhdGU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQub2JmdXNjYXRvci5qYXZhc2NyaXB0MTVwYXJzZXIuQW5ub3RhdGVkVG9rZW47Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0Lm9iZnVzY2F0b3IuamF2YXNjcmlwdDE1cGFyc2VyLk5hbWVHZW47Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0Lm9iZnVzY2F0b3IuamF2YXNjcmlwdDE1cGFyc2VyLlByb2dyYW1Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5vYmZ1c2NhdG9yLmphdmFzY3JpcHQxNXBhcnNlci5Qcm9ncmFtQ29udGV4dFN0YWNrOwotCi0KLXB1YmxpYyBjbGFzcyBSb290U3RhdGUgZXh0ZW5kcyBPYmZ1c2NhdGlvblN0YXRlCi17Ci0gIHN0YXRpYyBwcml2YXRlIFJvb3RTdGF0ZSBfaW5zdGFuY2U7Ci0KLSAgLy8gcHJpdmF0ZSBjb25zdHJ1bmN0b3IgZm9yIHNpbmdsZXRvbgotICBwcml2YXRlIFJvb3RTdGF0ZSgpCi0gIHsKLSAgfQotCi0gIHN0YXRpYyBwdWJsaWMgUm9vdFN0YXRlIGdldEluc3RhbmNlKCkKLSAgewotICAgIGlmIChfaW5zdGFuY2UgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBzeW5jaHJvbml6ZWQgKFJvb3RTdGF0ZS5jbGFzcykKLSAgICAgIHsKLSAgICAgICAgaWYgKF9pbnN0YW5jZSA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgX2luc3RhbmNlID0gbmV3IFJvb3RTdGF0ZSgpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIF9pbnN0YW5jZTsKLSAgfQotCi0gIHB1YmxpYyBBbm5vdGF0ZWRUb2tlbiBlbnRlclN0YXRlKFByb2dyYW1Db250ZXh0U3RhY2sgY29udGV4dFN0YWNrLAotICAgIEFubm90YXRlZFRva2VuIHN0YXJ0VG9rZW4sIE5hbWVHZW4gbmFtZUdlbikKLSAgewotICAgIGNvbnRleHRTdGFjay5wdXNoQ29udGV4dChuZXcgUHJvZ3JhbUNvbnRleHQoInJvb3QiKSk7Ci0KLSAgICByZXR1cm4gcHJvY2Vzc0NvZGVCbG9jayhjb250ZXh0U3RhY2ssIHN0YXJ0VG9rZW4pOwotICB9Ci0KLSAgcHVibGljIHZvaWQgZXhpdFN0YXRlKFByb2dyYW1Db250ZXh0U3RhY2sgY29udGV4dFN0YWNrKQotICB7Ci0gICAgY29udGV4dFN0YWNrLnBvcENvbnRleHQoKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9vYmZ1c2NhdG9yL2ZpbHRlcnMvb2JmdXNjYXRpb24vc3RhdGUvU3RhdGVtZW50QmxvY2tTdGF0ZS5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9vYmZ1c2NhdG9yL2ZpbHRlcnMvb2JmdXNjYXRpb24vc3RhdGUvU3RhdGVtZW50QmxvY2tTdGF0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTY3YmZmLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvb2JmdXNjYXRvci9maWx0ZXJzL29iZnVzY2F0aW9uL3N0YXRlL1N0YXRlbWVudEJsb2NrU3RhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0Lm9iZnVzY2F0b3IuZmlsdGVycy5vYmZ1c2NhdGlvbi5zdGF0ZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5vYmZ1c2NhdG9yLmphdmFzY3JpcHQxNXBhcnNlci5Bbm5vdGF0ZWRUb2tlbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQub2JmdXNjYXRvci5qYXZhc2NyaXB0MTVwYXJzZXIuTmFtZUdlbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQub2JmdXNjYXRvci5qYXZhc2NyaXB0MTVwYXJzZXIuUHJvZ3JhbUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0Lm9iZnVzY2F0b3IuamF2YXNjcmlwdDE1cGFyc2VyLlByb2dyYW1Db250ZXh0U3RhY2s7Ci0KLQotcHVibGljIGNsYXNzIFN0YXRlbWVudEJsb2NrU3RhdGUgZXh0ZW5kcyBPYmZ1c2NhdGlvblN0YXRlCi17Ci0gIHN0YXRpYyBwcml2YXRlIFN0YXRlbWVudEJsb2NrU3RhdGUgX2luc3RhbmNlOwotCi0gIHByaXZhdGUgU3RhdGVtZW50QmxvY2tTdGF0ZSgpCi0gIHsKLSAgfQotCi0gIHN0YXRpYyBwdWJsaWMgU3RhdGVtZW50QmxvY2tTdGF0ZSBnZXRJbnN0YW5jZSgpCi0gIHsKLSAgICBpZiAoX2luc3RhbmNlID09IG51bGwpCi0gICAgewotICAgICAgc3luY2hyb25pemVkIChTdGF0ZW1lbnRCbG9ja1N0YXRlLmNsYXNzKQotICAgICAgewotICAgICAgICBpZiAoX2luc3RhbmNlID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBfaW5zdGFuY2UgPSBuZXcgU3RhdGVtZW50QmxvY2tTdGF0ZSgpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIF9pbnN0YW5jZTsKLSAgfQotCi0gIHB1YmxpYyBBbm5vdGF0ZWRUb2tlbiBlbnRlclN0YXRlKFByb2dyYW1Db250ZXh0U3RhY2sgY29udGV4dFN0YWNrLAotICAgIEFubm90YXRlZFRva2VuIHN0YXJ0VG9rZW4sIE5hbWVHZW4gbmFtZUdlbikKLSAgewotICAgIC8vIGRvIG5vdCBjcmVhdGUgYSBuZXcgY29udGV4dCBpbiBhIHN0YXRlbWVudCBibG9jay4gSmF2YVNjcmlwdCBkb2VzIG5vdCB1c2UgYSBuZXcgc2NvcGUgaW4gYQotICAgIC8vIHN0YXRlbWVudCBibG9jawotICAgIEFubm90YXRlZFRva2VuIHRva2VuID0gc3RhcnRUb2tlbi5nZXROZXh0KCk7Ci0KLSAgICByZXR1cm4gcHJvY2Vzc0NvZGVCbG9jayhjb250ZXh0U3RhY2ssIHRva2VuKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGV4aXRTdGF0ZShQcm9ncmFtQ29udGV4dFN0YWNrIGNvbnRleHRTdGFjaykKLSAgewotICAgIC8vIGRvIG5vdCBwb3AgY29udGV4dAotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc1ZhcklkZW50aWZpZXIoUHJvZ3JhbUNvbnRleHRTdGFjayBjb250ZXh0U3RhY2ssCi0gICAgQW5ub3RhdGVkVG9rZW4gdG9rZW4pCi0gIHsKLSAgICBQcm9ncmFtQ29udGV4dCBibG9ja0NvbnRleHQgPSAoUHJvZ3JhbUNvbnRleHQpIGNvbnRleHRTdGFjay5wZWVrKCk7Ci0KLSAgICAvLyBub3JtYWwgcHJvY2Vzc2luZyBmb3IgZnVuY3Rpb25zIHRoYXQgZG8gbm90IHVzZSBldmFsKCkgY2FsbHMKLSAgICBpZiAoIShibG9ja0NvbnRleHQgaW5zdGFuY2VvZiBGdW5jdGlvbkNvbnRleHQpIHx8Ci0gICAgICAgIChibG9ja0NvbnRleHQgaW5zdGFuY2VvZiBGdW5jdGlvbkNvbnRleHQgJiYKLSAgICAgICAgKChGdW5jdGlvbkNvbnRleHQpIGJsb2NrQ29udGV4dCkuY2FuT2JmdXNjYXRlTG9jYWxWYXJzKCkpKQotICAgIHsKLSAgICAgIHN1cGVyLnByb2Nlc3NWYXJJZGVudGlmaWVyKGNvbnRleHRTdGFjaywgdG9rZW4pOwotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9vYmZ1c2NhdG9yL2ZpbHRlcnMvb3V0cHV0L091dHB1dEdlbmVyYXRvci5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9vYmZ1c2NhdG9yL2ZpbHRlcnMvb3V0cHV0L091dHB1dEdlbmVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZjkyNjhhLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvb2JmdXNjYXRvci9maWx0ZXJzL291dHB1dC9PdXRwdXRHZW5lcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0Lm9iZnVzY2F0b3IuZmlsdGVycy5vdXRwdXQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQub2JmdXNjYXRvci5maWx0ZXJzLk9iZnVzY2F0b3JGaWx0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0Lm9iZnVzY2F0b3IuamF2YXNjcmlwdDE1cGFyc2VyLkFubm90YXRlZFRva2VuOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5vYmZ1c2NhdG9yLmphdmFzY3JpcHQxNXBhcnNlci5Ub2tlbjsKLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5QcmludFN0cmVhbTsKLQotCi1wdWJsaWMgY2xhc3MgT3V0cHV0R2VuZXJhdG9yIGltcGxlbWVudHMgT2JmdXNjYXRvckZpbHRlcgotewotICBwcml2YXRlIFByaW50U3RyZWFtIF9vdXRTdHJlYW07Ci0KLSAgcHVibGljIE91dHB1dEdlbmVyYXRvcigpCi0gIHsKLSAgfQotCi0gIHB1YmxpYyBPdXRwdXRHZW5lcmF0b3IoT3V0cHV0U3RyZWFtIG91dFN0cmVhbSkKLSAgewotICAgIF9vdXRTdHJlYW0gPSBuZXcgUHJpbnRTdHJlYW0obmV3IEJ1ZmZlcmVkT3V0cHV0U3RyZWFtKG91dFN0cmVhbSkpOwotICB9Ci0KLSAgcHVibGljIEFubm90YXRlZFRva2VuIGZpbHRlcihBbm5vdGF0ZWRUb2tlbiBzdGFydFRva2VuKQotICB7Ci0gICAgQW5ub3RhdGVkVG9rZW4gdG9rZW4gPSBzdGFydFRva2VuOwotCi0gICAgd2hpbGUgKHRva2VuICE9IG51bGwpCi0gICAgewotICAgICAgcHJpbnRUb2tlbih0b2tlbik7Ci0gICAgICB0b2tlbiA9IHRva2VuLmdldE5leHQoKTsKLSAgICB9Ci0KLSAgICBfb3V0U3RyZWFtLmZsdXNoKCk7Ci0KLSAgICByZXR1cm4gc3RhcnRUb2tlbjsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldE91dHB1dFN0cmVhbShPdXRwdXRTdHJlYW0gb3V0U3RyZWFtKQotICB7Ci0gICAgX291dFN0cmVhbSA9IG5ldyBQcmludFN0cmVhbShuZXcgQnVmZmVyZWRPdXRwdXRTdHJlYW0ob3V0U3RyZWFtKSk7Ci0gIH0KLQotICBwdWJsaWMgUHJpbnRTdHJlYW0gZ2V0T3V0cHV0U3RyZWFtKCkKLSAgewotICAgIHJldHVybiBfb3V0U3RyZWFtOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIHByaW50VG9rZW4oVG9rZW4gdG9rZW4pCi0gIHsKLSAgICAvLyBwcmludCBzcGVjaWFsIHRva2VucyBmaXJzdAotICAgIGlmICh0b2tlbi5zcGVjaWFsVG9rZW4gIT0gbnVsbCkKLSAgICB7Ci0gICAgICBwcmludFRva2VuKHRva2VuLnNwZWNpYWxUb2tlbik7Ci0gICAgfQotCi0gICAgX291dFN0cmVhbS5wcmludCh0b2tlbi5pbWFnZSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvb2JmdXNjYXRvci9qYXZhc2NyaXB0MTVwYXJzZXIvQW5ub3RhdGVkVG9rZW4uamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvb2JmdXNjYXRvci9qYXZhc2NyaXB0MTVwYXJzZXIvQW5ub3RhdGVkVG9rZW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTIzNDMyNi4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L29iZnVzY2F0b3IvamF2YXNjcmlwdDE1cGFyc2VyL0Fubm90YXRlZFRva2VuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODEgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQub2JmdXNjYXRvci5qYXZhc2NyaXB0MTVwYXJzZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1wdWJsaWMgY2xhc3MgQW5ub3RhdGVkVG9rZW4gZXh0ZW5kcyBUb2tlbiB7Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBWZWN0b3IgU1BFQ0lBTF9UWVBFUyA9IG5ldyBWZWN0b3IoKTsKLQotICAgIHN0YXRpYyB7Ci0gICAgICAgIFNQRUNJQUxfVFlQRVMuYWRkKCJQcm9maWxlciIpOwotICAgICAgICBTUEVDSUFMX1RZUEVTLmFkZCgiQ2hlY2twb2ludCIpOwotICAgICAgICBTUEVDSUFMX1RZUEVTLmFkZCgiQXNzZXJ0Iik7Ci0gICAgICAgIFNQRUNJQUxfVFlQRVMuYWRkKCJMb2dnZXIiKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJFRklYX1dTID0gMTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTkZJWF9XUyA9IDI7Ci0KLSAgICBwcm90ZWN0ZWQgaW50IF9hbm5vdGF0aW9uS2luZCA9IEFubm90YXRpb25Db25zdGFudHMuVU5ERUZJTkVEOwotICAgIHByb3RlY3RlZCBPYmplY3QgX2Fubm90YXRpb25PYmplY3Q7Ci0gICAgcHJvdGVjdGVkIGludCBfd3NTZW5zaXRpdmUgPSAwOwotICAgIHByb3RlY3RlZCBib29sZWFuIF9yZW1vdmU7Ci0gICAgcHJvdGVjdGVkIGJvb2xlYW4gX2Z1bmNVc2VzRXZhbDsKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIF90eXBlID0gInVuZGVmaW5lZCI7Ci0gICAgcHJvdGVjdGVkIFZlY3RvciBfcHJvZHVjdGlvbnMgPSBuZXcgVmVjdG9yKCk7Ci0KLSAgICBwdWJsaWMgQW5ub3RhdGVkVG9rZW4oKSB7Ci0gICAgfQotCi0gICAgcHVibGljIEFubm90YXRlZFRva2VuKGludCBhbm5vdGF0aW9uS2luZCwgT2JqZWN0IGFubm90YXRpb25PYmplY3QpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgX2Fubm90YXRpb25LaW5kID0gYW5ub3RhdGlvbktpbmQ7Ci0gICAgICAgIF9hbm5vdGF0aW9uT2JqZWN0ID0gYW5ub3RhdGlvbk9iamVjdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRBbm5vdGF0aW9uS2luZChpbnQgYW5ub3RhdGlvbktpbmQpIHsKLSAgICAgICAgX2Fubm90YXRpb25LaW5kID0gYW5ub3RhdGlvbktpbmQ7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXRBbm5vdGF0aW9uS2luZCgpIHsKLSAgICAgICAgcmV0dXJuIF9hbm5vdGF0aW9uS2luZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldEtpbmQoKSB7Ci0gICAgICAgIGlmIChfYW5ub3RhdGlvbktpbmQgIT0gQW5ub3RhdGlvbkNvbnN0YW50cy5VTkRFRklORUQpIHsKLSAgICAgICAgICAgIHJldHVybiBfYW5ub3RhdGlvbktpbmQ7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4ga2luZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRBbm5vdGF0aW9uT2JqZWN0KE9iamVjdCBhbm5vdGF0aW9uT2JqZWN0KSB7Ci0gICAgICAgIF9hbm5vdGF0aW9uT2JqZWN0ID0gYW5ub3RhdGlvbk9iamVjdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGdldEFubm90YXRpb25PYmplY3QoKSB7Ci0gICAgICAgIHJldHVybiBfYW5ub3RhdGlvbk9iamVjdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQW5ub3RhdGVkVG9rZW4gZ2V0TmV4dCgpIHsKLSAgICAgICAgcmV0dXJuIChBbm5vdGF0ZWRUb2tlbiluZXh0OwotICAgIH0KLQotICAgIHB1YmxpYyBBbm5vdGF0ZWRUb2tlbiBnZXRTcGVjaWFsVG9rZW4oKSB7Ci0gICAgICAgIHJldHVybiAoQW5ub3RhdGVkVG9rZW4pc3BlY2lhbFRva2VuOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzV2hpdGVTcGFjZSgpIHsKLSAgICAgICAgcmV0dXJuIChraW5kID09IEpTUGFyc2VyMTVDb25zdGFudHMuV1MpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzTmV3TGluZSgpIHsKLSAgICAgICAgcmV0dXJuIChraW5kID09IEpTUGFyc2VyMTVDb25zdGFudHMuRU9MKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0NvbW1lbnQoKSB7Ci0gICAgICAgIHJldHVybiAoKGtpbmQgPT0gSlNQYXJzZXIxNUNvbnN0YW50cy5TSU5HTEVfTElORV9DT01NRU5UKSB8fAotICAgICAgICAgICAgICAgIChraW5kID09IEpTUGFyc2VyMTVDb25zdGFudHMuTVVMVElfTElORV9DT01NRU5UKSk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNXU1NlbnNpdGl2ZSgpIHsKLSAgICAgICAgcmV0dXJuIF93c1NlbnNpdGl2ZSAhPSAwOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFdTU2Vuc2l0aXZlKGludCBpKSB7Ci0gICAgICAgIF93c1NlbnNpdGl2ZSA9IGk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNQcmVmaXhXU1NlbnNpdGl2ZSgpIHsKLSAgICAgICAgcmV0dXJuIF93c1NlbnNpdGl2ZSA9PSBQUkVGSVhfV1M7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNJbmZpeFdTU2Vuc2l0aXZlKCkgewotICAgICAgICByZXR1cm4gX3dzU2Vuc2l0aXZlID09IElORklYX1dTOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzUmVtb3ZhYmxlS2V5d29yZCgpIHsKLSAgICAgICAgYm9vbGVhbiBpc1JlbW92YWJsZSA9IGZhbHNlOwotCi0gICAgICAgIHN3aXRjaCAoa2luZCkgewotICAgICAgICBkZWZhdWx0IDoKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAvLyAgICAgIGNhc2UgSlNQYXJzZXIxNENvbnN0YW50cy5BU1NFUlRfU1RBVEVNRU5UOgotICAgICAgICAgICAgLy8gICAgICBjYXNlIEpTUGFyc2VyMTRDb25zdGFudHMuTE9HR0VSX1NUQVRFTUVOVDoKLSAgICAgICAgICAgIC8vICAgICAgICBpc1JlbW92YWJsZSA9IHRydWU7Ci0gICAgICAgICAgICAvLyAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gaXNSZW1vdmFibGU7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNTcGVjaWFsQ2xhc3NUeXBlKCkgewotICAgICAgICByZXR1cm4gU1BFQ0lBTF9UWVBFUy5jb250YWlucyhpbWFnZSk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNTcGVjaWFsT2JqZWN0VHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIFNQRUNJQUxfVFlQRVMuY29udGFpbnMoX3R5cGUpOwotICAgIH0KLQotICAgIC8qKgotICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIF9yZW1vdmUuCi0gICAqLwotICAgIHB1YmxpYyBib29sZWFuIGNhblJlbW92ZSgpIHsKLSAgICAgICAgcmV0dXJuIF9yZW1vdmU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAqIEBwYXJhbSBfcmVtb3ZlIFRoZSBfcmVtb3ZlIHRvIHNldC4KLSAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UmVtb3ZhYmxlKGJvb2xlYW4gcmVtb3ZlKSB7Ci0gICAgICAgIHRoaXMuX3JlbW92ZSA9IHJlbW92ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICogQHJldHVybiBSZXR1cm5zIHRoZSBfdHlwZS4KLSAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotICAgICAgICByZXR1cm4gX3R5cGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAqIEBwYXJhbSBfdHlwZSBUaGUgX3R5cGUgdG8gc2V0LgotICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRUeXBlKFN0cmluZyB0eXBlKSB7Ci0gICAgICAgIHRoaXMuX3R5cGUgPSB0eXBlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEZ1bmN0aW9uVXNlc0V2YWwoYm9vbGVhbiB1c2VzRXZhbCkgewotICAgICAgICBfZnVuY1VzZXNFdmFsID0gdXNlc0V2YWw7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gZnVuY3Rpb25Vc2VzRXZhbCgpIHsKLSAgICAgICAgcmV0dXJuIF9mdW5jVXNlc0V2YWw7Ci0gICAgfQotCi0gICAgLy8gICAgcHVibGljIHZvaWQgYWRkUHJvZHVjdGlvbihTaW1wbGVOb2RlIG5vZGUpIHsKLSAgICAvLyAgICAgICAgX3Byb2R1Y3Rpb25zLmFkZChub2RlKTsKLSAgICAvLyAgICB9Ci0KLSAgICBwdWJsaWMgVmVjdG9yIGdldFByb2R1Y3Rpb25zKCkgewotICAgICAgICByZXR1cm4gX3Byb2R1Y3Rpb25zOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvb2JmdXNjYXRvci9qYXZhc2NyaXB0MTVwYXJzZXIvQW5ub3RhdGlvbkNvbnN0YW50cy5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9vYmZ1c2NhdG9yL2phdmFzY3JpcHQxNXBhcnNlci9Bbm5vdGF0aW9uQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4NmI1MmQuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9vYmZ1c2NhdG9yL2phdmFzY3JpcHQxNXBhcnNlci9Bbm5vdGF0aW9uQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5vYmZ1c2NhdG9yLmphdmFzY3JpcHQxNXBhcnNlcjsKLQotcHVibGljIGludGVyZmFjZSBBbm5vdGF0aW9uQ29uc3RhbnRzIHsKLSAgICBpbnQgVU5ERUZJTkVEID0gLTk5OTsKLSAgICBpbnQgVkFSX0lERU5USUZJRVIgPSAtMTsKLSAgICBpbnQgRlVOQ1RJT05fTkFNRV9JREVOVElGSUVSID0gLTI7Ci0gICAgaW50IEZVTkNUSU9OX1BBUkFNX0lERU5USUZJRVIgPSAtMzsKLSAgICBpbnQgTElURVJBTF9PQkpFQ1RfS0VZX0lERU5USUZJRVIgPSAtNDsKLSAgICBpbnQgT0JKRUNUX0lERU5USUZJRVIgPSAtNTsKLSAgICBpbnQgT0JKRUNUX0ZJRUxEX0lERU5USUZJRVIgPSAtNjsKLSAgICBpbnQgT0JKRUNUX01FVEhPRF9JREVOVElGSUVSID0gLTc7Ci0gICAgaW50IE5BTUVEX0ZVTkNUSU9OID0gLTg7Ci0gICAgaW50IEFOT05ZTU9VU19GVU5DVElPTiA9IC05OwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvb2JmdXNjYXRvci9qYXZhc2NyaXB0MTVwYXJzZXIvSlNQYXJzZXJUZXN0MTUuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvb2JmdXNjYXRvci9qYXZhc2NyaXB0MTVwYXJzZXIvSlNQYXJzZXJUZXN0MTUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWM3YzFkMy4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L29iZnVzY2F0b3IvamF2YXNjcmlwdDE1cGFyc2VyL0pTUGFyc2VyVGVzdDE1LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQub2JmdXNjYXRvci5qYXZhc2NyaXB0MTVwYXJzZXI7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotCi0KLXB1YmxpYyBjbGFzcyBKU1BhcnNlclRlc3QxNQotewotICBwcm90ZWN0ZWQgSW5wdXRTdHJlYW0gX2luOwotCi0gIHB1YmxpYyBKU1BhcnNlclRlc3QxNShJbnB1dFN0cmVhbSBpbikKLSAgewotICAgIF9pbiA9IGluOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc3RhcnQoKQotICB7Ci0gICAgLy8gY3JlYXRlIGFuIGluc3RhbmNlIG9mIHRoZSBwYXJzZXIKLSAgICBKU1BhcnNlcjE1IGpzUGFyc2VyID0gbmV3IEpTUGFyc2VyMTUoX2luKTsKLQotICAgIFRva2VuIHQ7Ci0KLSAgICB0cnkKLSAgICB7Ci0gICAgICBmb3IgKHQgPSBqc1BhcnNlci5Qcm9ncmFtKCk7IHQgIT0gbnVsbDsgdCA9IHQubmV4dCkKLSAgICAgIHsKLSAgICAgICAgU3lzdGVtLm91dAotICAgICAgICAucHJpbnRsbih0LmtpbmQgKyAiXHQiICsgSlNQYXJzZXIxNS50b2tlbkltYWdlW3Qua2luZF0gKyAiXHQiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHQuaW1hZ2UgKyAiXHQiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQW5ub3RhdGVkVG9rZW4pIHQpLmdldEFubm90YXRpb25LaW5kKCkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx0IiArICgoQW5ub3RhdGVkVG9rZW4pIHQpLmNhblJlbW92ZSgpKTsKLSAgICAgICAgcHJpbnRTcGVjaWFsVG9rZW5zKChBbm5vdGF0ZWRUb2tlbikgdCk7Ci0gICAgICB9Ci0KLSAgICAgIC8vIGpzUGFyc2VyLmdldFJvb3ROb2RlKCkuZHVtcCgicCIpOwotICAgIH0KLSAgICBjYXRjaCAoVGhyb3dhYmxlIGUpCi0gICAgewotICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBwcmludFNwZWNpYWxUb2tlbnMoQW5ub3RhdGVkVG9rZW4gdG9rZW4pCi0gIHsKLSAgICBBbm5vdGF0ZWRUb2tlbiBzcGVjaWFsVG9rZW4gPSB0b2tlbi5nZXRTcGVjaWFsVG9rZW4oKTsKLQotICAgIHdoaWxlIChzcGVjaWFsVG9rZW4gIT0gbnVsbCkKLSAgICB7Ci0gICAgICBTeXN0ZW0ub3V0LnByaW50bG4oc3BlY2lhbFRva2VuLmltYWdlKTsKLSAgICAgIHNwZWNpYWxUb2tlbiA9IHNwZWNpYWxUb2tlbi5nZXRTcGVjaWFsVG9rZW4oKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKQotICB7Ci0gICAgaWYgKGFyZ3MubGVuZ3RoID09IDApCi0gICAgewotICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJVc2FnZTogSlNQYXJzZXJUZXN0MTUgPEpTIEZpbGU+Iik7Ci0KLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBGaWxlIGpzRmlsZSA9IG5ldyBGaWxlKGFyZ3NbMF0pOwotICAgIEZpbGVJbnB1dFN0cmVhbSBpbkZpbGVTdHJlYW07Ci0KLSAgICB0cnkKLSAgICB7Ci0gICAgICBpbkZpbGVTdHJlYW0gPSBuZXcgRmlsZUlucHV0U3RyZWFtKGpzRmlsZSk7Ci0KLSAgICAgIEpTUGFyc2VyVGVzdDE1IGpzUGFyc2VyVGVzdCA9IG5ldyBKU1BhcnNlclRlc3QxNShpbkZpbGVTdHJlYW0pOwotICAgICAganNQYXJzZXJUZXN0LnN0YXJ0KCk7Ci0gICAgICBpbkZpbGVTdHJlYW0uY2xvc2UoKTsKLSAgICB9Ci0gICAgY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRmlsZU5vdEZvdW5kIik7Ci0gICAgfQotICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRmlsZUlPIik7Ci0gICAgfQotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9vYmZ1c2NhdG9yL2phdmFzY3JpcHQxNXBhcnNlci9KU1BhcnNlclV0aWxzLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L29iZnVzY2F0b3IvamF2YXNjcmlwdDE1cGFyc2VyL0pTUGFyc2VyVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmI2ZTM3NS4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L29iZnVzY2F0b3IvamF2YXNjcmlwdDE1cGFyc2VyL0pTUGFyc2VyVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4MSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5vYmZ1c2NhdG9yLmphdmFzY3JpcHQxNXBhcnNlcjsKLQotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi0KLXB1YmxpYyBjbGFzcyBKU1BhcnNlclV0aWxzCi17Ci0gIHB1YmxpYyBKU1BhcnNlclV0aWxzKCkKLSAgewotICB9Ci0KLSAgLyoqCi0gICAqCi0gICAqIEBwYXJhbSBmdW5jVG9rZW4KLSAgICogQHBhcmFtIGJvZHlTdGFydAotICAgKiBAcGFyYW0gYm9keUVuZAotICAgKi8KLSAgcHVibGljIHN0YXRpYyB2b2lkIHRhZ0V2YWxDYWxscyhUb2tlbiBmdW5jVG9rZW4sIFRva2VuIGJvZHlTdGFydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUb2tlbiBib2R5RW5kKQotICB7Ci0gICAgYm9vbGVhbiBoYXNFdmFsID0gZmFsc2U7Ci0gICAgVG9rZW4gdG9rZW4gPSBib2R5U3RhcnQ7Ci0KLSAgICB3aGlsZSAodG9rZW4gIT0gYm9keUVuZCkKLSAgICB7Ci0gICAgICBpZiAoKHRva2VuLmtpbmQgPT0gSlNQYXJzZXIxNUNvbnN0YW50cy5JREVOVElGSUVSKSAmJgotICAgICAgICAgIHRva2VuLmltYWdlLmVxdWFscygiZXZhbCIpICYmICh0b2tlbi5uZXh0ICE9IG51bGwpICYmCi0gICAgICAgICAgKHRva2VuLm5leHQua2luZCA9PSBKU1BhcnNlcjE1Q29uc3RhbnRzLkxQQVJFTikpCi0gICAgICB7Ci0gICAgICAgIGhhc0V2YWwgPSB0cnVlOwotCi0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICB0b2tlbiA9IHRva2VuLm5leHQ7Ci0gICAgfQotCi0gICAgKChBbm5vdGF0ZWRUb2tlbikgZnVuY1Rva2VuKS5zZXRGdW5jdGlvblVzZXNFdmFsKGhhc0V2YWwpOwotICB9Ci0KLSAgLyoqCi0gICAqCi0gICAqIEBwYXJhbSBjb250ZXh0U3RhY2sKLSAgICogQHBhcmFtIHRva2VuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIHZvaWQgcHVzaFRva2VuKFByb2dyYW1Db250ZXh0U3RhY2sgY29udGV4dFN0YWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFubm90YXRlZFRva2VuIHRva2VuKQotICB7Ci0gICAgUHJvZ3JhbUNvbnRleHQgY29udGV4dCA9IChQcm9ncmFtQ29udGV4dCkgY29udGV4dFN0YWNrLnBlZWsoKTsKLSAgICBjb250ZXh0LmFkZFRva2VuKHRva2VuLmltYWdlLCB0b2tlbik7Ci0gIH0KLQotICAvKioKLSAgICoKLSAgICogQHBhcmFtIGNvbnRleHRTdGFjawotICAgKiBAcGFyYW0gdgotICAgKi8KLSAgcHVibGljIHN0YXRpYyB2b2lkIHB1c2hUb2tlbnMoUHJvZ3JhbUNvbnRleHRTdGFjayBjb250ZXh0U3RhY2ssIFZlY3RvciB2KQotICB7Ci0gICAgZm9yIChFbnVtZXJhdGlvbiBpdGVtID0gdi5lbGVtZW50cygpOyBpdGVtLmhhc01vcmVFbGVtZW50cygpOyApCi0gICAgewotICAgICAgQW5ub3RhdGVkVG9rZW4gdCA9IChBbm5vdGF0ZWRUb2tlbikgaXRlbS5uZXh0RWxlbWVudCgpOwotICAgICAgcHVzaFRva2VuKGNvbnRleHRTdGFjaywgdCk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqCi0gICAqIEBwYXJhbSBvYmpUb2tlbgotICAgKiBAcGFyYW0gZW5kCi0gICAqLwotICBwdWJsaWMgc3RhdGljIHZvaWQgdGFnT2JqZWN0SWRlbnRpZmllcihUb2tlbiBvYmpUb2tlbiwgVG9rZW4gZW5kKQotICB7Ci0gICAgVG9rZW4gdCA9IG9ialRva2VuLm5leHQ7Ci0gICAgVG9rZW4gc3VmZml4VG9rZW4gPSBudWxsOwotCi0gICAgd2hpbGUgKHQgIT0gZW5kKQotICAgIHsKLSAgICAgIGlmICh0LmtpbmQgPT0gSlNQYXJzZXIxNUNvbnN0YW50cy5ET1QpCi0gICAgICB7Ci0gICAgICAgIGFubm90YXRlVG9rZW4ob2JqVG9rZW4sIEFubm90YXRpb25Db25zdGFudHMuT0JKRUNUX0lERU5USUZJRVIsCi0gICAgICAgICAgICAgICAgICAgICAgbnVsbCwgLTEpOwotICAgICAgICBzdWZmaXhUb2tlbiA9IHQubmV4dDsKLQotICAgICAgICBpZiAoKHN1ZmZpeFRva2VuICE9IG51bGwpICYmCi0gICAgICAgICAgICAoc3VmZml4VG9rZW4ua2luZCA9PSBKU1BhcnNlcjE1Q29uc3RhbnRzLklERU5USUZJRVIpKQotICAgICAgICB7Ci0gICAgICAgICAgYW5ub3RhdGVUb2tlbihzdWZmaXhUb2tlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgIEFubm90YXRpb25Db25zdGFudHMuT0JKRUNUX0ZJRUxEX0lERU5USUZJRVIsIG51bGwsCi0gICAgICAgICAgICAgICAgICAgICAgICAtMSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgaWYgKCh0LmtpbmQgPT0gSlNQYXJzZXIxNUNvbnN0YW50cy5MUEFSRU4pICYmIChzdWZmaXhUb2tlbiAhPSBudWxsKSkKLSAgICAgIHsKLSAgICAgICAgYW5ub3RhdGVUb2tlbihzdWZmaXhUb2tlbiwKLSAgICAgICAgICAgICAgICAgICAgICBBbm5vdGF0aW9uQ29uc3RhbnRzLk9CSkVDVF9NRVRIT0RfSURFTlRJRklFUiwgbnVsbCwKLSAgICAgICAgICAgICAgICAgICAgICAtMSk7Ci0gICAgICB9Ci0KLSAgICAgIHQgPSB0Lm5leHQ7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqCi0gICAqIEBwYXJhbSBjb250ZXh0U3RhY2sKLSAgICogQHBhcmFtIHN0YXJ0Ci0gICAqIEBwYXJhbSBlbmQKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCB0YWdNZXRob2RJbnZvY2F0aW9uKFByb2dyYW1Db250ZXh0U3RhY2sgY29udGV4dFN0YWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbm5vdGF0ZWRUb2tlbiBzdGFydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQW5ub3RhdGVkVG9rZW4gZW5kKQotICB7Ci0gICAgaWYgKHRhZ0Fzc2VydFByb2ZpbGVyQ2FsbHMoY29udGV4dFN0YWNrLCBzdGFydCwgZW5kKSkKLSAgICB7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgdGFnTG9nZ2VyQ2FsbHMoY29udGV4dFN0YWNrLCBzdGFydCwgZW5kKTsKLSAgfQotCi0gIC8qKgotICAgKgotICAgKiBAcGFyYW0gY29udGV4dFN0YWNrCi0gICAqIEBwYXJhbSBzdGFydAotICAgKiBAcGFyYW0gZW5kCi0gICAqIEByZXR1cm4KLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gdGFnQXNzZXJ0UHJvZmlsZXJDYWxscyhQcm9ncmFtQ29udGV4dFN0YWNrIGNvbnRleHRTdGFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFubm90YXRlZFRva2VuIHN0YXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQW5ub3RhdGVkVG9rZW4gZW5kKQotICB7Ci0gICAgQW5ub3RhdGVkVG9rZW4gdG9rZW4gPSBzdGFydDsKLSAgICBib29sZWFuIGlzU3BlY2lhbFR5cGUgPSBmYWxzZTsKLSAgICBib29sZWFuIGlzUmVtb3ZhYmxlID0gZmFsc2U7Ci0KLSAgICB3aGlsZSAodG9rZW4gIT0gZW5kKQotICAgIHsKLSAgICAgIC8vIFRoaXMgY2hlY2tzIGZvcjoKLSAgICAgIC8vICJQcm9maWxlci54eHg9Li4uOyIKLSAgICAgIC8vIG9yICJmb28uPHByb2ZpbGVyIG1ldGhvZD47IiB3aGVyZSBmb28gaXMgYSB2YXIgb2YgdHlwZSBQcm9maWxlcgotICAgICAgQW5ub3RhdGVkVG9rZW4gb2JqVG9rZW4gPSBjb250ZXh0U3RhY2suZ2V0VG9rZW4odG9rZW4uaW1hZ2UpOwotCi0gICAgICBpZiAoKHRva2VuLmlzU3BlY2lhbENsYXNzVHlwZSgpIHx8Ci0gICAgICAgICAgICgob2JqVG9rZW4gIT0gbnVsbCkgJiYgb2JqVG9rZW4uaXNTcGVjaWFsT2JqZWN0VHlwZSgpKSkgJiYKLSAgICAgICAgICAodG9rZW4uZ2V0S2luZCgpID09IEFubm90YXRpb25Db25zdGFudHMuT0JKRUNUX0lERU5USUZJRVIpKQotICAgICAgewotICAgICAgICBpc1NwZWNpYWxUeXBlID0gdHJ1ZTsKLSAgICAgIH0KLQotICAgICAgaWYgKGlzU3BlY2lhbFR5cGUgJiYKLSAgICAgICAgICAodG9rZW4uZ2V0S2luZCgpID09IEFubm90YXRpb25Db25zdGFudHMuT0JKRUNUX01FVEhPRF9JREVOVElGSUVSKSkKLSAgICAgIHsKLSAgICAgICAgaXNSZW1vdmFibGUgPSB0cnVlOwotCi0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICB0b2tlbiA9IHRva2VuLmdldE5leHQoKTsKLSAgICB9Ci0KLSAgICBpZiAoaXNSZW1vdmFibGUpCi0gICAgewotICAgICAgdG9rZW4gPSBzdGFydDsKLQotICAgICAgd2hpbGUgKHRva2VuICE9IGVuZCkKLSAgICAgIHsKLSAgICAgICAgdG9rZW4uc2V0UmVtb3ZhYmxlKHRydWUpOwotICAgICAgICB0b2tlbiA9IHRva2VuLmdldE5leHQoKTsKLSAgICAgIH0KLQotICAgICAgaWYgKHRva2VuLmtpbmQgPT0gSlNQYXJzZXIxNUNvbnN0YW50cy5TRU1JQ09MT04pCi0gICAgICB7Ci0gICAgICAgIHRva2VuLnNldFJlbW92YWJsZSh0cnVlKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gaXNSZW1vdmFibGU7Ci0gIH0KLQotICAvKioKLSAgICoKLSAgICogQHBhcmFtIGNvbnRleHRTdGFjawotICAgKiBAcGFyYW0gc3RhcnQKLSAgICogQHBhcmFtIGVuZAotICAgKiBAcmV0dXJuCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBib29sZWFuIHRhZ0xvZ2dlckNhbGxzKFByb2dyYW1Db250ZXh0U3RhY2sgY29udGV4dFN0YWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFubm90YXRlZFRva2VuIHN0YXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFubm90YXRlZFRva2VuIGVuZCkKLSAgewotICAgIEFubm90YXRlZFRva2VuIHRva2VuID0gc3RhcnQ7Ci0gICAgYm9vbGVhbiBpc1NwZWNpYWxUeXBlID0gZmFsc2U7Ci0gICAgYm9vbGVhbiBpc0xPR0dFUiA9IGZhbHNlOwotICAgIGJvb2xlYW4gaXNSZW1vdmFibGUgPSBmYWxzZTsKLQotICAgIHdoaWxlICh0b2tlbiAhPSBlbmQpCi0gICAgewotICAgICAgLy8gVGhpcyBjaGVja3MgZm9yOgotICAgICAgLy8gIkxvZ2dlci5MT0dHRVIuPHN0YXRpYyBtZXRob2Q+IgotICAgICAgaWYgKCh0b2tlbi5pc1NwZWNpYWxDbGFzc1R5cGUoKSkgJiYKLSAgICAgICAgICAodG9rZW4uZ2V0S2luZCgpID09IEFubm90YXRpb25Db25zdGFudHMuT0JKRUNUX0lERU5USUZJRVIpKQotICAgICAgewotICAgICAgICBpc1NwZWNpYWxUeXBlID0gdHJ1ZTsKLSAgICAgIH0KLQotICAgICAgaWYgKGlzU3BlY2lhbFR5cGUgJiYKLSAgICAgICAgICAodG9rZW4uZ2V0S2luZCgpID09IEFubm90YXRpb25Db25zdGFudHMuT0JKRUNUX0ZJRUxEX0lERU5USUZJRVIpICYmCi0gICAgICAgICAgdG9rZW4uaW1hZ2UuZXF1YWxzKCJMT0dHRVIiKSkKLSAgICAgIHsKLSAgICAgICAgaXNMT0dHRVIgPSB0cnVlOwotICAgICAgfQotCi0gICAgICBpZiAoaXNMT0dHRVIgJiYKLSAgICAgICAgICAodG9rZW4uZ2V0S2luZCgpID09IEFubm90YXRpb25Db25zdGFudHMuT0JKRUNUX01FVEhPRF9JREVOVElGSUVSKSkKLSAgICAgIHsKLSAgICAgICAgaXNSZW1vdmFibGUgPSB0cnVlOwotCi0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICB0b2tlbiA9IHRva2VuLmdldE5leHQoKTsKLSAgICB9Ci0KLSAgICBpZiAoaXNSZW1vdmFibGUpCi0gICAgewotICAgICAgdG9rZW4gPSBzdGFydDsKLQotICAgICAgd2hpbGUgKHRva2VuICE9IGVuZCkKLSAgICAgIHsKLSAgICAgICAgdG9rZW4uc2V0UmVtb3ZhYmxlKHRydWUpOwotICAgICAgICB0b2tlbiA9IHRva2VuLmdldE5leHQoKTsKLSAgICAgIH0KLQotICAgICAgaWYgKHRva2VuLmtpbmQgPT0gSlNQYXJzZXIxNUNvbnN0YW50cy5TRU1JQ09MT04pCi0gICAgICB7Ci0gICAgICAgIHRva2VuLnNldFJlbW92YWJsZSh0cnVlKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gaXNSZW1vdmFibGU7Ci0gIH0KLQotICAvKioKLSAgICoKLSAgICogQHBhcmFtIGNvbnRleHRTdGFjawotICAgKiBAcGFyYW0gbGhzCi0gICAqIEBwYXJhbSBvcAotICAgKiBAcGFyYW0gcmhzCi0gICAqIEBwYXJhbSBlbmQKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCB0YWdBc3NpZ25tZW50RXhwcmVzc2lvbihQcm9ncmFtQ29udGV4dFN0YWNrIGNvbnRleHRTdGFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFubm90YXRlZFRva2VuIHZhclRva2VuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQW5ub3RhdGVkVG9rZW4gbGhzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQW5ub3RhdGVkVG9rZW4gb3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbm5vdGF0ZWRUb2tlbiByaHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbm5vdGF0ZWRUb2tlbiBlbmQpCi0gIHsKLSAgICBBbm5vdGF0ZWRUb2tlbiB0b2tlbiA9ICh2YXJUb2tlbiAhPSBudWxsKT8gdmFyVG9rZW46IGxoczsKLSAgICBib29sZWFuIGlzU3BlY2lhbFR5cGUgPSBmYWxzZTsKLSAgICBib29sZWFuIGlzUmVtb3ZhYmxlID0gZmFsc2U7Ci0gICAgUHJvZ3JhbUNvbnRleHQgY29udGV4dCA9IChQcm9ncmFtQ29udGV4dCkgY29udGV4dFN0YWNrLnBlZWsoKTsKLQotICAgIGlmIChyaHMua2luZCAhPSBKU1BhcnNlcjE1Q29uc3RhbnRzLklERU5USUZJRVIpCi0gICAgewotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIHdoaWxlICh0b2tlbiAhPSBlbmQpCi0gICAgewotICAgICAgLy8gVGhpcyBjaGVja3MgZm9yOgotICAgICAgLy8gInZhciBmb28gPSBQcm9maWxlci54eHg9Li4uOyIKLSAgICAgIC8vIG9yICJ2YXIgYmFyID0gZm9vLjxwcm9maWxlciBtZXRob2Q+OyIKLSAgICAgIEFubm90YXRlZFRva2VuIG9ialRva2VuID0gY29udGV4dFN0YWNrLmdldFRva2VuKHRva2VuLmltYWdlKTsKLQotICAgICAgaWYgKCh0b2tlbi5pc1NwZWNpYWxDbGFzc1R5cGUoKSB8fAotICAgICAgICAgICAoKG9ialRva2VuICE9IG51bGwpICYmIG9ialRva2VuLmlzU3BlY2lhbE9iamVjdFR5cGUoKSkpICYmCi0gICAgICAgICAgKHRva2VuLmdldEtpbmQoKSA9PSBBbm5vdGF0aW9uQ29uc3RhbnRzLk9CSkVDVF9JREVOVElGSUVSKSkKLSAgICAgIHsKLSAgICAgICAgaXNTcGVjaWFsVHlwZSA9IHRydWU7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChpc1NwZWNpYWxUeXBlICYmCi0gICAgICAgICAgKHRva2VuLmdldEtpbmQoKSA9PSBBbm5vdGF0aW9uQ29uc3RhbnRzLk9CSkVDVF9NRVRIT0RfSURFTlRJRklFUikpCi0gICAgICB7Ci0gICAgICAgIGlzUmVtb3ZhYmxlID0gdHJ1ZTsKLQotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgdG9rZW4gPSB0b2tlbi5nZXROZXh0KCk7Ci0gICAgfQotCi0gICAgaWYgKGlzUmVtb3ZhYmxlKQotICAgIHsKLSAgICAgIHRva2VuID0gKHZhclRva2VuICE9IG51bGwpPyB2YXJUb2tlbjogbGhzOwotCi0gICAgICBBbm5vdGF0ZWRUb2tlbiBwcmV2VG9rZW4gPSBsaHM7Ci0KLSAgICAgIHdoaWxlICh0b2tlbiAhPSBlbmQpCi0gICAgICB7Ci0gICAgICAgIHRva2VuLnNldFJlbW92YWJsZSh0cnVlKTsKLQotICAgICAgICBpZiAodG9rZW4uZ2V0TmV4dCgpLmlzU3BlY2lhbENsYXNzVHlwZSgpICYmCi0gICAgICAgICAgICAodG9rZW4ua2luZCA9PSBKU1BhcnNlcjE1Q29uc3RhbnRzLkFTU0lHTikpCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBUaGlzIHNhdmVzIHRoZSBMSFMgdmFyIG5hbWUgImZvbyIgdG8gYmUgcmVtb3ZlZCBsYXRlci4gSXQgYWxzbyBhc3NpZ25zIHRoZSBMSFMgdHlwZQotICAgICAgICAgIC8vICJ2YXIgZm9vID0gUHJvZmlsZXIueHh4PS4uLjsiCi0gICAgICAgICAgcHJldlRva2VuLnNldFR5cGUodG9rZW4ubmV4dC5pbWFnZSk7Ci0gICAgICAgICAgY29udGV4dC5hZGRUb2tlbihwcmV2VG9rZW4uaW1hZ2UsIHByZXZUb2tlbik7Ci0gICAgICAgIH0KLQotICAgICAgICBwcmV2VG9rZW4gPSB0b2tlbjsKLSAgICAgICAgdG9rZW4gPSB0b2tlbi5nZXROZXh0KCk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqCi0gICAqIEBwYXJhbSB0Ci0gICAqIEBwYXJhbSBhbm5vdGF0aW9uSWQKLSAgICogQHBhcmFtIGFubm90YXRpb25PYmplY3QKLSAgICogQHBhcmFtIHdzU2Vuc2l0aXZlCi0gICAqLwotICBwdWJsaWMgc3RhdGljIHZvaWQgYW5ub3RhdGVUb2tlbihUb2tlbiB0LCBpbnQgYW5ub3RhdGlvbklkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgYW5ub3RhdGlvbk9iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdzU2Vuc2l0aXZlKQotICB7Ci0gICAgQW5ub3RhdGVkVG9rZW4gYW5uVG9rZW4gPSAoQW5ub3RhdGVkVG9rZW4pIHQ7Ci0gICAgYW5uVG9rZW4uc2V0QW5ub3RhdGlvbktpbmQoYW5ub3RhdGlvbklkKTsKLQotICAgIGlmIChhbm5vdGF0aW9uT2JqZWN0ICE9IG51bGwpCi0gICAgewotICAgICAgYW5uVG9rZW4uc2V0QW5ub3RhdGlvbk9iamVjdChhbm5vdGF0aW9uT2JqZWN0KTsKLSAgICB9Ci0KLSAgICBpZiAod3NTZW5zaXRpdmUgPj0gMCkKLSAgICB7Ci0gICAgICBhbm5Ub2tlbi5zZXRXU1NlbnNpdGl2ZSh3c1NlbnNpdGl2ZSk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqCi0gICAqIEBwYXJhbSB2Ci0gICAqIEBwYXJhbSBhbm5vdGF0aW9uSWQKLSAgICogQHBhcmFtIGFubm90YXRpb25PYmplY3QKLSAgICogQHBhcmFtIHdzU2Vuc2l0aXZlCi0gICAqLwotICBwdWJsaWMgc3RhdGljIHZvaWQgYW5ub3RhdGVUb2tlbnMoVmVjdG9yIHYsIGludCBhbm5vdGF0aW9uSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgYW5ub3RhdGlvbk9iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3c1NlbnNpdGl2ZSkKLSAgewotICAgIGZvciAoRW51bWVyYXRpb24gaXRlbSA9IHYuZWxlbWVudHMoKTsgaXRlbS5oYXNNb3JlRWxlbWVudHMoKTsgKQotICAgIHsKLSAgICAgIFRva2VuIHQgPSAoVG9rZW4pIGl0ZW0ubmV4dEVsZW1lbnQoKTsKLSAgICAgIGFubm90YXRlVG9rZW4odCwgYW5ub3RhdGlvbklkLCBhbm5vdGF0aW9uT2JqZWN0LCB3c1NlbnNpdGl2ZSk7Ci0gICAgfQotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9vYmZ1c2NhdG9yL2phdmFzY3JpcHQxNXBhcnNlci9OYW1lR2VuLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L29iZnVzY2F0b3IvamF2YXNjcmlwdDE1cGFyc2VyL05hbWVHZW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWQ3OWIwYy4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L29iZnVzY2F0b3IvamF2YXNjcmlwdDE1cGFyc2VyL05hbWVHZW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0Lm9iZnVzY2F0b3IuamF2YXNjcmlwdDE1cGFyc2VyOwotCi1wdWJsaWMgY2xhc3MgTmFtZUdlbgotewotICBwcml2YXRlIGludCBfbmV4dElkID0gMDsKLQotICBwdWJsaWMgTmFtZUdlbigpCi0gIHsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpCi0gIHsKLSAgICByZXR1cm4gIngiICsgX25leHRJZCsrOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9vYmZ1c2NhdG9yL2phdmFzY3JpcHQxNXBhcnNlci9Qcm9ncmFtQ29udGV4dC5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9vYmZ1c2NhdG9yL2phdmFzY3JpcHQxNXBhcnNlci9Qcm9ncmFtQ29udGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODAwYzhlLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvb2JmdXNjYXRvci9qYXZhc2NyaXB0MTVwYXJzZXIvUHJvZ3JhbUNvbnRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQub2JmdXNjYXRvci5qYXZhc2NyaXB0MTVwYXJzZXI7Ci0KLS8vfi0tLSBKREsgaW1wb3J0cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotCi0vL34tLS0gY2xhc3NlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBjbGFzcyBQcm9ncmFtQ29udGV4dAotewotCi0gIC8vIFRhYmxlIG9mIHN5bWJvbCBuYW1lLCBBbm5vdGF0ZWRUb2tlbgotICBwcm90ZWN0ZWQgSGFzaE1hcCBfc3ltYm9sVGFibGUgPSBuZXcgSGFzaE1hcCgpOwotICBwcm90ZWN0ZWQgU3RyaW5nIF9uYW1lOwotICBwcm90ZWN0ZWQgTmFtZUdlbiBfbmFtZUdlbjsKLQotICAvL34tLS0gY29uc3RydWN0b3JzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICBwdWJsaWMgUHJvZ3JhbUNvbnRleHQoU3RyaW5nIG5hbWUpCi0gIHsKLSAgICB0aGlzKG5hbWUsIG5ldyBOYW1lR2VuKCkpOwotICB9Ci0KLSAgcHVibGljIFByb2dyYW1Db250ZXh0KFN0cmluZyBuYW1lLCBOYW1lR2VuIG5hbWVHZW4pCi0gIHsKLSAgICBfbmFtZSA9IG5hbWU7Ci0gICAgX25hbWVHZW4gPSBuYW1lR2VuOwotICB9Ci0KLSAgLy9+LS0tIG1ldGhvZHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgcHVibGljIHZvaWQgYWRkVG9rZW4oU3RyaW5nIG5hbWUsIEFubm90YXRlZFRva2VuIHRva2VuKQotICB7Ci0gICAgX3N5bWJvbFRhYmxlLnB1dChuYW1lLCB0b2tlbik7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdlbmVyYXRlU3ltYm9sTmFtZSgpCi0gIHsKLSAgICByZXR1cm4gX25hbWVHZW4uZ2V0TmFtZSgpOwotICB9Ci0KLSAgLy9+LS0tIGdldCBtZXRob2RzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgcHVibGljIFN0cmluZyBnZXROYW1lKCkKLSAgewotICAgIHJldHVybiBfbmFtZTsKLSAgfQotCi0gIHB1YmxpYyBOYW1lR2VuIGdldE5hbWVHZW4oKQotICB7Ci0gICAgcmV0dXJuIF9uYW1lR2VuOwotICB9Ci0KLSAgcHVibGljIEFubm90YXRlZFRva2VuIGdldFRva2VuKFN0cmluZyBrZXkpCi0gIHsKLSAgICByZXR1cm4gKEFubm90YXRlZFRva2VuKSBfc3ltYm9sVGFibGUuZ2V0KGtleSk7Ci0gIH0KLQotICAvL34tLS0gc2V0IG1ldGhvZHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKQotICB7Ci0gICAgX25hbWUgPSBuYW1lOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0TmFtZUdlbihOYW1lR2VuIG5hbWVHZW4pCi0gIHsKLSAgICBfbmFtZUdlbiA9IG5hbWVHZW47Ci0gIH0KLX0KLQotCi0vL34gRm9ybWF0dGVkIGJ5IEppbmRlbnQgLS0tIGh0dHA6Ly93d3cuamluZGVudC5jb20KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L29iZnVzY2F0b3IvamF2YXNjcmlwdDE1cGFyc2VyL1Byb2dyYW1Db250ZXh0U3RhY2suamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvb2JmdXNjYXRvci9qYXZhc2NyaXB0MTVwYXJzZXIvUHJvZ3JhbUNvbnRleHRTdGFjay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNmZlODIxLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvb2JmdXNjYXRvci9qYXZhc2NyaXB0MTVwYXJzZXIvUHJvZ3JhbUNvbnRleHRTdGFjay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5vYmZ1c2NhdG9yLmphdmFzY3JpcHQxNXBhcnNlcjsKLQotLy9+LS0tIEpESyBpbXBvcnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1pbXBvcnQgamF2YS51dGlsLlN0YWNrOwotCi0vL34tLS0gY2xhc3NlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBjbGFzcyBQcm9ncmFtQ29udGV4dFN0YWNrIGV4dGVuZHMgU3RhY2sgewotICAgIHB1YmxpYyBQcm9ncmFtQ29udGV4dFN0YWNrKCkge30KLQotICAgIC8vfi0tLSBtZXRob2RzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgcHVibGljIFByb2dyYW1Db250ZXh0IHBvcENvbnRleHQoKSB7Ci0gICAgICAgIHJldHVybiAoKFByb2dyYW1Db250ZXh0KSBwb3AoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcHVzaENvbnRleHQoUHJvZ3JhbUNvbnRleHQgY29udGV4dCkgewotICAgICAgICBwdXNoKGNvbnRleHQpOwotICAgIH0KLQotICAgIC8vfi0tLSBnZXQgbWV0aG9kcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgcHVibGljIEFubm90YXRlZFRva2VuIGdldFRva2VuKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIEFubm90YXRlZFRva2VuIHRva2VuID0gbnVsbDsKLQotICAgICAgICBmb3IgKGludCBpID0gc2l6ZSgpIC0gMTsgaSA+PSAwOyBpLS0pIHsKLSAgICAgICAgICAgIFByb2dyYW1Db250ZXh0IGNvbnRleHQgPSAoUHJvZ3JhbUNvbnRleHQpIGdldChpKTsKLQotICAgICAgICAgICAgaWYgKG51bGwgIT0gKHRva2VuID0gY29udGV4dC5nZXRUb2tlbihuYW1lKSkpIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB0b2tlbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lCi0gICAgICogQHBhcmFtIGRlcHRoCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHB1YmxpYyBBbm5vdGF0ZWRUb2tlbiBnZXRUb2tlbihTdHJpbmcgbmFtZSwgaW50IGRlcHRoKSB7Ci0gICAgICAgIGludCBlbmQ7Ci0KLSAgICAgICAgZW5kID0gc2l6ZSgpIC0gZGVwdGg7Ci0gICAgICAgIGVuZCA9IE1hdGgubWF4KGVuZCwgMCk7Ci0KLSAgICAgICAgQW5ub3RhdGVkVG9rZW4gdG9rZW4gPSBudWxsOwotCi0gICAgICAgIGZvciAoaW50IGkgPSBzaXplKCkgLSAxOyBpID49IGVuZDsgaS0tKSB7Ci0gICAgICAgICAgICBQcm9ncmFtQ29udGV4dCBjb250ZXh0ID0gKFByb2dyYW1Db250ZXh0KSBnZXQoaSk7Ci0KLSAgICAgICAgICAgIGlmIChudWxsICE9ICh0b2tlbiA9IGNvbnRleHQuZ2V0VG9rZW4obmFtZSkpKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gdG9rZW47Ci0gICAgfQotfQotCi0KLS8vfiBGb3JtYXR0ZWQgYnkgSmluZGVudCAtLS0gaHR0cDovL3d3dy5qaW5kZW50LmNvbQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvb2JmdXNjYXRvci9qYXZhc2NyaXB0MTVwYXJzZXIvVG9rZW4uamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvb2JmdXNjYXRvci9qYXZhc2NyaXB0MTVwYXJzZXIvVG9rZW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODFkMjk0NS4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L29iZnVzY2F0b3IvamF2YXNjcmlwdDE1cGFyc2VyL1Rva2VuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKiBHZW5lcmF0ZWQgQnk6SmF2YUNDOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIFRva2VuLmphdmEgVmVyc2lvbiAzLjAgKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0Lm9iZnVzY2F0b3IuamF2YXNjcmlwdDE1cGFyc2VyOwotCi0vKioKLSAqIERlc2NyaWJlcyB0aGUgaW5wdXQgdG9rZW4gc3RyZWFtLgotICovCi0KLXB1YmxpYyBjbGFzcyBUb2tlbiB7Ci0KLSAgLyoqCi0gICAqIEFuIGludGVnZXIgdGhhdCBkZXNjcmliZXMgdGhlIGtpbmQgb2YgdGhpcyB0b2tlbi4gIFRoaXMgbnVtYmVyaW5nCi0gICAqIHN5c3RlbSBpcyBkZXRlcm1pbmVkIGJ5IEphdmFDQ1BhcnNlciwgYW5kIGEgdGFibGUgb2YgdGhlc2UgbnVtYmVycyBpcwotICAgKiBzdG9yZWQgaW4gdGhlIGZpbGUgLi4uQ29uc3RhbnRzLmphdmEuCi0gICAqLwotICBwdWJsaWMgaW50IGtpbmQ7Ci0KLSAgLyoqCi0gICAqIGJlZ2luTGluZSBhbmQgYmVnaW5Db2x1bW4gZGVzY3JpYmUgdGhlIHBvc2l0aW9uIG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIKLSAgICogb2YgdGhpcyB0b2tlbjsgZW5kTGluZSBhbmQgZW5kQ29sdW1uIGRlc2NyaWJlIHRoZSBwb3NpdGlvbiBvZiB0aGUKLSAgICogbGFzdCBjaGFyYWN0ZXIgb2YgdGhpcyB0b2tlbi4KLSAgICovCi0gIHB1YmxpYyBpbnQgYmVnaW5MaW5lLCBiZWdpbkNvbHVtbiwgZW5kTGluZSwgZW5kQ29sdW1uOwotCi0gIC8qKgotICAgKiBUaGUgc3RyaW5nIGltYWdlIG9mIHRoZSB0b2tlbi4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgaW1hZ2U7Ci0KLSAgLyoqCi0gICAqIEEgcmVmZXJlbmNlIHRvIHRoZSBuZXh0IHJlZ3VsYXIgKG5vbi1zcGVjaWFsKSB0b2tlbiBmcm9tIHRoZSBpbnB1dAotICAgKiBzdHJlYW0uICBJZiB0aGlzIGlzIHRoZSBsYXN0IHRva2VuIGZyb20gdGhlIGlucHV0IHN0cmVhbSwgb3IgaWYgdGhlCi0gICAqIHRva2VuIG1hbmFnZXIgaGFzIG5vdCByZWFkIHRva2VucyBiZXlvbmQgdGhpcyBvbmUsIHRoaXMgZmllbGQgaXMKLSAgICogc2V0IHRvIG51bGwuICBUaGlzIGlzIHRydWUgb25seSBpZiB0aGlzIHRva2VuIGlzIGFsc28gYSByZWd1bGFyCi0gICAqIHRva2VuLiAgT3RoZXJ3aXNlLCBzZWUgYmVsb3cgZm9yIGEgZGVzY3JpcHRpb24gb2YgdGhlIGNvbnRlbnRzIG9mCi0gICAqIHRoaXMgZmllbGQuCi0gICAqLwotICBwdWJsaWMgVG9rZW4gbmV4dDsKLQotICAvKioKLSAgICogVGhpcyBmaWVsZCBpcyB1c2VkIHRvIGFjY2VzcyBzcGVjaWFsIHRva2VucyB0aGF0IG9jY3VyIHByaW9yIHRvIHRoaXMKLSAgICogdG9rZW4sIGJ1dCBhZnRlciB0aGUgaW1tZWRpYXRlbHkgcHJlY2VkaW5nIHJlZ3VsYXIgKG5vbi1zcGVjaWFsKSB0b2tlbi4KLSAgICogSWYgdGhlcmUgYXJlIG5vIHN1Y2ggc3BlY2lhbCB0b2tlbnMsIHRoaXMgZmllbGQgaXMgc2V0IHRvIG51bGwuCi0gICAqIFdoZW4gdGhlcmUgYXJlIG1vcmUgdGhhbiBvbmUgc3VjaCBzcGVjaWFsIHRva2VuLCB0aGlzIGZpZWxkIHJlZmVycwotICAgKiB0byB0aGUgbGFzdCBvZiB0aGVzZSBzcGVjaWFsIHRva2Vucywgd2hpY2ggaW4gdHVybiByZWZlcnMgdG8gdGhlIG5leHQKLSAgICogcHJldmlvdXMgc3BlY2lhbCB0b2tlbiB0aHJvdWdoIGl0cyBzcGVjaWFsVG9rZW4gZmllbGQsIGFuZCBzbyBvbgotICAgKiB1bnRpbCB0aGUgZmlyc3Qgc3BlY2lhbCB0b2tlbiAod2hvc2Ugc3BlY2lhbFRva2VuIGZpZWxkIGlzIG51bGwpLgotICAgKiBUaGUgbmV4dCBmaWVsZHMgb2Ygc3BlY2lhbCB0b2tlbnMgcmVmZXIgdG8gb3RoZXIgc3BlY2lhbCB0b2tlbnMgdGhhdAotICAgKiBpbW1lZGlhdGVseSBmb2xsb3cgaXQgKHdpdGhvdXQgYW4gaW50ZXJ2ZW5pbmcgcmVndWxhciB0b2tlbikuICBJZiB0aGVyZQotICAgKiBpcyBubyBzdWNoIHRva2VuLCB0aGlzIGZpZWxkIGlzIG51bGwuCi0gICAqLwotICBwdWJsaWMgVG9rZW4gc3BlY2lhbFRva2VuOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBpbWFnZS4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotICB7Ci0gICAgIHJldHVybiBpbWFnZTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIGEgbmV3IFRva2VuIG9iamVjdCwgYnkgZGVmYXVsdC4gSG93ZXZlciwgaWYgeW91IHdhbnQsIHlvdQotICAgKiBjYW4gY3JlYXRlIGFuZCByZXR1cm4gc3ViY2xhc3Mgb2JqZWN0cyBiYXNlZCBvbiB0aGUgdmFsdWUgb2Ygb2ZLaW5kLgotICAgKiBTaW1wbHkgYWRkIHRoZSBjYXNlcyB0byB0aGUgc3dpdGNoIGZvciBhbGwgdGhvc2Ugc3BlY2lhbCBjYXNlcy4KLSAgICogRm9yIGV4YW1wbGUsIGlmIHlvdSBoYXZlIGEgc3ViY2xhc3Mgb2YgVG9rZW4gY2FsbGVkIElEVG9rZW4gdGhhdAotICAgKiB5b3Ugd2FudCB0byBjcmVhdGUgaWYgb2ZLaW5kIGlzIElELCBzaW1scHkgYWRkIHNvbWV0aGluZyBsaWtlIDoKLSAgICoKLSAgICogICAgY2FzZSBNeVBhcnNlckNvbnN0YW50cy5JRCA6IHJldHVybiBuZXcgSURUb2tlbigpOwotICAgKgotICAgKiB0byB0aGUgZm9sbG93aW5nIHN3aXRjaCBzdGF0ZW1lbnQuIFRoZW4geW91IGNhbiBjYXN0IG1hdGNoZWRUb2tlbgotICAgKiB2YXJpYWJsZSB0byB0aGUgYXBwcm9wcmlhdGUgdHlwZSBhbmQgdXNlIGl0IGluIHlvdXIgbGV4aWNhbCBhY3Rpb25zLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBUb2tlbiBuZXdUb2tlbihpbnQgb2ZLaW5kKQotICB7Ci0gICAgIHN3aXRjaChvZktpbmQpCi0gICAgIHsKLSAgICAgICBkZWZhdWx0IDogcmV0dXJuIG5ldyBBbm5vdGF0ZWRUb2tlbigpOwotICAgICB9Ci0gIH0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvb2JmdXNjYXRvci9qYXZhc2NyaXB0MTVwYXJzZXIvanMxLjUuamogYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L29iZnVzY2F0b3IvamF2YXNjcmlwdDE1cGFyc2VyL2pzMS41LmpqCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjdmYzkwLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvb2JmdXNjYXRvci9qYXZhc2NyaXB0MTVwYXJzZXIvanMxLjUuamoKKysrIC9kZXYvbnVsbApAQCAtMSwxMTgzICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLW9wdGlvbnMgewotICBTVEFUSUM9ZmFsc2U7Ci0gIERFQlVHX1RPS0VOX01BTkFHRVI9ZmFsc2U7Ci0gIERFQlVHX1BBUlNFUj1mYWxzZTsKLX0KLQotUEFSU0VSX0JFR0lOKEpTUGFyc2VyMTUpCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5vYmZ1c2NhdG9yLmphdmFzY3JpcHQxNXBhcnNlcjsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1wdWJsaWMgY2xhc3MgSlNQYXJzZXIxNSAKLXsKLSAgICAvLyBUaGlzIGlzIGEgc3RhY2sgb2Ygc3ltYm9sIHRhYmxlcyBmb3IgdGhlIEpTIGZpbGUKLSAgICBwcm90ZWN0ZWQgUHJvZ3JhbUNvbnRleHRTdGFjayBfY29udGV4dFN0YWNrID0gbmV3IFByb2dyYW1Db250ZXh0U3RhY2soKTsKLSAgICAKLX0KLQotUEFSU0VSX0VORChKU1BhcnNlcjE1KQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gTEVYSUNBTCBSVUxFUyBTZWN0aW9uCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotVE9LRU5fTUdSX0RFQ0xTIDoKLXsKLSAgICBwcml2YXRlIGJvb2xlYW4gaXNSZWdWYWxpZCA9IHRydWU7Ci0gICAgcHVibGljIHZvaWQgc2V0UmVnSW52YWxpZCgpCi0gICAgewotICAgICAgICBpc1JlZ1ZhbGlkID0gZmFsc2U7Ci0gICAgfQotICAgIHB1YmxpYyB2b2lkIHNldFJlZ1ZhbGlkKCkKLSAgICB7Ci0gICAgICAgIGlzUmVnVmFsaWQgPSB0cnVlOwotICAgIH0KLX0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIFdISVRFIFNQQUNFIAotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLVNQRUNJQUxfVE9LRU4gOgotewotICAgICAgICA8RU9MOiAgIChbIlxuIiwiXHIiXSkrID4KLSAgICB8ICAgPFdTOiAgICAoWyIgIiwiXHQiXSkrID4KLX0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyBDT01NRU5UUyAKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi1NT1JFIDoKLXsKLSAgICAgICAgIi8vIiA6IElOX1NJTkdMRV9MSU5FX0NPTU1FTlQKLSAgICB8ICAgIi8qIiA6IElOX01VTFRJX0xJTkVfQ09NTUVOVAotfQotCi08SU5fU0lOR0xFX0xJTkVfQ09NTUVOVD4KLVNQRUNJQUxfVE9LRU4gOgotewotICAgICAgICA8IFNJTkdMRV9MSU5FX0NPTU1FTlQ6ICh+WyJcbiIsIlxyIl0pKiAoIlxuInwiXHIifCJcclxuIik/ID4gIDogREVGQVVMVAotfQotCi08SU5fTVVMVElfTElORV9DT01NRU5UPgotU1BFQ0lBTF9UT0tFTiA6Ci17Ci0gICAgICAgIDxNVUxUSV9MSU5FX0NPTU1FTlQ6ICIqLyIgPiA6IERFRkFVTFQKLX0KLQotPElOX1NJTkdMRV9MSU5FX0NPTU1FTlQsIElOX01VTFRJX0xJTkVfQ09NTUVOVD4KLU1PUkUgOgotewotICAgICAgICA8IH5bXSA+Ci19Ci0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gUkVTRVJWRUQgV09SRFMgQU5EIExJVEVSQUxTCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotVE9LRU4gOgotewotICAgICAgICA8IEJSRUFLOiAgICAgICAgImJyZWFrIiA+Ci0gICAgfCAgIDwgQ09OVElOVUU6ICAgICAiY29udGludWUiID4KLSAgICB8ICAgPCBERUxFVEU6ICAgICAgICJkZWxldGUiID4KLSAgICB8ICAgPCBFTFNFOiAgICAgICAgICJlbHNlIiA+Ci0gICAgfCAgIDwgRk9SOiAgICAgICAgICAiZm9yIiA+Ci0gICAgfCAgIDwgRlVOQ1RJT046ICAgICAiZnVuY3Rpb24iID4KLSAgICB8ICAgPCBGVU5DVElPTl86ICAgICJGdW5jdGlvbiIgPgotICAgIHwgICA8IElGOiAgICAgICAgICAgImlmIiA+Ci0gICAgfCAgIDwgSU46ICAgICAgICAgICAiaW4iID4KLSAgICB8ICAgPCBORVc6ICAgICAgICAgICJuZXciID4KLSAgICB8ICAgPCBSRVRVUk46ICAgICAgICJyZXR1cm4iID4KLSAgICB8ICAgPCBUSElTOiAgICAgICAgICJ0aGlzIiA+Ci0gICAgfCAgIDwgVFlQRU9GOiAgICAgICAidHlwZW9mIiA+Ci0gICAgfCAgIDwgSU5TVEFOQ0VPRjogICAiaW5zdGFuY2VvZiIgPgotICAgIHwgICA8IFZBUjogICAgICAgICAgInZhciIgPgotICAgIHwgICA8IFZPSUQ6ICAgICAgICAgInZvaWQiID4KLSAgICB8ICAgPCBXSElMRTogICAgICAgICJ3aGlsZSIgPgotICAgIHwgICA8IFdJVEg6ICAgICAgICAgIndpdGgiID4KLSAgICB8ICAgPCBDQVNFOiAgICAgICAgICJjYXNlIiA+Ci0gICAgfCAgIDwgQ0FUQ0g6ICAgICAgICAiY2F0Y2giID4KLSAgICB8ICAgPCBDTEFTUzogICAgICAgICJjbGFzcyIgPgotICAgIHwgICA8IENPTlNUOiAgICAgICAgImNvbnN0IiA+Ci0gICAgfCAgIDwgREVCVUdHRVI6ICAgICAiZGVidWdnZXIiID4KLSAgICB8ICAgPCBfREVGQVVMVDogICAgICJkZWZhdWx0IiA+Ci0gICAgfCAgIDwgRE86ICAgICAgICAgICAiZG8iID4KLSAgICB8ICAgPCBFTlVNOiAgICAgICAgICJlbnVtIiA+Ci0gICAgfCAgIDwgRVhQT1JUOiAgICAgICAiZXhwb3J0IiA+Ci0gICAgfCAgIDwgRVhURU5EUzogICAgICAiZXh0ZW5kcyIgPgotICAgIHwgICA8IEZJTkFMTFk6ICAgICAgImZpbmFsbHkiID4KLSAgICB8ICAgPCBJTVBPUlQ6ICAgICAgICJpbXBvcnQiID4KLSAgICB8ICAgPCBTVVBFUjogICAgICAgICJzdXBlciIgPgotICAgIHwgICA8IFNXSVRDSDogICAgICAgInN3aXRjaCIgPgotICAgIHwgICA8IFRIUk9XOiAgICAgICAgInRocm93IiA+Ci0gICAgfCAgIDwgVFJZOiAgICAgICAgICAidHJ5IiA+Ci0gICAgfCAgIDwgVFJVRTogICAgICAgICAidHJ1ZSIgPiAgICAvLyBUaGV5IGFyZSBub3Qgc3VwcG9zZWQgdG8gYmUga2V5d29yZHMKLSAgICB8ICAgPCBGQUxTRTogICAgICAgICJmYWxzZSIgPiAgIC8vIFRoZXkgYXJlIG5vdCBzdXBwb3NlZCB0byBiZSBrZXl3b3JkcwotICAgIHwgICA8IE5VTEw6ICAgICAgICAgIm51bGwiID4gICAgLy8gVGhleSBhcmUgbm90IHN1cHBvc2VkIHRvIGJlIGtleXdvcmRzCi19Ci0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gTElURVJBTFMgCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotVE9LRU4gOgotewotICAgICAgICA8IERFQ0lNQUxfTElURVJBTDogWyIxIi0iOSJdIChbIjAiLSI5Il0pKiA+Ci0gICAgfCAgIDwgSEVYX0xJVEVSQUw6ICIwIiBbIngiLCJYIl0gKFsiMCItIjkiLCJhIi0iZiIsIkEiLSJGIl0pKyA+Ci0gICAgfCAgIDwgT0NUQUxfTElURVJBTDogIjAiIChbIjAiLSI3Il0pKiA+Ci0gICAgfCAgIDwgRkxPQVRJTkdfUE9JTlRfTElURVJBTDogKFsiMCItIjkiXSkrICIuIiAoWyIwIi0iOSJdKSogKDxFWFBPTkVOVD4pPyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICIuIiAoWyIwIi0iOSJdKSsgKDxFWFBPTkVOVD4pPyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIChbIjAiLSI5Il0pKyAoPEVYUE9ORU5UPik/IAotICAgICAgICA+Ci0gICAgfCAgIDwgI0VYUE9ORU5UOiBbImUiLCJFIl0gKFsiKyIsIi0iXSk/IChbIjAiLSI5Il0pKyA+Ci0gICAgfCAgIDwgU1RSSU5HX0xJVEVSQUw6ICAgIlwiIiAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKCAoflsiXCIiLCJcXCIsIlxuIiwiXHIiXSkgfCA8RVNDQVBFX1NFUVVFTkNFPiApKiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXCIiCi0gICAgICAgICAgICAgICAgICAgICAgICB8ICAgIlwiIiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoICh+WyJcIiIsICJcXCJdKSB8ICJcXCIgKCJcbiIgfCAiXHIiIHwgIlxyXG4iKSB8IDxFU0NBUEVfU0VRVUVOQ0U+ICkqIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcIiIgIAotICAgICAgICAgICAgICAgICAgICAgICAgfCAgICInIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICggKH5bIiciLCJcXCIsIlxuIiwiXHIiXSkgfCA8RVNDQVBFX1NFUVVFTkNFPiApKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICInIgotICAgICAgICA+Ci0gICAgfCAgIDwgI0VTQ0FQRV9TRVFVRU5DRTogCi0gICAgICAgICAgICAiXFwiCi0gICAgICAgICAgICAoICAgICAgIFsibiIsInQiLCJiIiwiciIsImYiLCJcXCIsIiciLCJcIiIsIlsiLCJdIl0KLSAgICAgICAgICAgICAgICB8ICAgWyIwIi0iNyJdICggWyIwIi0iNyJdICk/Ci0gICAgICAgICAgICAgICAgfCAgIFsiMCItIjMiXSBbIjAiLSI3Il0gWyIwIi0iNyJdCi0gICAgICAgICAgICAgICAgfCAgIFsieCJdIFsiMCItIjkiLCJhIi0iZiIsIkEiLSJGIl0gWyIwIi0iOSIsImEiLSJmIiwiQSItIkYiXQotICAgICAgICAgICAgICAgIHwgICBbInUiXSBbIjAiLSI5IiwiYSItImYiLCJBIi0iRiJdIFsiMCItIjkiLCJhIi0iZiIsIkEiLSJGIl0gCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFsiMCItIjkiLCJhIi0iZiIsIkEiLSJGIl0gWyIwIi0iOSIsImEiLSJmIiwiQSItIkYiXQotICAgICAgICAgICAgKQotICAgICAgICA+Ci0gICAgfCAgIDwgVU5URVJNSU5BVEVEX1NUUklOR19MSVRFUkFMOgotICAgICAgICAgICAgICAgICJcIiIgKCA8RVNDQVBFX1NFUVVFTkNFPiB8ICh+WyJcIiIsIlxcIiwiXG4iLCJcciJdKSApKiAoIFsiXG4iLCJcciJdICk/Ci0gICAgICAgICAgICB8ICAgIiciICAoIDxFU0NBUEVfU0VRVUVOQ0U+IHwgKH5bIiciLCJcXCIsIlxuIiwiXHIiXSkgICkqICggWyJcbiIsIlxyIl0gKT8KLSAgICAgICAgPgotfQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIFJFR1VMQVIgRVhQUkVTU0lPTlMgCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotVE9LRU4gOgoteyAKLSAgICAgICAgPCAjUkVHWF9TVEFSVF9DSEFSIDogflsiXHIiLCJcbiIsIi8iLCI9IiwiKiJdIHwgIlxcLyI+Ci0gICAgfCAgIDwgI1JFR1hfQk9EWV9DSEFSX0VYQ0xVU0lPTiA6IH5bIlxyIiwiXG4iLCIvIl0gPiAgCi0gICAgfCAgIDwgI1JFR1hfQk9EWV9DSEFSIDogKCA8UkVHWF9CT0RZX0NIQVJfRVhDTFVTSU9OPiB8ICJcXC8iICkgPgotICAgIHwgICA8ICNSRUdFWF9FTkRfQ0hBUiA6ICAgICAiaSIgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICJnIiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgIm0iIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAiaWciIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAiaW0iIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAiZ2kiIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAiZ20iIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAibWkiIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAibWciIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAiaWdtIiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgImltZyIgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICJnbWkiIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAiZ2ltIiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgIm1pZyIgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICJtZ2kiIAotICAgICAgICA+Ci19Ci0KLVRPS0VOIDoKLXsKLSAgICAgICAgPFJFR1VMQVJfRVhQUkVTU0lPTiA6ICIvIiA8UkVHWF9TVEFSVF9DSEFSPiAoPFJFR1hfQk9EWV9DSEFSPikqICIvIiAoPFJFR0VYX0VORF9DSEFSPik/ID4KLSAgICAgICAgewotICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIC8vIFBlZWsgYXQgdGhlIG5leHQgY2hhcmFjdGVyLgotICAgICAgICAgICAgICAgIGNoYXIgbmV4dENoID0gaW5wdXRfc3RyZWFtLnJlYWRDaGFyKCk7Ci0gICAgICAgICAgICAgICAgaW5wdXRfc3RyZWFtLmJhY2t1cCgxKTsKLSAgICAgICAgICAgICAgICBpZiAoaXNSZWdWYWxpZCA9PSBmYWxzZSB8fCBuZXh0Q2ggPT0gJy8nIHx8IG5leHRDaCA9PSAnKicpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8KLSAgICAgICAgICAgICAgICAgICAgLy8gTGV4ZWNhbCBhbmFseXNlciB0aGlua3MgaXQgaXMgYSBSRQotICAgICAgICAgICAgICAgICAgICAvLyBvcGVyYXRvciBzdWNoIGFzIC8uLi4uLi8KLSAgICAgICAgICAgICAgICAgICAgLy8gUHV0IHRoZSBldmVyeXRoaW5nIHRvIHRoZSBmaXJzdCAiLyIgYmFjayBvbiB0aGUgaW5wdXQgc3RyZWFtCi0gICAgICAgICAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAgICAgICAgIGlucHV0X3N0cmVhbS5iYWNrdXAobGVuZ3RoT2ZNYXRjaC0xKTsKLSAgICAgICAgICAgICAgICAgICAgLy8KLSAgICAgICAgICAgICAgICAgICAgLy8gQW5kIHJlbW92ZSBpdCBmcm9tIHRoZSB0b2tlbgotICAgICAgICAgICAgICAgICAgICAvLwotICAgICAgICAgICAgICAgICAgICBtYXRjaGVkVG9rZW4uaW1hZ2UgPSBtYXRjaGVkVG9rZW4uaW1hZ2Uuc3Vic3RyaW5nKDAsIDEpOwotICAgICAgICAgICAgICAgICAgICBpbWFnZS5kZWxldGUoMCwgaW1hZ2UubGVuZ3RoKCkgLSAxKTsKLSAgICAgICAgICAgICAgICAgICAgaW1hZ2UuYXBwZW5kKCcvJyk7Ci0gICAgICAgICAgICAgICAgICAgIG1hdGNoZWRUb2tlbi5raW5kPVNMQVNIOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGUudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICB9Ci0gICAgICAgIH0gICAgICAgIAotCi19Ci0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gSURFTlRJRklFUlMgCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotVE9LRU4gOgotewotICAgICAgICA8IElERU5USUZJRVI6IDxMRVRURVI+ICg8TEVUVEVSPnw8RElHSVQ+KSogPgotICAgIHwgICA8ICNMRVRURVI6IFsiYSItInoiLCJBIi0iWiIsIiQiLCJfIl0gPgotICAgIHwgICA8ICNESUdJVDogWyIwIi0iOSJdPgotfQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIFNFUEFSQVRPUlMgCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotVE9LRU4gOgotewotICAgICAgICA8IExQQVJFTjogICAiKCIgPgotICAgIHwgICA8IFJQQVJFTjogICAiKSIgPgotICAgIHwgICA8IExCUkFDRTogICAieyIgPgotICAgIHwgICA8IFJCUkFDRTogICAifSIgPgotICAgIHwgICA8IExCUkFDS0VUOiAiWyIgPgotICAgIHwgICA8IFJCUkFDS0VUOiAiXSIgPgotICAgIHwgICA8IFNFTUlDT0xPTjogIjsiID4KLSAgICB8ICAgPCBDT01NQTogICAgIiwiID4KLSAgICB8ICAgPCBET1Q6ICAgICAgIi4iID4KLX0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIE9QRVJBVE9SUyAKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi1UT0tFTiA6Ci17Ci0gICAgICAgIDwgQVNTSUdOOiAgICAgICAgICAgICAgICI9IiA+Ci0gICAgfCAgIDwgR1Q6ICAgICAgICAgICAgICAgICAgICI+IiA+Ci0gICAgfCAgIDwgTFQ6ICAgICAgICAgICAgICAgICAgICI8IiA+Ci0gICAgfCAgIDwgQkFORzogICAgICAgICAgICAgICAgICIhIiA+Ci0gICAgfCAgIDwgVElMREU6ICAgICAgICAgICAgICAgICJ+IiA+Ci0gICAgfCAgIDwgSE9PSzogICAgICAgICAgICAgICAgICI/IiA+Ci0gICAgfCAgIDwgQ09MT046ICAgICAgICAgICAgICAgICI6IiA+Ci0gICAgfCAgIDwgRVE6ICAgICAgICAgICAgICAgICAgICI9PSIgPgotICAgIHwgICA8IExFOiAgICAgICAgICAgICAgICAgICAiPD0iID4KLSAgICB8ICAgPCBHRTogICAgICAgICAgICAgICAgICAgIj49IiA+Ci0gICAgfCAgIDwgTkU6ICAgICAgICAgICAgICAgICAgICIhPSIgPgotICAgIHwgICA8IFNDX09SOiAgICAgICAgICAgICAgICAifHwiID4KLSAgICB8ICAgPCBTQ19BTkQ6ICAgICAgICAgICAgICAgIiYmIiA+Ci0gICAgfCAgIDwgSU5DUjogICAgICAgICAgICAgICAgICIrKyIgPgotICAgIHwgICA8IERFQ1I6ICAgICAgICAgICAgICAgICAiLS0iID4KLSAgICB8ICAgPCBQTFVTOiAgICAgICAgICAgICAgICAgIisiID4KLSAgICB8ICAgPCBNSU5VUzogICAgICAgICAgICAgICAgIi0iID4KLSAgICB8ICAgPCBTVEFSOiAgICAgICAgICAgICAgICAgIioiID4KLSAgICB8ICAgPCBTTEFTSDogICAgICAgICAgICAgICAgIi8iID4KLSAgICB8ICAgPCBCSVRfQU5EOiAgICAgICAgICAgICAgIiYiID4KLSAgICB8ICAgPCBCSVRfT1I6ICAgICAgICAgICAgICAgInwiID4KLSAgICB8ICAgPCBYT1I6ICAgICAgICAgICAgICAgICAgIl4iID4KLSAgICB8ICAgPCBSRU06ICAgICAgICAgICAgICAgICAgIiUiID4KLSAgICB8ICAgPCBMU0hJRlQ6ICAgICAgICAgICAgICAgIjw8IiA+Ci0gICAgfCAgIDwgUlNJR05FRFNISUZUOiAgICAgICAgICI+PiIgPgotICAgIHwgICA8IFJVTlNJR05FRFNISUZUOiAgICAgICAiPj4+IiA+Ci0gICAgfCAgIDwgUExVU0FTU0lHTjogICAgICAgICAgICIrPSIgPgotICAgIHwgICA8IE1JTlVTQVNTSUdOOiAgICAgICAgICAiLT0iID4KLSAgICB8ICAgPCBTVEFSQVNTSUdOOiAgICAgICAgICAgIio9IiA+Ci0gICAgfCAgIDwgU0xBU0hBU1NJR046ICAgICAgICAgICIvPSIgPgotICAgIHwgICA8IEFOREFTU0lHTjogICAgICAgICAgICAiJj0iID4KLSAgICB8ICAgPCBPUkFTU0lHTjogICAgICAgICAgICAgInw9IiA+Ci0gICAgfCAgIDwgWE9SQVNTSUdOOiAgICAgICAgICAgICJePSIgPgotICAgIHwgICA8IFJFTUFTU0lHTjogICAgICAgICAgICAiJT0iID4KLSAgICB8ICAgPCBMU0hJRlRBU1NJR046ICAgICAgICAgIjw8PSIgPgotICAgIHwgICA8IFJTSUdORURTSElGVEFTU0lHTjogICAiPj49IiA+Ci0gICAgfCAgIDwgUlVOU0lHTkVEU0hJRlRBU1NJR046ICI+Pj49IiA+Ci0gICAgfCAgIDwgSURFTlRJVFlPUEVSOiAgICAgICAgICI9PT0iID4KLSAgICB8ICAgPCBOT1RJREVOVElUWU9QRVI6ICAgICAgIiE9PSIgPgotfQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gR1JBTU1BUiBTZWN0aW9uCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLXZvaWQgTGl0ZXJhbCgpOgote30KLXsKLSAgICAgICAgPERFQ0lNQUxfTElURVJBTD4gCi0gICAgfCAgIDxPQ1RBTF9MSVRFUkFMPgotICAgIHwgICA8SEVYX0xJVEVSQUw+Ci0gICAgfCAgIDxGTE9BVElOR19QT0lOVF9MSVRFUkFMPiAKLSAgICB8ICAgPFNUUklOR19MSVRFUkFMPiAKLSAgICB8ICAgPFRSVUU+IAotICAgIHwgICA8RkFMU0U+Ci0gICAgfCAgIDxSRUdVTEFSX0VYUFJFU1NJT04+IAotICAgIHwgICA8TlVMTD4KLX0KLQotVG9rZW4gSWRlbnRpZmllcigpOgotewotCQlUb2tlbiB0OwotfQotewotICAgIAl0ID0gPElERU5USUZJRVI+IHtyZXR1cm4gdDt9Ci19Ci0KLXZvaWQgUHJpbWFyeUV4cHJlc3Npb24oKToKLXsKLQkJVG9rZW4gcHJlZml4VG9rZW4gPSBudWxsOwkKLX0KLXsKLSAgICAoCi0gICAgICAgIHByZWZpeFRva2VuID0gPFRISVM+ICAgICAgICAgICAgKFByaW1hcnlTdWZmaXgoKSkqCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBKU1BhcnNlclV0aWxzLnRhZ09iamVjdElkZW50aWZpZXIocHJlZml4VG9rZW4sIGdldFRva2VuKDEpKTsKLSAgICAgICAgICAgIH0KLSAgICB8ICAgcHJlZml4VG9rZW49SWRlbnRpZmllcigpICAgICAgICAoUHJpbWFyeVN1ZmZpeCgpKSoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIEpTUGFyc2VyVXRpbHMudGFnT2JqZWN0SWRlbnRpZmllcihwcmVmaXhUb2tlbiwgZ2V0VG9rZW4oMSkpOwotICAgICAgICAgICAgICAgSlNQYXJzZXJVdGlscy50YWdNZXRob2RJbnZvY2F0aW9uKF9jb250ZXh0U3RhY2ssIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChBbm5vdGF0ZWRUb2tlbilwcmVmaXhUb2tlbiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEFubm90YXRlZFRva2VuKWdldFRva2VuKDEpKTsKLSAgICAgICAgICAgIH0KLSAgICB8ICAgTE9PS0FIRUFEKDIpICA8U1RSSU5HX0xJVEVSQUw+ICAgICAgKFByaW1hcnlTdWZmaXgoKSkqICAKLSAgICB8ICAgTE9PS0FIRUFEKDIpICA8UkVHVUxBUl9FWFBSRVNTSU9OPiAgKFByaW1hcnlTdWZmaXgoKSkqICAgIAotICAgIHwgICBMT09LQUhFQUQoMikgIExpdGVyYWwoKSAKLSAgICB8ICAgRnVuY3Rpb25MaXRlcmFsKCkKLSAgICB8ICAgTmVzdGVkQXJyYXlMaXRlcmFsKCkgICAgICAgICAgICAgICAgKFByaW1hcnlTdWZmaXgoKSkqCi0gICAgfCAgIE9iamVjdExpdGVyYWwoKSAKLSAgICB8ICAgPExQQVJFTj4gRXhwcmVzc2lvbigpIDxSUEFSRU4+ICAgICAgKFByaW1hcnlTdWZmaXgoKSkqIAotICAgIHwgICBBbGxvY2F0aW9uRXhwcmVzc2lvbigpIChQcmltYXJ5U3VmZml4KCkpKiAgICAgICAgICAgICAKLSAgICApCi0gICAgewotICAgICAgICB0b2tlbl9zb3VyY2Uuc2V0UmVnVmFsaWQoKTsKLSAgICB9Ci19Ci0KLXZvaWQgUHJpbWFyeVN1ZmZpeCgpOgote30KLXsKLSAgICAgICAgQXJndW1lbnRzKCkgCi0gICAgfCAgIHt0b2tlbl9zb3VyY2Uuc2V0UmVnSW52YWxpZCgpO30gPExCUkFDS0VUPiBFeHByZXNzaW9uKCkgPFJCUkFDS0VUPiAKLSAgICB8ICAge3Rva2VuX3NvdXJjZS5zZXRSZWdJbnZhbGlkKCk7fSA8RE9UPiBJZGVudGlmaWVyKCkKLX0KLQotdm9pZCBBcmd1bWVudHMoKToKLXt9Ci17Ci0gICAgICAgIDxMUEFSRU4+IHt0b2tlbl9zb3VyY2Uuc2V0UmVnVmFsaWQoKTt9IFtBcmd1bWVudExpc3QoKV0gPFJQQVJFTj4KLX0KLQotdm9pZCBBcmd1bWVudExpc3QoKToKLXt9Ci17Ci0gICAgICAgIEFzc2lnbm1lbnRFeHByZXNzaW9uKCkgKDxDT01NQT4gQXNzaWdubWVudEV4cHJlc3Npb24oKSkqCi19Ci0KLXZvaWQgTGl0ZXJhbEFyZ3VtZW50TGlzdCgpOgote30KLXsKLSAgICAgICAgPFNUUklOR19MSVRFUkFMPiAoPENPTU1BPiA8U1RSSU5HX0xJVEVSQUw+KSoKLX0KLQotdm9pZCBOZXdTdWZmaXgoKToKLXt9Ci17Ci0gICAgICAgIDxET1Q+IElkZW50aWZpZXIoKQotfQotCi12b2lkIEFsbG9jYXRpb25FeHByZXNzaW9uKCk6Ci17Ci0gICAgICAgIFRva2VuIHQ7Ci19Ci17Ci0gICAgICAgIExPT0tBSEVBRCg0KSAgdD08TkVXPiA8VEhJUz4gICAgICAgKExPT0tBSEVBRCgyKSBOZXdTdWZmaXgoKSkqIFtMT09LQUhFQUQoMikgQXJndW1lbnRzKCldIAotICAgICAgICAgICAge0pTUGFyc2VyVXRpbHMuYW5ub3RhdGVUb2tlbih0LCBBbm5vdGF0aW9uQ29uc3RhbnRzLlVOREVGSU5FRCwgbnVsbCwgQW5ub3RhdGVkVG9rZW4uUFJFRklYX1dTKTt9Ci0gICAgfCAgIExPT0tBSEVBRCg0KSAgdD08TkVXPiBJZGVudGlmaWVyKCkgKExPT0tBSEVBRCgyKSBOZXdTdWZmaXgoKSkqIFtMT09LQUhFQUQoMikgQXJndW1lbnRzKCldIAotICAgICAgICAgICAge0pTUGFyc2VyVXRpbHMuYW5ub3RhdGVUb2tlbih0LCBBbm5vdGF0aW9uQ29uc3RhbnRzLlVOREVGSU5FRCwgbnVsbCwgQW5ub3RhdGVkVG9rZW4uUFJFRklYX1dTKTt9Ci0gICAgfCAgIExPT0tBSEVBRCg0KSAgdD08TkVXPiBGdW5jdGlvbkNvbnN0cnVjdG9yKCkgKExPT0tBSEVBRCgyKSBOZXdTdWZmaXgoKSkqIFtMT09LQUhFQUQgKDIpIEFyZ3VtZW50cygpXSAKLSAgICAgICAgICAgIHtKU1BhcnNlclV0aWxzLmFubm90YXRlVG9rZW4odCwgQW5ub3RhdGlvbkNvbnN0YW50cy5VTkRFRklORUQsIG51bGwsIEFubm90YXRlZFRva2VuLlBSRUZJWF9XUyk7fQotfQotCi0KLXZvaWQgUG9zdGZpeE9wKCk6Ci17fQotewotICAgICAgICA8SU5DUj4KLSAgICB8ICAgPERFQ1I+Ci19Ci0KLXZvaWQgUG9zdGZpeEV4cHJlc3Npb24oKToKLXt9Ci17Ci0gICAgICAgIFByaW1hcnlFeHByZXNzaW9uKCkgW1Bvc3RmaXhPcCgpXQotfQotCi0KLXZvaWQgVW5hcnlPcCgpOgotewotICAgICAgICBUb2tlbiB0OwotfQotewotICAgICAgICB0PTxERUxFVEU+Ci0gICAgICAgICAgICB7SlNQYXJzZXJVdGlscy5hbm5vdGF0ZVRva2VuKHQsIEFubm90YXRpb25Db25zdGFudHMuVU5ERUZJTkVELCBudWxsLCBBbm5vdGF0ZWRUb2tlbi5JTkZJWF9XUyk7fQotICAgIHwgICB0PTxWT0lEPgotICAgICAgICAgICAge0pTUGFyc2VyVXRpbHMuYW5ub3RhdGVUb2tlbih0LCBBbm5vdGF0aW9uQ29uc3RhbnRzLlVOREVGSU5FRCwgbnVsbCwgQW5ub3RhdGVkVG9rZW4uSU5GSVhfV1MpO30KLSAgICB8ICAgdD08VFlQRU9GPgotICAgICAgICAgICAge0pTUGFyc2VyVXRpbHMuYW5ub3RhdGVUb2tlbih0LCBBbm5vdGF0aW9uQ29uc3RhbnRzLlVOREVGSU5FRCwgbnVsbCwgQW5ub3RhdGVkVG9rZW4uSU5GSVhfV1MpO30KLSAgICB8ICAgdD08SU5DUj4KLSAgICAgICAgICAgIHtKU1BhcnNlclV0aWxzLmFubm90YXRlVG9rZW4odCwgQW5ub3RhdGlvbkNvbnN0YW50cy5VTkRFRklORUQsIG51bGwsIEFubm90YXRlZFRva2VuLklORklYX1dTKTt9Ci0gICAgfCAgIHQ9PERFQ1I+Ci0gICAgICAgICAgICB7SlNQYXJzZXJVdGlscy5hbm5vdGF0ZVRva2VuKHQsIEFubm90YXRpb25Db25zdGFudHMuVU5ERUZJTkVELCBudWxsLCBBbm5vdGF0ZWRUb2tlbi5JTkZJWF9XUyk7fSAgICAKLSAgICB8ICAgdD08UExVUz4KLSAgICAgICAgICAgIHtKU1BhcnNlclV0aWxzLmFubm90YXRlVG9rZW4odCwgQW5ub3RhdGlvbkNvbnN0YW50cy5VTkRFRklORUQsIG51bGwsIEFubm90YXRlZFRva2VuLklORklYX1dTKTt9ICAgIAotICAgIHwgICB0PTxNSU5VUz4KLSAgICAgICAgICAgIHtKU1BhcnNlclV0aWxzLmFubm90YXRlVG9rZW4odCwgQW5ub3RhdGlvbkNvbnN0YW50cy5VTkRFRklORUQsIG51bGwsIEFubm90YXRlZFRva2VuLklORklYX1dTKTt9ICAgIAotICAgIHwgICB0PTxUSUxERT4KLSAgICAgICAgICAgIHtKU1BhcnNlclV0aWxzLmFubm90YXRlVG9rZW4odCwgQW5ub3RhdGlvbkNvbnN0YW50cy5VTkRFRklORUQsIG51bGwsIEFubm90YXRlZFRva2VuLklORklYX1dTKTt9ICAgIAotICAgIHwgICB0PTxCQU5HPgotICAgICAgICAgICAge0pTUGFyc2VyVXRpbHMuYW5ub3RhdGVUb2tlbih0LCBBbm5vdGF0aW9uQ29uc3RhbnRzLlVOREVGSU5FRCwgbnVsbCwgQW5ub3RhdGVkVG9rZW4uSU5GSVhfV1MpO30gICAgCi19Ci0KLXZvaWQgVW5hcnlFeHByZXNzaW9uKCk6Ci17fQotewotICAgICAgICBQb3N0Zml4RXhwcmVzc2lvbigpCi0gICAgfCAgIFVuYXJ5T3AoKSBVbmFyeUV4cHJlc3Npb24oKQotfQotCi12b2lkIE11bE9wKCk6Ci17fQotewotICAgICAgICA8U1RBUj4KLSAgICB8ICAgPFNMQVNIPgotICAgIHwgICA8UkVNPiAKLX0KLQotdm9pZCBNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24oKToKLXt9Ci17Ci0gICAgICAgIFVuYXJ5RXhwcmVzc2lvbigpIChNdWxPcCgpIFVuYXJ5RXhwcmVzc2lvbigpKSoKLX0gCi0KLXZvaWQgQWRkT3AoKToKLXt9Ci17Ci0gICAgICAgIDxQTFVTPiAKLSAgICB8ICAgPE1JTlVTPgotfQotCi12b2lkIEFkZGl0aXZlRXhwcmVzc2lvbigpOgote30KLXsKLSAgICAgICAgTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uKCkgKEFkZE9wKCkgTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uKCkpKgotfSAKLQotdm9pZCBTaGlmdE9wKCk6Ci17fQotewotICAgICAgICA8TFNISUZUPgotICAgIHwgICA8UlNJR05FRFNISUZUPgotICAgIHwgICA8UlVOU0lHTkVEU0hJRlQ+Ci19Ci0KLXZvaWQgU2hpZnRFeHByZXNzaW9uKCk6Ci17fQotewotICAgICAgICBBZGRpdGl2ZUV4cHJlc3Npb24oKSAoU2hpZnRPcCgpIEFkZGl0aXZlRXhwcmVzc2lvbigpKSoKLX0KLQotdm9pZCBSZWxPcCgpOgote30KLXsKLSAgICAgICAgPExUPgotICAgIHwgICA8R1Q+IAotICAgIHwgICA8TEU+IAotICAgIHwgICA8R0U+Ci19Ci0KLXZvaWQgUmVsYXRpb25hbEV4cHJlc3Npb24oKToKLXsKLSAgICAgICAgVG9rZW4gdDsKLX0KLXsKLSAgICAgICAgU2hpZnRFeHByZXNzaW9uKCkgCi0gICAgICAgICAgICAoTE9PS0FIRUFEKDMpICggIFJlbE9wKCkgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB8IHQ9PElOU1RBTkNFT0Y+IAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7SlNQYXJzZXJVdGlscy5hbm5vdGF0ZVRva2VuKHQsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFubm90YXRpb25Db25zdGFudHMuVU5ERUZJTkVELCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLCBBbm5vdGF0ZWRUb2tlbi5JTkZJWF9XUyk7fQotICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB0PTxJTj4gCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtKU1BhcnNlclV0aWxzLmFubm90YXRlVG9rZW4odCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbm5vdGF0aW9uQ29uc3RhbnRzLlVOREVGSU5FRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLCBBbm5vdGF0ZWRUb2tlbi5JTkZJWF9XUyk7fSkKLSAgICAgICAgICAgICBTaGlmdEV4cHJlc3Npb24oKSkqCi19Ci0KLXZvaWQgUmVsYXRpb25hbEV4cHJlc3Npb25Ob0lOKCk6Ci17Ci0gICAgICAgIFRva2VuIHQ7Ci19Ci17Ci0gICAgICAgIFNoaWZ0RXhwcmVzc2lvbigpIAotICAgICAgICAgICAgKCAoICBSZWxPcCgpIAotICAgICAgICAgICAgICAgfCB0PTxJTlNUQU5DRU9GPiAgCi0gICAgICAgICAgICAgICAgIHtKU1BhcnNlclV0aWxzLmFubm90YXRlVG9rZW4odCwgQW5ub3RhdGlvbkNvbnN0YW50cy5VTkRFRklORUQsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIEFubm90YXRlZFRva2VuLklORklYX1dTKTt9KQotICAgICAgICAgICAgICBTaGlmdEV4cHJlc3Npb24oKSkqCi19Ci0KLXZvaWQgRXF1YWxPcCgpOgote30KLXsKLSAgICAgICAgPEVRPiAKLSAgICB8ICAgPE5FPiAKLSAgICB8ICAgPElERU5USVRZT1BFUj4gCi0gICAgfCAgIDxOT1RJREVOVElUWU9QRVI+Ci19Ci0KLXZvaWQgRXF1YWxpdHlFeHByZXNzaW9uKCk6Ci17fQotewotICAgICAgICBSZWxhdGlvbmFsRXhwcmVzc2lvbigpIChFcXVhbE9wKCkgUmVsYXRpb25hbEV4cHJlc3Npb24oKSkqCi19Ci0KLXZvaWQgRXF1YWxpdHlFeHByZXNzaW9uTm9JTigpOgote30KLXsKLSAgICAgICAgUmVsYXRpb25hbEV4cHJlc3Npb25Ob0lOKCkgKEVxdWFsT3AoKSBSZWxhdGlvbmFsRXhwcmVzc2lvbk5vSU4oKSkqCi19Ci0KLQotdm9pZCBCaXR3aXNlQU5ET3AoKToKLXt9Ci17Ci0gICAgICAgIDxCSVRfQU5EPgotfQotCi12b2lkIEJpdHdpc2VBTkRFeHByZXNzaW9uKCk6Ci17fQotewotICAgICAgICBFcXVhbGl0eUV4cHJlc3Npb24oKSAoQml0d2lzZUFORE9wKCkgRXF1YWxpdHlFeHByZXNzaW9uKCkpKgotfQotCi12b2lkIEJpdHdpc2VBTkRFeHByZXNzaW9uTm9JTigpOgote30KLXsKLSAgICAgICAgRXF1YWxpdHlFeHByZXNzaW9uTm9JTigpIChCaXR3aXNlQU5ET3AoKSBFcXVhbGl0eUV4cHJlc3Npb25Ob0lOKCkpKgotfQotCi0KLXZvaWQgQml0d2lzZVhPUk9wKCk6Ci17fQotewotICAgICAgICA8WE9SPgotfQotCi12b2lkIEJpdHdpc2VYT1JFeHByZXNzaW9uKCk6Ci17fQotewotICAgICAgICBCaXR3aXNlQU5ERXhwcmVzc2lvbigpIChCaXR3aXNlWE9ST3AoKSBCaXR3aXNlQU5ERXhwcmVzc2lvbigpKSoKLX0KLQotdm9pZCBCaXR3aXNlWE9SRXhwcmVzc2lvbk5vSU4oKToKLXt9Ci17Ci0gICAgICAgIEJpdHdpc2VBTkRFeHByZXNzaW9uTm9JTigpIChCaXR3aXNlWE9ST3AoKSBCaXR3aXNlQU5ERXhwcmVzc2lvbk5vSU4oKSkqCi19Ci0KLXZvaWQgQml0d2lzZU9ST3AoKToKLXt9Ci17Ci0gICAgICAgIDxCSVRfT1I+Ci19Ci0KLXZvaWQgQml0d2lzZU9SRXhwcmVzc2lvbigpOgote30KLXsKLSAgICAgICAgQml0d2lzZVhPUkV4cHJlc3Npb24oKSAoQml0d2lzZU9ST3AoKSBCaXR3aXNlWE9SRXhwcmVzc2lvbigpKSoKLX0KLQotdm9pZCBCaXR3aXNlT1JFeHByZXNzaW9uTm9JTigpOgote30KLXsKLSAgICAgICAgQml0d2lzZVhPUkV4cHJlc3Npb25Ob0lOKCkgKEJpdHdpc2VPUk9wKCkgQml0d2lzZVhPUkV4cHJlc3Npb25Ob0lOKCkpKgotfQotCi12b2lkIExvZ2ljYWxBTkRFeHByZXNzaW9uKCk6Ci17fQotewotICAgICAgICBCaXR3aXNlT1JFeHByZXNzaW9uKCkgKDxTQ19BTkQ+IEJpdHdpc2VPUkV4cHJlc3Npb24oKSkqCi19Ci0KLXZvaWQgTG9naWNhbEFOREV4cHJlc3Npb25Ob0lOKCk6Ci17fQotewotICAgICAgICBCaXR3aXNlT1JFeHByZXNzaW9uTm9JTigpICg8U0NfQU5EPiBCaXR3aXNlT1JFeHByZXNzaW9uTm9JTigpKSoKLX0KLQotdm9pZCBMb2dpY2FsT1JFeHByZXNzaW9uKCk6Ci17fQotewotICAgICAgICBMb2dpY2FsQU5ERXhwcmVzc2lvbigpICg8U0NfT1I+IExvZ2ljYWxBTkRFeHByZXNzaW9uKCkpKgotfQotCi12b2lkIExvZ2ljYWxPUkV4cHJlc3Npb25Ob0lOKCk6Ci17fQotewotICAgICAgICBMb2dpY2FsQU5ERXhwcmVzc2lvbk5vSU4oKSAoPFNDX09SPiBMb2dpY2FsQU5ERXhwcmVzc2lvbk5vSU4oKSkqCi19Ci0KLXZvaWQgQ29uZGl0aW9uYWxFeHByZXNzaW9uKCk6Ci17fQotewotICAgICAgICBMb2dpY2FsT1JFeHByZXNzaW9uKCkgWzxIT09LPiBFeHByZXNzaW9uKCkgPENPTE9OPiBDb25kaXRpb25hbEV4cHJlc3Npb24oKV0KLX0KLQotdm9pZCBDb25kaXRpb25hbEV4cHJlc3Npb25Ob0lOKCk6Ci17fQotewotICAgICAgICBMb2dpY2FsT1JFeHByZXNzaW9uTm9JTigpIFs8SE9PSz4gRXhwcmVzc2lvbk5vSU4oKSA8Q09MT04+IENvbmRpdGlvbmFsRXhwcmVzc2lvbk5vSU4oKV0KLX0KLQotVG9rZW4gQXNzaWduZW1lbnRPcGVyYXRvcigpOgotewotICAgICAgICBUb2tlbiB0OwotfQotewotICAgICAgICAoIHQ9PEFTU0lHTj4KLSAgICB8ICAgICB0PTxTVEFSQVNTSUdOPgotICAgIHwgICAgIHQ9PFNMQVNIQVNTSUdOPiAKLSAgICB8ICAgICB0PTxSRU1BU1NJR04+IAotICAgIHwgICAgIHQ9PFBMVVNBU1NJR04+Ci0gICAgfCAgICAgdD08TUlOVVNBU1NJR04+IAotICAgIHwgICAgIHQ9PExTSElGVEFTU0lHTj4gCi0gICAgfCAgICAgdD08UlNJR05FRFNISUZUQVNTSUdOPgotICAgIHwgICAgIHQ9PFJVTlNJR05FRFNISUZUQVNTSUdOPgotICAgIHwgICAgIHQ9PEFOREFTU0lHTj4gCi0gICAgfCAgICAgdD08WE9SQVNTSUdOPiAKLSAgICB8ICAgICB0PTxPUkFTU0lHTj4gKQotICAgICAgICB7IHJldHVybiB0OyB9IAotfQotCi12b2lkIEFzc2lnbm1lbnRFeHByZXNzaW9uKCk6Ci17Ci0gICAgICAgIFRva2VuIHRMSFMgICAgICA9IGdldFRva2VuKDEpOyAKLQkJVG9rZW4gdE9wZXJhdG9yID0gbnVsbDsgCi0JCVRva2VuIHRSSFMgICAgICA9IG51bGw7Ci0JCVRva2VuIHRFbmQgICAgICA9IG51bGw7Ci19Ci17Ci0gICAgICAgIENvbmRpdGlvbmFsRXhwcmVzc2lvbigpIAotICAgICAgICAgICAgWyAoQXNzaWduZW1lbnRPcGVyYXRvcigpIAotICAgICAgICAgICAgICAge3RSSFM9Z2V0VG9rZW4oMSk7fQotICAgICAgICAgICAgICAgQXNzaWdubWVudEV4cHJlc3Npb24oKSkKLSAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHRFbmQgPSBnZXRUb2tlbigxKTsKLSAgICAgICAgICAgICAgICAgIEpTUGFyc2VyVXRpbHMudGFnQXNzaWdubWVudEV4cHJlc3Npb24oX2NvbnRleHRTdGFjaywgbnVsbCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChBbm5vdGF0ZWRUb2tlbil0TEhTLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEFubm90YXRlZFRva2VuKXRPcGVyYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEFubm90YXRlZFRva2VuKXRSSFMsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQW5ub3RhdGVkVG9rZW4pdEVuZCk7IAotICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgXQotfQotCi12b2lkIEFzc2lnbm1lbnRFeHByZXNzaW9uTm9JTigpOgotewotICAgICAgICBUb2tlbiB0TEhTICAgICAgPSBnZXRUb2tlbigxKTsgCi0JCVRva2VuIHRPcGVyYXRvciA9IG51bGw7IAotCQlUb2tlbiB0UkhTICAgICAgPSBudWxsOwotCQlUb2tlbiB0RW5kICAgICAgPSBudWxsOwotfQotewotICAgICAgICBDb25kaXRpb25hbEV4cHJlc3Npb25Ob0lOKCkgCi0gICAgICAgICAgICBbIChBc3NpZ25lbWVudE9wZXJhdG9yKCkge3RSSFM9Z2V0VG9rZW4oMSk7fQotICAgICAgICAgICAgICAgQXNzaWdubWVudEV4cHJlc3Npb25Ob0lOKCkpCi0gICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICB0RW5kID0gZ2V0VG9rZW4oMSk7Ci0gICAgICAgICAgICAgICAgICBKU1BhcnNlclV0aWxzLnRhZ0Fzc2lnbm1lbnRFeHByZXNzaW9uKF9jb250ZXh0U3RhY2ssIG51bGwsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQW5ub3RhdGVkVG9rZW4pdExIUywgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChBbm5vdGF0ZWRUb2tlbil0T3BlcmF0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChBbm5vdGF0ZWRUb2tlbil0UkhTLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEFubm90YXRlZFRva2VuKXRFbmQpOyAKLSAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIF0KLX0KLQotCi12b2lkIEV4cHJlc3Npb24oKSAgICAgICAgICAgICAgICAgICAgIDoKLXt9Ci17Ci0gIEFzc2lnbm1lbnRFeHByZXNzaW9uKCkgKCAiLCIgQXNzaWdubWVudEV4cHJlc3Npb24oKSApKgotfSAgIAotCi12b2lkIEV4cHJlc3Npb25Ob0lOKCkgICAgICAgICAgICAgICAgICAgICA6Ci17fQotewotICBBc3NpZ25tZW50RXhwcmVzc2lvbk5vSU4oKSAoICIsIiBBc3NpZ25tZW50RXhwcmVzc2lvbk5vSU4oKSApKgotfSAgIAotCi0KLXZvaWQgU3RhdGVtZW50KCk6Ci17fQotewotICAgICAgICBMT09LQUhFQUQoMykgICAgQmxvY2sobnVsbCkKLSAgICB8ICAgICAgICAgICAgICAgICAgIFZhcmlhYmxlU3RhdGVtZW50KCkKLSAgICB8ICAgICAgICAgICAgICAgICAgIEVtcHR5U3RhdGVtZW50KCkKLSAgICB8ICAgICAgICAgICAgICAgICAgIEV4cHJlc3Npb25TdGF0ZW1lbnQoKQotICAgIHwgICAgICAgICAgICAgICAgICAgSWZTdGF0ZW1lbnQoKQotICAgIHwgICAgICAgICAgICAgICAgICAgSXRlcmF0aW9uU3RhdGVtZW50KCkKLSAgICB8ICAgICAgICAgICAgICAgICAgIENvbnRpbnVlU3RhdGVtZW50KCkKLSAgICB8ICAgICAgICAgICAgICAgICAgIEJyZWFrU3RhdGVtZW50KCkKLSAgICB8ICAgICAgICAgICAgICAgICAgIFJldHVyblN0YXRlbWVudCgpCi0gICAgfCAgICAgICAgICAgICAgICAgICBXaXRoU3RhdGVtZW50KCkKLSAgICB8ICAgICAgICAgICAgICAgICAgIFRyeVN0YXRlbWVudCgpCi0gICAgfCAgICAgICAgICAgICAgICAgICBUaHJvd1N0YXRlbWVudCgpCi0gICAgfCAgICAgICAgICAgICAgICAgICBTd2l0Y2hTdGF0ZW1lbnQoKQotfQotIAotdm9pZCBCbG9jayhQcm9ncmFtQ29udGV4dCBjb250ZXh0KToKLXt9Ci17Ci0gICAgICAgIExPT0tBSEVBRCgzKSAgICA8TEJSQUNFPiA8UkJSQUNFPiAgIAotICAgIHwgICAgICAgICAgICAgICAgICAgPExCUkFDRT4gewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb250ZXh0ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dFN0YWNrLnB1c2hDb250ZXh0KG5ldyBQcm9ncmFtQ29udGV4dCgiYmxvY2siKSk7Ci0gCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtTdGF0ZW1lbnRMaXN0KCldIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPFJCUkFDRT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dFN0YWNrLnBvcENvbnRleHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLX0KLSAKLXZvaWQgVmFyaWFibGVTdGF0ZW1lbnQoKToKLXsKLSAgICAgICAgVG9rZW4gdDsKLX0KLXsKLSAgICAgICAgdD08VkFSPiB7SlNQYXJzZXJVdGlscy5hbm5vdGF0ZVRva2VuKHQsIEFubm90YXRpb25Db25zdGFudHMuVU5ERUZJTkVELCBudWxsLCBBbm5vdGF0ZWRUb2tlbi5QUkVGSVhfV1MpO30KLSAgICAgICAgVmFyaWFibGVEZWNsYXJhdGlvbkxpc3QodCkgU2MoKQotfQotIAotdm9pZCBWYXJpYWJsZURlY2xhcmF0aW9uTGlzdChUb2tlbiB2YXJUb2tlbik6Ci17fQotewotICAgICAgICBWYXJpYWJsZURlY2xhcmF0aW9uKHZhclRva2VuKSAoIDxDT01NQT4gVmFyaWFibGVEZWNsYXJhdGlvbih2YXJUb2tlbikgKSoKLX0KLQotdm9pZCBWYXJpYWJsZURlY2xhcmF0aW9uKFRva2VuIHZhclRva2VuKToKLXsKLSAgICAgICAgVG9rZW4gbGhzICAgICAgPSBudWxsOwotICAgICAgICBUb2tlbltdIHRBcnJheSA9IG51bGw7Ci19Ci17Ci0gICAgICAgIGxocz1JZGVudGlmaWVyKCkgW0luaXRpYWxpemVyKCldCi0gICAgICAgIHsKLSAgICAgICAgICAgIEpTUGFyc2VyVXRpbHMuYW5ub3RhdGVUb2tlbihsaHMsIEFubm90YXRpb25Db25zdGFudHMuVkFSX0lERU5USUZJRVIsIG51bGwsIC0xKTsKLSAgICAgICAgICAgIEpTUGFyc2VyVXRpbHMucHVzaFRva2VuKF9jb250ZXh0U3RhY2ssIChBbm5vdGF0ZWRUb2tlbilsaHMpOyAgICAgIAotICAgICAgCi0gICAgICAgICAgICBpZih0QXJyYXkgIT0gbnVsbCkgewotICAgICAgCSAgICAgICBUb2tlbiBlbmQgPSBnZXRUb2tlbigxKTsKLSAgICAgICAgICAgICAgIEpTUGFyc2VyVXRpbHMudGFnQXNzaWdubWVudEV4cHJlc3Npb24oX2NvbnRleHRTdGFjaywgKEFubm90YXRlZFRva2VuKXZhclRva2VuLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEFubm90YXRlZFRva2VuKWxocywgKEFubm90YXRlZFRva2VuKXRBcnJheVswXSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChBbm5vdGF0ZWRUb2tlbil0QXJyYXlbMV0sIChBbm5vdGF0ZWRUb2tlbillbmQpOyAKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotfQotCi1Ub2tlbltdIEluaXRpYWxpemVyKCk6Ci17Ci0gICAgICAgIFRva2VuW10gdEFycmF5ID0gbmV3IFRva2VuWzJdOwotfQotewotICAgICAgICB0QXJyYXlbMF09PEFTU0lHTj4ge3RBcnJheVsxXT1nZXRUb2tlbigxKTt9IAotICAgICAgICBBc3NpZ25tZW50RXhwcmVzc2lvbigpCi0gICAgICAgIHtyZXR1cm4gdEFycmF5O30KLX0KLSAKLXZvaWQgRW1wdHlTdGF0ZW1lbnQoKToKLXt9Ci17Ci0gICAgICAgIDxTRU1JQ09MT04+Ci19Ci0KLXZvaWQgRXhwcmVzc2lvblN0YXRlbWVudCgpOgote30KLXsKLSAgICAgICAgRXhwcmVzc2lvbigpIFNjKCkgCi19Ci0KLUpBVkFDT0RFCi0gIHZvaWQgU2MoKSB7Ci0KLSAgICBUb2tlbiB0b2sgPSBnZXRUb2tlbigxKTsKLSAgICBpZiAodG9rLmtpbmQgPT0gU0VNSUNPTE9OKSB7Ci0gICAgICAgdG9rID0gZ2V0TmV4dFRva2VuKCk7Ci0gICAgfSBlbHNlIGlmICh0b2suc3BlY2lhbFRva2VuICE9IG51bGwpIHsKLSAgICAgICBpZiAoIUVvbENvbW1lbnRTa2lwV3ModG9rLnNwZWNpYWxUb2tlbikgJiYgKHRvay5raW5kICE9IEVPRikpIHsKLSAgICAgICAgICB0aHJvdyBnZW5lcmF0ZVBhcnNlRXhjZXB0aW9uKCk7Ci0gICAgICAgfQotICAgIH0gZWxzZSBpZiAoKHRvay5raW5kICE9IEVPRikgJiYgKHRvay5raW5kIT1SQlJBQ0UpKSB7Ci0gICAgICAgICB0aHJvdyBnZW5lcmF0ZVBhcnNlRXhjZXB0aW9uKCk7Ci0gICAgfQotICB9Ci0gCi1KQVZBQ09ERQotICBib29sZWFuIEVvbENvbW1lbnRTa2lwV3MoVG9rZW4gdCkgewotICAgIGJvb2xlYW4gcmV0VmFsID0gZmFsc2U7Ci0gICAgVG9rZW4gc3BlY2lhbFRva2VuID0gdDsKLSAgICB3aGlsZShzcGVjaWFsVG9rZW4gIT0gbnVsbCkgewotICAgICAgaWYoc3BlY2lhbFRva2VuLmtpbmQgPT0gV1MpIHsKLSAgICAgICAgc3BlY2lhbFRva2VuID0gc3BlY2lhbFRva2VuLnNwZWNpYWxUb2tlbjsKLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmKHNwZWNpYWxUb2tlbi5raW5kID09IEVPTCAgfHwgCi0gICAgICAgICAgICAgIHNwZWNpYWxUb2tlbi5raW5kID09IFNJTkdMRV9MSU5FX0NPTU1FTlQpIHsKLSAgICAgICAgcmV0VmFsID0gdHJ1ZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBlbHNlIHsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZXRWYWw7Ci0gIH0KLSAKLXZvaWQgSWZTdGF0ZW1lbnQoKToKLXsKLSAgICAgICAgVG9rZW4gdDsKLX0KLXsKLSAgICAgICAgPElGPiA8TFBBUkVOPiBFeHByZXNzaW9uKCkgPFJQQVJFTj4gCi0gICAgICAgICAgICBTdGF0ZW1lbnQoKSAKLSAgICAgICAgICAgIFsgTE9PS0FIRUFEKDEpIHQ9PEVMU0U+IHtKU1BhcnNlclV0aWxzLmFubm90YXRlVG9rZW4odCwgQW5ub3RhdGlvbkNvbnN0YW50cy5VTkRFRklORUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIEFubm90YXRlZFRva2VuLlBSRUZJWF9XUyk7fQotICAgICAgICAgICAgICBTdGF0ZW1lbnQoKQotICAgICAgICAgICAgXQotfQotCi0KLXZvaWQgSXRlcmF0aW9uU3RhdGVtZW50KCk6Ci17fQotewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdoaWxlU3RhdGVtZW50KCkKLSAgICB8ICAgICAgICAgICAgICAgICAgICAgICBEb1N0YXRlbWVudCgpCi0gICAgfCAgIExPT0tBSEVBRCg8Rk9SPiA8TFBBUkVOPiBFeHByZXNzaW9uKCkgPFNFTUlDT0xPTj4pICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRm9yU3RhdGVtZW50KCkKLSAgICB8ICAgTE9PS0FIRUFEKDxGT1I+IDxMUEFSRU4+IDxTRU1JQ09MT04+KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb3JTdGF0ZW1lbnQoKQotICAgIHwgICBMT09LQUhFQUQoPEZPUj4gPExQQVJFTj4gdmFyVG9la249PFZBUj4gVmFyaWFibGVEZWNsYXJhdGlvbkxpc3QodmFyVG9rZW4pIDxTRU1JQ09MT04+KSAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRm9yVmFyU3RhdGVtZW50KCkKLSAgICB8ICAgTE9PS0FIRUFEKDMpICAgICAgICBGb3JJblN0YXRlbWVudCgpCi0gICAgfCAgIExPT0tBSEVBRCgzKSAgICAgICAgRm9yVmFySW5TdGF0ZW1lbnQoKQotfQotIAotdm9pZCBEb1N0YXRlbWVudCgpOgote30KLXsKLSAgICAgICAgPERPPiBTdGF0ZW1lbnQoKSA8V0hJTEU+IDxMUEFSRU4+IEV4cHJlc3Npb24oKSA8UlBBUkVOPgotfQotCi12b2lkIFdoaWxlU3RhdGVtZW50KCk6Ci17fQotewotICAgICAgICA8V0hJTEU+IDxMUEFSRU4+IEV4cHJlc3Npb24oKSA8UlBBUkVOPiAKLSAgICAgICAgICAgIFN0YXRlbWVudCgpCi19Ci0gCi12b2lkIEZvclN0YXRlbWVudCgpOgote30KLXsKLSAgICAgICAgPEZPUj4gPExQQVJFTj4gIFtFeHByZXNzaW9uKCldIDxTRU1JQ09MT04+IAotICAgICAgICAgICAgICAgICAgICAgICAgW0V4cHJlc3Npb24oKV0gPFNFTUlDT0xPTj4gCi0gICAgICAgICAgICAgICAgICAgICAgICBbRXhwcmVzc2lvbigpXSA8UlBBUkVOPiAKLSAgICAgICAgICAgIFN0YXRlbWVudCgpCi19Ci0KLXZvaWQgRm9yVmFyU3RhdGVtZW50KCk6Ci17Ci0gICAgICAgIFRva2VuIHQ7Ci19Ci17Ci0gICAgICAgIDxGT1I+IDxMUEFSRU4+ICB0PTxWQVI+IHtKU1BhcnNlclV0aWxzLmFubm90YXRlVG9rZW4odCwgQW5ub3RhdGlvbkNvbnN0YW50cy5VTkRFRklORUQsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIEFubm90YXRlZFRva2VuLlBSRUZJWF9XUyk7fQotICAgICAgICAgICAgICAgICAgICAgICAgVmFyaWFibGVEZWNsYXJhdGlvbkxpc3QodCkgPFNFTUlDT0xPTj4gCi0gICAgICAgICAgICAgICAgICAgICAgICBbRXhwcmVzc2lvbigpXSAgPFNFTUlDT0xPTj4gCi0gICAgICAgICAgICAgICAgICAgICAgICBbRXhwcmVzc2lvbigpXSAgPFJQQVJFTj4gCi0gICAgICAgICAgICBTdGF0ZW1lbnQoKQotfQotCi12b2lkIEZvckluU3RhdGVtZW50KCk6Ci17Ci0gICAgICAgIFRva2VuIHQ7Ci19Ci17Ci0gICAgICAgIDxGT1I+IDxMUEFSRU4+ICBFeHByZXNzaW9uTm9JTigpIAotICAgICAgICAgICAgICAgICAgICAgICAgdD08SU4+IHtKU1BhcnNlclV0aWxzLmFubm90YXRlVG9rZW4odCwgQW5ub3RhdGlvbkNvbnN0YW50cy5VTkRFRklORUQsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgQW5ub3RhdGVkVG9rZW4uSU5GSVhfV1MpO30KLSAgICAgICAgICAgICAgICAgICAgICAgIEV4cHJlc3Npb25Ob0lOKCkgPFJQQVJFTj4gCi0gICAgICAgICAgICBTdGF0ZW1lbnQoKQotfQotIAotdm9pZCBGb3JWYXJJblN0YXRlbWVudCgpOgotewotICAgICAgICBUb2tlbiB0OwotfQotewotICAgICAgICA8Rk9SPiA8TFBBUkVOPiAgCi0gICAgICAgICAgICAgICAgdD08VkFSPiB7SlNQYXJzZXJVdGlscy5hbm5vdGF0ZVRva2VuKHQsIEFubm90YXRpb25Db25zdGFudHMuVU5ERUZJTkVELCBudWxsLCBBbm5vdGF0ZWRUb2tlbi5QUkVGSVhfV1MpO30KLSAgICAgICAgICAgICAgICB0PUlkZW50aWZpZXIoKSAKLSAgICAgICAgICAgICAgICAgIHsKLSAgIAkgICAgICAgICAgICAgICAgICBKU1BhcnNlclV0aWxzLmFubm90YXRlVG9rZW4odCwgQW5ub3RhdGlvbkNvbnN0YW50cy5WQVJfSURFTlRJRklFUiwgbnVsbCwgQW5ub3RhdGVkVG9rZW4uUFJFRklYX1dTKTsKLSAgIAkgICAgICAgICAgICAgICAgICBKU1BhcnNlclV0aWxzLnB1c2hUb2tlbihfY29udGV4dFN0YWNrLCAoQW5ub3RhdGVkVG9rZW4pdCk7Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgW0luaXRpYWxpemVyKCldIAotICAgICAgICAgICAgICAgIHQ9PElOPiB7SlNQYXJzZXJVdGlscy5hbm5vdGF0ZVRva2VuKHQsIEFubm90YXRpb25Db25zdGFudHMuVU5ERUZJTkVELCBudWxsLCBBbm5vdGF0ZWRUb2tlbi5JTkZJWF9XUyk7fQotICAgICAgICAgICAgICAgIEV4cHJlc3Npb25Ob0lOKCkgCi0gICAgICAgICAgICAgIDxSUEFSRU4+IAotICAgICAgICAgICAgU3RhdGVtZW50KCkKLX0KLQotdm9pZCBDb250aW51ZVN0YXRlbWVudCgpOgote30KLXsKLSAgICAgICAgPENPTlRJTlVFPiBTYygpCi19Ci0KLXZvaWQgQnJlYWtTdGF0ZW1lbnQoKToKLXt9Ci17Ci0gICAgICAgIDxCUkVBSz4gU2MoKQotfQotIAotdm9pZCBSZXR1cm5TdGF0ZW1lbnQoKToKLXsKLSAgICAgICAgVG9rZW4gdDsKLX0KLXsKLSAgICAgICAgdD08UkVUVVJOPiB7SlNQYXJzZXJVdGlscy5hbm5vdGF0ZVRva2VuKHQsIEFubm90YXRpb25Db25zdGFudHMuVU5ERUZJTkVELCBudWxsLCBBbm5vdGF0ZWRUb2tlbi5QUkVGSVhfV1MpO30KLSAgICAgICAgW0V4cHJlc3Npb24oKV0gU2MoKQotfQotCi12b2lkIFdpdGhTdGF0ZW1lbnQoKToKLXt9Ci17Ci0gICAgICAgIDxXSVRIPiA8TFBBUkVOPiBFeHByZXNzaW9uKCkgPFJQQVJFTj4KLSAgICAgICAgICAgIFN0YXRlbWVudCgpCi19Ci0KLXZvaWQgVHJ5U3RhdGVtZW50KCk6Ci17fQotewotICAgICAgICA8VFJZPiBCbG9jayhudWxsKQotICAgICAgICAoPENBVENIPiA8TFBBUkVOPiBJZGVudGlmaWVyKCkgPFJQQVJFTj4gQmxvY2sobnVsbCkpKgotICAgICAgICBbPEZJTkFMTFk+IEJsb2NrKG51bGwpXQotfSAKLQotdm9pZCBUaHJvd1N0YXRlbWVudCgpOgotewotICAgICAgICBUb2tlbiB0OwotfQotewotICAgICAgICB0PTxUSFJPVz4ge0pTUGFyc2VyVXRpbHMuYW5ub3RhdGVUb2tlbih0LCBBbm5vdGF0aW9uQ29uc3RhbnRzLlVOREVGSU5FRCwgbnVsbCwgQW5ub3RhdGVkVG9rZW4uUFJFRklYX1dTKTt9Ci0gICAgICAgIFtFeHByZXNzaW9uKCldIFNjKCkKLX0KLQotdm9pZCBDYXNlR3VhcmQoKToKLXsKLSAgICAgICAgVG9rZW4gdDsKLX0KLXsKLSAgICAgICAgdD08Q0FTRT4ge0pTUGFyc2VyVXRpbHMuYW5ub3RhdGVUb2tlbih0LCBBbm5vdGF0aW9uQ29uc3RhbnRzLlVOREVGSU5FRCwgbnVsbCwgQW5ub3RhdGVkVG9rZW4uUFJFRklYX1dTKTt9Ci0gICAgICAgIEV4cHJlc3Npb24oKSA8Q09MT04+Ci0gICAgfCAgIDxfREVGQVVMVD4gPENPTE9OPgotfQotCi12b2lkIENhc2VHcm91cCgpOgote30KLXsKLSAgICAgICAgQ2FzZUd1YXJkKCkgKFN0YXRlbWVudCgpKSogIAotfQotCi12b2lkIFN3aXRjaFN0YXRlbWVudCgpOgote30KLXsKLSAgICAgICAgPFNXSVRDSD4gICAgPExQQVJFTj4gRXhwcmVzc2lvbigpIDxSUEFSRU4+IAotICAgICAgICAgICAgICAgICAgICA8TEJSQUNFPiAoQ2FzZUdyb3VwKCkpKiA8UkJSQUNFPgotfQotCi12b2lkIE5hbWVkRnVuY3Rpb24oKToKLXsKLSAgICAgICAgVG9rZW4gIHRJZGVudGlmaWVyID0gbnVsbDsKLSAgICAgICAgVG9rZW4gIHRGdW5jdGlvbiAgID0gbnVsbDsKLSAgICAgICAgVG9rZW4gIGJsb2NrU3RhcnQgID0gbnVsbDsKLSAgICAgICAgVG9rZW4gIGJsb2NrRW5kICAgID0gbnVsbDsKLSAgICAgICAgVmVjdG9yIHBhcmFtcyAgICAgID0gbmV3IFZlY3RvcigpOwotfQotewotICAgICAgICB0RnVuY3Rpb249PEZVTkNUSU9OPiAKLSAgICAgICAgdElkZW50aWZpZXI9SWRlbnRpZmllcigpIAotICAgICAgICAgICB7IAotICAgICAgICAgICAgICBKU1BhcnNlclV0aWxzLmFubm90YXRlVG9rZW4odElkZW50aWZpZXIsIEFubm90YXRpb25Db25zdGFudHMuRlVOQ1RJT05fTkFNRV9JREVOVElGSUVSLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIC0xKTsgCi0gICAgICAgICAgICAgIFByb2dyYW1Db250ZXh0IGNvbnRleHQgPSBuZXcgUHJvZ3JhbUNvbnRleHQodElkZW50aWZpZXIuaW1hZ2UpOwotICAgICAgICAgICAgICBfY29udGV4dFN0YWNrLnB1c2hDb250ZXh0KGNvbnRleHQpOwotICAgICAgICAgICB9Ci0gICAgICAgIDxMUEFSRU4+IAotICAgICAgICAgICBbcGFyYW1zPUZvcm1hbFBhcmFtZXRlckxpc3QoKV0gCi0gICAgICAgICAgICAgIHsgCi0gICAgICAgICAgICAgICAgICBKU1BhcnNlclV0aWxzLmFubm90YXRlVG9rZW5zKHBhcmFtcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQW5ub3RhdGlvbkNvbnN0YW50cy5GVU5DVElPTl9QQVJBTV9JREVOVElGSUVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLCAtMSk7IAotICAgICAgICAgICAgICAgICAgSlNQYXJzZXJVdGlscy5hbm5vdGF0ZVRva2VuKHRGdW5jdGlvbiwgQW5ub3RhdGlvbkNvbnN0YW50cy5OQU1FRF9GVU5DVElPTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMsIEFubm90YXRlZFRva2VuLlBSRUZJWF9XUyk7IAotICAgICAgICAgICAgICAgICAgSlNQYXJzZXJVdGlscy5wdXNoVG9rZW5zKF9jb250ZXh0U3RhY2ssIHBhcmFtcyk7Ci0gICAgICAgICAgICAgIH0gCi0KLSAgICAgICAgPFJQQVJFTj4KLSAgICAgICAge2Jsb2NrU3RhcnQgPSBnZXRUb2tlbigxKTt9IAotICAgICAgICBCbG9jayhjb250ZXh0KQotICAgICAgICB7Ci0gICAgICAgICAgIGJsb2NrRW5kID0gZ2V0VG9rZW4oMSk7Ci0gICAgICAgICAgIEpTUGFyc2VyVXRpbHMudGFnRXZhbENhbGxzKHRGdW5jdGlvbiwgYmxvY2tTdGFydCwgYmxvY2tFbmQpOwotICAgICAgICB9Ci19Ci0KLXZvaWQgQW5vbnltb3VzRnVuY3Rpb24oKToKLXsKLSAgICAgICAgVG9rZW4gIHRGdW5jdGlvbiAgPSBudWxsOwotICAgICAgICBUb2tlbiAgYmxvY2tTdGFydCA9IG51bGw7Ci0gICAgICAgIFRva2VuICBibG9ja0VuZCAgID0gbnVsbDsKLSAgICAgICAgVmVjdG9yIHBhcmFtcyAgICAgPSBuZXcgVmVjdG9yKCk7Ci19Ci17Ci0gICAgICAgIHRGdW5jdGlvbj08RlVOQ1RJT04+Ci0gICAgICAgICAgIHsgCi0gICAgICAgICAgICAgIFByb2dyYW1Db250ZXh0IGNvbnRleHQgPSBuZXcgUHJvZ3JhbUNvbnRleHQoImFub255bW91cyIpOwotICAgICAgICAgICAgICBfY29udGV4dFN0YWNrLnB1c2hDb250ZXh0KGNvbnRleHQpOwotICAgICAgICAgICB9IAotICAgICAgICA8TFBBUkVOPiAKLSAgICAgICAgICAgW3BhcmFtcz1Gb3JtYWxQYXJhbWV0ZXJMaXN0KCldIAotICAgICAgICAgICAgICB7IAotICAgICAgICAgICAgICAgICAgSlNQYXJzZXJVdGlscy5hbm5vdGF0ZVRva2VucyhwYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFubm90YXRpb25Db25zdGFudHMuRlVOQ1RJT05fUEFSQU1fSURFTlRJRklFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgLTEpOyAKLSAgICAgICAgICAgICAgICAgIEpTUGFyc2VyVXRpbHMuYW5ub3RhdGVUb2tlbih0RnVuY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQW5ub3RhdGlvbkNvbnN0YW50cy5BTk9OWU1PVVNfRlVOQ1RJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zLCAtMSk7IAotICAgICAgICAgICAgICAgICAgSlNQYXJzZXJVdGlscy5wdXNoVG9rZW5zKF9jb250ZXh0U3RhY2ssIHBhcmFtcyk7Ci0gICAgICAgICAgICAgIH0gCi0gICAgICAgIDxSUEFSRU4+IAotICAgICAgICB7YmxvY2tTdGFydCA9IGdldFRva2VuKDEpO30KLSAgICAgICAgQmxvY2soY29udGV4dCkKLSAgICAgICAgewotICAgICAgICAgICBibG9ja0VuZCA9IGdldFRva2VuKDEpOwotICAgICAgICAgICBKU1BhcnNlclV0aWxzLnRhZ0V2YWxDYWxscyh0RnVuY3Rpb24sIGJsb2NrU3RhcnQsIGJsb2NrRW5kKTsKLSAgICAgICAgfQotfQotCi12b2lkIEZ1bmN0aW9uQ29uc3RydWN0b3IoKToKLXt9Ci17ICAgIAotICAgICAgICA8RlVOQ1RJT05fPiA8TFBBUkVOPiBBcmd1bWVudExpc3QoKSA8UlBBUkVOPiAKLX0KLQotdm9pZCBGdW5jdGlvbkRlY2xhcmF0aW9uKCk6Ci17fQotewotICAgICAgICBMT09LQUhFQUQoMikgTmFtZWRGdW5jdGlvbigpIAotICAgIHwgICBMT09LQUhFQUQoMikgQW5vbnltb3VzRnVuY3Rpb24oKQotfSAgICAgICAgICAgCi0KLXZvaWQgRnVuY3Rpb25MaXRlcmFsKCk6Ci17fQotewotICAgICAgICBMT09LQUhFQUQoMikgTmFtZWRGdW5jdGlvbigpCi0gICAgfCAgIExPT0tBSEVBRCgyKSBBbm9ueW1vdXNGdW5jdGlvbigpCi19Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIAotVmVjdG9yIEZvcm1hbFBhcmFtZXRlckxpc3QoKToKLXsKLSAgICAgICAgVG9rZW4gIHQgPSBudWxsOwotICAgICAgICBWZWN0b3IgdiA9IG5ldyBWZWN0b3IoKTsKLX0KLXsKLSAgICAgICAgdD1JZGVudGlmaWVyKCkge3YuYWRkKHQpO30gCi0gICAgICAgICg8Q09NTUE+IHQ9SWRlbnRpZmllcigpIHt2LmFkZCh0KTt9KSoKLSAgICAgICAge3JldHVybiB2O30KLX0KLQotdm9pZCBMaXRlcmFsRWxlbWVudCgpIDoKLXt9Ci17Ci0gICAgICAgIEFzc2lnbm1lbnRFeHByZXNzaW9uKCkKLX0KLQotdm9pZCBFbGVtZW50TGlzdCgpOgote30KLXsKLSAgICAgICAgTGl0ZXJhbEVsZW1lbnQoKSAoPENPTU1BPiBMaXRlcmFsRWxlbWVudCgpKSoKLX0KLQotdm9pZCBBcnJheUxpdGVyYWwoKToKLXt9Ci17Ci0gICAgICAgIExPT0tBSEVBRCgyKSA8TEJSQUNLRVQ+IDxSQlJBQ0tFVD4KLSAgICB8ICAgTE9PS0FIRUFEKDIpIDxMQlJBQ0tFVD4gRWxlbWVudExpc3QoKSA8UkJSQUNLRVQ+Ci19Ci0KLXZvaWQgTmVzdGVkQXJyYXlMaXRlcmFsKCk6Ci17fQotewotICAgICAgICBMT09LQUhFQUQoMykgQXJyYXlMaXRlcmFsKCkgCi0gICAgfCAgIExPT0tBSEVBRCgzKSA8TEJSQUNLRVQ+IE5lc3RlZEFycmF5TGl0ZXJhbCgpIDxSQlJBQ0tFVD4KLX0KLQotdm9pZCBMaXRlcmFsRmllbGQoKToKLXsKLSAgICAgICAgVG9rZW4gdCA9IG51bGw7Ci19Ci17Ci0gICAgICAgIHQ9SWRlbnRpZmllcigpICAgICA8Q09MT04+IEFzc2lnbm1lbnRFeHByZXNzaW9uKCkKLSAgICAgICAge0pTUGFyc2VyVXRpbHMuYW5ub3RhdGVUb2tlbih0LCBBbm5vdGF0aW9uQ29uc3RhbnRzLkxJVEVSQUxfT0JKRUNUX0tFWV9JREVOVElGSUVSLG51bGwsLTEpOyB9Ci0gICB8ICAgIHQ9PFNUUklOR19MSVRFUkFMPiA8Q09MT04+IEFzc2lnbm1lbnRFeHByZXNzaW9uKCkKLSAgICAgICAge0pTUGFyc2VyVXRpbHMuYW5ub3RhdGVUb2tlbih0LCBBbm5vdGF0aW9uQ29uc3RhbnRzLkxJVEVSQUxfT0JKRUNUX0tFWV9JREVOVElGSUVSLG51bGwsLTEpOyB9Ci19Ci0KLXZvaWQgRmllbGRMaXN0KCk6Ci17fQotewotICAgICAgICBMaXRlcmFsRmllbGQoKSAoPENPTU1BPiBMaXRlcmFsRmllbGQoKSkqCi19Ci0KLXZvaWQgT2JqZWN0TGl0ZXJhbCgpOgote30KLXsKLSAgICAgICAgTE9PS0FIRUFEKDIpIDxMQlJBQ0U+IDxSQlJBQ0U+Ci0gICAgfCAgIExPT0tBSEVBRCgyKSA8TEJSQUNFPiBGaWVsZExpc3QoKSA8UkJSQUNFPiAgCi19Ci0KLQotVG9rZW4gUHJvZ3JhbSgpOgotewotICAgICAgICBUb2tlbiByZXR2YWwgPSBnZXRUb2tlbigxKTsKLX0KLXsKLSAgICAgICAge19jb250ZXh0U3RhY2sucHVzaENvbnRleHQobmV3IFByb2dyYW1Db250ZXh0KCJyb290IikpO30KLSAgICAgICAgKFNvdXJjZUVsZW1lbnQoKSkqICA8RU9GPgotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gcmV0dmFsOwotICAgICAgICB9Ci19Ci0KLXZvaWQgU291cmNlRWxlbWVudCgpOgote30KLXsKLSAgICAgICAgTE9PS0FIRUFEKDIpICAgIFN0YXRlbWVudCgpIAotICAgIHwgICAgICAgICAgICAgICAgICAgRnVuY3Rpb25EZWNsYXJhdGlvbigpCi19Ci0KLXZvaWQgU3RhdGVtZW50TGlzdCgpOiAKLXsKLS8vICAgICAgICBUb2tlbiB0OwotfQotewotICAgICAgICAoU3RhdGVtZW50KCkpKwotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC91aXh0b29scy9EZXRva2VuaXplci5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC91aXh0b29scy9EZXRva2VuaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZGIxMmQyLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvdWl4dG9vbHMvRGV0b2tlbml6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC51aXh0b29sczsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5Xcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKLQotLyoqCi0gKiBDb252ZXJ0cyBUb2tlbiBPYmplY3RzIGludG8gYSBKYXZhU2NyaXB0IGZpbGUKLSAqIEB2ZXJzaW9uICROYW1lOiAgJCAoJFJldmlzaW9uJCkgJERhdGUkCi0gKi8KLXB1YmxpYyBjbGFzcyBEZXRva2VuaXplcgotewotICBwcml2YXRlIGZpbmFsIFByaW50V3JpdGVyIF9vdXQ7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBvdXQgdGhlIGZpbGUgdG8gd3JpdGUgdGhlIG91dHB1dCB0by4KLSAgICovCi0gIHB1YmxpYyBEZXRva2VuaXplcihQcmludFdyaXRlciBvdXQpCi0gIHsKLSAgICB0aGlzLl9vdXQgPSBvdXQ7Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBQcmludFdyaXRlciBhbmQgY2FsbHMgdGhlIG90aGVyIGNvbnN0cnVjdG9yLgotICAgKi8KLSAgcHVibGljIERldG9rZW5pemVyKFdyaXRlciBvdXQpCi0gIHsKLSAgICB0aGlzKG5ldyBQcmludFdyaXRlcihvdXQpKTsKLSAgfQotCi0gIC8qKgotICAgKiBkZWNvZGVzIGEgdG9rZW4gYW5kIHdyaXRlcyB0aGUgcmVzdWx0Ci0gICAqIEBwYXJhbSB0b2sgdGhlIHRva2VuIHRvIGRlY29kZS4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHdyaXRlKFRva2VuIHRvaykgdGhyb3dzIElPRXhjZXB0aW9uCi0gIHsKLSAgICBpbnQgY29tID0gdG9rLmNvZGU7Ci0gICAgc3dpdGNoKGNvbSkKLSAgICAgIHsKLSAgICAgIGNhc2UgVG9rZW4uTkVXTElORSA6Ci0gICAgICAgIF9vdXQucHJpbnRsbigpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgVG9rZW4uV0hJVEVTUEFDRSA6Ci0gICAgICAgIF9vdXQucHJpbnQoJyAnKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIFRva2VuLlBFUklPRCA6Ci0gICAgICAgIF9vdXQucHJpbnQoJy4nKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIFRva2VuLlNFTUlDT0xPTiA6Ci0gICAgICAgIF9vdXQucHJpbnQoJzsnKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIFRva2VuLlFVT1RFRCA6Ci0gICAgICAgIHsKLSAgICAgICAgICBjaGFyIGNoID0gdG9rLmNoOwotICAgICAgICAgIF9vdXQucHJpbnQoY2grdG9rLnN0cmluZytjaCk7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIFRva2VuLkNPTlRST0wgOgotICAgICAgY2FzZSBUb2tlbi5MRUZUX0JSQUNFIDoKLSAgICAgIGNhc2UgVG9rZW4uUklHSFRfQlJBQ0UgOgotICAgICAgICBfb3V0LnByaW50KHRvay5jaCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBUb2tlbi5OVU1CRVIgOgotICAgICAgY2FzZSBUb2tlbi5SRVNFUlZFRCA6Ci0gICAgICBjYXNlIFRva2VuLk5BTUUgOgotICAgICAgICBfb3V0LnByaW50KHRvay5zdHJpbmcpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgVG9rZW4uQ09NTUVOVCA6Ci0gICAgICAgIF9vdXQucHJpbnQoIi8qIit0b2suc3RyaW5nKyIqLyIpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgVG9rZW4uUkVHVUxBUl9FWFAgOgotICAgICAgICBfb3V0LnByaW50KCIvIit0b2suc3RyaW5nKyIvIik7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBUb2tlbi5SRUdVTEFSX0VYUF9NT0RJRklFUiA6Ci0gICAgICAgIF9vdXQucHJpbnQodG9rLmNoKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIFRva2VuLkVPRiA6Ci0gICAgICAgIF9vdXQuY2xvc2UoKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0IDoKLSAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlVua25vd24gVG9rZW46Iit0b2spOwotICAgICAgfQotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC91aXh0b29scy9GaWxlUHJvY2Vzc29yLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L3VpeHRvb2xzL0ZpbGVQcm9jZXNzb3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzUwYTYyNi4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L3VpeHRvb2xzL0ZpbGVQcm9jZXNzb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MyArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC51aXh0b29sczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVuYW1lRmlsdGVyOwotCi0vKioKLSAqIFRoaXMgdXRpbGl0eSBjbGFzcyBjYW4gYmUgdXNlZCB0byBwZXJmb3JtIHNvbWUgcHJvY2Vzc2luZyBvbiBpbnB1dCBmaWxlcywKLSAqIGFuZCB3cml0ZSB0aGUgcmVzdWx0cyB0byBjb3JyZXNwb25kaW5nIG91dHB1dCBmaWxlcy4gSXQgc3VwcG9ydHMgcmVjdXJzaW5nCi0gKiBpbnRvIHN1YmRpcmVjdG9yaWVzLgotICogQHZlcnNpb24gJE5hbWU6ICAkICgkUmV2aXNpb24kKSAkRGF0ZSQKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEZpbGVQcm9jZXNzb3IKLXsKLSAgLyoqCi0gICAqIEBwYXJhbSBmaWxlbmFtZUV4dCB0aGUgZmlsZW5hbWUgZXh0ZW5zaW9uIHRvIGFjY2VwdC4gSWYgbnVsbCwgYWxsIGZpbGVzCi0gICAqICBhcmUgYWNjZXB0ZWQuCi0gICAqIEByZXR1cm4gYSBmaWx0ZXIgdGhhdCBvbmx5IGFjY2VwdHMgZmlsZXMgd2l0aCBuYW1lcyB0aGF0IGVuZCB3aXRoIHRoZQotICAgKiAgc3BlY2lmaWVkIGV4dGVuc2lvbi4gSG93ZXZlciwgdGhlIGZpbHRlciBhY2NlcHRzIGFsbCBzdWJkaXJlY3Rvcmllcy4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgRmlsZW5hbWVGaWx0ZXIgZ2V0RXh0ZW5zaW9uRmlsdGVyKGZpbmFsIFN0cmluZyBmaWxlbmFtZUV4dCkKLSAgewotICAgIHJldHVybiBuZXcgRmlsZW5hbWVGaWx0ZXIoKSB7Ci0gICAgICAgIHB1YmxpYyBib29sZWFuIGFjY2VwdChGaWxlIGRpciwgU3RyaW5nIG5hbWUpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoKGZpbGVuYW1lRXh0PT1udWxsKSB8fCAobmFtZS5lbmRzV2l0aChmaWxlbmFtZUV4dCkpKSByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICBGaWxlIGYgPSBuZXcgRmlsZShkaXIsIG5hbWUpOwotICAgICAgICAgIHJldHVybiBmLmlzRGlyZWN0b3J5KCk7Ci0gICAgICAgIH0KLSAgICAgIH07Ci0gIH0KLQotICAvKioKLSAgICogQHBhcmFtIGZpbHRlciB1c2VkIHRvIHNlbGVjdCBmaWxlcyBhbmQvb3Igc3ViZGlyZWN0b3JpZXMuCi0gICAqIEBwYXJhbSBmYWlsRmFzdCBpZiB0cnVlLCB0ZXJtaW5hdGVzIGF0IHRoZSBmaXJzdCBlcnJvciAob3RoZXJ3aXNlLAotICAgKiAgY29udGludWVzIHdpdGggdGhlIG5leHQgZmlsZSkuCi0gICAqIEBwYXJhbSBvdmVyd3JpdGUgaWYgZmFsc2UsIHdpbGwgbm90IG92ZXJ3cml0ZSBleGlzdGluZyBvdXRwdXQgZmlsZXMgKFRoYXQKLSAgICogIHBhcnRpY3VsYXIgaW5wdXQgYW5kIG91dHB1dCBmaWxlIHdpbGwgYmUgc2tpcHBlZCkuCi0gICAqIEBwYXJhbSB2ZXJib3NlIGlmIHRydWUsIGdlbmVyYXRlcyB2ZXJib3NlIG91dHB1dC4gICovCi0gIHB1YmxpYyBGaWxlUHJvY2Vzc29yKEZpbGVuYW1lRmlsdGVyIGZpbHRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBmYWlsRmFzdCwgYm9vbGVhbiBvdmVyd3JpdGUsIGJvb2xlYW4gdmVyYm9zZSkKLSAgewotICAgIF9maWx0ZXIgPSBmaWx0ZXI7Ci0gICAgX2ZhaWxGYXN0ID0gZmFpbEZhc3Q7Ci0gICAgX2RvbnRPdmVyd3JpdGUgPSAhb3ZlcndyaXRlOwotICAgIGlzVmVyYm9zZSA9IHZlcmJvc2U7Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIEZpbGVwcm9jZXNzb3IgdGhhdCBvdmVyd3JpdGVzIGFsbCBvdXRwdXQgZmlsZXMsIGFuZCBkb2VzIG5vdAotICAgKiBmYWlsIGZhc3QuCi0gICAqIEBwYXJhbSBmaWx0ZXIgdXNlZCB0byBzZWxlY3QgZmlsZXMgYW5kL29yIHN1YmRpcmVjdG9yaWVzLiAgKi8KLSAgcHVibGljIEZpbGVQcm9jZXNzb3IoRmlsZW5hbWVGaWx0ZXIgZmlsdGVyLCBib29sZWFuIHZlcmJvc2l0eSkKLSAgewotICAgIHRoaXMoZmlsdGVyLCBmYWxzZSwgdHJ1ZSwgdmVyYm9zaXR5KTsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgRmlsZXByb2Nlc3NvciB0aGF0IG92ZXJ3cml0ZXMgYWxsIG91dHB1dCBmaWxlcywgYW5kIGRvZXMgbm90Ci0gICAqIGZhaWwgZmFzdC4KLSAgICogQHBhcmFtIGV4dGVuc2lvbiB0aGUgZmlsZSBleHRlbnNpb24gdG8gZmlsdGVyIGZvci4gaWYgdGhpcyBpcyBudWxsLCBhbGwKLSAgICogZmlsZXMgYW5kIHN1YmRpcmVjdG9yaWVzIGluIGEgZGlyZWN0b3J5IHdpbGwgYmUgcHJvY2Vzc2VkIHJlY3Vyc2l2ZWx5LgotICAgKiBAc2VlICNnZXRFeHRlbnNpb25GaWx0ZXIoU3RyaW5nIGV4dGVuc2lvbikKLSAgICovCi0gIHB1YmxpYyBGaWxlUHJvY2Vzc29yKFN0cmluZyBleHRlbnNpb24sIGJvb2xlYW4gdmVyYm9zaXR5KQotICB7Ci0gICAgdGhpcyhnZXRFeHRlbnNpb25GaWx0ZXIoZXh0ZW5zaW9uKSwgdmVyYm9zaXR5KTsKLSAgfQotCi0gIC8qKgotICAgKiBAcGFyYW0gaW4gdGhlIGlucHV0IGZpbGUgb3IgZGlyZWN0b3J5Ci0gICAqIEBwYXJhbSBvdXQgaWYgdGhlIGlucHV0IGlzIGEgZGlyZWN0b3J5LCB0aGVuIHRoaXMgbXVzdCBiZSB0aGUgb3V0cHV0Ci0gICAqICBkaXJlY3RvcnkuIE90aGVyd2lzZSwgdGhpcyBpcyB0aGUgb3V0cHV0IGZpbGUuCi0gICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGVyZSB3ZXJlIG5vIGVycm9ycy4gZmFsc2Ugb3RoZXJ3aXNlLiAgKi8KLSAgcHVibGljIGJvb2xlYW4gcHJvY2VzcyhGaWxlIGluLCBGaWxlIG91dCkKLSAgewotICAgIGlmIChpc1ZlcmJvc2UpIFN5c3RlbS5vdXQucHJpbnRsbigiUHJvY2Vzc2luZyBmaWxlOiIraW4rIiB0byBmaWxlOiIrb3V0KTsKLQotICAgIGlmIChpbi5pc0RpcmVjdG9yeSgpKQotICAgIHsKLSAgICAgIGJvb2xlYW4gc3VjY2VzcyA9IHRydWU7Ci0gICAgICBTdHJpbmdbXSBuYW1lcyA9IGluLmxpc3QoX2ZpbHRlcik7Ci0gICAgICBmb3IoaW50IGk9MCwgc3o9bmFtZXMubGVuZ3RoOyBpPHN6OyBpKyspCi0gICAgICB7Ci0gICAgICAgIEZpbGUgc3ViSW4gPSBuZXcgRmlsZShpbiwgbmFtZXNbaV0pOwotICAgICAgICBGaWxlIHN1Yk91dCA9IG5ldyBGaWxlKG91dCwgbmFtZXNbaV0pOwotICAgICAgICBzdWNjZXNzICY9IHByb2Nlc3Moc3ViSW4sIHN1Yk91dCk7Ci0gICAgICAgIGlmIChfZmFpbEZhc3QgJiYgKCFzdWNjZXNzKSkgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgICAgcmV0dXJuIHN1Y2Nlc3M7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgaWYgKF9kb250T3ZlcndyaXRlICYmIG91dC5leGlzdHMoKSkKLSAgICAgICAgewotICAgICAgICAgIGlmIChpc1ZlcmJvc2UpIFN5c3RlbS5vdXQucHJpbnRsbigiU2tpcHBpbmcgZmlsZToiK2luKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBhcyBkZXN0aW5hdGlvbiBmaWxlOiIrb3V0KwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBhbHJlYWR5IGV4aXN0cy4iKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBvdXQuZ2V0UGFyZW50RmlsZSgpLm1rZGlycygpOwotICAgICAgICAgIHByb2Nlc3NGaWxlKGluLCBvdXQpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIHByb2Nlc3NpbmcgZmlsZToiK2luKyIgdG8gZmlsZToiK291dCk7Ci0gICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogQ2FsbGVkIHRvIHByb2Nlc3MgYSBzaW5nbGUgZmlsZS4KLSAgICogQHBhcmFtIGluIHRoZSBpbnB1dCBmaWxlLiBUaGlzIGlzIG5ldmVyIGEgZGlyZWN0b3J5LgotICAgKiBAcGFyYW0gb3V0IHRoZSBvdXRwdXQgZmlsZS4gSWYgdGhpcyBmaWxlIGV4aXN0cyBhbmQgb3ZlcndyaXRpbmcgaXMgbm90Ci0gICAqIHBlcm1pdHRlZCwgdGhlbiB0aGlzIG1ldGhvZCBpcyBuZXZlciBjYWxsZWQuCi0gICAqIEBleGNlcHRpb24gRXhjZXB0aW9uIGlmIHRoaXMgY2xhc3MgaXMgc2V0IHRvIDxpPmZhaWwgZmFzdDwvaT4gdGhlbiBhbnkKLSAgICogZXhjZXB0aW9uIHRocm93biB3aWxsIGNhdXNlIGFsbCBleGVjdXRpb24gdG8gaGFsdC4gSWYgdGhpcyBjbGFzcyBkb2VzIG5vdAotICAgKiBmYWlsIGZhc3QsIHRoZW4gdGhlIGV4Y2VwdGlvbiB3aWxsIGJlIHJlcG9ydGVkIGFuZCBleGVjdXRpb24gd2lsbAotICAgKiBjb250aW51ZSB3aXRoIHRoZSBuZXh0IGZpbGUuICAqLwotICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBwcm9jZXNzRmlsZShGaWxlIGluLCBGaWxlIG91dCkgdGhyb3dzIEV4Y2VwdGlvbjsKLQotICAvKioKLSAgICogSWYgdGhpcyBpcyB0cnVlLCB2ZXJib3NlIG91dHB1dCB3aWxsIGJlIGdlbmVyYXRlZC4KLSAgICovCi0gIHByb3RlY3RlZCBmaW5hbCBib29sZWFuIGlzVmVyYm9zZTsKLQotICBwcml2YXRlICAgZmluYWwgYm9vbGVhbiBfZmFpbEZhc3QsIF9kb250T3ZlcndyaXRlOwotICBwcml2YXRlICAgZmluYWwgRmlsZW5hbWVGaWx0ZXIgX2ZpbHRlcjsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L3VpeHRvb2xzL0ZpbHRlcjEuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvdWl4dG9vbHMvRmlsdGVyMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MTI0OTgyLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvdWl4dG9vbHMvRmlsdGVyMS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQudWl4dG9vbHM7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi0vKioKLSAqIFJlbW92ZXMgYWxsIGNvbW1lbnRzIGFuZCByZWR1bmRhbnQgd2hpdGVzcGFjZQotICogQHZlcnNpb24gJE5hbWU6ICAkICgkUmV2aXNpb24kKSAkRGF0ZSQKLSAqLwotcHVibGljIGNsYXNzIEZpbHRlcjEgaW1wbGVtZW50cyBUb2tlblJlYWRlcgotewotCi0gIC8qKgotICAgKiBibG9ja3MgdW50aWwgaXMgaGFzIHJlYWQgYXRsZWFzdCBvbmUgdG9rZW4gZnJvbSB0aGUgaW5wdXQgcmVhZGVyCi0gICAqLwotICBwdWJsaWMgRmlsdGVyMShUb2tlblJlYWRlciBpbikgdGhyb3dzIElPRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbgotICB7Ci0gICAgX2luID0gaW47Ci0gICAgX25leHQgPSBfaW4ucmVhZCgpOwotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgVG9rZW5SZWFkZXIKLSAgICovCi0gIHB1YmxpYyBUb2tlbiByZWFkKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbgotICB7Ci0gICAgVG9rZW4gY3VyID0gX25leHQ7Ci0gICAgVG9rZW4gcmVzID0gY3VyOwotICAgIGZvcig7Y3VyIT1udWxsOykKLSAgICAgIHsKLSAgICAgICAgX25leHQgPSBfaW4ucmVhZCgpOwotICAgICAgICByZXMgPSBfZmlsdGVyKF9wcmV2LCBjdXIsIF9uZXh0KSA7Ci0gICAgICAgIGlmIChyZXMhPW51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgX3ByZXYgPSByZXM7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgIGVsc2UgY3VyID0gX25leHQ7Ci0gICAgICB9Ci0gICAgcmV0dXJuIHJlczsKLSAgfQotCi0gIC8qKgotICAgKiBSZW1vdmVzIGV4dHJhIHNwYWNlcy9uZXdsaW5lcyBhbmQgYWxsIGNvbW1lbnRzCi0gICAqLwotICBwcml2YXRlIFRva2VuIF9maWx0ZXIoVG9rZW4gcHJldiwgVG9rZW4gY3VyLCBUb2tlbiBuZXh0KQotICB7Ci0gICAgLy95c3RlbS5vdXQucHJpbnRsbigiZmlsdGVyaW5nIHRva2VuOiIrY3VyKTsKLSAgICBpbnQgY2NvZGUgPSBjdXIuY29kZTsKLSAgICBpZiAoKGNjb2RlPT1Ub2tlbi5DT01NRU5UKSB8fCAgIC8vc2tpcCBjb21tZW50cwotICAgICAgICAoKGNjb2RlPT1Ub2tlbi5XSElURVNQQUNFKSAmJgotICAgICAgICAgIShfaXNTcGFjZVNlbnNpdGl2ZShwcmV2KSAmJiBfaXNTcGFjZVNlbnNpdGl2ZShuZXh0KSkpIHx8Ci0gICAgICAgICgoY2NvZGU9PVRva2VuLk5FV0xJTkUpICYmCi0gICAgICAgICAoKHByZXY9PW51bGwpIHx8IChwcmV2LmNvZGU9PVRva2VuLk5FV0xJTkUpKSkpCi0gICAgICByZXR1cm4gbnVsbDsKLSAgICBlbHNlIHJldHVybiBjdXI7Ci0gIH0KLQotICAvKioKLSAgICogQHJldHVybiB0cnVlIGlmIHRoZSBnaXZlbiB0b2tlbiBpcyBhZmZlY3RlZCBieSB3aGl0ZXNwYWNlIHByZWNlZGluZyBvcgotICAgKiAgZm9sbG93aW5nIGl0LgotICAgKi8KLSAgcHJpdmF0ZSBib29sZWFuIF9pc1NwYWNlU2Vuc2l0aXZlKFRva2VuIHRvaykKLSAgewotICAgIGlmICh0b2s9PW51bGwpIHJldHVybiBmYWxzZTsKLSAgICBpbnQgaSA9IHRvay5jb2RlOwotICAgIGlmICgoaSA9PSBUb2tlbi5OQU1FKSB8fCAoaSA9PSBUb2tlbi5OVU1CRVIpIHx8IChpID09IFRva2VuLlJFU0VSVkVEKSB8fAotICAgICAgICAoaSA9PSBUb2tlbi5QRVJJT0QpKQotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgZWxzZSByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBwcml2YXRlIGZpbmFsIFRva2VuUmVhZGVyIF9pbjsKLSAgcHJpdmF0ZSBUb2tlbiBfcHJldiA9IG51bGw7Ci0gIHByaXZhdGUgVG9rZW4gX25leHQ7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC91aXh0b29scy9GaWx0ZXIyLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L3VpeHRvb2xzL0ZpbHRlcjIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTEzM2VlMS4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L3VpeHRvb2xzL0ZpbHRlcjIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyMiArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC51aXh0b29sczsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotCi0vKioKLSAqIFJlbmFtZXMgbG9jYWwgdmFyaWFibGUgbmFtZXMgdG8gc2hvcnQgb25lcwotICogQHZlcnNpb24gJE5hbWU6ICAkICgkUmV2aXNpb24kKSAkRGF0ZSQKLSAqLwotcHVibGljIGNsYXNzIEZpbHRlcjIgaW1wbGVtZW50cyBUb2tlblJlYWRlcgotewotCi0gIHB1YmxpYyBGaWx0ZXIyKFRva2VuUmVhZGVyIGluKQotICB7Ci0gICAgX2luID0gaW47Ci0gICAgUnVubmFibGUgcnVubmVyID0gbmV3IFJ1bm5hYmxlKCkKLSAgICAgIHsKLSAgICAgICAgcHVibGljIHZvaWQgcnVuKCkKLSAgICAgICAgewotICAgICAgICAgIHRyeQotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8veXN0ZW0ub3V0LnByaW50bG4oIkNvbXByZXNzb3I6IHN0YXJ0OiIrVGhyZWFkLmN1cnJlbnRUaHJlYWQoKSk7Ci0gICAgICAgICAgICBfcnVuKCk7Ci0gICAgICAgICAgICAvL3lzdGVtLm91dC5wcmludGxuKCJDb21yZXNzb3I6IGVuZDoiK1RocmVhZC5jdXJyZW50VGhyZWFkKCkpOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfTsKLSAgICBuZXcgVGhyZWFkKHJ1bm5lcikuc3RhcnQoKTsKLSAgfQotCi0gIC8qKgotICAgKiBAc2VlIFRva2VuUmVhZGVyI3JlYWQoKQotICAgKi8KLSAgcHVibGljIFRva2VuIHJlYWQoKSB0aHJvd3MgSU9FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uCi0gIHsKLSAgICByZXR1cm4gX2J1ZmZlci5yZWFkKCk7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgX3J1bigpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbgotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgVG9rZW4gY3VyID0gX2luLnJlYWQoKTsKLSAgICAgIGZvcig7Y3VyIT1udWxsOykKLSAgICAgIHsKLSAgICAgICAgX3Byb2Nlc3MoY3VyKTsKLSAgICAgICAgY3VyID0gX2luLnJlYWQoKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgX2J1ZmZlci53cml0ZShlKTsKLSAgICB9Ci0gICAgY2F0Y2ggKFRva2VuRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgIF9idWZmZXIud3JpdGUobmV3IElPRXhjZXB0aW9uKCJFcnJvciBwYXJzaW5nIGxpbmU6IisKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuZ2V0VG9rZW4oKS5saW5lTnVtYmVyKSk7Ci0gICAgfQotICAgIGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgIF9idWZmZXIud3JpdGUobmV3IElPRXhjZXB0aW9uKCkpOwotICAgIH0KLSAgICBfYnVmZmVyLmNsb3NlKCk7Ci0gIH0KLQotICAvKioKLSAgICogcmVuYW1lcyBsb2NhbCB2YXJpYWJsZSBuYW1lcyB0byBzaG9ydCBuYW1lcy4KLSAgICogRmlyc3QgcGFzcy4gc2V0cyBhIGZsYWcgaWYgdGhpcyBmdW5jdGlvbiB1c2VzIHRoZSBKUyBldmFsIG1ldGhvZC4KLSAgICovCi0gIHByaXZhdGUgdm9pZCBfcHJvY2VzcyhUb2tlbiBjdXIpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbgotICB7Ci0gICAgaWYgKChjdXIuY29kZSA9PSBUb2tlbi5MRUZUX0JSQUNFKSAmJiAoY3VyLmNoID09ICd7JykpCi0gICAgICBfb3BlbkN1cmx5Kys7Ci0gICAgZWxzZSBpZiAoKGN1ci5jb2RlID09IFRva2VuLlJJR0hUX0JSQUNFKSAmJiAoY3VyLmNoID09ICd9JykpCi0gICAgICBfb3BlbkN1cmx5LS07Ci0KLQotICAgIHN3aXRjaChfc3RhdGUpCi0gICAgewotICAgIGNhc2UgUk9PVF9NT0RFIDoKLSAgICAgIGlmICgoY3VyLmNvZGU9PVRva2VuLlJFU0VSVkVEKSAmJiAoY3VyLnN0cmluZy5lcXVhbHMoImZ1bmN0aW9uIikpKQotICAgICAgewotICAgICAgICBfc3RhdGUgPSBGVU5DVElPTl9QQVJBTV9NT0RFOwotICAgICAgICBfZnVuY3Rpb24uY2xlYXIoKTsKLSAgICAgICAgX2lzRnVuY3Rpb25Vc2luZ0V2YWwgPSBmYWxzZTsKLSAgICAgICAgX2Z1bmN0aW9uLmFkZChjdXIpOwotICAgICAgfQotICAgICAgZWxzZSBfYnVmZmVyLndyaXRlKGN1cik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZVTkNUSU9OX1BBUkFNX01PREUgOgotICAgICAgX2Z1bmN0aW9uLmFkZChjdXIpOwotICAgICAgaWYgKChjdXIuY29kZT09VG9rZW4uTEVGVF9CUkFDRSkgJiYgKGN1ci5jaD09J3snKSkKLSAgICAgIHsKLSAgICAgICAgX3N0YXRlID0gRlVOQ1RJT05fQk9EWV9NT0RFOwotICAgICAgICBfYmVnaW5GdW5jdGlvbiA9IF9vcGVuQ3VybHk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZVTkNUSU9OX0JPRFlfTU9ERSA6Ci0gICAgICBfZnVuY3Rpb24uYWRkKGN1cik7Ci0gICAgICBpZiAoX29wZW5DdXJseTxfYmVnaW5GdW5jdGlvbikKLSAgICAgIHsKLSAgICAgICAgX3N0YXRlID0gUk9PVF9NT0RFOwotICAgICAgICBpZiAoX2lzRnVuY3Rpb25Vc2luZ0V2YWwpIF93cml0ZVRva2VucyhfZnVuY3Rpb24pOwotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBmb3IoaW50IGk9MCxzej1fZnVuY3Rpb24uc2l6ZSgpOyBpPHN6OyBpKyspCi0gICAgICAgICAgewotICAgICAgICAgICAgX3Byb2Nlc3MyKChUb2tlbikgX2Z1bmN0aW9uLmdldChpKSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmICgoY3VyLmNvZGU9PVRva2VuLk5BTUUpICYmIGN1ci5zdHJpbmcuZXF1YWxzKCJldmFsIikpCi0gICAgICB7Ci0gICAgICAgIF9pc0Z1bmN0aW9uVXNpbmdFdmFsID0gdHJ1ZTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiAybmQgcGFzcwotICAgKiBEb2VzIHRoZSBhY3R1YWwgcmVuYW1pbmcKLSAgICovCi0gIHByaXZhdGUgdm9pZCBfcHJvY2VzczIoVG9rZW4gY3VyKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24KLSAgewotICAgIGlmICgoY3VyLmNvZGUgPT0gVG9rZW4uTEVGVF9CUkFDRSkgJiYgKGN1ci5jaCA9PSAneycpKQotICAgICAgX29wZW5DdXJseSsrOwotICAgIGVsc2UgaWYgKChjdXIuY29kZSA9PSBUb2tlbi5SSUdIVF9CUkFDRSkgJiYgKGN1ci5jaCA9PSAnfScpKQotICAgICAgX29wZW5DdXJseS0tOwotCi0gICAgc3dpdGNoKF9zdGF0ZSkKLSAgICB7Ci0gICAgY2FzZSBST09UX01PREUgOgotICAgICAgaWYgKChjdXIuY29kZT09VG9rZW4uUkVTRVJWRUQpICYmIChjdXIuc3RyaW5nLmVxdWFscygiZnVuY3Rpb24iKSkpCi0gICAgICAgIF9zdGF0ZSA9IEZVTkNUSU9OX01PREU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZVTkNUSU9OX01PREUgOgotICAgICAgaWYgKChjdXIuY29kZT09VG9rZW4uTEVGVF9CUkFDRSkgJiYgKGN1ci5jaD09JygnKSkKLSAgICAgIHsKLSAgICAgICAgX3N0YXRlID0gRlVOQ1RJT05fUEFSQU1fTU9ERTsKLSAgICAgICAgX2xvY2FsVmFyTWFwLmNsZWFyKCk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChjdXIuY29kZT09VG9rZW4uTkFNRSkKLSAgICAgIHsKLSAgICAgICAgLy95c3RlbS5vdXQucHJpbnRsbigiZnVuY3Rpb24gbmFtZTsiK2N1ci5zdHJpbmcpOwotICAgICAgICBfbmFtZUdlbi5yZXNldCgpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGVU5DVElPTl9QQVJBTV9NT0RFIDoKLSAgICAgIGlmICgoY3VyLmNvZGU9PVRva2VuLkxFRlRfQlJBQ0UpICYmIChjdXIuY2g9PSd7JykpCi0gICAgICB7Ci0gICAgICAgIF9zdGF0ZSA9IEZVTkNUSU9OX0JPRFlfTU9ERTsKLSAgICAgICAgX2JlZ2luRnVuY3Rpb24gPSBfb3BlbkN1cmx5OwotICAgICAgfQotICAgICAgZWxzZSBpZiAoY3VyLmNvZGUgPT0gVG9rZW4uTkFNRSkKLSAgICAgIHsKLSAgICAgICAgLy95c3RlbS5vdXQucHJpbnRsbigiIHBhcmFtOiIrY3VyLnN0cmluZyk7Ci0gICAgICAgIFRva2VuIHRvayA9IF9nZXROZXdUb2tlbihjdXIpOwotICAgICAgICBjdXIgPSB0b2s7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZVTkNUSU9OX0JPRFlfTU9ERSA6Ci0gICAgICBpZiAoX29wZW5DdXJseTxfYmVnaW5GdW5jdGlvbikKLSAgICAgIHsKLSAgICAgICAgX3N0YXRlID0gUk9PVF9NT0RFOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoY3VyLmNvZGU9PVRva2VuLlBFUklPRCkKLSAgICAgICAgX3N0YXRlID0gUEVSSU9EX01PREU7Ci0gICAgICBlbHNlIGlmICgoY3VyLmNvZGU9PVRva2VuLlJFU0VSVkVEKSAmJiAoY3VyLnN0cmluZy5lcXVhbHMoInZhciIpKSkKLSAgICAgICAgX3N0YXRlID0gVkFSX0RFRl9NT0RFOwotICAgICAgZWxzZSBpZiAoY3VyLmNvZGU9PVRva2VuLk5BTUUpCi0gICAgICB7Ci0gICAgICAgIGN1ciA9IF9zdWJzdEZvclRva2VuKGN1cik7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFZBUl9ERUZfTU9ERSA6Ci0gICAgICBpZiAoY3VyLmNvZGU9PVRva2VuLk5BTUUpCi0gICAgICB7Ci0gICAgICAgIF9zdGF0ZSA9IEZVTkNUSU9OX0JPRFlfTU9ERTsKLSAgICAgICAgLy95c3RlbS5vdXQucHJpbnRsbigiIGxvY2FsIHZhcjoiK2N1ci5zdHJpbmcpOwotICAgICAgICBUb2tlbiB0b2sgPSBfZ2V0TmV3VG9rZW4oY3VyKTsKLSAgICAgICAgY3VyID0gdG9rOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBQRVJJT0RfTU9ERSA6Ci0gICAgICAvLyB0aGlzIGlzIGp1c3QgdG8gc2tpcCB0aGUgbmV4dCB0b2tlbiBhZnRlciBhIHBlcmlvZC4KLSAgICAgIF9zdGF0ZSA9IEZVTkNUSU9OX0JPRFlfTU9ERTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBfYnVmZmVyLndyaXRlKGN1cik7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgX3dyaXRlVG9rZW5zKFZlY3RvciB0b2tlbnMpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbgotICB7Ci0gICAgZm9yKGludCBpPTAsc3o9dG9rZW5zLnNpemUoKTsgaTxzejsgaSsrKQotICAgIHsKLSAgICAgIF9idWZmZXIud3JpdGUoKFRva2VuKSB0b2tlbnMuZ2V0KGkpKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogQHJldHVybiBhIG5ldyB0b2tlbiB0byByZXBsYWNlIHRoZSBvbGQgb25lIHdpdGguIHRoZSBuZXcgb25lIHdpbGwgaGF2ZQotICAgKiAgYSBzaG9ydCBuYW1lCi0gICAqLwotICBwcml2YXRlIFRva2VuIF9nZXROZXdUb2tlbihUb2tlbiBvbGRUb2tlbikKLSAgewotICAgIFN0cmluZyBvbGROYW1lID0gb2xkVG9rZW4uc3RyaW5nOwotICAgIFN0cmluZyBuZXdOYW1lID0gKFN0cmluZykgX2xvY2FsVmFyTWFwLmdldChvbGROYW1lKTsKLSAgICBpZiAobmV3TmFtZT09bnVsbCkKLSAgICB7Ci0gICAgICBuZXdOYW1lID0gX25hbWVHZW4uZ2V0TmV4dCgpOwotICAgICAgX2xvY2FsVmFyTWFwLnB1dChvbGROYW1lLCBuZXdOYW1lKTsKLSAgICB9Ci0gICAgcmV0dXJuIG5ldyBUb2tlbihvbGRUb2tlbi5jb2RlLCBvbGRUb2tlbi5saW5lTnVtYmVyLCBuZXdOYW1lKTsKLSAgfQotCi0gIC8qKgotICAgKiBAcmV0dXJuIHRoZSBzdWJzdGl0dXRlIHRva2VuLiBpZiBubyB0b2tlbiBoYXMgYmVlbiBzdWJzdGl0dXRlZCBmb3IgdGhlCi0gICAqICA8Y29kZT5vbGRUb2tlbjwvY29kZT4gdGhlbiB0aGUgPGNvZGU+b2xkVG9rZW48L2NvZGU+IGlzIHJldHVybmVkLgotICAgKiBAcGFyYW0gb2xkVG9rZW4gdGhlIHRva2VuIHRvIHN1YnN0aXR1dGUgZm9yLgotICAgKi8KLSAgcHJpdmF0ZSBUb2tlbiBfc3Vic3RGb3JUb2tlbihUb2tlbiBvbGRUb2tlbikKLSAgewotICAgIFN0cmluZyBvbGROYW1lID0gb2xkVG9rZW4uc3RyaW5nOwotICAgIFN0cmluZyBuZXdOYW1lID0gKFN0cmluZykgX2xvY2FsVmFyTWFwLmdldChvbGROYW1lKTsKLSAgICBpZiAobmV3TmFtZT09bnVsbCkKLSAgICB7Ci0gICAgICBpZiAoX25hbWVHZW4uaXNJblVzZShvbGROYW1lKSkKLSAgICAgICAgdGhyb3cgbmV3IFRva2VuRXhjZXB0aW9uKG9sZFRva2VuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNvbmZsaWN0IHdpdGggZ2xvYmFsIHZhcjoiK29sZE5hbWUpOwotICAgICAgcmV0dXJuIG9sZFRva2VuOwotICAgIH0KLSAgICBUb2tlbiB0b2sgPSBuZXcgVG9rZW4ob2xkVG9rZW4uY29kZSwgb2xkVG9rZW4ubGluZU51bWJlciwgbmV3TmFtZSk7Ci0gICAgcmV0dXJuIHRvazsKLSAgfQotCi0gIHByaXZhdGUgY2xhc3MgTmFtZUdlbgotICB7Ci0gICAgcHJpdmF0ZSBpbnQgX2kgPSAwOwotICAgIHByaXZhdGUgY2hhciBfY2ggPSAnYSc7Ci0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmdCdWZmZXIgX3NiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBhIG5ldyB1bmlxdWUgc2hvcnQgbmFtZQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmV4dCgpCi0gICAgewotICAgICAgX3NiLnNldExlbmd0aCgwKTsKLSAgICAgIHJldHVybiBfc2IuYXBwZW5kKF9jaCkuYXBwZW5kKF9pKyspLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVzZXQoKQotICAgIHsKLSAgICAgIF9pID0gMDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgPGNvZGU+dmFyTmFtZTwvY29kZT4gaGFzIGFscmVhZHkgYmVlbiByZXR1cm5lZCBieQotICAgICAqICAgdGhlIG1ldGhvZCA8Y29kZT5nZXROZXh0KCk8L2NvZGU+Ci0gICAgICogQHNlZSAjZ2V0TmV4dCgpCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNJblVzZShTdHJpbmcgdmFyTmFtZSkKLSAgICB7Ci0gICAgICBpbnQgc3o9dmFyTmFtZS5sZW5ndGgoKTsKLSAgICAgIGlmICgodmFyTmFtZS5jaGFyQXQoMCkhPV9jaCkgfHwgKHN6PD0xKSkgcmV0dXJuIGZhbHNlOwotCi0gICAgICBmb3IoaW50IGk9MTsgaTxzejsgaSsrKQotICAgICAgewotICAgICAgICBpZiAoIUNoYXJhY3Rlci5pc0RpZ2l0KHZhck5hbWUuY2hhckF0KGkpKSkgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgICAgU3RyaW5nIGlwYXJ0ID0gdmFyTmFtZS5zdWJzdHJpbmcoMSk7Ci0gICAgICBpbnQgaiA9IEludGVnZXIucGFyc2VJbnQoaXBhcnQpOwotICAgICAgaWYgKGogPj0gX2kpIHJldHVybiBmYWxzZTsKLSAgICAgIGVsc2UgcmV0dXJuIHRydWU7Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSBpbnQgX3N0YXRlID0gUk9PVF9NT0RFOwotICBwcml2YXRlIGludCBfb3BlbkN1cmx5ID0gMDsKLSAgcHJpdmF0ZSBpbnQgX2JlZ2luRnVuY3Rpb24gPSAwOwotICBwcml2YXRlIGJvb2xlYW4gX2lzRnVuY3Rpb25Vc2luZ0V2YWwgPSBmYWxzZTsKLQotICBwcml2YXRlIGZpbmFsIFRva2VuUmVhZGVyIF9pbjsKLSAgcHJpdmF0ZSBmaW5hbCBOYW1lR2VuIF9uYW1lR2VuID0gbmV3IE5hbWVHZW4oKTsKLSAgcHJpdmF0ZSBmaW5hbCBIYXNoTWFwIF9sb2NhbFZhck1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0gIHByaXZhdGUgZmluYWwgVG9rZW5CdWZmZXIgX2J1ZmZlciA9IG5ldyBUb2tlbkJ1ZmZlcigpOwotICBwcml2YXRlIGZpbmFsIFZlY3RvciBfZnVuY3Rpb24gPSBuZXcgVmVjdG9yKCk7Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJPT1RfTU9ERSA9ICAgICAgICAgICAwOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRlVOQ1RJT05fTU9ERSA9ICAgICAgIDE7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBGVU5DVElPTl9QQVJBTV9NT0RFID0gMjsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZVTkNUSU9OX0JPRFlfTU9ERSA9ICAzOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVkFSX0RFRl9NT0RFID0gICAgICAgIDQ7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQRVJJT0RfTU9ERSA9ICAgICAgICAgNTsKLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvdWl4dG9vbHMvUXVldWUuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvdWl4dG9vbHMvUXVldWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGY1OTZlYS4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L3VpeHRvb2xzL1F1ZXVlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTAgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQudWl4dG9vbHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBJbXBsZW1lbnRzIGEgZmlyc3QtaW4tZmlyc3Qtb3V0IChGSUZPKSBxdWV1ZS4gVHlwaWNhbGx5LCBvbmUgdGhyZWFkIHdpbGwgYWRkCi0gKiBlbGVtZW50cyB0byB0aGlzIHF1ZXVlLCBhbmQgYW5vdGhlciB3aWxsIHJlbW92ZSBlbGVtZW50cyBmcm9tIHRoaXMgcXVldWUuCi0gKiBUaGlzIGNsYXNzIGlzIHRocmVhZCBzYWZlLgotICogQHZlcnNpb24gJE5hbWU6ICAkICgkUmV2aXNpb24kKSAkRGF0ZSQKLSAqLwotcHVibGljIGNsYXNzIFF1ZXVlCi17Ci0gIC8qKgotICAgKiBAcGFyYW0gc2l6ZSB0aGUgbWF4aW11bSBzaXplIG9mIHRoaXMgcXVldWUKLSAgICovCi0gIHB1YmxpYyBRdWV1ZShpbnQgc2l6ZSkKLSAgewotICAgIGlmIChzaXplPD0wKQotICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigic2l6ZSBpcyBub25wb3NpdGl2ZToiK3NpemUpOwotICAgIF9idWYgPSBuZXcgT2JqZWN0W3NpemVdOwotICB9Ci0KLSAgLyoqCi0gICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGlzIHF1ZXVlLiBUaGlzIHdpbGwgbmV2ZXIgYmUgbGFyZ2VyCi0gICAqIHRoYW4gdGhlIHtAbGluayAjUXVldWUoaW50KSBtYXhpbXVtIHNpemV9IG9mIHRoaXMgcXVldWUuCi0gICAqLwotICBwdWJsaWMgZmluYWwgc3luY2hyb25pemVkIGludCBzaXplKCkKLSAgewotICAgIHJldHVybiBfc2l6ZTsKLSAgfQotCi0gIC8qKgotICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHF1ZXVlIGhhcyBiZWVuIGNsb3NlZC4KLSAgICogQHNlZSAjY2xvc2UoKQotICAgKi8KLSAgcHVibGljIGZpbmFsIHN5bmNocm9uaXplZCBib29sZWFuIGlzQ2xvc2VkKCkKLSAgewotICAgIHJldHVybiBfY2xvc2VkOwotICB9Ci0KLSAgLyoqCi0gICAqIGNsb3NlcyB0aGlzIHF1ZXVlLiBBbnkgY29uc2VxdWVudCB7QGxpbmsgI2FkZChPYmplY3QpfSBtZXRob2QgY2FsbHMgd2lsbAotICAgKiBmYWlsLiAgQWxsIHtAbGluayAjZ2V0KCl9IG9wZXJhdGlvbnMgd2lsbCBzdWNjZWVkIHVudGlsIHRoZSBxdWV1ZSBpcwotICAgKiBlbXB0eS4gVGhpcyBtZXRob2QgbWF5IGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcy4KLSAgICogQHNlZSAjaXNDbG9zZWQoKQotICAgKi8KLSAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGNsb3NlKCkKLSAgewotICAgIF9jbG9zZWQgPSB0cnVlOwotICAgIG5vdGlmeUFsbCgpOwotICB9Ci0KLSAgLyoqCi0gICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcXVldWUgaXMgZnVsbCBhbmQgYSBjYWxsIHRvIHtAbGluayAjYWRkKE9iamVjdCl9Ci0gICAqIHdvdWxkIGJsb2NrLgotICAgKi8KLSAgcHVibGljIGZpbmFsIGJvb2xlYW4gaXNGdWxsKCkKLSAgewotICAgIHJldHVybiAoc2l6ZSgpID09IF9idWYubGVuZ3RoKTsKLSAgfQotCi0gIC8qKgotICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHF1ZXVlIGlzIGVtcHR5IGFuZCBhIGNhbGwgdG8ge0BsaW5rICNnZXQoKX0KLSAgICogd291bGQgYmxvY2suCi0gICAqLwotICBwdWJsaWMgZmluYWwgYm9vbGVhbiBpc0VtcHR5KCkKLSAgewotICAgIHJldHVybiAoc2l6ZSgpID09IDApOwotICB9Ci0KLSAgLyoqCi0gICAqIFRoaXMgbWV0aG9kIGJsb2NrcyB1bnRpbCBzcGFjZSBpcyBhdmFpbGFibGUgaW4gdGhpcyBxdWV1ZS4KLSAgICogQHBhcmFtIG9iaiB0aGUgT2JqZWN0IHRvIGFkZCB0byB0aGUgZW5kIG9mIHRoaXMgcXVldWUuIG51bGwgaXMgcGVybWl0dGVkLgotICAgKiBAZXhjZXB0aW9uIEludGVycnVwdGVkRXhjZXB0aW9uIGlmIHRoZSBjdXJyZW50IHRocmVhZCBpcyBpbnRlcnJ1cHRlZC4KLSAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgcXVldWUgaXMgY2xvc2VkLgotICAgKiBAc2VlICNjbG9zZSgpCi0gICAqIEBzZWUgI3JlbW92ZSgpCi0gICAqLwotICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgYWRkKE9iamVjdCBvYmopCi0gICAgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uLCBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KLSAgewotICAgIGZvcig7aXNGdWxsKCkgJiYgKCFpc0Nsb3NlZCgpKTspCi0gICAgewotICAgICAgLy95c3RlbS5vdXQucHJpbnRsbigid2FpdGluZyB0byBhZGQuIHNpemUiKTsKLSAgICAgIHdhaXQoKTsKLSAgICB9Ci0gICAgLy95c3RlbS5vdXQucHJpbnRsbigiYWRkaW5nLiBzaXplOiIrc2l6ZSgpKTsKLQotICAgIF9jaGVja0lzQ2xvc2VkKCk7Ci0KLSAgICBfYnVmW19oZWFkXSA9IG9iajsKLSAgICBfaGVhZCA9IF9pbmNJbmRleChfaGVhZCk7Ci0gICAgX3NpemUrKzsKLSAgICAvLyB5ZXMsIHdlIGFyZSB3YWtpbmcgdXAgYWxsIHRocmVhZHMsIGluY2x1ZGluZyB0aG9zZSB0aGF0IGFyZQotICAgIC8vIHdhaXRpbmcgdG8gZG8gYW4gYWRkLiBUaGlzIG1heSBiZSBpbmVmZmljaWVudC4KLSAgICAvLyBub3RlIHRoYXQgd2UgbXVzdCBkbyBub3RpZnlBbGwoKSBhbmQgbm90IG5vdGlmeSgpCi0gICAgbm90aWZ5QWxsKCk7Ci0gIH0KLQotICAvKioKLSAgICogVGhpcyBtZXRob2QgYmxvY2tzIHVudGlsIHNvbWUgZWxlbWVudCBpcyBhZGRlZCB0byB0aGlzIHF1ZXVlLCBvciB0aGUgcXVldWUKLSAgICogaXMgY2xvc2VkLgotICAgKiBAcmV0dXJuIHJlbW92ZXMgYW5kIHJldHVybnMgdGhlIE9iamVjdCBhdCB0aGUgZnJvbnQgb2YgdGhpcyBxdWV1ZS4KLSAgICogbnVsbCBtYXkgYmUgcmV0dXJuZWQgaWYgbnVsbCB3YXMgYWRkZWQgdXNpbmcge0BsaW5rICNhZGQoT2JqZWN0KX0KLSAgICogQGV4Y2VwdGlvbiBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZiB0aGUgY3VycmVudCB0aHJlYWQgaXMgaW50ZXJydXB0ZWQuCi0gICAqIEBleGNlcHRpb24gSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIHF1ZXVlIGlzIGNsb3NlZC4KLSAgICogQHNlZSAjY2xvc2UoKQotICAgKiBAc2VlICNhZGQoT2JqZWN0KQotICAgKiBAc2VlICNyZW1vdmUoTElzdCxpbnQpCi0gICAqLwotICBwdWJsaWMgc3luY2hyb25pemVkIE9iamVjdCByZW1vdmUoKQotICAgIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiwgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCi0gIHsKLSAgICBmb3IoO2lzRW1wdHkoKTspCi0gICAgewotICAgICAgX2NoZWNrSXNDbG9zZWQoKTsKLSAgICAgIHdhaXQoKTsKLSAgICB9Ci0KLSAgICBPYmplY3QgcmVzID0gX2J1ZltfdGFpbF07Ci0gICAgX2J1ZltfdGFpbF0gPSBudWxsOyAvLyBhbGxvdyBnYXJiYWdlIGNvbGxlY3QKLSAgICBfdGFpbCA9IF9pbmNJbmRleChfdGFpbCk7Ci0gICAgX3NpemUtLTsKLQotICAgIC8vIHllcywgd2UgYXJlIHdha2luZyB1cCBhbGwgdGhyZWFkcywgaW5jbHVkaW5nIHRob3NlIHRoYXQgYXJlCi0gICAgLy8gd2FpdGluZyB0byBkbyBhIHJlbW92ZS4gVGhpcyBtYXkgYmUgaW5lZmZpY2llbnQuCi0gICAgLy8gbm90ZSB0aGF0IHdlIG11c3QgZG8gbm90aWZ5QWxsKCkgYW5kIG5vdCBub3RpZnkoKQotICAgIG5vdGlmeUFsbCgpOwotICAgIHJldHVybiByZXM7Ci0gIH0KLQotICAvKioKLSAgICogUmVtb3ZlcyBtdWx0aXBsZSBlbGVtZW50cy4gVGhpcyBtZXRob2Qgd2lsbCBibG9jayB1bnRpbCB0aGVyZSBpcyBzb21ldGhpbmcKLSAgICogdG8gcmVtb3ZlLgotICAgKiBAcGFyYW0gY29sbGVjdG9yIGFsbCB0aGUgZWxlbWVudHMgcmVtb3ZlZCBmcm9tIHRoaXMgcXVldWUgYXJlIGFkZGVkIHRvCi0gICAqIHRoZSBlbmQgb2YgdGhpcyBMaXN0LgotICAgKiBAcGFyYW0gY291bnQgdGhlIG1heGltdW0gbnVtYmVyIG9mIGVsZW1lbnRzIHRvIHJlbW92ZS4gSWYgdGhpcyBpcyB6ZXJvLAotICAgKiB0aGVuIGl0IGRlZmF1bHRzIHRvIHRoZSBtYXhpbXVtIHNpemUgb2YgdGhpcyBxdWV1ZS4KLSAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGFjdHVhbGx5IHJlbW92ZWQuCi0gICAqIEBzZWUgI3JlbW92ZSgpCi0gICAqLwotICBwdWJsaWMgc3luY2hyb25pemVkIGludCByZW1vdmUoTGlzdCBjb2xsZWN0b3IsIGludCBjb3VudCkKLSAgICB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24sIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgotICB7Ci0gICAgY29sbGVjdG9yLmFkZChyZW1vdmUoKSk7Ci0KLSAgICBpbnQgc3ogPSBzaXplKCkrMTsKLSAgICBpZiAoKGNvdW50ID09IDApIHx8IChjb3VudCA+IHN6KSkKLSAgICAgIGNvdW50ID0gc3o7Ci0gICAgZWxzZSBpZiAoY291bnQgPCAwKQotICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY291bnQgaXMgbmVnYXRpdmUiKTsKLQotICAgIGludCByZWFkID0gMTsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBmb3IoO3JlYWQgPCBjb3VudDsgcmVhZCsrKQotICAgICAgewotICAgICAgICBjb2xsZWN0b3IuYWRkKHJlbW92ZSgpKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgY2F0Y2goSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgLy8gdGhpcyBzaG91bGQgbm90IGhhcHBlbiB1bmxlc3MgdGhlIHVzZXIgaGFzIHN1YmNsYXNzZWQgcmVtb3ZlKCkgYW5kCi0gICAgICAvLyBkb25lIHNvbWV0aGluZyB3ZWlyZAotICAgIH0KLSAgICBjYXRjaChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIC8vIHRoaXMgc2hvdWxkIG5vdCBoYXBwZW4gdW5sZXNzIHRoZSB1c2VyIGhhcyBzdWJjbGFzc2VkIHJlbW92ZSgpIGFuZAotICAgICAgLy8gZG9uZSBzb21ldGhpbmcgd2VpcmQKLQotICAgICAgLy8gbWFyayB0aGlzIHRocmVhZCBhcyBpbnRlcnJ1cHRlZCwgc28gdGhhdCBpdCBkb2Vzbid0IGJsb2NrIGFnYWluLgotICAgICAgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5pbnRlcnJ1cHQoKTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlYWQ7Ci0gIH0KLQotICBwcml2YXRlIGludCBfaW5jSW5kZXgoaW50IGluZGV4KQotICB7Ci0gICAgaW5kZXgrKzsKLSAgICByZXR1cm4gKGluZGV4IDwgX2J1Zi5sZW5ndGgpID8gaW5kZXggOiAwOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIF9jaGVja0lzQ2xvc2VkKCkKLSAgewotICAgIGlmIChpc0Nsb3NlZCgpKQotICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiUXVldWUgaGFzIGJlZW4gY2xvc2VkIik7Ci0gIH0KLQotICBwcml2YXRlIGZpbmFsIE9iamVjdFtdIF9idWY7Ci0gIHByaXZhdGUgYm9vbGVhbiBfY2xvc2VkID0gZmFsc2U7Ci0gIHByaXZhdGUgaW50IF9zaXplID0gMCwgX2hlYWQgPSAwLCBfdGFpbCA9IDA7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC91aXh0b29scy9SZWR1Y2VyLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L3VpeHRvb2xzL1JlZHVjZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGIwMjllNS4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L3VpeHRvb2xzL1JlZHVjZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNiArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC51aXh0b29sczsKLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZVJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLkZpbGVXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwotCi0vKioKLSAqIFJlZHVjZXMgSmF2YVNjcmlwdCBmaWxlcyBieSBzdHJpcHBpbmcgY29tbWVudHMgYW5kIHJlZHVuZGFudCB3aGl0ZXNwYWNlCi0gKiBhbmQgcmVuYW1pbmcgbG9jYWwgdmFyaWFibGUgbmFtZXMgdG8gc2hvcnRlciBvbmVzLgotICogQHZlcnNpb24gJE5hbWU6ICAkICgkUmV2aXNpb24kKSAkRGF0ZSQKLSAqLwotcHVibGljIGNsYXNzIFJlZHVjZXIgZXh0ZW5kcyBGaWxlUHJvY2Vzc29yCi17Ci0gIC8qKgotICAgKiBjcmVhdGVzIGEgbmV3IFJlZHVjZXIuCi0gICAqIEBwYXJhbSB3aGl0ZXNwYWNlQ29tbWVudHMgaWYgdHJ1ZSByZW1vdmVzIGNvbW1lbnRzIGFuZCBleHRyYSB3aGl0ZXNwYWNlCi0gICAqIEBwYXJhbSBsb2NhbFZhcnMgaWYgdHJ1ZSByZW5hbWVzIGxvY2FsIHZhcmlhYmxlIG5hbWVzIHRvIHNob3J0ZXIgb25lcy4KLSAgICovCi0gIHB1YmxpYyBSZWR1Y2VyKGJvb2xlYW4gd2hpdGVzcGFjZUNvbW1lbnRzLCBib29sZWFuIGxvY2FsVmFycykKLSAgewotICAgIHN1cGVyKCIuanMiLCBmYWxzZSk7Ci0gICAgX1NUUklQX1dISVRFU1BBQ0VfQ09NTUVOVFMgPSB3aGl0ZXNwYWNlQ29tbWVudHM7Ci0gICAgX1JFTkFNRV9MT0NBTF9WQVJJQUJMRVMgPSBsb2NhbFZhcnM7Ci0gIH0KLQotICBwdWJsaWMgUmVkdWNlcigpCi0gIHsKLSAgICB0aGlzKHRydWUsIHRydWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIHJlZHVjZXMgYSBKYXZhU2NyaXB0IGZpbGUuCi0gICAqIEBwYXJhbSBpbiB0aGUgc291cmNlIHRvIHJlYWQgZnJvbQotICAgKiBAcGFyYW0gb3V0IHRoZSBzb3VyY2UgdG8gd3JpdGUgdGhlIHJlZHVjZWQgZm9ybSB0bwotICAgKi8KLSAgcHVibGljIHZvaWQgcHJvY2VzcyhCdWZmZXJlZFJlYWRlciBpbiwgUHJpbnRXcml0ZXIgb3V0KQotICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24KLSAgewotICAgIFRva2VuUmVhZGVyIHRyID0gbmV3IFRva2VuaXplcihpbik7Ci0gICAgaWYgKF9TVFJJUF9XSElURVNQQUNFX0NPTU1FTlRTKSB0ciA9IG5ldyBGaWx0ZXIxKHRyKTsKLSAgICBpZiAoX1JFTkFNRV9MT0NBTF9WQVJJQUJMRVMpIHRyID0gbmV3IEZpbHRlcjIodHIpOwotICAgIERldG9rZW5pemVyIGRldG9rID0gbmV3IERldG9rZW5pemVyKG91dCk7Ci0gICAgZm9yKDs7KQotICAgIHsKLSAgICAgIFRva2VuIHRvayA9IHRyLnJlYWQoKTsKLSAgICAgIGlmICh0b2s9PW51bGwpIGJyZWFrOwotICAgICAgZWxzZSBkZXRvay53cml0ZSh0b2spOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBAc2VlIEZpbGVQcm9jZXNzb3IjcHJvY2Vzc0ZpbGUoRmlsZSwgRmlsZSkKLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NGaWxlKEZpbGUgaW4sIEZpbGUgb3V0KQotICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24KLSAgewotICAgIEJ1ZmZlcmVkUmVhZGVyIHJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgRmlsZVJlYWRlcihpbikpOwotICAgIFByaW50V3JpdGVyIHdyaXRlciA9ICBuZXcgUHJpbnRXcml0ZXIobmV3IEZpbGVXcml0ZXIob3V0KSk7Ci0gICAgcHJvY2VzcyhyZWFkZXIsIHdyaXRlcik7Ci0gICAgd3JpdGVyLmNsb3NlKCk7Ci0gICAgcmVhZGVyLmNsb3NlKCk7Ci0gIH0KLQotICBwcml2YXRlIHN0YXRpYyB2b2lkIF9oZWxwKCkKLSAgewotICAgIFN0cmluZyBzOwotICAgIHMgPSAiUmVkdWNlcyBKYXZhU2NyaXB0IHNvdXJjZSBjb2RlXG4iICsKLSAgICAgICJVc2FnZTpcbiIgKwotICAgICAgImphdmEgb3JhY2xlLnVpeC50b29scy51aXgyMi5qYXZhc2NyaXB0LlJlZHVjZXIiICsKLSAgICAgICIgWy1ub3JlbmFtZV0gWy13aGl0ZXNwYWNlXSBbLWhlbHBdIGlucHV0IG91dHB1dCBcbiIgKwotICAgICAgIiBpbnB1dC9vdXRwdXQgY2FuIGJlIGVpdGhlciBmaWxlcyBvciBkaXJlY3Rvcmllcy5cbiIgKwotICAgICAgIiBEaXJlY3RvcmllcyB3aWxsIGJlIHByb2Nlc3NlZCByZWN1cnNpdmVseS5cbiIgKwotICAgICAgIiBPbmx5IGZpbGVzIHdpdGggbmFtZXMgdGhhdCBlbmQgd2l0aCAuanMgd2lsbCBiZSBwcm9jZXNzZWQuXG4iICsKLSAgICAgICIgLW5vcmVuYW1lIHByZXZlbnRzIHJlbmFtaW5nIGxvY2FsIHZhcmlhYmxlcyB0byBzaG9ydCBvbmVzXG4iICsKLSAgICAgICIgLXdoaXRlc3BhY2UgcHJldmVudHMgcmVtb3ZpbmcgY29tbWVudHMgYW5kIGV4dHJhIHdoaXRlc3BhY2VcbiIgKwotICAgICAgIiAtaGVscCBwcmludHMgdGhpcyBtZXNzYWdlLiI7Ci0gICAgU3lzdGVtLm91dC5wcmludGxuKHMpOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykKLSAgewotICAgIGJvb2xlYW4gcmVuYW1lID0gdHJ1ZTsKLSAgICBib29sZWFuIHNwYWNlID0gdHJ1ZTsKLQotICAgIGZpbmFsIGludCBzeiA9IGFyZ3MubGVuZ3RoLTI7Ci0KLSAgICBpZiAoc3o8MCkKLSAgICB7Ci0gICAgICBfaGVscCgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGZvcihpbnQgaT0wOyBpPHN6OyBpKyspCi0gICAgewotICAgICAgU3RyaW5nIHMgPSBhcmdzW2ldOwotICAgICAgaWYgKHMuZXF1YWxzKCItaGVscCIpKSBfaGVscCgpOwotICAgICAgZWxzZSBpZiAocy5lcXVhbHMoIi1ub3JlbmFtZSIpKSByZW5hbWUgPSBmYWxzZTsKLSAgICAgIGVsc2UgaWYgKHMuZXF1YWxzKCItd2hpdGVzcGFjZSIpKSBzcGFjZSA9IGZhbHNlOwotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlVua25vd24gb3B0aW9uOiIrcyk7Ci0gICAgICAgIF9oZWxwKCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBGaWxlIGluID0gbmV3IEZpbGUoYXJnc1tzel0pOwotICAgIEZpbGUgb3V0ID0gbmV3IEZpbGUoYXJnc1tzeisxXSk7Ci0gICAgUmVkdWNlciByZWR1Y2VyID0gbmV3IFJlZHVjZXIoc3BhY2UsIHJlbmFtZSk7Ci0gICAgcmVkdWNlci5wcm9jZXNzKGluLCBvdXQpOwotICB9Ci0KLSAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIF9TVFJJUF9XSElURVNQQUNFX0NPTU1FTlRTOwotICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gX1JFTkFNRV9MT0NBTF9WQVJJQUJMRVM7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC91aXh0b29scy9Ub2tlbi5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC91aXh0b29scy9Ub2tlbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyM2IzNDEyLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvdWl4dG9vbHMvVG9rZW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LnVpeHRvb2xzOwotCi0vKioKLSAqIFRva2VucyBmb3IgSmF2YVNjcmlwdCBzb3VyY2UgY29kZQotICogQHZlcnNpb24gJE5hbWU6ICAkICgkUmV2aXNpb24kKSAkRGF0ZSQKLSAqLwotcHVibGljIGNsYXNzIFRva2VuCi17Ci0KLSAgcHVibGljIFRva2VuKGludCBjb2RlLCBpbnQgbGluZU51bWJlcikKLSAgewotICAgIHRoaXMoY29kZSwgbGluZU51bWJlciwgKGNoYXIpIDAsIChTdHJpbmcpIG51bGwpOwotICB9Ci0KLSAgcHVibGljIFRva2VuKGludCBjb2RlLCBpbnQgbGluZU51bWJlciwgY2hhciBjaCkKLSAgewotICAgIHRoaXMoY29kZSwgbGluZU51bWJlciwgY2gsIChTdHJpbmcpIG51bGwpOwotICB9Ci0KLSAgcHVibGljIFRva2VuKGludCBjb2RlLCBpbnQgbGluZU51bWJlciwgU3RyaW5nIHMpCi0gIHsKLSAgICB0aGlzKGNvZGUsIGxpbmVOdW1iZXIsIChjaGFyKSAwLCBzKTsKLSAgfQotCi0gIHB1YmxpYyBUb2tlbihpbnQgY29kZSwgaW50IGxpbmVOdW1iZXIsIGNoYXIgY2gsIFN0cmluZyBzKQotICB7Ci0gICAgdGhpcy5jb2RlPWNvZGU7Ci0gICAgdGhpcy5saW5lTnVtYmVyID0gbGluZU51bWJlcjsKLSAgICB0aGlzLmNoPWNoOwotICAgIHN0cmluZyA9IHM7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLSAgewotICAgIHJldHVybiAiVG9rZW4gY29kZToiK2NvZGUrIiBsaW5lOiIrbGluZU51bWJlcisKLSAgICAgICIgY2hhcjoiK2NoKyIgc3RyaW5nOiIrc3RyaW5nOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIGludCBjb2RlLCBsaW5lTnVtYmVyOwotICBwdWJsaWMgZmluYWwgY2hhciBjaDsKLSAgcHVibGljIGZpbmFsIFN0cmluZyBzdHJpbmc7Ci0KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRU9GID0gICAgICAgICAgICAgICAgIDA7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5FV0xJTkUgPSAgICAgICAgICAgICAxMDsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0hJVEVTUEFDRSA9ICAgICAgICAgIDExOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQRVJJT0QgPSAgICAgICAgICAgICAgMTI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNFTUlDT0xPTiA9ICAgICAgICAgICAxMzsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUVVPVEVEID0gICAgICAgICAgICAgIDIwOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOQU1FID0gICAgICAgICAgICAgICAgMzA7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5VTUJFUiA9ICAgICAgICAgICAgICA0MDsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09NTUVOVCA9ICAgICAgICAgICAgIDUwOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRUdVTEFSX0VYUCA9ICAgICAgICAgNjA7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFR1VMQVJfRVhQX01PRElGSUVSID02NTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09OVFJPTCA9ICAgICAgICAgICAgIDEwMDsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTEVGVF9CUkFDRSA9ICAgICAgICAgIDExMDsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUklHSFRfQlJBQ0UgPSAgICAgICAgIDEyMDsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVTRVJWRUQgPSAgICAgICAgICAgIDIwMDsgLy9yZXNlcnZlZCB3b3JkcwotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC91aXh0b29scy9Ub2tlbkJ1ZmZlci5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC91aXh0b29scy9Ub2tlbkJ1ZmZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MmNjMDMxLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvdWl4dG9vbHMvVG9rZW5CdWZmZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LnVpeHRvb2xzOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotLyoqCi0gKiBBIGJ1ZmZlciB0byBob2xkIFRva2VuIG9iamVjdHMuIFRva2VucyBjYW4gYmUgcmVhZCBmcm9tIGFuZCB3cml0dGVuIHRvIHRoaXMKLSAqIGJ1ZmZlciBhcyBpZiBpdCB3ZXJlIGEgcXVldWUuIGl0IGlzIHRocmVhZCBzYWZlLiBCZXN0IGlmIGEgc2luZ2xlIHRocmVhZCBpcwotICogcmVhZGluZyBhbmQgYSBzaW5nbGUgdGhyZWFkIGlzIHdyaXRpbmcuCi0gKiBAdmVyc2lvbiAkTmFtZTogICQgKCRSZXZpc2lvbiQpICREYXRlJAotICovCi1wdWJsaWMgY2xhc3MgVG9rZW5CdWZmZXIgZXh0ZW5kcyBRdWV1ZSBpbXBsZW1lbnRzIFRva2VuUmVhZGVyCi17Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBidWZmZXJTaXplIHRoZSBtYXhpbXVtIHNpemUgb2YgdGhpcyBidWZmZXIuCi0gICAqLwotICBwdWJsaWMgVG9rZW5CdWZmZXIoaW50IGJ1ZmZlclNpemUpCi0gIHsKLSAgICBzdXBlcihidWZmZXJTaXplKTsKLSAgfQotCi0gIHB1YmxpYyBUb2tlbkJ1ZmZlcigpCi0gIHsKLSAgICB0aGlzKDEwMCk7Ci0gIH0KLQotICAvKioKLSAgICogcmVhZHMgYSBUb2tlbiBmcm9tIHRoaXMgYnVmZmVyLiBUaGlzIG1ldGhvZCBibG9ja3MgdW50aWwgZGF0YSBpcyBhdmFpbGFibGUKLSAgICogQHJldHVybiBudWxsIGlmIHRoZXJlIGlzIG5vIG1vcmUgZGF0YSBhbmQgdGhpcyBidWZmZXIgaGFzIGJlZW4gY2xvc2VkLgotICAgKiBAc2VlIFRva2VuUmVhZGVyCi0gICAqLwotICBwdWJsaWMgc3luY2hyb25pemVkIFRva2VuIHJlYWQoKSB0aHJvd3MgSU9FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uCi0gIHsKLSAgICBUb2tlbiB0b2s7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgdG9rID0gKFRva2VuKSBzdXBlci5yZW1vdmUoKTsKLSAgICB9Ci0gICAgY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIHRvayA9IG51bGw7Ci0gICAgfQotCi0gICAgaWYgKHRvaz09X0VYQ0VQVElPTl9UT0tFTikKLSAgICB7Ci0gICAgICB0aHJvdyBfZ2V0RXhjZXB0aW9uKCk7Ci0gICAgfQotICAgIHJldHVybiB0b2s7Ci0gIH0KLQotICAvKioKLSAgICogVGhpcyBtZXRob2QgYmxvY2tzIGlmIHRoZSBidWZmZXIgaXMgZnVsbC4KLSAgICogQHBhcmFtIHRvayB0aGUgdG9rZW4gdG8gd3JpdGUgdG8gdGhpcyBidWZmZXIKLSAgICovCi0gIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCB3cml0ZShUb2tlbiB0b2spIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbgotICB7Ci0gICAgc3VwZXIuYWRkKHRvayk7Ci0gIH0KLQotICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgd3JpdGUoSU9FeGNlcHRpb24gZSkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uCi0gIHsKLSAgICBfc2V0RXhjZXB0aW9uKGUpOwotICAgIHdyaXRlKF9FWENFUFRJT05fVE9LRU4pOwotICAgIGNsb3NlKCk7Ci0gIH0KLQotICBwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIF9zZXRFeGNlcHRpb24oSU9FeGNlcHRpb24gZSkKLSAgewotICAgIF9leGNlcHRpb24gPSBlOwotICB9Ci0KLSAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgSU9FeGNlcHRpb24gX2dldEV4Y2VwdGlvbigpCi0gIHsKLSAgICByZXR1cm4gX2V4Y2VwdGlvbjsKLSAgfQotCi0gIHByaXZhdGUgSU9FeGNlcHRpb24gX2V4Y2VwdGlvbiA9IG51bGw7Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgVG9rZW4gX0VYQ0VQVElPTl9UT0tFTiA9IG5ldyBUb2tlbigtMSwgMCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC91aXh0b29scy9Ub2tlbkV4Y2VwdGlvbi5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC91aXh0b29scy9Ub2tlbkV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YzEwYjA3Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvdWl4dG9vbHMvVG9rZW5FeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LnVpeHRvb2xzOwotCi0vKioKLSAqIEB2ZXJzaW9uICROYW1lOiAgJCAoJFJldmlzaW9uJCkgJERhdGUkCi0gKi8KLXB1YmxpYyBjbGFzcyBUb2tlbkV4Y2VwdGlvbiBleHRlbmRzIFJ1bnRpbWVFeGNlcHRpb24KLXsKLSAgcHJpdmF0ZSBmaW5hbCBUb2tlbiBfdG9rZW47Ci0KLSAgcHVibGljIFRva2VuRXhjZXB0aW9uKFRva2VuIHRva2VuLCBTdHJpbmcgbWVzc2FnZSkKLSAgewotICAgIHN1cGVyKG1lc3NhZ2UpOwotICAgIF90b2tlbiA9IHRva2VuOwotICB9Ci0KLSAgcHVibGljIFRva2VuIGdldFRva2VuKCkKLSAgewotICAgIHJldHVybiBfdG9rZW47Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L3VpeHRvb2xzL1Rva2VuUmVhZGVyLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L3VpeHRvb2xzL1Rva2VuUmVhZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhODZhNzUuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC91aXh0b29scy9Ub2tlblJlYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQudWl4dG9vbHM7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi0vKioKLSAqIEB2ZXJzaW9uICROYW1lOiAgJCAoJFJldmlzaW9uJCkgJERhdGUkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVG9rZW5SZWFkZXIKLXsKLQotICAvKgotICAgKiBSZWFkcyBhIFRva2VuIGZyb20gdGhpcyBzb3VyY2UuIFRoaXMgbWV0aG9kIHdpbGwgYmxvY2sgdW50aWwgZGF0YQotICAgKiBiZWNvbWVzIGF2YWlsYWJsZS4KLSAgICogQHJldHVybiBudWxsIGlmIHRoZXJlIGlzIG5vIG1vcmUgZGF0YSBhbmQgRU9GIGlzIHJlYWNoZWQuCi0gICAqLwotICBwdWJsaWMgVG9rZW4gcmVhZCgpIHRocm93cyBJT0V4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb247Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC91aXh0b29scy9Ub2tlbml6ZXIuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvdWl4dG9vbHMvVG9rZW5pemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2N2ViZTUuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC91aXh0b29scy9Ub2tlbml6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyMyArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC51aXh0b29sczsKLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotLyoqCi0gKiBBIFRva2VuaXplciBmb3IgSmF2YVNjcmlwdCBzb3VyY2UgZmlsZXMuCi0gKiBAdmVyc2lvbiAkTmFtZTogICQgKCRSZXZpc2lvbiQpICREYXRlJAotICovCi1wdWJsaWMgY2xhc3MgVG9rZW5pemVyIGltcGxlbWVudHMgVG9rZW5SZWFkZXIKLXsKLQotICAvKioKLSAgICogQHBhcmFtIGluIHVzZWQgdG8gcmVhZCBkYXRhIGZyb20gdGhlIEpTIGZpbGUKLSAgICovCi0gIHB1YmxpYyBUb2tlbml6ZXIoQnVmZmVyZWRSZWFkZXIgaW4pCi0gIHsKLSAgICBfaW4gPSBpbjsKLSAgICBSdW5uYWJsZSBydW5uZXIgPSBuZXcgUnVubmFibGUoKQotICAgICAgewotICAgICAgICBwdWJsaWMgdm9pZCBydW4oKQotICAgICAgICB7Ci0gICAgICAgICAgLy95c3RlbS5vdXQucHJpbnRsbigiVG9rZW5pemVyOiBzdGFydDoiK1RocmVhZC5jdXJyZW50VGhyZWFkKCkpOwotICAgICAgICAgIF9ydW4oKTsKLSAgICAgICAgICAvL3lzdGVtLm91dC5wcmludGxuKCJUb2tlbml6ZXI6IGVuZDoiK1RocmVhZC5jdXJyZW50VGhyZWFkKCkpOwotICAgICAgICB9Ci0gICAgICB9OwotICAgIG5ldyBUaHJlYWQocnVubmVyKS5zdGFydCgpOwotICB9Ci0KLSAgLyoqCi0gICAqIHJlYWRzIGEgVG9rZW4uIGJsb2NrcyB1bnRpbCBhIFRva2VuIGlzIGF2YWlsYWJsZS4KLSAgICogQHJldHVybiBudWxsIGlmIHRoZSBFT0YgaXMgcmVhY2hlZC4KLSAgICovCi0gIHB1YmxpYyBUb2tlbiByZWFkKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbgotICB7Ci0gICAgcmV0dXJuIF9vdXQucmVhZCgpOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIF9ydW4oKQotICB7Ci0gICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIF9ydW4yKCk7Ci0gICAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkV4Y2VwdGlvbiBwYXJzaW5nIGxpbmU6IitfbGluZU51bWJlcik7Ci0gICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICB9Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgX3J1bjIoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24KLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIGZvcig7X2ZpbGxCdWZmZXIoKTspCi0gICAgICB7Ci0gICAgICAgIC8veXN0ZW0ub3V0LnByaW50bG4oImJlZ2luIHByb2Nlc3MiKTsKLSAgICAgICAgX3Byb2Nlc3NCdWZmZXIoKTsKLSAgICAgICAgLy95c3RlbS5vdXQucHJpbnRsbigiZW5kIHByb2Nlc3MiKTsKLSAgICAgIH0KLSAgICAgIF9vdXQud3JpdGUobmV3IFRva2VuKFRva2VuLkVPRiwgX2xpbmVOdW1iZXIpKTsKLSAgICB9Ci0gICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJFeGNlcHRpb24gcGFyc2luZyBsaW5lOiIrX2xpbmVOdW1iZXIpOwotICAgICAgX291dC53cml0ZShlKTsKLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICBfb3V0LndyaXRlKG5ldyBJT0V4Y2VwdGlvbigiRXhjZXB0aW9uIHBhcnNpbmcgbGluZToiK19saW5lTnVtYmVyKSk7Ci0gICAgfQotICAgIGZpbmFsbHkKLSAgICB7Ci0gICAgICBfb3V0LmNsb3NlKCk7Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIF9wcm9jZXNzQnVmZmVyKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uCi0gIHsKLSAgICBfb2Zmc2V0ID0gMDsKLQotICAgIGZvcig7X29mZnNldDxfbGVuOykKLSAgICAgIHsKLSAgICAgICAgLy95c3RlbS5vdXQucHJpbnRsbigibGluZToiK19saW5lTnVtYmVyKyIgb2Zmc2V0OiIrX29mZnNldCk7Ci0gICAgICAgIGNoYXIgY2ggPSBfYnVmZmVyLmNoYXJBdChfb2Zmc2V0KyspOwotICAgICAgICBzd2l0Y2goX3N0YXR1cykKLSAgICAgICAgICB7Ci0gICAgICAgICAgY2FzZSBST09UX01PREUgOgotICAgICAgICAgIGNhc2UgRElWSVNJT05fTU9ERSA6Ci0gICAgICAgICAgICBfbmV4dCA9IF9yb290TW9kZShjaCwgX3N0YXR1cyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIFJFQURfV09SRF9NT0RFIDoKLSAgICAgICAgICAgIF9uZXh0ID0gX3JlYWRXb3JkTW9kZShjaCwgX3N0YXR1cywgX3N0cik7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIFFVT1RFMV9NT0RFIDoKLSAgICAgICAgICBjYXNlIFFVT1RFMl9NT0RFIDoKLSAgICAgICAgICAgIF9uZXh0ID0gX3F1b3RlTW9kZShjaCwgX3N0YXR1cywgX3ByZXYsIF9zdHIpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSBFU0NBUEVEX0NIQVJfTU9ERSA6Ci0gICAgICAgICAgICBfc3RyLmFwcGVuZCgnXFwnKTsKLSAgICAgICAgICAgIF9zdHIuYXBwZW5kKGNoKTsKLSAgICAgICAgICAgIF9uZXh0ID0gX3ByZXY7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIFBPU1NJQkxFX0NPTU1FTlRfTU9ERSA6Ci0gICAgICAgICAgICBpZiAoY2g9PScvJykgX25leHQgPSBDT01NRU5UMV9NT0RFOwotICAgICAgICAgICAgZWxzZSBpZiAoY2g9PScqJykgX25leHQgPSBDT01NRU5UMl9NT0RFOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgX29mZnNldC0tOyAvL1JvbGwgQmFjayBvbmUKLSAgICAgICAgICAgICAgICBpZiAoX3ByZXYgPT0gRElWSVNJT05fTU9ERSkKLSAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgX3dyaXRlQ29udHJvbCgnLycpOwotICAgICAgICAgICAgICAgICAgICBfbmV4dCA9IFJPT1RfTU9ERTsKLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIF9uZXh0ID0gUkVHVUxBUl9FWFBfTU9ERTsKLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSBDT01NRU5UMV9NT0RFIDoKLSAgICAgICAgICBjYXNlIENPTU1FTlQyX01PREUgOgotICAgICAgICAgIGNhc2UgRU5EX0NPTU1FTlRfTU9ERSA6Ci0gICAgICAgICAgICBfbmV4dCA9IF9jb21tZW50TW9kZShjaCwgX3N0YXR1cywgX3N0cik7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIFJFR1VMQVJfRVhQX01PREUgOgotICAgICAgICAgICAgX25leHQgPSBfcmVndWxhckV4cE1vZGUoY2gsIF9zdHIpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSBFTkRfUkVHVUxBUl9FWFBfTU9ERSA6Ci0gICAgICAgICAgICBpZiAoKGNoPT0nZycpIHx8IChjaD09J2knKSkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIF9vdXQud3JpdGUobmV3IFRva2VuKFRva2VuLlJFR1VMQVJfRVhQX01PRElGSUVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9saW5lTnVtYmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoKSk7Ci0gICAgICAgICAgICAgICAgX25leHQgPSBFTkRfUkVHVUxBUl9FWFBfTU9ERTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgX29mZnNldC0tOyAvL1JvbGxiYWNrCi0gICAgICAgICAgICAgICAgX25leHQgPSBST09UX01PREU7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgX3ByZXYgPSBfc3RhdHVzOwotICAgICAgICBfc3RhdHVzID0gX25leHQ7Ci0gICAgICB9Ci0gIH0KLQotICBwcml2YXRlIGludCBfcm9vdE1vZGUoY2hhciBjaCwgaW50IHN0YXR1cykgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uCi0gIHsKLSAgICBzd2l0Y2goY2gpCi0gICAgICB7Ci0gICAgICBjYXNlICdcJycgOgotICAgICAgICByZXR1cm4gUVVPVEUxX01PREU7Ci0gICAgICBjYXNlICdcIicgOgotICAgICAgICByZXR1cm4gUVVPVEUyX01PREU7Ci0gICAgICBjYXNlICcgJyAgOgotICAgICAgY2FzZSAnXHQnIDoKLSAgICAgICAgX291dC53cml0ZShXSElURVNQQUNFKTsKLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICAgIGNhc2UgJ1xuJyA6Ci0gICAgICAgIF9vdXQud3JpdGUoTkVXTElORSk7Ci0gICAgICAgIHJldHVybiBST09UX01PREU7Ci0gICAgICBjYXNlICcuJyA6Ci0gICAgICAgIF9vdXQud3JpdGUoUEVSSU9EKTsKLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICAgIGNhc2UgJzsnIDoKLSAgICAgICAgX291dC53cml0ZShTRU1JQ09MT04pOwotICAgICAgICByZXR1cm4gUk9PVF9NT0RFOwotICAgICAgY2FzZSAnKCcgOgotICAgICAgY2FzZSAneycgOgotICAgICAgY2FzZSAnWycgOgotICAgICAgICBfb3V0LndyaXRlKG5ldyBUb2tlbihUb2tlbi5MRUZUX0JSQUNFLCBfbGluZU51bWJlciwgY2gpKTsKLSAgICAgICAgcmV0dXJuIFJPT1RfTU9ERTsKLSAgICAgIGNhc2UgJyknIDoKLSAgICAgICAgX291dC53cml0ZShuZXcgVG9rZW4oVG9rZW4uUklHSFRfQlJBQ0UsIF9saW5lTnVtYmVyLCBjaCkpOwotICAgICAgICByZXR1cm4gRElWSVNJT05fTU9ERTsKLSAgICAgIGNhc2UgJ30nIDoKLSAgICAgIGNhc2UgJ10nIDoKLSAgICAgICAgX291dC53cml0ZShuZXcgVG9rZW4oVG9rZW4uUklHSFRfQlJBQ0UsIF9saW5lTnVtYmVyLCBjaCkpOwotICAgICAgICByZXR1cm4gUk9PVF9NT0RFOwotICAgICAgY2FzZSAnLycgIDogcmV0dXJuIFBPU1NJQkxFX0NPTU1FTlRfTU9ERTsKLSAgICAgIGRlZmF1bHQgOgotICAgICAgICBpZiAoX2lzQWxwaGFOdW1lcmljKGNoKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBfb2Zmc2V0LS07IC8vUm9sbGJhY2sKLSAgICAgICAgICAgIHJldHVybiBSRUFEX1dPUkRfTU9ERTsKLSAgICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBfd3JpdGVDb250cm9sKGNoKTsKLSAgICAgICAgICAgIHJldHVybiBST09UX01PREU7Ci0gICAgICAgICAgfQotICAgICAgfQotICB9Ci0KLSAgcHJpdmF0ZSBpbnQgX3JlZ3VsYXJFeHBNb2RlKGNoYXIgY2gsIFN0cmluZ0J1ZmZlciByZWdFeHApCi0gICAgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uCi0gIHsKLSAgICBzd2l0Y2goY2gpCi0gICAgICB7Ci0gICAgICBjYXNlICdcXCcgOgotICAgICAgICByZXR1cm4gRVNDQVBFRF9DSEFSX01PREU7Ci0gICAgICBjYXNlICcvJyA6Ci0gICAgICAgIF9vdXQud3JpdGUobmV3IFRva2VuKFRva2VuLlJFR1VMQVJfRVhQLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfbGluZU51bWJlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnRXhwLnRvU3RyaW5nKCkpKTsKLSAgICAgICAgcmVnRXhwLnNldExlbmd0aCgwKTsKLSAgICAgICAgcmV0dXJuIEVORF9SRUdVTEFSX0VYUF9NT0RFOwotICAgICAgZGVmYXVsdCA6Ci0gICAgICAgIHJlZ0V4cC5hcHBlbmQoY2gpOwotICAgICAgICByZXR1cm4gUkVHVUxBUl9FWFBfTU9ERTsKLSAgICAgIH0KLSAgfQotCi0gIHByaXZhdGUgaW50IF9xdW90ZU1vZGUoY2hhciBjaCwgaW50IHN0YXR1cywgaW50IHByZXYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nQnVmZmVyIHF1b3RlU3RyaW5nKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24KLSAgewotICAgIGlmICgoKGNoPT0nXCcnKSAmJiAoc3RhdHVzPT1RVU9URTFfTU9ERSkpIHx8Ci0gICAgICAgICgoY2g9PSdcIicpICYmIChzdGF0dXM9PVFVT1RFMl9NT0RFKSkpCi0gICAgICB7Ci0gICAgICAgIF9vdXQud3JpdGUobmV3IFRva2VuKFRva2VuLlFVT1RFRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2xpbmVOdW1iZXIsIGNoLCBxdW90ZVN0cmluZy50b1N0cmluZygpKSk7Ci0gICAgICAgIHF1b3RlU3RyaW5nLnNldExlbmd0aCgwKTsKLSAgICAgICAgcmV0dXJuIFJPT1RfTU9ERTsKLSAgICAgIH0KLSAgICBlbHNlIGlmIChjaD09J1xcJykgcmV0dXJuIEVTQ0FQRURfQ0hBUl9NT0RFOwotICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgcXVvdGVTdHJpbmcuYXBwZW5kKGNoKTsKLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICAgIH0KLSAgfQotCi0gIHByaXZhdGUgaW50IF9jb21tZW50TW9kZShjaGFyIGNoLCBpbnQgc3RhdHVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nQnVmZmVyIGNvbW1lbnRTdHJpbmcpCi0gICAgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uCi0gIHsKLSAgICBpZiAoc3RhdHVzPT1FTkRfQ09NTUVOVF9NT0RFKQotICAgICAgewotICAgICAgICBpZiAoY2g9PScvJykKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBfd3JpdGVDb21tZW50KGNvbW1lbnRTdHJpbmcpOwotICAgICAgICAgICAgcmV0dXJuIFJPT1RfTU9ERTsKLSAgICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBjb21tZW50U3RyaW5nLmFwcGVuZCgnKicpOwotICAgICAgICAgICAgX29mZnNldC0tOyAvL1JvbGwgYmFjawotICAgICAgICAgICAgcmV0dXJuIENPTU1FTlQyX01PREU7Ci0gICAgICAgICAgfQotICAgICAgfQotICAgIGVsc2UgaWYgKChzdGF0dXM9PUNPTU1FTlQyX01PREUpICYmIChjaD09JyonKSkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIEVORF9DT01NRU5UX01PREU7Ci0gICAgICB9Ci0gICAgZWxzZSBpZiAoKHN0YXR1cz09Q09NTUVOVDFfTU9ERSkgJiYgKGNoPT0nXG4nKSkKLSAgICAgIHsKLSAgICAgICAgX3dyaXRlQ29tbWVudChjb21tZW50U3RyaW5nKTsKLSAgICAgICAgX291dC53cml0ZShORVdMSU5FKTsKLSAgICAgICAgcmV0dXJuIFJPT1RfTU9ERTsKLSAgICAgIH0KLSAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGNvbW1lbnRTdHJpbmcuYXBwZW5kKGNoKTsKLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICAgIH0KLSAgfQotCi0gIHByaXZhdGUgaW50IF9yZWFkV29yZE1vZGUoY2hhciBjaCwgaW50IHN0YXR1cywgU3RyaW5nQnVmZmVyIHdvcmRCdWZmZXIpCi0gICAgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uCi0gIHsKLSAgICBpZiAoX2lzQWxwaGFOdW1lcmljKGNoKSkKLSAgICAgIHsKLSAgICAgICAgd29yZEJ1ZmZlci5hcHBlbmQoY2gpOwotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgICAgfQotICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgX3dyaXRlQWxwaGFOdW1lcmljKHdvcmRCdWZmZXIudG9TdHJpbmcoKSk7Ci0gICAgICAgIHdvcmRCdWZmZXIuc2V0TGVuZ3RoKDApOwotICAgICAgICBfb2Zmc2V0LS07IC8vUm9sbGJhY2sKLSAgICAgICAgcmV0dXJuIERJVklTSU9OX01PREU7Ci0gICAgICB9Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgX3dyaXRlQ29tbWVudChTdHJpbmdCdWZmZXIgcykgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uCi0gIHsKLSAgICBfb3V0LndyaXRlKG5ldyBUb2tlbihUb2tlbi5DT01NRU5ULCBfbGluZU51bWJlciwgcy50b1N0cmluZygpKSk7Ci0gICAgcy5zZXRMZW5ndGgoMCk7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgX3dyaXRlQ29udHJvbChjaGFyIGNoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24KLSAgewotICAgIF9vdXQud3JpdGUobmV3IFRva2VuKFRva2VuLkNPTlRST0wsIF9saW5lTnVtYmVyLCBjaCkpOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIF93cml0ZUFscGhhTnVtZXJpYyhTdHJpbmcgcykgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uCi0gIHsKLSAgICBpZiAoQ2hhcmFjdGVyLmlzRGlnaXQocy5jaGFyQXQoMCkpKQotICAgICAgewotICAgICAgICBfb3V0LndyaXRlKG5ldyBUb2tlbihUb2tlbi5OVU1CRVIsIF9saW5lTnVtYmVyLCBzKSk7Ci0gICAgICB9Ci0gICAgZWxzZSBpZiAoX2lzUmVzZXJ2ZWRLZXl3b3JkKHMpKQotICAgICAgewotICAgICAgICBfb3V0LndyaXRlKG5ldyBUb2tlbihUb2tlbi5SRVNFUlZFRCwgX2xpbmVOdW1iZXIsIHMpKTsKLSAgICAgIH0KLSAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIF9vdXQud3JpdGUobmV3IFRva2VuKFRva2VuLk5BTUUsIF9saW5lTnVtYmVyLCBzKSk7Ci0gICAgICB9Ci0gIH0KLQotICBwcml2YXRlIGJvb2xlYW4gX2lzUmVzZXJ2ZWRLZXl3b3JkKFN0cmluZyBzKQotICB7Ci0gICAgZm9yKGludCBpPTA7IGk8cmVzZXJ2ZWRXb3Jkcy5sZW5ndGg7IGkrKykKLSAgICAgIHsKLSAgICAgICAgaWYgKHMuZXF1YWxzKHJlc2VydmVkV29yZHNbaV0pKSByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBwcml2YXRlIGJvb2xlYW4gX2lzQWxwaGFOdW1lcmljKGNoYXIgY2gpCi0gIHsKLSAgICByZXR1cm4gQ2hhcmFjdGVyLmlzTGV0dGVyT3JEaWdpdChjaCkgfHwgKGNoPT0nXycpIDsKLSAgfQotCi0gIC8qKgotICAgKiBAcmV0dXJuIGZhbHNlIGlmIEVPRgotICAgKi8KLSAgcHJpdmF0ZSBib29sZWFuIF9maWxsQnVmZmVyKCkgdGhyb3dzIElPRXhjZXB0aW9uCi0gIHsKLSAgICBfYnVmZmVyLnNldExlbmd0aCgwKTsKLSAgICBTdHJpbmcgcyA9IF9pbi5yZWFkTGluZSgpOwotICAgIGlmIChzPT1udWxsKQotICAgICAgewotICAgICAgICBfbGVuPTA7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIF9idWZmZXIuYXBwZW5kKHMpLmFwcGVuZCgnXG4nKTsKLSAgICAgICAgX2xlbiA9IF9idWZmZXIubGVuZ3RoKCk7Ci0gICAgICAgIF9saW5lTnVtYmVyKys7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIF9yZXNldCgpCi0gIHsKLSAgICBfc3RhdHVzID0gX3ByZXYgPSBfbmV4dCA9IFJPT1RfTU9ERTsKLSAgICBfYnVmZmVyLnNldExlbmd0aCgwKTsKLSAgICBfbGVuID0gX2xpbmVOdW1iZXIgPSBfb2Zmc2V0ID0gMDsKLSAgICBfd29yZEJ1ZmZlci5zZXRMZW5ndGgoMCk7Ci0gICAgX3N0ci5zZXRMZW5ndGgoMCk7Ci0gIH0KLQotICBwcml2YXRlIGludCBfc3RhdHVzID0gUk9PVF9NT0RFOwotICBwcml2YXRlIGludCBfcHJldiA9IFJPT1RfTU9ERTsKLSAgcHJpdmF0ZSBpbnQgX25leHQgPSBST09UX01PREU7Ci0KLSAgcHJpdmF0ZSBpbnQgX2xlbiA9IDA7Ci0gIHByaXZhdGUgaW50IF9saW5lTnVtYmVyID0gMDsKLSAgcHJpdmF0ZSBpbnQgX29mZnNldCA9IDA7Ci0KLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmdCdWZmZXIgX2J1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmdCdWZmZXIgX3dvcmRCdWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nQnVmZmVyIF9zdHIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0KLSAgcHJpdmF0ZSBmaW5hbCBCdWZmZXJlZFJlYWRlciBfaW47Ci0gIHByaXZhdGUgZmluYWwgVG9rZW5CdWZmZXIgX291dCA9IG5ldyBUb2tlbkJ1ZmZlcigpOwotCi0gIC8qKgotICAgKiBUaGVzZSBhcmUgbm90IGFsbCB0aGUgcmVzZXJ2ZWQgd29yZHMgaW4gSlMgYnV0IGFyZSB0aGUgb25seSBvbmVzCi0gICAqIGltcG9ydGFudCB0byB0aGUgZmlsdGVycy4KLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIHJlc2VydmVkV29yZHMgPQotICB7Ci0gICAgImZ1bmN0aW9uIiwgInZhciIKLSAgfTsKLQotICBwcml2YXRlIGZpbmFsIFRva2VuIE5FV0xJTkUgPSBuZXcgVG9rZW4oVG9rZW4uTkVXTElORSwgMCk7Ci0gIHByaXZhdGUgZmluYWwgVG9rZW4gV0hJVEVTUEFDRSA9IG5ldyBUb2tlbihUb2tlbi5XSElURVNQQUNFLCAwKTsKLSAgcHJpdmF0ZSBmaW5hbCBUb2tlbiBQRVJJT0QgPSBuZXcgVG9rZW4oVG9rZW4uUEVSSU9ELCAwKTsKLSAgcHJpdmF0ZSBmaW5hbCBUb2tlbiBTRU1JQ09MT04gPSBuZXcgVG9rZW4oVG9rZW4uU0VNSUNPTE9OLCAwKTsKLQotICAvKioKLSAgICogVGhlc2UgYXJlIHRoZSBGU00gc3RhdGVzCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUk9PVF9NT0RFID0gMDsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJFQURfV09SRF9NT0RFID0gMTA7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBESVZJU0lPTl9NT0RFID0gMTU7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBRVU9URTFfTU9ERSA9IDIwOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUVVPVEUyX01PREUgPSAzMDsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVTQ0FQRURfQ0hBUl9NT0RFID0gNDA7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQT1NTSUJMRV9DT01NRU5UX01PREUgPSA1MDsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENPTU1FTlQxX01PREUgPSA2MDsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENPTU1FTlQyX01PREUgPSA3MDsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVORF9DT01NRU5UX01PREUgPSA4MDsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJFR1VMQVJfRVhQX01PREUgPSA5MDsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVORF9SRUdVTEFSX0VYUF9NT0RFID0gOTU7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9tZG8vYXNzZW1ibGVyLm1kbyBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vbWRvL2Fzc2VtYmxlci5tZG8KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlOTQxNTQuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9tZG8vYXNzZW1ibGVyLm1kbworKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4NCi0NCi08IS0tDQotICB+IENvcHlyaWdodCAyMDA2IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4NCi0gIH4NCi0gIH4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQotICB+IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCi0gIH4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICB+DQotICB+ICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICB+DQotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCi0gIH4gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gIH4gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotICB+IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCi0gIH4gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQotICAtLT4NCi0NCi08bW9kZWwgeHNkLm5hbWVzcGFjZT0iaHR0cDovL21vam8uY29kZWhhdXMub3JnL2phdmFzY3JpcHQtbWF2ZW4tcGx1Z2luIj4NCi0gIDxpZD5hc3NlbWJsZXI8L2lkPg0KLSAgPG5hbWU+QXNzZW1ibGVyPC9uYW1lPg0KLSAgPGRlc2NyaXB0aW9uPg0KLSAgICA8IVtDREFUQVsNCi0gICAgPHA+DQotICAgIEphdmFTY3JpcHQgTWF2ZW4gUGx1Z2luIHJlbGllcyBvbiB0aGUgcHJvdmlkZWQgYXNzZW1ibGVyIHRvIGRlc2NyaWJlIGhvdyB0bw0KLSAgICBhc3NlbWJsZSBzb3VyY2Ugc2NyaXB0cyBpbnRvIHRoZSBwYWNrYWdpbmcgZGlyZWN0b3J5Lg0KLSAgICA8L3A+DQotICAgIDxwPg0KLSAgICBUaGlzIGRlc2NyaXB0b3Igc3BlY2lmaWVzIGEgc2V0IG9mIHRhcmdldCBzY3JpcHQgdG8gYmUgY3JlYXRlZCBieSBtZXJnaW5nDQotICAgIHNvbWUgc291cmNlIHNjcmlwdHMgaW4gdGhlIHNwZWNpZmllZCBvcmRlci4NCi0gICAgPC9wPg0KLSAgICBdXT4NCi0gIDwvZGVzY3JpcHRpb24+DQotICA8ZGVmYXVsdHM+DQotICAgIDxkZWZhdWx0Pg0KLSAgICAgIDxrZXk+cGFja2FnZTwva2V5Pg0KLSAgICAgIDx2YWx1ZT5vcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuam10LmFzc2VtYmxlcjwvdmFsdWU+DQotICAgIDwvZGVmYXVsdD4NCi0gIDwvZGVmYXVsdHM+DQotICA8Y2xhc3Nlcz4NCi0gICAgPGNsYXNzIHJvb3RFbGVtZW50PSJ0cnVlIiB4bWwudGFnTmFtZT0iYXNzZW1ibGVyIj4NCi0gICAgICA8bmFtZT5Bc3NlbWJsZXI8L25hbWU+DQotICAgICAgPGRlc2NyaXB0aW9uPg0KLSAgICAgIDwhW0NEQVRBWw0KLSAgICAgICAgQW4gYXNzZW1ibGVyIGRlZmluZXMgYSBjb2xsZWN0aW9uIG9mIGZpbGVzIHRvIGJlIGNyZWF0ZWQgaW4gdGhlDQotICAgICAgICBwYWNrYWdpbmcgZGlyZWN0b3J5IGJhc2VkIG9uIHNvdXJjZSBzY3JpcHRzLiBNYW55IHNjcmlwdCBkZXZlbG9wZXIgdXNlDQotICAgICAgICBmaW5lIGdyYWluZWQgc2NyaXB0cyBmb3IgZGV2ZWxvcG1lbnQgYW5kIG1lcmdlIHRoZW0gZHVyaW5nIHJlbGVhc2UuIFRoZQ0KLSAgICAgICAgYXNzZW1ibGVyIGRlc2NyaWJlIHRoZSBmaWxlcyB0byBnZXQgbWVyZ2VkIGFuZCB0aGUgb3JkZXJpbmcuDQotICAgICAgICBdXT4NCi0gICAgICA8L2Rlc2NyaXB0aW9uPg0KLSAgICAgIDx2ZXJzaW9uPjEuMC4wKzwvdmVyc2lvbj4NCi0gICAgICA8ZmllbGRzPg0KLSAgICAgICAgPGZpZWxkPg0KLSAgICAgICAgICA8bmFtZT5zY3JpcHRzPC9uYW1lPg0KLSAgICAgICAgICA8dmVyc2lvbj4xLjAuMCs8L3ZlcnNpb24+DQotICAgICAgICAgIDxhc3NvY2lhdGlvbj4NCi0gICAgICAgICAgICA8dHlwZT5TY3JpcHQ8L3R5cGU+DQotICAgICAgICAgICAgPG11bHRpcGxpY2l0eT4qPC9tdWx0aXBsaWNpdHk+DQotICAgICAgICAgIDwvYXNzb2NpYXRpb24+DQotICAgICAgICAgIDxkZXNjcmlwdGlvbj4NCi0gICAgICAgICAgICA8IVtDREFUQVsNCi0gICAgICAgICAgICBTcGVjaWZpZXMgYSBtZXJnZSB0byBvY2N1ciBvbiBhIHNldCBvZiBzb3VyY2UgZmlsZXMuDQotICAgICAgICAgICAgXV0+DQotICAgICAgICAgIDwvZGVzY3JpcHRpb24+DQotICAgICAgICA8L2ZpZWxkPg0KLSAgICAgIDwvZmllbGRzPg0KLSAgICA8L2NsYXNzPg0KLQ0KLSAgICA8Y2xhc3MgeG1sLnRhZ05hbWU9InNjcmlwdCI+DQotICAgICAgPGRlc2NyaXB0aW9uPg0KLSAgICAgICAgPCFbQ0RBVEFbDQotICAgICAgICBNZXJnZSBtdWx0aXBsZSBzb3VyY2Ugc2NyaXB0cyBpbnRvIGEgdGFyZ2V0IHNjcmlwdC4NCi0gICAgICAgIF1dPg0KLSAgICAgIDwvZGVzY3JpcHRpb24+DQotICAgICAgPG5hbWU+U2NyaXB0PC9uYW1lPg0KLSAgICAgIDx2ZXJzaW9uPjEuMC4wKzwvdmVyc2lvbj4NCi0gICAgICA8ZmllbGRzPg0KLSAgICAgICAgPGZpZWxkPg0KLSAgICAgICAgICA8bmFtZT5maWxlTmFtZTwvbmFtZT4NCi0gICAgICAgICAgPHZlcnNpb24+MS4wLjArPC92ZXJzaW9uPg0KLSAgICAgICAgICA8dHlwZT5TdHJpbmc8L3R5cGU+DQotICAgICAgICAgIDxkZXNjcmlwdGlvbj4NCi0gICAgICAgICAgVGhlIHNjcmlwdCB0byBiZSBjcmVhdGVkIGJ5IHRoZSBtZXJnZS4NCi0gICAgICAgICAgPC9kZXNjcmlwdGlvbj4NCi0gICAgICAgIDwvZmllbGQ+DQotICAgICAgICA8ZmllbGQ+DQotICAgICAgICAgIDxuYW1lPmluY2x1ZGVzPC9uYW1lPg0KLSAgICAgICAgICA8dmVyc2lvbj4xLjAuMCs8L3ZlcnNpb24+DQotICAgICAgICAgIDxkZXNjcmlwdGlvbj4NCi0gICAgICAgICAgICA8IVtDREFUQVsNCi0gICAgICAgICAgICBUaGlzIGlzIGEgbGlzdCBvZiAmbHQ7aW5jbHVkZS8mZ3Q7IHN1YmVsZW1lbnRzLCBlYWNoIGNvbnRhaW5pbmcgYQ0KLSAgICAgICAgICAgIHNvdXJjZSBzY3JpcHQgcmVmZXJlbmNlLiBTY3JpcHRzIG1hdGNoaW5nIHRoZXNlIGVsZW1lbnRzIHdpbGwgYmUNCi0gICAgICAgICAgICBtZXJnZWQgaW4gdGhlIHRhcmdldCBzY3JpcHQsIGluIHRoZSBvcmRlciB0aGV5IGFyZSBjb25maWd1cmVkLg0KLSAgICAgICAgICAgIF1dPg0KLSAgICAgICAgICA8L2Rlc2NyaXB0aW9uPg0KLSAgICAgICAgICA8YXNzb2NpYXRpb24+DQotICAgICAgICAgICAgPHR5cGU+U3RyaW5nPC90eXBlPg0KLSAgICAgICAgICAgIDxtdWx0aXBsaWNpdHk+KjwvbXVsdGlwbGljaXR5Pg0KLSAgICAgICAgICA8L2Fzc29jaWF0aW9uPg0KLSAgICAgICAgPC9maWVsZD4NCi0gICAgICA8L2ZpZWxkcz4NCi0gICAgPC9jbGFzcz4NCi0gIDwvY2xhc3Nlcz4NCi08L21vZGVsPg0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL05PVElDRSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL05PVElDRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmEzZGJkNi4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9OT1RJQ0UKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci09PSAgTk9USUNFIGZpbGUgY29ycmVzcG9uZGluZyB0byBzZWN0aW9uIDQoZCkgb2YgdGhlIEFwYWNoZSBMaWNlbnNlLCAgID09Ci09PSAgVmVyc2lvbiAyLjAsIGluIHRoaXMgY2FzZSBmb3IgdGhlIEFwYWNoZSBNeUZhY2VzIE1hdmVuIFBsdWdpbnMgICAgID09Ci09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgCi1UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLgotCi1Qb3J0aW9ucyBvZiB0aGlzIHNvZnR3YXJlIHdlcmUgb3JpZ2luYWxseSBiYXNlZCBvbiB0aGUgZm9sbG93aW5nOgotCi0gLSBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwNiwgT3JhY2xlIENvcnAsIDxodHRwOi8vd3d3Lm9yYWNsZS5jb20vPi4KLWFuZCBhcmUgbGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIHVuZGVyIHRoZSAKLSJTb2Z0d2FyZSBHcmFudCBhbmQgQ29ycG9yYXRlIENvbnRyaWJ1dGlvbiBMaWNlbnNlIEFncmVlbWVudCIKLQotU2VlIHRoZSBMSUNFTlNFLnR4dCBmaWxlIGZvciBpbmZvcm1hdGlvbiBvbiBhbGwgbGljZW5zZXMgCi1hc3NvY2lhdGVkIHdpdGggdGhpcyBzb2Z0d2FyZS4KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL3BsZXh1cy9jb21wb25lbnRzLnhtbCBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL3BsZXh1cy9jb21wb25lbnRzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGUxNzhkZi4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9wbGV4dXMvY29tcG9uZW50cy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotPCEtLQ0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICB+DQotICB+ICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICB+DQotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICB+IHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLTxjb21wb25lbnQtc2V0Pg0KLSAgPGNvbXBvbmVudHM+DQotDQotICAgIDwhLS0NCi0gICAgICAgIEEgY3VzdG9tIGFydGlmYWN0IGhhbmRsZXIgZm9yIGphdmFzY3JpcHQgYXJjaGl2ZXMgKGpzYXIpLg0KLSAgICAgICAgVGhpcyByZXF1aXJlcyB0aGUgcGx1Z2luIHRvIGJlIGNvbmZpZ3VyZWQgd2l0aCA8ZXh0ZW5zaW9ucz4gc2V0IHRvIHRydWUNCi0gICAgICAgIG9uIGFueSBwcm9qZWN0IHRoYXQgdXNlcyBqYXZhc2NyaXB0IGRlcGVkZW5jaWVzLg0KLSAgICAgLS0+DQotICAgIDxjb21wb25lbnQ+DQotICAgICAgPHJvbGU+b3JnLmFwYWNoZS5tYXZlbi5hcnRpZmFjdC5oYW5kbGVyLkFydGlmYWN0SGFuZGxlcjwvcm9sZT4NCi0gICAgICA8cm9sZS1oaW50PmphdmFzY3JpcHQ8L3JvbGUtaGludD4NCi0gICAgICA8aW1wbGVtZW50YXRpb24+b3JnLmFwYWNoZS5tYXZlbi5hcnRpZmFjdC5oYW5kbGVyLkRlZmF1bHRBcnRpZmFjdEhhbmRsZXI8L2ltcGxlbWVudGF0aW9uPg0KLSAgICAgIDxjb25maWd1cmF0aW9uPg0KLSAgICAgICAgPHR5cGU+amF2YXNjcmlwdDwvdHlwZT4NCi0gICAgICAgIDxleHRlbnNpb24+amFyPC9leHRlbnNpb24+DQotICAgICAgICA8bGFuZ3VhZ2U+amF2YXNjcmlwdDwvbGFuZ3VhZ2U+DQotICAgICAgICA8YWRkZWRUb0NsYXNzcGF0aD5mYWxzZTwvYWRkZWRUb0NsYXNzcGF0aD4NCi0gICAgICA8L2NvbmZpZ3VyYXRpb24+DQotICAgIDwvY29tcG9uZW50Pg0KLQ0KLSAgPCEtLQ0KLSAgICBBIGN1c3RvbSBsaWZlY3ljbGUgZm9yIGphdmFzY3JpcHQgcGFja2FnaW5nDQotICAgIC0tPg0KLSAgICA8Y29tcG9uZW50Pg0KLSAgICAgIDxyb2xlPm9yZy5hcGFjaGUubWF2ZW4ubGlmZWN5Y2xlLm1hcHBpbmcuTGlmZWN5Y2xlTWFwcGluZzwvcm9sZT4NCi0gICAgICA8cm9sZS1oaW50PmphdmFzY3JpcHQ8L3JvbGUtaGludD4NCi0gICAgICA8aW1wbGVtZW50YXRpb24+b3JnLmFwYWNoZS5tYXZlbi5saWZlY3ljbGUubWFwcGluZy5EZWZhdWx0TGlmZWN5Y2xlTWFwcGluZzwvaW1wbGVtZW50YXRpb24+DQotICAgICAgPGNvbmZpZ3VyYXRpb24+DQotICAgICAgICA8bGlmZWN5Y2xlcz4NCi0gICAgICAgICAgPGxpZmVjeWNsZT4NCi0gICAgICAgICAgICA8aWQ+ZGVmYXVsdDwvaWQ+DQotICAgICAgICAgICAgPHBoYXNlcz4NCi0gICAgICAgICAgICAgIDxwcm9jZXNzLXJlc291cmNlcz5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM6bWF2ZW4tcmVzb3VyY2VzLXBsdWdpbjpyZXNvdXJjZXM8L3Byb2Nlc3MtcmVzb3VyY2VzPg0KLSAgICAgICAgICAgICAgPGNvbXBpbGU+b3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHM6bXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbjpjb21waWxlPC9jb21waWxlPg0KLSAgICAgICAgICAgICAgPHByb2Nlc3MtdGVzdC1yZXNvdXJjZXM+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zOm1hdmVuLXJlc291cmNlcy1wbHVnaW46dGVzdFJlc291cmNlczwvcHJvY2Vzcy10ZXN0LXJlc291cmNlcz4NCi0gICAgICAgICAgICAgIDx0ZXN0LWNvbXBpbGU+b3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHM6bXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbjpwcmVwYXJlLXRlc3RzPC90ZXN0LWNvbXBpbGU+DQotICAgICAgICAgICAgICA8dGVzdD5vcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29sczpteWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luOmpzdW5pdDwvdGVzdD4NCi0gICAgICAgICAgICAgIDxwYWNrYWdlPm9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzOm15ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW46cGFja2FnZTwvcGFja2FnZT4NCi0gICAgICAgICAgICAgIDxpbnN0YWxsPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczptYXZlbi1pbnN0YWxsLXBsdWdpbjppbnN0YWxsPC9pbnN0YWxsPg0KLSAgICAgICAgICAgICAgPGRlcGxveT5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM6bWF2ZW4tZGVwbG95LXBsdWdpbjpkZXBsb3k8L2RlcGxveT4NCi0gICAgICAgICAgICA8L3BoYXNlcz4NCi0gICAgICAgICAgPC9saWZlY3ljbGU+DQotICAgICAgICA8L2xpZmVjeWNsZXM+DQotICAgICAgPC9jb25maWd1cmF0aW9uPg0KLSAgICA8L2NvbXBvbmVudD4NCi0NCi0gICAgPGNvbXBvbmVudD4NCi0gICAgICA8cm9sZT5vcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuam10LmFzc2VtYmxlci5Bc3NlbWJsZXJSZWFkZXI8L3JvbGU+DQotICAgICAgPHJvbGUtaGludD5kZWZhdWx0PC9yb2xlLWhpbnQ+DQotICAgICAgPGltcGxlbWVudGF0aW9uPm9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5qbXQuYXNzZW1ibGVyLkRlZmF1bHRBc3NlbWJsZXJSZWFkZXI8L2ltcGxlbWVudGF0aW9uPg0KLSAgICAgIDxkZXNjcmlwdGlvbj48L2Rlc2NyaXB0aW9uPg0KLSAgICA8L2NvbXBvbmVudD4NCi0gICAgPGNvbXBvbmVudD4NCi0gICAgICA8cm9sZT5vcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuam10LmFzc2VtYmxlci5Bc3NlbWJsZXJSZWFkZXJNYW5hZ2VyPC9yb2xlPg0KLSAgICAgIDxpbXBsZW1lbnRhdGlvbj5vcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuam10LmFzc2VtYmxlci5EZWZhdWx0QXNzZW1ibGVyUmVhZGVyTWFuYWdlcjwvaW1wbGVtZW50YXRpb24+DQotICAgICAgPGRlc2NyaXB0aW9uPjwvZGVzY3JpcHRpb24+DQotICAgIDwvY29tcG9uZW50Pg0KLSAgICA8Y29tcG9uZW50Pg0KLSAgICAgIDxyb2xlPm9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5qbXQuYXNzZW1ibGVyLkFzc2VtYmxlclJlYWRlcjwvcm9sZT4NCi0gICAgICA8cm9sZS1oaW50PmpzYnVpbGRlcjwvcm9sZS1oaW50Pg0KLSAgICAgIDxpbXBsZW1lbnRhdGlvbj5vcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuam10LmFzc2VtYmxlci5Kc0J1aWxkZXJBc3NlbWJsZXJSZWFkZXI8L2ltcGxlbWVudGF0aW9uPg0KLSAgICAgIDxkZXNjcmlwdGlvbj48L2Rlc2NyaXB0aW9uPg0KLSAgICA8L2NvbXBvbmVudD4NCi0gICAgPGNvbXBvbmVudD4NCi0gICAgICA8cm9sZT5vcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuam10LmFyY2hpdmUuSmF2YXNjcmlwdEFydGlmYWN0TWFuYWdlcjwvcm9sZT4NCi0gICAgICA8aW1wbGVtZW50YXRpb24+b3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LmptdC5hcmNoaXZlLkphdmFzY3JpcHRBcnRpZmFjdE1hbmFnZXI8L2ltcGxlbWVudGF0aW9uPg0KLSAgICAgIDxkZXNjcmlwdGlvbj5BIGNvbXBvbmVudCB0byBoYW5kbGUgamF2YXNjcmlwdCBkZXBlbmRlbmNpZXMuPC9kZXNjcmlwdGlvbj4NCi0gICAgICA8aXNvbGF0ZWQtcmVhbG0+ZmFsc2U8L2lzb2xhdGVkLXJlYWxtPg0KLSAgICAgIDxyZXF1aXJlbWVudHM+DQotICAgICAgICA8cmVxdWlyZW1lbnQ+DQotICAgICAgICAgIDxyb2xlPm9yZy5jb2RlaGF1cy5wbGV4dXMuYXJjaGl2ZXIuVW5BcmNoaXZlcjwvcm9sZT4NCi0gICAgICAgICAgPHJvbGUtaGludD5qYXZhc2NyaXB0PC9yb2xlLWhpbnQ+DQotICAgICAgICAgIDxmaWVsZC1uYW1lPmFyY2hpdmVyPC9maWVsZC1uYW1lPg0KLSAgICAgICAgPC9yZXF1aXJlbWVudD4NCi0gICAgICA8L3JlcXVpcmVtZW50cz4NCi0gICAgPC9jb21wb25lbnQ+DQotICAgIDxjb21wb25lbnQ+DQotICAgICAgPHJvbGU+b3JnLmNvZGVoYXVzLnBsZXh1cy5hcmNoaXZlci5VbkFyY2hpdmVyPC9yb2xlPg0KLSAgICAgIDxyb2xlLWhpbnQ+amF2YXNjcmlwdDwvcm9sZS1oaW50Pg0KLSAgICAgIDxpbXBsZW1lbnRhdGlvbj5vcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuam10LmFyY2hpdmUuSmF2YXNjcmlwdFVuQXJjaGl2ZXI8L2ltcGxlbWVudGF0aW9uPg0KLSAgICAgIDxkZXNjcmlwdGlvbj5DdXN0b20gYXJjaGl2ZXIgZm9yIGphdmFzY3JpcHQgZGVwZW5kZW5jaWVzLCBwYWNrYWdlZCBhcyAmcXVvdDtqc2FyJnF1b3Q7IChKYXZhU2NyaXB0DQotQVJjaGl2ZSksIHRoYXQgYXJlIHNpbXBseSBhIGphciBvZiBzY3JpcHRzIGFuZCByZXNvdXJjZXMuPC9kZXNjcmlwdGlvbj4NCi0gICAgICA8aXNvbGF0ZWQtcmVhbG0+ZmFsc2U8L2lzb2xhdGVkLXJlYWxtPg0KLSAgICA8L2NvbXBvbmVudD4NCi0gICAgPGNvbXBvbmVudD4NCi0gICAgICA8cm9sZT5vcmcuY29kZWhhdXMucGxleHVzLmFyY2hpdmVyLkFyY2hpdmVyPC9yb2xlPg0KLSAgICAgIDxyb2xlLWhpbnQ+amF2YXNjcmlwdDwvcm9sZS1oaW50Pg0KLSAgICAgIDxpbXBsZW1lbnRhdGlvbj5vcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuam10LmFyY2hpdmUuSmF2YXNjcmlwdEFyY2hpdmVyPC9pbXBsZW1lbnRhdGlvbj4NCi0gICAgICA8aW5zdGFudGlhdGlvbi1zdHJhdGVneT5wZXItbG9va3VwPC9pbnN0YW50aWF0aW9uLXN0cmF0ZWd5Pg0KLSAgICAgIDxkZXNjcmlwdGlvbj5DdXN0b20gYXJjaGl2ZXIgZm9yIGphdmFzY3JpcHQgZGVwZW5kZW5jaWVzLCBwYWNrYWdlZCBhcyAmcXVvdDtqc2FyJnF1b3Q7IChKYXZhU2NyaXB0DQotQVJjaGl2ZSksIHRoYXQgYXJlIHNpbXBseSBhIGphciBvZiBzY3JpcHRzIGFuZCByZXNvdXJjZXMuPC9kZXNjcmlwdGlvbj4NCi0gICAgICA8aXNvbGF0ZWQtcmVhbG0+ZmFsc2U8L2lzb2xhdGVkLXJlYWxtPg0KLSAgICA8L2NvbXBvbmVudD4gICAgDQotICA8L2NvbXBvbmVudHM+DQotPC9jb21wb25lbnQtc2V0Pg0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvam10L0NvbXBpbGVNb2pvVGVzdC5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qbXQvQ29tcGlsZU1vam9UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhOGIwMzYuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qbXQvQ29tcGlsZU1vam9UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKg0KLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICogDQotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqIA0KLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqICB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5qbXQ7DQotDQotaW1wb3J0IGphdmEuaW8uRmlsZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uTW9qbzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4udGVzdGluZy5BYnN0cmFjdE1vam9UZXN0Q2FzZTsNCi1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy51dGlsLkZpbGVVdGlsczsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpuaWNvbGFzQGFwYWNoZS5vcmciPm5pY29sYXMgRGUgTG9vZjwvYT4NCi0gKi8NCi1wdWJsaWMgY2xhc3MgQ29tcGlsZU1vam9UZXN0DQotICAgIGV4dGVuZHMgQWJzdHJhY3RNb2pvVGVzdENhc2UNCi17DQotICAgIHB1YmxpYyB2b2lkIHRlc3RDb21waWxlQW5kQXNzZW1ibGUoKQ0KLSAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBGaWxlIHRlc3RQb20gPSBuZXcgRmlsZSggZ2V0QmFzZWRpcigpLCAic3JjL3Rlc3QvcmVzb3VyY2VzL2NvbXBpbGUucG9tIiApOw0KLSAgICAgICAgTW9qbyBtb2pvID0gKE1vam8pIGxvb2t1cE1vam8oICJjb21waWxlIiwgdGVzdFBvbSApOw0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbCggIkZhaWxlZCB0byBjb25maWd1cmUgdGhlIHBsdWdpbiIsIG1vam8gKTsNCi0NCi0gICAgICAgIG1vam8uZXhlY3V0ZSgpOw0KLQ0KLSAgICAgICAgRmlsZSBleHBlY3RlZCA9IG5ldyBGaWxlKCAiLi90YXJnZXQvdGVzdC10YXJnZXQvY29tcGlsZS9zY3JpcHRhY3Vsb3VzLmpzIiApOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZSggImV4cGVjdGVkIGZpbGUgbm90IGZvdW5kICIgKyBleHBlY3RlZC5nZXROYW1lKCksIGV4cGVjdGVkLmV4aXN0cygpICk7DQotDQotICAgICAgICBleHBlY3RlZCA9IG5ldyBGaWxlKCAiLi90YXJnZXQvdGVzdC10YXJnZXQvY29tcGlsZS9wcm90b3R5cGUuanMiICk7DQotICAgICAgICBhc3NlcnRUcnVlKCAiZXhwZWN0ZWQgZmlsZSBub3QgZm91bmQgIiArIGV4cGVjdGVkLmdldE5hbWUoKSwgZXhwZWN0ZWQuZXhpc3RzKCkgKTsNCi0NCi0gICAgICAgIFN0cmluZyBtZXJnZWQgPSBGaWxlVXRpbHMuZmlsZVJlYWQoIGV4cGVjdGVkICk7DQotICAgICAgICBhc3NlcnRUcnVlKCAiYnVpbGRlciBub3QgbWVyZ2VkIiwgbWVyZ2VkLmNvbnRhaW5zKCAidmFyIEJ1aWxkZXIgPSB7IiApICk7DQotICAgICAgICBhc3NlcnRUcnVlKCAic2xpZGVyIG5vdCBtZXJnZWQiLCBtZXJnZWQuY29udGFpbnMoICJTbGlkZXIucHJvdG90eXBlID0geyIgKSApOw0KLQ0KLSAgICAgICAgRmlsZSB1bmV4cGVjdGVkID0gbmV3IEZpbGUoICIuL3RhcmdldC90ZXN0LXRhcmdldC9jb21waWxlL2J1aWxkZXIuanMiICk7DQotICAgICAgICBhc3NlcnRUcnVlKCAidW5leHBlY3RlZCBmaWxlIGZvdW5kICIgKyB1bmV4cGVjdGVkLmdldE5hbWUoKSwgIXVuZXhwZWN0ZWQuZXhpc3RzKCkgKTsNCi0NCi0gICAgICAgIHVuZXhwZWN0ZWQgPSBuZXcgRmlsZSggIi4vdGFyZ2V0L3Rlc3QtdGFyZ2V0L2NvbXBpbGUvc2xpZGVyLmpzIiApOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZSggInVuZXhwZWN0ZWQgZmlsZSBmb3VuZCAiICsgdW5leHBlY3RlZC5nZXROYW1lKCksICF1bmV4cGVjdGVkLmV4aXN0cygpICk7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qbXQvQ29tcHJlc3NNb2pvVGVzdC5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qbXQvQ29tcHJlc3NNb2pvVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZGJmZjI3Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvam10L0NvbXByZXNzTW9qb1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMCArMCwwIEBACi0vKg0KLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICogDQotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqIA0KLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqICB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5qbXQ7DQotDQotaW1wb3J0IGphdmEuaW8uRmlsZTsNCi1pbXBvcnQgamF2YS5pby5GaWxlbmFtZUZpbHRlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uTW9qbzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4udGVzdGluZy5BYnN0cmFjdE1vam9UZXN0Q2FzZTsNCi1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy51dGlsLkZpbGVVdGlsczsNCi0NCi1wdWJsaWMgY2xhc3MgQ29tcHJlc3NNb2pvVGVzdA0KLSAgICBleHRlbmRzIEFic3RyYWN0TW9qb1Rlc3RDYXNlDQotew0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QXR0YWNoQ29tcHJlc3NlZFNjcmlwdGFjdWxvdXMoKQ0KLSAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBGaWxlIHRlc3RQb20gPSBuZXcgRmlsZSggZ2V0QmFzZWRpcigpLCAic3JjL3Rlc3QvcmVzb3VyY2VzL2F0dGFjaC1jb21wcmVzc2VkLnBvbSIgKTsNCi0gICAgICAgIE1vam8gbW9qbyA9IChNb2pvKSBsb29rdXBNb2pvKCAiYXR0YWNoLWNvbXByZXNzZWQiLCB0ZXN0UG9tICk7DQotICAgICAgICBhc3NlcnROb3ROdWxsKCAiRmFpbGVkIHRvIGNvbmZpZ3VyZSB0aGUgcGx1Z2luIiwgbW9qbyApOw0KLQ0KLSAgICAgICAgbW9qby5leGVjdXRlKCk7DQotDQotICAgICAgICBGaWxlW10ganMgPSBnZXRTY3JpcHRzKCAiLi9zcmMvdGVzdC9yZXNvdXJjZXMvc2NyaXB0cyIgKTsNCi0gICAgICAgIGxvbmcgc2l6ZSA9IDA7DQotICAgICAgICBmb3IgKCBpbnQgaSA9IDA7IGkgPCBqcy5sZW5ndGg7IGkrKyApDQotICAgICAgICB7DQotICAgICAgICAgICAgc2l6ZSArPSBqc1tpXS5sZW5ndGgoKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIEZpbGUgZXhwZWN0ZWQgPQ0KLSAgICAgICAgICAgIG5ldyBGaWxlKCAiLi90YXJnZXQvdGVzdC10YXJnZXQvYXR0YWNoLWNvbXByZXNzZWQvc2NyaXB0YWN1bG91cy0xLjctY29tcHJlc3NlZC5qYXIiICk7DQotICAgICAgICBhc3NlcnRUcnVlKCAiZXhwZWN0ZWQgZmlsZSBub3QgZm91bmQgIiArIGV4cGVjdGVkLCBleHBlY3RlZC5leGlzdHMoKSApOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZSggIm5vIGNvbXByZXNzaW9uIG9jY3VyZWQiLCBleHBlY3RlZC5sZW5ndGgoKSA8IHNpemUgKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q29tcHJlc3NTY3JpcHRhY3Vsb3VzKCkNCi0gICAgICAgIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgRmlsZSB0YXJnZXQgPSBuZXcgRmlsZSggInRhcmdldC90ZXN0LXRhcmdldC9jb21wcmVzcyIgKTsNCi0gICAgICAgIHRhcmdldC5ta2RpcnMoKTsNCi0gICAgICAgIEZpbGVVdGlscy5jbGVhbkRpcmVjdG9yeSggdGFyZ2V0ICk7DQotICAgICAgICBGaWxlVXRpbHMuY29weURpcmVjdG9yeSggbmV3IEZpbGUoICJzcmMvdGVzdC9yZXNvdXJjZXMvc2NyaXB0cyIgKSwgdGFyZ2V0ICk7DQotDQotICAgICAgICBGaWxlIHRlc3RQb20gPSBuZXcgRmlsZSggZ2V0QmFzZWRpcigpLCAiL3RhcmdldC90ZXN0LWNsYXNzZXMvY29tcHJlc3MucG9tIiApOw0KLSAgICAgICAgTW9qbyBtb2pvID0gKE1vam8pIGxvb2t1cE1vam8oICJjb21wcmVzcyIsIHRlc3RQb20gKTsNCi0gICAgICAgIGFzc2VydE5vdE51bGwoICJGYWlsZWQgdG8gY29uZmlndXJlIHRoZSBwbHVnaW4iLCBtb2pvICk7DQotDQotICAgICAgICBtb2pvLmV4ZWN1dGUoKTsNCi0NCi0gICAgICAgIEZpbGVbXSBqcyA9IGdldFNjcmlwdHMoICIuL3NyYy90ZXN0L3Jlc291cmNlcy9zY3JpcHRzIiApOw0KLSAgICAgICAgZm9yICggaW50IGkgPSAwOyBpIDwganMubGVuZ3RoOyBpKysgKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIEZpbGUgZXhwZWN0ZWQgPSBuZXcgRmlsZSggdGFyZ2V0LCBqc1tpXS5nZXROYW1lKCkucmVwbGFjZSggIi5qcyIsICItY29tcHJlc3NlZC5qcyIgKSApOw0KLSAgICAgICAgICAgIGFzc2VydFRydWUoICJleHBlY3RlZCBmaWxlIG5vdCBmb3VuZCAiICsgZXhwZWN0ZWQuZ2V0TmFtZSgpLCBleHBlY3RlZC5leGlzdHMoKSApOw0KLSAgICAgICAgICAgIGFzc2VydFRydWUoICJubyBjb21wcmVzc2lvbiBvY2N1cmVkIG9uICIgKyBleHBlY3RlZC5nZXROYW1lKCksDQotICAgICAgICAgICAgICAgIGV4cGVjdGVkLmxlbmd0aCgpIDwganNbaV0ubGVuZ3RoKCkgKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0WmVyb0xlbmd0aElucHV0KCkNCi0gICAgICAgIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgRmlsZSB0YXJnZXQgPSBuZXcgRmlsZSggInRhcmdldC90ZXN0LXRhcmdldC9jb21wcmVzcy16ZXJvLWxlbmd0aCIgKTsNCi0gICAgICAgIHRhcmdldC5ta2RpcnMoKTsNCi0gICAgICAgIEZpbGVVdGlscy5jbGVhbkRpcmVjdG9yeSggdGFyZ2V0ICk7DQotICAgICAgICBGaWxlVXRpbHMuY29weURpcmVjdG9yeSggbmV3IEZpbGUoICJzcmMvdGVzdC9yZXNvdXJjZXMvemVyby1sZW5ndGgiICksIHRhcmdldCApOw0KLQ0KLSAgICAgICAgRmlsZSB0ZXN0UG9tID0gbmV3IEZpbGUoIGdldEJhc2VkaXIoKSwgIi90YXJnZXQvdGVzdC1jbGFzc2VzL2NvbXByZXNzLXplcm8tbGVuZ3RoLnBvbSIgKTsNCi0gICAgICAgIE1vam8gbW9qbyA9IChNb2pvKSBsb29rdXBNb2pvKCAiY29tcHJlc3MiLCB0ZXN0UG9tICk7DQotICAgICAgICBhc3NlcnROb3ROdWxsKCAiRmFpbGVkIHRvIGNvbmZpZ3VyZSB0aGUgcGx1Z2luIiwgbW9qbyApOw0KLQ0KLSAgICAgICAgbW9qby5leGVjdXRlKCk7DQotDQotICAgICAgICBGaWxlW10ganMgPSBnZXRTY3JpcHRzKCAiLi9zcmMvdGVzdC9yZXNvdXJjZXMvemVyby1sZW5ndGgiICk7DQotICAgICAgICBmb3IgKCBpbnQgaSA9IDA7IGkgPCBqcy5sZW5ndGg7IGkrKyApDQotICAgICAgICB7DQotICAgICAgICAgICAgRmlsZSBleHBlY3RlZCA9IG5ldyBGaWxlKCB0YXJnZXQsIGpzW2ldLmdldE5hbWUoKS5yZXBsYWNlKCAiLmpzIiwgIi1taW4uanMiICkgKTsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKCAiZXhwZWN0ZWQgZmlsZSBub3QgZm91bmQgIiArIGV4cGVjdGVkLmdldE5hbWUoKSwgZXhwZWN0ZWQuZXhpc3RzKCkgKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIEZpbGVbXSBnZXRTY3JpcHRzKCBTdHJpbmcgcGF0aCApDQotICAgIHsNCi0gICAgICAgIEZpbGVbXSBqcyA9IG5ldyBGaWxlKCBwYXRoICkubGlzdEZpbGVzKCBuZXcgRmlsZW5hbWVGaWx0ZXIoKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGFjY2VwdCggRmlsZSBkaXIsIFN0cmluZyBuYW1lICkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiBuYW1lLmVuZHNXaXRoKCAiLmpzIiApOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0gKTsNCi0gICAgICAgIHJldHVybiBqczsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2ptdC9TdHJpcERlYnVnc01vam9UZXN0LmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2ptdC9TdHJpcERlYnVnc01vam9UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiYzYxZTUuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qbXQvU3RyaXBEZWJ1Z3NNb2pvVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoNCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqIA0KLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKiANCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuam10Ow0KLQ0KLWltcG9ydCBqYXZhLmlvLkZpbGU7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLk1vam87DQotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLnRlc3RpbmcuQWJzdHJhY3RNb2pvVGVzdENhc2U7DQotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMudXRpbC5GaWxlVXRpbHM7DQotDQotcHVibGljIGNsYXNzIFN0cmlwRGVidWdzTW9qb1Rlc3QNCi0gICAgZXh0ZW5kcyBBYnN0cmFjdE1vam9UZXN0Q2FzZQ0KLXsNCi0gICAgcHVibGljIHZvaWQgdGVzdFN0cmlwRGVidWdzKCkNCi0gICAgICAgIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgRmlsZSB0YXJnZXQgPSBuZXcgRmlsZSggInRhcmdldC90ZXN0LXRhcmdldC9zdHJpcC1kZWJ1Z3MiICk7DQotICAgICAgICB0YXJnZXQubWtkaXJzKCk7DQotICAgICAgICBGaWxlVXRpbHMuY2xlYW5EaXJlY3RvcnkoIHRhcmdldCApOw0KLSAgICAgICAgRmlsZVV0aWxzLmNvcHlGaWxlVG9EaXJlY3RvcnkoIG5ldyBGaWxlKCAic3JjL3Rlc3QvcmVzb3VyY2VzL3dpdGgtZGVidWcvZGVidWdzLmpzIiApLA0KLSAgICAgICAgICAgIHRhcmdldCApOw0KLQ0KLSAgICAgICAgRmlsZSB0ZXN0UG9tID0gbmV3IEZpbGUoIGdldEJhc2VkaXIoKSwgInNyYy90ZXN0L3Jlc291cmNlcy9zdHJpcC1kZWJ1Z3MucG9tIiApOw0KLSAgICAgICAgTW9qbyBtb2pvID0gKE1vam8pIGxvb2t1cE1vam8oICJjb21wcmVzcyIsIHRlc3RQb20gKTsNCi0gICAgICAgIGFzc2VydE5vdE51bGwoICJGYWlsZWQgdG8gY29uZmlndXJlIHRoZSBwbHVnaW4iLCBtb2pvICk7DQotDQotICAgICAgICBtb2pvLmV4ZWN1dGUoKTsNCi0NCi0gICAgICAgIEZpbGUgZXhwZWN0ZWQgPSBuZXcgRmlsZSggIi4vdGFyZ2V0L3Rlc3QtdGFyZ2V0L3N0cmlwLWRlYnVncy9kZWJ1Z3MuanMiICk7DQotICAgICAgICANCi0gICAgICAgIGFzc2VydFRydWUoICJFeHBlY3RlZCB0aGUgc3RyaXBwZWQgZmlsZSB0byBoYXZlIG5vbi16ZXJvIGxlbmd0aC4iLCBleHBlY3RlZC5sZW5ndGgoKSA+IDAgKTsNCi0gICAgICAgIA0KLSAgICAgICAgU3RyaW5nIHNvdXJjZSA9IEZpbGVVdGlscy5maWxlUmVhZCggZXhwZWN0ZWQgKTsNCi0gICAgICAgIGFzc2VydFRydWUoIHNvdXJjZS5pbmRleE9mKCAibG9nZ2VyIiApIDwgMCApOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvam10L1dhclBhY2thZ2VNb2pvVGVzdC5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qbXQvV2FyUGFja2FnZU1vam9UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiNGRjM2QuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qbXQvV2FyUGFja2FnZU1vam9UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKg0KLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICogDQotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqIA0KLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqICB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5qbXQ7DQotDQotaW1wb3J0IGphdmEuaW8uRmlsZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uTW9qbzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4udGVzdGluZy5BYnN0cmFjdE1vam9UZXN0Q2FzZTsNCi0NCi1wdWJsaWMgY2xhc3MgV2FyUGFja2FnZU1vam9UZXN0DQotICAgIGV4dGVuZHMgQWJzdHJhY3RNb2pvVGVzdENhc2UNCi17DQotICAgIHB1YmxpYyB2b2lkIHRlc3RDb3B5SnNTb3VyY2VzKCkNCi0gICAgICAgIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgRmlsZSB0ZXN0UG9tID0gbmV3IEZpbGUoIGdldEJhc2VkaXIoKSwgInNyYy90ZXN0L3Jlc291cmNlcy93YXItcGFja2FnZS5wb20iICk7DQotICAgICAgICBNb2pvIG1vam8gPSAoTW9qbykgbG9va3VwTW9qbyggIndhci1wYWNrYWdlIiwgdGVzdFBvbSApOw0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbCggIkZhaWxlZCB0byBjb25maWd1cmUgdGhlIHBsdWdpbiIsIG1vam8gKTsNCi0NCi0gICAgICAgIG1vam8uZXhlY3V0ZSgpOw0KLQ0KLSAgICAgICAgYXNzZXJ0VHJ1ZSggbmV3IEZpbGUoICIuL3RhcmdldC90ZXN0LXRhcmdldC93YXItcGFja2FnZS9zY3JpcHRzL2xpYi9wcm90b3R5cGUuanMiICkuZXhpc3RzKCkgKTsNCi0gICAgICAgIGFzc2VydFRydWUoIG5ldyBGaWxlKCAiLi90YXJnZXQvdGVzdC10YXJnZXQvd2FyLXBhY2thZ2Uvc2NyaXB0cy9idWlsZGVyLmpzIiApLmV4aXN0cygpICk7DQotICAgICAgICBhc3NlcnRUcnVlKCBuZXcgRmlsZSggIi4vdGFyZ2V0L3Rlc3QtdGFyZ2V0L3dhci1wYWNrYWdlL3NjcmlwdHMvY29udHJvbHMuanMiICkuZXhpc3RzKCkgKTsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2ptdC9hc3NlbWJsZXIvSnNCdWlsZGVyQXNzZW1ibGVyUmVhZGVyVGVzdC5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qbXQvYXNzZW1ibGVyL0pzQnVpbGRlckFzc2VtYmxlclJlYWRlclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzE4ZWRiMy4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2ptdC9hc3NlbWJsZXIvSnNCdWlsZGVyQXNzZW1ibGVyUmVhZGVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoNCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqIA0KLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKiANCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuam10LmFzc2VtYmxlcjsNCi0NCi1pbXBvcnQgamF2YS5pby5GaWxlOw0KLQ0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLnRlc3RpbmcuU2lsZW50TG9nOw0KLQ0KLXB1YmxpYyBjbGFzcyBKc0J1aWxkZXJBc3NlbWJsZXJSZWFkZXJUZXN0DQotICAgIGV4dGVuZHMgVGVzdENhc2UNCi17DQotICAgIHB1YmxpYyB2b2lkIHRlc3RSZWFkSnNCdWlsZGVyQXNzZW1ibGVyKCkNCi0gICAgICAgIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgSnNCdWlsZGVyQXNzZW1ibGVyUmVhZGVyIHJlYWRlciA9IG5ldyBKc0J1aWxkZXJBc3NlbWJsZXJSZWFkZXIoKTsNCi0gICAgICAgIHJlYWRlci5lbmFibGVMb2dnaW5nKCBuZXcgU2lsZW50TG9nKCkgKTsNCi0gICAgICAgIEFzc2VtYmxlciBhc3NlbWJsZXIgPSByZWFkZXIuZ2V0QXNzZW1ibGVyKCBuZXcgRmlsZSggInNyYy90ZXN0L3Jlc291cmNlcy9hc3NlbWJsZXIuanNiIiApICk7DQotICAgICAgICBhc3NlcnRFcXVhbHMoIDIsIGFzc2VtYmxlci5nZXRTY3JpcHRzKCkuc2l6ZSgpICk7DQotICAgICAgICBTY3JpcHQgc2NyaXB0ID0gKFNjcmlwdCkgYXNzZW1ibGVyLmdldFNjcmlwdHMoKS5nZXQoIDAgKTsNCi0gICAgICAgIGFzc2VydEVxdWFscyggInRlc3QuanMiLCBzY3JpcHQuZ2V0RmlsZU5hbWUoKSApOw0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCAzLCBzY3JpcHQuZ2V0SW5jbHVkZXMoKS5zaXplKCkgKTsNCi0gICAgICAgIGFzc2VydEVxdWFscyggImJ1aWxkZXIuanMiLCBzY3JpcHQuZ2V0SW5jbHVkZXMoKS5nZXQoIDAgKS50b1N0cmluZygpICk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qbXQvY29tcHJlc3MvSXNvbGF0ZWRDbGFzc0xvYWRlclRlc3QuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvam10L2NvbXByZXNzL0lzb2xhdGVkQ2xhc3NMb2FkZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2NjYyNzYuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qbXQvY29tcHJlc3MvSXNvbGF0ZWRDbGFzc0xvYWRlclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qDQotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKiANCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICogDQotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LmptdC5jb21wcmVzczsNCi0NCi1pbXBvcnQgamF2YS5pby5GaWxlOw0KLWltcG9ydCBqYXZhLm5ldC5VUkw7DQotDQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5hcnRpZmFjdC5BcnRpZmFjdDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5hcnRpZmFjdC5EZWZhdWx0QXJ0aWZhY3Q7DQotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4uYXJ0aWZhY3QuZmFjdG9yeS5BcnRpZmFjdEZhY3Rvcnk7DQotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMuUGxleHVzVGVzdENhc2U7DQotDQotLyoqDQotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86bmljb2xhc0BhcGFjaGUub3JnIj5OaWNvbGFzIERlIExvb2Y8L2E+DQotICovDQotcHVibGljIGNsYXNzIElzb2xhdGVkQ2xhc3NMb2FkZXJUZXN0DQotICAgIGV4dGVuZHMgUGxleHVzVGVzdENhc2UNCi17DQotDQotICAgIHByaXZhdGUgQXJ0aWZhY3RGYWN0b3J5IGFydGlmYWN0RmFjdG9yeTsNCi0NCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKQ0KLSAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBzdXBlci5zZXRVcCgpOw0KLSAgICAgICAgYXJ0aWZhY3RGYWN0b3J5ID0gKEFydGlmYWN0RmFjdG9yeSkgbG9va3VwKCBBcnRpZmFjdEZhY3RvcnkuY2xhc3MuZ2V0TmFtZSgpICk7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIEVuc3VyZSBhIGNsYXNzIGNhbiBiZSBsb2FkZWQgaW4gaXNvbGF0aW9uIGJhc2VkIG9uIGFuIGFydGlmYWN0DQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TG9hZENsYXNzSW5Jc29sYXRpb24oKQ0KLSAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICAvLyBDcmVhdGUgYW4gYXJ0aWZhY3QgZm9yIGp1bml0Lmphcg0KLSAgICAgICAgQXJ0aWZhY3QgYXJ0aWZhY3QgPQ0KLSAgICAgICAgICAgIGFydGlmYWN0RmFjdG9yeS5jcmVhdGVBcnRpZmFjdCggImp1bml0IiwgImp1bml0IiwgIjMuOC4yIiwgRGVmYXVsdEFydGlmYWN0LlNDT1BFX1RFU1QsDQotICAgICAgICAgICAgICAgICJqYXIiICk7DQotICAgICAgICAvLyBsb2NhdGUganVuaXQuamFyIGJhc2VkIG9uIGN1cnJlbnQgbG9hZGVyIGNsYXNzDQotICAgICAgICBVUkwgdXJsID0gZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpLmdldFJlc291cmNlKCAianVuaXQvZnJhbWV3b3JrL1Rlc3RDYXNlLmNsYXNzIiApOw0KLSAgICAgICAgU3RyaW5nIHBhdGggPSB1cmwudG9TdHJpbmcoKTsNCi0gICAgICAgIGFzc2VydFRydWUoICJqdW5pdCBUZXN0Q2FzZSBjbGFzcyBpcyBub3QgbG9hZGVkIGZyb20gYSBqYXIiLCBwYXRoLnN0YXJ0c1dpdGgoICJqYXI6IiApICk7DQotICAgICAgICBpbnQgaSA9IHBhdGguaW5kZXhPZiggJyEnICk7DQotICAgICAgICB1cmwgPSBuZXcgVVJMKCBwYXRoLnN1YnN0cmluZyggNCwgaSApICk7DQotDQotICAgICAgICAvLyBzZXR1cCB0aGUgaXNvbGF0ZWQgY2xhc3Nsb2FkZXINCi0gICAgICAgIGFydGlmYWN0LnNldEZpbGUoIG5ldyBGaWxlKCB1cmwuZ2V0RmlsZSgpICkgKTsNCi0gICAgICAgIENsYXNzTG9hZGVyIGNsID0gbmV3IElzb2xhdGVkQ2xhc3NMb2FkZXIoIGFydGlmYWN0ICk7DQotDQotICAgICAgICBDbGFzcyBpc29sYXRlZCA9IGNsLmxvYWRDbGFzcyggImp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSIgKTsNCi0gICAgICAgIGFzc2VydE5vdE51bGwoICJmYWlsZWQgdG8gbG9hZCBUZXN0Q2FzZSBjbGFzcyBpbiBpc29sYXRpb24iLCBpc29sYXRlZCApOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZSggIlRlc3RDYXNlIGxvYWRlZCwgYnV0IG5vdCBpbiBpc29sYXRpb24iLCBpc29sYXRlZCAhPSBUZXN0Q2FzZS5jbGFzcyApOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvam10L2NvbXByZXNzL1lhaG9vVUlDb21wcmVzc29yVGVzdC5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qbXQvY29tcHJlc3MvWWFob29VSUNvbXByZXNzb3JUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5ZjcyNWYuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qbXQvY29tcHJlc3MvWWFob29VSUNvbXByZXNzb3JUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKg0KLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICogDQotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqIA0KLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqICB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5qbXQuY29tcHJlc3M7DQotDQotaW1wb3J0IGphdmEuaW8uRmlsZTsNCi0NCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOm5pY29sYXNAYXBhY2hlLm9yZyI+bmljb2xhcyBEZSBMb29mPC9hPg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBZYWhvb1VJQ29tcHJlc3NvclRlc3QNCi0gICAgZXh0ZW5kcyBUZXN0Q2FzZQ0KLXsNCi0gICAgcHJpdmF0ZSBKU0NvbXByZXNzb3IgY29tcHJlc3NvciA9IG5ldyBZYWhvb1VJQ29tcHJlc3NvcigpOw0KLQ0KLSAgICAvKioNCi0gICAgICogQ2hlY2sgdGhlIGNvbXByZXNzb3IgaXMgaW52b2tlZCBhcyBleHBlY3RlZC4NCi0gICAgICogDQotICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q29tcHJlc3MoKQ0KLSAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBGaWxlIGlucHV0ID0gbmV3IEZpbGUoICJzcmMvdGVzdC9yZXNvdXJjZXMvdGVzdC5qcyIgKTsNCi0gICAgICAgIEZpbGUgb3V0cHV0ID0gbmV3IEZpbGUoICJ0YXJnZXQvdGVzdC1vdXQuanMiICk7DQotDQotICAgICAgICBjb21wcmVzc29yLmNvbXByZXNzKCBpbnB1dCwgb3V0cHV0LCBKU0NvbXByZXNzb3IuTUFYLCBKU0NvbXByZXNzb3IuSkFWQVNDUklQVF8xXzMgKTsNCi0NCi0gICAgICAgIGFzc2VydFRydWUoICJleGVwZWN0ZWQgZmlsZSBub3QgZm91bmQiLCBvdXRwdXQuZXhpc3RzKCkgKTsNCi0gICAgICAgIGFzc2VydFRydWUoICJubyBjb21wcmVzc2lvbiBvY2N1cmVkIiwgb3V0cHV0Lmxlbmd0aCgpIDwgaW5wdXQubGVuZ3RoKCkgKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2ptdC9zdHViL0FydGlmYWN0U3R1Yi5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qbXQvc3R1Yi9BcnRpZmFjdFN0dWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTU5ZjU1Yi4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2ptdC9zdHViL0FydGlmYWN0U3R1Yi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoNCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqIA0KLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKiANCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuam10LnN0dWI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4uYXJ0aWZhY3QudmVyc2lvbmluZy5WZXJzaW9uUmFuZ2U7DQotDQotLyoqDQotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86bmljb2xhc0BhcGFjaGUub3JnIj5uaWNvbGFzIERlIExvb2Y8L2E+DQotICovDQotcHVibGljIGNsYXNzIEFydGlmYWN0U3R1Yg0KLSAgICBleHRlbmRzIG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLnRlc3Rpbmcuc3R1YnMuQXJ0aWZhY3RTdHViDQotew0KLQ0KLSAgICAvKioNCi0gICAgICoge0Bpbmhlcml0RG9jfQ0KLSAgICAgKiANCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi50ZXN0aW5nLnN0dWJzLkFydGlmYWN0U3R1YiNnZXRWZXJzaW9uUmFuZ2UoKQ0KLSAgICAgKi8NCi0gICAgcHVibGljIFZlcnNpb25SYW5nZSBnZXRWZXJzaW9uUmFuZ2UoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gVmVyc2lvblJhbmdlLmNyZWF0ZUZyb21WZXJzaW9uKCBnZXRWZXJzaW9uKCkgKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2ptdC9zdHViL01hdmVuUHJvamVjdFN0dWIuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvam10L3N0dWIvTWF2ZW5Qcm9qZWN0U3R1Yi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MjE1Y2VkLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvam10L3N0dWIvTWF2ZW5Qcm9qZWN0U3R1Yi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoNCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqIA0KLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKiANCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuam10LnN0dWI7DQotDQotaW1wb3J0IGphdmEuaW8uRmlsZTsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7DQotaW1wb3J0IGphdmEudXRpbC5TZXQ7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4uYXJ0aWZhY3QuRGVmYXVsdEFydGlmYWN0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi50ZXN0aW5nLnN0dWJzLkFydGlmYWN0U3R1YjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LmptdC5hcmNoaXZlLlR5cGVzOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOm5pY29sYXNAYXBhY2hlLm9yZyI+bmljb2xhcyBEZSBMb29mPC9hPg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBNYXZlblByb2plY3RTdHViDQotICAgIGV4dGVuZHMgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4udGVzdGluZy5zdHVicy5NYXZlblByb2plY3RTdHViDQotew0KLSAgICBwcml2YXRlIEFydGlmYWN0U3R1YiBhcnRpZmFjdDsNCi0gICAgew0KLSAgICAgICAgYXJ0aWZhY3QgPSBuZXcgQXJ0aWZhY3RTdHViKCk7DQotICAgICAgICBhcnRpZmFjdC5zZXRHcm91cElkKCAib3JnLnByb3RvdHlwZWpzIiApOw0KLSAgICAgICAgYXJ0aWZhY3Quc2V0QXJ0aWZhY3RJZCggInByb3RvdHlwZSIgKTsNCi0gICAgICAgIGFydGlmYWN0LnNldFZlcnNpb24oICIxLjUuMS4xIiApOw0KLSAgICAgICAgYXJ0aWZhY3Quc2V0VHlwZSggVHlwZXMuSkFWQVNDUklQVF9UWVBFICk7DQotICAgICAgICBhcnRpZmFjdC5zZXRTY29wZSggRGVmYXVsdEFydGlmYWN0LlNDT1BFX1JVTlRJTUUgKTsNCi0gICAgICAgIGFydGlmYWN0LnNldEZpbGUoIG5ldyBGaWxlKCAic3JjL3Rlc3QvcmVzb3VyY2VzL3Byb3RvdHlwZS0xLjUuMS4xLmphciIgKSApOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiB7QGluaGVyaXREb2N9DQotICAgICAqIA0KLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLnRlc3Rpbmcuc3R1YnMuTWF2ZW5Qcm9qZWN0U3R1YiNnZXRBcnRpZmFjdHMoKQ0KLSAgICAgKi8NCi0gICAgcHVibGljIFNldCBnZXRBcnRpZmFjdHMoKQ0KLSAgICB7DQotICAgICAgICBTZXQgYXJ0aWZhY3RzID0gbmV3IEhhc2hTZXQoKTsNCi0gICAgICAgIGFydGlmYWN0cy5hZGQoIGFydGlmYWN0ICk7DQotICAgICAgICByZXR1cm4gYXJ0aWZhY3RzOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL2Fzc2VtYmxlci5qc2IgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy9hc3NlbWJsZXIuanNiCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTM0NjUxLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL2Fzc2VtYmxlci5qc2IKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi3vu788P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTxwcm9qZWN0IHBhdGg9IiIgbmFtZT0idGVzdCIgYXV0aG9yPSJOaWNvbGFzIERlIExvb2YiIHZlcnNpb249IjEuMCIgY29weXJpZ2h0PSIkcHJvamVjdE5hbWUmI3hEOyYjeEE7Q29weXJpZ2h0KGMpIDIwMDYsICRhdXRob3IuJiN4RDsmI3hBOyYjeEQ7JiN4QTtUaGlzIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgQlNEIGxpY2Vuc2UuIFVzZSBpdCBhcyB5b3Ugd2lzaCwgJiN4RDsmI3hBO2J1dCBrZWVwIHRoaXMgY29weXJpZ2h0IGludGFjdC4iIG91dHB1dD0iJHByb2plY3RcdGFyZ2V0IiBzb3VyY2U9InRydWUiIHNvdXJjZS1kaXI9IiRvdXRwdXRcIiBtaW5pZnk9IkZhbHNlIiBtaW4tZGlyPSIkb3V0cHV0XGJ1aWxkIiBkb2M9IkZhbHNlIiBkb2MtZGlyPSIkb3V0cHV0XGRvY3MiIG1hc3Rlcj0idHJ1ZSIgbWFzdGVyLWZpbGU9IiRvdXRwdXRceXVpLWV4dC5qcyIgemlwPSJ0cnVlIiB6aXAtZmlsZT0iJG91dHB1dFx5dW8tZXh0LiR2ZXJzaW9uLnppcCI+DQotICA8ZGlyZWN0b3J5IG5hbWU9InNjcmlwdHMiIC8+DQotICA8ZmlsZSBuYW1lPSJzY3JpcHRzXGJ1aWxkZXIuanMiIHBhdGg9IiIgLz4NCi0gIDxmaWxlIG5hbWU9InNjcmlwdHNcY29udHJvbHMuanMiIHBhdGg9IiIgLz4NCi0gIDxmaWxlIG5hbWU9InNjcmlwdHNcZHJhZ2Ryb3AuanMiIHBhdGg9IiIgLz4NCi0gIDxmaWxlIG5hbWU9InNjcmlwdHNcZWZmZWN0cy5qcyIgcGF0aD0iIiAvPg0KLSAgPGZpbGUgbmFtZT0ic2NyaXB0c1xnbG9iYWwuanMiIHBhdGg9IiIgLz4NCi0gIDxmaWxlIG5hbWU9InNjcmlwdHNcc2NyaXB0YWN1bG91cy5qcyIgcGF0aD0iIiAvPg0KLSAgPGZpbGUgbmFtZT0ic2NyaXB0c1xzbGlkZXIuanMiIHBhdGg9IiIgLz4NCi0gIDxmaWxlIG5hbWU9InNjcmlwdHNcdW5pdHRlc3QuanMiIHBhdGg9IiIgLz4NCi0gIDx0YXJnZXQgbmFtZT0idGVzdCIgZmlsZT0iJG91dHB1dFx0ZXN0LmpzIiBkZWJ1Zz0iRmFsc2UiIHNob3J0aGFuZD0iRmFsc2UiIHNob3J0aGFuZC1saXN0PSJZQUhPTy51dGlsLkRvbS5zZXRTdHlsZSYjeEQ7JiN4QTtZQUhPTy51dGlsLkRvbS5nZXRTdHlsZSYjeEQ7JiN4QTtZQUhPTy51dGlsLkRvbS5nZXRSZWdpb24mI3hEOyYjeEE7WUFIT08udXRpbC5Eb20uZ2V0Vmlld3BvcnRIZWlnaHQmI3hEOyYjeEE7WUFIT08udXRpbC5Eb20uZ2V0Vmlld3BvcnRXaWR0aCYjeEQ7JiN4QTtZQUhPTy51dGlsLkRvbS5nZXQmI3hEOyYjeEE7WUFIT08udXRpbC5Eb20uZ2V0WFkmI3hEOyYjeEE7WUFIT08udXRpbC5Eb20uc2V0WFkmI3hEOyYjeEE7WUFIT08udXRpbC5DdXN0b21FdmVudCYjeEQ7JiN4QTtZQUhPTy51dGlsLkV2ZW50LmFkZExpc3RlbmVyJiN4RDsmI3hBO1lBSE9PLnV0aWwuRXZlbnQuZ2V0RXZlbnQmI3hEOyYjeEE7WUFIT08udXRpbC5FdmVudC5nZXRUYXJnZXQmI3hEOyYjeEE7WUFIT08udXRpbC5FdmVudC5wcmV2ZW50RGVmYXVsdCYjeEQ7JiN4QTtZQUhPTy51dGlsLkV2ZW50LnN0b3BFdmVudCYjeEQ7JiN4QTtZQUhPTy51dGlsLkV2ZW50LnN0b3BQcm9wYWdhdGlvbiYjeEQ7JiN4QTtZQUhPTy51dGlsLkV2ZW50LnN0b3BFdmVudCYjeEQ7JiN4QTtZQUhPTy51dGlsLkFuaW0mI3hEOyYjeEE7WUFIT08udXRpbC5Nb3Rpb24mI3hEOyYjeEE7WUFIT08udXRpbC5Db25uZWN0LmFzeW5jUmVxdWVzdCYjeEQ7JiN4QTtZQUhPTy51dGlsLkNvbm5lY3Quc2V0Rm9ybSYjeEQ7JiN4QTtZQUhPTy51dGlsLkRvbSYjeEQ7JiN4QTtZQUhPTy51dGlsLkV2ZW50Ij4NCi0gICAgPGluY2x1ZGUgbmFtZT0ic2NyaXB0c1xidWlsZGVyLmpzIiAvPg0KLSAgICA8aW5jbHVkZSBuYW1lPSJzY3JpcHRzXGNvbnRyb2xzLmpzIiAvPg0KLSAgICA8aW5jbHVkZSBuYW1lPSJzY3JpcHRzXGRyYWdkcm9wLmpzIiAvPg0KLSAgPC90YXJnZXQ+DQotICA8dGFyZ2V0IG5hbWU9InRlc3QyIiBmaWxlPSIkb3V0cHV0XHRlc3QyLmpzIiBkZWJ1Zz0iRmFsc2UiIHNob3J0aGFuZD0iRmFsc2UiIHNob3J0aGFuZC1saXN0PSJZQUhPTy51dGlsLkRvbS5zZXRTdHlsZSYjeEQ7JiN4QTtZQUhPTy51dGlsLkRvbS5nZXRTdHlsZSYjeEQ7JiN4QTtZQUhPTy51dGlsLkRvbS5nZXRSZWdpb24mI3hEOyYjeEE7WUFIT08udXRpbC5Eb20uZ2V0Vmlld3BvcnRIZWlnaHQmI3hEOyYjeEE7WUFIT08udXRpbC5Eb20uZ2V0Vmlld3BvcnRXaWR0aCYjeEQ7JiN4QTtZQUhPTy51dGlsLkRvbS5nZXQmI3hEOyYjeEE7WUFIT08udXRpbC5Eb20uZ2V0WFkmI3hEOyYjeEE7WUFIT08udXRpbC5Eb20uc2V0WFkmI3hEOyYjeEE7WUFIT08udXRpbC5DdXN0b21FdmVudCYjeEQ7JiN4QTtZQUhPTy51dGlsLkV2ZW50LmFkZExpc3RlbmVyJiN4RDsmI3hBO1lBSE9PLnV0aWwuRXZlbnQuZ2V0RXZlbnQmI3hEOyYjeEE7WUFIT08udXRpbC5FdmVudC5nZXRUYXJnZXQmI3hEOyYjeEE7WUFIT08udXRpbC5FdmVudC5wcmV2ZW50RGVmYXVsdCYjeEQ7JiN4QTtZQUhPTy51dGlsLkV2ZW50LnN0b3BFdmVudCYjeEQ7JiN4QTtZQUhPTy51dGlsLkV2ZW50LnN0b3BQcm9wYWdhdGlvbiYjeEQ7JiN4QTtZQUhPTy51dGlsLkV2ZW50LnN0b3BFdmVudCYjeEQ7JiN4QTtZQUhPTy51dGlsLkFuaW0mI3hEOyYjeEE7WUFIT08udXRpbC5Nb3Rpb24mI3hEOyYjeEE7WUFIT08udXRpbC5Db25uZWN0LmFzeW5jUmVxdWVzdCYjeEQ7JiN4QTtZQUhPTy51dGlsLkNvbm5lY3Quc2V0Rm9ybSYjeEQ7JiN4QTtZQUhPTy51dGlsLkRvbSYjeEQ7JiN4QTtZQUhPTy51dGlsLkV2ZW50Ij4NCi0gICAgPGluY2x1ZGUgbmFtZT0ic2NyaXB0c1xzY3JpcHRhY3Vsb3VzLmpzIiAvPg0KLSAgICA8aW5jbHVkZSBuYW1lPSJzY3JpcHRzXGVmZmVjdHMuanMiIC8+DQotICAgIDxpbmNsdWRlIG5hbWU9InNjcmlwdHNcc2xpZGVyLmpzIiAvPg0KLSAgPC90YXJnZXQ+DQotPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL2Fzc2VtYmxlci54bWwgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy9hc3NlbWJsZXIueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNzU1ODYxLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL2Fzc2VtYmxlci54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4NCi08YXNzZW1ibGVyPg0KLSAgPHNjcmlwdHM+DQotICAgIDxzY3JpcHQ+DQotICAgICAgPGZpbGVOYW1lPnByb3RvdHlwZS5qczwvZmlsZU5hbWU+DQotICAgICAgPGluY2x1ZGVzPg0KLSAgICAgICAgPGluY2x1ZGU+YnVpbGRlci5qczwvaW5jbHVkZT4NCi0gICAgICAgIDxpbmNsdWRlPmNvbnRyb2xzLmpzPC9pbmNsdWRlPg0KLSAgICAgICAgPGluY2x1ZGU+ZHJhZ2Ryb3AuanM8L2luY2x1ZGU+DQotICAgICAgICA8aW5jbHVkZT5lZmZlY3RzLmpzPC9pbmNsdWRlPg0KLSAgICAgICAgPGluY2x1ZGU+Z2xvYmFsLmpzPC9pbmNsdWRlPg0KLSAgICAgICAgPGluY2x1ZGU+c2xpZGVyLmpzPC9pbmNsdWRlPg0KLSAgICAgIDwvaW5jbHVkZXM+DQotICAgIDwvc2NyaXB0Pg0KLSAgPC9zY3JpcHRzPg0KLTwvYXNzZW1ibGVyPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL2F0dGFjaC1jb21wcmVzc2VkLnBvbSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL2F0dGFjaC1jb21wcmVzc2VkLnBvbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzM3ODM2NS4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy9hdHRhY2gtY29tcHJlc3NlZC5wb20KKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi08cHJvamVjdD4NCi0gIDxidWlsZD4NCi0gICAgPHBsdWdpbnM+DQotICAgICAgPHBsdWdpbj4NCi0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzPC9ncm91cElkPg0KLSAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbjwvYXJ0aWZhY3RJZD4NCi0gICAgICAgIDxjb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8cHJvamVjdCBpbXBsZW1lbnRhdGlvbj0ib3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4udGVzdGluZy5zdHVicy5NYXZlblByb2plY3RTdHViIj4NCi0gICAgICAgICAgICA8YXJ0aWZhY3QgaW1wbGVtZW50YXRpb249Im9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5qbXQuc3R1Yi5BcnRpZmFjdFN0dWIiPg0KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD50ZXN0PC9ncm91cElkPg0KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD50ZXN0PC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgICAgICA8dmVyc2lvbj4xPC92ZXJzaW9uPg0KLSAgICAgICAgICAgICAgICA8dHlwZT5qYXZhc2NyaXB0PC90eXBlPg0KLSAgICAgICAgICAgIDwvYXJ0aWZhY3Q+DQotICAgICAgICAgICAgPGZpbGU+JHtiYXNlZGlyfS9zcmMvdGVzdC9yZXNvdXJjZXMvYXR0YWNoLWNvbXByZXNzZWQucG9tPC9maWxlPg0KLSAgICAgICAgICA8L3Byb2plY3Q+DQotICAgICAgICAgIDxhcmNoaXZlciBpbXBsZW1lbnRhdGlvbj0ib3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LmptdC5hcmNoaXZlLkphdmFzY3JpcHRBcmNoaXZlciIvPg0KLSAgICAgICAgICA8c2NyaXB0c0RpcmVjdG9yeT4ke2Jhc2VkaXJ9L3NyYy90ZXN0L3Jlc291cmNlcy9zY3JpcHRzPC9zY3JpcHRzRGlyZWN0b3J5Pg0KLSAgICAgICAgICA8Y29tcHJlc3NlZERpcmVjdG9yeT4ke2Jhc2VkaXJ9L3RhcmdldC90ZXN0LXRhcmdldC9hdHRhY2gtY29tcHJlc3NlZDwvY29tcHJlc3NlZERpcmVjdG9yeT4NCi0gICAgICAgICAgPGJ1aWxkRGlyZWN0b3J5PiR7YmFzZWRpcn0vdGFyZ2V0L3Rlc3QtdGFyZ2V0L2F0dGFjaC1jb21wcmVzc2VkPC9idWlsZERpcmVjdG9yeT4NCi0gICAgICAgICAgPGZpbmFsTmFtZT5zY3JpcHRhY3Vsb3VzLTEuNzwvZmluYWxOYW1lPg0KLSAgICAgICAgICA8b3B0aW1pemF0aW9uTGV2ZWw+OTwvb3B0aW1pemF0aW9uTGV2ZWw+DQotICAgICAgICAgIDxjbGFzc2lmaWVyPmNvbXByZXNzZWQ8L2NsYXNzaWZpZXI+DQotICAgICAgICAgIDxjb21wcmVzc29yPmpzbWluPC9jb21wcmVzc29yPg0KLSAgICAgICAgPC9jb25maWd1cmF0aW9uPg0KLSAgICAgIDwvcGx1Z2luPg0KLSAgICA8L3BsdWdpbnM+DQotICA8L2J1aWxkPg0KLTwvcHJvamVjdD4NCi0NCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy9jb21waWxlLnBvbSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL2NvbXBpbGUucG9tCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDQwZGQyLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL2NvbXBpbGUucG9tCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotPHByb2plY3Q+DQotICA8YnVpbGQ+DQotICAgIDxwbHVnaW5zPg0KLSAgICAgIDxwbHVnaW4+DQotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29sczwvZ3JvdXBJZD4NCi0gICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW48L2FydGlmYWN0SWQ+DQotICAgICAgICA8Y29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPHNvdXJjZURpcmVjdG9yeT5zcmMvdGVzdC9yZXNvdXJjZXMvc2NyaXB0czwvc291cmNlRGlyZWN0b3J5Pg0KLSAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PnRhcmdldC90ZXN0LXRhcmdldC9jb21waWxlPC9vdXRwdXREaXJlY3Rvcnk+DQotICAgICAgICAgIDxkZXNjcmlwdG9yPnNyYy90ZXN0L3Jlc291cmNlcy9hc3NlbWJsZXIueG1sPC9kZXNjcmlwdG9yPg0KLSAgICAgICAgPC9jb25maWd1cmF0aW9uPg0KLSAgICAgIDwvcGx1Z2luPg0KLSAgICA8L3BsdWdpbnM+DQotICA8L2J1aWxkPg0KLTwvcHJvamVjdD4NCi0NCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy9jb21wcmVzcy16ZXJvLWxlbmd0aC5wb20gYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy9jb21wcmVzcy16ZXJvLWxlbmd0aC5wb20KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3Nzc2YmIuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvY29tcHJlc3MtemVyby1sZW5ndGgucG9tCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotPHByb2plY3Q+DQotICA8YnVpbGQ+DQotICAgIDxwbHVnaW5zPg0KLSAgICAgIDxwbHVnaW4+DQotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29sczwvZ3JvdXBJZD4NCi0gICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW48L2FydGlmYWN0SWQ+DQotICAgICAgICA8Y29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgPHdlYmFwcERpcmVjdG9yeT4ke2Jhc2VkaXJ9L3RhcmdldC90ZXN0LXRhcmdldDwvd2ViYXBwRGlyZWN0b3J5Pg0KLSAgICAgICAgICA8c2NyaXB0cz5jb21wcmVzcy16ZXJvLWxlbmd0aDwvc2NyaXB0cz4NCi0gICAgICAgICAgPGNsYXNzaWZpZXI+bWluPC9jbGFzc2lmaWVyPg0KLSAgICAgICAgICA8Y29tcHJlc3Nvcj5qc21pbjwvY29tcHJlc3Nvcj4NCi0gICAgICAgIDwvY29uZmlndXJhdGlvbj4NCi0gICAgICA8L3BsdWdpbj4NCi0gICAgPC9wbHVnaW5zPg0KLSAgPC9idWlsZD4NCi08L3Byb2plY3Q+DQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvY29tcHJlc3MucG9tIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvY29tcHJlc3MucG9tCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NDgwNGE4Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL2NvbXByZXNzLnBvbQorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTxwcm9qZWN0Pg0KLSAgPGJ1aWxkPg0KLSAgICA8cGx1Z2lucz4NCi0gICAgICA8cGx1Z2luPg0KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHM8L2dyb3VwSWQ+DQotICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luPC9hcnRpZmFjdElkPg0KLSAgICAgICAgPGNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDx3ZWJhcHBEaXJlY3Rvcnk+JHtiYXNlZGlyfS90YXJnZXQvdGVzdC10YXJnZXQ8L3dlYmFwcERpcmVjdG9yeT4NCi0gICAgICAgICAgPHNjcmlwdHM+Y29tcHJlc3M8L3NjcmlwdHM+DQotICAgICAgICAgIDxjbGFzc2lmaWVyPmNvbXByZXNzZWQ8L2NsYXNzaWZpZXI+DQotICAgICAgICAgIDxjb21wcmVzc29yPmpzbWluPC9jb21wcmVzc29yPg0KLSAgICAgICAgPC9jb25maWd1cmF0aW9uPg0KLSAgICAgIDwvcGx1Z2luPg0KLSAgICA8L3BsdWdpbnM+DQotICA8L2J1aWxkPg0KLTwvcHJvamVjdD4NCi0NCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy9qc3VuaXQvYXNzZXJ0aW9uVGVzdHMuanMgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy9qc3VuaXQvYXNzZXJ0aW9uVGVzdHMuanMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3MjY3ZWUuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvanN1bml0L2Fzc2VydGlvblRlc3RzLmpzCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi0NCi0vLyBKc1VuaXQgQXNzZXJ0aW9uIFRlc3RzDQotZnVuY3Rpb24gdGVzdEFzc2VydCgpIHsNCi0gIGFzc2VydCgidHJ1ZSBzaG91bGQgYmUgdHJ1ZSIsIHRydWUpOw0KLSAgYXNzZXJ0KHRydWUpOw0KLX0NCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy9qc3VuaXQvanNVbml0QXNzZXJ0aW9uVGVzdHMuaHRtbCBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL2pzdW5pdC9qc1VuaXRBc3NlcnRpb25UZXN0cy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYmQ5MWU3Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL2pzdW5pdC9qc1VuaXRBc3NlcnRpb25UZXN0cy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiINCi0iaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4NCi0NCi08aHRtbD4NCi08IS0tIEpzVW5pdCAtLT4NCi08IS0tICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioNCi0gICAtIFZlcnNpb246IE1QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQ0KLSAgIC0NCi0gICAtIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbg0KLSAgIC0gMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQotICAgLSB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICAgLSBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8NCi0gICAtDQotICAgLSBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLA0KLSAgIC0gV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlDQotICAgLSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQ0KLSAgIC0gTGljZW5zZS4NCi0gICAtDQotICAgLSBUaGUgT3JpZ2luYWwgQ29kZSBpcyBFZHdhcmQgSGllYXR0IGNvZGUuDQotICAgLQ0KLSAgIC0gVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzDQotICAgLSBFZHdhcmQgSGllYXR0LCBlZHdhcmRAanN1bml0Lm5ldC4NCi0gICAtIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMDENCi0gICAtIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCi0gICAtDQotICAgLSBDb250cmlidXRvcihzKToNCi0gICAtIEVkd2FyZCBIaWVhdHQsIGVkd2FyZEBqc3VuaXQubmV0IChvcmlnaW5hbCBhdXRob3IpDQotICAgLSBCb2IgQ2xhcnksIGJjQGJjbGFyeS5jb21uDQotICAgLQ0KLSAgIC0gQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YNCi0gICAtIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcg0KLSAgIC0gdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSBvciBsYXRlciAodGhlICJMR1BMIiksDQotICAgLSBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZA0KLSAgIC0gb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkNCi0gICAtIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdQTCBvciB0aGUgTEdQTCwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8NCi0gICAtIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyDQotICAgLSBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQ0KLSAgIC0gYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIExHUEwgb3IgdGhlIEdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUNCi0gICAtIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXINCi0gICAtIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuDQotICAgLQ0KLSAgIC0gKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKiogLS0+DQotDQotICA8aGVhZD4NCi0gIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij4NCi0gICAgPHRpdGxlPkpzVW5pdCBBc3NlcnRpb24gVGVzdHM8L3RpdGxlPg0KLSAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSJjc3MvanNVbml0U3R5bGUuY3NzIj4NCi08c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0IiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iYXBwL2pzVW5pdENvcmUuanMiPjwvc2NyaXB0Pg0KLTxzY3JpcHQgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+DQotDQotLy8gSnNVbml0IEFzc2VydGlvbiBUZXN0cw0KLWZ1bmN0aW9uIHRlc3RBc3NlcnQoKSB7DQotICBhc3NlcnQoInRydWUgc2hvdWxkIGJlIHRydWUiLCB0cnVlKTsNCi0gIGFzc2VydCh0cnVlKTsNCi19DQotDQotPC9zY3JpcHQ+DQotICA8L2hlYWQ+DQotDQotICA8Ym9keT4NCi0gICAgPGgxPkpzVW5pdCBBc3NlcnRpb24gVGVzdHM8L2gxPg0KLQ0KLSAgICA8cD5UaGlzIHBhZ2UgY29udGFpbnMgdGVzdHMgZm9yIHRoZSBKc1VuaXQgQXNzZXJ0aW9uDQotICAgIGZ1bmN0aW9ucy4gVG8gc2VlIHRoZW0sIHRha2UgYSBsb29rIGF0IHRoZSBzb3VyY2UuPC9wPg0KLSAgPC9ib2R5Pg0KLTwvaHRtbD4NCi0NCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy9qc3VuaXQvanN1bml0LXRlc3RSdW5uZXItMi4xLmpzYXIgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy9qc3VuaXQvanN1bml0LXRlc3RSdW5uZXItMi4xLmpzYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1MTBiMzQuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvanN1bml0L2pzdW5pdC10ZXN0UnVubmVyLTIuMS5qc2FyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvcHJvdG90eXBlLTEuNS4xLjEuamFyIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvcHJvdG90eXBlLTEuNS4xLjEuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYTgyMzVkLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL3Byb3RvdHlwZS0xLjUuMS4xLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL3NjcmlwdHMvYnVpbGRlci5qcyBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL3NjcmlwdHMvYnVpbGRlci5qcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTczNzYyMS4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy9zY3JpcHRzL2J1aWxkZXIuanMKKysrIC9kZXYvbnVsbApAQCAtMSwxMTkgKzAsMCBAQAotLy8gc2NyaXB0LmFjdWxvLnVzIGJ1aWxkZXIuanMgdjEuNi40LCBXZWQgU2VwIDA2IDExOjMwOjU4IENFU1QgMjAwNgotCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUgVGhvbWFzIEZ1Y2hzIChodHRwOi8vc2NyaXB0LmFjdWxvLnVzLCBodHRwOi8vbWlyLmFjdWxvLnVzKQotLy8KLS8vIFNlZSBzY3JpcHRhY3Vsb3VzLmpzIGZvciBmdWxsIGxpY2Vuc2UuCi0KLXZhciBCdWlsZGVyID0gewotICBOT0RFTUFQOiB7Ci0gICAgQVJFQTogJ21hcCcsCi0gICAgQ0FQVElPTjogJ3RhYmxlJywKLSAgICBDT0w6ICd0YWJsZScsCi0gICAgQ09MR1JPVVA6ICd0YWJsZScsCi0gICAgTEVHRU5EOiAnZmllbGRzZXQnLAotICAgIE9QVEdST1VQOiAnc2VsZWN0JywKLSAgICBPUFRJT046ICdzZWxlY3QnLAotICAgIFBBUkFNOiAnb2JqZWN0JywKLSAgICBUQk9EWTogJ3RhYmxlJywKLSAgICBURDogJ3RhYmxlJywKLSAgICBURk9PVDogJ3RhYmxlJywKLSAgICBUSDogJ3RhYmxlJywKLSAgICBUSEVBRDogJ3RhYmxlJywKLSAgICBUUjogJ3RhYmxlJwotICB9LAotICAvLyBub3RlOiBGb3IgRmlyZWZveCA8IDEuNSwgT1BUSU9OIGFuZCBPUFRHUk9VUCB0YWdzIGFyZSBjdXJyZW50bHkgYnJva2VuLAotICAvLyAgICAgICBkdWUgdG8gYSBGaXJlZm94IGJ1ZwotICBub2RlOiBmdW5jdGlvbihlbGVtZW50TmFtZSkgewotICAgIGVsZW1lbnROYW1lID0gZWxlbWVudE5hbWUudG9VcHBlckNhc2UoKTsKLSAgICAKLSAgICAvLyB0cnkgaW5uZXJIVE1MIGFwcHJvYWNoCi0gICAgdmFyIHBhcmVudFRhZyA9IHRoaXMuTk9ERU1BUFtlbGVtZW50TmFtZV0gfHwgJ2Rpdic7Ci0gICAgdmFyIHBhcmVudEVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KHBhcmVudFRhZyk7Ci0gICAgdHJ5IHsgLy8gcHJldmVudCBJRSAiZmVhdHVyZSI6IGh0dHA6Ly9kZXYucnVieW9ucmFpbHMub3JnL3RpY2tldC8yNzA3Ci0gICAgICBwYXJlbnRFbGVtZW50LmlubmVySFRNTCA9ICI8IiArIGVsZW1lbnROYW1lICsgIj48LyIgKyBlbGVtZW50TmFtZSArICI+IjsKLSAgICB9IGNhdGNoKGUpIHt9Ci0gICAgdmFyIGVsZW1lbnQgPSBwYXJlbnRFbGVtZW50LmZpcnN0Q2hpbGQgfHwgbnVsbDsKLSAgICAgIAotICAgIC8vIHNlZSBpZiBicm93c2VyIGFkZGVkIHdyYXBwaW5nIHRhZ3MKLSAgICBpZihlbGVtZW50ICYmIChlbGVtZW50LnRhZ05hbWUgIT0gZWxlbWVudE5hbWUpKQotICAgICAgZWxlbWVudCA9IGVsZW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoZWxlbWVudE5hbWUpWzBdOwotICAgIAotICAgIC8vIGZhbGxiYWNrIHRvIGNyZWF0ZUVsZW1lbnQgYXBwcm9hY2gKLSAgICBpZighZWxlbWVudCkgZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoZWxlbWVudE5hbWUpOwotICAgIAotICAgIC8vIGFib3J0IGlmIG5vdGhpbmcgY291bGQgYmUgY3JlYXRlZAotICAgIGlmKCFlbGVtZW50KSByZXR1cm47Ci0KLSAgICAvLyBhdHRyaWJ1dGVzIChvciB0ZXh0KQotICAgIGlmKGFyZ3VtZW50c1sxXSkKLSAgICAgIGlmKHRoaXMuX2lzU3RyaW5nT3JOdW1iZXIoYXJndW1lbnRzWzFdKSB8fAotICAgICAgICAoYXJndW1lbnRzWzFdIGluc3RhbmNlb2YgQXJyYXkpKSB7Ci0gICAgICAgICAgdGhpcy5fY2hpbGRyZW4oZWxlbWVudCwgYXJndW1lbnRzWzFdKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICB2YXIgYXR0cnMgPSB0aGlzLl9hdHRyaWJ1dGVzKGFyZ3VtZW50c1sxXSk7Ci0gICAgICAgICAgaWYoYXR0cnMubGVuZ3RoKSB7Ci0gICAgICAgICAgICB0cnkgeyAvLyBwcmV2ZW50IElFICJmZWF0dXJlIjogaHR0cDovL2Rldi5ydWJ5b25yYWlscy5vcmcvdGlja2V0LzI3MDcKLSAgICAgICAgICAgICAgcGFyZW50RWxlbWVudC5pbm5lckhUTUwgPSAiPCIgK2VsZW1lbnROYW1lICsgIiAiICsKLSAgICAgICAgICAgICAgICBhdHRycyArICI+PC8iICsgZWxlbWVudE5hbWUgKyAiPiI7Ci0gICAgICAgICAgICB9IGNhdGNoKGUpIHt9Ci0gICAgICAgICAgICBlbGVtZW50ID0gcGFyZW50RWxlbWVudC5maXJzdENoaWxkIHx8IG51bGw7Ci0gICAgICAgICAgICAvLyB3b3JrYXJvdW5kIGZpcmVmb3ggMS4wLlggYnVnCi0gICAgICAgICAgICBpZighZWxlbWVudCkgewotICAgICAgICAgICAgICBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChlbGVtZW50TmFtZSk7Ci0gICAgICAgICAgICAgIGZvcihhdHRyIGluIGFyZ3VtZW50c1sxXSkgCi0gICAgICAgICAgICAgICAgZWxlbWVudFthdHRyID09ICdjbGFzcycgPyAnY2xhc3NOYW1lJyA6IGF0dHJdID0gYXJndW1lbnRzWzFdW2F0dHJdOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYoZWxlbWVudC50YWdOYW1lICE9IGVsZW1lbnROYW1lKQotICAgICAgICAgICAgICBlbGVtZW50ID0gcGFyZW50RWxlbWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZShlbGVtZW50TmFtZSlbMF07Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gCi0KLSAgICAvLyB0ZXh0LCBvciBhcnJheSBvZiBjaGlsZHJlbgotICAgIGlmKGFyZ3VtZW50c1syXSkKLSAgICAgIHRoaXMuX2NoaWxkcmVuKGVsZW1lbnQsIGFyZ3VtZW50c1syXSk7Ci0KLSAgICAgcmV0dXJuIGVsZW1lbnQ7Ci0gIH0sCi0gIF90ZXh0OiBmdW5jdGlvbih0ZXh0KSB7Ci0gICAgIHJldHVybiBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSh0ZXh0KTsKLSAgfSwKLSAgX2F0dHJpYnV0ZXM6IGZ1bmN0aW9uKGF0dHJpYnV0ZXMpIHsKLSAgICB2YXIgYXR0cnMgPSBbXTsKLSAgICBmb3IoYXR0cmlidXRlIGluIGF0dHJpYnV0ZXMpCi0gICAgICBhdHRycy5wdXNoKChhdHRyaWJ1dGU9PSdjbGFzc05hbWUnID8gJ2NsYXNzJyA6IGF0dHJpYnV0ZSkgKwotICAgICAgICAgICc9IicgKyBhdHRyaWJ1dGVzW2F0dHJpYnV0ZV0udG9TdHJpbmcoKS5lc2NhcGVIVE1MKCkgKyAnIicpOwotICAgIHJldHVybiBhdHRycy5qb2luKCIgIik7Ci0gIH0sCi0gIF9jaGlsZHJlbjogZnVuY3Rpb24oZWxlbWVudCwgY2hpbGRyZW4pIHsKLSAgICBpZih0eXBlb2YgY2hpbGRyZW49PSdvYmplY3QnKSB7IC8vIGFycmF5IGNhbiBob2xkIG5vZGVzIGFuZCB0ZXh0Ci0gICAgICBjaGlsZHJlbi5mbGF0dGVuKCkuZWFjaCggZnVuY3Rpb24oZSkgewotICAgICAgICBpZih0eXBlb2YgZT09J29iamVjdCcpCi0gICAgICAgICAgZWxlbWVudC5hcHBlbmRDaGlsZChlKQotICAgICAgICBlbHNlCi0gICAgICAgICAgaWYoQnVpbGRlci5faXNTdHJpbmdPck51bWJlcihlKSkKLSAgICAgICAgICAgIGVsZW1lbnQuYXBwZW5kQ2hpbGQoQnVpbGRlci5fdGV4dChlKSk7Ci0gICAgICB9KTsKLSAgICB9IGVsc2UKLSAgICAgIGlmKEJ1aWxkZXIuX2lzU3RyaW5nT3JOdW1iZXIoY2hpbGRyZW4pKSAKLSAgICAgICAgIGVsZW1lbnQuYXBwZW5kQ2hpbGQoQnVpbGRlci5fdGV4dChjaGlsZHJlbikpOwotICB9LAotICBfaXNTdHJpbmdPck51bWJlcjogZnVuY3Rpb24ocGFyYW0pIHsKLSAgICByZXR1cm4odHlwZW9mIHBhcmFtPT0nc3RyaW5nJyB8fCB0eXBlb2YgcGFyYW09PSdudW1iZXInKTsKLSAgfSwKLSAgZHVtcDogZnVuY3Rpb24oc2NvcGUpIHsgCi0gICAgaWYodHlwZW9mIHNjb3BlICE9ICdvYmplY3QnICYmIHR5cGVvZiBzY29wZSAhPSAnZnVuY3Rpb24nKSBzY29wZSA9IHdpbmRvdzsgLy9nbG9iYWwgc2NvcGUgCi0gIAotICAgIHZhciB0YWdzID0gKCJBIEFCQlIgQUNST05ZTSBBRERSRVNTIEFQUExFVCBBUkVBIEIgQkFTRSBCQVNFRk9OVCBCRE8gQklHIEJMT0NLUVVPVEUgQk9EWSAiICsKLSAgICAgICJCUiBCVVRUT04gQ0FQVElPTiBDRU5URVIgQ0lURSBDT0RFIENPTCBDT0xHUk9VUCBERCBERUwgREZOIERJUiBESVYgREwgRFQgRU0gRklFTERTRVQgIiArCi0gICAgICAiRk9OVCBGT1JNIEZSQU1FIEZSQU1FU0VUIEgxIEgyIEgzIEg0IEg1IEg2IEhFQUQgSFIgSFRNTCBJIElGUkFNRSBJTUcgSU5QVVQgSU5TIElTSU5ERVggIisKLSAgICAgICJLQkQgTEFCRUwgTEVHRU5EIExJIExJTksgTUFQIE1FTlUgTUVUQSBOT0ZSQU1FUyBOT1NDUklQVCBPQkpFQ1QgT0wgT1BUR1JPVVAgT1BUSU9OIFAgIisKLSAgICAgICJQQVJBTSBQUkUgUSBTIFNBTVAgU0NSSVBUIFNFTEVDVCBTTUFMTCBTUEFOIFNUUklLRSBTVFJPTkcgU1RZTEUgU1VCIFNVUCBUQUJMRSBUQk9EWSBURCAiKwotICAgICAgIlRFWFRBUkVBIFRGT09UIFRIIFRIRUFEIFRJVExFIFRSIFRUIFUgVUwgVkFSIikuc3BsaXQoL1xzKy8pOwotICAKLSAgICB0YWdzLmVhY2goIGZ1bmN0aW9uKHRhZyl7IAotICAgICAgc2NvcGVbdGFnXSA9IGZ1bmN0aW9uKCkgeyAKLSAgICAgICAgcmV0dXJuIEJ1aWxkZXIubm9kZS5hcHBseShCdWlsZGVyLCBbdGFnXS5jb25jYXQoJEEoYXJndW1lbnRzKSkpOyAgCi0gICAgICB9IAotICAgIH0pOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvc2NyaXB0cy9jb250cm9scy5qcyBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL3NjcmlwdHMvY29udHJvbHMuanMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiNDE4NmQuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvc2NyaXB0cy9jb250cm9scy5qcworKysgL2Rldi9udWxsCkBAIC0xLDgzMyArMCwwIEBACi0vLyBzY3JpcHQuYWN1bG8udXMgY29udHJvbHMuanMgdjEuNi40LCBXZWQgU2VwIDA2IDExOjMwOjU4IENFU1QgMjAwNgotCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUgVGhvbWFzIEZ1Y2hzIChodHRwOi8vc2NyaXB0LmFjdWxvLnVzLCBodHRwOi8vbWlyLmFjdWxvLnVzKQotLy8gICAgICAgICAgIChjKSAyMDA1IEl2YW4gS3JzdGljIChodHRwOi8vYmxvZ3MubGF3LmhhcnZhcmQuZWR1L2l2YW4pCi0vLyAgICAgICAgICAgKGMpIDIwMDUgSm9uIFRpcnNlbiAoaHR0cDovL3d3dy50aXJzZW4uY29tKQotLy8gQ29udHJpYnV0b3JzOgotLy8gIFJpY2hhcmQgTGl2c2V5Ci0vLyAgUmFodWwgQmhhcmdhdmEKLS8vICBSb2IgV2lsbHMKLS8vIAotLy8gU2VlIHNjcmlwdGFjdWxvdXMuanMgZm9yIGZ1bGwgbGljZW5zZS4KLQotLy8gQXV0b2NvbXBsZXRlci5CYXNlIGhhbmRsZXMgYWxsIHRoZSBhdXRvY29tcGxldGlvbiBmdW5jdGlvbmFsaXR5IAotLy8gdGhhdCdzIGluZGVwZW5kZW50IG9mIHRoZSBkYXRhIHNvdXJjZSBmb3IgYXV0b2NvbXBsZXRpb24uIFRoaXMKLS8vIGluY2x1ZGVzIGRyYXdpbmcgdGhlIGF1dG9jb21wbGV0aW9uIG1lbnUsIG9ic2VydmluZyBrZXlib2FyZAotLy8gYW5kIG1vdXNlIGV2ZW50cywgYW5kIHNpbWlsYXIuCi0vLwotLy8gU3BlY2lmaWMgYXV0b2NvbXBsZXRlcnMgbmVlZCB0byBwcm92aWRlLCBhdCB0aGUgdmVyeSBsZWFzdCwgCi0vLyBhIGdldFVwZGF0ZWRDaG9pY2VzIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBpbnZva2VkIGV2ZXJ5IHRpbWUKLS8vIHRoZSB0ZXh0IGluc2lkZSB0aGUgbW9uaXRvcmVkIHRleHRib3ggY2hhbmdlcy4gVGhpcyBtZXRob2QgCi0vLyBzaG91bGQgZ2V0IHRoZSB0ZXh0IGZvciB3aGljaCB0byBwcm92aWRlIGF1dG9jb21wbGV0aW9uIGJ5Ci0vLyBpbnZva2luZyB0aGlzLmdldFRva2VuKCksIE5PVCBieSBkaXJlY3RseSBhY2Nlc3NpbmcKLS8vIHRoaXMuZWxlbWVudC52YWx1ZS4gVGhpcyBpcyB0byBhbGxvdyBpbmNyZW1lbnRhbCB0b2tlbml6ZWQKLS8vIGF1dG9jb21wbGV0aW9uLiBTcGVjaWZpYyBhdXRvLWNvbXBsZXRpb24gbG9naWMgKEFKQVgsIGV0YykKLS8vIGJlbG9uZ3MgaW4gZ2V0VXBkYXRlZENob2ljZXMuCi0vLwotLy8gVG9rZW5pemVkIGluY3JlbWVudGFsIGF1dG9jb21wbGV0aW9uIGlzIGVuYWJsZWQgYXV0b21hdGljYWxseQotLy8gd2hlbiBhbiBhdXRvY29tcGxldGVyIGlzIGluc3RhbnRpYXRlZCB3aXRoIHRoZSAndG9rZW5zJyBvcHRpb24KLS8vIGluIHRoZSBvcHRpb25zIHBhcmFtZXRlciwgZS5nLjoKLS8vIG5ldyBBamF4LkF1dG9jb21wbGV0ZXIoJ2lkJywndXBkJywgJy91cmwvJywgeyB0b2tlbnM6ICcsJyB9KTsKLS8vIHdpbGwgaW5jcmVtZW50YWxseSBhdXRvY29tcGxldGUgd2l0aCBhIGNvbW1hIGFzIHRoZSB0b2tlbi4KLS8vIEFkZGl0aW9uYWxseSwgJywnIGluIHRoZSBhYm92ZSBleGFtcGxlIGNhbiBiZSByZXBsYWNlZCB3aXRoCi0vLyBhIHRva2VuIGFycmF5LCBlLmcuIHsgdG9rZW5zOiBbJywnLCAnXG4nXSB9IHdoaWNoCi0vLyBlbmFibGVzIGF1dG9jb21wbGV0aW9uIG9uIG11bHRpcGxlIHRva2Vucy4gVGhpcyBpcyBtb3N0IAotLy8gdXNlZnVsIHdoZW4gb25lIG9mIHRoZSB0b2tlbnMgaXMgXG4gKGEgbmV3bGluZSksIGFzIGl0IAotLy8gYWxsb3dzIHNtYXJ0IGF1dG9jb21wbGV0aW9uIGFmdGVyIGxpbmVicmVha3MuCi0KLWlmKHR5cGVvZiBFZmZlY3QgPT0gJ3VuZGVmaW5lZCcpCi0gIHRocm93KCJjb250cm9scy5qcyByZXF1aXJlcyBpbmNsdWRpbmcgc2NyaXB0LmFjdWxvLnVzJyBlZmZlY3RzLmpzIGxpYnJhcnkiKTsKLQotdmFyIEF1dG9jb21wbGV0ZXIgPSB7fQotQXV0b2NvbXBsZXRlci5CYXNlID0gZnVuY3Rpb24oKSB7fTsKLUF1dG9jb21wbGV0ZXIuQmFzZS5wcm90b3R5cGUgPSB7Ci0gIGJhc2VJbml0aWFsaXplOiBmdW5jdGlvbihlbGVtZW50LCB1cGRhdGUsIG9wdGlvbnMpIHsKLSAgICB0aGlzLmVsZW1lbnQgICAgID0gJChlbGVtZW50KTsgCi0gICAgdGhpcy51cGRhdGUgICAgICA9ICQodXBkYXRlKTsgIAotICAgIHRoaXMuaGFzRm9jdXMgICAgPSBmYWxzZTsgCi0gICAgdGhpcy5jaGFuZ2VkICAgICA9IGZhbHNlOyAKLSAgICB0aGlzLmFjdGl2ZSAgICAgID0gZmFsc2U7IAotICAgIHRoaXMuaW5kZXggICAgICAgPSAwOyAgICAgCi0gICAgdGhpcy5lbnRyeUNvdW50ICA9IDA7Ci0KLSAgICBpZih0aGlzLnNldE9wdGlvbnMpCi0gICAgICB0aGlzLnNldE9wdGlvbnMob3B0aW9ucyk7Ci0gICAgZWxzZQotICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucyB8fCB7fTsKLQotICAgIHRoaXMub3B0aW9ucy5wYXJhbU5hbWUgICAgPSB0aGlzLm9wdGlvbnMucGFyYW1OYW1lIHx8IHRoaXMuZWxlbWVudC5uYW1lOwotICAgIHRoaXMub3B0aW9ucy50b2tlbnMgICAgICAgPSB0aGlzLm9wdGlvbnMudG9rZW5zIHx8IFtdOwotICAgIHRoaXMub3B0aW9ucy5mcmVxdWVuY3kgICAgPSB0aGlzLm9wdGlvbnMuZnJlcXVlbmN5IHx8IDAuNDsKLSAgICB0aGlzLm9wdGlvbnMubWluQ2hhcnMgICAgID0gdGhpcy5vcHRpb25zLm1pbkNoYXJzIHx8IDE7Ci0gICAgdGhpcy5vcHRpb25zLm9uU2hvdyAgICAgICA9IHRoaXMub3B0aW9ucy5vblNob3cgfHwgCi0gICAgICBmdW5jdGlvbihlbGVtZW50LCB1cGRhdGUpeyAKLSAgICAgICAgaWYoIXVwZGF0ZS5zdHlsZS5wb3NpdGlvbiB8fCB1cGRhdGUuc3R5bGUucG9zaXRpb249PSdhYnNvbHV0ZScpIHsKLSAgICAgICAgICB1cGRhdGUuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnOwotICAgICAgICAgIFBvc2l0aW9uLmNsb25lKGVsZW1lbnQsIHVwZGF0ZSwgewotICAgICAgICAgICAgc2V0SGVpZ2h0OiBmYWxzZSwgCi0gICAgICAgICAgICBvZmZzZXRUb3A6IGVsZW1lbnQub2Zmc2V0SGVpZ2h0Ci0gICAgICAgICAgfSk7Ci0gICAgICAgIH0KLSAgICAgICAgRWZmZWN0LkFwcGVhcih1cGRhdGUse2R1cmF0aW9uOjAuMTV9KTsKLSAgICAgIH07Ci0gICAgdGhpcy5vcHRpb25zLm9uSGlkZSA9IHRoaXMub3B0aW9ucy5vbkhpZGUgfHwgCi0gICAgICBmdW5jdGlvbihlbGVtZW50LCB1cGRhdGUpeyBuZXcgRWZmZWN0LkZhZGUodXBkYXRlLHtkdXJhdGlvbjowLjE1fSkgfTsKLQotICAgIGlmKHR5cGVvZih0aGlzLm9wdGlvbnMudG9rZW5zKSA9PSAnc3RyaW5nJykgCi0gICAgICB0aGlzLm9wdGlvbnMudG9rZW5zID0gbmV3IEFycmF5KHRoaXMub3B0aW9ucy50b2tlbnMpOwotCi0gICAgdGhpcy5vYnNlcnZlciA9IG51bGw7Ci0gICAgCi0gICAgdGhpcy5lbGVtZW50LnNldEF0dHJpYnV0ZSgnYXV0b2NvbXBsZXRlJywnb2ZmJyk7Ci0KLSAgICBFbGVtZW50LmhpZGUodGhpcy51cGRhdGUpOwotCi0gICAgRXZlbnQub2JzZXJ2ZSh0aGlzLmVsZW1lbnQsICJibHVyIiwgdGhpcy5vbkJsdXIuYmluZEFzRXZlbnRMaXN0ZW5lcih0aGlzKSk7Ci0gICAgRXZlbnQub2JzZXJ2ZSh0aGlzLmVsZW1lbnQsICJrZXlwcmVzcyIsIHRoaXMub25LZXlQcmVzcy5iaW5kQXNFdmVudExpc3RlbmVyKHRoaXMpKTsKLSAgfSwKLQotICBzaG93OiBmdW5jdGlvbigpIHsKLSAgICBpZihFbGVtZW50LmdldFN0eWxlKHRoaXMudXBkYXRlLCAnZGlzcGxheScpPT0nbm9uZScpIHRoaXMub3B0aW9ucy5vblNob3codGhpcy5lbGVtZW50LCB0aGlzLnVwZGF0ZSk7Ci0gICAgaWYoIXRoaXMuaWVmaXggJiYgCi0gICAgICAobmF2aWdhdG9yLmFwcFZlcnNpb24uaW5kZXhPZignTVNJRScpPjApICYmCi0gICAgICAobmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCdPcGVyYScpPDApICYmCi0gICAgICAoRWxlbWVudC5nZXRTdHlsZSh0aGlzLnVwZGF0ZSwgJ3Bvc2l0aW9uJyk9PSdhYnNvbHV0ZScpKSB7Ci0gICAgICBuZXcgSW5zZXJ0aW9uLkFmdGVyKHRoaXMudXBkYXRlLCAKLSAgICAgICAnPGlmcmFtZSBpZD0iJyArIHRoaXMudXBkYXRlLmlkICsgJ19pZWZpeCIgJysKLSAgICAgICAnc3R5bGU9ImRpc3BsYXk6bm9uZTtwb3NpdGlvbjphYnNvbHV0ZTtmaWx0ZXI6cHJvZ2lkOkRYSW1hZ2VUcmFuc2Zvcm0uTWljcm9zb2Z0LkFscGhhKG9wYWNpdHk9MCk7IiAnICsKLSAgICAgICAnc3JjPSJqYXZhc2NyaXB0OmZhbHNlOyIgZnJhbWVib3JkZXI9IjAiIHNjcm9sbGluZz0ibm8iPjwvaWZyYW1lPicpOwotICAgICAgdGhpcy5pZWZpeCA9ICQodGhpcy51cGRhdGUuaWQrJ19pZWZpeCcpOwotICAgIH0KLSAgICBpZih0aGlzLmllZml4KSBzZXRUaW1lb3V0KHRoaXMuZml4SUVPdmVybGFwcGluZy5iaW5kKHRoaXMpLCA1MCk7Ci0gIH0sCi0gIAotICBmaXhJRU92ZXJsYXBwaW5nOiBmdW5jdGlvbigpIHsKLSAgICBQb3NpdGlvbi5jbG9uZSh0aGlzLnVwZGF0ZSwgdGhpcy5pZWZpeCwge3NldFRvcDooIXRoaXMudXBkYXRlLnN0eWxlLmhlaWdodCl9KTsKLSAgICB0aGlzLmllZml4LnN0eWxlLnpJbmRleCA9IDE7Ci0gICAgdGhpcy51cGRhdGUuc3R5bGUuekluZGV4ID0gMjsKLSAgICBFbGVtZW50LnNob3codGhpcy5pZWZpeCk7Ci0gIH0sCi0KLSAgaGlkZTogZnVuY3Rpb24oKSB7Ci0gICAgdGhpcy5zdG9wSW5kaWNhdG9yKCk7Ci0gICAgaWYoRWxlbWVudC5nZXRTdHlsZSh0aGlzLnVwZGF0ZSwgJ2Rpc3BsYXknKSE9J25vbmUnKSB0aGlzLm9wdGlvbnMub25IaWRlKHRoaXMuZWxlbWVudCwgdGhpcy51cGRhdGUpOwotICAgIGlmKHRoaXMuaWVmaXgpIEVsZW1lbnQuaGlkZSh0aGlzLmllZml4KTsKLSAgfSwKLQotICBzdGFydEluZGljYXRvcjogZnVuY3Rpb24oKSB7Ci0gICAgaWYodGhpcy5vcHRpb25zLmluZGljYXRvcikgRWxlbWVudC5zaG93KHRoaXMub3B0aW9ucy5pbmRpY2F0b3IpOwotICB9LAotCi0gIHN0b3BJbmRpY2F0b3I6IGZ1bmN0aW9uKCkgewotICAgIGlmKHRoaXMub3B0aW9ucy5pbmRpY2F0b3IpIEVsZW1lbnQuaGlkZSh0aGlzLm9wdGlvbnMuaW5kaWNhdG9yKTsKLSAgfSwKLQotICBvbktleVByZXNzOiBmdW5jdGlvbihldmVudCkgewotICAgIGlmKHRoaXMuYWN0aXZlKQotICAgICAgc3dpdGNoKGV2ZW50LmtleUNvZGUpIHsKLSAgICAgICBjYXNlIEV2ZW50LktFWV9UQUI6Ci0gICAgICAgY2FzZSBFdmVudC5LRVlfUkVUVVJOOgotICAgICAgICAgdGhpcy5zZWxlY3RFbnRyeSgpOwotICAgICAgICAgRXZlbnQuc3RvcChldmVudCk7Ci0gICAgICAgY2FzZSBFdmVudC5LRVlfRVNDOgotICAgICAgICAgdGhpcy5oaWRlKCk7Ci0gICAgICAgICB0aGlzLmFjdGl2ZSA9IGZhbHNlOwotICAgICAgICAgRXZlbnQuc3RvcChldmVudCk7Ci0gICAgICAgICByZXR1cm47Ci0gICAgICAgY2FzZSBFdmVudC5LRVlfTEVGVDoKLSAgICAgICBjYXNlIEV2ZW50LktFWV9SSUdIVDoKLSAgICAgICAgIHJldHVybjsKLSAgICAgICBjYXNlIEV2ZW50LktFWV9VUDoKLSAgICAgICAgIHRoaXMubWFya1ByZXZpb3VzKCk7Ci0gICAgICAgICB0aGlzLnJlbmRlcigpOwotICAgICAgICAgaWYobmF2aWdhdG9yLmFwcFZlcnNpb24uaW5kZXhPZignQXBwbGVXZWJLaXQnKT4wKSBFdmVudC5zdG9wKGV2ZW50KTsKLSAgICAgICAgIHJldHVybjsKLSAgICAgICBjYXNlIEV2ZW50LktFWV9ET1dOOgotICAgICAgICAgdGhpcy5tYXJrTmV4dCgpOwotICAgICAgICAgdGhpcy5yZW5kZXIoKTsKLSAgICAgICAgIGlmKG5hdmlnYXRvci5hcHBWZXJzaW9uLmluZGV4T2YoJ0FwcGxlV2ViS2l0Jyk+MCkgRXZlbnQuc3RvcChldmVudCk7Ci0gICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgIGVsc2UgCi0gICAgICAgaWYoZXZlbnQua2V5Q29kZT09RXZlbnQuS0VZX1RBQiB8fCBldmVudC5rZXlDb2RlPT1FdmVudC5LRVlfUkVUVVJOIHx8IAotICAgICAgICAgKG5hdmlnYXRvci5hcHBWZXJzaW9uLmluZGV4T2YoJ0FwcGxlV2ViS2l0JykgPiAwICYmIGV2ZW50LmtleUNvZGUgPT0gMCkpIHJldHVybjsKLQotICAgIHRoaXMuY2hhbmdlZCA9IHRydWU7Ci0gICAgdGhpcy5oYXNGb2N1cyA9IHRydWU7Ci0KLSAgICBpZih0aGlzLm9ic2VydmVyKSBjbGVhclRpbWVvdXQodGhpcy5vYnNlcnZlcik7Ci0gICAgICB0aGlzLm9ic2VydmVyID0gCi0gICAgICAgIHNldFRpbWVvdXQodGhpcy5vbk9ic2VydmVyRXZlbnQuYmluZCh0aGlzKSwgdGhpcy5vcHRpb25zLmZyZXF1ZW5jeSoxMDAwKTsKLSAgfSwKLQotICBhY3RpdmF0ZTogZnVuY3Rpb24oKSB7Ci0gICAgdGhpcy5jaGFuZ2VkID0gZmFsc2U7Ci0gICAgdGhpcy5oYXNGb2N1cyA9IHRydWU7Ci0gICAgdGhpcy5nZXRVcGRhdGVkQ2hvaWNlcygpOwotICB9LAotCi0gIG9uSG92ZXI6IGZ1bmN0aW9uKGV2ZW50KSB7Ci0gICAgdmFyIGVsZW1lbnQgPSBFdmVudC5maW5kRWxlbWVudChldmVudCwgJ0xJJyk7Ci0gICAgaWYodGhpcy5pbmRleCAhPSBlbGVtZW50LmF1dG9jb21wbGV0ZUluZGV4KSAKLSAgICB7Ci0gICAgICAgIHRoaXMuaW5kZXggPSBlbGVtZW50LmF1dG9jb21wbGV0ZUluZGV4OwotICAgICAgICB0aGlzLnJlbmRlcigpOwotICAgIH0KLSAgICBFdmVudC5zdG9wKGV2ZW50KTsKLSAgfSwKLSAgCi0gIG9uQ2xpY2s6IGZ1bmN0aW9uKGV2ZW50KSB7Ci0gICAgdmFyIGVsZW1lbnQgPSBFdmVudC5maW5kRWxlbWVudChldmVudCwgJ0xJJyk7Ci0gICAgdGhpcy5pbmRleCA9IGVsZW1lbnQuYXV0b2NvbXBsZXRlSW5kZXg7Ci0gICAgdGhpcy5zZWxlY3RFbnRyeSgpOwotICAgIHRoaXMuaGlkZSgpOwotICB9LAotICAKLSAgb25CbHVyOiBmdW5jdGlvbihldmVudCkgewotICAgIC8vIG5lZWRlZCB0byBtYWtlIGNsaWNrIGV2ZW50cyB3b3JraW5nCi0gICAgc2V0VGltZW91dCh0aGlzLmhpZGUuYmluZCh0aGlzKSwgMjUwKTsKLSAgICB0aGlzLmhhc0ZvY3VzID0gZmFsc2U7Ci0gICAgdGhpcy5hY3RpdmUgPSBmYWxzZTsgICAgIAotICB9LCAKLSAgCi0gIHJlbmRlcjogZnVuY3Rpb24oKSB7Ci0gICAgaWYodGhpcy5lbnRyeUNvdW50ID4gMCkgewotICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmVudHJ5Q291bnQ7IGkrKykKLSAgICAgICAgdGhpcy5pbmRleD09aSA/IAotICAgICAgICAgIEVsZW1lbnQuYWRkQ2xhc3NOYW1lKHRoaXMuZ2V0RW50cnkoaSksInNlbGVjdGVkIikgOiAKLSAgICAgICAgICBFbGVtZW50LnJlbW92ZUNsYXNzTmFtZSh0aGlzLmdldEVudHJ5KGkpLCJzZWxlY3RlZCIpOwotICAgICAgICAKLSAgICAgIGlmKHRoaXMuaGFzRm9jdXMpIHsgCi0gICAgICAgIHRoaXMuc2hvdygpOwotICAgICAgICB0aGlzLmFjdGl2ZSA9IHRydWU7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIHRoaXMuYWN0aXZlID0gZmFsc2U7Ci0gICAgICB0aGlzLmhpZGUoKTsKLSAgICB9Ci0gIH0sCi0gIAotICBtYXJrUHJldmlvdXM6IGZ1bmN0aW9uKCkgewotICAgIGlmKHRoaXMuaW5kZXggPiAwKSB0aGlzLmluZGV4LS0KLSAgICAgIGVsc2UgdGhpcy5pbmRleCA9IHRoaXMuZW50cnlDb3VudC0xOwotICAgIHRoaXMuZ2V0RW50cnkodGhpcy5pbmRleCkuc2Nyb2xsSW50b1ZpZXcodHJ1ZSk7Ci0gIH0sCi0gIAotICBtYXJrTmV4dDogZnVuY3Rpb24oKSB7Ci0gICAgaWYodGhpcy5pbmRleCA8IHRoaXMuZW50cnlDb3VudC0xKSB0aGlzLmluZGV4KysKLSAgICAgIGVsc2UgdGhpcy5pbmRleCA9IDA7Ci0gICAgdGhpcy5nZXRFbnRyeSh0aGlzLmluZGV4KS5zY3JvbGxJbnRvVmlldyhmYWxzZSk7Ci0gIH0sCi0gIAotICBnZXRFbnRyeTogZnVuY3Rpb24oaW5kZXgpIHsKLSAgICByZXR1cm4gdGhpcy51cGRhdGUuZmlyc3RDaGlsZC5jaGlsZE5vZGVzW2luZGV4XTsKLSAgfSwKLSAgCi0gIGdldEN1cnJlbnRFbnRyeTogZnVuY3Rpb24oKSB7Ci0gICAgcmV0dXJuIHRoaXMuZ2V0RW50cnkodGhpcy5pbmRleCk7Ci0gIH0sCi0gIAotICBzZWxlY3RFbnRyeTogZnVuY3Rpb24oKSB7Ci0gICAgdGhpcy5hY3RpdmUgPSBmYWxzZTsKLSAgICB0aGlzLnVwZGF0ZUVsZW1lbnQodGhpcy5nZXRDdXJyZW50RW50cnkoKSk7Ci0gIH0sCi0KLSAgdXBkYXRlRWxlbWVudDogZnVuY3Rpb24oc2VsZWN0ZWRFbGVtZW50KSB7Ci0gICAgaWYgKHRoaXMub3B0aW9ucy51cGRhdGVFbGVtZW50KSB7Ci0gICAgICB0aGlzLm9wdGlvbnMudXBkYXRlRWxlbWVudChzZWxlY3RlZEVsZW1lbnQpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICB2YXIgdmFsdWUgPSAnJzsKLSAgICBpZiAodGhpcy5vcHRpb25zLnNlbGVjdCkgewotICAgICAgdmFyIG5vZGVzID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSh0aGlzLm9wdGlvbnMuc2VsZWN0LCBzZWxlY3RlZEVsZW1lbnQpIHx8IFtdOwotICAgICAgaWYobm9kZXMubGVuZ3RoPjApIHZhbHVlID0gRWxlbWVudC5jb2xsZWN0VGV4dE5vZGVzKG5vZGVzWzBdLCB0aGlzLm9wdGlvbnMuc2VsZWN0KTsKLSAgICB9IGVsc2UKLSAgICAgIHZhbHVlID0gRWxlbWVudC5jb2xsZWN0VGV4dE5vZGVzSWdub3JlQ2xhc3Moc2VsZWN0ZWRFbGVtZW50LCAnaW5mb3JtYWwnKTsKLSAgICAKLSAgICB2YXIgbGFzdFRva2VuUG9zID0gdGhpcy5maW5kTGFzdFRva2VuKCk7Ci0gICAgaWYgKGxhc3RUb2tlblBvcyAhPSAtMSkgewotICAgICAgdmFyIG5ld1ZhbHVlID0gdGhpcy5lbGVtZW50LnZhbHVlLnN1YnN0cigwLCBsYXN0VG9rZW5Qb3MgKyAxKTsKLSAgICAgIHZhciB3aGl0ZXNwYWNlID0gdGhpcy5lbGVtZW50LnZhbHVlLnN1YnN0cihsYXN0VG9rZW5Qb3MgKyAxKS5tYXRjaCgvXlxzKy8pOwotICAgICAgaWYgKHdoaXRlc3BhY2UpCi0gICAgICAgIG5ld1ZhbHVlICs9IHdoaXRlc3BhY2VbMF07Ci0gICAgICB0aGlzLmVsZW1lbnQudmFsdWUgPSBuZXdWYWx1ZSArIHZhbHVlOwotICAgIH0gZWxzZSB7Ci0gICAgICB0aGlzLmVsZW1lbnQudmFsdWUgPSB2YWx1ZTsKLSAgICB9Ci0gICAgdGhpcy5lbGVtZW50LmZvY3VzKCk7Ci0gICAgCi0gICAgaWYgKHRoaXMub3B0aW9ucy5hZnRlclVwZGF0ZUVsZW1lbnQpCi0gICAgICB0aGlzLm9wdGlvbnMuYWZ0ZXJVcGRhdGVFbGVtZW50KHRoaXMuZWxlbWVudCwgc2VsZWN0ZWRFbGVtZW50KTsKLSAgfSwKLQotICB1cGRhdGVDaG9pY2VzOiBmdW5jdGlvbihjaG9pY2VzKSB7Ci0gICAgaWYoIXRoaXMuY2hhbmdlZCAmJiB0aGlzLmhhc0ZvY3VzKSB7Ci0gICAgICB0aGlzLnVwZGF0ZS5pbm5lckhUTUwgPSBjaG9pY2VzOwotICAgICAgRWxlbWVudC5jbGVhbldoaXRlc3BhY2UodGhpcy51cGRhdGUpOwotICAgICAgRWxlbWVudC5jbGVhbldoaXRlc3BhY2UodGhpcy51cGRhdGUuZmlyc3RDaGlsZCk7Ci0KLSAgICAgIGlmKHRoaXMudXBkYXRlLmZpcnN0Q2hpbGQgJiYgdGhpcy51cGRhdGUuZmlyc3RDaGlsZC5jaGlsZE5vZGVzKSB7Ci0gICAgICAgIHRoaXMuZW50cnlDb3VudCA9IAotICAgICAgICAgIHRoaXMudXBkYXRlLmZpcnN0Q2hpbGQuY2hpbGROb2Rlcy5sZW5ndGg7Ci0gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5lbnRyeUNvdW50OyBpKyspIHsKLSAgICAgICAgICB2YXIgZW50cnkgPSB0aGlzLmdldEVudHJ5KGkpOwotICAgICAgICAgIGVudHJ5LmF1dG9jb21wbGV0ZUluZGV4ID0gaTsKLSAgICAgICAgICB0aGlzLmFkZE9ic2VydmVycyhlbnRyeSk7Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSB7IAotICAgICAgICB0aGlzLmVudHJ5Q291bnQgPSAwOwotICAgICAgfQotCi0gICAgICB0aGlzLnN0b3BJbmRpY2F0b3IoKTsKLSAgICAgIHRoaXMuaW5kZXggPSAwOwotICAgICAgCi0gICAgICBpZih0aGlzLmVudHJ5Q291bnQ9PTEgJiYgdGhpcy5vcHRpb25zLmF1dG9TZWxlY3QpIHsKLSAgICAgICAgdGhpcy5zZWxlY3RFbnRyeSgpOwotICAgICAgICB0aGlzLmhpZGUoKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHRoaXMucmVuZGVyKCk7Ci0gICAgICB9Ci0gICAgfQotICB9LAotCi0gIGFkZE9ic2VydmVyczogZnVuY3Rpb24oZWxlbWVudCkgewotICAgIEV2ZW50Lm9ic2VydmUoZWxlbWVudCwgIm1vdXNlb3ZlciIsIHRoaXMub25Ib3Zlci5iaW5kQXNFdmVudExpc3RlbmVyKHRoaXMpKTsKLSAgICBFdmVudC5vYnNlcnZlKGVsZW1lbnQsICJjbGljayIsIHRoaXMub25DbGljay5iaW5kQXNFdmVudExpc3RlbmVyKHRoaXMpKTsKLSAgfSwKLQotICBvbk9ic2VydmVyRXZlbnQ6IGZ1bmN0aW9uKCkgewotICAgIHRoaXMuY2hhbmdlZCA9IGZhbHNlOyAgIAotICAgIGlmKHRoaXMuZ2V0VG9rZW4oKS5sZW5ndGg+PXRoaXMub3B0aW9ucy5taW5DaGFycykgewotICAgICAgdGhpcy5zdGFydEluZGljYXRvcigpOwotICAgICAgdGhpcy5nZXRVcGRhdGVkQ2hvaWNlcygpOwotICAgIH0gZWxzZSB7Ci0gICAgICB0aGlzLmFjdGl2ZSA9IGZhbHNlOwotICAgICAgdGhpcy5oaWRlKCk7Ci0gICAgfQotICB9LAotCi0gIGdldFRva2VuOiBmdW5jdGlvbigpIHsKLSAgICB2YXIgdG9rZW5Qb3MgPSB0aGlzLmZpbmRMYXN0VG9rZW4oKTsKLSAgICBpZiAodG9rZW5Qb3MgIT0gLTEpCi0gICAgICB2YXIgcmV0ID0gdGhpcy5lbGVtZW50LnZhbHVlLnN1YnN0cih0b2tlblBvcyArIDEpLnJlcGxhY2UoL15ccysvLCcnKS5yZXBsYWNlKC9ccyskLywnJyk7Ci0gICAgZWxzZQotICAgICAgdmFyIHJldCA9IHRoaXMuZWxlbWVudC52YWx1ZTsKLQotICAgIHJldHVybiAvXG4vLnRlc3QocmV0KSA/ICcnIDogcmV0OwotICB9LAotCi0gIGZpbmRMYXN0VG9rZW46IGZ1bmN0aW9uKCkgewotICAgIHZhciBsYXN0VG9rZW5Qb3MgPSAtMTsKLQotICAgIGZvciAodmFyIGk9MDsgaTx0aGlzLm9wdGlvbnMudG9rZW5zLmxlbmd0aDsgaSsrKSB7Ci0gICAgICB2YXIgdGhpc1Rva2VuUG9zID0gdGhpcy5lbGVtZW50LnZhbHVlLmxhc3RJbmRleE9mKHRoaXMub3B0aW9ucy50b2tlbnNbaV0pOwotICAgICAgaWYgKHRoaXNUb2tlblBvcyA+IGxhc3RUb2tlblBvcykKLSAgICAgICAgbGFzdFRva2VuUG9zID0gdGhpc1Rva2VuUG9zOwotICAgIH0KLSAgICByZXR1cm4gbGFzdFRva2VuUG9zOwotICB9Ci19Ci0KLUFqYXguQXV0b2NvbXBsZXRlciA9IENsYXNzLmNyZWF0ZSgpOwotT2JqZWN0LmV4dGVuZChPYmplY3QuZXh0ZW5kKEFqYXguQXV0b2NvbXBsZXRlci5wcm90b3R5cGUsIEF1dG9jb21wbGV0ZXIuQmFzZS5wcm90b3R5cGUpLCB7Ci0gIGluaXRpYWxpemU6IGZ1bmN0aW9uKGVsZW1lbnQsIHVwZGF0ZSwgdXJsLCBvcHRpb25zKSB7Ci0gICAgdGhpcy5iYXNlSW5pdGlhbGl6ZShlbGVtZW50LCB1cGRhdGUsIG9wdGlvbnMpOwotICAgIHRoaXMub3B0aW9ucy5hc3luY2hyb25vdXMgID0gdHJ1ZTsKLSAgICB0aGlzLm9wdGlvbnMub25Db21wbGV0ZSAgICA9IHRoaXMub25Db21wbGV0ZS5iaW5kKHRoaXMpOwotICAgIHRoaXMub3B0aW9ucy5kZWZhdWx0UGFyYW1zID0gdGhpcy5vcHRpb25zLnBhcmFtZXRlcnMgfHwgbnVsbDsKLSAgICB0aGlzLnVybCAgICAgICAgICAgICAgICAgICA9IHVybDsKLSAgfSwKLQotICBnZXRVcGRhdGVkQ2hvaWNlczogZnVuY3Rpb24oKSB7Ci0gICAgZW50cnkgPSBlbmNvZGVVUklDb21wb25lbnQodGhpcy5vcHRpb25zLnBhcmFtTmFtZSkgKyAnPScgKyAKLSAgICAgIGVuY29kZVVSSUNvbXBvbmVudCh0aGlzLmdldFRva2VuKCkpOwotCi0gICAgdGhpcy5vcHRpb25zLnBhcmFtZXRlcnMgPSB0aGlzLm9wdGlvbnMuY2FsbGJhY2sgPwotICAgICAgdGhpcy5vcHRpb25zLmNhbGxiYWNrKHRoaXMuZWxlbWVudCwgZW50cnkpIDogZW50cnk7Ci0KLSAgICBpZih0aGlzLm9wdGlvbnMuZGVmYXVsdFBhcmFtcykgCi0gICAgICB0aGlzLm9wdGlvbnMucGFyYW1ldGVycyArPSAnJicgKyB0aGlzLm9wdGlvbnMuZGVmYXVsdFBhcmFtczsKLQotICAgIG5ldyBBamF4LlJlcXVlc3QodGhpcy51cmwsIHRoaXMub3B0aW9ucyk7Ci0gIH0sCi0KLSAgb25Db21wbGV0ZTogZnVuY3Rpb24ocmVxdWVzdCkgewotICAgIHRoaXMudXBkYXRlQ2hvaWNlcyhyZXF1ZXN0LnJlc3BvbnNlVGV4dCk7Ci0gIH0KLQotfSk7Ci0KLS8vIFRoZSBsb2NhbCBhcnJheSBhdXRvY29tcGxldGVyLiBVc2VkIHdoZW4geW91J2QgcHJlZmVyIHRvCi0vLyBpbmplY3QgYW4gYXJyYXkgb2YgYXV0b2NvbXBsZXRpb24gb3B0aW9ucyBpbnRvIHRoZSBwYWdlLCByYXRoZXIKLS8vIHRoYW4gc2VuZGluZyBvdXQgQWpheCBxdWVyaWVzLCB3aGljaCBjYW4gYmUgcXVpdGUgc2xvdyBzb21ldGltZXMuCi0vLwotLy8gVGhlIGNvbnN0cnVjdG9yIHRha2VzIGZvdXIgcGFyYW1ldGVycy4gVGhlIGZpcnN0IHR3byBhcmUsIGFzIHVzdWFsLAotLy8gdGhlIGlkIG9mIHRoZSBtb25pdG9yZWQgdGV4dGJveCwgYW5kIGlkIG9mIHRoZSBhdXRvY29tcGxldGlvbiBtZW51LgotLy8gVGhlIHRoaXJkIGlzIHRoZSBhcnJheSB5b3Ugd2FudCB0byBhdXRvY29tcGxldGUgZnJvbSwgYW5kIHRoZSBmb3VydGgKLS8vIGlzIHRoZSBvcHRpb25zIGJsb2NrLgotLy8KLS8vIEV4dHJhIGxvY2FsIGF1dG9jb21wbGV0aW9uIG9wdGlvbnM6Ci0vLyAtIGNob2ljZXMgLSBIb3cgbWFueSBhdXRvY29tcGxldGlvbiBjaG9pY2VzIHRvIG9mZmVyCi0vLwotLy8gLSBwYXJ0aWFsU2VhcmNoIC0gSWYgZmFsc2UsIHRoZSBhdXRvY29tcGxldGVyIHdpbGwgbWF0Y2ggZW50ZXJlZAotLy8gICAgICAgICAgICAgICAgICAgIHRleHQgb25seSBhdCB0aGUgYmVnaW5uaW5nIG9mIHN0cmluZ3MgaW4gdGhlIAotLy8gICAgICAgICAgICAgICAgICAgIGF1dG9jb21wbGV0ZSBhcnJheS4gRGVmYXVsdHMgdG8gdHJ1ZSwgd2hpY2ggd2lsbAotLy8gICAgICAgICAgICAgICAgICAgIG1hdGNoIHRleHQgYXQgdGhlIGJlZ2lubmluZyBvZiBhbnkgKndvcmQqIGluIHRoZQotLy8gICAgICAgICAgICAgICAgICAgIHN0cmluZ3MgaW4gdGhlIGF1dG9jb21wbGV0ZSBhcnJheS4gSWYgeW91IHdhbnQgdG8KLS8vICAgICAgICAgICAgICAgICAgICBzZWFyY2ggYW55d2hlcmUgaW4gdGhlIHN0cmluZywgYWRkaXRpb25hbGx5IHNldAotLy8gICAgICAgICAgICAgICAgICAgIHRoZSBvcHRpb24gZnVsbFNlYXJjaCB0byB0cnVlIChkZWZhdWx0OiBvZmYpLgotLy8KLS8vIC0gZnVsbFNzZWFyY2ggLSBTZWFyY2ggYW55d2hlcmUgaW4gYXV0b2NvbXBsZXRlIGFycmF5IHN0cmluZ3MuCi0vLwotLy8gLSBwYXJ0aWFsQ2hhcnMgLSBIb3cgbWFueSBjaGFyYWN0ZXJzIHRvIGVudGVyIGJlZm9yZSB0cmlnZ2VyaW5nCi0vLyAgICAgICAgICAgICAgICAgICBhIHBhcnRpYWwgbWF0Y2ggKHVubGlrZSBtaW5DaGFycywgd2hpY2ggZGVmaW5lcwotLy8gICAgICAgICAgICAgICAgICAgaG93IG1hbnkgY2hhcmFjdGVycyBhcmUgcmVxdWlyZWQgdG8gZG8gYW55IG1hdGNoCi0vLyAgICAgICAgICAgICAgICAgICBhdCBhbGwpLiBEZWZhdWx0cyB0byAyLgotLy8KLS8vIC0gaWdub3JlQ2FzZSAtIFdoZXRoZXIgdG8gaWdub3JlIGNhc2Ugd2hlbiBhdXRvY29tcGxldGluZy4KLS8vICAgICAgICAgICAgICAgICBEZWZhdWx0cyB0byB0cnVlLgotLy8KLS8vIEl0J3MgcG9zc2libGUgdG8gcGFzcyBpbiBhIGN1c3RvbSBmdW5jdGlvbiBhcyB0aGUgJ3NlbGVjdG9yJyAKLS8vIG9wdGlvbiwgaWYgeW91IHByZWZlciB0byB3cml0ZSB5b3VyIG93biBhdXRvY29tcGxldGlvbiBsb2dpYy4KLS8vIEluIHRoYXQgY2FzZSwgdGhlIG90aGVyIG9wdGlvbnMgYWJvdmUgd2lsbCBub3QgYXBwbHkgdW5sZXNzCi0vLyB5b3Ugc3VwcG9ydCB0aGVtLgotCi1BdXRvY29tcGxldGVyLkxvY2FsID0gQ2xhc3MuY3JlYXRlKCk7Ci1BdXRvY29tcGxldGVyLkxvY2FsLnByb3RvdHlwZSA9IE9iamVjdC5leHRlbmQobmV3IEF1dG9jb21wbGV0ZXIuQmFzZSgpLCB7Ci0gIGluaXRpYWxpemU6IGZ1bmN0aW9uKGVsZW1lbnQsIHVwZGF0ZSwgYXJyYXksIG9wdGlvbnMpIHsKLSAgICB0aGlzLmJhc2VJbml0aWFsaXplKGVsZW1lbnQsIHVwZGF0ZSwgb3B0aW9ucyk7Ci0gICAgdGhpcy5vcHRpb25zLmFycmF5ID0gYXJyYXk7Ci0gIH0sCi0KLSAgZ2V0VXBkYXRlZENob2ljZXM6IGZ1bmN0aW9uKCkgewotICAgIHRoaXMudXBkYXRlQ2hvaWNlcyh0aGlzLm9wdGlvbnMuc2VsZWN0b3IodGhpcykpOwotICB9LAotCi0gIHNldE9wdGlvbnM6IGZ1bmN0aW9uKG9wdGlvbnMpIHsKLSAgICB0aGlzLm9wdGlvbnMgPSBPYmplY3QuZXh0ZW5kKHsKLSAgICAgIGNob2ljZXM6IDEwLAotICAgICAgcGFydGlhbFNlYXJjaDogdHJ1ZSwKLSAgICAgIHBhcnRpYWxDaGFyczogMiwKLSAgICAgIGlnbm9yZUNhc2U6IHRydWUsCi0gICAgICBmdWxsU2VhcmNoOiBmYWxzZSwKLSAgICAgIHNlbGVjdG9yOiBmdW5jdGlvbihpbnN0YW5jZSkgewotICAgICAgICB2YXIgcmV0ICAgICAgID0gW107IC8vIEJlZ2lubmluZyBtYXRjaGVzCi0gICAgICAgIHZhciBwYXJ0aWFsICAgPSBbXTsgLy8gSW5zaWRlIG1hdGNoZXMKLSAgICAgICAgdmFyIGVudHJ5ICAgICA9IGluc3RhbmNlLmdldFRva2VuKCk7Ci0gICAgICAgIHZhciBjb3VudCAgICAgPSAwOwotCi0gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaW5zdGFuY2Uub3B0aW9ucy5hcnJheS5sZW5ndGggJiYgIAotICAgICAgICAgIHJldC5sZW5ndGggPCBpbnN0YW5jZS5vcHRpb25zLmNob2ljZXMgOyBpKyspIHsgCi0KLSAgICAgICAgICB2YXIgZWxlbSA9IGluc3RhbmNlLm9wdGlvbnMuYXJyYXlbaV07Ci0gICAgICAgICAgdmFyIGZvdW5kUG9zID0gaW5zdGFuY2Uub3B0aW9ucy5pZ25vcmVDYXNlID8gCi0gICAgICAgICAgICBlbGVtLnRvTG93ZXJDYXNlKCkuaW5kZXhPZihlbnRyeS50b0xvd2VyQ2FzZSgpKSA6IAotICAgICAgICAgICAgZWxlbS5pbmRleE9mKGVudHJ5KTsKLQotICAgICAgICAgIHdoaWxlIChmb3VuZFBvcyAhPSAtMSkgewotICAgICAgICAgICAgaWYgKGZvdW5kUG9zID09IDAgJiYgZWxlbS5sZW5ndGggIT0gZW50cnkubGVuZ3RoKSB7IAotICAgICAgICAgICAgICByZXQucHVzaCgiPGxpPjxzdHJvbmc+IiArIGVsZW0uc3Vic3RyKDAsIGVudHJ5Lmxlbmd0aCkgKyAiPC9zdHJvbmc+IiArIAotICAgICAgICAgICAgICAgIGVsZW0uc3Vic3RyKGVudHJ5Lmxlbmd0aCkgKyAiPC9saT4iKTsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGVudHJ5Lmxlbmd0aCA+PSBpbnN0YW5jZS5vcHRpb25zLnBhcnRpYWxDaGFycyAmJiAKLSAgICAgICAgICAgICAgaW5zdGFuY2Uub3B0aW9ucy5wYXJ0aWFsU2VhcmNoICYmIGZvdW5kUG9zICE9IC0xKSB7Ci0gICAgICAgICAgICAgIGlmIChpbnN0YW5jZS5vcHRpb25zLmZ1bGxTZWFyY2ggfHwgL1xzLy50ZXN0KGVsZW0uc3Vic3RyKGZvdW5kUG9zLTEsMSkpKSB7Ci0gICAgICAgICAgICAgICAgcGFydGlhbC5wdXNoKCI8bGk+IiArIGVsZW0uc3Vic3RyKDAsIGZvdW5kUG9zKSArICI8c3Ryb25nPiIgKwotICAgICAgICAgICAgICAgICAgZWxlbS5zdWJzdHIoZm91bmRQb3MsIGVudHJ5Lmxlbmd0aCkgKyAiPC9zdHJvbmc+IiArIGVsZW0uc3Vic3RyKAotICAgICAgICAgICAgICAgICAgZm91bmRQb3MgKyBlbnRyeS5sZW5ndGgpICsgIjwvbGk+Iik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZm91bmRQb3MgPSBpbnN0YW5jZS5vcHRpb25zLmlnbm9yZUNhc2UgPyAKLSAgICAgICAgICAgICAgZWxlbS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoZW50cnkudG9Mb3dlckNhc2UoKSwgZm91bmRQb3MgKyAxKSA6IAotICAgICAgICAgICAgICBlbGVtLmluZGV4T2YoZW50cnksIGZvdW5kUG9zICsgMSk7Ci0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHBhcnRpYWwubGVuZ3RoKQotICAgICAgICAgIHJldCA9IHJldC5jb25jYXQocGFydGlhbC5zbGljZSgwLCBpbnN0YW5jZS5vcHRpb25zLmNob2ljZXMgLSByZXQubGVuZ3RoKSkKLSAgICAgICAgcmV0dXJuICI8dWw+IiArIHJldC5qb2luKCcnKSArICI8L3VsPiI7Ci0gICAgICB9Ci0gICAgfSwgb3B0aW9ucyB8fCB7fSk7Ci0gIH0KLX0pOwotCi0vLyBBSkFYIGluLXBsYWNlIGVkaXRvcgotLy8KLS8vIHNlZSBkb2N1bWVudGF0aW9uIG9uIGh0dHA6Ly93aWtpLnNjcmlwdC5hY3Vsby51cy9zY3JpcHRhY3Vsb3VzL3Nob3cvQWpheC5JblBsYWNlRWRpdG9yCi0KLS8vIFVzZSB0aGlzIGlmIHlvdSBub3RpY2Ugd2VpcmQgc2Nyb2xsaW5nIHByb2JsZW1zIG9uIHNvbWUgYnJvd3NlcnMsCi0vLyB0aGUgRE9NIG1pZ2h0IGJlIGEgYml0IGNvbmZ1c2VkIHdoZW4gdGhpcyBnZXRzIGNhbGxlZCBzbyBkbyB0aGlzCi0vLyB3YWl0cyAxIG1zICh3aXRoIHNldFRpbWVvdXQpIHVudGlsIGl0IGRvZXMgdGhlIGFjdGl2YXRpb24KLUZpZWxkLnNjcm9sbEZyZWVBY3RpdmF0ZSA9IGZ1bmN0aW9uKGZpZWxkKSB7Ci0gIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7Ci0gICAgRmllbGQuYWN0aXZhdGUoZmllbGQpOwotICB9LCAxKTsKLX0KLQotQWpheC5JblBsYWNlRWRpdG9yID0gQ2xhc3MuY3JlYXRlKCk7Ci1BamF4LkluUGxhY2VFZGl0b3IuZGVmYXVsdEhpZ2hsaWdodENvbG9yID0gIiNGRkZGOTkiOwotQWpheC5JblBsYWNlRWRpdG9yLnByb3RvdHlwZSA9IHsKLSAgaW5pdGlhbGl6ZTogZnVuY3Rpb24oZWxlbWVudCwgdXJsLCBvcHRpb25zKSB7Ci0gICAgdGhpcy51cmwgPSB1cmw7Ci0gICAgdGhpcy5lbGVtZW50ID0gJChlbGVtZW50KTsKLQotICAgIHRoaXMub3B0aW9ucyA9IE9iamVjdC5leHRlbmQoewotICAgICAgb2tCdXR0b246IHRydWUsCi0gICAgICBva1RleHQ6ICJvayIsCi0gICAgICBjYW5jZWxMaW5rOiB0cnVlLAotICAgICAgY2FuY2VsVGV4dDogImNhbmNlbCIsCi0gICAgICBzYXZpbmdUZXh0OiAiU2F2aW5nLi4uIiwKLSAgICAgIGNsaWNrVG9FZGl0VGV4dDogIkNsaWNrIHRvIGVkaXQiLAotICAgICAgb2tUZXh0OiAib2siLAotICAgICAgcm93czogMSwKLSAgICAgIG9uQ29tcGxldGU6IGZ1bmN0aW9uKHRyYW5zcG9ydCwgZWxlbWVudCkgewotICAgICAgICBuZXcgRWZmZWN0LkhpZ2hsaWdodChlbGVtZW50LCB7c3RhcnRjb2xvcjogdGhpcy5vcHRpb25zLmhpZ2hsaWdodGNvbG9yfSk7Ci0gICAgICB9LAotICAgICAgb25GYWlsdXJlOiBmdW5jdGlvbih0cmFuc3BvcnQpIHsKLSAgICAgICAgYWxlcnQoIkVycm9yIGNvbW11bmljYXRpbmcgd2l0aCB0aGUgc2VydmVyOiAiICsgdHJhbnNwb3J0LnJlc3BvbnNlVGV4dC5zdHJpcFRhZ3MoKSk7Ci0gICAgICB9LAotICAgICAgY2FsbGJhY2s6IGZ1bmN0aW9uKGZvcm0pIHsKLSAgICAgICAgcmV0dXJuIEZvcm0uc2VyaWFsaXplKGZvcm0pOwotICAgICAgfSwKLSAgICAgIGhhbmRsZUxpbmVCcmVha3M6IHRydWUsCi0gICAgICBsb2FkaW5nVGV4dDogJ0xvYWRpbmcuLi4nLAotICAgICAgc2F2aW5nQ2xhc3NOYW1lOiAnaW5wbGFjZWVkaXRvci1zYXZpbmcnLAotICAgICAgbG9hZGluZ0NsYXNzTmFtZTogJ2lucGxhY2VlZGl0b3ItbG9hZGluZycsCi0gICAgICBmb3JtQ2xhc3NOYW1lOiAnaW5wbGFjZWVkaXRvci1mb3JtJywKLSAgICAgIGhpZ2hsaWdodGNvbG9yOiBBamF4LkluUGxhY2VFZGl0b3IuZGVmYXVsdEhpZ2hsaWdodENvbG9yLAotICAgICAgaGlnaGxpZ2h0ZW5kY29sb3I6ICIjRkZGRkZGIiwKLSAgICAgIGV4dGVybmFsQ29udHJvbDogbnVsbCwKLSAgICAgIHN1Ym1pdE9uQmx1cjogZmFsc2UsCi0gICAgICBhamF4T3B0aW9uczoge30sCi0gICAgICBldmFsU2NyaXB0czogZmFsc2UKLSAgICB9LCBvcHRpb25zIHx8IHt9KTsKLQotICAgIGlmKCF0aGlzLm9wdGlvbnMuZm9ybUlkICYmIHRoaXMuZWxlbWVudC5pZCkgewotICAgICAgdGhpcy5vcHRpb25zLmZvcm1JZCA9IHRoaXMuZWxlbWVudC5pZCArICItaW5wbGFjZWVkaXRvciI7Ci0gICAgICBpZiAoJCh0aGlzLm9wdGlvbnMuZm9ybUlkKSkgewotICAgICAgICAvLyB0aGVyZSdzIGFscmVhZHkgYSBmb3JtIHdpdGggdGhhdCBuYW1lLCBkb24ndCBzcGVjaWZ5IGFuIGlkCi0gICAgICAgIHRoaXMub3B0aW9ucy5mb3JtSWQgPSBudWxsOwotICAgICAgfQotICAgIH0KLSAgICAKLSAgICBpZiAodGhpcy5vcHRpb25zLmV4dGVybmFsQ29udHJvbCkgewotICAgICAgdGhpcy5vcHRpb25zLmV4dGVybmFsQ29udHJvbCA9ICQodGhpcy5vcHRpb25zLmV4dGVybmFsQ29udHJvbCk7Ci0gICAgfQotICAgIAotICAgIHRoaXMub3JpZ2luYWxCYWNrZ3JvdW5kID0gRWxlbWVudC5nZXRTdHlsZSh0aGlzLmVsZW1lbnQsICdiYWNrZ3JvdW5kLWNvbG9yJyk7Ci0gICAgaWYgKCF0aGlzLm9yaWdpbmFsQmFja2dyb3VuZCkgewotICAgICAgdGhpcy5vcmlnaW5hbEJhY2tncm91bmQgPSAidHJhbnNwYXJlbnQiOwotICAgIH0KLSAgICAKLSAgICB0aGlzLmVsZW1lbnQudGl0bGUgPSB0aGlzLm9wdGlvbnMuY2xpY2tUb0VkaXRUZXh0OwotICAgIAotICAgIHRoaXMub25jbGlja0xpc3RlbmVyID0gdGhpcy5lbnRlckVkaXRNb2RlLmJpbmRBc0V2ZW50TGlzdGVuZXIodGhpcyk7Ci0gICAgdGhpcy5tb3VzZW92ZXJMaXN0ZW5lciA9IHRoaXMuZW50ZXJIb3Zlci5iaW5kQXNFdmVudExpc3RlbmVyKHRoaXMpOwotICAgIHRoaXMubW91c2VvdXRMaXN0ZW5lciA9IHRoaXMubGVhdmVIb3Zlci5iaW5kQXNFdmVudExpc3RlbmVyKHRoaXMpOwotICAgIEV2ZW50Lm9ic2VydmUodGhpcy5lbGVtZW50LCAnY2xpY2snLCB0aGlzLm9uY2xpY2tMaXN0ZW5lcik7Ci0gICAgRXZlbnQub2JzZXJ2ZSh0aGlzLmVsZW1lbnQsICdtb3VzZW92ZXInLCB0aGlzLm1vdXNlb3Zlckxpc3RlbmVyKTsKLSAgICBFdmVudC5vYnNlcnZlKHRoaXMuZWxlbWVudCwgJ21vdXNlb3V0JywgdGhpcy5tb3VzZW91dExpc3RlbmVyKTsKLSAgICBpZiAodGhpcy5vcHRpb25zLmV4dGVybmFsQ29udHJvbCkgewotICAgICAgRXZlbnQub2JzZXJ2ZSh0aGlzLm9wdGlvbnMuZXh0ZXJuYWxDb250cm9sLCAnY2xpY2snLCB0aGlzLm9uY2xpY2tMaXN0ZW5lcik7Ci0gICAgICBFdmVudC5vYnNlcnZlKHRoaXMub3B0aW9ucy5leHRlcm5hbENvbnRyb2wsICdtb3VzZW92ZXInLCB0aGlzLm1vdXNlb3Zlckxpc3RlbmVyKTsKLSAgICAgIEV2ZW50Lm9ic2VydmUodGhpcy5vcHRpb25zLmV4dGVybmFsQ29udHJvbCwgJ21vdXNlb3V0JywgdGhpcy5tb3VzZW91dExpc3RlbmVyKTsKLSAgICB9Ci0gIH0sCi0gIGVudGVyRWRpdE1vZGU6IGZ1bmN0aW9uKGV2dCkgewotICAgIGlmICh0aGlzLnNhdmluZykgcmV0dXJuOwotICAgIGlmICh0aGlzLmVkaXRpbmcpIHJldHVybjsKLSAgICB0aGlzLmVkaXRpbmcgPSB0cnVlOwotICAgIHRoaXMub25FbnRlckVkaXRNb2RlKCk7Ci0gICAgaWYgKHRoaXMub3B0aW9ucy5leHRlcm5hbENvbnRyb2wpIHsKLSAgICAgIEVsZW1lbnQuaGlkZSh0aGlzLm9wdGlvbnMuZXh0ZXJuYWxDb250cm9sKTsKLSAgICB9Ci0gICAgRWxlbWVudC5oaWRlKHRoaXMuZWxlbWVudCk7Ci0gICAgdGhpcy5jcmVhdGVGb3JtKCk7Ci0gICAgdGhpcy5lbGVtZW50LnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHRoaXMuZm9ybSwgdGhpcy5lbGVtZW50KTsKLSAgICBpZiAoIXRoaXMub3B0aW9ucy5sb2FkVGV4dFVSTCkgRmllbGQuc2Nyb2xsRnJlZUFjdGl2YXRlKHRoaXMuZWRpdEZpZWxkKTsKLSAgICAvLyBzdG9wIHRoZSBldmVudCB0byBhdm9pZCBhIHBhZ2UgcmVmcmVzaCBpbiBTYWZhcmkKLSAgICBpZiAoZXZ0KSB7Ci0gICAgICBFdmVudC5zdG9wKGV2dCk7Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfSwKLSAgY3JlYXRlRm9ybTogZnVuY3Rpb24oKSB7Ci0gICAgdGhpcy5mb3JtID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZm9ybSIpOwotICAgIHRoaXMuZm9ybS5pZCA9IHRoaXMub3B0aW9ucy5mb3JtSWQ7Ci0gICAgRWxlbWVudC5hZGRDbGFzc05hbWUodGhpcy5mb3JtLCB0aGlzLm9wdGlvbnMuZm9ybUNsYXNzTmFtZSkKLSAgICB0aGlzLmZvcm0ub25zdWJtaXQgPSB0aGlzLm9uU3VibWl0LmJpbmQodGhpcyk7Ci0KLSAgICB0aGlzLmNyZWF0ZUVkaXRGaWVsZCgpOwotCi0gICAgaWYgKHRoaXMub3B0aW9ucy50ZXh0YXJlYSkgewotICAgICAgdmFyIGJyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYnIiKTsKLSAgICAgIHRoaXMuZm9ybS5hcHBlbmRDaGlsZChicik7Ci0gICAgfQotCi0gICAgaWYgKHRoaXMub3B0aW9ucy5va0J1dHRvbikgewotICAgICAgb2tCdXR0b24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbnB1dCIpOwotICAgICAgb2tCdXR0b24udHlwZSA9ICJzdWJtaXQiOwotICAgICAgb2tCdXR0b24udmFsdWUgPSB0aGlzLm9wdGlvbnMub2tUZXh0OwotICAgICAgb2tCdXR0b24uY2xhc3NOYW1lID0gJ2VkaXRvcl9va19idXR0b24nOwotICAgICAgdGhpcy5mb3JtLmFwcGVuZENoaWxkKG9rQnV0dG9uKTsKLSAgICB9Ci0KLSAgICBpZiAodGhpcy5vcHRpb25zLmNhbmNlbExpbmspIHsKLSAgICAgIGNhbmNlbExpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJhIik7Ci0gICAgICBjYW5jZWxMaW5rLmhyZWYgPSAiIyI7Ci0gICAgICBjYW5jZWxMaW5rLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHRoaXMub3B0aW9ucy5jYW5jZWxUZXh0KSk7Ci0gICAgICBjYW5jZWxMaW5rLm9uY2xpY2sgPSB0aGlzLm9uY2xpY2tDYW5jZWwuYmluZCh0aGlzKTsKLSAgICAgIGNhbmNlbExpbmsuY2xhc3NOYW1lID0gJ2VkaXRvcl9jYW5jZWwnOyAgICAgIAotICAgICAgdGhpcy5mb3JtLmFwcGVuZENoaWxkKGNhbmNlbExpbmspOwotICAgIH0KLSAgfSwKLSAgaGFzSFRNTExpbmVCcmVha3M6IGZ1bmN0aW9uKHN0cmluZykgewotICAgIGlmICghdGhpcy5vcHRpb25zLmhhbmRsZUxpbmVCcmVha3MpIHJldHVybiBmYWxzZTsKLSAgICByZXR1cm4gc3RyaW5nLm1hdGNoKC88YnIvaSkgfHwgc3RyaW5nLm1hdGNoKC88cD4vaSk7Ci0gIH0sCi0gIGNvbnZlcnRIVE1MTGluZUJyZWFrczogZnVuY3Rpb24oc3RyaW5nKSB7Ci0gICAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKC88YnI+L2dpLCAiXG4iKS5yZXBsYWNlKC88YnJcLz4vZ2ksICJcbiIpLnJlcGxhY2UoLzxcL3A+L2dpLCAiXG4iKS5yZXBsYWNlKC88cD4vZ2ksICIiKTsKLSAgfSwKLSAgY3JlYXRlRWRpdEZpZWxkOiBmdW5jdGlvbigpIHsKLSAgICB2YXIgdGV4dDsKLSAgICBpZih0aGlzLm9wdGlvbnMubG9hZFRleHRVUkwpIHsKLSAgICAgIHRleHQgPSB0aGlzLm9wdGlvbnMubG9hZGluZ1RleHQ7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHRleHQgPSB0aGlzLmdldFRleHQoKTsKLSAgICB9Ci0KLSAgICB2YXIgb2JqID0gdGhpczsKLSAgICAKLSAgICBpZiAodGhpcy5vcHRpb25zLnJvd3MgPT0gMSAmJiAhdGhpcy5oYXNIVE1MTGluZUJyZWFrcyh0ZXh0KSkgewotICAgICAgdGhpcy5vcHRpb25zLnRleHRhcmVhID0gZmFsc2U7Ci0gICAgICB2YXIgdGV4dEZpZWxkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW5wdXQiKTsKLSAgICAgIHRleHRGaWVsZC5vYmogPSB0aGlzOwotICAgICAgdGV4dEZpZWxkLnR5cGUgPSAidGV4dCI7Ci0gICAgICB0ZXh0RmllbGQubmFtZSA9ICJ2YWx1ZSI7Ci0gICAgICB0ZXh0RmllbGQudmFsdWUgPSB0ZXh0OwotICAgICAgdGV4dEZpZWxkLnN0eWxlLmJhY2tncm91bmRDb2xvciA9IHRoaXMub3B0aW9ucy5oaWdobGlnaHRjb2xvcjsKLSAgICAgIHRleHRGaWVsZC5jbGFzc05hbWUgPSAnZWRpdG9yX2ZpZWxkJzsKLSAgICAgIHZhciBzaXplID0gdGhpcy5vcHRpb25zLnNpemUgfHwgdGhpcy5vcHRpb25zLmNvbHMgfHwgMDsKLSAgICAgIGlmIChzaXplICE9IDApIHRleHRGaWVsZC5zaXplID0gc2l6ZTsKLSAgICAgIGlmICh0aGlzLm9wdGlvbnMuc3VibWl0T25CbHVyKQotICAgICAgICB0ZXh0RmllbGQub25ibHVyID0gdGhpcy5vblN1Ym1pdC5iaW5kKHRoaXMpOwotICAgICAgdGhpcy5lZGl0RmllbGQgPSB0ZXh0RmllbGQ7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHRoaXMub3B0aW9ucy50ZXh0YXJlYSA9IHRydWU7Ci0gICAgICB2YXIgdGV4dEFyZWEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ZXh0YXJlYSIpOwotICAgICAgdGV4dEFyZWEub2JqID0gdGhpczsKLSAgICAgIHRleHRBcmVhLm5hbWUgPSAidmFsdWUiOwotICAgICAgdGV4dEFyZWEudmFsdWUgPSB0aGlzLmNvbnZlcnRIVE1MTGluZUJyZWFrcyh0ZXh0KTsKLSAgICAgIHRleHRBcmVhLnJvd3MgPSB0aGlzLm9wdGlvbnMucm93czsKLSAgICAgIHRleHRBcmVhLmNvbHMgPSB0aGlzLm9wdGlvbnMuY29scyB8fCA0MDsKLSAgICAgIHRleHRBcmVhLmNsYXNzTmFtZSA9ICdlZGl0b3JfZmllbGQnOyAgICAgIAotICAgICAgaWYgKHRoaXMub3B0aW9ucy5zdWJtaXRPbkJsdXIpCi0gICAgICAgIHRleHRBcmVhLm9uYmx1ciA9IHRoaXMub25TdWJtaXQuYmluZCh0aGlzKTsKLSAgICAgIHRoaXMuZWRpdEZpZWxkID0gdGV4dEFyZWE7Ci0gICAgfQotICAgIAotICAgIGlmKHRoaXMub3B0aW9ucy5sb2FkVGV4dFVSTCkgewotICAgICAgdGhpcy5sb2FkRXh0ZXJuYWxUZXh0KCk7Ci0gICAgfQotICAgIHRoaXMuZm9ybS5hcHBlbmRDaGlsZCh0aGlzLmVkaXRGaWVsZCk7Ci0gIH0sCi0gIGdldFRleHQ6IGZ1bmN0aW9uKCkgewotICAgIHJldHVybiB0aGlzLmVsZW1lbnQuaW5uZXJIVE1MOwotICB9LAotICBsb2FkRXh0ZXJuYWxUZXh0OiBmdW5jdGlvbigpIHsKLSAgICBFbGVtZW50LmFkZENsYXNzTmFtZSh0aGlzLmZvcm0sIHRoaXMub3B0aW9ucy5sb2FkaW5nQ2xhc3NOYW1lKTsKLSAgICB0aGlzLmVkaXRGaWVsZC5kaXNhYmxlZCA9IHRydWU7Ci0gICAgbmV3IEFqYXguUmVxdWVzdCgKLSAgICAgIHRoaXMub3B0aW9ucy5sb2FkVGV4dFVSTCwKLSAgICAgIE9iamVjdC5leHRlbmQoewotICAgICAgICBhc3luY2hyb25vdXM6IHRydWUsCi0gICAgICAgIG9uQ29tcGxldGU6IHRoaXMub25Mb2FkZWRFeHRlcm5hbFRleHQuYmluZCh0aGlzKQotICAgICAgfSwgdGhpcy5vcHRpb25zLmFqYXhPcHRpb25zKQotICAgICk7Ci0gIH0sCi0gIG9uTG9hZGVkRXh0ZXJuYWxUZXh0OiBmdW5jdGlvbih0cmFuc3BvcnQpIHsKLSAgICBFbGVtZW50LnJlbW92ZUNsYXNzTmFtZSh0aGlzLmZvcm0sIHRoaXMub3B0aW9ucy5sb2FkaW5nQ2xhc3NOYW1lKTsKLSAgICB0aGlzLmVkaXRGaWVsZC5kaXNhYmxlZCA9IGZhbHNlOwotICAgIHRoaXMuZWRpdEZpZWxkLnZhbHVlID0gdHJhbnNwb3J0LnJlc3BvbnNlVGV4dC5zdHJpcFRhZ3MoKTsKLSAgICBGaWVsZC5zY3JvbGxGcmVlQWN0aXZhdGUodGhpcy5lZGl0RmllbGQpOwotICB9LAotICBvbmNsaWNrQ2FuY2VsOiBmdW5jdGlvbigpIHsKLSAgICB0aGlzLm9uQ29tcGxldGUoKTsKLSAgICB0aGlzLmxlYXZlRWRpdE1vZGUoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0sCi0gIG9uRmFpbHVyZTogZnVuY3Rpb24odHJhbnNwb3J0KSB7Ci0gICAgdGhpcy5vcHRpb25zLm9uRmFpbHVyZSh0cmFuc3BvcnQpOwotICAgIGlmICh0aGlzLm9sZElubmVySFRNTCkgewotICAgICAgdGhpcy5lbGVtZW50LmlubmVySFRNTCA9IHRoaXMub2xkSW5uZXJIVE1MOwotICAgICAgdGhpcy5vbGRJbm5lckhUTUwgPSBudWxsOwotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0sCi0gIG9uU3VibWl0OiBmdW5jdGlvbigpIHsKLSAgICAvLyBvbkxvYWRpbmcgcmVzZXRzIHRoZXNlIHNvIHdlIG5lZWQgdG8gc2F2ZSB0aGVtIGF3YXkgZm9yIHRoZSBBamF4IGNhbGwKLSAgICB2YXIgZm9ybSA9IHRoaXMuZm9ybTsKLSAgICB2YXIgdmFsdWUgPSB0aGlzLmVkaXRGaWVsZC52YWx1ZTsKLSAgICAKLSAgICAvLyBkbyB0aGlzIGZpcnN0LCBzb21ldGltZXMgdGhlIGFqYXggY2FsbCByZXR1cm5zIGJlZm9yZSB3ZSBnZXQgYSBjaGFuY2UgdG8gc3dpdGNoIG9uIFNhdmluZy4uLgotICAgIC8vIHdoaWNoIG1lYW5zIHRoaXMgd2lsbCBhY3R1YWxseSBzd2l0Y2ggb24gU2F2aW5nLi4uICphZnRlciogd2UndmUgbGVmdCBlZGl0IG1vZGUgY2F1c2luZyBTYXZpbmcuLi4KLSAgICAvLyB0byBiZSBkaXNwbGF5ZWQgaW5kZWZpbml0ZWx5Ci0gICAgdGhpcy5vbkxvYWRpbmcoKTsKLSAgICAKLSAgICBpZiAodGhpcy5vcHRpb25zLmV2YWxTY3JpcHRzKSB7Ci0gICAgICBuZXcgQWpheC5SZXF1ZXN0KAotICAgICAgICB0aGlzLnVybCwgT2JqZWN0LmV4dGVuZCh7Ci0gICAgICAgICAgcGFyYW1ldGVyczogdGhpcy5vcHRpb25zLmNhbGxiYWNrKGZvcm0sIHZhbHVlKSwKLSAgICAgICAgICBvbkNvbXBsZXRlOiB0aGlzLm9uQ29tcGxldGUuYmluZCh0aGlzKSwKLSAgICAgICAgICBvbkZhaWx1cmU6IHRoaXMub25GYWlsdXJlLmJpbmQodGhpcyksCi0gICAgICAgICAgYXN5bmNocm9ub3VzOnRydWUsIAotICAgICAgICAgIGV2YWxTY3JpcHRzOnRydWUKLSAgICAgICAgfSwgdGhpcy5vcHRpb25zLmFqYXhPcHRpb25zKSk7Ci0gICAgfSBlbHNlICB7Ci0gICAgICBuZXcgQWpheC5VcGRhdGVyKAotICAgICAgICB7IHN1Y2Nlc3M6IHRoaXMuZWxlbWVudCwKLSAgICAgICAgICAvLyBkb24ndCB1cGRhdGUgb24gZmFpbHVyZSAodGhpcyBjb3VsZCBiZSBhbiBvcHRpb24pCi0gICAgICAgICAgZmFpbHVyZTogbnVsbCB9LCAKLSAgICAgICAgdGhpcy51cmwsIE9iamVjdC5leHRlbmQoewotICAgICAgICAgIHBhcmFtZXRlcnM6IHRoaXMub3B0aW9ucy5jYWxsYmFjayhmb3JtLCB2YWx1ZSksCi0gICAgICAgICAgb25Db21wbGV0ZTogdGhpcy5vbkNvbXBsZXRlLmJpbmQodGhpcyksCi0gICAgICAgICAgb25GYWlsdXJlOiB0aGlzLm9uRmFpbHVyZS5iaW5kKHRoaXMpCi0gICAgICAgIH0sIHRoaXMub3B0aW9ucy5hamF4T3B0aW9ucykpOwotICAgIH0KLSAgICAvLyBzdG9wIHRoZSBldmVudCB0byBhdm9pZCBhIHBhZ2UgcmVmcmVzaCBpbiBTYWZhcmkKLSAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDEpIHsKLSAgICAgIEV2ZW50LnN0b3AoYXJndW1lbnRzWzBdKTsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9LAotICBvbkxvYWRpbmc6IGZ1bmN0aW9uKCkgewotICAgIHRoaXMuc2F2aW5nID0gdHJ1ZTsKLSAgICB0aGlzLnJlbW92ZUZvcm0oKTsKLSAgICB0aGlzLmxlYXZlSG92ZXIoKTsKLSAgICB0aGlzLnNob3dTYXZpbmcoKTsKLSAgfSwKLSAgc2hvd1NhdmluZzogZnVuY3Rpb24oKSB7Ci0gICAgdGhpcy5vbGRJbm5lckhUTUwgPSB0aGlzLmVsZW1lbnQuaW5uZXJIVE1MOwotICAgIHRoaXMuZWxlbWVudC5pbm5lckhUTUwgPSB0aGlzLm9wdGlvbnMuc2F2aW5nVGV4dDsKLSAgICBFbGVtZW50LmFkZENsYXNzTmFtZSh0aGlzLmVsZW1lbnQsIHRoaXMub3B0aW9ucy5zYXZpbmdDbGFzc05hbWUpOwotICAgIHRoaXMuZWxlbWVudC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSB0aGlzLm9yaWdpbmFsQmFja2dyb3VuZDsKLSAgICBFbGVtZW50LnNob3codGhpcy5lbGVtZW50KTsKLSAgfSwKLSAgcmVtb3ZlRm9ybTogZnVuY3Rpb24oKSB7Ci0gICAgaWYodGhpcy5mb3JtKSB7Ci0gICAgICBpZiAodGhpcy5mb3JtLnBhcmVudE5vZGUpIEVsZW1lbnQucmVtb3ZlKHRoaXMuZm9ybSk7Ci0gICAgICB0aGlzLmZvcm0gPSBudWxsOwotICAgIH0KLSAgfSwKLSAgZW50ZXJIb3ZlcjogZnVuY3Rpb24oKSB7Ci0gICAgaWYgKHRoaXMuc2F2aW5nKSByZXR1cm47Ci0gICAgdGhpcy5lbGVtZW50LnN0eWxlLmJhY2tncm91bmRDb2xvciA9IHRoaXMub3B0aW9ucy5oaWdobGlnaHRjb2xvcjsKLSAgICBpZiAodGhpcy5lZmZlY3QpIHsKLSAgICAgIHRoaXMuZWZmZWN0LmNhbmNlbCgpOwotICAgIH0KLSAgICBFbGVtZW50LmFkZENsYXNzTmFtZSh0aGlzLmVsZW1lbnQsIHRoaXMub3B0aW9ucy5ob3ZlckNsYXNzTmFtZSkKLSAgfSwKLSAgbGVhdmVIb3ZlcjogZnVuY3Rpb24oKSB7Ci0gICAgaWYgKHRoaXMub3B0aW9ucy5iYWNrZ3JvdW5kQ29sb3IpIHsKLSAgICAgIHRoaXMuZWxlbWVudC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSB0aGlzLm9sZEJhY2tncm91bmQ7Ci0gICAgfQotICAgIEVsZW1lbnQucmVtb3ZlQ2xhc3NOYW1lKHRoaXMuZWxlbWVudCwgdGhpcy5vcHRpb25zLmhvdmVyQ2xhc3NOYW1lKQotICAgIGlmICh0aGlzLnNhdmluZykgcmV0dXJuOwotICAgIHRoaXMuZWZmZWN0ID0gbmV3IEVmZmVjdC5IaWdobGlnaHQodGhpcy5lbGVtZW50LCB7Ci0gICAgICBzdGFydGNvbG9yOiB0aGlzLm9wdGlvbnMuaGlnaGxpZ2h0Y29sb3IsCi0gICAgICBlbmRjb2xvcjogdGhpcy5vcHRpb25zLmhpZ2hsaWdodGVuZGNvbG9yLAotICAgICAgcmVzdG9yZWNvbG9yOiB0aGlzLm9yaWdpbmFsQmFja2dyb3VuZAotICAgIH0pOwotICB9LAotICBsZWF2ZUVkaXRNb2RlOiBmdW5jdGlvbigpIHsKLSAgICBFbGVtZW50LnJlbW92ZUNsYXNzTmFtZSh0aGlzLmVsZW1lbnQsIHRoaXMub3B0aW9ucy5zYXZpbmdDbGFzc05hbWUpOwotICAgIHRoaXMucmVtb3ZlRm9ybSgpOwotICAgIHRoaXMubGVhdmVIb3ZlcigpOwotICAgIHRoaXMuZWxlbWVudC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSB0aGlzLm9yaWdpbmFsQmFja2dyb3VuZDsKLSAgICBFbGVtZW50LnNob3codGhpcy5lbGVtZW50KTsKLSAgICBpZiAodGhpcy5vcHRpb25zLmV4dGVybmFsQ29udHJvbCkgewotICAgICAgRWxlbWVudC5zaG93KHRoaXMub3B0aW9ucy5leHRlcm5hbENvbnRyb2wpOwotICAgIH0KLSAgICB0aGlzLmVkaXRpbmcgPSBmYWxzZTsKLSAgICB0aGlzLnNhdmluZyA9IGZhbHNlOwotICAgIHRoaXMub2xkSW5uZXJIVE1MID0gbnVsbDsKLSAgICB0aGlzLm9uTGVhdmVFZGl0TW9kZSgpOwotICB9LAotICBvbkNvbXBsZXRlOiBmdW5jdGlvbih0cmFuc3BvcnQpIHsKLSAgICB0aGlzLmxlYXZlRWRpdE1vZGUoKTsKLSAgICB0aGlzLm9wdGlvbnMub25Db21wbGV0ZS5iaW5kKHRoaXMpKHRyYW5zcG9ydCwgdGhpcy5lbGVtZW50KTsKLSAgfSwKLSAgb25FbnRlckVkaXRNb2RlOiBmdW5jdGlvbigpIHt9LAotICBvbkxlYXZlRWRpdE1vZGU6IGZ1bmN0aW9uKCkge30sCi0gIGRpc3Bvc2U6IGZ1bmN0aW9uKCkgewotICAgIGlmICh0aGlzLm9sZElubmVySFRNTCkgewotICAgICAgdGhpcy5lbGVtZW50LmlubmVySFRNTCA9IHRoaXMub2xkSW5uZXJIVE1MOwotICAgIH0KLSAgICB0aGlzLmxlYXZlRWRpdE1vZGUoKTsKLSAgICBFdmVudC5zdG9wT2JzZXJ2aW5nKHRoaXMuZWxlbWVudCwgJ2NsaWNrJywgdGhpcy5vbmNsaWNrTGlzdGVuZXIpOwotICAgIEV2ZW50LnN0b3BPYnNlcnZpbmcodGhpcy5lbGVtZW50LCAnbW91c2VvdmVyJywgdGhpcy5tb3VzZW92ZXJMaXN0ZW5lcik7Ci0gICAgRXZlbnQuc3RvcE9ic2VydmluZyh0aGlzLmVsZW1lbnQsICdtb3VzZW91dCcsIHRoaXMubW91c2VvdXRMaXN0ZW5lcik7Ci0gICAgaWYgKHRoaXMub3B0aW9ucy5leHRlcm5hbENvbnRyb2wpIHsKLSAgICAgIEV2ZW50LnN0b3BPYnNlcnZpbmcodGhpcy5vcHRpb25zLmV4dGVybmFsQ29udHJvbCwgJ2NsaWNrJywgdGhpcy5vbmNsaWNrTGlzdGVuZXIpOwotICAgICAgRXZlbnQuc3RvcE9ic2VydmluZyh0aGlzLm9wdGlvbnMuZXh0ZXJuYWxDb250cm9sLCAnbW91c2VvdmVyJywgdGhpcy5tb3VzZW92ZXJMaXN0ZW5lcik7Ci0gICAgICBFdmVudC5zdG9wT2JzZXJ2aW5nKHRoaXMub3B0aW9ucy5leHRlcm5hbENvbnRyb2wsICdtb3VzZW91dCcsIHRoaXMubW91c2VvdXRMaXN0ZW5lcik7Ci0gICAgfQotICB9Ci19OwotCi1BamF4LkluUGxhY2VDb2xsZWN0aW9uRWRpdG9yID0gQ2xhc3MuY3JlYXRlKCk7Ci1PYmplY3QuZXh0ZW5kKEFqYXguSW5QbGFjZUNvbGxlY3Rpb25FZGl0b3IucHJvdG90eXBlLCBBamF4LkluUGxhY2VFZGl0b3IucHJvdG90eXBlKTsKLU9iamVjdC5leHRlbmQoQWpheC5JblBsYWNlQ29sbGVjdGlvbkVkaXRvci5wcm90b3R5cGUsIHsKLSAgY3JlYXRlRWRpdEZpZWxkOiBmdW5jdGlvbigpIHsKLSAgICBpZiAoIXRoaXMuY2FjaGVkX3NlbGVjdFRhZykgewotICAgICAgdmFyIHNlbGVjdFRhZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNlbGVjdCIpOwotICAgICAgdmFyIGNvbGxlY3Rpb24gPSB0aGlzLm9wdGlvbnMuY29sbGVjdGlvbiB8fCBbXTsKLSAgICAgIHZhciBvcHRpb25UYWc7Ci0gICAgICBjb2xsZWN0aW9uLmVhY2goZnVuY3Rpb24oZSxpKSB7Ci0gICAgICAgIG9wdGlvblRhZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIm9wdGlvbiIpOwotICAgICAgICBvcHRpb25UYWcudmFsdWUgPSAoZSBpbnN0YW5jZW9mIEFycmF5KSA/IGVbMF0gOiBlOwotICAgICAgICBpZigodHlwZW9mIHRoaXMub3B0aW9ucy52YWx1ZSA9PSAndW5kZWZpbmVkJykgJiYgCi0gICAgICAgICAgKChlIGluc3RhbmNlb2YgQXJyYXkpID8gdGhpcy5lbGVtZW50LmlubmVySFRNTCA9PSBlWzFdIDogZSA9PSBvcHRpb25UYWcudmFsdWUpKSBvcHRpb25UYWcuc2VsZWN0ZWQgPSB0cnVlOwotICAgICAgICBpZih0aGlzLm9wdGlvbnMudmFsdWU9PW9wdGlvblRhZy52YWx1ZSkgb3B0aW9uVGFnLnNlbGVjdGVkID0gdHJ1ZTsKLSAgICAgICAgb3B0aW9uVGFnLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKChlIGluc3RhbmNlb2YgQXJyYXkpID8gZVsxXSA6IGUpKTsKLSAgICAgICAgc2VsZWN0VGFnLmFwcGVuZENoaWxkKG9wdGlvblRhZyk7Ci0gICAgICB9LmJpbmQodGhpcykpOwotICAgICAgdGhpcy5jYWNoZWRfc2VsZWN0VGFnID0gc2VsZWN0VGFnOwotICAgIH0KLQotICAgIHRoaXMuZWRpdEZpZWxkID0gdGhpcy5jYWNoZWRfc2VsZWN0VGFnOwotICAgIGlmKHRoaXMub3B0aW9ucy5sb2FkVGV4dFVSTCkgdGhpcy5sb2FkRXh0ZXJuYWxUZXh0KCk7Ci0gICAgdGhpcy5mb3JtLmFwcGVuZENoaWxkKHRoaXMuZWRpdEZpZWxkKTsKLSAgICB0aGlzLm9wdGlvbnMuY2FsbGJhY2sgPSBmdW5jdGlvbihmb3JtLCB2YWx1ZSkgewotICAgICAgcmV0dXJuICJ2YWx1ZT0iICsgZW5jb2RlVVJJQ29tcG9uZW50KHZhbHVlKTsKLSAgICB9Ci0gIH0KLX0pOwotCi0vLyBEZWxheWVkIG9ic2VydmVyLCBsaWtlIEZvcm0uRWxlbWVudC5PYnNlcnZlciwgCi0vLyBidXQgd2FpdHMgZm9yIGRlbGF5IGFmdGVyIGxhc3Qga2V5IGlucHV0Ci0vLyBJZGVhbCBmb3IgbGl2ZS1zZWFyY2ggZmllbGRzCi0KLUZvcm0uRWxlbWVudC5EZWxheWVkT2JzZXJ2ZXIgPSBDbGFzcy5jcmVhdGUoKTsKLUZvcm0uRWxlbWVudC5EZWxheWVkT2JzZXJ2ZXIucHJvdG90eXBlID0gewotICBpbml0aWFsaXplOiBmdW5jdGlvbihlbGVtZW50LCBkZWxheSwgY2FsbGJhY2spIHsKLSAgICB0aGlzLmRlbGF5ICAgICA9IGRlbGF5IHx8IDAuNTsKLSAgICB0aGlzLmVsZW1lbnQgICA9ICQoZWxlbWVudCk7Ci0gICAgdGhpcy5jYWxsYmFjayAgPSBjYWxsYmFjazsKLSAgICB0aGlzLnRpbWVyICAgICA9IG51bGw7Ci0gICAgdGhpcy5sYXN0VmFsdWUgPSAkRih0aGlzLmVsZW1lbnQpOyAKLSAgICBFdmVudC5vYnNlcnZlKHRoaXMuZWxlbWVudCwna2V5dXAnLHRoaXMuZGVsYXllZExpc3RlbmVyLmJpbmRBc0V2ZW50TGlzdGVuZXIodGhpcykpOwotICB9LAotICBkZWxheWVkTGlzdGVuZXI6IGZ1bmN0aW9uKGV2ZW50KSB7Ci0gICAgaWYodGhpcy5sYXN0VmFsdWUgPT0gJEYodGhpcy5lbGVtZW50KSkgcmV0dXJuOwotICAgIGlmKHRoaXMudGltZXIpIGNsZWFyVGltZW91dCh0aGlzLnRpbWVyKTsKLSAgICB0aGlzLnRpbWVyID0gc2V0VGltZW91dCh0aGlzLm9uVGltZXJFdmVudC5iaW5kKHRoaXMpLCB0aGlzLmRlbGF5ICogMTAwMCk7Ci0gICAgdGhpcy5sYXN0VmFsdWUgPSAkRih0aGlzLmVsZW1lbnQpOwotICB9LAotICBvblRpbWVyRXZlbnQ6IGZ1bmN0aW9uKCkgewotICAgIHRoaXMudGltZXIgPSBudWxsOwotICAgIHRoaXMuY2FsbGJhY2sodGhpcy5lbGVtZW50LCAkRih0aGlzLmVsZW1lbnQpKTsKLSAgfQotfTsKZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL3NjcmlwdHMvZHJhZ2Ryb3AuanMgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy9zY3JpcHRzL2RyYWdkcm9wLmpzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTFlYjZiLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL3NjcmlwdHMvZHJhZ2Ryb3AuanMKKysrIC9kZXYvbnVsbApAQCAtMSw5NzAgKzAsMCBAQAotLy8gc2NyaXB0LmFjdWxvLnVzIGRyYWdkcm9wLmpzIHYxLjYuNCwgV2VkIFNlcCAwNiAxMTozMDo1OCBDRVNUIDIwMDYKLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1IFRob21hcyBGdWNocyAoaHR0cDovL3NjcmlwdC5hY3Vsby51cywgaHR0cDovL21pci5hY3Vsby51cykKLS8vICAgICAgICAgICAoYykgMjAwNSBTYW1taSBXaWxsaWFtcyAoaHR0cDovL3d3dy5vcmlvbnRyYW5zZmVyLmNvLm56LCBzYW1taUBvcmlvbnRyYW5zZmVyLmNvLm56KQotLy8gCi0vLyBTZWUgc2NyaXB0YWN1bG91cy5qcyBmb3IgZnVsbCBsaWNlbnNlLgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotaWYodHlwZW9mIEVmZmVjdCA9PSAndW5kZWZpbmVkJykKLSAgdGhyb3coImRyYWdkcm9wLmpzIHJlcXVpcmVzIGluY2x1ZGluZyBzY3JpcHQuYWN1bG8udXMnIGVmZmVjdHMuanMgbGlicmFyeSIpOwotCi12YXIgRHJvcHBhYmxlcyA9IHsKLSAgZHJvcHM6IFtdLAotCi0gIHJlbW92ZTogZnVuY3Rpb24oZWxlbWVudCkgewotICAgIHRoaXMuZHJvcHMgPSB0aGlzLmRyb3BzLnJlamVjdChmdW5jdGlvbihkKSB7IHJldHVybiBkLmVsZW1lbnQ9PSQoZWxlbWVudCkgfSk7Ci0gIH0sCi0KLSAgYWRkOiBmdW5jdGlvbihlbGVtZW50KSB7Ci0gICAgZWxlbWVudCA9ICQoZWxlbWVudCk7Ci0gICAgdmFyIG9wdGlvbnMgPSBPYmplY3QuZXh0ZW5kKHsKLSAgICAgIGdyZWVkeTogICAgIHRydWUsCi0gICAgICBob3ZlcmNsYXNzOiBudWxsLAotICAgICAgdHJlZTogICAgICAgZmFsc2UKLSAgICB9LCBhcmd1bWVudHNbMV0gfHwge30pOwotCi0gICAgLy8gY2FjaGUgY29udGFpbmVycwotICAgIGlmKG9wdGlvbnMuY29udGFpbm1lbnQpIHsKLSAgICAgIG9wdGlvbnMuX2NvbnRhaW5lcnMgPSBbXTsKLSAgICAgIHZhciBjb250YWlubWVudCA9IG9wdGlvbnMuY29udGFpbm1lbnQ7Ci0gICAgICBpZigodHlwZW9mIGNvbnRhaW5tZW50ID09ICdvYmplY3QnKSAmJiAKLSAgICAgICAgKGNvbnRhaW5tZW50LmNvbnN0cnVjdG9yID09IEFycmF5KSkgewotICAgICAgICBjb250YWlubWVudC5lYWNoKCBmdW5jdGlvbihjKSB7IG9wdGlvbnMuX2NvbnRhaW5lcnMucHVzaCgkKGMpKSB9KTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIG9wdGlvbnMuX2NvbnRhaW5lcnMucHVzaCgkKGNvbnRhaW5tZW50KSk7Ci0gICAgICB9Ci0gICAgfQotICAgIAotICAgIGlmKG9wdGlvbnMuYWNjZXB0KSBvcHRpb25zLmFjY2VwdCA9IFtvcHRpb25zLmFjY2VwdF0uZmxhdHRlbigpOwotCi0gICAgRWxlbWVudC5tYWtlUG9zaXRpb25lZChlbGVtZW50KTsgLy8gZml4IElFCi0gICAgb3B0aW9ucy5lbGVtZW50ID0gZWxlbWVudDsKLQotICAgIHRoaXMuZHJvcHMucHVzaChvcHRpb25zKTsKLSAgfSwKLSAgCi0gIGZpbmREZWVwZXN0Q2hpbGQ6IGZ1bmN0aW9uKGRyb3BzKSB7Ci0gICAgZGVlcGVzdCA9IGRyb3BzWzBdOwotICAgICAgCi0gICAgZm9yIChpID0gMTsgaSA8IGRyb3BzLmxlbmd0aDsgKytpKQotICAgICAgaWYgKEVsZW1lbnQuaXNQYXJlbnQoZHJvcHNbaV0uZWxlbWVudCwgZGVlcGVzdC5lbGVtZW50KSkKLSAgICAgICAgZGVlcGVzdCA9IGRyb3BzW2ldOwotICAgIAotICAgIHJldHVybiBkZWVwZXN0OwotICB9LAotCi0gIGlzQ29udGFpbmVkOiBmdW5jdGlvbihlbGVtZW50LCBkcm9wKSB7Ci0gICAgdmFyIGNvbnRhaW5tZW50Tm9kZTsKLSAgICBpZihkcm9wLnRyZWUpIHsKLSAgICAgIGNvbnRhaW5tZW50Tm9kZSA9IGVsZW1lbnQudHJlZU5vZGU7IAotICAgIH0gZWxzZSB7Ci0gICAgICBjb250YWlubWVudE5vZGUgPSBlbGVtZW50LnBhcmVudE5vZGU7Ci0gICAgfQotICAgIHJldHVybiBkcm9wLl9jb250YWluZXJzLmRldGVjdChmdW5jdGlvbihjKSB7IHJldHVybiBjb250YWlubWVudE5vZGUgPT0gYyB9KTsKLSAgfSwKLSAgCi0gIGlzQWZmZWN0ZWQ6IGZ1bmN0aW9uKHBvaW50LCBlbGVtZW50LCBkcm9wKSB7Ci0gICAgcmV0dXJuICgKLSAgICAgIChkcm9wLmVsZW1lbnQhPWVsZW1lbnQpICYmCi0gICAgICAoKCFkcm9wLl9jb250YWluZXJzKSB8fAotICAgICAgICB0aGlzLmlzQ29udGFpbmVkKGVsZW1lbnQsIGRyb3ApKSAmJgotICAgICAgKCghZHJvcC5hY2NlcHQpIHx8Ci0gICAgICAgIChFbGVtZW50LmNsYXNzTmFtZXMoZWxlbWVudCkuZGV0ZWN0KCAKLSAgICAgICAgICBmdW5jdGlvbih2KSB7IHJldHVybiBkcm9wLmFjY2VwdC5pbmNsdWRlKHYpIH0gKSApKSAmJgotICAgICAgUG9zaXRpb24ud2l0aGluKGRyb3AuZWxlbWVudCwgcG9pbnRbMF0sIHBvaW50WzFdKSApOwotICB9LAotCi0gIGRlYWN0aXZhdGU6IGZ1bmN0aW9uKGRyb3ApIHsKLSAgICBpZihkcm9wLmhvdmVyY2xhc3MpCi0gICAgICBFbGVtZW50LnJlbW92ZUNsYXNzTmFtZShkcm9wLmVsZW1lbnQsIGRyb3AuaG92ZXJjbGFzcyk7Ci0gICAgdGhpcy5sYXN0X2FjdGl2ZSA9IG51bGw7Ci0gIH0sCi0KLSAgYWN0aXZhdGU6IGZ1bmN0aW9uKGRyb3ApIHsKLSAgICBpZihkcm9wLmhvdmVyY2xhc3MpCi0gICAgICBFbGVtZW50LmFkZENsYXNzTmFtZShkcm9wLmVsZW1lbnQsIGRyb3AuaG92ZXJjbGFzcyk7Ci0gICAgdGhpcy5sYXN0X2FjdGl2ZSA9IGRyb3A7Ci0gIH0sCi0KLSAgc2hvdzogZnVuY3Rpb24ocG9pbnQsIGVsZW1lbnQpIHsKLSAgICBpZighdGhpcy5kcm9wcy5sZW5ndGgpIHJldHVybjsKLSAgICB2YXIgYWZmZWN0ZWQgPSBbXTsKLSAgICAKLSAgICBpZih0aGlzLmxhc3RfYWN0aXZlKSB0aGlzLmRlYWN0aXZhdGUodGhpcy5sYXN0X2FjdGl2ZSk7Ci0gICAgdGhpcy5kcm9wcy5lYWNoKCBmdW5jdGlvbihkcm9wKSB7Ci0gICAgICBpZihEcm9wcGFibGVzLmlzQWZmZWN0ZWQocG9pbnQsIGVsZW1lbnQsIGRyb3ApKQotICAgICAgICBhZmZlY3RlZC5wdXNoKGRyb3ApOwotICAgIH0pOwotICAgICAgICAKLSAgICBpZihhZmZlY3RlZC5sZW5ndGg+MCkgewotICAgICAgZHJvcCA9IERyb3BwYWJsZXMuZmluZERlZXBlc3RDaGlsZChhZmZlY3RlZCk7Ci0gICAgICBQb3NpdGlvbi53aXRoaW4oZHJvcC5lbGVtZW50LCBwb2ludFswXSwgcG9pbnRbMV0pOwotICAgICAgaWYoZHJvcC5vbkhvdmVyKQotICAgICAgICBkcm9wLm9uSG92ZXIoZWxlbWVudCwgZHJvcC5lbGVtZW50LCBQb3NpdGlvbi5vdmVybGFwKGRyb3Aub3ZlcmxhcCwgZHJvcC5lbGVtZW50KSk7Ci0gICAgICAKLSAgICAgIERyb3BwYWJsZXMuYWN0aXZhdGUoZHJvcCk7Ci0gICAgfQotICB9LAotCi0gIGZpcmU6IGZ1bmN0aW9uKGV2ZW50LCBlbGVtZW50KSB7Ci0gICAgaWYoIXRoaXMubGFzdF9hY3RpdmUpIHJldHVybjsKLSAgICBQb3NpdGlvbi5wcmVwYXJlKCk7Ci0KLSAgICBpZiAodGhpcy5pc0FmZmVjdGVkKFtFdmVudC5wb2ludGVyWChldmVudCksIEV2ZW50LnBvaW50ZXJZKGV2ZW50KV0sIGVsZW1lbnQsIHRoaXMubGFzdF9hY3RpdmUpKQotICAgICAgaWYgKHRoaXMubGFzdF9hY3RpdmUub25Ecm9wKSAKLSAgICAgICAgdGhpcy5sYXN0X2FjdGl2ZS5vbkRyb3AoZWxlbWVudCwgdGhpcy5sYXN0X2FjdGl2ZS5lbGVtZW50LCBldmVudCk7Ci0gIH0sCi0KLSAgcmVzZXQ6IGZ1bmN0aW9uKCkgewotICAgIGlmKHRoaXMubGFzdF9hY3RpdmUpCi0gICAgICB0aGlzLmRlYWN0aXZhdGUodGhpcy5sYXN0X2FjdGl2ZSk7Ci0gIH0KLX0KLQotdmFyIERyYWdnYWJsZXMgPSB7Ci0gIGRyYWdzOiBbXSwKLSAgb2JzZXJ2ZXJzOiBbXSwKLSAgCi0gIHJlZ2lzdGVyOiBmdW5jdGlvbihkcmFnZ2FibGUpIHsKLSAgICBpZih0aGlzLmRyYWdzLmxlbmd0aCA9PSAwKSB7Ci0gICAgICB0aGlzLmV2ZW50TW91c2VVcCAgID0gdGhpcy5lbmREcmFnLmJpbmRBc0V2ZW50TGlzdGVuZXIodGhpcyk7Ci0gICAgICB0aGlzLmV2ZW50TW91c2VNb3ZlID0gdGhpcy51cGRhdGVEcmFnLmJpbmRBc0V2ZW50TGlzdGVuZXIodGhpcyk7Ci0gICAgICB0aGlzLmV2ZW50S2V5cHJlc3MgID0gdGhpcy5rZXlQcmVzcy5iaW5kQXNFdmVudExpc3RlbmVyKHRoaXMpOwotICAgICAgCi0gICAgICBFdmVudC5vYnNlcnZlKGRvY3VtZW50LCAibW91c2V1cCIsIHRoaXMuZXZlbnRNb3VzZVVwKTsKLSAgICAgIEV2ZW50Lm9ic2VydmUoZG9jdW1lbnQsICJtb3VzZW1vdmUiLCB0aGlzLmV2ZW50TW91c2VNb3ZlKTsKLSAgICAgIEV2ZW50Lm9ic2VydmUoZG9jdW1lbnQsICJrZXlwcmVzcyIsIHRoaXMuZXZlbnRLZXlwcmVzcyk7Ci0gICAgfQotICAgIHRoaXMuZHJhZ3MucHVzaChkcmFnZ2FibGUpOwotICB9LAotICAKLSAgdW5yZWdpc3RlcjogZnVuY3Rpb24oZHJhZ2dhYmxlKSB7Ci0gICAgdGhpcy5kcmFncyA9IHRoaXMuZHJhZ3MucmVqZWN0KGZ1bmN0aW9uKGQpIHsgcmV0dXJuIGQ9PWRyYWdnYWJsZSB9KTsKLSAgICBpZih0aGlzLmRyYWdzLmxlbmd0aCA9PSAwKSB7Ci0gICAgICBFdmVudC5zdG9wT2JzZXJ2aW5nKGRvY3VtZW50LCAibW91c2V1cCIsIHRoaXMuZXZlbnRNb3VzZVVwKTsKLSAgICAgIEV2ZW50LnN0b3BPYnNlcnZpbmcoZG9jdW1lbnQsICJtb3VzZW1vdmUiLCB0aGlzLmV2ZW50TW91c2VNb3ZlKTsKLSAgICAgIEV2ZW50LnN0b3BPYnNlcnZpbmcoZG9jdW1lbnQsICJrZXlwcmVzcyIsIHRoaXMuZXZlbnRLZXlwcmVzcyk7Ci0gICAgfQotICB9LAotICAKLSAgYWN0aXZhdGU6IGZ1bmN0aW9uKGRyYWdnYWJsZSkgewotICAgIGlmKGRyYWdnYWJsZS5vcHRpb25zLmRlbGF5KSB7IAotICAgICAgdGhpcy5fdGltZW91dCA9IHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7IAotICAgICAgICBEcmFnZ2FibGVzLl90aW1lb3V0ID0gbnVsbDsgCi0gICAgICAgIHdpbmRvdy5mb2N1cygpOyAKLSAgICAgICAgRHJhZ2dhYmxlcy5hY3RpdmVEcmFnZ2FibGUgPSBkcmFnZ2FibGU7IAotICAgICAgfS5iaW5kKHRoaXMpLCBkcmFnZ2FibGUub3B0aW9ucy5kZWxheSk7IAotICAgIH0gZWxzZSB7Ci0gICAgICB3aW5kb3cuZm9jdXMoKTsgLy8gYWxsb3dzIGtleXByZXNzIGV2ZW50cyBpZiB3aW5kb3cgaXNuJ3QgY3VycmVudGx5IGZvY3VzZWQsIGZhaWxzIGZvciBTYWZhcmkKLSAgICAgIHRoaXMuYWN0aXZlRHJhZ2dhYmxlID0gZHJhZ2dhYmxlOwotICAgIH0KLSAgfSwKLSAgCi0gIGRlYWN0aXZhdGU6IGZ1bmN0aW9uKCkgewotICAgIHRoaXMuYWN0aXZlRHJhZ2dhYmxlID0gbnVsbDsKLSAgfSwKLSAgCi0gIHVwZGF0ZURyYWc6IGZ1bmN0aW9uKGV2ZW50KSB7Ci0gICAgaWYoIXRoaXMuYWN0aXZlRHJhZ2dhYmxlKSByZXR1cm47Ci0gICAgdmFyIHBvaW50ZXIgPSBbRXZlbnQucG9pbnRlclgoZXZlbnQpLCBFdmVudC5wb2ludGVyWShldmVudCldOwotICAgIC8vIE1vemlsbGEtYmFzZWQgYnJvd3NlcnMgZmlyZSBzdWNjZXNzaXZlIG1vdXNlbW92ZSBldmVudHMgd2l0aAotICAgIC8vIHRoZSBzYW1lIGNvb3JkaW5hdGVzLCBwcmV2ZW50IG5lZWRsZXNzIHJlZHJhd2luZyAobW96IGJ1Zz8pCi0gICAgaWYodGhpcy5fbGFzdFBvaW50ZXIgJiYgKHRoaXMuX2xhc3RQb2ludGVyLmluc3BlY3QoKSA9PSBwb2ludGVyLmluc3BlY3QoKSkpIHJldHVybjsKLSAgICB0aGlzLl9sYXN0UG9pbnRlciA9IHBvaW50ZXI7Ci0gICAgCi0gICAgdGhpcy5hY3RpdmVEcmFnZ2FibGUudXBkYXRlRHJhZyhldmVudCwgcG9pbnRlcik7Ci0gIH0sCi0gIAotICBlbmREcmFnOiBmdW5jdGlvbihldmVudCkgewotICAgIGlmKHRoaXMuX3RpbWVvdXQpIHsgCi0gICAgICBjbGVhclRpbWVvdXQodGhpcy5fdGltZW91dCk7IAotICAgICAgdGhpcy5fdGltZW91dCA9IG51bGw7IAotICAgIH0KLSAgICBpZighdGhpcy5hY3RpdmVEcmFnZ2FibGUpIHJldHVybjsKLSAgICB0aGlzLl9sYXN0UG9pbnRlciA9IG51bGw7Ci0gICAgdGhpcy5hY3RpdmVEcmFnZ2FibGUuZW5kRHJhZyhldmVudCk7Ci0gICAgdGhpcy5hY3RpdmVEcmFnZ2FibGUgPSBudWxsOwotICB9LAotICAKLSAga2V5UHJlc3M6IGZ1bmN0aW9uKGV2ZW50KSB7Ci0gICAgaWYodGhpcy5hY3RpdmVEcmFnZ2FibGUpCi0gICAgICB0aGlzLmFjdGl2ZURyYWdnYWJsZS5rZXlQcmVzcyhldmVudCk7Ci0gIH0sCi0gIAotICBhZGRPYnNlcnZlcjogZnVuY3Rpb24ob2JzZXJ2ZXIpIHsKLSAgICB0aGlzLm9ic2VydmVycy5wdXNoKG9ic2VydmVyKTsKLSAgICB0aGlzLl9jYWNoZU9ic2VydmVyQ2FsbGJhY2tzKCk7Ci0gIH0sCi0gIAotICByZW1vdmVPYnNlcnZlcjogZnVuY3Rpb24oZWxlbWVudCkgeyAgLy8gZWxlbWVudCBpbnN0ZWFkIG9mIG9ic2VydmVyIGZpeGVzIG1lbSBsZWFrcwotICAgIHRoaXMub2JzZXJ2ZXJzID0gdGhpcy5vYnNlcnZlcnMucmVqZWN0KCBmdW5jdGlvbihvKSB7IHJldHVybiBvLmVsZW1lbnQ9PWVsZW1lbnQgfSk7Ci0gICAgdGhpcy5fY2FjaGVPYnNlcnZlckNhbGxiYWNrcygpOwotICB9LAotICAKLSAgbm90aWZ5OiBmdW5jdGlvbihldmVudE5hbWUsIGRyYWdnYWJsZSwgZXZlbnQpIHsgIC8vICdvblN0YXJ0JywgJ29uRW5kJywgJ29uRHJhZycKLSAgICBpZih0aGlzW2V2ZW50TmFtZSsnQ291bnQnXSA+IDApCi0gICAgICB0aGlzLm9ic2VydmVycy5lYWNoKCBmdW5jdGlvbihvKSB7Ci0gICAgICAgIGlmKG9bZXZlbnROYW1lXSkgb1tldmVudE5hbWVdKGV2ZW50TmFtZSwgZHJhZ2dhYmxlLCBldmVudCk7Ci0gICAgICB9KTsKLSAgICBpZihkcmFnZ2FibGUub3B0aW9uc1tldmVudE5hbWVdKSBkcmFnZ2FibGUub3B0aW9uc1tldmVudE5hbWVdKGRyYWdnYWJsZSwgZXZlbnQpOwotICB9LAotICAKLSAgX2NhY2hlT2JzZXJ2ZXJDYWxsYmFja3M6IGZ1bmN0aW9uKCkgewotICAgIFsnb25TdGFydCcsJ29uRW5kJywnb25EcmFnJ10uZWFjaCggZnVuY3Rpb24oZXZlbnROYW1lKSB7Ci0gICAgICBEcmFnZ2FibGVzW2V2ZW50TmFtZSsnQ291bnQnXSA9IERyYWdnYWJsZXMub2JzZXJ2ZXJzLnNlbGVjdCgKLSAgICAgICAgZnVuY3Rpb24obykgeyByZXR1cm4gb1tldmVudE5hbWVdOyB9Ci0gICAgICApLmxlbmd0aDsKLSAgICB9KTsKLSAgfQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdmFyIERyYWdnYWJsZSA9IENsYXNzLmNyZWF0ZSgpOwotRHJhZ2dhYmxlLl9kcmFnZ2luZyAgICA9IHt9OwotCi1EcmFnZ2FibGUucHJvdG90eXBlID0gewotICBpbml0aWFsaXplOiBmdW5jdGlvbihlbGVtZW50KSB7Ci0gICAgdmFyIGRlZmF1bHRzID0gewotICAgICAgaGFuZGxlOiBmYWxzZSwKLSAgICAgIHJldmVydGVmZmVjdDogZnVuY3Rpb24oZWxlbWVudCwgdG9wX29mZnNldCwgbGVmdF9vZmZzZXQpIHsKLSAgICAgICAgdmFyIGR1ciA9IE1hdGguc3FydChNYXRoLmFicyh0b3Bfb2Zmc2V0XjIpK01hdGguYWJzKGxlZnRfb2Zmc2V0XjIpKSowLjAyOwotICAgICAgICBuZXcgRWZmZWN0Lk1vdmUoZWxlbWVudCwgeyB4OiAtbGVmdF9vZmZzZXQsIHk6IC10b3Bfb2Zmc2V0LCBkdXJhdGlvbjogZHVyLAotICAgICAgICAgIHF1ZXVlOiB7c2NvcGU6J19kcmFnZ2FibGUnLCBwb3NpdGlvbjonZW5kJ30KLSAgICAgICAgfSk7Ci0gICAgICB9LAotICAgICAgZW5kZWZmZWN0OiBmdW5jdGlvbihlbGVtZW50KSB7Ci0gICAgICAgIHZhciB0b09wYWNpdHkgPSB0eXBlb2YgZWxlbWVudC5fb3BhY2l0eSA9PSAnbnVtYmVyJyA/IGVsZW1lbnQuX29wYWNpdHkgOiAxLjA7Ci0gICAgICAgIG5ldyBFZmZlY3QuT3BhY2l0eShlbGVtZW50LCB7ZHVyYXRpb246MC4yLCBmcm9tOjAuNywgdG86dG9PcGFjaXR5LCAKLSAgICAgICAgICBxdWV1ZToge3Njb3BlOidfZHJhZ2dhYmxlJywgcG9zaXRpb246J2VuZCd9LAotICAgICAgICAgIGFmdGVyRmluaXNoOiBmdW5jdGlvbigpeyAKLSAgICAgICAgICAgIERyYWdnYWJsZS5fZHJhZ2dpbmdbZWxlbWVudF0gPSBmYWxzZSAKLSAgICAgICAgICB9Ci0gICAgICAgIH0pOyAKLSAgICAgIH0sCi0gICAgICB6aW5kZXg6IDEwMDAsCi0gICAgICByZXZlcnQ6IGZhbHNlLAotICAgICAgc2Nyb2xsOiBmYWxzZSwKLSAgICAgIHNjcm9sbFNlbnNpdGl2aXR5OiAyMCwKLSAgICAgIHNjcm9sbFNwZWVkOiAxNSwKLSAgICAgIHNuYXA6IGZhbHNlLCAgLy8gZmFsc2UsIG9yIHh5IG9yIFt4LHldIG9yIGZ1bmN0aW9uKHgseSl7IHJldHVybiBbeCx5XSB9Ci0gICAgICBkZWxheTogMAotICAgIH07Ci0gICAgCi0gICAgaWYoYXJndW1lbnRzWzFdICYmIHR5cGVvZiBhcmd1bWVudHNbMV0uZW5kZWZmZWN0ID09ICd1bmRlZmluZWQnKQotICAgICAgT2JqZWN0LmV4dGVuZChkZWZhdWx0cywgewotICAgICAgICBzdGFydGVmZmVjdDogZnVuY3Rpb24oZWxlbWVudCkgewotICAgICAgICAgIGVsZW1lbnQuX29wYWNpdHkgPSBFbGVtZW50LmdldE9wYWNpdHkoZWxlbWVudCk7Ci0gICAgICAgICAgRHJhZ2dhYmxlLl9kcmFnZ2luZ1tlbGVtZW50XSA9IHRydWU7Ci0gICAgICAgICAgbmV3IEVmZmVjdC5PcGFjaXR5KGVsZW1lbnQsIHtkdXJhdGlvbjowLjIsIGZyb206ZWxlbWVudC5fb3BhY2l0eSwgdG86MC43fSk7IAotICAgICAgICB9Ci0gICAgICB9KTsKLSAgICAKLSAgICB2YXIgb3B0aW9ucyA9IE9iamVjdC5leHRlbmQoZGVmYXVsdHMsIGFyZ3VtZW50c1sxXSB8fCB7fSk7Ci0KLSAgICB0aGlzLmVsZW1lbnQgPSAkKGVsZW1lbnQpOwotICAgIAotICAgIGlmKG9wdGlvbnMuaGFuZGxlICYmICh0eXBlb2Ygb3B0aW9ucy5oYW5kbGUgPT0gJ3N0cmluZycpKSB7Ci0gICAgICB2YXIgaCA9IEVsZW1lbnQuY2hpbGRyZW5XaXRoQ2xhc3NOYW1lKHRoaXMuZWxlbWVudCwgb3B0aW9ucy5oYW5kbGUsIHRydWUpOwotICAgICAgaWYoaC5sZW5ndGg+MCkgdGhpcy5oYW5kbGUgPSBoWzBdOwotICAgIH0KLSAgICBpZighdGhpcy5oYW5kbGUpIHRoaXMuaGFuZGxlID0gJChvcHRpb25zLmhhbmRsZSk7Ci0gICAgaWYoIXRoaXMuaGFuZGxlKSB0aGlzLmhhbmRsZSA9IHRoaXMuZWxlbWVudDsKLSAgICAKLSAgICBpZihvcHRpb25zLnNjcm9sbCAmJiAhb3B0aW9ucy5zY3JvbGwuc2Nyb2xsVG8gJiYgIW9wdGlvbnMuc2Nyb2xsLm91dGVySFRNTCkgewotICAgICAgb3B0aW9ucy5zY3JvbGwgPSAkKG9wdGlvbnMuc2Nyb2xsKTsKLSAgICAgIHRoaXMuX2lzU2Nyb2xsQ2hpbGQgPSBFbGVtZW50LmNoaWxkT2YodGhpcy5lbGVtZW50LCBvcHRpb25zLnNjcm9sbCk7Ci0gICAgfQotCi0gICAgRWxlbWVudC5tYWtlUG9zaXRpb25lZCh0aGlzLmVsZW1lbnQpOyAvLyBmaXggSUUgICAgCi0KLSAgICB0aGlzLmRlbHRhICAgID0gdGhpcy5jdXJyZW50RGVsdGEoKTsKLSAgICB0aGlzLm9wdGlvbnMgID0gb3B0aW9uczsKLSAgICB0aGlzLmRyYWdnaW5nID0gZmFsc2U7ICAgCi0KLSAgICB0aGlzLmV2ZW50TW91c2VEb3duID0gdGhpcy5pbml0RHJhZy5iaW5kQXNFdmVudExpc3RlbmVyKHRoaXMpOwotICAgIEV2ZW50Lm9ic2VydmUodGhpcy5oYW5kbGUsICJtb3VzZWRvd24iLCB0aGlzLmV2ZW50TW91c2VEb3duKTsKLSAgICAKLSAgICBEcmFnZ2FibGVzLnJlZ2lzdGVyKHRoaXMpOwotICB9LAotICAKLSAgZGVzdHJveTogZnVuY3Rpb24oKSB7Ci0gICAgRXZlbnQuc3RvcE9ic2VydmluZyh0aGlzLmhhbmRsZSwgIm1vdXNlZG93biIsIHRoaXMuZXZlbnRNb3VzZURvd24pOwotICAgIERyYWdnYWJsZXMudW5yZWdpc3Rlcih0aGlzKTsKLSAgfSwKLSAgCi0gIGN1cnJlbnREZWx0YTogZnVuY3Rpb24oKSB7Ci0gICAgcmV0dXJuKFsKLSAgICAgIHBhcnNlSW50KEVsZW1lbnQuZ2V0U3R5bGUodGhpcy5lbGVtZW50LCdsZWZ0JykgfHwgJzAnKSwKLSAgICAgIHBhcnNlSW50KEVsZW1lbnQuZ2V0U3R5bGUodGhpcy5lbGVtZW50LCd0b3AnKSB8fCAnMCcpXSk7Ci0gIH0sCi0gIAotICBpbml0RHJhZzogZnVuY3Rpb24oZXZlbnQpIHsKLSAgICBpZih0eXBlb2YgRHJhZ2dhYmxlLl9kcmFnZ2luZ1t0aGlzLmVsZW1lbnRdICE9ICd1bmRlZmluZWQnICYmCi0gICAgICBEcmFnZ2FibGUuX2RyYWdnaW5nW3RoaXMuZWxlbWVudF0pIHJldHVybjsKLSAgICBpZihFdmVudC5pc0xlZnRDbGljayhldmVudCkpIHsgICAgCi0gICAgICAvLyBhYm9ydCBvbiBmb3JtIGVsZW1lbnRzLCBmaXhlcyBhIEZpcmVmb3ggaXNzdWUKLSAgICAgIHZhciBzcmMgPSBFdmVudC5lbGVtZW50KGV2ZW50KTsKLSAgICAgIGlmKHNyYy50YWdOYW1lICYmICgKLSAgICAgICAgc3JjLnRhZ05hbWU9PSdJTlBVVCcgfHwKLSAgICAgICAgc3JjLnRhZ05hbWU9PSdTRUxFQ1QnIHx8Ci0gICAgICAgIHNyYy50YWdOYW1lPT0nT1BUSU9OJyB8fAotICAgICAgICBzcmMudGFnTmFtZT09J0JVVFRPTicgfHwKLSAgICAgICAgc3JjLnRhZ05hbWU9PSdURVhUQVJFQScpKSByZXR1cm47Ci0gICAgICAgIAotICAgICAgdmFyIHBvaW50ZXIgPSBbRXZlbnQucG9pbnRlclgoZXZlbnQpLCBFdmVudC5wb2ludGVyWShldmVudCldOwotICAgICAgdmFyIHBvcyAgICAgPSBQb3NpdGlvbi5jdW11bGF0aXZlT2Zmc2V0KHRoaXMuZWxlbWVudCk7Ci0gICAgICB0aGlzLm9mZnNldCA9IFswLDFdLm1hcCggZnVuY3Rpb24oaSkgeyByZXR1cm4gKHBvaW50ZXJbaV0gLSBwb3NbaV0pIH0pOwotICAgICAgCi0gICAgICBEcmFnZ2FibGVzLmFjdGl2YXRlKHRoaXMpOwotICAgICAgRXZlbnQuc3RvcChldmVudCk7Ci0gICAgfQotICB9LAotICAKLSAgc3RhcnREcmFnOiBmdW5jdGlvbihldmVudCkgewotICAgIHRoaXMuZHJhZ2dpbmcgPSB0cnVlOwotICAgIAotICAgIGlmKHRoaXMub3B0aW9ucy56aW5kZXgpIHsKLSAgICAgIHRoaXMub3JpZ2luYWxaID0gcGFyc2VJbnQoRWxlbWVudC5nZXRTdHlsZSh0aGlzLmVsZW1lbnQsJ3otaW5kZXgnKSB8fCAwKTsKLSAgICAgIHRoaXMuZWxlbWVudC5zdHlsZS56SW5kZXggPSB0aGlzLm9wdGlvbnMuemluZGV4OwotICAgIH0KLSAgICAKLSAgICBpZih0aGlzLm9wdGlvbnMuZ2hvc3RpbmcpIHsKLSAgICAgIHRoaXMuX2Nsb25lID0gdGhpcy5lbGVtZW50LmNsb25lTm9kZSh0cnVlKTsKLSAgICAgIFBvc2l0aW9uLmFic29sdXRpemUodGhpcy5lbGVtZW50KTsKLSAgICAgIHRoaXMuZWxlbWVudC5wYXJlbnROb2RlLmluc2VydEJlZm9yZSh0aGlzLl9jbG9uZSwgdGhpcy5lbGVtZW50KTsKLSAgICB9Ci0gICAgCi0gICAgaWYodGhpcy5vcHRpb25zLnNjcm9sbCkgewotICAgICAgaWYgKHRoaXMub3B0aW9ucy5zY3JvbGwgPT0gd2luZG93KSB7Ci0gICAgICAgIHZhciB3aGVyZSA9IHRoaXMuX2dldFdpbmRvd1Njcm9sbCh0aGlzLm9wdGlvbnMuc2Nyb2xsKTsKLSAgICAgICAgdGhpcy5vcmlnaW5hbFNjcm9sbExlZnQgPSB3aGVyZS5sZWZ0OwotICAgICAgICB0aGlzLm9yaWdpbmFsU2Nyb2xsVG9wID0gd2hlcmUudG9wOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgdGhpcy5vcmlnaW5hbFNjcm9sbExlZnQgPSB0aGlzLm9wdGlvbnMuc2Nyb2xsLnNjcm9sbExlZnQ7Ci0gICAgICAgIHRoaXMub3JpZ2luYWxTY3JvbGxUb3AgPSB0aGlzLm9wdGlvbnMuc2Nyb2xsLnNjcm9sbFRvcDsKLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgRHJhZ2dhYmxlcy5ub3RpZnkoJ29uU3RhcnQnLCB0aGlzLCBldmVudCk7Ci0gICAgICAgIAotICAgIGlmKHRoaXMub3B0aW9ucy5zdGFydGVmZmVjdCkgdGhpcy5vcHRpb25zLnN0YXJ0ZWZmZWN0KHRoaXMuZWxlbWVudCk7Ci0gIH0sCi0gIAotICB1cGRhdGVEcmFnOiBmdW5jdGlvbihldmVudCwgcG9pbnRlcikgewotICAgIGlmKCF0aGlzLmRyYWdnaW5nKSB0aGlzLnN0YXJ0RHJhZyhldmVudCk7Ci0gICAgUG9zaXRpb24ucHJlcGFyZSgpOwotICAgIERyb3BwYWJsZXMuc2hvdyhwb2ludGVyLCB0aGlzLmVsZW1lbnQpOwotICAgIERyYWdnYWJsZXMubm90aWZ5KCdvbkRyYWcnLCB0aGlzLCBldmVudCk7Ci0gICAgCi0gICAgdGhpcy5kcmF3KHBvaW50ZXIpOwotICAgIGlmKHRoaXMub3B0aW9ucy5jaGFuZ2UpIHRoaXMub3B0aW9ucy5jaGFuZ2UodGhpcyk7Ci0gICAgCi0gICAgaWYodGhpcy5vcHRpb25zLnNjcm9sbCkgewotICAgICAgdGhpcy5zdG9wU2Nyb2xsaW5nKCk7Ci0gICAgICAKLSAgICAgIHZhciBwOwotICAgICAgaWYgKHRoaXMub3B0aW9ucy5zY3JvbGwgPT0gd2luZG93KSB7Ci0gICAgICAgIHdpdGgodGhpcy5fZ2V0V2luZG93U2Nyb2xsKHRoaXMub3B0aW9ucy5zY3JvbGwpKSB7IHAgPSBbIGxlZnQsIHRvcCwgbGVmdCt3aWR0aCwgdG9wK2hlaWdodCBdOyB9Ci0gICAgICB9IGVsc2UgewotICAgICAgICBwID0gUG9zaXRpb24ucGFnZSh0aGlzLm9wdGlvbnMuc2Nyb2xsKTsKLSAgICAgICAgcFswXSArPSB0aGlzLm9wdGlvbnMuc2Nyb2xsLnNjcm9sbExlZnQ7Ci0gICAgICAgIHBbMV0gKz0gdGhpcy5vcHRpb25zLnNjcm9sbC5zY3JvbGxUb3A7Ci0gICAgICAgIAotICAgICAgICBwWzBdICs9ICh3aW5kb3cucGFnZVhPZmZzZXQgfHwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbExlZnQgfHwgZG9jdW1lbnQuYm9keS5zY3JvbGxMZWZ0IHx8IDApOwotICAgICAgICBwWzFdICs9ICh3aW5kb3cucGFnZVlPZmZzZXQgfHwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcCB8fCBkb2N1bWVudC5ib2R5LnNjcm9sbFRvcCB8fCAwKTsKLSAgICAgICAgCi0gICAgICAgIHAucHVzaChwWzBdK3RoaXMub3B0aW9ucy5zY3JvbGwub2Zmc2V0V2lkdGgpOwotICAgICAgICBwLnB1c2gocFsxXSt0aGlzLm9wdGlvbnMuc2Nyb2xsLm9mZnNldEhlaWdodCk7Ci0gICAgICB9Ci0gICAgICB2YXIgc3BlZWQgPSBbMCwwXTsKLSAgICAgIGlmKHBvaW50ZXJbMF0gPCAocFswXSt0aGlzLm9wdGlvbnMuc2Nyb2xsU2Vuc2l0aXZpdHkpKSBzcGVlZFswXSA9IHBvaW50ZXJbMF0tKHBbMF0rdGhpcy5vcHRpb25zLnNjcm9sbFNlbnNpdGl2aXR5KTsKLSAgICAgIGlmKHBvaW50ZXJbMV0gPCAocFsxXSt0aGlzLm9wdGlvbnMuc2Nyb2xsU2Vuc2l0aXZpdHkpKSBzcGVlZFsxXSA9IHBvaW50ZXJbMV0tKHBbMV0rdGhpcy5vcHRpb25zLnNjcm9sbFNlbnNpdGl2aXR5KTsKLSAgICAgIGlmKHBvaW50ZXJbMF0gPiAocFsyXS10aGlzLm9wdGlvbnMuc2Nyb2xsU2Vuc2l0aXZpdHkpKSBzcGVlZFswXSA9IHBvaW50ZXJbMF0tKHBbMl0tdGhpcy5vcHRpb25zLnNjcm9sbFNlbnNpdGl2aXR5KTsKLSAgICAgIGlmKHBvaW50ZXJbMV0gPiAocFszXS10aGlzLm9wdGlvbnMuc2Nyb2xsU2Vuc2l0aXZpdHkpKSBzcGVlZFsxXSA9IHBvaW50ZXJbMV0tKHBbM10tdGhpcy5vcHRpb25zLnNjcm9sbFNlbnNpdGl2aXR5KTsKLSAgICAgIHRoaXMuc3RhcnRTY3JvbGxpbmcoc3BlZWQpOwotICAgIH0KLSAgICAKLSAgICAvLyBmaXggQXBwbGVXZWJLaXQgcmVuZGVyaW5nCi0gICAgaWYobmF2aWdhdG9yLmFwcFZlcnNpb24uaW5kZXhPZignQXBwbGVXZWJLaXQnKT4wKSB3aW5kb3cuc2Nyb2xsQnkoMCwwKTsKLSAgICAKLSAgICBFdmVudC5zdG9wKGV2ZW50KTsKLSAgfSwKLSAgCi0gIGZpbmlzaERyYWc6IGZ1bmN0aW9uKGV2ZW50LCBzdWNjZXNzKSB7Ci0gICAgdGhpcy5kcmFnZ2luZyA9IGZhbHNlOwotCi0gICAgaWYodGhpcy5vcHRpb25zLmdob3N0aW5nKSB7Ci0gICAgICBQb3NpdGlvbi5yZWxhdGl2aXplKHRoaXMuZWxlbWVudCk7Ci0gICAgICBFbGVtZW50LnJlbW92ZSh0aGlzLl9jbG9uZSk7Ci0gICAgICB0aGlzLl9jbG9uZSA9IG51bGw7Ci0gICAgfQotCi0gICAgaWYoc3VjY2VzcykgRHJvcHBhYmxlcy5maXJlKGV2ZW50LCB0aGlzLmVsZW1lbnQpOwotICAgIERyYWdnYWJsZXMubm90aWZ5KCdvbkVuZCcsIHRoaXMsIGV2ZW50KTsKLQotICAgIHZhciByZXZlcnQgPSB0aGlzLm9wdGlvbnMucmV2ZXJ0OwotICAgIGlmKHJldmVydCAmJiB0eXBlb2YgcmV2ZXJ0ID09ICdmdW5jdGlvbicpIHJldmVydCA9IHJldmVydCh0aGlzLmVsZW1lbnQpOwotICAgIAotICAgIHZhciBkID0gdGhpcy5jdXJyZW50RGVsdGEoKTsKLSAgICBpZihyZXZlcnQgJiYgdGhpcy5vcHRpb25zLnJldmVydGVmZmVjdCkgewotICAgICAgdGhpcy5vcHRpb25zLnJldmVydGVmZmVjdCh0aGlzLmVsZW1lbnQsIAotICAgICAgICBkWzFdLXRoaXMuZGVsdGFbMV0sIGRbMF0tdGhpcy5kZWx0YVswXSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHRoaXMuZGVsdGEgPSBkOwotICAgIH0KLQotICAgIGlmKHRoaXMub3B0aW9ucy56aW5kZXgpCi0gICAgICB0aGlzLmVsZW1lbnQuc3R5bGUuekluZGV4ID0gdGhpcy5vcmlnaW5hbFo7Ci0KLSAgICBpZih0aGlzLm9wdGlvbnMuZW5kZWZmZWN0KSAKLSAgICAgIHRoaXMub3B0aW9ucy5lbmRlZmZlY3QodGhpcy5lbGVtZW50KTsKLSAgICAgIAotICAgIERyYWdnYWJsZXMuZGVhY3RpdmF0ZSh0aGlzKTsKLSAgICBEcm9wcGFibGVzLnJlc2V0KCk7Ci0gIH0sCi0gIAotICBrZXlQcmVzczogZnVuY3Rpb24oZXZlbnQpIHsKLSAgICBpZihldmVudC5rZXlDb2RlIT1FdmVudC5LRVlfRVNDKSByZXR1cm47Ci0gICAgdGhpcy5maW5pc2hEcmFnKGV2ZW50LCBmYWxzZSk7Ci0gICAgRXZlbnQuc3RvcChldmVudCk7Ci0gIH0sCi0gIAotICBlbmREcmFnOiBmdW5jdGlvbihldmVudCkgewotICAgIGlmKCF0aGlzLmRyYWdnaW5nKSByZXR1cm47Ci0gICAgdGhpcy5zdG9wU2Nyb2xsaW5nKCk7Ci0gICAgdGhpcy5maW5pc2hEcmFnKGV2ZW50LCB0cnVlKTsKLSAgICBFdmVudC5zdG9wKGV2ZW50KTsKLSAgfSwKLSAgCi0gIGRyYXc6IGZ1bmN0aW9uKHBvaW50KSB7Ci0gICAgdmFyIHBvcyA9IFBvc2l0aW9uLmN1bXVsYXRpdmVPZmZzZXQodGhpcy5lbGVtZW50KTsKLSAgICBpZih0aGlzLm9wdGlvbnMuZ2hvc3RpbmcpIHsKLSAgICAgIHZhciByICAgPSBQb3NpdGlvbi5yZWFsT2Zmc2V0KHRoaXMuZWxlbWVudCk7Ci0gICAgICB3aW5kb3cuc3RhdHVzID0gci5pbnNwZWN0KCk7Ci0gICAgICBwb3NbMF0gKz0gclswXSAtIFBvc2l0aW9uLmRlbHRhWDsgcG9zWzFdICs9IHJbMV0gLSBQb3NpdGlvbi5kZWx0YVk7Ci0gICAgfQotICAgIAotICAgIHZhciBkID0gdGhpcy5jdXJyZW50RGVsdGEoKTsKLSAgICBwb3NbMF0gLT0gZFswXTsgcG9zWzFdIC09IGRbMV07Ci0gICAgCi0gICAgaWYodGhpcy5vcHRpb25zLnNjcm9sbCAmJiAodGhpcy5vcHRpb25zLnNjcm9sbCAhPSB3aW5kb3cgJiYgdGhpcy5faXNTY3JvbGxDaGlsZCkpIHsKLSAgICAgIHBvc1swXSAtPSB0aGlzLm9wdGlvbnMuc2Nyb2xsLnNjcm9sbExlZnQtdGhpcy5vcmlnaW5hbFNjcm9sbExlZnQ7Ci0gICAgICBwb3NbMV0gLT0gdGhpcy5vcHRpb25zLnNjcm9sbC5zY3JvbGxUb3AtdGhpcy5vcmlnaW5hbFNjcm9sbFRvcDsKLSAgICB9Ci0gICAgCi0gICAgdmFyIHAgPSBbMCwxXS5tYXAoZnVuY3Rpb24oaSl7IAotICAgICAgcmV0dXJuIChwb2ludFtpXS1wb3NbaV0tdGhpcy5vZmZzZXRbaV0pIAotICAgIH0uYmluZCh0aGlzKSk7Ci0gICAgCi0gICAgaWYodGhpcy5vcHRpb25zLnNuYXApIHsKLSAgICAgIGlmKHR5cGVvZiB0aGlzLm9wdGlvbnMuc25hcCA9PSAnZnVuY3Rpb24nKSB7Ci0gICAgICAgIHAgPSB0aGlzLm9wdGlvbnMuc25hcChwWzBdLHBbMV0sdGhpcyk7Ci0gICAgICB9IGVsc2UgewotICAgICAgaWYodGhpcy5vcHRpb25zLnNuYXAgaW5zdGFuY2VvZiBBcnJheSkgewotICAgICAgICBwID0gcC5tYXAoIGZ1bmN0aW9uKHYsIGkpIHsKLSAgICAgICAgICByZXR1cm4gTWF0aC5yb3VuZCh2L3RoaXMub3B0aW9ucy5zbmFwW2ldKSp0aGlzLm9wdGlvbnMuc25hcFtpXSB9LmJpbmQodGhpcykpCi0gICAgICB9IGVsc2UgewotICAgICAgICBwID0gcC5tYXAoIGZ1bmN0aW9uKHYpIHsKLSAgICAgICAgICByZXR1cm4gTWF0aC5yb3VuZCh2L3RoaXMub3B0aW9ucy5zbmFwKSp0aGlzLm9wdGlvbnMuc25hcCB9LmJpbmQodGhpcykpCi0gICAgICB9Ci0gICAgfX0KLSAgICAKLSAgICB2YXIgc3R5bGUgPSB0aGlzLmVsZW1lbnQuc3R5bGU7Ci0gICAgaWYoKCF0aGlzLm9wdGlvbnMuY29uc3RyYWludCkgfHwgKHRoaXMub3B0aW9ucy5jb25zdHJhaW50PT0naG9yaXpvbnRhbCcpKQotICAgICAgc3R5bGUubGVmdCA9IHBbMF0gKyAicHgiOwotICAgIGlmKCghdGhpcy5vcHRpb25zLmNvbnN0cmFpbnQpIHx8ICh0aGlzLm9wdGlvbnMuY29uc3RyYWludD09J3ZlcnRpY2FsJykpCi0gICAgICBzdHlsZS50b3AgID0gcFsxXSArICJweCI7Ci0gICAgCi0gICAgaWYoc3R5bGUudmlzaWJpbGl0eT09ImhpZGRlbiIpIHN0eWxlLnZpc2liaWxpdHkgPSAiIjsgLy8gZml4IGdlY2tvIHJlbmRlcmluZwotICB9LAotICAKLSAgc3RvcFNjcm9sbGluZzogZnVuY3Rpb24oKSB7Ci0gICAgaWYodGhpcy5zY3JvbGxJbnRlcnZhbCkgewotICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLnNjcm9sbEludGVydmFsKTsKLSAgICAgIHRoaXMuc2Nyb2xsSW50ZXJ2YWwgPSBudWxsOwotICAgICAgRHJhZ2dhYmxlcy5fbGFzdFNjcm9sbFBvaW50ZXIgPSBudWxsOwotICAgIH0KLSAgfSwKLSAgCi0gIHN0YXJ0U2Nyb2xsaW5nOiBmdW5jdGlvbihzcGVlZCkgewotICAgIGlmKCEoc3BlZWRbMF0gfHwgc3BlZWRbMV0pKSByZXR1cm47Ci0gICAgdGhpcy5zY3JvbGxTcGVlZCA9IFtzcGVlZFswXSp0aGlzLm9wdGlvbnMuc2Nyb2xsU3BlZWQsc3BlZWRbMV0qdGhpcy5vcHRpb25zLnNjcm9sbFNwZWVkXTsKLSAgICB0aGlzLmxhc3RTY3JvbGxlZCA9IG5ldyBEYXRlKCk7Ci0gICAgdGhpcy5zY3JvbGxJbnRlcnZhbCA9IHNldEludGVydmFsKHRoaXMuc2Nyb2xsLmJpbmQodGhpcyksIDEwKTsKLSAgfSwKLSAgCi0gIHNjcm9sbDogZnVuY3Rpb24oKSB7Ci0gICAgdmFyIGN1cnJlbnQgPSBuZXcgRGF0ZSgpOwotICAgIHZhciBkZWx0YSA9IGN1cnJlbnQgLSB0aGlzLmxhc3RTY3JvbGxlZDsKLSAgICB0aGlzLmxhc3RTY3JvbGxlZCA9IGN1cnJlbnQ7Ci0gICAgaWYodGhpcy5vcHRpb25zLnNjcm9sbCA9PSB3aW5kb3cpIHsKLSAgICAgIHdpdGggKHRoaXMuX2dldFdpbmRvd1Njcm9sbCh0aGlzLm9wdGlvbnMuc2Nyb2xsKSkgewotICAgICAgICBpZiAodGhpcy5zY3JvbGxTcGVlZFswXSB8fCB0aGlzLnNjcm9sbFNwZWVkWzFdKSB7Ci0gICAgICAgICAgdmFyIGQgPSBkZWx0YSAvIDEwMDA7Ci0gICAgICAgICAgdGhpcy5vcHRpb25zLnNjcm9sbC5zY3JvbGxUbyggbGVmdCArIGQqdGhpcy5zY3JvbGxTcGVlZFswXSwgdG9wICsgZCp0aGlzLnNjcm9sbFNwZWVkWzFdICk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgdGhpcy5vcHRpb25zLnNjcm9sbC5zY3JvbGxMZWZ0ICs9IHRoaXMuc2Nyb2xsU3BlZWRbMF0gKiBkZWx0YSAvIDEwMDA7Ci0gICAgICB0aGlzLm9wdGlvbnMuc2Nyb2xsLnNjcm9sbFRvcCAgKz0gdGhpcy5zY3JvbGxTcGVlZFsxXSAqIGRlbHRhIC8gMTAwMDsKLSAgICB9Ci0gICAgCi0gICAgUG9zaXRpb24ucHJlcGFyZSgpOwotICAgIERyb3BwYWJsZXMuc2hvdyhEcmFnZ2FibGVzLl9sYXN0UG9pbnRlciwgdGhpcy5lbGVtZW50KTsKLSAgICBEcmFnZ2FibGVzLm5vdGlmeSgnb25EcmFnJywgdGhpcyk7Ci0gICAgaWYgKHRoaXMuX2lzU2Nyb2xsQ2hpbGQpIHsKLSAgICAgIERyYWdnYWJsZXMuX2xhc3RTY3JvbGxQb2ludGVyID0gRHJhZ2dhYmxlcy5fbGFzdFNjcm9sbFBvaW50ZXIgfHwgJEEoRHJhZ2dhYmxlcy5fbGFzdFBvaW50ZXIpOwotICAgICAgRHJhZ2dhYmxlcy5fbGFzdFNjcm9sbFBvaW50ZXJbMF0gKz0gdGhpcy5zY3JvbGxTcGVlZFswXSAqIGRlbHRhIC8gMTAwMDsKLSAgICAgIERyYWdnYWJsZXMuX2xhc3RTY3JvbGxQb2ludGVyWzFdICs9IHRoaXMuc2Nyb2xsU3BlZWRbMV0gKiBkZWx0YSAvIDEwMDA7Ci0gICAgICBpZiAoRHJhZ2dhYmxlcy5fbGFzdFNjcm9sbFBvaW50ZXJbMF0gPCAwKQotICAgICAgICBEcmFnZ2FibGVzLl9sYXN0U2Nyb2xsUG9pbnRlclswXSA9IDA7Ci0gICAgICBpZiAoRHJhZ2dhYmxlcy5fbGFzdFNjcm9sbFBvaW50ZXJbMV0gPCAwKQotICAgICAgICBEcmFnZ2FibGVzLl9sYXN0U2Nyb2xsUG9pbnRlclsxXSA9IDA7Ci0gICAgICB0aGlzLmRyYXcoRHJhZ2dhYmxlcy5fbGFzdFNjcm9sbFBvaW50ZXIpOwotICAgIH0KLSAgICAKLSAgICBpZih0aGlzLm9wdGlvbnMuY2hhbmdlKSB0aGlzLm9wdGlvbnMuY2hhbmdlKHRoaXMpOwotICB9LAotICAKLSAgX2dldFdpbmRvd1Njcm9sbDogZnVuY3Rpb24odykgewotICAgIHZhciBULCBMLCBXLCBIOwotICAgIHdpdGggKHcuZG9jdW1lbnQpIHsKLSAgICAgIGlmICh3LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudCAmJiBkb2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9wKSB7Ci0gICAgICAgIFQgPSBkb2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9wOwotICAgICAgICBMID0gZG9jdW1lbnRFbGVtZW50LnNjcm9sbExlZnQ7Ci0gICAgICB9IGVsc2UgaWYgKHcuZG9jdW1lbnQuYm9keSkgewotICAgICAgICBUID0gYm9keS5zY3JvbGxUb3A7Ci0gICAgICAgIEwgPSBib2R5LnNjcm9sbExlZnQ7Ci0gICAgICB9Ci0gICAgICBpZiAody5pbm5lcldpZHRoKSB7Ci0gICAgICAgIFcgPSB3LmlubmVyV2lkdGg7Ci0gICAgICAgIEggPSB3LmlubmVySGVpZ2h0OwotICAgICAgfSBlbHNlIGlmICh3LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudCAmJiBkb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpIHsKLSAgICAgICAgVyA9IGRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aDsKLSAgICAgICAgSCA9IGRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQ7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBXID0gYm9keS5vZmZzZXRXaWR0aDsKLSAgICAgICAgSCA9IGJvZHkub2Zmc2V0SGVpZ2h0Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiB7IHRvcDogVCwgbGVmdDogTCwgd2lkdGg6IFcsIGhlaWdodDogSCB9OwotICB9Ci19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi12YXIgU29ydGFibGVPYnNlcnZlciA9IENsYXNzLmNyZWF0ZSgpOwotU29ydGFibGVPYnNlcnZlci5wcm90b3R5cGUgPSB7Ci0gIGluaXRpYWxpemU6IGZ1bmN0aW9uKGVsZW1lbnQsIG9ic2VydmVyKSB7Ci0gICAgdGhpcy5lbGVtZW50ICAgPSAkKGVsZW1lbnQpOwotICAgIHRoaXMub2JzZXJ2ZXIgID0gb2JzZXJ2ZXI7Ci0gICAgdGhpcy5sYXN0VmFsdWUgPSBTb3J0YWJsZS5zZXJpYWxpemUodGhpcy5lbGVtZW50KTsKLSAgfSwKLSAgCi0gIG9uU3RhcnQ6IGZ1bmN0aW9uKCkgewotICAgIHRoaXMubGFzdFZhbHVlID0gU29ydGFibGUuc2VyaWFsaXplKHRoaXMuZWxlbWVudCk7Ci0gIH0sCi0gIAotICBvbkVuZDogZnVuY3Rpb24oKSB7Ci0gICAgU29ydGFibGUudW5tYXJrKCk7Ci0gICAgaWYodGhpcy5sYXN0VmFsdWUgIT0gU29ydGFibGUuc2VyaWFsaXplKHRoaXMuZWxlbWVudCkpCi0gICAgICB0aGlzLm9ic2VydmVyKHRoaXMuZWxlbWVudCkKLSAgfQotfQotCi12YXIgU29ydGFibGUgPSB7Ci0gIFNFUklBTElaRV9SVUxFOiAvXlteX1wtXSg/OltBLVphLXowLTlcLVxfXSopW19dKC4qKSQvLAotICAKLSAgc29ydGFibGVzOiB7fSwKLSAgCi0gIF9maW5kUm9vdEVsZW1lbnQ6IGZ1bmN0aW9uKGVsZW1lbnQpIHsKLSAgICB3aGlsZSAoZWxlbWVudC50YWdOYW1lICE9ICJCT0RZIikgeyAgCi0gICAgICBpZihlbGVtZW50LmlkICYmIFNvcnRhYmxlLnNvcnRhYmxlc1tlbGVtZW50LmlkXSkgcmV0dXJuIGVsZW1lbnQ7Ci0gICAgICBlbGVtZW50ID0gZWxlbWVudC5wYXJlbnROb2RlOwotICAgIH0KLSAgfSwKLQotICBvcHRpb25zOiBmdW5jdGlvbihlbGVtZW50KSB7Ci0gICAgZWxlbWVudCA9IFNvcnRhYmxlLl9maW5kUm9vdEVsZW1lbnQoJChlbGVtZW50KSk7Ci0gICAgaWYoIWVsZW1lbnQpIHJldHVybjsKLSAgICByZXR1cm4gU29ydGFibGUuc29ydGFibGVzW2VsZW1lbnQuaWRdOwotICB9LAotICAKLSAgZGVzdHJveTogZnVuY3Rpb24oZWxlbWVudCl7Ci0gICAgdmFyIHMgPSBTb3J0YWJsZS5vcHRpb25zKGVsZW1lbnQpOwotICAgIAotICAgIGlmKHMpIHsKLSAgICAgIERyYWdnYWJsZXMucmVtb3ZlT2JzZXJ2ZXIocy5lbGVtZW50KTsKLSAgICAgIHMuZHJvcHBhYmxlcy5lYWNoKGZ1bmN0aW9uKGQpeyBEcm9wcGFibGVzLnJlbW92ZShkKSB9KTsKLSAgICAgIHMuZHJhZ2dhYmxlcy5pbnZva2UoJ2Rlc3Ryb3knKTsKLSAgICAgIAotICAgICAgZGVsZXRlIFNvcnRhYmxlLnNvcnRhYmxlc1tzLmVsZW1lbnQuaWRdOwotICAgIH0KLSAgfSwKLQotICBjcmVhdGU6IGZ1bmN0aW9uKGVsZW1lbnQpIHsKLSAgICBlbGVtZW50ID0gJChlbGVtZW50KTsKLSAgICB2YXIgb3B0aW9ucyA9IE9iamVjdC5leHRlbmQoeyAKLSAgICAgIGVsZW1lbnQ6ICAgICBlbGVtZW50LAotICAgICAgdGFnOiAgICAgICAgICdsaScsICAgICAgIC8vIGFzc3VtZXMgbGkgY2hpbGRyZW4sIG92ZXJyaWRlIHdpdGggdGFnOiAndGFnbmFtZScKLSAgICAgIGRyb3BPbkVtcHR5OiBmYWxzZSwKLSAgICAgIHRyZWU6ICAgICAgICBmYWxzZSwKLSAgICAgIHRyZWVUYWc6ICAgICAndWwnLAotICAgICAgb3ZlcmxhcDogICAgICd2ZXJ0aWNhbCcsIC8vIG9uZSBvZiAndmVydGljYWwnLCAnaG9yaXpvbnRhbCcKLSAgICAgIGNvbnN0cmFpbnQ6ICAndmVydGljYWwnLCAvLyBvbmUgb2YgJ3ZlcnRpY2FsJywgJ2hvcml6b250YWwnLCBmYWxzZQotICAgICAgY29udGFpbm1lbnQ6IGVsZW1lbnQsICAgIC8vIGFsc28gdGFrZXMgYXJyYXkgb2YgZWxlbWVudHMgKG9yIGlkJ3MpOyBvciBmYWxzZQotICAgICAgaGFuZGxlOiAgICAgIGZhbHNlLCAgICAgIC8vIG9yIGEgQ1NTIGNsYXNzCi0gICAgICBvbmx5OiAgICAgICAgZmFsc2UsCi0gICAgICBkZWxheTogICAgICAgMCwKLSAgICAgIGhvdmVyY2xhc3M6ICBudWxsLAotICAgICAgZ2hvc3Rpbmc6ICAgIGZhbHNlLAotICAgICAgc2Nyb2xsOiAgICAgIGZhbHNlLAotICAgICAgc2Nyb2xsU2Vuc2l0aXZpdHk6IDIwLAotICAgICAgc2Nyb2xsU3BlZWQ6IDE1LAotICAgICAgZm9ybWF0OiAgICAgIHRoaXMuU0VSSUFMSVpFX1JVTEUsCi0gICAgICBvbkNoYW5nZTogICAgUHJvdG90eXBlLmVtcHR5RnVuY3Rpb24sCi0gICAgICBvblVwZGF0ZTogICAgUHJvdG90eXBlLmVtcHR5RnVuY3Rpb24KLSAgICB9LCBhcmd1bWVudHNbMV0gfHwge30pOwotCi0gICAgLy8gY2xlYXIgYW55IG9sZCBzb3J0YWJsZSB3aXRoIHNhbWUgZWxlbWVudAotICAgIHRoaXMuZGVzdHJveShlbGVtZW50KTsKLQotICAgIC8vIGJ1aWxkIG9wdGlvbnMgZm9yIHRoZSBkcmFnZ2FibGVzCi0gICAgdmFyIG9wdGlvbnNfZm9yX2RyYWdnYWJsZSA9IHsKLSAgICAgIHJldmVydDogICAgICB0cnVlLAotICAgICAgc2Nyb2xsOiAgICAgIG9wdGlvbnMuc2Nyb2xsLAotICAgICAgc2Nyb2xsU3BlZWQ6IG9wdGlvbnMuc2Nyb2xsU3BlZWQsCi0gICAgICBzY3JvbGxTZW5zaXRpdml0eTogb3B0aW9ucy5zY3JvbGxTZW5zaXRpdml0eSwKLSAgICAgIGRlbGF5OiAgICAgICBvcHRpb25zLmRlbGF5LAotICAgICAgZ2hvc3Rpbmc6ICAgIG9wdGlvbnMuZ2hvc3RpbmcsCi0gICAgICBjb25zdHJhaW50OiAgb3B0aW9ucy5jb25zdHJhaW50LAotICAgICAgaGFuZGxlOiAgICAgIG9wdGlvbnMuaGFuZGxlIH07Ci0KLSAgICBpZihvcHRpb25zLnN0YXJ0ZWZmZWN0KQotICAgICAgb3B0aW9uc19mb3JfZHJhZ2dhYmxlLnN0YXJ0ZWZmZWN0ID0gb3B0aW9ucy5zdGFydGVmZmVjdDsKLQotICAgIGlmKG9wdGlvbnMucmV2ZXJ0ZWZmZWN0KQotICAgICAgb3B0aW9uc19mb3JfZHJhZ2dhYmxlLnJldmVydGVmZmVjdCA9IG9wdGlvbnMucmV2ZXJ0ZWZmZWN0OwotICAgIGVsc2UKLSAgICAgIGlmKG9wdGlvbnMuZ2hvc3RpbmcpIG9wdGlvbnNfZm9yX2RyYWdnYWJsZS5yZXZlcnRlZmZlY3QgPSBmdW5jdGlvbihlbGVtZW50KSB7Ci0gICAgICAgIGVsZW1lbnQuc3R5bGUudG9wICA9IDA7Ci0gICAgICAgIGVsZW1lbnQuc3R5bGUubGVmdCA9IDA7Ci0gICAgICB9OwotCi0gICAgaWYob3B0aW9ucy5lbmRlZmZlY3QpCi0gICAgICBvcHRpb25zX2Zvcl9kcmFnZ2FibGUuZW5kZWZmZWN0ID0gb3B0aW9ucy5lbmRlZmZlY3Q7Ci0KLSAgICBpZihvcHRpb25zLnppbmRleCkKLSAgICAgIG9wdGlvbnNfZm9yX2RyYWdnYWJsZS56aW5kZXggPSBvcHRpb25zLnppbmRleDsKLQotICAgIC8vIGJ1aWxkIG9wdGlvbnMgZm9yIHRoZSBkcm9wcGFibGVzICAKLSAgICB2YXIgb3B0aW9uc19mb3JfZHJvcHBhYmxlID0gewotICAgICAgb3ZlcmxhcDogICAgIG9wdGlvbnMub3ZlcmxhcCwKLSAgICAgIGNvbnRhaW5tZW50OiBvcHRpb25zLmNvbnRhaW5tZW50LAotICAgICAgdHJlZTogICAgICAgIG9wdGlvbnMudHJlZSwKLSAgICAgIGhvdmVyY2xhc3M6ICBvcHRpb25zLmhvdmVyY2xhc3MsCi0gICAgICBvbkhvdmVyOiAgICAgU29ydGFibGUub25Ib3ZlcgotICAgICAgLy9ncmVlZHk6ICAgICAgIW9wdGlvbnMuZHJvcE9uRW1wdHkKLSAgICB9Ci0gICAgCi0gICAgdmFyIG9wdGlvbnNfZm9yX3RyZWUgPSB7Ci0gICAgICBvbkhvdmVyOiAgICAgIFNvcnRhYmxlLm9uRW1wdHlIb3ZlciwKLSAgICAgIG92ZXJsYXA6ICAgICAgb3B0aW9ucy5vdmVybGFwLAotICAgICAgY29udGFpbm1lbnQ6ICBvcHRpb25zLmNvbnRhaW5tZW50LAotICAgICAgaG92ZXJjbGFzczogICBvcHRpb25zLmhvdmVyY2xhc3MKLSAgICB9Ci0KLSAgICAvLyBmaXggZm9yIGdlY2tvIGVuZ2luZQotICAgIEVsZW1lbnQuY2xlYW5XaGl0ZXNwYWNlKGVsZW1lbnQpOyAKLQotICAgIG9wdGlvbnMuZHJhZ2dhYmxlcyA9IFtdOwotICAgIG9wdGlvbnMuZHJvcHBhYmxlcyA9IFtdOwotCi0gICAgLy8gZHJvcCBvbiBlbXB0eSBoYW5kbGluZwotICAgIGlmKG9wdGlvbnMuZHJvcE9uRW1wdHkgfHwgb3B0aW9ucy50cmVlKSB7Ci0gICAgICBEcm9wcGFibGVzLmFkZChlbGVtZW50LCBvcHRpb25zX2Zvcl90cmVlKTsKLSAgICAgIG9wdGlvbnMuZHJvcHBhYmxlcy5wdXNoKGVsZW1lbnQpOwotICAgIH0KLQotICAgICh0aGlzLmZpbmRFbGVtZW50cyhlbGVtZW50LCBvcHRpb25zKSB8fCBbXSkuZWFjaCggZnVuY3Rpb24oZSkgewotICAgICAgLy8gaGFuZGxlcyBhcmUgcGVyLWRyYWdnYWJsZQotICAgICAgdmFyIGhhbmRsZSA9IG9wdGlvbnMuaGFuZGxlID8gCi0gICAgICAgIEVsZW1lbnQuY2hpbGRyZW5XaXRoQ2xhc3NOYW1lKGUsIG9wdGlvbnMuaGFuZGxlKVswXSA6IGU7ICAgIAotICAgICAgb3B0aW9ucy5kcmFnZ2FibGVzLnB1c2goCi0gICAgICAgIG5ldyBEcmFnZ2FibGUoZSwgT2JqZWN0LmV4dGVuZChvcHRpb25zX2Zvcl9kcmFnZ2FibGUsIHsgaGFuZGxlOiBoYW5kbGUgfSkpKTsKLSAgICAgIERyb3BwYWJsZXMuYWRkKGUsIG9wdGlvbnNfZm9yX2Ryb3BwYWJsZSk7Ci0gICAgICBpZihvcHRpb25zLnRyZWUpIGUudHJlZU5vZGUgPSBlbGVtZW50OwotICAgICAgb3B0aW9ucy5kcm9wcGFibGVzLnB1c2goZSk7ICAgICAgCi0gICAgfSk7Ci0gICAgCi0gICAgaWYob3B0aW9ucy50cmVlKSB7Ci0gICAgICAoU29ydGFibGUuZmluZFRyZWVFbGVtZW50cyhlbGVtZW50LCBvcHRpb25zKSB8fCBbXSkuZWFjaCggZnVuY3Rpb24oZSkgewotICAgICAgICBEcm9wcGFibGVzLmFkZChlLCBvcHRpb25zX2Zvcl90cmVlKTsKLSAgICAgICAgZS50cmVlTm9kZSA9IGVsZW1lbnQ7Ci0gICAgICAgIG9wdGlvbnMuZHJvcHBhYmxlcy5wdXNoKGUpOwotICAgICAgfSk7Ci0gICAgfQotCi0gICAgLy8ga2VlcCByZWZlcmVuY2UKLSAgICB0aGlzLnNvcnRhYmxlc1tlbGVtZW50LmlkXSA9IG9wdGlvbnM7Ci0KLSAgICAvLyBmb3Igb251cGRhdGUKLSAgICBEcmFnZ2FibGVzLmFkZE9ic2VydmVyKG5ldyBTb3J0YWJsZU9ic2VydmVyKGVsZW1lbnQsIG9wdGlvbnMub25VcGRhdGUpKTsKLQotICB9LAotCi0gIC8vIHJldHVybiBhbGwgc3VpdGFibGUtZm9yLXNvcnRhYmxlIGVsZW1lbnRzIGluIGEgZ3VhcmFudGVlZCBvcmRlcgotICBmaW5kRWxlbWVudHM6IGZ1bmN0aW9uKGVsZW1lbnQsIG9wdGlvbnMpIHsKLSAgICByZXR1cm4gRWxlbWVudC5maW5kQ2hpbGRyZW4oCi0gICAgICBlbGVtZW50LCBvcHRpb25zLm9ubHksIG9wdGlvbnMudHJlZSA/IHRydWUgOiBmYWxzZSwgb3B0aW9ucy50YWcpOwotICB9LAotICAKLSAgZmluZFRyZWVFbGVtZW50czogZnVuY3Rpb24oZWxlbWVudCwgb3B0aW9ucykgewotICAgIHJldHVybiBFbGVtZW50LmZpbmRDaGlsZHJlbigKLSAgICAgIGVsZW1lbnQsIG9wdGlvbnMub25seSwgb3B0aW9ucy50cmVlID8gdHJ1ZSA6IGZhbHNlLCBvcHRpb25zLnRyZWVUYWcpOwotICB9LAotCi0gIG9uSG92ZXI6IGZ1bmN0aW9uKGVsZW1lbnQsIGRyb3Bvbiwgb3ZlcmxhcCkgewotICAgIGlmKEVsZW1lbnQuaXNQYXJlbnQoZHJvcG9uLCBlbGVtZW50KSkgcmV0dXJuOwotCi0gICAgaWYob3ZlcmxhcCA+IC4zMyAmJiBvdmVybGFwIDwgLjY2ICYmIFNvcnRhYmxlLm9wdGlvbnMoZHJvcG9uKS50cmVlKSB7Ci0gICAgICByZXR1cm47Ci0gICAgfSBlbHNlIGlmKG92ZXJsYXA+MC41KSB7Ci0gICAgICBTb3J0YWJsZS5tYXJrKGRyb3BvbiwgJ2JlZm9yZScpOwotICAgICAgaWYoZHJvcG9uLnByZXZpb3VzU2libGluZyAhPSBlbGVtZW50KSB7Ci0gICAgICAgIHZhciBvbGRQYXJlbnROb2RlID0gZWxlbWVudC5wYXJlbnROb2RlOwotICAgICAgICBlbGVtZW50LnN0eWxlLnZpc2liaWxpdHkgPSAiaGlkZGVuIjsgLy8gZml4IGdlY2tvIHJlbmRlcmluZwotICAgICAgICBkcm9wb24ucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZWxlbWVudCwgZHJvcG9uKTsKLSAgICAgICAgaWYoZHJvcG9uLnBhcmVudE5vZGUhPW9sZFBhcmVudE5vZGUpIAotICAgICAgICAgIFNvcnRhYmxlLm9wdGlvbnMob2xkUGFyZW50Tm9kZSkub25DaGFuZ2UoZWxlbWVudCk7Ci0gICAgICAgIFNvcnRhYmxlLm9wdGlvbnMoZHJvcG9uLnBhcmVudE5vZGUpLm9uQ2hhbmdlKGVsZW1lbnQpOwotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICBTb3J0YWJsZS5tYXJrKGRyb3BvbiwgJ2FmdGVyJyk7Ci0gICAgICB2YXIgbmV4dEVsZW1lbnQgPSBkcm9wb24ubmV4dFNpYmxpbmcgfHwgbnVsbDsKLSAgICAgIGlmKG5leHRFbGVtZW50ICE9IGVsZW1lbnQpIHsKLSAgICAgICAgdmFyIG9sZFBhcmVudE5vZGUgPSBlbGVtZW50LnBhcmVudE5vZGU7Ci0gICAgICAgIGVsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9ICJoaWRkZW4iOyAvLyBmaXggZ2Vja28gcmVuZGVyaW5nCi0gICAgICAgIGRyb3Bvbi5wYXJlbnROb2RlLmluc2VydEJlZm9yZShlbGVtZW50LCBuZXh0RWxlbWVudCk7Ci0gICAgICAgIGlmKGRyb3Bvbi5wYXJlbnROb2RlIT1vbGRQYXJlbnROb2RlKSAKLSAgICAgICAgICBTb3J0YWJsZS5vcHRpb25zKG9sZFBhcmVudE5vZGUpLm9uQ2hhbmdlKGVsZW1lbnQpOwotICAgICAgICBTb3J0YWJsZS5vcHRpb25zKGRyb3Bvbi5wYXJlbnROb2RlKS5vbkNoYW5nZShlbGVtZW50KTsKLSAgICAgIH0KLSAgICB9Ci0gIH0sCi0gIAotICBvbkVtcHR5SG92ZXI6IGZ1bmN0aW9uKGVsZW1lbnQsIGRyb3Bvbiwgb3ZlcmxhcCkgewotICAgIHZhciBvbGRQYXJlbnROb2RlID0gZWxlbWVudC5wYXJlbnROb2RlOwotICAgIHZhciBkcm9wb25PcHRpb25zID0gU29ydGFibGUub3B0aW9ucyhkcm9wb24pOwotICAgICAgICAKLSAgICBpZighRWxlbWVudC5pc1BhcmVudChkcm9wb24sIGVsZW1lbnQpKSB7Ci0gICAgICB2YXIgaW5kZXg7Ci0gICAgICAKLSAgICAgIHZhciBjaGlsZHJlbiA9IFNvcnRhYmxlLmZpbmRFbGVtZW50cyhkcm9wb24sIHt0YWc6IGRyb3Bvbk9wdGlvbnMudGFnLCBvbmx5OiBkcm9wb25PcHRpb25zLm9ubHl9KTsKLSAgICAgIHZhciBjaGlsZCA9IG51bGw7Ci0gICAgICAgICAgICAKLSAgICAgIGlmKGNoaWxkcmVuKSB7Ci0gICAgICAgIHZhciBvZmZzZXQgPSBFbGVtZW50Lm9mZnNldFNpemUoZHJvcG9uLCBkcm9wb25PcHRpb25zLm92ZXJsYXApICogKDEuMCAtIG92ZXJsYXApOwotICAgICAgICAKLSAgICAgICAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgY2hpbGRyZW4ubGVuZ3RoOyBpbmRleCArPSAxKSB7Ci0gICAgICAgICAgaWYgKG9mZnNldCAtIEVsZW1lbnQub2Zmc2V0U2l6ZSAoY2hpbGRyZW5baW5kZXhdLCBkcm9wb25PcHRpb25zLm92ZXJsYXApID49IDApIHsKLSAgICAgICAgICAgIG9mZnNldCAtPSBFbGVtZW50Lm9mZnNldFNpemUgKGNoaWxkcmVuW2luZGV4XSwgZHJvcG9uT3B0aW9ucy5vdmVybGFwKTsKLSAgICAgICAgICB9IGVsc2UgaWYgKG9mZnNldCAtIChFbGVtZW50Lm9mZnNldFNpemUgKGNoaWxkcmVuW2luZGV4XSwgZHJvcG9uT3B0aW9ucy5vdmVybGFwKSAvIDIpID49IDApIHsKLSAgICAgICAgICAgIGNoaWxkID0gaW5kZXggKyAxIDwgY2hpbGRyZW4ubGVuZ3RoID8gY2hpbGRyZW5baW5kZXggKyAxXSA6IG51bGw7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgY2hpbGQgPSBjaGlsZHJlbltpbmRleF07Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIAotICAgICAgZHJvcG9uLmluc2VydEJlZm9yZShlbGVtZW50LCBjaGlsZCk7Ci0gICAgICAKLSAgICAgIFNvcnRhYmxlLm9wdGlvbnMob2xkUGFyZW50Tm9kZSkub25DaGFuZ2UoZWxlbWVudCk7Ci0gICAgICBkcm9wb25PcHRpb25zLm9uQ2hhbmdlKGVsZW1lbnQpOwotICAgIH0KLSAgfSwKLQotICB1bm1hcms6IGZ1bmN0aW9uKCkgewotICAgIGlmKFNvcnRhYmxlLl9tYXJrZXIpIEVsZW1lbnQuaGlkZShTb3J0YWJsZS5fbWFya2VyKTsKLSAgfSwKLQotICBtYXJrOiBmdW5jdGlvbihkcm9wb24sIHBvc2l0aW9uKSB7Ci0gICAgLy8gbWFyayBvbiBnaG9zdGluZyBvbmx5Ci0gICAgdmFyIHNvcnRhYmxlID0gU29ydGFibGUub3B0aW9ucyhkcm9wb24ucGFyZW50Tm9kZSk7Ci0gICAgaWYoc29ydGFibGUgJiYgIXNvcnRhYmxlLmdob3N0aW5nKSByZXR1cm47IAotCi0gICAgaWYoIVNvcnRhYmxlLl9tYXJrZXIpIHsKLSAgICAgIFNvcnRhYmxlLl9tYXJrZXIgPSAkKCdkcm9wbWFya2VyJykgfHwgZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnRElWJyk7Ci0gICAgICBFbGVtZW50LmhpZGUoU29ydGFibGUuX21hcmtlcik7Ci0gICAgICBFbGVtZW50LmFkZENsYXNzTmFtZShTb3J0YWJsZS5fbWFya2VyLCAnZHJvcG1hcmtlcicpOwotICAgICAgU29ydGFibGUuX21hcmtlci5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7Ci0gICAgICBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYm9keSIpLml0ZW0oMCkuYXBwZW5kQ2hpbGQoU29ydGFibGUuX21hcmtlcik7Ci0gICAgfSAgICAKLSAgICB2YXIgb2Zmc2V0cyA9IFBvc2l0aW9uLmN1bXVsYXRpdmVPZmZzZXQoZHJvcG9uKTsKLSAgICBTb3J0YWJsZS5fbWFya2VyLnN0eWxlLmxlZnQgPSBvZmZzZXRzWzBdICsgJ3B4JzsKLSAgICBTb3J0YWJsZS5fbWFya2VyLnN0eWxlLnRvcCA9IG9mZnNldHNbMV0gKyAncHgnOwotICAgIAotICAgIGlmKHBvc2l0aW9uPT0nYWZ0ZXInKQotICAgICAgaWYoc29ydGFibGUub3ZlcmxhcCA9PSAnaG9yaXpvbnRhbCcpIAotICAgICAgICBTb3J0YWJsZS5fbWFya2VyLnN0eWxlLmxlZnQgPSAob2Zmc2V0c1swXStkcm9wb24uY2xpZW50V2lkdGgpICsgJ3B4JzsKLSAgICAgIGVsc2UKLSAgICAgICAgU29ydGFibGUuX21hcmtlci5zdHlsZS50b3AgPSAob2Zmc2V0c1sxXStkcm9wb24uY2xpZW50SGVpZ2h0KSArICdweCc7Ci0gICAgCi0gICAgRWxlbWVudC5zaG93KFNvcnRhYmxlLl9tYXJrZXIpOwotICB9LAotICAKLSAgX3RyZWU6IGZ1bmN0aW9uKGVsZW1lbnQsIG9wdGlvbnMsIHBhcmVudCkgewotICAgIHZhciBjaGlsZHJlbiA9IFNvcnRhYmxlLmZpbmRFbGVtZW50cyhlbGVtZW50LCBvcHRpb25zKSB8fCBbXTsKLSAgCi0gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7ICsraSkgewotICAgICAgdmFyIG1hdGNoID0gY2hpbGRyZW5baV0uaWQubWF0Y2gob3B0aW9ucy5mb3JtYXQpOwotCi0gICAgICBpZiAoIW1hdGNoKSBjb250aW51ZTsKLSAgICAgIAotICAgICAgdmFyIGNoaWxkID0gewotICAgICAgICBpZDogZW5jb2RlVVJJQ29tcG9uZW50KG1hdGNoID8gbWF0Y2hbMV0gOiBudWxsKSwKLSAgICAgICAgZWxlbWVudDogZWxlbWVudCwKLSAgICAgICAgcGFyZW50OiBwYXJlbnQsCi0gICAgICAgIGNoaWxkcmVuOiBuZXcgQXJyYXksCi0gICAgICAgIHBvc2l0aW9uOiBwYXJlbnQuY2hpbGRyZW4ubGVuZ3RoLAotICAgICAgICBjb250YWluZXI6IFNvcnRhYmxlLl9maW5kQ2hpbGRyZW5FbGVtZW50KGNoaWxkcmVuW2ldLCBvcHRpb25zLnRyZWVUYWcudG9VcHBlckNhc2UoKSkKLSAgICAgIH0KLSAgICAgIAotICAgICAgLyogR2V0IHRoZSBlbGVtZW50IGNvbnRhaW5pbmcgdGhlIGNoaWxkcmVuIGFuZCByZWN1cnNlIG92ZXIgaXQgKi8KLSAgICAgIGlmIChjaGlsZC5jb250YWluZXIpCi0gICAgICAgIHRoaXMuX3RyZWUoY2hpbGQuY29udGFpbmVyLCBvcHRpb25zLCBjaGlsZCkKLSAgICAgIAotICAgICAgcGFyZW50LmNoaWxkcmVuLnB1c2ggKGNoaWxkKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gcGFyZW50OyAKLSAgfSwKLQotICAvKiBGaW5kcyB0aGUgZmlyc3QgZWxlbWVudCBvZiB0aGUgZ2l2ZW4gdGFnIHR5cGUgd2l0aGluIGEgcGFyZW50IGVsZW1lbnQuCi0gICAgVXNlZCBmb3IgZmluZGluZyB0aGUgZmlyc3QgTElbU1RdIHdpdGhpbiBhIExbSVNUXUlbVEVNXS4qLwotICBfZmluZENoaWxkcmVuRWxlbWVudDogZnVuY3Rpb24gKGVsZW1lbnQsIGNvbnRhaW5lclRhZykgewotICAgIGlmIChlbGVtZW50ICYmIGVsZW1lbnQuaGFzQ2hpbGROb2RlcykKLSAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZWxlbWVudC5jaGlsZE5vZGVzLmxlbmd0aDsgKytpKQotICAgICAgICBpZiAoZWxlbWVudC5jaGlsZE5vZGVzW2ldLnRhZ05hbWUgPT0gY29udGFpbmVyVGFnKQotICAgICAgICAgIHJldHVybiBlbGVtZW50LmNoaWxkTm9kZXNbaV07Ci0gIAotICAgIHJldHVybiBudWxsOwotICB9LAotCi0gIHRyZWU6IGZ1bmN0aW9uKGVsZW1lbnQpIHsKLSAgICBlbGVtZW50ID0gJChlbGVtZW50KTsKLSAgICB2YXIgc29ydGFibGVPcHRpb25zID0gdGhpcy5vcHRpb25zKGVsZW1lbnQpOwotICAgIHZhciBvcHRpb25zID0gT2JqZWN0LmV4dGVuZCh7Ci0gICAgICB0YWc6IHNvcnRhYmxlT3B0aW9ucy50YWcsCi0gICAgICB0cmVlVGFnOiBzb3J0YWJsZU9wdGlvbnMudHJlZVRhZywKLSAgICAgIG9ubHk6IHNvcnRhYmxlT3B0aW9ucy5vbmx5LAotICAgICAgbmFtZTogZWxlbWVudC5pZCwKLSAgICAgIGZvcm1hdDogc29ydGFibGVPcHRpb25zLmZvcm1hdAotICAgIH0sIGFyZ3VtZW50c1sxXSB8fCB7fSk7Ci0gICAgCi0gICAgdmFyIHJvb3QgPSB7Ci0gICAgICBpZDogbnVsbCwKLSAgICAgIHBhcmVudDogbnVsbCwKLSAgICAgIGNoaWxkcmVuOiBuZXcgQXJyYXksCi0gICAgICBjb250YWluZXI6IGVsZW1lbnQsCi0gICAgICBwb3NpdGlvbjogMAotICAgIH0KLSAgICAKLSAgICByZXR1cm4gU29ydGFibGUuX3RyZWUgKGVsZW1lbnQsIG9wdGlvbnMsIHJvb3QpOwotICB9LAotCi0gIC8qIENvbnN0cnVjdCBhIFtpXSBpbmRleCBmb3IgYSBwYXJ0aWN1bGFyIG5vZGUgKi8KLSAgX2NvbnN0cnVjdEluZGV4OiBmdW5jdGlvbihub2RlKSB7Ci0gICAgdmFyIGluZGV4ID0gJyc7Ci0gICAgZG8gewotICAgICAgaWYgKG5vZGUuaWQpIGluZGV4ID0gJ1snICsgbm9kZS5wb3NpdGlvbiArICddJyArIGluZGV4OwotICAgIH0gd2hpbGUgKChub2RlID0gbm9kZS5wYXJlbnQpICE9IG51bGwpOwotICAgIHJldHVybiBpbmRleDsKLSAgfSwKLQotICBzZXF1ZW5jZTogZnVuY3Rpb24oZWxlbWVudCkgewotICAgIGVsZW1lbnQgPSAkKGVsZW1lbnQpOwotICAgIHZhciBvcHRpb25zID0gT2JqZWN0LmV4dGVuZCh0aGlzLm9wdGlvbnMoZWxlbWVudCksIGFyZ3VtZW50c1sxXSB8fCB7fSk7Ci0gICAgCi0gICAgcmV0dXJuICQodGhpcy5maW5kRWxlbWVudHMoZWxlbWVudCwgb3B0aW9ucykgfHwgW10pLm1hcCggZnVuY3Rpb24oaXRlbSkgewotICAgICAgcmV0dXJuIGl0ZW0uaWQubWF0Y2gob3B0aW9ucy5mb3JtYXQpID8gaXRlbS5pZC5tYXRjaChvcHRpb25zLmZvcm1hdClbMV0gOiAnJzsKLSAgICB9KTsKLSAgfSwKLQotICBzZXRTZXF1ZW5jZTogZnVuY3Rpb24oZWxlbWVudCwgbmV3X3NlcXVlbmNlKSB7Ci0gICAgZWxlbWVudCA9ICQoZWxlbWVudCk7Ci0gICAgdmFyIG9wdGlvbnMgPSBPYmplY3QuZXh0ZW5kKHRoaXMub3B0aW9ucyhlbGVtZW50KSwgYXJndW1lbnRzWzJdIHx8IHt9KTsKLSAgICAKLSAgICB2YXIgbm9kZU1hcCA9IHt9OwotICAgIHRoaXMuZmluZEVsZW1lbnRzKGVsZW1lbnQsIG9wdGlvbnMpLmVhY2goIGZ1bmN0aW9uKG4pIHsKLSAgICAgICAgaWYgKG4uaWQubWF0Y2gob3B0aW9ucy5mb3JtYXQpKQotICAgICAgICAgICAgbm9kZU1hcFtuLmlkLm1hdGNoKG9wdGlvbnMuZm9ybWF0KVsxXV0gPSBbbiwgbi5wYXJlbnROb2RlXTsKLSAgICAgICAgbi5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG4pOwotICAgIH0pOwotICAgCi0gICAgbmV3X3NlcXVlbmNlLmVhY2goZnVuY3Rpb24oaWRlbnQpIHsKLSAgICAgIHZhciBuID0gbm9kZU1hcFtpZGVudF07Ci0gICAgICBpZiAobikgewotICAgICAgICBuWzFdLmFwcGVuZENoaWxkKG5bMF0pOwotICAgICAgICBkZWxldGUgbm9kZU1hcFtpZGVudF07Ci0gICAgICB9Ci0gICAgfSk7Ci0gIH0sCi0gIAotICBzZXJpYWxpemU6IGZ1bmN0aW9uKGVsZW1lbnQpIHsKLSAgICBlbGVtZW50ID0gJChlbGVtZW50KTsKLSAgICB2YXIgb3B0aW9ucyA9IE9iamVjdC5leHRlbmQoU29ydGFibGUub3B0aW9ucyhlbGVtZW50KSwgYXJndW1lbnRzWzFdIHx8IHt9KTsKLSAgICB2YXIgbmFtZSA9IGVuY29kZVVSSUNvbXBvbmVudCgKLSAgICAgIChhcmd1bWVudHNbMV0gJiYgYXJndW1lbnRzWzFdLm5hbWUpID8gYXJndW1lbnRzWzFdLm5hbWUgOiBlbGVtZW50LmlkKTsKLSAgICAKLSAgICBpZiAob3B0aW9ucy50cmVlKSB7Ci0gICAgICByZXR1cm4gU29ydGFibGUudHJlZShlbGVtZW50LCBhcmd1bWVudHNbMV0pLmNoaWxkcmVuLm1hcCggZnVuY3Rpb24gKGl0ZW0pIHsKLSAgICAgICAgcmV0dXJuIFtuYW1lICsgU29ydGFibGUuX2NvbnN0cnVjdEluZGV4KGl0ZW0pICsgIltpZF09IiArIAotICAgICAgICAgICAgICAgIGVuY29kZVVSSUNvbXBvbmVudChpdGVtLmlkKV0uY29uY2F0KGl0ZW0uY2hpbGRyZW4ubWFwKGFyZ3VtZW50cy5jYWxsZWUpKTsKLSAgICAgIH0pLmZsYXR0ZW4oKS5qb2luKCcmJyk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiBTb3J0YWJsZS5zZXF1ZW5jZShlbGVtZW50LCBhcmd1bWVudHNbMV0pLm1hcCggZnVuY3Rpb24oaXRlbSkgewotICAgICAgICByZXR1cm4gbmFtZSArICJbXT0iICsgZW5jb2RlVVJJQ29tcG9uZW50KGl0ZW0pOwotICAgICAgfSkuam9pbignJicpOwotICAgIH0KLSAgfQotfQotCi0vKiBSZXR1cm5zIHRydWUgaWYgY2hpbGQgaXMgY29udGFpbmVkIHdpdGhpbiBlbGVtZW50ICovCi1FbGVtZW50LmlzUGFyZW50ID0gZnVuY3Rpb24oY2hpbGQsIGVsZW1lbnQpIHsKLSAgaWYgKCFjaGlsZC5wYXJlbnROb2RlIHx8IGNoaWxkID09IGVsZW1lbnQpIHJldHVybiBmYWxzZTsKLQotICBpZiAoY2hpbGQucGFyZW50Tm9kZSA9PSBlbGVtZW50KSByZXR1cm4gdHJ1ZTsKLQotICByZXR1cm4gRWxlbWVudC5pc1BhcmVudChjaGlsZC5wYXJlbnROb2RlLCBlbGVtZW50KTsKLX0KLQotRWxlbWVudC5maW5kQ2hpbGRyZW4gPSBmdW5jdGlvbihlbGVtZW50LCBvbmx5LCByZWN1cnNpdmUsIHRhZ05hbWUpIHsgICAgCi0gIGlmKCFlbGVtZW50Lmhhc0NoaWxkTm9kZXMoKSkgcmV0dXJuIG51bGw7Ci0gIHRhZ05hbWUgPSB0YWdOYW1lLnRvVXBwZXJDYXNlKCk7Ci0gIGlmKG9ubHkpIG9ubHkgPSBbb25seV0uZmxhdHRlbigpOwotICB2YXIgZWxlbWVudHMgPSBbXTsKLSAgJEEoZWxlbWVudC5jaGlsZE5vZGVzKS5lYWNoKCBmdW5jdGlvbihlKSB7Ci0gICAgaWYoZS50YWdOYW1lICYmIGUudGFnTmFtZS50b1VwcGVyQ2FzZSgpPT10YWdOYW1lICYmCi0gICAgICAoIW9ubHkgfHwgKEVsZW1lbnQuY2xhc3NOYW1lcyhlKS5kZXRlY3QoZnVuY3Rpb24odikgeyByZXR1cm4gb25seS5pbmNsdWRlKHYpIH0pKSkpCi0gICAgICAgIGVsZW1lbnRzLnB1c2goZSk7Ci0gICAgaWYocmVjdXJzaXZlKSB7Ci0gICAgICB2YXIgZ3JhbmRjaGlsZHJlbiA9IEVsZW1lbnQuZmluZENoaWxkcmVuKGUsIG9ubHksIHJlY3Vyc2l2ZSwgdGFnTmFtZSk7Ci0gICAgICBpZihncmFuZGNoaWxkcmVuKSBlbGVtZW50cy5wdXNoKGdyYW5kY2hpbGRyZW4pOwotICAgIH0KLSAgfSk7Ci0KLSAgcmV0dXJuIChlbGVtZW50cy5sZW5ndGg+MCA/IGVsZW1lbnRzLmZsYXR0ZW4oKSA6IFtdKTsKLX0KLQotRWxlbWVudC5vZmZzZXRTaXplID0gZnVuY3Rpb24gKGVsZW1lbnQsIHR5cGUpIHsKLSAgaWYgKHR5cGUgPT0gJ3ZlcnRpY2FsJyB8fCB0eXBlID09ICdoZWlnaHQnKQotICAgIHJldHVybiBlbGVtZW50Lm9mZnNldEhlaWdodDsKLSAgZWxzZQotICAgIHJldHVybiBlbGVtZW50Lm9mZnNldFdpZHRoOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL3NjcmlwdHMvZWZmZWN0cy5qcyBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL3NjcmlwdHMvZWZmZWN0cy5qcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGFhNmQxMy4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy9zY3JpcHRzL2VmZmVjdHMuanMKKysrIC9kZXYvbnVsbApAQCAtMSw5NzcgKzAsMCBAQAotLy8gc2NyaXB0LmFjdWxvLnVzIGVmZmVjdHMuanMgdjEuNi40LCBXZWQgU2VwIDA2IDExOjMwOjU4IENFU1QgMjAwNgotCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUgVGhvbWFzIEZ1Y2hzIChodHRwOi8vc2NyaXB0LmFjdWxvLnVzLCBodHRwOi8vbWlyLmFjdWxvLnVzKQotLy8gQ29udHJpYnV0b3JzOgotLy8gIEp1c3RpbiBQYWxtZXIgKGh0dHA6Ly9lbmN5dGVtZWRpYS5jb20vKQotLy8gIE1hcmsgUGlsZ3JpbSAoaHR0cDovL2RpdmVpbnRvbWFyay5vcmcvKQotLy8gIE1hcnRpbiBCaWFsYXNpbmtpCi0vLyAKLS8vIFNlZSBzY3JpcHRhY3Vsb3VzLmpzIGZvciBmdWxsIGxpY2Vuc2UuICAKLQotLy8gY29udmVydHMgcmdiKCkgYW5kICN4eHggdG8gI3h4eHh4eCBmb3JtYXQsICAKLS8vIHJldHVybnMgc2VsZiAob3IgZmlyc3QgYXJndW1lbnQpIGlmIG5vdCBjb252ZXJ0YWJsZSAgCi1TdHJpbmcucHJvdG90eXBlLnBhcnNlQ29sb3IgPSBmdW5jdGlvbigpIHsgIAotICB2YXIgY29sb3IgPSAnIyc7ICAKLSAgaWYodGhpcy5zbGljZSgwLDQpID09ICdyZ2IoJykgeyAgCi0gICAgdmFyIGNvbHMgPSB0aGlzLnNsaWNlKDQsdGhpcy5sZW5ndGgtMSkuc3BsaXQoJywnKTsgIAotICAgIHZhciBpPTA7IGRvIHsgY29sb3IgKz0gcGFyc2VJbnQoY29sc1tpXSkudG9Db2xvclBhcnQoKSB9IHdoaWxlICgrK2k8Myk7ICAKLSAgfSBlbHNlIHsgIAotICAgIGlmKHRoaXMuc2xpY2UoMCwxKSA9PSAnIycpIHsgIAotICAgICAgaWYodGhpcy5sZW5ndGg9PTQpIGZvcih2YXIgaT0xO2k8NDtpKyspIGNvbG9yICs9ICh0aGlzLmNoYXJBdChpKSArIHRoaXMuY2hhckF0KGkpKS50b0xvd2VyQ2FzZSgpOyAgCi0gICAgICBpZih0aGlzLmxlbmd0aD09NykgY29sb3IgPSB0aGlzLnRvTG93ZXJDYXNlKCk7ICAKLSAgICB9ICAKLSAgfSAgCi0gIHJldHVybihjb2xvci5sZW5ndGg9PTcgPyBjb2xvciA6IChhcmd1bWVudHNbMF0gfHwgdGhpcykpOyAgCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1FbGVtZW50LmNvbGxlY3RUZXh0Tm9kZXMgPSBmdW5jdGlvbihlbGVtZW50KSB7ICAKLSAgcmV0dXJuICRBKCQoZWxlbWVudCkuY2hpbGROb2RlcykuY29sbGVjdCggZnVuY3Rpb24obm9kZSkgewotICAgIHJldHVybiAobm9kZS5ub2RlVHlwZT09MyA/IG5vZGUubm9kZVZhbHVlIDogCi0gICAgICAobm9kZS5oYXNDaGlsZE5vZGVzKCkgPyBFbGVtZW50LmNvbGxlY3RUZXh0Tm9kZXMobm9kZSkgOiAnJykpOwotICB9KS5mbGF0dGVuKCkuam9pbignJyk7Ci19Ci0KLUVsZW1lbnQuY29sbGVjdFRleHROb2Rlc0lnbm9yZUNsYXNzID0gZnVuY3Rpb24oZWxlbWVudCwgY2xhc3NOYW1lKSB7ICAKLSAgcmV0dXJuICRBKCQoZWxlbWVudCkuY2hpbGROb2RlcykuY29sbGVjdCggZnVuY3Rpb24obm9kZSkgewotICAgIHJldHVybiAobm9kZS5ub2RlVHlwZT09MyA/IG5vZGUubm9kZVZhbHVlIDogCi0gICAgICAoKG5vZGUuaGFzQ2hpbGROb2RlcygpICYmICFFbGVtZW50Lmhhc0NsYXNzTmFtZShub2RlLGNsYXNzTmFtZSkpID8gCi0gICAgICAgIEVsZW1lbnQuY29sbGVjdFRleHROb2Rlc0lnbm9yZUNsYXNzKG5vZGUsIGNsYXNzTmFtZSkgOiAnJykpOwotICB9KS5mbGF0dGVuKCkuam9pbignJyk7Ci19Ci0KLUVsZW1lbnQuc2V0Q29udGVudFpvb20gPSBmdW5jdGlvbihlbGVtZW50LCBwZXJjZW50KSB7Ci0gIGVsZW1lbnQgPSAkKGVsZW1lbnQpOyAgCi0gIEVsZW1lbnQuc2V0U3R5bGUoZWxlbWVudCwge2ZvbnRTaXplOiAocGVyY2VudC8xMDApICsgJ2VtJ30pOyAgIAotICBpZihuYXZpZ2F0b3IuYXBwVmVyc2lvbi5pbmRleE9mKCdBcHBsZVdlYktpdCcpPjApIHdpbmRvdy5zY3JvbGxCeSgwLDApOwotfQotCi1FbGVtZW50LmdldE9wYWNpdHkgPSBmdW5jdGlvbihlbGVtZW50KXsgIAotICB2YXIgb3BhY2l0eTsKLSAgaWYgKG9wYWNpdHkgPSBFbGVtZW50LmdldFN0eWxlKGVsZW1lbnQsICdvcGFjaXR5JykpICAKLSAgICByZXR1cm4gcGFyc2VGbG9hdChvcGFjaXR5KTsgIAotICBpZiAob3BhY2l0eSA9IChFbGVtZW50LmdldFN0eWxlKGVsZW1lbnQsICdmaWx0ZXInKSB8fCAnJykubWF0Y2goL2FscGhhXChvcGFjaXR5PSguKilcKS8pKSAgCi0gICAgaWYob3BhY2l0eVsxXSkgcmV0dXJuIHBhcnNlRmxvYXQob3BhY2l0eVsxXSkgLyAxMDA7ICAKLSAgcmV0dXJuIDEuMDsgIAotfQotCi1FbGVtZW50LnNldE9wYWNpdHkgPSBmdW5jdGlvbihlbGVtZW50LCB2YWx1ZSl7ICAKLSAgZWxlbWVudD0gJChlbGVtZW50KTsgIAotICBpZiAodmFsdWUgPT0gMSl7Ci0gICAgRWxlbWVudC5zZXRTdHlsZShlbGVtZW50LCB7IG9wYWNpdHk6IAotICAgICAgKC9HZWNrby8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSAmJiAhL0tvbnF1ZXJvcnxTYWZhcml8S0hUTUwvLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkpID8gCi0gICAgICAwLjk5OTk5OSA6IDEuMCB9KTsKLSAgICBpZigvTVNJRS8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSAmJiAhd2luZG93Lm9wZXJhKSAgCi0gICAgICBFbGVtZW50LnNldFN0eWxlKGVsZW1lbnQsIHtmaWx0ZXI6IEVsZW1lbnQuZ2V0U3R5bGUoZWxlbWVudCwnZmlsdGVyJykucmVwbGFjZSgvYWxwaGFcKFteXCldKlwpL2dpLCcnKX0pOyAgCi0gIH0gZWxzZSB7ICAKLSAgICBpZih2YWx1ZSA8IDAuMDAwMDEpIHZhbHVlID0gMDsgIAotICAgIEVsZW1lbnQuc2V0U3R5bGUoZWxlbWVudCwge29wYWNpdHk6IHZhbHVlfSk7Ci0gICAgaWYoL01TSUUvLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkgJiYgIXdpbmRvdy5vcGVyYSkgIAotICAgICBFbGVtZW50LnNldFN0eWxlKGVsZW1lbnQsIAotICAgICAgIHsgZmlsdGVyOiBFbGVtZW50LmdldFN0eWxlKGVsZW1lbnQsJ2ZpbHRlcicpLnJlcGxhY2UoL2FscGhhXChbXlwpXSpcKS9naSwnJykgKwotICAgICAgICAgICAgICAgICAnYWxwaGEob3BhY2l0eT0nK3ZhbHVlKjEwMCsnKScgfSk7ICAKLSAgfQotfSAgCi0gCi1FbGVtZW50LmdldElubGluZU9wYWNpdHkgPSBmdW5jdGlvbihlbGVtZW50KXsgIAotICByZXR1cm4gJChlbGVtZW50KS5zdHlsZS5vcGFjaXR5IHx8ICcnOwotfSAgCi0KLUVsZW1lbnQuY2hpbGRyZW5XaXRoQ2xhc3NOYW1lID0gZnVuY3Rpb24oZWxlbWVudCwgY2xhc3NOYW1lLCBmaW5kRmlyc3QpIHsKLSAgdmFyIGNsYXNzTmFtZVJlZ0V4cCA9IG5ldyBSZWdFeHAoIihefFxccykiICsgY2xhc3NOYW1lICsgIihcXHN8JCkiKTsKLSAgdmFyIHJlc3VsdHMgPSAkQSgkKGVsZW1lbnQpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCcqJykpW2ZpbmRGaXJzdCA/ICdkZXRlY3QnIDogJ3NlbGVjdCddKCBmdW5jdGlvbihjKSB7IAotICAgIHJldHVybiAoYy5jbGFzc05hbWUgJiYgYy5jbGFzc05hbWUubWF0Y2goY2xhc3NOYW1lUmVnRXhwKSk7Ci0gIH0pOwotICBpZighcmVzdWx0cykgcmVzdWx0cyA9IFtdOwotICByZXR1cm4gcmVzdWx0czsKLX0KLQotRWxlbWVudC5mb3JjZVJlcmVuZGVyaW5nID0gZnVuY3Rpb24oZWxlbWVudCkgewotICB0cnkgewotICAgIGVsZW1lbnQgPSAkKGVsZW1lbnQpOwotICAgIHZhciBuID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoJyAnKTsKLSAgICBlbGVtZW50LmFwcGVuZENoaWxkKG4pOwotICAgIGVsZW1lbnQucmVtb3ZlQ2hpbGQobik7Ci0gIH0gY2F0Y2goZSkgeyB9Ci19OwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotQXJyYXkucHJvdG90eXBlLmNhbGwgPSBmdW5jdGlvbigpIHsKLSAgdmFyIGFyZ3MgPSBhcmd1bWVudHM7Ci0gIHRoaXMuZWFjaChmdW5jdGlvbihmKXsgZi5hcHBseSh0aGlzLCBhcmdzKSB9KTsKLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXZhciBFZmZlY3QgPSB7Ci0gIF9lbGVtZW50RG9lc05vdEV4aXN0RXJyb3I6IHsKLSAgICBuYW1lOiAnRWxlbWVudERvZXNOb3RFeGlzdEVycm9yJywKLSAgICBtZXNzYWdlOiAnVGhlIHNwZWNpZmllZCBET00gZWxlbWVudCBkb2VzIG5vdCBleGlzdCwgYnV0IGlzIHJlcXVpcmVkIGZvciB0aGlzIGVmZmVjdCB0byBvcGVyYXRlJwotICB9LAotICB0YWdpZnlUZXh0OiBmdW5jdGlvbihlbGVtZW50KSB7Ci0gICAgaWYodHlwZW9mIEJ1aWxkZXIgPT0gJ3VuZGVmaW5lZCcpCi0gICAgICB0aHJvdygiRWZmZWN0LnRhZ2lmeVRleHQgcmVxdWlyZXMgaW5jbHVkaW5nIHNjcmlwdC5hY3Vsby51cycgYnVpbGRlci5qcyBsaWJyYXJ5Iik7Ci0gICAgICAKLSAgICB2YXIgdGFnaWZ5U3R5bGUgPSAncG9zaXRpb246cmVsYXRpdmUnOwotICAgIGlmKC9NU0lFLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpICYmICF3aW5kb3cub3BlcmEpIHRhZ2lmeVN0eWxlICs9ICc7em9vbToxJzsKLSAgICBlbGVtZW50ID0gJChlbGVtZW50KTsKLSAgICAkQShlbGVtZW50LmNoaWxkTm9kZXMpLmVhY2goIGZ1bmN0aW9uKGNoaWxkKSB7Ci0gICAgICBpZihjaGlsZC5ub2RlVHlwZT09MykgewotICAgICAgICBjaGlsZC5ub2RlVmFsdWUudG9BcnJheSgpLmVhY2goIGZ1bmN0aW9uKGNoYXJhY3RlcikgewotICAgICAgICAgIGVsZW1lbnQuaW5zZXJ0QmVmb3JlKAotICAgICAgICAgICAgQnVpbGRlci5ub2RlKCdzcGFuJyx7c3R5bGU6IHRhZ2lmeVN0eWxlfSwKLSAgICAgICAgICAgICAgY2hhcmFjdGVyID09ICcgJyA/IFN0cmluZy5mcm9tQ2hhckNvZGUoMTYwKSA6IGNoYXJhY3RlciksIAotICAgICAgICAgICAgICBjaGlsZCk7Ci0gICAgICAgIH0pOwotICAgICAgICBFbGVtZW50LnJlbW92ZShjaGlsZCk7Ci0gICAgICB9Ci0gICAgfSk7Ci0gIH0sCi0gIG11bHRpcGxlOiBmdW5jdGlvbihlbGVtZW50LCBlZmZlY3QpIHsKLSAgICB2YXIgZWxlbWVudHM7Ci0gICAgaWYoKCh0eXBlb2YgZWxlbWVudCA9PSAnb2JqZWN0JykgfHwgCi0gICAgICAgICh0eXBlb2YgZWxlbWVudCA9PSAnZnVuY3Rpb24nKSkgJiYgCi0gICAgICAgKGVsZW1lbnQubGVuZ3RoKSkKLSAgICAgIGVsZW1lbnRzID0gZWxlbWVudDsKLSAgICBlbHNlCi0gICAgICBlbGVtZW50cyA9ICQoZWxlbWVudCkuY2hpbGROb2RlczsKLSAgICAgIAotICAgIHZhciBvcHRpb25zID0gT2JqZWN0LmV4dGVuZCh7Ci0gICAgICBzcGVlZDogMC4xLAotICAgICAgZGVsYXk6IDAuMAotICAgIH0sIGFyZ3VtZW50c1syXSB8fCB7fSk7Ci0gICAgdmFyIG1hc3RlckRlbGF5ID0gb3B0aW9ucy5kZWxheTsKLQotICAgICRBKGVsZW1lbnRzKS5lYWNoKCBmdW5jdGlvbihlbGVtZW50LCBpbmRleCkgewotICAgICAgbmV3IGVmZmVjdChlbGVtZW50LCBPYmplY3QuZXh0ZW5kKG9wdGlvbnMsIHsgZGVsYXk6IGluZGV4ICogb3B0aW9ucy5zcGVlZCArIG1hc3RlckRlbGF5IH0pKTsKLSAgICB9KTsKLSAgfSwKLSAgUEFJUlM6IHsKLSAgICAnc2xpZGUnOiAgWydTbGlkZURvd24nLCdTbGlkZVVwJ10sCi0gICAgJ2JsaW5kJzogIFsnQmxpbmREb3duJywnQmxpbmRVcCddLAotICAgICdhcHBlYXInOiBbJ0FwcGVhcicsJ0ZhZGUnXQotICB9LAotICB0b2dnbGU6IGZ1bmN0aW9uKGVsZW1lbnQsIGVmZmVjdCkgewotICAgIGVsZW1lbnQgPSAkKGVsZW1lbnQpOwotICAgIGVmZmVjdCA9IChlZmZlY3QgfHwgJ2FwcGVhcicpLnRvTG93ZXJDYXNlKCk7Ci0gICAgdmFyIG9wdGlvbnMgPSBPYmplY3QuZXh0ZW5kKHsKLSAgICAgIHF1ZXVlOiB7IHBvc2l0aW9uOidlbmQnLCBzY29wZTooZWxlbWVudC5pZCB8fCAnZ2xvYmFsJyksIGxpbWl0OiAxIH0KLSAgICB9LCBhcmd1bWVudHNbMl0gfHwge30pOwotICAgIEVmZmVjdFtlbGVtZW50LnZpc2libGUoKSA/IAotICAgICAgRWZmZWN0LlBBSVJTW2VmZmVjdF1bMV0gOiBFZmZlY3QuUEFJUlNbZWZmZWN0XVswXV0oZWxlbWVudCwgb3B0aW9ucyk7Ci0gIH0KLX07Ci0KLXZhciBFZmZlY3QyID0gRWZmZWN0OyAvLyBkZXByZWNhdGVkCi0KLS8qIC0tLS0tLS0tLS0tLS0gdHJhbnNpdGlvbnMgLS0tLS0tLS0tLS0tLSAqLwotCi1FZmZlY3QuVHJhbnNpdGlvbnMgPSB7fQotCi1FZmZlY3QuVHJhbnNpdGlvbnMubGluZWFyID0gUHJvdG90eXBlLks7Ci0KLUVmZmVjdC5UcmFuc2l0aW9ucy5zaW5vaWRhbCA9IGZ1bmN0aW9uKHBvcykgewotICByZXR1cm4gKC1NYXRoLmNvcyhwb3MqTWF0aC5QSSkvMikgKyAwLjU7Ci19Ci1FZmZlY3QuVHJhbnNpdGlvbnMucmV2ZXJzZSAgPSBmdW5jdGlvbihwb3MpIHsKLSAgcmV0dXJuIDEtcG9zOwotfQotRWZmZWN0LlRyYW5zaXRpb25zLmZsaWNrZXIgPSBmdW5jdGlvbihwb3MpIHsKLSAgcmV0dXJuICgoLU1hdGguY29zKHBvcypNYXRoLlBJKS80KSArIDAuNzUpICsgTWF0aC5yYW5kb20oKS80OwotfQotRWZmZWN0LlRyYW5zaXRpb25zLndvYmJsZSA9IGZ1bmN0aW9uKHBvcykgewotICByZXR1cm4gKC1NYXRoLmNvcyhwb3MqTWF0aC5QSSooOSpwb3MpKS8yKSArIDAuNTsKLX0KLUVmZmVjdC5UcmFuc2l0aW9ucy5wdWxzZSA9IGZ1bmN0aW9uKHBvcykgewotICByZXR1cm4gKE1hdGguZmxvb3IocG9zKjEwKSAlIDIgPT0gMCA/IAotICAgIChwb3MqMTAtTWF0aC5mbG9vcihwb3MqMTApKSA6IDEtKHBvcyoxMC1NYXRoLmZsb29yKHBvcyoxMCkpKTsKLX0KLUVmZmVjdC5UcmFuc2l0aW9ucy5ub25lID0gZnVuY3Rpb24ocG9zKSB7Ci0gIHJldHVybiAwOwotfQotRWZmZWN0LlRyYW5zaXRpb25zLmZ1bGwgPSBmdW5jdGlvbihwb3MpIHsKLSAgcmV0dXJuIDE7Ci19Ci0KLS8qIC0tLS0tLS0tLS0tLS0gY29yZSBlZmZlY3RzIC0tLS0tLS0tLS0tLS0gKi8KLQotRWZmZWN0LlNjb3BlZFF1ZXVlID0gQ2xhc3MuY3JlYXRlKCk7Ci1PYmplY3QuZXh0ZW5kKE9iamVjdC5leHRlbmQoRWZmZWN0LlNjb3BlZFF1ZXVlLnByb3RvdHlwZSwgRW51bWVyYWJsZSksIHsKLSAgaW5pdGlhbGl6ZTogZnVuY3Rpb24oKSB7Ci0gICAgdGhpcy5lZmZlY3RzICA9IFtdOwotICAgIHRoaXMuaW50ZXJ2YWwgPSBudWxsOwotICB9LAotICBfZWFjaDogZnVuY3Rpb24oaXRlcmF0b3IpIHsKLSAgICB0aGlzLmVmZmVjdHMuX2VhY2goaXRlcmF0b3IpOwotICB9LAotICBhZGQ6IGZ1bmN0aW9uKGVmZmVjdCkgewotICAgIHZhciB0aW1lc3RhbXAgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTsKLSAgICAKLSAgICB2YXIgcG9zaXRpb24gPSAodHlwZW9mIGVmZmVjdC5vcHRpb25zLnF1ZXVlID09ICdzdHJpbmcnKSA/IAotICAgICAgZWZmZWN0Lm9wdGlvbnMucXVldWUgOiBlZmZlY3Qub3B0aW9ucy5xdWV1ZS5wb3NpdGlvbjsKLSAgICAKLSAgICBzd2l0Y2gocG9zaXRpb24pIHsKLSAgICAgIGNhc2UgJ2Zyb250JzoKLSAgICAgICAgLy8gbW92ZSB1bnN0YXJ0ZWQgZWZmZWN0cyBhZnRlciB0aGlzIGVmZmVjdCAgCi0gICAgICAgIHRoaXMuZWZmZWN0cy5maW5kQWxsKGZ1bmN0aW9uKGUpeyByZXR1cm4gZS5zdGF0ZT09J2lkbGUnIH0pLmVhY2goIGZ1bmN0aW9uKGUpIHsKLSAgICAgICAgICAgIGUuc3RhcnRPbiAgKz0gZWZmZWN0LmZpbmlzaE9uOwotICAgICAgICAgICAgZS5maW5pc2hPbiArPSBlZmZlY3QuZmluaXNoT247Ci0gICAgICAgICAgfSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSAnZW5kJzoKLSAgICAgICAgLy8gc3RhcnQgZWZmZWN0IGFmdGVyIGxhc3QgcXVldWVkIGVmZmVjdCBoYXMgZmluaXNoZWQKLSAgICAgICAgdGltZXN0YW1wID0gdGhpcy5lZmZlY3RzLnBsdWNrKCdmaW5pc2hPbicpLm1heCgpIHx8IHRpbWVzdGFtcDsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIAotICAgIGVmZmVjdC5zdGFydE9uICArPSB0aW1lc3RhbXA7Ci0gICAgZWZmZWN0LmZpbmlzaE9uICs9IHRpbWVzdGFtcDsKLQotICAgIGlmKCFlZmZlY3Qub3B0aW9ucy5xdWV1ZS5saW1pdCB8fCAodGhpcy5lZmZlY3RzLmxlbmd0aCA8IGVmZmVjdC5vcHRpb25zLnF1ZXVlLmxpbWl0KSkKLSAgICAgIHRoaXMuZWZmZWN0cy5wdXNoKGVmZmVjdCk7Ci0gICAgCi0gICAgaWYoIXRoaXMuaW50ZXJ2YWwpIAotICAgICAgdGhpcy5pbnRlcnZhbCA9IHNldEludGVydmFsKHRoaXMubG9vcC5iaW5kKHRoaXMpLCA0MCk7Ci0gIH0sCi0gIHJlbW92ZTogZnVuY3Rpb24oZWZmZWN0KSB7Ci0gICAgdGhpcy5lZmZlY3RzID0gdGhpcy5lZmZlY3RzLnJlamVjdChmdW5jdGlvbihlKSB7IHJldHVybiBlPT1lZmZlY3QgfSk7Ci0gICAgaWYodGhpcy5lZmZlY3RzLmxlbmd0aCA9PSAwKSB7Ci0gICAgICBjbGVhckludGVydmFsKHRoaXMuaW50ZXJ2YWwpOwotICAgICAgdGhpcy5pbnRlcnZhbCA9IG51bGw7Ci0gICAgfQotICB9LAotICBsb29wOiBmdW5jdGlvbigpIHsKLSAgICB2YXIgdGltZVBvcyA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpOwotICAgIHRoaXMuZWZmZWN0cy5pbnZva2UoJ2xvb3AnLCB0aW1lUG9zKTsKLSAgfQotfSk7Ci0KLUVmZmVjdC5RdWV1ZXMgPSB7Ci0gIGluc3RhbmNlczogJEgoKSwKLSAgZ2V0OiBmdW5jdGlvbihxdWV1ZU5hbWUpIHsKLSAgICBpZih0eXBlb2YgcXVldWVOYW1lICE9ICdzdHJpbmcnKSByZXR1cm4gcXVldWVOYW1lOwotICAgIAotICAgIGlmKCF0aGlzLmluc3RhbmNlc1txdWV1ZU5hbWVdKQotICAgICAgdGhpcy5pbnN0YW5jZXNbcXVldWVOYW1lXSA9IG5ldyBFZmZlY3QuU2NvcGVkUXVldWUoKTsKLSAgICAgIAotICAgIHJldHVybiB0aGlzLmluc3RhbmNlc1txdWV1ZU5hbWVdOwotICB9Ci19Ci1FZmZlY3QuUXVldWUgPSBFZmZlY3QuUXVldWVzLmdldCgnZ2xvYmFsJyk7Ci0KLUVmZmVjdC5EZWZhdWx0T3B0aW9ucyA9IHsKLSAgdHJhbnNpdGlvbjogRWZmZWN0LlRyYW5zaXRpb25zLnNpbm9pZGFsLAotICBkdXJhdGlvbjogICAxLjAsICAgLy8gc2Vjb25kcwotICBmcHM6ICAgICAgICAyNS4wLCAgLy8gbWF4LiAyNWZwcyBkdWUgdG8gRWZmZWN0LlF1ZXVlIGltcGxlbWVudGF0aW9uCi0gIHN5bmM6ICAgICAgIGZhbHNlLCAvLyB0cnVlIGZvciBjb21iaW5pbmcKLSAgZnJvbTogICAgICAgMC4wLAotICB0bzogICAgICAgICAxLjAsCi0gIGRlbGF5OiAgICAgIDAuMCwKLSAgcXVldWU6ICAgICAgJ3BhcmFsbGVsJwotfQotCi1FZmZlY3QuQmFzZSA9IGZ1bmN0aW9uKCkge307Ci1FZmZlY3QuQmFzZS5wcm90b3R5cGUgPSB7Ci0gIHBvc2l0aW9uOiBudWxsLAotICBzdGFydDogZnVuY3Rpb24ob3B0aW9ucykgewotICAgIHRoaXMub3B0aW9ucyAgICAgID0gT2JqZWN0LmV4dGVuZChPYmplY3QuZXh0ZW5kKHt9LEVmZmVjdC5EZWZhdWx0T3B0aW9ucyksIG9wdGlvbnMgfHwge30pOwotICAgIHRoaXMuY3VycmVudEZyYW1lID0gMDsKLSAgICB0aGlzLnN0YXRlICAgICAgICA9ICdpZGxlJzsKLSAgICB0aGlzLnN0YXJ0T24gICAgICA9IHRoaXMub3B0aW9ucy5kZWxheSoxMDAwOwotICAgIHRoaXMuZmluaXNoT24gICAgID0gdGhpcy5zdGFydE9uICsgKHRoaXMub3B0aW9ucy5kdXJhdGlvbioxMDAwKTsKLSAgICB0aGlzLmV2ZW50KCdiZWZvcmVTdGFydCcpOwotICAgIGlmKCF0aGlzLm9wdGlvbnMuc3luYykKLSAgICAgIEVmZmVjdC5RdWV1ZXMuZ2V0KHR5cGVvZiB0aGlzLm9wdGlvbnMucXVldWUgPT0gJ3N0cmluZycgPyAKLSAgICAgICAgJ2dsb2JhbCcgOiB0aGlzLm9wdGlvbnMucXVldWUuc2NvcGUpLmFkZCh0aGlzKTsKLSAgfSwKLSAgbG9vcDogZnVuY3Rpb24odGltZVBvcykgewotICAgIGlmKHRpbWVQb3MgPj0gdGhpcy5zdGFydE9uKSB7Ci0gICAgICBpZih0aW1lUG9zID49IHRoaXMuZmluaXNoT24pIHsKLSAgICAgICAgdGhpcy5yZW5kZXIoMS4wKTsKLSAgICAgICAgdGhpcy5jYW5jZWwoKTsKLSAgICAgICAgdGhpcy5ldmVudCgnYmVmb3JlRmluaXNoJyk7Ci0gICAgICAgIGlmKHRoaXMuZmluaXNoKSB0aGlzLmZpbmlzaCgpOyAKLSAgICAgICAgdGhpcy5ldmVudCgnYWZ0ZXJGaW5pc2gnKTsKLSAgICAgICAgcmV0dXJuOyAgCi0gICAgICB9Ci0gICAgICB2YXIgcG9zICAgPSAodGltZVBvcyAtIHRoaXMuc3RhcnRPbikgLyAodGhpcy5maW5pc2hPbiAtIHRoaXMuc3RhcnRPbik7Ci0gICAgICB2YXIgZnJhbWUgPSBNYXRoLnJvdW5kKHBvcyAqIHRoaXMub3B0aW9ucy5mcHMgKiB0aGlzLm9wdGlvbnMuZHVyYXRpb24pOwotICAgICAgaWYoZnJhbWUgPiB0aGlzLmN1cnJlbnRGcmFtZSkgewotICAgICAgICB0aGlzLnJlbmRlcihwb3MpOwotICAgICAgICB0aGlzLmN1cnJlbnRGcmFtZSA9IGZyYW1lOwotICAgICAgfQotICAgIH0KLSAgfSwKLSAgcmVuZGVyOiBmdW5jdGlvbihwb3MpIHsKLSAgICBpZih0aGlzLnN0YXRlID09ICdpZGxlJykgewotICAgICAgdGhpcy5zdGF0ZSA9ICdydW5uaW5nJzsKLSAgICAgIHRoaXMuZXZlbnQoJ2JlZm9yZVNldHVwJyk7Ci0gICAgICBpZih0aGlzLnNldHVwKSB0aGlzLnNldHVwKCk7Ci0gICAgICB0aGlzLmV2ZW50KCdhZnRlclNldHVwJyk7Ci0gICAgfQotICAgIGlmKHRoaXMuc3RhdGUgPT0gJ3J1bm5pbmcnKSB7Ci0gICAgICBpZih0aGlzLm9wdGlvbnMudHJhbnNpdGlvbikgcG9zID0gdGhpcy5vcHRpb25zLnRyYW5zaXRpb24ocG9zKTsKLSAgICAgIHBvcyAqPSAodGhpcy5vcHRpb25zLnRvLXRoaXMub3B0aW9ucy5mcm9tKTsKLSAgICAgIHBvcyArPSB0aGlzLm9wdGlvbnMuZnJvbTsKLSAgICAgIHRoaXMucG9zaXRpb24gPSBwb3M7Ci0gICAgICB0aGlzLmV2ZW50KCdiZWZvcmVVcGRhdGUnKTsKLSAgICAgIGlmKHRoaXMudXBkYXRlKSB0aGlzLnVwZGF0ZShwb3MpOwotICAgICAgdGhpcy5ldmVudCgnYWZ0ZXJVcGRhdGUnKTsKLSAgICB9Ci0gIH0sCi0gIGNhbmNlbDogZnVuY3Rpb24oKSB7Ci0gICAgaWYoIXRoaXMub3B0aW9ucy5zeW5jKQotICAgICAgRWZmZWN0LlF1ZXVlcy5nZXQodHlwZW9mIHRoaXMub3B0aW9ucy5xdWV1ZSA9PSAnc3RyaW5nJyA/IAotICAgICAgICAnZ2xvYmFsJyA6IHRoaXMub3B0aW9ucy5xdWV1ZS5zY29wZSkucmVtb3ZlKHRoaXMpOwotICAgIHRoaXMuc3RhdGUgPSAnZmluaXNoZWQnOwotICB9LAotICBldmVudDogZnVuY3Rpb24oZXZlbnROYW1lKSB7Ci0gICAgaWYodGhpcy5vcHRpb25zW2V2ZW50TmFtZSArICdJbnRlcm5hbCddKSB0aGlzLm9wdGlvbnNbZXZlbnROYW1lICsgJ0ludGVybmFsJ10odGhpcyk7Ci0gICAgaWYodGhpcy5vcHRpb25zW2V2ZW50TmFtZV0pIHRoaXMub3B0aW9uc1tldmVudE5hbWVdKHRoaXMpOwotICB9LAotICBpbnNwZWN0OiBmdW5jdGlvbigpIHsKLSAgICByZXR1cm4gJyM8RWZmZWN0OicgKyAkSCh0aGlzKS5pbnNwZWN0KCkgKyAnLG9wdGlvbnM6JyArICRIKHRoaXMub3B0aW9ucykuaW5zcGVjdCgpICsgJz4nOwotICB9Ci19Ci0KLUVmZmVjdC5QYXJhbGxlbCA9IENsYXNzLmNyZWF0ZSgpOwotT2JqZWN0LmV4dGVuZChPYmplY3QuZXh0ZW5kKEVmZmVjdC5QYXJhbGxlbC5wcm90b3R5cGUsIEVmZmVjdC5CYXNlLnByb3RvdHlwZSksIHsKLSAgaW5pdGlhbGl6ZTogZnVuY3Rpb24oZWZmZWN0cykgewotICAgIHRoaXMuZWZmZWN0cyA9IGVmZmVjdHMgfHwgW107Ci0gICAgdGhpcy5zdGFydChhcmd1bWVudHNbMV0pOwotICB9LAotICB1cGRhdGU6IGZ1bmN0aW9uKHBvc2l0aW9uKSB7Ci0gICAgdGhpcy5lZmZlY3RzLmludm9rZSgncmVuZGVyJywgcG9zaXRpb24pOwotICB9LAotICBmaW5pc2g6IGZ1bmN0aW9uKHBvc2l0aW9uKSB7Ci0gICAgdGhpcy5lZmZlY3RzLmVhY2goIGZ1bmN0aW9uKGVmZmVjdCkgewotICAgICAgZWZmZWN0LnJlbmRlcigxLjApOwotICAgICAgZWZmZWN0LmNhbmNlbCgpOwotICAgICAgZWZmZWN0LmV2ZW50KCdiZWZvcmVGaW5pc2gnKTsKLSAgICAgIGlmKGVmZmVjdC5maW5pc2gpIGVmZmVjdC5maW5pc2gocG9zaXRpb24pOwotICAgICAgZWZmZWN0LmV2ZW50KCdhZnRlckZpbmlzaCcpOwotICAgIH0pOwotICB9Ci19KTsKLQotRWZmZWN0Lk9wYWNpdHkgPSBDbGFzcy5jcmVhdGUoKTsKLU9iamVjdC5leHRlbmQoT2JqZWN0LmV4dGVuZChFZmZlY3QuT3BhY2l0eS5wcm90b3R5cGUsIEVmZmVjdC5CYXNlLnByb3RvdHlwZSksIHsKLSAgaW5pdGlhbGl6ZTogZnVuY3Rpb24oZWxlbWVudCkgewotICAgIHRoaXMuZWxlbWVudCA9ICQoZWxlbWVudCk7Ci0gICAgaWYoIXRoaXMuZWxlbWVudCkgdGhyb3coRWZmZWN0Ll9lbGVtZW50RG9lc05vdEV4aXN0RXJyb3IpOwotICAgIC8vIG1ha2UgdGhpcyB3b3JrIG9uIElFIG9uIGVsZW1lbnRzIHdpdGhvdXQgJ2xheW91dCcKLSAgICBpZigvTVNJRS8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSAmJiAhd2luZG93Lm9wZXJhICYmICghdGhpcy5lbGVtZW50LmN1cnJlbnRTdHlsZS5oYXNMYXlvdXQpKQotICAgICAgdGhpcy5lbGVtZW50LnNldFN0eWxlKHt6b29tOiAxfSk7Ci0gICAgdmFyIG9wdGlvbnMgPSBPYmplY3QuZXh0ZW5kKHsKLSAgICAgIGZyb206IHRoaXMuZWxlbWVudC5nZXRPcGFjaXR5KCkgfHwgMC4wLAotICAgICAgdG86ICAgMS4wCi0gICAgfSwgYXJndW1lbnRzWzFdIHx8IHt9KTsKLSAgICB0aGlzLnN0YXJ0KG9wdGlvbnMpOwotICB9LAotICB1cGRhdGU6IGZ1bmN0aW9uKHBvc2l0aW9uKSB7Ci0gICAgdGhpcy5lbGVtZW50LnNldE9wYWNpdHkocG9zaXRpb24pOwotICB9Ci19KTsKLQotRWZmZWN0Lk1vdmUgPSBDbGFzcy5jcmVhdGUoKTsKLU9iamVjdC5leHRlbmQoT2JqZWN0LmV4dGVuZChFZmZlY3QuTW92ZS5wcm90b3R5cGUsIEVmZmVjdC5CYXNlLnByb3RvdHlwZSksIHsKLSAgaW5pdGlhbGl6ZTogZnVuY3Rpb24oZWxlbWVudCkgewotICAgIHRoaXMuZWxlbWVudCA9ICQoZWxlbWVudCk7Ci0gICAgaWYoIXRoaXMuZWxlbWVudCkgdGhyb3coRWZmZWN0Ll9lbGVtZW50RG9lc05vdEV4aXN0RXJyb3IpOwotICAgIHZhciBvcHRpb25zID0gT2JqZWN0LmV4dGVuZCh7Ci0gICAgICB4OiAgICAwLAotICAgICAgeTogICAgMCwKLSAgICAgIG1vZGU6ICdyZWxhdGl2ZScKLSAgICB9LCBhcmd1bWVudHNbMV0gfHwge30pOwotICAgIHRoaXMuc3RhcnQob3B0aW9ucyk7Ci0gIH0sCi0gIHNldHVwOiBmdW5jdGlvbigpIHsKLSAgICAvLyBCdWcgaW4gT3BlcmE6IE9wZXJhIHJldHVybnMgdGhlICJyZWFsIiBwb3NpdGlvbiBvZiBhIHN0YXRpYyBlbGVtZW50IG9yCi0gICAgLy8gcmVsYXRpdmUgZWxlbWVudCB0aGF0IGRvZXMgbm90IGhhdmUgdG9wL2xlZnQgZXhwbGljaXRseSBzZXQuCi0gICAgLy8gPT0+IEFsd2F5cyBzZXQgdG9wIGFuZCBsZWZ0IGZvciBwb3NpdGlvbiByZWxhdGl2ZSBlbGVtZW50cyBpbiB5b3VyIHN0eWxlc2hlZXRzIAotICAgIC8vICh0byAwIGlmIHlvdSBkbyBub3QgbmVlZCB0aGVtKSAKLSAgICB0aGlzLmVsZW1lbnQubWFrZVBvc2l0aW9uZWQoKTsKLSAgICB0aGlzLm9yaWdpbmFsTGVmdCA9IHBhcnNlRmxvYXQodGhpcy5lbGVtZW50LmdldFN0eWxlKCdsZWZ0JykgfHwgJzAnKTsKLSAgICB0aGlzLm9yaWdpbmFsVG9wICA9IHBhcnNlRmxvYXQodGhpcy5lbGVtZW50LmdldFN0eWxlKCd0b3AnKSAgfHwgJzAnKTsKLSAgICBpZih0aGlzLm9wdGlvbnMubW9kZSA9PSAnYWJzb2x1dGUnKSB7Ci0gICAgICAvLyBhYnNvbHV0ZSBtb3ZlbWVudCwgc28gd2UgbmVlZCB0byBjYWxjIGRlbHRhWCBhbmQgZGVsdGFZCi0gICAgICB0aGlzLm9wdGlvbnMueCA9IHRoaXMub3B0aW9ucy54IC0gdGhpcy5vcmlnaW5hbExlZnQ7Ci0gICAgICB0aGlzLm9wdGlvbnMueSA9IHRoaXMub3B0aW9ucy55IC0gdGhpcy5vcmlnaW5hbFRvcDsKLSAgICB9Ci0gIH0sCi0gIHVwZGF0ZTogZnVuY3Rpb24ocG9zaXRpb24pIHsKLSAgICB0aGlzLmVsZW1lbnQuc2V0U3R5bGUoewotICAgICAgbGVmdDogTWF0aC5yb3VuZCh0aGlzLm9wdGlvbnMueCAgKiBwb3NpdGlvbiArIHRoaXMub3JpZ2luYWxMZWZ0KSArICdweCcsCi0gICAgICB0b3A6ICBNYXRoLnJvdW5kKHRoaXMub3B0aW9ucy55ICAqIHBvc2l0aW9uICsgdGhpcy5vcmlnaW5hbFRvcCkgICsgJ3B4JwotICAgIH0pOwotICB9Ci19KTsKLQotLy8gZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5Ci1FZmZlY3QuTW92ZUJ5ID0gZnVuY3Rpb24oZWxlbWVudCwgdG9Ub3AsIHRvTGVmdCkgewotICByZXR1cm4gbmV3IEVmZmVjdC5Nb3ZlKGVsZW1lbnQsIAotICAgIE9iamVjdC5leHRlbmQoeyB4OiB0b0xlZnQsIHk6IHRvVG9wIH0sIGFyZ3VtZW50c1szXSB8fCB7fSkpOwotfTsKLQotRWZmZWN0LlNjYWxlID0gQ2xhc3MuY3JlYXRlKCk7Ci1PYmplY3QuZXh0ZW5kKE9iamVjdC5leHRlbmQoRWZmZWN0LlNjYWxlLnByb3RvdHlwZSwgRWZmZWN0LkJhc2UucHJvdG90eXBlKSwgewotICBpbml0aWFsaXplOiBmdW5jdGlvbihlbGVtZW50LCBwZXJjZW50KSB7Ci0gICAgdGhpcy5lbGVtZW50ID0gJChlbGVtZW50KTsKLSAgICBpZighdGhpcy5lbGVtZW50KSB0aHJvdyhFZmZlY3QuX2VsZW1lbnREb2VzTm90RXhpc3RFcnJvcik7Ci0gICAgdmFyIG9wdGlvbnMgPSBPYmplY3QuZXh0ZW5kKHsKLSAgICAgIHNjYWxlWDogdHJ1ZSwKLSAgICAgIHNjYWxlWTogdHJ1ZSwKLSAgICAgIHNjYWxlQ29udGVudDogdHJ1ZSwKLSAgICAgIHNjYWxlRnJvbUNlbnRlcjogZmFsc2UsCi0gICAgICBzY2FsZU1vZGU6ICdib3gnLCAgICAgICAgLy8gJ2JveCcgb3IgJ2NvbnRlbnRzJyBvciB7fSB3aXRoIHByb3ZpZGVkIHZhbHVlcwotICAgICAgc2NhbGVGcm9tOiAxMDAuMCwKLSAgICAgIHNjYWxlVG86ICAgcGVyY2VudAotICAgIH0sIGFyZ3VtZW50c1syXSB8fCB7fSk7Ci0gICAgdGhpcy5zdGFydChvcHRpb25zKTsKLSAgfSwKLSAgc2V0dXA6IGZ1bmN0aW9uKCkgewotICAgIHRoaXMucmVzdG9yZUFmdGVyRmluaXNoID0gdGhpcy5vcHRpb25zLnJlc3RvcmVBZnRlckZpbmlzaCB8fCBmYWxzZTsKLSAgICB0aGlzLmVsZW1lbnRQb3NpdGlvbmluZyA9IHRoaXMuZWxlbWVudC5nZXRTdHlsZSgncG9zaXRpb24nKTsKLSAgICAKLSAgICB0aGlzLm9yaWdpbmFsU3R5bGUgPSB7fTsKLSAgICBbJ3RvcCcsJ2xlZnQnLCd3aWR0aCcsJ2hlaWdodCcsJ2ZvbnRTaXplJ10uZWFjaCggZnVuY3Rpb24oaykgewotICAgICAgdGhpcy5vcmlnaW5hbFN0eWxlW2tdID0gdGhpcy5lbGVtZW50LnN0eWxlW2tdOwotICAgIH0uYmluZCh0aGlzKSk7Ci0gICAgICAKLSAgICB0aGlzLm9yaWdpbmFsVG9wICA9IHRoaXMuZWxlbWVudC5vZmZzZXRUb3A7Ci0gICAgdGhpcy5vcmlnaW5hbExlZnQgPSB0aGlzLmVsZW1lbnQub2Zmc2V0TGVmdDsKLSAgICAKLSAgICB2YXIgZm9udFNpemUgPSB0aGlzLmVsZW1lbnQuZ2V0U3R5bGUoJ2ZvbnQtc2l6ZScpIHx8ICcxMDAlJzsKLSAgICBbJ2VtJywncHgnLCclJywncHQnXS5lYWNoKCBmdW5jdGlvbihmb250U2l6ZVR5cGUpIHsKLSAgICAgIGlmKGZvbnRTaXplLmluZGV4T2YoZm9udFNpemVUeXBlKT4wKSB7Ci0gICAgICAgIHRoaXMuZm9udFNpemUgICAgID0gcGFyc2VGbG9hdChmb250U2l6ZSk7Ci0gICAgICAgIHRoaXMuZm9udFNpemVUeXBlID0gZm9udFNpemVUeXBlOwotICAgICAgfQotICAgIH0uYmluZCh0aGlzKSk7Ci0gICAgCi0gICAgdGhpcy5mYWN0b3IgPSAodGhpcy5vcHRpb25zLnNjYWxlVG8gLSB0aGlzLm9wdGlvbnMuc2NhbGVGcm9tKS8xMDA7Ci0gICAgCi0gICAgdGhpcy5kaW1zID0gbnVsbDsKLSAgICBpZih0aGlzLm9wdGlvbnMuc2NhbGVNb2RlPT0nYm94JykKLSAgICAgIHRoaXMuZGltcyA9IFt0aGlzLmVsZW1lbnQub2Zmc2V0SGVpZ2h0LCB0aGlzLmVsZW1lbnQub2Zmc2V0V2lkdGhdOwotICAgIGlmKC9eY29udGVudC8udGVzdCh0aGlzLm9wdGlvbnMuc2NhbGVNb2RlKSkKLSAgICAgIHRoaXMuZGltcyA9IFt0aGlzLmVsZW1lbnQuc2Nyb2xsSGVpZ2h0LCB0aGlzLmVsZW1lbnQuc2Nyb2xsV2lkdGhdOwotICAgIGlmKCF0aGlzLmRpbXMpCi0gICAgICB0aGlzLmRpbXMgPSBbdGhpcy5vcHRpb25zLnNjYWxlTW9kZS5vcmlnaW5hbEhlaWdodCwKLSAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuc2NhbGVNb2RlLm9yaWdpbmFsV2lkdGhdOwotICB9LAotICB1cGRhdGU6IGZ1bmN0aW9uKHBvc2l0aW9uKSB7Ci0gICAgdmFyIGN1cnJlbnRTY2FsZSA9ICh0aGlzLm9wdGlvbnMuc2NhbGVGcm9tLzEwMC4wKSArICh0aGlzLmZhY3RvciAqIHBvc2l0aW9uKTsKLSAgICBpZih0aGlzLm9wdGlvbnMuc2NhbGVDb250ZW50ICYmIHRoaXMuZm9udFNpemUpCi0gICAgICB0aGlzLmVsZW1lbnQuc2V0U3R5bGUoe2ZvbnRTaXplOiB0aGlzLmZvbnRTaXplICogY3VycmVudFNjYWxlICsgdGhpcy5mb250U2l6ZVR5cGUgfSk7Ci0gICAgdGhpcy5zZXREaW1lbnNpb25zKHRoaXMuZGltc1swXSAqIGN1cnJlbnRTY2FsZSwgdGhpcy5kaW1zWzFdICogY3VycmVudFNjYWxlKTsKLSAgfSwKLSAgZmluaXNoOiBmdW5jdGlvbihwb3NpdGlvbikgewotICAgIGlmICh0aGlzLnJlc3RvcmVBZnRlckZpbmlzaCkgdGhpcy5lbGVtZW50LnNldFN0eWxlKHRoaXMub3JpZ2luYWxTdHlsZSk7Ci0gIH0sCi0gIHNldERpbWVuc2lvbnM6IGZ1bmN0aW9uKGhlaWdodCwgd2lkdGgpIHsKLSAgICB2YXIgZCA9IHt9OwotICAgIGlmKHRoaXMub3B0aW9ucy5zY2FsZVgpIGQud2lkdGggPSBNYXRoLnJvdW5kKHdpZHRoKSArICdweCc7Ci0gICAgaWYodGhpcy5vcHRpb25zLnNjYWxlWSkgZC5oZWlnaHQgPSBNYXRoLnJvdW5kKGhlaWdodCkgKyAncHgnOwotICAgIGlmKHRoaXMub3B0aW9ucy5zY2FsZUZyb21DZW50ZXIpIHsKLSAgICAgIHZhciB0b3BkICA9IChoZWlnaHQgLSB0aGlzLmRpbXNbMF0pLzI7Ci0gICAgICB2YXIgbGVmdGQgPSAod2lkdGggIC0gdGhpcy5kaW1zWzFdKS8yOwotICAgICAgaWYodGhpcy5lbGVtZW50UG9zaXRpb25pbmcgPT0gJ2Fic29sdXRlJykgewotICAgICAgICBpZih0aGlzLm9wdGlvbnMuc2NhbGVZKSBkLnRvcCA9IHRoaXMub3JpZ2luYWxUb3AtdG9wZCArICdweCc7Ci0gICAgICAgIGlmKHRoaXMub3B0aW9ucy5zY2FsZVgpIGQubGVmdCA9IHRoaXMub3JpZ2luYWxMZWZ0LWxlZnRkICsgJ3B4JzsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmKHRoaXMub3B0aW9ucy5zY2FsZVkpIGQudG9wID0gLXRvcGQgKyAncHgnOwotICAgICAgICBpZih0aGlzLm9wdGlvbnMuc2NhbGVYKSBkLmxlZnQgPSAtbGVmdGQgKyAncHgnOwotICAgICAgfQotICAgIH0KLSAgICB0aGlzLmVsZW1lbnQuc2V0U3R5bGUoZCk7Ci0gIH0KLX0pOwotCi1FZmZlY3QuSGlnaGxpZ2h0ID0gQ2xhc3MuY3JlYXRlKCk7Ci1PYmplY3QuZXh0ZW5kKE9iamVjdC5leHRlbmQoRWZmZWN0LkhpZ2hsaWdodC5wcm90b3R5cGUsIEVmZmVjdC5CYXNlLnByb3RvdHlwZSksIHsKLSAgaW5pdGlhbGl6ZTogZnVuY3Rpb24oZWxlbWVudCkgewotICAgIHRoaXMuZWxlbWVudCA9ICQoZWxlbWVudCk7Ci0gICAgaWYoIXRoaXMuZWxlbWVudCkgdGhyb3coRWZmZWN0Ll9lbGVtZW50RG9lc05vdEV4aXN0RXJyb3IpOwotICAgIHZhciBvcHRpb25zID0gT2JqZWN0LmV4dGVuZCh7IHN0YXJ0Y29sb3I6ICcjZmZmZjk5JyB9LCBhcmd1bWVudHNbMV0gfHwge30pOwotICAgIHRoaXMuc3RhcnQob3B0aW9ucyk7Ci0gIH0sCi0gIHNldHVwOiBmdW5jdGlvbigpIHsKLSAgICAvLyBQcmV2ZW50IGV4ZWN1dGluZyBvbiBlbGVtZW50cyBub3QgaW4gdGhlIGxheW91dCBmbG93Ci0gICAgaWYodGhpcy5lbGVtZW50LmdldFN0eWxlKCdkaXNwbGF5Jyk9PSdub25lJykgeyB0aGlzLmNhbmNlbCgpOyByZXR1cm47IH0KLSAgICAvLyBEaXNhYmxlIGJhY2tncm91bmQgaW1hZ2UgZHVyaW5nIHRoZSBlZmZlY3QKLSAgICB0aGlzLm9sZFN0eWxlID0gewotICAgICAgYmFja2dyb3VuZEltYWdlOiB0aGlzLmVsZW1lbnQuZ2V0U3R5bGUoJ2JhY2tncm91bmQtaW1hZ2UnKSB9OwotICAgIHRoaXMuZWxlbWVudC5zZXRTdHlsZSh7YmFja2dyb3VuZEltYWdlOiAnbm9uZSd9KTsKLSAgICBpZighdGhpcy5vcHRpb25zLmVuZGNvbG9yKQotICAgICAgdGhpcy5vcHRpb25zLmVuZGNvbG9yID0gdGhpcy5lbGVtZW50LmdldFN0eWxlKCdiYWNrZ3JvdW5kLWNvbG9yJykucGFyc2VDb2xvcignI2ZmZmZmZicpOwotICAgIGlmKCF0aGlzLm9wdGlvbnMucmVzdG9yZWNvbG9yKQotICAgICAgdGhpcy5vcHRpb25zLnJlc3RvcmVjb2xvciA9IHRoaXMuZWxlbWVudC5nZXRTdHlsZSgnYmFja2dyb3VuZC1jb2xvcicpOwotICAgIC8vIGluaXQgY29sb3IgY2FsY3VsYXRpb25zCi0gICAgdGhpcy5fYmFzZSAgPSAkUigwLDIpLm1hcChmdW5jdGlvbihpKXsgcmV0dXJuIHBhcnNlSW50KHRoaXMub3B0aW9ucy5zdGFydGNvbG9yLnNsaWNlKGkqMisxLGkqMiszKSwxNikgfS5iaW5kKHRoaXMpKTsKLSAgICB0aGlzLl9kZWx0YSA9ICRSKDAsMikubWFwKGZ1bmN0aW9uKGkpeyByZXR1cm4gcGFyc2VJbnQodGhpcy5vcHRpb25zLmVuZGNvbG9yLnNsaWNlKGkqMisxLGkqMiszKSwxNiktdGhpcy5fYmFzZVtpXSB9LmJpbmQodGhpcykpOwotICB9LAotICB1cGRhdGU6IGZ1bmN0aW9uKHBvc2l0aW9uKSB7Ci0gICAgdGhpcy5lbGVtZW50LnNldFN0eWxlKHtiYWNrZ3JvdW5kQ29sb3I6ICRSKDAsMikuaW5qZWN0KCcjJyxmdW5jdGlvbihtLHYsaSl7Ci0gICAgICByZXR1cm4gbSsoTWF0aC5yb3VuZCh0aGlzLl9iYXNlW2ldKyh0aGlzLl9kZWx0YVtpXSpwb3NpdGlvbikpLnRvQ29sb3JQYXJ0KCkpOyB9LmJpbmQodGhpcykpIH0pOwotICB9LAotICBmaW5pc2g6IGZ1bmN0aW9uKCkgewotICAgIHRoaXMuZWxlbWVudC5zZXRTdHlsZShPYmplY3QuZXh0ZW5kKHRoaXMub2xkU3R5bGUsIHsKLSAgICAgIGJhY2tncm91bmRDb2xvcjogdGhpcy5vcHRpb25zLnJlc3RvcmVjb2xvcgotICAgIH0pKTsKLSAgfQotfSk7Ci0KLUVmZmVjdC5TY3JvbGxUbyA9IENsYXNzLmNyZWF0ZSgpOwotT2JqZWN0LmV4dGVuZChPYmplY3QuZXh0ZW5kKEVmZmVjdC5TY3JvbGxUby5wcm90b3R5cGUsIEVmZmVjdC5CYXNlLnByb3RvdHlwZSksIHsKLSAgaW5pdGlhbGl6ZTogZnVuY3Rpb24oZWxlbWVudCkgewotICAgIHRoaXMuZWxlbWVudCA9ICQoZWxlbWVudCk7Ci0gICAgdGhpcy5zdGFydChhcmd1bWVudHNbMV0gfHwge30pOwotICB9LAotICBzZXR1cDogZnVuY3Rpb24oKSB7Ci0gICAgUG9zaXRpb24ucHJlcGFyZSgpOwotICAgIHZhciBvZmZzZXRzID0gUG9zaXRpb24uY3VtdWxhdGl2ZU9mZnNldCh0aGlzLmVsZW1lbnQpOwotICAgIGlmKHRoaXMub3B0aW9ucy5vZmZzZXQpIG9mZnNldHNbMV0gKz0gdGhpcy5vcHRpb25zLm9mZnNldDsKLSAgICB2YXIgbWF4ID0gd2luZG93LmlubmVySGVpZ2h0ID8gCi0gICAgICB3aW5kb3cuaGVpZ2h0IC0gd2luZG93LmlubmVySGVpZ2h0IDoKLSAgICAgIGRvY3VtZW50LmJvZHkuc2Nyb2xsSGVpZ2h0IC0gCi0gICAgICAgIChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0ID8gCi0gICAgICAgICAgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCA6IGRvY3VtZW50LmJvZHkuY2xpZW50SGVpZ2h0KTsKLSAgICB0aGlzLnNjcm9sbFN0YXJ0ID0gUG9zaXRpb24uZGVsdGFZOwotICAgIHRoaXMuZGVsdGEgPSAob2Zmc2V0c1sxXSA+IG1heCA/IG1heCA6IG9mZnNldHNbMV0pIC0gdGhpcy5zY3JvbGxTdGFydDsKLSAgfSwKLSAgdXBkYXRlOiBmdW5jdGlvbihwb3NpdGlvbikgewotICAgIFBvc2l0aW9uLnByZXBhcmUoKTsKLSAgICB3aW5kb3cuc2Nyb2xsVG8oUG9zaXRpb24uZGVsdGFYLCAKLSAgICAgIHRoaXMuc2Nyb2xsU3RhcnQgKyAocG9zaXRpb24qdGhpcy5kZWx0YSkpOwotICB9Ci19KTsKLQotLyogLS0tLS0tLS0tLS0tLSBjb21iaW5hdGlvbiBlZmZlY3RzIC0tLS0tLS0tLS0tLS0gKi8KLQotRWZmZWN0LkZhZGUgPSBmdW5jdGlvbihlbGVtZW50KSB7Ci0gIGVsZW1lbnQgPSAkKGVsZW1lbnQpOwotICB2YXIgb2xkT3BhY2l0eSA9IGVsZW1lbnQuZ2V0SW5saW5lT3BhY2l0eSgpOwotICB2YXIgb3B0aW9ucyA9IE9iamVjdC5leHRlbmQoewotICBmcm9tOiBlbGVtZW50LmdldE9wYWNpdHkoKSB8fCAxLjAsCi0gIHRvOiAgIDAuMCwKLSAgYWZ0ZXJGaW5pc2hJbnRlcm5hbDogZnVuY3Rpb24oZWZmZWN0KSB7IAotICAgIGlmKGVmZmVjdC5vcHRpb25zLnRvIT0wKSByZXR1cm47Ci0gICAgZWZmZWN0LmVsZW1lbnQuaGlkZSgpOwotICAgIGVmZmVjdC5lbGVtZW50LnNldFN0eWxlKHtvcGFjaXR5OiBvbGRPcGFjaXR5fSk7IAotICB9fSwgYXJndW1lbnRzWzFdIHx8IHt9KTsKLSAgcmV0dXJuIG5ldyBFZmZlY3QuT3BhY2l0eShlbGVtZW50LG9wdGlvbnMpOwotfQotCi1FZmZlY3QuQXBwZWFyID0gZnVuY3Rpb24oZWxlbWVudCkgewotICBlbGVtZW50ID0gJChlbGVtZW50KTsKLSAgdmFyIG9wdGlvbnMgPSBPYmplY3QuZXh0ZW5kKHsKLSAgZnJvbTogKGVsZW1lbnQuZ2V0U3R5bGUoJ2Rpc3BsYXknKSA9PSAnbm9uZScgPyAwLjAgOiBlbGVtZW50LmdldE9wYWNpdHkoKSB8fCAwLjApLAotICB0bzogICAxLjAsCi0gIC8vIGZvcmNlIFNhZmFyaSB0byByZW5kZXIgZmxvYXRlZCBlbGVtZW50cyBwcm9wZXJseQotICBhZnRlckZpbmlzaEludGVybmFsOiBmdW5jdGlvbihlZmZlY3QpIHsKLSAgICBlZmZlY3QuZWxlbWVudC5mb3JjZVJlcmVuZGVyaW5nKCk7Ci0gIH0sCi0gIGJlZm9yZVNldHVwOiBmdW5jdGlvbihlZmZlY3QpIHsKLSAgICBlZmZlY3QuZWxlbWVudC5zZXRPcGFjaXR5KGVmZmVjdC5vcHRpb25zLmZyb20pOwotICAgIGVmZmVjdC5lbGVtZW50LnNob3coKTsgCi0gIH19LCBhcmd1bWVudHNbMV0gfHwge30pOwotICByZXR1cm4gbmV3IEVmZmVjdC5PcGFjaXR5KGVsZW1lbnQsb3B0aW9ucyk7Ci19Ci0KLUVmZmVjdC5QdWZmID0gZnVuY3Rpb24oZWxlbWVudCkgewotICBlbGVtZW50ID0gJChlbGVtZW50KTsKLSAgdmFyIG9sZFN0eWxlID0geyAKLSAgICBvcGFjaXR5OiBlbGVtZW50LmdldElubGluZU9wYWNpdHkoKSwgCi0gICAgcG9zaXRpb246IGVsZW1lbnQuZ2V0U3R5bGUoJ3Bvc2l0aW9uJyksCi0gICAgdG9wOiAgZWxlbWVudC5zdHlsZS50b3AsCi0gICAgbGVmdDogZWxlbWVudC5zdHlsZS5sZWZ0LAotICAgIHdpZHRoOiBlbGVtZW50LnN0eWxlLndpZHRoLAotICAgIGhlaWdodDogZWxlbWVudC5zdHlsZS5oZWlnaHQKLSAgfTsKLSAgcmV0dXJuIG5ldyBFZmZlY3QuUGFyYWxsZWwoCi0gICBbIG5ldyBFZmZlY3QuU2NhbGUoZWxlbWVudCwgMjAwLCAKLSAgICAgIHsgc3luYzogdHJ1ZSwgc2NhbGVGcm9tQ2VudGVyOiB0cnVlLCBzY2FsZUNvbnRlbnQ6IHRydWUsIHJlc3RvcmVBZnRlckZpbmlzaDogdHJ1ZSB9KSwgCi0gICAgIG5ldyBFZmZlY3QuT3BhY2l0eShlbGVtZW50LCB7IHN5bmM6IHRydWUsIHRvOiAwLjAgfSApIF0sIAotICAgICBPYmplY3QuZXh0ZW5kKHsgZHVyYXRpb246IDEuMCwgCi0gICAgICBiZWZvcmVTZXR1cEludGVybmFsOiBmdW5jdGlvbihlZmZlY3QpIHsKLSAgICAgICAgUG9zaXRpb24uYWJzb2x1dGl6ZShlZmZlY3QuZWZmZWN0c1swXS5lbGVtZW50KQotICAgICAgfSwKLSAgICAgIGFmdGVyRmluaXNoSW50ZXJuYWw6IGZ1bmN0aW9uKGVmZmVjdCkgewotICAgICAgICAgZWZmZWN0LmVmZmVjdHNbMF0uZWxlbWVudC5oaWRlKCk7Ci0gICAgICAgICBlZmZlY3QuZWZmZWN0c1swXS5lbGVtZW50LnNldFN0eWxlKG9sZFN0eWxlKTsgfQotICAgICB9LCBhcmd1bWVudHNbMV0gfHwge30pCi0gICApOwotfQotCi1FZmZlY3QuQmxpbmRVcCA9IGZ1bmN0aW9uKGVsZW1lbnQpIHsKLSAgZWxlbWVudCA9ICQoZWxlbWVudCk7Ci0gIGVsZW1lbnQubWFrZUNsaXBwaW5nKCk7Ci0gIHJldHVybiBuZXcgRWZmZWN0LlNjYWxlKGVsZW1lbnQsIDAsCi0gICAgT2JqZWN0LmV4dGVuZCh7IHNjYWxlQ29udGVudDogZmFsc2UsIAotICAgICAgc2NhbGVYOiBmYWxzZSwgCi0gICAgICByZXN0b3JlQWZ0ZXJGaW5pc2g6IHRydWUsCi0gICAgICBhZnRlckZpbmlzaEludGVybmFsOiBmdW5jdGlvbihlZmZlY3QpIHsKLSAgICAgICAgZWZmZWN0LmVsZW1lbnQuaGlkZSgpOwotICAgICAgICBlZmZlY3QuZWxlbWVudC51bmRvQ2xpcHBpbmcoKTsKLSAgICAgIH0gCi0gICAgfSwgYXJndW1lbnRzWzFdIHx8IHt9KQotICApOwotfQotCi1FZmZlY3QuQmxpbmREb3duID0gZnVuY3Rpb24oZWxlbWVudCkgewotICBlbGVtZW50ID0gJChlbGVtZW50KTsKLSAgdmFyIGVsZW1lbnREaW1lbnNpb25zID0gZWxlbWVudC5nZXREaW1lbnNpb25zKCk7Ci0gIHJldHVybiBuZXcgRWZmZWN0LlNjYWxlKGVsZW1lbnQsIDEwMCwgT2JqZWN0LmV4dGVuZCh7IAotICAgIHNjYWxlQ29udGVudDogZmFsc2UsIAotICAgIHNjYWxlWDogZmFsc2UsCi0gICAgc2NhbGVGcm9tOiAwLAotICAgIHNjYWxlTW9kZToge29yaWdpbmFsSGVpZ2h0OiBlbGVtZW50RGltZW5zaW9ucy5oZWlnaHQsIG9yaWdpbmFsV2lkdGg6IGVsZW1lbnREaW1lbnNpb25zLndpZHRofSwKLSAgICByZXN0b3JlQWZ0ZXJGaW5pc2g6IHRydWUsCi0gICAgYWZ0ZXJTZXR1cDogZnVuY3Rpb24oZWZmZWN0KSB7Ci0gICAgICBlZmZlY3QuZWxlbWVudC5tYWtlQ2xpcHBpbmcoKTsKLSAgICAgIGVmZmVjdC5lbGVtZW50LnNldFN0eWxlKHtoZWlnaHQ6ICcwcHgnfSk7Ci0gICAgICBlZmZlY3QuZWxlbWVudC5zaG93KCk7IAotICAgIH0sICAKLSAgICBhZnRlckZpbmlzaEludGVybmFsOiBmdW5jdGlvbihlZmZlY3QpIHsKLSAgICAgIGVmZmVjdC5lbGVtZW50LnVuZG9DbGlwcGluZygpOwotICAgIH0KLSAgfSwgYXJndW1lbnRzWzFdIHx8IHt9KSk7Ci19Ci0KLUVmZmVjdC5Td2l0Y2hPZmYgPSBmdW5jdGlvbihlbGVtZW50KSB7Ci0gIGVsZW1lbnQgPSAkKGVsZW1lbnQpOwotICB2YXIgb2xkT3BhY2l0eSA9IGVsZW1lbnQuZ2V0SW5saW5lT3BhY2l0eSgpOwotICByZXR1cm4gbmV3IEVmZmVjdC5BcHBlYXIoZWxlbWVudCwgT2JqZWN0LmV4dGVuZCh7Ci0gICAgZHVyYXRpb246IDAuNCwKLSAgICBmcm9tOiAwLAotICAgIHRyYW5zaXRpb246IEVmZmVjdC5UcmFuc2l0aW9ucy5mbGlja2VyLAotICAgIGFmdGVyRmluaXNoSW50ZXJuYWw6IGZ1bmN0aW9uKGVmZmVjdCkgewotICAgICAgbmV3IEVmZmVjdC5TY2FsZShlZmZlY3QuZWxlbWVudCwgMSwgeyAKLSAgICAgICAgZHVyYXRpb246IDAuMywgc2NhbGVGcm9tQ2VudGVyOiB0cnVlLAotICAgICAgICBzY2FsZVg6IGZhbHNlLCBzY2FsZUNvbnRlbnQ6IGZhbHNlLCByZXN0b3JlQWZ0ZXJGaW5pc2g6IHRydWUsCi0gICAgICAgIGJlZm9yZVNldHVwOiBmdW5jdGlvbihlZmZlY3QpIHsgCi0gICAgICAgICAgZWZmZWN0LmVsZW1lbnQubWFrZVBvc2l0aW9uZWQoKTsKLSAgICAgICAgICBlZmZlY3QuZWxlbWVudC5tYWtlQ2xpcHBpbmcoKTsKLSAgICAgICAgfSwKLSAgICAgICAgYWZ0ZXJGaW5pc2hJbnRlcm5hbDogZnVuY3Rpb24oZWZmZWN0KSB7Ci0gICAgICAgICAgZWZmZWN0LmVsZW1lbnQuaGlkZSgpOwotICAgICAgICAgIGVmZmVjdC5lbGVtZW50LnVuZG9DbGlwcGluZygpOwotICAgICAgICAgIGVmZmVjdC5lbGVtZW50LnVuZG9Qb3NpdGlvbmVkKCk7Ci0gICAgICAgICAgZWZmZWN0LmVsZW1lbnQuc2V0U3R5bGUoe29wYWNpdHk6IG9sZE9wYWNpdHl9KTsKLSAgICAgICAgfQotICAgICAgfSkKLSAgICB9Ci0gIH0sIGFyZ3VtZW50c1sxXSB8fCB7fSkpOwotfQotCi1FZmZlY3QuRHJvcE91dCA9IGZ1bmN0aW9uKGVsZW1lbnQpIHsKLSAgZWxlbWVudCA9ICQoZWxlbWVudCk7Ci0gIHZhciBvbGRTdHlsZSA9IHsKLSAgICB0b3A6IGVsZW1lbnQuZ2V0U3R5bGUoJ3RvcCcpLAotICAgIGxlZnQ6IGVsZW1lbnQuZ2V0U3R5bGUoJ2xlZnQnKSwKLSAgICBvcGFjaXR5OiBlbGVtZW50LmdldElubGluZU9wYWNpdHkoKSB9OwotICByZXR1cm4gbmV3IEVmZmVjdC5QYXJhbGxlbCgKLSAgICBbIG5ldyBFZmZlY3QuTW92ZShlbGVtZW50LCB7eDogMCwgeTogMTAwLCBzeW5jOiB0cnVlIH0pLCAKLSAgICAgIG5ldyBFZmZlY3QuT3BhY2l0eShlbGVtZW50LCB7IHN5bmM6IHRydWUsIHRvOiAwLjAgfSkgXSwKLSAgICBPYmplY3QuZXh0ZW5kKAotICAgICAgeyBkdXJhdGlvbjogMC41LAotICAgICAgICBiZWZvcmVTZXR1cDogZnVuY3Rpb24oZWZmZWN0KSB7Ci0gICAgICAgICAgZWZmZWN0LmVmZmVjdHNbMF0uZWxlbWVudC5tYWtlUG9zaXRpb25lZCgpOyAKLSAgICAgICAgfSwKLSAgICAgICAgYWZ0ZXJGaW5pc2hJbnRlcm5hbDogZnVuY3Rpb24oZWZmZWN0KSB7Ci0gICAgICAgICAgZWZmZWN0LmVmZmVjdHNbMF0uZWxlbWVudC5oaWRlKCk7Ci0gICAgICAgICAgZWZmZWN0LmVmZmVjdHNbMF0uZWxlbWVudC51bmRvUG9zaXRpb25lZCgpOwotICAgICAgICAgIGVmZmVjdC5lZmZlY3RzWzBdLmVsZW1lbnQuc2V0U3R5bGUob2xkU3R5bGUpOwotICAgICAgICB9IAotICAgICAgfSwgYXJndW1lbnRzWzFdIHx8IHt9KSk7Ci19Ci0KLUVmZmVjdC5TaGFrZSA9IGZ1bmN0aW9uKGVsZW1lbnQpIHsKLSAgZWxlbWVudCA9ICQoZWxlbWVudCk7Ci0gIHZhciBvbGRTdHlsZSA9IHsKLSAgICB0b3A6IGVsZW1lbnQuZ2V0U3R5bGUoJ3RvcCcpLAotICAgIGxlZnQ6IGVsZW1lbnQuZ2V0U3R5bGUoJ2xlZnQnKSB9OwotICAgIHJldHVybiBuZXcgRWZmZWN0Lk1vdmUoZWxlbWVudCwgCi0gICAgICB7IHg6ICAyMCwgeTogMCwgZHVyYXRpb246IDAuMDUsIGFmdGVyRmluaXNoSW50ZXJuYWw6IGZ1bmN0aW9uKGVmZmVjdCkgewotICAgIG5ldyBFZmZlY3QuTW92ZShlZmZlY3QuZWxlbWVudCwKLSAgICAgIHsgeDogLTQwLCB5OiAwLCBkdXJhdGlvbjogMC4xLCAgYWZ0ZXJGaW5pc2hJbnRlcm5hbDogZnVuY3Rpb24oZWZmZWN0KSB7Ci0gICAgbmV3IEVmZmVjdC5Nb3ZlKGVmZmVjdC5lbGVtZW50LAotICAgICAgeyB4OiAgNDAsIHk6IDAsIGR1cmF0aW9uOiAwLjEsICBhZnRlckZpbmlzaEludGVybmFsOiBmdW5jdGlvbihlZmZlY3QpIHsKLSAgICBuZXcgRWZmZWN0Lk1vdmUoZWZmZWN0LmVsZW1lbnQsCi0gICAgICB7IHg6IC00MCwgeTogMCwgZHVyYXRpb246IDAuMSwgIGFmdGVyRmluaXNoSW50ZXJuYWw6IGZ1bmN0aW9uKGVmZmVjdCkgewotICAgIG5ldyBFZmZlY3QuTW92ZShlZmZlY3QuZWxlbWVudCwKLSAgICAgIHsgeDogIDQwLCB5OiAwLCBkdXJhdGlvbjogMC4xLCAgYWZ0ZXJGaW5pc2hJbnRlcm5hbDogZnVuY3Rpb24oZWZmZWN0KSB7Ci0gICAgbmV3IEVmZmVjdC5Nb3ZlKGVmZmVjdC5lbGVtZW50LAotICAgICAgeyB4OiAtMjAsIHk6IDAsIGR1cmF0aW9uOiAwLjA1LCBhZnRlckZpbmlzaEludGVybmFsOiBmdW5jdGlvbihlZmZlY3QpIHsKLSAgICAgICAgZWZmZWN0LmVsZW1lbnQudW5kb1Bvc2l0aW9uZWQoKTsKLSAgICAgICAgZWZmZWN0LmVsZW1lbnQuc2V0U3R5bGUob2xkU3R5bGUpOwotICB9fSkgfX0pIH19KSB9fSkgfX0pIH19KTsKLX0KLQotRWZmZWN0LlNsaWRlRG93biA9IGZ1bmN0aW9uKGVsZW1lbnQpIHsKLSAgZWxlbWVudCA9ICQoZWxlbWVudCk7Ci0gIGVsZW1lbnQuY2xlYW5XaGl0ZXNwYWNlKCk7Ci0gIC8vIFNsaWRlRG93biBuZWVkIHRvIGhhdmUgdGhlIGNvbnRlbnQgb2YgdGhlIGVsZW1lbnQgd3JhcHBlZCBpbiBhIGNvbnRhaW5lciBlbGVtZW50IHdpdGggZml4ZWQgaGVpZ2h0IQotICB2YXIgb2xkSW5uZXJCb3R0b20gPSAkKGVsZW1lbnQuZmlyc3RDaGlsZCkuZ2V0U3R5bGUoJ2JvdHRvbScpOwotICB2YXIgZWxlbWVudERpbWVuc2lvbnMgPSBlbGVtZW50LmdldERpbWVuc2lvbnMoKTsKLSAgcmV0dXJuIG5ldyBFZmZlY3QuU2NhbGUoZWxlbWVudCwgMTAwLCBPYmplY3QuZXh0ZW5kKHsgCi0gICAgc2NhbGVDb250ZW50OiBmYWxzZSwgCi0gICAgc2NhbGVYOiBmYWxzZSwgCi0gICAgc2NhbGVGcm9tOiB3aW5kb3cub3BlcmEgPyAwIDogMSwKLSAgICBzY2FsZU1vZGU6IHtvcmlnaW5hbEhlaWdodDogZWxlbWVudERpbWVuc2lvbnMuaGVpZ2h0LCBvcmlnaW5hbFdpZHRoOiBlbGVtZW50RGltZW5zaW9ucy53aWR0aH0sCi0gICAgcmVzdG9yZUFmdGVyRmluaXNoOiB0cnVlLAotICAgIGFmdGVyU2V0dXA6IGZ1bmN0aW9uKGVmZmVjdCkgewotICAgICAgZWZmZWN0LmVsZW1lbnQubWFrZVBvc2l0aW9uZWQoKTsKLSAgICAgIGVmZmVjdC5lbGVtZW50LmZpcnN0Q2hpbGQubWFrZVBvc2l0aW9uZWQoKTsKLSAgICAgIGlmKHdpbmRvdy5vcGVyYSkgZWZmZWN0LmVsZW1lbnQuc2V0U3R5bGUoe3RvcDogJyd9KTsKLSAgICAgIGVmZmVjdC5lbGVtZW50Lm1ha2VDbGlwcGluZygpOwotICAgICAgZWZmZWN0LmVsZW1lbnQuc2V0U3R5bGUoe2hlaWdodDogJzBweCd9KTsKLSAgICAgIGVmZmVjdC5lbGVtZW50LnNob3coKTsgfSwKLSAgICBhZnRlclVwZGF0ZUludGVybmFsOiBmdW5jdGlvbihlZmZlY3QpIHsKLSAgICAgIGVmZmVjdC5lbGVtZW50LmZpcnN0Q2hpbGQuc2V0U3R5bGUoe2JvdHRvbToKLSAgICAgICAgKGVmZmVjdC5kaW1zWzBdIC0gZWZmZWN0LmVsZW1lbnQuY2xpZW50SGVpZ2h0KSArICdweCcgfSk7IAotICAgIH0sCi0gICAgYWZ0ZXJGaW5pc2hJbnRlcm5hbDogZnVuY3Rpb24oZWZmZWN0KSB7Ci0gICAgICBlZmZlY3QuZWxlbWVudC51bmRvQ2xpcHBpbmcoKTsgCi0gICAgICAvLyBJRSB3aWxsIGNyYXNoIGlmIGNoaWxkIGlzIHVuZG9Qb3NpdGlvbmVkIGZpcnN0Ci0gICAgICBpZigvTVNJRS8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSAmJiAhd2luZG93Lm9wZXJhKXsKLSAgICAgICAgZWZmZWN0LmVsZW1lbnQudW5kb1Bvc2l0aW9uZWQoKTsKLSAgICAgICAgZWZmZWN0LmVsZW1lbnQuZmlyc3RDaGlsZC51bmRvUG9zaXRpb25lZCgpOwotICAgICAgfWVsc2V7Ci0gICAgICAgIGVmZmVjdC5lbGVtZW50LmZpcnN0Q2hpbGQudW5kb1Bvc2l0aW9uZWQoKTsKLSAgICAgICAgZWZmZWN0LmVsZW1lbnQudW5kb1Bvc2l0aW9uZWQoKTsKLSAgICAgIH0KLSAgICAgIGVmZmVjdC5lbGVtZW50LmZpcnN0Q2hpbGQuc2V0U3R5bGUoe2JvdHRvbTogb2xkSW5uZXJCb3R0b219KTsgfQotICAgIH0sIGFyZ3VtZW50c1sxXSB8fCB7fSkKLSAgKTsKLX0KLQotRWZmZWN0LlNsaWRlVXAgPSBmdW5jdGlvbihlbGVtZW50KSB7Ci0gIGVsZW1lbnQgPSAkKGVsZW1lbnQpOwotICBlbGVtZW50LmNsZWFuV2hpdGVzcGFjZSgpOwotICB2YXIgb2xkSW5uZXJCb3R0b20gPSAkKGVsZW1lbnQuZmlyc3RDaGlsZCkuZ2V0U3R5bGUoJ2JvdHRvbScpOwotICByZXR1cm4gbmV3IEVmZmVjdC5TY2FsZShlbGVtZW50LCB3aW5kb3cub3BlcmEgPyAwIDogMSwKLSAgIE9iamVjdC5leHRlbmQoeyBzY2FsZUNvbnRlbnQ6IGZhbHNlLCAKLSAgICBzY2FsZVg6IGZhbHNlLCAKLSAgICBzY2FsZU1vZGU6ICdib3gnLAotICAgIHNjYWxlRnJvbTogMTAwLAotICAgIHJlc3RvcmVBZnRlckZpbmlzaDogdHJ1ZSwKLSAgICBiZWZvcmVTdGFydEludGVybmFsOiBmdW5jdGlvbihlZmZlY3QpIHsKLSAgICAgIGVmZmVjdC5lbGVtZW50Lm1ha2VQb3NpdGlvbmVkKCk7Ci0gICAgICBlZmZlY3QuZWxlbWVudC5maXJzdENoaWxkLm1ha2VQb3NpdGlvbmVkKCk7Ci0gICAgICBpZih3aW5kb3cub3BlcmEpIGVmZmVjdC5lbGVtZW50LnNldFN0eWxlKHt0b3A6ICcnfSk7Ci0gICAgICBlZmZlY3QuZWxlbWVudC5tYWtlQ2xpcHBpbmcoKTsKLSAgICAgIGVmZmVjdC5lbGVtZW50LnNob3coKTsgfSwgIAotICAgIGFmdGVyVXBkYXRlSW50ZXJuYWw6IGZ1bmN0aW9uKGVmZmVjdCkgewotICAgICAgZWZmZWN0LmVsZW1lbnQuZmlyc3RDaGlsZC5zZXRTdHlsZSh7Ym90dG9tOgotICAgICAgICAoZWZmZWN0LmRpbXNbMF0gLSBlZmZlY3QuZWxlbWVudC5jbGllbnRIZWlnaHQpICsgJ3B4JyB9KTsgfSwKLSAgICBhZnRlckZpbmlzaEludGVybmFsOiBmdW5jdGlvbihlZmZlY3QpIHsKLSAgICAgIGVmZmVjdC5lbGVtZW50LmhpZGUoKTsKLSAgICAgIGVmZmVjdC5lbGVtZW50LnVuZG9DbGlwcGluZygpOwotICAgICAgZWZmZWN0LmVsZW1lbnQuZmlyc3RDaGlsZC51bmRvUG9zaXRpb25lZCgpOwotICAgICAgZWZmZWN0LmVsZW1lbnQudW5kb1Bvc2l0aW9uZWQoKTsKLSAgICAgIGVmZmVjdC5lbGVtZW50LnNldFN0eWxlKHtib3R0b206IG9sZElubmVyQm90dG9tfSk7IH0KLSAgIH0sIGFyZ3VtZW50c1sxXSB8fCB7fSkKLSAgKTsKLX0KLQotLy8gQnVnIGluIG9wZXJhIG1ha2VzIHRoZSBURCBjb250YWluaW5nIHRoaXMgZWxlbWVudCBleHBhbmQgZm9yIGEgaW5zdGFuY2UgYWZ0ZXIgZmluaXNoIAotRWZmZWN0LlNxdWlzaCA9IGZ1bmN0aW9uKGVsZW1lbnQpIHsKLSAgcmV0dXJuIG5ldyBFZmZlY3QuU2NhbGUoZWxlbWVudCwgd2luZG93Lm9wZXJhID8gMSA6IDAsIAotICAgIHsgcmVzdG9yZUFmdGVyRmluaXNoOiB0cnVlLAotICAgICAgYmVmb3JlU2V0dXA6IGZ1bmN0aW9uKGVmZmVjdCkgewotICAgICAgICBlZmZlY3QuZWxlbWVudC5tYWtlQ2xpcHBpbmcoZWZmZWN0LmVsZW1lbnQpOyB9LCAgCi0gICAgICBhZnRlckZpbmlzaEludGVybmFsOiBmdW5jdGlvbihlZmZlY3QpIHsKLSAgICAgICAgZWZmZWN0LmVsZW1lbnQuaGlkZShlZmZlY3QuZWxlbWVudCk7IAotICAgICAgICBlZmZlY3QuZWxlbWVudC51bmRvQ2xpcHBpbmcoZWZmZWN0LmVsZW1lbnQpOyB9Ci0gIH0pOwotfQotCi1FZmZlY3QuR3JvdyA9IGZ1bmN0aW9uKGVsZW1lbnQpIHsKLSAgZWxlbWVudCA9ICQoZWxlbWVudCk7Ci0gIHZhciBvcHRpb25zID0gT2JqZWN0LmV4dGVuZCh7Ci0gICAgZGlyZWN0aW9uOiAnY2VudGVyJywKLSAgICBtb3ZlVHJhbnNpdGlvbjogRWZmZWN0LlRyYW5zaXRpb25zLnNpbm9pZGFsLAotICAgIHNjYWxlVHJhbnNpdGlvbjogRWZmZWN0LlRyYW5zaXRpb25zLnNpbm9pZGFsLAotICAgIG9wYWNpdHlUcmFuc2l0aW9uOiBFZmZlY3QuVHJhbnNpdGlvbnMuZnVsbAotICB9LCBhcmd1bWVudHNbMV0gfHwge30pOwotICB2YXIgb2xkU3R5bGUgPSB7Ci0gICAgdG9wOiBlbGVtZW50LnN0eWxlLnRvcCwKLSAgICBsZWZ0OiBlbGVtZW50LnN0eWxlLmxlZnQsCi0gICAgaGVpZ2h0OiBlbGVtZW50LnN0eWxlLmhlaWdodCwKLSAgICB3aWR0aDogZWxlbWVudC5zdHlsZS53aWR0aCwKLSAgICBvcGFjaXR5OiBlbGVtZW50LmdldElubGluZU9wYWNpdHkoKSB9OwotCi0gIHZhciBkaW1zID0gZWxlbWVudC5nZXREaW1lbnNpb25zKCk7ICAgIAotICB2YXIgaW5pdGlhbE1vdmVYLCBpbml0aWFsTW92ZVk7Ci0gIHZhciBtb3ZlWCwgbW92ZVk7Ci0gIAotICBzd2l0Y2ggKG9wdGlvbnMuZGlyZWN0aW9uKSB7Ci0gICAgY2FzZSAndG9wLWxlZnQnOgotICAgICAgaW5pdGlhbE1vdmVYID0gaW5pdGlhbE1vdmVZID0gbW92ZVggPSBtb3ZlWSA9IDA7IAotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAndG9wLXJpZ2h0JzoKLSAgICAgIGluaXRpYWxNb3ZlWCA9IGRpbXMud2lkdGg7Ci0gICAgICBpbml0aWFsTW92ZVkgPSBtb3ZlWSA9IDA7Ci0gICAgICBtb3ZlWCA9IC1kaW1zLndpZHRoOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAnYm90dG9tLWxlZnQnOgotICAgICAgaW5pdGlhbE1vdmVYID0gbW92ZVggPSAwOwotICAgICAgaW5pdGlhbE1vdmVZID0gZGltcy5oZWlnaHQ7Ci0gICAgICBtb3ZlWSA9IC1kaW1zLmhlaWdodDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ2JvdHRvbS1yaWdodCc6Ci0gICAgICBpbml0aWFsTW92ZVggPSBkaW1zLndpZHRoOwotICAgICAgaW5pdGlhbE1vdmVZID0gZGltcy5oZWlnaHQ7Ci0gICAgICBtb3ZlWCA9IC1kaW1zLndpZHRoOwotICAgICAgbW92ZVkgPSAtZGltcy5oZWlnaHQ7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICdjZW50ZXInOgotICAgICAgaW5pdGlhbE1vdmVYID0gZGltcy53aWR0aCAvIDI7Ci0gICAgICBpbml0aWFsTW92ZVkgPSBkaW1zLmhlaWdodCAvIDI7Ci0gICAgICBtb3ZlWCA9IC1kaW1zLndpZHRoIC8gMjsKLSAgICAgIG1vdmVZID0gLWRpbXMuaGVpZ2h0IC8gMjsKLSAgICAgIGJyZWFrOwotICB9Ci0gIAotICByZXR1cm4gbmV3IEVmZmVjdC5Nb3ZlKGVsZW1lbnQsIHsKLSAgICB4OiBpbml0aWFsTW92ZVgsCi0gICAgeTogaW5pdGlhbE1vdmVZLAotICAgIGR1cmF0aW9uOiAwLjAxLCAKLSAgICBiZWZvcmVTZXR1cDogZnVuY3Rpb24oZWZmZWN0KSB7Ci0gICAgICBlZmZlY3QuZWxlbWVudC5oaWRlKCk7Ci0gICAgICBlZmZlY3QuZWxlbWVudC5tYWtlQ2xpcHBpbmcoKTsKLSAgICAgIGVmZmVjdC5lbGVtZW50Lm1ha2VQb3NpdGlvbmVkKCk7Ci0gICAgfSwKLSAgICBhZnRlckZpbmlzaEludGVybmFsOiBmdW5jdGlvbihlZmZlY3QpIHsKLSAgICAgIG5ldyBFZmZlY3QuUGFyYWxsZWwoCi0gICAgICAgIFsgbmV3IEVmZmVjdC5PcGFjaXR5KGVmZmVjdC5lbGVtZW50LCB7IHN5bmM6IHRydWUsIHRvOiAxLjAsIGZyb206IDAuMCwgdHJhbnNpdGlvbjogb3B0aW9ucy5vcGFjaXR5VHJhbnNpdGlvbiB9KSwKLSAgICAgICAgICBuZXcgRWZmZWN0Lk1vdmUoZWZmZWN0LmVsZW1lbnQsIHsgeDogbW92ZVgsIHk6IG1vdmVZLCBzeW5jOiB0cnVlLCB0cmFuc2l0aW9uOiBvcHRpb25zLm1vdmVUcmFuc2l0aW9uIH0pLAotICAgICAgICAgIG5ldyBFZmZlY3QuU2NhbGUoZWZmZWN0LmVsZW1lbnQsIDEwMCwgewotICAgICAgICAgICAgc2NhbGVNb2RlOiB7IG9yaWdpbmFsSGVpZ2h0OiBkaW1zLmhlaWdodCwgb3JpZ2luYWxXaWR0aDogZGltcy53aWR0aCB9LCAKLSAgICAgICAgICAgIHN5bmM6IHRydWUsIHNjYWxlRnJvbTogd2luZG93Lm9wZXJhID8gMSA6IDAsIHRyYW5zaXRpb246IG9wdGlvbnMuc2NhbGVUcmFuc2l0aW9uLCByZXN0b3JlQWZ0ZXJGaW5pc2g6IHRydWV9KQotICAgICAgICBdLCBPYmplY3QuZXh0ZW5kKHsKLSAgICAgICAgICAgICBiZWZvcmVTZXR1cDogZnVuY3Rpb24oZWZmZWN0KSB7Ci0gICAgICAgICAgICAgICBlZmZlY3QuZWZmZWN0c1swXS5lbGVtZW50LnNldFN0eWxlKHtoZWlnaHQ6ICcwcHgnfSk7Ci0gICAgICAgICAgICAgICBlZmZlY3QuZWZmZWN0c1swXS5lbGVtZW50LnNob3coKTsgCi0gICAgICAgICAgICAgfSwKLSAgICAgICAgICAgICBhZnRlckZpbmlzaEludGVybmFsOiBmdW5jdGlvbihlZmZlY3QpIHsKLSAgICAgICAgICAgICAgIGVmZmVjdC5lZmZlY3RzWzBdLmVsZW1lbnQudW5kb0NsaXBwaW5nKCk7Ci0gICAgICAgICAgICAgICBlZmZlY3QuZWZmZWN0c1swXS5lbGVtZW50LnVuZG9Qb3NpdGlvbmVkKCk7Ci0gICAgICAgICAgICAgICBlZmZlY3QuZWZmZWN0c1swXS5lbGVtZW50LnNldFN0eWxlKG9sZFN0eWxlKTsgCi0gICAgICAgICAgICAgfQotICAgICAgICAgICB9LCBvcHRpb25zKQotICAgICAgKQotICAgIH0KLSAgfSk7Ci19Ci0KLUVmZmVjdC5TaHJpbmsgPSBmdW5jdGlvbihlbGVtZW50KSB7Ci0gIGVsZW1lbnQgPSAkKGVsZW1lbnQpOwotICB2YXIgb3B0aW9ucyA9IE9iamVjdC5leHRlbmQoewotICAgIGRpcmVjdGlvbjogJ2NlbnRlcicsCi0gICAgbW92ZVRyYW5zaXRpb246IEVmZmVjdC5UcmFuc2l0aW9ucy5zaW5vaWRhbCwKLSAgICBzY2FsZVRyYW5zaXRpb246IEVmZmVjdC5UcmFuc2l0aW9ucy5zaW5vaWRhbCwKLSAgICBvcGFjaXR5VHJhbnNpdGlvbjogRWZmZWN0LlRyYW5zaXRpb25zLm5vbmUKLSAgfSwgYXJndW1lbnRzWzFdIHx8IHt9KTsKLSAgdmFyIG9sZFN0eWxlID0gewotICAgIHRvcDogZWxlbWVudC5zdHlsZS50b3AsCi0gICAgbGVmdDogZWxlbWVudC5zdHlsZS5sZWZ0LAotICAgIGhlaWdodDogZWxlbWVudC5zdHlsZS5oZWlnaHQsCi0gICAgd2lkdGg6IGVsZW1lbnQuc3R5bGUud2lkdGgsCi0gICAgb3BhY2l0eTogZWxlbWVudC5nZXRJbmxpbmVPcGFjaXR5KCkgfTsKLQotICB2YXIgZGltcyA9IGVsZW1lbnQuZ2V0RGltZW5zaW9ucygpOwotICB2YXIgbW92ZVgsIG1vdmVZOwotICAKLSAgc3dpdGNoIChvcHRpb25zLmRpcmVjdGlvbikgewotICAgIGNhc2UgJ3RvcC1sZWZ0JzoKLSAgICAgIG1vdmVYID0gbW92ZVkgPSAwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAndG9wLXJpZ2h0JzoKLSAgICAgIG1vdmVYID0gZGltcy53aWR0aDsKLSAgICAgIG1vdmVZID0gMDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ2JvdHRvbS1sZWZ0JzoKLSAgICAgIG1vdmVYID0gMDsKLSAgICAgIG1vdmVZID0gZGltcy5oZWlnaHQ7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICdib3R0b20tcmlnaHQnOgotICAgICAgbW92ZVggPSBkaW1zLndpZHRoOwotICAgICAgbW92ZVkgPSBkaW1zLmhlaWdodDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ2NlbnRlcic6ICAKLSAgICAgIG1vdmVYID0gZGltcy53aWR0aCAvIDI7Ci0gICAgICBtb3ZlWSA9IGRpbXMuaGVpZ2h0IC8gMjsKLSAgICAgIGJyZWFrOwotICB9Ci0gIAotICByZXR1cm4gbmV3IEVmZmVjdC5QYXJhbGxlbCgKLSAgICBbIG5ldyBFZmZlY3QuT3BhY2l0eShlbGVtZW50LCB7IHN5bmM6IHRydWUsIHRvOiAwLjAsIGZyb206IDEuMCwgdHJhbnNpdGlvbjogb3B0aW9ucy5vcGFjaXR5VHJhbnNpdGlvbiB9KSwKLSAgICAgIG5ldyBFZmZlY3QuU2NhbGUoZWxlbWVudCwgd2luZG93Lm9wZXJhID8gMSA6IDAsIHsgc3luYzogdHJ1ZSwgdHJhbnNpdGlvbjogb3B0aW9ucy5zY2FsZVRyYW5zaXRpb24sIHJlc3RvcmVBZnRlckZpbmlzaDogdHJ1ZX0pLAotICAgICAgbmV3IEVmZmVjdC5Nb3ZlKGVsZW1lbnQsIHsgeDogbW92ZVgsIHk6IG1vdmVZLCBzeW5jOiB0cnVlLCB0cmFuc2l0aW9uOiBvcHRpb25zLm1vdmVUcmFuc2l0aW9uIH0pCi0gICAgXSwgT2JqZWN0LmV4dGVuZCh7ICAgICAgICAgICAgCi0gICAgICAgICBiZWZvcmVTdGFydEludGVybmFsOiBmdW5jdGlvbihlZmZlY3QpIHsKLSAgICAgICAgICAgZWZmZWN0LmVmZmVjdHNbMF0uZWxlbWVudC5tYWtlUG9zaXRpb25lZCgpOwotICAgICAgICAgICBlZmZlY3QuZWZmZWN0c1swXS5lbGVtZW50Lm1ha2VDbGlwcGluZygpOyB9LAotICAgICAgICAgYWZ0ZXJGaW5pc2hJbnRlcm5hbDogZnVuY3Rpb24oZWZmZWN0KSB7Ci0gICAgICAgICAgIGVmZmVjdC5lZmZlY3RzWzBdLmVsZW1lbnQuaGlkZSgpOwotICAgICAgICAgICBlZmZlY3QuZWZmZWN0c1swXS5lbGVtZW50LnVuZG9DbGlwcGluZygpOwotICAgICAgICAgICBlZmZlY3QuZWZmZWN0c1swXS5lbGVtZW50LnVuZG9Qb3NpdGlvbmVkKCk7Ci0gICAgICAgICAgIGVmZmVjdC5lZmZlY3RzWzBdLmVsZW1lbnQuc2V0U3R5bGUob2xkU3R5bGUpOyB9Ci0gICAgICAgfSwgb3B0aW9ucykKLSAgKTsKLX0KLQotRWZmZWN0LlB1bHNhdGUgPSBmdW5jdGlvbihlbGVtZW50KSB7Ci0gIGVsZW1lbnQgPSAkKGVsZW1lbnQpOwotICB2YXIgb3B0aW9ucyAgICA9IGFyZ3VtZW50c1sxXSB8fCB7fTsKLSAgdmFyIG9sZE9wYWNpdHkgPSBlbGVtZW50LmdldElubGluZU9wYWNpdHkoKTsKLSAgdmFyIHRyYW5zaXRpb24gPSBvcHRpb25zLnRyYW5zaXRpb24gfHwgRWZmZWN0LlRyYW5zaXRpb25zLnNpbm9pZGFsOwotICB2YXIgcmV2ZXJzZXIgICA9IGZ1bmN0aW9uKHBvcyl7IHJldHVybiB0cmFuc2l0aW9uKDEtRWZmZWN0LlRyYW5zaXRpb25zLnB1bHNlKHBvcykpIH07Ci0gIHJldmVyc2VyLmJpbmQodHJhbnNpdGlvbik7Ci0gIHJldHVybiBuZXcgRWZmZWN0Lk9wYWNpdHkoZWxlbWVudCwgCi0gICAgT2JqZWN0LmV4dGVuZChPYmplY3QuZXh0ZW5kKHsgIGR1cmF0aW9uOiAzLjAsIGZyb206IDAsCi0gICAgICBhZnRlckZpbmlzaEludGVybmFsOiBmdW5jdGlvbihlZmZlY3QpIHsgZWZmZWN0LmVsZW1lbnQuc2V0U3R5bGUoe29wYWNpdHk6IG9sZE9wYWNpdHl9KTsgfQotICAgIH0sIG9wdGlvbnMpLCB7dHJhbnNpdGlvbjogcmV2ZXJzZXJ9KSk7Ci19Ci0KLUVmZmVjdC5Gb2xkID0gZnVuY3Rpb24oZWxlbWVudCkgewotICBlbGVtZW50ID0gJChlbGVtZW50KTsKLSAgdmFyIG9sZFN0eWxlID0gewotICAgIHRvcDogZWxlbWVudC5zdHlsZS50b3AsCi0gICAgbGVmdDogZWxlbWVudC5zdHlsZS5sZWZ0LAotICAgIHdpZHRoOiBlbGVtZW50LnN0eWxlLndpZHRoLAotICAgIGhlaWdodDogZWxlbWVudC5zdHlsZS5oZWlnaHQgfTsKLSAgRWxlbWVudC5tYWtlQ2xpcHBpbmcoZWxlbWVudCk7Ci0gIHJldHVybiBuZXcgRWZmZWN0LlNjYWxlKGVsZW1lbnQsIDUsIE9iamVjdC5leHRlbmQoeyAgIAotICAgIHNjYWxlQ29udGVudDogZmFsc2UsCi0gICAgc2NhbGVYOiBmYWxzZSwKLSAgICBhZnRlckZpbmlzaEludGVybmFsOiBmdW5jdGlvbihlZmZlY3QpIHsKLSAgICBuZXcgRWZmZWN0LlNjYWxlKGVsZW1lbnQsIDEsIHsgCi0gICAgICBzY2FsZUNvbnRlbnQ6IGZhbHNlLCAKLSAgICAgIHNjYWxlWTogZmFsc2UsCi0gICAgICBhZnRlckZpbmlzaEludGVybmFsOiBmdW5jdGlvbihlZmZlY3QpIHsKLSAgICAgICAgZWZmZWN0LmVsZW1lbnQuaGlkZSgpOwotICAgICAgICBlZmZlY3QuZWxlbWVudC51bmRvQ2xpcHBpbmcoKTsgCi0gICAgICAgIGVmZmVjdC5lbGVtZW50LnNldFN0eWxlKG9sZFN0eWxlKTsKLSAgICAgIH0gfSk7Ci0gIH19LCBhcmd1bWVudHNbMV0gfHwge30pKTsKLX07Ci0KLVsnc2V0T3BhY2l0eScsJ2dldE9wYWNpdHknLCdnZXRJbmxpbmVPcGFjaXR5JywnZm9yY2VSZXJlbmRlcmluZycsJ3NldENvbnRlbnRab29tJywKLSAnY29sbGVjdFRleHROb2RlcycsJ2NvbGxlY3RUZXh0Tm9kZXNJZ25vcmVDbGFzcycsJ2NoaWxkcmVuV2l0aENsYXNzTmFtZSddLmVhY2goIAotICBmdW5jdGlvbihmKSB7IEVsZW1lbnQuTWV0aG9kc1tmXSA9IEVsZW1lbnRbZl07IH0KLSk7Ci0KLUVsZW1lbnQuTWV0aG9kcy52aXN1YWxFZmZlY3QgPSBmdW5jdGlvbihlbGVtZW50LCBlZmZlY3QsIG9wdGlvbnMpIHsKLSAgcyA9IGVmZmVjdC5nc3ViKC9fLywgJy0nKS5jYW1lbGl6ZSgpOwotICBlZmZlY3RfY2xhc3MgPSBzLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgcy5zdWJzdHJpbmcoMSk7Ci0gIG5ldyBFZmZlY3RbZWZmZWN0X2NsYXNzXShlbGVtZW50LCBvcHRpb25zKTsKLSAgcmV0dXJuICQoZWxlbWVudCk7Ci19OwotCi1FbGVtZW50LmFkZE1ldGhvZHMoKTsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy9zY3JpcHRzL2dsb2JhbC5qcyBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL3NjcmlwdHMvZ2xvYmFsLmpzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZDA2ODdkLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL3NjcmlwdHMvZ2xvYmFsLmpzCisrKyAvZGV2L251bGwKQEAgLTEsMzQyICswLDAgQEAKLWZ1bmN0aW9uIHBvcFVwKHVybCkgewotCXdpbmRvdy5vcGVuKHVybCwicmVkUmVmIiwiaGVpZ2h0PTYwMCx3aWR0aD01NTAsY2hhbm5lbG1vZGU9MCxkZXBlbmRlbnQ9MCxkaXJlY3Rvcmllcz0wLGZ1bGxzY3JlZW49MCxsb2NhdGlvbj0wLG1lbnViYXI9MCwiICsgInJlc2l6YWJsZT0wLHNjcm9sbGJhcnM9MSxzdGF0dXM9MSx0b29sYmFyPTAiKTsKLX0KLQotZnVuY3Rpb24gdG9nZ2xlSGVscChzaG93LGhpZGUsYmxvY2spIHsKLQlpZiAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYmxvY2spLnN0eWxlLmRpc3BsYXkgPT0gIm5vbmUiKSB7Ci0JCWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHNob3cpLnN0eWxlLmRpc3BsYXkgID0gIm5vbmUiOwotCQlkb2N1bWVudC5nZXRFbGVtZW50QnlJZChoaWRlKS5zdHlsZS5kaXNwbGF5ID0gImlubGluZSI7Ci0JICAgIG5ldyBFZmZlY3QuQmxpbmREb3duKGJsb2NrLCB7ZHVyYXRpb246IDAuNCwKLQkgICAgICBhZnRlckZpbmlzaDogZnVuY3Rpb24oKSB7Ci0JICAgICAgICBFbGVtZW50LnVuZG9DbGlwcGluZyhibG9jayk7Ci0JICAgICAgICAkKGJsb2NrKS5zdHlsZS53aWR0aCA9ICJhdXRvIjsKLQkgICAgICAgICQoYmxvY2spLnN0eWxlLmhlaWdodCA9ICJhdXRvIjsKLQkgICAgICB9fSkKLQl9IGVsc2UgewotCQlkb2N1bWVudC5nZXRFbGVtZW50QnlJZChzaG93KS5zdHlsZS5kaXNwbGF5ICA9ICJpbmxpbmUiOwotCQlkb2N1bWVudC5nZXRFbGVtZW50QnlJZChoaWRlKS5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOwotCSAgICBuZXcgRWZmZWN0LkJsaW5kVXAoYmxvY2ssIHtkdXJhdGlvbjogMC40LAotCSAgICAgIGFmdGVyRmluaXNoOiBmdW5jdGlvbigpIHsKLQkgICAgICAgIEVsZW1lbnQudW5kb0NsaXBwaW5nKGJsb2NrKTsKLQkgICAgICAgIEVsZW1lbnQuaGlkZShibG9jayk7Ci0JICAgICAgfX0pCi0JfQotfQotCi1mdW5jdGlvbiBuZXdQYWdlKHdlYl9hZGRyZXNzKSB7Ci0JaWYgKHZhbCA9IHByb21wdCgiRW50ZXIgdGhlIG5hbWUgb2YgdGhlIHBhZ2UgeW91IHdvdWxkIGxpa2UgdG8gY3JlYXRlOiIsICIiKSkgewotCQlkb2N1bWVudC5sb2NhdGlvbiA9ICIvIiArIHdlYl9hZGRyZXNzICsgIi9wYWdlL25ldy8iICsgZW5jb2RlVVJJQ29tcG9uZW50KHZhbCk7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlyZXR1cm4gZmFsc2U7Ci19Ci0KLWZ1bmN0aW9uIG5ld0xpc3Qod2ViX2FkZHJlc3MsIHBhZ2VfaWQpIHsKLQlpZiAodmFsID0gcHJvbXB0KCJFbnRlciB0aGUgbmFtZSBvZiB0aGUgdGFzayBsaXN0IHlvdSB3b3VsZCBsaWtlIHRvIGNyZWF0ZToiLCAiIikpIHsKLQkJbmV3IEFqYXguUmVxdWVzdCgnLycgKyB3ZWJfYWRkcmVzcyArICcvdGFza3MvY3JlYXRlLycgKyBwYWdlX2lkICsgJz90aXRsZT0nICsgZW5jb2RlVVJJQ29tcG9uZW50KHZhbCksIHthc3luY2hyb25vdXM6dHJ1ZSwgZXZhbFNjcmlwdHM6dHJ1ZX0pOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcmV0dXJuIGZhbHNlOwotfQotCi1mdW5jdGlvbiB0b2dnbGVUYWdzKCkgewotCXZhciBlbGVtZW50cyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2Rpc3BsYXlfdGFnJyk7Ci0KLQlmb3IodmFyIGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLSAJCWlmIChlbGVtZW50c1tpXS5zdHlsZS5kaXNwbGF5ID09ICJub25lIikgewotCQkJZWxlbWVudHNbaV0uc3R5bGUuZGlzcGxheSA9ICJibG9jayI7Ci0JCX0gZWxzZSB7Ci0JCQllbGVtZW50c1tpXS5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOwotCQl9Ci0JfQkKLX0KLQotZnVuY3Rpb24gaGlkZUJ5Q2xhc3MoY2xhKSB7Ci0JdmFyIGVsZW1lbnRzID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShjbGEpOwotCQotCWZvcih2YXIgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgewotCQllbGVtZW50c1tpXS5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOwotCX0JCi19Ci0KLWZ1bmN0aW9uIHNob3dCeUNsYXNzKGNsYSkgewotCXZhciBlbGVtZW50cyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoY2xhKTsKLQkKLQlmb3IodmFyIGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJZWxlbWVudHNbaV0uc3R5bGUuZGlzcGxheSA9ICJibG9jayI7Ci0JfQkKLX0KLQotZnVuY3Rpb24gdG9nZ2xlQnlDbGFzcyhjbGEpIHsKLQl2YXIgZWxlbWVudHMgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKGNsYSk7Ci0JCi0JZm9yKHZhciBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0gCQlpZiAoZWxlbWVudHNbaV0uc3R5bGUuZGlzcGxheSA9PSAibm9uZSIpIHsKLQkJCW5ldyBFZmZlY3QuQXBwZWFyKGVsZW1lbnRzW2ldKTsKLQkJfSBlbHNlIHsKLQkJCW5ldyBFZmZlY3QuRmFkZShlbGVtZW50c1tpXSk7Ci0JCX0KLQl9CQotfQotCi0vLyBNYWtlIHN1cmUgdGhleSBhcmUgYWxsIHNldCB0byB0aGUgc2FtZS4gIENhbGxlZCBhZnRlciBjcmVhdGluZyBhIG5ldyBpdGVtLCBhbW9uZyBvdGhlciBwbGFjZXMuCi1mdW5jdGlvbiBjaGVja1RvZ2dsZVN5bmMoY2xhLCBjaGVja19pZCkgewotCXZhciBlbGVtZW50cyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoY2xhKTsKLQotCS8vIGdyYWIgdGhlIGZpcnN0IGVsZW1lbnQuCi0JaWYgKGVsZW1lbnRzWzBdLnN0eWxlLmRpc3BsYXkgPT0gIm5vbmUiKSB7Ci0JCW5ldyBFZmZlY3QuRmFkZShjaGVja19pZCk7Ci0JfSBlbHNlIHsKLQkJbmV3IEVmZmVjdC5BcHBlYXIoY2hlY2tfaWQpOwotCX0KLQotfQotCi1mdW5jdGlvbiByZW9yZGVyKGlkLCByZXF1ZXN0X2FkZHIpIHsKLQlpZiAoJCgndGFza19saXN0XycgKyBpZCArICdfcmVvcmRlcicpLnN0eWxlLmRpc3BsYXkgPT0gJ25vbmUnKSB7Ci0JCUVsZW1lbnQuc2hvdygndGFza19saXN0XycgKyBpZCArICdfcmVvcmRlcicpOwotCQlFbGVtZW50LmhpZGUoJ3Rhc2tfbGlzdF8nICsgaWQgKyAnX21hc3Rlcl9jb21wbGV0ZWQnKTsKLQkJRWxlbWVudC5oaWRlKCdtYXN0ZXJfYWRkX2l0ZW1fJyArIGlkKTsKLQkJZm9yICh2YXIgaSA9IDA7ICQoJ3Rhc2tfbGlzdF8nICsgaWQgKyAnX2l0ZW1zJykuY2hpbGROb2Rlc1tpXTsgaSsrKSB7Ci0JCQlFbGVtZW50LmFkZENsYXNzTmFtZSgkKCd0YXNrX2xpc3RfJyArIGlkICsgJ19pdGVtcycpLmNoaWxkTm9kZXNbaV0uaWQsICdSZW9yZGVyTGlzdCcpOwotCQl9Ci0KLQkJU29ydGFibGUuY3JlYXRlKCd0YXNrX2xpc3RfJyArIGlkICsgJ19pdGVtcycsIHtvblVwZGF0ZTpmdW5jdGlvbigpe25ldyBBamF4LlJlcXVlc3QocmVxdWVzdF9hZGRyLCB7YXN5bmNocm9ub3VzOnRydWUsIGV2YWxTY3JpcHRzOnRydWUsIG9uQ29tcGxldGU6ZnVuY3Rpb24ocmVxdWVzdCl7bmV3IEVmZmVjdC5IaWdobGlnaHQoJ3Rhc2tfbGlzdF8nICsgaWQgKyAnX2l0ZW1zJyx7fSk7fSwgcGFyYW1ldGVyczpTb3J0YWJsZS5zZXJpYWxpemUoJ3Rhc2tfbGlzdF8nICsgaWQgKyAnX2l0ZW1zJyl9KX19KQotCX0gZWxzZSB7Ci0JCUVsZW1lbnQuaGlkZSgndGFza19saXN0XycgKyBpZCArICdfcmVvcmRlcicpOwotCi0JCUVsZW1lbnQuc2hvdygndGFza19saXN0XycgKyBpZCArICdfbWFzdGVyX2NvbXBsZXRlZCcpOwotCQlFbGVtZW50LnNob3coJ21hc3Rlcl9hZGRfaXRlbV8nICsgaWQpOwotCQlmb3IgKHZhciBpID0gMDsgJCgndGFza19saXN0XycgKyBpZCArICdfaXRlbXMnKS5jaGlsZE5vZGVzW2ldOyBpKyspIHsKLQkJCUVsZW1lbnQucmVtb3ZlQ2xhc3NOYW1lKCQoJ3Rhc2tfbGlzdF8nICsgaWQgKyAnX2l0ZW1zJykuY2hpbGROb2Rlc1tpXS5pZCwgJ1Jlb3JkZXJMaXN0Jyk7Ci0JCX0KLQotCQlTb3J0YWJsZS5kZXN0cm95KCd0YXNrX2xpc3RfJyArIGlkICsgJ19pdGVtcycpOwotCX0KLX0KLQotdmFyIHRhc2tFZGl0b3JzID0ge307Ci1mdW5jdGlvbiBlZGl0X3Rhc2tzKGlkLCByZXF1ZXN0X2FkZHIpIHsKLQlpZiAoJCgndGFza19saXN0XycgKyBpZCArICdfZWRpdCcpLnN0eWxlLmRpc3BsYXkgPT0gJ25vbmUnKSB7Ci0JCUVsZW1lbnQuc2hvdygndGFza19saXN0XycgKyBpZCArICdfZWRpdCcpOwotCQlFbGVtZW50LmhpZGUoJ3Rhc2tfbGlzdF8nICsgaWQgKyAnX21hc3Rlcl9jb21wbGV0ZWQnKTsKLQkJRWxlbWVudC5oaWRlKCdtYXN0ZXJfYWRkX2l0ZW1fJyArIGlkKTsKLQotCQlmb3IgKHZhciBpID0gMDsgJCgndGFza19saXN0XycgKyBpZCArICdfaXRlbXMnKS5jaGlsZE5vZGVzW2ldOyBpKyspIHsKLQkJCWlmICgkKCd0YXNrX2xpc3RfJyArIGlkICsgJ19pdGVtcycpLmNoaWxkTm9kZXNbaV0uaWQpIHsKLQkJCQl0YXNrRWRpdG9yc1tpXSA9IG5ldyBBamF4LkluUGxhY2VFZGl0b3IoJCgndGFza19saXN0XycgKyBpZCArICdfaXRlbXMnKS5jaGlsZE5vZGVzW2ldLmlkICsgJ19jb250ZW50JywgJy8nICsgcmVxdWVzdF9hZGRyICsgJy90YXNrcy9zZXRfdGFza19pdGVtX2NvbnRlbnQvJyArICQoJ3Rhc2tfbGlzdF8nICsgaWQgKyAnX2l0ZW1zJykuY2hpbGROb2Rlc1tpXS5pZCwge2xvYWRUZXh0VVJMOicvJyArIHJlcXVlc3RfYWRkciArICcvdGFza3MvdGFza19pdGVtX2NvbnRlbnRfdW5mb3JtYXR0ZWRfdGV4dC8nICsgJCgndGFza19saXN0XycgKyBpZCArICdfaXRlbXMnKS5jaGlsZE5vZGVzW2ldLmlkfSkKLQkJCX0KLQkJfQotCX0gZWxzZSB7Ci0JCUVsZW1lbnQuaGlkZSgndGFza19saXN0XycgKyBpZCArICdfZWRpdCcpOwotCQlFbGVtZW50LnNob3coJ3Rhc2tfbGlzdF8nICsgaWQgKyAnX21hc3Rlcl9jb21wbGV0ZWQnKTsKLQkJRWxlbWVudC5zaG93KCdtYXN0ZXJfYWRkX2l0ZW1fJyArIGlkKTsKLQotCQlmb3IgKHZhciBpID0gMDsgJCgndGFza19saXN0XycgKyBpZCArICdfaXRlbXMnKS5jaGlsZE5vZGVzW2ldOyBpKyspIHsKLQkJCWlmICgkKCd0YXNrX2xpc3RfJyArIGlkICsgJ19pdGVtcycpLmNoaWxkTm9kZXNbaV0uaWQpIHsKLQkJCQl0YXNrRWRpdG9yc1tpXS5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci19Ci0KLWZ1bmN0aW9uIHRvZ2dsZUxpc3REZXRhaWwoKSB7Ci0JdmFyIGNvbXBsID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnQ29tcGxldGVkQnlsaW5lJyk7Ci0JdmFyIGFjdCA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ0FkZGVkQnlsaW5lJyk7Ci0JdmFyIHlheSA9IG5ldyBEYXRlKCk7Ci0KLQl5YXkuc2V0VGltZShEYXRlLnBhcnNlKCdNYXJjaCwgMTUgMjAwOCAwNzowNDoxMScpKTsKLQotCWlmIChjb21wbC5sZW5ndGggIT0gMCkgewotCQlpZiAoY29tcGxbMF0uc3R5bGUuZGlzcGxheSA9PSAnbm9uZScpIHsKLQkJCXNldENvb2tpZSgnc2hvd19saXN0X2RldGFpbCcsICdmYWxzZScsIHlheSk7Ci0JCX0gZWxzZSB7Ci0JCQlzZXRDb29raWUoJ3Nob3dfbGlzdF9kZXRhaWwnLCAndHJ1ZScsIHlheSk7Ci0JCX0KLQl9IGVsc2UgaWYgKGFjdC5sZW5ndGggIT0gMCkgewotCQlpZiAoYWN0WzBdLnN0eWxlLmRpc3BsYXkgPT0gJ25vbmUnKSB7Ci0JCQlzZXRDb29raWUoJ3Nob3dfbGlzdF9kZXRhaWwnLCAnZmFsc2UnLCB5YXkpOwotCQl9IGVsc2UgewotCQkJc2V0Q29va2llKCdzaG93X2xpc3RfZGV0YWlsJywgJ3RydWUnLCB5YXkpOwotCQl9Ci0JfQotfQotCi1mdW5jdGlvbiBqdW1wdG8oeCl7Ci0JZG9jdW1lbnQubG9jYXRpb24uaHJlZiA9IHg7Ci19Ci0KLWZ1bmN0aW9uIHRvZ2dsZVdpa2lzKCkgewotCWlmIChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgid2lraUxpc3QiKS5zdHlsZS5kaXNwbGF5ID09ICJub25lIikgewotCQlkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgid2lraUxpc3QiKS5zdHlsZS5kaXNwbGF5ICA9ICJibG9jayI7Ci0JCWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJzaG93X3dpa2lfbGlzdCIpLnN0eWxlLmRpc3BsYXkgID0gIm5vbmUiOwotCQlkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiaGlkZV93aWtpX2xpc3QiKS5zdHlsZS5kaXNwbGF5ID0gImlubGluZSI7Ci0JfSBlbHNlIHsKLQkJZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIndpa2lMaXN0Iikuc3R5bGUuZGlzcGxheSAgPSAibm9uZSI7Ci0JCWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJzaG93X3dpa2lfbGlzdCIpLnN0eWxlLmRpc3BsYXkgID0gImlubGluZSI7Ci0JCWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJoaWRlX3dpa2lfbGlzdCIpLnN0eWxlLmRpc3BsYXkgPSAibm9uZSI7Ci0JfQotCQotfQotCi1mdW5jdGlvbiBzaG93VHJhc2hJY29uKGFzc2V0X2lkKSB7Ci0JaWYgKCFEcmFnZ2FibGVzLmFjdGl2ZURyYWdnYWJsZSkgewotCQlFbGVtZW50LnNob3coYXNzZXRfaWQpOwotCX0KLX0KLQotZnVuY3Rpb24gaGlkZVRyYXNoSWNvbihhc3NldF9pZCkgewotCUVsZW1lbnQuaGlkZShhc3NldF9pZCk7Ci19Ci0KLWZ1bmN0aW9uIHNob3dSZXN0b3JlSWNvbihhc3NldF9pZCkgewotCUVsZW1lbnQuc2hvdygnbGlzdF9yZXN0b3JlX2ljb25fJyArIGFzc2V0X2lkKTsKLX0KLQotZnVuY3Rpb24gaGlkZVJlc3RvcmVJY29uKGFzc2V0X2lkKSB7Ci0JRWxlbWVudC5oaWRlKCdsaXN0X3Jlc3RvcmVfaWNvbl8nICsgYXNzZXRfaWQpOwotfQotCi12YXIgdHJhc2hIaWdobGlnaHRzID0gbmV3IEFycmF5KCk7Ci12YXIgbGlzdEhpZ2hsaWdodHMgPSBuZXcgQXJyYXkoKTsKLXZhciBpY29uSGlnaGxpZ2h0cyA9IG5ldyBBcnJheSgpOwotCi1mdW5jdGlvbiB3YWl0VG9IaWdobGlnaHQod2hhdCwgYXNzZXRfaWQpIHsKLQl3aGF0W3doYXQubGVuZ3RoXSA9IGFzc2V0X2lkOwotfQotCi1mdW5jdGlvbiBydW5IaWdobGlnaHRzKHdoYXQpIHsKLQlpZiAod2hhdC5sZW5ndGggPT0gMCkgewotCQlyZXR1cm47Ci0JfQotCQotCWZvciAodmFyIGkgPSAwOyBpIDwgd2hhdC5sZW5ndGg7IGkrKykgewotCQluZXcgRWZmZWN0LkhpZ2hsaWdodCh3aGF0W2ldLCB7ZHVyYXRpb246IDV9KTsKLQl9Ci0KLQkkQSh3aGF0KS5jbGVhcigpOwotfQotCi1mdW5jdGlvbiBjb3VudHJ5U2VsZWN0KHZhbHVlKSB7Ci0JaWYgKHZhbHVlID09ICdVUycpIHsKLQkJCi0JfSBlbHNlIGlmICh2YWx1ZSA9PSAnQ0EnKSB7Ci0JCUVsZW1lbnQuaGlkZSgnYWNjb3VudF9zdGF0ZScpOwotCQlFbGVtZW50LnNob3coJ2FjY291bnRfcHJvdmluY2UnKTsKLQl9IGVsc2UgewotCQlFZmZlY3QuQXBwZWFyKCdJbnRsTWVzc2FnZScpOwotCQkkKCdjaXR5X2lucHV0X3RleHQnKS5pbm5lckhUTUwgPSAnQ2l0eSAvIE11bmljaXBhbGl0eSc7Ci0JfQotfQotCi1mdW5jdGlvbiBVcGRhdGVBbW91bnRzKHBsYW4sIHBlcmlvZCkgewotCWlmIChwbGFuID09ICdGcmVlJykgewotCQl2YXIgYW1vdW50ID0gIjAuMDAiOwotCX0gZWxzZSBpZiAocGxhbiA9PSAnUGVyc29uYWwnKSB7Ci0JCXZhciBhbW91bnQgPSAiNC45NSI7Ci0JfSBlbHNlIGlmIChwbGFuID09ICdQb3dlcicpIHsKLQkJdmFyIGFtb3VudCA9ICI5Ljk1IjsKLQl9IGVsc2UgaWYgKHBsYW4gPT0gJ1RlYW0nKSB7Ci0JCXZhciBhbW91bnQgPSAiMTQuOTUiOwotCX0gZWxzZSB7Ci0JCXZhciBhbW91bnQgPSAiTm9XYXkiOwotCX0KLQotCXN3aXRjaChwZXJpb2QpIHsKLQkJY2FzZSAnTW9udGhseSc6IHZhciByZXR2YWwgPSAiJCIgKyBhbW91bnQgKyAiL21vbnRoIjsgYnJlYWsKLQkJY2FzZSAnSGFsZlllYXInOiB2YXIgcmV0dmFsID0gIiQiICsgKChhbW91bnQqNiktYW1vdW50KS50b0ZpeGVkKDIpOyByZXR2YWwgKz0gIi9oYWxmLXllYXIiOyBicmVhayAKLQkJY2FzZSAnWWVhcmx5JzogdmFyIHJldHZhbCA9ICIkIiArICgoYW1vdW50KjEyKS0oYW1vdW50KjIpKS50b0ZpeGVkKDIpOyByZXR2YWwgKz0gIi95ZWFybHkiOyBicmVhayAKLQl9Ci0KLQkkKCd0b19hbW91bnQnKS5pbm5lckhUTUwgPSByZXR2YWw7Ci0JbmV3IEVmZmVjdC5TaGFrZSgndG9fYW1vdW50Jyk7Ci19Ci0KLWZ1bmN0aW9uIHNob3dfZGF0ZXNfYXNfbG9jYWxfdGltZSgpIHsKLQl2YXIgc3BhbnMgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnc3BhbicpOwotCWZvciAodmFyIGk9MDsgaTxzcGFucy5sZW5ndGg7IGkrKykgewotCQlpZiAoc3BhbnNbaV0uY2xhc3NOYW1lLm1hdGNoKC9cYnN0aWtpX2RhdGVcYi9pKSkgewotCQkJc3BhbnNbaV0uaW5uZXJIVE1MID0gZ2V0X2xvY2FsX3RpbWVfZm9yX2RhdGUoc3BhbnNbaV0udGl0bGUpOwotCQl9Ci0JfQotfQotCi1mdW5jdGlvbiBnZXRfbG9jYWxfdGltZV9mb3JfZGF0ZSh0aW1lKSB7Ci0Jc3lzdGVtX2RhdGUgPSBuZXcgRGF0ZSh0aW1lKTsKLQl1c2VyX2RhdGUgPSBuZXcgRGF0ZSgpOwotCWRlbHRhX21pbnV0ZXMgPSBNYXRoLmZsb29yKCh1c2VyX2RhdGUgLSBzeXN0ZW1fZGF0ZSkgLyAoNjAgKiAxMDAwKSk7Ci0JaWYgKE1hdGguYWJzKGRlbHRhX21pbnV0ZXMpIDw9ICg4KjcqMjQqNjApKSB7IC8vIGVpZ2h0IHdlZWtzLi4uIEknbSBsYXp5IHRvIGNvdW50IGRheXMgZm9yIGxvbmdlciB0aGFuIHRoYXQKLQkJZGlzdGFuY2UgPSBkaXN0YW5jZV9vZl90aW1lX2luX3dvcmRzKGRlbHRhX21pbnV0ZXMpOwotCQlpZiAoZGVsdGFfbWludXRlcyA8IDApIHsKLQkJCXJldHVybiBkaXN0YW5jZSArICcgZnJvbSBub3cnOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIGRpc3RhbmNlICsgJyBhZ28nOwotCQl9Ci0JfSBlbHNlIHsKLQkJcmV0dXJuICdvbiAnICsgc3lzdGVtX2RhdGUudG9Mb2NhbGVEYXRlU3RyaW5nKCk7Ci0JfQotfQotCi0vLyBhIHZhZ3VlIGNvcHkgb2YgcmFpbHMnIGluYnVpbHQgZnVuY3Rpb24sIAotLy8gYnV0IGEgYml0IG1vcmUgZnJpZW5kbHkgd2l0aCB0aGUgaG91cnMuCi1mdW5jdGlvbiBkaXN0YW5jZV9vZl90aW1lX2luX3dvcmRzKG1pbnV0ZXMpIHsKLQlpZiAobWludXRlcy5pc05hTikgcmV0dXJuICIiOwotCW1pbnV0ZXMgPSBNYXRoLmFicyhtaW51dGVzKTsKLQlpZiAobWludXRlcyA8IDEpIHJldHVybiAoJ2xlc3MgdGhhbiBhIG1pbnV0ZScpOwotCWlmIChtaW51dGVzIDwgNTApIHJldHVybiAobWludXRlcyArICcgbWludXRlJyArIChtaW51dGVzID09IDEgPyAnJyA6ICdzJykpOwotCWlmIChtaW51dGVzIDwgOTApIHJldHVybiAoJ2Fib3V0IG9uZSBob3VyJyk7Ci0JaWYgKG1pbnV0ZXMgPCAxMDgwKSByZXR1cm4gKE1hdGgucm91bmQobWludXRlcyAvIDYwKSArICcgaG91cnMnKTsKLQlpZiAobWludXRlcyA8IDE0NDApIHJldHVybiAoJ29uZSBkYXknKTsKLQlpZiAobWludXRlcyA8IDI4ODApIHJldHVybiAoJ2Fib3V0IG9uZSBkYXknKTsKLQllbHNlIHJldHVybiAoTWF0aC5yb3VuZChtaW51dGVzIC8gMTQ0MCkgKyAnIGRheXMnKQotfQotCi1mdW5jdGlvbiBjbGVhbkF1dGhvck5hbWUoKSB7Ci0gIGlmIChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYXV0aG9yTmFtZScpLnZhbHVlID09ICIiKSB7Ci0gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2F1dGhvck5hbWUnKS52YWx1ZSA9ICdBbm9ueW1vdXMnOwotICB9Ci19Ci0KLS8qCi0gKiBEeW5hbWljIFRhYmxlIG9mIENvbnRlbnRzIHNjcmlwdAotICogYnkgTWF0dCBXaGl0bG9jayA8aHR0cDovL3d3dy53aGl0c29mdGRldi5jb20vPgotICovCi0KLWZ1bmN0aW9uIGNyZWF0ZUxpbmsoaHJlZiwgaW5uZXJIVE1MKSB7Ci0gIHZhciBhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYSIpOwotICBhLnNldEF0dHJpYnV0ZSgiaHJlZiIsIGhyZWYpOwotICBhLmlubmVySFRNTCA9IGlubmVySFRNTDsKLSAgcmV0dXJuIGE7Ci19Ci0KLWZ1bmN0aW9uIGdlbmVyYXRlVE9DKHRvYykgewotICB2YXIgaTIgPSAwLCBpMyA9IDAsIGk0ID0gMDsKLSAgdG9jID0gdG9jLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInVsIikpOwotICBmb3IgKHZhciBpID0gMDsgaSA8ICQoJ3JldmlzaW9uJykuY2hpbGROb2Rlcy5sZW5ndGg7ICsraSkgewotICAgIHZhciBub2RlID0gJCgncmV2aXNpb24nKS5jaGlsZE5vZGVzW2ldOwotICAgIHZhciB0YWdOYW1lID0gbm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpOwotICAgIGlmICh0YWdOYW1lID09ICJoNCIpIHsKLSAgICAgICsraTQ7Ci0gICAgICBpZiAoaTQgPT0gMSkgdG9jLmxhc3RDaGlsZC5sYXN0Q2hpbGQubGFzdENoaWxkLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInVsIikpOwotICAgICAgdmFyIHNlY3Rpb24gPSBpMiArICIuIiArIGkzICsgIi4iICsgaTQ7Ci0gICAgICBub2RlLmluc2VydEJlZm9yZShkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShzZWN0aW9uICsgIi4gIiksIG5vZGUuZmlyc3RDaGlsZCk7Ci0gICAgICBub2RlLmlkID0gInNlY3Rpb24iICsgc2VjdGlvbjsKLSAgICAgIHRvYy5sYXN0Q2hpbGQubGFzdENoaWxkLmxhc3RDaGlsZC5sYXN0Q2hpbGQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgibGkiKSkuYXBwZW5kQ2hpbGQoY3JlYXRlTGluaygiI3NlY3Rpb24iICsgc2VjdGlvbiwgbm9kZS5pbm5lckhUTUwpKTsKLSAgICB9IGVsc2UgaWYgKHRhZ05hbWUgPT0gImgzIikgewotICAgICAgKytpMywgaTQgPSAwOwotICAgICAgaWYgKGkzID09IDEpIHRvYy5sYXN0Q2hpbGQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidWwiKSk7Ci0gICAgICB2YXIgc2VjdGlvbiA9IGkyICsgIi4iICsgaTM7Ci0gICAgICBub2RlLmluc2VydEJlZm9yZShkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShzZWN0aW9uICsgIi4gIiksIG5vZGUuZmlyc3RDaGlsZCk7Ci0gICAgICBub2RlLmlkID0gInNlY3Rpb24iICsgc2VjdGlvbjsKLSAgICAgIHRvYy5sYXN0Q2hpbGQubGFzdENoaWxkLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImxpIikpLmFwcGVuZENoaWxkKGNyZWF0ZUxpbmsoIiNzZWN0aW9uIiArIHNlY3Rpb24sIG5vZGUuaW5uZXJIVE1MKSk7Ci0gICAgfSBlbHNlIGlmICh0YWdOYW1lID09ICJoMiIpIHsKLSAgICAgICsraTIsIGkzID0gMCwgaTQgPSAwOwotICAgICAgdmFyIHNlY3Rpb24gPSBpMjsKLSAgICAgIG5vZGUuaW5zZXJ0QmVmb3JlKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHNlY3Rpb24gKyAiLiAiKSwgbm9kZS5maXJzdENoaWxkKTsKLSAgICAgIG5vZGUuaWQgPSAic2VjdGlvbiIgKyBzZWN0aW9uOwotICAgICAgdG9jLmFwcGVuZENoaWxkKGgyaXRlbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImxpIikpLmFwcGVuZENoaWxkKGNyZWF0ZUxpbmsoIiNzZWN0aW9uIiArIHNlY3Rpb24sIG5vZGUuaW5uZXJIVE1MKSk7Ci0gICAgfQotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvc2NyaXB0cy9zY3JpcHRhY3Vsb3VzLmpzIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvc2NyaXB0cy9zY3JpcHRhY3Vsb3VzLmpzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ODUzMTNjLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL3NjcmlwdHMvc2NyaXB0YWN1bG91cy5qcworKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8vIHNjcmlwdC5hY3Vsby51cyBzY3JpcHRhY3Vsb3VzLmpzIHYxLjcuMCwgRnJpIEphbiAxOSAxOToxNjozNiBDRVQgMjAwNwotCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgVGhvbWFzIEZ1Y2hzIChodHRwOi8vc2NyaXB0LmFjdWxvLnVzLCBodHRwOi8vbWlyLmFjdWxvLnVzKQotLy8gCi0vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKLS8vIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQotLy8gIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZwotLy8gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAotLy8gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCi0vLyBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KLS8vIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLS8vIAotLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUKLS8vIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgotLy8KLS8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAotLy8gRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCi0vLyBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAotLy8gTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRQotLy8gTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTgotLy8gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OCi0vLyBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KLS8vCi0vLyBGb3IgZGV0YWlscywgc2VlIHRoZSBzY3JpcHQuYWN1bG8udXMgd2ViIHNpdGU6IGh0dHA6Ly9zY3JpcHQuYWN1bG8udXMvCi0KLXZhciBTY3JpcHRhY3Vsb3VzID0gewotICBWZXJzaW9uOiAnMS43LjAnLAotICByZXF1aXJlOiBmdW5jdGlvbihsaWJyYXJ5TmFtZSkgewotICAgIC8vIGluc2VydGluZyB2aWEgRE9NIGZhaWxzIGluIFNhZmFyaSAyLjAsIHNvIGJydXRlIGZvcmNlIGFwcHJvYWNoCi0gICAgZG9jdW1lbnQud3JpdGUoJzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9IicrbGlicmFyeU5hbWUrJyI+PC9zY3JpcHQ+Jyk7Ci0gIH0sCi0gIGxvYWQ6IGZ1bmN0aW9uKCkgewotICAgIGlmKCh0eXBlb2YgUHJvdG90eXBlPT0ndW5kZWZpbmVkJykgfHwgCi0gICAgICAgKHR5cGVvZiBFbGVtZW50ID09ICd1bmRlZmluZWQnKSB8fCAKLSAgICAgICAodHlwZW9mIEVsZW1lbnQuTWV0aG9kcz09J3VuZGVmaW5lZCcpIHx8Ci0gICAgICAgcGFyc2VGbG9hdChQcm90b3R5cGUuVmVyc2lvbi5zcGxpdCgiLiIpWzBdICsgIi4iICsKLSAgICAgICAgICAgICAgICAgIFByb3RvdHlwZS5WZXJzaW9uLnNwbGl0KCIuIilbMV0pIDwgMS41KQotICAgICAgIHRocm93KCJzY3JpcHQuYWN1bG8udXMgcmVxdWlyZXMgdGhlIFByb3RvdHlwZSBKYXZhU2NyaXB0IGZyYW1ld29yayA+PSAxLjUuMCIpOwotICAgIAotICAgICRBKGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzY3JpcHQiKSkuZmluZEFsbCggZnVuY3Rpb24ocykgewotICAgICAgcmV0dXJuIChzLnNyYyAmJiBzLnNyYy5tYXRjaCgvc2NyaXB0YWN1bG91c1wuanMoXD8uKik/JC8pKQotICAgIH0pLmVhY2goIGZ1bmN0aW9uKHMpIHsKLSAgICAgIHZhciBwYXRoID0gcy5zcmMucmVwbGFjZSgvc2NyaXB0YWN1bG91c1wuanMoXD8uKik/JC8sJycpOwotICAgICAgdmFyIGluY2x1ZGVzID0gcy5zcmMubWF0Y2goL1w/Lipsb2FkPShbYS16LF0qKS8pOwotICAgICAgKGluY2x1ZGVzID8gaW5jbHVkZXNbMV0gOiAnYnVpbGRlcixlZmZlY3RzLGRyYWdkcm9wLGNvbnRyb2xzLHNsaWRlcicpLnNwbGl0KCcsJykuZWFjaCgKLSAgICAgICBmdW5jdGlvbihpbmNsdWRlKSB7IFNjcmlwdGFjdWxvdXMucmVxdWlyZShwYXRoK2luY2x1ZGUrJy5qcycpIH0pOwotICAgIH0pOwotICB9Ci19Ci0KLVNjcmlwdGFjdWxvdXMubG9hZCgpOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL3NjcmlwdHMvc2xpZGVyLmpzIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvc2NyaXB0cy9zbGlkZXIuanMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1OWNlMWQuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvc2NyaXB0cy9zbGlkZXIuanMKKysrIC9kZXYvbnVsbApAQCAtMSwyOTQgKzAsMCBAQAotLy8gc2NyaXB0LmFjdWxvLnVzIHNsaWRlci5qcyB2MS42LjQsIFdlZCBTZXAgMDYgMTE6MzA6NTggQ0VTVCAyMDA2Ci0KLS8vIENvcHlyaWdodCAoYykgMjAwNSBNYXJ0eSBIYXVnaHQsIFRob21hcyBGdWNocyAKLS8vCi0vLyBTZWUgaHR0cDovL3NjcmlwdC5hY3Vsby51cyBmb3IgbW9yZSBpbmZvCi0vLyAKLS8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZwotLy8gYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCi0vLyAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCi0vLyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCi0vLyBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KLS8vIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bwotLy8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotLy8gCi0vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZQotLy8gaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCi0vLwotLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCi0vLyBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKLS8vIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECi0vLyBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFCi0vLyBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OCi0vLyBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04KLS8vIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgotCi1pZighQ29udHJvbCkgdmFyIENvbnRyb2wgPSB7fTsKLUNvbnRyb2wuU2xpZGVyID0gQ2xhc3MuY3JlYXRlKCk7Ci0KLS8vIG9wdGlvbnM6Ci0vLyAgYXhpczogJ3ZlcnRpY2FsJywgb3IgJ2hvcml6b250YWwnIChkZWZhdWx0KQotLy8KLS8vIGNhbGxiYWNrczoKLS8vICBvbkNoYW5nZSh2YWx1ZSkKLS8vICBvblNsaWRlKHZhbHVlKQotQ29udHJvbC5TbGlkZXIucHJvdG90eXBlID0gewotICBpbml0aWFsaXplOiBmdW5jdGlvbihoYW5kbGUsIHRyYWNrLCBvcHRpb25zKSB7Ci0gICAgdmFyIHNsaWRlciA9IHRoaXM7Ci0gICAgCi0gICAgaWYoaGFuZGxlIGluc3RhbmNlb2YgQXJyYXkpIHsKLSAgICAgIHRoaXMuaGFuZGxlcyA9IGhhbmRsZS5jb2xsZWN0KCBmdW5jdGlvbihlKSB7IHJldHVybiAkKGUpIH0pOwotICAgIH0gZWxzZSB7Ci0gICAgICB0aGlzLmhhbmRsZXMgPSBbJChoYW5kbGUpXTsKLSAgICB9Ci0gICAgCi0gICAgdGhpcy50cmFjayAgID0gJCh0cmFjayk7Ci0gICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucyB8fCB7fTsKLQotICAgIHRoaXMuYXhpcyAgICAgID0gdGhpcy5vcHRpb25zLmF4aXMgfHwgJ2hvcml6b250YWwnOwotICAgIHRoaXMuaW5jcmVtZW50ID0gdGhpcy5vcHRpb25zLmluY3JlbWVudCB8fCAxOwotICAgIHRoaXMuc3RlcCAgICAgID0gcGFyc2VJbnQodGhpcy5vcHRpb25zLnN0ZXAgfHwgJzEnKTsKLSAgICB0aGlzLnJhbmdlICAgICA9IHRoaXMub3B0aW9ucy5yYW5nZSB8fCAkUigwLDEpOwotICAgIAotICAgIHRoaXMudmFsdWUgICAgID0gMDsgLy8gYXNzdXJlIGJhY2t3YXJkcyBjb21wYXQKLSAgICB0aGlzLnZhbHVlcyAgICA9IHRoaXMuaGFuZGxlcy5tYXAoIGZ1bmN0aW9uKCkgeyByZXR1cm4gMCB9KTsKLSAgICB0aGlzLnNwYW5zICAgICA9IHRoaXMub3B0aW9ucy5zcGFucyA/IHRoaXMub3B0aW9ucy5zcGFucy5tYXAoZnVuY3Rpb24ocyl7IHJldHVybiAkKHMpIH0pIDogZmFsc2U7Ci0gICAgdGhpcy5vcHRpb25zLnN0YXJ0U3BhbiA9ICQodGhpcy5vcHRpb25zLnN0YXJ0U3BhbiB8fCBudWxsKTsKLSAgICB0aGlzLm9wdGlvbnMuZW5kU3BhbiAgID0gJCh0aGlzLm9wdGlvbnMuZW5kU3BhbiB8fCBudWxsKTsKLQotICAgIHRoaXMucmVzdHJpY3RlZCA9IHRoaXMub3B0aW9ucy5yZXN0cmljdGVkIHx8IGZhbHNlOwotCi0gICAgdGhpcy5tYXhpbXVtICAgPSB0aGlzLm9wdGlvbnMubWF4aW11bSB8fCB0aGlzLnJhbmdlLmVuZDsKLSAgICB0aGlzLm1pbmltdW0gICA9IHRoaXMub3B0aW9ucy5taW5pbXVtIHx8IHRoaXMucmFuZ2Uuc3RhcnQ7Ci0KLSAgICAvLyBXaWxsIGJlIHVzZWQgdG8gYWxpZ24gdGhlIGhhbmRsZSBvbnRvIHRoZSB0cmFjaywgaWYgbmVjZXNzYXJ5Ci0gICAgdGhpcy5hbGlnblggPSBwYXJzZUludCh0aGlzLm9wdGlvbnMuYWxpZ25YIHx8ICcwJyk7Ci0gICAgdGhpcy5hbGlnblkgPSBwYXJzZUludCh0aGlzLm9wdGlvbnMuYWxpZ25ZIHx8ICcwJyk7Ci0gICAgCi0gICAgdGhpcy50cmFja0xlbmd0aCA9IHRoaXMubWF4aW11bU9mZnNldCgpIC0gdGhpcy5taW5pbXVtT2Zmc2V0KCk7Ci0KLSAgICB0aGlzLmhhbmRsZUxlbmd0aCA9IHRoaXMuaXNWZXJ0aWNhbCgpID8gCi0gICAgICAodGhpcy5oYW5kbGVzWzBdLm9mZnNldEhlaWdodCAhPSAwID8gCi0gICAgICAgIHRoaXMuaGFuZGxlc1swXS5vZmZzZXRIZWlnaHQgOiB0aGlzLmhhbmRsZXNbMF0uc3R5bGUuaGVpZ2h0LnJlcGxhY2UoL3B4JC8sIiIpKSA6IAotICAgICAgKHRoaXMuaGFuZGxlc1swXS5vZmZzZXRXaWR0aCAhPSAwID8gdGhpcy5oYW5kbGVzWzBdLm9mZnNldFdpZHRoIDogCi0gICAgICAgIHRoaXMuaGFuZGxlc1swXS5zdHlsZS53aWR0aC5yZXBsYWNlKC9weCQvLCIiKSk7Ci0KLSAgICB0aGlzLmFjdGl2ZSAgID0gZmFsc2U7Ci0gICAgdGhpcy5kcmFnZ2luZyA9IGZhbHNlOwotICAgIHRoaXMuZGlzYWJsZWQgPSBmYWxzZTsKLQotICAgIGlmKHRoaXMub3B0aW9ucy5kaXNhYmxlZCkgdGhpcy5zZXREaXNhYmxlZCgpOwotCi0gICAgLy8gQWxsb3dlZCB2YWx1ZXMgYXJyYXkKLSAgICB0aGlzLmFsbG93ZWRWYWx1ZXMgPSB0aGlzLm9wdGlvbnMudmFsdWVzID8gdGhpcy5vcHRpb25zLnZhbHVlcy5zb3J0QnkoUHJvdG90eXBlLkspIDogZmFsc2U7Ci0gICAgaWYodGhpcy5hbGxvd2VkVmFsdWVzKSB7Ci0gICAgICB0aGlzLm1pbmltdW0gPSB0aGlzLmFsbG93ZWRWYWx1ZXMubWluKCk7Ci0gICAgICB0aGlzLm1heGltdW0gPSB0aGlzLmFsbG93ZWRWYWx1ZXMubWF4KCk7Ci0gICAgfQotCi0gICAgdGhpcy5ldmVudE1vdXNlRG93biA9IHRoaXMuc3RhcnREcmFnLmJpbmRBc0V2ZW50TGlzdGVuZXIodGhpcyk7Ci0gICAgdGhpcy5ldmVudE1vdXNlVXAgICA9IHRoaXMuZW5kRHJhZy5iaW5kQXNFdmVudExpc3RlbmVyKHRoaXMpOwotICAgIHRoaXMuZXZlbnRNb3VzZU1vdmUgPSB0aGlzLnVwZGF0ZS5iaW5kQXNFdmVudExpc3RlbmVyKHRoaXMpOwotCi0gICAgLy8gSW5pdGlhbGl6ZSBoYW5kbGVzIGluIHJldmVyc2UgKG1ha2Ugc3VyZSBmaXJzdCBoYW5kbGUgaXMgYWN0aXZlKQotICAgIHRoaXMuaGFuZGxlcy5lYWNoKCBmdW5jdGlvbihoLGkpIHsKLSAgICAgIGkgPSBzbGlkZXIuaGFuZGxlcy5sZW5ndGgtMS1pOwotICAgICAgc2xpZGVyLnNldFZhbHVlKHBhcnNlRmxvYXQoCi0gICAgICAgIChzbGlkZXIub3B0aW9ucy5zbGlkZXJWYWx1ZSBpbnN0YW5jZW9mIEFycmF5ID8gCi0gICAgICAgICAgc2xpZGVyLm9wdGlvbnMuc2xpZGVyVmFsdWVbaV0gOiBzbGlkZXIub3B0aW9ucy5zbGlkZXJWYWx1ZSkgfHwgCi0gICAgICAgICBzbGlkZXIucmFuZ2Uuc3RhcnQpLCBpKTsKLSAgICAgIEVsZW1lbnQubWFrZVBvc2l0aW9uZWQoaCk7IC8vIGZpeCBJRQotICAgICAgRXZlbnQub2JzZXJ2ZShoLCAibW91c2Vkb3duIiwgc2xpZGVyLmV2ZW50TW91c2VEb3duKTsKLSAgICB9KTsKLSAgICAKLSAgICBFdmVudC5vYnNlcnZlKHRoaXMudHJhY2ssICJtb3VzZWRvd24iLCB0aGlzLmV2ZW50TW91c2VEb3duKTsKLSAgICBFdmVudC5vYnNlcnZlKGRvY3VtZW50LCAibW91c2V1cCIsIHRoaXMuZXZlbnRNb3VzZVVwKTsKLSAgICBFdmVudC5vYnNlcnZlKGRvY3VtZW50LCAibW91c2Vtb3ZlIiwgdGhpcy5ldmVudE1vdXNlTW92ZSk7Ci0gICAgCi0gICAgdGhpcy5pbml0aWFsaXplZCA9IHRydWU7Ci0gIH0sCi0gIGRpc3Bvc2U6IGZ1bmN0aW9uKCkgewotICAgIHZhciBzbGlkZXIgPSB0aGlzOyAgICAKLSAgICBFdmVudC5zdG9wT2JzZXJ2aW5nKHRoaXMudHJhY2ssICJtb3VzZWRvd24iLCB0aGlzLmV2ZW50TW91c2VEb3duKTsKLSAgICBFdmVudC5zdG9wT2JzZXJ2aW5nKGRvY3VtZW50LCAibW91c2V1cCIsIHRoaXMuZXZlbnRNb3VzZVVwKTsKLSAgICBFdmVudC5zdG9wT2JzZXJ2aW5nKGRvY3VtZW50LCAibW91c2Vtb3ZlIiwgdGhpcy5ldmVudE1vdXNlTW92ZSk7Ci0gICAgdGhpcy5oYW5kbGVzLmVhY2goIGZ1bmN0aW9uKGgpIHsKLSAgICAgIEV2ZW50LnN0b3BPYnNlcnZpbmcoaCwgIm1vdXNlZG93biIsIHNsaWRlci5ldmVudE1vdXNlRG93bik7Ci0gICAgfSk7Ci0gIH0sCi0gIHNldERpc2FibGVkOiBmdW5jdGlvbigpewotICAgIHRoaXMuZGlzYWJsZWQgPSB0cnVlOwotICB9LAotICBzZXRFbmFibGVkOiBmdW5jdGlvbigpewotICAgIHRoaXMuZGlzYWJsZWQgPSBmYWxzZTsKLSAgfSwgIAotICBnZXROZWFyZXN0VmFsdWU6IGZ1bmN0aW9uKHZhbHVlKXsKLSAgICBpZih0aGlzLmFsbG93ZWRWYWx1ZXMpewotICAgICAgaWYodmFsdWUgPj0gdGhpcy5hbGxvd2VkVmFsdWVzLm1heCgpKSByZXR1cm4odGhpcy5hbGxvd2VkVmFsdWVzLm1heCgpKTsKLSAgICAgIGlmKHZhbHVlIDw9IHRoaXMuYWxsb3dlZFZhbHVlcy5taW4oKSkgcmV0dXJuKHRoaXMuYWxsb3dlZFZhbHVlcy5taW4oKSk7Ci0gICAgICAKLSAgICAgIHZhciBvZmZzZXQgPSBNYXRoLmFicyh0aGlzLmFsbG93ZWRWYWx1ZXNbMF0gLSB2YWx1ZSk7Ci0gICAgICB2YXIgbmV3VmFsdWUgPSB0aGlzLmFsbG93ZWRWYWx1ZXNbMF07Ci0gICAgICB0aGlzLmFsbG93ZWRWYWx1ZXMuZWFjaCggZnVuY3Rpb24odikgewotICAgICAgICB2YXIgY3VycmVudE9mZnNldCA9IE1hdGguYWJzKHYgLSB2YWx1ZSk7Ci0gICAgICAgIGlmKGN1cnJlbnRPZmZzZXQgPD0gb2Zmc2V0KXsKLSAgICAgICAgICBuZXdWYWx1ZSA9IHY7Ci0gICAgICAgICAgb2Zmc2V0ID0gY3VycmVudE9mZnNldDsKLSAgICAgICAgfSAKLSAgICAgIH0pOwotICAgICAgcmV0dXJuIG5ld1ZhbHVlOwotICAgIH0KLSAgICBpZih2YWx1ZSA+IHRoaXMucmFuZ2UuZW5kKSByZXR1cm4gdGhpcy5yYW5nZS5lbmQ7Ci0gICAgaWYodmFsdWUgPCB0aGlzLnJhbmdlLnN0YXJ0KSByZXR1cm4gdGhpcy5yYW5nZS5zdGFydDsKLSAgICByZXR1cm4gdmFsdWU7Ci0gIH0sCi0gIHNldFZhbHVlOiBmdW5jdGlvbihzbGlkZXJWYWx1ZSwgaGFuZGxlSWR4KXsKLSAgICBpZighdGhpcy5hY3RpdmUpIHsKLSAgICAgIHRoaXMuYWN0aXZlSGFuZGxlSWR4ID0gaGFuZGxlSWR4IHx8IDA7Ci0gICAgICB0aGlzLmFjdGl2ZUhhbmRsZSAgICA9IHRoaXMuaGFuZGxlc1t0aGlzLmFjdGl2ZUhhbmRsZUlkeF07Ci0gICAgICB0aGlzLnVwZGF0ZVN0eWxlcygpOwotICAgIH0KLSAgICBoYW5kbGVJZHggPSBoYW5kbGVJZHggfHwgdGhpcy5hY3RpdmVIYW5kbGVJZHggfHwgMDsKLSAgICBpZih0aGlzLmluaXRpYWxpemVkICYmIHRoaXMucmVzdHJpY3RlZCkgewotICAgICAgaWYoKGhhbmRsZUlkeD4wKSAmJiAoc2xpZGVyVmFsdWU8dGhpcy52YWx1ZXNbaGFuZGxlSWR4LTFdKSkKLSAgICAgICAgc2xpZGVyVmFsdWUgPSB0aGlzLnZhbHVlc1toYW5kbGVJZHgtMV07Ci0gICAgICBpZigoaGFuZGxlSWR4IDwgKHRoaXMuaGFuZGxlcy5sZW5ndGgtMSkpICYmIChzbGlkZXJWYWx1ZT50aGlzLnZhbHVlc1toYW5kbGVJZHgrMV0pKQotICAgICAgICBzbGlkZXJWYWx1ZSA9IHRoaXMudmFsdWVzW2hhbmRsZUlkeCsxXTsKLSAgICB9Ci0gICAgc2xpZGVyVmFsdWUgPSB0aGlzLmdldE5lYXJlc3RWYWx1ZShzbGlkZXJWYWx1ZSk7Ci0gICAgdGhpcy52YWx1ZXNbaGFuZGxlSWR4XSA9IHNsaWRlclZhbHVlOwotICAgIHRoaXMudmFsdWUgPSB0aGlzLnZhbHVlc1swXTsgLy8gYXNzdXJlIGJhY2t3YXJkcyBjb21wYXQKLSAgICAKLSAgICB0aGlzLmhhbmRsZXNbaGFuZGxlSWR4XS5zdHlsZVt0aGlzLmlzVmVydGljYWwoKSA/ICd0b3AnIDogJ2xlZnQnXSA9IAotICAgICAgdGhpcy50cmFuc2xhdGVUb1B4KHNsaWRlclZhbHVlKTsKLSAgICAKLSAgICB0aGlzLmRyYXdTcGFucygpOwotICAgIGlmKCF0aGlzLmRyYWdnaW5nIHx8ICF0aGlzLmV2ZW50KSB0aGlzLnVwZGF0ZUZpbmlzaGVkKCk7Ci0gIH0sCi0gIHNldFZhbHVlQnk6IGZ1bmN0aW9uKGRlbHRhLCBoYW5kbGVJZHgpIHsKLSAgICB0aGlzLnNldFZhbHVlKHRoaXMudmFsdWVzW2hhbmRsZUlkeCB8fCB0aGlzLmFjdGl2ZUhhbmRsZUlkeCB8fCAwXSArIGRlbHRhLCAKLSAgICAgIGhhbmRsZUlkeCB8fCB0aGlzLmFjdGl2ZUhhbmRsZUlkeCB8fCAwKTsKLSAgfSwKLSAgdHJhbnNsYXRlVG9QeDogZnVuY3Rpb24odmFsdWUpIHsKLSAgICByZXR1cm4gTWF0aC5yb3VuZCgKLSAgICAgICgodGhpcy50cmFja0xlbmd0aC10aGlzLmhhbmRsZUxlbmd0aCkvKHRoaXMucmFuZ2UuZW5kLXRoaXMucmFuZ2Uuc3RhcnQpKSAqIAotICAgICAgKHZhbHVlIC0gdGhpcy5yYW5nZS5zdGFydCkpICsgInB4IjsKLSAgfSwKLSAgdHJhbnNsYXRlVG9WYWx1ZTogZnVuY3Rpb24ob2Zmc2V0KSB7Ci0gICAgcmV0dXJuICgob2Zmc2V0Lyh0aGlzLnRyYWNrTGVuZ3RoLXRoaXMuaGFuZGxlTGVuZ3RoKSAqIAotICAgICAgKHRoaXMucmFuZ2UuZW5kLXRoaXMucmFuZ2Uuc3RhcnQpKSArIHRoaXMucmFuZ2Uuc3RhcnQpOwotICB9LAotICBnZXRSYW5nZTogZnVuY3Rpb24ocmFuZ2UpIHsKLSAgICB2YXIgdiA9IHRoaXMudmFsdWVzLnNvcnRCeShQcm90b3R5cGUuSyk7IAotICAgIHJhbmdlID0gcmFuZ2UgfHwgMDsKLSAgICByZXR1cm4gJFIodltyYW5nZV0sdltyYW5nZSsxXSk7Ci0gIH0sCi0gIG1pbmltdW1PZmZzZXQ6IGZ1bmN0aW9uKCl7Ci0gICAgcmV0dXJuKHRoaXMuaXNWZXJ0aWNhbCgpID8gdGhpcy5hbGlnblkgOiB0aGlzLmFsaWduWCk7Ci0gIH0sCi0gIG1heGltdW1PZmZzZXQ6IGZ1bmN0aW9uKCl7Ci0gICAgcmV0dXJuKHRoaXMuaXNWZXJ0aWNhbCgpID8gCi0gICAgICAodGhpcy50cmFjay5vZmZzZXRIZWlnaHQgIT0gMCA/IHRoaXMudHJhY2sub2Zmc2V0SGVpZ2h0IDoKLSAgICAgICAgdGhpcy50cmFjay5zdHlsZS5oZWlnaHQucmVwbGFjZSgvcHgkLywiIikpIC0gdGhpcy5hbGlnblkgOiAKLSAgICAgICh0aGlzLnRyYWNrLm9mZnNldFdpZHRoICE9IDAgPyB0aGlzLnRyYWNrLm9mZnNldFdpZHRoIDogCi0gICAgICAgIHRoaXMudHJhY2suc3R5bGUud2lkdGgucmVwbGFjZSgvcHgkLywiIikpIC0gdGhpcy5hbGlnblkpOwotICB9LCAgCi0gIGlzVmVydGljYWw6ICBmdW5jdGlvbigpewotICAgIHJldHVybiAodGhpcy5heGlzID09ICd2ZXJ0aWNhbCcpOwotICB9LAotICBkcmF3U3BhbnM6IGZ1bmN0aW9uKCkgewotICAgIHZhciBzbGlkZXIgPSB0aGlzOwotICAgIGlmKHRoaXMuc3BhbnMpCi0gICAgICAkUigwLCB0aGlzLnNwYW5zLmxlbmd0aC0xKS5lYWNoKGZ1bmN0aW9uKHIpIHsgc2xpZGVyLnNldFNwYW4oc2xpZGVyLnNwYW5zW3JdLCBzbGlkZXIuZ2V0UmFuZ2UocikpIH0pOwotICAgIGlmKHRoaXMub3B0aW9ucy5zdGFydFNwYW4pCi0gICAgICB0aGlzLnNldFNwYW4odGhpcy5vcHRpb25zLnN0YXJ0U3BhbiwKLSAgICAgICAgJFIoMCwgdGhpcy52YWx1ZXMubGVuZ3RoPjEgPyB0aGlzLmdldFJhbmdlKDApLm1pbigpIDogdGhpcy52YWx1ZSApKTsKLSAgICBpZih0aGlzLm9wdGlvbnMuZW5kU3BhbikKLSAgICAgIHRoaXMuc2V0U3Bhbih0aGlzLm9wdGlvbnMuZW5kU3BhbiwgCi0gICAgICAgICRSKHRoaXMudmFsdWVzLmxlbmd0aD4xID8gdGhpcy5nZXRSYW5nZSh0aGlzLnNwYW5zLmxlbmd0aC0xKS5tYXgoKSA6IHRoaXMudmFsdWUsIHRoaXMubWF4aW11bSkpOwotICB9LAotICBzZXRTcGFuOiBmdW5jdGlvbihzcGFuLCByYW5nZSkgewotICAgIGlmKHRoaXMuaXNWZXJ0aWNhbCgpKSB7Ci0gICAgICBzcGFuLnN0eWxlLnRvcCA9IHRoaXMudHJhbnNsYXRlVG9QeChyYW5nZS5zdGFydCk7Ci0gICAgICBzcGFuLnN0eWxlLmhlaWdodCA9IHRoaXMudHJhbnNsYXRlVG9QeChyYW5nZS5lbmQgLSByYW5nZS5zdGFydCArIHRoaXMucmFuZ2Uuc3RhcnQpOwotICAgIH0gZWxzZSB7Ci0gICAgICBzcGFuLnN0eWxlLmxlZnQgPSB0aGlzLnRyYW5zbGF0ZVRvUHgocmFuZ2Uuc3RhcnQpOwotICAgICAgc3Bhbi5zdHlsZS53aWR0aCA9IHRoaXMudHJhbnNsYXRlVG9QeChyYW5nZS5lbmQgLSByYW5nZS5zdGFydCArIHRoaXMucmFuZ2Uuc3RhcnQpOwotICAgIH0KLSAgfSwKLSAgdXBkYXRlU3R5bGVzOiBmdW5jdGlvbigpIHsKLSAgICB0aGlzLmhhbmRsZXMuZWFjaCggZnVuY3Rpb24oaCl7IEVsZW1lbnQucmVtb3ZlQ2xhc3NOYW1lKGgsICdzZWxlY3RlZCcpIH0pOwotICAgIEVsZW1lbnQuYWRkQ2xhc3NOYW1lKHRoaXMuYWN0aXZlSGFuZGxlLCAnc2VsZWN0ZWQnKTsKLSAgfSwKLSAgc3RhcnREcmFnOiBmdW5jdGlvbihldmVudCkgewotICAgIGlmKEV2ZW50LmlzTGVmdENsaWNrKGV2ZW50KSkgewotICAgICAgaWYoIXRoaXMuZGlzYWJsZWQpewotICAgICAgICB0aGlzLmFjdGl2ZSA9IHRydWU7Ci0gICAgICAgIAotICAgICAgICB2YXIgaGFuZGxlID0gRXZlbnQuZWxlbWVudChldmVudCk7Ci0gICAgICAgIHZhciBwb2ludGVyICA9IFtFdmVudC5wb2ludGVyWChldmVudCksIEV2ZW50LnBvaW50ZXJZKGV2ZW50KV07Ci0gICAgICAgIHZhciB0cmFjayA9IGhhbmRsZTsKLSAgICAgICAgaWYodHJhY2s9PXRoaXMudHJhY2spIHsKLSAgICAgICAgICB2YXIgb2Zmc2V0cyAgPSBQb3NpdGlvbi5jdW11bGF0aXZlT2Zmc2V0KHRoaXMudHJhY2spOyAKLSAgICAgICAgICB0aGlzLmV2ZW50ID0gZXZlbnQ7Ci0gICAgICAgICAgdGhpcy5zZXRWYWx1ZSh0aGlzLnRyYW5zbGF0ZVRvVmFsdWUoIAotICAgICAgICAgICAodGhpcy5pc1ZlcnRpY2FsKCkgPyBwb2ludGVyWzFdLW9mZnNldHNbMV0gOiBwb2ludGVyWzBdLW9mZnNldHNbMF0pLSh0aGlzLmhhbmRsZUxlbmd0aC8yKQotICAgICAgICAgICkpOwotICAgICAgICAgIHZhciBvZmZzZXRzICA9IFBvc2l0aW9uLmN1bXVsYXRpdmVPZmZzZXQodGhpcy5hY3RpdmVIYW5kbGUpOwotICAgICAgICAgIHRoaXMub2Zmc2V0WCA9IChwb2ludGVyWzBdIC0gb2Zmc2V0c1swXSk7Ci0gICAgICAgICAgdGhpcy5vZmZzZXRZID0gKHBvaW50ZXJbMV0gLSBvZmZzZXRzWzFdKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAvLyBmaW5kIHRoZSBoYW5kbGUgKHByZXZlbnRzIGlzc3VlcyB3aXRoIFNhZmFyaSkKLSAgICAgICAgICB3aGlsZSgodGhpcy5oYW5kbGVzLmluZGV4T2YoaGFuZGxlKSA9PSAtMSkgJiYgaGFuZGxlLnBhcmVudE5vZGUpIAotICAgICAgICAgICAgaGFuZGxlID0gaGFuZGxlLnBhcmVudE5vZGU7Ci0gICAgICAgIAotICAgICAgICAgIHRoaXMuYWN0aXZlSGFuZGxlICAgID0gaGFuZGxlOwotICAgICAgICAgIHRoaXMuYWN0aXZlSGFuZGxlSWR4ID0gdGhpcy5oYW5kbGVzLmluZGV4T2YodGhpcy5hY3RpdmVIYW5kbGUpOwotICAgICAgICAgIHRoaXMudXBkYXRlU3R5bGVzKCk7Ci0gICAgICAgIAotICAgICAgICAgIHZhciBvZmZzZXRzICA9IFBvc2l0aW9uLmN1bXVsYXRpdmVPZmZzZXQodGhpcy5hY3RpdmVIYW5kbGUpOwotICAgICAgICAgIHRoaXMub2Zmc2V0WCA9IChwb2ludGVyWzBdIC0gb2Zmc2V0c1swXSk7Ci0gICAgICAgICAgdGhpcy5vZmZzZXRZID0gKHBvaW50ZXJbMV0gLSBvZmZzZXRzWzFdKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgRXZlbnQuc3RvcChldmVudCk7Ci0gICAgfQotICB9LAotICB1cGRhdGU6IGZ1bmN0aW9uKGV2ZW50KSB7Ci0gICBpZih0aGlzLmFjdGl2ZSkgewotICAgICAgaWYoIXRoaXMuZHJhZ2dpbmcpIHRoaXMuZHJhZ2dpbmcgPSB0cnVlOwotICAgICAgdGhpcy5kcmF3KGV2ZW50KTsKLSAgICAgIC8vIGZpeCBBcHBsZVdlYktpdCByZW5kZXJpbmcKLSAgICAgIGlmKG5hdmlnYXRvci5hcHBWZXJzaW9uLmluZGV4T2YoJ0FwcGxlV2ViS2l0Jyk+MCkgd2luZG93LnNjcm9sbEJ5KDAsMCk7Ci0gICAgICBFdmVudC5zdG9wKGV2ZW50KTsKLSAgIH0KLSAgfSwKLSAgZHJhdzogZnVuY3Rpb24oZXZlbnQpIHsKLSAgICB2YXIgcG9pbnRlciA9IFtFdmVudC5wb2ludGVyWChldmVudCksIEV2ZW50LnBvaW50ZXJZKGV2ZW50KV07Ci0gICAgdmFyIG9mZnNldHMgPSBQb3NpdGlvbi5jdW11bGF0aXZlT2Zmc2V0KHRoaXMudHJhY2spOwotICAgIHBvaW50ZXJbMF0gLT0gdGhpcy5vZmZzZXRYICsgb2Zmc2V0c1swXTsKLSAgICBwb2ludGVyWzFdIC09IHRoaXMub2Zmc2V0WSArIG9mZnNldHNbMV07Ci0gICAgdGhpcy5ldmVudCA9IGV2ZW50OwotICAgIHRoaXMuc2V0VmFsdWUodGhpcy50cmFuc2xhdGVUb1ZhbHVlKCB0aGlzLmlzVmVydGljYWwoKSA/IHBvaW50ZXJbMV0gOiBwb2ludGVyWzBdICkpOwotICAgIGlmKHRoaXMuaW5pdGlhbGl6ZWQgJiYgdGhpcy5vcHRpb25zLm9uU2xpZGUpCi0gICAgICB0aGlzLm9wdGlvbnMub25TbGlkZSh0aGlzLnZhbHVlcy5sZW5ndGg+MSA/IHRoaXMudmFsdWVzIDogdGhpcy52YWx1ZSwgdGhpcyk7Ci0gIH0sCi0gIGVuZERyYWc6IGZ1bmN0aW9uKGV2ZW50KSB7Ci0gICAgaWYodGhpcy5hY3RpdmUgJiYgdGhpcy5kcmFnZ2luZykgewotICAgICAgdGhpcy5maW5pc2hEcmFnKGV2ZW50LCB0cnVlKTsKLSAgICAgIEV2ZW50LnN0b3AoZXZlbnQpOwotICAgIH0KLSAgICB0aGlzLmFjdGl2ZSA9IGZhbHNlOwotICAgIHRoaXMuZHJhZ2dpbmcgPSBmYWxzZTsKLSAgfSwgIAotICBmaW5pc2hEcmFnOiBmdW5jdGlvbihldmVudCwgc3VjY2VzcykgewotICAgIHRoaXMuYWN0aXZlID0gZmFsc2U7Ci0gICAgdGhpcy5kcmFnZ2luZyA9IGZhbHNlOwotICAgIHRoaXMudXBkYXRlRmluaXNoZWQoKTsKLSAgfSwKLSAgdXBkYXRlRmluaXNoZWQ6IGZ1bmN0aW9uKCkgewotICAgIGlmKHRoaXMuaW5pdGlhbGl6ZWQgJiYgdGhpcy5vcHRpb25zLm9uQ2hhbmdlKSAKLSAgICAgIHRoaXMub3B0aW9ucy5vbkNoYW5nZSh0aGlzLnZhbHVlcy5sZW5ndGg+MSA/IHRoaXMudmFsdWVzIDogdGhpcy52YWx1ZSwgdGhpcyk7Ci0gICAgdGhpcy5ldmVudCA9IG51bGw7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy9zY3JpcHRzL3VuaXR0ZXN0LmpzIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvc2NyaXB0cy91bml0dGVzdC5qcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTQ0Nzg4NS4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy9zY3JpcHRzL3VuaXR0ZXN0LmpzCisrKyAvZGV2L251bGwKQEAgLTEsNTY0ICswLDAgQEAKLS8vIHNjcmlwdC5hY3Vsby51cyB1bml0dGVzdC5qcyB2MS43LjAsIEZyaSBKYW4gMTkgMTk6MTY6MzYgQ0VUIDIwMDcKLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IFRob21hcyBGdWNocyAoaHR0cDovL3NjcmlwdC5hY3Vsby51cywgaHR0cDovL21pci5hY3Vsby51cykKLS8vICAgICAgICAgICAoYykgMjAwNSwgMjAwNiBKb24gVGlyc2VuIChodHRwOi8vd3d3LnRpcnNlbi5jb20pCi0vLyAgICAgICAgICAgKGMpIDIwMDUsIDIwMDYgTWljaGFlbCBTY2h1ZXJpZyAoaHR0cDovL3d3dy5zY2h1ZXJpZy5kZS9taWNoYWVsLykKLS8vCi0vLyBzY3JpcHQuYWN1bG8udXMgaXMgZnJlZWx5IGRpc3RyaWJ1dGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIGFuIE1JVC1zdHlsZSBsaWNlbnNlLgotLy8gRm9yIGRldGFpbHMsIHNlZSB0aGUgc2NyaXB0LmFjdWxvLnVzIHdlYiBzaXRlOiBodHRwOi8vc2NyaXB0LmFjdWxvLnVzLwotCi0vLyBleHBlcmltZW50YWwsIEZpcmVmb3gtb25seQotRXZlbnQuc2ltdWxhdGVNb3VzZSA9IGZ1bmN0aW9uKGVsZW1lbnQsIGV2ZW50TmFtZSkgewotICB2YXIgb3B0aW9ucyA9IE9iamVjdC5leHRlbmQoewotICAgIHBvaW50ZXJYOiAwLAotICAgIHBvaW50ZXJZOiAwLAotICAgIGJ1dHRvbnM6ICAwLAotICAgIGN0cmxLZXk6ICBmYWxzZSwKLSAgICBhbHRLZXk6ICAgZmFsc2UsCi0gICAgc2hpZnRLZXk6IGZhbHNlLAotICAgIG1ldGFLZXk6ICBmYWxzZQotICB9LCBhcmd1bWVudHNbMl0gfHwge30pOwotICB2YXIgb0V2ZW50ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoIk1vdXNlRXZlbnRzIik7Ci0gIG9FdmVudC5pbml0TW91c2VFdmVudChldmVudE5hbWUsIHRydWUsIHRydWUsIGRvY3VtZW50LmRlZmF1bHRWaWV3LCAKLSAgICBvcHRpb25zLmJ1dHRvbnMsIG9wdGlvbnMucG9pbnRlclgsIG9wdGlvbnMucG9pbnRlclksIG9wdGlvbnMucG9pbnRlclgsIG9wdGlvbnMucG9pbnRlclksIAotICAgIG9wdGlvbnMuY3RybEtleSwgb3B0aW9ucy5hbHRLZXksIG9wdGlvbnMuc2hpZnRLZXksIG9wdGlvbnMubWV0YUtleSwgMCwgJChlbGVtZW50KSk7Ci0gIAotICBpZih0aGlzLm1hcmspIEVsZW1lbnQucmVtb3ZlKHRoaXMubWFyayk7Ci0gIHRoaXMubWFyayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwotICB0aGlzLm1hcmsuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoIiAiKSk7Ci0gIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5tYXJrKTsKLSAgdGhpcy5tYXJrLnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJzsKLSAgdGhpcy5tYXJrLnN0eWxlLnRvcCA9IG9wdGlvbnMucG9pbnRlclkgKyAicHgiOwotICB0aGlzLm1hcmsuc3R5bGUubGVmdCA9IG9wdGlvbnMucG9pbnRlclggKyAicHgiOwotICB0aGlzLm1hcmsuc3R5bGUud2lkdGggPSAiNXB4IjsKLSAgdGhpcy5tYXJrLnN0eWxlLmhlaWdodCA9ICI1cHg7IjsKLSAgdGhpcy5tYXJrLnN0eWxlLmJvcmRlclRvcCA9ICIxcHggc29saWQgcmVkOyIKLSAgdGhpcy5tYXJrLnN0eWxlLmJvcmRlckxlZnQgPSAiMXB4IHNvbGlkIHJlZDsiCi0gIAotICBpZih0aGlzLnN0ZXApCi0gICAgYWxlcnQoJ1snK25ldyBEYXRlKCkuZ2V0VGltZSgpLnRvU3RyaW5nKCkrJ10gJytldmVudE5hbWUrJy8nK1Rlc3QuVW5pdC5pbnNwZWN0KG9wdGlvbnMpKTsKLSAgCi0gICQoZWxlbWVudCkuZGlzcGF0Y2hFdmVudChvRXZlbnQpOwotfTsKLQotLy8gTm90ZTogRHVlIHRvIGEgZml4IGluIEZpcmVmb3ggMS4wLjUvNiB0aGF0IHByb2JhYmx5IGZpeGVkICJ0b28gbXVjaCIsIHRoaXMgZG9lc24ndCB3b3JrIGluIDEuMC42IG9yIERQMi4KLS8vIFlvdSBuZWVkIHRvIGRvd25ncmFkZSB0byAxLjAuNCBmb3Igbm93IHRvIGdldCB0aGlzIHdvcmtpbmcKLS8vIFNlZSBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD0yODk5NDAgZm9yIHRoZSBmaXggdGhhdCBmaXhlZCB0b28gbXVjaAotRXZlbnQuc2ltdWxhdGVLZXkgPSBmdW5jdGlvbihlbGVtZW50LCBldmVudE5hbWUpIHsKLSAgdmFyIG9wdGlvbnMgPSBPYmplY3QuZXh0ZW5kKHsKLSAgICBjdHJsS2V5OiBmYWxzZSwKLSAgICBhbHRLZXk6IGZhbHNlLAotICAgIHNoaWZ0S2V5OiBmYWxzZSwKLSAgICBtZXRhS2V5OiBmYWxzZSwKLSAgICBrZXlDb2RlOiAwLAotICAgIGNoYXJDb2RlOiAwCi0gIH0sIGFyZ3VtZW50c1syXSB8fCB7fSk7Ci0KLSAgdmFyIG9FdmVudCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCJLZXlFdmVudHMiKTsKLSAgb0V2ZW50LmluaXRLZXlFdmVudChldmVudE5hbWUsIHRydWUsIHRydWUsIHdpbmRvdywgCi0gICAgb3B0aW9ucy5jdHJsS2V5LCBvcHRpb25zLmFsdEtleSwgb3B0aW9ucy5zaGlmdEtleSwgb3B0aW9ucy5tZXRhS2V5LAotICAgIG9wdGlvbnMua2V5Q29kZSwgb3B0aW9ucy5jaGFyQ29kZSApOwotICAkKGVsZW1lbnQpLmRpc3BhdGNoRXZlbnQob0V2ZW50KTsKLX07Ci0KLUV2ZW50LnNpbXVsYXRlS2V5cyA9IGZ1bmN0aW9uKGVsZW1lbnQsIGNvbW1hbmQpIHsKLSAgZm9yKHZhciBpPTA7IGk8Y29tbWFuZC5sZW5ndGg7IGkrKykgewotICAgIEV2ZW50LnNpbXVsYXRlS2V5KGVsZW1lbnQsJ2tleXByZXNzJyx7Y2hhckNvZGU6Y29tbWFuZC5jaGFyQ29kZUF0KGkpfSk7Ci0gIH0KLX07Ci0KLXZhciBUZXN0ID0ge30KLVRlc3QuVW5pdCA9IHt9OwotCi0vLyBzZWN1cml0eSBleGNlcHRpb24gd29ya2Fyb3VuZAotVGVzdC5Vbml0Lmluc3BlY3QgPSBPYmplY3QuaW5zcGVjdDsKLQotVGVzdC5Vbml0LkxvZ2dlciA9IENsYXNzLmNyZWF0ZSgpOwotVGVzdC5Vbml0LkxvZ2dlci5wcm90b3R5cGUgPSB7Ci0gIGluaXRpYWxpemU6IGZ1bmN0aW9uKGxvZykgewotICAgIHRoaXMubG9nID0gJChsb2cpOwotICAgIGlmICh0aGlzLmxvZykgewotICAgICAgdGhpcy5fY3JlYXRlTG9nVGFibGUoKTsKLSAgICB9Ci0gIH0sCi0gIHN0YXJ0OiBmdW5jdGlvbih0ZXN0TmFtZSkgewotICAgIGlmICghdGhpcy5sb2cpIHJldHVybjsKLSAgICB0aGlzLnRlc3ROYW1lID0gdGVzdE5hbWU7Ci0gICAgdGhpcy5sYXN0TG9nTGluZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RyJyk7Ci0gICAgdGhpcy5zdGF0dXNDZWxsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTsKLSAgICB0aGlzLm5hbWVDZWxsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTsKLSAgICB0aGlzLm5hbWVDZWxsLmNsYXNzTmFtZSA9ICJuYW1lQ2VsbCI7Ci0gICAgdGhpcy5uYW1lQ2VsbC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSh0ZXN0TmFtZSkpOwotICAgIHRoaXMubWVzc2FnZUNlbGwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZCcpOwotICAgIHRoaXMubGFzdExvZ0xpbmUuYXBwZW5kQ2hpbGQodGhpcy5zdGF0dXNDZWxsKTsKLSAgICB0aGlzLmxhc3RMb2dMaW5lLmFwcGVuZENoaWxkKHRoaXMubmFtZUNlbGwpOwotICAgIHRoaXMubGFzdExvZ0xpbmUuYXBwZW5kQ2hpbGQodGhpcy5tZXNzYWdlQ2VsbCk7Ci0gICAgdGhpcy5sb2dsaW5lcy5hcHBlbmRDaGlsZCh0aGlzLmxhc3RMb2dMaW5lKTsKLSAgfSwKLSAgZmluaXNoOiBmdW5jdGlvbihzdGF0dXMsIHN1bW1hcnkpIHsKLSAgICBpZiAoIXRoaXMubG9nKSByZXR1cm47Ci0gICAgdGhpcy5sYXN0TG9nTGluZS5jbGFzc05hbWUgPSBzdGF0dXM7Ci0gICAgdGhpcy5zdGF0dXNDZWxsLmlubmVySFRNTCA9IHN0YXR1czsKLSAgICB0aGlzLm1lc3NhZ2VDZWxsLmlubmVySFRNTCA9IHRoaXMuX3RvSFRNTChzdW1tYXJ5KTsKLSAgICB0aGlzLmFkZExpbmtzVG9SZXN1bHRzKCk7Ci0gIH0sCi0gIG1lc3NhZ2U6IGZ1bmN0aW9uKG1lc3NhZ2UpIHsKLSAgICBpZiAoIXRoaXMubG9nKSByZXR1cm47Ci0gICAgdGhpcy5tZXNzYWdlQ2VsbC5pbm5lckhUTUwgPSB0aGlzLl90b0hUTUwobWVzc2FnZSk7Ci0gIH0sCi0gIHN1bW1hcnk6IGZ1bmN0aW9uKHN1bW1hcnkpIHsKLSAgICBpZiAoIXRoaXMubG9nKSByZXR1cm47Ci0gICAgdGhpcy5sb2dzdW1tYXJ5LmlubmVySFRNTCA9IHRoaXMuX3RvSFRNTChzdW1tYXJ5KTsKLSAgfSwKLSAgX2NyZWF0ZUxvZ1RhYmxlOiBmdW5jdGlvbigpIHsKLSAgICB0aGlzLmxvZy5pbm5lckhUTUwgPQotICAgICc8ZGl2IGlkPSJsb2dzdW1tYXJ5Ij48L2Rpdj4nICsKLSAgICAnPHRhYmxlIGlkPSJsb2d0YWJsZSI+JyArCi0gICAgJzx0aGVhZD48dHI+PHRoPlN0YXR1czwvdGg+PHRoPlRlc3Q8L3RoPjx0aD5NZXNzYWdlPC90aD48L3RyPjwvdGhlYWQ+JyArCi0gICAgJzx0Ym9keSBpZD0ibG9nbGluZXMiPjwvdGJvZHk+JyArCi0gICAgJzwvdGFibGU+JzsKLSAgICB0aGlzLmxvZ3N1bW1hcnkgPSAkKCdsb2dzdW1tYXJ5JykKLSAgICB0aGlzLmxvZ2xpbmVzID0gJCgnbG9nbGluZXMnKTsKLSAgfSwKLSAgX3RvSFRNTDogZnVuY3Rpb24odHh0KSB7Ci0gICAgcmV0dXJuIHR4dC5lc2NhcGVIVE1MKCkucmVwbGFjZSgvXG4vZywiPGJyLz4iKTsKLSAgfSwKLSAgYWRkTGlua3NUb1Jlc3VsdHM6IGZ1bmN0aW9uKCl7IAotICAgICQkKCJ0ci5mYWlsZWQgLm5hbWVDZWxsIikuZWFjaCggZnVuY3Rpb24odGQpeyAvLyB0b2RvOiBsaW1pdCB0byBjaGlsZHJlbiBvZiB0aGlzLmxvZwotICAgICAgdGQudGl0bGUgPSAiUnVuIG9ubHkgdGhpcyB0ZXN0IgotICAgICAgRXZlbnQub2JzZXJ2ZSh0ZCwgJ2NsaWNrJywgZnVuY3Rpb24oKXsgd2luZG93LmxvY2F0aW9uLnNlYXJjaCA9ICI/dGVzdHM9IiArIHRkLmlubmVySFRNTDt9KTsKLSAgICB9KTsKLSAgICAkJCgidHIucGFzc2VkIC5uYW1lQ2VsbCIpLmVhY2goIGZ1bmN0aW9uKHRkKXsgLy8gdG9kbzogbGltaXQgdG8gY2hpbGRyZW4gb2YgdGhpcy5sb2cKLSAgICAgIHRkLnRpdGxlID0gIlJ1biBhbGwgdGVzdHMiCi0gICAgICBFdmVudC5vYnNlcnZlKHRkLCAnY2xpY2snLCBmdW5jdGlvbigpeyB3aW5kb3cubG9jYXRpb24uc2VhcmNoID0gIiI7fSk7Ci0gICAgfSk7Ci0gIH0KLX0KLQotVGVzdC5Vbml0LlJ1bm5lciA9IENsYXNzLmNyZWF0ZSgpOwotVGVzdC5Vbml0LlJ1bm5lci5wcm90b3R5cGUgPSB7Ci0gIGluaXRpYWxpemU6IGZ1bmN0aW9uKHRlc3RjYXNlcykgewotICAgIHRoaXMub3B0aW9ucyA9IE9iamVjdC5leHRlbmQoewotICAgICAgdGVzdExvZzogJ3Rlc3Rsb2cnCi0gICAgfSwgYXJndW1lbnRzWzFdIHx8IHt9KTsKLSAgICB0aGlzLm9wdGlvbnMucmVzdWx0c1VSTCA9IHRoaXMucGFyc2VSZXN1bHRzVVJMUXVlcnlQYXJhbWV0ZXIoKTsKLSAgICB0aGlzLm9wdGlvbnMudGVzdHMgICAgICA9IHRoaXMucGFyc2VUZXN0c1F1ZXJ5UGFyYW1ldGVyKCk7Ci0gICAgaWYgKHRoaXMub3B0aW9ucy50ZXN0TG9nKSB7Ci0gICAgICB0aGlzLm9wdGlvbnMudGVzdExvZyA9ICQodGhpcy5vcHRpb25zLnRlc3RMb2cpIHx8IG51bGw7Ci0gICAgfQotICAgIGlmKHRoaXMub3B0aW9ucy50ZXN0cykgewotICAgICAgdGhpcy50ZXN0cyA9IFtdOwotICAgICAgZm9yKHZhciBpID0gMDsgaSA8IHRoaXMub3B0aW9ucy50ZXN0cy5sZW5ndGg7IGkrKykgewotICAgICAgICBpZigvXnRlc3QvLnRlc3QodGhpcy5vcHRpb25zLnRlc3RzW2ldKSkgewotICAgICAgICAgIHRoaXMudGVzdHMucHVzaChuZXcgVGVzdC5Vbml0LlRlc3RjYXNlKHRoaXMub3B0aW9ucy50ZXN0c1tpXSwgdGVzdGNhc2VzW3RoaXMub3B0aW9ucy50ZXN0c1tpXV0sIHRlc3RjYXNlc1sic2V0dXAiXSwgdGVzdGNhc2VzWyJ0ZWFyZG93biJdKSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgaWYgKHRoaXMub3B0aW9ucy50ZXN0KSB7Ci0gICAgICAgIHRoaXMudGVzdHMgPSBbbmV3IFRlc3QuVW5pdC5UZXN0Y2FzZSh0aGlzLm9wdGlvbnMudGVzdCwgdGVzdGNhc2VzW3RoaXMub3B0aW9ucy50ZXN0XSwgdGVzdGNhc2VzWyJzZXR1cCJdLCB0ZXN0Y2FzZXNbInRlYXJkb3duIl0pXTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHRoaXMudGVzdHMgPSBbXTsKLSAgICAgICAgZm9yKHZhciB0ZXN0Y2FzZSBpbiB0ZXN0Y2FzZXMpIHsKLSAgICAgICAgICBpZigvXnRlc3QvLnRlc3QodGVzdGNhc2UpKSB7Ci0gICAgICAgICAgICB0aGlzLnRlc3RzLnB1c2goCi0gICAgICAgICAgICAgICBuZXcgVGVzdC5Vbml0LlRlc3RjYXNlKAotICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuY29udGV4dCA/ICcgLT4gJyArIHRoaXMub3B0aW9ucy50aXRsZXNbdGVzdGNhc2VdIDogdGVzdGNhc2UsIAotICAgICAgICAgICAgICAgICB0ZXN0Y2FzZXNbdGVzdGNhc2VdLCB0ZXN0Y2FzZXNbInNldHVwIl0sIHRlc3RjYXNlc1sidGVhcmRvd24iXQotICAgICAgICAgICAgICAgKSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHRoaXMuY3VycmVudFRlc3QgPSAwOwotICAgIHRoaXMubG9nZ2VyID0gbmV3IFRlc3QuVW5pdC5Mb2dnZXIodGhpcy5vcHRpb25zLnRlc3RMb2cpOwotICAgIHNldFRpbWVvdXQodGhpcy5ydW5UZXN0cy5iaW5kKHRoaXMpLCAxMDAwKTsKLSAgfSwKLSAgcGFyc2VSZXN1bHRzVVJMUXVlcnlQYXJhbWV0ZXI6IGZ1bmN0aW9uKCkgewotICAgIHJldHVybiB3aW5kb3cubG9jYXRpb24uc2VhcmNoLnBhcnNlUXVlcnkoKVsicmVzdWx0c1VSTCJdOwotICB9LAotICBwYXJzZVRlc3RzUXVlcnlQYXJhbWV0ZXI6IGZ1bmN0aW9uKCl7Ci0gICAgaWYgKHdpbmRvdy5sb2NhdGlvbi5zZWFyY2gucGFyc2VRdWVyeSgpWyJ0ZXN0cyJdKXsKLSAgICAgICAgcmV0dXJuIHdpbmRvdy5sb2NhdGlvbi5zZWFyY2gucGFyc2VRdWVyeSgpWyJ0ZXN0cyJdLnNwbGl0KCcsJyk7Ci0gICAgfTsKLSAgfSwKLSAgLy8gUmV0dXJuczoKLSAgLy8gICJFUlJPUiIgaWYgdGhlcmUgd2FzIGFuIGVycm9yLAotICAvLyAgIkZBSUxVUkUiIGlmIHRoZXJlIHdhcyBhIGZhaWx1cmUsIG9yCi0gIC8vICAiU1VDQ0VTUyIgaWYgdGhlcmUgd2FzIG5laXRoZXIKLSAgZ2V0UmVzdWx0OiBmdW5jdGlvbigpIHsKLSAgICB2YXIgaGFzRmFpbHVyZSA9IGZhbHNlOwotICAgIGZvcih2YXIgaT0wO2k8dGhpcy50ZXN0cy5sZW5ndGg7aSsrKSB7Ci0gICAgICBpZiAodGhpcy50ZXN0c1tpXS5lcnJvcnMgPiAwKSB7Ci0gICAgICAgIHJldHVybiAiRVJST1IiOwotICAgICAgfQotICAgICAgaWYgKHRoaXMudGVzdHNbaV0uZmFpbHVyZXMgPiAwKSB7Ci0gICAgICAgIGhhc0ZhaWx1cmUgPSB0cnVlOwotICAgICAgfQotICAgIH0KLSAgICBpZiAoaGFzRmFpbHVyZSkgewotICAgICAgcmV0dXJuICJGQUlMVVJFIjsKLSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuICJTVUNDRVNTIjsKLSAgICB9Ci0gIH0sCi0gIHBvc3RSZXN1bHRzOiBmdW5jdGlvbigpIHsKLSAgICBpZiAodGhpcy5vcHRpb25zLnJlc3VsdHNVUkwpIHsKLSAgICAgIG5ldyBBamF4LlJlcXVlc3QodGhpcy5vcHRpb25zLnJlc3VsdHNVUkwsIAotICAgICAgICB7IG1ldGhvZDogJ2dldCcsIHBhcmFtZXRlcnM6ICdyZXN1bHQ9JyArIHRoaXMuZ2V0UmVzdWx0KCksIGFzeW5jaHJvbm91czogZmFsc2UgfSk7Ci0gICAgfQotICB9LAotICBydW5UZXN0czogZnVuY3Rpb24oKSB7Ci0gICAgdmFyIHRlc3QgPSB0aGlzLnRlc3RzW3RoaXMuY3VycmVudFRlc3RdOwotICAgIGlmICghdGVzdCkgewotICAgICAgLy8gZmluaXNoZWQhCi0gICAgICB0aGlzLnBvc3RSZXN1bHRzKCk7Ci0gICAgICB0aGlzLmxvZ2dlci5zdW1tYXJ5KHRoaXMuc3VtbWFyeSgpKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaWYoIXRlc3QuaXNXYWl0aW5nKSB7Ci0gICAgICB0aGlzLmxvZ2dlci5zdGFydCh0ZXN0Lm5hbWUpOwotICAgIH0KLSAgICB0ZXN0LnJ1bigpOwotICAgIGlmKHRlc3QuaXNXYWl0aW5nKSB7Ci0gICAgICB0aGlzLmxvZ2dlci5tZXNzYWdlKCJXYWl0aW5nIGZvciAiICsgdGVzdC50aW1lVG9XYWl0ICsgIm1zIik7Ci0gICAgICBzZXRUaW1lb3V0KHRoaXMucnVuVGVzdHMuYmluZCh0aGlzKSwgdGVzdC50aW1lVG9XYWl0IHx8IDEwMDApOwotICAgIH0gZWxzZSB7Ci0gICAgICB0aGlzLmxvZ2dlci5maW5pc2godGVzdC5zdGF0dXMoKSwgdGVzdC5zdW1tYXJ5KCkpOwotICAgICAgdGhpcy5jdXJyZW50VGVzdCsrOwotICAgICAgLy8gdGFpbCByZWN1cnNpdmUsIGhvcGVmdWxseSB0aGUgYnJvd3NlciB3aWxsIHNraXAgdGhlIHN0YWNrZnJhbWUKLSAgICAgIHRoaXMucnVuVGVzdHMoKTsKLSAgICB9Ci0gIH0sCi0gIHN1bW1hcnk6IGZ1bmN0aW9uKCkgewotICAgIHZhciBhc3NlcnRpb25zID0gMDsKLSAgICB2YXIgZmFpbHVyZXMgPSAwOwotICAgIHZhciBlcnJvcnMgPSAwOwotICAgIHZhciBtZXNzYWdlcyA9IFtdOwotICAgIGZvcih2YXIgaT0wO2k8dGhpcy50ZXN0cy5sZW5ndGg7aSsrKSB7Ci0gICAgICBhc3NlcnRpb25zICs9ICAgdGhpcy50ZXN0c1tpXS5hc3NlcnRpb25zOwotICAgICAgZmFpbHVyZXMgICArPSAgIHRoaXMudGVzdHNbaV0uZmFpbHVyZXM7Ci0gICAgICBlcnJvcnMgICAgICs9ICAgdGhpcy50ZXN0c1tpXS5lcnJvcnM7Ci0gICAgfQotICAgIHJldHVybiAoCi0gICAgICAodGhpcy5vcHRpb25zLmNvbnRleHQgPyB0aGlzLm9wdGlvbnMuY29udGV4dCArICc6ICc6ICcnKSArIAotICAgICAgdGhpcy50ZXN0cy5sZW5ndGggKyAiIHRlc3RzLCAiICsgCi0gICAgICBhc3NlcnRpb25zICsgIiBhc3NlcnRpb25zLCAiICsgCi0gICAgICBmYWlsdXJlcyAgICsgIiBmYWlsdXJlcywgIiArCi0gICAgICBlcnJvcnMgICAgICsgIiBlcnJvcnMiKTsKLSAgfQotfQotCi1UZXN0LlVuaXQuQXNzZXJ0aW9ucyA9IENsYXNzLmNyZWF0ZSgpOwotVGVzdC5Vbml0LkFzc2VydGlvbnMucHJvdG90eXBlID0gewotICBpbml0aWFsaXplOiBmdW5jdGlvbigpIHsKLSAgICB0aGlzLmFzc2VydGlvbnMgPSAwOwotICAgIHRoaXMuZmFpbHVyZXMgICA9IDA7Ci0gICAgdGhpcy5lcnJvcnMgICAgID0gMDsKLSAgICB0aGlzLm1lc3NhZ2VzICAgPSBbXTsKLSAgfSwKLSAgc3VtbWFyeTogZnVuY3Rpb24oKSB7Ci0gICAgcmV0dXJuICgKLSAgICAgIHRoaXMuYXNzZXJ0aW9ucyArICIgYXNzZXJ0aW9ucywgIiArIAotICAgICAgdGhpcy5mYWlsdXJlcyAgICsgIiBmYWlsdXJlcywgIiArCi0gICAgICB0aGlzLmVycm9ycyAgICAgKyAiIGVycm9ycyIgKyAiXG4iICsKLSAgICAgIHRoaXMubWVzc2FnZXMuam9pbigiXG4iKSk7Ci0gIH0sCi0gIHBhc3M6IGZ1bmN0aW9uKCkgewotICAgIHRoaXMuYXNzZXJ0aW9ucysrOwotICB9LAotICBmYWlsOiBmdW5jdGlvbihtZXNzYWdlKSB7Ci0gICAgdGhpcy5mYWlsdXJlcysrOwotICAgIHRoaXMubWVzc2FnZXMucHVzaCgiRmFpbHVyZTogIiArIG1lc3NhZ2UpOwotICB9LAotICBpbmZvOiBmdW5jdGlvbihtZXNzYWdlKSB7Ci0gICAgdGhpcy5tZXNzYWdlcy5wdXNoKCJJbmZvOiAiICsgbWVzc2FnZSk7Ci0gIH0sCi0gIGVycm9yOiBmdW5jdGlvbihlcnJvcikgewotICAgIHRoaXMuZXJyb3JzKys7Ci0gICAgdGhpcy5tZXNzYWdlcy5wdXNoKGVycm9yLm5hbWUgKyAiOiAiKyBlcnJvci5tZXNzYWdlICsgIigiICsgVGVzdC5Vbml0Lmluc3BlY3QoZXJyb3IpICsiKSIpOwotICB9LAotICBzdGF0dXM6IGZ1bmN0aW9uKCkgewotICAgIGlmICh0aGlzLmZhaWx1cmVzID4gMCkgcmV0dXJuICdmYWlsZWQnOwotICAgIGlmICh0aGlzLmVycm9ycyA+IDApIHJldHVybiAnZXJyb3InOwotICAgIHJldHVybiAncGFzc2VkJzsKLSAgfSwKLSAgYXNzZXJ0OiBmdW5jdGlvbihleHByZXNzaW9uKSB7Ci0gICAgdmFyIG1lc3NhZ2UgPSBhcmd1bWVudHNbMV0gfHwgJ2Fzc2VydDogZ290ICInICsgVGVzdC5Vbml0Lmluc3BlY3QoZXhwcmVzc2lvbikgKyAnIic7Ci0gICAgdHJ5IHsgZXhwcmVzc2lvbiA/IHRoaXMucGFzcygpIDogCi0gICAgICB0aGlzLmZhaWwobWVzc2FnZSk7IH0KLSAgICBjYXRjaChlKSB7IHRoaXMuZXJyb3IoZSk7IH0KLSAgfSwKLSAgYXNzZXJ0RXF1YWw6IGZ1bmN0aW9uKGV4cGVjdGVkLCBhY3R1YWwpIHsKLSAgICB2YXIgbWVzc2FnZSA9IGFyZ3VtZW50c1syXSB8fCAiYXNzZXJ0RXF1YWwiOwotICAgIHRyeSB7IChleHBlY3RlZCA9PSBhY3R1YWwpID8gdGhpcy5wYXNzKCkgOgotICAgICAgdGhpcy5mYWlsKG1lc3NhZ2UgKyAnOiBleHBlY3RlZCAiJyArIFRlc3QuVW5pdC5pbnNwZWN0KGV4cGVjdGVkKSArIAotICAgICAgICAnIiwgYWN0dWFsICInICsgVGVzdC5Vbml0Lmluc3BlY3QoYWN0dWFsKSArICciJyk7IH0KLSAgICBjYXRjaChlKSB7IHRoaXMuZXJyb3IoZSk7IH0KLSAgfSwKLSAgYXNzZXJ0SW5zcGVjdDogZnVuY3Rpb24oZXhwZWN0ZWQsIGFjdHVhbCkgewotICAgIHZhciBtZXNzYWdlID0gYXJndW1lbnRzWzJdIHx8ICJhc3NlcnRJbnNwZWN0IjsKLSAgICB0cnkgeyAoZXhwZWN0ZWQgPT0gYWN0dWFsLmluc3BlY3QoKSkgPyB0aGlzLnBhc3MoKSA6Ci0gICAgICB0aGlzLmZhaWwobWVzc2FnZSArICc6IGV4cGVjdGVkICInICsgVGVzdC5Vbml0Lmluc3BlY3QoZXhwZWN0ZWQpICsgCi0gICAgICAgICciLCBhY3R1YWwgIicgKyBUZXN0LlVuaXQuaW5zcGVjdChhY3R1YWwpICsgJyInKTsgfQotICAgIGNhdGNoKGUpIHsgdGhpcy5lcnJvcihlKTsgfQotICB9LAotICBhc3NlcnRFbnVtRXF1YWw6IGZ1bmN0aW9uKGV4cGVjdGVkLCBhY3R1YWwpIHsKLSAgICB2YXIgbWVzc2FnZSA9IGFyZ3VtZW50c1syXSB8fCAiYXNzZXJ0RW51bUVxdWFsIjsKLSAgICB0cnkgeyAkQShleHBlY3RlZCkubGVuZ3RoID09ICRBKGFjdHVhbCkubGVuZ3RoICYmIAotICAgICAgZXhwZWN0ZWQuemlwKGFjdHVhbCkuYWxsKGZ1bmN0aW9uKHBhaXIpIHsgcmV0dXJuIHBhaXJbMF0gPT0gcGFpclsxXSB9KSA/Ci0gICAgICAgIHRoaXMucGFzcygpIDogdGhpcy5mYWlsKG1lc3NhZ2UgKyAnOiBleHBlY3RlZCAnICsgVGVzdC5Vbml0Lmluc3BlY3QoZXhwZWN0ZWQpICsgCi0gICAgICAgICAgJywgYWN0dWFsICcgKyBUZXN0LlVuaXQuaW5zcGVjdChhY3R1YWwpKTsgfQotICAgIGNhdGNoKGUpIHsgdGhpcy5lcnJvcihlKTsgfQotICB9LAotICBhc3NlcnROb3RFcXVhbDogZnVuY3Rpb24oZXhwZWN0ZWQsIGFjdHVhbCkgewotICAgIHZhciBtZXNzYWdlID0gYXJndW1lbnRzWzJdIHx8ICJhc3NlcnROb3RFcXVhbCI7Ci0gICAgdHJ5IHsgKGV4cGVjdGVkICE9IGFjdHVhbCkgPyB0aGlzLnBhc3MoKSA6IAotICAgICAgdGhpcy5mYWlsKG1lc3NhZ2UgKyAnOiBnb3QgIicgKyBUZXN0LlVuaXQuaW5zcGVjdChhY3R1YWwpICsgJyInKTsgfQotICAgIGNhdGNoKGUpIHsgdGhpcy5lcnJvcihlKTsgfQotICB9LAotICBhc3NlcnRJZGVudGljYWw6IGZ1bmN0aW9uKGV4cGVjdGVkLCBhY3R1YWwpIHsgCi0gICAgdmFyIG1lc3NhZ2UgPSBhcmd1bWVudHNbMl0gfHwgImFzc2VydElkZW50aWNhbCI7IAotICAgIHRyeSB7IChleHBlY3RlZCA9PT0gYWN0dWFsKSA/IHRoaXMucGFzcygpIDogCi0gICAgICB0aGlzLmZhaWwobWVzc2FnZSArICc6IGV4cGVjdGVkICInICsgVGVzdC5Vbml0Lmluc3BlY3QoZXhwZWN0ZWQpICsgIAotICAgICAgICAnIiwgYWN0dWFsICInICsgVGVzdC5Vbml0Lmluc3BlY3QoYWN0dWFsKSArICciJyk7IH0gCi0gICAgY2F0Y2goZSkgeyB0aGlzLmVycm9yKGUpOyB9IAotICB9LAotICBhc3NlcnROb3RJZGVudGljYWw6IGZ1bmN0aW9uKGV4cGVjdGVkLCBhY3R1YWwpIHsgCi0gICAgdmFyIG1lc3NhZ2UgPSBhcmd1bWVudHNbMl0gfHwgImFzc2VydE5vdElkZW50aWNhbCI7IAotICAgIHRyeSB7ICEoZXhwZWN0ZWQgPT09IGFjdHVhbCkgPyB0aGlzLnBhc3MoKSA6IAotICAgICAgdGhpcy5mYWlsKG1lc3NhZ2UgKyAnOiBleHBlY3RlZCAiJyArIFRlc3QuVW5pdC5pbnNwZWN0KGV4cGVjdGVkKSArICAKLSAgICAgICAgJyIsIGFjdHVhbCAiJyArIFRlc3QuVW5pdC5pbnNwZWN0KGFjdHVhbCkgKyAnIicpOyB9IAotICAgIGNhdGNoKGUpIHsgdGhpcy5lcnJvcihlKTsgfSAKLSAgfSwKLSAgYXNzZXJ0TnVsbDogZnVuY3Rpb24ob2JqKSB7Ci0gICAgdmFyIG1lc3NhZ2UgPSBhcmd1bWVudHNbMV0gfHwgJ2Fzc2VydE51bGwnCi0gICAgdHJ5IHsgKG9iaj09bnVsbCkgPyB0aGlzLnBhc3MoKSA6IAotICAgICAgdGhpcy5mYWlsKG1lc3NhZ2UgKyAnOiBnb3QgIicgKyBUZXN0LlVuaXQuaW5zcGVjdChvYmopICsgJyInKTsgfQotICAgIGNhdGNoKGUpIHsgdGhpcy5lcnJvcihlKTsgfQotICB9LAotICBhc3NlcnRNYXRjaDogZnVuY3Rpb24oZXhwZWN0ZWQsIGFjdHVhbCkgewotICAgIHZhciBtZXNzYWdlID0gYXJndW1lbnRzWzJdIHx8ICdhc3NlcnRNYXRjaCc7Ci0gICAgdmFyIHJlZ2V4ID0gbmV3IFJlZ0V4cChleHBlY3RlZCk7Ci0gICAgdHJ5IHsgKHJlZ2V4LmV4ZWMoYWN0dWFsKSkgPyB0aGlzLnBhc3MoKSA6Ci0gICAgICB0aGlzLmZhaWwobWVzc2FnZSArICcgOiByZWdleDogIicgKyAgVGVzdC5Vbml0Lmluc3BlY3QoZXhwZWN0ZWQpICsgJyBkaWQgbm90IG1hdGNoOiAnICsgVGVzdC5Vbml0Lmluc3BlY3QoYWN0dWFsKSArICciJyk7IH0KLSAgICBjYXRjaChlKSB7IHRoaXMuZXJyb3IoZSk7IH0KLSAgfSwKLSAgYXNzZXJ0SGlkZGVuOiBmdW5jdGlvbihlbGVtZW50KSB7Ci0gICAgdmFyIG1lc3NhZ2UgPSBhcmd1bWVudHNbMV0gfHwgJ2Fzc2VydEhpZGRlbic7Ci0gICAgdGhpcy5hc3NlcnRFcXVhbCgibm9uZSIsIGVsZW1lbnQuc3R5bGUuZGlzcGxheSwgbWVzc2FnZSk7Ci0gIH0sCi0gIGFzc2VydE5vdE51bGw6IGZ1bmN0aW9uKG9iamVjdCkgewotICAgIHZhciBtZXNzYWdlID0gYXJndW1lbnRzWzFdIHx8ICdhc3NlcnROb3ROdWxsJzsKLSAgICB0aGlzLmFzc2VydChvYmplY3QgIT0gbnVsbCwgbWVzc2FnZSk7Ci0gIH0sCi0gIGFzc2VydFR5cGU6IGZ1bmN0aW9uKGV4cGVjdGVkLCBhY3R1YWwpIHsKLSAgICB2YXIgbWVzc2FnZSA9IGFyZ3VtZW50c1syXSB8fCAnYXNzZXJ0VHlwZSc7Ci0gICAgdHJ5IHsgCi0gICAgICAoYWN0dWFsLmNvbnN0cnVjdG9yID09IGV4cGVjdGVkKSA/IHRoaXMucGFzcygpIDogCi0gICAgICB0aGlzLmZhaWwobWVzc2FnZSArICc6IGV4cGVjdGVkICInICsgVGVzdC5Vbml0Lmluc3BlY3QoZXhwZWN0ZWQpICsgIAotICAgICAgICAnIiwgYWN0dWFsICInICsgKGFjdHVhbC5jb25zdHJ1Y3RvcikgKyAnIicpOyB9Ci0gICAgY2F0Y2goZSkgeyB0aGlzLmVycm9yKGUpOyB9Ci0gIH0sCi0gIGFzc2VydE5vdE9mVHlwZTogZnVuY3Rpb24oZXhwZWN0ZWQsIGFjdHVhbCkgewotICAgIHZhciBtZXNzYWdlID0gYXJndW1lbnRzWzJdIHx8ICdhc3NlcnROb3RPZlR5cGUnOwotICAgIHRyeSB7IAotICAgICAgKGFjdHVhbC5jb25zdHJ1Y3RvciAhPSBleHBlY3RlZCkgPyB0aGlzLnBhc3MoKSA6IAotICAgICAgdGhpcy5mYWlsKG1lc3NhZ2UgKyAnOiBleHBlY3RlZCAiJyArIFRlc3QuVW5pdC5pbnNwZWN0KGV4cGVjdGVkKSArICAKLSAgICAgICAgJyIsIGFjdHVhbCAiJyArIChhY3R1YWwuY29uc3RydWN0b3IpICsgJyInKTsgfQotICAgIGNhdGNoKGUpIHsgdGhpcy5lcnJvcihlKTsgfQotICB9LAotICBhc3NlcnRJbnN0YW5jZU9mOiBmdW5jdGlvbihleHBlY3RlZCwgYWN0dWFsKSB7Ci0gICAgdmFyIG1lc3NhZ2UgPSBhcmd1bWVudHNbMl0gfHwgJ2Fzc2VydEluc3RhbmNlT2YnOwotICAgIHRyeSB7IAotICAgICAgKGFjdHVhbCBpbnN0YW5jZW9mIGV4cGVjdGVkKSA/IHRoaXMucGFzcygpIDogCi0gICAgICB0aGlzLmZhaWwobWVzc2FnZSArICI6IG9iamVjdCB3YXMgbm90IGFuIGluc3RhbmNlIG9mIHRoZSBleHBlY3RlZCB0eXBlIik7IH0KLSAgICBjYXRjaChlKSB7IHRoaXMuZXJyb3IoZSk7IH0gCi0gIH0sCi0gIGFzc2VydE5vdEluc3RhbmNlT2Y6IGZ1bmN0aW9uKGV4cGVjdGVkLCBhY3R1YWwpIHsKLSAgICB2YXIgbWVzc2FnZSA9IGFyZ3VtZW50c1syXSB8fCAnYXNzZXJ0Tm90SW5zdGFuY2VPZic7Ci0gICAgdHJ5IHsgCi0gICAgICAhKGFjdHVhbCBpbnN0YW5jZW9mIGV4cGVjdGVkKSA/IHRoaXMucGFzcygpIDogCi0gICAgICB0aGlzLmZhaWwobWVzc2FnZSArICI6IG9iamVjdCB3YXMgYW4gaW5zdGFuY2Ugb2YgdGhlIG5vdCBleHBlY3RlZCB0eXBlIik7IH0KLSAgICBjYXRjaChlKSB7IHRoaXMuZXJyb3IoZSk7IH0gCi0gIH0sCi0gIGFzc2VydFJlc3BvbmRzVG86IGZ1bmN0aW9uKG1ldGhvZCwgb2JqKSB7Ci0gICAgdmFyIG1lc3NhZ2UgPSBhcmd1bWVudHNbMl0gfHwgJ2Fzc2VydFJlc3BvbmRzVG8nOwotICAgIHRyeSB7Ci0gICAgICAob2JqW21ldGhvZF0gJiYgdHlwZW9mIG9ialttZXRob2RdID09ICdmdW5jdGlvbicpID8gdGhpcy5wYXNzKCkgOiAKLSAgICAgIHRoaXMuZmFpbChtZXNzYWdlICsgIjogb2JqZWN0IGRvZXNuJ3QgcmVzcG9uZCB0byBbIiArIG1ldGhvZCArICJdIik7IH0KLSAgICBjYXRjaChlKSB7IHRoaXMuZXJyb3IoZSk7IH0KLSAgfSwKLSAgYXNzZXJ0UmV0dXJuc1RydWU6IGZ1bmN0aW9uKG1ldGhvZCwgb2JqKSB7Ci0gICAgdmFyIG1lc3NhZ2UgPSBhcmd1bWVudHNbMl0gfHwgJ2Fzc2VydFJldHVybnNUcnVlJzsKLSAgICB0cnkgewotICAgICAgdmFyIG0gPSBvYmpbbWV0aG9kXTsKLSAgICAgIGlmKCFtKSBtID0gb2JqWydpcycrbWV0aG9kLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpK21ldGhvZC5zbGljZSgxKV07Ci0gICAgICBtKCkgPyB0aGlzLnBhc3MoKSA6IAotICAgICAgdGhpcy5mYWlsKG1lc3NhZ2UgKyAiOiBtZXRob2QgcmV0dXJuZWQgZmFsc2UiKTsgfQotICAgIGNhdGNoKGUpIHsgdGhpcy5lcnJvcihlKTsgfQotICB9LAotICBhc3NlcnRSZXR1cm5zRmFsc2U6IGZ1bmN0aW9uKG1ldGhvZCwgb2JqKSB7Ci0gICAgdmFyIG1lc3NhZ2UgPSBhcmd1bWVudHNbMl0gfHwgJ2Fzc2VydFJldHVybnNGYWxzZSc7Ci0gICAgdHJ5IHsKLSAgICAgIHZhciBtID0gb2JqW21ldGhvZF07Ci0gICAgICBpZighbSkgbSA9IG9ialsnaXMnK21ldGhvZC5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSttZXRob2Quc2xpY2UoMSldOwotICAgICAgIW0oKSA/IHRoaXMucGFzcygpIDogCi0gICAgICB0aGlzLmZhaWwobWVzc2FnZSArICI6IG1ldGhvZCByZXR1cm5lZCB0cnVlIik7IH0KLSAgICBjYXRjaChlKSB7IHRoaXMuZXJyb3IoZSk7IH0KLSAgfSwKLSAgYXNzZXJ0UmFpc2U6IGZ1bmN0aW9uKGV4Y2VwdGlvbk5hbWUsIG1ldGhvZCkgewotICAgIHZhciBtZXNzYWdlID0gYXJndW1lbnRzWzJdIHx8ICdhc3NlcnRSYWlzZSc7Ci0gICAgdHJ5IHsgCi0gICAgICBtZXRob2QoKTsKLSAgICAgIHRoaXMuZmFpbChtZXNzYWdlICsgIjogZXhjZXB0aW9uIGV4cGVjdGVkIGJ1dCBub25lIHdhcyByYWlzZWQiKTsgfQotICAgIGNhdGNoKGUpIHsKLSAgICAgICgoZXhjZXB0aW9uTmFtZSA9PSBudWxsKSB8fCAoZS5uYW1lPT1leGNlcHRpb25OYW1lKSkgPyB0aGlzLnBhc3MoKSA6IHRoaXMuZXJyb3IoZSk7IAotICAgIH0KLSAgfSwKLSAgYXNzZXJ0RWxlbWVudHNNYXRjaDogZnVuY3Rpb24oKSB7Ci0gICAgdmFyIGV4cHJlc3Npb25zID0gJEEoYXJndW1lbnRzKSwgZWxlbWVudHMgPSAkQShleHByZXNzaW9ucy5zaGlmdCgpKTsKLSAgICBpZiAoZWxlbWVudHMubGVuZ3RoICE9IGV4cHJlc3Npb25zLmxlbmd0aCkgewotICAgICAgdGhpcy5mYWlsKCdhc3NlcnRFbGVtZW50c01hdGNoOiBzaXplIG1pc21hdGNoOiAnICsgZWxlbWVudHMubGVuZ3RoICsgJyBlbGVtZW50cywgJyArIGV4cHJlc3Npb25zLmxlbmd0aCArICcgZXhwcmVzc2lvbnMnKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgZWxlbWVudHMuemlwKGV4cHJlc3Npb25zKS5hbGwoZnVuY3Rpb24ocGFpciwgaW5kZXgpIHsKLSAgICAgIHZhciBlbGVtZW50ID0gJChwYWlyLmZpcnN0KCkpLCBleHByZXNzaW9uID0gcGFpci5sYXN0KCk7Ci0gICAgICBpZiAoZWxlbWVudC5tYXRjaChleHByZXNzaW9uKSkgcmV0dXJuIHRydWU7Ci0gICAgICB0aGlzLmZhaWwoJ2Fzc2VydEVsZW1lbnRzTWF0Y2g6IChpbiBpbmRleCAnICsgaW5kZXggKyAnKSBleHBlY3RlZCAnICsgZXhwcmVzc2lvbi5pbnNwZWN0KCkgKyAnIGJ1dCBnb3QgJyArIGVsZW1lbnQuaW5zcGVjdCgpKTsKLSAgICB9LmJpbmQodGhpcykpICYmIHRoaXMucGFzcygpOwotICB9LAotICBhc3NlcnRFbGVtZW50TWF0Y2hlczogZnVuY3Rpb24oZWxlbWVudCwgZXhwcmVzc2lvbikgewotICAgIHRoaXMuYXNzZXJ0RWxlbWVudHNNYXRjaChbZWxlbWVudF0sIGV4cHJlc3Npb24pOwotICB9LAotICBiZW5jaG1hcms6IGZ1bmN0aW9uKG9wZXJhdGlvbiwgaXRlcmF0aW9ucykgewotICAgIHZhciBzdGFydEF0ID0gbmV3IERhdGUoKTsKLSAgICAoaXRlcmF0aW9ucyB8fCAxKS50aW1lcyhvcGVyYXRpb24pOwotICAgIHZhciB0aW1lVGFrZW4gPSAoKG5ldyBEYXRlKCkpLXN0YXJ0QXQpOwotICAgIHRoaXMuaW5mbygoYXJndW1lbnRzWzJdIHx8ICdPcGVyYXRpb24nKSArICcgZmluaXNoZWQgJyArIAotICAgICAgIGl0ZXJhdGlvbnMgKyAnIGl0ZXJhdGlvbnMgaW4gJyArICh0aW1lVGFrZW4vMTAwMCkrJ3MnICk7Ci0gICAgcmV0dXJuIHRpbWVUYWtlbjsKLSAgfSwKLSAgX2lzVmlzaWJsZTogZnVuY3Rpb24oZWxlbWVudCkgewotICAgIGVsZW1lbnQgPSAkKGVsZW1lbnQpOwotICAgIGlmKCFlbGVtZW50LnBhcmVudE5vZGUpIHJldHVybiB0cnVlOwotICAgIHRoaXMuYXNzZXJ0Tm90TnVsbChlbGVtZW50KTsKLSAgICBpZihlbGVtZW50LnN0eWxlICYmIEVsZW1lbnQuZ2V0U3R5bGUoZWxlbWVudCwgJ2Rpc3BsYXknKSA9PSAnbm9uZScpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgCi0gICAgcmV0dXJuIHRoaXMuX2lzVmlzaWJsZShlbGVtZW50LnBhcmVudE5vZGUpOwotICB9LAotICBhc3NlcnROb3RWaXNpYmxlOiBmdW5jdGlvbihlbGVtZW50KSB7Ci0gICAgdGhpcy5hc3NlcnQoIXRoaXMuX2lzVmlzaWJsZShlbGVtZW50KSwgVGVzdC5Vbml0Lmluc3BlY3QoZWxlbWVudCkgKyAiIHdhcyBub3QgaGlkZGVuIGFuZCBkaWRuJ3QgaGF2ZSBhIGhpZGRlbiBwYXJlbnQgZWl0aGVyLiAiICsgKCIiIHx8IGFyZ3VtZW50c1sxXSkpOwotICB9LAotICBhc3NlcnRWaXNpYmxlOiBmdW5jdGlvbihlbGVtZW50KSB7Ci0gICAgdGhpcy5hc3NlcnQodGhpcy5faXNWaXNpYmxlKGVsZW1lbnQpLCBUZXN0LlVuaXQuaW5zcGVjdChlbGVtZW50KSArICIgd2FzIG5vdCB2aXNpYmxlLiAiICsgKCIiIHx8IGFyZ3VtZW50c1sxXSkpOwotICB9LAotICBiZW5jaG1hcms6IGZ1bmN0aW9uKG9wZXJhdGlvbiwgaXRlcmF0aW9ucykgewotICAgIHZhciBzdGFydEF0ID0gbmV3IERhdGUoKTsKLSAgICAoaXRlcmF0aW9ucyB8fCAxKS50aW1lcyhvcGVyYXRpb24pOwotICAgIHZhciB0aW1lVGFrZW4gPSAoKG5ldyBEYXRlKCkpLXN0YXJ0QXQpOwotICAgIHRoaXMuaW5mbygoYXJndW1lbnRzWzJdIHx8ICdPcGVyYXRpb24nKSArICcgZmluaXNoZWQgJyArIAotICAgICAgIGl0ZXJhdGlvbnMgKyAnIGl0ZXJhdGlvbnMgaW4gJyArICh0aW1lVGFrZW4vMTAwMCkrJ3MnICk7Ci0gICAgcmV0dXJuIHRpbWVUYWtlbjsKLSAgfQotfQotCi1UZXN0LlVuaXQuVGVzdGNhc2UgPSBDbGFzcy5jcmVhdGUoKTsKLU9iamVjdC5leHRlbmQoT2JqZWN0LmV4dGVuZChUZXN0LlVuaXQuVGVzdGNhc2UucHJvdG90eXBlLCBUZXN0LlVuaXQuQXNzZXJ0aW9ucy5wcm90b3R5cGUpLCB7Ci0gIGluaXRpYWxpemU6IGZ1bmN0aW9uKG5hbWUsIHRlc3QsIHNldHVwLCB0ZWFyZG93bikgewotICAgIFRlc3QuVW5pdC5Bc3NlcnRpb25zLnByb3RvdHlwZS5pbml0aWFsaXplLmJpbmQodGhpcykoKTsKLSAgICB0aGlzLm5hbWUgICAgICAgICAgID0gbmFtZTsKLSAgICAKLSAgICBpZih0eXBlb2YgdGVzdCA9PSAnc3RyaW5nJykgewotICAgICAgdGVzdCA9IHRlc3QuZ3N1YigvKFwuc2hvdWxkW15cKF0rXCgpLywnI3swfXRoaXMsJyk7Ci0gICAgICB0ZXN0ID0gdGVzdC5nc3ViKC8oXC5zaG91bGRbXlwoXSspXCh0aGlzLFwpLywnI3sxfSh0aGlzKScpOwotICAgICAgdGhpcy50ZXN0ID0gZnVuY3Rpb24oKSB7Ci0gICAgICAgIGV2YWwoJ3dpdGgodGhpcyl7Jyt0ZXN0Kyd9Jyk7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIHRoaXMudGVzdCA9IHRlc3QgfHwgZnVuY3Rpb24oKSB7fTsKLSAgICB9Ci0gICAgCi0gICAgdGhpcy5zZXR1cCAgICAgICAgICA9IHNldHVwIHx8IGZ1bmN0aW9uKCkge307Ci0gICAgdGhpcy50ZWFyZG93biAgICAgICA9IHRlYXJkb3duIHx8IGZ1bmN0aW9uKCkge307Ci0gICAgdGhpcy5pc1dhaXRpbmcgICAgICA9IGZhbHNlOwotICAgIHRoaXMudGltZVRvV2FpdCAgICAgPSAxMDAwOwotICB9LAotICB3YWl0OiBmdW5jdGlvbih0aW1lLCBuZXh0UGFydCkgewotICAgIHRoaXMuaXNXYWl0aW5nID0gdHJ1ZTsKLSAgICB0aGlzLnRlc3QgPSBuZXh0UGFydDsKLSAgICB0aGlzLnRpbWVUb1dhaXQgPSB0aW1lOwotICB9LAotICBydW46IGZ1bmN0aW9uKCkgewotICAgIHRyeSB7Ci0gICAgICB0cnkgewotICAgICAgICBpZiAoIXRoaXMuaXNXYWl0aW5nKSB0aGlzLnNldHVwLmJpbmQodGhpcykoKTsKLSAgICAgICAgdGhpcy5pc1dhaXRpbmcgPSBmYWxzZTsKLSAgICAgICAgdGhpcy50ZXN0LmJpbmQodGhpcykoKTsKLSAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgIGlmKCF0aGlzLmlzV2FpdGluZykgewotICAgICAgICAgIHRoaXMudGVhcmRvd24uYmluZCh0aGlzKSgpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIGNhdGNoKGUpIHsgdGhpcy5lcnJvcihlKTsgfQotICB9Ci19KTsKLQotLy8gKkVYUEVSSU1FTlRBTCogQkRELXN0eWxlIHRlc3RpbmcgdG8gcGxlYXNlIG5vbi10ZWNobmljYWwgZm9sawotLy8gVGhpcyBkcmF3cyBtYW55IGlkZWFzIGZyb20gUlNwZWMgaHR0cDovL3JzcGVjLnJ1Ynlmb3JnZS5vcmcvCi0KLVRlc3Quc2V0dXBCRERFeHRlbnNpb25NZXRob2RzID0gZnVuY3Rpb24oKXsKLSAgdmFyIE1FVEhPRE1BUCA9IHsKLSAgICBzaG91bGRFcXVhbDogICAgICdhc3NlcnRFcXVhbCcsCi0gICAgc2hvdWxkTm90RXF1YWw6ICAnYXNzZXJ0Tm90RXF1YWwnLAotICAgIHNob3VsZEVxdWFsRW51bTogJ2Fzc2VydEVudW1FcXVhbCcsCi0gICAgc2hvdWxkQmVBOiAgICAgICAnYXNzZXJ0VHlwZScsCi0gICAgc2hvdWxkTm90QmVBOiAgICAnYXNzZXJ0Tm90T2ZUeXBlJywKLSAgICBzaG91bGRCZUFuOiAgICAgICdhc3NlcnRUeXBlJywKLSAgICBzaG91bGROb3RCZUFuOiAgICdhc3NlcnROb3RPZlR5cGUnLAotICAgIHNob3VsZEJlTnVsbDogICAgJ2Fzc2VydE51bGwnLAotICAgIHNob3VsZE5vdEJlTnVsbDogJ2Fzc2VydE5vdE51bGwnLAotICAgIAotICAgIHNob3VsZEJlOiAgICAgICAgJ2Fzc2VydFJldHVybnNUcnVlJywKLSAgICBzaG91bGROb3RCZTogICAgICdhc3NlcnRSZXR1cm5zRmFsc2UnLAotICAgIHNob3VsZFJlc3BvbmRUbzogJ2Fzc2VydFJlc3BvbmRzVG8nCi0gIH07Ci0gIFRlc3QuQkRETWV0aG9kcyA9IHt9OwotICBmb3IobSBpbiBNRVRIT0RNQVApIHsKLSAgICBUZXN0LkJERE1ldGhvZHNbbV0gPSBldmFsKAotICAgICAgJ2Z1bmN0aW9uKCl7JysKLSAgICAgICd2YXIgYXJncyA9ICRBKGFyZ3VtZW50cyk7JysKLSAgICAgICd2YXIgc2NvcGUgPSBhcmdzLnNoaWZ0KCk7JysKLSAgICAgICdzY29wZS4nK01FVEhPRE1BUFttXSsnLmFwcGx5KHNjb3BlLChhcmdzIHx8IFtdKS5jb25jYXQoW3RoaXNdKSk7IH0nKTsKLSAgfQotICBbQXJyYXkucHJvdG90eXBlLCBTdHJpbmcucHJvdG90eXBlLCBOdW1iZXIucHJvdG90eXBlXS5lYWNoKAotICAgIGZ1bmN0aW9uKHApeyBPYmplY3QuZXh0ZW5kKHAsIFRlc3QuQkRETWV0aG9kcykgfQotICApOwotfQotCi1UZXN0LmNvbnRleHQgPSBmdW5jdGlvbihuYW1lLCBzcGVjLCBsb2cpewotICBUZXN0LnNldHVwQkRERXh0ZW5zaW9uTWV0aG9kcygpOwotICAKLSAgdmFyIGNvbXBpbGVkU3BlYyA9IHt9OwotICB2YXIgdGl0bGVzID0ge307Ci0gIGZvcihzcGVjTmFtZSBpbiBzcGVjKSB7Ci0gICAgc3dpdGNoKHNwZWNOYW1lKXsKLSAgICAgIGNhc2UgInNldHVwIjoKLSAgICAgIGNhc2UgInRlYXJkb3duIjoKLSAgICAgICAgY29tcGlsZWRTcGVjW3NwZWNOYW1lXSA9IHNwZWNbc3BlY05hbWVdOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHZhciB0ZXN0TmFtZSA9ICd0ZXN0JytzcGVjTmFtZS5nc3ViKC9ccysvLCctJykuY2FtZWxpemUoKTsKLSAgICAgICAgdmFyIGJvZHkgPSBzcGVjW3NwZWNOYW1lXS50b1N0cmluZygpLnNwbGl0KCdcbicpLnNsaWNlKDEpOwotICAgICAgICBpZigvXlx7Ly50ZXN0KGJvZHlbMF0pKSBib2R5ID0gYm9keS5zbGljZSgxKTsKLSAgICAgICAgYm9keS5wb3AoKTsKLSAgICAgICAgYm9keSA9IGJvZHkubWFwKGZ1bmN0aW9uKHN0YXRlbWVudCl7IAotICAgICAgICAgIHJldHVybiBzdGF0ZW1lbnQuc3RyaXAoKQotICAgICAgICB9KTsKLSAgICAgICAgY29tcGlsZWRTcGVjW3Rlc3ROYW1lXSA9IGJvZHkuam9pbignXG4nKTsKLSAgICAgICAgdGl0bGVzW3Rlc3ROYW1lXSA9IHNwZWNOYW1lOwotICAgIH0KLSAgfQotICBuZXcgVGVzdC5Vbml0LlJ1bm5lcihjb21waWxlZFNwZWMsIHsgdGl0bGVzOiB0aXRsZXMsIHRlc3RMb2c6IGxvZyB8fCAndGVzdGxvZycsIGNvbnRleHQ6IG5hbWUgfSk7Ci19OwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL3N0cmlwLWRlYnVncy5wb20gYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy9zdHJpcC1kZWJ1Z3MucG9tCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDNjNWRhLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL3N0cmlwLWRlYnVncy5wb20KKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08cHJvamVjdD4NCi0gIDxidWlsZD4NCi0gICAgPHBsdWdpbnM+DQotICAgICAgPHBsdWdpbj4NCi0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzPC9ncm91cElkPg0KLSAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbjwvYXJ0aWZhY3RJZD4NCi0gICAgICAgIDxjb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8d2ViYXBwRGlyZWN0b3J5PiR7YmFzZWRpcn0vdGFyZ2V0L3Rlc3QtdGFyZ2V0PC93ZWJhcHBEaXJlY3Rvcnk+DQotICAgICAgICAgIDxzY3JpcHRzPnN0cmlwLWRlYnVnczwvc2NyaXB0cz4NCi0gICAgICAgICAgPHN0cmlwPjs7Ozwvc3RyaXA+DQotICAgICAgICAgIDxjb21wcmVzc29yPmpzbWluPC9jb21wcmVzc29yPg0KLSAgICAgICAgPC9jb25maWd1cmF0aW9uPg0KLSAgICAgIDwvcGx1Z2luPg0KLSAgICA8L3BsdWdpbnM+DQotICA8L2J1aWxkPg0KLTwvcHJvamVjdD4NCi0NCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy90ZXN0LmpzIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvdGVzdC5qcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjdlMDBmZC4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy90ZXN0LmpzCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotdmFyIHRlc3QgPSB7IG1lc3NhZ2UgOiAidGhpcyBpcyBhIHRlc3QiIH07DQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvdGVzdDEuanMgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy90ZXN0MS5qcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2FkYjkzYS4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy90ZXN0MS5qcworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLXZhciB0ZXN0MSA9IHsgbWVzc2FnZSA6ICJ0aGlzIGlzIGEgdGVzdCIgfTsNCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy90ZXN0Mi5qcyBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL3Rlc3QyLmpzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDU2NmJmLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL3Rlc3QyLmpzCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotdmFyIHRlc3QyID0geyBtZXNzYWdlIDogInRoaXMgaXMgYSB0ZXN0IiB9Ow0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL3Rlc3QzLmpzIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvdGVzdDMuanMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjYzI4ZDUuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvdGVzdDMuanMKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi12YXIgdGVzdDMgPSB7IG1lc3NhZ2UgOiAidGhpcyBpcyBhIHRlc3QiIH07DQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvd2FyLXBhY2thZ2UucG9tIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvd2FyLXBhY2thZ2UucG9tCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NDIzZjBmLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL3dhci1wYWNrYWdlLnBvbQorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLTxwcm9qZWN0Pg0KLSAgPGJ1aWxkPg0KLSAgICA8cGx1Z2lucz4NCi0gICAgICA8cGx1Z2luPg0KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHM8L2dyb3VwSWQ+DQotICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luPC9hcnRpZmFjdElkPg0KLSAgICAgICAgPGNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgIDxwcm9qZWN0IGltcGxlbWVudGF0aW9uPSJvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuam10LnN0dWIuTWF2ZW5Qcm9qZWN0U3R1YiI+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+dGVzdDwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgPC9wcm9qZWN0Pg0KLSAgICAgICAgICA8c291cmNlRGlyZWN0b3J5PnNyYy90ZXN0L3Jlc291cmNlcy9zY3JpcHRzPC9zb3VyY2VEaXJlY3Rvcnk+DQotICAgICAgICAgIDx3ZWJhcHBEaXJlY3Rvcnk+JHtiYXNlZGlyfS90YXJnZXQvdGVzdC10YXJnZXQvd2FyLXBhY2thZ2U8L3dlYmFwcERpcmVjdG9yeT4NCi0gICAgICAgICAgPHNjcmlwdHNEaXJlY3Rvcnk+c2NyaXB0czwvc2NyaXB0c0RpcmVjdG9yeT4NCi0gICAgICAgICAgPGxpYnNEaXJlY3Rvcnk+bGliPC9saWJzRGlyZWN0b3J5Pg0KLSAgICAgICAgPC9jb25maWd1cmF0aW9uPg0KLSAgICAgIDwvcGx1Z2luPg0KLSAgICA8L3BsdWdpbnM+DQotICA8L2J1aWxkPg0KLTwvcHJvamVjdD4NCi0NCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy93aXRoLWRlYnVnL2RlYnVncy5qcyBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL3dpdGgtZGVidWcvZGVidWdzLmpzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDcxMGQ5Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL3dpdGgtZGVidWcvZGVidWdzLmpzCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLyoNCi0gfiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCi0gfiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQotIH4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotIH4NCi0gfiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSB+DQotIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLSB+IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotIH4gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotIH4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLSB+IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLTs7OyB2YXIgbG9nZ2VyID0gbG9nNGphdmFzY3JpcHQuZ2V0RGVmYXVsdExvZ2dlcigpOw0KLQ0KLSAgICB2YXIgZm9ybWF0ID0gZnVuY3Rpb24oIG4sIGZvcm1hdCApDQotICAgIHsNCi0gICAgICAgIDs7OyBsb2dnZXIuZGVidWcoICJmb3JtYXQgIiArIG4gKyAiIGFzICIgKyBmb3JtYXQgKTsNCi0gICAgICAgIGlmKCBpc05hTihuKSApIHJldHVybiAiLSI7DQotOzs7ICAgICBsb2dnZXIuZGVidWcoICJmb3JtYXQgaXMgYSBudW1iZXIiICk7DQotICAgICAgICByZXR1cm4gcGFyc2VGbG9hdCggbiApLm51bWJlckZvcm1hdCggZm9ybWF0ICk7DQotICAgIH0NCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy96ZXJvLWxlbmd0aC96ZXJvLWxlbmd0aC5qcyBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL3plcm8tbGVuZ3RoL3plcm8tbGVuZ3RoLmpzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjlkZTI5Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL3plcm8tbGVuZ3RoL3plcm8tbGVuZ3RoLmpzCisrKyAvZGV2L251bGwKZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamRldi1wbHVnaW4vTElDRU5TRS50eHQgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWpkZXYtcGx1Z2luL0xJQ0VOU0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjQ1Njk1Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamRldi1wbHVnaW4vTElDRU5TRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwyMDIgKzAsMCBAQAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNAotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLwotCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04KLQotICAgMS4gRGVmaW5pdGlvbnMuCi0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4KLQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4KLQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbgotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwKLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3IKLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KLQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KLQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLgotCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dAotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLAotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgotCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcgotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLgotCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0Ci0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3NlcwotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLgotCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZwotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucwotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5Ci0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIgotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0Ci0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCi0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLgotCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4KLQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywKLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcgotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcwotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCi0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91Ci0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3IKLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZAotCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kCi0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3JrcwotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQKLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YKLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kCi0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cwotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QKLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QKLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUKLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3IKLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwKLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZAotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUKLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQKLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuCi0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucwotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcgotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgKLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuCi0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwKLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yawotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLgotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4KLQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLAotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KLQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEEKLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55Ci0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuCi0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLAotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwKLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KLQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZwotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwKLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcwotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkKLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkKLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgotCi0gICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKLQotICAgQVBQRU5ESVg6IEhvdyB0byBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLgotCi0gICAgICBUbyBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLCBhdHRhY2ggdGhlIGZvbGxvd2luZwotICAgICAgYm9pbGVycGxhdGUgbm90aWNlLCB3aXRoIHRoZSBmaWVsZHMgZW5jbG9zZWQgYnkgYnJhY2tldHMgIltdIgotICAgICAgcmVwbGFjZWQgd2l0aCB5b3VyIG93biBpZGVudGlmeWluZyBpbmZvcm1hdGlvbi4gKERvbid0IGluY2x1ZGUKLSAgICAgIHRoZSBicmFja2V0cyEpICBUaGUgdGV4dCBzaG91bGQgYmUgZW5jbG9zZWQgaW4gdGhlIGFwcHJvcHJpYXRlCi0gICAgICBjb21tZW50IHN5bnRheCBmb3IgdGhlIGZpbGUgZm9ybWF0LiBXZSBhbHNvIHJlY29tbWVuZCB0aGF0IGEKLSAgICAgIGZpbGUgb3IgY2xhc3MgbmFtZSBhbmQgZGVzY3JpcHRpb24gb2YgcHVycG9zZSBiZSBpbmNsdWRlZCBvbiB0aGUKLSAgICAgIHNhbWUgInByaW50ZWQgcGFnZSIgYXMgdGhlIGNvcHlyaWdodCBub3RpY2UgZm9yIGVhc2llcgotICAgICAgaWRlbnRpZmljYXRpb24gd2l0aGluIHRoaXJkLXBhcnR5IGFyY2hpdmVzLgotCi0gICBDb3B5cmlnaHQgW3l5eXldIFtuYW1lIG9mIGNvcHlyaWdodCBvd25lcl0KLQotICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamRldi1wbHVnaW4vTk9USUNFLnR4dCBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamRldi1wbHVnaW4vTk9USUNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmEzZGJkNi4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWpkZXYtcGx1Z2luL05PVElDRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci09PSAgTk9USUNFIGZpbGUgY29ycmVzcG9uZGluZyB0byBzZWN0aW9uIDQoZCkgb2YgdGhlIEFwYWNoZSBMaWNlbnNlLCAgID09Ci09PSAgVmVyc2lvbiAyLjAsIGluIHRoaXMgY2FzZSBmb3IgdGhlIEFwYWNoZSBNeUZhY2VzIE1hdmVuIFBsdWdpbnMgICAgID09Ci09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgCi1UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLgotCi1Qb3J0aW9ucyBvZiB0aGlzIHNvZnR3YXJlIHdlcmUgb3JpZ2luYWxseSBiYXNlZCBvbiB0aGUgZm9sbG93aW5nOgotCi0gLSBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwNiwgT3JhY2xlIENvcnAsIDxodHRwOi8vd3d3Lm9yYWNsZS5jb20vPi4KLWFuZCBhcmUgbGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIHVuZGVyIHRoZSAKLSJTb2Z0d2FyZSBHcmFudCBhbmQgQ29ycG9yYXRlIENvbnRyaWJ1dGlvbiBMaWNlbnNlIEFncmVlbWVudCIKLQotU2VlIHRoZSBMSUNFTlNFLnR4dCBmaWxlIGZvciBpbmZvcm1hdGlvbiBvbiBhbGwgbGljZW5zZXMgCi1hc3NvY2lhdGVkIHdpdGggdGhpcyBzb2Z0d2FyZS4KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamRldi1wbHVnaW4vcG9tLnhtbCBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamRldi1wbHVnaW4vcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzk3N2VlMy4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWpkZXYtcGx1Z2luL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi08IS0tCi0gICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICAgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICAgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gICAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICAgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gICAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gICAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gICAgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+Ci0KLSAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotCi0gIDxwYXJlbnQ+Ci0gICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29sczwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtcGx1Z2luLXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjEuMC41PC92ZXJzaW9uPgotICAgICAgPHJlbGF0aXZlUGF0aD4uLi9teWZhY2VzLXBsdWdpbi1wYXJlbnQvcG9tLnhtbDwvcmVsYXRpdmVQYXRoPgotICA8L3BhcmVudD4KLQotICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29sczwvZ3JvdXBJZD4KLSAgPGFydGlmYWN0SWQ+bXlmYWNlcy1qZGV2LXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgPHZlcnNpb24+MS4wLjEtU05BUFNIT1Q8L3ZlcnNpb24+Ci0gIDxwYWNrYWdpbmc+bWF2ZW4tcGx1Z2luPC9wYWNrYWdpbmc+Ci0gIDxuYW1lPkFwYWNoZSBNeUZhY2VzIEJ1aWxkdG9vbHMgTWF2ZW4yIEpEZXYgUGx1Z2luPC9uYW1lPgotCi0gIDxzY20+Ci0gICAgPGNvbm5lY3Rpb24+c2NtOnN2bjpodHRwOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL215ZmFjZXMvbXlmYWNlcy1idWlsZC10b29scy90cnVuay9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWpkZXYtcGx1Z2luPC9jb25uZWN0aW9uPgotICAgIDxkZXZlbG9wZXJDb25uZWN0aW9uPnNjbTpzdm46aHR0cHM6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvbXlmYWNlcy9teWZhY2VzLWJ1aWxkLXRvb2xzL3RydW5rL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamRldi1wbHVnaW48L2RldmVsb3BlckNvbm5lY3Rpb24+Ci0gICAgPHVybD5odHRwOi8vc3ZuLmFwYWNoZS5vcmcvdmlld3ZjL215ZmFjZXMvbXlmYWNlcy1idWlsZC10b29scy90cnVuay9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWpkZXYtcGx1Z2luPC91cmw+Ci0gIDwvc2NtPgotCi0gIDxkZXBlbmRlbmNpZXM+Ci0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuPC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tcHJvamVjdDwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjIuMDwvdmVyc2lvbj4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuPC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tcGx1Z2luLWFwaTwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjIuMDwvdmVyc2lvbj4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5zdGF4PC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+c3RheC1hcGk8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4xLjAuMTwvdmVyc2lvbj4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5zdGF4PC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+c3RheDwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjEuMi4wX3JjMi1kZXY8L3ZlcnNpb24+Ci0gICAgPC9kZXBlbmRlbmN5PgotICA8L2RlcGVuZGVuY2llcz4KLQotICA8cmVwb3J0aW5nPgotICAgIDxwbHVnaW5zPgotICAgICAgPHBsdWdpbj4KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgotICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1wbHVnaW4tcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj4yLjI8L3ZlcnNpb24+Ci0gICAgICA8L3BsdWdpbj4KLSAgICA8L3BsdWdpbnM+Ci0gIDwvcmVwb3J0aW5nPgotCi08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWpkZXYtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qZGV2ZWxvcGVyL0pEZXZlbG9wZXJNb2pvLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWpkZXYtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qZGV2ZWxvcGVyL0pEZXZlbG9wZXJNb2pvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4Nzg1N2EuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qZGV2LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamRldmVsb3Blci9KRGV2ZWxvcGVyTW9qby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgyNyArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qZGV2ZWxvcGVyOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZVJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLkZpbGVXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlRyZWVNYXA7Ci1pbXBvcnQgamF2YS51dGlsLmphci5KYXJFbnRyeTsKLWltcG9ydCBqYXZhLnV0aWwuamFyLkphckZpbGU7Ci0KLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5QYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5hcnRpZmFjdC5BcnRpZmFjdDsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLm1vZGVsLkRlcGVuZGVuY3k7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5tb2RlbC5SZXNvdXJjZTsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5BYnN0cmFjdE1vam87Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnByb2plY3QuTWF2ZW5Qcm9qZWN0OwotCi1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy51dGlsLkRpcmVjdG9yeVNjYW5uZXI7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy51dGlsLkZpbGVVdGlsczsKLWltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLnV0aWwuSU9VdGlsOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMudXRpbC54bWwuWHBwM0RvbTsKLWltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLnV0aWwueG1sLlhwcDNEb21CdWlsZGVyOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMudXRpbC54bWwuWHBwM0RvbVdyaXRlcjsKLWltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLnV0aWwueG1sLnB1bGwuWG1sUHVsbFBhcnNlckV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLQotICAvKgotICAgKiBJbXBvcnRhbnQgaW5mb3JtYXRpb25hbCBub3RlOgotICAgKgotICAgKiBUaGUgZm9sbG93aW5nIFhNTCBjb2RlIGlzIHNpbWlsYXIgdG8gd2hhdCB3b3VsZCBiZSBzZWVuIGluIGEgcG9tIGZpbGUKLSAgICogdW5kZXIgdGhlIG1hdmVuLWpkZXYtcGx1Z2luIHRhZyBpZiBMaWJyYXJpZXMgKGUuZy4gSlNQIFJ1bnRpbWUKLSAgICogYW5kIEpTRiAxLjIpIGFuZCBEaXN0cmlidXRlZCBUYWcgTGlicmFyaWVzIHdhbnRlZCB0byBiZSBhZGRlZCB0byB0aGUgLmpwcgotICAgKiBwcm9qZWN0LgotICAgKgotICAgKiBXaGF0IHlvdSBzZWUgYmVsb3cgYXJlIHRoZSBkZWZhdWx0cyB0aGF0IGFyZSBwdXQgaW4gYSBwcm9qZWN0J3MgLmpwcgotICAgKiBhdXRvbWF0aWNhbGx5IHdpdGhvdXQgc3BlY2lmeWluZyBhbnl0aGluZy4gIFNlZSByZXBsYWNlTGlicmFyaWVzKCksCi0gICAqIHJlcGxhY2VUYWdMaWJyYXJpZXMoKSBhbmQgcmVwbGFjZURlZmF1bHRUYWdMaWJyYXJpZXMoKS4KLSAgICoKLSAgICogQWxzbyBub3RlIHRoYXQgYnkgc2V0dGluZyB0aGUgcHJvcGVydHkgImpkZXYucGx1Z2luLmFkZC5saWJyYXJpZXMiIHRvCi0gICAqIGZhbHNlIGluIGEgcHJvamVjdCdzIHBvbS54bWwgZmlsZSwgbm8gbGlicmFyaWVzIHdpbGwgYmUgYWRkZWQsIGRlZmF1bHQKLSAgICogb3Igb3RoZXJ3aXNlLiAgSW4ga2luZCwgc2V0dGluZyB0aGUgcHJvcGVydHkgImpkZXYucGx1Z2luLmFkZC50YWdsaWJzIgotICAgKiB0byBmYWxzZSB3aWxsIHJlc3VsdCBpbiBubyB0YWcgbGlicmFyaWVzIG9mIGFueSBraW5kIGJlaW5nIGFkZGVkLgotICAgKgotICAgKiBBcyB5b3Ugd291bGQgZXhwZWN0LCB0aGUgZGVmYXVsdCBmb3IgYm90aCBvZiB0aGVzZSBwcm9wZXJ0aWVzIGlzICJ0cnVlIi4KLSAgICoKLSAgICogICA8cGx1Z2luPgotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWRidWlsZDwvZ3JvdXBJZD4KLSAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tamRldi1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgIDx2ZXJzaW9uPjEuMi40LVNOQVBTSE9UPC92ZXJzaW9uPgotICAgICAgICA8aW5oZXJpdGVkPnRydWU8L2luaGVyaXRlZD4KLSAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgPGxpYnJhcmllcz4KLSAgICAgICAgICAgIDxsaWJyYXJ5PkpTUCBSdW50aW1lPC9saWJyYXJ5PgotICAgICAgICAgICAgPGxpYnJhcnk+SlNGIDEuMjwvbGlicmFyeT4KLSAgICAgICAgICA8L2xpYnJhcmllcz4KLSAgICAgICAgICA8ZGlzdHJpYnV0ZWRUYWdMaWJyYXJpZXM+Ci0gICAgICAgICAgICA8ZGlzdHJpYnV0ZWRUYWdMaWJyYXJ5PgotICAgICAgICAgICAgICA8cHJvcGVydHk+Ci0gICAgICAgICAgICAgICAgPG5hbWU+bmFtZTwvbmFtZT4KLSAgICAgICAgICAgICAgICA8dmFsdWU+SlNGIEhUTUw8L3ZhbHVlPgotICAgICAgICAgICAgICA8L3Byb3BlcnR5PgotICAgICAgICAgICAgICA8cHJvcGVydHk+Ci0gICAgICAgICAgICAgICAgPG5hbWU+dmVyc2lvbjwvbmFtZT4KLSAgICAgICAgICAgICAgICA8dmFsdWU+MS4yPC92YWx1ZT4KLSAgICAgICAgICAgICAgPC9wcm9wZXJ0eT4KLSAgICAgICAgICAgICAgPHByb3BlcnR5PgotICAgICAgICAgICAgICAgIDxuYW1lPmpzcFZlcnNpb248L25hbWU+Ci0gICAgICAgICAgICAgICAgPHZhbHVlPjIuMTwvdmFsdWU+Ci0gICAgICAgICAgICAgIDwvcHJvcGVydHk+Ci0gICAgICAgICAgICAgIDxwcm9wZXJ0eT4KLSAgICAgICAgICAgICAgICA8bmFtZT50bGQ8L25hbWU+Ci0gICAgICAgICAgICAgICAgPHZhbHVlPmh0bWxfYmFzaWMudGxkPC92YWx1ZT4KLSAgICAgICAgICAgICAgPC9wcm9wZXJ0eT4KLSAgICAgICAgICAgICAgPHByb3BlcnR5PgotICAgICAgICAgICAgICAgIDxuYW1lPlVSSTwvbmFtZT4KLSAgICAgICAgICAgICAgICA8dmFsdWU+aHR0cDovL2phdmEuc3VuLmNvbS9qc2YvaHRtbDwvdmFsdWU+Ci0gICAgICAgICAgICAgIDwvcHJvcGVydHk+Ci0gICAgICAgICAgICA8L2Rpc3RyaWJ1dGVkVGFnTGlicmFyeT4KLSAgICAgICAgICAgIDxkaXN0cmlidXRlZFRhZ0xpYnJhcnk+Ci0gICAgICAgICAgICAgIDxwcm9wZXJ0eT4KLSAgICAgICAgICAgICAgICA8bmFtZT5uYW1lPC9uYW1lPgotICAgICAgICAgICAgICAgIDx2YWx1ZT5KU0YgQ29yZTwvdmFsdWU+Ci0gICAgICAgICAgICAgIDwvcHJvcGVydHk+Ci0gICAgICAgICAgICAgIDxwcm9wZXJ0eT4KLSAgICAgICAgICAgICAgICA8bmFtZT52ZXJzaW9uPC9uYW1lPgotICAgICAgICAgICAgICAgIDx2YWx1ZT4xLjI8L3ZhbHVlPgotICAgICAgICAgICAgICA8L3Byb3BlcnR5PgotICAgICAgICAgICAgICA8cHJvcGVydHk+Ci0gICAgICAgICAgICAgICAgPG5hbWU+anNwVmVyc2lvbjwvbmFtZT4KLSAgICAgICAgICAgICAgICA8dmFsdWU+Mi4xPC92YWx1ZT4KLSAgICAgICAgICAgICAgPC9wcm9wZXJ0eT4KLSAgICAgICAgICAgICAgPHByb3BlcnR5PgotICAgICAgICAgICAgICAgIDxuYW1lPnRsZDwvbmFtZT4KLSAgICAgICAgICAgICAgICA8dmFsdWU+anNmX2NvcmUudGxkPC92YWx1ZT4KLSAgICAgICAgICAgICAgPC9wcm9wZXJ0eT4KLSAgICAgICAgICAgICAgPHByb3BlcnR5PgotICAgICAgICAgICAgICAgIDxuYW1lPlVSSTwvbmFtZT4KLSAgICAgICAgICAgICAgICA8dmFsdWU+aHR0cDovL2phdmEuc3VuLmNvbS9qc2YvY29yZTwvdmFsdWU+Ci0gICAgICAgICAgICAgIDwvcHJvcGVydHk+Ci0gICAgICAgICAgICA8L2Rpc3RyaWJ1dGVkVGFnTGlicmFyeT4KLSAgICAgICAgICA8L2Rpc3RyaWJ1dGVkVGFnTGlicmFyaWVzPgotICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICA8L3BsdWdpbj4KLSAqLwotCi0vKioKLSAqIEdlbmVyYXRlcyB0aGUgSkRldmVsb3BlciBXb3Jrc3BhY2UgYW5kIFByb2plY3RzCi0gKiBmcm9tIGEgbWF2ZW4gZGV2ZWxvcG1lbnQgZW52aXJvbm1lbnQuCi0gKiBAdmVyc2lvbiAkSWQkCi0gKiBAZ29hbCBqZGV2Ci0gKiBAZXhlY3V0ZSBwaGFzZT1wcm9jZXNzLXJlc291cmNlcwotICogQHJlcXVpcmVzRGVwZW5kZW5jeVJlc29sdXRpb24gdGVzdAotICogQGRlc2NyaXB0aW9uIEdvYWwgd2hpY2ggZ2VuZXJhdGVzIHRoZSBKRGV2ZWxvcGVyIFdvcmtzcGFjZSBhbmQgUHJvamVjdHMKLSAqICAgICAgICAgICAgICBmcm9tIGEgbWF2ZW4gZGV2ZWxvcG1lbnQgZW52aXJvbm1lbnQuCi0gKi8KLXB1YmxpYyBjbGFzcyBKRGV2ZWxvcGVyTW9qbwotICBleHRlbmRzIEFic3RyYWN0TW9qbwotewotICAvKioKLSAgICogTGlicmFyaWVzIHRvIGluY2x1ZGUgaW4gQ2xhc3NwYXRoLgotICAgKiBAcGFyYW1ldGVyCi0gICAqLwotICBwcml2YXRlIFN0cmluZ1tdIGxpYnJhcmllczsKLQotICAvKioKLSAgICogTGlzdCBvZiBzb3VyY2Ugcm9vdCBkaXJlY3RvcmllcwotICAgKiBAcGFyYW1ldGVyCi0gICAqLwotICBwcml2YXRlIEZpbGVbXSBzb3VyY2VSb290czsKLQotICAvKioKLSAgICogTGlzdCBvZiBzb3VyY2Ugcm9vdCBkaXJlY3RvcmllcyBmb3IgdGhlIHRlc3QgcHJvamVjdAotICAgKiBAcGFyYW1ldGVyCi0gICAqLwotICBwcml2YXRlIEZpbGVbXSB0ZXN0U291cmNlUm9vdHM7Ci0KLSAgLyoqCi0gICAqIExpc3Qgb2YgcmVzb3VyY2Ugcm9vdCBkaXJlY3RvcmllcwotICAgKiBAcGFyYW1ldGVyCi0gICAqLwotICBwcml2YXRlIEZpbGVbXSByZXNvdXJjZVJvb3RzOwotCi0gIC8qKgotICAgKiBMaXN0IG9mIHJlc291cmNlIHJvb3QgZGlyZWN0b3JpZXMgZm9yIHRoZSB0ZXN0IHByb2plY3QKLSAgICogQHBhcmFtZXRlcgotICAgKi8KLSAgcHJpdmF0ZSBGaWxlW10gdGVzdFJlc291cmNlUm9vdHM7Ci0KLSAgLyoqCi0gICAqIEZvcmNlIHRoZSBNb2pvIHRvIHVzZSB0aGUgZGVmYXVsdCBwcm9qZWN0LnhtbCBvcgotICAgKiB3b3Jrc3BhY2UueG1sIGZpbGUgdG8gYmUgdXNlZCBpbiBjcmVhdGlvbiBvZiB0aGUKLSAgICogd29ya3NwYWNlIGZpbGUgKC5qd3MpIG9yIHByb2plY3QgZmlsZSAoLmpwcikuIE90aGVyd2lzZSwKLSAgICogaWYgYSAuandzIG9yIC5qcHIgZXhpc3RzLCBpdCB3aWxsIGJlIHVzZWQgaW5zdGVhZC4KLSAgICogQHBhcmFtZXRlciBleHByZXNzaW9uPSIke2ZvcmNlfSIgZGVmYXVsdC12YWx1ZT1mYWxzZQotICAgKgotICAgKi8KLSAgcHJpdmF0ZSBib29sZWFuIGZvcmNlOwotCi0gIC8qKgotICAgKiBDb21waWxlciB0byBiZSB1c2VkIGJ5IEpEZXZlbG9wZXIuICJPamMiIGlzIHRoZSBkZWZhdWx0LiAgCi0gICAqIElmIHRoaXMgcGFyYW1ldGVyIGlzIGFic2VudCBvciBhbnl0aGluZyBvdGhlciB0aGFuICJKYXZhYyIsICJPamMiIHdpbGwKLSAgICogYmUgdXNlZC4KLSAgICogQHBhcmFtZXRlciBleHByZXNzaW9uPSIke2pkZXYuY29tcGlsZXJ9IiBkZWZhdWx0LXZhbHVlPSJPamMiCi0gICAqLwotICBwcml2YXRlIFN0cmluZyBjb21waWxlcjsKLQotICAvKioKLSAgICogTWFrZSB0aGUgZW50aXJlIHByb2plY3QgYmVmb3JlIGVhY2ggcnVuLiAgUnVubmluZyBhbnl0aGluZyBpbiB0aGUKLSAgICogcHJvamVjdCB3aWxsIGF1dG9tYXRpY2FsbHkgdHJpZ2dlciBhIG1ha2Ugb2YgdGhlIGVudGlyZSBwcm9qZWN0Ci0gICAqIGZvbGxvd2VkIGJ5IHRoZSBydW4uCi0gICAqIEBwYXJhbWV0ZXIgZXhwcmVzc2lvbj0iJHtqZGV2Lm1ha2UucHJvamVjdH0iIGRlZmF1bHQtdmFsdWU9ImZhbHNlIgotICAgKi8KLSAgcHJpdmF0ZSBib29sZWFuIG1ha2VQcm9qZWN0OwotCi0gIC8qKgotICAgKiBEZWZhdWx0IGZpbGUgdG8gYmUgcnVuIHdoZW4gSkRldmVsb3BlciBwcm9qZWN0IGlzIHJ1bi4KLSAgICogQHBhcmFtZXRlciBleHByZXNzaW9uPSIke2pkZXYucnVuLnRhcmdldH0iCi0gICAqLwotICBwcml2YXRlIFN0cmluZyBydW5UYXJnZXQ7Ci0KLSAgLyoqCi0gICAqIENyZWF0ZSBKRGV2ZWxvcGVyIFdvcmtzcGFjZSBhbmQgUHJvamVjdCBGaWxlcyB0aGF0IGNvcnJlc3BvbmQgdG8KLSAgICogdGhlIGZvcm1hdCB1c2VkCi0gICAqIEBwYXJhbWV0ZXIgZXhwcmVzc2lvbj0iJHtqZGV2LnJlbGVhc2V9IiBkZWZhdWx0LXZhbHVlPSIxMC4xLjMuMC40IgotICAgKi8KLSAgcHJpdmF0ZSBTdHJpbmcgcmVsZWFzZTsKLQotICAvKioKLSAgICogTmFtZSBvZiB0aGUgTWF2ZW4gUHJvamVjdAotICAgKiBAcGFyYW1ldGVyIGV4cHJlc3Npb249IiR7cHJvamVjdH0iCi0gICAqIEByZXF1aXJlZAotICAgKiBAcmVhZG9ubHkKLSAgICovCi0gIHByaXZhdGUgTWF2ZW5Qcm9qZWN0IHByb2plY3Q7Ci0KLSAgLyoqCi0gICAqIExpc3Qgb2YgcmVhY3RvclByb2plY3RzCi0gICAqIEBwYXJhbWV0ZXIgZXhwcmVzc2lvbj0iJHtyZWFjdG9yUHJvamVjdHN9IgotICAgKiBAcmVxdWlyZWQKLSAgICogQHJlYWRvbmx5Ci0gICAqLwotICBwcml2YXRlIExpc3QgcmVhY3RvclByb2plY3RzOwotCi0gIC8qKgotICAgKiBUYWcgbGlicmFyeSBkaXJlY3RvcnkgdXNlZCBieSBlYWNoIGRpc3RyaWJ1dGVkIHRhZyBsaWJyYXJ5Ci0gICAqCi0gICAqIEBwYXJhbWV0ZXIgZXhwcmVzc2lvbj0iJHtqZGV2LnRhZy5saWIuZGlyfSIKLSAgICogICAgICAgICAgICBkZWZhdWx0LXZhbHVlPSJAb3JhY2xlLmhvbWVAbGliL2phdmEvc2hhcmVkL29yYWNsZS5qc2YvMS4yL2pzZi1yaS5qYXIhL01FVEEtSU5GIgotICAgKi8KLSAgcHJpdmF0ZSBTdHJpbmcgdGFnTGliRGlyZWN0b3J5OwotCi0gIC8qKgotICAgKiBUYWcgbGlicmFyaWVzIGFuZCB0aGVpciBwcm9wZXJ0aWVzLgotICAgKiBAcGFyYW1ldGVyCi0gICAqLwotICBwcml2YXRlIFByb3BlcnRpZXNbXSBkaXN0cmlidXRlZFRhZ0xpYnJhcmllczsKLQotICAvKioKLSAgICogRXhlY3V0ZSB0aGUgTW9qby4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKQotICAgIHRocm93cyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uCi0gIHsKLSAgICBfcGFyc2VSZWxlYXNlKCk7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgZ2VuZXJhdGVXb3Jrc3BhY2UoKTsKLSAgICAgIGdlbmVyYXRlUHJvamVjdCgpOwotICAgICAgZ2VuZXJhdGVUZXN0UHJvamVjdCgpOwotICAgIH0KLSAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIGdlbmVyYXRlV29ya3NwYWNlKCkKLSAgICB0aHJvd3MgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbiwgSU9FeGNlcHRpb24KLSAgewotICAgIGlmICghcHJvamVjdC5nZXRDb2xsZWN0ZWRQcm9qZWN0cygpLmlzRW1wdHkoKSkKLSAgICB7Ci0gICAgICBnZXRMb2coKS5pbmZvKCJHZW5lcmF0aW5nIEpEZXZlbG9wZXIgIiArIHJlbGVhc2UgKyAiIHdvcmtzcGFjZTogIiArCi0gICAgICAgICAgICAgICAgICAgIHByb2plY3QuZ2V0QXJ0aWZhY3RJZCgpKTsKLQotICAgICAgRmlsZSB3b3Jrc3BhY2VGaWxlID0gZ2V0SldvcmtzcGFjZUZpbGUocHJvamVjdCk7Ci0KLSAgICAgIHRyeQotICAgICAgewotICAgICAgICBYcHAzRG9tIHdvcmtzcGFjZURPTSA9IHJlYWRXb3Jrc3BhY2VET00od29ya3NwYWNlRmlsZSk7Ci0gICAgICAgIHJlcGxhY2VQcm9qZWN0cyh3b3Jrc3BhY2VGaWxlLmdldFBhcmVudEZpbGUoKSwgd29ya3NwYWNlRE9NKTsKLSAgICAgICAgd3JpdGVET00od29ya3NwYWNlRmlsZSwgd29ya3NwYWNlRE9NKTsKLSAgICAgIH0KLSAgICAgIGNhdGNoIChYbWxQdWxsUGFyc2VyRXhjZXB0aW9uIGUpCi0gICAgICB7Ci0gICAgICAgIHRocm93IG5ldyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uKCJFcnJvciBnZW5lcmF0aW5nIHdvcmtzcGFjZSIsIGUpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgdm9pZCBnZW5lcmF0ZVByb2plY3QoKQotICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbgotICB7Ci0gICAgaWYgKCEicG9tIi5lcXVhbHMocHJvamVjdC5nZXRQYWNrYWdpbmcoKSkpCi0gICAgewotICAgICAgRmlsZSBwcm9qZWN0RmlsZSA9IGdldEpQcm9qZWN0RmlsZShwcm9qZWN0KTsKLQotICAgICAgLy8gR2V0IFByb2plY3QgUHJvcGVydGllcyB0byB0ZWxsIE1vam8gd2hldGhlciBvciBub3QgdG8gYWRkCi0gICAgICAvLyBsaWJyYXJ5IHJlZnMgYW5kIHRhZ2xpYnMgdG8gdGhlIHByb2plY3QuCi0gICAgICBQcm9wZXJ0aWVzIHByb3BzID0gcHJvamVjdC5nZXRQcm9wZXJ0aWVzKCk7Ci0gICAgICBTdHJpbmcgYWRkTGlicyA9IChTdHJpbmcpcHJvcHMuZ2V0KF9QUk9QRVJUWV9BRERfTElCUkFSWSk7Ci0gICAgICBTdHJpbmcgYWRkVGFnTGlicyA9IChTdHJpbmcpcHJvcHMuZ2V0KF9QUk9QRVJUWV9BRERfVEFHTElCUyk7Ci0gICAgICBfYWRkTGlicmFyaWVzID0gKGFkZExpYnMgPT0gbnVsbCkKLSAgICAgICAgPyB0cnVlIDogKG5ldyBCb29sZWFuKGFkZExpYnMpKS5ib29sZWFuVmFsdWUoKTsKLSAgICAgIF9hZGRUYWdMaWJzICAgPSAoYWRkVGFnTGlicyA9PSBudWxsKQotICAgICAgICA/IHRydWUgOiAobmV3IEJvb2xlYW4oYWRkVGFnTGlicykpLmJvb2xlYW5WYWx1ZSgpOwotCi0gICAgICAvLyBUT0RPOiByZWFkIGNvbmZpZ3VyYXRpb24gZm9yIHdhcjp3YXIgZ29hbAotICAgICAgRmlsZSB3ZWJhcHBEaXIgPSBuZXcgRmlsZShwcm9qZWN0LmdldEJhc2VkaXIoKSwgInNyYy9tYWluL3dlYmFwcCIpOwotICAgICAgLy8gVE9ETzogcmVhZCBjb25maWd1cmF0aW9uIGZvciBjb21waWxlcjpjb21wbGllIGdvYWwKLSAgICAgIEZpbGUgb3V0cHV0RGlyID0KLSAgICAgICAgbmV3IEZpbGUocHJvamVjdC5nZXRCdWlsZCgpLmdldERpcmVjdG9yeSgpLCAiY2xhc3NlcyIpOwotCi0gICAgICBNYXZlblByb2plY3QgZXhlY3V0aW9uUHJvamVjdCA9IHByb2plY3QuZ2V0RXhlY3V0aW9uUHJvamVjdCgpOwotICAgICAgTGlzdCBjb21waWxlU291cmNlUm9vdHMgPSBleGVjdXRpb25Qcm9qZWN0LmdldENvbXBpbGVTb3VyY2VSb290cygpOwotICAgICAgaWYgKHNvdXJjZVJvb3RzICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc291cmNlUm9vdHMubGVuZ3RoOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICBjb21waWxlU291cmNlUm9vdHMuYWRkKHNvdXJjZVJvb3RzW2ldLmdldEFic29sdXRlUGF0aCgpKTsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBMaXN0IGNvbXBpbGVSZXNvdXJjZVJvb3RzID0gZXhlY3V0aW9uUHJvamVjdC5nZXRSZXNvdXJjZXMoKTsKLSAgICAgIGlmIChyZXNvdXJjZVJvb3RzICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVzb3VyY2VSb290cy5sZW5ndGg7IGkrKykKLSAgICAgICAgewotICAgICAgICAgIFJlc291cmNlIHJlc291cmNlID0gbmV3IFJlc291cmNlKCk7Ci0gICAgICAgICAgcmVzb3VyY2Uuc2V0RGlyZWN0b3J5KHJlc291cmNlUm9vdHNbaV0uZ2V0QWJzb2x1dGVQYXRoKCkpOwotICAgICAgICAgIGNvbXBpbGVSZXNvdXJjZVJvb3RzLmFkZChyZXNvdXJjZSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgZ2V0TG9nKCkuaW5mbygiR2VuZXJhdGluZyBKRGV2ZWxvcGVyICIgKyByZWxlYXNlICsgIiBQcm9qZWN0ICIgKwotICAgICAgICAgICAgICAgICAgICBwcm9qZWN0LmdldEFydGlmYWN0SWQoKSk7Ci0KLSAgICAgIFNldCBwbHVnaW5BcnRpZmFjdHMgPSBuZXcgTGlua2VkSGFzaFNldCgpOwotICAgICAgcGx1Z2luQXJ0aWZhY3RzLmFkZEFsbChwcm9qZWN0LmdldFBsdWdpbkFydGlmYWN0cygpKTsKLQotICAgICAgLy8gTm90ZTogaW5jbHVkZSAiY29tcGlsZSIsICJwcm92aWRlZCIsICJzeXN0ZW0iIGFuZCAicnVudGltZSIgc2NvcGVzCi0gICAgICBTZXQgY29tcGlsZUFydGlmYWN0cyA9IG5ldyBMaW5rZWRIYXNoU2V0KCk7Ci0gICAgICBjb21waWxlQXJ0aWZhY3RzLmFkZEFsbChwcm9qZWN0LmdldENvbXBpbGVBcnRpZmFjdHMoKSk7Ci0gICAgICBjb21waWxlQXJ0aWZhY3RzLmFkZEFsbChwcm9qZWN0LmdldFJ1bnRpbWVBcnRpZmFjdHMoKSk7Ci0KLSAgICAgIC8vIE5vdGU6IHNlcGFyYXRlICJydW50aW1lIiB2cy4gImNvbXBpbGUiIGRlcGVuZGVuY2llcyBpbiBKRGV2ZWxvcGVyPwotICAgICAgZ2VuZXJhdGVQcm9qZWN0KHByb2plY3RGaWxlLCBwcm9qZWN0LmdldEFydGlmYWN0SWQoKSwKLSAgICAgICAgICAgICAgICAgICAgICBwcm9qZWN0LmdldFBhY2thZ2luZygpLCBwcm9qZWN0LmdldERlcGVuZGVuY2llcygpLAotICAgICAgICAgICAgICAgICAgICAgIG5ldyBBcnJheUxpc3QoY29tcGlsZUFydGlmYWN0cyksIGNvbXBpbGVTb3VyY2VSb290cywKLSAgICAgICAgICAgICAgICAgICAgICBjb21waWxlUmVzb3VyY2VSb290cywKLSAgICAgICAgICAgICAgICAgICAgICBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KHdlYmFwcERpci5nZXRQYXRoKCkpLAotICAgICAgICAgICAgICAgICAgICAgIG91dHB1dERpcik7Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIGdlbmVyYXRlVGVzdFByb2plY3QoKQotICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbgotICB7Ci0gICAgaWYgKCEicG9tIi5lcXVhbHMocHJvamVjdC5nZXRQYWNrYWdpbmcoKSkpCi0gICAgewotICAgICAgRmlsZSBwcm9qZWN0RmlsZSA9IGdldEpQcm9qZWN0VGVzdEZpbGUocHJvamVjdCk7Ci0KLSAgICAgIC8vIEdldCBQcm9qZWN0IFByb3BlcnRpZXMgdG8gdGVsbCBNb2pvIHdoZXRoZXIgb3Igbm90IHRvIGFkZAotICAgICAgLy8gbGlicmFyeSByZWZzIGFuZCB0YWdsaWJzIHRvIHRoZSBwcm9qZWN0LgotICAgICAgUHJvcGVydGllcyBwcm9wcyA9IHByb2plY3QuZ2V0UHJvcGVydGllcygpOwotICAgICAgU3RyaW5nIGFkZExpYnMgPSAoU3RyaW5nKXByb3BzLmdldChfUFJPUEVSVFlfQUREX0xJQlJBUlkpOwotICAgICAgU3RyaW5nIGFkZFRhZ0xpYnMgPSAoU3RyaW5nKXByb3BzLmdldChfUFJPUEVSVFlfQUREX1RBR0xJQlMpOwotICAgICAgX2FkZExpYnJhcmllcyA9IChhZGRMaWJzID09IG51bGwpCi0gICAgICAgID8gdHJ1ZSA6IChuZXcgQm9vbGVhbihhZGRMaWJzKSkuYm9vbGVhblZhbHVlKCk7Ci0gICAgICBfYWRkVGFnTGlicyAgID0gKGFkZFRhZ0xpYnMgPT0gbnVsbCkKLSAgICAgICAgPyB0cnVlIDogKG5ldyBCb29sZWFuKGFkZFRhZ0xpYnMpKS5ib29sZWFuVmFsdWUoKTsKLSAgICAgIEZpbGUgd2ViYXBwRGlyID0gbmV3IEZpbGUocHJvamVjdC5nZXRCYXNlZGlyKCksICJzcmMvdGVzdC93ZWJhcHAiKTsKLSAgICAgIC8vIFRPRE86IHJlYWQgY29uZmlndXJhdGlvbiBmb3IgY29tcGlsZXI6dGVzdENvbXBpbGUgZ29hbAotICAgICAgRmlsZSBvdXRwdXREaXIgPQotICAgICAgICBuZXcgRmlsZShwcm9qZWN0LmdldEJ1aWxkKCkuZ2V0RGlyZWN0b3J5KCksICJ0ZXN0LWNsYXNzZXMiKTsKLQotICAgICAgLy8gc2VsZiBkZXBlbmRlbmN5IG5lZWRlZCBmb3IgdGVzdCBwcm9qZWN0Ci0gICAgICBMaXN0IHRlc3REZXBlbmRlbmNpZXMgPSBuZXcgQXJyYXlMaXN0KHByb2plY3QuZ2V0VGVzdERlcGVuZGVuY2llcygpKTsKLSAgICAgIERlcGVuZGVuY3kgc2VsZkRlcGVuZGVuY3kgPSBuZXcgRGVwZW5kZW5jeSgpOwotICAgICAgc2VsZkRlcGVuZGVuY3kuc2V0QXJ0aWZhY3RJZChwcm9qZWN0LmdldEFydGlmYWN0SWQoKSk7Ci0gICAgICBzZWxmRGVwZW5kZW5jeS5zZXRHcm91cElkKHByb2plY3QuZ2V0R3JvdXBJZCgpKTsKLSAgICAgIHNlbGZEZXBlbmRlbmN5LnNldFR5cGUocHJvamVjdC5nZXRQYWNrYWdpbmcoKSk7Ci0gICAgICB0ZXN0RGVwZW5kZW5jaWVzLmFkZChzZWxmRGVwZW5kZW5jeSk7Ci0KLSAgICAgIE1hdmVuUHJvamVjdCBleGVjdXRpb25Qcm9qZWN0ID0gcHJvamVjdC5nZXRFeGVjdXRpb25Qcm9qZWN0KCk7Ci0gICAgICBMaXN0IGNvbXBpbGVTb3VyY2VSb290cyA9Ci0gICAgICAgIGV4ZWN1dGlvblByb2plY3QuZ2V0VGVzdENvbXBpbGVTb3VyY2VSb290cygpOwotCi0gICAgICBpZiAodGVzdFNvdXJjZVJvb3RzICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdGVzdFNvdXJjZVJvb3RzLmxlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgY29tcGlsZVNvdXJjZVJvb3RzLmFkZCh0ZXN0U291cmNlUm9vdHNbaV0uZ2V0QWJzb2x1dGVQYXRoKCkpOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIExpc3QgY29tcGlsZVJlc291cmNlUm9vdHMgPSBleGVjdXRpb25Qcm9qZWN0LmdldFRlc3RSZXNvdXJjZXMoKTsKLSAgICAgIGlmICh0ZXN0UmVzb3VyY2VSb290cyAhPSBudWxsKQotICAgICAgewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRlc3RSZXNvdXJjZVJvb3RzLmxlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgUmVzb3VyY2UgcmVzb3VyY2UgPSBuZXcgUmVzb3VyY2UoKTsKLSAgICAgICAgICByZXNvdXJjZS5zZXREaXJlY3RvcnkodGVzdFNvdXJjZVJvb3RzW2ldLmdldEFic29sdXRlUGF0aCgpKTsKLSAgICAgICAgICBjb21waWxlUmVzb3VyY2VSb290cy5hZGQocmVzb3VyY2UpOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGdldExvZygpLmluZm8oIkdlbmVyYXRpbmcgSkRldmVsb3BlciAiICsgcmVsZWFzZSArICIgUHJvamVjdCAiICsKLSAgICAgICAgICAgICAgICAgICAgcHJvamVjdC5nZXRBcnRpZmFjdElkKCkgKyAiLXRlc3QiKTsKLQotICAgICAgLy8gTm90ZTogYWxsIGFydGlmYWN0cyBpbXBsaWNpdGx5IGluY2x1ZGVkIGluICJ0ZXN0IiBzY29wZQotICAgICAgZ2VuZXJhdGVQcm9qZWN0KHByb2plY3RGaWxlLCBwcm9qZWN0LmdldEFydGlmYWN0SWQoKSArICItdGVzdCIsCi0gICAgICAgICAgICAgICAgICAgICAgcHJvamVjdC5nZXRQYWNrYWdpbmcoKSwgdGVzdERlcGVuZGVuY2llcywKLSAgICAgICAgICAgICAgICAgICAgICBwcm9qZWN0LmdldFRlc3RBcnRpZmFjdHMoKSwgY29tcGlsZVNvdXJjZVJvb3RzLAotICAgICAgICAgICAgICAgICAgICAgIGNvbXBpbGVSZXNvdXJjZVJvb3RzLAotICAgICAgICAgICAgICAgICAgICAgIENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3Qod2ViYXBwRGlyLmdldFBhdGgoKSksCi0gICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGlyKTsKLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgZ2VuZXJhdGVQcm9qZWN0KEZpbGUgcHJvamVjdEZpbGUsIFN0cmluZyBwcm9qZWN0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcGFja2FnaW5nLCBMaXN0IGRlcGVuZGVuY2llcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0IGFydGlmYWN0cywgTGlzdCBzb3VyY2VSb290cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0IHJlc291cmNlUm9vdHMsIExpc3Qgd2ViU291cmNlUm9vdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZSBvdXRwdXREaXIpCi0gICAgdGhyb3dzIElPRXhjZXB0aW9uLCBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBGaWxlIHByb2plY3REaXIgPSBwcm9qZWN0RmlsZS5nZXRQYXJlbnRGaWxlKCk7Ci0gICAgICBYcHAzRG9tIHByb2plY3RET00gPSByZWFkUHJvamVjdERPTShwcm9qZWN0RmlsZSk7Ci0gICAgICByZXBsYWNlV2ViYXBwSW5mbyhwcm9qZWN0TmFtZSwgcHJvamVjdERPTSk7Ci0gICAgICByZXBsYWNlU291cmNlUGF0aHMocHJvamVjdERpciwgc291cmNlUm9vdHMsIHJlc291cmNlUm9vdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgcHJvamVjdERPTSk7Ci0gICAgICAvL3JlcGxhY2VSZXNvdXJjZVBhdGhzKHByb2plY3REaXIsIHJlc291cmNlUm9vdHMsIHByb2plY3RET00pOwotICAgICAgcmVwbGFjZVdlYlNvdXJjZVBhdGhzKHByb2plY3REaXIsIHdlYlNvdXJjZVJvb3RzLCBwcm9qZWN0RE9NKTsKLSAgICAgIHJlcGxhY2VEZXBlbmRlbmNpZXMocHJvamVjdERpciwgZGVwZW5kZW5jaWVzLCBwcm9qZWN0RE9NKTsKLSAgICAgIHJlcGxhY2VMaWJyYXJpZXMocHJvamVjdERpciwgYXJ0aWZhY3RzLCBwcm9qZWN0RE9NKTsKLSAgICAgIHJlcGxhY2VUYWdMaWJyYXJpZXMocHJvamVjdERPTSk7Ci0gICAgICByZXBsYWNlT3V0cHV0RGlyZWN0b3J5KHByb2plY3REaXIsIG91dHB1dERpciwgcHJvamVjdERPTSk7Ci0gICAgICByZXBsYWNlUGFyYW1ldGVycyhwcm9qZWN0TmFtZSwgcHJvamVjdERPTSk7Ci0gICAgICB3cml0ZURPTShwcm9qZWN0RmlsZSwgcHJvamVjdERPTSk7Ci0KLSAgICAgIGlmICgid2FyIi5lcXVhbHMocGFja2FnaW5nKSkKLSAgICAgIHsKLSAgICAgICAgY29weVRhZ0xpYnJhcmllcyhwcm9qZWN0RGlyLCBkZXBlbmRlbmNpZXMsIGFydGlmYWN0cyk7Ci0gICAgICB9Ci0gICAgfQotICAgIGNhdGNoIChYbWxQdWxsUGFyc2VyRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgdGhyb3cgbmV3IE1vam9FeGVjdXRpb25FeGNlcHRpb24oIkVycm9yIGdlbmVyYXRpbmcgcHJvamVjdCIsIGUpOwotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgdm9pZCByZXBsYWNlUHJvamVjdHMoRmlsZSB3b3Jrc3BhY2VEaXIsIFhwcDNEb20gd29ya3NwYWNlRE9NKQotICAgIHRocm93cyBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uCi0gIHsKLSAgICAvLyAvandzOndvcmtzcGFjZQotICAgIC8vICAgL2xpc3RbQG49Imxpc3RPZkNoaWxkcmVuIl0KLSAgICBYcHAzRG9tIHNvdXJjZURPTSA9IHdvcmtzcGFjZURPTS5nZXRDaGlsZCgibGlzdCIpOwotCi0gICAgLy8gPGhhc2g+Ci0gICAgLy8gICA8dmFsdWUgbj0ibm9kZUNsYXNzIiB2PSJvcmFjbGUuamRldmVsb3Blci5tb2RlbC5KUHJvamVjdCIvPgotICAgIC8vICAgPHVybCBuPSJVUkwiIHBhdGg9Ilt3b3Jrc3BhY2UtcmVsYXRpdmUtcGF0aC10by1wcm9qZWN0Lmpwcl0iLz4KLSAgICAvLyA8L2hhc2g+Ci0gICAgWHBwM0RvbSB0YXJnZXRET00gPSBuZXcgWHBwM0RvbSgibGlzdCIpOwotCi0gICAgZm9yIChJdGVyYXRvciBpID0gcHJvamVjdC5nZXRDb2xsZWN0ZWRQcm9qZWN0cygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgewotICAgICAgTWF2ZW5Qcm9qZWN0IGNvbGxlY3RlZFByb2plY3QgPSAoTWF2ZW5Qcm9qZWN0KSBpLm5leHQoKTsKLQotICAgICAgLy8gaWYgYSBjaGlsZCBwcm9qZWN0IGlzIGFsc28gYSB3b3Jrc3BhY2UsIHRoZW4gZG9uJ3QgCi0gICAgICAvLyBwdXQgaXQgaW4gdGhlIC5qd3MgZmlsZS4gIEl0IHdpbGwgaGF2ZSBpdHMgb3duIC5qd3MKLSAgICAgIC8vIGZpbGUuCi0gICAgICBpZiAoISJwb20iLmVxdWFscyhjb2xsZWN0ZWRQcm9qZWN0LmdldFBhY2thZ2luZygpKSkKLSAgICAgIHsKLSAgICAgICAgRmlsZSBwcm9qZWN0RmlsZSA9IGdldEpQcm9qZWN0RmlsZShjb2xsZWN0ZWRQcm9qZWN0KTsKLSAgICAgICAgCi0gICAgICAgIHRhcmdldERPTS5hZGRDaGlsZChjcmVhdGVQcm9qZWN0UmVmZXJlbmNlRE9NKHdvcmtzcGFjZURpciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvamVjdEZpbGUpKTsKLSAgCi0gICAgICAgIEZpbGUgdGVzdFByb2plY3RGaWxlID0gZ2V0SlByb2plY3RUZXN0RmlsZShjb2xsZWN0ZWRQcm9qZWN0KTsKLSAgICAgICAgdGFyZ2V0RE9NLmFkZENoaWxkKGNyZWF0ZVByb2plY3RSZWZlcmVuY2VET00od29ya3NwYWNlRGlyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0UHJvamVjdEZpbGUpKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBUT0RPOiB1c2UgYSBiZXR0ZXIgbWVyZ2UgYWxnb3JpdGhtCi0gICAgcmVtb3ZlQ2hpbGRyZW4oc291cmNlRE9NKTsKLQotICAgIC8vIG1ha2Ugc3VyZSB0byBwYXNzIEJvb2xlYW4uRkFMU0UgdG8gYWxsb3cKLSAgICAvLyBtdWx0aXBsZSBjaGlsZCBlbGVtZW50cyB3aXRoIHRoZSBzYW1lIG5hbWUKLSAgICBYcHAzRG9tLm1lcmdlWHBwM0RvbShzb3VyY2VET00sIHRhcmdldERPTSwgQm9vbGVhbi5GQUxTRSk7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgcmVwbGFjZVdlYlNvdXJjZVBhdGhzKEZpbGUgcHJvamVjdERpciwgTGlzdCBzb3VyY2VSb290cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYcHAzRG9tIHByb2plY3RET00pCi0gICAgdGhyb3dzIFhtbFB1bGxQYXJzZXJFeGNlcHRpb24KLSAgewotICAgIC8vIC9qcHI6cHJvamVjdAotICAgIC8vICAgL2hhc2hbQG49Im9yYWNsZS5qZGV2ZWxvcGVyLm1vZGVsLkoyZWVTZXR0aW5ncyJdCi0gICAgLy8gICAgIC9oYXNoW0BuPSJ3ZWJDb250ZW50U2V0Il0KLSAgICAvLyAgICAgICAvbGlzdFtAbj0idXJsLXBhdGgiXQotICAgIFhwcDNEb20gcGF0aHNET00gPQotICAgICAgZmluZE5hbWVkQ2hpbGQocHJvamVjdERPTSwgImhhc2giLCAib3JhY2xlLmpkZXZlbG9wZXIubW9kZWwuSjJlZVNldHRpbmdzIik7Ci0gICAgWHBwM0RvbSBjb250ZW50U2V0RE9NID0KLSAgICAgIGZpbmROYW1lZENoaWxkKHBhdGhzRE9NLCAiaGFzaCIsICJ3ZWJDb250ZW50U2V0Iik7Ci0gICAgWHBwM0RvbSBzb3VyY2VET00gPSBmaW5kTmFtZWRDaGlsZChjb250ZW50U2V0RE9NLCAibGlzdCIsICJ1cmwtcGF0aCIpOwotCi0gICAgLy8KLSAgICAvLyA8dXJsIHBhdGg9IltyZWxhdGl2ZS1wYXRoLXRvLXNvdXJjZS1yb290XSIgLz4KLSAgICAvLwotICAgIFhwcDNEb20gdGFyZ2V0RE9NID0gbmV3IFhwcDNEb20oImxpc3QiKTsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBzb3VyY2VSb290cy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgIHsKLSAgICAgIEZpbGUgc291cmNlUm9vdCA9IG5ldyBGaWxlKChTdHJpbmcpIGkubmV4dCgpKTsKLSAgICAgIFN0cmluZyByZWxhdGl2ZVJvb3QgPSBnZXRSZWxhdGl2ZURpcihwcm9qZWN0RGlyLCBzb3VyY2VSb290KTsKLSAgICAgIFhwcDNEb20gdXJsRE9NID0gbmV3IFhwcDNEb20oInVybCIpOwotICAgICAgdXJsRE9NLnNldEF0dHJpYnV0ZSgicGF0aCIsIHJlbGF0aXZlUm9vdCk7Ci0gICAgICB0YXJnZXRET00uYWRkQ2hpbGQodXJsRE9NKTsKLSAgICB9Ci0KLSAgICAvLyBUT0RPOiB1c2UgYSBiZXR0ZXIgbWVyZ2UgYWxnb3JpdGhtCi0gICAgcmVtb3ZlQ2hpbGRyZW4oc291cmNlRE9NKTsKLQotICAgIC8vIG1ha2Ugc3VyZSB0byBwYXNzIEJvb2xlYW4uRkFMU0UgdG8gYWxsb3cKLSAgICAvLyBtdWx0aXBsZSBjaGlsZCBlbGVtZW50cyB3aXRoIHRoZSBzYW1lIG5hbWUKLSAgICBYcHAzRG9tLm1lcmdlWHBwM0RvbShzb3VyY2VET00sIHRhcmdldERPTSwgQm9vbGVhbi5GQUxTRSk7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgcmVwbGFjZVdlYmFwcEluZm8oU3RyaW5nIHByb2plY3ROYW1lLCBYcHAzRG9tIHByb2plY3RET00pCi0gICAgdGhyb3dzIFhtbFB1bGxQYXJzZXJFeGNlcHRpb24KLSAgewotICAgIC8vIC9qcHI6cHJvamVjdAotICAgIC8vICAgL2hhc2hbQG49Im9yYWNsZS5qZGV2ZWxvcGVyLm1vZGVsLkoyZWVTZXR0aW5ncyJdCi0gICAgLy8gICAgIC92YWx1ZVtAbj0iajJlZVdlYkFwcE5hbWUiIHY9Im1hdmVuLWdlbmVyYXRlZC13ZWJhcHAiXQotICAgIC8vICAgICAvdmFsdWVbQG49ImoyZWVXZWJDb250ZXh0Um9vdCIgdj0ibWF2ZW4tZ2VuZXJhdGVkLWNvbnRleHQtcm9vdCJdCi0gICAgWHBwM0RvbSBzZXR0aW5nc0RPTSA9Ci0gICAgICBmaW5kTmFtZWRDaGlsZChwcm9qZWN0RE9NLCAiaGFzaCIsICJvcmFjbGUuamRldmVsb3Blci5tb2RlbC5KMmVlU2V0dGluZ3MiKTsKLSAgICBYcHAzRG9tIHdlYmFwcE5hbWVET00gPQotICAgICAgZmluZE5hbWVkQ2hpbGQoc2V0dGluZ3NET00sICJ2YWx1ZSIsICJqMmVlV2ViQXBwTmFtZSIpOwotICAgIFhwcDNEb20gd2ViYXBwQ29udGV4dERPTSA9Ci0gICAgICBmaW5kTmFtZWRDaGlsZChzZXR0aW5nc0RPTSwgInZhbHVlIiwgImoyZWVXZWJDb250ZXh0Um9vdCIpOwotCi0gICAgLy8gdXBkYXRlIHRoZSB3ZWJhcHAgbmFtZQotICAgIHdlYmFwcE5hbWVET00uc2V0QXR0cmlidXRlKCJ2IiwgcHJvamVjdE5hbWUgKyAiLXdlYmFwcCIpOwotCi0gICAgLy8gdXBkYXRlIHRoZSB3ZWJhcHAgY29udGV4dCByb290Ci0gICAgd2ViYXBwQ29udGV4dERPTS5zZXRBdHRyaWJ1dGUoInYiLCBwcm9qZWN0TmFtZSArICItY29udGV4dC1yb290Iik7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgcmVwbGFjZVNvdXJjZVBhdGhzKEZpbGUgcHJvamVjdERpciwgTGlzdCBzb3VyY2VSb290cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0IHJlc291cmNlUm9vdHMsIFhwcDNEb20gcHJvamVjdERPTSkKLSAgICB0aHJvd3MgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbgotICB7Ci0gICAgLy8gL2pwcjpwcm9qZWN0Ci0gICAgLy8gICAvaGFzaFtAbj0ib3JhY2xlLmpkZXZlbG9wZXIubW9kZWwuUGF0aHNDb25maWd1cmF0aW9uIl0KLSAgICAvLyAgICAgL2hhc2hbQG49ImphdmFDb250ZW50U2V0Il0KLSAgICAvLyAgICAgICAvbGlzdFtAbj0idXJsLXBhdGgiXQotICAgIFhwcDNEb20gcGF0aHNET00gPQotICAgICAgZmluZE5hbWVkQ2hpbGQocHJvamVjdERPTSwgImhhc2giLCAib3JhY2xlLmpkZXZlbG9wZXIubW9kZWwuUGF0aHNDb25maWd1cmF0aW9uIik7Ci0gICAgWHBwM0RvbSBjb250ZW50U2V0RE9NID0KLSAgICAgIGZpbmROYW1lZENoaWxkKHBhdGhzRE9NLCAiaGFzaCIsICJqYXZhQ29udGVudFNldCIpOwotICAgIFhwcDNEb20gc291cmNlRE9NID0gZmluZE5hbWVkQ2hpbGQoY29udGVudFNldERPTSwgImxpc3QiLCAiY29uc3RpdHVlbnQtc2V0cyIpOwotCi0gICAgLy8KLSAgICAvLyA8dXJsIHBhdGg9IltyZWxhdGl2ZS1wYXRoLXRvLXNvdXJjZS1yb290XSIgLz4KLSAgICAvLwotICAgIFhwcDNEb20gdGFyZ2V0RE9NID0gbmV3IFhwcDNEb20oImxpc3QiKTsKLQotICAgIENvbGxlY3Rpb25zLnNvcnQoc291cmNlUm9vdHMpOwotICAgIGZvciAoSXRlcmF0b3IgaSA9IHNvdXJjZVJvb3RzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgewotICAgICAgRmlsZSBzb3VyY2VSb290ID0gbmV3IEZpbGUoKFN0cmluZykgaS5uZXh0KCkpOwotICAgICAgWHBwM0RvbSBoYXNoRE9NID0gbmV3IFhwcDNEb20oImhhc2giKTsKLQotICAgICAgWHBwM0RvbSBsaXN0RE9NID0gbmV3IFhwcDNEb20oImxpc3QiKTsKLSAgICAgIGxpc3RET00uc2V0QXR0cmlidXRlKCJuIiwgInBhdHRlcm4tZmlsdGVycyIpOwotICAgICAgaGFzaERPTS5hZGRDaGlsZChsaXN0RE9NKTsKLQotICAgICAgWHBwM0RvbSBzdHJpbmdET00gPSBuZXcgWHBwM0RvbSgic3RyaW5nIik7Ci0gICAgICBzdHJpbmdET00uc2V0QXR0cmlidXRlKCJ2IiwgIisqKiIpOwotICAgICAgbGlzdERPTS5hZGRDaGlsZChzdHJpbmdET00pOwotCi0gICAgICBsaXN0RE9NID0gbmV3IFhwcDNEb20oImxpc3QiKTsKLSAgICAgIGxpc3RET00uc2V0QXR0cmlidXRlKCJuIiwgInVybC1wYXRoIik7Ci0gICAgICBoYXNoRE9NLmFkZENoaWxkKGxpc3RET00pOwotCi0gICAgICBTdHJpbmcgcmVsYXRpdmVSb290ID0gZ2V0UmVsYXRpdmVEaXIocHJvamVjdERpciwgc291cmNlUm9vdCk7Ci0gICAgICBYcHAzRG9tIHVybERPTSA9IG5ldyBYcHAzRG9tKCJ1cmwiKTsKLSAgICAgIHVybERPTS5zZXRBdHRyaWJ1dGUoInBhdGgiLCByZWxhdGl2ZVJvb3QpOwotICAgICAgbGlzdERPTS5hZGRDaGlsZCh1cmxET00pOwotCi0gICAgICB0YXJnZXRET00uYWRkQ2hpbGQoaGFzaERPTSk7Ci0gICAgfQotCi0gICAgLy8gVE9ETzogZ2V0IGJ1ZyBmaXhlZCBpbiAxMC4xLjMgZm9yIGNvcHlpbmcgcmVzb3VyY2VzCi0gICAgQ29sbGVjdGlvbnMuc29ydChyZXNvdXJjZVJvb3RzLCBuZXcgQ29tcGFyYXRvcigpCi0gICAgICAgIHsKLSAgICAgICAgICBwdWJsaWMgaW50IGNvbXBhcmUoT2JqZWN0IGEsIE9iamVjdCBiKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFJlc291cmNlIHJhID0gKFJlc291cmNlKSBhOwotICAgICAgICAgICAgUmVzb3VyY2UgcmIgPSAoUmVzb3VyY2UpIGI7Ci0gICAgICAgICAgICByZXR1cm4gcmEuZ2V0RGlyZWN0b3J5KCkuY29tcGFyZVRvKHJiLmdldERpcmVjdG9yeSgpKTsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgfSk7Ci0KLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSByZXNvdXJjZVJvb3RzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgewotICAgICAgUmVzb3VyY2UgcmVzb3VyY2UgPSAoUmVzb3VyY2UpIGkubmV4dCgpOwotICAgICAgRmlsZSByZXNvdXJjZVJvb3QgPSBuZXcgRmlsZShyZXNvdXJjZS5nZXREaXJlY3RvcnkoKSk7Ci0gICAgICBTdHJpbmcgcmVsYXRpdmVSb290ID0gZ2V0UmVsYXRpdmVEaXIocHJvamVjdERpciwgcmVzb3VyY2VSb290KTsKLQotICAgICAgWHBwM0RvbSBoYXNoRE9NID0gbmV3IFhwcDNEb20oImhhc2giKTsKLQotICAgICAgWHBwM0RvbSBsaXN0RE9NID0gbmV3IFhwcDNEb20oImxpc3QiKTsKLSAgICAgIGxpc3RET00uc2V0QXR0cmlidXRlKCJuIiwgInBhdHRlcm4tZmlsdGVycyIpOwotICAgICAgaGFzaERPTS5hZGRDaGlsZChsaXN0RE9NKTsKLQotICAgICAgWHBwM0RvbSBzdHJpbmdET00gPSBudWxsOwotICAgICAgLy8gVE9ETzogVGhpcyBpcyBhIEhhY2sgZm9yIGV4Y2x1ZGluZyB0aGUgZ29sZGVuIGZpbGVzLAotICAgICAgLy8gd2hpY2ggYXJlIG5vdCByZWFsbHkgeG1sIGZpbGVzLiAgV2UgbmVlZCBhIHdheSwgaW4KLSAgICAgIC8vIHRoZSBwb20gZmlsZSB0byBzcGVjaWZ5IGV4Y2x1ZGVzLgotICAgICAgaWYgKHJlbGF0aXZlUm9vdC5zdGFydHNXaXRoKCJzcmMvdGVzdC9yZXNvdXJjZXMiKSkKLSAgICAgIHsKLSAgICAgICAgc3RyaW5nRE9NID0gbmV3IFhwcDNEb20oInN0cmluZyIpOwotICAgICAgICBzdHJpbmdET00uc2V0QXR0cmlidXRlKCJ2IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLW9yYWNsZS9hZGZpbnRlcm5hbC92aWV3L2ZhY2VzL3JlbmRlcmtpdC9nb2xkZW4vIik7Ci0gICAgICAgIGxpc3RET00uYWRkQ2hpbGQoc3RyaW5nRE9NKTsKLSAgICAgIH0KLQotICAgICAgc3RyaW5nRE9NID0gbmV3IFhwcDNEb20oInN0cmluZyIpOwotICAgICAgc3RyaW5nRE9NLnNldEF0dHJpYnV0ZSgidiIsICIrKioiKTsKLSAgICAgIGxpc3RET00uYWRkQ2hpbGQoc3RyaW5nRE9NKTsKLQotICAgICAgbGlzdERPTSA9IG5ldyBYcHAzRG9tKCJsaXN0Iik7Ci0gICAgICBsaXN0RE9NLnNldEF0dHJpYnV0ZSgibiIsICJ1cmwtcGF0aCIpOwotICAgICAgaGFzaERPTS5hZGRDaGlsZChsaXN0RE9NKTsKLQotICAgICAgWHBwM0RvbSB1cmxET00gPSBuZXcgWHBwM0RvbSgidXJsIik7Ci0gICAgICB1cmxET00uc2V0QXR0cmlidXRlKCJwYXRoIiwgcmVsYXRpdmVSb290KTsKLSAgICAgIGxpc3RET00uYWRkQ2hpbGQodXJsRE9NKTsKLQotICAgICAgdGFyZ2V0RE9NLmFkZENoaWxkKGhhc2hET00pOwotICAgIH0KLQotICAgIC8vIFRPRE86IHVzZSBhIGJldHRlciBtZXJnZSBhbGdvcml0aG0KLSAgICByZW1vdmVDaGlsZHJlbihzb3VyY2VET00pOwotCi0gICAgLy8gbWFrZSBzdXJlIHRvIHBhc3MgQm9vbGVhbi5GQUxTRSB0byBhbGxvdwotICAgIC8vIG11bHRpcGxlIGNoaWxkIGVsZW1lbnRzIHdpdGggdGhlIHNhbWUgbmFtZQotICAgIFhwcDNEb20ubWVyZ2VYcHAzRG9tKHNvdXJjZURPTSwgdGFyZ2V0RE9NLCBCb29sZWFuLkZBTFNFKTsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCByZXBsYWNlUmVzb3VyY2VQYXRocyhGaWxlIHByb2plY3REaXIsIExpc3QgcmVzb3VyY2VSb290cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhwcDNEb20gcHJvamVjdERPTSkKLSAgICB0aHJvd3MgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbgotICB7Ci0gICAgLy8gL2pwcjpwcm9qZWN0Ci0gICAgLy8gICAvaGFzaFtAbj0ib3JhY2xlLmlkZS5tb2RlbC5SZXNvdXJjZVBhdGhzIl0KLSAgICAvLyAgICAgL2hhc2hbQG49InJlc291cmNlc0NvbnRlbnRTZXQiXQotICAgIC8vICAgICAgIC9saXN0W0BuPSJ1cmwtcGF0aCJdCi0KLSAgICBYcHAzRG9tIHBhdGhzRE9NID0KLSAgICAgIGZpbmROYW1lZENoaWxkKHByb2plY3RET00sICJoYXNoIiwgIm9yYWNsZS5pZGUubW9kZWwuUmVzb3VyY2VQYXRocyIpOwotICAgIFhwcDNEb20gY29udGVudFNldERPTSA9Ci0gICAgICBmaW5kTmFtZWRDaGlsZChwYXRoc0RPTSwgImhhc2giLCAicmVzb3VyY2VzQ29udGVudFNldCIpOwotICAgIFhwcDNEb20gc291cmNlRE9NID0gZmluZE5hbWVkQ2hpbGQoY29udGVudFNldERPTSwgImxpc3QiLCAidXJsLXBhdGgiKTsKLQotICAgIC8vCi0gICAgLy8gPHVybCBwYXRoPSJbcmVsYXRpdmUtcGF0aC10by1zb3VyY2Utcm9vdF0iIC8+Ci0gICAgLy8KLSAgICBYcHAzRG9tIHRhcmdldERPTSA9IG5ldyBYcHAzRG9tKCJsaXN0Iik7Ci0gICAgZm9yIChJdGVyYXRvciBpID0gcmVzb3VyY2VSb290cy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgIHsKLSAgICAgIFJlc291cmNlIHJlc291cmNlID0gKFJlc291cmNlKSBpLm5leHQoKTsKLSAgICAgIEZpbGUgcmVzb3VyY2VSb290ID0gbmV3IEZpbGUocmVzb3VyY2UuZ2V0RGlyZWN0b3J5KCkpOwotICAgICAgU3RyaW5nIHJlbGF0aXZlUm9vdCA9IGdldFJlbGF0aXZlRGlyKHByb2plY3REaXIsIHJlc291cmNlUm9vdCk7Ci0gICAgICBYcHAzRG9tIHVybERPTSA9IG5ldyBYcHAzRG9tKCJ1cmwiKTsKLSAgICAgIHVybERPTS5zZXRBdHRyaWJ1dGUoInBhdGgiLCByZWxhdGl2ZVJvb3QpOwotICAgICAgdGFyZ2V0RE9NLmFkZENoaWxkKHVybERPTSk7Ci0gICAgfQotCi0gICAgLy8gVE9ETzogdXNlIGEgYmV0dGVyIG1lcmdlIGFsZ29yaXRobQotICAgIHJlbW92ZUNoaWxkcmVuKHNvdXJjZURPTSk7Ci0KLSAgICAvLyBtYWtlIHN1cmUgdG8gcGFzcyBCb29sZWFuLkZBTFNFIHRvIGFsbG93Ci0gICAgLy8gbXVsdGlwbGUgY2hpbGQgZWxlbWVudHMgd2l0aCB0aGUgc2FtZSBuYW1lCi0gICAgWHBwM0RvbS5tZXJnZVhwcDNEb20oc291cmNlRE9NLCB0YXJnZXRET00sIEJvb2xlYW4uRkFMU0UpOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIHJlcGxhY2VEZXBlbmRlbmNpZXMoRmlsZSBwcm9qZWN0RGlyLCBMaXN0IGRlcGVuZGVuY2llcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWHBwM0RvbSBwcm9qZWN0RE9NKQotICAgIHRocm93cyBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uCi0gIHsKLSAgICAvLyAvanByOnByb2plY3QKLSAgICAvLyAgIC9oYXNoW0BuPSJvcmFjbGUuaWRlLm1vZGVsLkRlcGVuZGVuY3lDb25maWd1cmF0aW9uIl0KLSAgICAvLyAgICAgL2xpc3RbQG49ImRlcGVuZGVuY3lMaXN0Il0KLSAgICBYcHAzRG9tIGNvbmZpZ0RPTSA9Ci0gICAgICBmaW5kTmFtZWRDaGlsZChwcm9qZWN0RE9NLCAiaGFzaCIsICJvcmFjbGUuaWRlLm1vZGVsLkRlcGVuZGVuY3lDb25maWd1cmF0aW9uIik7Ci0gICAgWHBwM0RvbSBzb3VyY2VET00gPQotICAgICAgZmluZE5hbWVkQ2hpbGQoY29uZmlnRE9NLCAibGlzdCIsICJkZXBlbmRlbmN5TGlzdCIpOwotCi0gICAgWHBwM0RvbSB0YXJnZXRET00gPSBuZXcgWHBwM0RvbSgibGlzdCIpOwotICAgIGZvciAoSXRlcmF0b3IgaSA9IGRlcGVuZGVuY2llcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgIHsKLSAgICAgIERlcGVuZGVuY3kgZGVwZW5kZW5jeSA9IChEZXBlbmRlbmN5KSBpLm5leHQoKTsKLSAgICAgIE1hdmVuUHJvamVjdCBkZXBlbmRlbnRQcm9qZWN0ID0KLSAgICAgICAgZmluZERlcGVuZGVudFByb2plY3QoZGVwZW5kZW5jeS5nZXRNYW5hZ2VtZW50S2V5KCkpOwotICAgICAgaWYgKGRlcGVuZGVudFByb2plY3QgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgRmlsZSBkZXBlbmRlbnRQcm9qZWN0RmlsZSA9IGdldEpQcm9qZWN0RmlsZShkZXBlbmRlbnRQcm9qZWN0KTsKLSAgICAgICAgU3RyaW5nIHJlbGF0aXZlUGF0aCA9Ci0gICAgICAgICAgZ2V0UmVsYXRpdmVGaWxlKHByb2plY3REaXIsIGRlcGVuZGVudFByb2plY3RGaWxlKTsKLQotICAgICAgICBYcHAzRG9tIGhhc2hET00gPSBuZXcgWHBwM0RvbSgiaGFzaCIpOwotICAgICAgICBYcHAzRG9tIHZhbHVlRE9NID0gbmV3IFhwcDNEb20oInZhbHVlIik7Ci0gICAgICAgIHZhbHVlRE9NLnNldEF0dHJpYnV0ZSgibiIsICJjbGFzcyIpOwotICAgICAgICB2YWx1ZURPTS5zZXRBdHRyaWJ1dGUoInYiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yYWNsZS5qZGV2ZWxvcGVyLmxpYnJhcnkuUHJvamVjdExpYnJhcnkiKTsKLSAgICAgICAgWHBwM0RvbSBzcmNPd25WYWxET00gPSBuZXcgWHBwM0RvbSgidmFsdWUiKTsKLSAgICAgICAgc3JjT3duVmFsRE9NLnNldEF0dHJpYnV0ZSgibiIsICJzb3VyY2VPd25lclVSTCIpOwotICAgICAgICBYcHAzRG9tIHVybERPTSA9IG5ldyBYcHAzRG9tKCJ1cmwiKTsKLSAgICAgICAgdXJsRE9NLnNldEF0dHJpYnV0ZSgibiIsICJzb3VyY2VVUkwiKTsKLSAgICAgICAgdXJsRE9NLnNldEF0dHJpYnV0ZSgicGF0aCIsIHJlbGF0aXZlUGF0aCk7Ci0gICAgICAgIGhhc2hET00uYWRkQ2hpbGQodmFsdWVET00pOwotICAgICAgICBoYXNoRE9NLmFkZENoaWxkKHNyY093blZhbERPTSk7Ci0gICAgICAgIGhhc2hET00uYWRkQ2hpbGQodXJsRE9NKTsKLSAgICAgICAgdGFyZ2V0RE9NLmFkZENoaWxkKGhhc2hET00pOwotICAgICAgfQotICAgIH0KLQotICAgIC8vIFRPRE86IHVzZSBhIGJldHRlciBtZXJnZSBhbGdvcml0aG0KLSAgICByZW1vdmVDaGlsZHJlbihzb3VyY2VET00pOwotCi0gICAgLy8gbWFrZSBzdXJlIHRvIHBhc3MgQm9vbGVhbi5GQUxTRSB0byBhbGxvdwotICAgIC8vIG11bHRpcGxlIGNoaWxkIGVsZW1lbnRzIHdpdGggdGhlIHNhbWUgbmFtZQotICAgIFhwcDNEb20ubWVyZ2VYcHAzRG9tKHNvdXJjZURPTSwgdGFyZ2V0RE9NLCBCb29sZWFuLkZBTFNFKTsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCByZXBsYWNlTGlicmFyaWVzKEZpbGUgcHJvamVjdERpciwgTGlzdCBhcnRpZmFjdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhwcDNEb20gcHJvamVjdERPTSkKLSAgICB0aHJvd3MgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbgotICB7Ci0gICAgLy8gL2pwcjpwcm9qZWN0Ci0gICAgLy8gICAvaGFzaFtAbj0ib3JhY2xlLmpkZXZpbXBsLmNvbmZpZy5KUHJvamVjdExpYnJhcmllcyJdCi0gICAgLy8gICAgIC9oYXNoW0BuPSJpbnRlcm5hbERlZmluaXRpb25zIl0KLSAgICAvLyAgICAgICAvbGlzdFtAbj0ibGlicmFyeURlZmluaXRpb25zIl0KLSAgICBYcHAzRG9tIHByb2plY3RMaWJzRE9NID0KLSAgICAgIGZpbmROYW1lZENoaWxkKHByb2plY3RET00sICJoYXNoIiwgIm9yYWNsZS5qZGV2aW1wbC5jb25maWcuSlByb2plY3RMaWJyYXJpZXMiKTsKLSAgICBYcHAzRG9tIGludGVybmFsRGVmc0RPTSA9Ci0gICAgICBmaW5kTmFtZWRDaGlsZChwcm9qZWN0TGlic0RPTSwgImhhc2giLCAiaW50ZXJuYWxEZWZpbml0aW9ucyIpOwotICAgIFhwcDNEb20gc291cmNlRGVmc0RPTSA9Ci0gICAgICBmaW5kTmFtZWRDaGlsZChpbnRlcm5hbERlZnNET00sICJsaXN0IiwgImxpYnJhcnlEZWZpbml0aW9ucyIpOwotCi0gICAgLy8gL2pwcjpwcm9qZWN0Ci0gICAgLy8gICAvaGFzaFtAbj0ib3JhY2xlLmpkZXZpbXBsLmNvbmZpZy5KUHJvamVjdExpYnJhcmllcyJdCi0gICAgLy8gICAgIC9saXN0W0BuPSJsaWJyYXJ5UmVmZXJlbmNlcyJdCi0gICAgWHBwM0RvbSBzb3VyY2VSZWZzRE9NID0KLSAgICAgIGZpbmROYW1lZENoaWxkKHByb2plY3RMaWJzRE9NLCAibGlzdCIsICJsaWJyYXJ5UmVmZXJlbmNlcyIpOwotCi0gICAgWHBwM0RvbSB0YXJnZXREZWZzRE9NID0gbmV3IFhwcDNEb20oImxpc3QiKTsKLSAgICBYcHAzRG9tIHRhcmdldFJlZnNET00gPSBuZXcgWHBwM0RvbSgibGlzdCIpOwotCi0gICAgLy8KLSAgICAvLyBsaWJyYXJ5RGVmaW5pdGlvbnMKLSAgICAvLwotICAgIC8vIDxoYXNoPgotICAgIC8vICAgPGxpc3Qgbj0iY2xhc3NQYXRoIj4KLSAgICAvLyAgICAgPHVybCBwYXRoPSJbcGF0aC10by1hcnRpZmFjdF0iIGphci1lbnRyeT0iIiAvPgotICAgIC8vICAgPC9saXN0PgotICAgIC8vICAgPHZhbHVlIG49ImRlcGxveWVkQnlEZWZhdWx0IiB2PSJ0cnVlIi8+Ci0gICAgLy8gICA8dmFsdWUgbj0iZGVzY3JpcHRpb24iIHY9IlthcnRpZmFjdC5pZF0iLz4KLSAgICAvLyAgIDx2YWx1ZSBuPSJpZCIgdj0iW2FydGlmYWN0LmlkXSIvPgotICAgIC8vIDwvaGFzaD4KLSAgICAvLwotCi0gICAgLy8gc29ydCB0aGUgYXJ0aWZhY3RzCi0gICAgQ29sbGVjdGlvbnMuc29ydChhcnRpZmFjdHMsIG5ldyBDb21wYXJhdG9yKCkKLSAgICAgICAgewotICAgICAgICAgIHB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgYSwgT2JqZWN0IGIpCi0gICAgICAgICAgewotICAgICAgICAgICAgQXJ0aWZhY3QgYXJ0YSA9IChBcnRpZmFjdCkgYTsKLSAgICAgICAgICAgIEFydGlmYWN0IGFydGIgPSAoQXJ0aWZhY3QpIGI7Ci0gICAgICAgICAgICByZXR1cm4gYXJ0YS5nZXRJZCgpLmNvbXBhcmVUbyhhcnRiLmdldElkKCkpOwotICAgICAgICAgIH0KLQotICAgICAgICB9KTsKLQotICAgIExpc3QgbGlicmFyeVJlZnMgPSBuZXcgTGlua2VkTGlzdCgpOwotICAgIGZvciAoSXRlcmF0b3IgaSA9IGFydGlmYWN0cy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgIHsKLSAgICAgIEFydGlmYWN0IGFydGlmYWN0ID0gKEFydGlmYWN0KSBpLm5leHQoKTsKLQotICAgICAgaWYgKCFpc0RlcGVuZGVudFByb2plY3QoYXJ0aWZhY3QuZ2V0RGVwZW5kZW5jeUNvbmZsaWN0SWQoKSkpCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyBpZCA9IGFydGlmYWN0LmdldElkKCk7Ci0gICAgICAgIFN0cmluZyBwYXRoID0gZ2V0UmVsYXRpdmVGaWxlKHByb2plY3REaXIsIGFydGlmYWN0LmdldEZpbGUoKSk7Ci0KLSAgICAgICAgLy8gbGlicmFyeURlZmluaXRpb25zIGVudHJ5Ci0gICAgICAgIFhwcDNEb20gaGFzaERPTSA9IG5ldyBYcHAzRG9tKCJoYXNoIik7Ci0gICAgICAgIFhwcDNEb20gbGlzdERPTSA9IG5ldyBYcHAzRG9tKCJsaXN0Iik7Ci0gICAgICAgIGxpc3RET00uc2V0QXR0cmlidXRlKCJuIiwgImNsYXNzUGF0aCIpOwotCi0gICAgICAgIFhwcDNEb20gdXJsRE9NID0gbmV3IFhwcDNEb20oInVybCIpOwotICAgICAgICB1cmxET00uc2V0QXR0cmlidXRlKCJwYXRoIiwgcGF0aCk7Ci0gICAgICAgIHVybERPTS5zZXRBdHRyaWJ1dGUoImphci1lbnRyeSIsICIiKTsKLSAgICAgICAgbGlzdERPTS5hZGRDaGlsZCh1cmxET00pOwotICAgICAgICBoYXNoRE9NLmFkZENoaWxkKGxpc3RET00pOwotCi0gICAgICAgIFhwcDNEb20gdmFsdWVET00gPSBuZXcgWHBwM0RvbSgidmFsdWUiKTsKLSAgICAgICAgdmFsdWVET00uc2V0QXR0cmlidXRlKCJuIiwgImRlcGxveWVkQnlEZWZhdWx0Iik7Ci0gICAgICAgIHZhbHVlRE9NLnNldEF0dHJpYnV0ZSgidiIsICJ0cnVlIik7Ci0gICAgICAgIGhhc2hET00uYWRkQ2hpbGQodmFsdWVET00pOwotCi0gICAgICAgIHZhbHVlRE9NID0gbmV3IFhwcDNEb20oInZhbHVlIik7Ci0gICAgICAgIHZhbHVlRE9NLnNldEF0dHJpYnV0ZSgibiIsICJkZXNjcmlwdGlvbiIpOwotICAgICAgICB2YWx1ZURPTS5zZXRBdHRyaWJ1dGUoInYiLCBpZCk7Ci0gICAgICAgIGhhc2hET00uYWRkQ2hpbGQodmFsdWVET00pOwotCi0gICAgICAgIHZhbHVlRE9NID0gbmV3IFhwcDNEb20oInZhbHVlIik7Ci0gICAgICAgIHZhbHVlRE9NLnNldEF0dHJpYnV0ZSgibiIsICJpZCIpOwotICAgICAgICB2YWx1ZURPTS5zZXRBdHRyaWJ1dGUoInYiLCBpZCk7Ci0gICAgICAgIGhhc2hET00uYWRkQ2hpbGQodmFsdWVET00pOwotICAgICAgICB0YXJnZXREZWZzRE9NLmFkZENoaWxkKGhhc2hET00pOwotCi0gICAgICAgIGxpYnJhcnlSZWZzLmFkZChpZCk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8gVGhpcyBib29sZWFuIGlzIHNldCBieSBzcGVjaWZ5aW5nIHRoZSBqZGV2LnBsdWdpbi5hZGQubGlicmFyaWVzCi0gICAgLy8gcHJvcGVydHkgYXQgdGhlIHRvcCBvZiBhIHByb2plY3QncyBwb20gZmlsZS4gIFRoZXJlIGFyZSBwcm9qZWN0cwotICAgIC8vIHRoYXQgZG9uJ3QgbmVlZCB0aGVzZSBsaWJyYXJpZXMgaW4gdGhlaXIgLmpwciBmaWxlcyB0byBjb21waWxlIGFuZCB0aGlzCi0gICAgLy8gcHJvcGVydHkgYWxsb3dzIHRoZW0gdG8gYmUgZXhjbHVkZWQuCi0gICAgLy8KLSAgICAvLyBJTVBPUlRBTlQgTk9URTogaWYgdGhpcyBwcm9wZXJ0eSBpcyBzZXQgaW4gYSBwcm9qZWN0LAotICAgIC8vIHRoZW4gbGlicmFyaWVzIHdpbGwgTk9UIGJlIGFkZGVkLCBldmVuIHRob3VnaCB0aGV5Ci0gICAgLy8gbWF5IGJlIHNwZWNpZmllZCB1bmRlciB0aGUgbWF2ZW4tamRldi1wbHVnaW4uCi0gICAgaWYgKF9hZGRMaWJyYXJpZXMpCi0gICAgewotICAgICAgLy8gQWRkIGxpYnJhcmllcy4gIFRoZSBkZWZhdWx0IGxpYnJhcmllcyBjYW4gYmUKLSAgICAgIC8vIG92ZXJyaWRkZW4gaW4gdGhlIHRydW5rL3RvcGxldmVsIHBvbSBmaWxlLgotICAgICAgaWYgKF9yZWxlYXNlTWFqb3IgPj0gMTEpCi0gICAgICB7Ci0gICAgICAgIC8vIEFkZCB0aGUgZGVmYXVsdCBsaWJyYXJpZXMKLSAgICAgICAgbGlicmFyeVJlZnMuYWRkKDAsIkpTRiAxLjIiKTsKLSAgICAgICAgbGlicmFyeVJlZnMuYWRkKDAsIkpTUCBSdW50aW1lIik7Ci0gICAgICB9Ci0KLSAgICAgIC8vIEFkZCB0aGUgbGlicmFyaWVzCi0gICAgICBpZiAobGlicmFyaWVzICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGlicmFyaWVzLmxlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgLy8gRGVmYXVsdCBsaWJyYXJpZXMgZm9yIHJlbGVhc2UgMTEgd2VyZSBhbHJlYWR5Ci0gICAgICAgICAgLy8gYWRkZWQgYWJvdmUuCi0gICAgICAgICAgaWYgKCAgIChfcmVsZWFzZU1ham9yID49IDExKQotICAgICAgICAgICAgICAmJiAoICAgKCJKU0YgMS4yIi5lcXVhbHNJZ25vcmVDYXNlKGxpYnJhcmllc1tpXSkpCi0gICAgICAgICAgICAgICAgICB8fCAoIkpTUCBSdW50aW1lIi5lcXVhbHNJZ25vcmVDYXNlKGxpYnJhcmllc1tpXSkpCi0gICAgICAgICAgICAgICAgICkKLSAgICAgICAgICAgICApCi0gICAgICAgICAgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgfQotICAgICAgICAgIC8vIEFkZCB0aGUgbGlicmFyeQotICAgICAgICAgIGxpYnJhcnlSZWZzLmFkZCgwLCBsaWJyYXJpZXNbaV0pOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8KLSAgICAvLyBsaWJyYXJ5UmVmZXJlbmNlcwotICAgIC8vCi0gICAgLy8gPGhhc2g+Ci0gICAgLy8gICA8dmFsdWUgbj0iaWQiIHY9IlthcnRpZmFjdC5pZF0iLz4KLSAgICAvLyAgIDx2YWx1ZSBuPSJpc0pESyIgdj0iZmFsc2UiLz4KLSAgICAvLyA8L2hhc2g+Ci0gICAgLy8KLSAgICBDb2xsZWN0aW9ucy5zb3J0KGxpYnJhcnlSZWZzKTsKLQotICAgIGZvciAoSXRlcmF0b3IgaSA9IGxpYnJhcnlSZWZzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgewotICAgICAgU3RyaW5nIGlkID0gKFN0cmluZykgaS5uZXh0KCk7Ci0KLSAgICAgIC8vIGxpYnJhcnlSZWZlcmVuY2VzIGVudHJ5Ci0gICAgICBYcHAzRG9tIGhhc2hET00gPSBuZXcgWHBwM0RvbSgiaGFzaCIpOwotICAgICAgWHBwM0RvbSB2YWx1ZURPTSA9IG5ldyBYcHAzRG9tKCJ2YWx1ZSIpOwotICAgICAgdmFsdWVET00uc2V0QXR0cmlidXRlKCJuIiwgImlkIik7Ci0gICAgICB2YWx1ZURPTS5zZXRBdHRyaWJ1dGUoInYiLCBpZCk7Ci0gICAgICBoYXNoRE9NLmFkZENoaWxkKHZhbHVlRE9NKTsKLQotICAgICAgdmFsdWVET00gPSBuZXcgWHBwM0RvbSgidmFsdWUiKTsKLSAgICAgIHZhbHVlRE9NLnNldEF0dHJpYnV0ZSgibiIsICJpc0pESyIpOwotICAgICAgdmFsdWVET00uc2V0QXR0cmlidXRlKCJ2IiwgImZhbHNlIik7Ci0gICAgICBoYXNoRE9NLmFkZENoaWxkKHZhbHVlRE9NKTsKLSAgICAgIHRhcmdldFJlZnNET00uYWRkQ2hpbGQoaGFzaERPTSk7Ci0gICAgfQotCi0gICAgLy8gRmlyc3QsIGFkZCBKU1AgUnVudGltZSBkZXBlbmRlbmN5IGlmIHNyYy9tYWluL3dlYmFwcCBleGlzdHMKLSAgICAvLyBUT0RPOiB1c2UgYSBiZXR0ZXIgbWVyZ2UgYWxnb3JpdGhtCi0gICAgcmVtb3ZlQ2hpbGRyZW4oc291cmNlRGVmc0RPTSk7Ci0gICAgcmVtb3ZlQ2hpbGRyZW4oc291cmNlUmVmc0RPTSk7Ci0KLSAgICAvLyBtYWtlIHN1cmUgdG8gcGFzcyBCb29sZWFuLkZBTFNFIHRvIGFsbG93Ci0gICAgLy8gbXVsdGlwbGUgY2hpbGQgZWxlbWVudHMgd2l0aCB0aGUgc2FtZSBuYW1lCi0gICAgWHBwM0RvbS5tZXJnZVhwcDNEb20oc291cmNlRGVmc0RPTSwgdGFyZ2V0RGVmc0RPTSwgQm9vbGVhbi5GQUxTRSk7Ci0gICAgWHBwM0RvbS5tZXJnZVhwcDNEb20oc291cmNlUmVmc0RPTSwgdGFyZ2V0UmVmc0RPTSwgQm9vbGVhbi5GQUxTRSk7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgcmVwbGFjZUxvY2FsVGFnTGlicmFyaWVzKFhwcDNEb20gdGFyZ2V0TGlic0RPTSkKLSAgICB0aHJvd3MgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbgotICB7Ci0gICAgVGxkQ29udGVudEhhbmRsZXIgdGxkSGFuZGxlciA9IG5ldyBUbGRDb250ZW50SGFuZGxlcigpOwotICAgIFN0cmluZyBwYXRoID0gbnVsbDsKLQotICAgIC8vIExvb3AgdGhyb3VnaCBhbGwgdGhlIC50bGQgZmlsZXMgaW4gdGhlIFdFQi1JTkYgZGlyCi0gICAgLy8gUGFyc2UgZWFjaCBhbmQgZ2V0IHRoZSB2YWx1ZXMgbmVlZGVkIGZvciB0aGUgVGFnTGlicmFyaWVzCi0gICAgLy8gaGFzaCBpbiB0aGUgLmpwciBmaWxlLgotICAgIHRyeQotICAgIHsKLSAgICAgIEZpbGUgd2ViSW5mRGlyID0KLSAgICAgICAgbmV3IEZpbGUocHJvamVjdC5nZXRCYXNlZGlyKCksICJzcmMvbWFpbi93ZWJhcHAvV0VCLUlORiIpOwotICAgICAgaWYgKHdlYkluZkRpciA9PSBudWxsKQotICAgICAgewotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0KLSAgICAgIEZpbGVbXSBmaWxlcyA9IHdlYkluZkRpci5saXN0RmlsZXMoKTsKLSAgICAgIGlmIChmaWxlcyA9PSBudWxsKQotICAgICAgewotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0KLSAgICAgIFhwcDNEb20gaGFzaERPTSA9IG51bGw7Ci0gICAgICBYcHAzRG9tIHZhbHVlRE9NID0gbnVsbDsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspCi0gICAgICB7Ci0gICAgICAgIHBhdGggPSBmaWxlc1tpXS5nZXRQYXRoKCk7Ci0gICAgICAgIGlmIChwYXRoLmVuZHNXaXRoKCIudGxkIikpCi0gICAgICAgIHsKLSAgICAgICAgICBoYXNoRE9NID0gbmV3IFhwcDNEb20oImhhc2giKTsKLSAgICAgICAgICAvLyB3ZSBoYXZlIGEgdGFnIGxpYnJhcnkuICBQYXJzZSBpdCBhbmQKLSAgICAgICAgICAvLyBnZXQgdGhlIHZhbHVlcyBuZWVkZWQgZm9yIHRoZSAuanByIGZpbGUKLQotICAgICAgICAgIC8vIFBhcnNlCi0gICAgICAgICAgdGxkSGFuZGxlci5wYXJzZVRsZChmaWxlc1tpXSk7Ci0gICAgICAgICAgLy8gY2FsbCBnZXR0b3JzIHRvIGdldCB0aGUgdmFsdWVzCi0gICAgICAgICAgdmFsdWVET00gPSBuZXcgWHBwM0RvbSgidmFsdWUiKTsKLSAgICAgICAgICB2YWx1ZURPTS5zZXRBdHRyaWJ1dGUoIm4iLCAianNwVmVyc2lvbiIpOwotICAgICAgICAgIHZhbHVlRE9NLnNldEF0dHJpYnV0ZSgidiIsIHRsZEhhbmRsZXIuZ2V0SnNwVmVyc2lvbigpKTsKLSAgICAgICAgICBoYXNoRE9NLmFkZENoaWxkKHZhbHVlRE9NKTsKLQotICAgICAgICAgIHZhbHVlRE9NID0gbmV3IFhwcDNEb20oInZhbHVlIik7Ci0gICAgICAgICAgdmFsdWVET00uc2V0QXR0cmlidXRlKCJuIiwgIm5hbWUiKTsKLSAgICAgICAgICB2YWx1ZURPTS5zZXRBdHRyaWJ1dGUoInYiLCB0bGRIYW5kbGVyLmdldE5hbWUoKSk7Ci0gICAgICAgICAgaGFzaERPTS5hZGRDaGlsZCh2YWx1ZURPTSk7Ci0KLSAgICAgICAgICB2YWx1ZURPTSA9IG5ldyBYcHAzRG9tKCJ2YWx1ZSIpOwotICAgICAgICAgIHZhbHVlRE9NLnNldEF0dHJpYnV0ZSgibiIsICJwcmVmaXgiKTsKLSAgICAgICAgICB2YWx1ZURPTS5zZXRBdHRyaWJ1dGUoInYiLCB0bGRIYW5kbGVyLmdldFByZWZpeCgpKTsKLSAgICAgICAgICBoYXNoRE9NLmFkZENoaWxkKHZhbHVlRE9NKTsKLQotICAgICAgICAgIHZhbHVlRE9NID0gbmV3IFhwcDNEb20oInZhbHVlIik7Ci0gICAgICAgICAgdmFsdWVET00uc2V0QXR0cmlidXRlKCJuIiwgInRsZFVSTCIpOwotICAgICAgICAgIHZhbHVlRE9NLnNldEF0dHJpYnV0ZSgidiIsCi0gICAgICAgICAgICAiV0VCLUlORi8iICsgcGF0aC5zdWJzdHJpbmcocGF0aC5pbmRleE9mKCJXRUItSU5GIikgKyAgOCkpOwotICAgICAgICAgIGhhc2hET00uYWRkQ2hpbGQodmFsdWVET00pOwotCi0gICAgICAgICAgdmFsdWVET00gPSBuZXcgWHBwM0RvbSgidmFsdWUiKTsKLSAgICAgICAgICB2YWx1ZURPTS5zZXRBdHRyaWJ1dGUoIm4iLCAiVVJJIik7Ci0gICAgICAgICAgdmFsdWVET00uc2V0QXR0cmlidXRlKCJ2IiwgdGxkSGFuZGxlci5nZXRVUkkoKSk7Ci0gICAgICAgICAgaGFzaERPTS5hZGRDaGlsZCh2YWx1ZURPTSk7Ci0KLSAgICAgICAgICB2YWx1ZURPTSA9IG5ldyBYcHAzRG9tKCJ2YWx1ZSIpOwotICAgICAgICAgIHZhbHVlRE9NLnNldEF0dHJpYnV0ZSgibiIsICJ2ZXJzaW9uIik7Ci0gICAgICAgICAgdmFsdWVET00uc2V0QXR0cmlidXRlKCJ2IiwgdGxkSGFuZGxlci5nZXRWZXJzaW9uKCkpOwotICAgICAgICAgIGhhc2hET00uYWRkQ2hpbGQodmFsdWVET00pOwotCi0gICAgICAgICAgLy8gQWRkIGVhY2ggZmlsZSdzIGhhc2ggdG8gdGhlIHRhZy1saWJyYXJpZXMgImxpc3QiCi0gICAgICAgICAgdGFyZ2V0TGlic0RPTS5hZGRDaGlsZChoYXNoRE9NKTsKLSAgICAgICAgfSAvLyBlbmRpZgotICAgICAgfSAvLyBlbmRmb3IKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgY2F0Y2ggKFNBWEV4Y2VwdGlvbiBzYXhleCkKLSAgICB7Ci0gICAgICBnZXRMb2coKS5pbmZvKCJTQVggUGFyc2UgRXhjZXB0aW9uIHBhcnNpbmcgIiArIHBhdGggKyAiOiAiICsKLSAgICAgICAgICAgICAgICAgICAgc2F4ZXguZ2V0TWVzc2FnZSgpLCBzYXhleCk7Ci0gICAgfQotICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpCi0gICAgewotICAgICAgZ2V0TG9nKCkuaW5mbygiVW5hYmxlIHRvIG9wZW4gYW4gSW5wdXRTdHJlYW0gdG8gIiArIHBhdGgsIGlvZSk7Ci0gICAgfQotICAgIGNhdGNoIChQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIHBjZSkKLSAgICB7Ci0gICAgICBnZXRMb2coKS5pbmZvKCJVbmFibGUgdG8gY3JlYXRlIFNBWCBwYXJzZXIgZm9yICIgKyBwYXRoLCBwY2UpOwotICAgIH0KLSAgfQotCi0KLSAgcHJpdmF0ZSB2b2lkIHJlcGxhY2VUYWdMaWJyYXJpZXMoWHBwM0RvbSBwcm9qZWN0RE9NKQotICAgIHRocm93cyBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uCi0gIHsKLSAgICAvLyBUaGlzIGJvb2xlYW4gaXMgc2V0IGJ5IHNwZWNpZnlpbmcgdGhlIGpkZXYucGx1Z2luLmFkZC50YWdsaWJzCi0gICAgLy8gcHJvcGVydHkgYXQgdGhlIHRvcCBvZiBhIHByb2plY3QncyBwb20gZmlsZS4gIFRoZXJlIGFyZSBwcm9qZWN0cwotICAgIC8vIHRoYXQgZG9uJ3QgbmVlZCB0YWdsaWJzIGluIHRoZWlyIC5qcHIgZmlsZXMgdG8gY29tcGlsZSBhbmQgdGhpcwotICAgIC8vIGFsbG93cyB0aGVtIHRvIGJlIGV4Y2x1ZGVkLgotICAgIGlmICghX2FkZFRhZ0xpYnMpCi0gICAgewotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIC8vIC9qcHI6cHJvamVjdAotICAgIC8vICAgL2hhc2hbQG49Im9yYWNsZS5qZGV2aW1wbC53ZWJhcHAuanNwLmxpYnJhcmllcy5tb2RlbC5Qcm9qZWN0VGFnTGlicmFyaWVzIl0KLSAgICAvLyAgICAgICAvbGlzdFtAbj0idGFnLWxpYmFyaWVzIl0KLSAgICBYcHAzRG9tIHByb2plY3RUYWdzRE9NID0KLSAgICAgIGZpbmROYW1lZENoaWxkKHByb2plY3RET00sICJoYXNoIiwgIm9yYWNsZS5qZGV2aW1wbC53ZWJhcHAuanNwLmxpYnJhcmllcy5tb2RlbC5Qcm9qZWN0VGFnTGlicmFyaWVzIik7Ci0gICAgWHBwM0RvbSB0YWdMaWJzRE9NID0KLSAgICAgIGZpbmROYW1lZENoaWxkKHByb2plY3RUYWdzRE9NLCAibGlzdCIsICJ0YWctbGlicmFyaWVzIik7Ci0KLSAgICBYcHAzRG9tIHRhcmdldExpYnNET00gPSBuZXcgWHBwM0RvbSgibGlzdCIpOwotCi0gICAgLy8KLSAgICAvLyB0YWdMaWJyYXJ5RGVmaW5pdGlvbnMKLSAgICAvLwotICAgIC8vPGhhc2g+Ci0gICAgLy8gIDxoYXNoIG49ImJhc2VMaWJyYXJ5Ij4KLSAgICAvLyAgICA8dmFsdWUgbj0ibmFtZSIgdj0iSlNGIEhUTUwiPjwvdmFsdWU+Ci0gICAgLy8gICAgPHZhbHVlIG49InZlcnNpb24iIHY9IjEuMiI+PC92YWx1ZT4KLSAgICAvLyAgPC9oYXNoPgotICAgIC8vICA8dmFsdWUgbj0ianNwVmVyc2lvbiIgdj0iMi4xIj48L3ZhbHVlPgotICAgIC8vICA8dmFsdWUgbj0ibmFtZSIgdj0iSlNGIEhUTUwiPjwvdmFsdWU+Ci0gICAgLy8KLSAgICAvLyAgPHZhbHVlIG49InRsZFVSTCIgdj0iQG9yYWNsZS5ob21lQGxpYi9qYXZhL3NoYXJlZC9vcmFjbGUuanNmLzEuMi9qc2YtcmkuamFyIS9NRVRBLUlORi9odG1sX2Jhc2ljLnRsZCI+PC92YWx1ZT4KLSAgICAvLyAgPHZhbHVlIG49IlVSSSIgdj0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvaHRtbCI+PC92YWx1ZT4KLSAgICAvLyAgPHZhbHVlIG49InZlcnNpb24iIHY9IjEuMiI+PC92YWx1ZT4KLSAgICAvLzwvaGFzaD4KLSAgICAvLwotCi0gICAgLy8gUGFyZW50ICJoYXNoIgotICAgIFhwcDNEb20gaGFzaERPTSA9IG51bGw7Ci0KLSAgICAvLyA8dmFsdWUuLi4KLSAgICBYcHAzRG9tIHZhbHVlRE9NID0gbnVsbDsKLQotICAgIGlmIChkaXN0cmlidXRlZFRhZ0xpYnJhcmllcyAhPSBudWxsICYmCi0gICAgICAgIGRpc3RyaWJ1dGVkVGFnTGlicmFyaWVzLmxlbmd0aCA+IDApCi0gICAgewotICAgICAgLy8gUHJvY2VzcyBlYWNoIGRpc3RyaWJ1dGVkIFRhZyBMaWJyYXJ5Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRpc3RyaWJ1dGVkVGFnTGlicmFyaWVzLmxlbmd0aDsgaSsrKQotICAgICAgewotICAgICAgICBQcm9wZXJ0aWVzIGRpc1RhZ0xpYiA9IGRpc3RyaWJ1dGVkVGFnTGlicmFyaWVzW2ldOwotICAgICAgICBTdHJpbmcgbmFtZU5hbWUgPSBudWxsOwotICAgICAgICBTdHJpbmcgbmFtZVZhbHVlID0gbnVsbDsKLSAgICAgICAgU3RyaW5nIHZlcnNpb25OYW1lID0gbnVsbDsKLSAgICAgICAgU3RyaW5nIHZlcnNpb25WYWx1ZSA9IG51bGw7Ci0KLSAgICAgICAgLy8gQ3JlYXRlIHBhcmVudCBoYXNoIGZvciBlYWNoIHRhZ2xpYgotICAgICAgICBoYXNoRE9NID0gbmV3IFhwcDNEb20oImhhc2giKTsKLQotICAgICAgICAvLyBiYXNlTGlicmFyeSAiaGFzaCIgZm9yIGVhY2ggdGFnbGliCi0gICAgICAgIFhwcDNEb20gaGFzaEJhc2VET00gPSBuZXcgWHBwM0RvbSgiaGFzaCIpOwotICAgICAgICBoYXNoQmFzZURPTS5zZXRBdHRyaWJ1dGUoIm4iLCAiYmFzZUxpYnJhcnkiKTsKLSAgICAgICAgLy8gQWRkIGJhc2VMaWJyYXJ5IGhhc2ggdG8gcGFyZW50IGhhc2gKLSAgICAgICAgaGFzaERPTS5hZGRDaGlsZChoYXNoQmFzZURPTSk7Ci0KLSAgICAgICAgLy8gUHJvY2VzcyBlYWNoIHByb3BlcnR5IG9mIHRoZSB0YWdsaWIKLSAgICAgICAgZm9yIChFbnVtZXJhdGlvbiBrZXlzID0gZGlzVGFnTGliLnByb3BlcnR5TmFtZXMoKTsKLSAgICAgICAgICAgICBrZXlzLmhhc01vcmVFbGVtZW50cygpOyApCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBHZXQgdGhlIG5hbWUgdmFsdWUgcGFpcgotICAgICAgICAgIFN0cmluZyBuYW1lID0gKFN0cmluZykga2V5cy5uZXh0RWxlbWVudCgpOwotICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IChTdHJpbmcpIGRpc1RhZ0xpYi5nZXQobmFtZSk7Ci0KLSAgICAgICAgICAvLyBQdXQgdGhlIG5hbWUgYW5kIHZlcnNpb24gdmFsdWVzCi0gICAgICAgICAgLy8gaW5zaWRlIHRoZSBiYXNlTGlicmFyeSBoYXNoLgotICAgICAgICAgIC8vIFRoaXMgb25seSBoYXBwZW5zIG9uY2UgcGVyIHRhZ2xpYgotICAgICAgICAgIGlmICgibmFtZSIuZXF1YWxzKG5hbWUpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIG5hbWVOYW1lID0gbmFtZTsKLSAgICAgICAgICAgIG5hbWVWYWx1ZSA9IHZhbHVlOwotCi0gICAgICAgICAgICAvLyBuPSJuYW1lLCB2PTxuYW1lIG9mIHRhZ2xpYj4gaW4gYmFzZUxpYnJhcnkKLSAgICAgICAgICAgIHZhbHVlRE9NID0gbmV3IFhwcDNEb20oInZhbHVlIik7Ci0gICAgICAgICAgICB2YWx1ZURPTS5zZXRBdHRyaWJ1dGUoIm4iLCBuYW1lKTsKLSAgICAgICAgICAgIHZhbHVlRE9NLnNldEF0dHJpYnV0ZSgidiIsIHZhbHVlKTsKLSAgICAgICAgICAgIGhhc2hCYXNlRE9NLmFkZENoaWxkKHZhbHVlRE9NKTsKLQotICAgICAgICAgICAgLy8gRHVwbGljYXRlIHRoZSAibmFtZSIgIDx2YWx1ZS4uLgotICAgICAgICAgICAgLy8gb3V0c2lkZSBvZiB0aGUgYmFzZUxpYnJhcnkKLSAgICAgICAgICAgIC8vIG49Im5hbWUsIHY9PG5hbWUgb2YgdGFnbGliPiBpbiBwYXJlbnQgaGFzaAotICAgICAgICAgICAgdmFsdWVET00gPSBuZXcgWHBwM0RvbSgidmFsdWUiKTsKLSAgICAgICAgICAgIHZhbHVlRE9NLnNldEF0dHJpYnV0ZSgibiIsIG5hbWVOYW1lKTsKLSAgICAgICAgICAgIHZhbHVlRE9NLnNldEF0dHJpYnV0ZSgidiIsIG5hbWVWYWx1ZSk7Ci0gICAgICAgICAgICBoYXNoRE9NLmFkZENoaWxkKHZhbHVlRE9NKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSBpZiAoInZlcnNpb24iLmVxdWFscyhuYW1lKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICB2ZXJzaW9uTmFtZSA9IG5hbWU7Ci0gICAgICAgICAgICB2ZXJzaW9uVmFsdWUgPSB2YWx1ZTsKLQotICAgICAgICAgICAgLy8gbj0idmVyc2lvbiIgdj08dGFnbGliIHZlcnNpb24+IGluIGJhc2VMaWJyYXJ5Ci0gICAgICAgICAgICB2YWx1ZURPTSA9IG5ldyBYcHAzRG9tKCJ2YWx1ZSIpOwotICAgICAgICAgICAgdmFsdWVET00uc2V0QXR0cmlidXRlKCJuIiwgbmFtZSk7Ci0gICAgICAgICAgICB2YWx1ZURPTS5zZXRBdHRyaWJ1dGUoInYiLCB2YWx1ZSk7Ci0gICAgICAgICAgICBoYXNoQmFzZURPTS5hZGRDaGlsZCh2YWx1ZURPTSk7Ci0KLSAgICAgICAgICAgIC8vIER1cGxpY2F0ZSB0aGUgInZlcnNpb24iIDx2YWx1ZS4uLgotICAgICAgICAgICAgLy8gb3V0c2lkZSBvZiB0aGUgYmFzZUxpYnJhcnkKLSAgICAgICAgICAgIC8vIG49InZlcnNpb24iIHY9PHRhZ2xpYiB2ZXJzaW9uPiBpbiBwYXJlbnQgaGFzaAotICAgICAgICAgICAgdmFsdWVET00gPSBuZXcgWHBwM0RvbSgidmFsdWUiKTsKLSAgICAgICAgICAgIHZhbHVlRE9NLnNldEF0dHJpYnV0ZSgibiIsIHZlcnNpb25OYW1lKTsKLSAgICAgICAgICAgIHZhbHVlRE9NLnNldEF0dHJpYnV0ZSgidiIsIHZlcnNpb25WYWx1ZSk7Ci0gICAgICAgICAgICBoYXNoRE9NLmFkZENoaWxkKHZhbHVlRE9NKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmICgidGxkIi5lcXVhbHMobmFtZSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIC8vIERpZCBub3Qgd2FudCB0byBoYXZlIGEgVVJMIGluIHRoZSBwb20gZmlsZS4KLSAgICAgICAgICAgICAgLy8gSSBqdXN0IHdhbnRlZCB0aGUgdXNlciB0byBzcGVjaWZ5IHRoZSBuYW1lCi0gICAgICAgICAgICAgIC8vIG9mIHRoZSB0bGQgZmlsZS4gIFNvIHdlIGZpeCBpdCBmb3IgSkRldgotICAgICAgICAgICAgICAvLyBoZXJlLgotICAgICAgICAgICAgICBuYW1lICs9ICJVUkwiOwotICAgICAgICAgICAgICB2YWx1ZSA9IHRhZ0xpYkRpcmVjdG9yeSArICIvIiArIHZhbHVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdmFsdWVET00gPSBuZXcgWHBwM0RvbSgidmFsdWUiKTsKLSAgICAgICAgICAgIHZhbHVlRE9NLnNldEF0dHJpYnV0ZSgibiIsIG5hbWUpOwotICAgICAgICAgICAgdmFsdWVET00uc2V0QXR0cmlidXRlKCJ2IiwgdmFsdWUpOwotICAgICAgICAgICAgaGFzaERPTS5hZGRDaGlsZCh2YWx1ZURPTSk7Ci0gICAgICAgICAgfQotICAgICAgICB9IC8vZW5kZm9yIHByb2Nlc3NpbmcgZWFjaCBwcm9wZXJ0eQotCi0gICAgICAgIC8vIFdlIGFyZSBkb25lIHdpdGggdGhpcyBkaXNUYWdMaWIKLSAgICAgICAgLy8gQWRkIGl0IHRvIHRoZSB0YXJnZXRMaWJzRE9NCi0gICAgICAgIGlmIChoYXNoRE9NICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICB0YXJnZXRMaWJzRE9NLmFkZENoaWxkKGhhc2hET00pOwotICAgICAgICB9Ci0gICAgICB9IC8vIGVuZGZvciBwcm9jZXNzaW5nIGVhY2ggZGlzdHJpYnV0ZWQgdGFnIGxpYgotICAgIH0gLy9lbmRpZgotICAgIGVsc2UKLSAgICB7Ci0gICAgICAvLyBVc2UgRGVmYXVsdCB0YWcgbGlicmFyeSBjb25maWd1cmF0aW9uLiAgU2VlIGNvbW1lbnQgYmVmb3JlCi0gICAgICAvLyByZXBsYWNlVGFnTGlicmFyaWVzLgotICAgICAgcmVwbGFjZURlZmF1bHRUYWdMaWJyYXJpZXMocHJvamVjdERPTSwgdGFyZ2V0TGlic0RPTSk7Ci0gICAgfQotCi0gICAgcmVwbGFjZUxvY2FsVGFnTGlicmFyaWVzKHRhcmdldExpYnNET00pOwotCi0gICAgLy8gRmlyc3QsIGFkZCBKU1AgUnVudGltZSBkZXBlbmRlbmN5IGlmIHNyYy9tYWluL3dlYmFwcCBleGlzdHMKLSAgICAvLyBUT0RPOiB1c2UgYSBiZXR0ZXIgbWVyZ2UgYWxnb3JpdGhtCi0gICAgcmVtb3ZlQ2hpbGRyZW4odGFnTGlic0RPTSk7Ci0KLSAgICAvLyBtYWtlIHN1cmUgdG8gcGFzcyBCb29sZWFuLkZBTFNFIHRvIGFsbG93Ci0gICAgLy8gbXVsdGlwbGUgY2hpbGQgZWxlbWVudHMgd2l0aCB0aGUgc2FtZSBuYW1lCi0gICAgWHBwM0RvbS5tZXJnZVhwcDNEb20odGFnTGlic0RPTSwgdGFyZ2V0TGlic0RPTSwgQm9vbGVhbi5GQUxTRSk7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgcmVwbGFjZURlZmF1bHRUYWdMaWJyYXJpZXMoWHBwM0RvbSBwcm9qZWN0RE9NLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWHBwM0RvbSB0YXJnZXRMaWJzRE9NKQotICAgIHRocm93cyBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uCi0gIHsKLSAgICAvLyBCZWdpbiBKU0YgSFRNTCBUYWcgbGliCi0gICAgWHBwM0RvbSBoYXNoRE9NICAgICA9IG5ldyBYcHAzRG9tKCJoYXNoIik7Ci0gICAgWHBwM0RvbSBoYXNoQmFzZURPTSA9IG5ldyBYcHAzRG9tKCJoYXNoIik7Ci0gICAgWHBwM0RvbSB2YWx1ZURPTSAgICA9IG51bGw7Ci0KLSAgICBoYXNoQmFzZURPTS5zZXRBdHRyaWJ1dGUoIm4iLCAiYmFzZUxpYnJhcnkiKTsKLQotICAgIC8vIEFkZCBiYXNlTGlicmFyeSBoYXNoIHRvIHBhcmVudCBoYXNoCi0gICAgaGFzaERPTS5hZGRDaGlsZChoYXNoQmFzZURPTSk7Ci0KLSAgICAvLyBDcmVhdGUgcGFyZW50IGhhc2ggZm9yIGVhY2ggdGFnbGliCi0gICAgLy8gICAgICAgIGhhc2hET00gPSBuZXcgWHBwM0RvbSgiaGFzaCIpOwotCi0gICAgLy8gYmFzZUxpYnJhcnkgImhhc2giIGZvciBlYWNoIHRhZ2xpYgotICAgIC8vIFhwcDNEb20gaGFzaEJhc2VET00gPSBuZXcgWHBwM0RvbSgiaGFzaCIpOwotICAgIC8vICAgICAgICBoYXNoQmFzZURPTS5zZXRBdHRyaWJ1dGUoIm4iLCAiYmFzZUxpYnJhcnkiKTsKLQotICAgIC8vIG49Im5hbWUsIHY9PG5hbWUgb2YgdGFnbGliPiBpbiBiYXNlTGlicmFyeQotICAgIHZhbHVlRE9NID0gbmV3IFhwcDNEb20oInZhbHVlIik7Ci0gICAgdmFsdWVET00uc2V0QXR0cmlidXRlKCJuIiwgIm5hbWUiKTsKLSAgICB2YWx1ZURPTS5zZXRBdHRyaWJ1dGUoInYiLCAiSlNGIEhUTUwiKTsKLSAgICBoYXNoQmFzZURPTS5hZGRDaGlsZCh2YWx1ZURPTSk7Ci0KLSAgICAvLyBEdXBsaWNhdGUgdGhlICJuYW1lIiAgPHZhbHVlLi4uCi0gICAgLy8gb3V0c2lkZSBvZiB0aGUgYmFzZUxpYnJhcnkKLSAgICAvLyBuPSJuYW1lLCB2PTxuYW1lIG9mIHRhZ2xpYj4gaW4gcGFyZW50IGhhc2gKLSAgICB2YWx1ZURPTSA9IG5ldyBYcHAzRG9tKCJ2YWx1ZSIpOwotICAgIHZhbHVlRE9NLnNldEF0dHJpYnV0ZSgibiIsICJuYW1lIik7Ci0gICAgdmFsdWVET00uc2V0QXR0cmlidXRlKCJ2IiwgIkpTRiBIVE1MIik7Ci0gICAgaGFzaERPTS5hZGRDaGlsZCh2YWx1ZURPTSk7Ci0KLSAgICAvLyBuPSJ2ZXJzaW9uIiB2PTx0YWdsaWIgdmVyc2lvbj4gaW4gYmFzZUxpYnJhcnkKLSAgICB2YWx1ZURPTSA9IG5ldyBYcHAzRG9tKCJ2YWx1ZSIpOwotICAgIHZhbHVlRE9NLnNldEF0dHJpYnV0ZSgibiIsICJ2ZXJzaW9uIik7Ci0gICAgdmFsdWVET00uc2V0QXR0cmlidXRlKCJ2IiwgIjEuMiIpOwotICAgIGhhc2hCYXNlRE9NLmFkZENoaWxkKHZhbHVlRE9NKTsKLQotICAgIC8vIER1cGxpY2F0ZSB0aGUgInZlcnNpb24iIDx2YWx1ZS4uLgotICAgIC8vIG91dHNpZGUgb2YgdGhlIGJhc2VMaWJyYXJ5Ci0gICAgLy8gbj0ibmFtZSwgdj08bmFtZSBvZiB0YWdsaWI+IGluIHBhcmVudCBoYXNoCi0gICAgdmFsdWVET00gPSBuZXcgWHBwM0RvbSgidmFsdWUiKTsKLSAgICB2YWx1ZURPTS5zZXRBdHRyaWJ1dGUoIm4iLCAidmVyc2lvbiIpOwotICAgIHZhbHVlRE9NLnNldEF0dHJpYnV0ZSgidiIsICIxLjIiKTsKLSAgICBoYXNoRE9NLmFkZENoaWxkKHZhbHVlRE9NKTsKLQotICAgIHZhbHVlRE9NID0gbmV3IFhwcDNEb20oInZhbHVlIik7Ci0gICAgdmFsdWVET00uc2V0QXR0cmlidXRlKCJuIiwgImpzcFZlcnNpb24iKTsKLSAgICB2YWx1ZURPTS5zZXRBdHRyaWJ1dGUoInYiLCAiMi4xIik7Ci0gICAgaGFzaERPTS5hZGRDaGlsZCh2YWx1ZURPTSk7Ci0KLSAgICB2YWx1ZURPTSA9IG5ldyBYcHAzRG9tKCJ2YWx1ZSIpOwotICAgIHZhbHVlRE9NLnNldEF0dHJpYnV0ZSgibiIsICJ0bGRVUkwiKTsKLSAgICB2YWx1ZURPTS5zZXRBdHRyaWJ1dGUoInYiLCB0YWdMaWJEaXJlY3RvcnkgKyAiL2h0bWxfYmFzaWMudGxkIik7Ci0gICAgaGFzaERPTS5hZGRDaGlsZCh2YWx1ZURPTSk7Ci0KLSAgICB2YWx1ZURPTSA9IG5ldyBYcHAzRG9tKCJ2YWx1ZSIpOwotICAgIHZhbHVlRE9NLnNldEF0dHJpYnV0ZSgibiIsICJVUkkiKTsKLSAgICB2YWx1ZURPTS5zZXRBdHRyaWJ1dGUoInYiLCAiaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvaHRtbCIpOwotICAgIGhhc2hET00uYWRkQ2hpbGQodmFsdWVET00pOwotCi0gICAgLy8gV2UgYXJlIGRvbmUgd2l0aCB0aGlzIGRpc1RhZ0xpYgotICAgIC8vIEFkZCBpdCB0byB0aGUgdGFyZ2V0TGlic0RPTQotICAgIGlmIChoYXNoRE9NICE9IG51bGwpCi0gICAgewotICAgICAgdGFyZ2V0TGlic0RPTS5hZGRDaGlsZChoYXNoRE9NKTsKLSAgICB9Ci0KLSAgICAvLyBCZWdpbiBKU0YgQ29yZSBUYWdsaWIKLSAgICBoYXNoRE9NICAgICA9IG5ldyBYcHAzRG9tKCJoYXNoIik7Ci0gICAgaGFzaEJhc2VET00gPSBuZXcgWHBwM0RvbSgiaGFzaCIpOwotCi0gICAgaGFzaEJhc2VET00uc2V0QXR0cmlidXRlKCJuIiwgImJhc2VMaWJyYXJ5Iik7Ci0KLSAgICAvLyBBZGQgYmFzZUxpYnJhcnkgaGFzaCB0byBwYXJlbnQgaGFzaAotICAgIGhhc2hET00uYWRkQ2hpbGQoaGFzaEJhc2VET00pOwotCi0gICAgLy8gbj0ibmFtZSwgdj08bmFtZSBvZiB0YWdsaWI+IGluIGJhc2VMaWJyYXJ5Ci0gICAgdmFsdWVET00gPSBuZXcgWHBwM0RvbSgidmFsdWUiKTsKLSAgICB2YWx1ZURPTS5zZXRBdHRyaWJ1dGUoIm4iLCAibmFtZSIpOwotICAgIHZhbHVlRE9NLnNldEF0dHJpYnV0ZSgidiIsICJKU0YgQ29yZSIpOwotICAgIGhhc2hCYXNlRE9NLmFkZENoaWxkKHZhbHVlRE9NKTsKLQotICAgIC8vIER1cGxpY2F0ZSB0aGUgIm5hbWUiICA8dmFsdWUuLi4KLSAgICAvLyBvdXRzaWRlIG9mIHRoZSBiYXNlTGlicmFyeQotICAgIC8vIG49Im5hbWUsIHY9PG5hbWUgb2YgdGFnbGliPiBpbiBwYXJlbnQgaGFzaAotICAgIHZhbHVlRE9NID0gbmV3IFhwcDNEb20oInZhbHVlIik7Ci0gICAgdmFsdWVET00uc2V0QXR0cmlidXRlKCJuIiwgIm5hbWUiKTsKLSAgICB2YWx1ZURPTS5zZXRBdHRyaWJ1dGUoInYiLCAiSlNGIENvcmUiKTsKLSAgICBoYXNoRE9NLmFkZENoaWxkKHZhbHVlRE9NKTsKLQotICAgIC8vIG49InZlcnNpb24iIHY9PHRhZ2xpYiB2ZXJzaW9uPiBpbiBiYXNlTGlicmFyeQotICAgIHZhbHVlRE9NID0gbmV3IFhwcDNEb20oInZhbHVlIik7Ci0gICAgdmFsdWVET00uc2V0QXR0cmlidXRlKCJuIiwgInZlcnNpb24iKTsKLSAgICB2YWx1ZURPTS5zZXRBdHRyaWJ1dGUoInYiLCAiMS4yIik7Ci0gICAgaGFzaEJhc2VET00uYWRkQ2hpbGQodmFsdWVET00pOwotCi0gICAgLy8gRHVwbGljYXRlIHRoZSAidmVyc2lvbiIgPHZhbHVlLi4uCi0gICAgLy8gb3V0c2lkZSBvZiB0aGUgYmFzZUxpYnJhcnkKLSAgICAvLyBuPSJuYW1lLCB2PTxuYW1lIG9mIHRhZ2xpYj4gaW4gcGFyZW50IGhhc2gKLSAgICB2YWx1ZURPTSA9IG5ldyBYcHAzRG9tKCJ2YWx1ZSIpOwotICAgIHZhbHVlRE9NLnNldEF0dHJpYnV0ZSgibiIsICJ2ZXJzaW9uIik7Ci0gICAgdmFsdWVET00uc2V0QXR0cmlidXRlKCJ2IiwgIjEuMiIpOwotICAgIGhhc2hET00uYWRkQ2hpbGQodmFsdWVET00pOwotCi0gICAgdmFsdWVET00gPSBuZXcgWHBwM0RvbSgidmFsdWUiKTsKLSAgICB2YWx1ZURPTS5zZXRBdHRyaWJ1dGUoIm4iLCAianNwVmVyc2lvbiIpOwotICAgIHZhbHVlRE9NLnNldEF0dHJpYnV0ZSgidiIsICIyLjEiKTsKLSAgICBoYXNoRE9NLmFkZENoaWxkKHZhbHVlRE9NKTsKLQotICAgIHZhbHVlRE9NID0gbmV3IFhwcDNEb20oInZhbHVlIik7Ci0gICAgdmFsdWVET00uc2V0QXR0cmlidXRlKCJuIiwgInRsZFVSTCIpOwotICAgIHZhbHVlRE9NLnNldEF0dHJpYnV0ZSgidiIsIHRhZ0xpYkRpcmVjdG9yeSArICIvanNmX2NvcmUudGxkIik7Ci0gICAgaGFzaERPTS5hZGRDaGlsZCh2YWx1ZURPTSk7Ci0KLSAgICB2YWx1ZURPTSA9IG5ldyBYcHAzRG9tKCJ2YWx1ZSIpOwotICAgIHZhbHVlRE9NLnNldEF0dHJpYnV0ZSgibiIsICJVUkkiKTsKLSAgICB2YWx1ZURPTS5zZXRBdHRyaWJ1dGUoInYiLCAiaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvY29yZSIpOwotICAgIGhhc2hET00uYWRkQ2hpbGQodmFsdWVET00pOwotCi0gICAgLy8gV2UgYXJlIGRvbmUgd2l0aCB0aGlzIGRpc1RhZ0xpYgotICAgIC8vIEFkZCBpdCB0byB0aGUgdGFyZ2V0TGlic0RPTQotICAgIGlmIChoYXNoRE9NICE9IG51bGwpCi0gICAgewotICAgICAgdGFyZ2V0TGlic0RPTS5hZGRDaGlsZChoYXNoRE9NKTsKLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgcmVwbGFjZVBhcmFtZXRlcnMoU3RyaW5nIHByb2plY3ROYW1lLCBYcHAzRG9tIHByb2plY3RET00pCi0gICAgdGhyb3dzIFhtbFB1bGxQYXJzZXJFeGNlcHRpb24KLSAgewotICAgIGlmICgoX3JlbGVhc2VNYWpvciA+PSAxMSkgJiYgKHByb2plY3ROYW1lICE9IG51bGwpKQotICAgIHsKLSAgICAgIHJlcGxhY2VDb21waWxlcihwcm9qZWN0RE9NKTsKLSAgICAgIHJlcGxhY2VNYWtlUHJvamVjdEFuZFJ1blRhcmdldChwcm9qZWN0RE9NKTsKLSAgICB9Ci0gIH0KLSAgcHJpdmF0ZSB2b2lkIHJlcGxhY2VDb21waWxlcihYcHAzRG9tIHByb2plY3RET00pCi0gICAgdGhyb3dzIFhtbFB1bGxQYXJzZXJFeGNlcHRpb24KLSAgewotICAgIC8vIC9qcHI6cHJvamVjdAotICAgIC8vIDxoYXNoIG49Im9yYWNsZS5qZGV2ZWxvcGVyLmNvbXBpbGVyLk9qY0NvbmZpZ3VyYXRpb24iPgotICAgIC8vICAgPHZhbHVlIG49ImFzc2VydGlvbnNFbmFibGVkIiB2PSJ0cnVlIi8+Ci0gICAgLy8gICA8dmFsdWUgbj0iY29tcGlsZXIubmFtZSIgdj0iT2pjIi8+Ci0gICAgLy8gICA8bGlzdCBuPSJjb3B5UmVzIj4KLSAgICAvLyAgICAgIDxzdHJpbmcgdj0iLmphdmEiLz4KLSAgICBYcHAzRG9tIGNvbmZpZ0RPTSA9Ci0gICAgICBmaW5kTmFtZWRDaGlsZChwcm9qZWN0RE9NLCAiaGFzaCIsCi0gICAgICAgICAgICAgICAgICAgICAib3JhY2xlLmpkZXZlbG9wZXIuY29tcGlsZXIuT2pjQ29uZmlndXJhdGlvbiIpOwotICAgIFhwcDNEb20gY29tcGlsZXJET00gPSBmaW5kTmFtZWRDaGlsZChjb25maWdET00sICJ2YWx1ZSIsICJjb21waWxlci5uYW1lIik7Ci0gICAgU3RyaW5nIGNvbXBpbGVyVmFsdWUgPSAiT2pjIjsKLQotICAgIGlmICggICAoY29tcGlsZXIgIT0gbnVsbCkKLSAgICAgICAgJiYgIkphdmFjIi5lcXVhbHNJZ25vcmVDYXNlKGNvbXBpbGVyKQotICAgICAgICkKLSAgICB7Ci0gICAgICBjb21waWxlclZhbHVlID0gIkphdmFjIjsKLSAgICB9Ci0gICAgY29tcGlsZXJET00uc2V0QXR0cmlidXRlKCJ2IiwgY29tcGlsZXJWYWx1ZSk7Ci0KLSAgICByZXR1cm47Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgcmVwbGFjZU1ha2VQcm9qZWN0QW5kUnVuVGFyZ2V0KFhwcDNEb20gcHJvamVjdERPTSkKLSAgICB0aHJvd3MgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbgotICB7Ci0gICAgLy8gL2pwcjpwcm9qZWN0Ci0gICAgLy8gICAvaGFzaFtAbj0ib3JhY2xlLmpkZXZlbG9wZXIucnVubmVyLlJ1bkNvbmZpZ3VyYXRpb25zIl0KLSAgICAvLyAgICAgL2hhc2hbQG49InJ1bkNvbmZpZ3VyYXRpb25EZWZpbml0aW9ucyJdCi0gICAgLy8gICAgICAgL2hhc2hbQG49IkRlZmF1bHQiXQotICAgIC8vICAgICAgICAgL3ZhbHVlW0BuPSJtYWtlUHJvamVjdCIgdj0iZmFsc2UiXQotICAgIC8vICAgICAgICAgL3VybFtAbj0idGFyZ2V0VVJMIiBwYXRoPSJzcmMvbWFpbi93ZWJhcHAvaW5kZXguanNweCJdCi0gICAgWHBwM0RvbSBjb25maWdET00gPQotICAgICAgZmluZE5hbWVkQ2hpbGQocHJvamVjdERPTSwgImhhc2giLAotICAgICAgICAgICAgICAgICAgICAgIm9yYWNsZS5qZGV2ZWxvcGVyLnJ1bm5lci5SdW5Db25maWd1cmF0aW9ucyIpOwotICAgIFhwcDNEb20gZGVmc0RPTSA9Ci0gICAgICBmaW5kTmFtZWRDaGlsZChjb25maWdET00sICJoYXNoIiwgInJ1bkNvbmZpZ3VyYXRpb25EZWZpbml0aW9ucyIpOwotICAgIFhwcDNEb20gZGVmYXVsdERPTSA9IGZpbmROYW1lZENoaWxkKGRlZnNET00sICJoYXNoIiwgIkRlZmF1bHQiKTsKLSAgICBYcHAzRG9tIG1ha2VQcm9qZWN0RG9tID0KLSAgICAgIGZpbmROYW1lZENoaWxkKGRlZmF1bHRET00sICJ2YWx1ZSIsICJjb21waWxlQmVmb3JlUnVuIik7Ci0KLSAgICBpZiAobWFrZVByb2plY3QpCi0gICAgewotICAgICAgbWFrZVByb2plY3REb20uc2V0QXR0cmlidXRlKCJ2IiwgInRydWUiKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIG1ha2VQcm9qZWN0RG9tLnNldEF0dHJpYnV0ZSgidiIsICJmYWxzZSIpOwotICAgIH0KLQotICAgIGlmICgocnVuVGFyZ2V0ICE9IG51bGwpICYmICEiIi5lcXVhbHMocnVuVGFyZ2V0KSkKLSAgICB7Ci0gICAgICAvLyBDb252ZXJ0IGZpbGUgc2VwYXJhdG9yIGNoYXJzIHRvIGdlbmVyaWMKLSAgICAgIFN0cmluZyB0YXJnZXRVUkwgPSAiIjsKLSAgICAgIGlmIChGaWxlLnNlcGFyYXRvckNoYXIgPT0gJy8nKQotICAgICAgewotICAgICAgICB0YXJnZXRVUkwgPSBydW5UYXJnZXQucmVwbGFjZSgnXFwnLCAnLycpOyAvLyBVbml4Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHRhcmdldFVSTCA9IHJ1blRhcmdldC5yZXBsYWNlKCcvJywgJ1xcJyk7IC8vIFdpbmRvd3MKLSAgICAgIH0KLQotICAgICAgWHBwM0RvbSB0YXJnZXRET00gPSBuZXcgWHBwM0RvbSgidXJsIik7Ci0gICAgICB0YXJnZXRET00uc2V0QXR0cmlidXRlKCJwYXRoIiwgdGFyZ2V0VVJMKTsKLSAgICAgIHRhcmdldERPTS5zZXRBdHRyaWJ1dGUoIm4iLCAidGFyZ2V0VVJMIik7Ci0gICAgICBkZWZhdWx0RE9NLmFkZENoaWxkKHRhcmdldERPTSk7Ci0gICAgfQotCi0gICAgcmV0dXJuOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIGNvcHlUYWdMaWJyYXJpZXMoRmlsZSBwcm9qZWN0RGlyLCBMaXN0IGRlcGVuZGVuY2llcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdCBhcnRpZmFjdHMpCi0gICAgdGhyb3dzIElPRXhjZXB0aW9uCi0gIHsKLSAgICBGaWxlIHRhcmdldERpciA9IG5ldyBGaWxlKHByb2plY3REaXIsICJzcmMvbWFpbi93ZWJhcHAvV0VCLUlORiIpOwotCi0gICAgZm9yIChJdGVyYXRvciBpID0gZGVwZW5kZW5jaWVzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgewotICAgICAgRGVwZW5kZW5jeSBkZXBlbmRlbmN5ID0gKERlcGVuZGVuY3kpIGkubmV4dCgpOwotICAgICAgTWF2ZW5Qcm9qZWN0IGRlcGVuZGVudFByb2plY3QgPQotICAgICAgICBmaW5kRGVwZW5kZW50UHJvamVjdChkZXBlbmRlbmN5LmdldE1hbmFnZW1lbnRLZXkoKSk7Ci0gICAgICBpZiAoZGVwZW5kZW50UHJvamVjdCAhPSBudWxsKQotICAgICAgewotICAgICAgICBMaXN0IHJlc291cmNlUm9vdHMgPSBkZXBlbmRlbnRQcm9qZWN0LmdldFJlc291cmNlcygpOwotICAgICAgICBmb3IgKEl0ZXJhdG9yIGogPSByZXNvdXJjZVJvb3RzLml0ZXJhdG9yKCk7IGouaGFzTmV4dCgpOyApCi0gICAgICAgIHsKLSAgICAgICAgICBSZXNvdXJjZSByZXNvdXJjZSA9IChSZXNvdXJjZSkgai5uZXh0KCk7Ci0gICAgICAgICAgU3RyaW5nIHJlc291cmNlUm9vdCA9IHJlc291cmNlLmdldERpcmVjdG9yeSgpOwotICAgICAgICAgIEZpbGUgcmVzb3VyY2VEaXJlY3RvcnkgPSBuZXcgRmlsZShyZXNvdXJjZVJvb3QpOwotICAgICAgICAgIGlmIChyZXNvdXJjZURpcmVjdG9yeS5leGlzdHMoKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBEaXJlY3RvcnlTY2FubmVyIHNjYW5uZXIgPSBuZXcgRGlyZWN0b3J5U2Nhbm5lcigpOwotICAgICAgICAgICAgc2Nhbm5lci5zZXRCYXNlZGlyKHJlc291cmNlUm9vdCk7Ci0gICAgICAgICAgICBzY2FubmVyLmFkZERlZmF1bHRFeGNsdWRlcygpOwotICAgICAgICAgICAgc2Nhbm5lci5zZXRJbmNsdWRlcyhuZXcgU3RyaW5nW10KLSAgICAgICAgICAgICAgICB7ICJNRVRBLUlORi8qLnRsZCIgfSk7Ci0gICAgICAgICAgICBzY2FubmVyLnNjYW4oKTsKLQotICAgICAgICAgICAgU3RyaW5nW10gdGxkRmlsZXMgPSBzY2FubmVyLmdldEluY2x1ZGVkRmlsZXMoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgdGxkRmlsZXMubGVuZ3RoOyBrKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIEZpbGUgc291cmNlRmlsZSA9IG5ldyBGaWxlKHJlc291cmNlRGlyZWN0b3J5LCB0bGRGaWxlc1trXSk7Ci0gICAgICAgICAgICAgIEZpbGUgdGFyZ2V0RmlsZSA9IG5ldyBGaWxlKHRhcmdldERpciwgc291cmNlRmlsZS5nZXROYW1lKCkpOwotCi0gICAgICAgICAgICAgIGlmICh0YXJnZXRGaWxlLmV4aXN0cygpKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGFyZ2V0RmlsZS5kZWxldGUoKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBGaWxlVXRpbHMuY29weUZpbGUoc291cmNlRmlsZSwgdGFyZ2V0RmlsZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0KLSAgICBNYXAgc291cmNlTWFwID0gbmV3IFRyZWVNYXAoKTsKLQotICAgIGZvciAoSXRlcmF0b3IgaSA9IGFydGlmYWN0cy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgIHsKLSAgICAgIEFydGlmYWN0IGFydGlmYWN0ID0gKEFydGlmYWN0KSBpLm5leHQoKTsKLSAgICAgIGlmICghaXNEZXBlbmRlbnRQcm9qZWN0KGFydGlmYWN0LmdldERlcGVuZGVuY3lDb25mbGljdElkKCkpICYmCi0gICAgICAgICAgImphciIuZXF1YWxzKGFydGlmYWN0LmdldFR5cGUoKSkpCi0gICAgICB7Ci0gICAgICAgIEZpbGUgZmlsZSA9IGFydGlmYWN0LmdldEZpbGUoKTsKLSAgICAgICAgSmFyRmlsZSBqYXJGaWxlID0gbmV3IEphckZpbGUoZmlsZSk7Ci0gICAgICAgIEVudW1lcmF0aW9uIGphckVudHJpZXMgPSBqYXJGaWxlLmVudHJpZXMoKTsKLSAgICAgICAgd2hpbGUgKGphckVudHJpZXMuaGFzTW9yZUVsZW1lbnRzKCkpCi0gICAgICAgIHsKLSAgICAgICAgICBKYXJFbnRyeSBqYXJFbnRyeSA9IChKYXJFbnRyeSkgamFyRW50cmllcy5uZXh0RWxlbWVudCgpOwotICAgICAgICAgIFN0cmluZyBuYW1lID0gamFyRW50cnkuZ2V0TmFtZSgpOwotICAgICAgICAgIGlmIChuYW1lLnN0YXJ0c1dpdGgoIk1FVEEtSU5GLyIpICYmIG5hbWUuZW5kc1dpdGgoIi50bGQiKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBMaXN0IHRhZ2xpYnMgPSAoTGlzdCkgc291cmNlTWFwLmdldChuYW1lKTsKLSAgICAgICAgICAgIGlmICh0YWdsaWJzID09IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHRhZ2xpYnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICAgIHNvdXJjZU1hcC5wdXQobmFtZSwgdGFnbGlicyk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHRhZ2xpYnMuYWRkKGZpbGUpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIGZvciAoSXRlcmF0b3IgaSA9IHNvdXJjZU1hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgewotICAgICAgTWFwLkVudHJ5IGUgPSAoTWFwLkVudHJ5KSBpLm5leHQoKTsKLSAgICAgIExpc3QgdGFnbGlicyA9IChMaXN0KSBlLmdldFZhbHVlKCk7Ci0gICAgICBTdHJpbmcgbmFtZSA9IChTdHJpbmcpIGUuZ2V0S2V5KCk7Ci0KLSAgICAgIGZvciAoSXRlcmF0b3IgdGkgPSB0YWdsaWJzLml0ZXJhdG9yKCk7IHRpLmhhc05leHQoKTsgKQotICAgICAgewotICAgICAgICBGaWxlIGZpbGUgPSAoRmlsZSkgdGkubmV4dCgpOwotICAgICAgICBGaWxlIHNvdXJjZUZpbGUgPSBuZXcgRmlsZShuYW1lKTsKLSAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZmYgPSBuZXcgU3RyaW5nQnVmZmVyKHNvdXJjZUZpbGUuZ2V0TmFtZSgpKTsKLSAgICAgICAgaWYgKHRhZ2xpYnMuc2l6ZSgpID4gMSkKLSAgICAgICAgewotICAgICAgICAgIFN0cmluZyBqYXJOYW1lID0KLSAgICAgICAgICAgIGZpbGUuZ2V0TmFtZSgpLnN1YnN0cmluZygwLCBmaWxlLmdldE5hbWUoKS5sZW5ndGgoKSAtCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi5qYXIiLmxlbmd0aCgpKTsKLSAgICAgICAgICBidWZmLmluc2VydChidWZmLmxlbmd0aCgpIC0gIi50bGQiLmxlbmd0aCgpLCAiLSIgKyBqYXJOYW1lKTsKLSAgICAgICAgfQotCi0gICAgICAgIFVSTCBqYXJVUkwgPSBmaWxlLnRvVVJMKCk7Ci0gICAgICAgIFVSTCBzb3VyY2VVUkwgPQotICAgICAgICAgIG5ldyBVUkwoImphcjoiICsgamFyVVJMLnRvRXh0ZXJuYWxGb3JtKCkgKyAiIS8iICsgbmFtZSk7Ci0gICAgICAgIEZpbGUgdGFyZ2V0RmlsZSA9IG5ldyBGaWxlKHRhcmdldERpciwgYnVmZi50b1N0cmluZygpKTsKLSAgICAgICAgaWYgKHRhcmdldEZpbGUuZXhpc3RzKCkpCi0gICAgICAgIHsKLSAgICAgICAgICB0YXJnZXRGaWxlLmRlbGV0ZSgpOwotICAgICAgICB9Ci0gICAgICAgIEZpbGVVdGlscy5jb3B5VVJMVG9GaWxlKHNvdXJjZVVSTCwgdGFyZ2V0RmlsZSk7Ci0gICAgICAgIHRhcmdldEZpbGUuc2V0UmVhZE9ubHkoKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgcmVwbGFjZU91dHB1dERpcmVjdG9yeShGaWxlIHByb2plY3REaXIsIEZpbGUgb3V0cHV0RGlyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYcHAzRG9tIHByb2plY3RET00pCi0gICAgdGhyb3dzIFhtbFB1bGxQYXJzZXJFeGNlcHRpb24KLSAgewotICAgIC8vIC9qcHI6cHJvamVjdAotICAgIC8vICAgL2hhc2hbQG49Im9yYWNsZS5qZGV2aW1wbC5jb25maWcuSlByb2plY3RQYXRocyJdCi0KLSAgICBYcHAzRG9tIHByb2plY3RQYXRoc0RPTSA9Ci0gICAgICBmaW5kTmFtZWRDaGlsZChwcm9qZWN0RE9NLCAiaGFzaCIsICJvcmFjbGUuamRldmltcGwuY29uZmlnLkpQcm9qZWN0UGF0aHMiKTsKLSAgICBYcHAzRG9tIHNvdXJjZURPTSA9IG5ldyBYcHAzRG9tKCJ1cmwiKTsKLQotICAgIC8vCi0gICAgLy8gPHVybCBAbj0ib3V0cHV0RGlyZWN0b3J5IiBwYXRoPSJbcmVsYXRpdmUtcGF0aC10by1vdXRwdXQtZGlyXSIgLz4KLSAgICAvLwotICAgIHNvdXJjZURPTS5zZXRBdHRyaWJ1dGUoInBhdGgiLCBnZXRSZWxhdGl2ZURpcihwcm9qZWN0RGlyLCBvdXRwdXREaXIpKTsKLSAgICBzb3VyY2VET00uc2V0QXR0cmlidXRlKCJuIiwgIm91dHB1dERpcmVjdG9yeSIpOwotICAgIHByb2plY3RQYXRoc0RPTS5hZGRDaGlsZChzb3VyY2VET00pOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIEpEZXZlbG9wZXIgcHJvamVjdCBmaWxlIGZvciBhIE1hdmVuIFBPTS4KLSAgICoKLSAgICogQHBhcmFtIHByb2plY3QgIHRoZSBNYXZlbiBQT00KLSAgICoKLSAgICogQHJldHVybiAgdGhlIEpEZXZlbG9wZXIgcHJvamVjdCBmaWxlCi0gICAqLwotICBwcml2YXRlIEZpbGUgZ2V0SlByb2plY3RGaWxlKE1hdmVuUHJvamVjdCBwcm9qZWN0KQotICB7Ci0gICAgU3RyaW5nIGpwck5hbWUgPSBwcm9qZWN0LmdldEFydGlmYWN0SWQoKSArICIuanByIjsKLSAgICByZXR1cm4gbmV3IEZpbGUocHJvamVjdC5nZXRCYXNlZGlyKCksIGpwck5hbWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIEpEZXZlbG9wZXIgdGVzdCBwcm9qZWN0IGZpbGUgZm9yIGEgTWF2ZW4gUE9NLgotICAgKgotICAgKiBAcGFyYW0gcHJvamVjdCAgdGhlIE1hdmVuIFBPTQotICAgKgotICAgKiBAcmV0dXJuICB0aGUgSkRldmVsb3BlciB0ZXN0IHByb2plY3QgZmlsZQotICAgKi8KLSAgcHJpdmF0ZSBGaWxlIGdldEpQcm9qZWN0VGVzdEZpbGUoTWF2ZW5Qcm9qZWN0IHByb2plY3QpCi0gIHsKLSAgICBTdHJpbmcganByTmFtZSA9IHByb2plY3QuZ2V0QXJ0aWZhY3RJZCgpICsgIi10ZXN0LmpwciI7Ci0gICAgcmV0dXJuIG5ldyBGaWxlKHByb2plY3QuZ2V0QmFzZWRpcigpLCBqcHJOYW1lKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBKRGV2ZWxvcGVyIHdvcmtzcGFjZSBmaWxlIGZvciBhIE1hdmVuIFBPTS4KLSAgICoKLSAgICogQHBhcmFtIHByb2plY3QgIHRoZSBNYXZlbiBQT00KLSAgICoKLSAgICogQHJldHVybiAgdGhlIEpEZXZlbG9wZXIgd29ya3NwYWNlIGZpbGUKLSAgICovCi0gIHByaXZhdGUgRmlsZSBnZXRKV29ya3NwYWNlRmlsZShNYXZlblByb2plY3QgcHJvamVjdCkKLSAgewotICAgIFN0cmluZyBqd3NOYW1lID0gcHJvamVjdC5nZXRBcnRpZmFjdElkKCkgKyAiLmp3cyI7Ci0gICAgcmV0dXJuIG5ldyBGaWxlKHByb2plY3QuZ2V0QmFzZWRpcigpLCBqd3NOYW1lKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZWFkcyBhIEpEZXZlbG9wZXIgd29ya3NwYWNlIGZpbGUgaW50byBET00uCi0gICAqCi0gICAqIEBwYXJhbSB3b3Jrc3BhY2VGaWxlICB0aGUgSkRldmVsb3BlciB3b3Jrc3BhY2UgZmlsZQotICAgKgotICAgKiBAcmV0dXJuIHRoZSBwYXJzZWQgRE9NCi0gICAqLwotICBwcml2YXRlIFhwcDNEb20gcmVhZFdvcmtzcGFjZURPTShGaWxlIHdvcmtzcGFjZUZpbGUpCi0gICAgdGhyb3dzIElPRXhjZXB0aW9uLCBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uCi0gIHsKLSAgICByZXR1cm4gcmVhZERPTSh3b3Jrc3BhY2VGaWxlLCByZWxlYXNlICsgIi93b3Jrc3BhY2UueG1sIik7Ci0gIH0KLQotICAvKioKLSAgICogUmVhZHMgYSBKRGV2ZWxvcGVyIHByb2plY3QgZmlsZSBpbnRvIERPTS4KLSAgICoKLSAgICogQHBhcmFtIHByb2plY3RGaWxlICB0aGUgSkRldmVsb3BlciBwcm9qZWN0IGZpbGUKLSAgICoKLSAgICogQHJldHVybiB0aGUgcGFyc2VkIERPTQotICAgKi8KLSAgcHJpdmF0ZSBYcHAzRG9tIHJlYWRQcm9qZWN0RE9NKEZpbGUgcHJvamVjdEZpbGUpCi0gICAgdGhyb3dzIElPRXhjZXB0aW9uLCBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uCi0gIHsKLSAgICByZXR1cm4gcmVhZERPTShwcm9qZWN0RmlsZSwgcmVsZWFzZSArICIvcHJvamVjdC54bWwiKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZWFkcyBhIHNvdXJjZSBmaWxlIGludG8gRE9NLCBkZWZhdWx0aW5nIHRvIGEgcGFja2FnZWQgcmVzb3VyY2UgaWYKLSAgICogdGhlIHNvdXJjZSBmaWxlIGRvZXMgbm90IGFscmVhZHkgZXhpc3QuCi0gICAqCi0gICAqIEBwYXJhbSBzb3VyY2VGaWxlICAgIHRoZSBzb3VyY2UgZmlsZSB0byBiZSBwYXJzZWQKLSAgICogQHBhcmFtIHJlc291cmNlUGF0aCAgdGhlIGRlZmF1bHQgcGFja2FnZWQgcmVzb3VyY2UKLSAgICoKLSAgICogQHJldHVybiB0aGUgcGFyc2VkIERPTQotICAgKi8KLSAgcHJpdmF0ZSBYcHAzRG9tIHJlYWRET00oRmlsZSBzb3VyY2VGaWxlLCBTdHJpbmcgcmVzb3VyY2VQYXRoKQotICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbgotICB7Ci0gICAgUmVhZGVyIHJlYWRlciA9IG51bGw7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgaWYgKCFmb3JjZSAmJiBzb3VyY2VGaWxlLmV4aXN0cygpKQotICAgICAgewotICAgICAgICAvLyBwYXJzZSB0aGUgZXhpc3Rpbmcgc291cmNlIGZpbGUKLSAgICAgICAgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoc291cmNlRmlsZSk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIC8vIHBhcnNlIHRoZSBkZWZhdWx0IHJlc291cmNlIGZpbGUKLSAgICAgICAgVVJMIHJlc291cmNlID0gZ2V0Q2xhc3MoKS5nZXRSZXNvdXJjZShyZXNvdXJjZVBhdGgpOwotCi0gICAgICAgIC8vIGVuc3VyZSB0aGF0IHRoZSByZXNvdXJjZVBhdGggY2FuIGJlIGZvdW5kCi0gICAgICAgIGlmIChyZXNvdXJjZSA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJVbmFibGUgdG8gcmVhZCByZXNvdXJjZTogIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlUGF0aCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZWFkZXIgPSBuZXcgSW5wdXRTdHJlYW1SZWFkZXIocmVzb3VyY2Uub3BlblN0cmVhbSgpKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiBYcHAzRG9tQnVpbGRlci5idWlsZChyZWFkZXIpOwotICAgIH0KLSAgICBmaW5hbGx5Ci0gICAgewotICAgICAgSU9VdGlsLmNsb3NlKHJlYWRlcik7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFdyaXRlcyBhIFhNTCBET00gdG8gdGhlIHRhcmdldCBmaWxlLgotICAgKgotICAgKiBAcGFyYW0gdGFyZ2V0RmlsZSAgdGhlIHRhcmdldCBmaWxlCi0gICAqIEBwYXJhbSBzb3VyY2VET00gICB0aGUgc291cmNlIERPTQotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIHdyaXRlRE9NKEZpbGUgdGFyZ2V0RmlsZSwgWHBwM0RvbSBzb3VyY2VET00pCi0gICAgdGhyb3dzIElPRXhjZXB0aW9uLCBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uCi0gIHsKLSAgICBGaWxlV3JpdGVyIHdyaXRlciA9IG51bGw7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgd3JpdGVyID0gbmV3IEZpbGVXcml0ZXIodGFyZ2V0RmlsZSk7Ci0gICAgICBYcHAzRG9tV3JpdGVyLndyaXRlKHdyaXRlciwgc291cmNlRE9NKTsKLSAgICB9Ci0gICAgZmluYWxseQotICAgIHsKLSAgICAgIElPVXRpbC5jbG9zZSh3cml0ZXIpOwotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgU3RyaW5nIGdldFJlbGF0aXZlRGlyKEZpbGUgc291cmNlLCBGaWxlIHRhcmdldCkKLSAgewotICAgIHJldHVybiBnZXRSZWxhdGl2ZVBhdGgoc291cmNlLCB0YXJnZXQsIHRydWUpOwotICB9Ci0KLSAgcHJpdmF0ZSBTdHJpbmcgZ2V0UmVsYXRpdmVGaWxlKEZpbGUgc291cmNlLCBGaWxlIHRhcmdldCkKLSAgewotICAgIHJldHVybiBnZXRSZWxhdGl2ZVBhdGgoc291cmNlLCB0YXJnZXQsIGZhbHNlKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSByZWxhdGl2ZSBwYXRoIGJldHdlZW4gdHdvIGZpbGVzLgotICAgKgotICAgKiBAcGFyYW0gc291cmNlICB0aGUgc291cmNlIGZpbGUKLSAgICogQHBhcmFtIHRhcmdldCAgdGhlIHRhcmdldCBmaWxlCi0gICAqCi0gICAqIEByZXR1cm4gIHRoZSByZWxhdGl2ZSBwYXRoIGJldHdlZW4gdHdvIGZpbGVzCi0gICAqLwotICBwcml2YXRlIFN0cmluZyBnZXRSZWxhdGl2ZVBhdGgoRmlsZSBzb3VyY2UsIEZpbGUgdGFyZ2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc0RpcmVjdG9yeSkKLSAgewotICAgIFN0cmluZyBzb3VyY2VQYXRoID0gc291cmNlLmdldEFic29sdXRlUGF0aCgpOwotICAgIFN0cmluZyB0YXJnZXRQYXRoID0gdGFyZ2V0LmdldEFic29sdXRlUGF0aCgpOwotCi0gICAgaWYgKHRhcmdldFBhdGguc3RhcnRzV2l0aChzb3VyY2VQYXRoICsgRmlsZS5zZXBhcmF0b3JDaGFyKSkKLSAgICB7Ci0gICAgICBTdHJpbmcgcmVsYXRpdmVQYXRoID0gdGFyZ2V0UGF0aC5zdWJzdHJpbmcoc291cmNlUGF0aC5sZW5ndGgoKSArIDEpOwotICAgICAgcmVsYXRpdmVQYXRoID0gcmVsYXRpdmVQYXRoLnJlcGxhY2UoRmlsZS5zZXBhcmF0b3JDaGFyLCAnLycpOwotICAgICAgaWYgKGlzRGlyZWN0b3J5KQotICAgICAgewotICAgICAgICByZWxhdGl2ZVBhdGggKz0gIi8iOwotICAgICAgfQotICAgICAgcmV0dXJuIHJlbGF0aXZlUGF0aDsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIFN0cmluZ1tdIHNvdXJjZVBhdGhzID0gc291cmNlUGF0aC5zcGxpdCgiXFwiICsgRmlsZS5zZXBhcmF0b3IpOwotICAgICAgU3RyaW5nW10gdGFyZ2V0UGF0aHMgPSB0YXJnZXRQYXRoLnNwbGl0KCJcXCIgKyBGaWxlLnNlcGFyYXRvcik7Ci0KLSAgICAgIC8vIE9uIFdpbmRvd3MsIHRoZSBmaXJzdCBlbGVtZW50IGluIHRoZSBhYnNvbHV0ZSBwYXRoIGlzIGEgZHJpdmUgbGV0dGVyCi0gICAgICBpZiAoU3lzdGVtLmdldFByb3BlcnR5KCJvcy5uYW1lIikuc3RhcnRzV2l0aCgiV2luZG93cyIpKQotICAgICAgewotICAgICAgICAvLyB1cHBlcmNhc2UgdGhlIGRyaXZlIGxldHRlciBiZWNhdXNlIEN5Z3dpbiBzb21ldGltZXMgZGVsaXZlcnMKLSAgICAgICAgLy8gYSBsb3dlcmNhc2UgZHJpdmUgbGV0dGVyCi0gICAgICAgIHNvdXJjZVBhdGhzWzBdID0gc291cmNlUGF0aHNbMF0udG9VcHBlckNhc2UoKTsKLSAgICAgICAgdGFyZ2V0UGF0aHNbMF0gPSB0YXJnZXRQYXRoc1swXS50b1VwcGVyQ2FzZSgpOwotICAgICAgfQotCi0gICAgICBpbnQgc291cmNlUGF0aENvdW50ID0gc291cmNlUGF0aHMubGVuZ3RoOwotICAgICAgaW50IHRhcmdldFBhdGhDb3VudCA9IHRhcmdldFBhdGhzLmxlbmd0aDsKLSAgICAgIGludCBjb21tb25QYXRoQ291bnQgPSAwOwotCi0gICAgICBpbnQgbWluUGF0aENvdW50ID0gTWF0aC5taW4oc291cmNlUGF0aENvdW50LCB0YXJnZXRQYXRoQ291bnQpOwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtaW5QYXRoQ291bnQ7IGkrKykKLSAgICAgIHsKLSAgICAgICAgaWYgKHNvdXJjZVBhdGhzW2ldLmVxdWFscyh0YXJnZXRQYXRoc1tpXSkpCi0gICAgICAgIHsKLSAgICAgICAgICBjb21tb25QYXRoQ291bnQrKzsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBpZiAoY29tbW9uUGF0aENvdW50ID4gMCkKLSAgICAgIHsKLSAgICAgICAgaW50IHNvdXJjZVJlbGF0aXZlUGF0aENvdW50ID0gc291cmNlUGF0aENvdW50IC0gY29tbW9uUGF0aENvdW50OwotICAgICAgICBpbnQgdGFyZ2V0UmVsYXRpdmVQYXRoQ291bnQgPSB0YXJnZXRQYXRoQ291bnQgLSBjb21tb25QYXRoQ291bnQ7Ci0KLSAgICAgICAgaW50IHJlbGF0aXZlUGF0aENvdW50ID0KLSAgICAgICAgICBzb3VyY2VSZWxhdGl2ZVBhdGhDb3VudCArIHRhcmdldFJlbGF0aXZlUGF0aENvdW50OwotICAgICAgICBTdHJpbmdbXSByZWxhdGl2ZVBhdGhzID0gbmV3IFN0cmluZ1tyZWxhdGl2ZVBhdGhDb3VudF07Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzb3VyY2VSZWxhdGl2ZVBhdGhDb3VudDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgcmVsYXRpdmVQYXRoc1tpXSA9ICIuLiI7Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRhcmdldFJlbGF0aXZlUGF0aENvdW50OyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICByZWxhdGl2ZVBhdGhzW3NvdXJjZVJlbGF0aXZlUGF0aENvdW50ICsgaV0gPQotICAgICAgICAgICAgICB0YXJnZXRQYXRoc1tjb21tb25QYXRoQ291bnQgKyBpXTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGpvaW4KLSAgICAgICAgU3RyaW5nQnVmZmVyIHJlbGF0aXZlUGF0aCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZWxhdGl2ZVBhdGhDb3VudDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKGkgPiAwKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJlbGF0aXZlUGF0aC5hcHBlbmQoIi8iKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgcmVsYXRpdmVQYXRoLmFwcGVuZChyZWxhdGl2ZVBhdGhzW2ldKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVsYXRpdmVQYXRoLnRvU3RyaW5nKCk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHJldHVybiB0YXJnZXRQYXRoOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgWHBwM0RvbSBmaW5kTmFtZWRDaGlsZChYcHAzRG9tIHBhcmVudCwgU3RyaW5nIGNoaWxkTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBhdHRyVmFsdWUpCi0gIHsKLSAgICBYcHAzRG9tW10gaGFzaCA9IHBhcmVudC5nZXRDaGlsZHJlbihjaGlsZE5hbWUpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaGFzaC5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBpZiAoYXR0clZhbHVlLmVxdWFscyhoYXNoW2ldLmdldEF0dHJpYnV0ZSgibiIpKSkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIGhhc2hbaV07Ci0gICAgICB9Ci0gICAgfQotCi0gICAgWHBwM0RvbSBjaGlsZCA9IG5ldyBYcHAzRG9tKGNoaWxkTmFtZSk7Ci0gICAgY2hpbGQuc2V0QXR0cmlidXRlKCJuIiwgYXR0clZhbHVlKTsKLSAgICBwYXJlbnQuYWRkQ2hpbGQoY2hpbGQpOwotCi0gICAgcmV0dXJuIGNoaWxkOwotICB9Ci0KLSAgcHJpdmF0ZSBNYXZlblByb2plY3QgZmluZERlcGVuZGVudFByb2plY3QoU3RyaW5nIGRlcGVuZGVuY3lNYW5hZ2VtZW50S2V5KQotICB7Ci0gICAgZm9yIChJdGVyYXRvciBpID0gcmVhY3RvclByb2plY3RzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgewotICAgICAgTWF2ZW5Qcm9qZWN0IHJlYWN0b3JQcm9qZWN0ID0gKE1hdmVuUHJvamVjdCkgaS5uZXh0KCk7Ci0gICAgICBTdHJpbmcgaWRlbnQgPQotICAgICAgICByZWFjdG9yUHJvamVjdC5nZXRBcnRpZmFjdCgpLmdldERlcGVuZGVuY3lDb25mbGljdElkKCk7Ci0gICAgICBpZiAoaWRlbnQuZXF1YWxzKGRlcGVuZGVuY3lNYW5hZ2VtZW50S2V5KSkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIHJlYWN0b3JQcm9qZWN0LmdldEV4ZWN1dGlvblByb2plY3QoKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIHByaXZhdGUgYm9vbGVhbiBpc0RlcGVuZGVudFByb2plY3QoU3RyaW5nIGRlcGVuZGVuY3lNYW5hZ2VtZW50S2V5KQotICB7Ci0gICAgcmV0dXJuIChmaW5kRGVwZW5kZW50UHJvamVjdChkZXBlbmRlbmN5TWFuYWdlbWVudEtleSkgIT0gbnVsbCk7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgcmVtb3ZlQ2hpbGRyZW4oWHBwM0RvbSBwYXJlbnQpCi0gIHsKLSAgICB3aGlsZSAocGFyZW50LmdldENoaWxkQ291bnQoKSAhPSAwKQotICAgIHsKLSAgICAgIHBhcmVudC5yZW1vdmVDaGlsZCgwKTsKLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIFhwcDNEb20gY3JlYXRlUHJvamVjdFJlZmVyZW5jZURPTShGaWxlIHdvcmtzcGFjZURpciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZSBwcm9qZWN0RmlsZSkKLSAgewotICAgIFhwcDNEb20gaGFzaERPTSA9IG5ldyBYcHAzRG9tKCJoYXNoIik7Ci0gICAgWHBwM0RvbSB1cmxET00gPSBuZXcgWHBwM0RvbSgidXJsIik7Ci0gICAgdXJsRE9NLnNldEF0dHJpYnV0ZSgibiIsICJVUkwiKTsKLSAgICB1cmxET00uc2V0QXR0cmlidXRlKCJwYXRoIiwgZ2V0UmVsYXRpdmVGaWxlKHdvcmtzcGFjZURpciwgcHJvamVjdEZpbGUpKTsKLSAgICAKLSAgICBpZiAoX3JlbGVhc2VNYWpvciA8IDExKQotICAgIHsKLSAgICAgIFhwcDNEb20gdmFsdWVET00gPSBuZXcgWHBwM0RvbSgidmFsdWUiKTsKLSAgICAgIHZhbHVlRE9NLnNldEF0dHJpYnV0ZSgibiIsICJub2RlQ2xhc3MiKTsKLSAgICAgIHZhbHVlRE9NLnNldEF0dHJpYnV0ZSgidiIsICJvcmFjbGUuamRldmVsb3Blci5tb2RlbC5KUHJvamVjdCIpOwotICAgICAgaGFzaERPTS5hZGRDaGlsZCh2YWx1ZURPTSk7Ci0gICAgfQotICAgIGhhc2hET00uYWRkQ2hpbGQodXJsRE9NKTsKLSAgICByZXR1cm4gaGFzaERPTTsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBfcGFyc2VSZWxlYXNlKCkKLSAgewotICAgIFN0cmluZyBudW1zW10gPSByZWxlYXNlLnNwbGl0KCJcXC4iKTsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBfcmVsZWFzZU1ham9yID0gSW50ZWdlci5wYXJzZUludChudW1zWzBdKTsKLSAgICB9Ci0gICAgY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIC8vIERlZmF1bHQgcmVsZWFzZSBpcyBjdXJyZW50bHkgMTAueAotICAgICAgX3JlbGVhc2VNYWpvciA9IDEwOwotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgaW50ICAgICBfcmVsZWFzZU1ham9yID0gMDsKLSAgcHJpdmF0ZSBib29sZWFuIF9hZGRMaWJyYXJpZXMgPSB0cnVlOwotICBwcml2YXRlIGJvb2xlYW4gX2FkZFRhZ0xpYnMgICA9IHRydWU7Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIF9QUk9QRVJUWV9BRERfTElCUkFSWSA9ICJqZGV2LnBsdWdpbi5hZGQubGlicmFyaWVzIjsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIF9QUk9QRVJUWV9BRERfVEFHTElCUyA9ICJqZGV2LnBsdWdpbi5hZGQudGFnbGlicyI7Ci0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamRldi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2pkZXZlbG9wZXIvVGxkQ29udGVudEhhbmRsZXIuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamRldi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2pkZXZlbG9wZXIvVGxkQ29udGVudEhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTc0NDk4Ny4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWpkZXYtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qZGV2ZWxvcGVyL1RsZENvbnRlbnRIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODcgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmpkZXZlbG9wZXI7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlckZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotCi1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotCi1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotCi1wdWJsaWMgY2xhc3MgVGxkQ29udGVudEhhbmRsZXIKLXsKLSAgLyoqCi0gICAgKiBDb250ZW50IEhhbmRsZXIuCi0gICAgKi8KLSAgcHVibGljIFRsZENvbnRlbnRIYW5kbGVyKCkKLSAgewotICB9Ci0gIAotICAvKioKLSAgICAqIFBhcnNlIHRoZSAudGxkIGZpbGUgdG8gZ2V0IHRoZSBpbmZvcm1hdGlvbiAKLSAgICAqIG5lZWRlZCBmb3IgdGhlIC5qcHIKLSAgICAqLwotICBwdWJsaWMgdm9pZCBwYXJzZVRsZChGaWxlIGZpbGUpCi0gIHRocm93cyBTQVhFeGNlcHRpb24sCi0gICAgICAgICBJT0V4Y2VwdGlvbiwKLSAgICAgICAgIFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24KLSAgewotICAgIC8vIENyZWF0ZSBhIGJ1aWxkZXIgZmFjdG9yeQotICAgIERvY3VtZW50QnVpbGRlckZhY3RvcnkgZmFjdG9yeSA9IERvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICBmYWN0b3J5LnNldFZhbGlkYXRpbmcoZmFsc2UpOwotICAgIAotICAgIC8vIENyZWF0ZSB0aGUgQnVpbGRlciBhbmQgcGFyc2UgdGhlIGZpbGUKLSAgICBEb2N1bWVudCBkb2N1bWVudCA9IGZhY3RvcnkubmV3RG9jdW1lbnRCdWlsZGVyKCkucGFyc2UoZmlsZSk7Ci0gICAgCi0gICAgX3Byb2Nlc3NUbGROb2Rlcyhkb2N1bWVudCk7Ci0gIH0KLQotICAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICogR2V0dG9ycyBhbmQgc2V0dG9ycwotICAgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLQotICBwdWJsaWMgdm9pZCBzZXRWZXJzaW9uKFN0cmluZyB2ZXJzaW9uKQotICB7Ci0gICAgX3ZlcnNpb24gPSB2ZXJzaW9uOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkKLSAgewotICAgIF9uYW1lID0gbmFtZTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFByZWZpeChTdHJpbmcgcHJlZml4KQotICB7Ci0gICAgX3ByZWZpeCA9IHByZWZpeDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFVSSShTdHJpbmcgdXJpKQotICB7Ci0gICAgX3VyaSA9IHVyaTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldEpzcFZlcnNpb24oU3RyaW5nIGpzcFZlcnNpb24pCi0gIHsKLSAgICBfanNwVmVyc2lvbiA9IGpzcFZlcnNpb247Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFZlcnNpb24oKQotICB7Ci0gICAgcmV0dXJuIF92ZXJzaW9uID09IG51bGw/ICIiIDogX3ZlcnNpb247Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKQotICB7Ci0gICAgcmV0dXJuIF9uYW1lID09IG51bGw/ICIiIDogX25hbWU7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFByZWZpeCgpCi0gIHsKLSAgICByZXR1cm4gX3ByZWZpeCA9PSBudWxsPyAiIiA6IF9wcmVmaXg7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFVSSSgpCi0gIHsKLSAgICByZXR1cm4gX3VyaSA9PSBudWxsPyAiIiA6IF91cmk7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldEpzcFZlcnNpb24oKQotICB7Ci0gICAgcmV0dXJuIF9qc3BWZXJzaW9uID09IG51bGw/ICIiIDogX2pzcFZlcnNpb247Ci0gIH0KLQotCi0gIC8qKgotICAgICogRmluZCBhbGwgdGhlIFRMRCBub2RlcyB3ZSB3YW50LCBnZXQgZWFjaCBub2RlJ3MgdmFsdWUKLSAgICAqIGFuZCBzZXQgdGhlIHZhbHVlIG9uIHRoZSBwcm9wZXIgY2xhc3MgcHJvcGVydHkuCi0gICAgKiAKLSAgICAqIEBwYXJhbSBkb2N1bWVudCAgLSBET00gRG9jdW1lbnQgZnJvbSB0aGUgVExEIGZpbGUKLSAgICAqLyAgCi0gIHByaXZhdGUgdm9pZCBfcHJvY2Vzc1RsZE5vZGVzKERvY3VtZW50IGRvY3VtZW50KQotICB7Ci0gICAgTm9kZSBub2RlID0gbnVsbDsKLSAgICAKLSAgICAvLyBHZXQgdGhlIE5vZGVzIGZpcnN0IG5vZGUuICBXZSBjYW4gYmUgc3BlY2lmaWMgaGVyZQotICAgIC8vIGJlY2F1c2Ugd2Uga25vdyB3ZSB3YW50IHRoZSBmaXJzdCBub2RlLgotICAgIE5vZGVMaXN0IG5vZGVMaXN0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoX1RMSUJfVkVSU0lPTik7Ci0gICAgaWYgKG5vZGVMaXN0ICE9IG51bGwgJiYgbm9kZUxpc3QuZ2V0TGVuZ3RoKCkgIT0gMCkKLSAgICB7Ci0gICAgICBub2RlID0gbm9kZUxpc3QuaXRlbSgwKTsKLSAgICAgIHNldFZlcnNpb24obm9kZS5nZXRGaXJzdENoaWxkKCkuZ2V0Tm9kZVZhbHVlKCkpOwotICAgIH0KLQotICAgIG5vZGVMaXN0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoX0pTUF9WRVJTSU9OKTsKLSAgICBpZiAobm9kZUxpc3QgIT0gbnVsbCAmJiBub2RlTGlzdC5nZXRMZW5ndGgoKSAhPSAwKQotICAgIHsKLSAgICAgIG5vZGUgPSBub2RlTGlzdC5pdGVtKDApOwotICAgICAgc2V0SnNwVmVyc2lvbihub2RlLmdldEZpcnN0Q2hpbGQoKS5nZXROb2RlVmFsdWUoKSk7Ci0gICAgfQotCi0gICAgLy8gTXVzdCBnbyBiZWZvcmUgX0RJU1BMQVlfTkFNRQotICAgIG5vZGVMaXN0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoX1NIT1JUX05BTUUpOwotICAgIGlmIChub2RlTGlzdCAhPSBudWxsICYmIG5vZGVMaXN0LmdldExlbmd0aCgpICE9IDApCi0gICAgewotICAgICAgbm9kZSA9IG5vZGVMaXN0Lml0ZW0oMCk7Ci0gICAgICBzZXRQcmVmaXgobm9kZS5nZXRGaXJzdENoaWxkKCkuZ2V0Tm9kZVZhbHVlKCkpOwotICAgIH0KLQotICAgIC8vIE11c3QgZ28gYWZ0ZXIgX1NIT1JUX05BTUUKLSAgICBub2RlTGlzdCA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKF9ESVNQTEFZX05BTUUpOwotICAgIGlmIChub2RlTGlzdCAhPSBudWxsICYmIG5vZGVMaXN0LmdldExlbmd0aCgpICE9IDApCi0gICAgewotICAgICAgbm9kZSA9IG5vZGVMaXN0Lml0ZW0oMCk7Ci0gICAgICBzZXROYW1lKG5vZGUuZ2V0Rmlyc3RDaGlsZCgpLmdldE5vZGVWYWx1ZSgpKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHNldE5hbWUoZ2V0UHJlZml4KCkpOwotICAgIH0KLQotICAgIG5vZGVMaXN0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoX1VSSSk7Ci0gICAgaWYgKG5vZGVMaXN0ICE9IG51bGwgJiYgbm9kZUxpc3QuZ2V0TGVuZ3RoKCkgIT0gMCkKLSAgICB7Ci0gICAgICBub2RlID0gbm9kZUxpc3QuaXRlbSgwKTsKLSAgICAgIHNldFVSSShub2RlLmdldEZpcnN0Q2hpbGQoKS5nZXROb2RlVmFsdWUoKSk7Ci0gICAgfQotICB9Ci0gIAotICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAvLyBQcml2YXRlIHZhcmlhYmxlcwotICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAKLSAgcHJpdmF0ZSBTdHJpbmcgX3ZlcnNpb24gICAgPSBudWxsOyAvLyB0bGliLXZlcnNpb24KLSAgcHJpdmF0ZSBTdHJpbmcgX25hbWUgICAgICAgPSBudWxsOyAvLyBkaXNwbGF5LW5hbWUKLSAgcHJpdmF0ZSBTdHJpbmcgX3ByZWZpeCAgICAgPSBudWxsOyAvLyBzaG9ydC1uYW1lCi0gIHByaXZhdGUgU3RyaW5nIF9qc3BWZXJzaW9uID0gbnVsbDsgLy8ganNwLXZlcnNpb24KLSAgcHJpdmF0ZSBTdHJpbmcgX3VyaSAgICAgICAgPSBudWxsOyAvLyB1cmkKLSAKLSAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIF9UTElCX1ZFUlNJT04gPSAidGxpYi12ZXJzaW9uIjsgLy92ZXJzaW9uIE5PVFJBTlMKLSAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIF9ESVNQTEFZX05BTUUgPSAiZGlzcGxheS1uYW1lIjsgLy9uYW1lIE5PVFJBTlMKLSAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIF9TSE9SVF9OQU1FICAgPSAic2hvcnQtbmFtZSI7ICAgLy9wcmVmaXggTk9UUkFOUwotICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgX0pTUF9WRVJTSU9OICA9ICJqc3AtdmVyc2lvbiI7ICAgLy9OT1RSQU5TCi0gIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBfVVJJICAgICAgICAgID0gInVyaSI7Ci19IC8vIGVuZGNsYXNzIFRsZENvbnRlbnRIYW5kbGVyCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWpkZXYtcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9OT1RJQ0UgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWpkZXYtcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9OT1RJQ0UKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhM2RiZDYuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qZGV2LXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvTk9USUNFCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotPT0gIE5PVElDRSBmaWxlIGNvcnJlc3BvbmRpbmcgdG8gc2VjdGlvbiA0KGQpIG9mIHRoZSBBcGFjaGUgTGljZW5zZSwgICA9PQotPT0gIFZlcnNpb24gMi4wLCBpbiB0aGlzIGNhc2UgZm9yIHRoZSBBcGFjaGUgTXlGYWNlcyBNYXZlbiBQbHVnaW5zICAgICA9PQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1UaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IAotVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4KLQotUG9ydGlvbnMgb2YgdGhpcyBzb2Z0d2FyZSB3ZXJlIG9yaWdpbmFsbHkgYmFzZWQgb24gdGhlIGZvbGxvd2luZzoKLQotIC0gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDYsIE9yYWNsZSBDb3JwLCA8aHR0cDovL3d3dy5vcmFjbGUuY29tLz4uCi1hbmQgYXJlIGxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiB1bmRlciB0aGUgCi0iU29mdHdhcmUgR3JhbnQgYW5kIENvcnBvcmF0ZSBDb250cmlidXRpb24gTGljZW5zZSBBZ3JlZW1lbnQiCi0KLVNlZSB0aGUgTElDRU5TRS50eHQgZmlsZSBmb3IgaW5mb3JtYXRpb24gb24gYWxsIGxpY2Vuc2VzIAotYXNzb2NpYXRlZCB3aXRoIHRoaXMgc29mdHdhcmUuCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWpkZXYtcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2pkZXZlbG9wZXIvMTAuMS4zLjAuMi9wcm9qZWN0LnhtbCBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamRldi1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamRldmVsb3Blci8xMC4xLjMuMC4yL3Byb2plY3QueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OTI4NmZlLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamRldi1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamRldmVsb3Blci8xMC4xLjMuMC4yL3Byb2plY3QueG1sCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0KLSAgQ29weXJpZ2h0IDIwMDYgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotCi0gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08anByOnByb2plY3QgeG1sbnM6anByPSJodHRwOi8veG1sbnMub3JhY2xlLmNvbS9pZGUvcHJvamVjdCIgPgotICA8aGFzaCBuPSJjb21wb25lbnQtdmVyc2lvbnMiID4KLSAgICA8dmFsdWUgbj0ib3JhY2xlLmFkZmR0LmNvbnRyb2xsZXIuc3RydXRzLmFkZGluLlN0cnV0c1Byb2plY3RNaWdyYXRvciIgdj0iMTAuMS4zLjAuMiIgLz4KLSAgICA8dmFsdWUgbj0ib3JhY2xlLmlkZS5tb2RlbC5Qcm9qZWN0IiB2PSIxMC4xLjMuMC4yIiAvPgotICAgIDx2YWx1ZSBuPSJvcmFjbGUuamRldmVsb3Blci5vZmZsaW5lZGIubWlncmF0aW9uLk9mZmxpbmVEQlByb2plY3RNaWdyYXRvciIgdj0iMTAuMS4zLjAuMiIgLz4KLSAgICA8dmFsdWUgbj0ib3JhY2xlLmpkZXZpbXBsLmpzcC5Kc3BNaWdyYXRvciIgdj0iMTAuMS4zLjAuMiIgLz4KLSAgICA8dmFsdWUgbj0ib3JhY2xlLmpkZXZpbXBsLndlYnNlcnZpY2VzLldlYlNlcnZpY2VzTWlncmF0b3JIZWxwZXIiIHY9IjEwLjEuMy4wLjIiIC8+Ci0gIDwvaGFzaD4KLSAgPGxpc3Qgbj0iY29udGVudFNldHMiID4KLSAgICA8c3RyaW5nIHY9Im9yYWNsZS5qZGV2ZWxvcGVyLm1vZGVsLlBhdGhzQ29uZmlndXJhdGlvbi9qYXZhQ29udGVudFNldCIgLz4KLSAgICA8c3RyaW5nIHY9Im9yYWNsZS5qZGV2ZWxvcGVyLnJlc291cmNlcy5SZXNvdXJjZVBhdGhzL3Jlc291cmNlc0NvbnRlbnRTZXQiIC8+Ci0gICAgPHN0cmluZyB2PSJvcmFjbGUuamRldmVsb3Blci5tb2RlbC5KMmVlU2V0dGluZ3Mvd2ViQ29udGVudFNldCIgLz4KLSAgPC9saXN0PgotICA8aGFzaCBuPSJvcmFjbGUuaWRlLm1vZGVsLkRlcGVuZGVuY3lDb25maWd1cmF0aW9uIiA+Ci0gICAgPGxpc3Qgbj0iZGVwZW5kZW5jeUxpc3QiIC8+Ci0gIDwvaGFzaD4KLSAgPGhhc2ggbj0ib3JhY2xlLmpkZXZlbG9wZXIuY29tcGlsZXIuT2pjQ29uZmlndXJhdGlvbiIgPgotICAgIDx2YWx1ZSBuPSJhc3NlcnRpb25zRW5hYmxlZCIgdj0idHJ1ZSIgLz4KLSAgICA8bGlzdCBuPSJjb3B5UmVzIiA+Ci0gICAgICA8c3RyaW5nIHY9Ii5qYXZhIiAvPgotICAgIDwvbGlzdD4KLSAgICA8dmFsdWUgbj0icmV2ZXJzZUNvcHlSZXMiIHY9InRydWUiIC8+Ci0gICAgPHZhbHVlIG49ImludGVybmFsRW5jb2RpbmciIHY9IkRlZmF1bHQiIC8+Ci0gICAgPHZhbHVlIG49InNob3dPYmplY3REb3RTdGF0aWNXYXJuaW5ncyIgdj0idHJ1ZSIgLz4KLSAgICA8dmFsdWUgbj0ic2hvd1BhcnRpYWxJbXBvcnRXYXJuaW5ncyIgdj0idHJ1ZSIgLz4KLSAgICA8dmFsdWUgbj0ic2hvd1VudXNlZEltcG9ydFdhcm5pbmdzIiB2PSJ0cnVlIiAvPgotICA8L2hhc2g+Ci0gIDxoYXNoIG49Im9yYWNsZS5qZGV2ZWxvcGVyLm1vZGVsLkoyZWVTZXR0aW5ncyIgPgotICAgIDx2YWx1ZSBuPSJqMmVlV2ViQXBwTmFtZSIgdj0ibWF2ZW4tZ2VuZXJhdGVkLXdlYmFwcCIgLz4KLSAgICA8dmFsdWUgbj0iajJlZVdlYkNvbnRleHRSb290IiB2PSJtYXZlbi1nZW5lcmF0ZWQtY29udGV4dC1yb290IiAvPgotICAgIDxoYXNoIG49IndlYkNvbnRlbnRTZXQiID4KLSAgICAgIDxsaXN0IG49InVybC1wYXRoIiAvPgotICAgIDwvaGFzaD4KLSAgPC9oYXNoPgotICA8aGFzaCBuPSJvcmFjbGUuamRldmVsb3Blci5tb2RlbC5QYXRoc0NvbmZpZ3VyYXRpb24iID4KLSAgICA8aGFzaCBuPSJqYXZhQ29udGVudFNldCIgPgotICAgICAgPGxpc3Qgbj0icGF0dGVybi1maWx0ZXJzIiA+Ci0gICAgICAgIDxzdHJpbmcgdj0iKyoqIiAvPgotICAgICAgPC9saXN0PgotICAgICAgPGxpc3Qgbj0idXJsLXBhdGgiIC8+Ci0gICAgPC9oYXNoPgotICA8L2hhc2g+Ci0gIDxoYXNoIG49Im9yYWNsZS5qZGV2ZWxvcGVyLnJlc291cmNlcy5SZXNvdXJjZVBhdGhzIiA+Ci0gICAgPGhhc2ggbj0icmVzb3VyY2VzQ29udGVudFNldCIgPgotICAgICAgPGxpc3Qgbj0icGF0dGVybi1maWx0ZXJzIiA+Ci0gICAgICAgIDxzdHJpbmcgdj0iKyoqIiAvPgotICAgICAgPC9saXN0PgotICAgICAgPGxpc3Qgbj0idXJsLXBhdGgiIC8+Ci0gICAgPC9oYXNoPgotICA8L2hhc2g+Ci0gIDxoYXNoIG49Im9yYWNsZS5qZGV2aW1wbC5jb25maWcuSlByb2plY3RMaWJyYXJpZXMiID4KLSAgICA8bGlzdCBuPSJleHBvcnRlZFJlZmVyZW5jZXMiIC8+Ci0gICAgPGhhc2ggbj0iaW50ZXJuYWxEZWZpbml0aW9ucyIgPgotICAgICAgPGxpc3Qgbj0ibGlicmFyeURlZmluaXRpb25zIiAvPgotICAgIDwvaGFzaD4KLSAgICA8bGlzdCBuPSJsaWJyYXJ5UmVmZXJlbmNlcyIgLz4KLSAgPC9oYXNoPgotICA8aGFzaCBuPSJvcmFjbGUuamRldmltcGwuY29uZmlnLkpQcm9qZWN0UGF0aHMiID4KLSAgICA8dXJsIG49Im91dHB1dERpcmVjdG9yeSIgLz4KLSAgPC9oYXNoPgotICA8aGFzaCBuPSJvcmFjbGUuamRldmltcGwud2ViYXBwLmpzcC5saWJyYXJpZXMubW9kZWwuUHJvamVjdFRhZ0xpYnJhcmllcyIgPgotICAgIDxoYXNoIG49ImxpYnJhcmllcyIgLz4KLSAgPC9oYXNoPgotPC9qcHI6cHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWpkZXYtcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2pkZXZlbG9wZXIvMTAuMS4zLjAuMi93b3Jrc3BhY2UueG1sIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qZGV2LXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qZGV2ZWxvcGVyLzEwLjEuMy4wLjIvd29ya3NwYWNlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWJiMWFlMC4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWpkZXYtcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2pkZXZlbG9wZXIvMTAuMS4zLjAuMi93b3Jrc3BhY2UueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0KLSAgQ29weXJpZ2h0IDIwMDYgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotCi0gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08andzOndvcmtzcGFjZSB4bWxuczpqd3M9Imh0dHA6Ly94bWxucy5vcmFjbGUuY29tL2lkZS9wcm9qZWN0Ij4KLSAgPGhhc2ggbj0iY29tcG9uZW50LXZlcnNpb25zIj4KLSAgICA8dmFsdWUgbj0ib3JhY2xlLmlkZS5tb2RlbC5Qcm9qZWN0IiB2PSIxMC4xLjMuMC4yIi8+Ci0gIDwvaGFzaD4KLSAgPGxpc3Qgbj0ibGlzdE9mQ2hpbGRyZW4iIC8+Ci08L2p3czp3b3Jrc3BhY2U+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qZGV2LXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qZGV2ZWxvcGVyLzEwLjEuMy4wLjMvcHJvamVjdC54bWwgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWpkZXYtcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2pkZXZlbG9wZXIvMTAuMS4zLjAuMy9wcm9qZWN0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWE2MDA2Yi4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWpkZXYtcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2pkZXZlbG9wZXIvMTAuMS4zLjAuMy9wcm9qZWN0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLTw/eG1sIHZlcnNpb24gPSAnMS4wJyBlbmNvZGluZyA9ICdVVEYtOCc/PgotPCEtLQotICBDb3B5cmlnaHQgMjAwNiBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0KLSAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTxqcHI6cHJvamVjdCB4bWxuczpqcHI9Imh0dHA6Ly94bWxucy5vcmFjbGUuY29tL2lkZS9wcm9qZWN0Ij4KLSAgIDxoYXNoIG49ImNvbXBvbmVudC12ZXJzaW9ucyI+Ci0gICAgICA8dmFsdWUgbj0ib3JhY2xlLmFkZi5kdC5taWdyYXRpb24uUHJvamVjdE1pZ3JhdG9yIiB2PSIxMC4xLjMuMC4zIi8+Ci0gICAgICA8dmFsdWUgbj0ib3JhY2xlLmFkZmR0LmNvbnRyb2xsZXIuanNmLmFkZGluLkpTRlByb2plY3RNaWdyYXRvciIgdj0iMTAuMS4zLjAuMyIvPgotICAgICAgPHZhbHVlIG49Im9yYWNsZS5hZGZkdC5jb250cm9sbGVyLnN0cnV0cy5hZGRpbi5kYi5BREZTdHJ1dHNQcm9qZWN0TWlncmF0b3IiIHY9IjEwLjEuMy4wLjMiLz4KLSAgICAgIDx2YWx1ZSBuPSJvcmFjbGUuYWRmZHQuY29udHJvbGxlci5zdHJ1dHMuYWRkaW4uU3RydXRzUHJvamVjdE1pZ3JhdG9yIiB2PSIxMC4xLjMuMC4yOzEwLjEuMy4wLjMiLz4KLSAgICAgIDx2YWx1ZSBuPSJvcmFjbGUuYm0uY29tbW9uSWRlLlByb2plY3RVcGdyYWRlciIgdj0iMTAuMS4zLjAuMyIvPgotICAgICAgPHZhbHVlIG49Im9yYWNsZS5pZGUubW9kZWwuUHJvamVjdCIgdj0iMTAuMS4zLjAuMjsxMC4xLjMuMC4zIi8+Ci0gICAgICA8dmFsdWUgbj0ib3JhY2xlLmlkZS5tb2RlbC5SZXNvdXJjZVBhdGhzTWlncmF0b3IiIHY9IjEwLjEuMy4wLjMiLz4KLSAgICAgIDx2YWx1ZSBuPSJvcmFjbGUuamJvLmR0LmpjbGllbnQubWlncmF0b3IuSkNQcm9qZWN0TWlncmF0b3IiIHY9IjEwLjEuMy4wLjMiLz4KLSAgICAgIDx2YWx1ZSBuPSJvcmFjbGUuamJvLmR0LmpkZXZ4LnVpLmFwcG5hdi5BUFByb2plY3RNaWdyYXRvciIgdj0iMTAuMS4zLjAuMyIvPgotICAgICAgPHZhbHVlIG49Im9yYWNsZS5qZGV2ZWxvcGVyLmRibW9kZWxlci5taWdyYXRpb24uUHJvamVjdE1pZ3JhdG9ySGVscGVyIiB2PSIxMC4xLjMuMC4zIi8+Ci0gICAgICA8dmFsdWUgbj0ib3JhY2xlLmpkZXZlbG9wZXIub2ZmbGluZWRiLm1pZ3JhdGlvbi5PZmZsaW5lREJQcm9qZWN0TWlncmF0b3IiIHY9IjEwLjEuMy4wLjI7MTAuMS4zLjAuMyIvPgotICAgICAgPHZhbHVlIG49Im9yYWNsZS5qZGV2aW1wbC5qc3AuSnNwTWlncmF0b3IiIHY9IjEwLjEuMy4wLjI7MTAuMS4zLjAuMyIvPgotICAgICAgPHZhbHVlIG49Im9yYWNsZS5qZGV2aW1wbC5ydW5uZXIuUnVuQ29uZmlndXJhdGlvbnNNaWdyYXRvciIgdj0iMTAuMS4zLjAuMyIvPgotICAgICAgPHZhbHVlIG49Im9yYWNsZS5qZGV2aW1wbC53ZWJzZXJ2aWNlcy5XZWJTZXJ2aWNlc01pZ3JhdG9ySGVscGVyIiB2PSIxMC4xLjMuMC4yOzEwLjEuMy4wLjMiLz4KLSAgICAgIDx2YWx1ZSBuPSJvcmFjbGUudG9wbGluay5hZGRpbi5taWdyYXRpb24uVG9wTGlua1Byb2plY3RNaWdyYXRvciIgdj0iMTAuMS4zLjAuMyIvPgotICAgPC9oYXNoPgotICAgPGxpc3Qgbj0iY29udGVudFNldHMiPgotICAgICAgPHN0cmluZyB2PSJvcmFjbGUuamRldmVsb3Blci5tb2RlbC5QYXRoc0NvbmZpZ3VyYXRpb24vamF2YUNvbnRlbnRTZXQiLz4KLSAgICAgIDxzdHJpbmcgdj0ib3JhY2xlLmpkZXZlbG9wZXIubW9kZWwuSjJlZVNldHRpbmdzL3dlYkNvbnRlbnRTZXQiLz4KLSAgICAgIDxzdHJpbmcgdj0ib3JhY2xlLmlkZS5tb2RlbC5SZXNvdXJjZVBhdGhzL3Jlc291cmNlc0NvbnRlbnRTZXQiLz4KLSAgIDwvbGlzdD4KLSAgIDxoYXNoIG49Im9yYWNsZS5pZGUubW9kZWwuRGVwZW5kZW5jeUNvbmZpZ3VyYXRpb24iPgotICAgICAgPGxpc3Qgbj0iZGVwZW5kZW5jeUxpc3QiLz4KLSAgIDwvaGFzaD4KLSAgIDxoYXNoIG49Im9yYWNsZS5pZGUubW9kZWwuUmVzb3VyY2VQYXRocyI+Ci0gICAgICA8aGFzaCBuPSJyZXNvdXJjZXNDb250ZW50U2V0Ij4KLSAgICAgICAgIDxsaXN0IG49InBhdHRlcm4tZmlsdGVycyI+Ci0gICAgICAgICAgICA8c3RyaW5nIHY9IisqKiIvPgotICAgICAgICAgPC9saXN0PgotICAgICAgICAgPGxpc3Qgbj0idXJsLXBhdGgiIC8+Ci0gICAgICA8L2hhc2g+Ci0gICA8L2hhc2g+Ci0gICA8aGFzaCBuPSJvcmFjbGUuamRldmVsb3Blci5jb21waWxlci5PamNDb25maWd1cmF0aW9uIj4KLSAgICAgIDx2YWx1ZSBuPSJhc3NlcnRpb25zRW5hYmxlZCIgdj0idHJ1ZSIvPgotICAgICAgPGxpc3Qgbj0iY29weVJlcyI+Ci0gICAgICAgICA8c3RyaW5nIHY9Ii5qYXZhIi8+Ci0gICAgICA8L2xpc3Q+Ci0gICAgICA8dmFsdWUgbj0iaW50ZXJuYWxFbmNvZGluZyIgdj0iRGVmYXVsdCIvPgotICAgICAgPHZhbHVlIG49InJldmVyc2VDb3B5UmVzIiB2PSJ0cnVlIi8+Ci0gICAgICA8dmFsdWUgbj0ic2hvd09iamVjdERvdFN0YXRpY1dhcm5pbmdzIiB2PSJ0cnVlIi8+Ci0gICAgICA8dmFsdWUgbj0ic2hvd1BhcnRpYWxJbXBvcnRXYXJuaW5ncyIgdj0idHJ1ZSIvPgotICAgICAgPHZhbHVlIG49InNob3dVbnVzZWRJbXBvcnRXYXJuaW5ncyIgdj0idHJ1ZSIvPgotICAgICAgPHZhbHVlIG49InVzZUphdmFjIiB2PSJ0cnVlIi8+Ci0gICA8L2hhc2g+Ci0gICA8aGFzaCBuPSJvcmFjbGUuamRldmVsb3Blci5tb2RlbC5KMmVlU2V0dGluZ3MiPgotICAgICAgPHZhbHVlIG49ImoyZWVXZWJBcHBOYW1lIiB2PSJtYXZlbi1nZW5lcmF0ZWQtd2ViYXBwIi8+Ci0gICAgICA8dmFsdWUgbj0iajJlZVdlYkNvbnRleHRSb290IiB2PSJtYXZlbi1nZW5lcmF0ZWQtY29udGV4dC1yb290Ii8+Ci0gICAgICA8aGFzaCBuPSJ3ZWJDb250ZW50U2V0Ij4KLSAgICAgICAgIDxsaXN0IG49InVybC1wYXRoIiAvPgotICAgICAgPC9oYXNoPgotICAgPC9oYXNoPgotICAgPGhhc2ggbj0ib3JhY2xlLmpkZXZlbG9wZXIubW9kZWwuUGF0aHNDb25maWd1cmF0aW9uIj4KLSAgICAgIDxoYXNoIG49ImphdmFDb250ZW50U2V0Ij4KLSAgICAgICAgIDxsaXN0IG49InBhdHRlcm4tZmlsdGVycyI+Ci0gICAgICAgICAgICA8c3RyaW5nIHY9IisqKiIvPgotICAgICAgICAgPC9saXN0PgotICAgICAgICAgPGxpc3Qgbj0idXJsLXBhdGgiIC8+Ci0gICAgICA8L2hhc2g+Ci0gICA8L2hhc2g+Ci0gICA8aGFzaCBuPSJvcmFjbGUuamRldmltcGwuY29uZmlnLkpQcm9qZWN0TGlicmFyaWVzIj4KLSAgICAgIDxsaXN0IG49ImV4cG9ydGVkUmVmZXJlbmNlcyIvPgotICAgICAgPGhhc2ggbj0iaW50ZXJuYWxEZWZpbml0aW9ucyI+Ci0gICAgICAgICA8bGlzdCBuPSJsaWJyYXJ5RGVmaW5pdGlvbnMiIC8+Ci0gICAgICA8L2hhc2g+Ci0gICAgICA8bGlzdCBuPSJsaWJyYXJ5UmVmZXJlbmNlcyIgLz4KLSAgIDwvaGFzaD4KLSAgIDxoYXNoIG49Im9yYWNsZS5qZGV2aW1wbC5jb25maWcuSlByb2plY3RQYXRocyI+Ci0gICAgICA8dXJsIG49Im91dHB1dERpcmVjdG9yeSIgLz4KLSAgIDwvaGFzaD4KLSAgIDxoYXNoIG49Im9yYWNsZS5qZGV2aW1wbC53ZWJhcHAuanNwLmxpYnJhcmllcy5tb2RlbC5Qcm9qZWN0VGFnTGlicmFyaWVzIj4KLSAgICAgIDxoYXNoIG49ImxpYnJhcmllcyIvPgotICAgPC9oYXNoPgotPC9qcHI6cHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWpkZXYtcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2pkZXZlbG9wZXIvMTAuMS4zLjAuMy93b3Jrc3BhY2UueG1sIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qZGV2LXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qZGV2ZWxvcGVyLzEwLjEuMy4wLjMvd29ya3NwYWNlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWU0OGQ5YS4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWpkZXYtcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2pkZXZlbG9wZXIvMTAuMS4zLjAuMy93b3Jrc3BhY2UueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPD94bWwgdmVyc2lvbiA9ICcxLjAnIGVuY29kaW5nID0gJ1VURi04Jz8+Ci08IS0tCi0gIENvcHlyaWdodCAyMDA2IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLQotICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPGp3czp3b3Jrc3BhY2UgeG1sbnM6andzPSJodHRwOi8veG1sbnMub3JhY2xlLmNvbS9pZGUvcHJvamVjdCI+Ci0gICA8aGFzaCBuPSJjb21wb25lbnQtdmVyc2lvbnMiPgotICAgICAgPHZhbHVlIG49Im9yYWNsZS5pZGUubW9kZWwuUHJvamVjdCIgdj0iMTAuMS4zLjAuMjsxMC4xLjMuMC4zIi8+Ci0gICA8L2hhc2g+Ci0gICA8bGlzdCBuPSJsaXN0T2ZDaGlsZHJlbiIgLz4KLTwvandzOndvcmtzcGFjZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWpkZXYtcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2pkZXZlbG9wZXIvMTAuMS4zLjAuNC9wcm9qZWN0LnhtbCBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamRldi1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamRldmVsb3Blci8xMC4xLjMuMC40L3Byb2plY3QueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MjgxNGQxLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamRldi1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamRldmVsb3Blci8xMC4xLjMuMC40L3Byb2plY3QueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTI3ICswLDAgQEAKLTw/eG1sIHZlcnNpb24gPSAnMS4wJyBlbmNvZGluZyA9ICdVVEYtOCc/PgotPCEtLQotICBDb3B5cmlnaHQgMjAwNiBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0KLSAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTxqcHI6cHJvamVjdCB4bWxuczpqcHI9Imh0dHA6Ly94bWxucy5vcmFjbGUuY29tL2lkZS9wcm9qZWN0Ij4KLSAgPGhhc2ggbj0iY29tcG9uZW50LXZlcnNpb25zIj4KLSAgICA8dmFsdWUgbj0ib3JhY2xlLmFkZi5kdC5taWdyYXRpb24uUHJvamVjdE1pZ3JhdG9yIiB2PSIxMC4xLjMuMC4zOzEwLjEuMy4wLjQiLz4KLSAgICA8dmFsdWUgbj0ib3JhY2xlLmFkZmR0LmNvbnRyb2xsZXIuanNmLmFkZGluLkpTRlByb2plY3RNaWdyYXRvciIgdj0iMTAuMS4zLjAuMzsxMC4xLjMuMC40Ii8+Ci0gICAgPHZhbHVlIG49Im9yYWNsZS5hZGZkdC5jb250cm9sbGVyLnN0cnV0cy5hZGRpbi5kYi5BREZTdHJ1dHNQcm9qZWN0TWlncmF0b3IiIHY9IjEwLjEuMy4wLjM7MTAuMS4zLjAuNCIvPgotICAgIDx2YWx1ZSBuPSJvcmFjbGUuYWRmZHQuY29udHJvbGxlci5zdHJ1dHMuYWRkaW4uU3RydXRzUHJvamVjdE1pZ3JhdG9yIiB2PSIxMC4xLjMuMC4yOzEwLjEuMy4wLjM7MTAuMS4zLjAuNCIvPgotICAgIDx2YWx1ZSBuPSJvcmFjbGUuYm0uY29tbW9uSWRlLlByb2plY3RVcGdyYWRlciIgdj0iMTAuMS4zLjAuMzsxMC4xLjMuMC40Ii8+Ci0gICAgPHZhbHVlIG49Im9yYWNsZS5pZGUubW9kZWwuUHJvamVjdCIgdj0iMTAuMS4zLjAuMjsxMC4xLjMuMC4zOzEwLjEuMy4wLjQiLz4KLSAgICA8dmFsdWUgbj0ib3JhY2xlLmlkZS5tb2RlbC5SZXNvdXJjZVBhdGhzTWlncmF0b3IiIHY9IjEwLjEuMy4wLjM7MTAuMS4zLjAuNCIvPgotICAgIDx2YWx1ZSBuPSJvcmFjbGUuamJvLmR0LmpjbGllbnQubWlncmF0b3IuSkNQcm9qZWN0TWlncmF0b3IiIHY9IjEwLjEuMy4wLjM7MTAuMS4zLjAuNCIvPgotICAgIDx2YWx1ZSBuPSJvcmFjbGUuamJvLmR0LmpkZXZ4LnVpLmFwcG5hdi5BUFByb2plY3RNaWdyYXRvciIgdj0iMTAuMS4zLjAuMzsxMC4xLjMuMC40Ii8+Ci0gICAgPHZhbHVlIG49Im9yYWNsZS5qZGV2ZWxvcGVyLmRibW9kZWxlci5taWdyYXRpb24uUHJvamVjdE1pZ3JhdG9ySGVscGVyIiB2PSIxMC4xLjMuMC4zOzEwLjEuMy4wLjQiLz4KLSAgICA8dmFsdWUgbj0ib3JhY2xlLmpkZXZlbG9wZXIub2ZmbGluZWRiLm1pZ3JhdGlvbi5PZmZsaW5lREJQcm9qZWN0TWlncmF0b3IiIHY9IjEwLjEuMy4wLjI7MTAuMS4zLjAuMzsxMC4xLjMuMC40Ii8+Ci0gICAgPHZhbHVlIG49Im9yYWNsZS5qZGV2aW1wbC5qc3AuSnNwTWlncmF0b3IiIHY9IjEwLjEuMy4wLjI7MTAuMS4zLjAuMzsxMC4xLjMuMC40Ii8+Ci0gICAgPHZhbHVlIG49Im9yYWNsZS5qZGV2aW1wbC5ydW5uZXIuUnVuQ29uZmlndXJhdGlvbnNNaWdyYXRvciIgdj0iMTAuMS4zLjAuMzsxMC4xLjMuMC40Ii8+Ci0gICAgPHZhbHVlIG49Im9yYWNsZS5qZGV2aW1wbC53ZWJzZXJ2aWNlcy5XZWJTZXJ2aWNlc01pZ3JhdG9ySGVscGVyIiB2PSIxMC4xLjMuMC4yOzEwLjEuMy4wLjM7MTAuMS4zLjAuNCIvPgotICAgIDx2YWx1ZSBuPSJvcmFjbGUudG9wbGluay5hZGRpbi5taWdyYXRpb24uVG9wTGlua1Byb2plY3RNaWdyYXRvciIgdj0iMTAuMS4zLjAuMzsxMC4xLjMuMC40Ii8+Ci0gIDwvaGFzaD4KLSAgPGxpc3Qgbj0iY29udGVudFNldHMiPgotICAgIDxzdHJpbmcgdj0ib3JhY2xlLmpkZXZlbG9wZXIubW9kZWwuUGF0aHNDb25maWd1cmF0aW9uL2phdmFDb250ZW50U2V0Ii8+Ci0gICAgPHN0cmluZyB2PSJvcmFjbGUuamRldmVsb3Blci5tb2RlbC5KMmVlU2V0dGluZ3Mvd2ViQ29udGVudFNldCIvPgotICAgIDxzdHJpbmcgdj0ib3JhY2xlLmlkZS5tb2RlbC5SZXNvdXJjZVBhdGhzL3Jlc291cmNlc0NvbnRlbnRTZXQiLz4KLSAgICA8c3RyaW5nIHY9Im9yYWNsZS5qZGV2ZWxvcGVyLm9mZmxpbmVkYi5tb2RlbC5PZmZsaW5lREJQcm9qZWN0U2V0dGluZ3Mvb2ZmbGluZURCQ29udGVudFNldCIvPgotICAgIDxzdHJpbmcgdj0ib3JhY2xlLnRvcGxpbmsuYWRkaW4uVG9wTGlua1Byb2plY3RTZXR0aW5ncy90b3BsaW5rQ29udGVudFNldCIvPgotICAgIDxzdHJpbmcgdj0ib3JhY2xlLmJtLmNvbW1vbklkZS5kYXRhLnByb2plY3QuTW9kZWxlclByb2plY3RTZXR0aW5ncy9tb2RlbGVyc0NvbnRlbnRTZXQiLz4KLSAgPC9saXN0PgotICA8aGFzaCBuPSJvcmFjbGUuYm0uY29tbW9uSWRlLmRhdGEucHJvamVjdC5Nb2RlbGVyUHJvamVjdFNldHRpbmdzIj4KLSAgICA8aGFzaCBuPSJtb2RlbGVyc0NvbnRlbnRTZXQiPgotICAgICAgPGxpc3Qgbj0icGF0dGVybi1maWx0ZXJzIj4KLSAgICAgICAgPHN0cmluZyB2PSIrKioiLz4KLSAgICAgIDwvbGlzdD4KLSAgICAgIDxsaXN0IG49InVybC1wYXRoIj4KLSAgICAgICAgPHVybCBwYXRoPSJtb2RlbC8iLz4KLSAgICAgIDwvbGlzdD4KLSAgICA8L2hhc2g+Ci0gICAgPHZhbHVlIG49Im1vZGVsZXJzVmVyc2lvbiIgdj0iMTAuMTMiLz4KLSAgPC9oYXNoPgotICA8aGFzaCBuPSJvcmFjbGUuaWRlLm1vZGVsLkRlcGVuZGVuY3lDb25maWd1cmF0aW9uIj4KLSAgICA8bGlzdCBuPSJkZXBlbmRlbmN5TGlzdCIvPgotICA8L2hhc2g+Ci0gIDxoYXNoIG49Im9yYWNsZS5pZGUubW9kZWwuUmVzb3VyY2VQYXRocyI+Ci0gICAgPGhhc2ggbj0icmVzb3VyY2VzQ29udGVudFNldCI+Ci0gICAgICA8bGlzdCBuPSJwYXR0ZXJuLWZpbHRlcnMiPgotICAgICAgICA8c3RyaW5nIHY9IisqKiIvPgotICAgICAgPC9saXN0PgotICAgICAgPGxpc3Qgbj0idXJsLXBhdGgiIC8+Ci0gICAgPC9oYXNoPgotICA8L2hhc2g+Ci0gIDxoYXNoIG49Im9yYWNsZS5qZGV2ZWxvcGVyLmNvbXBpbGVyLk9qY0NvbmZpZ3VyYXRpb24iPgotICAgIDx2YWx1ZSBuPSJpbnRlcm5hbEVuY29kaW5nIiB2PSJEZWZhdWx0Ii8+Ci0gIDwvaGFzaD4KLSAgPGhhc2ggbj0ib3JhY2xlLmpkZXZlbG9wZXIubW9kZWwuSjJlZVNldHRpbmdzIj4KLSAgICA8dmFsdWUgbj0iajJlZVdlYkFwcE5hbWUiIHY9Im1hdmVuLWdlbmVyYXRlZC13ZWJhcHAiLz4KLSAgICA8dmFsdWUgbj0iajJlZVdlYkNvbnRleHRSb290IiB2PSJtYXZlbi1nZW5lcmF0ZWQtY29udGV4dC1yb290Ii8+Ci0gICAgPGhhc2ggbj0id2ViQ29udGVudFNldCI+Ci0gICAgICA8bGlzdCBuPSJ1cmwtcGF0aCIgLz4KLSAgICA8L2hhc2g+Ci0gIDwvaGFzaD4KLSAgPGhhc2ggbj0ib3JhY2xlLmpkZXZlbG9wZXIubW9kZWwuUGF0aHNDb25maWd1cmF0aW9uIj4KLSAgICA8aGFzaCBuPSJqYXZhQ29udGVudFNldCI+Ci0gICAgICA8bGlzdCBuPSJwYXR0ZXJuLWZpbHRlcnMiPgotICAgICAgICA8c3RyaW5nIHY9IisqKiIvPgotICAgICAgPC9saXN0PgotICAgICAgPGxpc3Qgbj0idXJsLXBhdGgiIC8+Ci0gICAgPC9oYXNoPgotICA8L2hhc2g+Ci0gIDxoYXNoIG49Im9yYWNsZS5qZGV2ZWxvcGVyLm9mZmxpbmVkYi5tb2RlbC5PZmZsaW5lREJQcm9qZWN0U2V0dGluZ3MiPgotICAgIDxoYXNoIG49Im9mZmxpbmVEQkNvbnRlbnRTZXQiPgotICAgICAgPGxpc3Qgbj0icGF0dGVybi1maWx0ZXJzIj4KLSAgICAgICAgPHN0cmluZyB2PSIrKioiLz4KLSAgICAgIDwvbGlzdD4KLSAgICAgIDxsaXN0IG49InVybC1wYXRoIj4KLSAgICAgICAgPHVybCBwYXRoPSJkYXRhYmFzZS8iLz4KLSAgICAgIDwvbGlzdD4KLSAgICA8L2hhc2g+Ci0gIDwvaGFzaD4KLSAgPGhhc2ggbj0ib3JhY2xlLmpkZXZlbG9wZXIucnVubmVyLlJ1bkNvbmZpZ3VyYXRpb25zIj4KLSAgICA8aGFzaCBuPSJydW5Db25maWd1cmF0aW9uRGVmaW5pdGlvbnMiPgotICAgICAgPGhhc2ggbj0iRGVmYXVsdCI+Ci0gICAgICAgIDx2YWx1ZSBuPSJjdXN0b20iIHY9ImZhbHNlIi8+Ci0gICAgICAgIDx2YWx1ZSBuPSJuYW1lIiB2PSJEZWZhdWx0Ii8+Ci0gICAgICA8L2hhc2g+Ci0gICAgPC9oYXNoPgotICAgIDxsaXN0IG49InJ1bkNvbmZpZ3VyYXRpb25MaXN0Ij4KLSAgICAgIDxzdHJpbmcgdj0iRGVmYXVsdCIvPgotICAgIDwvbGlzdD4KLSAgPC9oYXNoPgotICA8aGFzaCBuPSJvcmFjbGUuamRldmltcGwuY29uZmlnLkpQcm9qZWN0TGlicmFyaWVzIj4KLSAgICA8bGlzdCBuPSJleHBvcnRlZFJlZmVyZW5jZXMiLz4KLSAgICA8aGFzaCBuPSJpbnRlcm5hbERlZmluaXRpb25zIj4KLSAgICAgIDxsaXN0IG49ImxpYnJhcnlEZWZpbml0aW9ucyIgLz4KLSAgICA8L2hhc2g+Ci0gICAgPGxpc3Qgbj0ibGlicmFyeVJlZmVyZW5jZXMiIC8+Ci0gIDwvaGFzaD4KLSAgPGhhc2ggbj0ib3JhY2xlLmpkZXZpbXBsLmNvbmZpZy5KUHJvamVjdFBhdGhzIj4KLSAgICA8dXJsIG49Im91dHB1dERpcmVjdG9yeSIgLz4KLSAgPC9oYXNoPgotICA8aGFzaCBuPSJvcmFjbGUuamRldmltcGwud2ViYXBwLmpzcC5saWJyYXJpZXMubW9kZWwuUHJvamVjdFRhZ0xpYnJhcmllcyI+Ci0gICAgPGhhc2ggbj0ibGlicmFyaWVzIi8+Ci0gIDwvaGFzaD4KLSAgPGhhc2ggbj0ib3JhY2xlLnRvcGxpbmsuYWRkaW4uVG9wTGlua1Byb2plY3RTZXR0aW5ncyI+Ci0gICAgPGhhc2ggbj0idG9wbGlua0NvbnRlbnRTZXQiPgotICAgICAgPGxpc3Qgbj0icGF0dGVybi1maWx0ZXJzIj4KLSAgICAgICAgPHN0cmluZyB2PSIrKioiLz4KLSAgICAgIDwvbGlzdD4KLSAgICAgIDxsaXN0IG49InVybC1wYXRoIj4KLSAgICAgICAgPHVybCBwYXRoPSJ0b3BsaW5rLyIvPgotICAgICAgPC9saXN0PgotICAgIDwvaGFzaD4KLSAgPC9oYXNoPgotPC9qcHI6cHJvamVjdD4KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamRldi1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamRldmVsb3Blci8xMC4xLjMuMC40L3dvcmtzcGFjZS54bWwgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWpkZXYtcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2pkZXZlbG9wZXIvMTAuMS4zLjAuNC93b3Jrc3BhY2UueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjk1MzY0Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamRldi1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamRldmVsb3Blci8xMC4xLjMuMC40L3dvcmtzcGFjZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi08P3htbCB2ZXJzaW9uID0gJzEuMCcgZW5jb2RpbmcgPSAnVVRGLTgnPz4KLTwhLS0KLSAgQ29weXJpZ2h0IDIwMDYgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotCi0gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08andzOndvcmtzcGFjZSB4bWxuczpqd3M9Imh0dHA6Ly94bWxucy5vcmFjbGUuY29tL2lkZS9wcm9qZWN0Ij4KLSAgIDxoYXNoIG49ImNvbXBvbmVudC12ZXJzaW9ucyI+Ci0gICAgICA8dmFsdWUgbj0ib3JhY2xlLmlkZS5tb2RlbC5Qcm9qZWN0IiB2PSIxMC4xLjMuMC40Ii8+Ci0gICAgICA8dmFsdWUgbj0ib3JhY2xlLmpkZXZpbXBsLnhtbC5vYzRqLmRzLkRhdGFTb3VyY2VzTWlncmF0b3JIZWxwZXIiIHY9IjEwLjEuMy4wLjQiLz4KLSAgIDwvaGFzaD4KLSAgIDxsaXN0IG49Imxpc3RPZkNoaWxkcmVuIiAvPgotPC9qd3M6d29ya3NwYWNlPgpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qZGV2LXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qZGV2ZWxvcGVyLzExLjEuMS4wLjAvcHJvamVjdC54bWwgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWpkZXYtcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2pkZXZlbG9wZXIvMTEuMS4xLjAuMC9wcm9qZWN0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjBiNzdmMy4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWpkZXYtcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2pkZXZlbG9wZXIvMTEuMS4xLjAuMC9wcm9qZWN0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIwMyArMCwwIEBACi08P3htbCB2ZXJzaW9uID0gJzEuMCcgZW5jb2RpbmcgPSAnVVRGLTgnPz4NCi08IS0tDQotICBDb3B5cmlnaHQgMjAwNiBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uDQotDQotICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCi0gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCi0gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotPGpwcjpwcm9qZWN0IHhtbG5zOmpwcj0iaHR0cDovL3htbG5zLm9yYWNsZS5jb20vaWRlL3Byb2plY3QiPg0KLSAgIDxoYXNoIG49ImNvbXBvbmVudC12ZXJzaW9ucyI+DQotICAgIDx2YWx1ZSBuPSJvcmFjbGUuYWRmZHQuY29udHJvbGxlci5hZGZjLnNvdXJjZS5taWdyYXRpb24uTW92ZU1ldGFkYXRhUmVzb3VyY2VzQWdhaW5NaWdyYXRvciIgdj0iMTEuMS4xLjAuMCIvPg0KLSAgICA8dmFsdWUgbj0ib3JhY2xlLmFkZmR0LmNvbnRyb2xsZXIuanNmMi5kaWFncmFtLm1pZ3JhdGUuSnNmTm9kZU1pZ3JhdG9ySGVscGVyIiB2PSIxMS4xLjEuMC4wIi8+DQotICAgIDx2YWx1ZSBuPSJvcmFjbGUuYWRmZHQuY29udHJvbGxlci5zdHJ1dHMuYWRkaW4uZGIuQURGU3RydXRzUHJvamVjdE1pZ3JhdG9yIiB2PSIxMC4xLjMuMC4zOzEwLjEuMy4wLjQ7MTEuMS4xLjAuMCIvPg0KLSAgICA8dmFsdWUgbj0ib3JhY2xlLmFkZmR0LmNvbnRyb2xsZXIuc3RydXRzLmFkZGluLlN0cnV0c1Byb2plY3RNaWdyYXRvciIgdj0iMTAuMS4zLjAuMjsxMC4xLjMuMC4zOzEwLjEuMy4wLjQ7MTEuMS4xLjAuMCIvPg0KLSAgICA8dmFsdWUgbj0ib3JhY2xlLmFkZmR0aW50ZXJuYWwuZHZ0LmRhdGFwcmVzZHQubWlncmF0aW9uLkpzcFByb2plY3RNaWdyYXRvciIgdj0iMTEuMS4xLjAuMCIvPg0KLSAgICA8dmFsdWUgbj0ib3JhY2xlLmFkZmR0aW50ZXJuYWwubW9kZWwuaWRlLm1pZ3JhdGlvbi5Qcm9qZWN0TWlncmF0b3IiIHY9IjExLjEuMS4wLjAuMTsxMS4xLjEuMC4wLjExIi8+DQotICAgIDx2YWx1ZSBuPSJvcmFjbGUuYWRmZHRpbnRlcm5hbC5tb2RlbC5pZGUueG1sZWQubWlncmF0aW9uLkFERk5vZGVNaWdyYXRvciIgdj0iMTEuMS4xLjAuMC41Ii8+DQotICAgIDx2YWx1ZSBuPSJvcmFjbGUuYWRmZHRpbnRlcm5hbC52aWV3LmNvbW1vbi5taWdyYXRpb24ud2l6YXJkcy5NaWdyYXRpb25IZWxwZXIiIHY9IjExLjEuMS4wLjAuMyIvPg0KLSAgICA8dmFsdWUgbj0ib3JhY2xlLmFkZmR0aW50ZXJuYWwudmlldy5yaWNoLmJpbmRpbmcubWlncmF0aW9uLkphclJlc291cmNlTWlncmF0b3IiIHY9IjExLjEuMS4wLjAiLz4NCi0gICAgPHZhbHVlIG49Im9yYWNsZS5ibS5jb21tb25JZGUuUHJvamVjdFVwZ3JhZGVyIiB2PSIxMC4xLjMuMC4zOzEwLjEuMy4wLjQ7MTEuMS4xLjAuMCIvPg0KLSAgICA8dmFsdWUgbj0ib3JhY2xlLmJtLm1pZ3JhdGlvbi5wcm9qZWN0Lk1pZ3JhdG9yUmVnaXN0cnlQcm9qZWN0VXBncmFkZUFkYXB0ZXIiIHY9IjExLjEuMS4wLjAiLz4NCi0gICAgPHZhbHVlIG49Im9yYWNsZS5pZGUubW9kZWwuUHJvamVjdCIgdj0iMTAuMS4zLjAuMjsxMC4xLjMuMC4zOzEwLjEuMy4wLjQ7MTEuMS4xLjAuMCIvPg0KLSAgICA8dmFsdWUgbj0ib3JhY2xlLmlkZS5tb2RlbC5SZXNvdXJjZVBhdGhzTWlncmF0b3IiIHY9IjEwLjEuMy4wLjM7MTAuMS4zLjAuNDsxMS4xLjEuMC4wIi8+DQotICAgIDx2YWx1ZSBuPSJvcmFjbGUuamJvLmR0LmpjbGllbnQubWlncmF0b3IuSkNQcm9qZWN0TWlncmF0b3IiIHY9IjEwLjEuMy4wLjM7MTAuMS4zLjAuNDsxMS4xLjEuMC4wIi8+DQotICAgIDx2YWx1ZSBuPSJvcmFjbGUuamJvLmR0LmpkZXZ4LnVpLmFwcG5hdi5BUFByb2plY3RNaWdyYXRvciIgdj0iMTAuMS4zLjAuMzsxMC4xLjMuMC40OzExLjEuMS4wLjAuNSIvPg0KLSAgICA8dmFsdWUgbj0ib3JhY2xlLmpkZXZlbG9wZXIuZWpiLkVqYk1pZ3JhdG9yIiB2PSIxMC4xLjMuNC4wOzExLjEuMS4wLjAiLz4NCi0gICAgPHZhbHVlIG49Im9yYWNsZS5qZGV2ZWxvcGVyLmxpYnJhcnkuUHJvamVjdExpYnJhcnlNaWdyYXRvciIgdj0iMTEuMS4xLjAuMCIvPg0KLSAgICA8dmFsdWUgbj0ib3JhY2xlLmpkZXZlbG9wZXIubW9kZWwuT3V0cHV0RGlyZWN0b3J5TWlncmF0b3IiIHY9IjExLjEuMS4wLjAiLz4NCi0gICAgPHZhbHVlIG49Im9yYWNsZS5qZGV2aW1wbC5kZXBsb3kuRGVwbG95bWVudFByb2ZpbGVzTWlncmF0b3IiIHY9IjExLjEuMS4wLjAuMSIvPg0KLSAgICA8dmFsdWUgbj0ib3JhY2xlLmpkZXZpbXBsLmRlcGxveS5qcHMuSnBzRGF0YU1pZ3JhdG9yIiB2PSIxMS4xLjEuMC4wIi8+DQotICAgIDx2YWx1ZSBuPSJvcmFjbGUuamRldmltcGwuanNwLkpzcE1pZ3JhdG9yIiB2PSIxMC4xLjMuMC4yOzEwLjEuMy4wLjM7MTAuMS4zLjAuNDsxMS4xLjEuMC4wIi8+DQotICAgIDx2YWx1ZSBuPSJvcmFjbGUuamRldmltcGwuanVuaXQuSlVuaXRNaWdyYXRvciIgdj0iMTEuMS4xLjAuMC4xIi8+DQotICAgIDx2YWx1ZSBuPSJvcmFjbGUuamRldmltcGwub2ZmbGluZWRiLm1pZ3JhdGlvbi5PZmZsaW5lREJQcm9qZWN0TWlncmF0b3IiIHY9IjExLjEuMS4wLjAiLz4NCi0gICAgPHZhbHVlIG49Im9yYWNsZS5qZGV2aW1wbC5vZmZsaW5lZGIubWlncmF0aW9uLk9mZmxpbmVUcmFuc2Zlck1pZ3JhdG9yIiB2PSIxMS4xLjEuMC4wIi8+DQotICAgIDx2YWx1ZSBuPSJvcmFjbGUuamRldmltcGwucmVzb3VyY2VidW5kbGUuWGxpZmZBZGRpbiRYbGlmZk1pZ3JhdG9ySGVscGVyIiB2PSIxMS4xLjEuMC4wIi8+DQotICAgIDx2YWx1ZSBuPSJvcmFjbGUuamRldmltcGwucnVubmVyLlJ1bkNvbmZpZ3VyYXRpb25zTWlncmF0b3IiIHY9IjEwLjEuMy4wLjM7MTAuMS4zLjAuNDsxMS4xLjEuMC4wIi8+DQotICAgIDx2YWx1ZSBuPSJvcmFjbGUuamRldmltcGwud2ViYXBwLmpzcC5saWJyYXJpZXMuSnNwTGlicmFyeU1pZ3JhdG9yIiB2PSIxMS4xLjEuMC4wIi8+DQotICAgIDx2YWx1ZSBuPSJvcmFjbGUuamRldmltcGwud2ViYXBwLldlYkFwcE5vZGVNaWdyYXRvckhlbHBlciIgdj0iMTEuMS4xLjAuMCIvPg0KLSAgICA8dmFsdWUgbj0ib3JhY2xlLmpkZXZpbXBsLndlYnNlcnZpY2VzLldlYlNlcnZpY2VzTWlncmF0b3JIZWxwZXIiIHY9IjEwLjEuMy4wLjI7MTAuMS4zLjAuMzsxMC4xLjMuMC40OzExLjEuMS4wLjAiLz4NCi0gICAgPHZhbHVlIG49Im9yYWNsZS5tb2RlbGVyLmJtbWlncmF0ZS5kaWYuTWlncmF0ZVRvRElGIiB2PSIxMS4xLjEuMC4wIi8+DQotICAgIDx2YWx1ZSBuPSJvcmFjbGUudGlwLnRvb2xzLmlkZS5wbS5hZGRpbi5taWdyYXRvci5QTVByb2plY3RNaWdyYXRvciIgdj0iMTEuMS4xLjAuMCIvPg0KLSAgICA8dmFsdWUgbj0ib3JhY2xlLnRvcGxpbmsuYWRkaW4ubWlncmF0aW9uLlRvcExpbmtQcm9qZWN0TWlncmF0b3IiIHY9IjEwLjEuMy4wLjM7MTAuMS4zLjAuNDsxMS4xLjEuMC4wIi8+DQotICAgIDx2YWx1ZSBuPSJvcmFjbGUudG9wbGluay53b3JrYmVuY2guYWRkaW4ubWlncmF0aW9uLlRvcExpbmtQcm9qZWN0TWlncmF0b3IiIHY9IjExLjEuMS4wLjAiLz4NCi0gICAgPHZhbHVlIG49Im9yYWNsZS53ZWJjZW50ZXIuaW50ZXJuYWwuZHQubWlncmF0aW9uLldlYkNlbnRlclByb2plY3RNaWdyYXRvciIgdj0iMTEuMS4xLjAuMCIvPg0KLSAgIDwvaGFzaD4NCi0gICA8bGlzdCBuPSJjb250ZW50U2V0cyI+DQotICAgICAgPHN0cmluZyB2PSJvcmFjbGUuamRldmVsb3Blci5tb2RlbC5QYXRoc0NvbmZpZ3VyYXRpb24vamF2YUNvbnRlbnRTZXQiLz4NCi0gICAgICA8c3RyaW5nIHY9Im9yYWNsZS5qZGV2ZWxvcGVyLm1vZGVsLkoyZWVTZXR0aW5ncy93ZWJDb250ZW50U2V0Ii8+DQotICAgICAgPHN0cmluZyB2PSJvcmFjbGUuaWRlLm1vZGVsLlJlc291cmNlUGF0aHMvcmVzb3VyY2VzQ29udGVudFNldCIvPg0KLSAgICAgIDxzdHJpbmcgdj0ib3JhY2xlLmpkZXZlbG9wZXIub2ZmbGluZWRiLm1vZGVsLk9mZmxpbmVEQlByb2plY3RTZXR0aW5ncy9vZmZsaW5lREJDb250ZW50U2V0Ii8+DQotICAgICAgPHN0cmluZyB2PSJvcmFjbGUudGlwLnRvb2xzLmlkZS5wbS5hZGRpbi5QTVByb2plY3RTZXR0aW5ncy9JbnRlZ3JhdGlvbl9Db250ZW50Ii8+DQotICAgICAgPHN0cmluZyB2PSJvcmFjbGUuYm0uY29tbW9uSWRlLmRhdGEucHJvamVjdC5Nb2RlbGVyUHJvamVjdFNldHRpbmdzL21vZGVsZXJzQ29udGVudFNldCIvPg0KLSAgICAgIDxzdHJpbmcgdj0ib3JhY2xlLnRvcGxpbmsud29ya2JlbmNoLmFkZGluL3RvcGxpbmtDb250ZW50U2V0Ii8+DQotICAgICAgPHN0cmluZyB2PSJvcmFjbGUudGlwLnRvb2xzLmlkZS5mYWJyaWMuYWRkaW4uU0NBQ29udGVudFNldFByb3ZpZGVyL3NjYS1jb250ZW50Ii8+DQotICAgICAgPHN0cmluZyB2PSJvcmFjbGUuYWRmZHRpbnRlcm5hbC5tb2RlbC5pZGUuc2V0dGluZ3MuQURGTVNldHRpbmdzL2FkZm1Db250ZW50U2V0Ii8+DQotICAgPC9saXN0Pg0KLSAgICAgIDxoYXNoIG49Im9yYWNsZS5hZGZkdGludGVybmFsLm1vZGVsLmlkZS5zZXR0aW5ncy5BREZNU2V0dGluZ3MiPg0KLSAgICAgIDxoYXNoIG49ImFkZm1Db250ZW50U2V0Ij4NCi0gICAgICAgICA8bGlzdCBuPSJwYXR0ZXJuLWZpbHRlcnMiPg0KLSAgICAgICAgICAgIDxzdHJpbmcgdj0iKyoqIi8+DQotICAgICAgICAgPC9saXN0Pg0KLSAgICAgICAgIDxsaXN0IG49InVybC1wYXRoIj4NCi0gICAgICAgICAgICA8dXJsIHBhdGg9ImFkZm1zcmMvIi8+DQotICAgICAgICAgPC9saXN0Pg0KLSAgICAgIDwvaGFzaD4NCi0gICA8L2hhc2g+DQotICAgPGhhc2ggbj0ib3JhY2xlLmJtLmNvbW1vbklkZS5kYXRhLnByb2plY3QuTW9kZWxlclByb2plY3RTZXR0aW5ncyI+DQotICAgICAgPGhhc2ggbj0ibW9kZWxlcnNDb250ZW50U2V0Ij4NCi0gICAgICAgICA8bGlzdCBuPSJ1cmwtcGF0aCI+DQotICAgICAgICAgICAgPHVybCBwYXRoPSJtb2RlbC8iLz4NCi0gICAgICAgICA8L2xpc3Q+DQotICAgICAgPC9oYXNoPg0KLSAgICAgIDx2YWx1ZSBuPSJtb2RlbGVyc1ZlcnNpb24iIHY9IjEwLjEzIi8+DQotICAgPC9oYXNoPg0KLSAgIDxoYXNoIG49Im9yYWNsZS5pZGUubW9kZWwuRGVwZW5kZW5jeUNvbmZpZ3VyYXRpb24iPg0KLSAgICAgIDxsaXN0IG49ImRlcGVuZGVuY3lMaXN0Ii8+DQotICAgPC9oYXNoPg0KLSAgIDxoYXNoIG49Im9yYWNsZS5pZGUubW9kZWwuUmVzb3VyY2VQYXRocyI+DQotICAgICAgPGhhc2ggbj0icmVzb3VyY2VzQ29udGVudFNldCI+DQotICAgICAgICAgPGxpc3Qgbj0icGF0dGVybi1maWx0ZXJzIj4NCi0gICAgICAgICAgICA8c3RyaW5nIHY9IisqKiIvPg0KLSAgICAgICAgIDwvbGlzdD4NCi0gICAgICAgICA8bGlzdCBuPSJ1cmwtcGF0aCIvPg0KLSAgICAgIDwvaGFzaD4NCi0gICA8L2hhc2g+DQotICAgPGhhc2ggbj0ib3JhY2xlLmpkZXZlbG9wZXIuY29tcGlsZXIuT2pjQ29uZmlndXJhdGlvbiI+DQotICAgICAgPHZhbHVlIG49ImFzc2VydGlvbnNFbmFibGVkIiB2PSJ0cnVlIi8+DQotICAgICAgPHZhbHVlIG49ImNvbXBpbGVyLm5hbWUiIHY9Ik9qYyIvPg0KLSAgICAgIDxsaXN0IG49ImNvcHlSZXMiPg0KLSAgICAgICAgIDxzdHJpbmcgdj0iLmphdmEiLz4NCi0gICAgICA8L2xpc3Q+DQotICAgICAgPHZhbHVlIG49ImludGVybmFsRW5jb2RpbmciIHY9IkRlZmF1bHQiLz4NCi0gICAgICA8bGlzdCBuPSJKYXZhYy5jb21tYW5kbGluZS5vcHRpb25saXN0Ij4NCi0gICAgICAgICA8c3RyaW5nIHY9Ii1nIi8+DQotICAgICAgICAgPHN0cmluZyB2PSItWGxpbnQ6YWxsIi8+DQotICAgICAgICAgPHN0cmluZyB2PSItWGxpbnQ6LWNhc3QiLz4NCi0gICAgICAgICA8c3RyaW5nIHY9Ii1YbGludDotZW1wdHkiLz4NCi0gICAgICAgICA8c3RyaW5nIHY9Ii1YbGludDotZmFsbHRocm91Z2giLz4NCi0gICAgICAgICA8c3RyaW5nIHY9Ii1YbGludDotcGF0aCIvPg0KLSAgICAgICAgIDxzdHJpbmcgdj0iLVhsaW50Oi1zZXJpYWwiLz4NCi0gICAgICAgICA8c3RyaW5nIHY9Ii1YbGludDotdW5jaGVja2VkIi8+DQotICAgICAgPC9saXN0Pg0KLSAgICAgIDxsaXN0IG49Ik9qYy5jb21tYW5kbGluZS5vcHRpb25saXN0Ij4NCi0gICAgICAgICA8c3RyaW5nIHY9Ii1nIi8+DQotICAgICAgICAgPHN0cmluZyB2PSItd2FybiIvPg0KLSAgICAgICAgIDxzdHJpbmcgdj0iLW5vd2FybjozMjAiLz4NCi0gICAgICAgICA8c3RyaW5nIHY9Ii1ub3dhcm46MzcyIi8+DQotICAgICAgICAgPHN0cmluZyB2PSItbm93YXJuOjQxMiIvPg0KLSAgICAgICAgIDxzdHJpbmcgdj0iLW5vd2Fybjo0MTMiLz4NCi0gICAgICAgICA8c3RyaW5nIHY9Ii1ub3dhcm46NDE1Ii8+DQotICAgICAgICAgPHN0cmluZyB2PSItbm93YXJuOjQ4NiIvPg0KLSAgICAgICAgIDxzdHJpbmcgdj0iLW5vd2Fybjo0ODciLz4NCi0gICAgICAgICA8c3RyaW5nIHY9Ii1ub3dhcm46NDg5Ii8+DQotICAgICAgICAgPHN0cmluZyB2PSItbm93YXJuOjU1NiIvPg0KLSAgICAgICAgIDxzdHJpbmcgdj0iLW5vd2Fybjo1NTgiLz4NCi0gICAgICAgICA8c3RyaW5nIHY9Ii1ub3dhcm46NTYwIi8+DQotICAgICAgICAgPHN0cmluZyB2PSItbm93YXJuOjU2MSIvPg0KLSAgICAgICAgIDxzdHJpbmcgdj0iLW5vd2Fybjo3MDUiLz4NCi0gICAgICAgICA8c3RyaW5nIHY9Ii1YbGludDotZmFsbHRocm91Z2giLz4NCi0gICAgICAgICA8c3RyaW5nIHY9Ii1YbGludDotc2VyaWFsIi8+DQotICAgICAgICAgPHN0cmluZyB2PSItWGxpbnQ6LXVuY2hlY2tlZCIvPg0KLSAgICAgIDwvbGlzdD4NCi0gICAgICA8dmFsdWUgbj0icmV2ZXJzZUNvcHlSZXMiIHY9InRydWUiLz4NCi0gICAgICA8dmFsdWUgbj0ic2hvd09iamVjdERvdFN0YXRpY1dhcm5pbmdzIiB2PSJ0cnVlIi8+DQotICAgICAgPHZhbHVlIG49InNob3dQYXJ0aWFsSW1wb3J0V2FybmluZ3MiIHY9InRydWUiLz4NCi0gICAgICA8dmFsdWUgbj0ic2hvd1VudXNlZEltcG9ydFdhcm5pbmdzIiB2PSJ0cnVlIi8+DQotICAgPC9oYXNoPg0KLSAgIDxoYXNoIG49Im9yYWNsZS5qZGV2ZWxvcGVyLm1vZGVsLkoyZWVTZXR0aW5ncyI+DQotICAgICAgPHZhbHVlIG49ImoyZWVXZWJBcHBOYW1lIiB2PSJtYXZlbi1nZW5lcmF0ZWQtd2ViYXBwIi8+DQotICAgICAgPHZhbHVlIG49ImoyZWVXZWJDb250ZXh0Um9vdCIgdj0ibWF2ZW4tZ2VuZXJhdGVkLWNvbnRleHQtcm9vdCIvPg0KLSAgICAgIDxoYXNoIG49IndlYkNvbnRlbnRTZXQiPg0KLSAgICAgICAgIDxsaXN0IG49InVybC1wYXRoIiAvPg0KLSAgICAgIDwvaGFzaD4NCi0gICA8L2hhc2g+DQotICAgPGhhc2ggbj0ib3JhY2xlLmpkZXZlbG9wZXIubW9kZWwuUGF0aHNDb25maWd1cmF0aW9uIj4NCi0gICAgICA8aGFzaCBuPSJqYXZhQ29udGVudFNldCI+DQotICAgICAgICA8bGlzdCBuPSJjb25zdGl0dWVudC1zZXRzIiAvPg0KLSAgICAgIDwvaGFzaD4NCi0gICA8L2hhc2g+DQotICAgPGhhc2ggbj0ib3JhY2xlLmpkZXZlbG9wZXIub2ZmbGluZWRiLm1vZGVsLk9mZmxpbmVEQlByb2plY3RTZXR0aW5ncyI+DQotICAgICAgPGhhc2ggbj0ib2ZmbGluZURCQ29udGVudFNldCI+DQotICAgICAgICAgPGxpc3Qgbj0icGF0dGVybi1maWx0ZXJzIj4NCi0gICAgICAgICAgICA8c3RyaW5nIHY9IisqKiIvPg0KLSAgICAgICAgIDwvbGlzdD4NCi0gICAgICAgICA8bGlzdCBuPSJ1cmwtcGF0aCI+DQotICAgICAgICAgICAgPHVybCBwYXRoPSJkYXRhYmFzZS8iLz4NCi0gICAgICAgICA8L2xpc3Q+DQotICAgICAgPC9oYXNoPg0KLSAgIDwvaGFzaD4NCi0gICA8aGFzaCBuPSJvcmFjbGUuamRldmVsb3Blci5ydW5uZXIuUnVuQ29uZmlndXJhdGlvbnMiPg0KLSAgICAgIDxoYXNoIG49InJ1bkNvbmZpZ3VyYXRpb25EZWZpbml0aW9ucyI+DQotICAgICAgICAgPGhhc2ggbj0iRGVmYXVsdCI+DQotICAgICAgICAgICAgPHZhbHVlIG49ImNvbXBpbGVCZWZvcmVSdW4iIHY9ImZhbHNlIi8+DQotICAgICAgICAgICAgPHZhbHVlIG49ImN1c3RvbSIgdj0iZmFsc2UiLz4NCi0gICAgICAgICAgICA8dmFsdWUgbj0ibmFtZSIgdj0iRGVmYXVsdCIvPg0KLSAgICAgICAgIDwvaGFzaD4NCi0gICAgICA8L2hhc2g+DQotICAgICAgPGxpc3Qgbj0icnVuQ29uZmlndXJhdGlvbkxpc3QiPg0KLSAgICAgICAgIDxzdHJpbmcgdj0iRGVmYXVsdCIvPg0KLSAgICAgIDwvbGlzdD4NCi0gICA8L2hhc2g+DQotICAgPGhhc2ggbj0ib3JhY2xlLmpkZXZpbXBsLmNvbmZpZy5KUHJvamVjdExpYnJhcmllcyI+DQotICAgICAgPGxpc3Qgbj0iZXhwb3J0ZWRSZWZlcmVuY2VzIi8+DQotICAgICAgPGhhc2ggbj0iaW50ZXJuYWxEZWZpbml0aW9ucyI+DQotICAgICAgICAgPGxpc3Qgbj0ibGlicmFyeURlZmluaXRpb25zIiAvPg0KLSAgICAgIDwvaGFzaD4NCi0gICAgICA8bGlzdCBuPSJsaWJyYXJ5UmVmZXJlbmNlcyIvPg0KLSAgIDwvaGFzaD4NCi0gICA8aGFzaCBuPSJvcmFjbGUuamRldmltcGwuY29uZmlnLkpQcm9qZWN0UGF0aHMiLz4NCi0gICA8aGFzaCBuPSJvcmFjbGUuamRldmltcGwud2ViYXBwLmpzcC5saWJyYXJpZXMubW9kZWwuUHJvamVjdFRhZ0xpYnJhcmllcyI+DQotICAgICAgPGxpc3Qgbj0idGFnLWxpYnJhcmllcyIvPg0KLSAgIDwvaGFzaD4NCi0gICA8aGFzaCBuPSJvcmFjbGUudGlwLnRvb2xzLmlkZS5mYWJyaWMuYWRkaW4uU0NBQ29udGVudFNldFByb3ZpZGVyIj4NCi0gICAgICA8aGFzaCBuPSJzY2EtY29udGVudCIvPg0KLSAgIDwvaGFzaD4NCi0gICA8aGFzaCBuPSJvcmFjbGUudGlwLnRvb2xzLmlkZS5wbS5hZGRpbi5QTVByb2plY3RTZXR0aW5ncyI+DQotICAgICA8aGFzaCBuPSJJbnRlZ3JhdGlvbl9Db250ZW50Ij4NCi0gICAgICAgPGxpc3Qgbj0icGF0dGVybi1maWx0ZXJzIj4NCi0gICAgICAgICA8c3RyaW5nIHY9IisqKiIvPg0KLSAgICAgICA8L2xpc3Q+DQotICAgICA8L2hhc2g+DQotICAgPC9oYXNoPg0KLSAgIDxoYXNoIG49Im9yYWNsZS50b3BsaW5rLndvcmtiZW5jaC5hZGRpbiI+DQotICAgICAgPGhhc2ggbj0idG9wbGlua0NvbnRlbnRTZXQiPg0KLSAgICAgICAgIDxsaXN0IG49InBhdHRlcm4tZmlsdGVycyI+DQotICAgICAgICAgICAgPHN0cmluZyB2PSIrKioiLz4NCi0gICAgICAgICA8L2xpc3Q+DQotICAgICAgICAgPGxpc3Qgbj0idXJsLXBhdGgiPg0KLSAgICAgICAgICAgIDx1cmwgcGF0aD0idG9wbGluay8iLz4NCi0gICAgICAgICA8L2xpc3Q+DQotICAgICAgPC9oYXNoPg0KLSAgIDwvaGFzaD4NCi08L2pwcjpwcm9qZWN0Pg0KLQ0KLQ0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamRldi1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamRldmVsb3Blci8xMS4xLjEuMC4wL3dvcmtzcGFjZS54bWwgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWpkZXYtcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2pkZXZlbG9wZXIvMTEuMS4xLjAuMC93b3Jrc3BhY2UueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MmNiZWFlLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamRldi1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamRldmVsb3Blci8xMS4xLjEuMC4wL3dvcmtzcGFjZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi08P3htbCB2ZXJzaW9uID0gJzEuMCcgZW5jb2RpbmcgPSAnVVRGLTgnPz4NCi08IS0tDQotICBDb3B5cmlnaHQgMjAwNiBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uDQotDQotICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCi0gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCi0gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotPGp3czp3b3Jrc3BhY2UgeG1sbnM6andzPSJodHRwOi8veG1sbnMub3JhY2xlLmNvbS9pZGUvcHJvamVjdCI+DQotICAgPGhhc2ggbj0iY29tcG9uZW50LXZlcnNpb25zIj4NCi0gICAgICA8dmFsdWUgbj0ib3JhY2xlLmFkZi5zaGFyZS5kdC5taWdyYXRpb24uanBzLkphem5DcmVkU3RvcmVNaWdyYXRvckhlbHBlciIgdj0iMTEuMS4xLjAuMCIvPg0KLSAgICAgIDx2YWx1ZSBuPSJvcmFjbGUuYWRmZHRpbnRlcm5hbC5tb2RlbC5pZGUuc2VjdXJpdHkud2l6YXJkLkFkZlNlY3VyaXR5TWlncmF0b3IiIHY9IjExLjEuMS4wLjAiLz4NCi0gICAgICA8dmFsdWUgbj0ib3JhY2xlLmlkZS5tb2RlbC5Qcm9qZWN0IiB2PSIxMC4xLjMuMC40OzExLjEuMS4wLjAiLz4NCi0gICAgICA8dmFsdWUgbj0ib3JhY2xlLmpkZXZpbXBsLnJ1bm5lci5vYzRqLkVtYmVkZGVkU2VydmVyTWlncmF0b3JIZWxwZXIiIHY9IjExLjEuMS4wLjAiLz4NCi0gICAgICA8dmFsdWUgbj0ib3JhY2xlLmpkZXZpbXBsLndlYnNlcnZpY2VzLldlYlNlcnZpY2VzTWlncmF0b3JIZWxwZXIiIHY9IjExLjEuMS4wLjAiLz4NCi0gICAgICA8dmFsdWUgbj0ib3JhY2xlLmpkZXZpbXBsLnhtbC5vYzRqLmRzLkRhdGFTb3VyY2VzTWlncmF0b3JIZWxwZXIiIHY9IjExLjEuMS4wLjAiLz4NCi0gICAgICA8dmFsdWUgbj0ib3JhY2xlLmpkZXZpbXBsLnhtbC5vYzRqLmpwcy5KcHNDb25maWdNaWdyYXRvckhlbHBlciIgdj0iMTEuMS4xLjAuMCIvPg0KLSAgICAgIDx2YWx1ZSBuPSJvcmFjbGUubWRzLmludGVybmFsLmR0LmlkZS5taWdyYXRvci5NRFNDb25maWdNaWdyYXRvckhlbHBlciIgdj0iMTEuMS4xLjAuMCIvPg0KLSAgICAgIDx2YWx1ZSBuPSJvcmFjbGUud2ViY2VudGVyLmludGVybmFsLmR0Lm1pZ3JhdGlvbi5XZWJDZW50ZXJXb3Jrc3BhY2VNaWdyYXRvciIgdj0iMTEuMS4xLjAuMCIvPg0KLSAgIDwvaGFzaD4NCi0gICA8bGlzdCBuPSJsaXN0T2ZDaGlsZHJlbiIgLz4NCi08L2p3czp3b3Jrc3BhY2U+DQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qc2RvYy1wbHVnaW4vTElDRU5TRS50eHQgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWpzZG9jLXBsdWdpbi9MSUNFTlNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDY0NTY5NS4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWpzZG9jLXBsdWdpbi9MSUNFTlNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDIwMiArMCwwIEBACi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0Ci0gICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvCi0KLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTgotCi0gICAxLiBEZWZpbml0aW9ucy4KLQotICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwKLSAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgotCi0gICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgotCi0gICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsCi0gICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCi0gICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLAotICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlCi0gICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgotICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlCi0gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5LgotCi0gICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLgotCi0gICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywKLSAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24KLSAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCi0KLSAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsCi0gICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0Ci0gICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sCi0gICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuCi0KLSAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yCi0gICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhCi0gICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKLSAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuCi0KLSAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKLSAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUKLSAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMKLSAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCi0gICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4KLSAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwKLSAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCi0KLSAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nCi0gICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCi0gICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkKLSAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIKLSAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgotICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiCi0gICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50Ci0gICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bwotICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywKLSAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlCi0gICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKLSAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlCi0gICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiIKLQotICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKLSAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZAotICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCi0KLSAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKLSAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLAotICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCi0gICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLgotCi0gICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKLSAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLAotICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUKLSAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCi0gICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpCi0gICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQotICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKLSAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsKLSAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0Ci0gICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCi0gICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUKLSAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4KLQotICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUKLSAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dAotICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKLSAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotCi0gICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgotICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kCi0KLSAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKLSAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQKLQotICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCi0gICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZAotICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssCi0gICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgotICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQKLQotICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCi0gICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdAotICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZAotICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAotICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQotICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkCi0gICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgotICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLAotICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQKLSAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKLSAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kCi0gICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24KLSAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQotICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZAotICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZAotICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KLQotICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kCi0gICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCi0gICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yCi0gICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwKLSAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAotICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4KLQotICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAotICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrCi0gICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCi0gICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5Ci0gICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZAotICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgotCi0gICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlCi0gICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCi0gICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUKLSAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLgotCi0gICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IKLSAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gKLSAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucwotICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQotICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlCi0gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkKLSAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KLQotICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksCi0gICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKLSAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5Ci0gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQotICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAotICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhCi0gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlCi0gICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCi0gICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbAotICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcgotICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgotCi0gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nCi0gICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAotICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwKLSAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzCi0gICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQotICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYKLSAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwKLSAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQotICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbgotICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuCi0KLSAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUwotCi0gICBBUFBFTkRJWDogSG93IHRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmsuCi0KLSAgICAgIFRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmssIGF0dGFjaCB0aGUgZm9sbG93aW5nCi0gICAgICBib2lsZXJwbGF0ZSBub3RpY2UsIHdpdGggdGhlIGZpZWxkcyBlbmNsb3NlZCBieSBicmFja2V0cyAiW10iCi0gICAgICByZXBsYWNlZCB3aXRoIHlvdXIgb3duIGlkZW50aWZ5aW5nIGluZm9ybWF0aW9uLiAoRG9uJ3QgaW5jbHVkZQotICAgICAgdGhlIGJyYWNrZXRzISkgIFRoZSB0ZXh0IHNob3VsZCBiZSBlbmNsb3NlZCBpbiB0aGUgYXBwcm9wcmlhdGUKLSAgICAgIGNvbW1lbnQgc3ludGF4IGZvciB0aGUgZmlsZSBmb3JtYXQuIFdlIGFsc28gcmVjb21tZW5kIHRoYXQgYQotICAgICAgZmlsZSBvciBjbGFzcyBuYW1lIGFuZCBkZXNjcmlwdGlvbiBvZiBwdXJwb3NlIGJlIGluY2x1ZGVkIG9uIHRoZQotICAgICAgc2FtZSAicHJpbnRlZCBwYWdlIiBhcyB0aGUgY29weXJpZ2h0IG5vdGljZSBmb3IgZWFzaWVyCi0gICAgICBpZGVudGlmaWNhdGlvbiB3aXRoaW4gdGhpcmQtcGFydHkgYXJjaGl2ZXMuCi0KLSAgIENvcHlyaWdodCBbeXl5eV0gW25hbWUgb2YgY29weXJpZ2h0IG93bmVyXQotCi0gICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qc2RvYy1wbHVnaW4vTk9USUNFLnR4dCBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtanNkb2MtcGx1Z2luL05PVElDRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhM2RiZDYuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qc2RvYy1wbHVnaW4vTk9USUNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLT09ICBOT1RJQ0UgZmlsZSBjb3JyZXNwb25kaW5nIHRvIHNlY3Rpb24gNChkKSBvZiB0aGUgQXBhY2hlIExpY2Vuc2UsICAgPT0KLT09ICBWZXJzaW9uIDIuMCwgaW4gdGhpcyBjYXNlIGZvciB0aGUgQXBhY2hlIE15RmFjZXMgTWF2ZW4gUGx1Z2lucyAgICAgPT0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSAKLVRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuCi0KLVBvcnRpb25zIG9mIHRoaXMgc29mdHdhcmUgd2VyZSBvcmlnaW5hbGx5IGJhc2VkIG9uIHRoZSBmb2xsb3dpbmc6Ci0KLSAtIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDA2LCBPcmFjbGUgQ29ycCwgPGh0dHA6Ly93d3cub3JhY2xlLmNvbS8+LgotYW5kIGFyZSBsaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gdW5kZXIgdGhlIAotIlNvZnR3YXJlIEdyYW50IGFuZCBDb3Jwb3JhdGUgQ29udHJpYnV0aW9uIExpY2Vuc2UgQWdyZWVtZW50IgotCi1TZWUgdGhlIExJQ0VOU0UudHh0IGZpbGUgZm9yIGluZm9ybWF0aW9uIG9uIGFsbCBsaWNlbnNlcyAKLWFzc29jaWF0ZWQgd2l0aCB0aGlzIHNvZnR3YXJlLgpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qc2RvYy1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL05PVElDRSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtanNkb2MtcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9OT1RJQ0UKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhM2RiZDYuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qc2RvYy1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL05PVElDRQorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLT09ICBOT1RJQ0UgZmlsZSBjb3JyZXNwb25kaW5nIHRvIHNlY3Rpb24gNChkKSBvZiB0aGUgQXBhY2hlIExpY2Vuc2UsICAgPT0KLT09ICBWZXJzaW9uIDIuMCwgaW4gdGhpcyBjYXNlIGZvciB0aGUgQXBhY2hlIE15RmFjZXMgTWF2ZW4gUGx1Z2lucyAgICAgPT0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSAKLVRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuCi0KLVBvcnRpb25zIG9mIHRoaXMgc29mdHdhcmUgd2VyZSBvcmlnaW5hbGx5IGJhc2VkIG9uIHRoZSBmb2xsb3dpbmc6Ci0KLSAtIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDA2LCBPcmFjbGUgQ29ycCwgPGh0dHA6Ly93d3cub3JhY2xlLmNvbS8+LgotYW5kIGFyZSBsaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gdW5kZXIgdGhlIAotIlNvZnR3YXJlIEdyYW50IGFuZCBDb3Jwb3JhdGUgQ29udHJpYnV0aW9uIExpY2Vuc2UgQWdyZWVtZW50IgotCi1TZWUgdGhlIExJQ0VOU0UudHh0IGZpbGUgZm9yIGluZm9ybWF0aW9uIG9uIGFsbCBsaWNlbnNlcyAKLWFzc29jaWF0ZWQgd2l0aCB0aGlzIHNvZnR3YXJlLgpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1wbHVnaW4tcGFyZW50L0xJQ0VOU0UudHh0IGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1wbHVnaW4tcGFyZW50L0xJQ0VOU0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjQ1Njk1Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtcGx1Z2luLXBhcmVudC9MSUNFTlNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDIwMiArMCwwIEBACi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0Ci0gICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvCi0KLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTgotCi0gICAxLiBEZWZpbml0aW9ucy4KLQotICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwKLSAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgotCi0gICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgotCi0gICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsCi0gICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCi0gICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLAotICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlCi0gICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgotICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlCi0gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5LgotCi0gICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLgotCi0gICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywKLSAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24KLSAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCi0KLSAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsCi0gICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0Ci0gICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sCi0gICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuCi0KLSAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yCi0gICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhCi0gICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKLSAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuCi0KLSAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKLSAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUKLSAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMKLSAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCi0gICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4KLSAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwKLSAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCi0KLSAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nCi0gICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCi0gICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkKLSAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIKLSAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgotICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiCi0gICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50Ci0gICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bwotICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywKLSAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlCi0gICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKLSAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlCi0gICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiIKLQotICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKLSAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZAotICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCi0KLSAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKLSAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLAotICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCi0gICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLgotCi0gICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKLSAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLAotICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUKLSAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCi0gICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpCi0gICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQotICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKLSAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsKLSAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0Ci0gICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCi0gICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUKLSAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4KLQotICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUKLSAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dAotICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKLSAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotCi0gICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgotICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kCi0KLSAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKLSAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQKLQotICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCi0gICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZAotICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssCi0gICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgotICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQKLQotICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCi0gICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdAotICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZAotICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAotICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQotICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkCi0gICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgotICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLAotICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQKLSAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKLSAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kCi0gICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24KLSAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQotICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZAotICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZAotICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KLQotICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kCi0gICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCi0gICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yCi0gICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwKLSAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAotICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4KLQotICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAotICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrCi0gICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCi0gICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5Ci0gICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZAotICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgotCi0gICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlCi0gICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCi0gICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUKLSAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLgotCi0gICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IKLSAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gKLSAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucwotICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQotICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlCi0gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkKLSAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KLQotICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksCi0gICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKLSAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5Ci0gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQotICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAotICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhCi0gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlCi0gICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCi0gICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbAotICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcgotICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgotCi0gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nCi0gICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAotICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwKLSAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzCi0gICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQotICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYKLSAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwKLSAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQotICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbgotICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuCi0KLSAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUwotCi0gICBBUFBFTkRJWDogSG93IHRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmsuCi0KLSAgICAgIFRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmssIGF0dGFjaCB0aGUgZm9sbG93aW5nCi0gICAgICBib2lsZXJwbGF0ZSBub3RpY2UsIHdpdGggdGhlIGZpZWxkcyBlbmNsb3NlZCBieSBicmFja2V0cyAiW10iCi0gICAgICByZXBsYWNlZCB3aXRoIHlvdXIgb3duIGlkZW50aWZ5aW5nIGluZm9ybWF0aW9uLiAoRG9uJ3QgaW5jbHVkZQotICAgICAgdGhlIGJyYWNrZXRzISkgIFRoZSB0ZXh0IHNob3VsZCBiZSBlbmNsb3NlZCBpbiB0aGUgYXBwcm9wcmlhdGUKLSAgICAgIGNvbW1lbnQgc3ludGF4IGZvciB0aGUgZmlsZSBmb3JtYXQuIFdlIGFsc28gcmVjb21tZW5kIHRoYXQgYQotICAgICAgZmlsZSBvciBjbGFzcyBuYW1lIGFuZCBkZXNjcmlwdGlvbiBvZiBwdXJwb3NlIGJlIGluY2x1ZGVkIG9uIHRoZQotICAgICAgc2FtZSAicHJpbnRlZCBwYWdlIiBhcyB0aGUgY29weXJpZ2h0IG5vdGljZSBmb3IgZWFzaWVyCi0gICAgICBpZGVudGlmaWNhdGlvbiB3aXRoaW4gdGhpcmQtcGFydHkgYXJjaGl2ZXMuCi0KLSAgIENvcHlyaWdodCBbeXl5eV0gW25hbWUgb2YgY29weXJpZ2h0IG93bmVyXQotCi0gICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1wbHVnaW4tcGFyZW50L05PVElDRS50eHQgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLXBsdWdpbi1wYXJlbnQvTk9USUNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmEzZGJkNi4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLXBsdWdpbi1wYXJlbnQvTk9USUNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLT09ICBOT1RJQ0UgZmlsZSBjb3JyZXNwb25kaW5nIHRvIHNlY3Rpb24gNChkKSBvZiB0aGUgQXBhY2hlIExpY2Vuc2UsICAgPT0KLT09ICBWZXJzaW9uIDIuMCwgaW4gdGhpcyBjYXNlIGZvciB0aGUgQXBhY2hlIE15RmFjZXMgTWF2ZW4gUGx1Z2lucyAgICAgPT0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSAKLVRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuCi0KLVBvcnRpb25zIG9mIHRoaXMgc29mdHdhcmUgd2VyZSBvcmlnaW5hbGx5IGJhc2VkIG9uIHRoZSBmb2xsb3dpbmc6Ci0KLSAtIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDA2LCBPcmFjbGUgQ29ycCwgPGh0dHA6Ly93d3cub3JhY2xlLmNvbS8+LgotYW5kIGFyZSBsaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gdW5kZXIgdGhlIAotIlNvZnR3YXJlIEdyYW50IGFuZCBDb3Jwb3JhdGUgQ29udHJpYnV0aW9uIExpY2Vuc2UgQWdyZWVtZW50IgotCi1TZWUgdGhlIExJQ0VOU0UudHh0IGZpbGUgZm9yIGluZm9ybWF0aW9uIG9uIGFsbCBsaWNlbnNlcyAKLWFzc29jaWF0ZWQgd2l0aCB0aGlzIHNvZnR3YXJlLgpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1wbHVnaW4tcGFyZW50L3BvbS54bWwgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLXBsdWdpbi1wYXJlbnQvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGEwMjA2NS4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLXBsdWdpbi1wYXJlbnQvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE2NyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICAgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gICAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICAgIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICAgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gICAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gICAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gICAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICAgIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhLS0KLSAgLSBQYXJlbnQgcG9tIG9mIGFsbCB0aGUgbXlmYWNlcyBjdXN0b20gbWF2ZW4tcGx1Z2luIHN1YnByb2plY3RzIHRoYXQgaGVscAotICAgIHRvIGJ1aWxkIG90aGVyIG15ZmFjZXMgcHJvamVjdHMuCi0gIC0KLSAgLSBUaGlzIHByb2plY3QgYWxzbyBidWlsZHMgYSBjb21tb24gYnVpbGQtdG9vbHMgc2l0ZS4KLSAgLS0+Ci0KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgotICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0KLSAgPHBhcmVudD4KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXM8L2dyb3VwSWQ+Ci0gICAgPGFydGlmYWN0SWQ+bXlmYWNlczwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj4xMDwvdmVyc2lvbj4KLSAgPC9wYXJlbnQ+Ci0KLSAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHM8L2dyb3VwSWQ+Ci0gIDxhcnRpZmFjdElkPm15ZmFjZXMtcGx1Z2luLXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgPHZlcnNpb24+MS4wLjYtU05BUFNIT1Q8L3ZlcnNpb24+Ci0gIDxwYWNrYWdpbmc+cG9tPC9wYWNrYWdpbmc+Ci0gIDxuYW1lPkFwYWNoZSBNeUZhY2VzIEJ1aWxkdG9vbHMgTWF2ZW4yIFBsdWdpbiBQYXJlbnQ8L25hbWU+Ci0gIDx1cmw+aHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9idWlsZC10b29scy9wbHVnaW5zPC91cmw+Ci0KLSAgPGlzc3VlTWFuYWdlbWVudD4KLSAgICA8c3lzdGVtPmppcmE8L3N5c3RlbT4KLSAgICA8dXJsPmh0dHA6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9NWUZBQ0VTPC91cmw+Ci0gIDwvaXNzdWVNYW5hZ2VtZW50PgotCi0gIDxpbmNlcHRpb25ZZWFyPjIwMDE8L2luY2VwdGlvblllYXI+Ci0KLSAgPGJ1aWxkPgotICAgIDxwbHVnaW5NYW5hZ2VtZW50PgotICAgICAgPHBsdWdpbnM+Ci0gICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tamFyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICA8dmVyc2lvbj4yLjI8L3ZlcnNpb24+Ci0gICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICA8YXJjaGl2ZT4KLSAgICAgICAgICAgICAgPG1hbmlmZXN0PgotICAgICAgICAgICAgICAgIDxhZGREZWZhdWx0SW1wbGVtZW50YXRpb25FbnRyaWVzPnRydWU8L2FkZERlZmF1bHRJbXBsZW1lbnRhdGlvbkVudHJpZXM+Ci0gICAgICAgICAgICAgIDwvbWFuaWZlc3Q+Ci0gICAgICAgICAgICA8L2FyY2hpdmU+Ci0gICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICA8L3BsdWdpbj4KLSAgICAgIDwvcGx1Z2lucz4KLSAgICA8L3BsdWdpbk1hbmFnZW1lbnQ+Ci0KLSAgICA8cGx1Z2lucz4KLSAgICAgIDxwbHVnaW4+Ci0gICAgICAgIDwhLS0KLSAgICAgICAgICAtIENvcHkgTElDRU5TRS50eHQgYW5kIE5PVElDRS50eHQgc28gdGhhdCB0aGV5IGFyZSBpbmNsdWRlZAotICAgICAgICAgIC0gaW4gdGhlIC1qYXZhZG9jIGphciBmaWxlIGZvciB0aGUgY29tcG9uZW50LgotICAgICAgICAgIC0tPgotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+Ci0gICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFudHJ1bi1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgIDxleGVjdXRpb25zPgotICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICA8aWQ+amF2YWRvYy5yZXNvdXJjZXM8L2lkPgotICAgICAgICAgICAgPHBoYXNlPmdlbmVyYXRlLXNvdXJjZXM8L3BoYXNlPgotICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICA8Z29hbD5ydW48L2dvYWw+Ci0gICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgIDx0YXNrcz4KLSAgICAgICAgICAgICAgICA8Y29weSB0b2Rpcj0iJHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vYXBpZG9jcy9NRVRBLUlORiI+Ci0gICAgICAgICAgICAgICAgICA8ZmlsZXNldCBkaXI9IiR7YmFzZWRpcn0iPgotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJMSUNFTlNFLnR4dCIgLz4KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iTk9USUNFLnR4dCIgLz4KLSAgICAgICAgICAgICAgICAgIDwvZmlsZXNldD4KLSAgICAgICAgICAgICAgICA8L2NvcHk+Ci0gICAgICAgICAgICAgIDwvdGFza3M+Ci0gICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgIDwvZXhlY3V0aW9ucz4KLSAgICAgIDwvcGx1Z2luPgotICAgICAgPHBsdWdpbj4KLSAgICAgICAgPCEtLQotICAgICAgICAgIC0gTWFrZSBhIGNoZWNrc3R5bGUgdmlvbGF0aW9uIGEgY29tcGlsZSBlcnJvci4gTm90ZSB0aGF0IGlmIGEgY29tcGlsZSBlcnJvciBvY2N1cnMsCi0gICAgICAgICAgLSBmdXJ0aGVyIGluZm9ybWF0aW9uIGNhbiBiZSBmb3VuZCBpbiB0YXJnZXQvc2l0ZS9jaGVja3N0eWxlLmh0bWwgKHByZXNlbnQgZXZlbiB3aGVuCi0gICAgICAgICAgLSBqdXN0IHRoZSBjb21waWxlIGdvYWwgYW5kIG5vdCB0aGUgc2l0ZSBnb2FsIGhhcyBiZWVuIHJ1bikuIE5vdGUgYWxzbyB0aGF0IGNoaWxkCi0gICAgICAgICAgLSBwcm9qZWN0cyBtYXkgcmVkZWNsYXJlIHRoaXMgcGx1Z2luIGFuZCBwcm92aWRlIGRpZmZlcmVudCBjb25maWd1cmF0aW9uIHNldHRpbmdzCi0gICAgICAgICAgLSB0byB1c2UgZGlmZmVyZW50IGNoZWNrcyAobW9yZSBvciBsZXNzIHN0cmljdCB0aGFuIHRoZSBkZWZhdWx0KS4KLSAgICAgICAgICAtLT4KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgotICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1jaGVja3N0eWxlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPCEtLQotICAgICAgICA8ZXhlY3V0aW9ucz4KLSAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgPGlkPnZlcmlmeS1zdHlsZTwvaWQ+Ci0gICAgICAgICAgICA8cGhhc2U+dmVyaWZ5PC9waGFzZT4KLSAgICAgICAgICAgIDxnb2Fscz48Z29hbD5jaGVjazwvZ29hbD48L2dvYWxzPgotICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICAgIC0tPgotICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICA8Y29uZmlnTG9jYXRpb24+ZGVmYXVsdC9teWZhY2VzLWNoZWNrcy1zdGFuZGFyZC54bWw8L2NvbmZpZ0xvY2F0aW9uPgotICAgICAgICAgIDxoZWFkZXJMb2NhdGlvbj5kZWZhdWx0L215ZmFjZXMtaGVhZGVyLXNwYWNlcy50eHQ8L2hlYWRlckxvY2F0aW9uPgotICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICA8L3BsdWdpbj4KLSAgICA8L3BsdWdpbnM+Ci0gIDwvYnVpbGQ+Ci0KLSAgPHJlcG9ydGluZz4KLSAgICA8cGx1Z2lucz4KLSAgICAgIDxwbHVnaW4+Ci0gICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXBtZC1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgIDx2ZXJzaW9uPjIuMzwvdmVyc2lvbj4KLSAgICAgICAgPHJlcG9ydFNldHM+Ci0gICAgICAgICAgPHJlcG9ydFNldCAvPgotICAgICAgICA8L3JlcG9ydFNldHM+Ci0gICAgICAgIDwhLS0KLSAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgPHJ1bGVzZXRzPgotICAgICAgICAgICAgPHJ1bGVzZXQ+L3J1bGVzZXRzL2Jhc2ljLnhtbDwvcnVsZXNldD4KLSAgICAgICAgICAgIDxydWxlc2V0Pi9ydWxlc2V0cy91bnVzZWRjb2RlLnhtbDwvcnVsZXNldD4KLSAgICAgICAgICA8L3J1bGVzZXRzPgotICAgICAgICAgIDxsaW5rWHJlZj50cnVlPC9saW5rWHJlZj4KLSAgICAgICAgICA8bWluaW11bVRva2Vucz4xMDA8L21pbmltdW1Ub2tlbnM+Ci0gICAgICAgICAgPHRhcmdldEpkaz4xLjU8L3RhcmdldEpkaz4KLSAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAtLT4KLSAgICAgIDwvcGx1Z2luPgotICAgICAgPHBsdWdpbj4KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgotICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1jaGVja3N0eWxlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgPGNvbmZpZ0xvY2F0aW9uPmRlZmF1bHQvbXlmYWNlcy1jaGVja3MtbWluaW1hbC54bWw8L2NvbmZpZ0xvY2F0aW9uPgotICAgICAgICAgIDxoZWFkZXJMb2NhdGlvbj5kZWZhdWx0L215ZmFjZXMtaGVhZGVyLXNwYWNlcy50eHQ8L2hlYWRlckxvY2F0aW9uPgotICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICA8L3BsdWdpbj4KLSAgICA8L3BsdWdpbnM+Ci0gIDwvcmVwb3J0aW5nPgotCi0gIDxzY20+Ci0gICAgPGNvbm5lY3Rpb24+c2NtOnN2bjpodHRwOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL215ZmFjZXMvbXlmYWNlcy1idWlsZC10b29scy90cnVuay9tYXZlbjItcGx1Z2lucy9teWZhY2VzLXBsdWdpbi1wYXJlbnQ8L2Nvbm5lY3Rpb24+Ci0gICAgPGRldmVsb3BlckNvbm5lY3Rpb24+c2NtOnN2bjpodHRwczovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9teWZhY2VzL215ZmFjZXMtYnVpbGQtdG9vbHMvdHJ1bmsvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1wbHVnaW4tcGFyZW50PC9kZXZlbG9wZXJDb25uZWN0aW9uPgotICAgIDx1cmw+aHR0cDovL3N2bi5hcGFjaGUub3JnL3ZpZXd2Yy9teWZhY2VzL215ZmFjZXMtYnVpbGQtdG9vbHMvdHJ1bmsvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1wbHVnaW4tcGFyZW50PC91cmw+Ci0gIDwvc2NtPgotCi0gIDxkaXN0cmlidXRpb25NYW5hZ2VtZW50PgotICAgIDxzaXRlPgotICAgICAgPGlkPmFwYWNoZS1zaXRlPC9pZD4KLSAgICAgIDx1cmw+c2NwZXhlOi8vcGVvcGxlLmFwYWNoZS5vcmcvd3d3L215ZmFjZXMuYXBhY2hlLm9yZy9idWlsZC10b29scy9wbHVnaW5zPC91cmw+Ci0gICAgPC9zaXRlPgotICA8L2Rpc3RyaWJ1dGlvbk1hbmFnZW1lbnQ+Ci0KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtcGx1Z2luLXBhcmVudC9zcmMvc2l0ZS9hcHQvaW5kZXguYXB0IGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1wbHVnaW4tcGFyZW50L3NyYy9zaXRlL2FwdC9pbmRleC5hcHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiZWYxMTQuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1wbHVnaW4tcGFyZW50L3NyYy9zaXRlL2FwdC9pbmRleC5hcHQKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0gLS0tLS0tCi0gTXlmYWNlcyBCdWlsZCBUb29scwotIC0tLS0tLQotCi1PdmVydmlldwotCi0gIE15RmFjZXMgcHJvamVjdHMgYWxsIHVzZSBNYXZlbiAyLnggdG8gY29tcGlsZSB0aGUgY29kZSwgcnVuIHRlc3RpbmcsIGV0Yy4gSG93ZXZlciBzb21ldGltZXMKLSAgdGhlIHN0YW5kYXJkIG1hdmVuIHBsdWdpbnMgYXJlIG5vdCBlbm91Z2ggZm9yIHRoZSBzcGVjaWFsIHJlcXVpcmVtZW50cyBvZiBNeUZhY2VzIHByb2plY3RzLgotICBUaGVyZWZvcmUgYSBudW1iZXIgb2YgY3VzdG9tIE1hdmVuIHBsdWdpbnMgaGF2ZSBiZWVuIGNyZWF0ZWQuCi0KLVBsdWdpbnMKLQotKiBNeUZhY2VzLUJ1aWxkZXItUGx1Z2luCi0KLSAgVXNlZCB0byBidWlsZCBNeUZhY2VzIENvcmUgMS4xLjYgYW5kIGxhdGVyLCBhbmQgTXlGYWNlcyBUb21haGF3ayAxLjEuNyBhbmQgbGF0ZXIuCi0gIE1heSBiZSB1c2VkIHRvIGJ1aWxkIG90aGVyIHByb2plY3RzIGluIHRoZSBmdXR1cmUuCi0KLSAgVGhpcyBwbHVnaW4gdXNlcyBhbm5vdGF0aW9ucyBvbiBqYXZhIHNvdXJjZSBmaWxlcyB0byBkaXNjb3ZlciB3aGljaCBhcmUgSlNGCi0gIGNvbXBvbmVudHMsIHJlbmRlcmVycywgZXRjLiBUaGlzIGluZm9ybWF0aW9uIGlzIHVzZWQgdG8gYXV0b21hdGljYWxseSBnZW5lcmF0ZSBhCi0gIHN1aXRhYmxlIGZhY2VzLWNvbmZpZy54bWwgYW5kIEpTUCAiLnRsZCIgZmlsZXMuIFRoZSBhbm5vdGF0aW9ucyBjYW4gYmUgInJlYWwiCi0gIGphdmExLjUgYW5ub3RhdGlvbnMsIG9yIGRvY2xldC1zdHlsZSBhbm5vdGF0aW9ucy4KLQotICBJbiBhZGRpdGlvbiwgdGhlIHBsdWdpbiBjYW4gYXV0b21hdGljYWxseSBnZW5lcmF0ZSBKU1AgdGFnIGNsYXNzZXMgZm9yIEpTRiBjb21wb25lbnRzLAotICBhdXRvbWF0aWNhbGx5IGNvcHlpbmcgdGFnIGF0dHJpYnV0ZXMgb250byBhIEpTRiBjb21wb25lbnQgaW5zdGFuY2UuCi0KLSAgQW5kIHdoZW4gc2VsZWN0ZWQsIHRoZSBidWlsZGVyIHBsdWdpbiBjYW4gYWxzbyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlIEpTRiBjb21wb25lbnQKLSAgY2xhc3NlcywgZGVmaW5pbmcgImJvaWxlcnBsYXRlIiBzZXR0ZXIvZ2V0dGVyIGFuZCBzYXZlL3Jlc3RvcmUgbWV0aG9kcyBiYXNlZCB1cG9uIHRoZQotICBhYnN0cmFjdCBwcm9wZXJ0aWVzIGRlZmluZWQgb24gYW4gYW5jZXN0b3IgY2xhc3MuCi0KLSAgVGhpcyBwbHVnaW4gbWF5IGFsc28gYmUgdXNlZnVsIGZvciBwcm9qZWN0cyBleHRlcm5hbCB0byB0aGUgTXlGYWNlcyBwcm9qZWN0LgotCi0qIE15RmFjZXMtQnVpbGRlci1Bbm5vdGF0aW9ucwotCi0gIEEgc2V0IG9mIGphdmExLjUgQW5ub3RhdGlvbiBjbGFzc2VzIGZvciB1c2Ugd2l0aCB0aGUgTXlGYWNlcy1CdWlsZGVyLVBsdWdpbi4KLQotKiBNeUZhY2VzLUZhY2VzLVBsdWdpbgotCi0gIEEgcmVmYWN0b3JlZC9yZW5hbWVkIHZlcnNpb24gb2YgdGhlIE15RmFjZXMtVHJpbmlkYWQtUGx1Z2luIHdob3NlIHNvdXJjZSBpcyB3aXRoaW4KLSAgdGhlIHRyaW5pZGFkIHByb2plY3QuCi0KLSAgVGhpcyBwbHVnaW4gaXMgbm90IGN1cnJlbnRseSBpbiB1c2UuCi0KLSAgVGhpcyByZW5hbWVkIHZlcnNpb24gd2FzIGludGVuZGVkIHRvIGJlIHVzZWQgaW4gVHJpbmlkYWQgYW5kIENvcmUgMS4yLnggcmVsZWFzZXMsCi0gIGJ1dCB0aGUgTXlGYWNlcy1CdWlsZGVyLVBsdWdpbiBpcyBjdXJyZW50bHkgaW50ZW5kZWQgdG8gYmUgdXNlZCBpbnN0ZWFkLgotCi0gIFRoZSBvcmlnaW5hbCBNeUZhY2VzLVRyaW5pZGFkLVBsdWdpbiB3YXMgdXNlZCBmb3IgTXlGYWNlcyBDb3JlIDEuMi54IHJlbGVhc2VzLCBhbmQKLSAgZm9yIGFsbCBUcmluaWRhZCByZWxlYXNlcy4gSXQgcmVhZHMgYSB0cmVlIG9mIHhtbCBmaWxlcyB3aGljaCBkZWZpbmUgdGhlIHByb3BlcnRpZXMKLSAgb2YgSlNGIGNvbXBvbmVudHMgaW4gYSBwcm9qZWN0LCBhbmQgdGhlbiBnZW5lcmF0ZXMgZmFjZXMtY29uZmlnLnhtbCBhbmQgLnRsZCBmaWxlcywKLSAgYW5kIGFsc28gY2FuIGdlbmVyYXRlIENvbXBvbmVudCBhbmQgVGFnIGNsYXNzZXMuCi0KLSogTXlGYWNlcy1pMThuLXBsdWdpbgotCi0gIFRPRE86IGRvY3VtZW50IG1lCi0KLSogTXlGYWNlcy1qYXZhY2MtcGx1Z2luCi0KLSAgVE9ETzogZG9jdW1lbnQgbWUKLQotKiBNeUZhY2VzLWphdmFzY3JpcHQtcGx1Z2luCi0KLSAgVE9ETzogZG9jdW1lbnQgbWUKLQotKiBNeUZhY2VzLWpkZXYtcGx1Z2luCi0KLSAgVE9ETzogZG9jdW1lbnQgbWUgCi0KLSogTXlGYWNlcy10YWdkb2MtcGx1Z2luCi0KLSAgVE9ETzogZG9jdW1lbnQgbWUKLQotKiBNeUZhY2VzLVdhZ29uLVBsdWdpbgotCi0gIFRPRE86IGRvY3VtZW50IG1lCi0KLSogTXlGYWNlcy14cnRzLXBsdWdpbgotCi0gIFRPRE86IGRvY3VtZW50IG1lCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLXBsdWdpbi1wYXJlbnQvc3JjL3NpdGUvc2l0ZS54bWwgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLXBsdWdpbi1wYXJlbnQvc3JjL3NpdGUvc2l0ZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjZjEyZmEuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1wbHVnaW4tcGFyZW50L3NyYy9zaXRlL3NpdGUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iSVNPLTg4NTktMSI/PgotPCEtLQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxwcm9qZWN0IG5hbWU9IkFwYWNoZSBNeUZhY2VzIEJ1aWxkdG9vbHMiPgotICA8YmFubmVyTGVmdD4KLSAgICA8bmFtZT5BcGFjaGUgTXlGYWNlczwvbmFtZT4KLSAgICA8c3JjPmltZy9iYW5uZXJzL015RmFjZXNfbG9nby5qcGc8L3NyYz4KLSAgICA8aHJlZj5odHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2luZGV4Lmh0bWw8L2hyZWY+Ci0gIDwvYmFubmVyTGVmdD4KLQotICA8YmFubmVyUmlnaHQ+Ci0gICAgPG5hbWU+QXBhY2hlIEJhbm5lcjwvbmFtZT4KLSAgICA8c3JjPmltZy9iYW5uZXJzL2FwYWNoZV9iYW5uZXIucG5nPC9zcmM+Ci0gICAgPGhyZWY+aHR0cDovL3d3dy5hcGFjaGUub3JnLzwvaHJlZj4KLSAgPC9iYW5uZXJSaWdodD4gIAotCi0gIDxwdWJsaXNoRGF0ZSBmb3JtYXQ9ImRkIE1NTSB5eXl5Ii8+Ci0KLSAgPHNraW4+Ci0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLm1hdmVuPC9ncm91cElkPgotICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtc2l0ZS1za2luPC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjE8L3ZlcnNpb24+Ci0gIDwvc2tpbj4KLQotICA8Ym9keT4KLSAgICA8bGlua3M+Ci0gICAgICA8aXRlbSBuYW1lPSJBcGFjaGUiIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZyIvPgotICAgICAgPGl0ZW0gbmFtZT0iTXlGYWNlcyIgaHJlZj0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9pbmRleC5odG1sIi8+Ci0gICAgPC9saW5rcz4KLQotICAgIDxtZW51IG5hbWU9IkFwYWNoZSBNeUZhY2VzIiBpbmhlcml0PSJ0b3AiPgotICAgICAgPGl0ZW0gbmFtZT0iT3ZlcnZpZXciICAgICAgIGhyZWY9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvaW5kZXguaHRtbCIvPgotICAgICAgPGl0ZW0gbmFtZT0iRG93bmxvYWQiICAgICAgIGhyZWY9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvZG93bmxvYWQuaHRtbCIvPgotICAgIDwvbWVudT4KLQotICAgIDxtZW51IG5hbWU9IkRvY3VtZW50YXRpb24iPgotICAgICAgPGl0ZW0gbmFtZT0iQWJvdXQiICAgICAgICAgaHJlZj0iLi9pbmRleC5odG1sIi8+Ci0gICAgPC9tZW51PgotCi0gICAgPG1lbnUgcmVmPSJyZXBvcnRzIi8+Ci0JCi0gICAgPG1lbnUgbmFtZT0iQXZhaWxhYmxlIE1vZHVsZXMiIGluaGVyaXQ9ImJvdHRvbSI+Ci0gICAgICA8aXRlbSBuYW1lPSJBcGFjaGUgTXlGYWNlcyBCdWlsZHRvb2xzIE1hdmVuMiBCdWlsZGVyIEFubm90YXRpb25zIiAgICAgIGhyZWY9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvYnVpbGQtdG9vbHMvcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItYW5ub3RhdGlvbnMvaW5kZXguaHRtbCIvPgotICAgICAgPGl0ZW0gbmFtZT0iQXBhY2hlIE15RmFjZXMgQnVpbGR0b29scyBNYXZlbjIgQnVpbGRlciBQbHVnaW4iICAgICAgICAgICBocmVmPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2J1aWxkLXRvb2xzL3BsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9pbmRleC5odG1sIi8+Ci0gICAgICA8aXRlbSBuYW1lPSJBcGFjaGUgTXlGYWNlcyBCdWlsZHRvb2xzIE1hdmVuMiBGYWNlcyBQbHVnaW4iICAgICAgICAgICAgIGhyZWY9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvYnVpbGQtdG9vbHMvcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9pbmRleC5odG1sIi8+Ci0gICAgICA8aXRlbSBuYW1lPSJBcGFjaGUgTXlGYWNlcyBCdWlsZHRvb2xzIE1hdmVuMiBpMThuIFBsdWdpbiIgICAgICAgICAgICAgIGhyZWY9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvYnVpbGQtdG9vbHMvcGx1Z2lucy9teWZhY2VzLWkxOG4tcGx1Z2luL2luZGV4Lmh0bWwiLz4KLSAgICAgIDxpdGVtIG5hbWU9IkFwYWNoZSBNeUZhY2VzIEJ1aWxkdG9vbHMgTWF2ZW4yIEphdmFjYyBQbHVnaW4iICAgICAgICAgICAgaHJlZj0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9idWlsZC10b29scy9wbHVnaW5zL215ZmFjZXMtamF2YWNjLXBsdWdpbi9pbmRleC5odG1sIi8+Ci0gICAgICA8aXRlbSBuYW1lPSJBcGFjaGUgTXlGYWNlcyBCdWlsZHRvb2xzIE1hdmVuMiBKYXZhc2NyaXB0IFBsdWdpbiIgICAgICAgIGhyZWY9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvYnVpbGQtdG9vbHMvcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL2luZGV4Lmh0bWwiLz4KLSAgICAgIDxpdGVtIG5hbWU9IkFwYWNoZSBNeUZhY2VzIEJ1aWxkdG9vbHMgTWF2ZW4yIEpEZXYgUGx1Z2luIiAgICAgICAgICAgICAgaHJlZj0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9idWlsZC10b29scy9wbHVnaW5zL215ZmFjZXMtamRldi1wbHVnaW4vaW5kZXguaHRtbCIvPgotICAgICAgPGl0ZW0gbmFtZT0iQXBhY2hlIE15RmFjZXMgQnVpbGR0b29scyBNYXZlbjIgVGFnIERvY3VtZW50YXRpb24gUmVwb3J0IiBocmVmPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2J1aWxkLXRvb2xzL3BsdWdpbnMvbXlmYWNlcy10YWdkb2MtcGx1Z2luL2luZGV4Lmh0bWwiLz4KLSAgICAgIDxpdGVtIG5hbWU9IkFwYWNoZSBNeUZhY2VzIEJ1aWxkdG9vbHMgTWF2ZW4yIFdhZ29uIFBsdWdpbiIgICAgICAgICAgICAgaHJlZj0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9idWlsZC10b29scy9wbHVnaW5zL215ZmFjZXMtd2Fnb24tcGx1Z2luL2luZGV4Lmh0bWwiLz4KLSAgICAgIDxpdGVtIG5hbWU9IkFwYWNoZSBNeUZhY2VzIEJ1aWxkdG9vbHMgTWF2ZW4yIFhSVFMgUGx1Z2luIiAgICAgICAgICAgICAgaHJlZj0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9idWlsZC10b29scy9wbHVnaW5zL215ZmFjZXMteHJ0cy1wbHVnaW4vaW5kZXguaHRtbCIvPgotICAgIDwvbWVudT4KLQotICAgIDxtZW51IG5hbWU9IkZvdW5kYXRpb24iIGluaGVyaXQ9ImJvdHRvbSI+Ci0gICAgICA8aXRlbSBuYW1lPSJBU0YiICAgICAgICAgICAgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnLyIgLz4KLSAgICAgIDxpdGVtIG5hbWU9IlNwb25zb3JzaGlwIiAgICBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZm91bmRhdGlvbi9zcG9uc29yc2hpcC5odG1sIiAvPgotICAgICAgPGl0ZW0gbmFtZT0iVGhhbmtzIiAgICAgICAgIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9mb3VuZGF0aW9uL3RoYW5rcy5odG1sIiAvPgotICAgIDwvbWVudT4KLSAgPC9ib2R5PgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy10YWdkb2MtcGx1Z2luL0xJQ0VOU0UudHh0IGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy10YWdkb2MtcGx1Z2luL0xJQ0VOU0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjQ1Njk1Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtdGFnZG9jLXBsdWdpbi9MSUNFTlNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDIwMiArMCwwIEBACi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0Ci0gICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvCi0KLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTgotCi0gICAxLiBEZWZpbml0aW9ucy4KLQotICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwKLSAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgotCi0gICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgotCi0gICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsCi0gICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCi0gICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLAotICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlCi0gICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgotICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlCi0gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5LgotCi0gICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLgotCi0gICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywKLSAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24KLSAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCi0KLSAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsCi0gICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0Ci0gICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sCi0gICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuCi0KLSAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yCi0gICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhCi0gICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKLSAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuCi0KLSAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKLSAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUKLSAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMKLSAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCi0gICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4KLSAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwKLSAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCi0KLSAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nCi0gICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCi0gICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkKLSAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIKLSAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgotICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiCi0gICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50Ci0gICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bwotICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywKLSAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlCi0gICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKLSAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlCi0gICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiIKLQotICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKLSAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZAotICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCi0KLSAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKLSAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLAotICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCi0gICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLgotCi0gICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKLSAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLAotICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUKLSAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCi0gICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpCi0gICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQotICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKLSAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsKLSAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0Ci0gICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCi0gICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUKLSAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4KLQotICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUKLSAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dAotICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKLSAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotCi0gICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgotICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kCi0KLSAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKLSAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQKLQotICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCi0gICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZAotICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssCi0gICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgotICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQKLQotICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCi0gICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdAotICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZAotICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAotICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQotICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkCi0gICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgotICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLAotICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQKLSAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKLSAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kCi0gICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24KLSAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQotICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZAotICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZAotICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KLQotICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kCi0gICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCi0gICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yCi0gICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwKLSAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAotICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4KLQotICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAotICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrCi0gICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCi0gICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5Ci0gICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZAotICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgotCi0gICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlCi0gICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCi0gICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUKLSAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLgotCi0gICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IKLSAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gKLSAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucwotICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQotICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlCi0gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkKLSAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KLQotICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksCi0gICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKLSAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5Ci0gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQotICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAotICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhCi0gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlCi0gICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCi0gICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbAotICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcgotICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgotCi0gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nCi0gICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAotICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwKLSAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzCi0gICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQotICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYKLSAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwKLSAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQotICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbgotICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuCi0KLSAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUwotCi0gICBBUFBFTkRJWDogSG93IHRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmsuCi0KLSAgICAgIFRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmssIGF0dGFjaCB0aGUgZm9sbG93aW5nCi0gICAgICBib2lsZXJwbGF0ZSBub3RpY2UsIHdpdGggdGhlIGZpZWxkcyBlbmNsb3NlZCBieSBicmFja2V0cyAiW10iCi0gICAgICByZXBsYWNlZCB3aXRoIHlvdXIgb3duIGlkZW50aWZ5aW5nIGluZm9ybWF0aW9uLiAoRG9uJ3QgaW5jbHVkZQotICAgICAgdGhlIGJyYWNrZXRzISkgIFRoZSB0ZXh0IHNob3VsZCBiZSBlbmNsb3NlZCBpbiB0aGUgYXBwcm9wcmlhdGUKLSAgICAgIGNvbW1lbnQgc3ludGF4IGZvciB0aGUgZmlsZSBmb3JtYXQuIFdlIGFsc28gcmVjb21tZW5kIHRoYXQgYQotICAgICAgZmlsZSBvciBjbGFzcyBuYW1lIGFuZCBkZXNjcmlwdGlvbiBvZiBwdXJwb3NlIGJlIGluY2x1ZGVkIG9uIHRoZQotICAgICAgc2FtZSAicHJpbnRlZCBwYWdlIiBhcyB0aGUgY29weXJpZ2h0IG5vdGljZSBmb3IgZWFzaWVyCi0gICAgICBpZGVudGlmaWNhdGlvbiB3aXRoaW4gdGhpcmQtcGFydHkgYXJjaGl2ZXMuCi0KLSAgIENvcHlyaWdodCBbeXl5eV0gW25hbWUgb2YgY29weXJpZ2h0IG93bmVyXQotCi0gICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy10YWdkb2MtcGx1Z2luL05PVElDRS50eHQgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLXRhZ2RvYy1wbHVnaW4vTk9USUNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmEzZGJkNi4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLXRhZ2RvYy1wbHVnaW4vTk9USUNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLT09ICBOT1RJQ0UgZmlsZSBjb3JyZXNwb25kaW5nIHRvIHNlY3Rpb24gNChkKSBvZiB0aGUgQXBhY2hlIExpY2Vuc2UsICAgPT0KLT09ICBWZXJzaW9uIDIuMCwgaW4gdGhpcyBjYXNlIGZvciB0aGUgQXBhY2hlIE15RmFjZXMgTWF2ZW4gUGx1Z2lucyAgICAgPT0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSAKLVRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuCi0KLVBvcnRpb25zIG9mIHRoaXMgc29mdHdhcmUgd2VyZSBvcmlnaW5hbGx5IGJhc2VkIG9uIHRoZSBmb2xsb3dpbmc6Ci0KLSAtIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDA2LCBPcmFjbGUgQ29ycCwgPGh0dHA6Ly93d3cub3JhY2xlLmNvbS8+LgotYW5kIGFyZSBsaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gdW5kZXIgdGhlIAotIlNvZnR3YXJlIEdyYW50IGFuZCBDb3Jwb3JhdGUgQ29udHJpYnV0aW9uIExpY2Vuc2UgQWdyZWVtZW50IgotCi1TZWUgdGhlIExJQ0VOU0UudHh0IGZpbGUgZm9yIGluZm9ybWF0aW9uIG9uIGFsbCBsaWNlbnNlcyAKLWFzc29jaWF0ZWQgd2l0aCB0aGlzIHNvZnR3YXJlLgpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy10YWdkb2MtcGx1Z2luL3BvbS54bWwgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLXRhZ2RvYy1wbHVnaW4vcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmM3ZTAyOS4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLXRhZ2RvYy1wbHVnaW4vcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE1MyArMCwwIEBACi08IS0tCi0gICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICAgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICAgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gICAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICAgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gICAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gICAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gICAgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+Ci0KLSAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotCi0gIDxwYXJlbnQ+Ci0gICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29sczwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtcGx1Z2luLXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjEuMC41PC92ZXJzaW9uPgotICAgICAgPHJlbGF0aXZlUGF0aD4uLi9teWZhY2VzLXBsdWdpbi1wYXJlbnQvcG9tLnhtbDwvcmVsYXRpdmVQYXRoPgotICA8L3BhcmVudD4KLQotICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29sczwvZ3JvdXBJZD4KLSAgPGFydGlmYWN0SWQ+bXlmYWNlcy10YWdkb2MtcGx1Z2luPC9hcnRpZmFjdElkPgotICA8dmVyc2lvbj4xLjAuMS1TTkFQU0hPVDwvdmVyc2lvbj4KLSAgPHBhY2thZ2luZz5tYXZlbi1wbHVnaW48L3BhY2thZ2luZz4KLSAgPG5hbWU+QXBhY2hlIE15RmFjZXMgQnVpbGR0b29scyBNYXZlbjIgVGFnIERvY3VtZW50YXRpb24gUmVwb3J0PC9uYW1lPgotCi0gIDxzY20+Ci0gICAgPGNvbm5lY3Rpb24+c2NtOnN2bjpodHRwOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL215ZmFjZXMvbXlmYWNlcy1idWlsZC10b29scy90cnVuay9tYXZlbjItcGx1Z2lucy9teWZhY2VzLXRhZ2RvYy1wbHVnaW48L2Nvbm5lY3Rpb24+Ci0gICAgPGRldmVsb3BlckNvbm5lY3Rpb24+c2NtOnN2bjpodHRwczovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9teWZhY2VzL215ZmFjZXMtYnVpbGQtdG9vbHMvdHJ1bmsvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy10YWdkb2MtcGx1Z2luPC9kZXZlbG9wZXJDb25uZWN0aW9uPgotICAgIDx1cmw+aHR0cDovL3N2bi5hcGFjaGUub3JnL3ZpZXd2Yy9teWZhY2VzL215ZmFjZXMtYnVpbGQtdG9vbHMvdHJ1bmsvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy10YWdkb2MtcGx1Z2luPC91cmw+Ci0gIDwvc2NtPgotCi0gIDxidWlsZD4KLSAgICA8cGx1Z2lucz4KLSAgICAgIDxwbHVnaW4+Ci0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KLSAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY29tcGlsZXItcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICA8aW5oZXJpdGVkPnRydWU8L2luaGVyaXRlZD4KLSAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgPHNvdXJjZT4xLjQ8L3NvdXJjZT4KLSAgICAgICAgICA8dGFyZ2V0PjEuNDwvdGFyZ2V0PgotICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICA8L3BsdWdpbj4KLSAgICA8L3BsdWdpbnM+Ci0gIDwvYnVpbGQ+Ci0KLSAgPGRlcGVuZGVuY2llcz4KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW48L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1wbHVnaW4tYXBpPC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+Mi4wPC92ZXJzaW9uPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucmVwb3J0aW5nPC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tcmVwb3J0aW5nLWltcGw8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4yLjA8L3ZlcnNpb24+Ci0gICAgPC9kZXBlbmRlbmN5PgotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbjwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXByb2plY3Q8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4yLjA8L3ZlcnNpb24+Ci0gICAgPC9kZXBlbmRlbmN5PgotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+Y29tbW9ucy1kaWdlc3RlcjwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPmNvbW1vbnMtZGlnZXN0ZXI8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4xLjc8L3ZlcnNpb24+Ci0gICAgPC9kZXBlbmRlbmN5PgotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+c2F4b248L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5zYXhvbjwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjYuNS4zPC92ZXJzaW9uPgotICAgICAgPHNjb3BlPnJ1bnRpbWU8L3Njb3BlPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPnhlcmNlczwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPnhlcmNlc0ltcGw8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4yLjYuMjwvdmVyc2lvbj4KLSAgICAgIDxzY29wZT5ydW50aW1lPC9zY29wZT4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5zdGF4PC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+c3RheC1hcGk8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4xLjAuMTwvdmVyc2lvbj4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5zdGF4PC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+c3RheDwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjEuMi4wX3JjMi1kZXY8L3ZlcnNpb24+Ci0gICAgPC9kZXBlbmRlbmN5PgotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHM8L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWZhY2VzLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuPC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tcHJvamVjdDwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjIuMC4xPC92ZXJzaW9uPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy5wbGV4dXM8L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5wbGV4dXMtY29udGFpbmVyLWRlZmF1bHQ8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4xLjAtYWxwaGEtODwvdmVyc2lvbj4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5vcmcuY29kZWhhdXMucGxleHVzPC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+cGxleHVzLXV0aWxzPC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+MS4wLjU8L3ZlcnNpb24+Ci0gICAgPC9kZXBlbmRlbmN5PgotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5kb3hpYTwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPmRveGlhLWNvcmU8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4xLjAtYWxwaGEtNzwvdmVyc2lvbj4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLmRveGlhPC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+ZG94aWEtc2l0ZS1yZW5kZXJlcjwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjEuMC1hbHBoYS03PC92ZXJzaW9uPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPmNvbW1vbnMtbG9nZ2luZzwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPmNvbW1vbnMtbG9nZ2luZzwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjEuMC40PC92ZXJzaW9uPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPmxvZzRqPC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+bG9nNGo8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4xLjIuMTI8L3ZlcnNpb24+Ci0gICAgICA8c2NvcGU+cnVudGltZTwvc2NvcGU+Ci0gICAgPC9kZXBlbmRlbmN5PgotICA8L2RlcGVuZGVuY2llcz4KLQotICA8cmVwb3J0aW5nPgotICAgIDxwbHVnaW5zPgotICAgICAgPHBsdWdpbj4KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgotICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1wbHVnaW4tcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj4yLjI8L3ZlcnNpb24+Ci0gICAgICA8L3BsdWdpbj4KLSAgICA8L3BsdWdpbnM+Ci0gIDwvcmVwb3J0aW5nPgotCi08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLXRhZ2RvYy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL3RhZ2RvYy9UYWdkb2NSZXBvcnQuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtdGFnZG9jLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vdGFnZG9jL1RhZ2RvY1JlcG9ydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MGE4OTA5Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtdGFnZG9jLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vdGFnZG9jL1RhZ2RvY1JlcG9ydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0MSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4udGFnZG9jOwotCi0vL2ltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLmRveGlhLnNpbmsuU2luazsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW1Xcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5Xcml0ZXI7Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLm5ldC5VUkxDbGFzc0xvYWRlcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci1pbXBvcnQgamF2YS51dGlsLlRyZWVTZXQ7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyRmFjdG9yeTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5kaWdlc3Rlci5BYnN0cmFjdE9iamVjdENyZWF0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuZGlnZXN0ZXIuRGlnZXN0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5hcnRpZmFjdC5EZXBlbmRlbmN5UmVzb2x1dGlvblJlcXVpcmVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLk1vam9FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wcm9qZWN0Lk1hdmVuUHJvamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnJlcG9ydGluZy5BYnN0cmFjdE1hdmVuTXVsdGlQYWdlUmVwb3J0OwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucmVwb3J0aW5nLk1hdmVuUmVwb3J0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucmVwb3J0aW5nLnNpbmsuU2lua0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy5wYXJzZS5Db21wb25lbnRCZWFuOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMucGFyc2UuQ29udmVydGVyQmVhbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLnBhcnNlLkV2ZW50QmVhbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLnBhcnNlLkV2ZW50UmVmQmVhbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLnBhcnNlLkZhY2VzQ29uZmlnQmVhbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLnBhcnNlLkZhY2VzQ29uZmlnUGFyc2VyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMucGFyc2UuRmFjZXRCZWFuOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMucGFyc2UuUHJvcGVydHlCZWFuOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMucGFyc2UuVmFsaWRhdG9yQmVhbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLnV0aWwuQ29tcG9uZW50RmlsdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMudXRpbC5Db252ZXJ0ZXJGaWx0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy51dGlsLkZpbHRlcmVkSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy51dGlsLlByb3BlcnR5RmlsdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMudXRpbC5WYWxpZGF0b3JGaWx0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy51dGlsLlhJbmNsdWRlRmlsdGVyOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5kb3hpYS5zaW5rLlNpbms7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmRveGlhLnNpdGUucmVuZGVyZXIuU2l0ZVJlbmRlcmVyOwotaW1wb3J0IG9yZy54bWwuc2F4LkF0dHJpYnV0ZXM7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotCi0vKioKLSAqIFJlcG9ydCBmb3IgZ2VuZXJhdGluZyBKU0YgdGFnZG9jIGJhc2VkIG9uIGZhY2VzLWNvbmZpZy54bWwgcGFyc2luZy4KLSAqIE5vdGUgdGhhdCB0aGlzIGlzIG5vdCByZWFsbHkgYW4gQWJzdHJhY3RNYXZlbk11bHRpUGFnZVJlcG9ydCAtIHRoZQotICogc2Vjb25kYXJ5IHBhZ2VzIGFyZSBtYW51YWxseSBnZW5lcmF0ZWQgWERvYy4gIEkgdHJpZWQgdXNpbmcgdGhlIHRydWUKLSAqIG11bHRpcGFnZSByZXBvcnQgYXBwcm9hY2gsIGFuZCByYW4gaW50byBNYXZlbiBidWdzIChhcyBvZiBNYXZlbiAyLjAuMiwKLSAqIHNpdGUgMi4wYjQpLgotICoKLSAqIEBnb2FsIHRhZ2RvYwotICovCi1wdWJsaWMgY2xhc3MgVGFnZG9jUmVwb3J0IGV4dGVuZHMgQWJzdHJhY3RNYXZlbk11bHRpUGFnZVJlcG9ydAotewotICBwcm90ZWN0ZWQgdm9pZCBleGVjdXRlUmVwb3J0KCBMb2NhbGUgbG9jYWxlICkKLSAgICAgIHRocm93cyBNYXZlblJlcG9ydEV4Y2VwdGlvbgotICB7Ci0gICAgLy8gV2h5IHRoZSBoZWNrIGRvZXNuJ3QgTWF2ZW4gZG8gdGhpcyBmb3IgbWU/Ci0gICAgU2lua0ZhY3RvcnkgZmFjdG9yeSA9IG5ldyBTaW5rRmFjdG9yeSgpOwotICAgIGZhY3Rvcnkuc2V0U2l0ZVJlbmRlcmVyKGdldFNpdGVSZW5kZXJlcigpKTsKLSAgICBmYWN0b3J5LnNldFNpdGVEaXJlY3RvcnkoZ2V0T3V0cHV0RGlyZWN0b3J5KCkpOwotICAgIHNldFNpbmtGYWN0b3J5KGZhY3RvcnkpOwotICAgIAotICAgIHByb2Nlc3NJbmRleChwcm9qZWN0LCByZXNvdXJjZVBhdGgpOwotICAgIHRyeQotICAgIHsKLSAgICAgIF9nZW5lcmF0ZVRhZ0RvY3MoKTsKLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBNYXZlblJlcG9ydEV4Y2VwdGlvbigiQ291bGRuJ3QgZ2VuZXJhdGUgdGFnZG9jIiwgZSk7Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIF9nZW5lcmF0ZVRhZ0RvY3MoKSB0aHJvd3MgRXhjZXB0aW9uCi0gIHsKLSAgICBGYWNlc0NvbmZpZ0JlYW4gZmFjZXNDb25maWcgPSBnZXRGYWNlc0NvbmZpZygpOwotICAgIGlmICghZmFjZXNDb25maWcuaGFzQ29tcG9uZW50cygpKQotICAgIHsKLSAgICAgIGdldExvZygpLmluZm8oIk5vdGhpbmcgdG8gZ2VuZXJhdGUgLSBubyBjb21wb25lbnRzIGZvdW5kIik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0KLSAgICBJdGVyYXRvciBjb21wb25lbnRzID0gZmFjZXNDb25maWcuY29tcG9uZW50cygpOwotICAgIGNvbXBvbmVudHMgPSBuZXcgRmlsdGVyZWRJdGVyYXRvcihjb21wb25lbnRzLCBuZXcgU2tpcEZpbHRlcigpKTsKLSAgICBjb21wb25lbnRzID0gbmV3IEZpbHRlcmVkSXRlcmF0b3IoY29tcG9uZW50cywgbmV3IENvbXBvbmVudFRhZ0ZpbHRlcigpKTsKLSAgICBjb21wb25lbnRzID0gbmV3IEZpbHRlcmVkSXRlcmF0b3IoY29tcG9uZW50cywgbmV3IENvbXBvbmVudE5hbWVzcGFjZUZpbHRlcigpKTsKLSAgICAKLSAgICBJdGVyYXRvciB2YWxpZGF0b3JzID0gZmFjZXNDb25maWcudmFsaWRhdG9ycygpOwotICAgIHZhbGlkYXRvcnMgPSBuZXcgRmlsdGVyZWRJdGVyYXRvcih2YWxpZGF0b3JzLCBuZXcgVmFsaWRhdG9yVGFnRmlsdGVyKCkpOwotICAgIHZhbGlkYXRvcnMgPSBuZXcgRmlsdGVyZWRJdGVyYXRvcih2YWxpZGF0b3JzLCBuZXcgVmFsaWRhdG9yTmFtZXNwYWNlRmlsdGVyKCkpOwotICAgIAotICAgIEl0ZXJhdG9yIGNvbnZlcnRlcnMgPSBmYWNlc0NvbmZpZy5jb252ZXJ0ZXJzKCk7Ci0gICAgY29udmVydGVycyA9IG5ldyBGaWx0ZXJlZEl0ZXJhdG9yKGNvbnZlcnRlcnMsIG5ldyBDb252ZXJ0ZXJUYWdGaWx0ZXIoKSk7Ci0gICAgY29udmVydGVycyA9IG5ldyBGaWx0ZXJlZEl0ZXJhdG9yKGNvbnZlcnRlcnMsIG5ldyBDb252ZXJ0ZXJOYW1lc3BhY2VGaWx0ZXIoKSk7Ci0gICAgCi0gICAgLy8gPS09QUVXIE5vdGUgdGhhdCBvbmx5IHVwZGF0aW5nIG91dC1vZi1kYXRlIGNvbXBvbmVudHMsIGV0Yy4gaXMKLSAgICAvLyBwZXJtYW5lbnRseSB0cmlja3ksIGV2ZW4gaWYgd2UgaGFkIHByb3BlciBkZXRlY3Rpb24gaW4gcGxhY2UsCi0gICAgLy8gYmVjYXVzZSB0aGUgaW5kZXggYWx3YXlzIGhhcyB0byBoYXZlIGFsbCBkb2NzCi0gICAgLyoKLSAgICBpZiAoIWNvbXBvbmVudHMuaGFzTmV4dCgpICYmICFjb252ZXJ0ZXJzLmhhc05leHQoKSAmJiAhdmFsaWRhdG9ycy5oYXNOZXh0KCkpCi0gICAgewotICAgICAgZ2V0TG9nKCkuaW5mbygiTm90aGluZyB0byBnZW5lcmF0ZSAtIGFsbCBkb2NzIGFyZSB1cCB0byBkYXRlIik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgICovCi0KLSAgICBTZXQgY29tcG9uZW50UGFnZXMgPSBuZXcgVHJlZVNldCgpOwotICAgIFNldCBjb252ZXJ0ZXJQYWdlcyA9IG5ldyBUcmVlU2V0KCk7Ci0gICAgU2V0IHZhbGlkYXRvclBhZ2VzID0gbmV3IFRyZWVTZXQoKTsKLSAgICAKLSAgICBpbnQgY291bnQgPSAwOwotICAgIHdoaWxlIChjb21wb25lbnRzLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBTdHJpbmcgcGFnZU5hbWUgPSBfZ2VuZXJhdGVDb21wb25lbnREb2MoKENvbXBvbmVudEJlYW4pY29tcG9uZW50cy5uZXh0KCkpOwotICAgICAgaWYgKHBhZ2VOYW1lICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGNvbXBvbmVudFBhZ2VzLmFkZChwYWdlTmFtZSk7Ci0gICAgICAgIGNvdW50Kys7Ci0gICAgICB9Ci0gICAgfQotICAgIHdoaWxlIChjb252ZXJ0ZXJzLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBTdHJpbmcgcGFnZU5hbWUgPSBfZ2VuZXJhdGVDb252ZXJ0ZXJEb2MoKENvbnZlcnRlckJlYW4pY29udmVydGVycy5uZXh0KCkpOwotICAgICAgaWYgKHBhZ2VOYW1lICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGNvbnZlcnRlclBhZ2VzLmFkZChwYWdlTmFtZSk7Ci0gICAgICAgIGNvdW50Kys7Ci0gICAgICB9Ci0gICAgfQotICAgIHdoaWxlICh2YWxpZGF0b3JzLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBTdHJpbmcgcGFnZU5hbWUgPSBfZ2VuZXJhdGVWYWxpZGF0b3JEb2MoKFZhbGlkYXRvckJlYW4pdmFsaWRhdG9ycy5uZXh0KCkpOwotICAgICAgaWYgKHBhZ2VOYW1lICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHZhbGlkYXRvclBhZ2VzLmFkZChwYWdlTmFtZSk7Ci0gICAgICAgIGNvdW50Kys7Ci0gICAgICB9Ci0gICAgfQotCi0KLSAgICBTZXQgb3RoZXJQYWdlcyA9IF9nYXRoZXJPdGhlclRhZ3MoKTsKLQotICAgIGdldExvZygpLmluZm8oIkdlbmVyYXRlZCAiICsgY291bnQgKyAiIHBhZ2UocykiKTsKLQotICAgIFNpbmsgc2luayA9IGdldFNpbmsoKTsKLSAgICBzaW5rLmhlYWQoKTsKLSAgICBzaW5rLnRpdGxlKCk7Ci0gICAgc2luay50ZXh0KCJUYWcgbGlicmFyeSBkb2N1bWVudGF0aW9uIik7Ci0gICAgc2luay50aXRsZV8oKTsgICAgCi0gICAgc2luay5oZWFkXygpOwotICAgIHNpbmsuYm9keSgpOwotCi0gICAgc2luay5zZWN0aW9uVGl0bGUxKCk7Ci0gICAgc2luay50ZXh0KCJUYWcgbGlicmFyeSBpbmZvcm1hdGlvbiIpOwotICAgIHNpbmsuc2VjdGlvblRpdGxlMV8oKTsKLSAgICBzaW5rLnNlY3Rpb24xKCk7Ci0KLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSB0YWdsaWJzLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICB7Ci0gICAgICBNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KWkubmV4dCgpOwotICAgICAgc2luay5wYXJhZ3JhcGgoKTsKLQotICAgICAgc2luay5ib2xkKCk7Ci0gICAgICBzaW5rLnRleHQoIlNob3J0IG5hbWU6Iik7Ci0gICAgICBzaW5rLmJvbGRfKCk7Ci0gICAgICBzaW5rLm5vbkJyZWFraW5nU3BhY2UoKTsKLSAgICAgIHNpbmsudGV4dChlbnRyeS5nZXRLZXkoKS50b1N0cmluZygpKTsKLSAgICAgIHNpbmsubGluZUJyZWFrKCk7Ci0KLSAgICAgIHNpbmsuYm9sZCgpOwotICAgICAgc2luay50ZXh0KCJOYW1lc3BhY2U6Iik7Ci0gICAgICBzaW5rLmJvbGRfKCk7Ci0gICAgICBzaW5rLm5vbkJyZWFraW5nU3BhY2UoKTsKLSAgICAgIHNpbmsudGV4dChlbnRyeS5nZXRWYWx1ZSgpLnRvU3RyaW5nKCkpOwotICAgICAgc2luay5saW5lQnJlYWsoKTsKLQotICAgICAgc2luay5wYXJhZ3JhcGhfKCk7Ci0gICAgfQotCi0gICAgc2luay5zZWN0aW9uMV8oKTsKLQotICAgIF93cml0ZUluZGV4U2VjdGlvbihzaW5rLCBjb21wb25lbnRQYWdlcywgIkNvbXBvbmVudHMiKTsKLSAgICBfd3JpdGVJbmRleFNlY3Rpb24oc2luaywgY29udmVydGVyUGFnZXMsICJDb252ZXJ0ZXJzIik7Ci0gICAgX3dyaXRlSW5kZXhTZWN0aW9uKHNpbmssIHZhbGlkYXRvclBhZ2VzLCAiVmFsaWRhdG9ycyIpOwotICAgIF93cml0ZUluZGV4U2VjdGlvbihzaW5rLCBvdGhlclBhZ2VzLCAiTWlzY2VsbGFuZW91cyIpOwotCi0gICAgc2luay5ib2R5XygpOwotICB9Ci0KLSAgcHJpdmF0ZSBTZXQgX2dhdGhlck90aGVyVGFncygpCi0gIHsKLSAgICBUcmVlU2V0IHNldCA9IG5ldyBUcmVlU2V0KCk7Ci0gICAgU3RyaW5nIHN1YkRpciA9IAotICAgICAgX3BsYXRmb3JtQWdub3N0aWNQYXRoKF9wbGF0Zm9ybUFnbm9zdGljUGF0aCgieGRvYy8iICsgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9ET0NfU1VCRElSRUNUT1JZKSk7Ci0gICAgRmlsZSBzaXRlU3ViRGlyID0gbmV3IEZpbGUoc2l0ZURpcmVjdG9yeSwgc3ViRGlyKTsKLSAgICBpZiAoc2l0ZVN1YkRpci5leGlzdHMoKSkKLSAgICB7Ci0gICAgICBTdHJpbmdbXSBmaWxlcyA9IHNpdGVTdWJEaXIubGlzdCgpOwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIGZpbGUgPSBmaWxlc1tpXTsKLSAgICAgICAgaWYgKGZpbGUuZW5kc1dpdGgoIi54bWwiKSkKLSAgICAgICAgewotICAgICAgICAgIHNldC5hZGQoZmlsZS5zdWJzdHJpbmcoMCwgZmlsZS5sZW5ndGgoKSAtIDQpKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBzZXQ7Ci0gIH0KLQotICBwcml2YXRlIFN0cmluZyBfZm9ybWF0UHJvcExpc3QoCi0gICAgU3RyaW5nW10gcExpc3QsIAotICAgIFN0cmluZyAgIGhlYWRlcikKLSAgewotICAgIFN0cmluZ1tdIG51bGxMaXN0ID0ge307Ci0gICAgcmV0dXJuIF9mb3JtYXRQcm9wTGlzdChwTGlzdCwgaGVhZGVyLCBudWxsTGlzdCk7Ci0gIH0KLQotICBwcml2YXRlIFN0cmluZyBfZm9ybWF0UHJvcExpc3QoCi0gICAgU3RyaW5nW10gcExpc3QsIAotICAgIFN0cmluZyAgIGhlYWRlciwKLSAgICBTdHJpbmdbXSBpZ25vcmVzKQotICB7Ci0gICAgU3RyaW5nIGZvcm1hdHRlZCA9IG51bGw7Ci0gICAgaWYgKChwTGlzdCAhPSBudWxsKSAmJiAocExpc3QubGVuZ3RoID4gMCkpCi0gICAgewotICAgICAgLy8gRG9uJ3Qga25vdyBob3cgbG9uZyB0aGlzIHdpbGwgYmUsIGJ1dCAxMDAgc2hvdWxkIGJlIHBsZW50eS4KLSAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoMTAwKTsKLSAgICAgIHNiLmFwcGVuZCgiXG4iKTsKLSAgICAgIHNiLmFwcGVuZCgiPGI+Iik7Ci0gICAgICBzYi5hcHBlbmQoaGVhZGVyKTsKLSAgICAgIHNiLmFwcGVuZCgiOjwvYj4gIik7Ci0KLSAgICAgIGJvb2xlYW4gZ290T25lID0gZmFsc2U7Ci0KLSAgICAgIGZvciAoaW50IGFyckluZCA9IDA7IGFyckluZCA8IHBMaXN0Lmxlbmd0aDsgYXJySW5kKyspCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyBjdXJTdHIgPSBwTGlzdFthcnJJbmRdOwotICAgICAgICBvdXRlcjoKLSAgICAgICAgaWYgKGN1clN0ciAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpZ25vcmVzLmxlbmd0aDsgaSsrKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyBzID0gaWdub3Jlc1tpXTsKLSAgICAgICAgICAgIGlmICgocyAhPSBudWxsKSAmJiAocy5lcXVhbHNJZ25vcmVDYXNlKGN1clN0cikpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBicmVhayBvdXRlcjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBpZiAoZ290T25lKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHNiLmFwcGVuZCgiLCAiKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZ290T25lID0gdHJ1ZTsKLSAgICAgICAgICBzYi5hcHBlbmQoY3VyU3RyKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgaWYgKGdvdE9uZSkKLSAgICAgIHsKLSAgICAgICAgc2IuYXBwZW5kKCI8YnIvPlxuIik7Ci0gICAgICAgIGZvcm1hdHRlZCA9IHNiLnRvU3RyaW5nKCk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBmb3JtYXR0ZWQ7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgX3dyaXRlSW5kZXhTZWN0aW9uKFNpbmsgc2luaywgU2V0IHBhZ2VzLCBTdHJpbmcgdGl0bGUpCi0gIHsKLSAgICBpZiAocGFnZXMuaXNFbXB0eSgpKQotICAgIHsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBzaW5rLnNlY3Rpb25UaXRsZTEoKTsKLSAgICBzaW5rLnRleHQodGl0bGUpOwotICAgIHNpbmsuc2VjdGlvblRpdGxlMV8oKTsKLSAgICBzaW5rLnNlY3Rpb24xKCk7Ci0gICAgc2luay50YWJsZSgpOwotICAgIHNpbmsudGFibGVSb3coKTsKLSAgICBzaW5rLnRhYmxlSGVhZGVyQ2VsbCgpOwotICAgIHNpbmsudGV4dCgiVGFnIE5hbWUiKTsKLSAgICBzaW5rLnRhYmxlSGVhZGVyQ2VsbF8oKTsKLSAgICBzaW5rLnRhYmxlUm93XygpOwotICAgIAotICAgIEl0ZXJhdG9yIGl0ZXIgPSBwYWdlcy5pdGVyYXRvcigpOwotICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBzaW5rLnRhYmxlUm93KCk7Ci0gICAgICBzaW5rLnRhYmxlQ2VsbCgpOwotICAgICAgCi0gICAgICBTdHJpbmcgbmFtZSA9IChTdHJpbmcpIGl0ZXIubmV4dCgpOwotICAgICAgU3RyaW5nIHRhZ05hbWUgPSAiPCIgKyBuYW1lLnJlcGxhY2UoJ18nLCAnOicpICsgIj4iOwotICAgICAgCi0gICAgICBzaW5rLmxpbmsoX0RPQ19TVUJESVJFQ1RPUlkgKyAiLyIgKyBuYW1lICsgIi5odG1sIik7Ci0gICAgICBzaW5rLnRleHQodGFnTmFtZSk7Ci0gICAgICBzaW5rLmxpbmtfKCk7Ci0gICAgICAKLSAgICAgIHNpbmsudGFibGVDZWxsXygpOwotICAgICAgc2luay50YWJsZVJvd18oKTsKLSAgICB9Ci0gICAgCi0gICAgc2luay50YWJsZV8oKTsKLSAgICBzaW5rLnNlY3Rpb24xXygpOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gdXNlUGFnZUxpbmtCYXIoKQotICB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgcHJpdmF0ZSBTdHJpbmcgX3RvUGFnZU5hbWUoUU5hbWUgcU5hbWUpCi0gIHsKLSAgICByZXR1cm4gX2dldFByZWZpeChxTmFtZSkgKyAiXyIgKyBxTmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgfQotICAKLSAgcHJpdmF0ZSBTdHJpbmcgX2dldFF1YWxpZmllZE5hbWUoUU5hbWUgcU5hbWUpCi0gIHsKLSAgICByZXR1cm4gX2dldFByZWZpeChxTmFtZSkgKyAiOiIgKyBxTmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgfQotCi0gIHByaXZhdGUgU3RyaW5nIF9nZXRQcmVmaXgoUU5hbWUgcU5hbWUpCi0gIHsKLSAgICBpZiAoKHFOYW1lLmdldFByZWZpeCgpICE9IG51bGwpICYmICEiIi5lcXVhbHMocU5hbWUuZ2V0UHJlZml4KCkpKQotICAgIHsKLSAgICAgIHJldHVybiBxTmFtZS5nZXRQcmVmaXgoKTsKLSAgICB9Ci0gICAgCi0gICAgU3RyaW5nIG5hbWVzcGFjZSA9IHFOYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotICAgIGlmIChuYW1lc3BhY2UgPT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSB0YWdsaWJzLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICB7Ci0gICAgICBNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KWkubmV4dCgpOwotICAgICAgaWYgKG5hbWVzcGFjZS5lcXVhbHMoZW50cnkuZ2V0VmFsdWUoKSkpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiAoU3RyaW5nKSBlbnRyeS5nZXRLZXkoKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gInVua25vd24iOwotICB9Ci0KLSAgcHJpdmF0ZSBTdHJpbmcgX2dlbmVyYXRlQ29tcG9uZW50RG9jKENvbXBvbmVudEJlYW4gY29tcG9uZW50KQotICAgIHRocm93cyBFeGNlcHRpb24KLSAgewotICAgIGlmIChjb21wb25lbnQuZ2V0VGFnTmFtZSgpID09IG51bGwpCi0gICAgewotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICAgIFN0cmluZyBwYWdlTmFtZSA9IF90b1BhZ2VOYW1lKGNvbXBvbmVudC5nZXRUYWdOYW1lKCkpOwotCi0gICAgRmlsZSB0YXJnZXREaXIgPSBuZXcgRmlsZShvdXRwdXREaXJlY3RvcnkuZ2V0UGFyZW50RmlsZSgpLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9wbGF0Zm9ybUFnbm9zdGljUGF0aCgiZ2VuZXJhdGVkLXNpdGUveGRvYy8iICsgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfRE9DX1NVQkRJUkVDVE9SWSkpOwotICAgIHRhcmdldERpci5ta2RpcnMoKTsKLSAgICBGaWxlIHRhcmdldEZpbGUgPSBuZXcgRmlsZSh0YXJnZXREaXIsIHBhZ2VOYW1lICsgIi54bWwiKTsKLQotICAgIFdyaXRlciBvdXQgPSBuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKG5ldyBGaWxlT3V0cHV0U3RyZWFtKHRhcmdldEZpbGUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVVEYtOCIpOwotICAgIHRyeQotICAgIHsKLSAgICAgIG91dC53cml0ZSgiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIiA/PlxuIik7Ci0gICAgICBvdXQud3JpdGUoIjxkb2N1bWVudD5cbiIpOwotICAgICAgb3V0LndyaXRlKCIgPHByb3BlcnRpZXM+XG4iKTsKLSAgICAgIG91dC53cml0ZSgiICA8dGl0bGU+Jmx0OyIgKyBfZ2V0UXVhbGlmaWVkTmFtZShjb21wb25lbnQuZ2V0VGFnTmFtZSgpKSArICImZ3Q7PC90aXRsZT5cbiIpOwotICAgICAgb3V0LndyaXRlKCIgPC9wcm9wZXJ0aWVzPlxuIik7Ci0gICAgICBvdXQud3JpdGUoIiA8Ym9keT5cbiIpOwotCi0gICAgICBvdXQud3JpdGUoIiA8c2VjdGlvbiBuYW1lPVwiU3VtbWFyeVwiPlxuIik7Ci0gICAgICBvdXQud3JpdGUoIiA8cD5cbiIpOwotICAgICAgX3dyaXRlQ29tcG9uZW50U3VtbWFyeShvdXQsIGNvbXBvbmVudCk7Ci0gICAgICBvdXQud3JpdGUoIiA8L3A+XG4iKTsKLSAgICAgIG91dC53cml0ZSgiIDwvc2VjdGlvbj5cbiIpOwotICAgICAgCi0gICAgICBpZiAoY29tcG9uZW50Lmhhc0V2ZW50cyh0cnVlKSkKLSAgICAgIHsKLSAgICAgICAgb3V0LndyaXRlKCIgPHNlY3Rpb24gbmFtZT1cIkV2ZW50c1wiPlxuIik7Ci0gICAgICAgIG91dC53cml0ZSgiIDxwPlxuIik7Ci0gICAgICAgIF93cml0ZUNvbXBvbmVudEV2ZW50cyhvdXQsIGNvbXBvbmVudCk7Ci0gICAgICAgIG91dC53cml0ZSgiIDwvcD5cbiIpOwotICAgICAgICBvdXQud3JpdGUoIiA8L3NlY3Rpb24+XG4iKTsKLSAgICAgIH0KLSAgICAgIAotICAgICAgaWYgKGNvbXBvbmVudC5oYXNGYWNldHModHJ1ZSkpCi0gICAgICB7Ci0gICAgICAgIG91dC53cml0ZSgiIDxzZWN0aW9uIG5hbWU9XCJTdXBwb3J0ZWQgRmFjZXRzXCI+XG4iKTsKLSAgICAgICAgb3V0LndyaXRlKCIgPHA+XG4iKTsKLSAgICAgICAgX3dyaXRlQ29tcG9uZW50RmFjZXRzKG91dCwgY29tcG9uZW50KTsKLSAgICAgICAgb3V0LndyaXRlKCIgPC9wPlxuIik7Ci0gICAgICAgIG91dC53cml0ZSgiIDwvc2VjdGlvbj5cbiIpOwotICAgICAgfQotICAgICAgCi0gICAgICBvdXQud3JpdGUoIiA8c2VjdGlvbiBuYW1lPVwiQXR0cmlidXRlc1wiPlxuIik7Ci0gICAgICBfd3JpdGVDb21wb25lbnRBdHRyaWJ1dGVzKG91dCwgY29tcG9uZW50KTsKLSAgICAgIG91dC53cml0ZSgiIDwvc2VjdGlvbj5cbiIpOwotCi0gICAgICBvdXQud3JpdGUoIiA8L2JvZHk+XG4iKTsKLSAgICAgIG91dC53cml0ZSgiPC9kb2N1bWVudD5cbiIpOwotICAgIH0KLSAgICBmaW5hbGx5Ci0gICAgewotICAgICAgb3V0LmNsb3NlKCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIHBhZ2VOYW1lOwotICB9Ci0gIAotICBwcml2YXRlIFN0cmluZyBfZ2VuZXJhdGVDb252ZXJ0ZXJEb2MoQ29udmVydGVyQmVhbiBjb252ZXJ0ZXIpIHRocm93cyBJT0V4Y2VwdGlvbgotICB7Ci0gICAgaWYgKGNvbnZlcnRlci5nZXRUYWdOYW1lKCkgPT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBTdHJpbmcgcGFnZU5hbWUgPSBfdG9QYWdlTmFtZShjb252ZXJ0ZXIuZ2V0VGFnTmFtZSgpKTsKLQotICAgIEZpbGUgdGFyZ2V0RGlyID0gbmV3IEZpbGUob3V0cHV0RGlyZWN0b3J5LmdldFBhcmVudEZpbGUoKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfcGxhdGZvcm1BZ25vc3RpY1BhdGgoImdlbmVyYXRlZC1zaXRlL3hkb2MvIiArIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfRE9DX1NVQkRJUkVDVE9SWSkpOwotICAgIHRhcmdldERpci5ta2RpcnMoKTsKLSAgICBGaWxlIHRhcmdldEZpbGUgPSBuZXcgRmlsZSh0YXJnZXREaXIsIHBhZ2VOYW1lICsgIi54bWwiKTsKLQotICAgIFdyaXRlciBvdXQgPSBuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKG5ldyBGaWxlT3V0cHV0U3RyZWFtKHRhcmdldEZpbGUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVVEYtOCIpOwotICAgIHRyeQotICAgIHsKLSAgICAgIG91dC53cml0ZSgiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIiA/PlxuIik7Ci0gICAgICBvdXQud3JpdGUoIjxkb2N1bWVudD5cbiIpOwotICAgICAgb3V0LndyaXRlKCIgPHByb3BlcnRpZXM+XG4iKTsKLSAgICAgIG91dC53cml0ZSgiICA8dGl0bGU+Jmx0OyIgKyBfZ2V0UXVhbGlmaWVkTmFtZShjb252ZXJ0ZXIuZ2V0VGFnTmFtZSgpKSArICImZ3Q7PC90aXRsZT5cbiIpOwotICAgICAgb3V0LndyaXRlKCIgPC9wcm9wZXJ0aWVzPlxuIik7Ci0gICAgICBvdXQud3JpdGUoIiA8Ym9keT5cbiIpOwotCi0gICAgICBvdXQud3JpdGUoIiA8c2VjdGlvbiBuYW1lPVwiU3VtbWFyeVwiPlxuIik7Ci0gICAgICBvdXQud3JpdGUoIiA8cD5cbiIpOwotICAgICAgX3dyaXRlQ29udmVydGVyU3VtbWFyeShvdXQsIGNvbnZlcnRlcik7Ci0gICAgICBvdXQud3JpdGUoIiA8L3A+XG4iKTsKLSAgICAgIG91dC53cml0ZSgiIDwvc2VjdGlvbj5cbiIpOwotICAgICAgICAgICAgCi0gICAgICBvdXQud3JpdGUoIiA8c2VjdGlvbiBuYW1lPVwiQXR0cmlidXRlc1wiPlxuIik7Ci0gICAgICBfd3JpdGVDb252ZXJ0ZXJBdHRyaWJ1dGVzKG91dCwgY29udmVydGVyKTsKLSAgICAgIG91dC53cml0ZSgiIDwvc2VjdGlvbj5cbiIpOwotCi0gICAgICBvdXQud3JpdGUoIiA8L2JvZHk+XG4iKTsKLSAgICAgIG91dC53cml0ZSgiPC9kb2N1bWVudD5cbiIpOwotICAgIH0KLSAgICBmaW5hbGx5Ci0gICAgewotICAgICAgb3V0LmNsb3NlKCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIHBhZ2VOYW1lOwotICB9Ci0KLSAgcHJpdmF0ZSBTdHJpbmcgX2dlbmVyYXRlVmFsaWRhdG9yRG9jKFZhbGlkYXRvckJlYW4gdmFsaWRhdG9yKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgewotICAgIGlmICh2YWxpZGF0b3IuZ2V0VGFnTmFtZSgpID09IG51bGwpCi0gICAgewotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgU3RyaW5nIHBhZ2VOYW1lID0gX3RvUGFnZU5hbWUodmFsaWRhdG9yLmdldFRhZ05hbWUoKSk7Ci0KLSAgICBGaWxlIHRhcmdldERpciA9IG5ldyBGaWxlKG91dHB1dERpcmVjdG9yeS5nZXRQYXJlbnRGaWxlKCksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3BsYXRmb3JtQWdub3N0aWNQYXRoKCJnZW5lcmF0ZWQtc2l0ZS94ZG9jLyIgKyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9ET0NfU1VCRElSRUNUT1JZKSk7Ci0gICAgdGFyZ2V0RGlyLm1rZGlycygpOwotICAgIEZpbGUgdGFyZ2V0RmlsZSA9IG5ldyBGaWxlKHRhcmdldERpciwgcGFnZU5hbWUgKyAiLnhtbCIpOwotCi0gICAgV3JpdGVyIG91dCA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIobmV3IEZpbGVPdXRwdXRTdHJlYW0odGFyZ2V0RmlsZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVURi04Iik7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgb3V0LndyaXRlKCI8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJVVEYtOFwiID8+XG4iKTsKLSAgICAgIG91dC53cml0ZSgiPGRvY3VtZW50PlxuIik7Ci0gICAgICBvdXQud3JpdGUoIiA8cHJvcGVydGllcz5cbiIpOwotICAgICAgb3V0LndyaXRlKCIgIDx0aXRsZT4mbHQ7IiArIF9nZXRRdWFsaWZpZWROYW1lKHZhbGlkYXRvci5nZXRUYWdOYW1lKCkpICsgIiZndDs8L3RpdGxlPlxuIik7Ci0gICAgICBvdXQud3JpdGUoIiA8L3Byb3BlcnRpZXM+XG4iKTsKLSAgICAgIG91dC53cml0ZSgiIDxib2R5PlxuIik7Ci0KLSAgICAgIG91dC53cml0ZSgiIDxzZWN0aW9uIG5hbWU9XCJTdW1tYXJ5XCI+XG4iKTsKLSAgICAgIG91dC53cml0ZSgiIDxwPlxuIik7Ci0gICAgICBfd3JpdGVWYWxpZGF0b3JTdW1tYXJ5KG91dCwgdmFsaWRhdG9yKTsKLSAgICAgIG91dC53cml0ZSgiIDwvcD5cbiIpOwotICAgICAgb3V0LndyaXRlKCIgPC9zZWN0aW9uPlxuIik7Ci0gICAgICAgICAgICAKLSAgICAgIG91dC53cml0ZSgiIDxzZWN0aW9uIG5hbWU9XCJBdHRyaWJ1dGVzXCI+XG4iKTsKLSAgICAgIF93cml0ZVZhbGlkYXRvckF0dHJpYnV0ZXMob3V0LCB2YWxpZGF0b3IpOwotICAgICAgb3V0LndyaXRlKCIgPC9zZWN0aW9uPlxuIik7Ci0KLSAgICAgIG91dC53cml0ZSgiIDwvYm9keT5cbiIpOwotICAgICAgb3V0LndyaXRlKCI8L2RvY3VtZW50PlxuIik7Ci0gICAgfQotICAgIGZpbmFsbHkKLSAgICB7Ci0gICAgICBvdXQuY2xvc2UoKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gcGFnZU5hbWU7Ci0gIH0KLQotCi0gIHByaXZhdGUgdm9pZCBfd3JpdGVDb21wb25lbnRTdW1tYXJ5KFdyaXRlciBvdXQsIENvbXBvbmVudEJlYW4gYmVhbikgdGhyb3dzIElPRXhjZXB0aW9uCi0gIHsKLSAgICBvdXQud3JpdGUoIiAgIDxiPlRhZyBuYW1lOjwvYj4gJmx0OyIgKwotICAgICAgICAgICAgICBfZ2V0UXVhbGlmaWVkTmFtZShiZWFuLmdldFRhZ05hbWUoKSkgKyAiJmd0O1xuIik7Ci0gICAgb3V0LndyaXRlKCIgICA8YnIvPlxuIik7Ci0gICAgCi0KLSAgICBvdXQud3JpdGUoIiAgIDxiPlVJQ29tcG9uZW50IGNsYXNzOjwvYj4gIik7Ci0gICAgU3RyaW5nIGphdmFkb2NVUkwgPSBfcGxhdGZvcm1BZ25vc3RpY1BhdGgoIi4uL2FwaWRvY3MvIiArCi0gICAgICBiZWFuLmdldENvbXBvbmVudENsYXNzKCkucmVwbGFjZSgnLicsICcvJykgKyAiLmh0bWwiKTsKLSAgICBvdXQud3JpdGUoIjxhIGhyZWY9XCIiICsgamF2YWRvY1VSTCArICJcIj4iKTsKLQotICAgIG91dC53cml0ZShiZWFuLmdldENvbXBvbmVudENsYXNzKCkpOwotICAgIG91dC53cml0ZSgiPC9hPiIpOwotICAgIG91dC53cml0ZSgiXG4iKTsKLSAgICBvdXQud3JpdGUoIiAgIDxici8+XG4iKTsKLSAgICBvdXQud3JpdGUoIiAgIDxiPkNvbXBvbmVudCB0eXBlOjwvYj4gIiArIGJlYW4uZ2V0Q29tcG9uZW50VHlwZSgpICsgICJcbiIpOwotICAgIG91dC53cml0ZSgiICAgPGJyLz5cbiIpOwotCi0gICAgaWYgKF9pc05hbWluZ0NvbnRhaW5lcihiZWFuKSkKLSAgICB7Ci0gICAgICBvdXQud3JpdGUoIiAgIDxwPjxiPk5hbWluZyBjb250YWluZXI6PC9iPiAgWWVzLiAgV2hlbiByZWZlcnJpbmcgdG8gY2hpbGRyZW4gb2YgdGhpcyAiICsKLSAgICAgICAgICAgICAgICAiY29tcG9uZW50IChcInBhcnRpYWxUcmlnZ2Vyc1wiLCA8Y29kZT5maW5kQ29tcG9uZW50KCk8L2NvZGU+LCBldGMuKSwgIiArCi0gICAgICAgICAgICAgICAgInlvdSBtdXN0IHByZWZpeCB0aGUgY2hpbGQncyBJRCB3aXRoIHRoaXMgY29tcG9uZW50J3MgSUQgYW5kIGEgY29sb24gKCc6JykuPC9wPiIpOwotICAgIH0KLSAgICAgIAotICAgIFN0cmluZyBmbXRkID0gX2Zvcm1hdFByb3BMaXN0KGJlYW4uZ2V0VW5zdXBwb3J0ZWRBZ2VudHMoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVW5zdXBwb3J0ZWQgYWdlbnRzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfTk9OX0RPQ1VNRU5URURfQUdFTlRTKTsKLSAgICBpZiAoZm10ZCAhPSBudWxsKQotICAgIHsKLSAgICAgIG91dC53cml0ZSgiICAgIiArIGZtdGQpOwotICAgIH0KLQotICAgIFN0cmluZyBkb2MgPSBiZWFuLmdldExvbmdEZXNjcmlwdGlvbigpOwotICAgIGlmIChkb2MgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBkb2MgPSBiZWFuLmdldERlc2NyaXB0aW9uKCk7Ci0gICAgfQotCi0gICAgb3V0LndyaXRlKF9wcmVUb1NvdXJjZShkb2MpKTsKLSAgICBvdXQud3JpdGUoIlxuIik7Ci0gIH0KLQotCi0gIHByaXZhdGUgYm9vbGVhbiBfaXNOYW1pbmdDb250YWluZXIoQ29tcG9uZW50QmVhbiBiZWFuKQotICB7Ci0gICAgaWYgKGJlYW4uaXNOYW1pbmdDb250YWluZXIoKSkKLSAgICB7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBDb21wb25lbnRCZWFuIHBhcmVudCA9IGJlYW4ucmVzb2x2ZVN1cGVydHlwZSgpOwotICAgIGlmIChwYXJlbnQgPT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIHJldHVybiBfaXNOYW1pbmdDb250YWluZXIocGFyZW50KTsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBfd3JpdGVWYWxpZGF0b3JTdW1tYXJ5KFdyaXRlciBvdXQsIFZhbGlkYXRvckJlYW4gYmVhbikgdGhyb3dzIElPRXhjZXB0aW9uCi0gIHsKLSAgICBvdXQud3JpdGUoIiAgIDxiPlRhZyBuYW1lOjwvYj4gJmx0OyIgKwotICAgICAgICAgICAgICBfZ2V0UXVhbGlmaWVkTmFtZShiZWFuLmdldFRhZ05hbWUoKSkgKyAiJmd0O1xuIik7Ci0gICAgb3V0LndyaXRlKCIgICA8YnIvPlxuIik7Ci0gICAgCi0gICAgb3V0LndyaXRlKCIgICA8YnIvPlxuIik7Ci0gICAgb3V0LndyaXRlKCIgICA8Yj4gdHlwZTo8L2I+ICIgKyBiZWFuLmdldFZhbGlkYXRvcklkKCkgKyAgIlxuIik7Ci0gICAgb3V0LndyaXRlKCIgICA8YnIvPlxuIik7Ci0KLSAgICBTdHJpbmcgZG9jID0gYmVhbi5nZXRMb25nRGVzY3JpcHRpb24oKTsKLSAgICBpZiAoZG9jID09IG51bGwpCi0gICAgewotICAgICAgZG9jID0gYmVhbi5nZXREZXNjcmlwdGlvbigpOwotICAgIH0KLQotICAgIG91dC53cml0ZShfcHJlVG9Tb3VyY2UoZG9jKSk7Ci0gICAgb3V0LndyaXRlKCJcbiIpOwotICB9Ci0KLQotICBwcml2YXRlIHZvaWQgX3dyaXRlQ29udmVydGVyU3VtbWFyeShXcml0ZXIgb3V0LCBDb252ZXJ0ZXJCZWFuIGJlYW4pIHRocm93cyBJT0V4Y2VwdGlvbgotICB7Ci0gICAgb3V0LndyaXRlKCIgICA8Yj5UYWcgbmFtZTo8L2I+ICZsdDsiICsKLSAgICAgICAgICAgICAgX2dldFF1YWxpZmllZE5hbWUoYmVhbi5nZXRUYWdOYW1lKCkpICsgIiZndDtcbiIpOwotICAgIG91dC53cml0ZSgiICAgPGJyLz5cbiIpOwotICAgIAotICAgIG91dC53cml0ZSgiICAgPGJyLz5cbiIpOwotICAgIG91dC53cml0ZSgiICAgPGI+IHR5cGU6PC9iPiAiICsgYmVhbi5nZXRDb252ZXJ0ZXJJZCgpICsgICJcbiIpOwotICAgIG91dC53cml0ZSgiICAgPGJyLz5cbiIpOwotCi0gICAgU3RyaW5nIGRvYyA9IGJlYW4uZ2V0TG9uZ0Rlc2NyaXB0aW9uKCk7Ci0gICAgaWYgKGRvYyA9PSBudWxsKQotICAgIHsKLSAgICAgIGRvYyA9IGJlYW4uZ2V0RGVzY3JpcHRpb24oKTsKLSAgICB9Ci0KLSAgICBvdXQud3JpdGUoX3ByZVRvU291cmNlKGRvYykpOwotICAgIG91dC53cml0ZSgiXG4iKTsKLSAgfQotCi0gIHN0YXRpYyBwcml2YXRlIGZpbmFsIFN0cmluZyBfcHJlVG9Tb3VyY2UoU3RyaW5nIGluKQotICB7Ci0gICAgaW4gPSBpbi5yZXBsYWNlQWxsKCI8cHJlPiIsICI8c291cmNlPjwhW0NEQVRBWyIpOwotICAgIGluID0gaW4ucmVwbGFjZUFsbCgiPC9wcmU+IiwgIl1dPjwvc291cmNlPiIpOwotICAgIGluID0gaW4ucmVwbGFjZUFsbCgiPGh0bWw6IiwgIjwiKTsKLSAgICBpbiA9IGluLnJlcGxhY2VBbGwoIjwvaHRtbDoiLCAiPC8iKTsKLQotICAgIHJldHVybiBpbjsKLSAgfQotICAKLSAgc3RhdGljIHByaXZhdGUgZmluYWwgU3RyaW5nIF9wbGF0Zm9ybUFnbm9zdGljUGF0aChTdHJpbmcgcGF0aCkKLSAgewotICAgICAgcmV0dXJuIHBhdGgucmVwbGFjZSgnLycsIEZpbGUuc2VwYXJhdG9yQ2hhcik7Ci0gIH0KLQotCi0gIHByaXZhdGUgY2xhc3MgR3JvdXBDb21wYXJhdG9yIGltcGxlbWVudHMgQ29tcGFyYXRvcgotICB7Ci0gICAgcHVibGljIGludCBjb21wYXJlKE9iamVjdCBvMSwgT2JqZWN0IG8yKQotICAgIHsKLSAgICAgIHJldHVybiBfZ2V0R3JvdXBJbmRleChvMSkgLSBfZ2V0R3JvdXBJbmRleChvMik7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKQotICAgIHsKLSAgICAgIHJldHVybiAobyBpbnN0YW5jZW9mIEdyb3VwQ29tcGFyYXRvcik7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBoYXNoQ29kZSgpCi0gICAgewotICAgICAgLy8gWWVzLCB0aGlzIGlzIGEgdmVyeSBzdHJhbmdlIGhhc2hDb2RlIGltcGxlbWVudGF0aW9uLiBCdXQgdGhlCi0gICAgICAvLyBlcXVhbHMgbWV0aG9kIGlzIGFsc28gdmVyeSBzdHJhbmdlOyBhbnkgdHdvIEdyb3VwQ29tcGFyYXRvcgotICAgICAgLy8gb2JqZWN0cyBhcmUgYWx3YXlzIGVxdWFsLiBUaGVyZWZvcmUgYnkgdGhlIGphdmEgcnVsZXMsIGFueQotICAgICAgLy8gdHdvIEdyb3VwQ29tcGFyYXRvciBvYmplY3RzIG11c3QgYWx3YXlzIGhhdmUgdGhlIHNhbWUgaGFzaENvZGUuCi0gICAgICByZXR1cm4gMTc7ICAvLyBhbiBhcmJpdHJhcnkgY29uc3RhbnQuCi0gICAgfQotCi0gICAgcHJpdmF0ZSBpbnQgX2dldEdyb3VwSW5kZXgoT2JqZWN0IG8pCi0gICAgewotICAgICAgU3RyaW5nIHMgPSAobyA9PSBudWxsKSA/IG51bGwgOiBvLnRvU3RyaW5nKCk7Ci0KLQotCi0KLSAgICAgIGlmICgibWVzc2FnZSIuZXF1YWxzSWdub3JlQ2FzZShzKSkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgICB9Ci0KLSAgICAgIGlmICgiY29yZSIuZXF1YWxzSWdub3JlQ2FzZShzKSkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgICB9Ci0gICAgICBpZiAoImV2ZW50cyIuZXF1YWxzSWdub3JlQ2FzZShzKSkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIDI7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChzICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGdldExvZygpLndhcm4oIlVOS05PV04gQVRUUklCVVRFIEdST1VQOiAiICsgcyk7Ci0gICAgICB9Ci0KLSAgICAgIHJldHVybiAzOwotICAgIH0KLSAgfQotCi0KLSAgcHJpdmF0ZSB2b2lkIF93cml0ZUNvbXBvbmVudEF0dHJpYnV0ZXMoV3JpdGVyIG91dCwgQ29tcG9uZW50QmVhbiBiZWFuKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgewotICAgIC8vIFNvcnQgdGhlIG5hbWVzCi0gICAgVHJlZVNldCBhdHRyaWJ1dGVzID0gbmV3IFRyZWVTZXQoKTsKLSAgICBJdGVyYXRvciBhdHRycyA9IGJlYW4ucHJvcGVydGllcyh0cnVlKTsKLSAgICB3aGlsZSAoYXR0cnMuaGFzTmV4dCgpKQotICAgIHsKLSAgICAgIFByb3BlcnR5QmVhbiBwcm9wZXJ0eSA9IChQcm9wZXJ0eUJlYW4pIGF0dHJzLm5leHQoKTsKLSAgICAgIGlmICghcHJvcGVydHkuaXNUYWdBdHRyaWJ1dGVFeGNsdWRlZCgpKQotICAgICAgewotICAgICAgICBhdHRyaWJ1dGVzLmFkZChwcm9wZXJ0eS5nZXRQcm9wZXJ0eU5hbWUoKSk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8gTm93IGdldCBhIGxpc3Qgb2YgUHJvcGVydHlCZWFucwotICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBJdGVyYXRvciBpdGVyID0gYXR0cmlidXRlcy5pdGVyYXRvcigpOwotICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBTdHJpbmcgYXR0ck5hbWUgPSAoU3RyaW5nKSBpdGVyLm5leHQoKTsKLSAgICAgIGxpc3QuYWRkKGJlYW4uZmluZFByb3BlcnR5KGF0dHJOYW1lLCB0cnVlKSk7Ci0gICAgfQotICAgIAotCi0gICAgVHJlZVNldCBncm91cHMgPSBuZXcgVHJlZVNldChuZXcgR3JvdXBDb21wYXJhdG9yKCkpOwotICAgIC8qIE5vIGN1cnJlbnQgc3VwcG9ydCBmb3IgZ3JvdXBpbmcKLSAgICAvLyBNYWtlIHN1cmUgIm51bGwiIGlzIHRoZSByZXByZXNlbnRhdGl2ZSBmb3IgdW5rbm93biBncm91cHMKLSAgICBJdGVyYXRvciBpdGVyID0gYXR0cmlidXRlcy5pdGVyYXRvcigpOwotICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBTdHJpbmcgZ3JvdXAgPSAoKEF0dHJpYnV0ZURvYykgaXRlci5uZXh0KCkpLmdyb3VwOwotICAgICAgaWYgKGdyb3VwICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGdyb3Vwcy5hZGQoZ3JvdXApOwotICAgICAgfQotICAgIH0KLSAgICAqLwotCi0gICAgX3dyaXRlQ29tcG9uZW50QXR0cmlidXRlcyhvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0Lml0ZXJhdG9yKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWFuLmdldENvbXBvbmVudENsYXNzKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cHMuaXNFbXB0eSgpID8gbnVsbCA6ICJVbmdyb3VwZWQiKTsKLQotICAgIEl0ZXJhdG9yIGdyb3VwSXRlciA9IGdyb3Vwcy5pdGVyYXRvcigpOwotICAgIHdoaWxlIChncm91cEl0ZXIuaGFzTmV4dCgpKQotICAgIHsKLSAgICAgIF93cml0ZUNvbXBvbmVudEF0dHJpYnV0ZXMob3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0Lml0ZXJhdG9yKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlYW4uZ2V0Q29tcG9uZW50Q2xhc3MoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFN0cmluZykgZ3JvdXBJdGVyLm5leHQoKSk7Ci0gICAgfQotCi0gIH0KLQotCi0gIHByaXZhdGUgdm9pZCBfd3JpdGVDb252ZXJ0ZXJBdHRyaWJ1dGVzKFdyaXRlciBvdXQsIENvbnZlcnRlckJlYW4gYmVhbikgdGhyb3dzIElPRXhjZXB0aW9uCi0gIHsKLSAgICAvLyBTb3J0IHRoZSBuYW1lcwotICAgIFRyZWVTZXQgYXR0cmlidXRlcyA9IG5ldyBUcmVlU2V0KCk7Ci0gICAgSXRlcmF0b3IgYXR0cnMgPSBiZWFuLnByb3BlcnRpZXMoKTsKLSAgICB3aGlsZSAoYXR0cnMuaGFzTmV4dCgpKQotICAgIHsKLSAgICAgIFByb3BlcnR5QmVhbiBwcm9wZXJ0eSA9IChQcm9wZXJ0eUJlYW4pIGF0dHJzLm5leHQoKTsKLSAgICAgIGlmICghcHJvcGVydHkuaXNUYWdBdHRyaWJ1dGVFeGNsdWRlZCgpKQotICAgICAgewotICAgICAgICBhdHRyaWJ1dGVzLmFkZChwcm9wZXJ0eS5nZXRQcm9wZXJ0eU5hbWUoKSk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8gTm93IGdldCBhIGxpc3Qgb2YgUHJvcGVydHlCZWFucwotICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBJdGVyYXRvciBpdGVyID0gYXR0cmlidXRlcy5pdGVyYXRvcigpOwotICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBTdHJpbmcgYXR0ck5hbWUgPSAoU3RyaW5nKSBpdGVyLm5leHQoKTsKLSAgICAgIGxpc3QuYWRkKGJlYW4uZmluZFByb3BlcnR5KGF0dHJOYW1lKSk7Ci0gICAgfQotICAgIAotICAgIF93cml0ZUNvbXBvbmVudEF0dHJpYnV0ZXMob3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdC5pdGVyYXRvcigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVhbi5nZXRDb252ZXJ0ZXJDbGFzcygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCk7Ci0gIH0KLQotCi0KLSAgcHJpdmF0ZSB2b2lkIF93cml0ZVZhbGlkYXRvckF0dHJpYnV0ZXMoV3JpdGVyIG91dCwgVmFsaWRhdG9yQmVhbiBiZWFuKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgewotICAgIC8vIFNvcnQgdGhlIG5hbWVzCi0gICAgVHJlZVNldCBhdHRyaWJ1dGVzID0gbmV3IFRyZWVTZXQoKTsKLSAgICBJdGVyYXRvciBhdHRycyA9IGJlYW4ucHJvcGVydGllcygpOwotICAgIHdoaWxlIChhdHRycy5oYXNOZXh0KCkpCi0gICAgewotICAgICAgUHJvcGVydHlCZWFuIHByb3BlcnR5ID0gKFByb3BlcnR5QmVhbikgYXR0cnMubmV4dCgpOwotICAgICAgaWYgKCFwcm9wZXJ0eS5pc1RhZ0F0dHJpYnV0ZUV4Y2x1ZGVkKCkpCi0gICAgICB7Ci0gICAgICAgIGF0dHJpYnV0ZXMuYWRkKHByb3BlcnR5LmdldFByb3BlcnR5TmFtZSgpKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBOb3cgZ2V0IGEgbGlzdCBvZiBQcm9wZXJ0eUJlYW5zCi0gICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIEl0ZXJhdG9yIGl0ZXIgPSBhdHRyaWJ1dGVzLml0ZXJhdG9yKCk7Ci0gICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKQotICAgIHsKLSAgICAgIFN0cmluZyBhdHRyTmFtZSA9IChTdHJpbmcpIGl0ZXIubmV4dCgpOwotICAgICAgbGlzdC5hZGQoYmVhbi5maW5kUHJvcGVydHkoYXR0ck5hbWUpKTsKLSAgICB9Ci0gICAgCi0gICAgX3dyaXRlQ29tcG9uZW50QXR0cmlidXRlcyhvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0Lml0ZXJhdG9yKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWFuLmdldFZhbGlkYXRvckNsYXNzKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsKTsKLSAgfQotCi0KLQotICBwcml2YXRlIHZvaWQgX3dyaXRlQ29tcG9uZW50QXR0cmlidXRlcyhXcml0ZXIgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJdGVyYXRvciBhdHRyaWJ1dGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgY2xhc3NOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZ3JvdXApIHRocm93cyBJT0V4Y2VwdGlvbgotICB7Ci0gICAgYm9vbGVhbiB3cml0dGVuQW55QXR0cmlidXRlcyA9IGZhbHNlOwotCi0gICAgd2hpbGUgKGF0dHJpYnV0ZXMuaGFzTmV4dCgpKQotICAgIHsKLSAgICAgIFByb3BlcnR5QmVhbiBhdHRyID0gKFByb3BlcnR5QmVhbikgYXR0cmlidXRlcy5uZXh0KCk7Ci0KLSAgICAgIC8qCi0gICAgICBpZiAoKGdyb3VwID09IG51bGwpIHx8ICJVbmdyb3VwZWQiLmVxdWFscyhncm91cCkpCi0gICAgICB7Ci0gICAgICAgIGlmIChkb2MuZ3JvdXAgIT0gbnVsbCkKLSAgICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgaWYgKCFncm91cC5lcXVhbHNJZ25vcmVDYXNlKGRvYy5ncm91cCkpCi0gICAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0gICAgICAqLwotCi0gICAgICBpZiAoIXdyaXR0ZW5BbnlBdHRyaWJ1dGVzKQotICAgICAgewotICAgICAgICB3cml0dGVuQW55QXR0cmlidXRlcyA9IHRydWU7Ci0gICAgICAgIGlmIChncm91cCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgU3RyaW5nIHNlY3Rpb25OYW1lOwotICAgICAgICAgIGlmICgiZXZlbnRzIi5lcXVhbHNJZ25vcmVDYXNlKGdyb3VwKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBzZWN0aW9uTmFtZSA9ICJKYXZhc2NyaXB0IGF0dHJpYnV0ZXMiOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgewotICAgICAgICAgICAgc2VjdGlvbk5hbWUgPSBncm91cCArICIgYXR0cmlidXRlcyI7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgb3V0LndyaXRlKCI8c3Vic2VjdGlvbiBuYW1lPVwiIiArIHNlY3Rpb25OYW1lICsgIlwiPlxuIik7Ci0gICAgICAgIH0KLQotICAgICAgICBvdXQud3JpdGUoIjx0YWJsZT5cbiIpOwotICAgICAgICBvdXQud3JpdGUoIjx0cj5cbiIpOwotICAgICAgICBvdXQud3JpdGUoIjx0aD5OYW1lPC90aD5cbiIpOwotICAgICAgICBvdXQud3JpdGUoIjx0aD5UeXBlPC90aD5cbiIpOwotICAgICAgICBvdXQud3JpdGUoIjx0aD5TdXBwb3J0cyBFTD88L3RoPlxuIik7Ci0gICAgICAgIGlmICghX2F0dHJEb2NTcGFuc0NvbHVtbnMpCi0gICAgICAgIHsKLSAgICAgICAgICBvdXQud3JpdGUoIjx0aD5EZXNjcmlwdGlvbjwvdGg+XG4iKTsKLSAgICAgICAgfQotICAgICAgICBvdXQud3JpdGUoIjwvdHI+XG4iKTsKLSAgICAgIH0KLQotICAgICAgU3RyaW5nIHByb3BlcnR5TmFtZSA9IGF0dHIuZ2V0UHJvcGVydHlOYW1lKCk7Ci0gICAgICAvLyBRdWljayBmaXggb2YgcHJvYmxlbXMgd2l0aCBhY3Rpb25FeHByZXNzaW9uIHZzLiBhY3Rpb24KLSAgICAgIC8vIGFjdGlvbkV4cHJlc3Npb24gaXMgdGhlIE1ldGhvZEV4cHJlc3Npb24gb24gdGhlIGNvbXBvbmVudCwKLSAgICAgIC8vIGJ1dCBvbiB0aGUgdGFnIGl0J3MgJ2FjdGlvbicKLSAgICAgIGlmICgiYWN0aW9uRXhwcmVzc2lvbiIuZXF1YWxzKHByb3BlcnR5TmFtZSkpCi0gICAgICB7Ci0gICAgICAgIHByb3BlcnR5TmFtZSA9ICJhY3Rpb24iOwotICAgICAgfQotCi0gICAgICBvdXQud3JpdGUoIjx0cj5cbiIpOwotICAgICAgb3V0LndyaXRlKCI8dGQ+IiArIHByb3BlcnR5TmFtZSArICI8L3RkPiIpOwotICAgICAgU3RyaW5nIHR5cGUgPSBfZ2V0RGlzcGxheVR5cGUoY2xhc3NOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0ci5nZXRQcm9wZXJ0eUNsYXNzKCkpOwotCi0gICAgICBvdXQud3JpdGUoIjx0ZD4iICsgdHlwZSArICI8L3RkPiIpOwotCi0gICAgICBTdHJpbmcgZWxTdXBwb3J0ZWQ7Ci0gICAgICAvLyBNZXRob2RCaW5kaW5ncywgImJpbmRpbmciLCBhbmQgc29tZSBvdGhlciBhdHRyaWJ1dGVzCi0gICAgICAvLyByZXF1aXJlIEVMIHN1cHBvcnQKLSAgICAgIGlmIChhdHRyLmlzTWV0aG9kQmluZGluZygpIHx8IAotICAgICAgICAgIGF0dHIuaXNNZXRob2RFeHByZXNzaW9uKCkgfHwKLSAgICAgICAgICAiYmluZGluZyIuZXF1YWxzKHByb3BlcnR5TmFtZSkpCi0gICAgICB7Ci0gICAgICAgIC8vICJhY3Rpb24iIGRvZXNuJ3QgcmVxdWlyZSBFTDsgYWxsIGVsc2UgZG8uCi0gICAgICAgIGVsU3VwcG9ydGVkID0gImFjdGlvbiIuZXF1YWxzKHByb3BlcnR5TmFtZSkgPyAiWWVzIiA6ICJPbmx5IEVMIjsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgZWxTdXBwb3J0ZWQgPSBhdHRyLmlzTGl0ZXJhbE9ubHkoKSA/ICJObyIgOiAiWWVzIjsKLSAgICAgIH0KLQotICAgICAgb3V0LndyaXRlKCI8dGQ+IiArIGVsU3VwcG9ydGVkICsgIjwvdGQ+Iik7Ci0KLSAgICAgIGlmIChhdHRyLmdldERlc2NyaXB0aW9uKCkgICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyB2YWxTdHIgPSBfZm9ybWF0UHJvcExpc3QoYXR0ci5nZXRQcm9wZXJ0eVZhbHVlcygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWYWxpZCBWYWx1ZXMiKTsKLSAgICAgICAgU3RyaW5nIHVuc3VwQWdlbnRzU3RyID0KLSAgICAgICAgICBfZm9ybWF0UHJvcExpc3QoYXR0ci5nZXRVbnN1cHBvcnRlZEFnZW50cygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAiTm90IHN1cHBvcnRlZCBvbiB0aGUgZm9sbG93aW5nIGFnZW50cyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIF9OT05fRE9DVU1FTlRFRF9BR0VOVFMpOwotICAgICAgICBTdHJpbmcgdW5zdXBSa1N0ciA9Ci0gICAgICAgICAgX2Zvcm1hdFByb3BMaXN0KGF0dHIuZ2V0VW5zdXBwb3J0ZWRSZW5kZXJLaXRzKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICJOb3Qgc3VwcG9ydGVkIG9uIHRoZSBmb2xsb3dpbmcgcmVuZGVya2l0cyIpOwotCi0gICAgICAgIGlmIChfYXR0ckRvY1NwYW5zQ29sdW1ucykKLSAgICAgICAgewotICAgICAgICAgIG91dC53cml0ZSgiPC90cj5cbiIpOwotICAgICAgICAgIG91dC53cml0ZSgiPHRyPlxuIik7Ci0gICAgICAgICAgb3V0LndyaXRlKCI8dGQgY29sc3Bhbj1cIjNcIj5cbiIpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIG91dC53cml0ZSgiPHRkPlxuIik7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vICAgICAgICBvdXQud3JpdGUoRXNjYXBlVXRpbHMuZXNjYXBlRWxlbWVudFZhbHVlKGRvYy5kb2MpKTsKLSAgICAgICAgaWYgKHZhbFN0ciAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgb3V0LndyaXRlKHZhbFN0cik7Ci0gICAgICAgICAgb3V0LndyaXRlKCI8YnIvPiIpOwotICAgICAgICB9Ci0gICAgICAgIG91dC53cml0ZShhdHRyLmdldERlc2NyaXB0aW9uKCkpOwotICAgICAgICBpZiAodW5zdXBBZ2VudHNTdHIgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIG91dC53cml0ZSgiPGJyLz4iKTsKLSAgICAgICAgICBvdXQud3JpdGUodW5zdXBBZ2VudHNTdHIpOwotICAgICAgICB9Ci0gICAgICAgIGlmICh1bnN1cFJrU3RyICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBvdXQud3JpdGUoIjxici8+Iik7Ci0gICAgICAgICAgb3V0LndyaXRlKHVuc3VwUmtTdHIpOwotICAgICAgICB9Ci0gICAgICAgIC8vb3V0LndyaXRlKEVzY2FwZVV0aWxzLmVzY2FwZUFtcGVyc2FuZHMoZG9jLmRvYykpOwotICAgICAgICBvdXQud3JpdGUoIjwvdGQ+XG4iKTsKLSAgICAgIH0KLQotICAgICAgb3V0LndyaXRlKCI8L3RyPlxuIik7Ci0gICAgfQotCi0gICAgaWYgKHdyaXR0ZW5BbnlBdHRyaWJ1dGVzKQotICAgIHsKLSAgICAgIG91dC53cml0ZSgiPC90YWJsZT5cbiIpOwotICAgICAgaWYgKGdyb3VwICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIG91dC53cml0ZSgiPC9zdWJzZWN0aW9uPlxuIik7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgc3RhdGljIHByaXZhdGUgU3RyaW5nIF9nZXREaXNwbGF5VHlwZShTdHJpbmcgY2xhc3NOYW1lLCBTdHJpbmcgbmFtZSwgU3RyaW5nIHR5cGUpCi0gIHsKLSAgICBpZiAodHlwZS5zdGFydHNXaXRoKCJqYXZhLmxhbmcuIikpCi0gICAgewotICAgICAgcmV0dXJuIHR5cGUuc3Vic3RyaW5nKCJqYXZhLmxhbmcuIi5sZW5ndGgoKSk7Ci0gICAgfQotICAgIGVsc2UgaWYgKCJiaW5kaW5nIi5lcXVhbHMobmFtZSkpCi0gICAgewotICAgICAgU3RyaW5nVG9rZW5pemVyIHRva2VucyA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoY2xhc3NOYW1lLCAiLiIsIHRydWUpOwotICAgICAgU3RyaW5nIG91dCA9ICIiOwotICAgICAgd2hpbGUgKHRva2Vucy5oYXNNb3JlVG9rZW5zKCkpCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyB0b2tlbiA9IHRva2Vucy5uZXh0VG9rZW4oKTsKLSAgICAgICAgb3V0ID0gb3V0ICsgdG9rZW47Ci0gICAgICAgIC8vIEdpdmUgb3Vyc2VsdmVzIGFuIG9wcG9ydHVuaXR5IGZvciBhIGxpbmUgYnJlYWsgYWZ0ZXIgImNvbXBvbmVudC4iOwotICAgICAgICBpZiAob3V0LmVuZHNXaXRoKCJjb21wb25lbnQuIikpCi0gICAgICAgIHsKLSAgICAgICAgICBvdXQgPSBvdXQgKyAiPHdici8+IjsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICByZXR1cm4gb3V0OwotICAgIH0KLQotICAgIHJldHVybiB0eXBlOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIF93cml0ZUNvbXBvbmVudEV2ZW50cyhXcml0ZXIgb3V0LCBDb21wb25lbnRCZWFuIGJlYW4pIHRocm93cyBJT0V4Y2VwdGlvbgotICB7Ci0gICAgb3V0LndyaXRlKCI8dGFibGU+XG4iKTsKLSAgICBvdXQud3JpdGUoIjx0cj5cbiIpOwotICAgIG91dC53cml0ZSgiPHRoPlR5cGU8L3RoPlxuIik7Ci0gICAgb3V0LndyaXRlKCI8dGg+UGhhc2VzPC90aD5cbiIpOwotICAgIG91dC53cml0ZSgiPHRoPkRlc2NyaXB0aW9uPC90aD5cbiIpOwotICAgIG91dC53cml0ZSgiPC90cj5cbiIpOwotCi0gICAgSXRlcmF0b3IgaXRlciA9IGJlYW4uZXZlbnRzKHRydWUpOwotICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBFdmVudFJlZkJlYW4gZXZlbnRSZWYgPSAoRXZlbnRSZWZCZWFuKSBpdGVyLm5leHQoKTsKLSAgICAgIEV2ZW50QmVhbiAgICBldmVudCA9IGV2ZW50UmVmLnJlc29sdmVFdmVudFR5cGUoKTsKLQotICAgICAgb3V0LndyaXRlKCI8dHI+XG4iKTsKLSAgICAgIG91dC53cml0ZSgiPHRkPiIgKyBldmVudC5nZXRFdmVudENsYXNzKCkgKyAiPC90ZD4iKTsKLSAgICAgIG91dC53cml0ZSgiPHRkIG5vd3JhcD1cIm5vd3JhcFwiPiIpOwotICAgICAgU3RyaW5nW10gcGhhc2VzID0gZXZlbnRSZWYuZ2V0RXZlbnREZWxpdmVyeVBoYXNlcygpOwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwaGFzZXMubGVuZ3RoOyBpKyspCi0gICAgICB7Ci0gICAgICAgIGlmIChpID4gMCkKLSAgICAgICAgewotICAgICAgICAgIG91dC53cml0ZSgiLDxici8+Iik7Ci0gICAgICAgIH0KLSAgICAgICAgb3V0LndyaXRlKChTdHJpbmcpIHBoYXNlc1tpXSk7Ci0gICAgICB9Ci0KLSAgICAgIG91dC53cml0ZSgiPC90ZD4iKTsKLSAgICAgIG91dC53cml0ZSgiPHRkPiIgKyBldmVudC5nZXREZXNjcmlwdGlvbigpICsgIjwvdGQ+Iik7Ci0gICAgICBvdXQud3JpdGUoIjwvdHI+XG4iKTsKLSAgICB9Ci0KLSAgICBvdXQud3JpdGUoIjwvdGFibGU+XG4iKTsKLSAgfQotCi0KLQotCi0KLSAgcHJpdmF0ZSB2b2lkIF93cml0ZUNvbXBvbmVudEZhY2V0cyhXcml0ZXIgb3V0LCBDb21wb25lbnRCZWFuIGJlYW4pIHRocm93cyBJT0V4Y2VwdGlvbgotICB7Ci0gICAgLy8gU29ydCB0aGUgZmFjZXRzCi0gICAgVHJlZVNldCBmYWNldE5hbWVzID0gbmV3IFRyZWVTZXQoKTsKLSAgICBJdGVyYXRvciBpdGVyID0gYmVhbi5mYWNldHModHJ1ZSk7Ci0gICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKQotICAgIHsKLSAgICAgIGZhY2V0TmFtZXMuYWRkKCgoRmFjZXRCZWFuKSBpdGVyLm5leHQoKSkuZ2V0RmFjZXROYW1lKCkpOwotICAgIH0KLQotICAgIG91dC53cml0ZSgiPHRhYmxlPlxuIik7Ci0gICAgb3V0LndyaXRlKCI8dHI+XG4iKTsKLSAgICBvdXQud3JpdGUoIjx0aD5OYW1lPC90aD5cbiIpOwotICAgIG91dC53cml0ZSgiPHRoPkRlc2NyaXB0aW9uPC90aD5cbiIpOwotICAgIG91dC53cml0ZSgiPC90cj5cbiIpOwotCi0gICAgSXRlcmF0b3IgbmFtZUl0ZXIgPSBmYWNldE5hbWVzLml0ZXJhdG9yKCk7Ci0gICAgd2hpbGUgKG5hbWVJdGVyLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBTdHJpbmcgbmFtZSA9IChTdHJpbmcpIG5hbWVJdGVyLm5leHQoKTsKLSAgICAgIEZhY2V0QmVhbiBmYWNldCA9IGJlYW4uZmluZEZhY2V0KG5hbWUsIHRydWUpOwotICAgICAgb3V0LndyaXRlKCI8dHI+XG4iKTsKLSAgICAgIG91dC53cml0ZSgiPHRkPiIgKyBmYWNldC5nZXRGYWNldE5hbWUoKSArICI8L3RkPiIpOwotICAgICAgb3V0LndyaXRlKCI8dGQ+Iik7Ci0gICAgICBvdXQud3JpdGUoZmFjZXQuZ2V0RGVzY3JpcHRpb24oKSk7Ci0gICAgICBvdXQud3JpdGUoIjwvdGQ+XG4iKTsKLSAgICAgIG91dC53cml0ZSgiPC90cj5cbiIpOwotICAgIH0KLQotICAgIG91dC53cml0ZSgiPC90YWJsZT5cbiIpOwotICB9Ci0KLQotCi0KLSAgcHJvdGVjdGVkIE1hdmVuUHJvamVjdCBnZXRQcm9qZWN0KCkKLSAgewotICAgIHJldHVybiBwcm9qZWN0OwotICB9Ci0gIAotICBwcm90ZWN0ZWQgU3RyaW5nIGdldE91dHB1dERpcmVjdG9yeSgpCi0gIHsKLSAgICByZXR1cm4gb3V0cHV0RGlyZWN0b3J5LmdldEFic29sdXRlUGF0aCgpOwotICB9Ci0KLSAgcHJvdGVjdGVkIFNpdGVSZW5kZXJlciBnZXRTaXRlUmVuZGVyZXIoKQotICB7Ci0gICAgcmV0dXJuIHNpdGVSZW5kZXJlcjsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSggTG9jYWxlIGxvY2FsZSApCi0gIHsKLSAgICByZXR1cm4gIkpTRiBUYWcgRG9jdW1lbnRhdGlvbiI7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCBMb2NhbGUgbG9jYWxlICkKLSAgewotICAgIHJldHVybiAiRG9jdW1lbnRhdGlvbiBmb3IgSlNGIFRhZ3MiOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRPdXRwdXROYW1lKCkKLSAgewotICAgIHJldHVybiAidGFnZG9jIjsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NJbmRleCgKLSAgICBNYXZlblByb2plY3QgcHJvamVjdCwKLSAgICBTdHJpbmcgICAgICAgcmVzb3VyY2VQYXRoKSB0aHJvd3MgTWF2ZW5SZXBvcnRFeGNlcHRpb24KLSAgewotICAgIF9mYWNlc0NvbmZpZyA9IG5ldyBGYWNlc0NvbmZpZ0JlYW4oKTsKLQotICAgIFVSTFtdIGluZGV4ID0gcmVhZEluZGV4KHByb2plY3QpOwotICAgIGZvciAoaW50IGk9MDsgaSA8IGluZGV4Lmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIHByb2Nlc3NJbmRleEVudHJ5KGluZGV4W2ldKTsKLSAgICB9Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzSW5kZXhFbnRyeSgKLSAgICBVUkwgZW50cnkpIHRocm93cyBNYXZlblJlcG9ydEV4Y2VwdGlvbgotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgbmV3IEZhY2VzQ29uZmlnUGFyc2VyKCkubWVyZ2UoX2ZhY2VzQ29uZmlnLCBlbnRyeSk7Ci0gICAgfQotICAgIGNhdGNoIChNb2pvRXhlY3V0aW9uRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgdGhyb3cgbmV3IE1hdmVuUmVwb3J0RXhjZXB0aW9uKCJDb3VsZG4ndCBwYXJzZSBmYWNlcyBjb25maWciLGUpOwotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCBGYWNlc0NvbmZpZ0JlYW4gZ2V0RmFjZXNDb25maWcoKQotICB7Ci0gICAgcmV0dXJuIF9mYWNlc0NvbmZpZzsKLSAgfQotCi0KLSAgcHJvdGVjdGVkIExpc3QgZ2V0TWFzdGVyQ29uZmlncygKLSAgICBNYXZlblByb2plY3QgcHJvamVjdCkgdGhyb3dzIE1hdmVuUmVwb3J0RXhjZXB0aW9uCi0gIHsKLSAgICBTdHJpbmcgcmVzb3VyY2VQYXRoID0gIk1FVEEtSU5GL21hdmVuLWZhY2VzLXBsdWdpbi9mYWNlcy1jb25maWcueG1sIjsKLSAgICByZXR1cm4gZ2V0Q29tcGlsZURlcGVuZGVuY3lSZXNvdXJjZXMocHJvamVjdCwgcmVzb3VyY2VQYXRoKTsKLSAgfQotCi0gIHByb3RlY3RlZCBMaXN0IGdldENvbXBpbGVEZXBlbmRlbmN5UmVzb3VyY2VzKAotICAgIE1hdmVuUHJvamVjdCBwcm9qZWN0LAotICAgIFN0cmluZyAgICAgICByZXNvdXJjZVBhdGgpIHRocm93cyBNYXZlblJlcG9ydEV4Y2VwdGlvbgotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgQ2xhc3NMb2FkZXIgY2wgPSBjcmVhdGVDb21waWxlQ2xhc3NMb2FkZXIocHJvamVjdCk7Ci0gICAgICBFbnVtZXJhdGlvbiBlID0gY2wuZ2V0UmVzb3VyY2VzKHJlc291cmNlUGF0aCk7Ci0gICAgICBMaXN0IHVybHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICB3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkKLSAgICAgIHsKLSAgICAgICAgVVJMIHVybCA9IChVUkwpZS5uZXh0RWxlbWVudCgpOwotICAgICAgICB1cmxzLmFkZCh1cmwpOwotICAgICAgfQotICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QodXJscyk7Ci0gICAgfQotICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBNYXZlblJlcG9ydEV4Y2VwdGlvbigiVW5hYmxlIHRvIGdldCByZXNvdXJjZXMgZm9yIHBhdGggIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXCIiICsgcmVzb3VyY2VQYXRoICsgIlwiIiwgZSk7Ci0gICAgfQotCi0gIH0KLQotICBwcm90ZWN0ZWQgVVJMW10gcmVhZEluZGV4KAotICAgIE1hdmVuUHJvamVjdCBwcm9qZWN0KSB0aHJvd3MgTWF2ZW5SZXBvcnRFeGNlcHRpb24KLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIC8vIDEuIHJlYWQgbWFzdGVyIGZhY2VzLWNvbmZpZy54bWwgcmVzb3VyY2VzCi0gICAgICBMaXN0IG1hc3RlcnMgPSBnZXRNYXN0ZXJDb25maWdzKHByb2plY3QpOwotICAgICAgaWYgKG1hc3RlcnMuaXNFbXB0eSgpKQotICAgICAgewotICAgICAgICBnZXRMb2coKS53YXJuKCJNYXN0ZXIgZmFjZXMtY29uZmlnLnhtbCBub3QgZm91bmQiKTsKLSAgICAgICAgcmV0dXJuIG5ldyBVUkxbMF07Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIExpc3QgZW50cmllcyA9IG5ldyBMaW5rZWRMaXN0KCk7Ci0KLSAgICAgICAgU0FYUGFyc2VyRmFjdG9yeSBzcGYgPSBTQVhQYXJzZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAgIHNwZi5zZXROYW1lc3BhY2VBd2FyZSh0cnVlKTsKLSAgICAgICAgLy8gcmVxdWlyZXMgSkFYUCAxLjMsIGluIEphdmFTRSA1LjAKLSAgICAgICAgLy8gc3BmLnNldFhJbmNsdWRlQXdhcmUoZmFsc2UpOwotCi0gICAgICAgIGZvciAoSXRlcmF0b3IgaT1tYXN0ZXJzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICAgICAgewotICAgICAgICAgIFVSTCB1cmwgPSAoVVJMKWkubmV4dCgpOwotICAgICAgICAgIERpZ2VzdGVyIGRpZ2VzdGVyID0gbmV3IERpZ2VzdGVyKHNwZi5uZXdTQVhQYXJzZXIoKSk7Ci0gICAgICAgICAgZGlnZXN0ZXIuc2V0TmFtZXNwYWNlQXdhcmUodHJ1ZSk7Ci0KLSAgICAgICAgICAvLyBYSW5jbHVkZQotICAgICAgICAgIGRpZ2VzdGVyLnNldFJ1bGVOYW1lc3BhY2VVUkkoWEluY2x1ZGVGaWx0ZXIuWElOQ0xVREVfTkFNRVNQQUNFKTsKLSAgICAgICAgICBkaWdlc3Rlci5hZGRDYWxsTWV0aG9kKCJmYWNlcy1jb25maWcvaW5jbHVkZSIsICJhZGQiLCAxKTsKLSAgICAgICAgICBkaWdlc3Rlci5hZGRGYWN0b3J5Q3JlYXRlKCJmYWNlcy1jb25maWcvaW5jbHVkZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUkxDcmVhdGlvbkZhY3RvcnkuY2xhc3MpOwotICAgICAgICAgIGRpZ2VzdGVyLmFkZENhbGxQYXJhbSgiZmFjZXMtY29uZmlnL2luY2x1ZGUiLCAwLCAwKTsKLQotICAgICAgICAgIGRpZ2VzdGVyLnB1c2godXJsKTsKLSAgICAgICAgICBkaWdlc3Rlci5wdXNoKGVudHJpZXMpOwotICAgICAgICAgIGRpZ2VzdGVyLnBhcnNlKHVybC5vcGVuU3RyZWFtKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIChVUkxbXSllbnRyaWVzLnRvQXJyYXkobmV3IFVSTFswXSk7Ci0gICAgICB9Ci0gICAgfQotICAgIGNhdGNoIChQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgdGhyb3cgbmV3IE1hdmVuUmVwb3J0RXhjZXB0aW9uKCJGYWlsZWQgdG8gcGFyc2UgbWFzdGVyIGNvbmZpZyIsIGUpOwotICAgIH0KLSAgICBjYXRjaCAoU0FYRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgdGhyb3cgbmV3IE1hdmVuUmVwb3J0RXhjZXB0aW9uKCJGYWlsZWQgdG8gcGFyc2UgbWFzdGVyIGNvbmZpZyIsIGUpOwotICAgIH0KLSAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgTWF2ZW5SZXBvcnRFeGNlcHRpb24oIkZhaWxlZCB0byBwYXJzZSBtYXN0ZXIgY29uZmlnIiwgZSk7Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSBDbGFzc0xvYWRlciBjcmVhdGVDb21waWxlQ2xhc3NMb2FkZXIoCi0gICAgTWF2ZW5Qcm9qZWN0IHByb2plY3QpIHRocm93cyBNYXZlblJlcG9ydEV4Y2VwdGlvbgotICB7Ci0gICAgVGhyZWFkIGN1cnJlbnQgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpOwotICAgIENsYXNzTG9hZGVyIGNsID0gY3VycmVudC5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKTsKLQotICAgIHRyeQotICAgIHsKLSAgICAgIExpc3QgY2xhc3NwYXRoRWxlbWVudHMgPSBwcm9qZWN0LmdldENvbXBpbGVDbGFzc3BhdGhFbGVtZW50cygpOwotICAgICAgaWYgKCFjbGFzc3BhdGhFbGVtZW50cy5pc0VtcHR5KCkpCi0gICAgICB7Ci0gICAgICAgIFN0cmluZ1tdIGVudHJpZXMgPSAoU3RyaW5nW10pY2xhc3NwYXRoRWxlbWVudHMudG9BcnJheShuZXcgU3RyaW5nWzBdKTsKLSAgICAgICAgVVJMW10gdXJscyA9IG5ldyBVUkxbZW50cmllcy5sZW5ndGhdOwotICAgICAgICBmb3IgKGludCBpPTA7IGkgPCB1cmxzLmxlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgdXJsc1tpXSA9IG5ldyBGaWxlKGVudHJpZXNbaV0pLnRvVVJMKCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2wgPSBuZXcgVVJMQ2xhc3NMb2FkZXIodXJscywgY2wpOwotICAgICAgfQotICAgIH0KLSAgICBjYXRjaCAoRGVwZW5kZW5jeVJlc29sdXRpb25SZXF1aXJlZEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBNYXZlblJlcG9ydEV4Y2VwdGlvbigiRXJyb3IgY2FsY3VsYXRpbmcgc2NvcGUgY2xhc3NwYXRoIiwgZSk7Ci0gICAgfQotICAgIGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgTWF2ZW5SZXBvcnRFeGNlcHRpb24oIkVycm9yIGNhbGN1bGF0aW5nIHNjb3BlIGNsYXNzcGF0aCIsIGUpOwotICAgIH0KLQotICAgIHJldHVybiBjbDsKLSAgfQotCi0gIHN0YXRpYyBwdWJsaWMgY2xhc3MgVVJMQ3JlYXRpb25GYWN0b3J5IGV4dGVuZHMgQWJzdHJhY3RPYmplY3RDcmVhdGlvbkZhY3RvcnkKLSAgewotICAgIHB1YmxpYyBPYmplY3QgY3JlYXRlT2JqZWN0KAotICAgICAgQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uCi0gICAgewotICAgICAgU3RyaW5nIGhyZWYgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCJocmVmIik7Ci0gICAgICBpZiAoaHJlZiA9PSBudWxsKQotICAgICAgewotICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJNaXNzaW5nIGhyZWYgYXR0cmlidXRlIik7Ci0gICAgICB9Ci0KLSAgICAgIFVSTCBtYXN0ZXIgPSAoVVJMKWRpZ2VzdGVyLmdldFJvb3QoKTsKLSAgICAgIHJldHVybiBuZXcgVVJMKG1hc3RlciwgaHJlZik7Ci0gICAgfQotICB9Ci0KLSAgc3RhdGljIHByb3RlY3RlZCBjbGFzcyBTa2lwRmlsdGVyIGV4dGVuZHMgQ29tcG9uZW50RmlsdGVyCi0gIHsKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHQoCi0gICAgICBDb21wb25lbnRCZWFuIGNvbXBvbmVudCkKLSAgICB7Ci0gICAgICBTdHJpbmcgY29tcG9uZW50VHlwZSA9IGNvbXBvbmVudC5nZXRDb21wb25lbnRUeXBlKCk7Ci0KLSAgICAgIC8vIGFsd2F5cyBza2lwIEFQSSBhbmQgYmFzZSBjbGFzcyBnZW5lcmF0aW9uCi0gICAgICByZXR1cm4gKCFjb21wb25lbnRUeXBlLnN0YXJ0c1dpdGgoImphdmF4IikgJiYKLSAgICAgICAgICAgICAgIWNvbXBvbmVudFR5cGUuZW5kc1dpdGgoIkJhc2UiKSk7Ci0gICAgfQotICB9Ci0KLQotCi0gIHByaXZhdGUgY2xhc3MgQ29tcG9uZW50TmFtZXNwYWNlRmlsdGVyIGV4dGVuZHMgQ29tcG9uZW50RmlsdGVyCi0gIHsKLSAgICBwdWJsaWMgQ29tcG9uZW50TmFtZXNwYWNlRmlsdGVyKCkKLSAgICB7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KAotICAgICAgQ29tcG9uZW50QmVhbiBjb21wb25lbnQpCi0gICAgewotICAgICAgaWYgKGNvbXBvbmVudC5nZXRUYWdOYW1lKCkgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotCi0gICAgICByZXR1cm4gdGFnbGlicy5jb250YWluc1ZhbHVlKGNvbXBvbmVudC5nZXRUYWdOYW1lKCkuZ2V0TmFtZXNwYWNlVVJJKCkpOwotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgY2xhc3MgVmFsaWRhdG9yTmFtZXNwYWNlRmlsdGVyIGV4dGVuZHMgVmFsaWRhdG9yRmlsdGVyCi0gIHsKLSAgICBwdWJsaWMgVmFsaWRhdG9yTmFtZXNwYWNlRmlsdGVyKCkKLSAgICB7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KAotICAgICAgVmFsaWRhdG9yQmVhbiBjb21wb25lbnQpCi0gICAgewotICAgICAgaWYgKGNvbXBvbmVudC5nZXRUYWdOYW1lKCkgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotCi0gICAgICByZXR1cm4gdGFnbGlicy5jb250YWluc1ZhbHVlKGNvbXBvbmVudC5nZXRUYWdOYW1lKCkuZ2V0TmFtZXNwYWNlVVJJKCkpOwotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgY2xhc3MgQ29udmVydGVyTmFtZXNwYWNlRmlsdGVyIGV4dGVuZHMgQ29udmVydGVyRmlsdGVyCi0gIHsKLSAgICBwdWJsaWMgQ29udmVydGVyTmFtZXNwYWNlRmlsdGVyKCkKLSAgICB7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KAotICAgICAgQ29udmVydGVyQmVhbiBjb21wb25lbnQpCi0gICAgewotICAgICAgaWYgKGNvbXBvbmVudC5nZXRUYWdOYW1lKCkgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotCi0gICAgICByZXR1cm4gdGFnbGlicy5jb250YWluc1ZhbHVlKGNvbXBvbmVudC5nZXRUYWdOYW1lKCkuZ2V0TmFtZXNwYWNlVVJJKCkpOwotICAgIH0KLSAgfQotCi0KLQotICBzdGF0aWMgZmluYWwgcHJvdGVjdGVkIGNsYXNzIFRhZ0F0dHJpYnV0ZUZpbHRlciBleHRlbmRzIFByb3BlcnR5RmlsdGVyCi0gIHsKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHQoCi0gICAgICBQcm9wZXJ0eUJlYW4gcHJvcGVydHkpCi0gICAgewotICAgICAgcmV0dXJuICghcHJvcGVydHkuaXNUYWdBdHRyaWJ1dGVFeGNsdWRlZCgpKTsKLSAgICB9Ci0gIH0KLQotICBzdGF0aWMgZmluYWwgcHJvdGVjdGVkIGNsYXNzIENvbXBvbmVudFRhZ0ZpbHRlciBleHRlbmRzIENvbXBvbmVudEZpbHRlcgotICB7Ci0gICAgcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KAotICAgICAgQ29tcG9uZW50QmVhbiBjb21wb25lbnQpCi0gICAgewotICAgICAgcmV0dXJuIChjb21wb25lbnQuZ2V0VGFnTmFtZSgpICE9IG51bGwpOwotICAgIH0KLSAgfQotCi0gIHN0YXRpYyBmaW5hbCBwcm90ZWN0ZWQgY2xhc3MgQ29udmVydGVyVGFnRmlsdGVyIGV4dGVuZHMgQ29udmVydGVyRmlsdGVyCi0gIHsKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHQoCi0gICAgICBDb252ZXJ0ZXJCZWFuIGNvbnZlcnRlcikKLSAgICB7Ci0gICAgICByZXR1cm4gKGNvbnZlcnRlci5nZXRUYWdDbGFzcygpICE9IG51bGwpOwotICAgIH0KLSAgfQotCi0gIHN0YXRpYyBmaW5hbCBwcm90ZWN0ZWQgY2xhc3MgVmFsaWRhdG9yVGFnRmlsdGVyIGV4dGVuZHMgVmFsaWRhdG9yRmlsdGVyCi0gIHsKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHQoCi0gICAgICBWYWxpZGF0b3JCZWFuIHZhbGlkYXRvcikKLSAgICB7Ci0gICAgICByZXR1cm4gKHZhbGlkYXRvci5nZXRUYWdDbGFzcygpICE9IG51bGwpOwotICAgIH0KLSAgfQotCi0KLSAgcHJpdmF0ZSBGYWNlc0NvbmZpZ0JlYW4gX2ZhY2VzQ29uZmlnOwotCi0KLQotICAvLyB0b2RvOiBtYWtlIHRoaXMgY29uZmlndXJhYmxlPwotICBwcml2YXRlIGJvb2xlYW4gX2F0dHJEb2NTcGFuc0NvbHVtbnMgPSBmYWxzZTsKLQotICAvKioKLSAgICogU3BlY2lmaWVzIHRoZSBkaXJlY3Rvcnkgd2hlcmUgdGhlIHJlcG9ydCB3aWxsIGJlIGdlbmVyYXRlZAotICAgKgotICAgKiBAcGFyYW1ldGVyIGRlZmF1bHQtdmFsdWU9IiR7cHJvamVjdC5yZXBvcnRpbmcub3V0cHV0RGlyZWN0b3J5fSIKLSAgICogQHJlcXVpcmVkCi0gICAqLwotICBwcml2YXRlIEZpbGUgb3V0cHV0RGlyZWN0b3J5OwotICAKLQotICAvKioKLSAgICogRGlyZWN0b3J5IHdoZXJlIHRoZSBvcmlnaW5hbCBzaXRlIGlzIHByZXNlbnQuCi0gICAqIChUUklFRCB1c2luZyAke2Jhc2VEaXJ9L3NyYy9zaXRlOyAgdGhhdCBpbnNlcnRlZCBhICdudWxsJyBpbnRvCi0gICAqIHRoZSBzdHJpbmcgZm9yIHNvbWUgcmVhc29uLiAgVFJJRUQgdXNpbmcgJHtzaXRlRGlyZWN0b3J5fSwKLSAgICogd2hpY2ggd2FzIHVuZGVmaW5lZC4gIFRSSUVEICR7cHJvamVjdC5kaXJlY3Rvcnl9c3JjL3NpdGU7IHdoaWNoIGFsc28KLSAgICogaW5zZXJ0ZWQgYSBudWxsLiAgJHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vLi4vc3JjL3NpdGUgc2VlbXMgdG8gd29yaywKLSAgICogdGhvdWdoIGl0IGFzc3VtZXMgdGhhdCAke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fSBpcyAKLSAgICogJHtwcm9qZWN0LmRpcmVjdG9yeX0vdGFyZ2V0LgotICAgKiAKLSAgICogQHBhcmFtZXRlciBkZWZhdWx0LXZhbHVlPSIke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS8uLi9zcmMvc2l0ZS8iCi0gICAqIEByZXF1aXJlZAotICAgKi8KLSAgcHJpdmF0ZSBGaWxlIHNpdGVEaXJlY3Rvcnk7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbWV0ZXIgZXhwcmVzc2lvbj0iJHtwcm9qZWN0fSIKLSAgICogQHJlcXVpcmVkCi0gICAqIEByZWFkb25seQotICAgKi8KLSAgcHJpdmF0ZSBNYXZlblByb2plY3QgcHJvamVjdDsKLQotICAvKioKLSAgICogQHBhcmFtZXRlcgotICAgKiBAcmVxdWlyZWQKLSAgICovCi0gIHByaXZhdGUgTWFwIHRhZ2xpYnM7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbWV0ZXIgZXhwcmVzc2lvbj0iTUVUQS1JTkYvbWF2ZW4tZmFjZXMtcGx1Z2luL2ZhY2VzLWNvbmZpZy54bWwiCi0gICAqIEByZXF1aXJlZAotICAgKiBAcmVhZG9ubHkKLSAgICovCi0gIHByaXZhdGUgU3RyaW5nIHJlc291cmNlUGF0aDsKLQotCi0gIC8qKgotICAgKiBAY29tcG9uZW50Ci0gICAqIEByZXF1aXJlZAotICAgKiBAcmVhZG9ubHkKLSAgICovCi0gIHByaXZhdGUgU2l0ZVJlbmRlcmVyIHNpdGVSZW5kZXJlcjsKLQotICBzdGF0aWMgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgX0RPQ19TVUJESVJFQ1RPUlkgPSAidGFnZG9jIjsKLSAgc3RhdGljIHByaXZhdGUgZmluYWwgU3RyaW5nW10gX05PTl9ET0NVTUVOVEVEX0FHRU5UUyA9IHsicGhvbmUiLCAidm9pY2UifTsKLQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy10YWdkb2MtcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9OT1RJQ0UgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLXRhZ2RvYy1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL05PVElDRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmEzZGJkNi4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLXRhZ2RvYy1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL05PVElDRQorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLT09ICBOT1RJQ0UgZmlsZSBjb3JyZXNwb25kaW5nIHRvIHNlY3Rpb24gNChkKSBvZiB0aGUgQXBhY2hlIExpY2Vuc2UsICAgPT0KLT09ICBWZXJzaW9uIDIuMCwgaW4gdGhpcyBjYXNlIGZvciB0aGUgQXBhY2hlIE15RmFjZXMgTWF2ZW4gUGx1Z2lucyAgICAgPT0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSAKLVRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuCi0KLVBvcnRpb25zIG9mIHRoaXMgc29mdHdhcmUgd2VyZSBvcmlnaW5hbGx5IGJhc2VkIG9uIHRoZSBmb2xsb3dpbmc6Ci0KLSAtIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDA2LCBPcmFjbGUgQ29ycCwgPGh0dHA6Ly93d3cub3JhY2xlLmNvbS8+LgotYW5kIGFyZSBsaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gdW5kZXIgdGhlIAotIlNvZnR3YXJlIEdyYW50IGFuZCBDb3Jwb3JhdGUgQ29udHJpYnV0aW9uIExpY2Vuc2UgQWdyZWVtZW50IgotCi1TZWUgdGhlIExJQ0VOU0UudHh0IGZpbGUgZm9yIGluZm9ybWF0aW9uIG9uIGFsbCBsaWNlbnNlcyAKLWFzc29jaWF0ZWQgd2l0aCB0aGlzIHNvZnR3YXJlLgpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy13YWdvbi1wbHVnaW4vTElDRU5TRS50eHQgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLXdhZ29uLXBsdWdpbi9MSUNFTlNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDY0NTY5NS4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLXdhZ29uLXBsdWdpbi9MSUNFTlNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDIwMiArMCwwIEBACi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0Ci0gICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvCi0KLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTgotCi0gICAxLiBEZWZpbml0aW9ucy4KLQotICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwKLSAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgotCi0gICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgotCi0gICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsCi0gICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCi0gICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLAotICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlCi0gICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgotICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlCi0gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5LgotCi0gICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLgotCi0gICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywKLSAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24KLSAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCi0KLSAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsCi0gICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0Ci0gICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sCi0gICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuCi0KLSAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yCi0gICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhCi0gICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKLSAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuCi0KLSAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKLSAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUKLSAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMKLSAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCi0gICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4KLSAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwKLSAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCi0KLSAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nCi0gICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCi0gICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkKLSAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIKLSAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgotICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiCi0gICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50Ci0gICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bwotICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywKLSAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlCi0gICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKLSAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlCi0gICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiIKLQotICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKLSAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZAotICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCi0KLSAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKLSAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLAotICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCi0gICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLgotCi0gICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKLSAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLAotICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUKLSAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCi0gICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpCi0gICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQotICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKLSAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsKLSAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0Ci0gICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCi0gICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUKLSAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4KLQotICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUKLSAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dAotICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKLSAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotCi0gICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgotICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kCi0KLSAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKLSAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQKLQotICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCi0gICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZAotICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssCi0gICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgotICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQKLQotICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCi0gICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdAotICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZAotICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAotICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQotICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkCi0gICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgotICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLAotICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQKLSAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKLSAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kCi0gICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24KLSAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQotICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZAotICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZAotICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KLQotICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kCi0gICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCi0gICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yCi0gICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwKLSAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAotICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4KLQotICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAotICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrCi0gICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCi0gICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5Ci0gICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZAotICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgotCi0gICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlCi0gICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCi0gICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUKLSAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLgotCi0gICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IKLSAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gKLSAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucwotICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQotICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlCi0gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkKLSAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KLQotICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksCi0gICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKLSAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5Ci0gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQotICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAotICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhCi0gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlCi0gICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCi0gICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbAotICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcgotICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgotCi0gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nCi0gICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAotICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwKLSAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzCi0gICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQotICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYKLSAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwKLSAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQotICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbgotICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuCi0KLSAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUwotCi0gICBBUFBFTkRJWDogSG93IHRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmsuCi0KLSAgICAgIFRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmssIGF0dGFjaCB0aGUgZm9sbG93aW5nCi0gICAgICBib2lsZXJwbGF0ZSBub3RpY2UsIHdpdGggdGhlIGZpZWxkcyBlbmNsb3NlZCBieSBicmFja2V0cyAiW10iCi0gICAgICByZXBsYWNlZCB3aXRoIHlvdXIgb3duIGlkZW50aWZ5aW5nIGluZm9ybWF0aW9uLiAoRG9uJ3QgaW5jbHVkZQotICAgICAgdGhlIGJyYWNrZXRzISkgIFRoZSB0ZXh0IHNob3VsZCBiZSBlbmNsb3NlZCBpbiB0aGUgYXBwcm9wcmlhdGUKLSAgICAgIGNvbW1lbnQgc3ludGF4IGZvciB0aGUgZmlsZSBmb3JtYXQuIFdlIGFsc28gcmVjb21tZW5kIHRoYXQgYQotICAgICAgZmlsZSBvciBjbGFzcyBuYW1lIGFuZCBkZXNjcmlwdGlvbiBvZiBwdXJwb3NlIGJlIGluY2x1ZGVkIG9uIHRoZQotICAgICAgc2FtZSAicHJpbnRlZCBwYWdlIiBhcyB0aGUgY29weXJpZ2h0IG5vdGljZSBmb3IgZWFzaWVyCi0gICAgICBpZGVudGlmaWNhdGlvbiB3aXRoaW4gdGhpcmQtcGFydHkgYXJjaGl2ZXMuCi0KLSAgIENvcHlyaWdodCBbeXl5eV0gW25hbWUgb2YgY29weXJpZ2h0IG93bmVyXQotCi0gICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy13YWdvbi1wbHVnaW4vTk9USUNFLnR4dCBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtd2Fnb24tcGx1Z2luL05PVElDRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmZjJmZjkuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy13YWdvbi1wbHVnaW4vTk9USUNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLT09ICBOT1RJQ0UgZmlsZSBjb3JyZXNwb25kaW5nIHRvIHNlY3Rpb24gNChkKSBvZiB0aGUgQXBhY2hlIExpY2Vuc2UsICAgPT0KLT09ICBWZXJzaW9uIDIuMCwgaW4gdGhpcyBjYXNlIGZvciB0aGUgQXBhY2hlIE15RmFjZXMgTWF2ZW4gUGx1Z2lucyAgICAgPT0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSAKLVRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuCi0KLVNlZSB0aGUgTElDRU5TRS50eHQgZmlsZSBmb3IgaW5mb3JtYXRpb24gb24gYWxsIGxpY2Vuc2VzIAotYXNzb2NpYXRlZCB3aXRoIHRoaXMgc29mdHdhcmUuCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLXdhZ29uLXBsdWdpbi9wb20ueG1sIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy13YWdvbi1wbHVnaW4vcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTc3MzNiZS4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLXdhZ29uLXBsdWdpbi9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTUzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICAgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICAgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gICAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICAgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gICAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gICAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gICAgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+Ci0KLSAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotCi0gIDxwYXJlbnQ+Ci0gICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29sczwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtcGx1Z2luLXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjEuMC41PC92ZXJzaW9uPgotICAgICAgPHJlbGF0aXZlUGF0aD4uLi9teWZhY2VzLXBsdWdpbi1wYXJlbnQvcG9tLnhtbDwvcmVsYXRpdmVQYXRoPgotICA8L3BhcmVudD4KLQotCi0gIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzPC9ncm91cElkPgotICA8YXJ0aWZhY3RJZD5teWZhY2VzLXdhZ29uLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgPHZlcnNpb24+MS4wLjEtU05BUFNIT1Q8L3ZlcnNpb24+Ci0gIDxwYWNrYWdpbmc+bWF2ZW4tcGx1Z2luPC9wYWNrYWdpbmc+Ci0gIDxuYW1lPkFwYWNoZSBNeUZhY2VzIEJ1aWxkdG9vbHMgTWF2ZW4yIFdhZ29uIFBsdWdpbjwvbmFtZT4KLSAgCi0gIDxzY20+Ci0gICAgPGNvbm5lY3Rpb24+c2NtOnN2bjpodHRwOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL215ZmFjZXMvbXlmYWNlcy1idWlsZC10b29scy90cnVuay9tYXZlbjItcGx1Z2lucy9teWZhY2VzLXdhZ29uLXBsdWdpbjwvY29ubmVjdGlvbj4KLSAgICA8ZGV2ZWxvcGVyQ29ubmVjdGlvbj5zY206c3ZuOmh0dHBzOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL215ZmFjZXMvbXlmYWNlcy1idWlsZC10b29scy90cnVuay9tYXZlbjItcGx1Z2lucy9teWZhY2VzLXdhZ29uLXBsdWdpbjwvZGV2ZWxvcGVyQ29ubmVjdGlvbj4KLSAgICA8dXJsPmh0dHA6Ly9zdm4uYXBhY2hlLm9yZy92aWV3dmMvbXlmYWNlcy9teWZhY2VzLWJ1aWxkLXRvb2xzL3RydW5rL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtd2Fnb24tcGx1Z2luPC91cmw+Ci0gIDwvc2NtPgotCi0gIDxidWlsZD4KLSAgICA8ZXh0ZW5zaW9ucz4KLSAgICAgIDxleHRlbnNpb24+Ci0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ud2Fnb248L2dyb3VwSWQ+Ci0gICAgICAgIDxhcnRpZmFjdElkPndhZ29uLXNzaC1leHRlcm5hbDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPHZlcnNpb24+MS4wLWFscGhhLTU8L3ZlcnNpb24+Ci0gICAgICA8L2V4dGVuc2lvbj4KLSAgICA8L2V4dGVuc2lvbnM+Ci0gIDwvYnVpbGQ+Ci0gIDxkZXBlbmRlbmNpZXM+Ci0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuPC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tcHJvamVjdDwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjIuMC4yPC92ZXJzaW9uPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW48L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1wbHVnaW4tYXBpPC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+Mi4wLjI8L3ZlcnNpb24+Ci0gICAgPC9kZXBlbmRlbmN5PgotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbjwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFydGlmYWN0PC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+Mi4wLjI8L3ZlcnNpb24+Ci0gICAgPC9kZXBlbmRlbmN5PgotICA8L2RlcGVuZGVuY2llcz4KLQotICA8ZGlzdHJpYnV0aW9uTWFuYWdlbWVudD4KLSAgICA8cmVwb3NpdG9yeT4KLSAgICAgIDxpZD5teWZhY2VzLXN0YWdpbmc8L2lkPgotICAgICAgPG5hbWU+QXBhY2hlIE15RmFjZXMgU3RhZ2luZyBSZXBvc2l0b3J5PC9uYW1lPgotICAgICAgPHVybD5zY3BleGU6Ly9wZW9wbGUuYXBhY2hlLm9yZy93d3cvcGVvcGxlLmFwYWNoZS5vcmcvYnVpbGRzL215ZmFjZXMvbTItc3RhZ2luZy1yZXBvc2l0b3J5PC91cmw+Ci0gICAgPC9yZXBvc2l0b3J5PgotICAgIDxzbmFwc2hvdFJlcG9zaXRvcnk+Ci0gICAgICA8dW5pcXVlVmVyc2lvbj5mYWxzZTwvdW5pcXVlVmVyc2lvbj4KLSAgICAgIDxpZD5hcGFjaGUtbWF2ZW4tc25hcHNob3RzPC9pZD4KLSAgICAgIDxuYW1lPkFwYWNoZSBNYXZlbiBTbmFwc2hvdCBSZXBvc2l0b3J5PC9uYW1lPgotICAgICAgPHVybD5zY3BleGU6Ly9wZW9wbGUuYXBhY2hlLm9yZy93d3cvcGVvcGxlLmFwYWNoZS5vcmcvcmVwby9tMi1zbmFwc2hvdC1yZXBvc2l0b3J5PC91cmw+Ci0gICAgPC9zbmFwc2hvdFJlcG9zaXRvcnk+Ci0gIDwvZGlzdHJpYnV0aW9uTWFuYWdlbWVudD4KLQotICA8cmVwb3J0aW5nPgotICAgIDxwbHVnaW5zPgotICAgICAgPHBsdWdpbj4KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgotICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1qeHItcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgPC9wbHVnaW4+Ci0gICAgICA8cGx1Z2luPgotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+Ci0gICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWphdmFkb2MtcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICA8bGlua3M+Ci0gICAgICAgICAgICA8bGluaz5odHRwOi8vamF2YS5zdW4uY29tL2oyZWUvMS40L2RvY3MvYXBpPC9saW5rPgotICAgICAgICAgICAgPGxpbms+aHR0cDovL2phdmEuc3VuLmNvbS9qMnNlLzEuNS4wL2RvY3MvYXBpPC9saW5rPgotICAgICAgICAgICAgPGxpbms+aHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy9jb21tb25zL2NvbGxlY3Rpb25zL2FwaWRvY3MtQ09MTEVDVElPTlNfM18wLzwvbGluaz4KLSAgICAgICAgICAgIDxsaW5rPmh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvY29tbW9ucy9kYmNwL2FwaWRvY3MvPC9saW5rPgotICAgICAgICAgICAgPGxpbms+aHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy9jb21tb25zL2ZpbGV1cGxvYWQvYXBpZG9jcy88L2xpbms+Ci0gICAgICAgICAgICA8bGluaz5odHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL2NvbW1vbnMvaHR0cGNsaWVudC9hcGlkb2NzLzwvbGluaz4KLSAgICAgICAgICAgIDxsaW5rPmh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvY29tbW9ucy9sb2dnaW5nL2FwaWRvY3MvPC9saW5rPgotICAgICAgICAgICAgPGxpbms+aHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy9jb21tb25zL3Bvb2wvYXBpZG9jcy88L2xpbms+Ci0gICAgICAgICAgICA8bGluaz5odHRwOi8vd3d3Lmp1bml0Lm9yZy9qdW5pdC9qYXZhZG9jLzwvbGluaz4KLSAgICAgICAgICAgIDxsaW5rPmh0dHA6Ly9sb2dnaW5nLmFwYWNoZS5vcmcvbG9nNGovZG9jcy9hcGkvPC9saW5rPgotICAgICAgICAgICAgPGxpbms+aHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy9yZWdleHAvYXBpZG9jcy88L2xpbms+Ci0gICAgICAgICAgICA8bGluaz5odHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL3ZlbG9jaXR5L2FwaS88L2xpbms+Ci0gICAgICAgICAgPC9saW5rcz4KLSAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgPC9wbHVnaW4+Ci0KLSAgICAgIDxwbHVnaW4+Ci0gICAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy5tb2pvPC9ncm91cElkPgotICAgICAgICA8YXJ0aWZhY3RJZD50YWdsaXN0LW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgIDwvcGx1Z2luPgotICAgICAgPHBsdWdpbj4KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgotICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1wbHVnaW4tcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgPC9wbHVnaW4+Ci0gICAgPC9wbHVnaW5zPgotICA8L3JlcG9ydGluZz4KLQotICA8cHJvZmlsZXM+Ci0gICAgPHByb2ZpbGU+Ci0gICAgICA8aWQ+c2lnbi1hcnRpZmFjdHM8L2lkPgotICAgICAgPGFjdGl2YXRpb24+Ci0gICAgICAgIDxwcm9wZXJ0eT4KLSAgICAgICAgICA8bmFtZT5wZXJmb3JtUmVsZWFzZTwvbmFtZT4KLSAgICAgICAgICA8dmFsdWU+dHJ1ZTwvdmFsdWU+Ci0gICAgICAgIDwvcHJvcGVydHk+Ci0gICAgICA8L2FjdGl2YXRpb24+Ci0gICAgICA8YnVpbGQ+Ci0gICAgICAgIDxwbHVnaW5zPgotICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1ncGctcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgPGlkPnNpZ24tYXJ0aWZhY3RzPC9pZD4KLSAgICAgICAgICAgICAgICA8cGhhc2U+dmVyaWZ5PC9waGFzZT4KLSAgICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgICA8Z29hbD5zaWduPC9nb2FsPgotICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgPC9leGVjdXRpb25zPgotICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICA8L3BsdWdpbnM+Ci0gICAgICA8L2J1aWxkPgotICAgIDwvcHJvZmlsZT4KLSAgPC9wcm9maWxlcz4KLQotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy13YWdvbi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL3dhZ29uL1dhZ29uTW9qby5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy13YWdvbi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL3dhZ29uL1dhZ29uTW9qby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYmU3ZmU3Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtd2Fnb24tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi93YWdvbi9XYWdvbk1vam8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1OCArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4ud2Fnb247Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLmFydGlmYWN0Lm1hbmFnZXIuV2Fnb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLkFic3RyYWN0TW9qbzsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5Nb2pvRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucHJvamVjdC5NYXZlblByb2plY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi53YWdvbi5Db25uZWN0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ud2Fnb24uUmVzb3VyY2VEb2VzTm90RXhpc3RFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi53YWdvbi5UcmFuc2ZlckZhaWxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLndhZ29uLlVuc3VwcG9ydGVkUHJvdG9jb2xFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi53YWdvbi5XYWdvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLndhZ29uLmF1dGhlbnRpY2F0aW9uLkF1dGhlbnRpY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ud2Fnb24uYXV0aG9yaXphdGlvbi5BdXRob3JpemF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ud2Fnb24ub2JzZXJ2ZXJzLkRlYnVnOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ud2Fnb24ucmVwb3NpdG9yeS5SZXBvc2l0b3J5OwotCi0KLS8qKgotICogRGVwbG95cyB0aGUgY29udGVudCBvZiBhIGRpcmVjdG9yeSB1c2luZyBzY3AvZmlsZSBwcm90b2NvbC4KLSAqIEZvciBzY3AgcHJvdG9jb2wsIGZpbGVzIGFyZSBwYWNrYWdlZCBpbnRvIHppcCBhcmNoaXZlLAotICogdGhlbiBhcmNoaXZlIGlzIHRyYW5zZnJlZCB0byByZW1vdGUgaG9zdCwgbmV4dGx5IGl0IGlzIHVuLWFyY2hpdmVkLgotICogVGhpcyBtZXRob2Qgb2YgZGVwbG95bWVudCBzaG91bGQgbm9ybWFsbHkgYmUgbXVjaCBmYXN0ZXIKLSAqIHRoZW4gbWFraW5nIGZpbGUgYnkgZmlsZSBjb3B5LiAgRm9yIGZpbGUgcHJvdG9jb2wsIHRoZSBmaWxlcyBhcmUgY29waWVkCi0gKiBkaXJlY3RseSB0byB0aGUgZGVzdGluYXRpb24gZGlyZWN0b3J5LgotICoKLSAqIEB2ZXJzaW9uIAotICogQGdvYWwgZGVwbG95Ci0gKi8KLXB1YmxpYyBjbGFzcyBXYWdvbk1vam8gZXh0ZW5kcyBBYnN0cmFjdE1vam8KLXsKLSAgICAvKioKLSAgICAgKiBEaXJlY3RvcnkgY29udGFpbmluZyB0aGUgZmlsZXMgZm9yIHdhZ29uLgotICAgICAqCi0gICAgICogQHBhcmFtZXRlcgotICAgICAqIEByZXF1aXJlZAotICAgICAqLwotICAgIHByaXZhdGUgRmlsZSBpbnB1dERpcmVjdG9yeTsKLQotICAgIC8qKgotICAgICAgKiBTcGVjaWZpZXMgdGhlIHNlcnZlciBpZC4KLSAgICAgICoKLSAgICAgICogQHBhcmFtZXRlcgotICAgICAgKiAqIEByZXF1aXJlZAotICAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBpZDsKLQotICAgIC8qKgotICAgICAqIFRoZSBmdWxsIFVSTCBvZiB0aGUgc2VydmVyLgotICAgICAqCi0gICAgICogQHBhcmFtZXRlcgotICAgICAqIEByZXF1aXJlZAotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIHVybDsKLSAgICAvKioKLSAgICAgKiBAcGFyYW1ldGVyIGV4cHJlc3Npb249IiR7cHJvamVjdH0iCi0gICAgICogQHJlcXVpcmVkCi0gICAgICogQHJlYWRvbmx5Ci0gICAgICovCi0gICAgcHJpdmF0ZSBNYXZlblByb2plY3QgcHJvamVjdDsKLQotICAgIC8qKgotICAgICAqIEBjb21wb25lbnQKLSAgICAgKi8KLSAgICBwcml2YXRlIFdhZ29uTWFuYWdlciB3YWdvbk1hbmFnZXI7Ci0KLSAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkKLSAgICAgICAgdGhyb3dzIE1vam9FeGVjdXRpb25FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGlmICggIWlucHV0RGlyZWN0b3J5LmV4aXN0cygpICkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IE1vam9FeGVjdXRpb25FeGNlcHRpb24oICJUaGUgaW5wdXREaXJlY3RvcnkgZG9lcyBub3QgZXhpc3QiICk7Ci0gICAgICAgIH0KLQotICAgICAgICBSZXBvc2l0b3J5IHJlcG9zaXRvcnkgPSBuZXcgUmVwb3NpdG9yeSggaWQsIHVybCApOwotCi0KLSAgICAgICAgV2Fnb24gd2Fnb24gPSBudWxsOwotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgd2Fnb24gPSB3YWdvbk1hbmFnZXIuZ2V0V2Fnb24oIHJlcG9zaXRvcnkuZ2V0UHJvdG9jb2woKSApOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoICggVW5zdXBwb3J0ZWRQcm90b2NvbEV4Y2VwdGlvbiBlICkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IE1vam9FeGVjdXRpb25FeGNlcHRpb24oICJVbnN1cHBvcnRlZCBwcm90b2NvbDogJyIgKyByZXBvc2l0b3J5LmdldFByb3RvY29sKCkgKyAiJyIsIGUgKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICggIXdhZ29uLnN1cHBvcnRzRGlyZWN0b3J5Q29weSgpICkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IE1vam9FeGVjdXRpb25FeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgIldhZ29uIHByb3RvY29sICciICsgcmVwb3NpdG9yeS5nZXRQcm90b2NvbCgpICsgIicgZG9lc24ndCBzdXBwb3J0IGRpcmVjdG9yeSBjb3B5aW5nIiApOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIERlYnVnIGRlYnVnID0gbmV3IERlYnVnKCk7Ci0KLSAgICAgICAgICAgIHdhZ29uLmFkZFNlc3Npb25MaXN0ZW5lciggZGVidWcgKTsKLQotICAgICAgICAgICAgd2Fnb24uYWRkVHJhbnNmZXJMaXN0ZW5lciggZGVidWcgKTsKLQotICAgICAgICAgICAgd2Fnb24uY29ubmVjdCggcmVwb3NpdG9yeSwgd2Fnb25NYW5hZ2VyLmdldEF1dGhlbnRpY2F0aW9uSW5mbyggaWQgKSApOwotCi0gICAgICAgICAgICB3YWdvbi5wdXREaXJlY3RvcnkoIGlucHV0RGlyZWN0b3J5LCAiLiIgKTsKLQotICAgICAgICB9Ci0gICAgICAgIGNhdGNoICggUmVzb3VyY2VEb2VzTm90RXhpc3RFeGNlcHRpb24gZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uKCAiRXJyb3IgdXBsb2FkaW5nIiwgZSApOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoICggVHJhbnNmZXJGYWlsZWRFeGNlcHRpb24gZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uKCAiRXJyb3IgdXBsb2FkaW5nIiwgZSApOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoICggQXV0aG9yaXphdGlvbkV4Y2VwdGlvbiBlICkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IE1vam9FeGVjdXRpb25FeGNlcHRpb24oICJFcnJvciB1cGxvYWRpbmciLCBlICk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKCBDb25uZWN0aW9uRXhjZXB0aW9uIGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbiggIkVycm9yIHVwbG9hZGluZyIsIGUgKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoIEF1dGhlbnRpY2F0aW9uRXhjZXB0aW9uIGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbiggIkVycm9yIHVwbG9hZGluZyIsIGUgKTsKLSAgICAgICAgfQotICAgICAgICBmaW5hbGx5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHdhZ29uLmRpc2Nvbm5lY3QoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoICggQ29ubmVjdGlvbkV4Y2VwdGlvbiBlICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBnZXRMb2coKS5lcnJvciggIkVycm9yIGRpc2Nvbm5lY3Rpbmcgd2Fnb24gLSBpZ25vcmVkIiwgZSApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy13YWdvbi1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL0xJQ0VOU0UudHh0IGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy13YWdvbi1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL0xJQ0VOU0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjA1NWVjLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtd2Fnb24tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9MSUNFTlNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDE3NCArMCwwIEBACi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQNCi0gICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvDQotDQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9ODQotDQotICAgMS4gRGVmaW5pdGlvbnMuDQotDQotICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwNCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4NCi0NCi0gICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQ0KLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4NCi0NCi0gICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsDQotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbg0KLSAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sDQotICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlDQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3INCi0gICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUNCi0gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5Lg0KLQ0KLSAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLA0KLSAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24NCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLg0KLQ0KLSAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsDQotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dA0KLSAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwNCi0gICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuDQotDQotICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3INCi0gICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhDQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrDQotICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4NCi0NCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0DQotICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQ0KLSAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMNCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3Nlcw0KLSAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbg0KLSAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwNCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLg0KLQ0KLSAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nDQotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucw0KLSAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQ0KLSAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXINCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCINCi0gICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50DQotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8NCi0gICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLA0KLSAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlDQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0DQotICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UNCi0gICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiINCi0NCi0gICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KLSAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZA0KLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLg0KLQ0KLSAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLA0KLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQ0KLSAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uDQotDQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsDQotICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssDQotICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUNCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcg0KLSAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykNCi0gICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQ0KLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhDQotICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yaw0KLSAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0DQotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcw0KLSAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQ0KLSAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4NCi0NCi0gICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQ0KLSAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dA0KLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91DQotICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6DQotDQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3INCi0gICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQNCi0NCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzDQotICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZA0KLQ0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3Jrcw0KLSAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kDQotICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssDQotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YNCi0gICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZA0KLQ0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cw0KLSAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0DQotICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZA0KLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QNCi0gICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lDQotICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkDQotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3INCi0gICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsDQotICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQNCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzDQotICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQNCi0gICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24NCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUNCi0gICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkDQotICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZA0KLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kDQotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucw0KLSAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3INCi0gICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwNCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgNCi0gICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwNCi0gICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsNCi0gICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLg0KLSAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkNCi0gICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZA0KLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4NCi0NCi0gICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlDQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLA0KLSAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQ0KLSAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLg0KLQ0KLSAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcg0KLSAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gNCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3INCi0gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucw0KLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEENCi0gICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUNCi0gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkNCi0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuDQotDQotICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksDQotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsDQotICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkNCi0gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQ0KLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwNCi0gICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGENCi0gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlDQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLA0KLSAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsDQotICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcg0KLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4NCi0NCi0gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nDQotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwNCi0gICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LA0KLSAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzDQotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkNCi0gICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZg0KLSAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwNCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkNCi0gICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uDQotICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuDQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy13YWdvbi1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL05PVElDRS50eHQgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLXdhZ29uLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvTk9USUNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDVmOTQ1MC4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLXdhZ29uLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvTk9USUNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotQXBhY2hlIE15RmFjZXMNCi1Db3B5cmlnaHQgMjAwNC0yMDA3IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbg0KLQ0KLVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnk6DQotVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4NCi0NCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi1TZWUgdGhlIGZpbGUgTElDRU5TRS50eHQNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLXdhZ29uLXBsdWdpbi9zcmMvc2l0ZS9hcHQvdXNhZ2UuYXB0IGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy13YWdvbi1wbHVnaW4vc3JjL3NpdGUvYXB0L3VzYWdlLmFwdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQ3YTMxNy4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLXdhZ29uLXBsdWdpbi9zcmMvc2l0ZS9hcHQvdXNhZ2UuYXB0CisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotIH5+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotIH5+IGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotIH5+IHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSB+fiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotIH5+ICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gfn4gdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSB+fgotIH5+ICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gfn4KLSB+fiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gfn4gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSB+fiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSB+fiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gfn4gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSAgICAgICAgICAgLS0tLS0KLSAgICAgICAgICAgVXNhZ2UKLSAgICAgICAgICAgLS0tLS0KLQotVXNhZ2UKLQotICBUaGUgcGx1Z2luIG9mZmVycyBhIGdvYWwgZm9yIHRyYW5zcG9ydCB0aGUgY29udGVudCBvZiBhIGRpcmVjdG9yeSB3aXRoIHdhZ29uLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICA8YnVpbGQ+Ci0gICAgPHBsdWdpbnM+Ci0gICAgICAuLi4KLSAgICAgPHBsdWdpbj4KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLm1hdmVuPC9ncm91cElkPgotICAgICAgICA8YXJ0aWZhY3RJZD53YWdvbi1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+Ci0KLSAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgPGlkPm15ZmFjZXMtbmlnaHRseS1idWlsZHM8L2lkPgotICAgICAgICAgIDx1cmw+c2NwZXhlOi8vbWlub3RhdXIuYXBhY2hlLm9yZy93d3cvcGVvcGxlLmFwYWNoZS5vcmcvYnVpbGRzL215ZmFjZXMvbmlnaHRseTwvdXJsPgotICAgICAgICAgIDxpbnB1dERpcmVjdG9yeT50YXJnZXQvYXNzZW1ibHkvb3V0PC9pbnB1dERpcmVjdG9yeT4KLSAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgPC9wbHVnaW4+Ci0gICAgICAuLi4KLSAgICA8L3BsdWdpbnM+Ci0gIDwvYnVpbGQ+Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMteHJ0cy1wbHVnaW4vTElDRU5TRS50eHQgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLXhydHMtcGx1Z2luL0xJQ0VOU0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjQ1Njk1Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMteHJ0cy1wbHVnaW4vTElDRU5TRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwyMDIgKzAsMCBAQAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNAotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLwotCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04KLQotICAgMS4gRGVmaW5pdGlvbnMuCi0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4KLQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4KLQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbgotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwKLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3IKLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KLQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KLQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLgotCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dAotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLAotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgotCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcgotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLgotCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0Ci0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3NlcwotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLgotCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZwotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucwotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5Ci0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIgotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0Ci0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCi0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLgotCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4KLQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywKLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcgotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcwotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCi0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91Ci0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3IKLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZAotCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kCi0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3JrcwotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQKLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YKLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kCi0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cwotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QKLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QKLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUKLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3IKLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwKLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZAotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUKLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQKLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuCi0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucwotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcgotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgKLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuCi0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwKLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yawotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLgotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4KLQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLAotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KLQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEEKLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55Ci0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuCi0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLAotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwKLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KLQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZwotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwKLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcwotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkKLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkKLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgotCi0gICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKLQotICAgQVBQRU5ESVg6IEhvdyB0byBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLgotCi0gICAgICBUbyBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLCBhdHRhY2ggdGhlIGZvbGxvd2luZwotICAgICAgYm9pbGVycGxhdGUgbm90aWNlLCB3aXRoIHRoZSBmaWVsZHMgZW5jbG9zZWQgYnkgYnJhY2tldHMgIltdIgotICAgICAgcmVwbGFjZWQgd2l0aCB5b3VyIG93biBpZGVudGlmeWluZyBpbmZvcm1hdGlvbi4gKERvbid0IGluY2x1ZGUKLSAgICAgIHRoZSBicmFja2V0cyEpICBUaGUgdGV4dCBzaG91bGQgYmUgZW5jbG9zZWQgaW4gdGhlIGFwcHJvcHJpYXRlCi0gICAgICBjb21tZW50IHN5bnRheCBmb3IgdGhlIGZpbGUgZm9ybWF0LiBXZSBhbHNvIHJlY29tbWVuZCB0aGF0IGEKLSAgICAgIGZpbGUgb3IgY2xhc3MgbmFtZSBhbmQgZGVzY3JpcHRpb24gb2YgcHVycG9zZSBiZSBpbmNsdWRlZCBvbiB0aGUKLSAgICAgIHNhbWUgInByaW50ZWQgcGFnZSIgYXMgdGhlIGNvcHlyaWdodCBub3RpY2UgZm9yIGVhc2llcgotICAgICAgaWRlbnRpZmljYXRpb24gd2l0aGluIHRoaXJkLXBhcnR5IGFyY2hpdmVzLgotCi0gICBDb3B5cmlnaHQgW3l5eXldIFtuYW1lIG9mIGNvcHlyaWdodCBvd25lcl0KLQotICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMteHJ0cy1wbHVnaW4vTk9USUNFLnR4dCBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMteHJ0cy1wbHVnaW4vTk9USUNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmEzZGJkNi4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLXhydHMtcGx1Z2luL05PVElDRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci09PSAgTk9USUNFIGZpbGUgY29ycmVzcG9uZGluZyB0byBzZWN0aW9uIDQoZCkgb2YgdGhlIEFwYWNoZSBMaWNlbnNlLCAgID09Ci09PSAgVmVyc2lvbiAyLjAsIGluIHRoaXMgY2FzZSBmb3IgdGhlIEFwYWNoZSBNeUZhY2VzIE1hdmVuIFBsdWdpbnMgICAgID09Ci09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgCi1UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLgotCi1Qb3J0aW9ucyBvZiB0aGlzIHNvZnR3YXJlIHdlcmUgb3JpZ2luYWxseSBiYXNlZCBvbiB0aGUgZm9sbG93aW5nOgotCi0gLSBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwNiwgT3JhY2xlIENvcnAsIDxodHRwOi8vd3d3Lm9yYWNsZS5jb20vPi4KLWFuZCBhcmUgbGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIHVuZGVyIHRoZSAKLSJTb2Z0d2FyZSBHcmFudCBhbmQgQ29ycG9yYXRlIENvbnRyaWJ1dGlvbiBMaWNlbnNlIEFncmVlbWVudCIKLQotU2VlIHRoZSBMSUNFTlNFLnR4dCBmaWxlIGZvciBpbmZvcm1hdGlvbiBvbiBhbGwgbGljZW5zZXMgCi1hc3NvY2lhdGVkIHdpdGggdGhpcyBzb2Z0d2FyZS4KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMteHJ0cy1wbHVnaW4vcG9tLnhtbCBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMteHJ0cy1wbHVnaW4vcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDc1OTJmMy4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLXhydHMtcGx1Z2luL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi08IS0tCi0gICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICAgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICAgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gICAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICAgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gICAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gICAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gICAgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+Ci0KLSAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotCi0gIDxwYXJlbnQ+Ci0gICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29sczwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtcGx1Z2luLXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjEuMC41PC92ZXJzaW9uPgotICAgICAgPHJlbGF0aXZlUGF0aD4uLi9teWZhY2VzLXBsdWdpbi1wYXJlbnQvcG9tLnhtbDwvcmVsYXRpdmVQYXRoPgotICA8L3BhcmVudD4KLQotICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29sczwvZ3JvdXBJZD4KLSAgPGFydGlmYWN0SWQ+bXlmYWNlcy14cnRzLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgPHZlcnNpb24+MS4wLjEtU05BUFNIT1Q8L3ZlcnNpb24+Ci0gIDxwYWNrYWdpbmc+bWF2ZW4tcGx1Z2luPC9wYWNrYWdpbmc+Ci0gIDxuYW1lPkFwYWNoZSBNeUZhY2VzIEJ1aWxkdG9vbHMgTWF2ZW4yIFhSVFMgUGx1Z2luPC9uYW1lPgotCi0gIDxzY20+Ci0gICAgPGNvbm5lY3Rpb24+c2NtOnN2bjpodHRwOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL215ZmFjZXMvbXlmYWNlcy1idWlsZC10b29scy90cnVuay9tYXZlbjItcGx1Z2lucy9teWZhY2VzLXhydHMtcGx1Z2luPC9jb25uZWN0aW9uPgotICAgIDxkZXZlbG9wZXJDb25uZWN0aW9uPnNjbTpzdm46aHR0cHM6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvbXlmYWNlcy9teWZhY2VzLWJ1aWxkLXRvb2xzL3RydW5rL21hdmVuMi1wbHVnaW5zL215ZmFjZXMteHJ0cy1wbHVnaW48L2RldmVsb3BlckNvbm5lY3Rpb24+Ci0gICAgPHVybD5odHRwOi8vc3ZuLmFwYWNoZS5vcmcvdmlld3ZjL215ZmFjZXMvbXlmYWNlcy1idWlsZC10b29scy90cnVuay9tYXZlbjItcGx1Z2lucy9teWZhY2VzLXhydHMtcGx1Z2luPC91cmw+Ci0gIDwvc2NtPgotCi0gIDxidWlsZD4KLSAgICA8cGx1Z2luTWFuYWdlbWVudD4KLSAgICAgIDxwbHVnaW5zPgotICAgICAgICA8cGx1Z2luPgotICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KLSAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1jb21waWxlci1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgPGluaGVyaXRlZD50cnVlPC9pbmhlcml0ZWQ+Ci0gICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICA8c291cmNlPjEuNTwvc291cmNlPgotICAgICAgICAgICAgPHRhcmdldD4xLjU8L3RhcmdldD4KLSAgICAgICAgICAgIDxzaG93V2FybmluZ3M+dHJ1ZTwvc2hvd1dhcm5pbmdzPgotICAgICAgICAgICAgPGNvbXBpbGVyQXJndW1lbnQ+LVhsaW50OmFsbCwtc2VyaWFsLC1mYWxsdGhyb3VnaDwvY29tcGlsZXJBcmd1bWVudD4KLSAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgIDwvcGx1Z2luPgotICAgICAgPC9wbHVnaW5zPgotICAgIDwvcGx1Z2luTWFuYWdlbWVudD4KLSAgICA8cGx1Z2lucz4KLSAgICAgIDxwbHVnaW4+Ci0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KLSAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tcGx1Z2luLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPHZlcnNpb24+Mi4yPC92ZXJzaW9uPgotICAgICAgPC9wbHVnaW4+Ci0gICAgPC9wbHVnaW5zPgotICA8L2J1aWxkPgotCi0gIDxkZXBlbmRlbmNpZXM+Ci0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuPC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tcGx1Z2luLWFwaTwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjIuMDwvdmVyc2lvbj4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuPC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tcHJvamVjdDwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjIuMDwvdmVyc2lvbj4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gIDwvZGVwZW5kZW5jaWVzPgotCi0gIDxyZXBvcnRpbmc+Ci0gICAgPHBsdWdpbnM+Ci0gICAgICA8cGx1Z2luPgotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+Ci0gICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXBsdWdpbi1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgIDx2ZXJzaW9uPjIuMjwvdmVyc2lvbj4KLSAgICAgIDwvcGx1Z2luPgotICAgIDwvcGx1Z2lucz4KLSAgPC9yZXBvcnRpbmc+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLXhydHMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi94cnRzL0Fic3RyYWN0R2VuZXJhdGVTb3VyY2VzTW9qby5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy14cnRzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4veHJ0cy9BYnN0cmFjdEdlbmVyYXRlU291cmNlc01vam8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTJjMTJmNS4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLXhydHMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi94cnRzL0Fic3RyYWN0R2VuZXJhdGVTb3VyY2VzTW9qby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIwICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi54cnRzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlNBWFBhcnNlckZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5BYnN0cmFjdE1vam87Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMudXRpbC5EaXJlY3RvcnlTY2FubmVyOwotCi1pbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7Ci0KLS8qKgotICogQHZlcnNpb24gJElkJAotICogQHBoYXNlIGdlbmVyYXRlLXJlc291cmNlcwotICogQGRlc2NyaXB0aW9uIEdvYWwgd2hpY2ggZ2VuZXJhdGVzIHRoZSBYUlRTIEJ1bmRsZXMKLSAqLwotYWJzdHJhY3QgcHVibGljIGNsYXNzIEFic3RyYWN0R2VuZXJhdGVTb3VyY2VzTW9qbyBleHRlbmRzIEFic3RyYWN0TW9qbwotewotICAvKioKLSAgICogRXhlY3V0ZSB0aGUgTW9qby4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbgotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgZ2VuZXJhdGVCdW5kbGVzKCk7Ci0gICAgfQotICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKLSAgICB9Ci0gIH0KLQotICBhYnN0cmFjdCBwcm90ZWN0ZWQgU3RyaW5nIGdldFRhcmdldFR5cGUoKTsKLQotICBhYnN0cmFjdCBwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0RGVmYXVsdExvY2FsZXMoKTsKLQotICBhYnN0cmFjdCBwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0RXhjbHVkZXMoKTsKLQotICBhYnN0cmFjdCBwcm90ZWN0ZWQgRmlsZSBnZXRTb3VyY2VEaXJlY3RvcnkoKTsKLQotICBhYnN0cmFjdCBwcm90ZWN0ZWQgRmlsZSBnZXRUYXJnZXREaXJlY3RvcnkoKTsKLQotICBhYnN0cmFjdCBwcm90ZWN0ZWQgdm9pZCBhZGRDb21waWxlU291cmNlUm9vdCgpIHRocm93cyBJT0V4Y2VwdGlvbjsKLQotICBwcml2YXRlIHZvaWQgZ2VuZXJhdGVCdW5kbGVzKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uCi0gIHsKLSAgICBGaWxlIHNvdXJjZURpcmVjdG9yeSA9IGdldFNvdXJjZURpcmVjdG9yeSgpOwotICAgIGlmIChzb3VyY2VEaXJlY3RvcnkuZXhpc3RzKCkpCi0gICAgewotICAgICAgLy8gSW5jbHVkZSBnZW5lcmF0ZWQgc291cmNlcyBpbiBjb21waWxhdGlvbgotICAgICAgYWRkQ29tcGlsZVNvdXJjZVJvb3QoKTsKLQotICAgICAgLy8gU2NhbiBmb3IgLnhydHMgc291cmNlcwotICAgICAgRGlyZWN0b3J5U2Nhbm5lciBzY2FubmVyID0gbmV3IERpcmVjdG9yeVNjYW5uZXIoKTsKLSAgICAgIHNjYW5uZXIuc2V0QmFzZWRpcihzb3VyY2VEaXJlY3RvcnkpOwotICAgICAgc2Nhbm5lci5hZGREZWZhdWx0RXhjbHVkZXMoKTsKLSAgICAgIFN0cmluZ1tdIGV4Y2x1ZGVzID0gZ2V0RXhjbHVkZXMoKTsKLSAgICAgIHNjYW5uZXIuc2V0RXhjbHVkZXMoZXhjbHVkZXMpOwotICAgICAgc2Nhbm5lci5zZXRJbmNsdWRlcyhuZXcgU3RyaW5nW10geyAiKiovKi54cnRzIiB9KTsKLSAgICAgIHNjYW5uZXIuc2NhbigpOwotCi0gICAgICBTdHJpbmdbXSB4cnRzRmlsZXMgPSBzY2FubmVyLmdldEluY2x1ZGVkRmlsZXMoKTsKLSAgICAgIGlmICh4cnRzRmlsZXMubGVuZ3RoID4gMCkKLSAgICAgIHsKLSAgICAgICAgUlRTV3JpdGVyIHdyaXRlciA9IGdldFJUU1dyaXRlcigpOwotICAgICAgICBNYXAgcGFyYW1zID0gbmV3IEhhc2hNYXAoKTsKLQotICAgICAgICBMaXN0IGRpcnR5WFJUUyA9IG5ldyBMaW5rZWRMaXN0KEFycmF5cy5hc0xpc3QoeHJ0c0ZpbGVzKSk7Ci0gICAgICAgIFNBWFBhcnNlckZhY3RvcnkgZmFjdG9yeSA9IFNBWFBhcnNlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgZmFjdG9yeS5zZXRWYWxpZGF0aW5nKGZhbHNlKTsKLQotICAgICAgICBmb3IgKEl0ZXJhdG9yIGk9ZGlydHlYUlRTLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICAgICAgewotICAgICAgICAgIFN0cmluZyB4cnRzRmlsZSA9IChTdHJpbmcpaS5uZXh0KCk7Ci0gICAgICAgICAgRmlsZSB0YXJnZXRGaWxlID0gZ2V0VGFyZ2V0RmlsZSh4cnRzRmlsZSk7Ci0gICAgICAgICAgaWYgKHRhcmdldEZpbGUuZXhpc3RzKCkpCi0gICAgICAgICAgewotICAgICAgICAgICAgRmlsZSBzb3VyY2VGaWxlID0gZ2V0U291cmNlRmlsZSh4cnRzRmlsZSk7Ci0gICAgICAgICAgICBpZiAodGFyZ2V0RmlsZS5sYXN0TW9kaWZpZWQoKSA+PSBzb3VyY2VGaWxlLmxhc3RNb2RpZmllZCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBpLnJlbW92ZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChkaXJ0eVhSVFMuaXNFbXB0eSgpKQotICAgICAgICB7Ci0gICAgICAgICAgZ2V0TG9nKCkuaW5mbygiTm90aGluZyB0byBnZW5lcmF0ZSAtIGFsbCBYUlRTIGJ1bmRsZXMgYXJlIHVwIHRvIGRhdGUiKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBnZXRMb2coKS5pbmZvKCJHZW5lcmF0aW5nICIgKyBkaXJ0eVhSVFMuc2l6ZSgpICsgIiBYUlRTIGJ1bmRsZXMgdG8gIiArIGdldFRhcmdldERpcmVjdG9yeSgpKTsKLQotICAgICAgICAgIGZvciAoSXRlcmF0b3IgaT1kaXJ0eVhSVFMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyB4cnRzRmlsZSA9IChTdHJpbmcpaS5uZXh0KCk7Ci0gICAgICAgICAgICBGaWxlIHNvdXJjZUZpbGUgPSBnZXRTb3VyY2VGaWxlKHhydHNGaWxlKTsKLSAgICAgICAgICAgIEZpbGUgdGFyZ2V0RmlsZSA9IGdldFRhcmdldEZpbGUoeHJ0c0ZpbGUpOwotICAgICAgICAgICAgU3RyaW5nIGJhc2VOYW1lID0gZ2V0QmFzZW5hbWUoeHJ0c0ZpbGUpOwotCi0gICAgICAgICAgICBwYXJhbXMucHV0KCJvdXRGaWxlIiwgdGFyZ2V0RmlsZSk7Ci0gICAgICAgICAgICBwYXJhbXMucHV0KCJvdXROYW1lIiwgYmFzZU5hbWUpOwotICAgICAgICAgICAgcGFyYW1zLnB1dCgic3JjTmFtZSIsIGJhc2VOYW1lKTsKLSAgICAgICAgICAgIHBhcmFtcy5wdXQoInF1aWV0TW9kZSIsIEJvb2xlYW4uVFJVRSk7Ci0gICAgICAgICAgICBwYXJhbXMucHV0KCJkZWZhdWx0TG9jYWxlcyIsIGdldERlZmF1bHRMb2NhbGVzKCkpOwotICAgICAgICAgICAgSW5wdXRTb3VyY2Ugc291cmNlID0gbmV3IElucHV0U291cmNlKG5ldyBGaWxlSW5wdXRTdHJlYW0oc291cmNlRmlsZSkpOwotICAgICAgICAgICAgLy8gc2V0dXAgcmVsYXRpdmUgc3lzdGVtSWQgcmVzb2x1dGlvbiBmb3IgbG9jYWwgcnRzLmR0ZCBmaWxlcy4KLSAgICAgICAgICAgIHNvdXJjZS5zZXRTeXN0ZW1JZChzb3VyY2VGaWxlLmdldFBhcmVudEZpbGUoKS50b1VSTCgpLnRvU3RyaW5nKCkpOwotCi0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgaWYgKHRhcmdldEZpbGUuZXhpc3RzKCkpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0YXJnZXRGaWxlLmRlbGV0ZSgpOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgU0FYUGFyc2VyIHBhcnNlciA9IGZhY3RvcnkubmV3U0FYUGFyc2VyKCk7Ci0gICAgICAgICAgICAgIHRhcmdldEZpbGUuZ2V0UGFyZW50RmlsZSgpLm1rZGlycygpOwotICAgICAgICAgICAgICBYUlRTR2VuZXJhdG9yLmdlbmVyYXRlKHBhcnNlciwgc291cmNlLCB3cml0ZXIsIHBhcmFtcyk7Ci0gICAgICAgICAgICAgIHRhcmdldEZpbGUuc2V0UmVhZE9ubHkoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgdGhyb3cgbmV3IE1vam9FeGVjdXRpb25FeGNlcHRpb24odC5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgUlRTV3JpdGVyIGdldFJUU1dyaXRlcigpIHRocm93cyBJT0V4Y2VwdGlvbiwgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbgotICB7Ci0gICAgU3RyaW5nIGltcGxDbGFzc05hbWU7Ci0KLSAgICBTdHJpbmcgdGFyZ2V0VHlwZSA9IGdldFRhcmdldFR5cGUoKTsKLSAgICBpZiAodGFyZ2V0VHlwZS5zdGFydHNXaXRoKCJjbGFzczoiKSkKLSAgICB7Ci0gICAgICBpbXBsQ2xhc3NOYW1lID0gdGFyZ2V0VHlwZS5zdWJzdHJpbmcoImNsYXNzOiIubGVuZ3RoKCkpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgaWYgKCJsaXN0Ii5lcXVhbHModGFyZ2V0VHlwZSkpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgTGlzdFJUU1dyaXRlcigpOwotICAgICAgfQotICAgICAgdGhyb3cgbmV3IE1vam9FeGVjdXRpb25FeGNlcHRpb24oIlVua25vd24gYnVuZGxlIHR5cGU6ICIgKyB0YXJnZXRUeXBlKTsKLSAgICB9Ci0KLSAgICB0cnkKLSAgICB7Ci0gICAgICBDbGFzcyBpbXBsQ2xhc3MgPSBDbGFzcy5mb3JOYW1lKGltcGxDbGFzc05hbWUpOwotICAgICAgcmV0dXJuIChSVFNXcml0ZXIpaW1wbENsYXNzLm5ld0luc3RhbmNlKCk7Ci0gICAgfQotICAgIGNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgIHRocm93IG5ldyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKLSAgICB9Ci0gICAgY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgdGhyb3cgbmV3IE1vam9FeGVjdXRpb25FeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOwotICAgIH0KLSAgICBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICB0aHJvdyBuZXcgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSBGaWxlIGdldFNvdXJjZUZpbGUoU3RyaW5nIHhydHNGaWxlbmFtZSkKLSAgewotICAgIHJldHVybiBuZXcgRmlsZShnZXRTb3VyY2VEaXJlY3RvcnkoKSwgeHJ0c0ZpbGVuYW1lKTsKLSAgfQotCi0gIHByaXZhdGUgU3RyaW5nIGdldEJhc2VuYW1lKFN0cmluZyBzb3VyY2VQYXRoKQotICB7Ci0gICAgaW50IHN0YXJ0ID0gc291cmNlUGF0aC5sYXN0SW5kZXhPZihGaWxlLnNlcGFyYXRvckNoYXIpICsgMTsKLSAgICByZXR1cm4gc291cmNlUGF0aC5zdWJzdHJpbmcoc3RhcnQsIHNvdXJjZVBhdGgubGVuZ3RoKCkgLSAiLnhydHMiLmxlbmd0aCgpKTsKLSAgfQotCi0gIHByaXZhdGUgRmlsZSBnZXRUYXJnZXRGaWxlKFN0cmluZyBzb3VyY2VQYXRoKQotICB7Ci0gICAgU3RyaW5nIGJhc2VuYW1lID0gc291cmNlUGF0aC5zdWJzdHJpbmcoMCwgc291cmNlUGF0aC5sZW5ndGgoKSAtICIueHJ0cyIubGVuZ3RoKCkpOwotICAgIFN0cmluZyB0YXJnZXRQYXRoID0gYmFzZW5hbWUgKyAiLmphdmEiOwotICAgIHJldHVybiBuZXcgRmlsZShnZXRUYXJnZXREaXJlY3RvcnkoKSwgdGFyZ2V0UGF0aCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMteHJ0cy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL3hydHMvR2VuZXJhdGVTb3VyY2VzTW9qby5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy14cnRzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4veHJ0cy9HZW5lcmF0ZVNvdXJjZXNNb2pvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1NWZkNjIuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy14cnRzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4veHJ0cy9HZW5lcmF0ZVNvdXJjZXNNb2pvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4ueHJ0czsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wcm9qZWN0Lk1hdmVuUHJvamVjdDsKLQotLyoqCi0gKiBAdmVyc2lvbiAkSWQkCi0gKiBAZ29hbCBnZW5lcmF0ZS1zb3VyY2VzCi0gKiBAcGhhc2UgZ2VuZXJhdGUtc291cmNlcwotICogQGRlc2NyaXB0aW9uIEdvYWwgd2hpY2ggZ2VuZXJhdGVzIHRoZSBYUlRTIEJ1bmRsZXMKLSAqLwotcHVibGljIGNsYXNzIEdlbmVyYXRlU291cmNlc01vam8gZXh0ZW5kcyBBYnN0cmFjdEdlbmVyYXRlU291cmNlc01vam8KLXsKLSAgLyoqCi0gICAqIEBwYXJhbWV0ZXIgZXhwcmVzc2lvbj0iJHtwcm9qZWN0fSIKLSAgICogQHJlcXVpcmVkCi0gICAqIEByZWFkb25seQotICAgKi8KLSAgcHJpdmF0ZSBNYXZlblByb2plY3QgcHJvamVjdDsKLQotICAvKioKLSAgICogQHBhcmFtZXRlciBleHByZXNzaW9uPSJsaXN0IgotICAgKiBAcmVxdWlyZWQKLSAgICovCi0gIHByaXZhdGUgU3RyaW5nIHRhcmdldFR5cGU7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbWV0ZXIKLSAgICovCi0gIHByaXZhdGUgU3RyaW5nW10gZGVmYXVsdExvY2FsZXM7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbWV0ZXIKLSAgICovCi0gIHByaXZhdGUgU3RyaW5nW10gZXhjbHVkZXM7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbWV0ZXIgZXhwcmVzc2lvbj0ic3JjL21haW4veHJ0cyIKLSAgICogQHJlcXVpcmVkCi0gICAqLwotICBwcml2YXRlIEZpbGUgc291cmNlRGlyZWN0b3J5OwotCi0gIC8qKgotICAgKiBAcGFyYW1ldGVyIGV4cHJlc3Npb249IiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L21hdmVuLXhydHMtcGx1Z2luL21haW4vamF2YSIKLSAgICogQHJlcXVpcmVkCi0gICAqLwotICBwcml2YXRlIEZpbGUgdGFyZ2V0RGlyZWN0b3J5OwotCi0gIHByb3RlY3RlZCBTdHJpbmdbXSBnZXREZWZhdWx0TG9jYWxlcygpCi0gIHsKLSAgICByZXR1cm4gZGVmYXVsdExvY2FsZXM7Ci0gIH0KLQotICBwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0RXhjbHVkZXMoKQotICB7Ci0gICAgcmV0dXJuIGV4Y2x1ZGVzOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgYWRkQ29tcGlsZVNvdXJjZVJvb3QoKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgewotICAgIHByb2plY3QuYWRkQ29tcGlsZVNvdXJjZVJvb3QodGFyZ2V0RGlyZWN0b3J5LmdldENhbm9uaWNhbFBhdGgoKSk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgU3RyaW5nIGdldFRhcmdldFR5cGUoKQotICB7Ci0gICAgcmV0dXJuIHRhcmdldFR5cGU7Ci0gIH0KLQotICBwcm90ZWN0ZWQgRmlsZSBnZXRTb3VyY2VEaXJlY3RvcnkoKQotICB7Ci0gICAgcmV0dXJuIHNvdXJjZURpcmVjdG9yeTsKLSAgfQotCi0gIHByb3RlY3RlZCBGaWxlIGdldFRhcmdldERpcmVjdG9yeSgpCi0gIHsKLSAgICByZXR1cm4gdGFyZ2V0RGlyZWN0b3J5OwotICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLXhydHMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi94cnRzL0dlbmVyYXRlVGVzdFNvdXJjZXNNb2pvLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLXhydHMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi94cnRzL0dlbmVyYXRlVGVzdFNvdXJjZXNNb2pvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2YTNjZTAuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy14cnRzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4veHJ0cy9HZW5lcmF0ZVRlc3RTb3VyY2VzTW9qby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLnhydHM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucHJvamVjdC5NYXZlblByb2plY3Q7Ci0KLS8qKgotICogQHZlcnNpb24gJElkJAotICogQGdvYWwgZ2VuZXJhdGUtdGVzdC1zb3VyY2VzCi0gKiBAcGhhc2UgZ2VuZXJhdGUtdGVzdC1zb3VyY2VzCi0gKiBAZGVzY3JpcHRpb24gR29hbCB3aGljaCBnZW5lcmF0ZXMgdGhlIFhSVFMgQnVuZGxlcwotICovCi1wdWJsaWMgY2xhc3MgR2VuZXJhdGVUZXN0U291cmNlc01vam8gZXh0ZW5kcyBBYnN0cmFjdEdlbmVyYXRlU291cmNlc01vam8KLXsKLSAgLyoqCi0gICAqIEBwYXJhbWV0ZXIgZXhwcmVzc2lvbj0iJHtwcm9qZWN0fSIKLSAgICogQHJlcXVpcmVkCi0gICAqIEByZWFkb25seQotICAgKi8KLSAgcHJpdmF0ZSBNYXZlblByb2plY3QgcHJvamVjdDsKLQotICAvKioKLSAgICogQHBhcmFtZXRlciBleHByZXNzaW9uPSJsaXN0IgotICAgKiBAcmVxdWlyZWQKLSAgICovCi0gIHByaXZhdGUgU3RyaW5nIHRhcmdldFR5cGU7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbWV0ZXIKLSAgICovCi0gIHByaXZhdGUgU3RyaW5nW10gZGVmYXVsdExvY2FsZXM7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbWV0ZXIKLSAgICovCi0gIHByaXZhdGUgU3RyaW5nW10gdGVzdEV4Y2x1ZGVzOwotCi0gIC8qKgotICAgKiBAcGFyYW1ldGVyIGV4cHJlc3Npb249InNyYy90ZXN0L3hydHMiCi0gICAqIEByZXF1aXJlZAotICAgKi8KLSAgcHJpdmF0ZSBGaWxlIHRlc3RTb3VyY2VEaXJlY3Rvcnk7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbWV0ZXIgZXhwcmVzc2lvbj0iJHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vbWF2ZW4teHJ0cy1wbHVnaW4vdGVzdC9qYXZhIgotICAgKiBAcmVxdWlyZWQKLSAgICovCi0gIHByaXZhdGUgRmlsZSB0YXJnZXREaXJlY3Rvcnk7Ci0KLSAgcHJvdGVjdGVkIFN0cmluZ1tdIGdldERlZmF1bHRMb2NhbGVzKCkKLSAgewotICAgIHJldHVybiBkZWZhdWx0TG9jYWxlczsKLSAgfQotCi0gIHByb3RlY3RlZCBTdHJpbmdbXSBnZXRFeGNsdWRlcygpCi0gIHsKLSAgICByZXR1cm4gdGVzdEV4Y2x1ZGVzOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgYWRkQ29tcGlsZVNvdXJjZVJvb3QoKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgewotICAgIHByb2plY3QuYWRkVGVzdENvbXBpbGVTb3VyY2VSb290KHRhcmdldERpcmVjdG9yeS5nZXRDYW5vbmljYWxQYXRoKCkpOwotICB9Ci0KLSAgcHJvdGVjdGVkIFN0cmluZyBnZXRUYXJnZXRUeXBlKCkKLSAgewotICAgIHJldHVybiB0YXJnZXRUeXBlOwotICB9Ci0KLSAgcHJvdGVjdGVkIEZpbGUgZ2V0U291cmNlRGlyZWN0b3J5KCkKLSAgewotICAgIHJldHVybiB0ZXN0U291cmNlRGlyZWN0b3J5OwotICB9Ci0KLSAgcHJvdGVjdGVkIEZpbGUgZ2V0VGFyZ2V0RGlyZWN0b3J5KCkKLSAgewotICAgIHJldHVybiB0YXJnZXREaXJlY3Rvcnk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMteHJ0cy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL3hydHMvTGlzdFJUU1dyaXRlci5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy14cnRzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4veHJ0cy9MaXN0UlRTV3JpdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczNjcyNWUuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy14cnRzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4veHJ0cy9MaXN0UlRTV3JpdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODYgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLnhydHM7Ci0KLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotLy9pbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotCi0vKioKLSAqIFRoZSA8Y29kZT5MaXN0UlRTV3JpdGVyPC9jb2RlPiBjbGFzcyBpcyBhbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUKLSAqIDxjb2RlPlJUU1dyaXRlcjwvY29kZT4gaW50ZXJmYWNlIHVzZWQgdG8gY3JlYXRlIGEgU3VuCi0gKiA8Y29kZT5MaXN0UmVzb3VyY2VCdW5kbGU8L2NvZGU+IGZpbGUuCi0gKgotICogQHZlcnNpb24gJE5hbWU6ICAkICgkUmV2aXNpb246IDEuMTEgJCkgJERhdGU6IDIwMDIvMDIvMjcgMTc6MTg6NDcgJAotICogQHNpbmNlIFJUUyAyLjAKLSAqLwotcHVibGljIGNsYXNzIExpc3RSVFNXcml0ZXIgaW1wbGVtZW50cyBSVFNXcml0ZXIKLXsKLQotICAvKioKLSAgICogRW1wdHkgY29uc3RydWN0b3IgZm9yIHRoZSA8Y29kZT5MaXN0UmVzb3VyY2VCdW5kbGU8L2NvZGU+IGltcGxlbWVudGF0aW9uCi0gICAqCi0gICAqLwotICBwdWJsaWMgTGlzdFJUU1dyaXRlcigpCi0gIHsKLSAgfQotCi0gIC8qKgotICAgKiA8Y29kZT5SVFNXcml0ZXI8L2NvZGU+IG1ldGhvZCBpbXBsZW1lbnRhdGlvbiB0byB3cml0ZSB0aGUgaGVhZGVyIG9mIHRoZQotICAgKiA8Y29kZT5MaXN0UmVzb3VyY2VCdW5kbGU8L2NvZGU+IGZpbGUuCi0gICAqCi0gICAqIEBwYXJhbSBwYXJtcyBhIDxjb2RlPk1hcDwvY29kZT4gb2YgY29tbWFuZCBsaW5lIHBhcmFtZXRlcnMuCi0gICAqIEBwYXJhbSBtZXRhIGEgPGNvZGU+TWFwPC9jb2RlPiBvZiBwYXJzZWQgbm9uLXJlc291cmNlIGRhdGEKLSAgICogKGUuZy4sIGF1dGhvcnMpLgotICAgKi8KLSAgcHVibGljIHZvaWQgc3RhcnRCdW5kbGUoTWFwIHBhcm1zLCBNYXAgbWV0YSkKLSAgICB0aHJvd3MgVGhyb3dhYmxlCi0gIHsKLSAgICBGaWxlIG91dEZpbGUgPSAoRmlsZSlwYXJtcy5nZXQoIm91dEZpbGUiKTsKLSAgICBTdHJpbmcgb3V0TmFtZSA9IChTdHJpbmcpcGFybXMuZ2V0KCJvdXROYW1lIik7Ci0gICAgU3RyaW5nIHNyY05hbWUgPSAoU3RyaW5nKXBhcm1zLmdldCgic3JjTmFtZSIpOwotCi0gICAgQm9vbGVhbiBiID0gKEJvb2xlYW4pcGFybXMuZ2V0KCJxdWlldE1vZGUiKTsKLSAgICBib29sZWFuIHF1aWV0TW9kZSA9IGIuYm9vbGVhblZhbHVlKCk7Ci0gICAgaWYgKCFxdWlldE1vZGUpCi0gICAgewotICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgICIgKyBvdXRGaWxlKTsKLSAgICB9Ci0KLSAgICBfcHcgPSBuZXcgUHJpbnRXcml0ZXIobmV3IEJ1ZmZlcmVkV3JpdGVyKG5ldyBGaWxlV3JpdGVyKG91dEZpbGUpKSk7Ci0KLSAgICBfcHcucHJpbnRsbigiLy8gRG8gbm90IGVkaXQgdGhpcyBmaWxlISIpOwotICAgIF9wdy5wcmludGxuKCIvLyBUaGlzIGZpbGUgaGFzIGJlZW4gYXV0b21hdGljYWxseSBnZW5lcmF0ZWQuIik7Ci0KLSAgICBTdHJpbmcgcnRzRmlsZVR5cGUgPSAieHJ0cyI7Ci0gICAgaWYgKG1ldGEgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBydHNGaWxlVHlwZSA9IChTdHJpbmcpbWV0YS5nZXQoImZpbGVUeXBlIik7Ci0gICAgfQotICAgIF9wdy5wcmludGxuKCIvLyBFZGl0ICIgKyBzcmNOYW1lICsgIi4iICsgcnRzRmlsZVR5cGUgKyAiIGFuZCBydW4gdGhlICIgKwotICAgICAgcnRzRmlsZVR5cGUudG9VcHBlckNhc2UoKSArICJNYWtlQnVuZGxlIHRvb2wgaW5zdGVhZC4iKTsKLSAgICBfcHcucHJpbnRsbigiLy8gIik7Ci0KLSAgICBTdHJpbmcgcGFja2FnZU5hbWUgPSAoU3RyaW5nKXBhcm1zLmdldCgicGtnTmFtZSIpOwotICAgIGJvb2xlYW4gdmFsaWRQYWNrYWdlID0gZmFsc2U7Ci0gICAgaWYgKHBhY2thZ2VOYW1lID09IG51bGwpCi0gICAgewotICAgICAgaWYgKG1ldGEgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgaWYgKG1ldGEuZ2V0KCJwYWNrYWdlIikgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIHBhY2thZ2VOYW1lID0gKFN0cmluZyltZXRhLmdldCgicGFja2FnZSIpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaWYgKHBhY2thZ2VOYW1lICE9IG51bGwgJiYKLSAgICAgICghcGFja2FnZU5hbWUuZXF1YWxzKCIiKSB8fCAhcGFja2FnZU5hbWUudHJpbSgpLmVxdWFscygiIikpKQotICAgIHsKLSAgICAgIF9wdy5wcmludGxuKCJwYWNrYWdlICIgKyBwYWNrYWdlTmFtZSArICI7Iik7Ci0gICAgICBfcHcucHJpbnRsbigiIik7Ci0gICAgICB2YWxpZFBhY2thZ2UgPSB0cnVlOwotICAgIH0KLQotICAgIF9wdy5wcmludGxuKCJpbXBvcnQgamF2YS51dGlsLkxpc3RSZXNvdXJjZUJ1bmRsZTsiKTsKLQotICAgIHdyaXRlSW1wb3J0cyhwYXJtcywgbWV0YSk7Ci0KLSAgICBfcHcucHJpbnRsbigiIik7Ci0gICAgX3B3LnByaW50bG4oInB1YmxpYyBjbGFzcyAiICsgb3V0TmFtZSArICIgZXh0ZW5kcyBMaXN0UmVzb3VyY2VCdW5kbGUgeyIpOwotICAgIF9wdy5wcmludGxuKCIgIEBPdmVycmlkZSIpOwotICAgIF9wdy5wcmludGxuKCIgIHB1YmxpYyBPYmplY3RbXVtdIGdldENvbnRlbnRzKCkgeyIpOwotICAgIF9wdy5wcmludGxuKCIgICAgcmV0dXJuIG5ldyBPYmplY3RbXVtdIHsiKTsKLQotICAgIGlmIChvdXROYW1lLmluZGV4T2YoJ18nKSA8IDApCi0gICAgewotICAgICAgLy8gVGhpcyBpcyB0aGUgYmFzZSBidW5kbGUuIElmIGFueSBkZWZhdWx0IGxvY2FsZXMgYXJlIHJlcXVlc3RlZCwKLSAgICAgIC8vIHRoZXknbGwgZXh0ZW5kIHRoaXMgYnVuZGxlLiBDcmVhdGUgdGhlbSBoZXJlIGJlY2F1c2Ugd2UgaGF2ZSBhbGwKLSAgICAgIC8vIHRoZSBuZWVkZWQgaW5mby4KLSAgICAgIFN0cmluZ1tdIGxvY2FsZXMgPSAoU3RyaW5nW10pIHBhcm1zLmdldCgiZGVmYXVsdExvY2FsZXMiKTsKLSAgICAgIEZpbGUgdGFyZ0RpciA9IG91dEZpbGUuZ2V0UGFyZW50RmlsZSgpOwotICAgICAgaWYgKChsb2NhbGVzICE9IG51bGwpICYmICh0YXJnRGlyICE9IG51bGwpKQotICAgICAgewotICAgICAgICBmb3IgKGludCBsID0gMDsgbCA8IGxvY2FsZXMubGVuZ3RoOyBsKyspCi0gICAgICAgIHsKLSAgICAgICAgICBTdHJpbmcgY05hbWUgPSBvdXROYW1lICsgJ18nICsgbG9jYWxlc1tsXTsKLSAgICAgICAgICBGaWxlIGxvY0YgPSBuZXcgRmlsZSh0YXJnRGlyLCBjTmFtZSArICIuamF2YSIpOwotICAgICAgICAgIAotICAgICAgICAgIFByaW50V3JpdGVyIGxvY1dyaTsgCi0gICAgICAgICAgbG9jV3JpID0gbmV3IFByaW50V3JpdGVyKG5ldyBCdWZmZXJlZFdyaXRlcihuZXcgRmlsZVdyaXRlcihsb2NGKSkpOwotCi0gICAgICAgICAgbG9jV3JpLnByaW50bG4oIi8vIERvIG5vdCBlZGl0IHRoaXMgZmlsZSEiKTsKLSAgICAgICAgICBsb2NXcmkucHJpbnRsbigiLy8gVGhpcyBmaWxlIGhhcyBiZWVuIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkLiIpOwotCi0gICAgICAgICAgaWYgKHZhbGlkUGFja2FnZSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBsb2NXcmkucHJpbnRsbigicGFja2FnZSAiICsgcGFja2FnZU5hbWUgKyAiOyIpOwotICAgICAgICAgICAgbG9jV3JpLnByaW50bG4oIiIpOwotICAgICAgICAgIH0KLSAgICAgICAgICBsb2NXcmkucHJpbnRsbigicHVibGljIGNsYXNzICIgKyBjTmFtZSArICIgZXh0ZW5kcyAiICsgb3V0TmFtZSk7Ci0gICAgICAgICAgbG9jV3JpLnByaW50bG4oInsiKTsKLSAgICAgICAgICBsb2NXcmkucHJpbnRsbigifSIpOwotICAgICAgICAgIGxvY1dyaS5jbG9zZSgpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIAotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgd3JpdGVJbXBvcnRzKE1hcCBwYXJtcywgTWFwIG1ldGEpCi0gICAgIHRocm93cyBUaHJvd2FibGUKLSAgewotICB9Ci0KLSAgcHVibGljIHZvaWQgd3JpdGVTdHJpbmcoTWFwIHBhcm1zLCBNYXAgbWV0YSwgU3RyaW5nIGtleSwKLSAgICBTdHJpbmcgdmFsdWUpIHRocm93cyBUaHJvd2FibGUKLSAgewotICAgIF9wdy5wcmludGxuKCIgICAge1wiIiArIFVuaWNvZGVFc2NhcGVzLmNvbnZlcnQoa2V5KSArICJcIiwgXCIiICsKLSAgICAgICAgICAgICAgICBVbmljb2RlRXNjYXBlcy5jb252ZXJ0KHZhbHVlKSArICJcIn0sIik7Ci0gIH0KLQotCi0gIC8qKgotICAgKiA8Y29kZT5SVFNXcml0ZXI8L2NvZGU+IG1ldGhvZCBpbXBsZW1lbnRhdGlvbiB0byBjbG9zZSB0aGUgZmlsZSBzdHJlYW0KLSAgICogcmVxdWlyZWQgZm9yIHRoZSA8Y29kZT5MaXN0UmVzb3VyY2VCdW5kbGU8L2NvZGU+LiAgQmVmb3JlIGNsb3NpbmcsIHRoaXMKLSAgICogbWV0aG9kIGFsc28gd3JpdGVzIHRoZSBmb290ZXIgcG9ydGlvbnMgb2YgdGhlIGZpbGUuICBUaGUgZm9vdGVyIHBvcnRpb25zCi0gICAqIGNvbnNpc3Qgb2YgbGl0dGxlIG1vcmUgdGhhbiBjbG9zaW5nIGJyYWNlcy4KLSAgICoKLSAgICogQHBhcmFtIG1ldGEgYSA8Y29kZT5NYXA8L2NvZGU+IG9mIHBhcnNlZCBub24tcmVzb3VyY2UgZGF0YQotICAgKiAoZS5nLiwgYXV0aG9ycykuCi0gICAqLwotICBwdWJsaWMgdm9pZCBlbmRCdW5kbGUoTWFwIHBhcm1zLCBNYXAgbWV0YSkgdGhyb3dzIFRocm93YWJsZQotICB7Ci0gICAgX3B3LnByaW50bG4oIiAgICB9OyIpOwotICAgIF9wdy5wcmludGxuKCIgIH0iKTsKLSAgICBfcHcucHJpbnRsbigifSIpOwotICAgIF9wdy5jbG9zZSgpOwotICB9Ci0KLSAgcHJvdGVjdGVkIFByaW50V3JpdGVyIGdldE91dCgpCi0gIHsKLSAgICByZXR1cm4gX3B3OwotICB9Ci0KLSAgcHJpdmF0ZSBQcmludFdyaXRlciBfcHc7Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLXhydHMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi94cnRzL1JUU1dyaXRlci5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy14cnRzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4veHJ0cy9SVFNXcml0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjY0YzIxOS4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLXhydHMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi94cnRzL1JUU1dyaXRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLnhydHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIFRoZSA8Y29kZT5SVFNXcml0ZXI8L2NvZGU+IGludGVyZmFjZSBkZWZpbmVzIG1ldGhvZHMgZm9yIHdyaXRpbmcgdGhlCi0gKiBoZWFkZXIsIGJvZHksIGFuZCBmb290ZXIgb2YgdmFyaW91cyBvdXRwdXQgaW1wbGVtZW50YXRpb25zLiA8cD4KLSAqCi0gKiBUaGUgbWV0aG9kcyA8Y29kZT5zdGFydEJ1bmRsZTwvY29kZT4gYW5kIDxjb2RlPmVuZEJ1bmRsZTwvY29kZT4gd3JpdGUgdGhlCi0gKiBoZWFkZXIgYW5kIGZvb3RlciBwb3J0aW9ucyB0byB0aGUgb3V0cHV0LiAgVGhlIG1ldGhvZHMgZm9yIHdyaXRpbmcgdGhlCi0gKiBib2R5IGFyZSA8Y29kZT53cml0ZVN0cmluZzwvY29kZT4sIDxjb2RlPndyaXRlU3RyaW5nQXJyYXk8L2NvZGU+LCBhbmQKLSAqIDxjb2RlPndyaXRlTWFwPC9jb2RlPi4gVGhlc2UgbWV0aG9kcyBhcmUgc3VwcGxpZWQgd2l0aCBkYXRhIHBhcnNlZAotICogYnkgdGhlIFhNTC1iYXNlZCBSVFMgZmlsZSA8Y29kZT5YUlRTUGFyc2VyPC9jb2RlPiBvciB0aGUKLSAqIDxjb2RlPlJUU1Byb3BlcnRpZXM8L2NvZGU+IHBhcnNlci48cD4KLSAqCi0gKiBAc2VlIExpc3RSVFNXcml0ZXIKLSAqCi0gKiBAdmVyc2lvbiAkTmFtZTogICQgKCRSZXZpc2lvbjogMS43ICQpICREYXRlOiAyMDAxLzA0LzA5IDIzOjIyOjIyICQKLSAqLwotcHVibGljIGludGVyZmFjZSBSVFNXcml0ZXIKLXsKLQotICAvKioKLSAgICogV3JpdGVzIHRoZSA8ZmlsZSBvciBvdGhlciBvdXRwdXQgaGVhZGVyKHMpLgotICAgKgotICAgKiBAcGFyYW0gcGFybXMgYSA8Y29kZT5NYXA8L2NvZGU+IG9mIGNvbW1hbmQgbGluZSBwYXJhbWV0ZXJzLgotICAgKiBAcGFyYW0gbWV0YSBhIDxjb2RlPk1hcDwvY29kZT4gb2YgcGFyc2VkIG5vbi1yZXNvdXJjZSBkYXRhCi0gICAqIChlLmcuLCBwYWNrYWdlKS4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHN0YXJ0QnVuZGxlKE1hcCBwYXJtcywgTWFwIG1ldGEpCi0gICAgdGhyb3dzIFRocm93YWJsZTsKLQotICAvKioKLSAgICogV3JpdGVzIGEgPGNvZGU+U3RyaW5nPC9jb2RlPiB0byB0aGUgaW1wbGVtZW50YXRpb24gb3V0cHV0LiA8cD4KLSAgICoKLSAgICogVGhpcyBpcyB0aGUgdHlwaWNhbCBjYXNlIHVzZS4gIEEgc2luZ2xlIDxjb2RlPlN0cmluZzwvY29kZT4ga2V5IGFzc29jaWF0ZWQKLSAgICogd2l0aCBhIHNpbmdsZSA8Y29kZT5TdHJpbmc8L2NvZGU+IHZhbHVlIGZvcm1pbmcgYSBrZXkvdmFsdWUgcGFpciAoa3ZwKS4KLSAgICogTm90ZSB0aGF0IHRoZSBvdGhlciB0d28gYm9keSBtZXRob2RzLCA8Y29kZT53cml0ZVN0cmluZ0FycmF5PC9jb2RlPiBhbmQKLSAgICogPGNvZGU+d3JpdGVNYXA8L2NvZGU+IGJvdGggc3VwcG9ydCBhIHNpbmdsZSA8Y29kZT5TdHJpbmc8L2NvZGU+Ci0gICAqIGtleSBhc3NvY2lhdGVkIHdpdGggbXVsdGlwbGUgdmFsdWVzLiA8cD4KLSAgICoKLSAgICogQSBrZXkvdmFsdWUgcGFpciBtYXkgaGF2ZSBhc3NvY2lhdGVkIGF0dHJpYnV0ZXMgaW4gdGhlIFJUUyBmaWxlLgotICAgKiBJbiB0aGlzIG1ldGhvZCwgdGhlc2UgYXJlIHJlY2VpdmVkIGZyb20gdGhlIFhNTCBwYXJzZXIgYXMgYQotICAgKiA8Y29kZT5NYXA8L2NvZGU+LiA8cD4KLSAgICoKLSAgICogQHBhcmFtIHBhcm1zIGEgPGNvZGU+TWFwPC9jb2RlPiBvZiBjb21tYW5kIGxpbmUgcGFyYW1ldGVycwotICAgKiBAcGFyYW0gbWV0YSBhIDxjb2RlPk1hcDwvY29kZT4gb2YgcGFyc2VkIG5vbi1yZXNvdXJjZSBkYXRhCi0gICAqIChlLmcuLCBwYWNrYWdlKS4KLSAgICogQHBhcmFtIGtleSBhIDxjb2RlPlN0cmluZzwvY29kZT4ga2V5LgotICAgKiBAcGFyYW0gdmFsdWUgYSA8Y29kZT5TdHJpbmc8L2NvZGU+IHZhbHVlLgotICAgKi8KLSAgcHVibGljIHZvaWQgd3JpdGVTdHJpbmcoTWFwIHBhcm1zLCBNYXAgbWV0YSwgU3RyaW5nIGtleSwKLSAgICBTdHJpbmcgdmFsdWUpIHRocm93cyBUaHJvd2FibGU7Ci0KLSAgLyoqCi0gICAqIFdyaXRlcyB0aGUgZmlsZSBvciBvdGhlciBvdXRwdXQgZm9vdGVyKHMpLgotICAgKgotICAgKiBAcGFyYW0gcGFybXMgYSA8Y29kZT5NYXA8L2NvZGU+IG9mIGNvbW1hbmQgbGluZSBwYXJhbWV0ZXJzLgotICAgKiBAcGFyYW0gbWV0YSBhIDxjb2RlPk1hcDwvY29kZT4gb2YgcGFyc2VkIG5vbi1yZXNvdXJjZSBkYXRhCi0gICAqIChlLmcuLCBwYWNrYWdlKS4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGVuZEJ1bmRsZShNYXAgcGFybXMsIE1hcCBtZXRhKSB0aHJvd3MgVGhyb3dhYmxlOwotCi19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLXhydHMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi94cnRzL1VuaWNvZGVFc2NhcGVzLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLXhydHMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi94cnRzL1VuaWNvZGVFc2NhcGVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5ZTc2YzIuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy14cnRzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4veHJ0cy9Vbmljb2RlRXNjYXBlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi54cnRzOwotCi0vKioKLSAqIFRoZSA8Y29kZT5Vbmljb2RlRXNjYXBlczwvY29kZT4gY2xhc3MgY29udmVydHMgYnl0ZXMgYW5kIGNoYXJhY3RlcnMgb3V0c2lkZQotICogdGhlIEFTQ0lJIGNoYXJhY3RlciBzZXQgdG8gSmF2YSB1c2FibGUgJ1xcdScgVW5pY29kZSBlc2NhcGVzIGNoYXJhY3RlcnMuICBUaGlzCi0gKiBpcyBhIHJ1bnRpbWUgdmVyc2lvbiBvZiBuYXRpdmUyYXNjaWkgbW9yZSBvciBsZXNzLgotICoKLSAqIEB2ZXJzaW9uICROYW1lOiAgJCAoJFJldmlzaW9uOiAxLjUgJCkgJERhdGU6IDIwMDIvMDIvMjcgMTc6MTg6MTYgJAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgVW5pY29kZUVzY2FwZXMKLXsKLQotICBwcml2YXRlIFVuaWNvZGVFc2NhcGVzKCkKLSAgewotICB9Ci0KLSAgc3RhdGljIHB1YmxpYyBTdHJpbmcgY29udmVydChTdHJpbmcgcykKLSAgewotICAgIFN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKHMubGVuZ3RoKCkpOwotICAgIGZvcihpbnQgaSA9IDA7IGkgPCBzLmxlbmd0aCgpOyBpKyspCi0gICAgewotICAgICAgY2hhciBjID0gcy5jaGFyQXQoaSk7Ci0gICAgICBpZiAoYyA8IDEyOCkKLSAgICAgIHsKLSAgICAgICAgc3dpdGNoIChjKQotICAgICAgICB7Ci0gICAgICAgIGNhc2UgJ1xiJzoKLSAgICAgICAgICBidWZmZXIuYXBwZW5kKCJcXGIiKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAnXHQnOgotICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoIlxcdCIpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlICdcbic6Ci0gICAgICAgICAgYnVmZmVyLmFwcGVuZCgiXFxuIik7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgJ1xmJzoKLSAgICAgICAgICBidWZmZXIuYXBwZW5kKCJcXGYiKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAnXHInOgotICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoIlxcciIpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlICdcIic6Ci0gICAgICAgICAgYnVmZmVyLmFwcGVuZCgiXFxcIiIpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlICdcJyc6Ci0gICAgICAgICAgYnVmZmVyLmFwcGVuZCgiXFxcJyIpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlICdcXCc6Ci0gICAgICAgICAgYnVmZmVyLmFwcGVuZCgiXFxcXCIpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoYyk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgYnVmZmVyLmFwcGVuZCgiXFx1Iik7Ci0gICAgICAgIGJ1ZmZlci5hcHBlbmQoX0hFWFsoYz4+MTIpJiAweDBmXSk7Ci0gICAgICAgIGJ1ZmZlci5hcHBlbmQoX0hFWFsoYz4+OCkmIDB4MGZdKTsKLSAgICAgICAgYnVmZmVyLmFwcGVuZChfSEVYWyhjPj40KSYgMHgwZl0pOwotICAgICAgICBidWZmZXIuYXBwZW5kKF9IRVhbYyAmIDB4MGZdKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotICB9Ci0KLS8vICBTdHJpbmcgYnl0ZVRvSGV4KGJ5dGUgYikgewotLy8gICAgLy8gUmV0dXJucyBoZXggU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGJ5dGUgYgotLy8gICAgY2hhciBoZXhEaWdpdFtdID0gewotLy8gICAgICAgJzAnLCAnMScsICcyJywgJzMnLCAnNCcsICc1JywgJzYnLCAnNycsCi0vLyAgICAgICAnOCcsICc5JywgJ2EnLCAnYicsICdjJywgJ2QnLCAnZScsICdmJwotLy8gICAgfTsKLS8vICAgIGNoYXJbXSBhcnJheSA9IHsgaGV4RGlnaXRbKGIgPj4gNCkgJiAweDBmXSwgaGV4RGlnaXRbYiAmIDB4MGZdIH07Ci0vLyAgICByZXR1cm4gbmV3IFN0cmluZyhhcnJheSk7Ci0vLyAgfQotCi0vLyAgU3RyaW5nIGNoYXJUb0hleChjaGFyIGMpIHsKLS8vICAgIC8vIFJldHVybnMgaGV4IFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBjaGFyIGMKLS8vICAgIGJ5dGUgaGkgPSAoYnl0ZSkgKGMgPj4+IDgpOwotLy8gICAgYnl0ZSBsbyA9IChieXRlKSAoYyAmIDB4ZmYpOwotLy8gICAgcmV0dXJuIGJ5dGVUb0hleChoaSkgKyBieXRlVG9IZXgobG8pOwotLy8gIH0KLQotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBfSEVYID0KLSAgICB7IjAiLCAiMSIsICIyIiwgIjMiLCAiNCIsICI1IiwgIjYiLCAiNyIsCi0gICAgICI4IiwgIjkiLCAiYSIsICJiIiwgImMiLCAiZCIsICJlIiwgImYifTsKLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMteHJ0cy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL3hydHMvWFJUU0dlbmVyYXRvci5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy14cnRzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4veHJ0cy9YUlRTR2VuZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlOTQ1N2QuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy14cnRzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4veHJ0cy9YUlRTR2VuZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4ueHJ0czsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXI7Ci0KLWltcG9ydCBvcmcueG1sLnNheC5JbnB1dFNvdXJjZTsKLQotLyoqCi0gKiBUaGUgPGNvZGU+WFJUU0dlbmVyYXRvcjwvY29kZT4gY2xhc3MgaXMgYSBvbmxpbmUgZmFjaWxpdHkgKGFzIG9wcG9zZWQgdG8gdGhlCi0gKiBjb21tYW5kIGxpbmUgdXRpbGl0eSA8Y29kZT5YUlRTTWFrZUJ1bmRsZTwvY29kZT4pIGZvciBwYXJzaW5nIGFuZCBidWlsZGluZwotICogWE1MLWJhc2VkIFJUUyBmaWxlcyB0byB0aGUgZ2l2ZW4gaW1wbGVtZW50YXRpb24gb3V0cHV0LiA8cD4KLSAqCi0gKiBAdmVyc2lvbiAkTmFtZTogICQgKCRSZXZpc2lvbjogMS4xICQpICREYXRlOiAyMDAxLzA3LzA5IDE4OjE1OjUzICQKLSAqIEBzaW5jZSBSVFMgMi4wCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBYUlRTR2VuZXJhdG9yCi17Ci0KLSAgLyoqCi0gICAqIFBhcnNlIHRoZSBYTUwtYmFzZWQgUlRTIHNvdXJjZSBhbmQgY3JlYXRlIG91dHB1dCBhY2NvcmRpbmcgdG8gYW4KLSAgICogPGNvZGU+UlRTV3JpdGVyPC9jb2RlPiBpbXBsZW1lbnRhdGlvbi4KLSAgICoKLSAgICogQHBhcmFtIHBhcnNlciBzZWUgY2xhc3MgZGVzY3JpcHRpb24uCi0gICAqIEBwYXJhbSBpcyB0aGUgWE1MLWJhc2VkIFJUUyBzb3VyY2UgZmlsZS4KLSAgICogQHBhcmFtIHJ0c3cgYW4gPGNvZGU+UlRTV3JpdGVyPC9jb2RlPiBpbXBsZW1lbnRhdGlvbi4KLSAgICogQHBhcmFtIHBhcm1zIGEgPGNvZGU+TWFwPC9jb2RlPiBvZiBjb21tYW5kIGxpbmUgcGFyYW1ldGVycy4KLSAgICoKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBnZW5lcmF0ZShTQVhQYXJzZXIgcGFyc2VyLCBJbnB1dFNvdXJjZSBpcywgUlRTV3JpdGVyIHJ0c3csCi0gICAgTWFwIHBhcm1zKSB0aHJvd3MgVGhyb3dhYmxlCi0gIHsKLSAgICBYUlRTUGFyc2VyIHJ0c3AgPSBuZXcgWFJUU1BhcnNlcihydHN3LCBwYXJtcyk7Ci0gICAgcGFyc2VyLnBhcnNlKGlzLCBydHNwKTsKLSAgfQotCi0gIC8vCi0gIC8vIE5vIG5lZWQgdG8gaW5zdGFudGlhdGUgdGhpcyBjbGFzcwotICAvLwotICBwcml2YXRlIFhSVFNHZW5lcmF0b3IoKQotICB7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMteHJ0cy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL3hydHMvWFJUU1BhcnNlci5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy14cnRzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4veHJ0cy9YUlRTUGFyc2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjOTBiZjAuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy14cnRzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4veHJ0cy9YUlRTUGFyc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDggKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLnhydHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcueG1sLnNheC5BdHRyaWJ1dGVMaXN0OwotaW1wb3J0IG9yZy54bWwuc2F4LkhhbmRsZXJCYXNlOwotaW1wb3J0IG9yZy54bWwuc2F4LkxvY2F0b3I7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotCi0vKioKLSAqICovCi1maW5hbCBjbGFzcyBYUlRTUGFyc2VyIGV4dGVuZHMgSGFuZGxlckJhc2UKLXsKLQotICAvKioKLSAgICogRW1wdHkgY29uc3RydWN0b3IgZm9yIHRoZSBYUlRTUGFyc2VyCi0gICAqCi0gICAqLwotICBwdWJsaWMgWFJUU1BhcnNlcigpCi0gIHsKLSAgfQotCi0gIHB1YmxpYyBYUlRTUGFyc2VyKFJUU1dyaXRlciBidywgTWFwIHBhcm1zKQotICB7Ci0gICAgX2J1bmRsZVdyaXRlciA9IGJ3OwotICAgIF9wYXJtcyA9IHBhcm1zOwotICB9Ci0KLSAgLyoqCi0gICAqIFJlY2VpdmUgYSBMb2NhdG9yIG9iamVjdCBmb3IgZG9jdW1lbnQgZXZlbnRzLgotICAgKiBTZXR0aW5nIExvY2F0b3IgZW5zdXJlcyB0aGUgU0FYIHBhcnNlciBjYW4gZmluZCBhIGdpdmVuIFhNTC1iYXNlZCBSVFMKLSAgICogZG9jdW1lbnQuICBUaGlzIG1ldGhvZCBpcyBjbG9zZWx5IHJlbGF0ZWQgdG8gdGhlIF9maWxlVG9VUkwgaW4KLSAgICogPGNvZGU+WFJUU01ha2VCdW5kbGU8L2NvZGU+LgotICAgKgotICAgKiBAcGFyYW0gbG9jYXRvciBBIGxvY2F0b3IgZm9yIGFsbCBTQVggZG9jdW1lbnQgZXZlbnRzLgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0RG9jdW1lbnRMb2NhdG9yIChMb2NhdG9yIGxvY2F0b3IpCi0gIHsKLSAgICBfbG9jYXRvciA9IGxvY2F0b3I7Ci0gIH0KLQotICAvKioKLSAgICogUmVjZWl2ZSBub3RpZmljYXRpb24gb2YgdGhlIGJlZ2lubmluZyBvZiB0aGUgZG9jdW1lbnQuCi0gICAqIFNBWCBQYXJzZXIgZXZlbnQgZm9yIGZpbmRpbmcgdGhlIGJlZ2lubmluZyBvZiBhbiBYTUwtYmFzZWQgUlRTIGRvY3VtZW50Ci0gICAqLwotICBwdWJsaWMgdm9pZCBzdGFydERvY3VtZW50KCkgdGhyb3dzIFNBWEV4Y2VwdGlvbgotICB7Ci0gICAgX21ldGFIdC5wdXQoImZpbGVUeXBlIiwgInhydHMiKTsKLSAgICBfc3RhcnREb2MgPSB0cnVlOwotCi0gIH0KLQotICAvKioKLSAgICogUmVjZWl2ZSBub3RpZmljYXRpb24gb2YgdGhlIGVuZCBvZiB0aGUgZG9jdW1lbnQuCi0gICAqIFNBWCBQYXJzZXIgZXZlbnQgZm9yIGZpbmRpbmcgdGhlIGVuZCBvZiBhbiBYTUwtYmFzZWQgUlRTIGRvY3VtZW50Ci0gICAqLwotICBwdWJsaWMgdm9pZCBlbmREb2N1bWVudCgpIHRocm93cyBTQVhFeGNlcHRpb24KLSAgewotLy8gICAgU3lzdGVtLm91dC5wcmludGxuKCJFbmREb2N1bWVudCIpOwotICAgIHRyeQotICAgIHsKLSAgICAgIF9idW5kbGVXcml0ZXIuZW5kQnVuZGxlKF9wYXJtcywgX21ldGFIdCk7Ci0gICAgfQotICAgIGNhdGNoIChUaHJvd2FibGUgdGgpCi0gICAgewotICAgICAgdGhyb3cgbmV3IFNBWEV4Y2VwdGlvbigiZW5kQnVuZGxlIEV4Y2VwdGlvbjogIiArIHRoLmdldE1lc3NhZ2UoKSk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFJlY2VpdmUgbm90aWZpY2F0aW9uIG9mIHRoZSBzdGFydCBvZiBhbiBlbGVtZW50LgotICAgKgotICAgKiBAcGFyYW0gbmFtZSB0aGUgZWxlbWVudCB0eXBlIG5hbWUuCi0gICAqIEBwYXJhbSBhdHRyaWJ1dGVzIHRoZSBzcGVjaWZpZWQgb3IgZGVmYXVsdGVkIGF0dHJpYnV0ZXMuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzdGFydEVsZW1lbnQoU3RyaW5nIG5hbWUsIEF0dHJpYnV0ZUxpc3QgYXR0cykgdGhyb3dzIFNBWEV4Y2VwdGlvbgotICB7Ci0gICAgX25lc3RpbmdMZXZlbCsrOwotCi0gICAgLy8gc3RhcnRCdW5kbGUgZG9lc24ndCBnbyBpbiB0aGUgc3RhcnREb2N1bWVudCBtZXRob2QgYmVjYXVzZSBpdAotICAgIC8vIHJlcXVpcmVzIG1ldGFkYXRhIHRvIGJlIHBhc3NlZCBhbmQgaW4gcGFydGljdWxhciwgcmVxdWlyZXMKLSAgICAvLyBhdCBsZWFzdCB0aGUgcGFja2FnZSBmb3IgYW55IGltcGxlbWVudGF0aW9uIG9mIHN0YXJ0QnVuZGxlIHRvIHdvcmsKLSAgICBpZiAoKF9uZXN0aW5nTGV2ZWwgPT0gMikgJiYgbmFtZS5lcXVhbHMoInJlc291cmNlIikpCi0gICAgewotICAgICAgaWYgKF9zdGFydERvYykKLSAgICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICBfYnVuZGxlV3JpdGVyLnN0YXJ0QnVuZGxlKF9wYXJtcywgX21ldGFIdCk7Ci0gICAgICAgICAgX3N0YXJ0RG9jID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0aCkKLSAgICAgICAgewotICAgICAgICAgIHRocm93IG5ldyBTQVhFeGNlcHRpb24oInN0YXJ0QnVuZGxlIEV4Y2VwdGlvbjogIiArIHRoLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgX2N1cnJlbnRSZXNvdXJjZUtleSA9IGF0dHMuZ2V0VmFsdWUoImtleSIpOwotICAgICAgaWYgKF91bmlxS2V5cy5jb250YWlucyhfY3VycmVudFJlc291cmNlS2V5KSkKLSAgICAgIHsKLSAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJEdXBsaWNhdGUgaWQgXCIiICsgX2N1cnJlbnRSZXNvdXJjZUtleSArICJcIiIpOwotICAgICAgfQotCi0gICAgICBfdW5pcUtleXMuYWRkKF9jdXJyZW50UmVzb3VyY2VLZXkpOwotICAgICAgCi0KLSAgICAgIF9jdXJyZW50UmVzb3VyY2VWYWx1ZSA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKChfbmVzdGluZ0xldmVsID09IDEpICYmIG5hbWUuZXF1YWxzKCJyZXNvdXJjZXMiKSkKLSAgICB7Ci0gICAgICBfbWV0YUh0LnB1dCgicGFja2FnZSIsIGF0dHMuZ2V0VmFsdWUoInBhY2thZ2UiKSk7Ci0gICAgICBpZiAoYXR0cy5nZXRWYWx1ZSgidmVyc2lvbiIpICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIF9tZXRhSHQucHV0KCJ2ZXJzaW9uIiwgYXR0cy5nZXRWYWx1ZSgidmVyc2lvbiIpKTsKLSAgICAgIH0KLSAgICAgIGlmIChhdHRzLmdldFZhbHVlKCJiYXNldmVyc2lvbiIpICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIF9tZXRhSHQucHV0KCJiYXNlVmVyc2lvbiIsIGF0dHMuZ2V0VmFsdWUoImJhc2V2ZXJzaW9uIikpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBSZWNlaXZlIG5vdGlmaWNhdGlvbiBvZiB0aGUgZW5kIG9mIGFuIGVsZW1lbnQuCi0gICAqIEBwYXJhbSBuYW1lIHRoZSBlbGVtZW50IHR5cGUgbmFtZS4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGVuZEVsZW1lbnQoU3RyaW5nIG5hbWUpIHRocm93cyBTQVhFeGNlcHRpb24KLSAgewotICAgIGlmICgoX25lc3RpbmdMZXZlbCA9PSAyKSAmJiBuYW1lLmVxdWFscygicmVzb3VyY2UiKSkKLSAgICB7Ci0gICAgICBTdHJpbmcgdmFsdWUgPSBfY3VycmVudFJlc291cmNlVmFsdWUudG9TdHJpbmcoKS50cmltKCk7Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgX2J1bmRsZVdyaXRlci53cml0ZVN0cmluZyhfcGFybXMsIF9tZXRhSHQsIF9jdXJyZW50UmVzb3VyY2VLZXksIHZhbHVlKTsKLSAgICAgIH0KLSAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkKLSAgICAgIHsKLSAgICAgICAgdGhyb3cgbmV3IFNBWEV4Y2VwdGlvbih0LmdldE1lc3NhZ2UoKSk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgX25lc3RpbmdMZXZlbC0tOwotICB9Ci0KLSAgLyoqCi0gICAqIFJlY2VpdmUgbm90aWZpY2F0aW9uIG9mIGlnbm9yYWJsZSB3aGl0ZXNwYWNlIGluIGVsZW1lbnQgY29udGVudC4KLSAgICoKLSAgICogQHBhcmFtIGNoIHRoZSB3aGl0ZXNwYWNlIGNoYXJhY3RlcnMuCi0gICAqIEBwYXJhbSBzdGFydCB0aGUgc3RhcnQgcG9zaXRpb24gaW4gdGhlIGNoYXJhY3RlciBhcnJheS4KLSAgICogQHBhcmFtIGxlbmd0aCB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gdXNlIGZyb20gdGhlIGNoYXJhY3RlciBhcnJheS4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGlnbm9yYWJsZVdoaXRlc3BhY2UoY2hhcltdIGNidWYsIGludCBzdGFydCwgaW50IGxlbikKLSAgICB0aHJvd3MgU0FYRXhjZXB0aW9uCi0gIHsKLS8vICAgIFN5c3RlbS5vdXQucHJpbnRsbigiSWdub3JhYmxlV2hpdGVTcGFjZSIgKyBsZW4pOwotICB9Ci0KLSAgLyoqCi0gICAqIFJlY2VpdmUgbm90aWZpY2F0aW9uIG9mIGNoYXJhY3RlciBkYXRhIGluc2lkZSBhbiBlbGVtZW50LgotICAgKgotICAgKiBAcGFyYW0gY2ggdGhlIGNoYXJhY3RlcnMuCi0gICAqIEBwYXJhbSBzdGFydCB0aGUgc3RhcnQgcG9zaXRpb24gaW4gdGhlIGNoYXJhY3RlciBhcnJheS4KLSAgICogQHBhcmFtIGxlbmd0aCB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gdXNlIGZyb20gdGhlIGNoYXJhY3RlciBhcnJheS4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGNoYXJhY3RlcnMoY2hhcltdIGNidWYsIGludCBzdGFydCwgaW50IGxlbikgdGhyb3dzIFNBWEV4Y2VwdGlvbgotICB7Ci0gICAgaWYgKF9uZXN0aW5nTGV2ZWwgPT0gMikKLSAgICB7Ci0gICAgICBfY3VycmVudFJlc291cmNlVmFsdWUuYXBwZW5kKGNidWYsIHN0YXJ0LCBsZW4pOwotICAgIH0KLSAgfQotCi0KLSAgLy8gU3RvcmUgdGhlIGxvY2F0b3IKLSAgcHJpdmF0ZSBMb2NhdG9yIF9sb2NhdG9yOwotCi0gIHByaXZhdGUgU3RyaW5nIF9jdXJyZW50UmVzb3VyY2VLZXk7Ci0gIHByaXZhdGUgU3RyaW5nQnVpbGRlciBfY3VycmVudFJlc291cmNlVmFsdWU7Ci0gIHByaXZhdGUgTWFwPFN0cmluZywgT2JqZWN0PiBfbWV0YUh0ID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7Ci0gIHByaXZhdGUgU2V0PFN0cmluZz4gX3VuaXFLZXlzID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOwotCi0gIHByaXZhdGUgUlRTV3JpdGVyIF9idW5kbGVXcml0ZXI7Ci0gIHByaXZhdGUgTWFwIF9wYXJtczsKLQotICBwcml2YXRlIGludCBfbmVzdGluZ0xldmVsID0gMDsKLSAgcHJpdmF0ZSBib29sZWFuIF9zdGFydERvYyA9IGZhbHNlOwotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy14cnRzLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvTk9USUNFIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy14cnRzLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvTk9USUNFCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYTNkYmQ2Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMteHJ0cy1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL05PVElDRQorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLT09ICBOT1RJQ0UgZmlsZSBjb3JyZXNwb25kaW5nIHRvIHNlY3Rpb24gNChkKSBvZiB0aGUgQXBhY2hlIExpY2Vuc2UsICAgPT0KLT09ICBWZXJzaW9uIDIuMCwgaW4gdGhpcyBjYXNlIGZvciB0aGUgQXBhY2hlIE15RmFjZXMgTWF2ZW4gUGx1Z2lucyAgICAgPT0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSAKLVRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuCi0KLVBvcnRpb25zIG9mIHRoaXMgc29mdHdhcmUgd2VyZSBvcmlnaW5hbGx5IGJhc2VkIG9uIHRoZSBmb2xsb3dpbmc6Ci0KLSAtIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDA2LCBPcmFjbGUgQ29ycCwgPGh0dHA6Ly93d3cub3JhY2xlLmNvbS8+LgotYW5kIGFyZSBsaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gdW5kZXIgdGhlIAotIlNvZnR3YXJlIEdyYW50IGFuZCBDb3Jwb3JhdGUgQ29udHJpYnV0aW9uIExpY2Vuc2UgQWdyZWVtZW50IgotCi1TZWUgdGhlIExJQ0VOU0UudHh0IGZpbGUgZm9yIGluZm9ybWF0aW9uIG9uIGFsbCBsaWNlbnNlcyAKLWFzc29jaWF0ZWQgd2l0aCB0aGlzIHNvZnR3YXJlLgpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvcG9tLnhtbCBiL21hdmVuMi1wbHVnaW5zL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyZGZhMzIuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICAgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICAgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gICAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICAgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gICAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gICAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gICAgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPCEtLQotICAtIEEgIm1vZHVsZSIgcG9tIHdob3NlIHB1cnBvc2UgaXMgc2ltcGx5IHRvIGJ1aWxkIGFsbCBtYXZlbiBtb2R1bGVzCi0gIC0gaW4gdGhlIHN1YmRpcmVjdG9yaWVzLiBUaGlzIGlzIE5PVCB0aGUgcGFyZW50IHBvbSBvZiBhbnkgcHJvamVjdCwKLSAgLSBhbmQgaXMgbm90IGV4cGVjdGVkIHRvIGV2ZXIgYmUgcmVsZWFzZWQuCi0gIC0tPgotCi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLQotICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0KLSAgPHBhcmVudD4KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXM8L2dyb3VwSWQ+Ci0gICAgPGFydGlmYWN0SWQ+bXlmYWNlczwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj45PC92ZXJzaW9uPgotICA8L3BhcmVudD4KLQotICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29sczwvZ3JvdXBJZD4KLSAgPGFydGlmYWN0SWQ+bXlmYWNlcy1wbHVnaW4tbW9kdWxlPC9hcnRpZmFjdElkPgotICA8dmVyc2lvbj4xLVNOQVBTSE9UPC92ZXJzaW9uPgotICA8cGFja2FnaW5nPnBvbTwvcGFja2FnaW5nPgotICA8bmFtZT5BcGFjaGUgTXlGYWNlcyBCdWlsZHRvb2xzIE1hdmVuMiBQbHVnaW4gTW9kdWxlPC9uYW1lPgotICA8dXJsPmh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvYnVpbGQtdG9vbHMvcGx1Z2luczwvdXJsPgotCi0gIDxzY20+Ci0gICAgPGNvbm5lY3Rpb24+c2NtOnN2bjpodHRwOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL215ZmFjZXMvbXlmYWNlcy1idWlsZC10b29scy90cnVuay9tYXZlbjItcGx1Z2luczwvY29ubmVjdGlvbj4KLSAgICA8ZGV2ZWxvcGVyQ29ubmVjdGlvbj5zY206c3ZuOmh0dHBzOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL215ZmFjZXMvbXlmYWNlcy1idWlsZC10b29scy90cnVuay9tYXZlbjItcGx1Z2luczwvZGV2ZWxvcGVyQ29ubmVjdGlvbj4KLSAgICA8dXJsPmh0dHA6Ly9zdm4uYXBhY2hlLm9yZy92aWV3dmMvbXlmYWNlcy9teWZhY2VzLWJ1aWxkLXRvb2xzL3RydW5rL21hdmVuMi1wbHVnaW5zPC91cmw+Ci0gIDwvc2NtPgotCi0gIDwhLS0gV0FSTklORzogRE8gTk9UIERFUExPWSBTSVRFIEZST00gSEVSRQotICAgQSBwYXJlbnQgbW9kdWxlIGlzIGF0IG15ZmFjZXMtcGx1Z2luLXBhcmVudCwgc28gd2hlbiAKLSAgIGEgc2l0ZSBuZWVkcyB0byBiZSBkZXBsb3llZCwgcnVuIG12biBzaXRlOnNpdGUgbXZuIHNpdGU6ZGVwbG95Ci0gICBmcm9tIG15ZmFjZXMtcGx1Z2luLXBhcmVudCBhbmQgdGhlbiBmb3IgZWFjaCBvbmUgb2YgdGhlIHJlbWFpbmluZwotICAgbW9kdWxlcy4gSWYgdGhlIGdvYWwgaXMgZXhlY3V0ZWQgZnJvbSBoZXJlIHRoZSBzaXRlIGRvZXMgbm90IHdvcmsKLSAgIHdlbGwuIC0tPgotICA8bW9kdWxlcz4KLSAgICA8bW9kdWxlPm15ZmFjZXMtcGx1Z2luLXBhcmVudDwvbW9kdWxlPgotICAgIDxtb2R1bGU+bXlmYWNlcy1idWlsZGVyLWFubm90YXRpb25zPC9tb2R1bGU+Ci0gICAgPG1vZHVsZT5teWZhY2VzLWJ1aWxkZXItcGx1Z2luPC9tb2R1bGU+Ci0gICAgPG1vZHVsZT5teWZhY2VzLWZhY2VzLXBsdWdpbjwvbW9kdWxlPgotICAgIDxtb2R1bGU+bXlmYWNlcy1pMThuLXBsdWdpbjwvbW9kdWxlPgotICAgIDxtb2R1bGU+bXlmYWNlcy1qYXZhY2MtcGx1Z2luPC9tb2R1bGU+Ci0gICAgPG1vZHVsZT5teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luPC9tb2R1bGU+Ci0gICAgPG1vZHVsZT5teWZhY2VzLWpzZG9jLXBsdWdpbjwvbW9kdWxlPgotICAgIDxtb2R1bGU+bXlmYWNlcy1qZGV2LXBsdWdpbjwvbW9kdWxlPgotICAgIDxtb2R1bGU+bXlmYWNlcy10YWdkb2MtcGx1Z2luPC9tb2R1bGU+Ci0gICAgPG1vZHVsZT5teWZhY2VzLXdhZ29uLXBsdWdpbjwvbW9kdWxlPgotICAgIDxtb2R1bGU+bXlmYWNlcy14cnRzLXBsdWdpbjwvbW9kdWxlPgotICA8L21vZHVsZXM+Ci0KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL3RvYmFnby10aGVtZS1wbHVnaW4vcG9tLnhtbCBiL21hdmVuMi1wbHVnaW5zL3RvYmFnby10aGVtZS1wbHVnaW4vcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzA1YzJlZS4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy90b2JhZ28tdGhlbWUtcGx1Z2luL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLSAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotICA8cGFyZW50PgotICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy50b2JhZ288L2dyb3VwSWQ+Ci0gICAgPGFydGlmYWN0SWQ+dG9iYWdvPC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjEuMC4yNTwvdmVyc2lvbj4KLSAgPC9wYXJlbnQ+Ci0gIDxhcnRpZmFjdElkPnRvYmFnby10aGVtZS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gIDxwYWNrYWdpbmc+bWF2ZW4tcGx1Z2luPC9wYWNrYWdpbmc+Ci0gIDxuYW1lPlRvYmFnbyBNYXZlbjIgVGhlbWUgUGx1Z2luPC9uYW1lPgotICAKLSAgPHNjbT4KLSAgICA8Y29ubmVjdGlvbj5zY206c3ZuOmh0dHA6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvbXlmYWNlcy9teWZhY2VzLWJ1aWxkLXRvb2xzL3RydW5rL21hdmVuMi1wbHVnaW5zL3RvYmFnby10aGVtZS1wbHVnaW48L2Nvbm5lY3Rpb24+Ci0gICAgPGRldmVsb3BlckNvbm5lY3Rpb24+c2NtOnN2bjpodHRwczovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9teWZhY2VzL215ZmFjZXMtYnVpbGQtdG9vbHMvdHJ1bmsvbWF2ZW4yLXBsdWdpbnMvdG9iYWdvLXRoZW1lLXBsdWdpbjwvZGV2ZWxvcGVyQ29ubmVjdGlvbj4KLSAgICA8dXJsPmh0dHA6Ly9zdm4uYXBhY2hlLm9yZy92aWV3dmMvbXlmYWNlcy9teWZhY2VzLWJ1aWxkLXRvb2xzL3RydW5rL21hdmVuMi1wbHVnaW5zL3RvYmFnby10aGVtZS1wbHVnaW48L3VybD4KLSAgPC9zY20+Ci0KLSAgPGRlcGVuZGVuY2llcz4KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW48L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1wbHVnaW4tYXBpPC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+Mi4wPC92ZXJzaW9uPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW48L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1wcm9qZWN0PC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+Mi4wPC92ZXJzaW9uPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW48L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1hcmNoaXZlcjwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjIuMDwvdmVyc2lvbj4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5vcmcuY29kZWhhdXMucGxleHVzPC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+cGxleHVzLXV0aWxzPC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+MS4wLjU8L3ZlcnNpb24+Ci0gICAgPC9kZXBlbmRlbmN5PgotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbjwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFydGlmYWN0PC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+Mi4wPC92ZXJzaW9uPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgPC9kZXBlbmRlbmNpZXM+Ci0gIDxidWlsZD4KLSAgICA8cGx1Z2luTWFuYWdlbWVudD4KLSAgICAgIDxwbHVnaW5zPgotICAgICAgICA8cGx1Z2luPgotICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KLSAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1wbHVnaW4tcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgIDx2ZXJzaW9uPjIuNC4xPC92ZXJzaW9uPgotICAgICAgICA8L3BsdWdpbj4KLSAgICAgIDwvcGx1Z2lucz4KLSAgICA8L3BsdWdpbk1hbmFnZW1lbnQ+Ci0gIDwvYnVpbGQ+Ci08L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvdG9iYWdvLXRoZW1lLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy90b2JhZ28vbWF2ZW4vcGx1Z2luL0Fic3RyYWN0VGhlbWVNb2pvLmphdmEgYi9tYXZlbjItcGx1Z2lucy90b2JhZ28tdGhlbWUtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL3RvYmFnby9tYXZlbi9wbHVnaW4vQWJzdHJhY3RUaGVtZU1vam8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODBmNDJiMC4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy90b2JhZ28tdGhlbWUtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL3RvYmFnby9tYXZlbi9wbHVnaW4vQWJzdHJhY3RUaGVtZU1vam8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLnRvYmFnby5tYXZlbi5wbHVnaW47Ci0KLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLkFic3RyYWN0TW9qbzsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnByb2plY3QuTWF2ZW5Qcm9qZWN0OwotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMudXRpbC5EaXJlY3RvcnlTY2FubmVyOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi0vKgotICogRGF0ZTogMjMuMTAuMjAwNQotICogVGltZTogMTY6Mzc6MDQKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0VGhlbWVNb2pvIGV4dGVuZHMgQWJzdHJhY3RNb2pvIHsKLSAgLyoqCi0gICAqIFRoZSBtYXZlbiBwcm9qZWN0LgotICAgKgotICAgKiBAcGFyYW1ldGVyIGV4cHJlc3Npb249IiR7cHJvamVjdH0iCi0gICAqIEByZXF1aXJlZAotICAgKiBAcmVhZG9ubHkKLSAgICovCi0gIHByaXZhdGUgTWF2ZW5Qcm9qZWN0IHByb2plY3Q7Ci0KLSAgcHVibGljIE1hdmVuUHJvamVjdCBnZXRQcm9qZWN0KCkgewotICAgIHJldHVybiBwcm9qZWN0OwotICB9Ci0KLSAgcHJvdGVjdGVkIFN0cmluZ1tdIGdldFRoZW1lRmlsZXMoRmlsZSBzb3VyY2VEaXIpIHsKLSAgICBEaXJlY3RvcnlTY2FubmVyIHNjYW5uZXIgPSBuZXcgRGlyZWN0b3J5U2Nhbm5lcigpOwotICAgIHNjYW5uZXIuc2V0QmFzZWRpcihzb3VyY2VEaXIpOwotICAgIHNjYW5uZXIuc2V0SW5jbHVkZXMobmV3IFN0cmluZ1tdeyIqKiJ9KTsKLSAgICBzY2FubmVyLnNldEV4Y2x1ZGVzKG5ldyBTdHJpbmcgW10geyJNRVRBLUlORi8qKi8qIiwKLSAgICAgICAgIioqLyoucHJvcGVydGllcyIsICIqKi8qLnhtbCIsICIqKi8qLmNsYXNzIn0pOwotICAgIHNjYW5uZXIuc2NhbigpOwotICAgIHJldHVybiBzY2FubmVyLmdldEluY2x1ZGVkRmlsZXMoKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvdG9iYWdvLXRoZW1lLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy90b2JhZ28vbWF2ZW4vcGx1Z2luL1BhY2tUaGVtZU1vam8uamF2YSBiL21hdmVuMi1wbHVnaW5zL3RvYmFnby10aGVtZS1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvdG9iYWdvL21hdmVuL3BsdWdpbi9QYWNrVGhlbWVNb2pvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhYzE4NzUuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvdG9iYWdvLXRoZW1lLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy90b2JhZ28vbWF2ZW4vcGx1Z2luL1BhY2tUaGVtZU1vam8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NyArMCwwIEBACi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy50b2JhZ28ubWF2ZW4ucGx1Z2luOwotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLmFyY2hpdmVyLk1hdmVuQXJjaGl2ZUNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5hcnRpZmFjdC5BcnRpZmFjdDsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5Nb2pvRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucHJvamVjdC5NYXZlblByb2plY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wcm9qZWN0Lk1hdmVuUHJvamVjdEhlbHBlcjsKLWltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLmFyY2hpdmVyLkFyY2hpdmVyRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMuYXJjaGl2ZXIuemlwLlppcEFyY2hpdmVyOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMudXRpbC5GaWxlVXRpbHM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIERhdGU6IDIzLjEwLjIwMDUKLSAqIFRpbWU6IDE2OjMzOjA0Ci0gKgotICogQGdvYWwgdGhlbWUKLSAqIEBwaGFzZSBwYWNrYWdlCi0gKiBAcmVxdWlyZXNEZXBlbmRlbmN5UmVzb2x1dGlvbiBjb21waWxlCi0gKi8KLXB1YmxpYyBjbGFzcyBQYWNrVGhlbWVNb2pvIGV4dGVuZHMgQWJzdHJhY3RUaGVtZU1vam8gewotCi0gIC8qKgotICAgKiBNYXZlbiBQcm9qZWN0SGVscGVyCi0gICAqCi0gICAqIEBjb21wb25lbnQKLSAgICovCi0gIHByaXZhdGUgTWF2ZW5Qcm9qZWN0SGVscGVyIHByb2plY3RIZWxwZXI7Ci0KLSAgLyoqCi0gICAqIFRoZSBkaXJlY3RvcnkgZm9yIHRoZSBnZW5lcmF0ZWQgSkFSLgotICAgKgotICAgKiBAcGFyYW1ldGVyIGV4cHJlc3Npb249IiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9IgotICAgKiBAcmVxdWlyZWQKLSAgICovCi0gIHByaXZhdGUgU3RyaW5nIG91dHB1dERpcmVjdG9yeTsKLQotCi0gIC8qKgotICAgKiBUaGUgbmFtZSBvZiB0aGUgZ2VuZXJhdGVkIGphci4KLSAgICoKLSAgICogQHBhcmFtZXRlciBleHByZXNzaW9uPSIke3Byb2plY3QuYnVpbGQuZmluYWxOYW1lfSIKLSAgICogQHJlcXVpcmVkCi0gICAqLwotICBwcml2YXRlIFN0cmluZyBqYXJOYW1lOwotCi0KLSAgLyoqCi0gICAqIFRoZSBkaXJlY3Rvcnkgd2hlcmUgdGhlIHdlYmFwcCBpcyBidWlsdC4KLSAgICoKLSAgICogQHBhcmFtZXRlciBleHByZXNzaW9uPSIke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS8ke3Byb2plY3QuYnVpbGQuZmluYWxOYW1lfSIKLSAgICogQHJlcXVpcmVkCi0gICAqLwotICBwcml2YXRlIEZpbGUgd2ViYXBwRGlyZWN0b3J5OwotCi0gIC8qKgotICAgKiBUaGUgSmFyIGFyY2hpdmVyLgotICAgKgotICAgKiBAcGFyYW1ldGVyIGV4cHJlc3Npb249IiR7Y29tcG9uZW50Lm9yZy5jb2RlaGF1cy5wbGV4dXMuYXJjaGl2ZXIuQXJjaGl2ZXIjemlwfSIKLSAgICogQHJlcXVpcmVkCi0gICAqLwotICAvLyBUT0RPIFppcCBvciBqYXIgPz8/PwotICBwcml2YXRlIFppcEFyY2hpdmVyIGFyY2hpdmVyOwotCi0gIC8qKgotICAgKiBTaW5nbGUgZGlyZWN0b3J5IGZvciBleHRyYSBmaWxlcyB0byBpbmNsdWRlIGluIHRoZSBaSVAuCi0gICAqCi0gICAqIEBwYXJhbWV0ZXIgZXhwcmVzc2lvbj0iJHtiYXNlZGlyfS9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9teWZhY2VzL3RvYmFnby9yZW5kZXJraXQiCi0gICAqIEByZXF1aXJlZAotICAgKi8KLSAgcHJpdmF0ZSBGaWxlIHdhclNvdXJjZURpcmVjdG9yeTsKLQotICBwdWJsaWMgRmlsZSBnZXRXYXJTb3VyY2VEaXJlY3RvcnkoKSB7Ci0gICAgcmV0dXJuIHdhclNvdXJjZURpcmVjdG9yeTsKLSAgfQotCi0gIHB1YmxpYyBGaWxlIGdldFdlYmFwcERpcmVjdG9yeSgpIHsKLSAgICByZXR1cm4gd2ViYXBwRGlyZWN0b3J5OwotICB9Ci0KLSAgLyoqCi0gICAqIFRoZSBtYXZlbiBhcmNoaXZlIGNvbmZpZ3VyYXRpb24gdG8gdXNlLgotICAgKgotICAgKiBAcGFyYW1ldGVyCi0gICAqLwotICBwcml2YXRlIE1hdmVuQXJjaGl2ZUNvbmZpZ3VyYXRpb24gYXJjaGl2ZSA9IG5ldyBNYXZlbkFyY2hpdmVDb25maWd1cmF0aW9uKCk7Ci0KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VCX0lORiA9ICJXRUItSU5GIjsKLQotICAvKioKLSAgICogRXhlY3V0ZXMgdGhlIFdhck1vam8gb24gdGhlIGN1cnJlbnQgcHJvamVjdC4KLSAgICoKLSAgICogQHRocm93cyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uCi0gICAqICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VyZWQgd2hpbGUgYnVpbGRpbmcgdGhlIHdlYmFwcAotICAgKi8KLSAgcHVibGljIHZvaWQgZXhlY3V0ZSgpCi0gICAgICB0aHJvd3MgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0gICAgRmlsZSBqYXJGaWxlID0gbmV3IEZpbGUob3V0cHV0RGlyZWN0b3J5LCBqYXJOYW1lICsiLVRIRU1FLmphciIpOwotCi0gICAgdHJ5IHsKLSAgICAgIHBlcmZvcm1QYWNrYWdpbmcoamFyRmlsZSk7Ci0gICAgICBwcm9qZWN0SGVscGVyLmF0dGFjaEFydGlmYWN0KGdldFByb2plY3QoKSwgImphciIsICJUSEVNRSIsIGphckZpbGUpOwotCi0gICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgIC8vIFRPRE86IGltcHJvdmUgZXJyb3IgaGFuZGxpbmcKLSAgICAgIHRocm93IG5ldyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uKCJFcnJvciBhc3NlbWJsaW5nIHRoZW1lIiwgZSk7Ci0gICAgfQotICB9Ci0KLQotICBwcml2YXRlIHZvaWQgcGVyZm9ybVBhY2thZ2luZyhGaWxlIGphckZpbGUpCi0gICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIEFyY2hpdmVyRXhjZXB0aW9uLAotICAgICAgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0gICAgYnVpbGRFeHBsb2RlZFRoZW1lKGdldFdlYmFwcERpcmVjdG9yeSgpKTsKLQotICAgIGdldExvZygpLmluZm8oIkdlbmVyYXRpbmcgdGhlbWUgIiArIGphckZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOwotICAgIGFyY2hpdmVyLmFkZERpcmVjdG9yeShnZXRXZWJhcHBEaXJlY3RvcnkoKSwgZ2V0SW5jbHVkZXMoKSwgZ2V0RXhjbHVkZXMoKSk7Ci0gICAgYXJjaGl2ZXIuc2V0RGVzdEZpbGUoamFyRmlsZSk7Ci0gICAgYXJjaGl2ZXIuY3JlYXRlQXJjaGl2ZSgpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgYnVpbGRFeHBsb2RlZFRoZW1lKEZpbGUgemlwRGlyZWN0b3J5KQotICAgICAgdGhyb3dzIE1vam9FeGVjdXRpb25FeGNlcHRpb24gewotICAgIGdldExvZygpLmluZm8oIkV4cGxvZGluZyB0aGVtZS4uLiIpOwotICAgIHppcERpcmVjdG9yeS5ta2RpcnMoKTsKLQotCi0gICAgdHJ5IHsKLSAgICAgIGNvcHlSZXNvdXJjZXMoZ2V0V2FyU291cmNlRGlyZWN0b3J5KCksIHppcERpcmVjdG9yeSk7Ci0KLSAgICAgIGJ1aWxkVGhlbWUoZ2V0UHJvamVjdCgpLCBnZXRXZWJhcHBEaXJlY3RvcnkoKSk7Ci0gICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgdGhyb3cgbmV3IE1vam9FeGVjdXRpb25FeGNlcHRpb24oIkNvdWxkIG5vdCBleHBsb2RlIHRoZW1lLi4uIiwgZSk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgY29weVJlc291cmNlcyhGaWxlIHNvdXJjZURpcmVjdG9yeSwgRmlsZSB3ZWJhcHBEaXJlY3RvcnkpCi0gICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIGlmICghc291cmNlRGlyZWN0b3J5LmVxdWFscyh3ZWJhcHBEaXJlY3RvcnkpKSB7Ci0gICAgICBnZXRMb2coKS5pbmZvKCJDb3B5IHRoZW1lIHJlc291cmNlcyB0byAiICsgd2ViYXBwRGlyZWN0b3J5LmdldEFic29sdXRlUGF0aCgpKTsKLSAgICAgIGlmIChnZXRXYXJTb3VyY2VEaXJlY3RvcnkoKS5leGlzdHMoKSkgewotICAgICAgICBTdHJpbmdbXSBmaWxlTmFtZXMgPSBnZXRUaGVtZUZpbGVzKHNvdXJjZURpcmVjdG9yeSk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZU5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgRmlsZVV0aWxzLmNvcHlGaWxlKG5ldyBGaWxlKHNvdXJjZURpcmVjdG9yeSwgZmlsZU5hbWVzW2ldKSwKLSAgICAgICAgICAgICAgbmV3IEZpbGUod2ViYXBwRGlyZWN0b3J5LCAidG9iYWdvLyIgKyBmaWxlTmFtZXNbaV0pKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIGJ1aWxkVGhlbWUoTWF2ZW5Qcm9qZWN0IHByb2plY3QsIEZpbGUgd2ViYXBwRGlyZWN0b3J5KQotICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICBnZXRMb2coKS5pbmZvKCJBc3NlbWJsaW5nIHRoZW1lICIgKyBwcm9qZWN0LmdldEFydGlmYWN0SWQoKSArICIgaW4gIiArIHdlYmFwcERpcmVjdG9yeSk7Ci0KLSAgICBGaWxlIGxpYkRpcmVjdG9yeSA9IG5ldyBGaWxlKHdlYmFwcERpcmVjdG9yeSwgV0VCX0lORiArICIvbGliIik7Ci0gICAgbGliRGlyZWN0b3J5Lm1rZGlycygpOwotICAgLy8gTGlzdCBhcnRpZmFjdHMgPQotCi0gICAgLy9mb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhcnRpZmFjdHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0gICAgICBBcnRpZmFjdCBhcnRpZmFjdCA9IHByb2plY3QuZ2V0QXJ0aWZhY3QoKTsKLSAgICAgIGdldExvZygpLmRlYnVnKGFydGlmYWN0LnRvU3RyaW5nKCkpOwotICAgICAgRmlsZVV0aWxzLmNvcHlGaWxlKGFydGlmYWN0LmdldEZpbGUoKSwgbmV3IEZpbGUobGliRGlyZWN0b3J5LCBhcnRpZmFjdC5nZXRGaWxlKCkuZ2V0TmFtZSgpKSk7Ci0gICAgLy99Ci0gIH0KLQotCi0gIHByb3RlY3RlZCBTdHJpbmdbXSBnZXRFeGNsdWRlcygpIHsKLSAgICBMaXN0IGV4Y2x1ZGVMaXN0ID0gbmV3IEFycmF5TGlzdChGaWxlVXRpbHMuZ2V0RGVmYXVsdEV4Y2x1ZGVzQXNMaXN0KCkpOwotICAgIHJldHVybiAoU3RyaW5nW10pIGV4Y2x1ZGVMaXN0LnRvQXJyYXkobmV3IFN0cmluZ1tde30pOwotICB9Ci0KLSAgcHJvdGVjdGVkIFN0cmluZ1tdIGdldEluY2x1ZGVzKCkgewotICAgIHJldHVybiBuZXcgU3RyaW5nW117IioqIn07Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvdG9iYWdvLXRoZW1lLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy90b2JhZ28vbWF2ZW4vcGx1Z2luL1VuUGFja1RoZW1lTW9qby5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvdG9iYWdvLXRoZW1lLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy90b2JhZ28vbWF2ZW4vcGx1Z2luL1VuUGFja1RoZW1lTW9qby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNGU5NThjLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL3RvYmFnby10aGVtZS1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvdG9iYWdvL21hdmVuL3BsdWdpbi9VblBhY2tUaGVtZU1vam8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NSArMCwwIEBACi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy50b2JhZ28ubWF2ZW4ucGx1Z2luOwotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLmFydGlmYWN0LkFydGlmYWN0OwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLk1vam9FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy5hcmNoaXZlci5BcmNoaXZlckV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLmFyY2hpdmVyLlVuQXJjaGl2ZXI7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy5hcmNoaXZlci5tYW5hZ2VyLkFyY2hpdmVyTWFuYWdlcjsKLWltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLmFyY2hpdmVyLm1hbmFnZXIuTm9TdWNoQXJjaGl2ZXJFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy51dGlsLkZpbGVVdGlsczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotaW1wb3J0IGphdmEudXRpbC56aXAuWmlwSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLnppcC5aaXBFbnRyeTsKLQotLyoqCi0gKgotICogQHZlcnNpb24gJElkJAotICogQGdvYWwgcmVzb3VyY2VzCi0gKiBAcGhhc2UgcHJvY2Vzcy1yZXNvdXJjZXMKLSAqIEByZXF1aXJlc0RlcGVuZGVuY3lSZXNvbHV0aW9uIGNvbXBpbGUKLSAqLwotcHVibGljIGNsYXNzIFVuUGFja1RoZW1lTW9qbyBleHRlbmRzIEFic3RyYWN0VGhlbWVNb2pvIHsKLSAgLyoqCi0gICAqIFRvIGxvb2sgdXAgQXJjaGl2ZXIvVW5BcmNoaXZlciBpbXBsZW1lbnRhdGlvbnMKLSAgICoKLSAgICogQHBhcmFtZXRlciBleHByZXNzaW9uPSIke2NvbXBvbmVudC5vcmcuY29kZWhhdXMucGxleHVzLmFyY2hpdmVyLm1hbmFnZXIuQXJjaGl2ZXJNYW5hZ2VyfSIKLSAgICogQHJlcXVpcmVkCi0gICAqLwotICBwcml2YXRlIEFyY2hpdmVyTWFuYWdlciBhcmNoaXZlck1hbmFnZXI7Ci0KLSAgLyoqCi0gICAqIERpcmVjdG9yeSB0byB1bnBhY2sgSkFScyBpbnRvIGlmIG5lZWRlZAotICAgKgotICAgKiBAcGFyYW1ldGVyIGV4cHJlc3Npb249IiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L3RoZW1lL3dvcmsiCi0gICAqIEByZXF1aXJlZAotICAgKi8KLSAgcHJpdmF0ZSBGaWxlIHdvcmtEaXJlY3Rvcnk7Ci0KLSAgLyoqCi0gICAqIFRoZSBkaXJlY3Rvcnkgd2hlcmUgdGhlIHdlYmFwcCBpcyBidWlsdC4KLSAgICoKLSAgICogQHBhcmFtZXRlciBleHByZXNzaW9uPSIke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS8ke3Byb2plY3QuYnVpbGQuZmluYWxOYW1lfSIKLSAgICogQHJlcXVpcmVkCi0gICAqLwotICBwcml2YXRlIEZpbGUgd2ViYXBwRGlyZWN0b3J5OwotCi0gIC8qKgotICAgKiBAcGFyYW1ldGVyIGV4cHJlc3Npb249IiR7cGx1Z2luLmFydGlmYWN0c30iCi0gICAqIEByZXF1aXJlZAotICAgKi8KLSAgcHJpdmF0ZSBMaXN0IHBsdWdpbkFydGlmYWN0czsKLQotICBwcml2YXRlIGJvb2xlYW4gZmluZFRoZW1lRGVzY3JpcHRvcihGaWxlIGphckZpbGUpIHRocm93cyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uIHsKLSAgICBaaXBJbnB1dFN0cmVhbSB6aXAgPSBudWxsOwotICAgIHRyeSB7Ci0gICAgICB6aXAgPSBuZXcgWmlwSW5wdXRTdHJlYW0obmV3IEZpbGVJbnB1dFN0cmVhbShqYXJGaWxlKSk7Ci0gICAgICB3aGlsZSAoemlwLmF2YWlsYWJsZSgpID4gMCkgewotICAgICAgICBaaXBFbnRyeSBuZXh0RW50cnkgPSB6aXAuZ2V0TmV4dEVudHJ5KCk7Ci0gICAgICAgIGlmIChuZXh0RW50cnkgPT0gbnVsbCB8fCBuZXh0RW50cnkuaXNEaXJlY3RvcnkoKSkgewotICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIFN0cmluZyBuYW1lID0gbmV4dEVudHJ5LmdldE5hbWUoKTsKLSAgICAgICAgaWYgKG5hbWUuZXF1YWxzKCJNRVRBLUlORi90b2JhZ28tdGhlbWUueG1sIikpIHsKLSAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgIHRocm93IG5ldyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uKCJFcnJvciBmaW5kIFRoZW1lRGVzY3JpcHRvciBpbiAiICsgamFyRmlsZSwgZSk7Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgIGlmICh6aXAgIT0gbnVsbCkgewotICAgICAgICB0cnkgewotICAgICAgICAgIHppcC5jbG9zZSgpOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgLy8gaWdub3JlCi0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIE1vam9FeGVjdXRpb25FeGNlcHRpb24gewotCi0gICAgSXRlcmF0b3IgYXJ0aWZhY3RzID0gIGdldFByb2plY3QoKS5nZXREZXBlbmRlbmN5QXJ0aWZhY3RzKCkuaXRlcmF0b3IoKTsKLSAgICB3aGlsZSAoYXJ0aWZhY3RzLmhhc05leHQoKSkgewotICAgICAgaWYgKCF3b3JrRGlyZWN0b3J5LmV4aXN0cygpKSB7Ci0gICAgICAgIHdvcmtEaXJlY3RvcnkubWtkaXJzKCk7Ci0gICAgICB9Ci0gICAgICBBcnRpZmFjdCBhcnRpZmFjdCA9IChBcnRpZmFjdCkgYXJ0aWZhY3RzLm5leHQoKTsKLSAgICAgIGdldExvZygpLmRlYnVnKCJFeHBhbmRpbmcgdGhlbWUgIisgYXJ0aWZhY3QpOwotICAgICAgRmlsZSBmaWxlID0gYXJ0aWZhY3QuZ2V0RmlsZSgpOwotICAgICAgaWYgKEFydGlmYWN0LlNDT1BFX0NPTVBJTEUuZXF1YWxzKGFydGlmYWN0LmdldFNjb3BlKCkpICYmIGZpbGUuaXNGaWxlKCkKLSAgICAgICAgICAmJiAiamFyIi5lcXVhbHMoYXJ0aWZhY3QuZ2V0VHlwZSgpKSAmJiBmaW5kVGhlbWVEZXNjcmlwdG9yKGZpbGUpKSB7Ci0KLSAgICAgICAgU3RyaW5nIG5hbWUgPSBmaWxlLmdldE5hbWUoKTsKLSAgICAgICAgZ2V0TG9nKCkuZGVidWcoIkV4cGFuZGluZyB0aGVtZSAiKyBuYW1lKTsKLSAgICAgICAgRmlsZSB0ZW1wTG9jYXRpb24gPSBuZXcgRmlsZSh3b3JrRGlyZWN0b3J5LCBuYW1lLnN1YnN0cmluZygwLCBuYW1lLmxlbmd0aCgpIC0gNCkpOwotICAgICAgICBib29sZWFuIHByb2Nlc3MgPSBmYWxzZTsKLSAgICAgICAgaWYgKCF0ZW1wTG9jYXRpb24uZXhpc3RzKCkpIHsKLSAgICAgICAgICB0ZW1wTG9jYXRpb24ubWtkaXJzKCk7Ci0gICAgICAgICAgcHJvY2VzcyA9IHRydWU7Ci0gICAgICAgIH0gZWxzZSBpZiAoYXJ0aWZhY3QuZ2V0RmlsZSgpLmxhc3RNb2RpZmllZCgpID4gdGVtcExvY2F0aW9uLmxhc3RNb2RpZmllZCgpKSB7Ci0gICAgICAgICAgcHJvY2VzcyA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHByb2Nlc3MpIHsKLSAgICAgICAgICB0cnkgewotICAgICAgICAgICAgdW5wYWNrKGZpbGUsIHRlbXBMb2NhdGlvbik7Ci0gICAgICAgICAgICBTdHJpbmdbXSBmaWxlTmFtZXMgPSBnZXRUaGVtZUZpbGVzKHRlbXBMb2NhdGlvbik7Ci0gICAgICAgICAgICBmb3IgKFN0cmluZyBmaWxlTmFtZSA6IGZpbGVOYW1lcykgewotCi0gICAgICAgICAgICAgIEZpbGUgZnJvbUZpbGUgPSBuZXcgRmlsZSh0ZW1wTG9jYXRpb24sIGZpbGVOYW1lKTsKLSAgICAgICAgICAgICAgRmlsZSB0b0ZpbGUgPSBuZXcgRmlsZSh3ZWJhcHBEaXJlY3RvcnksIGZpbGVOYW1lKTsKLSAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBGaWxlVXRpbHMuY29weUZpbGUoZnJvbUZpbGUsIHRvRmlsZSk7Ci0gICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbigiRXJyb3IgY29weSBmaWxlOiAiICsgZnJvbUZpbGUgKyAidG86ICIgKyB0b0ZpbGUsIGUpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfSBjYXRjaCAoTm9TdWNoQXJjaGl2ZXJFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZ2V0TG9nKCkuaW5mbygiU2tpcCB1bnBhY2tpbmcgZGVwZW5kZW5jeSBmaWxlIHdpdGggdW5rbm93biBleHRlbnNpb246ICIgKyBmaWxlLmdldFBhdGgoKSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIHVucGFjayhGaWxlIGZpbGUsIEZpbGUgbG9jYXRpb24pCi0gICAgICB0aHJvd3MgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbiwgTm9TdWNoQXJjaGl2ZXJFeGNlcHRpb24gewotICAgIFN0cmluZyBhcmNoaXZlRXh0ID0gRmlsZVV0aWxzLmdldEV4dGVuc2lvbihmaWxlLmdldEFic29sdXRlUGF0aCgpKS50b0xvd2VyQ2FzZShMb2NhbGUuRU5HTElTSCk7Ci0gICAgdHJ5IHsKLSAgICAgIFVuQXJjaGl2ZXIgdW5BcmNoaXZlciA9IGFyY2hpdmVyTWFuYWdlci5nZXRVbkFyY2hpdmVyKGFyY2hpdmVFeHQpOwotICAgICAgdW5BcmNoaXZlci5zZXRTb3VyY2VGaWxlKGZpbGUpOwotICAgICAgdW5BcmNoaXZlci5zZXREZXN0RGlyZWN0b3J5KGxvY2F0aW9uKTsKLSAgICAgIHVuQXJjaGl2ZXIuZXh0cmFjdCgpOwotICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgIHRocm93IG5ldyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uKCJFcnJvciB1bnBhY2tpbmcgZmlsZTogIiArIGZpbGUgKyAidG86ICIgKyBsb2NhdGlvbiwgZSk7Ci0gICAgfSBjYXRjaCAoQXJjaGl2ZXJFeGNlcHRpb24gZSkgewotICAgICAgdGhyb3cgbmV3IE1vam9FeGVjdXRpb25FeGNlcHRpb24oIkVycm9yIHVucGFja2luZyBmaWxlOiAiICsgZmlsZSArICJ0bzogIiArIGxvY2F0aW9uLCBlKTsKLSAgICB9Ci0gIH0KLX0KLQotCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy90b2JhZ28tdGhlbWUtcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9MSUNFTlNFLnR4dCBiL21hdmVuMi1wbHVnaW5zL3RvYmFnby10aGVtZS1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL0xJQ0VOU0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjQ1Njk1Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL3RvYmFnby10aGVtZS1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL0xJQ0VOU0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMjAyICswLDAgQEAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKLSAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8KLQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCi0KLSAgIDEuIERlZmluaXRpb25zLgotCi0gICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLAotICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuCi0KLSAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5Ci0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuCi0KLSAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwKLSAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24KLSAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCi0gICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUKLSAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yCi0gICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKLSAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuCi0KLSAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKLSAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuCi0KLSAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAotICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbgotICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4KLQotICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwKLSAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQKLSAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKLSAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4KLQotICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKLSAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGEKLSAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yawotICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KLQotICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdAotICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQotICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucwotICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMKLSAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgotICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLAotICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4KLQotICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcKLSAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMKLSAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQotICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcgotICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIKLSAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQKLSAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvCi0gICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAotICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUKLSAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dAotICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKLSAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIgotCi0gICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kCi0gICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4KLQotICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsCi0gICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUKLSAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCi0KLSAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKLSAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLAotICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCi0gICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQotICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXIKLSAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKLSAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91Ci0gICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQotICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yawotICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QKLSAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMKLSAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQotICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLgotCi0gICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQotICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0Ci0gICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQotICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0KLSAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yCi0gICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKLQotICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcwotICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAotCi0gICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MKLSAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCi0gICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywKLSAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mCi0gICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAotCi0gICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMKLSAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0Ci0gICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkCi0gICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90Ci0gICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCi0gICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQKLSAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yCi0gICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCi0gICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZAotICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cwotICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKLSAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbgotICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlCi0gICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCi0gICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkCi0gICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLgotCi0gICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQKLSAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMKLSAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKLSAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLAotICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoCi0gICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgotCi0gICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsCi0gICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKLSAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4KLSAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKLSAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkCi0gICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuCi0KLSAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUKLSAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwKLSAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQotICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuCi0KLSAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgotICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaAotICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zCi0gICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBCi0gICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKLSAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQotICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLgotCi0gICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwKLSAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLAotICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKLSAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlCi0gICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsCi0gICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKLSAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUKLSAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwKLSAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCi0gICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yCi0gICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCi0KLSAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcKLSAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsCi0gICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAotICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMKLSAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5Ci0gICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgotICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LAotICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5Ci0gICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCi0gICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4KLQotICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCi0KLSAgIEFQUEVORElYOiBIb3cgdG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yay4KLQotICAgICAgVG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yaywgYXR0YWNoIHRoZSBmb2xsb3dpbmcKLSAgICAgIGJvaWxlcnBsYXRlIG5vdGljZSwgd2l0aCB0aGUgZmllbGRzIGVuY2xvc2VkIGJ5IGJyYWNrZXRzICJbXSIKLSAgICAgIHJlcGxhY2VkIHdpdGggeW91ciBvd24gaWRlbnRpZnlpbmcgaW5mb3JtYXRpb24uIChEb24ndCBpbmNsdWRlCi0gICAgICB0aGUgYnJhY2tldHMhKSAgVGhlIHRleHQgc2hvdWxkIGJlIGVuY2xvc2VkIGluIHRoZSBhcHByb3ByaWF0ZQotICAgICAgY29tbWVudCBzeW50YXggZm9yIHRoZSBmaWxlIGZvcm1hdC4gV2UgYWxzbyByZWNvbW1lbmQgdGhhdCBhCi0gICAgICBmaWxlIG9yIGNsYXNzIG5hbWUgYW5kIGRlc2NyaXB0aW9uIG9mIHB1cnBvc2UgYmUgaW5jbHVkZWQgb24gdGhlCi0gICAgICBzYW1lICJwcmludGVkIHBhZ2UiIGFzIHRoZSBjb3B5cmlnaHQgbm90aWNlIGZvciBlYXNpZXIKLSAgICAgIGlkZW50aWZpY2F0aW9uIHdpdGhpbiB0aGlyZC1wYXJ0eSBhcmNoaXZlcy4KLQotICAgQ29weXJpZ2h0IFt5eXl5XSBbbmFtZSBvZiBjb3B5cmlnaHQgb3duZXJdCi0KLSAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy90b2JhZ28tdGhlbWUtcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9OT1RJQ0UudHh0IGIvbWF2ZW4yLXBsdWdpbnMvdG9iYWdvLXRoZW1lLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvTk9USUNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDg0ODVmOS4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy90b2JhZ28tdGhlbWUtcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9OT1RJQ0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1BcGFjaGUgVG9iYWdvCi1Db3B5cmlnaHQgMjAwNS0yMDEwIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotCi1UaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5Ci1UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLgotCi1CYXNlZCBvbiBzb3VyY2UgY29kZSBvcmlnaW5hbGx5IGRldmVsb3BlZCBieQotQXRhbmlvbiBHbWJIIChodHRwOi8vd3d3LmF0YW5pb24uY29tLykKLUNvcHlyaWdodCAyMDAyLTIwMDUgQXRhbmlvbiBHbWJILgpkaWZmIC0tZ2l0IGEvb3RoZXIvY2hlY2tzdHlsZS1ydWxlcy9MSUNFTlNFIGIvb3RoZXIvY2hlY2tzdHlsZS1ydWxlcy9MSUNFTlNFCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjQ1Njk1Li4wMDAwMDAwCi0tLSBhL290aGVyL2NoZWNrc3R5bGUtcnVsZXMvTElDRU5TRQorKysgL2Rldi9udWxsCkBAIC0xLDIwMiArMCwwIEBACi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0Ci0gICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvCi0KLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTgotCi0gICAxLiBEZWZpbml0aW9ucy4KLQotICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwKLSAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgotCi0gICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgotCi0gICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsCi0gICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCi0gICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLAotICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlCi0gICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgotICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlCi0gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5LgotCi0gICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLgotCi0gICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywKLSAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24KLSAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCi0KLSAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsCi0gICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0Ci0gICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sCi0gICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuCi0KLSAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yCi0gICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhCi0gICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKLSAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuCi0KLSAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKLSAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUKLSAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMKLSAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCi0gICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4KLSAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwKLSAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCi0KLSAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nCi0gICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCi0gICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkKLSAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIKLSAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgotICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiCi0gICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50Ci0gICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bwotICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywKLSAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlCi0gICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKLSAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlCi0gICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiIKLQotICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKLSAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZAotICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCi0KLSAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKLSAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLAotICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCi0gICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLgotCi0gICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKLSAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLAotICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUKLSAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCi0gICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpCi0gICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQotICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKLSAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsKLSAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0Ci0gICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCi0gICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUKLSAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4KLQotICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUKLSAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dAotICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKLSAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotCi0gICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgotICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kCi0KLSAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKLSAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQKLQotICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCi0gICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZAotICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssCi0gICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgotICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQKLQotICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCi0gICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdAotICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZAotICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAotICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQotICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkCi0gICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgotICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLAotICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQKLSAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKLSAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kCi0gICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24KLSAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQotICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZAotICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZAotICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KLQotICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kCi0gICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCi0gICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yCi0gICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwKLSAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAotICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4KLQotICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAotICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrCi0gICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCi0gICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5Ci0gICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZAotICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgotCi0gICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlCi0gICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCi0gICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUKLSAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLgotCi0gICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IKLSAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gKLSAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucwotICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQotICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlCi0gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkKLSAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KLQotICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksCi0gICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKLSAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5Ci0gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQotICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAotICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhCi0gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlCi0gICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCi0gICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbAotICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcgotICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgotCi0gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nCi0gICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAotICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwKLSAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzCi0gICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQotICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYKLSAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwKLSAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQotICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbgotICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuCi0KLSAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUwotCi0gICBBUFBFTkRJWDogSG93IHRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmsuCi0KLSAgICAgIFRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmssIGF0dGFjaCB0aGUgZm9sbG93aW5nCi0gICAgICBib2lsZXJwbGF0ZSBub3RpY2UsIHdpdGggdGhlIGZpZWxkcyBlbmNsb3NlZCBieSBicmFja2V0cyAiW10iCi0gICAgICByZXBsYWNlZCB3aXRoIHlvdXIgb3duIGlkZW50aWZ5aW5nIGluZm9ybWF0aW9uLiAoRG9uJ3QgaW5jbHVkZQotICAgICAgdGhlIGJyYWNrZXRzISkgIFRoZSB0ZXh0IHNob3VsZCBiZSBlbmNsb3NlZCBpbiB0aGUgYXBwcm9wcmlhdGUKLSAgICAgIGNvbW1lbnQgc3ludGF4IGZvciB0aGUgZmlsZSBmb3JtYXQuIFdlIGFsc28gcmVjb21tZW5kIHRoYXQgYQotICAgICAgZmlsZSBvciBjbGFzcyBuYW1lIGFuZCBkZXNjcmlwdGlvbiBvZiBwdXJwb3NlIGJlIGluY2x1ZGVkIG9uIHRoZQotICAgICAgc2FtZSAicHJpbnRlZCBwYWdlIiBhcyB0aGUgY29weXJpZ2h0IG5vdGljZSBmb3IgZWFzaWVyCi0gICAgICBpZGVudGlmaWNhdGlvbiB3aXRoaW4gdGhpcmQtcGFydHkgYXJjaGl2ZXMuCi0KLSAgIENvcHlyaWdodCBbeXl5eV0gW25hbWUgb2YgY29weXJpZ2h0IG93bmVyXQotCi0gICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgpkaWZmIC0tZ2l0IGEvb3RoZXIvY2hlY2tzdHlsZS1ydWxlcy9OT1RJQ0UgYi9vdGhlci9jaGVja3N0eWxlLXJ1bGVzL05PVElDRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzJiNGExZi4uMDAwMDAwMAotLS0gYS9vdGhlci9jaGVja3N0eWxlLXJ1bGVzL05PVElDRQorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotPT0gIE5PVElDRSBmaWxlIGNvcnJlc3BvbmRpbmcgdG8gc2VjdGlvbiA0KGQpIG9mIHRoZSBBcGFjaGUgTGljZW5zZSwgICA9PQotPT0gIFZlcnNpb24gMi4wLCBpbiB0aGlzIGNhc2UgZm9yIHRoZSBBcGFjaGUgTXlGYWNlcyBNYXZlbiBQbHVnaW5zICAgICA9PQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1UaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IAotVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4KZGlmZiAtLWdpdCBhL290aGVyL2NoZWNrc3R5bGUtcnVsZXMvcG9tLnhtbCBiL290aGVyL2NoZWNrc3R5bGUtcnVsZXMvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTM2ZTg4Ni4uMDAwMDAwMAotLS0gYS9vdGhlci9jaGVja3N0eWxlLXJ1bGVzL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLSAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotCi0gIDxwYXJlbnQ+Ci0gICAgPCEtLQotICAgICAgLSBOb3RlIHRoYXQgdGhpcyBwYXJlbnQgZGVjbGFyYXRpb24gaXMgYSBsaXR0bGUgd2VpcmQ7IHRoZSBjaGVja3N0eWxlIHBsdWdpbiBjb25maWd1cmF0aW9uIGluCi0gICAgICAtIHRoZSBwYXJlbnQgcG9tIHJlZmVyZW5jZXMgdGhpcyBhcnRpZmFjdC4gUG9zc2libHkgdGhlIHBhcmVudCBwb20gc2hvdWxkIGJlIHJlZmFjdG9yZWQgaW50bwotICAgICAgLSB0d28gcGFydHM7IHRoZSBiaXRzIHdlIHdhbnQgdG8gaW5oZXJpdCBoZXJlIChkaXN0cmlidXRpb25NYW5hZ2VtZW50LCBtYWlsaW5nTGlzdHMgZXRjKSBhbmQKLSAgICAgIC0gYSBzZXBhcmF0ZSBwb20gdGhhdCByZWZlcmVuY2VzIHRoaXMgYXJ0aWZhY3QuIEhvd2V2ZXIgdGhpcyB3b3JrcyBmb3Igbm93LgotICAgICAgLS0+Ci0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzPC9ncm91cElkPgotICAgIDxhcnRpZmFjdElkPm15ZmFjZXM8L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+OTwvdmVyc2lvbj4KLSAgPC9wYXJlbnQ+Ci0KLSAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHM8L2dyb3VwSWQ+Ci0gIDxhcnRpZmFjdElkPmNoZWNrc3R5bGUtcnVsZXM8L2FydGlmYWN0SWQ+Ci0gIDxwYWNrYWdpbmc+amFyPC9wYWNrYWdpbmc+Ci0gIDx2ZXJzaW9uPjMtU05BUFNIT1Q8L3ZlcnNpb24+Ci0gIDxuYW1lPmNoZWNrc3R5bGUtcnVsZXM8L25hbWU+Ci0gIDx1cmw+aHR0cDovL21hdmVuLmFwYWNoZS5vcmc8L3VybD4KLQotICA8c2NtPgotICAgIDxjb25uZWN0aW9uPnNjbTpzdm46aHR0cDovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9teWZhY2VzL215ZmFjZXMtYnVpbGQtdG9vbHMvdHJ1bmsvb3RoZXIvY2hlY2tzdHlsZS1ydWxlczwvY29ubmVjdGlvbj4KLSAgICA8ZGV2ZWxvcGVyQ29ubmVjdGlvbj5zY206c3ZuOmh0dHBzOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL215ZmFjZXMvbXlmYWNlcy1idWlsZC10b29scy90cnVuay9vdGhlci9jaGVja3N0eWxlLXJ1bGVzPC9kZXZlbG9wZXJDb25uZWN0aW9uPgotICAgIDx1cmw+aHR0cDovL3N2bi5hcGFjaGUub3JnL3ZpZXdjdnMuY2dpL215ZmFjZXMvbXlmYWNlcy1idWlsZC10b29scy90cnVuay9vdGhlci9jaGVja3N0eWxlLXJ1bGVzPC91cmw+Ci0gIDwvc2NtPgotCi0gIDxidWlsZD4KLSAgICA8cmVzb3VyY2VzPgotICAgICAgPHJlc291cmNlPgotICAgICAgICA8ZGlyZWN0b3J5PiR7YmFzZWRpcn08L2RpcmVjdG9yeT4KLSAgICAgICAgPHRhcmdldFBhdGg+TUVUQS1JTkY8L3RhcmdldFBhdGg+Ci0gICAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgICA8aW5jbHVkZT5OT1RJQ0U8L2luY2x1ZGU+Ci0gICAgICAgICAgPGluY2x1ZGU+TElDRU5TRTwvaW5jbHVkZT4KLSAgICAgICAgPC9pbmNsdWRlcz4KLSAgICAgIDwvcmVzb3VyY2U+Ci0gICAgICA8cmVzb3VyY2U+Ci0gICAgICAgIDxkaXJlY3Rvcnk+JHtiYXNlZGlyfS9zcmMvbWFpbi9yZXNvdXJjZXM8L2RpcmVjdG9yeT4KLSAgICAgIDwvcmVzb3VyY2U+Ci0gICAgPC9yZXNvdXJjZXM+Ci0KLSAgICA8cGx1Z2lucz4KLSAgICAgIDxwbHVnaW4+Ci0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KLSAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tcmVsZWFzZS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgIDx2ZXJzaW9uPjIuMTwvdmVyc2lvbj4KLSAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgPHRhZ0Jhc2U+aHR0cHM6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvbXlmYWNlcy9teWZhY2VzLWJ1aWxkLXRvb2xzL3RhZ3M8L3RhZ0Jhc2U+Ci0gICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgIDwvcGx1Z2luPgotICAgIDwvcGx1Z2lucz4KLSAgPC9idWlsZD4KLQotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvb3RoZXIvY2hlY2tzdHlsZS1ydWxlcy9zcmMvbWFpbi9yZXNvdXJjZXMvZGVmYXVsdC9teWZhY2VzLWNoZWNrcy1taW5pbWFsLnhtbCBiL290aGVyL2NoZWNrc3R5bGUtcnVsZXMvc3JjL21haW4vcmVzb3VyY2VzL2RlZmF1bHQvbXlmYWNlcy1jaGVja3MtbWluaW1hbC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4NTllZWMuLjAwMDAwMDAKLS0tIGEvb3RoZXIvY2hlY2tzdHlsZS1ydWxlcy9zcmMvbWFpbi9yZXNvdXJjZXMvZGVmYXVsdC9teWZhY2VzLWNoZWNrcy1taW5pbWFsLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCEtLSAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovIC0tPgotCi08IURPQ1RZUEUgbW9kdWxlIFBVQkxJQwotICAgICItLy9QdXBweSBDcmF3bC8vRFREIENoZWNrIENvbmZpZ3VyYXRpb24gMS4xLy9FTiIKLSAgICAiaHR0cDovL3d3dy5wdXBweWNyYXdsLmNvbS9kdGRzL2NvbmZpZ3VyYXRpb25fMV8xLmR0ZCI+Ci0KLTwhLS0KLSAgQ2hlY2tzdHlsZSBjb25maWd1cmF0aW9uIHRoYXQgY2hlY2tzIHRoZSBtYXZlbiBjb2RpbmcgY29udmVudGlvbnMuCi0gIFRoaXMgY2hlY2tzIHRoZSBhYnNvbHV0ZSBtaW5pbXVtLCBhbmQgc2hvdWxkIG9ubHkgYmUgdXNlZCBmb3IKLSAgcHJvamVjdHMgdGhhdCBoYXZlIHJlYWxseSB1Z2x5IGV4aXN0aW5nIGNvZGUgYW5kIGFyZSBub3Qgd29ydGgKLSAgZml4aW5nIHVwLgotICAtLT4KLQotPG1vZHVsZSBuYW1lPSJDaGVja2VyIj4KLQotICAgIDwhLS0gQ2hlY2tzIGZvciBIZWFkZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0gICAgPCEtLSBTZWUgaHR0cDovL2NoZWNrc3R5bGUuc2YubmV0L2NvbmZpZ19oZWFkZXIuaHRtbCAtLT4KLSAgICA8bW9kdWxlIG5hbWU9IkhlYWRlciI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJoZWFkZXJGaWxlIiB2YWx1ZT0iJHtjaGVja3N0eWxlLmhlYWRlci5maWxlfSIvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0iZmlsZUV4dGVuc2lvbnMiIHZhbHVlPSJqYXZhIi8+Ci0gICAgPC9tb2R1bGU+Ci0KLSAgICA8IS0tIENoZWNrcyBmb3Igd2hpdGVzcGFjZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLSAgICA8IS0tIFNlZSBodHRwOi8vY2hlY2tzdHlsZS5zZi5uZXQvY29uZmlnX3doaXRlc3BhY2UuaHRtbCAtLT4KLSAgICA8bW9kdWxlIG5hbWU9IkZpbGVUYWJDaGFyYWN0ZXIiLz4KLQotICAgIDxtb2R1bGUgbmFtZT0iVHJlZVdhbGtlciI+Ci0KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9ImNhY2hlRmlsZSIgdmFsdWU9IiR7Y2hlY2tzdHlsZS5jYWNoZS5maWxlfSIvPgotCi0gICAgICAgIDxtb2R1bGUgbmFtZT0iVHlwZU5hbWUiPgotICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJmb3JtYXQiIHZhbHVlPSJeXz9bQS1aXVthLXpBLVowLTldKiQiLz4KLSAgICAgICAgPC9tb2R1bGU+Ci0KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJVcHBlckVsbCIvPgotCi0gICAgPC9tb2R1bGU+Ci0KLTwvbW9kdWxlPgpkaWZmIC0tZ2l0IGEvb3RoZXIvY2hlY2tzdHlsZS1ydWxlcy9zcmMvbWFpbi9yZXNvdXJjZXMvZGVmYXVsdC9teWZhY2VzLWNoZWNrcy1zdGFuZGFyZC54bWwgYi9vdGhlci9jaGVja3N0eWxlLXJ1bGVzL3NyYy9tYWluL3Jlc291cmNlcy9kZWZhdWx0L215ZmFjZXMtY2hlY2tzLXN0YW5kYXJkLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzJjMmFlMC4uMDAwMDAwMAotLS0gYS9vdGhlci9jaGVja3N0eWxlLXJ1bGVzL3NyYy9tYWluL3Jlc291cmNlcy9kZWZhdWx0L215ZmFjZXMtY2hlY2tzLXN0YW5kYXJkLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE3OSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhLS0gCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLyAtLT4KLQotPCFET0NUWVBFIG1vZHVsZSBQVUJMSUMKLSAgICAiLS8vUHVwcHkgQ3Jhd2wvL0RURCBDaGVjayBDb25maWd1cmF0aW9uIDEuMS8vRU4iCi0gICAgImh0dHA6Ly93d3cucHVwcHljcmF3bC5jb20vZHRkcy9jb25maWd1cmF0aW9uXzFfMS5kdGQiPgotCi08IS0tCi0gIENoZWNrc3R5bGUgY29uZmlndXJhdGlvbiB0aGF0IGNoZWNrcyB0aGUgbWF2ZW4gY29kaW5nIGNvbnZlbnRpb25zLgotLS0+Ci0KLTxtb2R1bGUgbmFtZT0iQ2hlY2tlciI+Ci0KLSAgICA8IS0tIENoZWNrcyB0aGF0IGEgcGFja2FnZS5odG1sIGZpbGUgZXhpc3RzIGZvciBlYWNoIHBhY2thZ2UuICAgICAtLT4KLSAgICA8IS0tIFNlZSBodHRwOi8vY2hlY2tzdHlsZS5zZi5uZXQvY29uZmlnX2phdmFkb2MuaHRtbCNQYWNrYWdlSHRtbCAtLT4KLSAgICA8IS0tIG1vZHVsZSBuYW1lPSJQYWNrYWdlSHRtbCIvIC0tPgotCi0gICAgPCEtLSBDaGVja3Mgd2hldGhlciBmaWxlcyBlbmQgd2l0aCBhIG5ldyBsaW5lLiAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotICAgIDwhLS0gU2VlIGh0dHA6Ly9jaGVja3N0eWxlLnNmLm5ldC9jb25maWdfbWlzYy5odG1sI05ld2xpbmVBdEVuZE9mRmlsZSAtLT4KLSAgICA8IS0tIG1vZHVsZSBuYW1lPSJOZXdsaW5lQXRFbmRPZkZpbGUiLyAtLT4KLQotICAgIDwhLS0gQ2hlY2tzIHRoYXQgcHJvcGVydHkgZmlsZXMgY29udGFpbiB0aGUgc2FtZSBrZXlzLiAgICAgICAgIC0tPgotICAgIDwhLS0gU2VlIGh0dHA6Ly9jaGVja3N0eWxlLnNmLm5ldC9jb25maWdfbWlzYy5odG1sI1RyYW5zbGF0aW9uIC0tPgotICAgIDwhLS0gbW9kdWxlIG5hbWU9IlRyYW5zbGF0aW9uIi8gLS0+Ci0KLQotICAgIDwhLS0gQ2hlY2tzIGZvciBIZWFkZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0gICAgPCEtLSBTZWUgaHR0cDovL2NoZWNrc3R5bGUuc2YubmV0L2NvbmZpZ19oZWFkZXIuaHRtbCAtLT4KLSAgICA8bW9kdWxlIG5hbWU9IkhlYWRlciI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJoZWFkZXJGaWxlIiB2YWx1ZT0iJHtjaGVja3N0eWxlLmhlYWRlci5maWxlfSIvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0iZmlsZUV4dGVuc2lvbnMiIHZhbHVlPSJqYXZhIi8+Ci0gICAgPC9tb2R1bGU+Ci0KLQotICAgIDwhLS0gQ2hlY2tzIGZvciB3aGl0ZXNwYWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotICAgIDwhLS0gU2VlIGh0dHA6Ly9jaGVja3N0eWxlLnNmLm5ldC9jb25maWdfd2hpdGVzcGFjZS5odG1sIC0tPgotICAgIDxtb2R1bGUgbmFtZT0iRmlsZVRhYkNoYXJhY3RlciIvPgotICAgICAgICAKLSAgICA8IS0tIENoZWNrcyBmb3IgU2l6ZSBWaW9sYXRpb25zLiAgICAgICAgICAgICAgICAgICAgLS0+Ci0gICAgPCEtLSBTZWUgaHR0cDovL2NoZWNrc3R5bGUuc2YubmV0L2NvbmZpZ19zaXplcy5odG1sIC0tPgotICAgIDxtb2R1bGUgbmFtZT0iRmlsZUxlbmd0aCI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJmaWxlRXh0ZW5zaW9ucyIgdmFsdWU9ImphdmEiLz4KLSAgICA8L21vZHVsZT4KLSAgICA8bW9kdWxlIG5hbWU9IkxpbmVMZW5ndGgiPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0ibWF4IiB2YWx1ZT0iMTIwIiAvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0iaWdub3JlUGF0dGVybiIgdmFsdWU9IkB2ZXJzaW9ufEBzZWUiLz4KLSAgICA8L21vZHVsZT4KLSAgICAgICAgCi0gICAgICAgIAotICAgIDxtb2R1bGUgbmFtZT0iVHJlZVdhbGtlciI+Ci0KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9ImNhY2hlRmlsZSIgdmFsdWU9IiR7Y2hlY2tzdHlsZS5jYWNoZS5maWxlfSIvPgotCi0gICAgICAgIDwhLS0gQ2hlY2tzIGZvciBKYXZhZG9jIGNvbW1lbnRzLiAgICAgICAgICAgICAgICAgICAgIC0tPgotICAgICAgICA8IS0tIFNlZSBodHRwOi8vY2hlY2tzdHlsZS5zZi5uZXQvY29uZmlnX2phdmFkb2MuaHRtbCAtLT4KLSAgICAgICAgPCEtLSBtb2R1bGUgbmFtZT0iSmF2YWRvY01ldGhvZCIvIC0tPgotICAgICAgICA8IS0tIG1vZHVsZSBuYW1lPSJKYXZhZG9jVHlwZSIvIC0tPgotICAgICAgICA8IS0tIG1vZHVsZSBuYW1lPSJKYXZhZG9jVmFyaWFibGUiLyAtLT4KLQotCi0gICAgICAgIDwhLS0gQ2hlY2tzIGZvciBOYW1pbmcgQ29udmVudGlvbnMuICAgICAgICAgICAgICAgICAgLS0+Ci0gICAgICAgIDwhLS0gU2VlIGh0dHA6Ly9jaGVja3N0eWxlLnNmLm5ldC9jb25maWdfbmFtaW5nLmh0bWwgLS0+Ci08IS0tCi0gICAgICAgIDxtb2R1bGUgbmFtZT0iTWVtYmVyTmFtZSI+Ci0gICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImZvcm1hdCIgdmFsdWU9Il5fW2Etel1bYS16QS1aMC05XSokIi8+Ci0gICAgICAgIDwvbW9kdWxlPgotLS0+Ci0KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJDb25zdGFudE5hbWUiPgotICAgICAgICAgIDwhLS0gTm9ybWFsIHJ1bGVzLCBleGNlcHQgdGhhdDoKLSAgICAgICAgICAgICAtICAqIGFueSBuYW1lIGNhbiBzdGFydCB3aXRoIGFuIHVuZGVyc2NvcmUuCi0gICAgICAgICAgICAgLSAgKiAibG9nIiBpcyBhbGxvd2VkOyB0aGlzIGlzIGEgdHJhZGl0aW9uYWwgbmFtZSBmb3IgbG9nIG9iamVjdHMKLSAgICAgICAgICAgICAtICAqIG5hbWVzIGVuZGluZyB3aXRoICJUaHJlYWRMb2NhbCIgYXJlIGFsbG93ZWQgc28gdGhhdCB0aHJlYWRsb2NhbCB2YXJzIGRvbid0IGhhdmUgdG8gYmUKLSAgICAgICAgICAgICAtICAgIGFsbC1jYXBzLiBUaGV5IGFyZSBzdGF0aWMgZmluYWwsIGJ1dCBhcmUgbm90IHJlYWxseSBjb25zdGFudHMuIFllcywgdHlwZSBwcmVmaXhlcwotICAgICAgICAgICAgIC0gICAgb24gdmFyaWFibGUgbmFtZXMgc3Vja3MgKCJodW5nYXJpYW4gbm90YXRpb24iKSBidXQgY2hlY2tzdHlsZSBkb2Vzbid0IGFsbG93IAotICAgICAgICAgICAgIC0gICAgbmFtZSBydWxlcyB0byB2YXJ5IGJ5IHRoZSB0eXBlIG9mIHRoZSBjb25zdGFudCwgYW5kIG5vIG90aGVyIGFsdGVybmF0aXZlIHNlZW1zCi0gICAgICAgICAgICAgLSAgICBhbnkgYmV0dGVyLgotICAgICAgICAgICAgIC0tPgotICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJmb3JtYXQiIAotICAgICAgICAgICAgIHZhbHVlPSJeXz8oKGxvZyl8KFthLXpdW2EtekEtWl0qVGhyZWFkTG9jYWwpfChbQS1aXVtBLVowLTldKihfW0EtWjAtOV0rKSopKSQiLz4KLSAgICAgICAgPC9tb2R1bGU+Ci0KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJMb2NhbFZhcmlhYmxlTmFtZSIvPgotICAgICAgICA8bW9kdWxlIG5hbWU9Ik1ldGhvZE5hbWUiPgotICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJmb3JtYXQiIHZhbHVlPSJeXz9bYS16XVthLXpBLVowLTldKiQiLz4KLSAgICAgICAgPC9tb2R1bGU+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iUGFja2FnZU5hbWUiLz4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJMb2NhbEZpbmFsVmFyaWFibGVOYW1lIi8+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iUGFyYW1ldGVyTmFtZSIvPgotICAgICAgICA8bW9kdWxlIG5hbWU9IlN0YXRpY1ZhcmlhYmxlTmFtZSIvPgotICAgICAgICA8bW9kdWxlIG5hbWU9IlR5cGVOYW1lIj4KLSAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iZm9ybWF0IiB2YWx1ZT0iXl8/W0EtWl1bYS16QS1aMC05XSokIi8+Ci0gICAgICAgIDwvbW9kdWxlPgotCi0gICAgICAgIDwhLS0gQ2hlY2tzIGZvciBpbXBvcnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0gICAgICAgIDwhLS0gU2VlIGh0dHA6Ly9jaGVja3N0eWxlLnNmLm5ldC9jb25maWdfaW1wb3J0Lmh0bWwgLS0+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iQXZvaWRTdGFySW1wb3J0Ii8+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iSWxsZWdhbEltcG9ydCIvPgotICAgICAgICA8bW9kdWxlIG5hbWU9IlJlZHVuZGFudEltcG9ydCIvPgotICAgICAgICA8bW9kdWxlIG5hbWU9IlVudXNlZEltcG9ydHMiLz4KLQotCi0gICAgICAgIDxtb2R1bGUgbmFtZT0iTWV0aG9kTGVuZ3RoIj4KLSAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ibWF4IiB2YWx1ZT0iMjAwIiAvPgotICAgICAgICA8L21vZHVsZT4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJQYXJhbWV0ZXJOdW1iZXIiPgotICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJtYXgiIHZhbHVlPSIxMCIgLz4KLSAgICAgICAgPC9tb2R1bGU+Ci0KLQotICAgICAgICA8IS0tIE1vZGlmaWVyIENoZWNrcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotICAgICAgICA8IS0tIFNlZSBodHRwOi8vY2hlY2tzdHlsZS5zZi5uZXQvY29uZmlnX21vZGlmaWVycy5odG1sIC0tPgotICAgICAgICA8IS0tIG1vZHVsZSBuYW1lPSJNb2RpZmllck9yZGVyIi8gLS0+Ci0gICAgICAgIDwhLS0gbW9kdWxlIG5hbWU9IlJlZHVuZGFudE1vZGlmaWVyIi8gLS0+Ci0KLSAgICAgICAgPCEtLSBDaGVja3MgZm9yIGJsb2Nrcy4gWW91IGtub3csIHRob3NlIHt9J3MgICAgICAgICAtLT4KLSAgICAgICAgPCEtLSBTZWUgaHR0cDovL2NoZWNrc3R5bGUuc2YubmV0L2NvbmZpZ19ibG9ja3MuaHRtbCAtLT4KLSAgICAgICAgPCEtLSBtb2R1bGUgbmFtZT0iRW1wdHlCbG9jayIvIC0tPgotICAgICAgICA8bW9kdWxlIG5hbWU9Ik5lZWRCcmFjZXMiLz4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJMZWZ0Q3VybHkiPgotICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJvcHRpb24iIHZhbHVlPSJubCIvPgotICAgICAgICA8L21vZHVsZT4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJSaWdodEN1cmx5Ij4KLSAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ib3B0aW9uIiB2YWx1ZT0iYWxvbmUiLz4KLSAgICAgICAgPC9tb2R1bGU+Ci0KLSAgICAgICAgPCEtLSBDaGVja3MgZm9yIGNvbW1vbiBjb2RpbmcgcHJvYmxlbXMgICAgICAgICAgICAgICAtLT4KLSAgICAgICAgPCEtLSBTZWUgaHR0cDovL2NoZWNrc3R5bGUuc2YubmV0L2NvbmZpZ19jb2RpbmcuaHRtbCAtLT4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJEb3VibGVDaGVja2VkTG9ja2luZyIvPgotICAgICAgICA8bW9kdWxlIG5hbWU9IkVtcHR5U3RhdGVtZW50Ii8+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iRXF1YWxzSGFzaENvZGUiLz4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJJbm5lckFzc2lnbm1lbnQiLz4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJEZWZhdWx0Q29tZXNMYXN0Ii8+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iTWlzc2luZ1N3aXRjaERlZmF1bHQiLz4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJGYWxsVGhyb3VnaCIvPgotICAgICAgICA8bW9kdWxlIG5hbWU9Ik11bHRpcGxlVmFyaWFibGVEZWNsYXJhdGlvbnMiLz4KLQotICAgICAgICA8IS0tIENoZWNrcyBmb3IgY2xhc3MgZGVzaWduICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotICAgICAgICA8IS0tIFNlZSBodHRwOi8vY2hlY2tzdHlsZS5zZi5uZXQvY29uZmlnX2Rlc2lnbi5odG1sIC0tPgotICAgICAgICA8IS0tIG1vZHVsZSBuYW1lPSJEZXNpZ25Gb3JFeHRlbnNpb24iLyAtLT4KLSAgICAgICAgPCEtLSBtb2R1bGUgbmFtZT0iRmluYWxDbGFzcyIvIC0tPgotICAgICAgICA8IS0tIG1vZHVsZSBuYW1lPSJIaWRlVXRpbGl0eUNsYXNzQ29uc3RydWN0b3IiLyAtLT4KLSAgICAgICAgPCEtLSBtb2R1bGUgbmFtZT0iSW50ZXJmYWNlSXNUeXBlIi8gLS0+Ci0gICAgICAgIDwhLS0gbW9kdWxlIG5hbWU9IlZpc2liaWxpdHlNb2RpZmllciIvIC0tPgotCi0KLSAgICAgICAgPCEtLSBNaXNjZWxsYW5lb3VzIG90aGVyIGNoZWNrcy4gICAgICAgICAgICAgICAgICAgLS0+Ci0gICAgICAgIDwhLS0gU2VlIGh0dHA6Ly9jaGVja3N0eWxlLnNmLm5ldC9jb25maWdfbWlzYy5odG1sIC0tPgotICAgICAgICA8IS0tIG1vZHVsZSBuYW1lPSJBcnJheVR5cGVTdHlsZSIvIC0tPgotICAgICAgICA8IS0tIG1vZHVsZSBuYW1lPSJGaW5hbFBhcmFtZXRlcnMiLyAtLT4KLSAgICAgICAgPCEtLSBMaW5lIHdpdGggVHJhaWxpbmcgU3BhY2VzIChkaXNhYmxlZCBhcyBpdCdzIHRvIG5vaXN5KQotICAgICAgICA8bW9kdWxlIG5hbWU9IkdlbmVyaWNJbGxlZ2FsUmVnZXhwIj4KLSAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJmb3JtYXQiIHZhbHVlPSJccyskIi8+Ci0gICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ibWVzc2FnZSIgdmFsdWU9IkxpbmUgaGFzIHRyYWlsaW5nIHNwYWNlcy4iLz4KLSAgICAgICAgPC9tb2R1bGU+Ci0gICAgICAgICAgLS0+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iVXBwZXJFbGwiLz4KLQotICAgIDwvbW9kdWxlPgotCi08L21vZHVsZT4KZGlmZiAtLWdpdCBhL290aGVyL2NoZWNrc3R5bGUtcnVsZXMvc3JjL21haW4vcmVzb3VyY2VzL2RlZmF1bHQvbXlmYWNlcy1jaGVja3Mtc3RyaWN0LnhtbCBiL290aGVyL2NoZWNrc3R5bGUtcnVsZXMvc3JjL21haW4vcmVzb3VyY2VzL2RlZmF1bHQvbXlmYWNlcy1jaGVja3Mtc3RyaWN0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGRlNmE1ZS4uMDAwMDAwMAotLS0gYS9vdGhlci9jaGVja3N0eWxlLXJ1bGVzL3NyYy9tYWluL3Jlc291cmNlcy9kZWZhdWx0L215ZmFjZXMtY2hlY2tzLXN0cmljdC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNzQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tIAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8gLS0+Ci0KLTwhRE9DVFlQRSBtb2R1bGUgUFVCTElDCi0gICAgIi0vL1B1cHB5IENyYXdsLy9EVEQgQ2hlY2sgQ29uZmlndXJhdGlvbiAxLjEvL0VOIgotICAgICJodHRwOi8vd3d3LnB1cHB5Y3Jhd2wuY29tL2R0ZHMvY29uZmlndXJhdGlvbl8xXzEuZHRkIj4KLQotPCEtLQotICBDaGVja3N0eWxlIGNvbmZpZ3VyYXRpb24gdGhhdCBjaGVja3MgdGhlIG1hdmVuIGNvZGluZyBjb252ZW50aW9ucy4KLSAgVGhpcyBlbmZvcmNlcyBzdHJpY3RlciBxdWFsaXR5IGNoZWNrcyB0aGFuIHRoZSAibXlmYWNlcy1jaGVja3MueG1sIgotICBmaWxlIGRvZXMuIElkZWFsbHkgdGhpcyB3b3VsZCBiZSB1c2VkIGV2ZXJ5d2hlcmUsIGJ1dC4uLgotLS0+Ci0KLTxtb2R1bGUgbmFtZT0iQ2hlY2tlciI+Ci0KLSAgICA8IS0tIENoZWNrcyB0aGF0IGEgcGFja2FnZS5odG1sIGZpbGUgZXhpc3RzIGZvciBlYWNoIHBhY2thZ2UuICAgICAtLT4KLSAgICA8IS0tIFNlZSBodHRwOi8vY2hlY2tzdHlsZS5zZi5uZXQvY29uZmlnX2phdmFkb2MuaHRtbCNQYWNrYWdlSHRtbCAtLT4KLSAgICA8IS0tIG1vZHVsZSBuYW1lPSJQYWNrYWdlSHRtbCIvIC0tPgotCi0gICAgPCEtLSBDaGVja3Mgd2hldGhlciBmaWxlcyBlbmQgd2l0aCBhIG5ldyBsaW5lLiAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotICAgIDwhLS0gU2VlIGh0dHA6Ly9jaGVja3N0eWxlLnNmLm5ldC9jb25maWdfbWlzYy5odG1sI05ld2xpbmVBdEVuZE9mRmlsZSAtLT4KLSAgICA8IS0tIG1vZHVsZSBuYW1lPSJOZXdsaW5lQXRFbmRPZkZpbGUiLyAtLT4KLQotICAgIDwhLS0gQ2hlY2tzIHRoYXQgcHJvcGVydHkgZmlsZXMgY29udGFpbiB0aGUgc2FtZSBrZXlzLiAgICAgICAgIC0tPgotICAgIDwhLS0gU2VlIGh0dHA6Ly9jaGVja3N0eWxlLnNmLm5ldC9jb25maWdfbWlzYy5odG1sI1RyYW5zbGF0aW9uIC0tPgotICAgIDwhLS0gbW9kdWxlIG5hbWU9IlRyYW5zbGF0aW9uIi8gLS0+Ci0KLSAgICA8bW9kdWxlIG5hbWU9IlRyZWVXYWxrZXIiPgotCi0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJjYWNoZUZpbGUiIHZhbHVlPSIke2NoZWNrc3R5bGUuY2FjaGUuZmlsZX0iLz4KLQotICAgICAgICA8IS0tIENoZWNrcyBmb3IgSmF2YWRvYyBjb21tZW50cy4gICAgICAgICAgICAgICAgICAgICAtLT4KLSAgICAgICAgPCEtLSBTZWUgaHR0cDovL2NoZWNrc3R5bGUuc2YubmV0L2NvbmZpZ19qYXZhZG9jLmh0bWwgLS0+Ci0gICAgICAgIDwhLS0gbW9kdWxlIG5hbWU9IkphdmFkb2NNZXRob2QiLyAtLT4KLSAgICAgICAgPCEtLSBtb2R1bGUgbmFtZT0iSmF2YWRvY1R5cGUiLyAtLT4KLSAgICAgICAgPCEtLSBtb2R1bGUgbmFtZT0iSmF2YWRvY1ZhcmlhYmxlIi8gLS0+Ci0KLQotICAgICAgICA8IS0tIENoZWNrcyBmb3IgTmFtaW5nIENvbnZlbnRpb25zLiAgICAgICAgICAgICAgICAgIC0tPgotICAgICAgICA8IS0tIFNlZSBodHRwOi8vY2hlY2tzdHlsZS5zZi5uZXQvY29uZmlnX25hbWluZy5odG1sIC0tPgotICAgICAgICA8bW9kdWxlIG5hbWU9Ik1lbWJlck5hbWUiPgotICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJmb3JtYXQiIHZhbHVlPSJeX1thLXpdW2EtekEtWjAtOV0qJCIvPgotICAgICAgICA8L21vZHVsZT4KLQotICAgICAgICA8bW9kdWxlIG5hbWU9IkNvbnN0YW50TmFtZSI+Ci0gICAgICAgICAgPCEtLSBOb3JtYWwgcnVsZXMsIGV4Y2VwdCB0aGF0OgotICAgICAgICAgICAgIC0gICogYW55IG5hbWUgY2FuIHN0YXJ0IHdpdGggYW4gdW5kZXJzY29yZS4KLSAgICAgICAgICAgICAtICAqICJsb2ciIGlzIGFsbG93ZWQ7IHRoaXMgaXMgYSB0cmFkaXRpb25hbCBuYW1lIGZvciBsb2cgb2JqZWN0cwotICAgICAgICAgICAgIC0gICogbmFtZXMgZW5kaW5nIHdpdGggIlRocmVhZExvY2FsIiBhcmUgYWxsb3dlZCBzbyB0aGF0IHRocmVhZGxvY2FsIHZhcnMgZG9uJ3QgaGF2ZSB0byBiZQotICAgICAgICAgICAgIC0gICAgYWxsLWNhcHMuIFRoZXkgYXJlIHN0YXRpYyBmaW5hbCwgYnV0IGFyZSBub3QgcmVhbGx5IGNvbnN0YW50cy4gWWVzLCB0eXBlIHByZWZpeGVzCi0gICAgICAgICAgICAgLSAgICBvbiB2YXJpYWJsZSBuYW1lcyBzdWNrcyAoImh1bmdhcmlhbiBub3RhdGlvbiIpIGJ1dCBjaGVja3N0eWxlIGRvZXNuJ3QgYWxsb3cgCi0gICAgICAgICAgICAgLSAgICBuYW1lIHJ1bGVzIHRvIHZhcnkgYnkgdGhlIHR5cGUgb2YgdGhlIGNvbnN0YW50LCBhbmQgbm8gb3RoZXIgYWx0ZXJuYXRpdmUgc2VlbXMKLSAgICAgICAgICAgICAtICAgIGFueSBiZXR0ZXIuCi0gICAgICAgICAgICAgLS0+Ci0gICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImZvcm1hdCIgCi0gICAgICAgICAgICAgdmFsdWU9Il5fPygobG9nKXwoW2Etel1bYS16QS1aXSpUaHJlYWRMb2NhbCl8KFtBLVpdW0EtWjAtOV0qKF9bQS1aMC05XSspKikpJCIvPgotICAgICAgICA8L21vZHVsZT4KLQotICAgICAgICA8bW9kdWxlIG5hbWU9IkxvY2FsVmFyaWFibGVOYW1lIi8+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iTWV0aG9kTmFtZSI+Ci0gICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImZvcm1hdCIgdmFsdWU9Il5fP1thLXpdW2EtekEtWjAtOV0qJCIvPgotICAgICAgICA8L21vZHVsZT4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJQYWNrYWdlTmFtZSIvPgotICAgICAgICA8bW9kdWxlIG5hbWU9IkxvY2FsRmluYWxWYXJpYWJsZU5hbWUiLz4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJQYXJhbWV0ZXJOYW1lIi8+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iU3RhdGljVmFyaWFibGVOYW1lIi8+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iVHlwZU5hbWUiPgotICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJmb3JtYXQiIHZhbHVlPSJeXz9bQS1aXVthLXpBLVowLTldKiQiLz4KLSAgICAgICAgPC9tb2R1bGU+Ci0KLQotICAgICAgICA8IS0tIENoZWNrcyBmb3IgSGVhZGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotICAgICAgICA8IS0tIFNlZSBodHRwOi8vY2hlY2tzdHlsZS5zZi5uZXQvY29uZmlnX2hlYWRlci5odG1sIC0tPgotICAgICAgICA8bW9kdWxlIG5hbWU9IkhlYWRlciI+Ci0gICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iaGVhZGVyRmlsZSIgdmFsdWU9IiR7Y2hlY2tzdHlsZS5oZWFkZXIuZmlsZX0iLz4KLSAgICAgICAgPC9tb2R1bGU+Ci0KLQotICAgICAgICA8IS0tIENoZWNrcyBmb3IgaW1wb3J0cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotICAgICAgICA8IS0tIFNlZSBodHRwOi8vY2hlY2tzdHlsZS5zZi5uZXQvY29uZmlnX2ltcG9ydC5odG1sIC0tPgotICAgICAgICA8bW9kdWxlIG5hbWU9IkF2b2lkU3RhckltcG9ydCIvPgotICAgICAgICA8bW9kdWxlIG5hbWU9IklsbGVnYWxJbXBvcnQiLz4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJSZWR1bmRhbnRJbXBvcnQiLz4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJVbnVzZWRJbXBvcnRzIi8+Ci0KLQotICAgICAgICA8IS0tIENoZWNrcyBmb3IgU2l6ZSBWaW9sYXRpb25zLiAgICAgICAgICAgICAgICAgICAgLS0+Ci0gICAgICAgIDwhLS0gU2VlIGh0dHA6Ly9jaGVja3N0eWxlLnNmLm5ldC9jb25maWdfc2l6ZXMuaHRtbCAtLT4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJGaWxlTGVuZ3RoIi8+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iTGluZUxlbmd0aCI+Ci0gICAgICAgICAgPHByb3BlcnR5IG5hbWU9Im1heCIgdmFsdWU9IjEyMCIgLz4KLSAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iaWdub3JlUGF0dGVybiIgdmFsdWU9IkB2ZXJzaW9ufEBzZWUiLz4KLSAgICAgICAgPC9tb2R1bGU+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iTWV0aG9kTGVuZ3RoIj4KLSAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ibWF4IiB2YWx1ZT0iMjAwIiAvPgotICAgICAgICA8L21vZHVsZT4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJQYXJhbWV0ZXJOdW1iZXIiPgotICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJtYXgiIHZhbHVlPSIxMCIgLz4KLSAgICAgICAgPC9tb2R1bGU+Ci0KLQotICAgICAgICA8IS0tIENoZWNrcyBmb3Igd2hpdGVzcGFjZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLSAgICAgICAgPCEtLSBTZWUgaHR0cDovL2NoZWNrc3R5bGUuc2YubmV0L2NvbmZpZ193aGl0ZXNwYWNlLmh0bWwgLS0+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iVGFiQ2hhcmFjdGVyIi8+Ci0KLSAgICAgICAgPCEtLSBNb2RpZmllciBDaGVja3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLSAgICAgICAgPCEtLSBTZWUgaHR0cDovL2NoZWNrc3R5bGUuc2YubmV0L2NvbmZpZ19tb2RpZmllcnMuaHRtbCAtLT4KLSAgICAgICAgPCEtLSBtb2R1bGUgbmFtZT0iTW9kaWZpZXJPcmRlciIvIC0tPgotICAgICAgICA8IS0tIG1vZHVsZSBuYW1lPSJSZWR1bmRhbnRNb2RpZmllciIvIC0tPgotCi0gICAgICAgIDwhLS0gQ2hlY2tzIGZvciBibG9ja3MuIFlvdSBrbm93LCB0aG9zZSB7fSdzICAgICAgICAgLS0+Ci0gICAgICAgIDwhLS0gU2VlIGh0dHA6Ly9jaGVja3N0eWxlLnNmLm5ldC9jb25maWdfYmxvY2tzLmh0bWwgLS0+Ci0gICAgICAgIDwhLS0gbW9kdWxlIG5hbWU9IkVtcHR5QmxvY2siLyAtLT4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJOZWVkQnJhY2VzIi8+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iTGVmdEN1cmx5Ij4KLSAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ib3B0aW9uIiB2YWx1ZT0ibmwiLz4KLSAgICAgICAgPC9tb2R1bGU+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iUmlnaHRDdXJseSI+Ci0gICAgICAgICAgPHByb3BlcnR5IG5hbWU9Im9wdGlvbiIgdmFsdWU9ImFsb25lIi8+Ci0gICAgICAgIDwvbW9kdWxlPgotCi0gICAgICAgIDwhLS0gQ2hlY2tzIGZvciBjb21tb24gY29kaW5nIHByb2JsZW1zICAgICAgICAgICAgICAgLS0+Ci0gICAgICAgIDwhLS0gU2VlIGh0dHA6Ly9jaGVja3N0eWxlLnNmLm5ldC9jb25maWdfY29kaW5nLmh0bWwgLS0+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iRG91YmxlQ2hlY2tlZExvY2tpbmciLz4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJFbXB0eVN0YXRlbWVudCIvPgotICAgICAgICA8bW9kdWxlIG5hbWU9IkVxdWFsc0hhc2hDb2RlIi8+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iSW5uZXJBc3NpZ25tZW50Ii8+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iRGVmYXVsdENvbWVzTGFzdCIvPgotICAgICAgICA8bW9kdWxlIG5hbWU9Ik1pc3NpbmdTd2l0Y2hEZWZhdWx0Ii8+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iRmFsbFRocm91Z2giLz4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJNdWx0aXBsZVZhcmlhYmxlRGVjbGFyYXRpb25zIi8+Ci0KLSAgICAgICAgPCEtLSBDaGVja3MgZm9yIGNsYXNzIGRlc2lnbiAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLSAgICAgICAgPCEtLSBTZWUgaHR0cDovL2NoZWNrc3R5bGUuc2YubmV0L2NvbmZpZ19kZXNpZ24uaHRtbCAtLT4KLSAgICAgICAgPCEtLSBtb2R1bGUgbmFtZT0iRGVzaWduRm9yRXh0ZW5zaW9uIi8gLS0+Ci0gICAgICAgIDwhLS0gbW9kdWxlIG5hbWU9IkZpbmFsQ2xhc3MiLyAtLT4KLSAgICAgICAgPCEtLSBtb2R1bGUgbmFtZT0iSGlkZVV0aWxpdHlDbGFzc0NvbnN0cnVjdG9yIi8gLS0+Ci0gICAgICAgIDwhLS0gbW9kdWxlIG5hbWU9IkludGVyZmFjZUlzVHlwZSIvIC0tPgotICAgICAgICA8IS0tIG1vZHVsZSBuYW1lPSJWaXNpYmlsaXR5TW9kaWZpZXIiLyAtLT4KLQotCi0gICAgICAgIDwhLS0gTWlzY2VsbGFuZW91cyBvdGhlciBjaGVja3MuICAgICAgICAgICAgICAgICAgIC0tPgotICAgICAgICA8IS0tIFNlZSBodHRwOi8vY2hlY2tzdHlsZS5zZi5uZXQvY29uZmlnX21pc2MuaHRtbCAtLT4KLSAgICAgICAgPCEtLSBtb2R1bGUgbmFtZT0iQXJyYXlUeXBlU3R5bGUiLyAtLT4KLSAgICAgICAgPCEtLSBtb2R1bGUgbmFtZT0iRmluYWxQYXJhbWV0ZXJzIi8gLS0+Ci0gICAgICAgIDwhLS0gTGluZSB3aXRoIFRyYWlsaW5nIFNwYWNlcyAoZGlzYWJsZWQgYXMgaXQncyB0byBub2lzeSkKLSAgICAgICAgPG1vZHVsZSBuYW1lPSJHZW5lcmljSWxsZWdhbFJlZ2V4cCI+Ci0gICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iZm9ybWF0IiB2YWx1ZT0iXHMrJCIvPgotICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9Im1lc3NhZ2UiIHZhbHVlPSJMaW5lIGhhcyB0cmFpbGluZyBzcGFjZXMuIi8+Ci0gICAgICAgIDwvbW9kdWxlPgotICAgICAgICAgIC0tPgotICAgICAgICA8bW9kdWxlIG5hbWU9IlVwcGVyRWxsIi8+Ci0KLSAgICA8L21vZHVsZT4KLQotPC9tb2R1bGU+CmRpZmYgLS1naXQgYS9vdGhlci9jaGVja3N0eWxlLXJ1bGVzL3NyYy9tYWluL3Jlc291cmNlcy9kZWZhdWx0L215ZmFjZXMtY29kZXN0eWxlLWVjbGlwc2UudHh0IGIvb3RoZXIvY2hlY2tzdHlsZS1ydWxlcy9zcmMvbWFpbi9yZXNvdXJjZXMvZGVmYXVsdC9teWZhY2VzLWNvZGVzdHlsZS1lY2xpcHNlLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGMxYTI0OC4uMDAwMDAwMAotLS0gYS9vdGhlci9jaGVja3N0eWxlLXJ1bGVzL3NyYy9tYWluL3Jlc291cmNlcy9kZWZhdWx0L215ZmFjZXMtY29kZXN0eWxlLWVjbGlwc2UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMjY0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJubyI/PgotPHByb2ZpbGVzIHZlcnNpb249IjExIj4KLTxwcm9maWxlIGtpbmQ9IkNvZGVGb3JtYXR0ZXJQcm9maWxlIiBuYW1lPSJteWZhY2VzIiB2ZXJzaW9uPSIxMSI+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9yb290X3RhZ3MiIHZhbHVlPSJpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2Fubm90YXRpb24iIHZhbHVlPSJpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl90eXBlX3BhcmFtZXRlcnMiIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl90eXBlX2RlY2xhcmF0aW9uIiB2YWx1ZT0iaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl90eXBlX2FyZ3VtZW50cyIgdmFsdWU9Imluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYW5vbnltb3VzX3R5cGVfZGVjbGFyYXRpb24iIHZhbHVlPSJuZXh0X2xpbmUiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9jYXNlIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplciIgdmFsdWU9Imluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfYW5ub3RhdGlvbl9kZWNsYXJhdGlvbiIgdmFsdWU9Imluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX2Nsb3NpbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXIiIHZhbHVlPSJpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fYW5ub3RhdGlvbiIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX2ZpZWxkIiB2YWx1ZT0iMCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl93aGlsZSIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX2Fubm90YXRpb25fdHlwZV9tZW1iZXJfZGVjbGFyYXRpb24iIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfZWxzZV9pbl9pZl9zdGF0ZW1lbnQiIHZhbHVlPSJpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3ByZWZpeF9vcGVyYXRvciIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIua2VlcF9lbHNlX3N0YXRlbWVudF9vbl9zYW1lX2xpbmUiIHZhbHVlPSJmYWxzZSIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfZWxsaXBzaXMiIHZhbHVlPSJpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbnNlcnRfbmV3X2xpbmVfZm9yX3BhcmFtZXRlciIgdmFsdWU9Imluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fYW5ub3RhdGlvbl90eXBlX2RlY2xhcmF0aW9uIiB2YWx1ZT0iaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9icmVha3NfY29tcGFyZV90b19jYXNlcyIgdmFsdWU9InRydWUiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2F0X2luX2Fubm90YXRpb24iIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfbXVsdGlwbGVfZmllbGRzIiB2YWx1ZT0iMTYiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9leHByZXNzaW9uc19pbl9hcnJheV9pbml0aWFsaXplciIgdmFsdWU9IjE2Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfY29uZGl0aW9uYWxfZXhwcmVzc2lvbiIgdmFsdWU9IjgwIi8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9mb3IiIHZhbHVlPSJpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2JpbmFyeV9vcGVyYXRvciIgdmFsdWU9Imluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3F1ZXN0aW9uX2luX3dpbGRjYXJkIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYXJyYXlfaW5pdGlhbGl6ZXIiIHZhbHVlPSJuZXh0X2xpbmUiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX2VudW1fY29uc3RhbnQiIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfZmluYWxseV9pbl90cnlfc3RhdGVtZW50IiB2YWx1ZT0iaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfY2F0Y2hfaW5fdHJ5X3N0YXRlbWVudCIgdmFsdWU9Imluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fd2hpbGUiIHZhbHVlPSJpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYWZ0ZXJfcGFja2FnZSIgdmFsdWU9IjEiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX3R5cGVfcGFyYW1ldGVycyIgdmFsdWU9Imluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb250aW51YXRpb25faW5kZW50YXRpb24iIHZhbHVlPSIyIi8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9wb3N0Zml4X29wZXJhdG9yIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9tZXRob2RfaW52b2NhdGlvbiIgdmFsdWU9IjE2Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3R5cGVfYXJndW1lbnRzIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX3N1cGVyaW50ZXJmYWNlcyIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX25ld19jaHVuayIgdmFsdWU9IjEiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9iaW5hcnlfb3BlcmF0b3IiIHZhbHVlPSJpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX3BhY2thZ2UiIHZhbHVlPSIwIi8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlIiB2YWx1ZT0iMS41Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9lbnVtX2NvbnN0YW50X2FyZ3VtZW50cyIgdmFsdWU9Imluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbiIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX2FyZ3VtZW50cyIgdmFsdWU9Imluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9saW5lX2NvbW1lbnRzIiB2YWx1ZT0idHJ1ZSIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZW51bV9kZWNsYXJhdGlvbnMiIHZhbHVlPSJpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2Jsb2NrIiB2YWx1ZT0iaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX2V4cGxpY2l0X2NvbnN0cnVjdG9yX2NhbGwiIHZhbHVlPSIxNiIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX21ldGhvZF9pbnZvY2F0aW9uX2FyZ3VtZW50cyIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX21lbWJlcl90eXBlIiB2YWx1ZT0iMSIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbl90eXBlX21lbWJlcnNfb25fY29sdW1ucyIgdmFsdWU9ImZhbHNlIi8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2VudW1fY29uc3RhbnQiIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2ZvciIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX21ldGhvZF9kZWNsYXJhdGlvbiIgdmFsdWU9Imluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3NlbGVjdG9yX2luX21ldGhvZF9pbnZvY2F0aW9uIiB2YWx1ZT0iMTYiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fc3dpdGNoIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfdW5hcnlfb3BlcmF0b3IiIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9jYXNlIiB2YWx1ZT0iaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5kZW50X3BhcmFtZXRlcl9kZXNjcmlwdGlvbiIgdmFsdWU9InRydWUiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX21ldGhvZF9kZWNsYXJhdGlvbiIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX3N3aXRjaCIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2VudW1fZGVjbGFyYXRpb24iIHZhbHVlPSJpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX2Fubm90YXRpb24iIHZhbHVlPSJpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9wYXJhbWV0ZXJzIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfdHlwZV9kZWNsYXJhdGlvbiIgdmFsdWU9Imluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmNsZWFyX2JsYW5rX2xpbmVzX2luX2Jsb2NrX2NvbW1lbnQiIHZhbHVlPSJmYWxzZSIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5saW5lU3BsaXQiIHZhbHVlPSIxMjAiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2lmIiB2YWx1ZT0iaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2JyYWNrZXRzX2luX2FycmF5X3R5cGVfcmVmZXJlbmNlIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb24iIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZXhwbGljaXRjb25zdHJ1Y3RvcmNhbGxfYXJndW1lbnRzIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb24iIHZhbHVlPSJpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX2ZpcnN0X2NsYXNzX2JvZHlfZGVjbGFyYXRpb24iIHZhbHVlPSIwIi8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudGF0aW9uLnNpemUiIHZhbHVlPSI0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9tZXRob2RfZGVjbGFyYXRpb24iIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9lbnVtX2NvbnN0YW50IiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3N1cGVyY2xhc3NfaW5fdHlwZV9kZWNsYXJhdGlvbiIgdmFsdWU9IjE2Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXNzaWdubWVudCIgdmFsdWU9IjAiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXIiIHZhbHVlPSJlcnJvciIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci50YWJ1bGF0aW9uLmNoYXIiIHZhbHVlPSJzcGFjZSIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb25fcGFyYW1ldGVycyIgdmFsdWU9Imluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3ByZWZpeF9vcGVyYXRvciIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X3N0YXRlbWVudHNfY29tcGFyZV90b19ib2R5IiB2YWx1ZT0idHJ1ZSIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfbWV0aG9kIiB2YWx1ZT0iMSIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5mb3JtYXRfZ3VhcmRpYW5fY2xhdXNlX29uX29uZV9saW5lIiB2YWx1ZT0iZmFsc2UiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9mb3IiIHZhbHVlPSJpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2Nhc3QiIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfcGFyYW1ldGVyc19pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbiIgdmFsdWU9IjE2Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9sYWJlbGVkX3N0YXRlbWVudCIgdmFsdWU9Imluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYW5ub3RhdGlvbl90eXBlX2RlY2xhcmF0aW9uIiB2YWx1ZT0ibmV4dF9saW5lIi8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9tZXRob2RfYm9keSIgdmFsdWU9Imluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fbWV0aG9kX2ludm9jYXRpb24iIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfYWxsb2NhdGlvbl9leHByZXNzaW9uIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fZW51bV9jb25zdGFudCIgdmFsdWU9Imluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2Fubm90YXRpb24iIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9hdF9pbl9hbm5vdGF0aW9uX3R5cGVfZGVjbGFyYXRpb24iIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fbWV0aG9kX2RlY2xhcmF0aW9uX3Rocm93cyIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2lmIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3Jfc3dpdGNoIiB2YWx1ZT0ibmV4dF9saW5lIi8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tZXRob2RfZGVjbGFyYXRpb25fdGhyb3dzIiB2YWx1ZT0iaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcGFyZW50aGVzaXplZF9leHByZXNzaW9uX2luX3JldHVybiIgdmFsdWU9Imluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fYW5ub3RhdGlvbiIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3F1ZXN0aW9uX2luX2NvbmRpdGlvbmFsIiB2YWx1ZT0iaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9xdWVzdGlvbl9pbl93aWxkY2FyZCIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2JyYWNrZXRfaW5fYXJyYXlfYWxsb2NhdGlvbl9leHByZXNzaW9uIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbl9pbl90aHJvdyIgdmFsdWU9Imluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX3R5cGVfYXJndW1lbnRzIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXIiIHZhbHVlPSJlcnJvciIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3dpdGNoc3RhdGVtZW50c19jb21wYXJlX3RvX3N3aXRjaCIgdmFsdWU9InRydWUiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2Jsb2NrIiB2YWx1ZT0ibmV4dF9saW5lIi8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfZWxsaXBzaXMiIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZm9yX2luaXRzIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfbWV0aG9kX2RlY2xhcmF0aW9uIiB2YWx1ZT0ibmV4dF9saW5lIi8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbXBhY3RfZWxzZV9pZiIgdmFsdWU9InRydWUiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9hcnJheV9pbml0aWFsaXplciIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2Zvcl9pbmNyZW1lbnRzIiB2YWx1ZT0iaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19icmFja2V0X2luX2FycmF5X3JlZmVyZW5jZSIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2VudW1fY29uc3RhbnQiIHZhbHVlPSJuZXh0X2xpbmUiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbmRlbnRfcm9vdF90YWdzIiB2YWx1ZT0idHJ1ZSIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2VudW1fZGVjbGFyYXRpb25zIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZXhwbGljaXRjb25zdHJ1Y3RvcmNhbGxfYXJndW1lbnRzIiB2YWx1ZT0iaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9zd2l0Y2giIHZhbHVlPSJpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX3N1cGVyaW50ZXJmYWNlcyIgdmFsdWU9Imluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX21ldGhvZF9kZWNsYXJhdGlvbl9wYXJhbWV0ZXJzIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2FsbG9jYXRpb25fZXhwcmVzc2lvbiIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIudGFidWxhdGlvbi5zaXplIiB2YWx1ZT0iNCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV90eXBlX3JlZmVyZW5jZSIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX29wZW5pbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXIiIHZhbHVlPSJpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Nsb3NpbmdfYnJhY2VfaW5fYmxvY2siIHZhbHVlPSJpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfcmVmZXJlbmNlIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfZW51bV9jb25zdGFudCIgdmFsdWU9Imluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfYXJndW1lbnRzIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb24iIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2lmIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uX3Rocm93cyIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5jbGVhcl9ibGFua19saW5lc19pbl9qYXZhZG9jX2NvbW1lbnQiIHZhbHVlPSJmYWxzZSIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3Rocm93c19jbGF1c2VfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb24iIHZhbHVlPSIxNiIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYXNzaWdubWVudF9vcGVyYXRvciIgdmFsdWU9Imluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Fzc2lnbm1lbnRfb3BlcmF0b3IiIHZhbHVlPSJpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2VtcHR5X2xpbmVzIiB2YWx1ZT0iZmFsc2UiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fc3luY2hyb25pemVkIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY2xvc2luZ19wYXJlbl9pbl9jYXN0IiB2YWx1ZT0iaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tZXRob2RfZGVjbGFyYXRpb25fcGFyYW1ldGVycyIgdmFsdWU9Imluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYmxvY2tfaW5fY2FzZSIgdmFsdWU9Im5leHRfbGluZSIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5udW1iZXJfb2ZfZW1wdHlfbGluZXNfdG9fcHJlc2VydmUiIHZhbHVlPSIxIi8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9tZXRob2RfZGVjbGFyYXRpb24iIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2NhdGNoIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb24iIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9tZXRob2RfaW52b2NhdGlvbiIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV9yZWZlcmVuY2UiIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9hbmRfaW5fdHlwZV9wYXJhbWV0ZXIiIHZhbHVlPSJpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fcXVhbGlmaWVkX2FsbG9jYXRpb25fZXhwcmVzc2lvbiIgdmFsdWU9IjE2Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZSIgdmFsdWU9IjEuNSIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb250aW51YXRpb25faW5kZW50YXRpb25fZm9yX2FycmF5X2luaXRpYWxpemVyIiB2YWx1ZT0iMiIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9icmFja2V0c19pbl9hcnJheV9hbGxvY2F0aW9uX2V4cHJlc3Npb24iIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfYXRfaW5fYW5ub3RhdGlvbl90eXBlX2RlY2xhcmF0aW9uIiB2YWx1ZT0iaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX2FsbG9jYXRpb25fZXhwcmVzc2lvbiIgdmFsdWU9IjE2Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2Nhc3QiIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfdW5hcnlfb3BlcmF0b3IiIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2UiIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9hbm9ueW1vdXNfdHlwZV9kZWNsYXJhdGlvbiIgdmFsdWU9Imluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5rZWVwX2VtcHR5X2FycmF5X2luaXRpYWxpemVyX29uX29uZV9saW5lIiB2YWx1ZT0iZmFsc2UiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X2VudW1fZGVjbGFyYXRpb24iIHZhbHVlPSJpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIua2VlcF9pbXBsZV9pZl9vbl9vbmVfbGluZSIgdmFsdWU9ImZhbHNlIi8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb25fcGFyYW1ldGVycyIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX3BhcmFtZXRlcnMiIHZhbHVlPSJpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2F0X2VuZF9vZl9maWxlX2lmX21pc3NpbmciIHZhbHVlPSJpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2ZvciIgdmFsdWU9Imluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2xhYmVsZWRfc3RhdGVtZW50IiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3N1cGVyaW50ZXJmYWNlc19pbl90eXBlX2RlY2xhcmF0aW9uIiB2YWx1ZT0iMTYiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2JpbmFyeV9leHByZXNzaW9uIiB2YWx1ZT0iMTYiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2VudW1fZGVjbGFyYXRpb24iIHZhbHVlPSJuZXh0X2xpbmUiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX3doaWxlIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5wdXRfZW1wdHlfc3RhdGVtZW50X29uX25ld19saW5lIiB2YWx1ZT0idHJ1ZSIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfcGFyYW1ldGVycyIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX21ldGhvZF9pbnZvY2F0aW9uIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX3doaWxlX2luX2RvX3N0YXRlbWVudCIgdmFsdWU9Imluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9lbnVtX2NvbnN0YW50IiB2YWx1ZT0iMTYiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfamF2YWRvY19jb21tZW50cyIgdmFsdWU9InRydWUiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5saW5lX2xlbmd0aCIgdmFsdWU9IjEyMCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZXR3ZWVuX2ltcG9ydF9ncm91cHMiIHZhbHVlPSIxIi8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZW51bV9jb25zdGFudF9hcmd1bWVudHMiIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfc2VtaWNvbG9uIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfY29uc3RydWN0b3JfZGVjbGFyYXRpb24iIHZhbHVlPSJuZXh0X2xpbmUiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubnVtYmVyX29mX2JsYW5rX2xpbmVzX2F0X2JlZ2lubmluZ19vZl9tZXRob2RfYm9keSIgdmFsdWU9IjAiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9jb25kaXRpb25hbCIgdmFsdWU9Imluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYm9keV9kZWNsYXJhdGlvbnNfY29tcGFyZV90b190eXBlX2hlYWRlciIgdmFsdWU9InRydWUiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2Fubm90YXRpb25fdHlwZV9tZW1iZXJfZGVjbGFyYXRpb24iIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLndyYXBfYmVmb3JlX2JpbmFyeV9vcGVyYXRvciIgdmFsdWU9InRydWUiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JvZHlfZGVjbGFyYXRpb25zX2NvbXBhcmVfdG9fZW51bV9kZWNsYXJhdGlvbl9oZWFkZXIiIHZhbHVlPSJ0cnVlIi8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JldHdlZW5fdHlwZV9kZWNsYXJhdGlvbnMiIHZhbHVlPSIxIi8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9zeW5jaHJvbml6ZWQiIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9zdGF0ZW1lbnRzX2NvbXBhcmVfdG9fYmxvY2siIHZhbHVlPSJ0cnVlIi8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3Jfc3VwZXJpbnRlcmZhY2VzX2luX2VudW1fZGVjbGFyYXRpb24iIHZhbHVlPSIxNiIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3F1ZXN0aW9uX2luX2NvbmRpdGlvbmFsIiB2YWx1ZT0iaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fbXVsdGlwbGVfZmllbGRfZGVjbGFyYXRpb25zIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2NvbXBhY3RfaWYiIHZhbHVlPSIxNiIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZm9yX2luaXRzIiB2YWx1ZT0iaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9zd2l0Y2hzdGF0ZW1lbnRzX2NvbXBhcmVfdG9fY2FzZXMiIHZhbHVlPSJ0cnVlIi8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9hcnJheV9pbml0aWFsaXplciIgdmFsdWU9Imluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2RlZmF1bHQiIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfYW5kX2luX3R5cGVfcGFyYW1ldGVyIiB2YWx1ZT0iaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbiIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2Fzc2VydCIgdmFsdWU9Imluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfaW1wb3J0cyIgdmFsdWU9IjEiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfaHRtbCIgdmFsdWU9InRydWUiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl90aHJvd3NfY2xhdXNlX2luX21ldGhvZF9kZWNsYXJhdGlvbiIgdmFsdWU9IjE2Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3R5cGVfcGFyYW1ldGVycyIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfYWxsb2NhdGlvbl9leHByZXNzaW9uIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfYW5vbnltb3VzX3R5cGVfZGVjbGFyYXRpb24iIHZhbHVlPSJpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2NvbmRpdGlvbmFsIiB2YWx1ZT0iaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZSIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2ZvciIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9wb3N0Zml4X29wZXJhdG9yIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9zb3VyY2VfY29kZSIgdmFsdWU9InRydWUiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3N5bmNocm9uaXplZCIgdmFsdWU9Imluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fYWxsb2NhdGlvbl9leHByZXNzaW9uIiB2YWx1ZT0iaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbl90aHJvd3MiIHZhbHVlPSJpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9wYXJhbWV0ZXJzX2luX21ldGhvZF9kZWNsYXJhdGlvbiIgdmFsdWU9IjE2Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplciIgdmFsdWU9Imluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm0iIHZhbHVlPSIxLjUiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIudXNlX3RhYnNfb25seV9mb3JfbGVhZGluZ19pbmRlbnRhdGlvbnMiIHZhbHVlPSJmYWxzZSIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9oZWFkZXIiIHZhbHVlPSJmYWxzZSIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9ibG9ja19jb21tZW50cyIgdmFsdWU9InRydWUiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2VudW1fY29uc3RhbnQiIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfZW51bV9jb25zdGFudHMiIHZhbHVlPSIwIi8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9ibG9jayIgdmFsdWU9Imluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYm9keV9kZWNsYXJhdGlvbnNfY29tcGFyZV90b19hbm5vdGF0aW9uX2RlY2xhcmF0aW9uX2hlYWRlciIgdmFsdWU9InRydWUiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbiIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbiIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2NhdGNoIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX211bHRpcGxlX2xvY2FsX2RlY2xhcmF0aW9ucyIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3N3aXRjaCIgdmFsdWU9Imluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2Zvcl9pbmNyZW1lbnRzIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9tZXRob2RfaW52b2NhdGlvbiIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9hc3NlcnQiIHZhbHVlPSJpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX3R5cGVfZGVjbGFyYXRpb24iIHZhbHVlPSJuZXh0X2xpbmUiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyIiB2YWx1ZT0iaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X2JyYWNlc19pbl9hcnJheV9pbml0aWFsaXplciIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fbWV0aG9kX2RlY2xhcmF0aW9uIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3NlbWljb2xvbl9pbl9mb3IiIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9jYXRjaCIgdmFsdWU9Imluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbXVsdGlwbGVfZmllbGRfZGVjbGFyYXRpb25zIiB2YWx1ZT0iaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9hbm5vdGF0aW9uIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZSIgdmFsdWU9Imluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbWV0aG9kX2ludm9jYXRpb25fYXJndW1lbnRzIiB2YWx1ZT0iaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2FmdGVyX2ltcG9ydHMiIHZhbHVlPSIxIi8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tdWx0aXBsZV9sb2NhbF9kZWNsYXJhdGlvbnMiIHZhbHVlPSJpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JvZHlfZGVjbGFyYXRpb25zX2NvbXBhcmVfdG9fZW51bV9jb25zdGFudF9oZWFkZXIiIHZhbHVlPSJ0cnVlIi8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9zZW1pY29sb25faW5fZm9yIiB2YWx1ZT0iaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLm5ldmVyX2luZGVudF9saW5lX2NvbW1lbnRzX29uX2ZpcnN0X2NvbHVtbiIgdmFsdWU9ImZhbHNlIi8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfYXJndW1lbnRzIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5uZXZlcl9pbmRlbnRfYmxvY2tfY29tbWVudHNfb25fZmlyc3RfY29sdW1uIiB2YWx1ZT0iZmFsc2UiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIua2VlcF90aGVuX3N0YXRlbWVudF9vbl9zYW1lX2xpbmUiIHZhbHVlPSJmYWxzZSIvPgotPC9wcm9maWxlPgotPC9wcm9maWxlcz4KZGlmZiAtLWdpdCBhL290aGVyL2NoZWNrc3R5bGUtcnVsZXMvc3JjL21haW4vcmVzb3VyY2VzL2RlZmF1bHQvbXlmYWNlcy1jb2Rlc3R5bGUtaWRlYS54bWwgYi9vdGhlci9jaGVja3N0eWxlLXJ1bGVzL3NyYy9tYWluL3Jlc291cmNlcy9kZWZhdWx0L215ZmFjZXMtY29kZXN0eWxlLWlkZWEueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MjlhZWIyLi4wMDAwMDAwCi0tLSBhL290aGVyL2NoZWNrc3R5bGUtcnVsZXMvc3JjL21haW4vcmVzb3VyY2VzL2RlZmF1bHQvbXlmYWNlcy1jb2Rlc3R5bGUtaWRlYS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNvZGVfc2NoZW1lIG5hbWU9Im15ZmFjZXMtaWRlYS1jb2Rlc3R5bGUudHh0Ij4KLSAgPG9wdGlvbiBuYW1lPSJCUkFDRV9TVFlMRSIgdmFsdWU9IjIiIC8+Ci0gIDxvcHRpb24gbmFtZT0iQ0xBU1NfQlJBQ0VfU1RZTEUiIHZhbHVlPSIyIiAvPgotICA8b3B0aW9uIG5hbWU9Ik1FVEhPRF9CUkFDRV9TVFlMRSIgdmFsdWU9IjIiIC8+Ci0gIDxvcHRpb24gbmFtZT0iRUxTRV9PTl9ORVdfTElORSIgdmFsdWU9InRydWUiIC8+Ci0gIDxvcHRpb24gbmFtZT0iV0hJTEVfT05fTkVXX0xJTkUiIHZhbHVlPSJ0cnVlIiAvPgotICA8b3B0aW9uIG5hbWU9IkNBVENIX09OX05FV19MSU5FIiB2YWx1ZT0idHJ1ZSIgLz4KLSAgPG9wdGlvbiBuYW1lPSJGSU5BTExZX09OX05FV19MSU5FIiB2YWx1ZT0idHJ1ZSIgLz4KLSAgPG9wdGlvbiBuYW1lPSJBTElHTl9NVUxUSUxJTkVfUEFSQU1FVEVSU19JTl9DQUxMUyIgdmFsdWU9InRydWUiIC8+Ci0gIDxvcHRpb24gbmFtZT0iQUxJR05fTVVMVElMSU5FX0ZPUiIgdmFsdWU9ImZhbHNlIiAvPgotICA8b3B0aW9uIG5hbWU9IklGX0JSQUNFX0ZPUkNFIiB2YWx1ZT0iMyIgLz4KLSAgPG9wdGlvbiBuYW1lPSJET1dISUxFX0JSQUNFX0ZPUkNFIiB2YWx1ZT0iMyIgLz4KLSAgPG9wdGlvbiBuYW1lPSJXSElMRV9CUkFDRV9GT1JDRSIgdmFsdWU9IjMiIC8+Ci0gIDxvcHRpb24gbmFtZT0iRk9SX0JSQUNFX0ZPUkNFIiB2YWx1ZT0iMyIgLz4KLSAgPG9wdGlvbiBuYW1lPSJFTkFCTEVfSkFWQURPQ19GT1JNQVRUSU5HIiB2YWx1ZT0iZmFsc2UiIC8+Ci0gIDxvcHRpb24gbmFtZT0iSkRfUF9BVF9FTVBUWV9MSU5FUyIgdmFsdWU9ImZhbHNlIiAvPgotICA8QURESVRJT05BTF9JTkRFTlRfT1BUSU9OUyBmaWxlVHlwZT0ianMiPgotICAgIDxvcHRpb24gbmFtZT0iSU5ERU5UX1NJWkUiIHZhbHVlPSI0IiAvPgotICAgIDxvcHRpb24gbmFtZT0iQ09OVElOVUFUSU9OX0lOREVOVF9TSVpFIiB2YWx1ZT0iOCIgLz4KLSAgICA8b3B0aW9uIG5hbWU9IlRBQl9TSVpFIiB2YWx1ZT0iNCIgLz4KLSAgICA8b3B0aW9uIG5hbWU9IlVTRV9UQUJfQ0hBUkFDVEVSIiB2YWx1ZT0iZmFsc2UiIC8+Ci0gICAgPG9wdGlvbiBuYW1lPSJTTUFSVF9UQUJTIiB2YWx1ZT0iZmFsc2UiIC8+Ci0gICAgPG9wdGlvbiBuYW1lPSJMQUJFTF9JTkRFTlRfU0laRSIgdmFsdWU9IjAiIC8+Ci0gICAgPG9wdGlvbiBuYW1lPSJMQUJFTF9JTkRFTlRfQUJTT0xVVEUiIHZhbHVlPSJmYWxzZSIgLz4KLSAgPC9BRERJVElPTkFMX0lOREVOVF9PUFRJT05TPgotPC9jb2RlX3NjaGVtZT4KLQpkaWZmIC0tZ2l0IGEvb3RoZXIvY2hlY2tzdHlsZS1ydWxlcy9zcmMvbWFpbi9yZXNvdXJjZXMvZGVmYXVsdC9teWZhY2VzLWhlYWRlci1yZWdleHAudHh0IGIvb3RoZXIvY2hlY2tzdHlsZS1ydWxlcy9zcmMvbWFpbi9yZXNvdXJjZXMvZGVmYXVsdC9teWZhY2VzLWhlYWRlci1yZWdleHAudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OThlNTFjLi4wMDAwMDAwCi0tLSBhL290aGVyL2NoZWNrc3R5bGUtcnVsZXMvc3JjL21haW4vcmVzb3VyY2VzL2RlZmF1bHQvbXlmYWNlcy1oZWFkZXItcmVnZXhwLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLV4vXCokCi1eIFwqICtMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gXChBU0ZcKSB1bmRlciBvbmUkCi1eIFwqICtvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUkCi1eIFwqICtkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiQKLV4gXCogK3JlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUkCi1eIFwqICt0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCBcKHRoZSQKLV4gXCogKyJMaWNlbnNlIlwpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlJAotXiBcKiArd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCQKLV4gXCogKiQKLV4gXCogK2h0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCQKLV4gXCogKiQKLV4gXCogK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywkCi1eIFwqICtzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiQKLV4gXCogKyJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSQKLV4gXCogK0tJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSQKLV4gXCogK3NwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMkCi1eIFwqICt1bmRlciB0aGUgTGljZW5zZS4kCi1eIFwqLyQKZGlmZiAtLWdpdCBhL290aGVyL2NoZWNrc3R5bGUtcnVsZXMvc3JjL21haW4vcmVzb3VyY2VzL2RlZmF1bHQvbXlmYWNlcy1oZWFkZXItc3BhY2VzLnR4dCBiL290aGVyL2NoZWNrc3R5bGUtcnVsZXMvc3JjL21haW4vcmVzb3VyY2VzL2RlZmF1bHQvbXlmYWNlcy1oZWFkZXItc3BhY2VzLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjI0ZjFkNi4uMDAwMDAwMAotLS0gYS9vdGhlci9jaGVja3N0eWxlLXJ1bGVzL3NyYy9tYWluL3Jlc291cmNlcy9kZWZhdWx0L215ZmFjZXMtaGVhZGVyLXNwYWNlcy50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCmRpZmYgLS1naXQgYS9vdGhlci9jaGVja3N0eWxlLXJ1bGVzL3NyYy9tYWluL3Jlc291cmNlcy9kZWZhdWx0L215ZmFjZXMtaGVhZGVyLnR4dCBiL290aGVyL2NoZWNrc3R5bGUtcnVsZXMvc3JjL21haW4vcmVzb3VyY2VzL2RlZmF1bHQvbXlmYWNlcy1oZWFkZXIudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDJmM2NlLi4wMDAwMDAwCi0tLSBhL290aGVyL2NoZWNrc3R5bGUtcnVsZXMvc3JjL21haW4vcmVzb3VyY2VzL2RlZmF1bHQvbXlmYWNlcy1oZWFkZXIudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KZGlmZiAtLWdpdCBhL290aGVyL2NoZWNrc3R5bGUtcnVsZXMvc3JjL21haW4vcmVzb3VyY2VzL3RvYmFnby9jaGVja3N0eWxlLWhlYWRlci50eHQgYi9vdGhlci9jaGVja3N0eWxlLXJ1bGVzL3NyYy9tYWluL3Jlc291cmNlcy90b2JhZ28vY2hlY2tzdHlsZS1oZWFkZXIudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMGEyMTAzLi4wMDAwMDAwCi0tLSBhL290aGVyL2NoZWNrc3R5bGUtcnVsZXMvc3JjL21haW4vcmVzb3VyY2VzL3RvYmFnby9jaGVja3N0eWxlLWhlYWRlci50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi1ecGFja2FnZQotXiQKLV4vXCokCi1eIFwqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBcKEFTRlwpIHVuZGVyIG9uZSBvciBtb3JlJAotXiBcKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgkCi1eIFwqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4kCi1eIFwqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wJAotXiBcKiBcKHRoZSAiTGljZW5zZSJcKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoJAotXiBcKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCQKLV4gXCokCi1eIFwqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wJAotXiBcKiQKLV4gXCogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSQKLV4gXCogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywkCi1eIFwqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiQKLV4gXCogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCQKLV4gXCogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuJAotXiBcKi8kCi1eJApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL290aGVyL2NoZWNrc3R5bGUtcnVsZXMvc3JjL21haW4vcmVzb3VyY2VzL3RvYmFnby9jaGVja3N0eWxlLXN0cmljdC54bWwgYi9vdGhlci9jaGVja3N0eWxlLXJ1bGVzL3NyYy9tYWluL3Jlc291cmNlcy90b2JhZ28vY2hlY2tzdHlsZS1zdHJpY3QueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYWE2NzFjLi4wMDAwMDAwCi0tLSBhL290aGVyL2NoZWNrc3R5bGUtcnVsZXMvc3JjL21haW4vcmVzb3VyY2VzL3RvYmFnby9jaGVja3N0eWxlLXN0cmljdC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNDUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPCFET0NUWVBFIG1vZHVsZSBQVUJMSUMKLSAgICAiLS8vUHVwcHkgQ3Jhd2wvL0RURCBDaGVjayBDb25maWd1cmF0aW9uIDEuMi8vRU4iCi0gICAgImh0dHA6Ly93d3cucHVwcHljcmF3bC5jb20vZHRkcy9jb25maWd1cmF0aW9uXzFfMi5kdGQiPgotCi08IS0tCi0KLSAgQ2hlY2tzdHlsZSBjb25maWd1cmF0aW9uIHRoYXQgY2hlY2tzIHRoZSBzdW4gY29kaW5nIGNvbnZlbnRpb25zIGZyb206Ci0KLSAgICAtIHRoZSBKYXZhIExhbmd1YWdlIFNwZWNpZmljYXRpb24gYXQKLSAgICAgIGh0dHA6Ly9qYXZhLnN1bi5jb20vZG9jcy9ib29rcy9qbHMvc2Vjb25kX2VkaXRpb24vaHRtbC9pbmRleC5odG1sCi0KLSAgICAtIHRoZSBTdW4gQ29kZSBDb252ZW50aW9ucyBhdCBodHRwOi8vamF2YS5zdW4uY29tL2RvY3MvY29kZWNvbnYvCi0KLSAgICAtIHRoZSBKYXZhZG9jIGd1aWRlbGluZXMgYXQKLSAgICAgIGh0dHA6Ly9qYXZhLnN1bi5jb20vajJzZS9qYXZhZG9jL3dyaXRpbmdkb2Njb21tZW50cy9pbmRleC5odG1sCi0KLSAgICAtIHRoZSBKREsgQXBpIGRvY3VtZW50YXRpb24gaHR0cDovL2phdmEuc3VuLmNvbS9qMnNlL2RvY3MvYXBpL2luZGV4Lmh0bWwKLQotICAgIC0gc29tZSBiZXN0IHByYWN0aWNlcwotCi0gIENoZWNrc3R5bGUgaXMgdmVyeSBjb25maWd1cmFibGUuIEJlIHN1cmUgdG8gcmVhZCB0aGUgZG9jdW1lbnRhdGlvbiBhdAotICBodHRwOi8vY2hlY2tzdHlsZS5zZi5uZXQgKG9yIGluIHlvdXIgZG93bmxvYWRlZCBkaXN0cmlidXRpb24pLgotCi0gIE1vc3QgQ2hlY2tzIGFyZSBjb25maWd1cmFibGUsIGJlIHN1cmUgdG8gY29uc3VsdCB0aGUgZG9jdW1lbnRhdGlvbi4KLQotICBUbyBjb21wbGV0ZWx5IGRpc2FibGUgYSBjaGVjaywganVzdCBjb21tZW50IGl0IG91dCBvciBkZWxldGUgaXQgZnJvbSB0aGUgZmlsZS4KLQotICBGaW5hbGx5LCBpdCBpcyB3b3J0aCByZWFkaW5nIHRoZSBkb2N1bWVudGF0aW9uLgotCi0tLT4KLQotPG1vZHVsZSBuYW1lPSJDaGVja2VyIj4KLQotICA8IS0tIENoZWNrcyB0aGF0IGEgcGFja2FnZS5odG1sIGZpbGUgZXhpc3RzIGZvciBlYWNoIHBhY2thZ2UuICAgICAtLT4KLSAgPCEtLSBTZWUgaHR0cDovL2NoZWNrc3R5bGUuc2YubmV0L2NvbmZpZ19qYXZhZG9jLmh0bWwjUGFja2FnZUh0bWwgLS0+Ci0KLSAgPCEtLSBDaGVja3Mgd2hldGhlciBmaWxlcyBlbmQgd2l0aCBhIG5ldyBsaW5lLiAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotICA8IS0tIFNlZSBodHRwOi8vY2hlY2tzdHlsZS5zZi5uZXQvY29uZmlnX21pc2MuaHRtbCNOZXdsaW5lQXRFbmRPZkZpbGUgLS0+Ci0gIDxtb2R1bGUgbmFtZT0iTmV3bGluZUF0RW5kT2ZGaWxlIi8+Ci0KLSAgPCEtLSBDaGVja3MgdGhhdCBwcm9wZXJ0eSBmaWxlcyBjb250YWluIHRoZSBzYW1lIGtleXMuICAgICAgICAgLS0+Ci0gIDwhLS0gU2VlIGh0dHA6Ly9jaGVja3N0eWxlLnNmLm5ldC9jb25maWdfbWlzYy5odG1sI1RyYW5zbGF0aW9uIC0tPgotICA8bW9kdWxlIG5hbWU9IlRyYW5zbGF0aW9uIi8+Ci0KLQotICA8bW9kdWxlIG5hbWU9IlRyZWVXYWxrZXIiPgotCi0gICAgPHByb3BlcnR5IG5hbWU9ImNhY2hlRmlsZSIgdmFsdWU9IiR7Y2hlY2tzdHlsZS5jYWNoZS5maWxlfSIvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJjaGFyc2V0IiB2YWx1ZT0iVVRGLTgiLz4KLSAgICA8cHJvcGVydHkgbmFtZT0idGFiV2lkdGgiIHZhbHVlPSIyIi8+Ci0KLSAgICA8IS0tIENoZWNrcyBmb3IgSmF2YWRvYyBjb21tZW50cy4gICAgICAgICAgICAgICAgICAgICAtLT4KLSAgICA8IS0tIFNlZSBodHRwOi8vY2hlY2tzdHlsZS5zZi5uZXQvY29uZmlnX2phdmFkb2MuaHRtbAotICAgICAgICA8bW9kdWxlIG5hbWU9IkphdmFkb2NNZXRob2QiLz4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJKYXZhZG9jVHlwZSIvPgotICAgICAgICA8bW9kdWxlIG5hbWU9IkphdmFkb2NWYXJpYWJsZSIvPgotICAgICAgICA8bW9kdWxlIG5hbWU9IkphdmFkb2NTdHlsZSIvPiAgIC0tPgotCi0KLQotCi0gICAgPCEtLSBDaGVja3MgZm9yIE5hbWluZyBDb252ZW50aW9ucy4gICAgICAgICAgICAgICAgICAtLT4KLSAgICA8IS0tIFNlZSBodHRwOi8vY2hlY2tzdHlsZS5zZi5uZXQvY29uZmlnX25hbWluZy5odG1sIC0tPgotICAgIDxtb2R1bGUgbmFtZT0iQ29uc3RhbnROYW1lIi8+Ci0gICAgPG1vZHVsZSBuYW1lPSJMb2NhbEZpbmFsVmFyaWFibGVOYW1lIi8+Ci0gICAgPG1vZHVsZSBuYW1lPSJMb2NhbFZhcmlhYmxlTmFtZSIvPgotICAgIDxtb2R1bGUgbmFtZT0iTWVtYmVyTmFtZSIvPgotICAgIDxtb2R1bGUgbmFtZT0iTWV0aG9kTmFtZSIvPgotICAgIDxtb2R1bGUgbmFtZT0iUGFja2FnZU5hbWUiLz4KLSAgICA8bW9kdWxlIG5hbWU9IlBhcmFtZXRlck5hbWUiLz4KLSAgICA8bW9kdWxlIG5hbWU9IlN0YXRpY1ZhcmlhYmxlTmFtZSIvPgotICAgIDxtb2R1bGUgbmFtZT0iVHlwZU5hbWUiLz4KLQotCi0KLQotICAgIDwhLS0gQ2hlY2tzIGZvciBIZWFkZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLSAgICA8IS0tIFNlZSBodHRwOi8vY2hlY2tzdHlsZS5zZi5uZXQvY29uZmlnX2hlYWRlci5odG1sICAgLS0+Ci0gICAgPCEtLSA8bW9kdWxlIG5hbWU9IkhlYWRlciI+IC0tPgotICAgIDwhLS0gVGhlIGZvbGxvdyBwcm9wZXJ0eSB2YWx1ZSBkZW1vbnN0cmF0ZXMgdGhlIGFiaWxpdHkgICAgIC0tPgotICAgIDwhLS0gdG8gaGF2ZSBhY2Nlc3MgdG8gQU5UIHByb3BlcnRpZXMuIEluIHRoaXMgY2FzZSBpdCB1c2VzIC0tPgotICAgIDwhLS0gdGhlICR7YmFzZWRpcn0gcHJvcGVydHkgdG8gYWxsb3cgQ2hlY2tzdHlsZSB0byBiZSBydW4gIC0tPgotICAgIDwhLS0gZnJvbSBhbnkgZGlyZWN0b3J5IHdpdGhpbiBhIHByb2plY3QuIFNlZSBwcm9wZXJ0eSAgICAgIC0tPgotICAgIDwhLS0gZXhwYW5zaW9uLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotICAgIDwhLS0gaHR0cDovL2NoZWNrc3R5bGUuc2YubmV0L2NvbmZpZy5odG1sI3Byb3BlcnRpZXMgICAgICAgIC0tPgotICAgIDwhLS0gPHByb3BlcnR5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotICAgIDwhLS0gICAgIG5hbWU9ImhlYWRlckZpbGUiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotICAgIDwhLS0gICAgIHZhbHVlPSIke2Jhc2VkaXJ9L2phdmEuaGVhZGVyIi8+IC0tPgotICAgIDwhLS0gRm9sbG93aW5nIGludGVycHJldHMgdGhlIGhlYWRlciBmaWxlIGFzIHJlZ3VsYXIgZXhwcmVzc2lvbnMuIC0tPgotICAgIDwhLS0gPC9tb2R1bGU+IC0tPgotCi0gICAgPG1vZHVsZSBuYW1lPSJSZWdleHBIZWFkZXIiPgotICAgICAgPHByb3BlcnR5IG5hbWU9ImhlYWRlckZpbGUiIHZhbHVlPSIke2NoZWNrc3R5bGUuaGVhZGVyLmZpbGV9Ii8+Ci0gICAgICA8IS0tPHByb3BlcnR5IG5hbWU9ImhlYWRlciIgdmFsdWU9Il5wYWNrYWdlIFxuXiRcbi9cKiRcbl4gXCogQ29weXJpZ2h0IFxkXGRcZFxkLVxkXGRcZFxkIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4kXG5eIFwqJFxuXiBcKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wIFwodGhlICZxdW90O0xpY2Vuc2UmcXVvdDtcKVw7JFxuXiBcKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuJFxuXiBcKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQkXG5eIFwqJFxuXiBcKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCRcbl4gXCokXG5eIFwqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUkXG5eIFwqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICZxdW90O0FTIElTJnF1b3Q7IEJBU0lTLCRcbl4gXCogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuJFxuXiBcKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kJFxuXiBcKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4kXG5eIFwqLyRcbl4kIi8+LS0+Ci0gICAgPC9tb2R1bGU+Ci0KLQotCi0KLQotICAgIDwhLS0gQ2hlY2tzIGZvciBpbXBvcnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0gICAgPCEtLSBTZWUgaHR0cDovL2NoZWNrc3R5bGUuc2YubmV0L2NvbmZpZ19pbXBvcnQuaHRtbCAtLT4KLSAgICA8bW9kdWxlIG5hbWU9IkF2b2lkU3RhckltcG9ydCIvPgotICAgIDxtb2R1bGUgbmFtZT0iSWxsZWdhbEltcG9ydCIvPiA8IS0tIGRlZmF1bHRzIHRvIHN1bi4qIHBhY2thZ2VzIC0tPgotICAgIDxtb2R1bGUgbmFtZT0iUmVkdW5kYW50SW1wb3J0Ii8+Ci0gICAgPG1vZHVsZSBuYW1lPSJVbnVzZWRJbXBvcnRzIi8+Ci0KLQotICAgIDwhLS0gQ2hlY2tzIGZvciBTaXplIFZpb2xhdGlvbnMuICAgICAgICAgICAgICAgICAgICAtLT4KLSAgICA8IS0tIFNlZSBodHRwOi8vY2hlY2tzdHlsZS5zZi5uZXQvY29uZmlnX3NpemVzLmh0bWwgLS0+Ci0gICAgPG1vZHVsZSBuYW1lPSJGaWxlTGVuZ3RoIi8+Ci0gICAgPG1vZHVsZSBuYW1lPSJMaW5lTGVuZ3RoIj4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJtYXgiIHZhbHVlPSIxMjAiLz4KLSAgICA8L21vZHVsZT4KLSAgICA8bW9kdWxlIG5hbWU9Ik1ldGhvZExlbmd0aCIvPgotICAgIDxtb2R1bGUgbmFtZT0iUGFyYW1ldGVyTnVtYmVyIi8+Ci0KLQotICAgIDwhLS0gQ2hlY2tzIGZvciB3aGl0ZXNwYWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotICAgIDwhLS0gU2VlIGh0dHA6Ly9jaGVja3N0eWxlLnNmLm5ldC9jb25maWdfd2hpdGVzcGFjZS5odG1sIC0tPgotICAgIDxtb2R1bGUgbmFtZT0iRW1wdHlGb3JJdGVyYXRvclBhZCIvPgotICAgIDxtb2R1bGUgbmFtZT0iTWV0aG9kUGFyYW1QYWQiLz4KLSAgICA8bW9kdWxlIG5hbWU9Ik5vV2hpdGVzcGFjZUFmdGVyIi8+Ci0gICAgPG1vZHVsZSBuYW1lPSJOb1doaXRlc3BhY2VCZWZvcmUiLz4KLSAgICA8bW9kdWxlIG5hbWU9Ik9wZXJhdG9yV3JhcCIvPgotICAgIDxtb2R1bGUgbmFtZT0iUGFyZW5QYWQiLz4KLSAgICA8bW9kdWxlIG5hbWU9IlR5cGVjYXN0UGFyZW5QYWQiLz4KLSAgICA8bW9kdWxlIG5hbWU9IlRhYkNoYXJhY3RlciIvPgotICAgIDxtb2R1bGUgbmFtZT0iV2hpdGVzcGFjZUFmdGVyIi8+Ci0gICAgPCEtLTxtb2R1bGUgbmFtZT0iV2hpdGVzcGFjZUFyb3VuZCIvPi0tPgotCi0gICAgPCEtLSBNb2RpZmllciBDaGVja3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLSAgICA8IS0tIFNlZSBodHRwOi8vY2hlY2tzdHlsZS5zZi5uZXQvY29uZmlnX21vZGlmaWVycy5odG1sIC0tPgotICAgIDxtb2R1bGUgbmFtZT0iTW9kaWZpZXJPcmRlciIvPgotICAgIDxtb2R1bGUgbmFtZT0iUmVkdW5kYW50TW9kaWZpZXIiLz4KLQotCi0gICAgPCEtLSBDaGVja3MgZm9yIGJsb2Nrcy4gWW91IGtub3csIHRob3NlIHt9J3MgICAgICAgICAtLT4KLSAgICA8IS0tIFNlZSBodHRwOi8vY2hlY2tzdHlsZS5zZi5uZXQvY29uZmlnX2Jsb2Nrcy5odG1sIC0tPgotICAgIDxtb2R1bGUgbmFtZT0iQXZvaWROZXN0ZWRCbG9ja3MiLz4KLSAgICA8bW9kdWxlIG5hbWU9IkVtcHR5QmxvY2siLz4KLSAgICA8bW9kdWxlIG5hbWU9IkxlZnRDdXJseSIvPgotICAgIDxtb2R1bGUgbmFtZT0iTmVlZEJyYWNlcyIvPgotICAgIDxtb2R1bGUgbmFtZT0iUmlnaHRDdXJseSIvPgotCi0KLSAgICA8IS0tIENoZWNrcyBmb3IgY29tbW9uIGNvZGluZyBwcm9ibGVtcyAgICAgICAgICAgICAgIC0tPgotICAgIDwhLS0gU2VlIGh0dHA6Ly9jaGVja3N0eWxlLnNmLm5ldC9jb25maWdfY29kaW5nLmh0bWwgLS0+Ci0gICAgPCEtLSA8bW9kdWxlIG5hbWU9IkF2b2lkSW5saW5lQ29uZGl0aW9uYWxzIi8+IC0tPgotICAgIDxtb2R1bGUgbmFtZT0iQ292YXJpYW50RXF1YWxzIi8+Ci0gICAgPG1vZHVsZSBuYW1lPSJEb3VibGVDaGVja2VkTG9ja2luZyIvPiAgICA8IS0tIE1ZIEZBVk9VUklURSAtLT4KLSAgICA8bW9kdWxlIG5hbWU9IkVtcHR5U3RhdGVtZW50Ii8+Ci0gICAgPG1vZHVsZSBuYW1lPSJFcXVhbHNIYXNoQ29kZSIvPgotICAgIDxtb2R1bGUgbmFtZT0iSGlkZGVuRmllbGQiPgotICAgICAgPHByb3BlcnR5IG5hbWU9Imlnbm9yZVNldHRlciIgdmFsdWU9InRydWUiIC8+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0iIGlnbm9yZUNvbnN0cnVjdG9yUGFyYW1ldGVyIiB2YWx1ZT0idHJ1ZSIgLz4KLSAgICA8L21vZHVsZT4KLSAgICA8bW9kdWxlIG5hbWU9IklsbGVnYWxJbnN0YW50aWF0aW9uIj4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJjbGFzc2VzIiB2YWx1ZT0iamF2YS5sYW5nLkJvb2xlYW4sIGphdmEubGFuZy5TdHJpbmciLz4KLSAgICA8L21vZHVsZT4KLSAgICA8bW9kdWxlIG5hbWU9IklubmVyQXNzaWdubWVudCIvPgotICAgIDwhLS0gPG1vZHVsZSBuYW1lPSJNYWdpY051bWJlciIvPiAtLT4KLSAgICA8bW9kdWxlIG5hbWU9Ik1pc3NpbmdTd2l0Y2hEZWZhdWx0Ii8+Ci0gICAgPG1vZHVsZSBuYW1lPSJSZWR1bmRhbnRUaHJvd3MiPgotICAgICAgPHByb3BlcnR5IG5hbWU9ImFsbG93VW5jaGVja2VkIiB2YWx1ZT0idHJ1ZSIvPgotICAgIDwvbW9kdWxlPgotICAgIDxtb2R1bGUgbmFtZT0iU3RyaW5nTGl0ZXJhbEVxdWFsaXR5Ii8+Ci0gICAgPG1vZHVsZSBuYW1lPSJTaW1wbGlmeUJvb2xlYW5FeHByZXNzaW9uIi8+Ci0gICAgPG1vZHVsZSBuYW1lPSJTaW1wbGlmeUJvb2xlYW5SZXR1cm4iLz4KLSAgICA8bW9kdWxlIG5hbWU9IlN1cGVyQ2xvbmUiLz4KLSAgICA8bW9kdWxlIG5hbWU9IlN1cGVyRmluYWxpemUiLz4KLSAgICA8bW9kdWxlIG5hbWU9IklsbGVnYWxUaHJvd3MiLz4KLSAgICA8bW9kdWxlIG5hbWU9IlBhY2thZ2VEZWNsYXJhdGlvbiIvPgotICAgIDxtb2R1bGUgbmFtZT0iRGVjbGFyYXRpb25PcmRlciIvPgotICAgIDxtb2R1bGUgbmFtZT0iUGFyYW1ldGVyQXNzaWdubWVudCIvPgotICAgIDxtb2R1bGUgbmFtZT0iRGVjbGFyYXRpb25PcmRlciIvPgotICAgIDxtb2R1bGUgbmFtZT0iTXVsdGlwbGVWYXJpYWJsZURlY2xhcmF0aW9ucyIvPgotICAgIDxtb2R1bGUgbmFtZT0iVW5uZWNlc3NhcnlQYXJlbnRoZXNlcyIvPgotCi0gICAgPCEtLSBDaGVja3MgZm9yIGNsYXNzIGRlc2lnbiAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLSAgICA8IS0tIFNlZSBodHRwOi8vY2hlY2tzdHlsZS5zZi5uZXQvY29uZmlnX2Rlc2lnbi5odG1sIC0tPgotICAgIDwhLS0gbW9kdWxlIG5hbWU9IkRlc2lnbkZvckV4dGVuc2lvbiIvIC0tPgotICAgIDwhLS0gbW9kdWxlIG5hbWU9IkZpbmFsQ2xhc3MiLyAtLT4KLSAgICA8IS0tIG1vZHVsZSBuYW1lPSJIaWRlVXRpbGl0eUNsYXNzQ29uc3RydWN0b3IiLyAtLT4KLQotICAgIDxtb2R1bGUgbmFtZT0iSW50ZXJmYWNlSXNUeXBlIi8+Ci0gICAgPG1vZHVsZSBuYW1lPSJWaXNpYmlsaXR5TW9kaWZpZXIiLz4KLQotCi0gICAgPCEtLSBNaXNjZWxsYW5lb3VzIG90aGVyIGNoZWNrcy4gICAgICAgICAgICAgICAgICAgLS0+Ci0gICAgPCEtLSBTZWUgaHR0cDovL2NoZWNrc3R5bGUuc2YubmV0L2NvbmZpZ19taXNjLmh0bWwgLS0+Ci0gICAgPG1vZHVsZSBuYW1lPSJBcnJheVR5cGVTdHlsZSIvPgotICAgIDwhLS08bW9kdWxlIG5hbWU9IkZpbmFsUGFyYW1ldGVycyIvPiAtLT4KLSAgICA8IS0tIExpbmUgd2l0aCBUcmFpbGluZyBTcGFjZXMgKGRpc2FibGVkIGFzIGl0J3MgdG8gbm9pc3kpCi0gICAgICAgIDxtb2R1bGUgbmFtZT0iR2VuZXJpY0lsbGVnYWxSZWdleHAiPgotICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJmb3JtYXQiIHZhbHVlPSJccyskIi8+Ci0gICAgICAgICAgPHByb3BlcnR5IG5hbWU9Im1lc3NhZ2UiIHZhbHVlPSJMaW5lIGhhcyB0cmFpbGluZyBzcGFjZXMuIi8+Ci0gICAgICAgIDwvbW9kdWxlPgotICAgICAgICAtLT4KLQotICAgIDwhLS0gTGV0IHRvZG8gcGx1Z2luIGhhbmRsZSB0aGlzLgotICAgICAgICA8bW9kdWxlIG5hbWU9IlRvZG9Db21tZW50Ii8+Ci0gICAgICAgIC0tPgotCi0gICAgPG1vZHVsZSBuYW1lPSJHZW5lcmljSWxsZWdhbFJlZ2V4cCI+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0iZm9ybWF0IiB2YWx1ZT0iKChwdWJsaWMpfChwcm90ZWN0ZWQpKVxzK3ZvaWRccytmaW5hbGl6ZVwoXHMqXCkiLz4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJtZXNzYWdlIiB2YWx1ZT0iQXZvaWQgZmluYWxpemVycyIvPgotICAgIDwvbW9kdWxlPgotICAgIDwhLS0gTm8gZGlyZWN0IHByaW50aW5nIHRvIFN5c3RlbS5vdXQgb3IgU3lzdGVtLmVyciAtLT4KLQotCi0gICAgPG1vZHVsZSBuYW1lPSJHZW5lcmljSWxsZWdhbFJlZ2V4cCI+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0iZm9ybWF0IiB2YWx1ZT0iU3lzdGVtXC4ob3V0fGVycilcLiIvPgotICAgICAgPHByb3BlcnR5IG5hbWU9Im1lc3NhZ2UiIHZhbHVlPSJEb24ndCB3cml0ZSBkaXJlY3RseSB0byBTeXN0ZW0ub3V0IG91ciBTeXN0ZW0uZXJyIi8+Ci0gICAgPC9tb2R1bGU+Ci0gICAgPCEtLSBObyBAYXV0aG9yIHRhZ3MgLS0+Ci0gICAgPG1vZHVsZSBuYW1lPSJHZW5lcmljSWxsZWdhbFJlZ2V4cCI+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0iZm9ybWF0IiB2YWx1ZT0iQGF1dGhvciIvPgotICAgICAgPHByb3BlcnR5IG5hbWU9Im1lc3NhZ2UiIAl2YWx1ZT0iTm8gQGF1dGhvciB0YWcgYWxsb3dlZCIvPgotICAgIDwvbW9kdWxlPgotCi0KLSAgICA8bW9kdWxlIG5hbWU9IlVwcGVyRWxsIi8+Ci0KLSAgPC9tb2R1bGU+Ci0KLTwvbW9kdWxlPgpkaWZmIC0tZ2l0IGEvb3RoZXIvY2hlY2tzdHlsZS1ydWxlcy9zcmMvbWFpbi9yZXNvdXJjZXMvdG9iYWdvL2NoZWNrc3R5bGUueG1sIGIvb3RoZXIvY2hlY2tzdHlsZS1ydWxlcy9zcmMvbWFpbi9yZXNvdXJjZXMvdG9iYWdvL2NoZWNrc3R5bGUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MzE1NzJkLi4wMDAwMDAwCi0tLSBhL290aGVyL2NoZWNrc3R5bGUtcnVsZXMvc3JjL21haW4vcmVzb3VyY2VzL3RvYmFnby9jaGVja3N0eWxlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI1MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhLS0gCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPCFET0NUWVBFIG1vZHVsZSBQVUJMSUMKLSAgICAiLS8vUHVwcHkgQ3Jhd2wvL0RURCBDaGVjayBDb25maWd1cmF0aW9uIDEuMi8vRU4iCi0gICAgImh0dHA6Ly93d3cucHVwcHljcmF3bC5jb20vZHRkcy9jb25maWd1cmF0aW9uXzFfMi5kdGQiPgotCi08IS0tCi0KLSAgQ2hlY2tzdHlsZSBjb25maWd1cmF0aW9uIHRoYXQgY2hlY2tzIHRoZSBzdW4gY29kaW5nIGNvbnZlbnRpb25zIGZyb206Ci0KLSAgICAtIHRoZSBKYXZhIExhbmd1YWdlIFNwZWNpZmljYXRpb24gYXQKLSAgICAgIGh0dHA6Ly9qYXZhLnN1bi5jb20vZG9jcy9ib29rcy9qbHMvc2Vjb25kX2VkaXRpb24vaHRtbC9pbmRleC5odG1sCi0KLSAgICAtIHRoZSBTdW4gQ29kZSBDb252ZW50aW9ucyBhdCBodHRwOi8vamF2YS5zdW4uY29tL2RvY3MvY29kZWNvbnYvCi0KLSAgICAtIHRoZSBKYXZhZG9jIGd1aWRlbGluZXMgYXQKLSAgICAgIGh0dHA6Ly9qYXZhLnN1bi5jb20vajJzZS9qYXZhZG9jL3dyaXRpbmdkb2Njb21tZW50cy9pbmRleC5odG1sCi0KLSAgICAtIHRoZSBKREsgQXBpIGRvY3VtZW50YXRpb24gaHR0cDovL2phdmEuc3VuLmNvbS9qMnNlL2RvY3MvYXBpL2luZGV4Lmh0bWwKLQotICAgIC0gc29tZSBiZXN0IHByYWN0aWNlcwotCi0gIENoZWNrc3R5bGUgaXMgdmVyeSBjb25maWd1cmFibGUuIEJlIHN1cmUgdG8gcmVhZCB0aGUgZG9jdW1lbnRhdGlvbiBhdAotICBodHRwOi8vY2hlY2tzdHlsZS5zZi5uZXQgKG9yIGluIHlvdXIgZG93bmxvYWRlZCBkaXN0cmlidXRpb24pLgotCi0gIE1vc3QgQ2hlY2tzIGFyZSBjb25maWd1cmFibGUsIGJlIHN1cmUgdG8gY29uc3VsdCB0aGUgZG9jdW1lbnRhdGlvbi4KLQotICBUbyBjb21wbGV0ZWx5IGRpc2FibGUgYSBjaGVjaywganVzdCBjb21tZW50IGl0IG91dCBvciBkZWxldGUgaXQgZnJvbSB0aGUgZmlsZS4KLQotICBGaW5hbGx5LCBpdCBpcyB3b3J0aCByZWFkaW5nIHRoZSBkb2N1bWVudGF0aW9uLgotCi0tLT4KLQotPG1vZHVsZSBuYW1lPSJDaGVja2VyIj4KLQotICAgIDwhLS0gQ2hlY2tzIHRoYXQgYSBwYWNrYWdlLmh0bWwgZmlsZSBleGlzdHMgZm9yIGVhY2ggcGFja2FnZS4gICAgIC0tPgotICAgIDwhLS0gU2VlIGh0dHA6Ly9jaGVja3N0eWxlLnNmLm5ldC9jb25maWdfamF2YWRvYy5odG1sI1BhY2thZ2VIdG1sIC0tPgotCi0gICAgPCEtLSBDaGVja3Mgd2hldGhlciBmaWxlcyBlbmQgd2l0aCBhIG5ldyBsaW5lLiAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotICAgIDwhLS0gU2VlIGh0dHA6Ly9jaGVja3N0eWxlLnNmLm5ldC9jb25maWdfbWlzYy5odG1sI05ld2xpbmVBdEVuZE9mRmlsZSAtLT4KLSAgICA8bW9kdWxlIG5hbWU9Ik5ld2xpbmVBdEVuZE9mRmlsZSIvPgotCi0gICAgPCEtLSBDaGVja3MgdGhhdCBwcm9wZXJ0eSBmaWxlcyBjb250YWluIHRoZSBzYW1lIGtleXMuICAgICAgICAgLS0+Ci0gICAgPCEtLSBTZWUgaHR0cDovL2NoZWNrc3R5bGUuc2YubmV0L2NvbmZpZ19taXNjLmh0bWwjVHJhbnNsYXRpb24gLS0+Ci0gICAgPG1vZHVsZSBuYW1lPSJUcmFuc2xhdGlvbiIvPgotCi0KLSAgICA8bW9kdWxlIG5hbWU9IlRyZWVXYWxrZXIiPgotCi0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJjYWNoZUZpbGUiIHZhbHVlPSIke2NoZWNrc3R5bGUuY2FjaGUuZmlsZX0iLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9ImNoYXJzZXQiIHZhbHVlPSJVVEYtOCIvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFiV2lkdGgiIHZhbHVlPSIyIi8+Ci0KLSAgICAgICAgPCEtLSBDaGVja3MgZm9yIEphdmFkb2MgY29tbWVudHMuICAgICAgICAgICAgICAgICAgICAgLS0+Ci0gICAgICAgIDwhLS0gU2VlIGh0dHA6Ly9jaGVja3N0eWxlLnNmLm5ldC9jb25maWdfamF2YWRvYy5odG1sCi0gICAgICAgIDxtb2R1bGUgbmFtZT0iSmF2YWRvY01ldGhvZCIvPgotICAgICAgICA8bW9kdWxlIG5hbWU9IkphdmFkb2NUeXBlIi8+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iSmF2YWRvY1ZhcmlhYmxlIi8+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iSmF2YWRvY1N0eWxlIi8+ICAgLS0+Ci0KLQotCi0KLSAgICAgICAgPCEtLSBDaGVja3MgZm9yIE5hbWluZyBDb252ZW50aW9ucy4gICAgICAgICAgICAgICAgICAtLT4KLSAgICAgICAgPCEtLSBTZWUgaHR0cDovL2NoZWNrc3R5bGUuc2YubmV0L2NvbmZpZ19uYW1pbmcuaHRtbCAtLT4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJDb25zdGFudE5hbWUiLz4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJMb2NhbEZpbmFsVmFyaWFibGVOYW1lIi8+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iTG9jYWxWYXJpYWJsZU5hbWUiLz4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJNZW1iZXJOYW1lIi8+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iTWV0aG9kTmFtZSIvPgotICAgICAgICA8bW9kdWxlIG5hbWU9IlBhY2thZ2VOYW1lIi8+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iUGFyYW1ldGVyTmFtZSIvPgotICAgICAgICA8bW9kdWxlIG5hbWU9IlN0YXRpY1ZhcmlhYmxlTmFtZSIvPgotICAgICAgICA8bW9kdWxlIG5hbWU9IlR5cGVOYW1lIi8+Ci0KLQotCi0KLSAgICAgICAgPCEtLSBDaGVja3MgZm9yIEhlYWRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotICAgICAgICA8IS0tIFNlZSBodHRwOi8vY2hlY2tzdHlsZS5zZi5uZXQvY29uZmlnX2hlYWRlci5odG1sICAgLS0+Ci0gICAgICAgIDwhLS0gPG1vZHVsZSBuYW1lPSJIZWFkZXIiPiAtLT4KLSAgICAgICAgICAgIDwhLS0gVGhlIGZvbGxvdyBwcm9wZXJ0eSB2YWx1ZSBkZW1vbnN0cmF0ZXMgdGhlIGFiaWxpdHkgICAgIC0tPgotICAgICAgICAgICAgPCEtLSB0byBoYXZlIGFjY2VzcyB0byBBTlQgcHJvcGVydGllcy4gSW4gdGhpcyBjYXNlIGl0IHVzZXMgLS0+Ci0gICAgICAgICAgICA8IS0tIHRoZSAke2Jhc2VkaXJ9IHByb3BlcnR5IHRvIGFsbG93IENoZWNrc3R5bGUgdG8gYmUgcnVuICAtLT4KLSAgICAgICAgICAgIDwhLS0gZnJvbSBhbnkgZGlyZWN0b3J5IHdpdGhpbiBhIHByb2plY3QuIFNlZSBwcm9wZXJ0eSAgICAgIC0tPgotICAgICAgICAgICAgPCEtLSBleHBhbnNpb24sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0gICAgICAgICAgICA8IS0tIGh0dHA6Ly9jaGVja3N0eWxlLnNmLm5ldC9jb25maWcuaHRtbCNwcm9wZXJ0aWVzICAgICAgICAtLT4KLSAgICAgICAgICAgIDwhLS0gPHByb3BlcnR5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotICAgICAgICAgICAgPCEtLSAgICAgbmFtZT0iaGVhZGVyRmlsZSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0gICAgICAgICAgICA8IS0tICAgICB2YWx1ZT0iJHtiYXNlZGlyfS9qYXZhLmhlYWRlciIvPiAtLT4KLSAgICAgICAgICAgIDwhLS0gRm9sbG93aW5nIGludGVycHJldHMgdGhlIGhlYWRlciBmaWxlIGFzIHJlZ3VsYXIgZXhwcmVzc2lvbnMuIC0tPgotICAgICAgICA8IS0tIDwvbW9kdWxlPiAtLT4KLQotICAgICAgICAgPG1vZHVsZSBuYW1lPSJSZWdleHBIZWFkZXIiPgotICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iaGVhZGVyRmlsZSIgdmFsdWU9IiR7Y2hlY2tzdHlsZS5oZWFkZXIuZmlsZX0iLz4KLSAgICAgICAgICAgICA8IS0tPHByb3BlcnR5IG5hbWU9ImhlYWRlciIgdmFsdWU9Il5wYWNrYWdlIFxuXiRcbi9cKiRcbl4gXCogQ29weXJpZ2h0IChcZFxkXGRcZC0pP1xkXGRcZFxkIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4kXG5eIFwqJFxuXiBcKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wIFwodGhlICZxdW90O0xpY2Vuc2UmcXVvdDtcKVw7JFxuXiBcKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuJFxuXiBcKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQkXG5eIFwqJFxuXiBcKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCRcbl4gXCokXG5eIFwqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUkXG5eIFwqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICZxdW90O0FTIElTJnF1b3Q7IEJBU0lTLCRcbl4gXCogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuJFxuXiBcKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kJFxuXiBcKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4kXG5eIFwqLyRcbl4kIi8+LS0+Ci0gICAgICAgICA8L21vZHVsZT4KLQotCi0KLQotCi0gICAgICAgIDwhLS0gQ2hlY2tzIGZvciBpbXBvcnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0gICAgICAgIDwhLS0gU2VlIGh0dHA6Ly9jaGVja3N0eWxlLnNmLm5ldC9jb25maWdfaW1wb3J0Lmh0bWwgLS0+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iQXZvaWRTdGFySW1wb3J0Ii8+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iSWxsZWdhbEltcG9ydCIvPiA8IS0tIGRlZmF1bHRzIHRvIHN1bi4qIHBhY2thZ2VzIC0tPgotICAgICAgICA8bW9kdWxlIG5hbWU9IlJlZHVuZGFudEltcG9ydCIvPgotICAgICAgICA8bW9kdWxlIG5hbWU9IlVudXNlZEltcG9ydHMiLz4KLQotCi0gICAgICAgIDwhLS0gQ2hlY2tzIGZvciBTaXplIFZpb2xhdGlvbnMuICAgICAgICAgICAgICAgICAgICAtLT4KLSAgICAgICAgPCEtLSBTZWUgaHR0cDovL2NoZWNrc3R5bGUuc2YubmV0L2NvbmZpZ19zaXplcy5odG1sIC0tPgotICAgICAgICA8bW9kdWxlIG5hbWU9IkZpbGVMZW5ndGgiLz4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJMaW5lTGVuZ3RoIj4KLSAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ibWF4IiB2YWx1ZT0iMTIwIi8+Ci0gICAgICAgIDwvbW9kdWxlPgotICAgICAgICA8IS0tPG1vZHVsZSBuYW1lPSJNZXRob2RMZW5ndGgiLz4tLT4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJQYXJhbWV0ZXJOdW1iZXIiPgotICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJtYXgiIHZhbHVlPSIxNSIvPgotICAgICAgICA8L21vZHVsZT4KLQotCi0gICAgICAgIDwhLS0gQ2hlY2tzIGZvciB3aGl0ZXNwYWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotICAgICAgICA8IS0tIFNlZSBodHRwOi8vY2hlY2tzdHlsZS5zZi5uZXQvY29uZmlnX3doaXRlc3BhY2UuaHRtbCAtLT4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJFbXB0eUZvckl0ZXJhdG9yUGFkIi8+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iTWV0aG9kUGFyYW1QYWQiLz4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJOb1doaXRlc3BhY2VBZnRlciIvPgotICAgICAgICA8bW9kdWxlIG5hbWU9Ik5vV2hpdGVzcGFjZUJlZm9yZSIvPgotICAgICAgICA8bW9kdWxlIG5hbWU9Ik9wZXJhdG9yV3JhcCIvPgotICAgICAgICA8bW9kdWxlIG5hbWU9IlBhcmVuUGFkIi8+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iVHlwZWNhc3RQYXJlblBhZCIvPgotICAgICAgICA8bW9kdWxlIG5hbWU9IlRhYkNoYXJhY3RlciIvPgotICAgICAgICA8bW9kdWxlIG5hbWU9IldoaXRlc3BhY2VBZnRlciIvPgotICAgICAgICA8IS0tPG1vZHVsZSBuYW1lPSJXaGl0ZXNwYWNlQXJvdW5kIi8+LS0+Ci0KLSAgICAgICAgPCEtLSBNb2RpZmllciBDaGVja3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLSAgICAgICAgPCEtLSBTZWUgaHR0cDovL2NoZWNrc3R5bGUuc2YubmV0L2NvbmZpZ19tb2RpZmllcnMuaHRtbCAtLT4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJNb2RpZmllck9yZGVyIi8+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iUmVkdW5kYW50TW9kaWZpZXIiLz4KLQotCi0gICAgICAgIDwhLS0gQ2hlY2tzIGZvciBibG9ja3MuIFlvdSBrbm93LCB0aG9zZSB7fSdzICAgICAgICAgLS0+Ci0gICAgICAgIDwhLS0gU2VlIGh0dHA6Ly9jaGVja3N0eWxlLnNmLm5ldC9jb25maWdfYmxvY2tzLmh0bWwgLS0+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iQXZvaWROZXN0ZWRCbG9ja3MiPgotICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJhbGxvd0luU3dpdGNoQ2FzZSIgdmFsdWU9InRydWUiLz4KLSAgICAgICAgPC9tb2R1bGU+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iRW1wdHlCbG9jayI+Ci0gICAgICAgICAgPHByb3BlcnR5IG5hbWU9Im9wdGlvbiIgdmFsdWU9InRleHQiLz4KLSAgICAgICAgICA8cHJvcGVydHkgbmFtZT0idG9rZW5zIiB2YWx1ZT0iTElURVJBTF9DQVRDSCIvPgotICAgICAgICA8L21vZHVsZT4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJMZWZ0Q3VybHkiLz4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJOZWVkQnJhY2VzIi8+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iUmlnaHRDdXJseSIvPgotCi0KLSAgICAgICAgPCEtLSBDaGVja3MgZm9yIGNvbW1vbiBjb2RpbmcgcHJvYmxlbXMgICAgICAgICAgICAgICAtLT4KLSAgICAgICAgPCEtLSBTZWUgaHR0cDovL2NoZWNrc3R5bGUuc2YubmV0L2NvbmZpZ19jb2RpbmcuaHRtbCAtLT4KLSAgICAgICAgPCEtLSA8bW9kdWxlIG5hbWU9IkF2b2lkSW5saW5lQ29uZGl0aW9uYWxzIi8+IC0tPgotICAgICAgICA8bW9kdWxlIG5hbWU9IkNvdmFyaWFudEVxdWFscyIvPgotICAgICAgICA8bW9kdWxlIG5hbWU9IkRvdWJsZUNoZWNrZWRMb2NraW5nIi8+ICAgIDwhLS0gTVkgRkFWT1VSSVRFIC0tPgotICAgICAgICA8IS0tPG1vZHVsZSBuYW1lPSJFbXB0eVN0YXRlbWVudCIvPi0tPgotICAgICAgICA8bW9kdWxlIG5hbWU9IkVxdWFsc0hhc2hDb2RlIi8+Ci0gICAgICAgIDwhLS1tb2R1bGUgbmFtZT0iSGlkZGVuRmllbGQiPgotICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJpZ25vcmVTZXR0ZXIiIHZhbHVlPSJ0cnVlIiAvPgotICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSIgaWdub3JlQ29uc3RydWN0b3JQYXJhbWV0ZXIiIHZhbHVlPSJ0cnVlIiAvPgotICAgICAgICA8L21vZHVsZS0tPgotICAgICAgICA8bW9kdWxlIG5hbWU9IklsbGVnYWxJbnN0YW50aWF0aW9uIj4KLSAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImNsYXNzZXMiIHZhbHVlPSJqYXZhLmxhbmcuQm9vbGVhbiwgamF2YS5sYW5nLlN0cmluZyIvPgotICAgICAgICA8L21vZHVsZT4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJJbm5lckFzc2lnbm1lbnQiLz4KLSAgICAgICAgPCEtLSA8bW9kdWxlIG5hbWU9Ik1hZ2ljTnVtYmVyIi8+IC0tPgotICAgICAgICA8bW9kdWxlIG5hbWU9Ik1pc3NpbmdTd2l0Y2hEZWZhdWx0Ii8+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iUmVkdW5kYW50VGhyb3dzIj4KLSAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iYWxsb3dVbmNoZWNrZWQiIHZhbHVlPSJ0cnVlIi8+Ci0gICAgICAgIDwvbW9kdWxlPgotICAgICAgICA8bW9kdWxlIG5hbWU9IlN0cmluZ0xpdGVyYWxFcXVhbGl0eSIvPgotICAgICAgICA8bW9kdWxlIG5hbWU9IlNpbXBsaWZ5Qm9vbGVhbkV4cHJlc3Npb24iLz4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJTaW1wbGlmeUJvb2xlYW5SZXR1cm4iLz4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJTdXBlckNsb25lIi8+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iU3VwZXJGaW5hbGl6ZSIvPgotICAgICAgICA8bW9kdWxlIG5hbWU9IklsbGVnYWxUaHJvd3MiLz4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJQYWNrYWdlRGVjbGFyYXRpb24iLz4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJNdWx0aXBsZVZhcmlhYmxlRGVjbGFyYXRpb25zIi8+Ci0KLSAgICAgICAgPCEtLSBDaGVja3MgZm9yIGNsYXNzIGRlc2lnbiAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLSAgICAgICAgPCEtLSBTZWUgaHR0cDovL2NoZWNrc3R5bGUuc2YubmV0L2NvbmZpZ19kZXNpZ24uaHRtbCAtLT4KLSAgICAgICAgPCEtLSBtb2R1bGUgbmFtZT0iRGVzaWduRm9yRXh0ZW5zaW9uIi8gLS0+Ci0gICAgICAgIDwhLS0gbW9kdWxlIG5hbWU9IkZpbmFsQ2xhc3MiLyAtLT4KLSAgICAgICAgPCEtLSBtb2R1bGUgbmFtZT0iSGlkZVV0aWxpdHlDbGFzc0NvbnN0cnVjdG9yIi8gLS0+Ci0KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJJbnRlcmZhY2VJc1R5cGUiLz4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJWaXNpYmlsaXR5TW9kaWZpZXIiLz4KLQotCi0gICAgICAgIDwhLS0gTWlzY2VsbGFuZW91cyBvdGhlciBjaGVja3MuICAgICAgICAgICAgICAgICAgIC0tPgotICAgICAgICA8IS0tIFNlZSBodHRwOi8vY2hlY2tzdHlsZS5zZi5uZXQvY29uZmlnX21pc2MuaHRtbCAtLT4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJBcnJheVR5cGVTdHlsZSIvPgotICAgICAgICA8IS0tPG1vZHVsZSBuYW1lPSJGaW5hbFBhcmFtZXRlcnMiLz4gLS0+Ci0gICAgICAgIDwhLS0gTGluZSB3aXRoIFRyYWlsaW5nIFNwYWNlcyAoZGlzYWJsZWQgYXMgaXQncyB0byBub2lzeSkKLSAgICAgICAgPG1vZHVsZSBuYW1lPSJHZW5lcmljSWxsZWdhbFJlZ2V4cCI+Ci0gICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImZvcm1hdCIgdmFsdWU9IlxzKyQiLz4KLSAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ibWVzc2FnZSIgdmFsdWU9IkxpbmUgaGFzIHRyYWlsaW5nIHNwYWNlcy4iLz4KLSAgICAgICAgPC9tb2R1bGU+Ci0gICAgICAgIC0tPgotCi0gICAgICAgIDwhLS0gTGV0IHRvZG8gcGx1Z2luIGhhbmRsZSB0aGlzLgotICAgICAgICA8bW9kdWxlIG5hbWU9IlRvZG9Db21tZW50Ii8+Ci0gICAgICAgIC0tPgotCi0gICAgICAgIDxtb2R1bGUgbmFtZT0iR2VuZXJpY0lsbGVnYWxSZWdleHAiPgotIAkgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJmb3JtYXQiIHZhbHVlPSIoKHB1YmxpYyl8KHByb3RlY3RlZCkpXHMrdm9pZFxzK2ZpbmFsaXplXChccypcKSIvPgotCSAgICAgICAgPHByb3BlcnR5IG5hbWU9Im1lc3NhZ2UiIHZhbHVlPSJBdm9pZCBmaW5hbGl6ZXJzIi8+Ci0gICAgICAgIDwvbW9kdWxlPgotCSAgICAgIDwhLS0gTm8gZGlyZWN0IHByaW50aW5nIHRvIFN5c3RlbS5vdXQgb3IgU3lzdGVtLmVyciAtLT4KLQotCi0gCSAgICAgIDxtb2R1bGUgbmFtZT0iR2VuZXJpY0lsbGVnYWxSZWdleHAiPgotIAkgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJmb3JtYXQiIHZhbHVlPSJTeXN0ZW1cLihvdXR8ZXJyKVwuIi8+Ci0gCSAgICAgICAgPHByb3BlcnR5IG5hbWU9Im1lc3NhZ2UiIHZhbHVlPSJEb24ndCB3cml0ZSBkaXJlY3RseSB0byBTeXN0ZW0ub3V0IG91ciBTeXN0ZW0uZXJyIi8+Ci0gCSAgICAgIDwvbW9kdWxlPgotCSAJICAgIDwhLS0gTm8gQGF1dGhvciB0YWdzIC0tPgotIAkgICAgICA8bW9kdWxlIG5hbWU9IkdlbmVyaWNJbGxlZ2FsUmVnZXhwIj4KLSAJICAgICAgICA8cHJvcGVydHkgbmFtZT0iZm9ybWF0IiB2YWx1ZT0iQGF1dGhvciIvPgotIAkgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJtZXNzYWdlIiAJdmFsdWU9Ik5vIEBhdXRob3IgdGFnIGFsbG93ZWQiLz4KLSAJICAgICAgPC9tb2R1bGU+Ci0KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJHZW5lcmljSWxsZWdhbFJlZ2V4cCI+Ci0gCSAgICAgICAgPHByb3BlcnR5IG5hbWU9ImZvcm1hdCIgdmFsdWU9InN0csOkaGxla3JldXplbiIvPgotIAkgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJtZXNzYWdlIiAJdmFsdWU9Ik5vIHN0csOkaGxla3JldXplbiBhbGxvd2VkIi8+Ci0gCSAgICAgIDwvbW9kdWxlPgotCi0gICAgICAgIDxtb2R1bGUgbmFtZT0iVXBwZXJFbGwiLz4KLQotICAgIDwvbW9kdWxlPgotCi08L21vZHVsZT4KZGlmZiAtLWdpdCBhL290aGVyL25vcm1hbGl6ZXIvUkVBRE1FLnR4dCBiL290aGVyL25vcm1hbGl6ZXIvUkVBRE1FLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmFlMWI2NC4uMDAwMDAwMAotLS0gYS9vdGhlci9ub3JtYWxpemVyL1JFQURNRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi1UaGlzIHByb2plY3QgaXMgYSBzaW1wbGUgY29tbWFuZC1saW5lIHRvb2wgdGhhdCAibm9ybWFsaXNlcyIgYSBKU1AgVExEIGZpbGUgb3IgYSBKU0YgZmFjZXMtY29uZmlnIGZpbGUuCi1BZnRlciB0d28gZmlsZXMgaGF2ZSBiZWVuICJub3JtYWxpemVkIiwgdGhleSBjYW4gdGhlbiBiZSBjb21wYXJlZCB3aXRoIGEgc2ltcGxlICJkaWZmIiB0b29sIHRvIHNlZSB3aGF0Ci1yZWFsIGRpZmZlcmVuY2VzIChpZiBhbnkpIHRoZXJlIGFyZSBiZXR3ZWVuIHRoZSB0d28gb3JpZ2luYWwgZmlsZXMuCi0KLUFsbCAibm9uLWNyaXRpY2FsIiBkYXRhLCBsaWtlIGNvbW1lbnRzIGFuZCAiZGVzY3JpcHRpb24iIGZpZWxkcyBhcmUgZGlzY2FyZGVkLiAKLUFsbCB4bWwgZWxlbWVudHMgYW5kIGF0dHJpYnV0ZXMgYXJlIHRoZW4gc29ydGVkIGludG8gYSBjb25zaXN0ZW50IG9yZGVyOgotICogZWxlbWVudHMgd2l0aCBqdXN0IHRleHQgY29udGVudCBhcmUgc29ydGVkIGJlZm9yZSBvdGhlcnMuCi0gKiBlbGVtZW50cyBhcmUgc29ydGVkIGFscGhhYmV0aWNhbGx5IGJ5IGVsZW1lbnQgbmFtZQotICogZWxlbWVudHMgd2l0aCBzYW1lIG5hbWUgYXJlIHNvcnRlZCBhY2NvcmRpbmcgdG8gdGhlIHRleHQgY29udGVudCBvZiB0aGVpciBjaGlsZCBub2RlcwotICAgKG1lYW5zIHRoYXQgPHRhZz48bmFtZT5mb288L25hbWU+PC90YWc+IGlzIHNvcnRlZCBvbiB0aGUgY29udGVudCBvZiB0aGUgbmFtZSBjaGlsZCkuCi0gCi1UaGlzIHRvb2wgaXMgcGFydGx5IGEgZ2VuZXJpYyBYTUwgIm5vcm1hbGlzZXIiLCBidXQgdGFrZXMgYSBmZXcgc2hvcnRjdXRzIHRoYXQgd29yayBzcGVjaWZpY2FsbHkKLW9uIFRMRCBhbmQgZmFjZXMtY29uZmlnIGZpbGVzLiBJdCBjb3VsZCBwb3NzaWJseSBiZSBleHBhbmRlZCB0byBzdXBwb3J0IGNvbXBhcmlzb24gb2Ygb3RoZXIgeG1sCi1maWxlcywgYnV0IHdhc24ndCBzcGVjaWZpY2FsbHkgZGVzaWduZWQgZm9yIHRoYXQgcHVycG9zZS4gQW5kIGl0IGlzIGRlZmluaXRlbHkgYSAiaGFjayI7IGEgdG9vbAotdGhhdCBpcyBqdXN0IGNvbXBsZXggZW5vdWdoIGZvciBpdHMgcHVycG9zZSBidXQgbm90IGVsZWdhbnQuIEZvciBleGFtcGxlOgotKiAibWl4ZWQgY29udGVudCIgZWxlbWVudHMgYXJlIGp1c3Qgbm90IHN1cHBvcnRlZAotKiB4bWwgbmFtZXNwYWNlcyBhcmUgbm90IGhhbmRsZWQgcHJvcGVybHkKLSogZXh0ZXJuYWwgZHRkcyBhbmQgZW50aXR5IHJlZmVyZW5jZXMgYXJlIGlnbm9yZWQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vdGhlci9ub3JtYWxpemVyL25vcm0gYi9vdGhlci9ub3JtYWxpemVyL25vcm0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDZjZmU1NDIuLjAwMDAwMDAKLS0tIGEvb3RoZXIvbm9ybWFsaXplci9ub3JtCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotamF2YSAtY3AgdGFyZ2V0L2NsYXNzZXMgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubm9ybWFsaXplci5Ob3JtYWxpemVyICRACmRpZmYgLS1naXQgYS9vdGhlci9ub3JtYWxpemVyL3BvbS54bWwgYi9vdGhlci9ub3JtYWxpemVyL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlNjFkNDYuLjAwMDAwMDAKLS0tIGEvb3RoZXIvbm9ybWFsaXplci9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSB1bmRlciB0aGUgTGljZW5zZS4KLS0tPjxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgotICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0gIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzPC9ncm91cElkPgotICA8YXJ0aWZhY3RJZD5ub3JtYWxpemVyPC9hcnRpZmFjdElkPgotICA8cGFja2FnaW5nPmphcjwvcGFja2FnaW5nPgotICA8dmVyc2lvbj4xLjAtU05BUFNIT1Q8L3ZlcnNpb24+Ci0gIDxuYW1lPm5vcm1hbGl6ZXI8L25hbWU+Ci0gIDx1cmw+aHR0cDovL21hdmVuLmFwYWNoZS5vcmc8L3VybD4KLSAgPGRlcGVuZGVuY2llcz4KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPmp1bml0PC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+anVuaXQ8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4zLjguMTwvdmVyc2lvbj4KLSAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gIDwvZGVwZW5kZW5jaWVzPgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvb3RoZXIvbm9ybWFsaXplci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL25vcm1hbGl6ZXIvQXR0cmlidXRlLmphdmEgYi9vdGhlci9ub3JtYWxpemVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbm9ybWFsaXplci9BdHRyaWJ1dGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmYyYTc3ZC4uMDAwMDAwMAotLS0gYS9vdGhlci9ub3JtYWxpemVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbm9ybWFsaXplci9BdHRyaWJ1dGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubm9ybWFsaXplcjsKLQotaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7Ci0KLXB1YmxpYyBjbGFzcyBBdHRyaWJ1dGUgaW1wbGVtZW50cyBDb21wYXJhYmxlCi17Ci0gICAgU3RyaW5nIG5hbWU7Ci0gICAgU3RyaW5nIHZhbHVlOwotCi0gICAgcHVibGljIEF0dHJpYnV0ZShTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKQotICAgIHsKLSAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHByaW50KFByaW50V3JpdGVyIHdyaXRlcikKLSAgICB7Ci0gICAgICAgIHdyaXRlci5hcHBlbmQobmFtZSk7Ci0gICAgICAgIHdyaXRlci5hcHBlbmQoIj0iKTsKLSAgICAgICAgd3JpdGVyLmFwcGVuZCgiXCIiKTsKLSAgICAgICAgd3JpdGVyLmFwcGVuZCh2YWx1ZSk7Ci0gICAgICAgIHdyaXRlci5hcHBlbmQoIlwiIik7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBjb21wYXJlVG8oT2JqZWN0IG90aGVyKQotICAgIHsKLSAgICAgICAgQXR0cmlidXRlIG90aGVyQXR0ciA9IChBdHRyaWJ1dGUpIG90aGVyOwotICAgICAgICByZXR1cm4gbmFtZS5jb21wYXJlVG8ob3RoZXJBdHRyLm5hbWUpOwotICAgIH0gICAgCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3RoZXIvbm9ybWFsaXplci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL25vcm1hbGl6ZXIvRWxlbWVudC5qYXZhIGIvb3RoZXIvbm9ybWFsaXplci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL25vcm1hbGl6ZXIvRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Yjk2NTYxLi4wMDAwMDAwCi0tLSBhL290aGVyL25vcm1hbGl6ZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9ub3JtYWxpemVyL0VsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwNiArMCwwIEBACi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm5vcm1hbGl6ZXI7Ci0KLWltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogUmVwcmVzZW50IGFuIFhNTCBlbGVtZW50IHdoaWNoIGhhcyBlaXRoZXIgYm9keSB0ZXh0IG9yIGEgbGlzdCBvZiBjaGlsZCBlbGVtZW50cy4KLSAqIDxwPgotICogTWl4ZWQtY29udGVudCBlbGVtZW50cyBhcmUgbm90IHN1cHBvcnRlZC4gTmFtZXNwYWNlcyBhcmUgaWdub3JlZC4KLSAqLwotcHVibGljIGNsYXNzIEVsZW1lbnQgaW1wbGVtZW50cyBDb21wYXJhYmxlCi17Ci0gICAgc3RhdGljIFN0cmluZ1tdIFNPUlRfUFJJT1JJVFlfSElHSCA9IG5ldyBTdHJpbmdbXQotICAgIHsKLSAgICAgICAgIm5hbWUiLAotICAgIH07Ci0gICAgCi0gICAgc3RhdGljIFN0cmluZ1tdIFNPUlRfUFJJT1JJVFlfTE9XID0gbmV3IFN0cmluZ1tdCi0gICAgewotICAgICAgICAiY2xhc3MiCi0gICAgfTsKLQotICAgIFN0cmluZyBuYW1lOwotICAgIEF0dHJpYnV0ZVtdIGF0dHJpYnV0ZXM7Ci0gICAgU3RyaW5nIGNvbnRlbnQ7Ci0gICAgTGlzdCBjaGlsZHJlbiA9IG5ldyBMaW5rZWRMaXN0KCk7Ci0gICAgCi0gICAgLy8gVmFsdWUgdXNlZCB0byBjaG9vc2Ugb3JkZXJpbmcgZm9yIHR3byBlbGVtZW50cyB3aXRoIGRpZmZlcmVudCBuYW1lcy4KLSAgICAvLyBFbGVtZW50cyB3aG9zZSBuYW1lIG1hdGNoZXMgYSAiaGlnaCBwcmlvcml0eSIgcGF0dGVybiBhcmUgb3V0cHV0IGJlZm9yZQotICAgIC8vIGVsZW1lbnRzIHdpdGggIm5vcm1hbCIgbmFtZXMsIHdoaWNoIGFyZSBvdXRwdXQgYmVmb3JlIGVsZW1lbnRzIHdob3NlCi0gICAgLy8gbmFtZXMgbWF0Y2ggYSAibG93IHByaW9yaXR5IiBwYXR0ZXJuLgotICAgIGludCBzb3J0UHJpb3JpdHkgPSAwOwotCi0gICAgLy8gVmFsdWUgdXNlZCB0byBjaG9vc2Ugb3JkZXJpbmcgZm9yIHR3byBlbGVtZW50cyB0aGF0IGhhdmUgdGhlIHNhbWUKLSAgICAvLyBuYW1lIGFuZCBubyB0ZXh0IGNvbnRlbnQuIFRoaXMgaXMgYnVpbHQgZnJvbSB0aGUgdGV4dCBjb250ZW50IG9mCi0gICAgLy8gdGhlIChvcmRlcmVkKSBzZXQgb2YgY2hpbGQgZWxlbWVudHMsIHNvIHRoYXQgdHdvIG5vZGVzIHdpdGggc2ltaWxhcgotICAgIC8vIGNoaWxkIGVsZW1lbnRzIGdldCBzb3J0ZWQgaW4gdGhlIHNhbWUgb3JkZXIuCi0gICAgU3RyaW5nIHNvcnRLZXkgPSBudWxsOwotCi0gICAgLy8gVGhlIGF0dHJpYnV0ZXMgYXJyYXkgaXMgZXhwZWN0ZWQgdG8gYmUgc29ydGVkIGJlZm9yZSBwYXNzaW5nIGluIGhlcmUuCi0gICAgcHVibGljIEVsZW1lbnQoU3RyaW5nIG5hbWUsIEF0dHJpYnV0ZVtdIGF0dHJpYnV0ZXMpCi0gICAgewotICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOwotICAgICAgICB0aGlzLmF0dHJpYnV0ZXMgPSBhdHRyaWJ1dGVzOwotICAgICAgICBzb3J0UHJpb3JpdHkgPSBnZXRTb3J0UHJpb3JpdHkobmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Q29udGVudChTdHJpbmcgY29udGVudCkKLSAgICB7Ci0gICAgICAgIHRoaXMuY29udGVudCA9IGNvbnRlbnQ7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIGFkZENoaWxkKEVsZW1lbnQgY2hpbGQpCi0gICAgewotICAgICAgICBjaGlsZHJlbi5hZGQoY2hpbGQpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNvcnRDaGlsZHJlbigpCi0gICAgewotICAgICAgICBpZiAoY2hpbGRyZW4uaXNFbXB0eSgpKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBOb3RoaW5nIHRvIHNvcnQgaGVyZS4KLSAgICAgICAgICAgIGlmIChjb250ZW50ID09IG51bGwpCi0gICAgICAgICAgICAgICAgc29ydEtleSA9ICIiOyAvLyBzaG91bGQgbmV2ZXIgaGFwcGVuCi0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgc29ydEtleSA9IGNvbnRlbnQ7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBmaXJzdCBlbnN1cmUgZWFjaCBjaGlsZCBpcyBpbnRlcm5hbGx5IHNvcnRlZAotICAgICAgICBmb3IoSXRlcmF0b3IgaSA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgICAgIHsKLSAgICAgICAgICAgICgoRWxlbWVudCkgaS5uZXh0KCkpLnNvcnRDaGlsZHJlbigpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gbm93IHNvcnQgdGhlIGxpc3Qgb2YgY2hpbGRyZW4gcmVsYXRpdmUgdG8gZWFjaCBvdGhlcgotICAgICAgICBDb2xsZWN0aW9ucy5zb3J0KGNoaWxkcmVuKTsKLQotICAgICAgICAvLyBDb21wdXRlIHRoZSBzb3J0S2V5IGZvciB0aGlzIGVsZW1lbnQsIHVzZWQgd2hlbgotICAgICAgICAvLyB0d28gZWxlbWVudHMgaGF2ZSBpZGVudGljYWwgbmFtZXMgYW5kIHRoZXJlZm9yZSBuZWVkCi0gICAgICAgIC8vIHRvIGJlIG9yZGVyZWQgYWNjb3JkaW5nIHRvIHRoZSBjb250ZW50IG9mIHRoZWlyCi0gICAgICAgIC8vIGNoaWxkIGVsZW1lbnRzLgotICAgICAgICBTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICBmb3IoSXRlcmF0b3IgaSA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIEVsZW1lbnQgY2hpbGQgPSAoRWxlbWVudCkgaS5uZXh0KCk7Ci0gICAgICAgICAgICBpZiAoYnVmLmxlbmd0aCgpID09IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYnVmLmFwcGVuZCgiJiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnVmLmFwcGVuZChjaGlsZC5zb3J0S2V5KTsKLSAgICAgICAgfQotICAgICAgICBzb3J0S2V5ID0gYnVmLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcHJpbnQoUHJpbnRXcml0ZXIgd3JpdGVyLCBpbnQgaW5kZW50QW1vdW50KQotICAgIHsKLSAgICAgICAgVXRpbHMuaW5kZW50KHdyaXRlciwgaW5kZW50QW1vdW50KTsKLSAgICAgICAgd3JpdGVyLmFwcGVuZCgiPCIpOwotICAgICAgICB3cml0ZXIuYXBwZW5kKG5hbWUpOwotICAgICAgICBpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IoaW50IGk9MDsgaTxhdHRyaWJ1dGVzLmxlbmd0aDsgKytpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHdyaXRlci5hcHBlbmQoIiAiKTsKLSAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzW2ldLnByaW50KHdyaXRlcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoY29udGVudCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICB3cml0ZXIuYXBwZW5kKCI+Iik7Ci0gICAgICAgICAgICB3cml0ZXIuYXBwZW5kKGNvbnRlbnQpOwotICAgICAgICAgICAgd3JpdGVyLmFwcGVuZCgiPC8iKTsKLSAgICAgICAgICAgIHdyaXRlci5hcHBlbmQobmFtZSk7Ci0gICAgICAgICAgICB3cml0ZXIuYXBwZW5kKCI+XG4iKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChjaGlsZHJlbi5zaXplKCkgPT0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgd3JpdGVyLmFwcGVuZCgiLz5cbiIpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgd3JpdGVyLmFwcGVuZCgiPlxuIik7Ci0gICAgICAgICAgICBmb3IoSXRlcmF0b3IgaSA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBFbGVtZW50IGUgPSAoRWxlbWVudClpLm5leHQoKTsKLSAgICAgICAgICAgICAgICBlLnByaW50KHdyaXRlciwgaW5kZW50QW1vdW50KzEpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgVXRpbHMuaW5kZW50KHdyaXRlciwgaW5kZW50QW1vdW50KTsKLSAgICAgICAgICAgIHdyaXRlci5hcHBlbmQoIjwvIik7Ci0gICAgICAgICAgICB3cml0ZXIuYXBwZW5kKG5hbWUpOwotICAgICAgICAgICAgd3JpdGVyLmFwcGVuZCgiPlxuIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gYSB2YWx1ZSB0aGF0IGluZGljYXRlcyBob3cgdGhpcyBlbGVtZW50IHNob3VsZCBiZSBzb3J0ZWQgcmVsYXRpdmUgdG8KLSAgICAgKiBvdGhlciBlbGVtZW50cy4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIG1ldGhvZCBpcyBub3Qgc2FmZSB0byBjYWxsIHVudGlsIGFmdGVyIHNvcnRDaGlsZHJlbigpIGhhcyBiZWVuIGludm9rZWQuCi0gICAgICovCi0gICAgcHVibGljIGludCBjb21wYXJlVG8oT2JqZWN0IG90aGVyKQotICAgIHsKLSAgICAgICAgRWxlbWVudCBvdGhlckVsZW1lbnQgPSAoRWxlbWVudCkgb3RoZXI7Ci0KLSAgICAgICAgLy8gU29ydCB0YWdzIHdpdGgganVzdCB0ZXh0IGNvbnRlbnQgYmVmb3JlIG9uZXMgd2l0aCBjaGlsZCBlbGVtZW50cwotICAgICAgICBpZiAodGhpcy5jaGlsZHJlbi5pc0VtcHR5KCkgJiYgIW90aGVyRWxlbWVudC5jaGlsZHJlbi5pc0VtcHR5KCkpCi0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIGVsc2UgaWYgKCF0aGlzLmNoaWxkcmVuLmlzRW1wdHkoKSAmJiBvdGhlckVsZW1lbnQuY2hpbGRyZW4uaXNFbXB0eSgpKQotICAgICAgICAgICAgcmV0dXJuICsxOwotCi0gICAgICAgIGlmIChuYW1lLmVxdWFscyhvdGhlckVsZW1lbnQubmFtZSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIE9rLCB3ZSBoYXZlIHR3byB0YWdzIHdpdGggdGhlIHNhbWUgbmFtZSBhbmQgYm90aCBoYXZlIGNoaWxkIGVsZW1lbnRzLgotICAgICAgICAgICAgLy8gU29ydCBieSB0aGUgc29ydGtleSB3ZSBjb21wdXRlZCBkdXJpbmcgdGhlIHNvcnRDaGlsZHJlbiBtZXRob2QKLSAgICAgICAgICAgIHJldHVybiBzb3J0S2V5LmNvbXBhcmVUbyhvdGhlckVsZW1lbnQuc29ydEtleSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBOYW1lcyBhcmUgZGlmZmVyZW50OiBjaGVjayB3aGV0aGVyIGVpdGhlciBuYW1lIGhhcyBzcGVjaWFsIHByaW9yaXR5LgotICAgICAgICBpZiAoc29ydFByaW9yaXR5ICE9IG90aGVyRWxlbWVudC5zb3J0UHJpb3JpdHkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBvdGhlckVsZW1lbnQuc29ydFByaW9yaXR5IC0gc29ydFByaW9yaXR5OwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gT2ssIGRpZmZlcmVudCBuYW1lcyBhbmQgdGhlIHByaW9yaXR5IG9mIHRoZSBuYW1lIGlzIGVxdWFsLgotICAgICAgICAvLyBTbyBqdXN0IHNvcnQgYWxwaGFiZXRpY2FsbHkuCi0gICAgICAgIHJldHVybiBuYW1lLmNvbXBhcmVUbyhvdGhlckVsZW1lbnQubmFtZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSAicHJpb3JpdHkiIG9mIHRoaXMgbmFtZS4KLSAgICAgKiA8cD4KLSAgICAgKiBOYW1lcyB3aXRoIGhpZ2hlciBwcmlvcml0eSBhcmUgc29ydGVkIGVhcmxpZXIgaW4gdGhlIGxpc3Qgb2YgZWxlbWVudHMuCi0gICAgICogQW5kIGFzIGVsZW1lbnRzIHdpdGggZXF1YWwgbmFtZXMgYXJlIHNvcnRlZCBhY2NvcmRpbmcgdG8gdGhlIGNvbnRlbnRzCi0gICAgICogb2YgdGhlaXIgY2hpbGRyZW4sIHRoaXMgYWxzbyBhZmZlY3RzIHRoZSBzb3J0aW5nIG9yZGVyIG9mIHRoZSBwYXJlbnQKLSAgICAgKiBlbGVtZW50IG9mIGFuIGVsZW1lbnQgdGhhdCBoYXMgYSAicHJpb3JpdHkiIHZhbHVlLgotICAgICAqIDxwPgotICAgICAqIE5vcm1hbCBlbGVtZW50IG5hbWVzIGhhdmUgemVybyBwcmlvcml0eS4KLSAgICAgKi8KLSAgICBwcml2YXRlIGludCBnZXRTb3J0UHJpb3JpdHkoU3RyaW5nIGVuYW1lKQotICAgIHsKLSAgICAgICAgZm9yKGludCBpPTA7IGk8U09SVF9QUklPUklUWV9ISUdILmxlbmd0aDsgKytpKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoZW5hbWUuY29udGFpbnMoU09SVF9QUklPUklUWV9ISUdIW2ldKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyBhbHdheXMgcG9zaXRpdmUKLSAgICAgICAgICAgICAgICByZXR1cm4gU09SVF9QUklPUklUWV9ISUdILmxlbmd0aCAtIGk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IoaW50IGk9MDsgaTxTT1JUX1BSSU9SSVRZX0xPVy5sZW5ndGg7ICsraSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGVuYW1lLmNvbnRhaW5zKFNPUlRfUFJJT1JJVFlfTE9XW2ldKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyBhbHdheXMgbmVnYXRpdmUKLSAgICAgICAgICAgICAgICByZXR1cm4gaSAtIFNPUlRfUFJJT1JJVFlfTE9XLmxlbmd0aDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvb3RoZXIvbm9ybWFsaXplci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL25vcm1hbGl6ZXIvTm9ybWFsaXplci5qYXZhIGIvb3RoZXIvbm9ybWFsaXplci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL25vcm1hbGl6ZXIvTm9ybWFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMGJlOWI5Li4wMDAwMDAwCi0tLSBhL290aGVyL25vcm1hbGl6ZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9ub3JtYWxpemVyL05vcm1hbGl6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOCArMCwwIEBACi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm5vcm1hbGl6ZXI7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU3RhY2s7Ci0KLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXI7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyRmFjdG9yeTsKLQotaW1wb3J0IG9yZy54bWwuc2F4LkF0dHJpYnV0ZXM7Ci1pbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotaW1wb3J0IG9yZy54bWwuc2F4LmhlbHBlcnMuRGVmYXVsdEhhbmRsZXI7Ci0KLS8qKgotICogUmVhZCBpbnB1dCBmaWxlIGFuZCB3cml0ZSBpdCBvdXQgd2l0aCBldmVyeXRoaW5nIG5vcm1hbGl6ZWQuCi0gKi8KLXB1YmxpYyBjbGFzcyBOb3JtYWxpemVyIGV4dGVuZHMgRGVmYXVsdEhhbmRsZXIKLXsKLSAgICBTdGFjayBlbGVtZW50cyA9IG5ldyBTdGFjaygpOwotICAgIEVsZW1lbnQgcm9vdEVsZW1lbnQgPSBudWxsOwotICAgIFN0cmluZ0J1ZmZlciBjdXJyQ29udGVudCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKCBTdHJpbmdbXSBhcmdzICkgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgaWYgKGFyZ3MubGVuZ3RoIDwgMSkKLSAgICAgICAgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJVc2FnZTogQXBwIGlucHV0RmlsZSIpOwotICAgICAgICAgICAgU3lzdGVtLmV4aXQoLTEpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBuZXcgTm9ybWFsaXplcigpLnByb2Nlc3MoYXJnc1swXSk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzKFN0cmluZyBmaWxlbmFtZSkgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgU0FYUGFyc2VyRmFjdG9yeSBmYWN0b3J5ID0gU0FYUGFyc2VyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgICBTQVhQYXJzZXIgcGFyc2VyID0gZmFjdG9yeS5uZXdTQVhQYXJzZXIoKTsKLQotICAgICAgICBGaWxlIGYgPSBuZXcgRmlsZShmaWxlbmFtZSk7Ci0KLSAgICAgICAgcGFyc2VyLnBhcnNlKGYsIHRoaXMpOwotICAgICAgICByb290RWxlbWVudC5zb3J0Q2hpbGRyZW4oKTsKLSAgICAgICAgUHJpbnRXcml0ZXIgcHcgPSBuZXcgUHJpbnRXcml0ZXIoU3lzdGVtLm91dCk7Ci0gICAgICAgIHJvb3RFbGVtZW50LnByaW50KHB3LCAwKTsKLSAgICAgICAgcHcuZmx1c2goKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBBdHRyaWJ1dGVbXSBFTVBUWV9BVFRSUyA9IG5ldyBBdHRyaWJ1dGVbMF07Ci0KLSAgICAvLyBJZ25vcmUgYW55IGV4dGVybmFsIGVudGl0aWVzLiBJbiBwYXJ0aWN1bGFyLCB0aGlzIHNraXBzIHRoZSByZWFkaW5nIG9mIGR0ZHMuCi0gICAgcHVibGljIElucHV0U291cmNlIHJlc29sdmVFbnRpdHkoU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgc3lzdGVtSWQpCi0gICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU0FYRXhjZXB0aW9uCi0gICAgewotICAgICAgICBJbnB1dFN0cmVhbSBpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShuZXcgYnl0ZVswXSk7Ci0gICAgICAgIHJldHVybiBuZXcgSW5wdXRTb3VyY2UoaXMpOwotICAgIH0KLSAgICAgICAgICAgIAotICAgIHB1YmxpYyB2b2lkIHN0YXJ0RWxlbWVudChTdHJpbmcgdXJpLCBTdHJpbmcgbG9jYWxOYW1lLCBTdHJpbmcgcW5hbWUsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcykKLSAgICB7Ci0gICAgICAgIGludCBuQXR0cnMgPSBhdHRyaWJ1dGVzLmdldExlbmd0aCgpOwotICAgICAgICBMaXN0IGF0dHJMaXN0ID0gbmV3IEFycmF5TGlzdChuQXR0cnMpOwotICAgICAgICBmb3IoaW50IGk9MDsgaTxuQXR0cnM7ICsraSkgewotICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBhdHRyaWJ1dGVzLmdldFFOYW1lKGkpOwotICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gYXR0cmlidXRlcy5nZXRWYWx1ZShpKTsKLSAgICAgICAgICAgIEF0dHJpYnV0ZSBhID0gbmV3IEF0dHJpYnV0ZShuYW1lLCB2YWx1ZSk7Ci0gICAgICAgICAgICBhdHRyTGlzdC5hZGQoYSk7Ci0gICAgICAgIH0KLSAgICAgICAgQ29sbGVjdGlvbnMuc29ydChhdHRyTGlzdCk7Ci0KLSAgICAgICAgQXR0cmlidXRlW10gYXR0cnMgPSAoQXR0cmlidXRlW10pIGF0dHJMaXN0LnRvQXJyYXkoRU1QVFlfQVRUUlMpOyAKLSAgICAgICAgRWxlbWVudCBlID0gbmV3IEVsZW1lbnQocW5hbWUsIGF0dHJzKTsKLQotICAgICAgICBFbGVtZW50IHBhcmVudDsKLSAgICAgICAgaWYgKGVsZW1lbnRzLmlzRW1wdHkoKSkKLSAgICAgICAgewotICAgICAgICAgICAgcm9vdEVsZW1lbnQgPSBlOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKCFxbmFtZS5lcXVhbHMoImRlc2NyaXB0aW9uIikpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBhcmVudCA9IChFbGVtZW50KSBlbGVtZW50cy5wZWVrKCk7Ci0gICAgICAgICAgICBwYXJlbnQuYWRkQ2hpbGQoZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxlbWVudHMucHVzaChlKTsKLQotICAgICAgICAvLyBjaGVjayB3aGV0aGVyIGN1cnJDb250ZW50IGlzIGFscmVhZHkgbm9uLXdoaXRlc3BhY2UuCi0gICAgICAgIC8vIGlmIGl0IGlzLCB0aGVuIHRocm93IGFuIGV4Y2VwdGlvbiBhYm91dCAibWl4ZWQgY29udGVudCBub3Qgc3VwcG9ydGVkIgotICAgICAgICBjdXJyQ29udGVudC5zZXRMZW5ndGgoMCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZW5kRWxlbWVudChTdHJpbmcgdXJpLCBTdHJpbmcgbG9jYWxOYW1lLCBTdHJpbmcgcW5hbWUpCi0gICAgewotICAgICAgICBTdHJpbmcgcyA9IGN1cnJDb250ZW50LnRvU3RyaW5nKCkudHJpbSgpOwotICAgICAgICBpZiAoIXMuaXNFbXB0eSgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBnZXRDdXJyRWxlbWVudCgpLnNldENvbnRlbnQocyk7Ci0gICAgICAgIH0KLSAgICAgICAgY3VyckNvbnRlbnQuc2V0TGVuZ3RoKDApOwotCi0gICAgICAgIGVsZW1lbnRzLnBvcCgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGNoYXJhY3RlcnMoY2hhcltdIGNoLCBpbnQgc3RhcnQsIGludCBsZW5ndGgpCi0gICAgewotICAgICAgICBjdXJyQ29udGVudC5hcHBlbmQoY2gsIHN0YXJ0LCBsZW5ndGgpOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIEVsZW1lbnQgZ2V0Q3VyckVsZW1lbnQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChFbGVtZW50KSBlbGVtZW50cy5wZWVrKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvb3RoZXIvbm9ybWFsaXplci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL25vcm1hbGl6ZXIvTnVsbElucHV0U291cmNlLmphdmEgYi9vdGhlci9ub3JtYWxpemVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbm9ybWFsaXplci9OdWxsSW5wdXRTb3VyY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGUyMTczOS4uMDAwMDAwMAotLS0gYS9vdGhlci9ub3JtYWxpemVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbm9ybWFsaXplci9OdWxsSW5wdXRTb3VyY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubm9ybWFsaXplcjsKLQotCi1wdWJsaWMgY2xhc3MgTnVsbElucHV0U291cmNlIGV4dGVuZHMgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2UKLXsKLSAgICBwdWJsaWMgTnVsbElucHV0U291cmNlKFN0cmluZyBwdWJJZCwgU3RyaW5nIHN5c0lkKQotICAgIHsKLSAgICAgICAgCi0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL290aGVyL25vcm1hbGl6ZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9ub3JtYWxpemVyL1V0aWxzLmphdmEgYi9vdGhlci9ub3JtYWxpemVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbm9ybWFsaXplci9VdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjBjNzZlLi4wMDAwMDAwCi0tLSBhL290aGVyL25vcm1hbGl6ZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9ub3JtYWxpemVyL1V0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm5vcm1hbGl6ZXI7Ci0KLWltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwotCi0KLS8qKgotICogUmVhZCBpbnB1dCBmaWxlIGFuZCB3cml0ZSBpdCBvdXQgd2l0aCBldmVyeXRoaW5nIG5vcm1hbGl6ZWQuCi0gKi8KLXB1YmxpYyBjbGFzcyBVdGlscyAKLXsKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgaW5kZW50KFByaW50V3JpdGVyIHdyaXRlciwgaW50IGFtb3VudCkKLSAgICB7Ci0gICAgICAgIGZvcihpbnQgaT0wOyBpPGFtb3VudDsgKytpKQotICAgICAgICAgICAgd3JpdGVyLndyaXRlKCIgICIpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL290aGVyL25vcm1hbGl6ZXIvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9ub3JtYWxpemVyL05vcm1hbGl6ZXJUZXN0LmphdmEgYi9vdGhlci9ub3JtYWxpemVyL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbm9ybWFsaXplci9Ob3JtYWxpemVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Y2JlZDUyLi4wMDAwMDAwCi0tLSBhL290aGVyL25vcm1hbGl6ZXIvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9ub3JtYWxpemVyL05vcm1hbGl6ZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm5vcm1hbGl6ZXI7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLS8qKgotICogVW5pdCB0ZXN0IGZvciBOb3JtYWxpemVyLgotICovCi1wdWJsaWMgY2xhc3MgTm9ybWFsaXplclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZQotewotICAgIC8qKgotICAgICAqIFJpZ29yb3VzIFRlc3QgOi0pCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdE5vcm1hbGl6ZXIoKQotICAgIHsKLSAgICAgICAgLy8gVE9ETzogd3JpdGUgc29tZSByZWFsIHRlc3RzIGhlcmUKLSAgICAgICAgYXNzZXJ0VHJ1ZSggdHJ1ZSApOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL290aGVyL3NjcmlwdHMvUkVBRE1FLnR4dCBiL290aGVyL3NjcmlwdHMvUkVBRE1FLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTBmMmQwMy4uMDAwMDAwMAotLS0gYS9vdGhlci9zY3JpcHRzL1JFQURNRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1UaGlzIGRpcmVjdG9yeSBob2xkcyB1c2VmdWwgZGV2ZWxvcG1lbnQgc2NyaXB0cy4KZGlmZiAtLWdpdCBhL290aGVyL3NjcmlwdHMvZGV0YWIuc2ggYi9vdGhlci9zY3JpcHRzL2RldGFiLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhNzc4YTdjLi4wMDAwMDAwCi0tLSBhL290aGVyL3NjcmlwdHMvZGV0YWIuc2gKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi0jIFVuaXgvTGludXggc2hlbGwgc2NyaXB0IHRvIGNsZWFuIHVwIHdoaXRlc3BhY2UgaW4gYWxsIC5qYXZhIGZpbGVzIGluIGEgZGlyZWN0b3J5LgotIwotIyBBbGwgdGFicyBmb3VuZCBhcmUgcmVwbGFjZWQgd2l0aCA0IHNwYWNlcy4KLSMKLSMgQWRkIHRoZSBmb2xsb3dpbmcgdG8gYWxzbyByZW1vdmUgdHJhaWxpbmcgd2hpdGVzcGFjZSBmcm9tIGFsbCBsaW5lczoKLSMgICAgLWUgInMvXHNccyokLy8iICBcCi1maW5kIC4gLW5hbWUgIi5zdm4iIC1wcnVuZSAtbyAtbmFtZSAiKi5qYXZhIiAtZXhlYyBcCi0gIHNlZCAtLWluLXBsYWNlIFwKLSAgICAtZSAicy9cdC8gICAgL2ciICBcCi0gIHt9IFw7CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWpzZG9jLXBsdWdpbi9wb20ueG1sIGIvcG9tLnhtbApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qc2RvYy1wbHVnaW4vcG9tLnhtbApyZW5hbWUgdG8gcG9tLnhtbApkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qc2RvYy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvcGx1Z2lucy9qc2RvYy9BYnN0cmFjdEpTRG9jTW9qby5qYXZhIGIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvcGx1Z2lucy9qc2RvYy9BYnN0cmFjdEpTRG9jTW9qby5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtYXZlbjItcGx1Z2lucy9teWZhY2VzLWpzZG9jLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9wbHVnaW5zL2pzZG9jL0Fic3RyYWN0SlNEb2NNb2pvLmphdmEKcmVuYW1lIHRvIHNyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL3BsdWdpbnMvanNkb2MvQWJzdHJhY3RKU0RvY01vam8uamF2YQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qc2RvYy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvcGx1Z2lucy9qc2RvYy9KU0RvY0hlbHBlci5qYXZhIGIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvcGx1Z2lucy9qc2RvYy9KU0RvY0hlbHBlci5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtYXZlbjItcGx1Z2lucy9teWZhY2VzLWpzZG9jLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9wbHVnaW5zL2pzZG9jL0pTRG9jSGVscGVyLmphdmEKcmVuYW1lIHRvIHNyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL3BsdWdpbnMvanNkb2MvSlNEb2NIZWxwZXIuamF2YQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qc2RvYy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvcGx1Z2lucy9qc2RvYy9KU0RvY0phck1vam8uamF2YSBiL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL3BsdWdpbnMvanNkb2MvSlNEb2NKYXJNb2pvLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1hdmVuMi1wbHVnaW5zL215ZmFjZXMtanNkb2MtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL3BsdWdpbnMvanNkb2MvSlNEb2NKYXJNb2pvLmphdmEKcmVuYW1lIHRvIHNyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL3BsdWdpbnMvanNkb2MvSlNEb2NKYXJNb2pvLmphdmEKZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtanNkb2MtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL3BsdWdpbnMvanNkb2MvSlNEb2NNb2pvLmphdmEgYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9wbHVnaW5zL2pzZG9jL0pTRG9jTW9qby5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtYXZlbjItcGx1Z2lucy9teWZhY2VzLWpzZG9jLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9wbHVnaW5zL2pzZG9jL0pTRG9jTW9qby5qYXZhCnJlbmFtZSB0byBzcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9wbHVnaW5zL2pzZG9jL0pTRG9jTW9qby5qYXZhCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWpzZG9jLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9wbHVnaW5zL2pzZG9jL0pTRG9jTW9qb0NvbnN0LmphdmEgYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9wbHVnaW5zL2pzZG9jL0pTRG9jTW9qb0NvbnN0LmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1hdmVuMi1wbHVnaW5zL215ZmFjZXMtanNkb2MtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL3BsdWdpbnMvanNkb2MvSlNEb2NNb2pvQ29uc3QuamF2YQpyZW5hbWUgdG8gc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvcGx1Z2lucy9qc2RvYy9KU0RvY01vam9Db25zdC5qYXZhCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWpzZG9jLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9wbHVnaW5zL2pzZG9jL0pTRG9jUmVwb3J0TW9qby5qYXZhIGIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvcGx1Z2lucy9qc2RvYy9KU0RvY1JlcG9ydE1vam8uamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qc2RvYy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvcGx1Z2lucy9qc2RvYy9KU0RvY1JlcG9ydE1vam8uamF2YQpyZW5hbWUgdG8gc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvcGx1Z2lucy9qc2RvYy9KU0RvY1JlcG9ydE1vam8uamF2YQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qc2RvYy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvcGx1Z2lucy9qc2RvYy91dGlsL0hUTUxGaWxlQ29udGVudEZpbHRlci5qYXZhIGIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvcGx1Z2lucy9qc2RvYy91dGlsL0hUTUxGaWxlQ29udGVudEZpbHRlci5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtYXZlbjItcGx1Z2lucy9teWZhY2VzLWpzZG9jLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9wbHVnaW5zL2pzZG9jL3V0aWwvSFRNTEZpbGVDb250ZW50RmlsdGVyLmphdmEKcmVuYW1lIHRvIHNyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL3BsdWdpbnMvanNkb2MvdXRpbC9IVE1MRmlsZUNvbnRlbnRGaWx0ZXIuamF2YQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qc2RvYy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvcGx1Z2lucy9qc2RvYy91dGlsL0pTRG9jUGFjay5qYXZhIGIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvcGx1Z2lucy9qc2RvYy91dGlsL0pTRG9jUGFjay5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtYXZlbjItcGx1Z2lucy9teWZhY2VzLWpzZG9jLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9wbHVnaW5zL2pzZG9jL3V0aWwvSlNEb2NQYWNrLmphdmEKcmVuYW1lIHRvIHNyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL3BsdWdpbnMvanNkb2MvdXRpbC9KU0RvY1BhY2suamF2YQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qc2RvYy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvcGx1Z2lucy9qc2RvYy91dGlsL0pTRG9jUGFja01hdmVuLmphdmEgYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9wbHVnaW5zL2pzZG9jL3V0aWwvSlNEb2NQYWNrTWF2ZW4uamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qc2RvYy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvcGx1Z2lucy9qc2RvYy91dGlsL0pTRG9jUGFja01hdmVuLmphdmEKcmVuYW1lIHRvIHNyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL3BsdWdpbnMvanNkb2MvdXRpbC9KU0RvY1BhY2tNYXZlbi5qYXZhCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWpzZG9jLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9wbHVnaW5zL2pzZG9jL3V0aWwvSlNEb2NQYWNrUmVzb3VyY2VzLmphdmEgYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9wbHVnaW5zL2pzZG9jL3V0aWwvSlNEb2NQYWNrUmVzb3VyY2VzLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1hdmVuMi1wbHVnaW5zL215ZmFjZXMtanNkb2MtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL3BsdWdpbnMvanNkb2MvdXRpbC9KU0RvY1BhY2tSZXNvdXJjZXMuamF2YQpyZW5hbWUgdG8gc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvcGx1Z2lucy9qc2RvYy91dGlsL0pTRG9jUGFja1Jlc291cmNlcy5qYXZhCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWpzZG9jLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9wbHVnaW5zL2pzZG9jL3V0aWwvSlNGaWxlTmFtZUZpbHRlci5qYXZhIGIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvcGx1Z2lucy9qc2RvYy91dGlsL0pTRmlsZU5hbWVGaWx0ZXIuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qc2RvYy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvcGx1Z2lucy9qc2RvYy91dGlsL0pTRmlsZU5hbWVGaWx0ZXIuamF2YQpyZW5hbWUgdG8gc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvcGx1Z2lucy9qc2RvYy91dGlsL0pTRmlsZU5hbWVGaWx0ZXIuamF2YQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qc2RvYy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvcGx1Z2lucy9qc2RvYy91dGlsL0pTUnVuLmphdmEgYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9wbHVnaW5zL2pzZG9jL3V0aWwvSlNSdW4uamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qc2RvYy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvcGx1Z2lucy9qc2RvYy91dGlsL0pTUnVuLmphdmEKcmVuYW1lIHRvIHNyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL3BsdWdpbnMvanNkb2MvdXRpbC9KU1J1bi5qYXZhCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWpzZG9jLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9wbHVnaW5zL2pzZG9jL3V0aWwvWE1MQ29uZmlnLmphdmEgYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9wbHVnaW5zL2pzZG9jL3V0aWwvWE1MQ29uZmlnLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1hdmVuMi1wbHVnaW5zL215ZmFjZXMtanNkb2MtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL3BsdWdpbnMvanNkb2MvdXRpbC9YTUxDb25maWcuamF2YQpyZW5hbWUgdG8gc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvcGx1Z2lucy9qc2RvYy91dGlsL1hNTENvbmZpZy5qYXZhCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWkxOG4tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9OT1RJQ0UgYi9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvTk9USUNFCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtYXZlbjItcGx1Z2lucy9teWZhY2VzLWkxOG4tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9OT1RJQ0UKcmVuYW1lIHRvIHNyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9OT1RJQ0UK